/
78
1246
0
4
2
71
38
40
#0
The System Object

24
2
-1
-1
-1
1
-1
20
6
do_login_command
2
173
-1
server_started
2
173
-1
core_objects
2
173
-1
init_for_core
2
165
-1
user_created user_connected
2
173
-1
user_disconnected user_client_disconnected
2
173
-1
95
builder
login
last_huh
guest_log
last_restart_time
biglist
big_mail_recipient
limbo
registration_db
new_player_log
verb_help
core_help
prog_help
wiz_help
shutdown_task
wiz_utils
site_db
math_utils
set_utils
builtin_function_help
new_prog_log
generic_help
guest
spell
seq_utils
quota_log
you
free_list
max_seconds
max_ticks
hacker
generic_db
shutdown_message
shutdown_time
no_one
player_db
class_registry
player_class
gender_utils
trig_utils
time_utils
editor_help
mail_recipient
mail_agent
mail_editor
note_editor
verb_editor
generic_editor
match_utils
object_utils
lock_utils
gripe_recipients
letter
dump_interval
list_utils
command_utils
player
wiz
prog
code_utils
help
nothing
failed_match
ambiguous_match
perm_utils
building_utils
string_utils
news
note
container
thing
exit
room
player_start
root_class
recycler
garbage
mail_options
edit_options
display_options
generic_options
maxint
minint
list_options
error
newt_log
toad_log
site_log
housekeeper
network
generic_biglist_home
feature
local
gopher
nntp
99
1
4
2
5
1
12
2
1
1
13
2
1
1
14
2
1
0
751261366
2
5
1
15
2
5
1
16
2
5
1
17
2
5
1
18
2
5
1
19
2
5
1
22
2
5
1
23
2
5
1
24
2
5
1
25
2
5
3
0
2
5
1
26
2
5
1
27
2
5
1
28
2
5
1
29
2
5
1
30
2
5
1
31
2
5
1
32
2
5
1
33
2
1
1
34
2
5
1
35
2
5
1
36
2
5
1
37
38
1
4
0
2
5
0
5
2
5
0
30000
2
5
1
38
2
5
1
39
2
5
2

2
5
0
0
2
5
1
40
2
1
1
41
2
1
4
2
4
3
2
generics
2
Generic objects intended for use as the parents of new objects
4
13
1
3
1
7
1
5
1
9
1
55
1
8
1
1
1
6
1
59
1
58
1
51
1
46
1
47
4
3
2
utilities
2
Objects holding useful general-purpose verbs
4
12
1
20
1
43
1
28
1
44
1
52
1
53
1
54
1
56
1
57
1
60
1
42
1
21
2
5
1
6
2
5
1
43
2
1
1
28
2
5
1
44
2
5
1
45
2
5
1
46
2
5
1
47
2
5
1
48
2
5
1
49
2
5
1
50
2
5
1
51
2
5
1
52
2
5
1
53
2
5
1
54
2
5
4
1
1
2
2
5
1
55
2
5
0
3600
2
5
1
56
2
5
1
57
2
5
1
6
2
5
1
58
2
5
1
59
2
5
1
60
2
5
1
61
2
5
1
-1
2
5
1
-3
2
5
1
-2
2
5
1
42
2
5
1
21
2
5
1
20
2
5
1
10
2
5
1
9
2
5
1
8
2
5
1
5
2
5
1
7
2
5
1
3
2
5
1
11
2
5
1
1
2
5
1
62
2
5
1
63
2
5
1
64
2
5
1
65
2
5
1
66
2
5
1
67
2
5
0
2147483647
2
5
0
-2147483648
2
5
1
68
2
5
1
69
2
5
1
70
2
5
1
70
2
5
1
70
2
5
1
71
2
5
1
72
2
5
1
73
2
1
1
74
2
5
1
-1
2
5
1
75
2
1
1
76
2
5
5
2
4
4
3
2
The
2
Known
2
Universe
2
5
2
The known universe.
2
5
4
2
0
9821
0
749766669
2
1
#1
Root Class

152
2
-1
-1
-1
-1
3
-1
38
initialize
2
165
-1
recycle
2
165
-1
set_name
2
165
-1
title
2
173
-1
titlec
2
173
-1
set_aliases
2
165
-1
match
2
173
-1
match_object
2
173
-1
set_description
2
173
-1
description
2
173
-1
look_self
2
173
-1
exam*ine
2
37
-1
notify
2
173
-1
tell
2
173
-1
tell_lines
2
173
-1
accept
2
173
-1
moveto
2
165
-1
eject eject_nice eject_basic
2
165
-1
is_unlocked_for
2
173
-1
huh
2
173
-1
set_message
2
165
-1
do_examine
2
165
-1
examine_key
2
173
-1
examine_names
2
173
-1
examine_desc
2
173
-1
examine_contents
2
165
-1
examine_verbs
2
165
-1
get_message
2
165
-1
room_announce*_all_but
2
165
-1
init_for_core
2
173
-1
contents
38
173
-1
examine_verb_ok
2
165
-1
is_listening
2
173
-1
hidden_verbs
2
165
-1
examine_owner
2
173
-1
announce*_all_but
2
173
-1
tell_lines_suspended
2
173
-1
acceptable
2
173
-1
4
key
aliases
description
object_size
4
0
0
2
4
4
0
2
5
2

2
5
4
2
0
16651
0
750578402
2
1
#2
Wizard

7
2
11
-1
-1
58
-1
-1
0
0
70
2

2
5
2
%n @newts %d (%[#d])
2
5
1
-1
2
5
2
%d is now a programmer.
2
5
2
You are now a programmer.
2
5
2
Have a nice life...
2
5
2
%n @toads %d (%[#d])
2
5
1
-1
2
4
4
0
38
1
0
0
2
5
0
0
2
5
2

2
5
0
1
2
5
4
0
38
1
0
0
2
0
4
0
2
5
2

2
0
0
0
2
1
0
0
2
5
2
*** More ***  %n lines left.  Do @more [rest|flush] for more.
2
5
4
2
0
0
0
0
38
1
0
0
38
1
4
0
38
0
0
0
38
1
0
0
2
5
4
0
2
1
0
-79
38
1
0
1
2
4
5
2
0
5
2
0
4
0
2
5
4
0
2
4
0
0
2
5
4
0
2
4
0
10
2
4
2
%N is not currently logged in.
2
5
2
its
2
5
2
Its
2
5
2
You sense that %n is looking for you in %l.
2
5
2
Your message has been sent.
2
5
4
0
2
5
4
0
2
5
4
0
2
5
4
0
2
5
4
2
0
0
0
0
2
4
4
0
2
4
0
0
2
1
0
142
2
0
2
neuter
2
5
2
Itself
2
5
2
Its
2
5
2
It
2
5
2
It
2
5
2
itself
2
5
2
its
2
5
2
it
2
5
2
it
2
5
1
11
2
5
0
0
2
0
4
0
2
5
0
0
2
5
4
0
2
5
4
0
2
5
4
0
2
5
0
2147483647
2
1
0
0
2
4
0
0
2
4
4
1
2
Wizard
2
1
2

2
5
4
2
0
75799
0
750665764
2
1
#3
generic room

152
2
-1
-1
-1
1
51
0
42
confunc
2
173
-1
disfunc
2
173
-1
say
2
85
-2
emote
2
93
-2
announce
2
173
-1
match_exit
2
173
-1
add_exit
2
165
-1
tell_contents
2
173
-1
@exits
2
5
-1
look_self
2
173
-1
acceptable
2
173
-1
add_entrance
2
165
-1
bless_for_entry
2
173
-1
@entrances
2
1
-1
go
2
29
-1
l*ook
2
93
-2
announce_all
2
173
-1
announce_all_but
2
173
-1
enterfunc
2
173
-1
exitfunc
2
173
-1
remove_exit
2
173
-1
remove_entrance
2
173
-1
@add-exit
2
17
-1
@add-entrance
2
17
-1
recycle
2
165
-1
e east w west s south n north ne northeast nw northwest se southeast sw southwest u up d down
2
13
-1
@eject @eject! @eject!!
2
25
-1
ejection_msg oejection_msg victim_ejection_msg
38
173
-1
accept_for_abode
2
173
-1
@resident*s
2
25
-1
match
2
173
-1
@remove-exit
2
25
-1
@remove-entrance
2
25
-1
moveto
2
173
-1
who_location_msg
2
173
-1
exits entrances
2
173
-1
obvious_exits
2
165
-1
here_huh
2
173
-1
room_announce*_all_but
2
173
-1
examine_commands_ok
2
173
-1
examine_key
2
173
-1
examine_contents
2
165
-1
13
who_location_msg
free_home
victim_ejection_msg
ejection_msg
oejection_msg
residents
free_entry
entrances
blessed_object
blessed_task
exits
dark
ctype
17
2
%T
2
5
0
0
2
5
2
You have been expelled from %i by %n.
2
5
2
You expel %d from %i.
2
5
2
%D is unceremoniously expelled from %i by %n.
2
5
4
0
2
5
0
1
2
5
4
0
2
4
1
-1
2
5
0
0
2
5
4
0
2
4
0
0
2
5
0
3
2
5
5
2
4
4
1
2
generic room
2
5
5
2
5
4
2
0
23620
0
750664812
2
1
#4
generic builder

144
2
-1
-1
-1
6
59
-1
27
@quota
2
17
-1
@create
2
81
-2
@recycle
2
17
-1
@recreate
2
89
13
@dig
2
81
-2
@audit
2
89
-2
@count
2
25
-1
@countDB
2
25
-1
@sort-owned*-objects
2
9
-1
@add-owned
2
25
-1
@verify-owned
2
9
-1
@unlock
2
17
-1
@lock
2
89
0
@newmess*age
2
81
-2
@unmess*age
2
81
-2
_messagify
2
173
-1
@kids
2
29
-1
@contents
2
25
-1
@par*ents
2
25
-1
@location*s
2
25
-1
@cl*asses
2
89
-2
classes_2
2
173
-1
_create
2
173
-1
_recycle
2
173
-1
@chparent
2
81
1
@check-chp*arent
2
89
1
@set*prop
2
89
1
1
recreate_enabled
58
0
1
2
5
5
38
1
5
2
0
5
2
5
5
2
0
5
2
1
0
0
2
5
5
2
5
5
38
1
5
38
1
5
38
0
5
38
1
5
2
5
5
2
1
5
38
1
5
2
4
5
2
0
5
2
0
5
2
5
5
2
4
5
2
5
5
2
4
5
2
4
5
2
5
5
2
5
5
2
5
5
2
5
5
2
5
5
2
5
5
2
5
5
2
5
5
2
5
5
2
4
5
2
4
5
2
1
0
0
2
0
5
2
5
5
2
5
5
2
5
5
2
5
5
2
5
5
2
5
5
2
5
5
2
5
5
2
5
1
11
2
5
5
2
0
5
2
5
5
2
5
5
2
5
5
2
5
5
2
5
5
2
1
5
2
4
5
2
4
4
1
2
generic builder
2
1
2
You see a player who should type '@describe me as ...'.
2
5
4
2
0
27097
0
750665976
2
1
#5
generic thing

152
2
-1
-1
-1
1
8
6
6
g*et t*ake
2
45
-1
d*rop th*row
2
45
-1
moveto
2
173
-1
take_failed_msg take_succeeded_msg otake_failed_msg otake_succeeded_msg drop_failed_msg drop_succeeded_msg odrop_failed_msg odrop_succeeded_msg
2
173
-1
gi*ve ha*nd
2
109
1
examine_key
2
173
-1
8
drop_failed_msg
drop_succeeded_msg
odrop_failed_msg
odrop_succeeded_msg
otake_succeeded_msg
otake_failed_msg
take_succeeded_msg
take_failed_msg
12
2
You can't seem to drop %t here.
2
5
2
You drop %t.
2
5
2
tries to drop %t but fails!
2
5
2
drops %t.
2
5
2
picks up %t.
2
5
2

2
5
2
You take %t.
2
5
2
You can't pick that up.
2
5
5
2
4
4
1
2
generic thing
2
5
5
2
5
4
2
0
4369
0
750664824
2
1
#6
generic player

152
2
-1
-1
-1
1
40
7
128
init_for_core
2
173
-1
confunc
2
173
-1
disfunc
2
173
-1
initialize
2
173
-1
recycle
2
173
-1
acceptable
2
173
-1
my_huh
2
165
-1
last_huh
2
173
-1
my_match_object
2
173
-1
tell_contents
2
173
-1
titlec
2
173
-1
notify
2
173
-1
notify_lines
2
173
-1
linesplit
2
173
-1
linelen
38
173
-1
@more
2
25
-1
@wrap
38
1
-2
@linelen*gth
38
17
-1
@pagelen*gth
2
17
-1
tell
2
165
-1
gag_p
2
173
-1
set_gaglist
2
173
-1
@gag
2
89
-2
@listgag @gaglist
2
5
-1
@ungag
2
29
-1
whodunnit
2
173
-1
@ch*eck-full
2
89
-2
@paranoid
2
89
-2
@sw*eep
2
9
-1
wh*isper
2
157
1
page
2
93
-2
receive_page
2
173
-1
page_origin_msg page_echo_msg page_absent_msg
38
165
-1
i inv*entory
2
9
-1
look_self
2
173
-1
home
2
9
-1
@sethome
2
9
-1
g*et take
2
45
-1
@move
2
93
1
@eject @eject! @eject!!
2
89
5
where*is @where*is
2
93
-2
@who
2
85
-2
@wizards
2
29
-1
?* help info*rmation @help
2
85
-2
news
2
13
-1
mail_forward mail_notify
2
173
-1
receive_message
2
173
-1
display_message
2
173
-1
parse_message_seq from_msg_seq %from_msg_seq to_msg_seq %to_msg_seq subject_msg_seq body_msg_seq display_seq_headers display_seq_full messages_in_seq list_rmm new_message_num length_num_le length_date_le length_date_gt length_all_msgs exists_num_eq rm_message_seq undo_rmm expunge_rmm renumber
2
173
-1
msg_summary_line
38
173
-1
msg_text
2
173
-1
notify_mail
2
173
-1
__fix
2
173
-1
current_message
2
173
-1
get_current_message
2
173
-1
set_current_message
2
173
-1
make_current_message
2
173
-1
kill_current_message
2
173
-1
current_folder
2
173
-1
set_current_folder
2
173
-1
parse_folder_spec
2
173
-1
parse_mailread_cmd
2
173
-1
@mail
2
85
-2
@read @peek
2
93
-2
@next @prev
2
89
-2
@rmm*ail
2
89
-2
@renumber
2
25
-1
@unrmm*ail
2
89
-2
@send
2
93
-2
@answer @repl*y
2
89
-2
@forward
2
93
-2
@gripe
2
89
-2
@typo @bug @suggest*ion @idea @comment
2
89
-2
@skip
2
89
-2
@subscribe @unsubscribed
2
89
-2
mail_catch_up
2
173
-1
@rn check_mail_lists @subscribed
2
5
-1
mail_option
2
173
-1
display_option
2
173
-1
edit_option
2
173
-1
list_option
2
173
-1
set_mail_option set_edit_option set_list_option set_display_option
2
173
-1
@mailo*ptions @mail-o*ptions @edito*ptions @edit-o*ptions @displayo*ptions @display-o*ptions
2
89
-2
set_name
2
173
-1
set_aliases
2
173
-1
@rename
2
81
1
@addalias @add-alias
2
81
1
@rmalias
2
81
5
@desc*ribe
2
89
13
@mess*ages
2
17
-1
@notedit
38
25
-1
@password
2
89
-2
@last-c*onnection
2
29
-1
set_gender
2
173
-1
@gender
2
25
-1
set_brief
2
173
-1
@mode
2
81
-2
@exam*ine
2
29
-1
exam*ine
2
25
-1
add_feature
38
165
-1
remove_feature
38
165
-1
@add-feature @addfeature
2
25
-1
@remove-feature @rmfeature
2
25
-1
@features
2
85
11
@features
2
17
-1
@memory
38
9
-1
@version
38
9
-1
@uptime
38
9
-1
@quit
2
9
-1
examine_commands_ok
2
173
-1
is_listening
2
165
-1
moveto
2
173
-1
announce*_all_but
2
165
-1
linewrap
38
173
-1
@set-note-string @set-note-text
2
17
-1
verb_sub
2
165
-1
ownership_quota
2
173
-1
tell_lines
2
173
-1
@lastlog
2
29
-1
set_linelength
2
173
-1
set_pagelength
2
165
-1
set_home
2
165
-1
@unsub*scribe
2
89
-2
@registerme
2
89
-2
ctime
2
173
-1
send_self_netmail
2
173
-1
@netforw*ard
2
93
-2
@@sendmail
2
89
-2
53
features
previous_connection
mail_lists
email_address
last_disconnect_time
help
more_msg
linetask
linesleft
linebuffer
pagelen
_mail_task
owned_objects
linelen
current_folder
all_connect_places
last_connect_place
dict
messages_going
brief
responsible
lines
page_absent_msg
pq
pqc
page_origin_msg
page_echo_msg
mail_notify
mail_forward
edit_options
mail_options
current_message
messages
last_connect_time
ownership_quota
gender
prc
ppc
poc
psc
pr
pp
po
ps
home
password
gaglist
paranoid
display_options
list_options
verb_subs
first_connect_time
messages_kept
57
4
0
38
1
0
0
2
0
4
0
2
5
2

2
0
0
0
2
1
0
0
2
5
2
*** More ***  %n lines left.  Do @more [rest|flush] for more.
2
5
4
2
0
0
0
0
38
1
0
0
38
1
4
0
38
0
0
0
38
1
0
0
2
5
4
0
2
1
0
-79
38
1
0
1
2
4
4
0
2
0
2
?
2
0
4
0
2
5
4
0
2
4
0
0
2
5
4
0
2
4
0
10
2
4
2
%N is not currently logged in.
2
5
2
its
2
5
2
Its
2
5
2
You sense that %n is looking for you in %l.
2
5
2
Your message has been sent.
2
5
4
0
2
5
4
0
2
5
4
0
2
5
4
0
2
5
4
2
0
0
0
0
2
4
4
0
2
4
0
0
2
1
0
0
2
0
2
neuter
2
5
2
Itself
2
5
2
Its
2
5
2
It
2
5
2
It
2
5
2
itself
2
5
2
its
2
5
2
it
2
5
2
it
2
5
1
11
2
5
2
impossible password to type
2
0
4
0
2
5
0
0
2
5
4
0
2
5
4
0
2
5
4
0
2
5
0
2147483647
2
1
0
0
2
4
5
2
4
4
1
2
generic player
2
1
2
You see a player who should type '@describe me as ...'.
2
5
4
2
0
130343
0
750664969
2
1
#7
generic exit

152
2
-1
-1
-1
1
-1
52
11
invoke
2
173
-1
move
2
173
-1
recycle
2
165
-1
leave_msg oleave_msg arrive_msg oarrive_msg nogo_msg onogo_msg
2
173
-1
set_name
2
173
-1
set_aliases
2
173
-1
announce_all_but
2
173
-1
defaulting_oleave_msg
2
173
-1
moveto
2
173
-1
examine_key
2
173
-1
announce_msg
2
173
-1
9
obvious
source
dest
nogo_msg
onogo_msg
arrive_msg
oarrive_msg
oleave_msg
leave_msg
13
0
1
2
5
1
-1
2
5
1
-1
2
5
0
0
2
5
0
0
2
5
0
0
2
5
0
0
2
5
0
0
2
5
0
0
2
5
5
2
4
4
1
2
generic exit
2
5
5
2
5
4
2
0
5828
0
751010400
2
1
#8
generic container

152
2
-1
-1
-1
5
-1
9
14
p*ut in*sert d*rop
2
157
3
re*move ta*ke g*et
2
157
5
look_self
2
173
-1
acceptable
2
173
-1
open
2
45
-1
@lock_for_open
2
105
0
is_openable_by
2
173
-1
close
2
45
-1
@unlock_for_open
2
41
-1
tell_contents
2
173
-1
set_opened
2
165
-1
@opacity
2
97
12
set_opaque
2
165
-1
oclose_msg close_msg oopen_msg open_msg oput_fail_msg put_fail_msg oremove_fail_msg oremove_msg remove_fail_msg remove_msg oput_msg put_msg oopen_fail_msg open_fail_msg empty_msg
38
165
-1
19
oclose_msg
close_msg
oopen_msg
open_msg
oput_fail_msg
put_fail_msg
opaque
dark
oremove_fail_msg
oremove_msg
remove_fail_msg
remove_msg
oput_msg
put_msg
oopen_fail_msg
open_fail_msg
empty_msg
opened
open_key
31
2
closes %d.
2
5
2
You close %d.
2
5
2
opens %d.
2
5
2
You open %d.
2
5
2

2
5
2
You can't put %d in that.
2
5
0
1
2
1
0
0
2
1
2

2
5
2
removes %d from %i.
2
5
2
You can't remove that.
2
5
2
You remove %d from %i.
2
5
2
puts %d in %i.
2
5
2
You put %d in %i.
2
5
2

2
5
2
You can't open that.
2
5
2
It is empty.
2
5
0
1
2
1
0
0
2
4
5
2
5
5
2
5
5
2
5
5
2
5
5
2
5
5
2
5
5
2
5
5
2
5
5
2
4
4
1
2
generic container
2
5
5
2
5
4
2
0
7218
0
750664969
2
1
#9
generic note

152
2
-1
-1
-1
5
10
62
11
r*ead
2
45
-1
er*ase
2
45
-1
wr*ite
2
157
4
del*ete rem*ove
2
153
5
encrypt
2
97
0
decrypt
2
33
-1
text
2
173
-1
is_readable_by
2
173
-1
set_text
2
173
-1
is_writable_by
2
173
-1
mailme @mailme
2
41
-1
3
writers
encryption_key
text
15
4
0
2
5
0
0
2
4
4
0
2
4
5
2
5
5
2
5
5
2
5
5
2
5
5
2
5
5
2
5
5
2
5
5
2
5
5
2
4
4
1
2
generic note
2
5
2
There appears to be some writing on the note ...
2
5
4
2
0
4808
0
750664972
2
1
#10
a newspaper

16
2
11
-1
2
9
-1
55
8
description
2
173
-1
read
2
45
-1
check
2
173
-1
touch
2
45
-1
init_for_core
2
173
-1
announce_new_edition
2
173
-1
gc garbage_collect
2
41
-1
set_text
2
173
-1
3
readtimes
readers
last_write_time
18
4
0
2
5
4
0
2
5
0
751265161
2
5
4
0
2
5
5
2
4
4
1
2
There's no news unless you write it.
2
5
5
2
5
5
2
5
5
2
5
5
2
5
5
38
5
5
38
5
5
38
5
2
Realizing that the newspaper is to be shared among all of the players, you change your mind about picking it up.
38
5
1
10
2
4
4
2
2
newspaper
2
a newspaper
38
5
2
It's the latest issue of the MOO Herald-Examiner, dated %d.
38
5
4
2
0
51231
0
750665048
2
1
#11
The First Room

16
38
-1
10
-1
3
-1
-1
5
keep_clean
2
173
-1
disfunc
2
173
-1
enterfunc
2
173
-1
match
38
173
-1
init_for_core
2
173
-1
1
body_bag
18
1
25489
38
5
5
38
5
5
38
5
5
38
5
5
38
5
5
38
5
5
38
5
5
38
5
4
0
38
4
5
38
5
5
38
5
4
0
38
4
5
38
5
5
38
5
5
38
4
4
0
38
5
2
This is all there is right now.
38
5
5
2
1
#12
Login Commands

16
2
-1
-1
-1
1
-1
67
24
?
2
93
-1
h*elp @h*elp
2
93
-1
w*ho @w*ho
2
93
-1
co*nnect @co*nnect
2
93
-1
cr*eate @cr*eate
2
93
-1
q*uit @q*uit
2
93
-1
up*time @up*time
2
93
-1
v*ersion @v*ersion
2
93
-1
parse_command
2
165
-1
check_for_shutdown
2
173
-1
check_player_db
2
173
-1
_match_player
2
165
-1
notify
2
165
-1
tell
38
173
-1
player_creation_enabled
2
173
-1
newt_registration_string registration_string
2
173
-1
init_for_core
2
173
-1
special_action
2
164
-1
blacklisted graylisted redlisted spooflisted
2
165
-1
blacklist_add graylist_add redlist_add spooflist_add
2
173
-1
blacklist_remove graylist_remove redlist_remove spooflist_remove
2
173
-1
listname
2
173
-1
record_connection
2
173
-1
who(vanilla)
2
173
-1
17
welcome_message
newt_registration_string
registration_string
registration_address
create_enabled
bogus_command
blank_command
graylist
blacklist
redlist
who_masks_wizards
max_player_name
spooflist
ignored
max_connections
unlimited_hosts
connection_limit_msg
21
4
5
2
Welcome to the LambdaCore database.
2

2
Type 'connect wizard' to log in.
2

2
You will probably want to change this text, which is stored in $login.welcome_message.
2
5
2
Your character is temporarily hosed.
2
5
2
Character creation is disabled.
2
5
2

2
5
0
1
2
5
2
?
2
1
2
help
2
1
4
2
4
0
4
0
2
0
4
2
4
0
4
0
2
0
4
2
4
0
4
0
2
0
0
0
2
0
0
40
2
5
4
2
4
0
4
0
2
0
4
0
2
5
0
999999
38
5
4
1
2
localhost
2
5
2
***** There are too many players connected. Please wait a few *MINUTES* before trying again. ****
38
0
5
2
4
4
1
2
Login Commands
2
5
2
This provides everything needed by #0:do_login_command.  See `help $login' on $core_help for details.
2
5
4
2
0
22593
0
751013345
2
1
#13
Player Last_huh Verbs

16
2
-1
-1
-1
1
-1
12
4
@*
2
165
-1
give hand
2
173
-1
get take
2
173
-1
drop throw
2
173
-1
0
4
5
2
4
4
1
2
Player Last_huh Verbs
2
5
2
A repository of last-resort player verbs to be called by $player:last_huh
2
5
4
2
0
5157
0
750666092
2
1
#14
Guest Log

0
2
-1
-1
-1
1
-1
13
3
enter
2
173
-1
last
2
157
4
init_for_core
2
173
-1
1
connections
5
4
0
2
0
5
2
4
4
1
2
Guest Log
2
5
5
2
5
4
2
0
9176
0
750668096
2
1
#15
Generic BigList Utilities

144
38
-1
-1
-1
1
-1
73
25
length
38
173
-1
find_nth
38
173
-1
find_ord
38
173
-1
set_nth
38
173
-1
kill
38
173
-1
insert_after insert_before
38
173
-1
extract_range
38
173
-1
delete_range
38
173
-1
keep_range
38
173
-1
insert_last
38
173
-1
start
38
173
-1
next
38
173
-1
_find_nth
38
173
-1
_find_ord
38
173
-1
_set_nth
38
173
-1
_skill
38
173
-1
_extract
38
173
-1
_merge
38
173
-1
_smerge
38
173
-1
_split
38
173
-1
_rmerge
38
173
-1
_scrunch
38
173
-1
_listfind_nth
38
173
-1
_insertfirst
38
173
-1
debug
38
173
-1
2
about
maxfanout
6
4
15
2
Implementation notes
2
--------------------
2
Each biglist is actually a tree (a kind of B-tree, actually).
2
The routines above pass around handles of the form
2

2
    {root_node, size, leftmost_ord}
2

2
where root_node is the (string) name of a property that holds the root of the tree, size is the number of leaves in the tree, and leftmost_ord is the :_ord value of the leftmost element of the list (i.e., the leftmost leaf).
2
Each node property has a value of the form 
2

2
    {height,list of subtrees}.
2

2
where the each of the subtrees is itself a 3-element list as above unless
2
the height is 0, in which case the subtrees are actually biglist elements of the arbitrary form determined by the home object.
2
At every level, each node except the rightmost has between this.maxfanout/2 and this.maxfanout subtrees; the rightmost is allowed to have as few as 1 subtree.
38
5
0
7
38
5
5
38
4
4
2
2
ghblu
2
biglist_utils
38
1
4
73
2
Generic BigList Utilities
2
----------------------------
2
This is a package for maintaining huge persistent (sorted) lists in a format that is less likely to spam the server (which runs into a certain amount of trouble dealing with long ordinary lists --- btw we use `biglist' to refer to the huge data structure we're about to describe and `list' to refer to ordinary MOO lists {...}).  The biglist in question lives on a particular object, to which we will refer in the discussion below as the `home' object, and its various elements appear as leaves of a tree whose nodes are kept in properties of the home object.  It should be noted that the home object does not need to be (and in fact should *not* be) a descendant of this one; this object merely provides utilities for manipulating the properties on the home object that are used in a particular biglist manipulation.  
2

2
All of the utilities below refer to `caller' to locate the home object.  Thus verbs to manipulate a given biglist must be located on or inherited by its home object itself.  The home object needs to define the following verbs
2

2
  :_make(@args)     => new property on home object with value args
2
  :_kill(prop)      delete a given property that was created by :_make
2
  :_get(prop)       => home.prop
2
  :_put(prop,@args) set home.prop = args
2
  :_ord(element)    given something that is of the form of a biglist element
2
                    return the corresponding ordinal (for sorting purposes).
2
                    If you never intend to use :find_ord, then this can be a 
2
                    routine that always returns 0 or some other random value.
2

2
See #5546 (Generic Biglist Resident) or $big_mail_recipient
2
for examples.
2

2
Those of the following routines that take a biglist argument are expecting
2
either {} (empty biglist) or some biglist returned by one of the other routines
2

2
  :length(biglist)          => length(biglist) (i.e., number of elements)
2
  :find_nth(biglist,n)      => biglist[n]
2
  :find_ord(biglist,k,comp) => n where n is
2
     the largest such that home:(comp)(k,home:_ord(biglist[n])) is false, or
2
     the smallest such that home:(comp)(k,home:_ord(biglist[n+1])) is true.
2
     Always returns a value between 0 and length(biglist) inclusive.
2
     This assumes biglist to be sorted in order of increasing :_ord values 
2
     with respect to home:(comp)().
2
     Standard situation is :_ord returns a number and comp is a < verb.
2

2
  :start(biglist,s,e)  => {biglist[s..?],@handle} or {}
2
  :next(@handle)       => {biglist[?+1..??],@newhandle} or {}
2
     These two are used for iterating over a range of elements of a biglist
2
     The canonical incantation for doing
2
        for elt in (biglist[first..last])
2
          ...
2
        endfor
2
     is
2
        handle = :start(biglist,first,last);
2
        while(handle)
2
          for elt in (handle[1])
2
            ...
2
          endfor
2
          handle = :next(@listdelete(handle,1));
2
        endwhile
2

2
The following all destructively modify their biglist argument(s) L (and M).
2

2
  :set_nth(L,n,value)  =>  L[n] = value
2
     replaces the indicated element
2

2
  :insert_before(L,M,n) => {@L[1..n-1],@M,@L[n..length(L)]}
2
  :insert_after (L,M,n) => {@L[1..n],  @M,@L[n+1..length(L)]}
2
     takes two distinct biglists, inserts one into the other at the given point
2
     returns the resulting consolidated biglist
2

2
  :extract_range(L,m,n) => {{@L[1..m-1],@L[n+1..]}, L[m..n]} 
2
     breaks the given biglist into two distinct biglists.
2

2
  :delete_range(L,m,n[,leafkiller]) => {@L[1..m-1],@L[n+1..]}
2
  :keep_range  (L,m,n[,leafkiller]) => L[m..n]
2
     like extract_range only we destroy what we don't want.
2

2
  :insertlast(L,value)  => {@L,value}
2
     inserts a new element at the end of biglist.  
2
     If find_ord is to continue to work properly, it is assumed that the 
2
     home:_ord(elt) is greater (comp-wise) than all of the :_ord values
2
     of elements currently in the biglist.
2

2
  :kill(L[,leafkiller]) 
2
     destroys all nodes used by biglist.  
2
     Calls home:leafkiller on each element.
38
5
4
2
0
24940
0
750668545
2
1
#16
Generic Large-Capacity Mail Recipient

144
38
-1
-1
-1
46
19
70
40
_genprop
38
173
-1
_make
2
173
-1
_kill
2
165
-1
_get
38
165
-1
_put
38
173
-1
_ord
38
173
-1
_makemsg
38
173
-1
_killmsg
38
173
-1
_message_num
38
173
-1
_message_date
38
173
-1
_message_hdr
38
173
-1
_message_text
38
173
-1
_lt_msgnum
38
173
-1
_lt_msgdate
38
173
-1
receive_batch
38
173
-1
receive_message
38
173
-1
messages_in_seq
38
173
-1
display_seq_headers
38
173
-1
display_seq_full
38
173
-1
list_rmm
38
173
-1
undo_rmm
38
173
-1
expunge_rmm
38
173
-1
rm_message_seq
38
165
-1
renumber
38
173
-1
length_all_msgs
38
173
-1
length_num_le
38
173
-1
length_date_le
38
173
-1
exists_num_eq
38
173
-1
new_message_num
38
173
-1
from_msg_seq
38
173
-1
%from_msg_seq
38
173
-1
to_msg_seq
38
173
-1
%to_msg_seq
38
173
-1
subject_msg_seq
38
173
-1
body_msg_seq
38
173
-1
date_sort
38
173
-1
_fix_last_msg_date
38
173
-1
__fix
38
173
-1
init_for_core
38
173
-1
length_date_gt
38
173
-1
4
summary_uses_body
_mgr
mowner
_genprop
22
0
0
38
5
1
15
38
5
1
38
38
1
2

38
1
5
38
5
0
0
38
1
4
0
38
0
5
38
5
5
38
5
5
38
5
5
38
5
5
38
1
5
38
1
5
38
5
5
38
1
5
38
0
5
38
5
5
38
5
5
38
4
4
1
2
Generic Large-Capacity Mail Recipient
38
1
4
24
2
Generic Large Capacity Mail Recipient
2
-------------------------------------
2
Since any modifications to large lists entail copying the entire list
2
over, operations on ordinary mail recipients having large numbers of
2
messages, that actually change the content of .messages will take
2
inordinately long.  Thus we have this version which makes use of the
2
$biglist package, scattering the messages onto numerous properties so
2
that write operations involving only a few messages will not require
2
recopying of the entire list.
2

2
In nearly all respects it behaves as the ordinary Mail Recipient,
2
except that it is faster for certain kinds of operations.
2

2
Certain unimplemented verbs, like :date_sort(), and :messages()
2
currently return E_VERBNF.
2

2
To convert an existing $mail_recipient-child (call it #MR) into a
2
$big_mail_recipient-child the basic procedure is
2

2
    ;;something.foo= #MR:messages();
2
    @rmm 1-$ from #MR
2
    @unrmm expunge
2
    @chparent #MR to $big_mail_recipient
2
    ;#MR:receive_batch(@something.foo);
38
5
4
2
0
22901
0
750669076
2
1
#17
The Body Bag

16
2
-1
-1
-1
1
-1
29
3
acceptable
2
173
-1
confunc
2
173
-1
who_location_msg
38
173
-1
0
4
5
2
4
4
1
2
The Body Bag
2
5
5
2
5
4
2
0
583
0
750756028
2
1
#18
Registration Database

0
38
-1
-1
-1
39
-1
34
6
find* _only
38
173
-1
add
38
173
-1
init_for_core
38
173
-1
suspicious_address
2
173
-1
suspicious_userid
2
173
-1
describe_registration
2
173
-1
1
registrar
8
1
2
38
5
2

38
5
5
38
1
4
4
2

2

4
0
4
0
38
0
5
38
4
4
1
2
Registration Database
38
5
5
38
5
4
2
0
594818
0
750668532
2
1
#19
Player-Creation-Log

0
38
-1
-1
-1
16
-1
-1
4
display_seq_headers
2
173
-1
msg_summary_line
2
173
-1
init_for_core
2
173
-1
is_usable_by
38
165
-1
1
autoregistration_player
23
1
49853
38
5
0
1
38
5
1
15
38
5
1
38
38
1
2

38
1
5
38
5
0
751254194
38
1
4
0
38
0
0
1
38
5
2
%n (%#) can't send to moderated list %t (%[#t]) directly.
38
5
4
0
38
5
4
0
38
5
4
1
1
2
38
1
4
2
1
2
1
19
38
1
0
2592000
38
5
0
0
38
1
4
0
38
0
5
38
5
5
38
5
5
38
4
4
3
2
Player-Creation-Log
2
Player_Creation_Log
2
PCL
38
1
2
Log of player creations.
38
5
4
2
0
390145
0
751012092
2
1
#20
string utilities

24
2
-1
-1
-1
1
-1
21
66
space
38
173
-1
left
38
173
-1
right
38
173
-1
centre center
38
173
-1
columnize columnise
38
173
-1
from_list
38
173
-1
english_list
38
173
-1
names_of
38
173
-1
from_seconds
38
173
-1
trim
38
173
-1
triml
38
173
-1
trimr
38
173
-1
strip_chars
38
173
-1
strip_all_but
38
173
-1
uppercase lowercase
38
173
-1
capitalize capitalise
38
173
-1
literal_object
38
173
-1
match
38
165
-1
match_str*ing
38
173
-1
match_object
38
173
-1
match_player
38
173
-1
match_player_or_object
38
173
-1
find_prefix
38
173
-1
index_d*elimited
38
165
-1
is_numeric
38
173
-1
ordinal
38
173
-1
group_number
38
173
-1
english_number
2
173
-1
english_ordinal
38
173
-1
english_ones
38
173
-1
english_tens
38
173
-1
subst*itute
38
173
-1
substitute_d*elimited
2
13
-1
_cap_property
2
165
-1
pronoun_sub
2
173
-1
pronoun_sub_secure
38
173
-1
pronoun_quote
38
173
-1
alt_pronoun_sub
2
13
-1
explode
38
173
-1
words
38
173
-1
word_start
38
173
-1
to_value
38
173
-1
prefix_to_value
38
173
-1
_tolist
38
173
-1
_unquote
38
173
-1
_toscalar
38
173
-1
parse_command
2
173
-1
from_value
2
173
-1
print
38
173
-1
print_suspended
2
173
-1
reverse
38
173
-1
char_list
38
173
-1
regexp_quote
38
173
-1
connection_hostname_bsd
38
173
-1
connection_hostname
38
173
-1
from_value_suspended
2
173
-1
end_expression
38
173
-1
first_word
38
173
-1
common
38
173
-1
title_list*c list_title*c
38
173
-1
name_and_number nn
38
173
-1
name_and_number_list
38
173
-1
columnize_suspended columnise_suspended
38
173
-1
a_or_an
38
173
-1
index_all
38
173
-1
match_stringlist match_string_list
38
165
-1
5
digits
ascii
alphabet
use_article_a
use_article_an
9
2
0123456789
2
5
2
 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
2
5
2
abcdefghijklmnopqrstuvwxyz
2
5
4
5
2
unit
2
unix
2
one
2
once
2
utility
38
1
4
0
38
1
5
2
4
4
2
2
string
2
utils
2
5
4
72
2
For a complete description of a given verb, do `help $string_utils:verbname'
2

2
    Conversion routines:
2

2
:from_list    (list [,sep])                          => "foo1foo2foo3"
2
:english_list (str-list[,none-str[,and-str[, sep]]]) => "foo1, foo2, and foo3"
2
:title_list*c (obj-list[,none-str[,and-str[, sep]]]) => "foo1, foo2, and foo3"
2
                                                  or => "Foo1, foo2, and foo3"
2
:from_value   (value [,quoteflag [,maxlistdepth]])   => "{foo1, foo2, foo3}"
2

2
:to_value       (string)     => {success?, value or error message}
2
:prefix_to_value(string)     => {rest of string, value} or {0, error message}
2

2
:english_number(42)          => "forty-two"
2
:english_ordinal(42)         => "forty-second"
2
:ordinal(42)                 => "42nd"
2
:group_number(42135 [,sep])  => "42,135"
2

2
    Type checking:
2

2
:is_numeric   (string) => return true if string is composed entirely of digits
2

2
    Parsing:
2

2
:explode (string,char) -- string => list of words delimited by char
2
:words   (string)      -- string => list of words (as with command line parser)
2
:word_start (string)   -- string => list of start-end pairs.
2

2
    Matching:
2

2
:match_string (string, pattern, options)       => * wildcard matching
2
:find_prefix  (prefix, string-list)=>list index of element starting with prefix
2
:index_delimited(string,target[,case]) =>index of delimited string occurrence
2
:match        (string, [obj-list, prop-name]+) => matching object
2
:match_player (string-list[,me-object])        => list of matching players
2
:match_object (string, location)               => default object match...
2
:literal_object (string)                       => match against #xxx, $foo
2
:match_stringlist (string, targets)            => match against static strings
2
:match_string (string, wildcard target)        => match against a wildcard
2

2
    Pretty printing:
2

2
:space         (n/string[,filler])     => n spaces
2
:left          (string,width[,filler]) => left justified string in field 
2
:right         (string,width[,filler]) => right justified string in field
2
:center/re     (string,width[,filler]) => centered string in field
2
:columnize/se  (list,n[,width])        => list of strings in n columns
2

2
    Substitutions
2

2
:substitute (string,subst_list [,case])   -- general substitutions.
2
:pronoun_sub (string/list[,who[,thing[,location]]])
2
                                          -- pronoun substitutions.
2
:pronoun_sub_secure (string[,who[,thing[,location]]],default)
2
                                          -- substitute and check for names.
2
:pronoun_quote (string/list/subst_list)   -- quoting for pronoun substitutions.
2

2
    Miscellaneous string munging:
2

2
:trim         (string)       => string with outside whitespace removed.
2
:triml        (string)       => string with leading whitespace removed.
2
:trimr        (string)       => string with trailing whitespace removed.
2
:strip_chars  (string,chars) => string with all chars in `chars' removed.
2
:strip_all_but(string,chars) => string with all chars not in `chars' removed.
2
:capitalize/se(string)       => string with first letter capitalized.
2
:uppercase/lowercase(string) => string with all letters upper or lowercase.
2
:names_of     (list of OBJ)  => string with names and object numbers of items.
2
:a_or_an      (word)         => "a" or "an" as appropriate for that word.
2

2
    A useful property:
2

2
.alphabet                    => "abcdefghijklmnopqrstuvwxyz"
2
5
4
2
0
71124
0
750665274
2
1
#21
building utilities

24
2
-1
-1
-1
1
-1
42
9
make_exit
2
173
-1
set_names
2
165
-1
recreate
2
173
-1
transfer_ownership(useless)
2
169
-1
parse_names
2
173
-1
audit_object_category
2
173
-1
object_audit_string
2
173
-1
do_audit do_prospectus
2
173
-1
do_audit_item
2
173
-1
0
4
5
2
4
4
2
2
building
2
utils
2
5
4
13
2
Verbs useful for building.  For a complete description of a given verb, do `help $building_utils:verbname'.
2

2
make_exit(spec,source,dest[,don't-really-create]) => a new exit
2
          spec is an exit-spec as described in `help @dig'
2

2
set_names(object, spec) - sets name and aliases for an object
2
parse_names(spec) => list of {name, aliases}
2
          in both of these, spec is of the form
2
            <name>[[,:]<alias>,<alias>,...]
2
          (as described in `help @rename')
2

2
recreate(object, newparent) - effectively recycle and recreate object
2
          as a child of newparent
2
5
4
2
0
11639
0
750665278
2
1
#22
Verb Help DB

16
38
-1
-1
-1
1
-1
14
3
find_topics
38
173
-1
get_topic
2
173
-1
dump_topic
2
173
-1
0
4
5
38
4
4
2
2
verbhelp
2
vh
38
5
2
A `help database' that knows about all of the documented verbs.
38
5
4
2
0
2482
0
750666106
2
1
#23
Core Utility Help

16
38
-1
-1
-1
32
-1
-1
3
find_topics
38
165
-1
get_topic
38
173
-1
dump_topic
2
173
-1
31
$login
$container
$mail_agent
MR-subscribing
MR-naming
MR-access
$mail_recipient
receiving-mail
mail-format
mail-resolve
sending-mail
mail-system
$player_db
core-index
object-matching
$no_one
$exit
$room
$help
$generic_db
$generic_editor
$generic_help
$generic_options
MR-sequences
MR-reading
MR-writing
MR-searching
$housekeeper
$recycler
$error
$biglist
36
4
70
2
$login
2
------
2
This object manages command parsing for unconnected players and governs the initiation of an actual connection.  There are verbs pertaining to registration, controlling player creation, and doing site-locks (see `help blacklist' on $wiz_help).
2

2
COMMANDS FOR UNCONNECTED PLAYERS
2

2
Recall that for each line that an unconnected player types, the server parses that line into words (the same way normal commands are parsed into a list of words that is then assigned to `args') and then #0:do_login_command is called.
2

2
  :parse_command (@args) => {verb, @args}
2
    given the sequence of arguments that were fed to #0:do_login_command
2
    this returns the name of a verb on $login to be called together with a 
2
    list of arguments to be passed to it.
2

2
By default this just returns args iff args[1] names an actual verb on $login that is +x and has args {"any","none","any"}.  Otherwise, it returns one of
2

2
  .blank_command   -- verb to call if command line is empty
2
  .bogus_command   -- verb to call if command line otherwise unintelligible
2

2
In both cases :parse_command returns a verbname followed by the entire args list passed to it (including the would-be verb at the beginning if any).
2

2
Currently the following verbs are availabe to non-connected players
2

2
  h*elp @h*elp       -- print .welcome_message
2
  ?                  -- print a short list of available commands
2
  w*ho @w*ho         -- print a list of logged in players (excluding wizards)
2
  co*nnect @co*nnect -- connect to an existing player
2
  cr*eate @cr*eate   -- create a new player
2
  up*time @up*time   -- tell how long the server has been running
2
  version @version   -- tell which version of the server is running
2
  q*uit @q*uit       -- logoff
2

2
Adding a new command is fairly straightforward; just create a verb on $login, making sure a previous verb doesn't already match the name you want to give it.  Then give it args of "any" "none "any" and make sure it is +x.  Such a verb should begin with `if (caller != #0) return E_PERM; ...' so as to prevent anyone other from a not-logged-in player from making use of it.
2

2
CUSTOMIZATIONS
2

2
  .welcome_message 
2
    -- the message for "help" to print.
2
  .create_enabled 
2
    == 0 => @create prints .registration_string if one tries to use it
2
    == 1 => anyone from a non-blacklisted site (see `help blacklist')
2
            may use @create to make a new player
2

2
  .registration_address
2
    -- an email address for character creation requests
2
  .registration_string  
2
    -- string to print to players to give them information about how to get 
2
       a character created for them, .registration_address is substituted 
2
       for %e, % for %%
2
  .newt_registration_string
2
    -- string to print to @newted players (see `help @newt').
2
       same substitutions as for .registration_string.
2

2
Other verbs
2
   :registration_string()      => .registration_string with substitutions
2
   :newt_registration_string() => .newt_registration_string with substitutions
2
   :player_creation_enabled(connection) 
2
       decides whether someone on connection should be allowed to create 
2
       a player.  If you decide this shouldn't depend strictly on the blacklist
2
       and on the value of .create_enabled, here's where the extra code can go.
2
   :check_for_shutdown()
2
       prints a warning message to append to the login banner in the event 
2
       that the server will be going down soon.
2
   :check_player_db()
2
       prints a warning message to append to the login banner in the event 
2
       that $player_db is being reloaded to warn players that their character
2
       names might not be recognized.
2

2
SITE LOCKS
2
see `help blacklist'
2

38
5
4
29
2
The Generic Container (for programmers)
2

2
In addition to the command verbs described under `help containers'
2
and the _msg properties described in `help container-messages',
2
the following verbs and properties are available for use within programs
2

2
.opened == TRUE iff the container is open
2
.dark   == TRUE iff the contents of the container may be seen
2
.opaque -- describes the correlation between .open and .dark
2
   == 0  container is always !dark
2
   == 1  container is dark iff it is closed
2
   == 2  container is always dark              
2

2
:set_opaque(newvalue)   
2
  changes the .opaque value for the container
2
  => newvalue or E_PERM or E_INVARG
2

2
:set_opened(newvalue)   
2
  opens/closes the container (updates .open and .dark) according to newvalue
2
  => newvalue or E_PERM
2

2
:is_openable_by(player) 
2
 what the :open command uses to test whether the player should be able to open
2
 the container.  By default this refers to .open_key  (set by
2
 @(un)lock_for_open), but the object owner is free to customize this.
2

2
N.B.:  There is no way to directly set .dark; .dark can be changed only by 
2
changing one of .opaque or .opened.  Use :set_opaque(0) and :set_opaque(2)
2
to have .dark change independently of the value of .opened.
38
5
4
68
2
$mail_agent
2

2
This object contains a two distinct sets of routines:
2

2
  1.  utilities for performing basic mailsystem functions, e.g.,
2
      matching on recipient names, resolving mail forwarding, 
2
      formatting messages, sending messages
2

2
Recipient Matching
2

2
match           - match on a $mail_recipient
2
match_recipient - match on either a $mail_recipient or a player
2
match_failed    - print angry messages to the user for $failed/ambiguous_match
2

2
look_self  - provides a list of available $mail_recipients
2
check_names
2
touch
2
accept
2

2
Message Format
2

2
make_message        - produces a message in the canonical transmission format
2
name                - single recipient     => string for address field
2
name_list           - list of recipients   => string for address field
2
parse_address_field - address field string => object list
2

2
Sending Messages
2

2
send_message  - advertised message sending routine.
2
raw_send      - raw message sending routine 
2
                (only called by $mail_editor:send and this:send_message)
2
resolve_addr  - converts a given list recipients into a list of actual 
2
                recipients and objects to be notified.
2
sends_to      - Does X forward (transitively) to Y
2

2
Mail Options
2

2
option         
2
option_verbose
2

2
  2.  canonical versions of mail_recipient verbs
2

2
Ideally, the verbs to perform operations on a given mail recipient would be located on the recipient itself, except for the fact that these verbs also need to be located on players, which for various reasons, shouldn't be children of $mail_recipient.  Multiple inheritance would solve our problems, but we don't have it yet.  Ergo, both $mail_recipient and $player refer to the following verbs here:
2

2
display_seq_full     print entire text of messages  (@read)
2
display_seq_headers  print headers of messages      (@mail)
2
rm_message_seq       remove messages                (@rmm)
2
undo_rmm             undo last rm_message_seq       (@unrmm)
2
expunge_rmm          flush removed messages         (@unrmm expunge)
2
list_rmm             list removed messages          (@unrmm list)
2
renumber             renumber messages              (@renumber)
2
msg_summary_line     msg header => display_seq_headers/list_rmm summary line
2

2
parse_message_seq    command line msg sequence spec => message sequence
2
new_message_num      => message number of next new message
2
length_all_msgs      => number of messages (total)
2
length_num_le        => number of messages numbered <= some number
2
length_date_le       => number of messages dated <= some date
2
exists_num_eq        => true iff there exists a messsage with the given number
2
from_msg_seq         => message sequence of msgs from given sender(s)
2
to_msg_seq           => message sequence of msgs to given recipient(s)
2
subject_msg_seq      => message sequence of msgs with subjects containing text
2
body_msg_seq         => message sequence of msgs with bodies containing text
2
messages_in_seq      => list of {message number, message} pairs
2

2
messages             == :messages_in_seq(1,:length_all_msgs()+1)   (obsolete)
2

2
The $mail_agent versions of these verbs are set_task_perms(caller_perms()) and perform their operations on caller, which in turn is assumed to have done any necessary security checks.
38
5
4
38
2
Subscribing to Mail Recipients
2
------------------------------
2
There are two notions of being "subscribed" to a mailing list/recipient.
2

2
(1) Hard subscribed == being on the recipient's .mail_forward list so that mail sent to this list is forwarded to one's own .messages as well (see `help mail-forwarding').
2

2
(2) Soft subscribed == keeping track of a current message for this recipient and (optionally) being on the recipient's .mail_notify list.
2

2

2
Each player has a .current_message property that contains, for each recipient the player cares to keep track of, a current message number and a last read date.
2

2
player:current_message(rcpt)                 (somewhat obsolete)
2
 => player's current message number for rcpt 
2

2
player:get_current_message(rcpt) 
2
 => player's {current message number for rcpt, last-read-date for rcpt}
2

2
player:make_current_message(rcpt)
2
 => adds a current_message entry for rcpt  (NOOP if rcpt == player)
2

2
player:set_current_message(rcpt,n|E_NONE,[,date])
2
 => sets player's current message number for rcpt to n iff n!=E_NONE
2
    updates the last-read-date for rcpt to date iff date > last-read-date
2

2
player:kill_current_message(rcpt)
2
 => removes current-message info for rcpt  (NOOP if rcpt == player)
2

2

2
On $mail_recipient, .mail_forward and .mail_notify are -c so one needs to use the following verbs to actually modify them.
2

2
    :add_forward(@new_recipients)
2
    :delete_forward(@recpients)
2
    :add_notify(@new_notifiees)
2
    :delete_notify(@notifiees)
2

2
A recipient's owner is, of course, allowed to make arbitrary changes to .mail_forward and .mail_notify.  However, the default versions of these verbs also allow any player to add him/herself to a recipient's .mail_forward or .mail_notify if the recipient is readable (see `help MR-access') by him/her.
2

2
Likewise any player may use the :delete* verbs to delete him/herself from any .mail_forward/.mail_notify list, regardless of his actual access to the list.
38
5
4
15
2
One may always refer to a list by its object number.  In order to refer to it by name, it must be contained in $mail_agent, which holds all mailing lists, i.e., those that you want others to be able to refer to by name.
2

2
The .aliases field holds the names by which one may refer to the list, but only those names not containing spaces actually count for anything.  As with certain other types of objects (e.g., players), set_aliases() needs to be called in order to change the .aliases field.
2

2
$mail_agent:match(name) 
2
    is the canonical way to obtain the objectid of a mailing list 
2
    given the name ("*" is assumed; an initial "*" will be dropped).
2

2
$mail_agent:match_recipient(name) 
2
    is the canonical way to obtain the objectid of a list or player
2
    matching the given name.  An initial "*" indicates that this is 
2
    supposed to be a list.
2

2
$mail_agent:match_failed(objid,name) 
2
    is the mail_recipient counterpart to $command_utils:object_match_failed
38
5
4
32
2
Controlling Access to Mail Recipients
2
-------------------------------------
2
:is_writable_by(one) - one may alter/add/remove saved messages
2
:is_readable_by(one) - one may read messages.
2
:is_usable_by(one)   - one may send to this list
2

2
By default, these verbs refer to the following properties:
2

2
writers   - list of players other from the owner who can do anything
2
readers   - if == 1, indicates a public mailing list.
2
            list of additional readers (by default anyone who receives mail 
2
            sent to the list can read the saved messages).
2
moderated - if false, indicates a normal mail recipient everyone can send to.
2
            otherwise this should be a list of approved senders.
2

2
Terminology:
2
  A mailing list is "public" if everyone can read it.
2
  A mailing list is "moderated" if not everyone can send to it.
2

2
Note that while being able to write to a recipient implies being able to read from it or send to it, neither of read-ability or send-ability implies the other.
2

2
It is highly recommended that if you are creating custom mail recipients with variable reader/sender lists, i.e., you find you need to write your own :is_readable/usable/writabe_by verbs, you are best off if such verbs are of the form
2

2
  return pass(@args) || << your_test(args[1]) >>
2

2
and have .writers == .readers == {} and .moderated == 1.  This will ensure
2
 (1) wizards having write access
2
     --- necessary in order for :receive_message to work
2
 (2) writers being able to read and send (the converse being a ludicrous 
2
     situation), 
2
 (3) persons on the mail_forward list of someone with reader access will also
2
     have read access (convenient).
38
5
4
19
2
Generic Mail Recipient
2
----------------------
2
A "mail recipient" is, by definition, an object that can be sent mail.
2
Mail recipients must either be players or descendants of $mail_recipient.
2

2
One source of confusion is that the terms "mail recipient", "mail folder", "mailing list", and "mail collection" really all refer to the same kind of object.  It so happens that $mail_recipient serve several distinct functions and we tend to use whatever term happens to best match the application under discussion, e.g., it's a "mailing list" if we're playing with its .mail_forward property but it's also a "mail folder" if we're examining the messages that have been saved in it.
2

2
Note that, by default, a freshly created recipient is accessibly only by you.  If you wish to make a publically accessible recipient, set .readers=1.  Furthermore, if you want to allow a message on your recipient to be removed by its sender without your intervention, set .rmm_own_msgs=1.  Finally, in order for other players to be able to refer to your recipient by name, the object must reside in $mail_agent.  $mail_agent will not accept the object unless it has an actual description and a name distinct from all other mail recipient names/aliases.
2

2
Topics:
2

2
  MR-access       -- controlling read, write and send access to a recipient
2
  MR-naming       -- naming conventions and how to match on recipient names
2
  MR-sequences    -- message sequence arguments to $mail_recipient verbs
2
  MR-reading      -- reading messages/headers on recipients
2
  MR-searching    -- searching message lists for patterns in certain fields
2
  MR-writing      -- removing and renumbering messages
2
  MR-subscribing  -- updating .mail_forward, .mail_notify 
2
                       and the story of .current_message
38
5
4
24
2
Receiving Mail
2
--------------
2
By definition a recipient "receives" a mail message when its :receive_message verb is called with that message as an argument.
2

2
:new_message_num()
2
=> number that will be assigned to the next incoming message.
2
By default this returns the maximum of the message numbers appearing in 
2
messages or .messages_going, incremented by 1.  If the recipient is a player
2
then the value returned will be 1 higher if it conflicts with the player's 
2
current message number for him/herself.
2

2
:receive_message(msg,sender)
2
By default this first calls this:new_message_num to obtain a message number to assign to the incoming message and then appends {num,msg} to this.messages.  
2
`sender', the original sender, is supplied in case one wants different 
2
action depending on who is sending the message (e.g., mail-gagging).
2
The return value should be an error or string if :receive_message is considered to have failed in some way.  Otherwise, a number should be returned --- this number is given to any :notify_mail routines that are called and is expected to either be 0 or the number assigned to the incoming message.
2

2
Note that :receive_message can do arbitrary things, including resending the same message to a new destination.  Hacking :receive_message to resend messages is different from using .mail_forward in the following respects
2
  (1) the resent message is considered to be a distinct message having this 
2
      object as its "author" --- i.e., the From: line will necessarily be 
2
      different.
2
  (2) since this "forwarding" is invisible to the mailsystem, 
2
      there is no protection against loops and multiple copies.
2

38
5
4
34
2
Mail Transmission Format
2
------------------------
2
There is a standard message format used for transmitting messages.  This is the format that $mail_editor:make_message produces, and that :receive_message verbs on players and $mail_recipients expect to see.  The (currently experimental) @refile and @copym commands also use this format to transfer messages.
2

2
This *transmission* format is distinct from the *storage* format, though, for convenience this same format is often used as well for storing messages in player collections and ordinary $mail_recipient children though, in general, there is no requirement that this be the case.
2

2
A transmitted message is a list in the following form
2

2
   date (number),
2
     the time() value at the time the message was sent.
2
   from (string),
2
     the sending object (address list form)
2
     if this is not a player, an additional header will indicate the 
2
     current ownership of the object.
2
   to  (string),
2
     recipients (address list form) which can either be players 
2
     or $mail_recipient descendents.
2
   subject (string),
2
     subject of the message, or " " if there is no subject,
2
  @additional optional headers (list of strings),
2
     each header has the form "<header-name>: text" where <header-name>: 
2
     is padded out to a width of 10 columns for the convenience of 
2
     :display_message.  Currently "Reply-to: <address list>" is the only 
2
     additional header in use,
2
   "",
2
  @body of message (list of strings)
2

2
Note that the from, to and subject lines do *not* include a header name like "From:", "To:", or "Subject:".  The @'s indicate that the lists in question get spliced in (as usual), thus the entire message is a list whose first element is a number and the rest are strings.
2

2
The address lists that appear in the from and to lines is a string in the form a sequence of object ids, each enclosed in parentheses and preceded by optional text, e.g.,
2

2
  "*Core-DB-Issues (#8175), Rog (#4292), and Haakon (#2)"
2

2
The text is intended to give the current name of each object for the benefit of human readers, but is actually ignored by all header parsing routines.  The convention is that the text is either a player name or a * followed by a mailing list name.
38
5
4
52
2
Resolving Mail Forwarding & Notification
2
----------------------------------------
2
For each recipient of a given mail message, the following two verbs are called to determine where the message should actually go and who should be notified about it:
2

2
:mail_forward([from])
2
    should return either
2
     . a list of objects (either players or $mail_recipients)
2
         to which mail for this recipient will be redirected.
2
     . a string error message to be printed to the player sending the message.
2
         If this recipient is one of the original destinations (i.e., not the
2
         result of a previous forwarding), no mail is actually sent.
2

2
    If :mail_forward returns a nonempty list, the recipient itself will *not*
2
    actually receive the mail message unless it is included in the list.
2
    #-1 is allowed to be on the list; it is ignored but does make the list 
2
    nonempty.  Thus, having :mail_forward() return {#-1} is the canonical way
2
    to have arriving mail disappear without being kept or forwarded.
2

2
:mail_notify([from]) 
2
    should return a list of objects that are to be told about any mail sent 
2
    to this recipient (whether or not the recipient actually receives it).
2
    Said objects must have a :notify_mail verb, but other from that, there 
2
    is no restriction on what these can be.
2

2
    object:notify_mail is called with the arguments 
2
    (sender,recipients,msgnumbers) where 
2
      recipients  == list of recipients including object in .mail_notify
2
      msgsnumbers == corresponding list of :receive_message return values
2
                 (or 0 if :receive_message is not actually called, which
2
                  will be the case if the recipient forwards without keeping)
2

2
When called as part of a mail send, the `from' argument is the immediate predecessor on the forwarding chain.  The default versions of these verbs return the values of .mail_forward and .mail_notify respectively (pronoun_subbing if the value is a string), unless this is a moderated mailing list and `from' is an unapproved sender (see `help MR-access') in which case the following verbs are called instead:
2

2
:moderator_forward(from) 
2
    what :mail_forward should return for mail coming from unapproved senders
2
    This returns .moderator_forward (pronoun_subbed if a string) by default.
2

2
:moderator_notify(from)
2
    what :mail_notify should return for mail coming from unapproved senders
2
    This returns .moderator_notify (pronoun_subbed if a string) by default.
2

2
Since the :mail_forward verbs only see the previous sender in the forwarding chain, if, e.g, B is moderated but A can send to B (i.e., B:mail_forward(A) returns an actual list), then any mail sent to A goes to B even if the original sender isn't normally allowed to send to B directly.
2

2
These verbs should all allow `from' to be omitted in which case they should return as if `from' were a generic approved sender (e.g., wizard).
2

2
It should rarely be necessary to actually modify any of :*_forward/*_notify verbs, since one has a fair amount of control over their behavior via the following properties
2

2
  .mail_forward
2
  .mail_notify
2
  .moderated          (see `help MR-access')
2
  .moderator_forward
2
  .moderator_notify
38
5
4
24
2
Sending Mail
2
------------
2
$mail_agent:send_message(from,recipients,headers,body)
2
  from:        sender of the message 
2
               (this must be you or something you own; otherwise => E_PERM)
2
  recipients:  object or list of objects (must all be players or 
2
               $mail_recipient descendants)
2
  headers:     either a string (contents of the Subject: line) 
2
               or a list {subject,replytos} replytos is a list 
2
               of objects designated to receive replies.
2
               Use {"",replytos} to have a Reply-to: without a Subject:
2

2
This is the canonical way to send a mail message from a program.
2
This calls $mail_agent:make_message to format the arguments into an actual message (see `help mail-format') and then $mail_agent:raw_send to do the actual sending which goes as follows:
2

2
  (1) Call :mail_forward on all recipients add any new recipients thus obtained to final recipient list, keep calling mail:forward on the new recipients until we obtain no additional recipients.  If one of the initial recipients is invalid, is not a player or $mail_recipient, or has its mail_forward return a string error, then we print the error message and abort at this point with no mail being sent.  If one of the later recipients bombs similarly, error messages are printed, but in this case mail still goes out to the other recipients.
2

2
  (2) Call :mail_notify on all recipients encountered in stage (1) to get a list of objects to notify.
2

2
  (3) All final recipients receive the message (see `help receive-mail')
2
  (4) All notifications are delivered (using :notify_mail())
2

2
We return {0, @failed_recipients} if we bombed out at step 1.
2
Otherwise return {1, @actual_rcpts} indicating what mail was sent.
38
5
4
13
2
Mail System
2
-----------
2
The following topics describe the guts of the LambdaCore mail system
2

2
sending-mail     -- how to send mail from a program; what happens.
2
mail-forwarding  -- how to do mail forwarding/notification (the simple version)
2
mail-resolution  -- how mail forwarding/notification works, in gory detail
2
receiving-mail   -- what :receive_message should do
2
mail-format      -- format of transmitted messages
2
mail-command-parsing   (TODO) -- routines for parsing mail commands
2

2
$mail_recipient  -- generic non-player mail recipient
2
$mail_agent      -- mail utility object
38
5
4
34
2

2
Database of Players
2
-------------------
2
This is an instance of the Generic Database ($generic_db) that
2
holds the {name/alias,#objectid} pairs for every 
2
name and alias of every player in the MOO.
2

2
Verbs supplied include
2

2
  :find(string)        => player or $ambiguous_match or $failed_match
2
  :find_exact(string)  => player or $failed_match (does not do partial matches)
2
  :find_all(string)    => list of all matching players
2

2
  :insert(string,player) 
2
       records that string is now a name or alias of player
2
  :delete(string) 
2
       removes string from the db
2
  :available(string)
2
       returns 1 if string is available as a player name or alias,
2
       an object if string is in use, or 0 if string is otherwise unavailable.
2
  :load()
2
       resets the db, inserting all current player names and aliases.
2

2
The internal representation and all of the above verbs (except :load() and
2
:available()) are as described for $generic_db.
2

2
It should be noted that for any application that involves resolving a player name from a command line, you should be using $string_utils:match_player() rather than $player_db:find(), since the former will deal correctly with other ways of referring to players apart from their names and aliases (e.g., literal object numbers, "me", "$no_one"...).
2

2
:load() needs to be done periodically as it is possible for the player db 
2
to get out of synch with reality.  In particular, there is currently no way
2
to block someone writing his own player :recycle() verb that neglects to 
2
remove his names from the player db.
2

2
While a :load() is in progress the .frozen property is set to 1 to indicate that any results of :find*() are not to be trusted.
38
5
4
2
2
*index*
2
Core Utility Help Topics
38
5
4
64
2

2
Which :match...() Verb Do I Call?
2
---------------------------------
2
There are many situations where one wishes to obtain an object from a room or a player's .contents whose name/aliases matches a particular string.  There are four main verbs available for this and it is important to understand the distinctions between them and how they are supposed to be used.
2

2
(*)  LOC:match("X")
2
     -- what you get looking for something that is inside LOC and named "X".
2
        By default, this looks through LOC.contents to find a unique object 
2
        having a name or alias that has "X" as a prefix.
2

2
Essentially, you can think of :match as a contents-matching verb, though, e.g., for rooms you also get matches on exits as well.
2

2
(*)  LOC:match_object("X", YOU)           [YOU defaults to player]
2
(*)  YOU:my_match_object("X", LOC)        [LOC defaults to player.location]
2
     -- what YOU get being located at LOC and looking for something named "X".
2
        By default these both return $string_utils:match_object("X",LOC,YOU)
2

2
(*)  $string_utils:match_object("X", LOC, YOU) 
2
   -- what you *would* get *if* YOU were a typical player, YOU were inside LOC,
2
      YOU were looking for something named "X", *and* LOC were a typical place.
2

2
In other words, $string_utils:match_object describes the :match_object() algorithm for "typical places" and the :my_match_object for "typical players":
2

2
    (1)  check for "X" being one of "", "me", "here", "$something", or "#n"
2
    (2)  try YOU:match("X") i.e., something in your inventory (maybe)
2
    (3)  try LOC:match("X") i.e., some object in the room (maybe)
2

2
The distinction between these location:match_object and player:my_match_object has to do with whether the player or the location should determine what the matching algorithm is.  Which one you should use depends on the command that you are writing.  If you are writing a command with a virtual-reality flavor, then you should be respecting the room owner's idea of which objects you can "see" and thus the command should be calling the location's :match_object verb.  If you are writing a building/programming command where it is appropriate for the player to determine the matching algorithm  --- whether because the current location is irrelevant, not to be trusted, or both --- then the player's :my_match_object verb should be called.
2

2
Examples:
2

2
  `look diamond in box'
2
      calls box:match("diamond").  This is a match on the contents of box.
2

2
  `take ball', 
2
      calls player.location:match_object("ball")
2
      to determine which "ball" to take.  Note that if the room is dark, 
2
      we might not be able to find any "ball".
2

2
  `@program widget:foo', 
2
      calls player:my_match_object("widget") to get the player's own idea
2
      of what "widget" should be.  Note that if I were carrying something 
2
      named "widget" and expecting to be programming a :foo() verb on it,
2
      it would be potentially disastrous should the room where I am decide
2
      for me to be programming something else (not even necessarily 
2
      called "widget").
2

2
Object Matching Failures
2
------------------------
2
As with other matching routines, one gets back 
2

2
  $failed_match in the case of no matching object
2
  $ambiguous_match in the case of more than one matching object
2
  $nothing in the case of a blank string argument
2

2
or an object-id.  In these first 3 cases, one usually wants to translate these nonresults to the player; this is what $command_utils:object_match_failed.  The standard idiom to mimic what the builtin parser does, say, with the direct object is
2

2
  dobj = foo:match_???(dobjstr);
2
  if($command_utils:object_match_failed(dobj, dobjstr))
2
    "...give up.  nothing to do.   error message has already printed...";
2
  else
2
    "...dobj is something useful.  Continue...";
2
    ...
2
  endif
38
5
4
15
2
$no_one
2
-------
2
..is a powerless player.  He owns no objects, not even himself; nor does he own any verbs.  He is, however, a programmer and thus may use eval().
2
In fact his sole purpose is to evaluate questionable code.
2
`questionable' could be in either or both of the following senses
2

2
(1) Its origin is sufficiently uncertain so that there is no obvious way of deciding whose permissions it should run under.
2
(2) The code itself is potentially malicious, i.e., to the extent that one does not want to be evaluating it using one's own permissions.
2

2
set_task_perms($no_one);  is thus the canonical idiom in wizard code for rendering anything that follows mostly harmless.  For use by ordinary programmers, we have:
2

2
    $no_one:eval(string)
2

2
which attempts to evaluate an arbitrary string using $no_one's permissions.
2
string is either an expression or ";" followed by one or more statements, of which the final semicolon may be omitted.  return values are what eval() would return (either {1,value} or {0,@error_messages}).
38
5
4
19
2
Exits
2
-----
2
An exit can be renamed by either the owner of the exit or the owner of its source.
2

2
The standard verbs that are called in exit movement are:
2

2
:move(object)  - moves the object via this exit
2
:invoke()      - equivalent to :move(player)
2

2
When an exit is invoked on a particular object (via exit:move(object)), the following occurs.
2

2
(1) The exit may be locked against the object, in which case we print the 
2
   nogo messages and quit.
2

2
(2) (room=exit.dest):bless_for_entry(object) is called.  Assuming that exit is recognized by room as being a legitimate entrance (i.e., is in room.entrances), this will enable room:accept(object) to return true.
2

2
(3) object:moveto(room) is called and the various messages (see `help exit-messages') are :announced/:told.  Note that this, in accordance with the way the builtin move() (and hence the default :moveto()) works, we get a call to room:accept(object) which checks for the room itself being locked against the object, and otherwise returns true if the blessing in the previous step worked.  The move is performed, here:exitfunc(object) and room:enterfunc(object) are called.  In particular, room:enterfunc clears the blessing bestowed in (2) now that it is no longer needed.
2

2
In general, the move may fail, in which case we :announce the (o)nogo_msgs.
38
5
4
81
2
The Generic Room ($room)
2
----------------
2

2
(1)  Announcements
2

2
:announce         (@text)         => broadcasts to all except player
2
:announce_all     (@text)         => broadcasts to all
2
:announce_all_but (objects,@text) => broadcasts to all except those in objects
2

2
say, emote
2

2

2
(2)  Command recovery
2

2
:huh            (verb,args) - server hook: last chance to make sense of verb
2
:here_huh       (verb,args) - room's last attempt to parse something
2
:here_explain_syntax (this,verb,args) - attempts to explain usage of verb
2

2

2
(3)  Residency
2

2
free_home  - true => @sethome allows anyone to set his .home to be here
2
residents  - objects on this list may teleport in and/or set their homes here.
2

2
:accept_for_abode(player) 
2
            => true iff player should be allowed to set .home to this room.
2

2
@resident*s
2

2

2
(4)  Looking
2

2
dark  - true => contents are not visible
2
ctype - 1..4 for four different styles of .contents lists
2

2
:match         (string)        => exit or object in room's .contents
2
:tell_contents (objects,ctype) - format objects according to ctype, tell player
2

2
l*ook
2

2

2
(5)  Entrance and exit.
2

2
:accept (object) - Called by move() and :moveto() before an object enters a room, if false is returned, movement is prevented.  Protocol permits this verb to make noise (though this is discouraged) as this is the only place the room will learn the object's original location.
2

2
:acceptable (object) - Called by verbs which wish to check whether movement will be possible.  Protocol prohibits this verb from making noise and requires it to return the same value as :accept would for the same arguments.
2

2
:is_unlocked_for (object) - interface with the @lock protocol.  Returns true or false depending on the state of locks for the object with the room.  Other things may prevent entrance even if this returns true.  Protocol prohibits this verb from making noise. 
2

2
:enterfunc (object) - called after entrance has succeeded.  Noise is fine.
2

2
:exitfunc (object) - called after an object has successfully left.  Noisemaking is fine.
2

2
(6)  Topology and Movement via Exits
2

2
See `help $exit' for an explanation of how the generic $exit works.
2

2
free_entry     - true  => `teleporting' in is allowed
2
                  false => only residents may teleport in
2
exits          - list of invokable exits leading from this room
2
entrances      - list of recognized exits leading to this room
2
blessed_object - object currently entering via an exit
2
blessed_task   - task_id for entering object
2

2
:match_exit      (string) => exit whose name matches string
2
:bless_for_entry (object) - set up room to accept object arriving from entrance
2
:add_exit        (exit)
2
:add_entrance    (exit)
2
:remove_exit     (exit)
2
:remove_entrance (exit)
2

2
e/east/w/west/s/south/n/north/ne/northeast/nw/northwest/se/southeast/sw/southwest/u/up/d/down, go, @add-exit, @add-entrance, @remove-exit, @remove-entrance, @exits, @entrances 
2

2

2
(7)  Ejection
2

2
victim_ejection_msg/oejection_msg/ejection_msg
2
:*_msg()  messages
2

2
@eject
2

38
5
4
2
2
*forward*
2
$generic_help
38
5
4
79
2
Generic Database
2
----------------
2
This holds a collection of {string key, datum} pairs, where datum can be anything.  At most one datum may be associated with any given string.  Data may be anything (lists, strings, numbers, objectids).  If you like, you can think of this as an array indexed by strings.
2
Verbs supplied include
2

2
  :find(string)          => datum, $ambiguous_match or $failed_match
2
  :find_key(string)      => full string key,  $ambiguous_match or $failed_match
2
  :find_exact(string)    => datum or $failed_match (no partial matches)
2
  :find_all(string)      => list of all data corresponding to matching strings
2
  :find_all_keys(string) => list of all matching strings
2

2
  :insert(string,datum)  
2
       if the string is already present in the db, 
2
       changes the associated datum and returns {old_datum};
2
       otherwise enters a new {string,datum} pair and return 0.
2
  :delete(string)
2
       if there is a datum associated with string, 
2
       remove this association and return {datum}; otherwise return 0.
2
  :delete2(string,datum)
2
       if the given datum is associated with string, 
2
       removes that association and return {datum}, 
2
       if some other datum is associated with string, just return {other datum}
2
       otherwise return 0.
2
  :clearall([4|3])
2
       removes all associations from the database.
2
       optional argument changes the type of the database 
2
       (4 is normal, 3 is a kludge for when the data are simply boolean flags
2
        i.e., this is a set of strings rather than a string-indexed array;
2
        more on this below)
2

2
  count [entries|chars] in this
2
        provide some vague statistics about how big this thing is.
2

2
N.B.  As entries get made, properties belonging to $generic_db.owner will be created on the db object itself.  These properties will be created having flags as specified by .node_perms, which by default is "r", but can be changed to "" should you want to ensure that randoms don't have access to the raw information.
2

2
Implementation notes
2
 - - - - - - - - - -
2
The representation is as a `trie', a tree in which each internal node corresponds to a prefix shared by two or more strings in the db.
2
Each internal node is kept in a property named " "+<prefix>, where <prefix> is a prefix shared by all strings in the subtree under this node.
2
The property value is a 4 element list
2

2
this.(" "+<prefix>)[1] = <common>
2
   maximal continuation shared by all strings beginning with prefix
2
   i.e., all these names actually begin with <prefix>+<common>
2

2
this.(" "+<prefix>)[2] = <continuations>
2
   string of all characters <c> that can follow <prefix>+<common> for which
2
   there is more than one string in the db beginning with <prefix>+<common>+<c>
2

2
this.(" "+<prefix>)[3] = <exact_matches>
2
   list of all strings in this subtree for which 
2
   the character (or lack thereof) following the <prefix>+<common> substring 
2
   suffices to determine the string.
2

2
this.(" "+<prefix>)[4] = <data>
2
   list of data corresponding to the strings in [3].
2

2
Child nodes are       this.(" "+<prefix>+<common>+<c>) 
2
       for all <c> in this.(" "+<prefix>)[2].
2
The root node is this.(" ").
2
If, e.g., there are 2 or more strings in the db beginning with a, 
2
there will be a node this.(" a").  
2
If all of these strings actually begin with "ani", then this.(" a")[1]=="ni".
2
The db consisting of the 5 correspondences
2

2
  {"animal", #1}
2
  {"anime",  #2}
2
  {"anil",   #3}
2
  {"anile",  #4}
2
  {"banal",  #5}
2

2
would be represented
2

2
this.(" ")    =={"",  "a",  {"banal"},         {#5}}
2
this.(" a")   =={"ni","lm", {},                {}}
2
this.(" anim")=={"",  "",   {"animal","anime"},{#1,#2}}
2
this.(" anil")=={"",  "",   {"anil","anile"},  {#3,#4}}
2

2
In some cases one may merely wish to hold a collection of strings without trying to associate a particular datum with each string.  One may then instead set up a db without the fourth field on each of the properties.  In this case the datum is taken to be the found string itself and that is what gets returned by :find*() in the event of a successful search.   :find and :find_key are then equivalent as are :find_all and :find_all_keys.  To setup the db this way, do a :clearall(3).  :clearall(4) reverts to the above described type of db with a separately kept datum.  Note that you can't change the type without emptying the db.  3 and 4 are currently the only db types allowed.
38
5
4
201
2
The Generic Editor enables a player to edit a list of strings.  While one might contrive to use it directly, it is rather intended as a parent for some actual editor.  It supplies the following commands:
2

2
say         <text>                      w*hat       
2
emote       <text>                      abort       
2
lis*t       [<range>] [nonum]           q*uit,done,pause 
2
ins*ert     [<ins>] ["<text>]           
2
n*ext,p*rev [n] ["<text>]               
2
del*ete     [<range>]                   
2
f*ind       /<str>[/[c][<range>]]       
2
s*ubst      /<str1>/<str2>[/[g][c][<range>]]
2
m*ove,c*opy [<range>] to <ins>          
2
join*l      [<range>]                   
2
fill        [<range>] [@<col>]          
2

2
$editor_help.(cmdname) descrbes cmdname
2
$editor_help.insert    descrbes insertion points (<ins>)
2
$editor_help.ranges    descrbes range specifications (<range>)
2

2
You'll notice that nowhere does it say how to load in a given list of strings or how and where one may save said list away when one is done editing.  These commands are supplied by the child editor object.  The generic editor contains only the code for editing lines, though it defines additional functions for use by the children:
2

2
  :loaded(player)
2
     returns the index (player in this.active) iff text has been loaded
2
     from somewhere, otherwise returns 0.
2

2
     Note that, by default, there is a difference between 
2

2
        having nothing loaded                (:text(who)==0) and 
2
        having loaded something with no text (:text(who)=={}).
2

2
     If you don't care about this distinction in a particular case,
2
     just do (player in this.active) instead of this:loaded(player).  
2
     If you don't want your editor to make this distinction at all, do
2

2
        @stateprop texts={} for <youreditor>
2

2
     which changes the initial value of :text() to {} 
2

2
In all functions below, 'who' is the index returned by :loaded(player) 
2

2
BTW, be careful about using 'player' in non-user (i.e., +x this-none-this) verbs --- much better to have the user verb get the index with :loaded() and then pass that around.  
2

2
Also be careful about suspend() and verbs that call suspend().  In particular, the player's index in the .active list can change during the suspend interval, so you must be sure to obtain the index (e.g., using :loaded()) again after the suspend() returns.
2

2
For your non-user verbs, we have
2

2
  :ok(who)
2
     returns E_PERM if the caller is not an editor verb and E_RANGE
2
     if 'who' does not point to a valid session.
2

2
which should take care of the more egregious security holes (but maybe not the less egregious ones).  For getting and loading text, we have
2

2
  :text(who)    
2
     the current text string list or 0 if nothing loaded yet.
2
  :load(who,text)
2
     loads the given list of strings as the text to be edited.
2
     this also resets the 'changed' flag and pushes the insertion 
2
     point to the end.
2

2
and various flags and properties (all of the set_* routines return E_PERM when not called from an editor verb, E_RANGE if who is out of bounds, E_INVARG if something is wrong with the 2nd arg, or the new value, which may not necessarily be the same as the 2nd arg (e.g., set_insertion(..,37) on a 5 line text buffer returns 6).
2

2
  :changed(who)
2
     has the text been altered since the last save/load?
2
     (the child editor gets to define what "save" means).
2
  :set_changed(who,value)
2
     Any child editor command that is considered to save the text should do a 
2
     :set_changed(who,0).  
2
     Note that if the changed flag is 0, the session will be flushed when 
2
     the player leaves the editor, so you may also want certain commands to
2
     do set_changed(who,1)...
2

2
  :origin(who)
2
     room where the player came from.  
2
  :set_origin(who,room)
2
     can be used to change the room the player will return to when finished
2
     editing.  Since origin gets set even in cases where the player teleports
2
     into the editor you probably won't usually need to do this.
2

2
  :insertion(who)
2
     current insertion point.
2
  :set_insertion(who,linenumber)
2
     linenumber needs to be a positive integer and will get 
2

2
  :readable(who)
2
     whether the current editing session has been made globally readable.
2
  :set_readable(who,boolean)
2
     change the readability of the current editing session.
2
     This is used by the publish/perish verbs.
2

2
We also provide
2

2
  :invoke(...)
2
      If the player has a previous unsaved (i.e., :changed()!=0)
2
      session, we return to it, moving the player to the editor.  
2
      If the player is already in the editor, this has no effect other
2
      than to print a few nasty messages.  In any case a :changed()
2
      session must be aborted or set_changed(,0) before anything else 
2
      can be started
2

2
      Otherwise, we pass the arguments (which are assumed to be the
2
      result of some munging of the command line) to :parse_invoke(),
2
      move the player to the editor and load whatever parse_invoke()
2
      specified.  The only interpretation the generic editor makes on
2
      the arguments is that if the boolean value of the first is true,
2
      this indicates that the player wanted to load something as
2
      opposed to resume a previous session.  Usually a command calling
2
      :invoke will have a true (i.e., nonzero number, nonempty list or
2
      string) first arg iff the command line is nonempty, in which case 
2
      'args' works fine for this purpose.
2

2
      If the command parses sucessfully (:parse_invoke() returns a list),
2
      we move the player to the editor if necessary and then call 
2
      :init_session() to set things up.
2

2
The child editor is assumed to provide
2

2
  :parse_invoke(...)
2
     given :invoke()'s arguments, determines what the player wants to edit.
2
     It either returns 0 and reports syntax errors to player,
2
     or it returns some list that :init_session() will understand.
2

2
  :init_session(who,@spec)
2
     where spec is something that was returned by :parse_invoke().
2
     Loads the text and sets the stateprops (below) to indicate that 
2
     we are working on whatever it is we're suppose to be working on.
2

2
  :working_on(who)   
2
     returns a string X as in "You are working on X."
2
     This is called by the 'w*hat' command, among other things.
2

2
Child editors may have their own properties giving state information for the various editing sessions.  The value of each such property will be a list giving a value for each player in the editor.  For each such property, you should, once the editor object has been created, initialize the property to {} and do one of
2

2
    @stateprop <propname>                 for <editor>
2
    @stateprop <propname>=<default-value> for <editor>
2
               (0 is the default <default-value>)
2

2
Henceforth, adding and deleting new editing sessions will amend the list held by the given property.  The value of the property for a given session can be obtained via this.<propname>[player in this.active] and can be changed with a corresponding listset() call.  The usual idiom for an editor command is
2

2
   if(!(who=this:loaded(player)))
2
     player:tell(nothing_loaded_msg());
2
   else
2
      ... various references to  this.<propname>[who] ...
2
   endif
2

2
To remove such a property from the list of such state properties:
2

2
    @rmstateprop <propname> from <editor>
2

2
Note that you can only do this with properties defined on the child editor itself.  
2

2
Sometimes you may wish to @stateprop a new property on an editor where active editing sessions exist.  @stateprop will fail if the property in question does not hold a list of the correct length (== length(editor.active); one value for each editing session).  You need to either give the @flush command to clear out all sessions and boot all players currently in the editor or somehow manually initialize the property to a list of appropriate values and pray that nobody enters/exits the editor between the property initialization and the @stateprop command --- this problem can be avoided by doing an eval() that does all of the initializations (beware of suspends()) and calls :set_stateprops directly.
2

2
Incidentally, the @flush command may be used at any time to clean out the editor or to remove all sessions older than a given date.
2

2
There are also numerous _msg properties that may be customized
2

2
    @depart          announced at the origin when :invoke() is called. 
2
    @return          announced at the origin the player is returned there.
2
    @nothing_loaded  printed when user attempts editing 
2
                     before anything has been loaded.
2
    @no_text         response to 'list' when :text()=={}
2
    @no_change       printed by 'what' when :changed()==0
2
    @change          printed by 'what' when :changed()==1
2
    @no_littering    printed upon leaving the editor with :changed()==1.
2
    @previous_session  printed by :invoke() when player tries to start a 
2
                     new session without aborting or saving the old one
2

2
The general procedure for creating a child editor:
2

2
. @create $generic_editor named <editor>
2

2
. define additional <editor> verbs/properties
2
    At the very least you need 'edit' and 'save' commands.
2
    Usually you can get away with just having 'edit' call :invoke();
2
    Presumably, you'll need at least a command to load text from somewhere
2
    as well as a command to save it back out.
2

2
. define a verb (somewhere) to invoke the editor 
2
    This could be just a one-liner that calls <editor>:invoke(args,verb).
2
    Either that or
2
      .  you have to set up an exit somewhere whose destination is <editor>
2
      .  you have to advertise the object number so that people can 
2
         teleport to it.
2
  
2
. @stateprop x for <editor>
2

2
. if you want the 'abort' command to boot the player from the editor do
2
    <editor>.exit_on_abort = 1;
2

2
. set <editor>.commands to be the list of additional commands defined
2
    by <editor>.  
2
    Each element of the list is itself a list of the form {name,args}.
2
  set <editor>.commands2 to be the list of commands that should appear
2
    in the `look' listing, and should be a list of strings appearing 
2
    as names in .commands on either <editor> or some editor ancestor.
2
  look at $verb_editor or $note_editor for an example.
2

2
. If you want to have help text for new verbs you define, create a child of 
2
    $generic_help and add properties to this object for each of the topics 
2
    that you want to provide help text.
2
    Finally, set <editor>.help = {this object} so that the help system
2
    knows to consult this object.
38
5
4
76
2
The Help System
2
---------------
2
When a player types help, the following list of objects is consulted for .help properties:  the player itself, all ancestors of player up to and including $player, and, if the current location is a room, the current location together with all ancestors of the current location back to and including $room.  Each help property should have as value either an object or a list of objects (otherwise we just ignore it).  These objects are then strung together as a list of `help databases' to be searched in order for the requested topic.
2

2
A help database (in the sense of anything that is usable by $player:help()) is any object having the following three verbs:
2

2
  :find_topics([string])
2
     where string is a supposed help topic, returns a list of strings,
2
     i.e., actual help topics that this db knows about, or some boolean 
2
     false value in the event that this db is clueless...
2
     If no arguments are given, this should return a list of all topics
2
     in the db
2

2
  :get_topic(string)
2
     given one of the strings returned by :find_topics this either
2
     returns a list of strings (text to be spewed to the player) or
2
     returns 1 to indicate that it has already taken care of printing
2
     information to the player.
2

2
  :dump_topic(string)
2
     like get_topic, but instead returns the raw text of a help topic
2
     as a (download/upload) script
2

2
In short if :find_topic reports that a particular db knows about a given topic
2
it returns the full topic name, so that :get_topic may be called on it later.
2
:dump_topic is used by maintainers (see $wiz:@gethelp) to edit help topics.
2

2
$generic_help and $help
2
-----------------------
2
The Generic Help Database, $generic_help, is the parent class of a particular kind of help database of which $help is an instance.  On help databases of this type, every help topic has a corresponding property, interpreted as follows:
2

2
  this.(topic) = string             
2
      one-line help text.
2

2
  this.(topic) = {"*<verb>*",@args}
2
      call this:<verb>(args,dblist) to get text where dblist is the list of 
2
      help objects that would have been consulted had the topic not been found 
2
      on this object.
2

2
  this.(topic) = other list of strings 
2
      multi-line help text
2

2
For the {"*<verb>*",...} form, the current verbs available are
2

2
  {"*forward*", topic, @rest}   
2
     - get help text for topic and then append the lines of `rest'.  
2
       rest may, in turn, begin with a "*<verb>*"...
2

2
  {"*pass*", topic, @rest}   
2
     - get help text for topic from the first help database after this one
2
       that actually has help text for topic, and then append lines of `rest'.
2
       As with "*forward*" rest may, in turn, begin with a "*<verb>*"...
2

2
  {"*subst*", @lines} 
2
     - All occurences of %[exp] in lines are replaced with the value of exp
2
         which is assumed to evaluate to a string.  
2
       All lines beginning with %;exp are replaced with the value of exp 
2
         which is assumed to evaluate to a list of strings.
2
       Evaluation is done using $no_one's permissions so exp in either case
2
       can only refer to public information.
2

2
  {"*index*", title}
2
     - returns a list of all topics in this database, arranged in columns.
2
       title is used as a heading for this index.
2

2
Individual help dbs are free to define additional verbs that may be used in this context.  $help itself defines the following additional such verbs:
2

2
  {"*index_list*"}
2
     - returns a list of all index topics in all databases in the search list.
2
       An index topic is one whose actual text is {"*index*", something}.
2
       When creating a help db, you should be sure to make an index topic.
2

2
  {"*full_index*"}
2
     - prints indices for all help databases in the search list.
2

2
It should be noted (once again) that help databases need not be children of $generic_help, so long as they have :find_topics/:get_topic/:dump_topic working as specified above.
38
5
4
62
2
Generic Option Package
2
----------------------
2
It occasionally happens that one has a command or set of commands for which one wishes to provide several options/flags that a player can set to customize the command's behavior for him/herself.  Making each option a separate property is a bit expensive, especially when the option in question is merely a boolean flag that gets set to false in most cases.  This package provides an alternative, as well as providing a uniform set of commands for setting these flags/options and checking that the values given are of appropriate types.
2

2
Instead of needing several properties, only one is required to store a list containing values for all of the options.  An "option package" (pkg, below) is then an object of this class, which provides routines for manipulating such lists.
2

2
The set of option names is divided into a set of "real" options, those whose names will actually appear in a given list, and "extras" which are either synonyms for or represent combinations of real options.
2

2
 pkg:add_name(name)      adds name to .names  (remove it from .extras if there)
2
 pkg:add_name(name,1)    adds name to .extras (remove it from .names if there)
2
    => 1 - ok, 0 - already added, E_INVARG - illegal name, E_PERM
2

2
 pkg:remove_name(name)   remove name from either .names or .extras
2
    => 1 - ok, 0 - not present, E_PERM
2

2
For setting or retrieving values we have
2

2
 pkg:get(options,name) 
2
    => value (or 0 if name isn't a real option)
2
 pkg:set(options,name,value)
2
    => revised options (or string error message if something goes wrong)
2

2
By default, a given option can only be a boolean flag, having one of the values 0 (absent from the list), or 1 (present in the list).  :set translates 0/""/{} to 0 and any other non-object value to 1.
2

2
One may however designate a wider range of possible values for an option "foo" by either installing one of
2

2
  pkg.type_foo
2
    -- list of allowed types, 
2
       e.g., {NUM,STR}   => must be a number or a string
2
       e.g., {OBJ,{OBJ}} => must be an object or a list of objects
2
    for anything fancier use:
2

2
  pkg:check_foo(value)
2
    => string error message or {value munged as desired}
2

2
In general, the only restriction on option values is that 0 is the only false value; setting an option to "" or {} sets it to 0.  Every option defaults to 0, and no matter what you install as .type_foo or :check_foo(), 0 will always be a legal value for option "foo".
2

2
When presented with an option that is in .extras, :set will typecheck the value as described, however, then :actual(name, value) will be called to obtain a list of {name-of-real-option, value} pairs indicating which combination of real options should be set.
2

2
Other verbs
2
  pkg:parse(args,...)
2
    parses the command line arguments of a @whatever_option command
2
    => {optionname, value}  if the player wants to set an option
2
    => {optionname}         if the player wants to view an option
2
    => string error message  otherwise
2

2
  one may install pkg:parse_foo to parse arguments for option "foo" 
2
    !foo     => {"foo",0}  (:parse_foo not called)
2
    foo=     => {"foo",0}  (:parse_foo not called)
2
    -foo     => {"foo",0}  (:parse_foo not called)
2
    +foo     => pkg:parse_foo("foo",1)
2
    foo=word => pkg:parse_foo("foo","word")
2
    foo word1 word2    => pkg:parse_foo("foo",{"word1","word2"})
2
    foo is word1 word2 => pkg:parse_foo("foo",{"word1","word2"})
2

2
 pkg:show(options,name|list of names)
2
    => list of strings describing the current value of the named option(s).
2
       calls     pkg:show_foo(options,list of names) or
2
       refers to pkg.show_foo
2
       to describe option "foo"
2

2
(see sources for details...  at some point I'll finish writing this... --Rog)
38
5
4
24
2
Message Sequences
2
-----------------
2
A "message sequence" is a handle by which one may refer to a particular subset of a mail recipient's (player or $mail_recipient-descendant) saved messages.  Routines like rcpt:display_seq_headers or rcpt:display_seq_full need to be supplied with message-sequence arguments to deterimine which headers or full-messages to display.
2

2
Message sequences can in turn be obtained from routines like rcpt:parse_message_seq, which takes a command-line description of a message sequence on that particular recipient and returns the corresponding message sequence handle.
2

2
The actual form of a message sequence (though you shouldn't actually need to make use of this) is that of a set of integers in the format used by $seq_utils (see `help $seq_utils').  It should however be noted that these integers are *not* themselves message numbers, but rather indices into the list of saved messages.  For example, if a particular recipient holds 5 messages numbered 1,3,5,7,9.  Then the message sequence handle representing messages 3,5,7 collectively, would be {2,5} which is $seq_utils-ese for the range 2..4, namely the second, third and fourth messages saved on that recipient.
2

2
The following verbs are available for obtaining indices to use in message sequences
2

2
  :length_all_msgs()    => total number of messages, or equivalently,
2
                        => index of last message
2
  :length_num_le(n)     => number of messages numbered <= n, or equivalently,
2
                        => index of highest numbered message <= n
2
  :exists_num_eq(n)     => 0 unless there exists a message numbered n in which
2
                           case we return the index of that message.
2
  :length_date_le(date) => number of messages dated <= date, or equivalently,
2
                        => index of most recent message dated <= date
2

2
  :length_date_gt(date) => number of messages dated > date
2

2
Note that r:length_date_gt(date) == r:length_all_msgs()-r:length_date_le(date).
2
The only reason :length_date_gt is provided as a separate routine is in order 
2
to do quick checks for the existence of new mail (as @rn needs to do).
38
5
4
24
2
Read verbs
2
----------
2
The following verbs may be used to extract headers/messages from readable mail recipients/players;
2

2
:display_seq_headers (message sequence, current message number, last_read_date)
2
  Does a @mail listing of the given message sequence.  If current message
2
  number is given and the sequence includes it, we mark it with a `>'.
2
  Likewise if the sequence includes any new messages (i.e., dated after 
2
  last_read_date), these are also indicated as such.
2

2
display_seq_full (message sequence, preamble)
2
  Does a @read listing of the given message sequence.  Each message is preceded
2
  by preamble.
2
  => {new current message number, new last_read_date}
2

2
:messages_in_seq (index)
2
  => {n, msg}
2
:messages_in_seq (message sequence)
2
  => {{n_1,msg_1},{n_2,msg_2},...}
2
  where the n_i are message numbers and the msg_i are messages in transmission
2
  format (see `help mail-format')
2

2
:list_rmm ()
2
  Does an `@unrmm list' listing of messages in .messages_going
38
5
4
17
2
Write verbs
2
-----------
2
The following verbs can be used to manipulate writable mail recipients/players:
2

2
:rm_message_seq (message sequence)
2
  Does an @rmmail.  Messages in message sequence are removed from this 
2
  recipient's saved .messages and written to .messages_going.
2

2
:undo_rmm ()
2
  Does an @unrmm.  Messages in .messages_going are copied back to .messages.
2

2
:expunge_rmm ()
2
  Does an @unrmm expunge.  Blows away .messages_going.
2

2
:renumber ()
2
  Does a @renumber.
2

38
5
4
25
2
Search verbs
2
------------
2
The following verbs can be used on a readable mail-recipient/player to search for messages with fields matching a given pattern.
2

2
from_msg_seq (objectid or list [,mask])
2
  => message sequence: messages from (one of) the given objectid(s)
2

2
%from_msg_seq (string or list [,mask])
2
  => message sequence: messages with (one of) the given string(s)
2
     in the From: line
2

2
to_msg_seq (objectid or list [,mask])
2
  => message sequence: messages to (one of) the given objectid(s)
2

2
%to_msg_seq (string or list [,mask])
2
  => message sequence: messages with (one of) the given string(s)
2
     in the To: line
2

2
subject_msg_seq (string [,mask])
2
  => message sequence: messages with given string occurring in Subject:
2

2
body_msg_seq (string [,mask])
2
  => message sequence: messages with given string occurring in body of message
2

2
In all cases `mask' is a message sequence which one may supply to limit the range of the search.  One way of looking at it is that the message sequence to be returned is first intersected with mask.
38
5
4
43
2
The housekeeper is an object that can help keep other objects where they belong.  New MOOs may want to add their own user interface for the housekeeper; here is some information that may be helpful.
2

2
To indicate what objects should be cleaned:
2

2
  :add_cleanup(object[, requestor[, where]])
2
    Ask the housekeeper to clean 'object' for 'requestor' to 'where'.
2
    Requestor defaults to 'player'.
2
    Where defaults to object.location.
2

2
  :remove_cleanup(what[, requestor])
2
    Remove 'what' from the cleanup list at 'requestor's request.
2
    Will remove it only if 'requestor' made the original request and owns
2
    the object or the destination.
2

2
To actually get the housekeeper to clean stuff up:
2

2
  :cleanup([insist])
2
    Clean up player's objects.  Argument is 'up' or 'up!' for manually
2
    requested cleanups.  'up!' means to clean things even if it's against
2
    the housekeeper's better judgement.
2

2
  :replace(object[, insist])
2
    Clean up the indicated object.  'insist' is as in :cleanup.
2

2
  :continuous()
2
    Starts the housekeeper cleaning continuously, killing any previous
2
    continuous task.  This should be called only when starting up a new MOO,
2
    or if something has gone wrong, as normally it will just keep going
2
    without any help.
2

2
  :litterbug()
2
    Clean up all the places in housekeeper.public_places by getting rid of
2
    all contents not in their .residents lists.  This is called by
2
    :continuous, so it doesn't need to be called directly.
2

2
To find out what's being cleaned to where for whom:
2

2
  :cleanup_list([whom])
2
    Show 'player' the personal cleanup list for 'whom', or the housekeeper's
2
    complete list if no argument is given.
2

2
  :clean_status()
2
    Show 'player' a brief summary of eir personal cleanup list.
38
5
4
28
2
$recycler
2
=========
2

2
Rather than having the server built-in recycle() and create() functions handle the creation and destruction of objects, a recycling center has been created to simulate these actions by  changing objects that would have been recycled into children of $garbage (The Generic Garbage Object) and making them owned by Hacker, and then when they're needed again, to avoid a raw create() command, those objects are given to whoever's asking for them.
2

2
Most Useful Verbs
2
-----------------
2

2
$recycler:_recycle( object )
2
  This will effectively recycle an object. (As a point of fact, it changes ownership of the object to Hacker and makes the object a child of $garbage.)  It handles .ownership_quota and .owned_objects properly.  Generally, use this instead of a recycle() in your verbs.
2

2
$recycler:_create( parent object [ , new owner object ] )
2
  This effectively creates an object (with the specified parent, if possible, and with the specified owner, if possible; these are the same restrictions as on the server create() builtin).  This is what should generally be used instead of create() in your programming.
2

2
$recycler:valid ( object )
2
  This is a variant of the server built-in valid() except that it handles the $garbage objects as well.  It returns a 1 if the object specified -is- valid and is -not- a $garbage object.
2

2
Other Notes
2
-----------
2

2
request <object> from <recycler>
2
  This is not an internal verb (it's !x).  It is, however, a command-line verb that can be used to request a specific object from the recycler.  It's also useful for the creation of objects like a Magic Number Repository.  When the object is removed from the recycler, the .announce_removal_msg is announced to the room if it's set (it's piped through $string_utils for pronoun substitution).
2

2
show-history <recycler>
2
  This is a wizardly verb which allows wizards to check the `history list' of the recycler. The history maintains the latest ($recycler.nhist) entries.
2

2
$recycler.orphans
2
  This maintains a list of objects for which the recreation process got mangled. It ought to be checked every once in a while to see what's up.
2
1
4
10
2
$error
2
======
2

2
The Error Generator, $error, may be used to automatically generate errors. This is particularly useful if you are working in a !d verb but have occasion to -want- to crash with traceback. To raise a specific error, use $error:raise(error type) -- for example, $error:raise(E_PERM) will produce traceback resulting from a Permission Denied error.
2

2
Random notes about $error:
2

2
+ The complete list of errors is stored in $error.names.
2
+ The seemingly useless :accept() verb on $error is so that $error:E_RECMOVE and $error:E_NACC will be guaranteed success (success meaning, of course, a termination by traceback).
2
+ There is, unfortunately, no way to raise the error E_NONE.
2
1
4
72
2
Generic BigList Utilities
2
----------------------------
2
$biglist is a collection of routines for maintaining huge persistent (sorted) lists in a format that is less likely to spam the server (which runs into a certain amount of trouble dealing with long ordinary lists --- btw we use `biglist' to refer to the huge data structure we're about to describe and `list' to refer to ordinary MOO lists {...}).  The biglist in question lives on a particular object, to which we will refer in the discussion below as the `home' object, and its various elements appear as leaves of a tree whose nodes are kept in properties of the home object.  It should be noted that the home object does not need to be (and in fact should *not* be) a descendant of $biglist one; $biglist merely provides utilities for manipulating the properties on the home object that are used in a particular biglist manipulation.  
2

2
All of the utilities below refer to `caller' to locate the home object.  Thus verbs to manipulate a given biglist must be located on or inherited by its home object itself.  The home object needs to define the following verbs
2

2
  :_make(@args)     => new property on home object with value args
2
  :_kill(prop)      delete a given property that was created by :_make
2
  :_get(prop)       => home.prop
2
  :_put(prop,@args) set home.prop = args
2
  :_ord(element)    given something that is of the form of a biglist element
2
                    return the corresponding ordinal (for sorting purposes).
2
                    If you never intend to use :find_ord, then this can be a 
2
                    routine that always returns 0 or some other random value.
2

2
See $generic_biglist_home or $big_mail_recipient for examples.
2

2
Those of the following routines that take a biglist argument are expecting
2
either {} (empty biglist) or some biglist returned by one of the other routines
2

2
  :length(biglist)          => length(biglist) (i.e., number of elements)
2
  :find_nth(biglist,n)      => biglist[n]
2
  :find_ord(biglist,k,comp) => n where n is
2
     the largest such that home:(comp)(k,home:_ord(biglist[n])) is false, or
2
     the smallest such that home:(comp)(k,home:_ord(biglist[n+1])) is true.
2
     Always returns a value between 0 and length(biglist) inclusive.
2
     This assumes biglist to be sorted in order of increasing :_ord values 
2
     with respect to home:(comp)().
2
     Standard situation is :_ord returns a number and comp is a < verb.
2

2
  :start(biglist,s,e)  => {biglist[s..?],@handle} or {}
2
  :next(@handle)       => {biglist[?+1..??],@newhandle} or {}
2
     These two are used for iterating over a range of elements of a biglist
2
     The canonical incantation for doing
2
        for elt in (biglist[first..last])
2
          ...
2
        endfor
2
     is
2
        handle = :start(biglist,first,last);
2
        while(handle)
2
          for elt in (handle[1])
2
            ...
2
          endfor
2
          handle = :next(@listdelete(handle,1));
2
        endwhile
2

2
The following all destructively modify their biglist argument(s) L (and M).
2

2
  :set_nth(L,n,value)  =>  L[n] = value
2
     replaces the indicated element
2

2
  :insert_before(L,M,n) => {@L[1..n-1],@M,@L[n..length(L)]}
2
  :insert_after (L,M,n) => {@L[1..n],  @M,@L[n+1..length(L)]}
2
     takes two distinct biglists, inserts one into the other at the given point
2
     returns the resulting consolidated biglist
2

2
  :extract_range(L,m,n) => {{@L[1..m-1],@L[n+1..]}, L[m..n]} 
2
     breaks the given biglist into two distinct biglists.
2

2
  :delete_range(L,m,n[,leafkiller]) => {@L[1..m-1],@L[n+1..]}
2
  :keep_range  (L,m,n[,leafkiller]) => L[m..n]
2
     like extract_range only we destroy what we don't want.
2

2
  :insertlast(L,value)  => {@L,value}
2
     inserts a new element at the end of biglist.  
2
     If find_ord is to continue to work properly, it is assumed that the 
2
     home:_ord(elt) is greater (comp-wise) than all of the :_ord values
2
     of elements currently in the biglist.
2

2
  :kill(L[,leafkiller]) 
2
     destroys all nodes used by biglist.  
2
     Calls home:leafkiller on each element.
38
1
5
38
5
5
38
4
4
1
2
Core Utility Help
38
5
2
Help database for LambdaCore utility objects and generics.
38
5
4
2
0
83978
0
750669393
2
1
#24
Programmer Help

16
2
-1
-1
-1
32
-1
23
2
errors
2
173
-1
prepositions
2
165
-1
51
@check-property
@check-chparent
@egrep
regular-expressions
@show
@grep
prog-index
help
prepositions
;
utilities
truth
tasks
statements
programming
precedence
language
functions
expressions
eval
errors
@verb
@setenv
@rmverb
@rmproperty
@prospectus
@property
@program
@list
@kill
@kids
@forked
@edit
@display
@dbsize
@copy
@chparent
@chmod
@args
.program
@clearproperty
@disown
@disinherit
@displayoptions
@display-options
@add-feature
@remove-feature
features
examine
mail
#
56
4
2
2
*forward*
2
@check-chparent
2
5
4
10
2
Syntax:  @check-property <object>.<propname>
2
         @check-chparent <object> to <newparent>
2
         
2
You cannot add a new property to an object if an ancestor or a descendant already defines a property with the same name.  @check-property will give you the list of all descendants of <object> that that define .<propname>.  
2

2
Likewise you cannot chparent an object to a new parent if the new parent has a property that is also defined on the object or some descendant.  Use @check-chparent to find out all instances of conflicting properties that would interfere with @chparent in this manner.
2

2
Note that @check-property requires either that you own the object or that it be writeable, the same conditions that need to hold if you are to create new properties on the object.  Similarly, @check-chparent requires that you own the object and that the new parent is either fertile or likewise owned by you.
2

2
For objects with large numbers of descendants, these commands can be time-consuming.
2
5
4
2
2
*forward*
2
@grep
2
5
4
162
2
Regular expression matching allows you to test whether a string fits into a specific syntactic shape.  You can also search a string for a substring that fits a pattern.  See also the built-in function match()/rmatch().
2

2
A regular expression describes a set of strings.  The simplest case is one that describes a particular string; for example, the string `foo' when regarded as a regular expression matches `foo' and nothing else.  Nontrivial regular expressions use certain special constructs so that they can match more than one string.  For example, the regular expression `foo%|bar' matches either the string `foo' or the string `bar'; the regular expression `c[ad]*r' matches any of the strings `cr', `car', `cdr', `caar', `cadddar' and all other such strings with any number of `a''s and `d''s.
2

2
Regular expressions have a syntax in which a few characters are special constructs and the rest are "ordinary".  An ordinary character is a simple regular expression that matches that character and nothing else.  The special characters are `$', `^', `.', `*', `+', `?', `[', `]' and `%'.  Any other character appearing in a regular expression is ordinary, unless a `%' precedes it.
2

2
For example, `f' is not a special character, so it is ordinary, and therefore `f' is a regular expression that matches the string `f' and no other string.  (It does *not*, for example, match the string `ff'.)  Likewise, `o' is a regular expression that matches only `o'.
2

2
Any two regular expressions A and B can be concatenated.  The result is a regular expression which matches a string if A matches some amount of the beginning of that string and B matches the rest of the string.
2

2
As a simple example, we can concatenate the regular expressions `f' and `o' to get the regular expression `fo', which matches only the string `fo'.  Still trivial.
2

2
The following are the characters and character sequences that have special meaning within regular expressions.  Any character not mentioned here is not special; it stands for exactly itself for the purposes of searching and matching.
2

2
`.'  is a special character that matches any single character.  Using
2
     concatenation, we can make regular expressions like `a.b', which matches
2
     any three-character string that begins with `a' and ends with `b'.
2

2
`*'  is not a construct by itself; it is a suffix that means that the preceding
2
     regular expression is to be repeated as many times as possible.  In `fo*',
2
     the `*' applies to the `o', so `fo*' matches `f' followed by any number of
2
     `o''s.
2

2
     The case of zero `o''s is allowed: `fo*' does match `f'.
2

2
     `*' always applies to the *smallest* possible preceding expression.  Thus,
2
     `fo*' has a repeating `o', not a repeating `fo'.
2

2
     The matcher processes a `*' construct by matching, immediately, as many
2
     repetitions as can be found.  Then it continues with the rest of the
2
     pattern.  If that fails, it backtracks, discarding some of the matches of
2
     the `*''d construct in case that makes it possible to match the rest of
2
     the pattern.  For example, matching `c[ad]*ar' against the string
2
     `caddaar', the `[ad]*' first matches `addaa', but this does not allow the
2
     next `a' in the pattern to match.  So the last of the matches of `[ad]' is
2
     undone and the following `a' is tried again.  Now it succeeds.
2

2
`+'  is like `*' except that at least one match for the preceding pattern is
2
     required for `+'.  Thus, `c[ad]+r' does not match `cr' but does match
2
     anything else that `c[ad]*r' would match.
2

2
`?'  is like `*' except that it allows either zero or one match for the
2
     preceding pattern.  Thus, `c[ad]?r' matches `cr' or `car' or `cdr', and
2
     nothing else.
2

2
`[ ... ]'
2
     `[' begins a "character set", which is terminated by a `]'.  In the
2
     simplest case, the characters between the two brackets form the set.
2
     Thus, `[ad]' matches either `a' or `d', and `[ad]*' matches any string of
2
     `a''s and `d''s (including the empty string), from which it follows that
2
     `c[ad]*r' matches `car', etc.
2

2
     Character ranges can also be included in a character set, by writing two
2
     characters with a `-' between them.  Thus, `[a-z]' matches any lower-case
2
     letter.  Ranges may be intermixed freely with individual characters, as in
2
     `[a-z$%.]', which matches any lower case letter or `$', `%' or period.
2

2
     Note that the usual special characters are not special any more inside a
2
     character set.  A completely different set of special characters exists
2
     inside character sets: `]', `-' and `^'.
2

2
     To include a `]' in a character set, you must make it the first character.
2
     For example, `[]a]' matches `]' or `a'.  To include a `-', you must use it
2
     in a context where it cannot possibly indicate a range: that is, as the
2
     first character, or immediately after a range.
2

2
`[^ ... ]'
2
     `[^' begins a "complement character set", which matches any character
2
     except the ones specified.  Thus, `[^a-z0-9A-Z]' matches all characters
2
     *except* letters and digits.
2

2
     `^' is not special in a character set unless it is the first character.
2
     The character following the `^' is treated as if it were first (it may be
2
     a `-' or a `]').
2

2
`^'  is a special character that matches the empty string -- but only if at the
2
     beginning of the string being matched.  Otherwise it fails to match
2
     anything.  Thus, `^foo' matches a `foo' which occurs at the beginning of
2
     the string.
2

2
`$'  is similar to `^' but matches only at the *end* of the string.  Thus,
2
     `xx*$' matches a string of one or more `x''s at the end of the string.
2

2
`%'  has two functions: it quotes the above special characters (including `%'),
2
     and it introduces additional special constructs.
2

2
     Because `%' quotes special characters, `%$' is a regular expression that
2
     matches only `$', and `%[' is a regular expression that matches only `[',
2
     and so on.
2

2
     For the most part, `%' followed by any character matches only that
2
     character.  However, there are several exceptions: characters that, when
2
     preceded by `%', are special constructs.  Such characters are always
2
     ordinary when encountered on their own.
2

2
     No new special characters will ever be defined.  All extensions to the
2
     regular expression syntax are made by defining new two-character
2
     constructs that begin with `%'.
2

2
`%|' specifies an alternative.  Two regular expressions A and B with `%|' in
2
     between form an expression that matches anything that either A or B will
2
     match.
2

2
     Thus, `foo%|bar' matches either `foo' or `bar' but no other string.
2

2
     `%|' applies to the largest possible surrounding expressions.  Only a
2
     surrounding `%( ... %)' grouping can limit the grouping power of `%|'.
2

2
     Full backtracking capability exists for when multiple `%|''s are used.
2

2
`%( ... %)'
2
     is a grouping construct that serves three purposes:
2

2
       1. To enclose a set of `%|' alternatives for other operations.  Thus,
2
          `%(foo%|bar%)x' matches either `foox' or `barx'.
2

2
       2. To enclose a complicated expression for a following `*', `+', or `?'
2
          to operate on.  Thus, `ba%(na%)*' matches `bananana', etc., with any
2
          number of `na''s, including none.
2

2
       3. To mark a matched substring for future reference.
2

2
     This last application is not a consequence of the idea of a parenthetical
2
     grouping; it is a separate feature that happens to be assigned as a second
2
     meaning to the same `%( ... %)' construct because there is no conflict in
2
     practice between the two meanings.  Here is an explanation of this
2
     feature:
2

2
`%DIGIT'
2
     After the end of a `%( ... %)' construct, the matcher remembers the
2
     beginning and end of the text matched by that construct.  Then, later on
2
     in the regular expression, you can use `%' followed by DIGIT to mean
2
     "match the same text matched by the DIGIT'th `%( ... %)' construct in the
2
     pattern."  The `%( ... %)' constructs are numbered in the order that their
2
     `%(''s appear in the pattern.
2

2
     The strings matching the first nine `%( ... %)' constructs appearing in a
2
     regular expression are assigned numbers 1 through 9 in order of their
2
     beginnings.  `%1' through `%9' may be used to refer to the text matched by
2
     the corresponding `%( ... %)' construct.
2

2
     For example, `%(.*%)%1' matches any string that is composed of two
2
     identical halves.  The `%(.*%)' matches the first half, which may be
2
     anything, but the `%1' that follows must match the same exact text.
2

2
`%b' matches the empty string, but only if it is at the beginning or end of a
2
     word.  Thus, `%bfoo%b' matches any occurrence of `foo' as a separate word.
2
     `%bball%(s%|%)%b' matches `ball' or `balls' as a separate word.
2

2
     For the purposes of this construct and the five that follow, a word is
2
     defined to be a sequence of letters and/or digits.
2

2
`%B' matches the empty string, provided it is *not* at the beginning or end of
2
     a word.
2

2
`%<' matches the empty string, but only if it is at the beginning of a word.
2

2
`%>' matches the empty string, but only if it is at the end of a word.
2

2
`%w' matches any word-constituent character (i.e., any letter or digit).
2

2
`%W' matches any character that is not a word constituent.
2
5
4
7
2
Syntax:  @show <object>
2
         @show <object>.<prop-name>
2
         @show <object>:<verb-name>
2

2
Displays quite detailed information about an object, property or verb, including its name, owner, permission bits, etc.  The information displayed for an object can be quite long.
2

2
See also @display, which displays different information and is controlled differently.
2
5
4
9
2
Syntax:  @grep <string> in <object>
2
         @grep <string> in {<objectlist>}
2

2
         @egrep <regexp> in <object>
2
         @egrep <regexp> in {<objectlist>}
2

2
These are named for the corresponding unix utilities.
2
@grep searches the given object(s) for verbs whose verbcode contains the given string as a substring of one of its lines.  
2
@egrep searches the given object(s) for verbs whose verbcode contains a substring matching the given regular expression (see `help regular-expressions').
2
5
4
2
2
*index*
2
Programmer Help Topics
2
5
4
15
2
*pass*
2
help
2

2
For programmers, the help system provides the following additional forms:
2

2
  help object:verbname   -- prints any documentation strings that are present
2
                            at the beginning of the program for that verb.
2
  help $<whatever>_utils -- prints general information about one of the 
2
                            $..._utils objects (e.g., $string_utils, 
2
                            $list_utils, etc...), which are all libraries 
2
                            of generally used verbs.
2
  help builtin()         -- prints documentation from the programmers manual
2
                            about the named primitive, for example length()
2

2
For information about how the help system itself works and about how to associate local help databases with specific rooms or player classes, see `help $help'.
2
5
4
3
2
*prepositions*
2
The complete list of prepositions recognized by the command-line parser:
2

2
5
4
2
2
*forward*
2
eval
38
1
4
17
2
The core database has a number of objects serving as libraries of useful verbs.
2
More detailed information can be obtained for (some of) these, via `help $whatever_utils'
2

2
$building_utils -- 
2
$code_utils     -- parsing and manipulating verb code
2
$command_utils  -- reporting matching errors to the player
2
$gender_utils   -- managing gendered objects
2
$list_utils     -- list manipulation
2
$set_utils      -- set manipulation
2
$lock_utils     -- key expression manipulation
2
$match_utils    -- 
2
$object_utils   -- object information 
2
                  (inheritance/location hierarchy, verb/property lists)
2
$perm_utils     -- permissions
2
$string_utils   -- string manipulation
2
$time_utils     -- time (numeric and verbal) manipulation
2
$trig_utils     -- trigonometric and other numerical utilities
2
5
4
5
2
Several kinds of statements, expressions, and functions in the MOO programming language use a notion that some MOO values are 'true' and others 'false'.
2

2
The only values that are considered true are non-zero numbers, non-empty strings, and non-empty lists.
2

2
All other values (i.e., 0, "", {}, objects, and errors) are considered false.
38
1
4
17
2
A task is an execution of a MOO program.  There are five ways for tasks to be created in LambdaMOO:
2
   + Every time a player types a command, a task is created to execute that command; we call these 'command tasks'.
2
   + Whenever a player connects or disconnects from the MOO, the server starts a task to do whatever processing is necessary, such as printing out 'Munchkin has connected' to all of the players in the same room; these are called 'server tasks'.
2
   + The FORK statement in the programming language creates a task whose execution is delayed for at least some given number of seconds; these are 'forked tasks'.
2
   + The suspend() function suspends the execution of the current task.  A snapshot is taken of whole state of the execution, and the execution will be resumed later.  These are called `suspended tasks'.
2
   + The read() function also suspends the execution of the current task, in this case waiting for the player to type a line of input.  When the line is received, the task resumes with the read() function returning the input line as result.  These are called `reading tasks'.
2

2
The last three kinds of tasks above are collectively known as `queued tasks' or `waiting tasks', since they may not run immediately.
2

2
To prevent a maliciously- or incorrectly-written MOO program from running forever and monopolizing the server, limits are placed on the running time of every task.  One limit is that no task is allowed to run longer than 15 seconds; this limit is, in practice, never reached.  The reason is that there is a second limit on the number of operations a task may execute.
2

2
The server counts down 'ticks' as any task executes.  Roughly speaking, it counts one tick for every expression evaluation (other than variables and literals), one for every `if', `fork' or `return' statement, and one for every iteration of a loop.  If the count gets all the way down to zero, the task is immediately and unceremoniously aborted.  All tasks begin or resume with an store of 30,000 ticks; this is enough for almost all normal uses.
2

2
Because queued tasks may exist for long periods of time before they begin execution, there are commands to list the ones that you own and to kill them before they execute.  These commands are covered in the following help topics:
2

2
@forked -- listing the forked tasks that you own
2
@kill -- killing a particular forked task
38
1
4
36
2
The following kinds of statements exist in the MOO programming language:
2

2
        ;
2
The null statement does nothing.
2

2
        expression ;
2
The expression statement evaluates the expression and then discards the value.
2

2
        IF ( expression ) statements ENDIF
2
        IF ( expression ) statements ELSE statements ENDIF
2
        IF ( expression )
2
          statements
2
        ELSEIF ( expression )
2
          statements
2
        ...
2
        ELSE
2
          statements
2
        ENDIF
2
The conditional statement evaluates each expression in turn and executes the statements associated with the first one to return a true value; the ELSE statements are executed if none of the expressions returns a true value.  There can be any number of ELSEIF clauses and the ELSE part is optional.  See 'help truth' for the definition of 'true value'.
2

2
        FOR name IN ( expression ) statements ENDFOR
2
The list iteration statement first evaluates the expression, which must return a list.  It then executes the statements once for each element of that list, each time with the named variable having the value of the corresponding list element.
2

2
        FOR name IN [ expression .. expression ] statements ENDFOR
2
The numeric iteration statement first evaluates the two expressions, both of which must return numbers; call those numbers N1 and N2, respectively.  The statements are then executed once for each integer I such that N1 <= I <= N2, in increasing order; each time, the named variable has the corresponding value of I.
2

2
        WHILE ( expression ) statements ENDWHILE
2
The indefinite iteration statement repeatedly evaluates the expression and, each time it returns a true value, executes the statements.  The loop stops the first time that the expression returns a false value.  The definitions of 'true' and 'false' values is in 'help truth'.
2

2
        RETURN ;
2
        RETURN expression ;
2
The return statement evalautes the expression, if any, and returns the resulting value (or 0 if there is no expression) to the verb that called the current one.  Execution of the current verb is immediately terminated.
2

2
        FORK ( expression ) statements ENDFORK
2
        FORK name ( expression ) statements ENDFORK
2
The fork statement first executes the expression, which must return a number; call that number N.  It then creates a new MOO task that will, after at least N seconds, execute the statements.  When the new task begins, all variables will have the values they had at the time the FORK statement was executed.  The task executing the FORK statement immediately continues execution.  If a variable name is given after the FORK keyword, then it is assigned the 'queue ID' of the newly-created task.  The value of this variable is visible both to the task executing the fork statement and to the statements in the newly-created task.  See 'help tasks' for more information about forked tasks.
38
1
4
26
2
MOO contains a rich programming language for the creation of interesting rooms, exits, and other objects.  Help is available on the following topics concerning programming in MOO:
2

2
language -- a brief reference for the syntax and semantics of the MOO language
2
tasks -- a brief description of MOO tasks and their resource limits
2

2
@property -- adding a property to an object
2
@rmproperty -- removing a property from an object
2

2
@verb   -- adding a verb to an object
2
@rmverb -- removing a verb from an object
2
@args   -- changing the syntax of a verb
2
@copy   -- copying a verb from one object to another
2

2
.program/@program -- entering the program for a verb
2
@list -- printing a listing of the program for a verb
2
@edit -- editing verb code
2

2
@show     -- looking at all the details of an object, a property, or a verb
2
@parents  -- listing the ancestors of an object
2
@kids     -- listing the children of an object
2
@contents -- listing the contents of an object
2
@chmod    -- changing the permissions on an object, a property, or a verb
2
@chparent -- changing the parent of an object
2
@rename   -- changing the name of a verb or object
2

2
eval -- executing MOO statements and expressions without writing a verb
38
1
4
17
2
The table below gives the relative precedence of all of the MOO operators; operators on higher lines in the table have higher precedence and those on the same line have identical precedence:
2

2
        !       - (without a left operand)
2
        *       /       %
2
        +-
2
        ==      !=      <       <=      >       >=      in
2
        &&      ||
2
        ... ? ... | ... (the conditional expression)
2
        =
2

2
Thus, the horrendous expression
2

2
        x = a < b && c > d + e * f ? w in y | - q - r
2

2
would be grouped as follows:
2

2
        x = (((a < b) && (c > (d + (e * f)))) ? (w in y) | ((- q) - r))
38
1
4
5
2
The MOO programming language is described in excruciating detail in the LambdaMOO Programmer's Manual, available for FTP from parcftp.xerox.com in the file pub/MOO/ProgrammersManual.txt.  The online help consists of a few quick reference guides here in the help system under the following topics:
2

2
statements -- the syntax and semantics of the various kinds of MOO statements
2
expressions -- the same for the various kinds of MOO expressions
2
functions -- a list of the primitive functions available to MOO programs
38
1
4
93
2
There are many, many built-in functions available to MOO programmers.  The following list gives a brief summary of the arguments and purpose of each function; for more information, see the LambdaMOO Programmer's Manual.  
2

2
pass(arg, ...)            -- calling a verb defined on this object's parent
2
eval(string)              -- parsing and executing strings as MOO code
2
notify(player, string)    -- sending text to a player's terminal
2
read()                    -- reading a line of input from the player (*)
2
output_delimiters(player) -- return {prefix,suffix} set by PREFIX/SUFFIX cmds
2

2
typeof(value)      -- determining the data type of a value
2
 tostr(value, ...) -- converting any set of values into a string
2
 tonum(value)      -- converting any non-list value into a number
2
 toobj(value)      -- converting any non-list value into an object
2
length(value)      -- returns the length of a string or list
2

2
listappend(list, value [, index]) -- adding an element at the end of a list
2
listinsert(list, value [, index]) -- adding an element at the head of a list
2
   listset(list, value, index)    -- updating a list at some index
2
listdelete(list, index)           -- removing an element from a list
2
    setadd(list, element) -- adding an element to a set represented as a list
2
 setremove(list, element) -- removing an element from such a set
2

2
min(n1, n2, ...) -- minimum of n1,n2,...
2
max(n1, n2, ...) -- maximum of n1,n2,...
2
abs(n)           -- absolute value of n
2
sqrt(n)          -- square root of n, rounded down
2
random(n)        -- random integer between 1 and n inclusive
2
 time()          -- current time in seconds since midnight GMT, 1 Jan 70
2
ctime([time])    -- time (or current time) converted to a human-readable string
2
 index(str1, str2 [, case-matters]) -- index of first str2 in str1
2
rindex(str1, str2 [, case-matters]) -- index of last  str2 in str1
2
strcmp(str1, str2) -- case-sensitive string comparison
2
strsub(subject, what, with [, case-matters]) -- substitution in a string
2
crypt(string [, salt]) -- one-way string encryption
2
 match(str1, str2 [, case-matters]) -- match first regular expr str2 in str1
2
rmatch(str1, str2 [, case-matters]) -- match last regular expr str2 in str1
2
substitute(template, subs) -- perform substitutions on template
2

2
   valid(object)             -- testing whether an object exists
2
  create(parent [, owner(*)])-- creating a new MOO object
2
 recycle(object)             -- destroying a MOO object
2
    move(object, where)      -- altering the object-containment hierarchy
2
chparent(object, new-parent) -- altering the object-inheritance hierarchy
2
  parent(object)             -- object's parent   in the inheritance hierarchy
2
children(object)             -- object's children in the inheritance hierarchy
2
max_object()       -- the highest-numbered object in the MOO
2
renumber(obj)      -- changes an object's number to lowest available one (*)
2
reset_max_object() -- resets max_object() to the largest valid object (*)
2

2
     properties(object) -- a list of the properties defined on an object
2
   add_property(object, prop-name, value, info) -- add a new property
2
delete_property(object, prop-name)              -- remove a property
2
    property_info(object, prop-name)       -- {owner, perms} info on a property
2
set_property_info(object, prop-name, info) -- setting same
2
is_clear_property(object, prop-name) -- find out if a property is "clear"
2
   clear_property(object, prop-name) -- make a property "clear"
2

2
      verbs(object) -- a list of the verbs defined on an object
2
   add_verb(object, info, args)  -- add a verb to an object
2
delete_verb(object, verb-name)   -- remove a verb from an object
2
    verb_info(object, verb-name) -- {owner, perms, names} info for a verb defn.
2
    verb_args(object, verb-name) -- {dobj, prep, iobj} argument info for a verb
2
    verb_code(object, verb-name [, fully-paren [, indent]]) -- program listing
2
set_verb_info(object, verb-name, {owner, perms, names})
2
set_verb_args(object, verb-name, {dobj, prep, iobj})   
2
set_verb_code(object, verb-name, {line, line, ...})
2

2
        is_player(object) -- testing whether or not object is a player
2
          players()       -- a list of all players, active or not
2
connected_players()       -- a list of all currently-connected players
2
     idle_seconds(player) -- seconds since given player typed anything
2
connected_seconds(player) -- seconds given player has been logged in
2
    boot_player(player)        -- disconnect player from the MOO immediately(*)
2
set_player_flag(player, value) -- set/clear player bit; boot player if clear(*)
2
connection_name(player)   -- a server-assigned name for player's connection
2
open_network_connection(@args) -- open a connection to another network site
2

2
caller_perms()         -- the player whose permissions your caller was using
2
set_task_perms(player) -- changing permissions of the running task (*)
2
callers()      -- list of {obj, verb, owner, vloc, player}: this task's stack
2
suspend(secs)  -- suspending the current task for a number of seconds
2
seconds_left() -- number of seconds left in the current task
2
ticks_left()   -- number of ticks   left in the current task
2
task_id()      -- a random number representing the currently-running task
2
queued_tasks() -- list of {id,start,0,20000,owner,obj,verb,line,this}
2
kill_task(id)  -- delete one of your tasks from the queue
2

2
server_log(string) -- add a comment to the server log file
2
server_version() -- a string of three numbers "major.minor.release"
2
memory_usage()   -- {{blocksize, nused, nfree}, ...}, the server's memory stats
2
shutdown(msg)    -- print msg and kill the server (*)
2
dump_database()  -- what it says (*)
2

2
(*) => as you might have expected, these usually require wizard permissions.
38
1
4
69
2
The following kinds of expressions exist in the MOO programming language:
2

2
        number
2
        # number
2
        # - number
2
        "character string"
2
        error-name
2
Literal expressions return the obvious values: numbers, object numbers, strings, and errors.
2

2
        { expression , expression , ... , expression }
2
The list-construction expression evaluates the each of the expressions in turn and returns a list whose elements are the results of those expressions.  Any of the expressions may be prefixed with an at-sign ('@'); in this case, that expression must return a list and, rather than that list becoming an element of the final list, its elements are spliced into the final list.
2

2
        name
2
Variable expressions return the current value of the named variable.  Variable names must start with a letter or underscore ('_') and contain only letters, digits, and underscores.  The following variables are predefined:
2
            OBJ, STR, LIST, ERR, NUM
2
            player, caller, this, verb, args
2
            argstr, dobj, dobjstr, prepstr, iobj, iobjstr
2
Their initial values are described in detail in the LambdaMOO Programmer's Manual.
2

2
        expression . name
2
        expression . ( expression )
2
        $ name
2
Property-reading expressions return the current value of a named property on the object that is the value of the first subexpression.  In the second form, the second subexpression must return a string, the name of the property to be read.  The third form is an abbreviation for '#0.name'.
2

2
        expression : name ( arguments )
2
        expression : ( expression ) ( arguments )
2
Verb-call expressions invoke a named verb on the object that is the value of the first subexpression, passing the given arguments.  In the second form, the second subexpression must return a string, the name of the verb to invoke.  The syntax and semantics of arguments is exactly as in the list-construction expression but no initial or final curly-braces ('{' or '}') are used.
2

2
        function ( arguments )
2
The function-call expression invokes one of the MOO primitive functions, as listed in 'help functions', passing the given arguments.
2

2
        expression [ expression ]
2
The indexing expression first evaluates the two subexpressions; call their values S and N, respectively.  S must be a string or a list and N must be a number between 1 and the length of S, inclusive.  The Nth element of S is returned.  The elements of a string are themselves one-character strings.
2

2
        expression [ expression .. expression ]
2
The subsequence expression first evaluates the three subexpressions; call their values S, N1, and N2, respecitively.  S must be a string or a list and N1 and N2 must be numbers.  If N1 <= N2, then both must be between 1 and the length of S, inclusive; the subsequence of S beginning at index N1 and continuing through index N2 is returned.  If N1 > N2, the empty sequence of the same type as S is returned, either "" or {}.
2

2
        name = expression
2
        expression . name = expression
2
        expression . ( expression ) = expression
2
        $ name = expression
2
Assignment expressions give new values to variables and object properties.  For the second and third forms, the expressions on the left-hand side of the '=' are evaluated first.  Then the right-hand side expression is evaluated and result is stored in the indicated variable or object property.
2

2
        expression + expression
2
        expression - expression
2
        expression * expression
2
        expression / expression
2
        expression % expression
2
        - expression
2
The arithmetic expressions evaluate the subexpressions, all of which must return numbers, and then perform addition, subtraction, multiplication, division, remaindering, or negation, respectively.  For addition, the subexpressions may both return strings as well; in this case, the result is the concatenation of the two strings.
2

2
        expression == expression
2
        expression != expression
2
        expression < expression
2
        expression <= expression
2
        expression > expression
2
        expression >= expression
2
The comparison expressions evaluate the subexpressions and then test whether or not the first result is equal to, unequal to, less than, less than or equal to, greater than, or greater than or equal to the second result, respectively.  If the indicated relation holds then they return 1 and otherwise they return 0.  Comparisons of strings are performed case-insensitively, those of lists are performed on an element-by-element basis, objects are compared by their object numbers, and errors by an ordering given in the LambdaMOO Programmer's Manual.
2

2
        expression ? expression | expression
2
        expression && expression
2
        expression || expression
2
        ! expression
2
The logical expressions each return results based upon the truth value of their first subexpression; call the value of this expression X.  The first of these returns the value of the second subexpression if X is a true value and that of the third expression if X is a false value; the unused subexpression is not evaluated.  The definitions of 'true value' and 'false value' are given in 'help truth'.  The expression 'E1 && E2' is an abbreviation for 'E1 ? E2 | E1' except that E1 is only evaluated once.  The expression 'E1 || E2' is an abbreviation for 'E1 ? E1 | E2' except that E1 is only evaluated once.  The expression '! E' is an abbreviation for 'E ? 0 | 1'.
2

2
        expression IN expression
2
The list-membership expression first evaluates both subexpressions; call their values E and L, respectively.  L must be a list.  If E is an element of L, then the index of the first occurence of E in L is returned.  If E is not an element of L, then 0 is returned.
2

2
The method for disambiguating the meaning of a complex MOO expression in the absence of sufficient parentheses is described in 'help precedence'.
38
1
4
37
2
Syntax:  eval <MOO-code>
2
         ; <MOO-code>
2
         eval-d <MOO-code>
2

2
Evaluates the given piece of MOO code and prints the resulting value.  If the MOO code begins with one of the MOO language keywords ('if', 'for', 'while', 'fork', or 'return') or with the character ';', then the entire piece of code is treated as the program for a verb, with ';' appended to the end.  Otherwise, 'return' is appended to the front and ';' is appended to the end and that string is treated as the code for a verb.  In either case, the resulting verb is invoked and whatever value it returns is printed.
2

2
For programmers, this is such a mind-bogglingly useful thing to do that there is a simple abbreviation for this command; any command beginning with a semicolon (';') is treated as a use of 'eval'.
2

2
Eval treats specially a duplicated semicolon at the beginning.  It enables you to make multi-statement programs within eval (but does not by default print the return value).
2

2
Eval-d (no ";" abbreviation for this) evaluates the following text exactly as eval, except that the "d" debug flag (see programmer's manual for explanation) is turned off.  Thus errors will cause an error return value rather than a traceback.
2

2
If you set the player property .eval_time to 1, then eval will print out how many ticks and seconds the program required.
2

2
Examples:
2
   eval 3 + 4
2
   =>  7
2
   ;3+4
2
   =>  7
2
   ;for x in (player.aliases) player:tell(x); endfor
2
   Haakon
2
   Wizard
2
   ArchWizard
2
   =>  0
2
   ;;l = {}; for i in [1..10] l = {@l, i}; endfor return l
2
   =>  {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
2
   eval-d 8 + "foo"
2
   => E_TYPE  (Type mismatch)
2

2
You may customize your evaluation environment.  The player property .eval_env may contain statements to be executed prior to any evaluated program.  Two caveats:  This will throw off the tick count.  You can account for additional ticks inserted by your environment with the .eval_ticks property; just set it to the number of ticks you'd like subtracted from the total.  Additionally, if you make a syntax error in your program, the line reported will be wrong (it will count those initial statements), and if you make an error in the eval_env itself, you can be in deep trouble.  Despite these drawbacks, the eval_env property can be quite useful.  The following is a sample:
2

2
Eval_env:    "me=player;here=player.location;"
2
eval_ticks:  3
2

2
See also @setenv.
2

2
You can also define textual substitutions in a separate property, called eval_subs.  These are discouraged, however, for anything that can be done with variable assignments, because the overhead of replacing the strings in the evaluated program is significant.  However, some things, such as substituting characters which can't be typed easily on one keyboard (e.g. "[]" is difficult to type on some IBM keyboards), can only be done by textual substitutions.  Note that the eval substitutions are also interpreted by the verb editor when "eval_subs" is selected in your .edit_options property (see `help editors').  This adds to their overhead, but again, makes it possible for people to program who otherwise can't type the full character set.  Remember:  Don't use eval_subs unless you really have to!
38
1
4
3
2
*errors*
2
The complete list of error codes:
2

2
5
4
17
2
Syntax:  @verb <object>:<verb-name(s)>
2
         @verb <object>:<verb-name(s)> <dobj> [<prep> [<iobj>]]
2

2
Adds a new verb with the given name(s) to the named object.  If there are multiple names, they should be separated by spaces and all enclosed in quotes:
2

2
        @verb foo:"bar baz mum*ble"
2

2
The direct and indirect object specifiers (<dobj> and <iobj>) must be either 'none', 'this', or 'any'; their meaning is discussed in the LambdaMOO Programmer's Manual.  The preposition specifier (<prep>) must be either 'none', 'any', or one of the prepositional phrases listed in `help prepositions' (a prepositional phrase with more than one word must be enclosed in quotes ("")).  All three specifiers default to 'none'.
2

2
It is also possible to specify the new verb's permissions and owner as part of the same command (rather than having to issue separate @chmod/@chown commands)
2

2
     @verb <object>:<verb-name(s)> <dobj> <prep> <iobj> <permissions>
2
     @verb <object>:<verb-name(s)> <dobj> <prep> <iobj> <permissions> <owner>
2

2
<permissions> are as with @chmod, i.e., must be some subset of "rwxd".  They default to "rd" (specifying "w" for a verb is highly inadvisable).  The owner defaults to the player typing the command; only wizards can create verbs with owners other than themselves.
2

2
You may also use "tnt" in place of "this none this" for the dobj prep iobj arguments.  "this none this" is used to indicate non-command verbs, since the parser can't possibly interpret a command as "this none this".  For these verbs, the permissions default to "rxd"; the "x" bit is set so that they can be called from other programs.  (If they couldn't be used as commands, and they couldn't be called from programs, they wouldn't be good for anything!)
38
1
4
5
2
Syntax:  @setenv <environment string>
2

2
Defines the environment for eval (property player.eval_env).  See "help eval"
2
for more information.  This is mostly useful when one's .eval_env is broken
2
and prevents one from using eval to reset it.
38
1
4
7
2
Syntax:  @rmverb <object>:<verb-name>
2
         @rmverb <object>:<verb-name>  <dobj> <prep> <iobj>
2

2
Removes the named verb from the named object.
2
If there is more than one verb matching the given verb-name, this removes the most recently defined one.
2

2
With the 2nd form of the command the verb removed is the most recent one matching both the given verb-name *and* the given dobj/prep/iobj specifiers.
2
5
4
3
2
Syntax:  @rmproperty <object>.<prop-name>
2

2
Removes the named property from the named object.  '@rmproperty' may be abbreviated as '@rmprop'.
2
5
4
29
2
Usage:  @prospectus player [from number] [to number]
2

2
Like @audit, but displays more information.  The optional from and to arguments are for restricting the display to specific object numbers, if you happen to know the player only owns objects in the included range.
2

2
Example:
2
   Objects owned by Frand (from #0 to #54949):
2
     P[ 23]    #47 Frand                          [Hyperspace Hovel]
2
     T        #152 Frand's trio of shoes          [Frand]
2
   KfT[ 10]   #391 Frand's notifier class         [Nowhere]
2
     T[  8]   #393 Frand's chessboard             [The Dining Room]
2
   KfT[ 11]   #775 Frand's generic game board     [Nowhere]
2
     T[  6]   #893 Ghost game                     [The Dining Room]
2
     T[ 16]   #894 Frand's mind bender            [The Dining Room]
2
     C        #997 polka-dot hole                 [Hyperspace Hovel]
2
     R[  1]  #1002 Hyperspace Hovel              
2
     E      #11958 out                            Monster Cage->*Dr. Empirico's Lab
2
      ...
2

2
The K in the first column indicates that the object has children owned by other players.  A lowercase k indicates the object has children but owned only by the player.  The second column indicates whether the object is publicly readable or publicly parentable.  An r indicates readability.  A lowercase f indicates the object is both readable and allows children (is fertile).  An uppercase F indicates the object is not readable, yet allows children to be created.  (This is usually an error.)  If the object is readable by the issuer of the @prospectus command (that is, publicly readable or owned by the issuer), then the number in brackets indicates the number of verbs which have been defined on this object (not including any verbs from any parents).
2

2
The third column indicates what type of object this is.
2
        T       Thing
2
        E       Exit
2
        R       Room
2
        C       Container
2
        N       Note
2
        P       Player
2
        p       Parent object appropriate for players ("Player class")
2
        blank   Other
2
5
4
13
2
Syntax:  @property <object>.<prop-name>
2
         @property <object>.<prop-name> <initial-value>
2

2
Adds a new property named <prop-name> to the named object.  The initial value is given by the second argument, if present; it defaults to 0.  
2

2
Normally, a property is created with permissions 'rc' and owned by whoever types the command.  However, you may also specify these explicitly
2

2
         @property <object>.<prop-name> <initial-value> <permissions>
2
         @property <object>.<prop-name> <initial-value> <permissions> <owner>
2

2
Only wizards can create properties with owners other than themselves.
2

2
'@property' can be abbreviated as '@prop'.
38
1
4
17
2
Syntax:  @program <object>:<verb-name>
2
         @program <object>:<verb-name> <dobj> <preposition> <iobj>
2

2
Changes the MOO program associated with the named verb on the named object.
2
If you provide <dobj> <preposition> and <iobj> as in the second form of this command, then it is the first verb with matching direct object, preposition and indirect object specifiers that is the one getting the new program.  This is useful if you have several verbs matching the same name.
2

2
Typing the @program command always puts the server into a line-reading mode, in which each line you type is saved away without any action unless said line is one of the following:
2

2
  .
2
  @abort
2
  .<text>
2

2
A period on a line by itself ends the line-reading mode and continues with the command, in this case, the saved lines are considered as a program, checked for syntax errors and, if no errors are found, installed as the new program for the specified verb.  
2

2
@abort causes the command to terminate immediately with no change to any verb's program.  .<text> enters <text> literally as one of the lines to be saved, which is used for when, e.g., you want to enter the line `.' or the line `@abort'.
2

2
Note that this command *always* enters the line-reading mode, even if the indicated verb is not found.  In this case, lines of text are still read but they are ignored.  After any @program command, you always need to type a period or `@abort' to get back into the normal command-reading mode.
2
5
4
20
2
Syntax:  @list <object>:<verb>
2
         @list <object>:<verb> [with|without parentheses|numbers]
2
         @list <object>:<verb> <dobj> <prep> <iobj>
2
         @list <object>:<verb> <start>..<end>
2

2
Prints out the code for the MOO program associated with the named verb on the named object.  
2

2
Normally, the code is shown with each line numbered and with only those parentheses that are necessary to show the meaning of the program.  You can e.g., specify `without numbers' to have the numbers omitted or `with parentheses' to include all parentheses or even `with parentheses without numbers' to do both.
2

2
The 3rd form of the verb lists the verb matching the given dobj/prep/iobj specification if such exists.  
2
The 4th form prints only those lines in the specified range.
2

2
Example:
2
  Type `@list $room:@move' to see the code for the `@move' command, or even `@list $prog:@list' to see the code implementing @list itself...
2

2
The 2nd-4th forms may be combined, e.g.,
2

2
  @list frobule:burfle this in front of any without numbers 1..10
2

2
which would be useful if `frobule' had more than one `burfle' verb and we wanted to see the first 10 lines of the one having `this' `in front of' `any' as its respective dobj/prep/iobj specifiers.
38
1
4
24
2
Syntax:  @kill task_id
2
         @kill [object]:[verb]
2
         @kill soon [number-of-seconds]
2
         @kill all
2
         @kill %trailing_id
2

2

2
Immediately kills one or more forked tasks.  The '@forked' command is useful for finding out what tasks you have pending; see 'help @forked' for details.  Only the owner of a task may kill it.
2

2
@kill task_id kills only the task with that id.
2

2
@kill object:verb kills all tasks which were scheduled by the object running the verb named.  Both object and verb are optional:  @kill object: kills all tasks scheduled by that object, and @kill :verb kills all tasks which were scheduled by any object running that verb.  This can be useful if you have several similar objects which are running tasks from similarly named verbs.  (Perversely, @kill : kills all tasks...  Any object running any task.)
2

2
@kill soon kills all tasks scheduled within the next minute.  @kill soon number kills all tasks scheduled within that number of seconds, e.g. @kill soon 300 would kill all tasks scheduled within the next five minutes.  This can be useful if you have a runaway task you want to quickly remove, but don't want to kill you later tasks.
2

2
@kill all kills all tasks.  Like @kill soon, but more dramatic.
2

2
@kill %trailing_id expects you to specify the last few digits of a task id.  It then kills all tasks that end with those digits.
2

2
Example:
2
  @forked
2
  1359083655  Sep 16 21:45:00 1991  yduJ          #5803:heartbeat (10) [#68]
2
  @kill %655
2
  Killed:   task 1359083655, verb #5803:heartbeat, line 10, this==#68
38
1
4
8
2
Syntax:  @kids object
2

2
A quick way to find out the children of an object.  Prints out the names and object numbers of the found children.  Note: this is not a list of all descendents, just direct children.
2

2
Example:
2
  @kids #3107
2
  Generic Body of Chlorinated Water(#3107) has 3 kids.
2
  The Pool(#1428)   The Hot Tub(#388)   Deep Blue Underground Pool(#17340)
2
5
4
22
2
Syntax:  @forked
2

2
Gives a list of all of the forked tasks you own, along with detailed information about each one.  The information includes the following:
2

2
Queue ID:
2
   A numeric identifier for the task, for use in killing it (see 'help @kill').
2

2
Start Time:
2
   The time after which the task will begin execution.
2

2
Owner:
2
   The player whose permissions under which the task is running.
2
   Unless you are a wizard, @forked will show only your tasks.
2

2
Verb:
2
   The object and verb-name of the code that forked the task.
2

2
Line:
2
   The line number of the first statement that the task will execute when it starts.  Note that the code for the verb in question may have changed since the task was forked; the forked task will use the version that was being executed when it was forked.
2

2
This:
2
   The value of `this' for the forked task, in the case that it is different from (i.e., is a descendant of) the object on which the verb code lives.
38
1
4
3
2
Syntax:  @edit <object>:<verb-name> [<dobj> [<prep> [<iobj>]]]
2

2
Enters the MOO Verb Editor for the named verb on the named object.  See 'help editors' for more detail.
2
5
4
42
2
Syntax: @display <object>.[property]
2
                         ,[inherited_property]
2
                         :[verb]
2
                         ;[inherited_verb]
2

2
@display is a fancy version of @show.  As @show, it can select individual verbs or properties to display.  In addition, it can display all the verbs or properties defined on an object, or all the verbs or properties defined on any of the object's ancestors.  Don't specify a property or verbname after the punctuation mark to get the "all" feature.  Its display is more compact than that of @show (it uses a one-line format, and truncates values that don't fit in the value field).
2

2
You may mix properties and verbs on the command line, but the parser may become confused.  (E.g. @display object,: displays all properties including inherited ones plus all locally defined verbs on the object.)
2

2
Examples:
2
Individual property:
2
  @display poolsweep.count
2
  .count                   yduJ (#68)            r c    8
2

2
Individual verb:
2
  @display poolsweep:tell
2
  #3560:tell                     yduJ (#68)           rxd    this none this
2

2
All properties, including one truncated value:
2
  @display poolsweep.
2
  poolsweep (#3560) [ readable ]
2
    Owned by yduJ (#68).
2
    Child of generic thing (#5).
2
    Location The Pool (#1428).
2
  .gagged                  yduJ (#68)            r c    0
2
  .count                   yduJ (#68)            r c    8
2
  .messages                yduJ (#68)            r c    {"The poolsweep stir..
2
  .index                   yduJ (#68)            r c    2
2
  .quantum                 yduJ (#68)            r c    20
2

2
Inherited verbs, edited for brevity, showing verbs from various parents, with owners, permissions, and argument lists.
2
  @d poolsweep;
2
  poolsweep (#3560) [ readable ]
2
   #3560:tell                     yduJ (#68)           rxd    this none this
2
   #3560:description              yduJ (#68)           rxd    this none this
2
      #5:"g*et t*ake"             Haakon (#2)          rxd    this none none
2
      #5:"d*rop th*row"           Haakon (#2)          rxd    this none none
2
      #5:moveto                   Haakon (#2)          rxd    this none this
2
      #1:description              Haakon (#2)          rxd    this none this
2
      #1:look_self                Haakon (#2)          rxd    this none this
2

2
Some aspects of @display can be customized (see `help @display-options').
2
5
4
3
2
Syntax:  @dbsize
2

2
@dbsize goes through the entire database, counting the valid and invalid objects, giving a summary at the end.  This information can be useful, but because this command is cpu intensive, it should be used sparingly.
2
5
4
11
2
Syntax:  @copy <object>:<verb> to [<newobject>][:<newverb>]
2

2
Copies the code of the named verb to the new object and verbname.  Permissions, and arguments of the new verb are set to match those of the old verb in the event that the new verb does not already exist.  One of <newobject> or :<newverb> must be supplied.  If no new verbname is given, the old name is retained.  Likewise, <newobject> defaults to <object> if not given.
2

2
Examples:
2
  @copy me:verbname to myobject
2
  @copy me:test_verb to myobject:real_verb
2

2
In general, @copy'ing verbs is a bad idea.  In the vast majority of cases, the desired effect can be accomplished with parenting (i.e., having <object> be an ancestor of <newobject>), which has the advantage that if a verb is updated or fixed, this immediately becomes available to child objects that inherit this verb.  In such a case, copies that were made using @copy have to be tracked down and fixed by hand.
2

2
This facility is provided for those rare occasions where one has no choice but to actually copy the verb.
2
5
4
7
2
Syntax:  @chparent <object> to <new parent>
2

2
Changes the parent of the named object to be the named parent.  The object acquires all the verb and property definitions of its parent.  Newly acquired properties are initilialized with `clear' values so that they inherit whatever values are currently assigned to the parent's corresponding properties (see `help @clearproperty').
2

2
If the player does not own <new parent>, it must have been set `fertile'.  <object> must be owned by the player.  Neither <object> nor any descendant can define any property which already exist on <new parent>.  Use @check-chparent (see `help @check-chparent') to list such property conflicts.
2

2
It is also sometimes the case that you will own some object and want to @chparent some child of that object that you do not own.  Use @disinherit (see `help @disinherit') in such situations.
2
5
4
25
2
Syntax:  @chmod <object> <object-permissions>
2
         @chmod <object>.<prop-name> <property-permissions>
2
         @chmod <object>:<verb-name> <verb-permissions>
2

2
Changes the permissions of an object, property or verb, to those given.  The following table shows what permission bits are allowed for each form of the command:
2
        <object-permissions>        r, w, f
2
        <property-permissions>      r, w, c
2
        <verb-permissions>          r, w, x, d
2

2
See the LambdaMOO Programmer's Manual for their meanings.
2

2
To clear all of the permissions for an object, verb, or property, use "" as the second argument.
2

2
@chmod also accepts +, !, and - as modifiers for a single permission to add or subtract that permission from the current set.  (! and - are the same.)
2

2
Examples:
2

2
Set a verb to be Readable and Callable:
2
  @chmod chair:sit rx
2

2
Set a verb to be not Callable, without changing its other permissions:
2
  @chmod cookies:eat !x
2

2
Set an object to be Writeable in addition to any current bits:
2
  @chmod table +w
2
5
4
5
2
Syntax:  @args <object>:<verb-name> <dobj>
2
         @args <object>:<verb-name> <dobj> <prep>
2
         @args <object>:<verb-name> <dobj> <prep> <iobj>
2

2
Changes the direct object, preposition, and/or indirect object specifiers for the named verb on the named object.  Any specifiers not provided on the command line are not changed.  The direct and indirect object specifiers (<dobj> and <iobj>) must be either 'none', 'this', or 'any'.  The preposition specifier (<prep>) must be either 'none', 'any', or one of the prepositional phrases listed in `help prepositions'.
38
1
4
13
2
Syntax:  .program <object>:<verb-name>
2
              :
2
              :
2
              <lines of MOO code>
2
              :
2
              :
2
         .
2

2
Provides or changes the MOO program associated with the named verb on the named object.
2

2
This command is mostly obsolete.  Use @program instead.  The only reason this command still exists is that it is a server builtin command that will continue to work in the (unlikely) event that @program gets trashed ...
2

2
This command works differently from most other MOO commands, in that it actually changes how the server will interpret later lines that you type to it.  After typing the '.program' line, you are in 'programming mode'.  All lines that you type in this mode are simply saved away in the server until you type a line containing only a single period ('.').  At that point, those lines are interpreted as a MOO program and are checked for syntax errors.  If none are found, a message to that effect is printed and the code you typed is installed as the program for the verb in question.  In any case, after typing the '.' line, you are returned to the normal input-handling mode.
38
1
4
32
2
Syntax:   @clearproperty <object>.<prop-name>
2

2
This clears <object>'s <prop-name> property.  That is the property value becomes `clear' and all further references to this property will use the value of the same property on the parent object.  Note that you can only clear inherited properties.  Nor is this the same as removing a property; the property continues to exist.
2

2
`@clearproperty' can be abbreviated as `@clearp'.
2

2
Example:
2

2
  @create #1 named foo
2
  You now have foo with object number #42 and parent Root Class (#1).
2
    [foo, as a child of #1 has a .description property which starts out clear]
2
  ;#1.description
2
  => ""
2
  ;#1.description = "You see nothing special"
2
  => "You see nothing special"
2
  ;#42.description  
2
  => "You see nothing special"
2
  ;#42.description = "Something special"
2
  => "Something special"
2
   [foo.description is now no longer clear; it has a value of its own]
2
  ;#1.description = "Boring"
2
  => "Boring"
2
  ;#42.description  
2
  => "Something special"
2
   
2
  @clearp foo.description
2
  Property #42.description cleared; value is now "Boring".
2
   [foo.description is now clear again]
2
  ;#1.description = ""
2
  => ""
2
  ;#42.description
2
  => ""
2
5
4
2
2
*forward*
2
@disinherit
2
5
4
11
2
Syntax:   @disinherit <object> 
2
          @disinherit <object> [from <parent>]
2

2
Synonym:  @disown
2

2
This command is used to remove an unwanted child from an object you own.  If you owned said child, you could use @chparent; this command is to cover the other case, namely where you don't own the child.  
2

2
Both forms of this command chparent <object> to its grandparent, provided you own the parent.  The second form matches the string you supply for <object> against the list of children of the given <parent>.
2

2
Turning off the fertile bit (.f) for a particular object prevents others from creating children of it or chparenting to it (see `help @chmod').
2
Note also that, though the name might seem to indicate otherwise, this command does not change the ownership of any object.
2
5
4
2
2
*forward*
2
@display-options
2
5
4
24
2
Syntax:  @display-option
2
         @display-option <option>
2

2
Synonym:  @displayoption
2

2
The display options customize the behavior of the @display command to your particular taste.  The first form of this command displays all of your display options.  The second form displays just that one option, one of the flags listed below.
2

2
The remaining forms of this command are for setting your display options:
2

2
         @display-option +<flag>
2
         @display-option -<flag>
2
         @display-option !<flag>           (equivalent to -<flag>)
2

2
These respectively set and reset the specified flag
2

2
-blank_tnt     Show the verb args on all verbs.
2
+blank_tnt     Don't show the verb args on `this none this' verbs.
2
-shortprep     Use full prepositions  (e.g., "on top of/on/onto/upon")
2
+shortprep     Use short prepositions (e.g., "on")
2
-thisonly      Specifying . (:) to retrieve all properties (verbs) will go
2
               up the ancestor chain until it finds a readable object with
2
               properties (verbs) defined on it.
2
+thisonly      Specifying . (:) to retrieve all properties (verbs) will only
2
               display properties (verbs) defined on the object itself.
2
5
4
24
2
*pass*
2
@add-feature
2

2
Note to programmers: @add-feature and @remove-feature are front-ends for player:add_feature and :remove_feature.
2

2
:add_feature returns
2

2
 * E_PERM unless caller == this || $perm_utils:controls(caller_perms())
2

2
 * E_INVARG if feature is not an object or is invalid
2

2
 * E_PERM if the object is not feature_ok
2

2
 * a true value otherwise
2

2
and calls feature:feature_add, if the verb exists.
2

2
:remove_feature returns
2

2
 * E_PERM unless caller == this || $perm_utils:controls(caller_perms()) || caller_perms() == feature.owner
2

2
 * a true value otherwise
2

2
and calls feature:feature_remove, if the verb exists.
2
5
4
2
2
*forward*
2
@add-feature
2
5
4
6
2
*pass*
2
features
2

2
Note to programmers: In order to be available for general use as a feature, an object must have a verb or property named "feature_ok" which returns a true value.
2

2
When a feature is added to a player's features list, feature:feature_add is called, if it exists, with the player in question as its argument.  Likewise, when a feature is removed, feature:feature_remove is called.
2
5
4
4
2
*pass*
2
examine
2

2
[Note to programmers: the 'obvious' verbs are those that can be invoked as commands and are not specified by the :hidden_verbs verb.  The default definition of "hidden" is "not readable".  You can override this definition with a :hidden_verbs verb that gets the default list with pass(@args) and then alters that list.]
2
5
4
5
2
*pass*
2
mail
2
 - - - - -
2
See `help mail-system' for a description of the programming interface to the mail system.
2
In particular, see `help $mail_recipient' for information on creating new mail collections.
2
5
4
7
2
#<string>[.<property>|.parent] [exit|player|inventory] [for <code>] returns information about the object (we'll call it <thing>) named by string.  String is matched in the current room unless one of exit|player|inventory is given.
2
If neither .<property>|.parent nor <code> is specified, just return <thing>.
2
If .<property> is named, return <thing>.<property>.  .parent returns parent(<thing>).
2
If <code> is given, it is evaluated, with the value returned by the first part being substituted for %# in <code>.
2
For example, the command
2
  #JoeFeedback.parent player for tonum(%#)
2
will return 26026 (unless Joe has chparented since writing this).
2
5
5
2
5
5
2
4
4
1
2
Programmer Help
2
5
2
This provides help on the programmer commands available on $prog and related topics.
2
5
4
2
0
69643
0
750754798
2
1
#25
Wizard Help

16
38
-1
-1
-1
32
-1
24
0
35
@guests
@log
@egrep
@unnewt
@denewt
@newt
@grep
$site_db
graylist
blacklist
@recycle
wiz-index
@dump-database
@players
@net-who
@@who
make-core-database
@quota
@detoad
@untoad
@toad
@grepcore
@who-calls
@abort-shutdown
@shutdown
@programmer
@shout
@chown
redlist
@blacklist
@graylist
@redlist
@make-guest
@spooflist
spooflist
40
4
7
2
Syntax:  @guests [<n>]
2

2
Prints out the log of guest player connections, indicating connect/disconnect times and where they came from.  If a numeric argument n is given, then only the last n entries in the log are consulted (useful for when the full log is rather long) --- note that connections and disconnections are separate entries so the actual printed listing will be about half this length.
2

2
Alternate:  @guests now
2

2
Prints out in @who format all connected guests.  In place of the location field is the current connect site.
38
5
4
11
2
Syntax:  @log <message>
2
         @log
2

2
The first form enters <message> as a one-line comment in the server log.
2
The second form prompts for a sequence of lines to be collectively entered as an extended comment.  This uses $command_utils:read_lines so all of those conventions apply, i.e., a period on a line by itself ends the text, `@abort' aborts the command, etc...).  Example:  If Wizard (#2) types
2

2
    @log I did $dump_interval=3600
2

2
the following line appears in the server log
2

2
    Aug 19 22:36:52:  COMMENT:  from Wizard (#2):  I did $dump_interval=3600
38
5
4
2
2
*forward*
2
@grep
38
5
4
2
2
*forward*
2
@denewt
38
5
4
10
2
Syntax:    @denewt <player> [commentary]
2

2
Synonyms:  @unnewt
2
           @get-better
2

2
@denewt reverses the effects of @newt, moving a player's :denewt_confunc back to :confunc, but checking first that :confunc is the same as $wiz_utils:newt_confunc (if not, we save :confunc as :newt_confunc and complain).
2

2
Mail is sent to $newt_log including any commentary you provide.  E.g.,
2

2
  @denewt Twit  He promises not to do it again.
38
5
4
25
2
*subst*
2
Syntax:  @newt <player> [commentary]
2

2
The @newt command temporarily prevents logins on a given player.
2
It works by installing a confunc ($wiz_utils:newt_confunc) on player that does an immediate ;boot_player(), saving any existing :confunc the user may have as :denewt_confunc.  Use @denewt to reverse this.
2

2
You must give either the player's full name or its object number.
2
Also, this command does not let you @newt yourself.
2

2
Mail will be sent to $newt_log, listing the player's .all_connect_places and including any commentary you provide.  E.g.,
2

2
  @newt Twit  did real annoying things.
2

2
As with @toad and @programmer, there are messages that one may set
2

2
@newt  [%[$wiz.newt_msg]]
2
  Printed to everyone in the room in which the victim is being @newted.
2
  If you're worried about accidentally newting yourself in the process of
2
  setting this message, you can't (see above).
2

2
@newt_victim  [%[$wiz.newt_victim_msg]]
2
  Printed to the victim.  
2
  This is followed by $login:newt_registration_string().
2

2
See `help @toad' if you need something more drastic.
38
5
4
13
2
*pass*
2
@grep
2

2
For wizards, the following forms are also available for doing full-db searches
2

2
         @grep <pattern>
2
         @grep <pattern>
2
         @egrep <pattern> from [#]<n>
2
         @egrep <pattern> from [#]<n>
2

2
the first two search all objects in the database while the last two search the range [#<n>..max_object()]
2

2
See also:  @grepcore, @who-calls.
38
5
4
21
2
Database of places
2
------------------
2
i.e., places people have connected from.
2

2
  :add(sitename,player)
2
      records the fact that player connected from sitename.
2
  :load()
2
      clears the db and reloads all of the player connection info.
2

2
  .domain
2
      default domain for unqualified sitenames given to :add.
2
      
2
For each domain we keep a list of players and subdomains. 
2
For example, :add("doc.ic.ac.uk",#666) enters #666 on the lists for "doc.ic.ac.uk", and, if we have to create an entry for "doc.ic.ac.uk", we enter "doc" on the list for "ic.ac.uk", "ic" on the list for "ac.uk", etc....  In this case, :find("ic") will return the "ic.ac.uk" list if there is no other domain in $site_db starting with "ic".  Note that the "ic.ac.uk" list may contain both objects, i.e., namely players that have connected from the site "ic.ac.uk", and strings, i.e., subdomains of "ic.ac.uk" like "doc".
2

2
  :find_exact(string)    => player/subdomain list or $failed_match
2
  :find_all_keys(string) => list of all domains that begin with string
2
  :find_key     (string) => unique domain that begins with string, 
2
                            $ambiguous_match or $failed_match
2

2
The other $generic_db functions (:find, :find_all) are also available, though admittedly less useful.
38
5
4
2
2
*forward*
2
blacklist
38
5
4
28
2

2
The Site Blacklist
2
------------------
2
$login maintains three lists of hosts/domains to support player registration schemes and blocking of connections from highly untrusted hosts:
2

2
  .redlist   -- all connections from these sites are disabled 
2
  .blacklist -- player creation and guest logins are disabled
2
  .graylist  -- advisory list of potential trouble spots (putting a site on the
2
                .graylist merely annotates it in @net-who listings).
2
  .spooflist -- guests from these sites cannot use @request to request 
2
                a character
2

2
The lists are kept in a special format so it is highly recommended that you 
2
either use $wiz:@*list/@un*list or the following verbs to query/update the 
2
respective lists rather than bash them directly:
2

2
  $login:*listed     (host)              is host is on .*list?
2
  $login:*list_add   (domain or subnet)  add domain or subnet to .*list
2
  $login:*list_remove(domain or subnet)  remove domain or subnet from .*list
2

2
where `*' is one of `black', `red', `gray', or `spoof'.
2

2
One may either specify a domain name (e.g., "baz.edu") or a numeric IP address (e.g., "36.0.23.17").  Domain names match all hosts underneath that domain, so, e.g., puting "baz.edu" on a list effectively adds "x.bax.edu" for all x as well.  
2
Likewise, an incomplete numeric address, e.g., "128.42" will match that entire subnet, in this case all hosts whose IP numbers have the form "128.42.m.n" for arbitrary integers m and n.
2

2
One may also give a domain name containing a wildcard ("*"), e.g., "fritz*.baz.edu", in which case all hostnames matching in the sense of $string_utils:match_string() are considred to be on the list.  Wildcard matching should be avoided since it is more time-consuming.
2

2
It should be noted that, since there is no direct access to the domain name service from within the MOO, it is possible for a host to be blacklisted or redlisted via its domain name, and yet have someone be able to connect from that host (and, in the case of a blacklisted host, create a character) --- this can happen if the name service is down and connection_name() on that player thus has given the numeric IP address rather than the domain name.  Similarly, if you list a host by IP number alone, it will still be possible to get in via the site's domain name.  Thus to be completely assured of shutting out a site, you need to list it both by domain name and IP number.
38
5
4
6
2
*pass*
2
@recycle
2

2
Of course, wizards are allowed to @recycle anything at all.
2

2
There is, however, a block (in $player:recycle) against recycling actual players, i.e., descendants of $player that have the player flag set.  This is mainly to prevent stupid mistakes.  If, for some reason, you want to recycle a player, you need to @toad it first.
38
5
4
2
2
*index*
2
Wizard Help Topics
38
5
4
3
2
Syntax:  @dump-database
2

2
Invokes the builtin dump_database(), which requests that the server checkpoint the database at its next opportunity.  It is not normally necessary to call this function; the server automatically checkpoints the database at regular intervals; see the chapter on server assumptions about the database for details.
38
5
4
3
2
Syntax:  @players [with objects]
2

2
Hmmm... what *does* this do, anyway?
38
5
4
9
2
Syntax:  @net-who [<player>...]
2
         @net-who from [<domain>]
2

2
Synonym: @@who
2

2
@net-who without any arguments prints all connected users and hosts.  If one or more <player> arguments are given, the specified users are printed along with their current or most recent connected hosts.  If any of these hosts are mentioned on $login.blacklist or $login.graylist (see `help blacklist'), 
2
an annotation appears.
2

2
With a `from...' argument, this command consults $site_db and prints all players who have ever connected from the given domain.
38
5
4
2
2
*forward*
2
@net-who
38
5
4
3
2
Syntax:  make-core-database
2

2
...makes a core database (surprise).  Film at 11...
38
5
4
7
2
*pass*
2
@quota
2

2
 - - - - - - - - - - - - - - - - - - - - - - - - - -
2
Syntax:  @quota <player> is <number> [<reason>]
2

2
This second and more interesting form of the verb changes a player's quota to the given number.  Mail will be sent to $quota_log; the message will include the <reason> if such is given.
38
5
4
2
2
*forward*
2
@untoad
38
5
4
13
2
Syntax:  @untoad <object> [as <name>,<alias>,<alias>...]
2

2
Synonym: @detoad
2

2
Turns the object into a player.  
2
If the name/alias... specification is given, the object is also renamed.
2
In order for this to work, the object must be a nonplayer descendant of $player and the new object name (or the original name if none is given in the command line) must be available for use as a player name.  As with ordinary player @renaming, any aliases which are unavailable for use as player names are eliminated.
2

2
If the object is a descendant of $guest, then it becomes a new guest character.
2
Otherwise the object is chowned to itself.  In the latter case, it is advisable to check that the .password property has something nontrivial in it.
2

2
If the object is a descendant of $prog, then its .programmer flag is set.
2
Note that the .wizard flag is not set under any circumstances.
38
5
4
26
2
*subst*
2
Syntax:  @toad   <player>  [graylist|blacklist|redlist]
2
         @toad!  <player>
2
         @toad!! <player>
2

2
Resets the player flag of <player> (thus causing <player> to be booted), resets the .programmer and .wizard flags, chowns the player object to $hacker, and removes all of its names and aliases from $player_db.
2

2
You must give either the player's full name or its object number.
2
Also, this command does not let you @toad yourself.
2

2
In some cases you may wish to add the player's last connected site to the site graylist, blacklist or redlist --- see `help blacklist' --- in order to invoke various kinds of blocking on that site (e.g., if player creation is enabled, you may want to enter the player on the blacklist to keep him from immediately creating a new character).  Specifying one of the listnames `graylist', `blacklist' or `redlist' will do this.
2

2
@toad!  <player>  is synonymous with  @toad <player> blacklist
2
@toad!! <player>  is synonymous with  @toad <player> redlist
2

2
There are messages that one may set to customize toading.  After all, a toading is (supposed to be) a rare event and you will doubtless want to put on a good show.  Thus we have
2

2
@toad  [%[$wiz.toad_msg]]
2
  Printed to everyone in the room in which the victim is being @toaded.
2
  If you're worried about accidentally toading yourself in the process of
2
  setting this message, see above.
2

2
@toad_victim  [%[$wiz.toad_victim_msg]]
2
  Printed to the victim.
2

2
These are pronoun_subbed with victim == dobj.
38
5
4
6
2
Syntax:  @grepcore <pattern>
2
         @who-calls <verbname>
2

2
@grepcore pattern is @grep pattern in {all core objects}.  Core objects are computed for you by #0:core_objects().
2

2
@who-calls greps for the verbname + "(", hoping to catch it as a verb call.  Currently @who-calls does not allow you to restrict the search as @grep does.  (Volunteers?)
38
5
4
2
2
*forward*
2
@grepcore
38
5
4
3
2
Syntax:  @abort-sh*utdown [<text>]
2

2
This aborts any shutdown currently in progress (i.e., set in motion by @shutdown).  All players are notified that no shutdown will actually occur; <text>, if given will be included in this notification.
38
5
4
5
2
Syntax:  @shutdown [in <m>] [<text>]
2

2
This is the friendly way to do a server shutdown; it arranges for the actual shutdown to take place `m' minutes hence (default two).  Shutdown is preceded by a sequence of warnings to all connected players.  Warnings are likewise given to all players who connect during this time.  <text>, if given is included in these warning messages, perhaps as an explanation for why the server is being shut down.
2

2
Shutdown may be aborted at any time by using @abort-shutdown.
38
5
4
16
2
*subst*
2
Syntax:  @programmer <player>
2

2
Sets the programmer flag on the indicated player and sends mail to $new_prog_log.  
2

2
If the player is not already a descendant of $prog, we @chparent him/her to $prog.  In this case, if $prog has a larger .ownership_quota than its ancestors, then we raise the player's quota by the difference between $prog.ownership_quota and the .ownership_quota of the common ancestor of player and $prog, be this $player or some intermediate class.
2

2
There are messages that one may set to customize how the granting of a programmer bit looks to the victim and to any onlookers.  After all, this is a seminal event in a MOOer's life...  Thus we have
2

2
@programmer  [%[$wiz.programmer_msg]]
2
  Printed to everyone in the room with the victim being @programmer'ed.
2

2
@programmer_victim  [%[$wiz.programmer_victim_msg]]
2
  Printed to the victim.
2

2
These are pronoun subbed with victim == dobj.
38
5
4
3
2
Syntax:  @shout <text>
2

2
Broadcasts the given text to all connected players.
38
5
4
13
2
Syntax:  @chown <object>            [to] <owner>
2
         @chown <object>.<propname> [to] <owner>
2
         @chown <object>:<verbname> [to] <owner>
2

2
Changes the ownership of the indicated object, property or verb.
2

2
Verb ownership changes are fairly straightforward, being merely a matter of changing the verb_info() on a single verb.
2

2
Changing an object ownership includes changing the ownership on all +c properties on that object.  Note that @chown will not change the ownership of any other properties, nor will it change verb ownerships.  Use @grant if you need to do a more complete ownership change.  The quota of the former owner is increased by one, as is the quota of the new owner decreased by one.
2

2
Changing a property ownership is truly hairy.  If the property is +c one shouldnot be doing this, unless it is to correct a past injustice which caused the property to be owned by the wrong player.  In the case of -c properties, the property ownership is changed on all descendent objects (currently, if +c instances of a -c property are found in the traversal of all of the descendants, these are not changed, being deemed sufficiently weird that they should be handled on a case-by-case basis...).
2

2
If there's any justice, a future version of the server will prevent occurrences of (1) +c properties being owned by someone other than the object owner (2) -c properties with different owners on descendant objects (3) -c properties that are +c on some descendants.
38
5
4
2
2
*forward*
2
blacklist
38
5
4
16
2
Syntax:  @redlist   [<domain or subnet> [commentary]]
2
         @blacklist [<domain or subnet> [commentary]]
2
         @graylist  [<domain or subnet> [commentary]]
2
         @spooflist [<domain or subnet> [commentary]]
2

2
Syntax:  @unredlist   [<domain or subnet> [commentary]]
2
         @unblacklist [<domain or subnet> [commentary]]
2
         @ungraylist  [<domain or subnet> [commentary]]
2
         @unspooflist [<domain or subnet> [commentary]]
2

2
With no argument, the current contents of the corresponding list are printed.
2
Otherwise, the specified domain or subnet is added to or removed from the list and mail will be sent to $site_log.  
2

2
If the given domain or subnet has subdomains/subsubnets that are already on the list, you will be prompted as to whether you want to remove them.  Note that adding an entry for a particular domain or subnet effectively adds all subdomains/subsubnets, so unless there's some reason for keeping an explicit entry for a particular subdomain, chances are you will indeed want to remove them.  One reason to keep an explicit entry for a subdomain would be if you intended to unlist the full domain later but wanted to be sure you didn't unlist the subdomain in the process.
2

2
See `help blacklist' for a description of the functions of these lists.
38
5
4
2
2
*forward*
2
@blacklist
38
5
4
2
2
*forward*
2
@blacklist
38
5
4
7
2
Syntax:  @make-guest <adjective>
2

2
This creates a new guest character.  For example,
2
  @make-guest Loud
2
creates a child of $guest, owned by $hacker, named Loud_Guest and with aliases Loud and Loud_Guest.
2

2
See also `help @make-player'.
38
5
4
2
2
*forward*
2
@blacklist
38
5
4
2
2
*forward*
2
blacklist
38
5
5
38
5
5
38
4
4
1
2
Wizard Help
38
5
4
1
2
This describes the various commands available on $wiz.
38
5
4
2
0
20399
0
750666134
2
1
#26
Wizard Utilities

16
2
-1
-1
-1
1
-1
15
28
set_programmer
2
173
-1
set_player
2
173
-1
set_owner
2
173
-1
set_property_owner
2
165
-1
unset_player
2
173
-1
set_property_flags
2
165
-1
_set_property_flags
2
173
-1
random_password
2
173
-1
queued_tasks
2
165
-1
player_cmd_perms
2
173
-1
isnewt
2
165
-1
newt_confunc
2
169
-1
initialize_owned
2
173
-1
verify_owned_objects
2
173
-1
connected_wizards
38
165
-1
all_wizards
38
165
-1
rename_all_instances
2
165
-1
missed_help
2
173
-1
show_missing_help
2
173
-1
init_for_core
2
173
-1
show_netwho_listing
2
173
-1
show_netwho_from_listing
2
173
-1
check_player_request check_reregistration
2
173
-1
make_player
2
173
-1
send_new_player_mail
2
173
-1
do_make_player
2
93
-2
do_register
2
173
-1
do_new_password
2
93
-2
4
default_programmer_quota
default_player_quota
missed_help_strings
missed_help_counters
8
0
20
2
5
0
7
2
5
4
0
2
1
4
0
2
1
5
2
4
4
1
2
Wizard Utilities
2
5
4
36
2
Wizard Utilities
2
----------------
2
The following functions are substitutes for various server builtins.
2
Anytime one feel tempted to use one of the expressions on the right,
2
use the corresponding one on the left instead.  This will take care
2
of various things that the server (for whatever reason) does not handle.
2

2
:set_programmer(object)             object.programmer = 1;
2
    chparent object to $prog
2
    send mail to $prog_log
2

2
:set_player(object[,nochown])       set_player_flag(object,1);
2
    set player flag, 
2
    add name/aliases to $player_db,
2
    and maybe do a self chown.
2

2
:unset_player(object[,newowner])    set_player_flag(object,0);
2
    unset player flag,
2
    remove name/aliases from $player_db
2
    chown to newowner if given
2

2
:set_owner(object, newowner)        object.owner = newowner;
2
    change ownership on object
2
    change ownership on all +c properties
2
    juggle .ownership_quotas
2

2
:set_property_owner(object, property, newowner)
2
    change owner on a given property
2
    if this is a -c property, we change the owner on all descendants
2
    for which this is also a -c property.
2
    Polite protest if property is +c and newowner != object.owner.
2

2
:set_property_flags(object, property, flags)
2
    change the permissions on a given property and propagate these to 
2
    *all descendants*.  property ownership is changed on descendants 
2
    where necessary.
2
5
4
2
0
36224
0
750665908
2
1
#27
Site DB

0
38
-1
-1
-1
39
-1
18
6
find* _only _every*
38
173
-1
add
38
173
-1
load
2
173
-1
domain_literal
38
173
-1
init_for_core
38
173
-1
cleanup
38
41
-1
1
domain
8
2
localdomain
38
1
2

38
5
5
38
1
4
4
2

2

4
0
4
0
38
0
5
38
4
4
3
2
sitedb
2
site
2
db
38
5
4
2
2
This object holds a db of places from which players have connected (see `help $site_db').
2
The site blacklist and the graylist live as well (see `help blacklist').
38
5
4
2
0
1452162
0
750668012
2
1
#28
Math Utilities

16
38
-1
-1
-1
1
-1
53
35
sin
38
173
-1
cos
38
173
-1
tan
38
173
-1
xsin
38
173
-1
xcos
38
173
-1
factorial
38
173
-1
pow
38
173
-1
fibonacci
38
173
-1
geometric
38
173
-1
divmod
38
173
-1
combinations
38
173
-1
permutations
38
173
-1
simpson
38
173
-1
parts
38
173
-1
sqrt
38
173
-1
arctan
38
173
-1
div
38
173
-1
mod
38
173
-1
aexp
38
173
-1
random
38
173
-1
random_range
38
173
-1
is_prime
38
173
-1
AND
38
173
-1
OR
38
173
-1
XOR
38
173
-1
NOT
38
173
-1
BLFromInt
38
173
-1
IntFromBL
38
173
-1
gcd greatest_common_divisor
38
173
-1
lcm least_common_multiple
38
173
-1
are_rel_prime are_relatively_prime
38
173
-1
base_conversion
38
173
-1
exp
38
173
-1
norm
38
173
-1
sum
38
173
-1
4
base_alphabet
tangents
factor
taylor
8
2
0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
38
5
4
45
0
174
0
349
0
524
0
699
0
874
0
1051
0
1227
0
1405
0
1583
0
1763
0
1943
0
2125
0
2308
0
2493
0
2679
0
2867
0
3057
0
3249
0
3443
0
3639
0
3838
0
4040
0
4244
0
4452
0
4663
0
4877
0
5095
0
5317
0
5543
0
5773
0
6008
0
6248
0
6494
0
6745
0
7002
0
7265
0
7535
0
7812
0
8097
0
8390
0
8692
0
9004
0
9325
0
9656
0
10000
38
5
0
10000
38
5
0
100
38
5
5
38
4
4
4
2
Math Utilities
2
Math_Utils
2
trigonometric utilites
2
trig_utils
38
5
4
47
2
Trigonometric/Exponential functions:
2
  sin(a),cos(a),tan(a) -- returns 10000*(the value of the corresponding
2
       trigonometric function) angle a is in degrees.
2
  arctan([x,]y) -- returns arctan(y/x) in degrees in the range -179..180.
2
       x defaults to 10000.  Quadrant is that of (x,y).
2
  exp(x[,n]) -- calculates e^x with an nth order taylor polynomial
2

2
Statistical functions:
2
  combinations(n,r) -- returns the number of combinations given n objects
2
       taken r at a time.
2
  permutations(n,r) -- returns the number of permutations possible given
2
       n objects taken r at a time.
2

2
Number decomposition:
2
  div(n,d) -- correct version of / (handles negative numbers correctly)
2
  mod(n,d) -- correct version of % (handles negative numbers correctly)
2
  divmod(n,d) -- {div(n,d),mod(n,d)}
2
  parts(n,q[,i]) -- returns a list of two elements {integer,decimal fraction}
2

2
Other math functions:
2
  sqrt(x)      -- returns the largest integer n <= the square root of x
2
  pow(x,n)     -- returns x^n
2
  factorial(x) -- returns x!
2

2
Series:
2
  fibonacci(n) -- returns the 1st n fibonacci numbers in a list
2
  geometric(x,n) -- returns the value of the nth order geometric series at x
2

2
Integer Properties:
2
  gcd(a,b) -- find the greatest common divisor of the two numbers
2
  lcm(a,b) -- find the least common multiple of the two numbers
2
  are_relatively_prime(a,b) -- return 1 if a and b are relatively prime
2
  is_prime(n) -- returns 1 if the number is a prime and 0 otherwise
2
  
2
Miscellaneous:
2
  random(n) -- returns a random number from 0..n if n > 0 or n..0 if n < 0
2
  random_range(n[,mean]) -- returns a random number from mean - n..mean + n
2
       with mean defaulting to 0
2
  simpson({a,b},{f(a),f((a+b)/2),f(b)}) -- returns the numerical
2
      approximation of an integral using simpson's rule
2

2
Bitwise Arithmetic:
2
  AND(x,y) -- returns x AND y
2
  OR(x,y) -- returns x OR y
2
  XOR(x,y) -- returns x XOR y (XOR is the exclusive-or function)
2
  NOT(x) -- returns the complement of x
2
      All bitwise manipulation is of 32-bit values.
38
5
4
2
0
19005
0
750666785
2
1
#29
Set Utilities

16
38
-1
-1
-1
1
-1
26
7
union
38
173
-1
intersection
38
173
-1
diff*erence
38
173
-1
contains
38
173
-1
exclusive_or xor
38
173
-1
difference_suspended diff_suspended
38
173
-1
equal
38
173
-1
0
4
5
38
4
4
2
2
Set Utilities
2
set_utilities
38
5
4
16
2
This object is useful for operations that treat lists as sets (i.e.,
2
without concern about order and assuming no duplication).
2

2
 union(set, set, ...)        => union
2
 intersection(set, set, ...) => intersection
2

2
 diff*erence(set1, set2, ..., setn)
2
        => result of removing all elements of sets 2..n from set 1.
2
 exclusive_or(set, set, set, ...)
2
        => all elements that are contained in exactly one of the sets
2

2
 contains(set1, set2, ..., setn)
2
        => true if and only if all of sets 2..n are subsets of set 1
2

2
 equal(set1, set2)
2
        => true if and only if set1 and set2 are equal
38
5
4
2
0
4429
0
750754537
2
1
#30
Builtin Function Help

16
38
-1
-1
-1
32
-1
25
1
init_for_core
2
173
-1
81
match()
rmatch()
substitute()
sqrt()
server_log()
pass()
builtin-index
open_network_connection()
connection_name()
shutdown()
dump_database()
memory_usage()
reset_max_object()
renumber()
server_version()
output_delimiters()
callers()
kill_task()
queued_tasks()
read()
suspend()
task_id()
seconds_left()
ticks_left()
caller_perms()
set_task_perms()
eval()
boot_player()
notify()
idle_seconds()
connected_seconds()
connected_players()
set_player_flag()
is_player()
players()
set_verb_code()
verb_code()
delete_verb()
add_verb()
set_verb_args()
verb_args()
set_verb_info()
verb_info()
verbs()
delete_property()
add_property()
set_property_info()
property_info()
properties()
move()
max_object()
recycle()
children()
parent()
valid()
chparent()
create()
setremove()
setadd()
listset()
listdelete()
listinsert()
listappend()
strcmp()
rindex()
index()
crypt()
strsub()
length()
ctime()
time()
random()
abs()
max()
min()
toobj()
tonum()
tostr()
typeof()
clear_property()
is_clear_property()
86
4
20
2
Syntax:  match (str <subject>, str <pattern> [, <case-matters>])  => list
2
         rmatch (str <subject>, str <pattern> [, <case-matters>])  => list
2

2
The function `match()' (`rmatch()') searches for the first (last) occurrence of the regular expression <pattern> in the string <subject>.  If <pattern> is syntactically malformed, then `E_INVARG' is returned.  If no match is found, the empty list is returned; otherwise, these functions return a list containing information about the match (see below).  By default, the search ignores upper/lower case distinctions.  If <case-matters> is provided and true, then case is treated as significant in all comparisons.
2

2
The list that `match()' (`rmatch()') returns contains the details about the match made.  The list is in the form:
2

2
     {<start>, <end>, <replacements>, <subject>}
2

2
where <start> is the index in STRING of the beginning of the match, <end> is the index of the end of the match, <replacements> is a list described below, and <subject> is the same string that was given as the first argument to the `match()' or `rmatch()'.
2

2
The <replacements> list is always nine items long, each item itself being a list of two numbers, the start and end indices in <subject> matched by some parenthesized sub-pattern of <pattern>.  The first item in <replacements> carries the indices for the first parenthesized sub-pattern, the second item carries those for the second sub-pattern, and so on.  If there are fewer than nine parenthesized sub-patterns in <pattern>, or if some sub-pattern was not used in the match, then the corresponding item in <replacements> is the list {0, -1}.  See the discussion of `%)' in `help regular-expressions', for more information on parenthesized sub-patterns.
2

2
   match("foo", "f*o")          =>  {1, 2, {{0, -1}, ...}, "foo"}
2
   match("foo", "fo*")          =>  {1, 3, {{0, -1}, ...}, "foo"}
2
   match("foobar", "o*b")       =>  {2, 4, {{0, -1}, ...}, "foobar"}
2
   rmatch("foobar", "o*b")      =>  {4, 4, {{0, -1}, ...}, "foobar"}
2
   match("foobar", "f%(o*%)b")  =>  {1, 4, {{2, 3}, {0, -1}, ...}, "foobar"}
2

2
See `help regular-expressions' for information on the syntax and semantics of patterns.
38
5
4
2
2
*forward*
2
match()
38
5
4
9
2
Syntax:  substitute (str <template>, list <subs>)  => str
2

2
Performs a standard set of substitutions on the string <template>, using the information contained in <subs>, returning the resulting, transformed <template>.  <Subs> should be a list like those returned by `match()' or `rmatch()' when the match succeeds.
2

2
In <template>, the strings `%1' through `%9' will be replaced by the text matched by the first through ninth parenthesized sub-patterns when `match()' or `rmatch()' was called.  The string `%0' in <template> will be replaced by the text matched by the pattern as a whole when `match()' or `rmatch()' was called.
2

2
     subs = match("*** Welcome to LambdaMOO!!!", "%(%w*%) to %(%w*%)");
2
     substitute("I thank you for your %1 here in %2.", subs)
2
             =>   "I thank you for your Welcome here in LambdaMOO."
38
5
4
3
2
Syntax:  sqrt (num <x>)  => num
2

2
Returns the square root of <x>.  If <x> is negative, then `E_INVARG' is returned.
38
5
4
3
2
Syntax:  server_log (str <message> [, <is-error>])  => none
2

2
The text in <message> is sent to the server log.  If the programmer is not a wizard, then `E_PERM' is returned.  If <is-error> is provided and true, then <message> is marked in the server log as an error.
38
5
4
31
2
Syntax:  pass (<arg>,...)
2

2
Often, it is useful for a child object to define a verb that *augments*
2
the behavior of a verb on its parent object.  For example, the root object 
2
(an ancestor of every other object) defines a :description() verb that 
2
simply returns the value of `this.description'; 
2
this verb is used by the implementation of the `look' command.  
2
In many cases, a programmer would like the description of some object to
2
include some non-constant part; for example, a sentence about whether or not
2
the object was `awake' or `sleeping'.  This sentence should be added onto the
2
end of the normal description.  The programmer would like to have a means of
2
calling the normal `description' verb and then appending the sentence onto the
2
end of that description.  The function `pass()' is for exactly such situations.
2

2
pass() calls the verb with the same name as the current verb but as
2
defined on the parent of the object that defines the current verb.  The
2
arguments given to the called verb are the ones given to pass() and the
2
returned value of the called verb is returned from the call to pass().
2
The initial value of `this' in the called verb is the same as in the
2
calling verb.
2

2
Thus, in the example above, the child-object's :description() verb might
2
have the following implementation:
2

2
    return pass(@args) + "  It is " + (this.awake ? "awake." | "sleeping.");
2

2
That is, it calls its parent's :description() verb and then appends to the
2
result a sentence whose content is computed based on the value of a property on
2
the object.
2

2
In the above example, `pass()' would have worked just as well, since :description() is not normally given any arguements.  However, it is a good idea to get into the habit of using `pass(@args)' rather than `pass(args[1])' or `pass()' even if the verb being pass()ed to is already known to take a set number of arguments or none at all.  For one thing, though the args may be irrelevant to the code that you've written, it may be that the corresponding verb on the parent has been rewritten to take additional arguments, in which case you will want your verb to continue to work...
38
5
4
2
2
*index*
2
Server Built-in Functions
38
5
4
52
2
Syntax:  open_network_connection (<value>, ...)   => obj
2

2
Establishes a network connection to the place specified by the arguments and
2
pretends that a new, normal player connection has been established from there.
2
The new connection, as usual, will not be logged in initially and will have a
2
negative object number associated with it for use with `read()',
2
`notify()', and `boot_player()'.  This object number is the value returned by this function.
2

2
If the programmer is not a wizard or if the `OUTBOUND_NETWORK' compilation
2
option was not used in building the server, then `E_PERM' is returned.  If
2
the network connection cannot be made for some reason, then other errors will
2
be returned, depending upon the particular network implementation in use.
2

2
For the BSD UNIX network implementation (the only publicly-available one as of
2
this writing), there must be two arguments, a string naming a host (possibly
2
using the numeric Internet syntax) and a number specifying a TCP port.  If a
2
connection cannot be made because the host does not exist, the port does not
2
exist, the host is not reachable or refused the connection, `E_INVARG' is
2
returned.  If the connection cannot be made for other reasons, including
2
resource limitations, then `E_QUOTA' is returned.
2

2
It is worth mentioning a couple of tricky points concerning the use of this
2
function.
2

2
Since the server treats the new connection like any other normal
2
player connection, it will naturally try to parse any input from that
2
connection as commands in the usual way.  To prevent this treatment, it is
2
necessary to ensure that some task is always suspended using `read()' on
2
the connection whenever the server considers a line of input from it.  That
2
way, the line of input will be given to that task instead of being parsed as a
2
command.  The only reliable way to ensure this is for the task that opens the
2
connection to enter an infinite loop reading from the connection.  One possible
2
structure for such a task is as follows:
2

2
    conn = open_network_connection(...);
2
    read(conn);
2
    while (1)
2
      line = read(conn);
2
      fork (0)
2
        this:handle_input(line);
2
      endfork
2
    endwhile
2

2
The first call to `read()' in this example is to discard the null line of
2
input always automatically supplied by the server for new connections; for more
2
details, see the discussion of `#0:do_login_command' in the section on
2
server commands and database assumptions.
2

2
The second fine point to be considered is that, unless the new connection
2
eventually `logs in' in the usual way for players, the server will impose its
2
usual five-minute timeout on it, shutting down the connection unless new input
2
arrives at least once every five minutes.
38
5
4
15
2
Syntax:  connection_name (obj <player>)   => str
2

2
Returns a network-specific string identifying the connection being used by the
2
given player.  If the programmer is not a wizard and not <player>, then
2
`E_PERM' is returned.  If <player> is not currently connected, then
2
`E_INVARG' is returned.
2

2
For the BSD UNIX network implementation (the only publicly-available one as of
2
this writing), the string has the form
2

2
    "<number> from <host>"
2

2
where <number> is a remarkably uninteresting internal server index and
2
<host> is either the name or decimal TCP address of the host from which the
2
player is connected.
38
5
4
5
2
Syntax:  shutdown (str <message>)   => none
2

2
Requests that the server shut itself down at its next opportunity.  Before
2
doing so, the given <message> is printed to all connected players.  If the
2
programmer is not a wizard, then `E_PERM' is returned.
38
5
4
7
2
Syntax:  dump_database ()   => none
2

2
Requests that the server checkpoint the database at its next opportunity.  It
2
is not normally necessary to call this function; the server automatically
2
checkpoints the database at regular intervals; see the chapter on server
2
assumptions about the database for details.  If the programmer is not a wizard,
2
then `E_PERM' is returned.
38
5
4
17
2
Syntax:  memory_usage ()   => list
2

2
On some versions of the server, this returns statistics concerning the server
2
consumption of system memory.  The result is a list of lists, each in the
2
following format:
2

2
    {<block-size>, <nused>, <nfree>}
2

2
where <block-size> is the size in bytes of a particular class of memory
2
fragments, <nused> is the number of such fragments currently in use in the
2
server, and <nfree> is the number of such fragments that have been reserved
2
for use but are currently free.
2

2
On servers for which such statistics are not available, `memory_usage()'
2
returns `{}'.  The compilation option `USE_SYSTEM_MALLOC' controls
2
whether or not statistics are available; if the option is provided, statistics
2
are not available.
38
5
4
10
2
Syntax:  reset_max_object ()   => none
2

2
The server's idea of the highest object number ever used is changed to be the
2
highest object number of a currently-existing object, thus allowing reuse of
2
any higher numbers that refer to now-recycled objects.  If the programmer is
2
not a wizard, then `E_PERM' is returned.
2

2
This operation is intended for use in making new versions of the LambdaCore
2
database from the then-current LambdaMOO database, and other similar
2
situations.  Its use requires great care.
38
5
4
19
2
Syntax:  renumber (obj <object>)   => obj
2

2
The object number of the object currently numbered <object> is changed to
2
be the least nonnegative object number not currently in use and the new object
2
number is returned.  If <object> is not valid, then `E_INVARG' is
2
returned.  If the programmer is not a wizard, then `E_PERM' is returned.
2
If there are no unused nonnegative object numbers less than <object>, then
2
<object> is returned and no changes take place.
2

2
The references to <object> in the parent/children and location/contents
2
hierarchies are updated to use the new object number, and any verbs, properties
2
and/or objects owned by <object> are also changed to be owned by the new
2
object number.  The latter operation can be quite time consuming if the
2
database is large.  No other changes to the database are performed; in
2
particular, no object references in property values or verb code are updated.
2

2
This operation is intended for use in making new versions of the LambdaCore
2
database from the then-current LambdaMOO database, and other similar
2
situations.  Its use requires great care.
38
5
4
22
2
Syntax:  server_version ()   => str
2

2
Returns a string giving the version number of the MOO server in the following
2
format:
2

2
    "<major>.<minor>.<release>"
2

2
where <major>, <minor>, and <release> are all decimal numbers.
2

2
The major version number changes very slowly, only when existing MOO code might
2
stop working, due to an incompatible change in the syntax or semantics of the
2
programming language, or when an incompatible change is made to the database
2
format.
2

2
The minor version number changes more quickly, whenever an upward-compatible
2
change is made in the programming language syntax or semantics.  The most
2
common cause of this is the addition of a new kind of expression, statement, or
2
built-in function.
2

2
The release version number changes as frequently as bugs are fixed in the
2
server code.  Changes in the release number indicate changes that should only
2
be visible to users as bug fixes, if at all.
38
5
4
8
2
Syntax:  output_delimiters (obj <player>)   => list
2

2
Returns a list of two strings, the current "output prefix" and "output
2
suffix" for <player>.  If <player> does not have an active network
2
connection, then `E_INVARG' is returned.  If either string is currently
2
undefined, the value `""' is used instead.  See the discussion of the
2
`PREFIX' and `SUFFIX' commands in the next chapter for more
2
information about the output prefix and suffix.
38
5
4
22
2
Syntax:  callers ()   => list
2

2
Returns information on each of the verbs currently waiting to resume execution
2
in the current task.  When one verb calls another verb, execution of the caller
2
is temporarily suspended, pending the called verb returning a value.  At any
2
given time, there could be several such pending verbs: the one that called the
2
currently executing verb, the verb that called that one, and so on.  The result
2
of `callers()' is a list, each element of which gives information about
2
one pending verb in the following format:
2

2
    {<this>, <verb-name>, <programmer>, <verb-loc>, <player>}
2

2
where <this> is the initial value of the variable `this' in that verb,
2
<verb-name> is the name used to invoke that verb,  <programmer> is
2
the player with whose permissions that verb is running, <verb-loc> is the
2
object on which that verb is defined, and <player> is the initial value of
2
the variable `player' in that verb.
2

2
The first element of the list returned by `callers()' gives information on
2
the verb that called the currently-executing verb, the second element describes
2
the verb that called that one, and so on.  The last element of the list
2
describes the first verb called in this task.
38
5
4
6
2
Syntax:  kill_task (num <task-id>)   => none
2

2
Removes the task with the given <task-id> from the queue of waiting tasks.
2
If the programmer is not the owner of that task and not a wizard, then
2
`E_PERM' is returned.  If there is no task on the queue with the given
2
<task-id>, then `E_INVARG' is returned.
38
5
4
25
2
Syntax:  queued_tasks ()   => list
2

2
Returns information on each of the forked, suspended or reading tasks owned by
2
the programmer (or, if the programmer is a wizard, all queued tasks).  The
2
returned value is a list of lists, each of which encodes certain information
2
about a particular queued task in the following format:
2

2
    {<task-id>, <start-time>, <ticks>, <clock-id>,
2
     <programmer>, <verb-loc>, <verb-name>, <line>, <this>}
2

2
where <task-id> is a numeric identifier for this queued task,
2
<start-time> is the time after which this task will begin execution (in
2
`time()' format), <ticks> is the number of ticks this task will have
2
when it starts (always 20,000 now), <clock-id> is a number whose value is
2
no longer interesting, <programmer> is the permissions with which this task
2
will begin execution (and also the player who "owns" this task),
2
<verb-loc> is the object on which the verb that forked this task was
2
defined at the time, <verb-name> is that name of that verb, <line> is
2
the number of the first line of the code in that verb that this task will
2
execute, and <this> is the value of the variable `this' in that verb.
2
For reading tasks, <start-time> is `-1'.
2

2
The <ticks> and <clock-id> fields are now obsolete and are retained
2
only for backward-compatibility reasons.  They may disappear in a future
2
version of the server.
38
5
4
46
2
Syntax:  read ([obj <player>])   => str
2

2
This function suspends the current task, waiting for a line of input from the
2
given <player> (which defaults to the player that typed the command that
2
initiated the current task), and resumes when such a line is received,
2
returning that line as a string.  Upon resumption, the task is given a full
2
quota of ticks and seconds.  `Read()' may only be called by a wizard, and,
2
unless <player> is given explicitly, only in a command task that has never
2
been suspended by a call to `suspend()'.  Otherwise, `E_PERM' is
2
returned.  If the given `player' is not currently connected and has no
2
pending lines of input, `read()' returns `E_INVARG'.
2

2
These restrictions on the use of `read()' without an explicit argument
2
preserve the following simple invariant: if input is being read from a player,
2
it is for the task started by the last command that player typed.  This
2
invariant adds responsibility to the programmer, however.  If your program
2
calls another verb before doing a `read()', then that verb must also not
2
suspend.  As an example, consider the following, which refers to the verbs
2
programmed in the `suspend()' example in `help suspend()':
2

2
    .program   #0:read_twice_A
2
    s = read();        /* success depends on programmer's permissions */
2
    #0:callee_A();     /* callee_A does not suspend */
2
    t = read();        /* success depends on programmer's permissions */
2
    .
2

2
    .program   #0:read_twice_B
2
    s = read();        /* success depends on programmer's permissions */
2
    #0:callee_B();     /* callee_B does suspend */
2
    t = read();        /* fails, returning E_PERM */
2
    .
2

2
In three of the four calls to `read()', success depends on on the
2
programmer's permissions.  However, the second `read()' in
2
`#0:read_twice_B' always fails and returns `E_PERM'.  This is because
2
the task was suspended, even though `#0:read_twice_B' did not do the
2
actual suspending.  Hence, if you want to read some input (by using
2
`read()' directly or by calling other verbs which do the reading), you
2
must make sure that the task is not suspended before the reading.  This
2
includes making sure that any verbs you call, directly or indirectly, also do
2
not suspend.
2

2
It is possible to call `read()' many times in the same command task, so
2
long as the task does not call `suspend()' or an explicit argument is
2
given.  The best use for `read()' with an explicit argument is in
2
conjunction with `open_network_connection()', if it is enabled.
38
5
4
61
2
Syntax:  suspend (num <seconds>)   => none
2

2
Suspends the current task, and resumes it after at least <seconds> seconds.
2
When the task is resumed, it will have a full quota of ticks and seconds.  This
2
function is useful for programs that run for a long time or require a lot of
2
ticks.  If <seconds> is negative, then `E_INVARG' is returned.
2

2
In some sense, this function forks the `rest' of the executing task.  However,
2
there is a major difference between the use of `suspend(<seconds>)'
2
and the use of the `fork (<seconds>)'.  The `fork' statement
2
creates a new task (a "forked task") while the currently-running task still
2
goes on to completion, but a `suspend()' suspends the currently-running
2
task (thus making it into a "suspended task").  This difference may be best
2
explained by the following examples, in which one verb calls another:
2

2
    .program   #0:caller_A
2
    #0.prop = 1;
2
    #0:callee_A();
2
    #0.prop = 2;
2
    .
2

2
    .program   #0:callee_A
2
    fork(5)
2
      #0.prop = 3;
2
    endfork
2
    .
2

2
    .program   #0:caller_B
2
    #0.prop = 1;
2
    #0:callee_B();
2
    #0.prop = 2;
2
    .
2

2
    .program   #0:callee_B
2
    suspend(5);
2
    #0.prop = 3;
2
    .
2

2
Consider `#0:caller_A', which calls `#0:callee_A'.  Such a task would
2
assign 1 to `#0.prop', call `#0:callee_A', fork a new task, return to
2
`#0:caller_A', and assign 2 to `#0.prop', ending this task.  Five
2
seconds later, if the forked task had not been killed, then it would begin to
2
run; it would assign 3 to `#0.prop' and then stop.  So, the final value of
2
`#0.prop' (i.e., the value after more than 5 seconds) would be 3.
2

2
Now consider `#0:caller_B', which calls `#0:callee_B' instead of
2
`#0:callee_A'.  This task would assign 1 to `#0.prop', call
2
`#0:callee_B', and suspend.  Five seconds later, if the suspended task had
2
not been killed, then it would resume; it would assign 3 to `#0.prop',
2
return to `#0:caller', and assign 2 to `#0.prop', ending the task.
2
So, the final value of `#0.prop' (i.e., the value after more than 5
2
seconds) would be 2.
2

2
A suspended task, like a forked task, can be described by the
2
`queued_tasks()' function and killed by the `kill_task()' function.
2
Suspending a task does not change its task id.  A task can be suspended again
2
and again by successive calls to `suspend()'.
2

2
Once `suspend()' has been used in a particular task, then the
2
`read()' function will always return `E_PERM' in that task.  For more
2
details, see the description of `read()' below.
38
5
4
5
2
Syntax:  task_id ()   => num
2

2
Returns the numeric identifier for the currently-executing task.  Such numbers
2
are randomly selected for each task and can therefore safely be used in
2
circumstances where unpredictability is required.
38
5
4
2
2
*forward*
2
ticks_left()
38
5
4
7
2
Syntax:  ticks_left ()   => num
2
       seconds_left ()   => num
2

2
These two functions return the number of ticks or seconds (respectively) left
2
to the current task before it will be forcibly terminated.  These are useful,
2
for example, in deciding when to fork another task to continue a long-lived
2
computation.
38
5
4
6
2
Syntax:  caller_perms ()   => obj
2

2
Returns the permissions in use by the verb that called the currently-executing
2
verb.  If the currently-executing verb was not called by another verb (i.e., it
2
is the first verb called in a command or server task), then
2
`caller_perms()' returns `#-1'.
38
5
4
10
2
Syntax:  set_task_perms (obj <player>)   => none
2

2
Changes the permissions with which the currently-executing verb is running to
2
be those of <player>.  If <player> is not a valid player object, then
2
`E_INVARG' is returned.  If the programmer is neither <player> nor a
2
wizard, then `E_PERM' is returned.
2

2
Note: This does not change the owner of the currently-running verb, only the
2
permissions of this particular invocation.  It is used in verbs owned by
2
wizards to make themselves run with lesser (usually non-wizard) permissions.
38
5
4
32
2
Syntax:  eval (str <string>)   => list
2

2
The MOO-code compiler processes <string> as if it were to be the program
2
associated with some verb and, if no errors are found, that fictional verb is
2
invoked.  If the programmer is not, in fact, a programmer, then `E_PERM'
2
is returned.  The normal result of calling `eval()' is a two element list.
2
The first element is true if there were no compilation errors and false
2
otherwise.  The second element is either the result returned from the fictional
2
verb (if there were no compilation errors) or a list of the compiler's error
2
messages (otherwise).
2

2
When the fictional verb is invoked, the various built-in variables have values
2
as shown below:
2

2
    player    the same as in the calling verb
2
    this      #-1
2
    caller    the same as the initial value of `this' in the calling verb
2

2
    args      {}
2
    argstr    ""
2

2
    verb      ""
2
    dobjstr   ""
2
    dobj      #-1
2
    prepstr   ""
2
    iobjstr   ""
2
    iobj      #-1
2

2
The fictional verb runs with the permissions of the programmer and as if its
2
`d' permissions bit were on.
2

2
    eval("return 3 + 4;")   =>   {1, 7}
38
5
4
15
2
Syntax:  boot_player (obj <player>)   => none
2

2
Immediately terminates any currently-active connection to the given
2
<player>.  If the programmer is not either a wizard or the same as
2
<player>, then `E_PERM' is returned.  If there is no currently-active
2
connection to <player>, then this function does nothing.
2

2
If there was a currently-active connection, then the following two verb calls
2
are made before the connection is closed:
2

2
    <player>:disfunc()
2
    <player>.location:disfunc(<player>)
2

2
It is not an error if either of these verbs do not exist; the corresponding
2
call is simply skipped.
38
5
4
6
2
Syntax:  notify (obj <player>, str <string>)   => none
2

2
Outputs <string> (on a line by itself) to the user connected to the given
2
<player>.  If the programmer is not <player> or a wizard, then
2
`E_PERM' is returned.  If there is no currently-active connection to
2
<player>, then this function does nothing.
38
5
4
2
2
*forward*
2
connected_seconds()
38
5
4
7
2
Syntax:  connected_seconds (obj <player>)   => num
2
              idle_seconds (obj <player>)   => num
2

2
These functions return the number of seconds that the currently-active
2
connection to <player> has existed and been idle, respectively.  If
2
<player> is not the object number of a player object with a
2
currently-active connection, then `E_INVARG' is returned.
38
5
4
4
2
Syntax:  connected_players ()   => list
2

2
Returns a list of the object numbers of those player objects with
2
currently-active connections.
38
5
4
20
2
Syntax:  set_player_flag (obj <object>, <value>)   => none
2

2
Confers or removes the ``player object'' status of the given <object>,
2
depending upon the truth value of <value>.  If <object> is not valid,
2
`E_INVARG' is returned.  If the programmer is not a wizard, then
2
`E_PERM' is returned.
2

2
If <value> is true, then <object> gains (or keeps) ``player object''
2
status: it will be an element of the list returned by `players()', the
2
expression `is_player(<object>)' will return true, and users can
2
connect to <object> by name when they log into the server.
2

2
If <value> is false, the <object> loses (or continues to lack) ``player
2
object'' status: it will not be an element of the list returned by
2
`players()', the expression `is_player(<object>)' will return
2
false, and users cannot connect to <object> by name when they log into the
2
server.  In addition, if a user is connected to <object> at the time that
2
it loses ``player object'' status, then that connection is immediately broken,
2
just as if `boot_player(<object>)' had been called (see the
2
description of `boot_player()' below).
38
5
4
4
2
Syntax:  is_player (obj <object>)   => num
2

2
Returns a true value if the given <object> is a player object and a false
2
value otherwise.  If <object> is not valid, `E_INVARG' is returned.
38
5
4
3
2
Syntax:  players ()   => list
2

2
Returns a list of the object numbers of all player objects in the database.
38
5
4
2
2
*forward*
2
verb_code()
38
5
4
25
2
Syntax:  verb_code (obj <object>, str <verb-name> [, <fully-paren> [, <indent>]])   => list
2
     set_verb_code (obj <object>, str <verb-name>, list <code>)   => list
2

2
These functions get and set (respectively) the MOO-code program associated with
2
the verb named <verb-name> on <object>.  The program is represented as
2
a list of strings, one for each line of the program; this is the kind of value
2
returned by `verb_code()' and expected as the third argument to
2
`set_verb_code()'.  For `verb_code()', the expressions in the
2
returned code are usually written with the minimum-necessary parenthesization;
2
if <full-paren> is true, then all expressions are fully parenthesized.
2
Also for `verb_code()', the lines in the returned code are usually not
2
indented at all; if <indent> is true, each line is indented to better show
2
the nesting of statements.
2

2
If <object> is not valid, then `E_INVARG' is returned.  If
2
<object> does not define a verb named <verb-name>, then `E_VERBNF'
2
is returned.  If the programmer does not have read (write) permission on the
2
verb in question, then `verb_code()' (`set_verb_code()') returns
2
`E_PERM'.  If the programmer is not, in fact, a programmer, then
2
`E_PERM' is returned.
2

2
For `set_verb_code()', the result is a list of strings, the error messages
2
generated by the MOO-code compiler during processing of <code>.  If the
2
list is non-empty, then `set_verb_code()' did not install <code>; the
2
program associated with the verb in question is unchanged.
38
5
4
7
2
Syntax:  delete_verb (obj <object>, str <verb-name>)   => none
2

2
Removes the verb named <verb-name> from the given <object>.  If
2
<object> is not valid, then `E_INVARG' is returned.  If the programmer
2
does not have write permission on <object>, then `E_PERM' is returned.
2
If <object> does not define a verb named <verb-name>, then
2
`E_VERBNF' is returned.
38
5
4
14
2
Syntax:  add_verb (obj <object>, list <info>, list <args>)   => none
2

2
Defines a new verb on the given <object>.  The new verb's owner, permission
2
bits and name(s) are given by <info> in the same format as is returned by
2
`verb_info()'.  The new verb's direct-object, preposition, and indirect-object
2
specifications are given by <args> in the same format as is returned by
2
`verb_args()'.  The new verb initially has the empty program associated with 
2
it; this program does nothing but return an unspecified value.
2

2
If <object> is not valid, or <info> does not specify a legitimate owner
2
and permission bits, or <args> is not a legitimate syntax specification,
2
then `E_INVARG' is retuned.  If the programmer does not have write
2
permission on <object> or if the owner specified by <info> is not the
2
programmer and the programmer is not a wizard, then `E_PERM' is returned.
38
5
4
2
2
*forward*
2
verb_args()
38
5
4
12
2
Syntax:  verb_args (obj <object>, str <verb-name>)   => list
2
     set_verb_args (obj <object>, str <verb-name>, list <args>)   => none
2

2
These two functions get and set (respectively) the direct-object, preposition, and indirect-object specifications for the verb named <verb-name> on the given <object>.  If <object> is not valid, then `E_INVARG' is returned.  If <object> does not define a verb named <verb-name>, then `E_VERBNF' is returned.  If the programmer does not have read (write) permission on the verb in question, then `verb_args()' (`set_verb_args()') returns `E_PERM'.  Verb args specifications have the following form:
2

2
    {<dobj>, <prep>, <iobj>}
2

2
where <dobj> and <iobj> are strings drawn from the set `"this"', `"none"', and `"any"', and <prep> is a string that is either `"none"', `"any"', or one of the prepositional phrases listed much earlier in the description of verbs in the first chapter.  This is the kind of value returned by `verb_info()' and expected as the third argument to `set_verb_info()'.  Note that for `set_verb_args()', <prep> must be only one of the prepositional phrases, not (as is shown in that table) a set of such phrases separated by `/' characters.  `Set_verb_args()' returns `E_INVARG' if any of the <dobj>, <prep>, or <iobj> strings is illegal.
2

2
    verb_args($container, "take")
2
                        =>   {"any", "out of/from inside/from", "this"}
2
    set_verb_args($container, "take", {"any", "from", "this"})
38
5
4
2
2
*forward*
2
verb_info()
38
5
4
19
2
Syntax:  verb_info (obj <object>, str <verb-name>)   => list
2
     set_verb_info (obj <object>, str <verb-name>, list <info>)   => none
2

2
These two functions get and set (respectively) the owner, permission bits, and
2
name(s) for the verb named <verb-name> on the given <object>.  If
2
<object> is not valid, then `E_INVARG' is returned.  If <object>
2
does not define a verb named <verb-name>, then `E_VERBNF' is returned.
2
If the programmer does not have read (write) permission on the verb in
2
question, then `verb_info()' (`set_verb_info()') returns
2
`E_PERM'.  Verb info has the following form:
2

2
    {<owner>, <perms>, <names>}
2

2
where <owner> is an object, <perms> is a string containing only
2
characters from the set `r', `w', `x', and `d', and
2
<names> is a string.  This is the kind of value returned by
2
`verb_info()' and expected as the third argument to
2
`set_verb_info()'; the latter function returns `E_INVARG' if
2
<owner> is not valid or <perms> contains any illegal characters.
38
5
4
6
2
Syntax:  verbs (obj <object>)   => list
2

2
Returns a list of the names of the verbs defined directly on the given
2
<object>, not inherited from its parent.  If <object> is not valid,
2
then `E_INVARG' is returned.  If the programmer does not have read
2
permission on <object>, then `E_PERM' is returned.
38
5
4
8
2
Syntax:  delete_property (obj <object>, str <prop-name>)   => none
2

2
Removes the property named <prop-name> from the given <object> and all
2
of its descendants.  If <object> is not valid, then `E_INVARG' is
2
returned.  If the programmer does not have write permission on <object>,
2
then `E_PERM' is returned.  If <object> does not directly define a
2
property named <prop-name> (as opposed to inheriting one from its parent),
2
then `E_PROPNF' is returned.
38
5
4
12
2
Syntax:  add_property (obj <object>, str <prop-name>, <value>, list <info>)   => none
2

2
Defines a new property on the given <object>, inherited by all of its
2
descendants; the property is named <prop-name>, its initial value is
2
<value>, and its owner and initial permission bits are given by <info>
2
in the same format as is returned by `property_info()'.
2
If <object> is not valid or <object> already has a property named
2
<prop-name> or <info> does not specify a legitimate owner and
2
permission bits, then `E_INVARG' is retuned.  If the programmer does not
2
have write permission on <object> or if the owner specified by <info>
2
is not the programmer and the programmer is not a wizard, then `E_PERM' is
2
returned.
38
5
4
2
2
*forward*
2
property_info()
38
5
4
18
2
Syntax:  property_info (obj <object>, str <prop-name>)   => list
2
     set_property_info (obj <object>, str <prop-name>, list <info>)   => none
2

2
These two functions get and set (respectively) the owner and permission bits
2
for the property named <prop-name> on the given <object>.  If
2
<object> is not valid, then `E_INVARG' is returned.  If <object>
2
has no non-built-in property named <prop-name>, then `E_PROPNF' is
2
returned.  If the programmer does not have read (write) permission on the
2
property in question, then `property_info()' (`set_property_info()')
2
returns `E_PERM'.  Property info has the following form:
2

2
    {<owner>, <perms>}
2

2
where <owner> is an object and <perms> is a string containing only
2
characters from the set `r', `w', and `c'.  This is the kind of
2
value returned by `property_info()' and expected as the third argument to
2
`set_property_info()'; the latter function returns `E_INVARG' if
2
<owner> is not valid or <perms> contains any illegal characters.
38
5
4
6
2
Syntax:  properties (obj <object>)   => list
2

2
Returns a list of the names of the properties defined directly on the given
2
<object>, not inherited from its parent.  If <object> is not valid,
2
then `E_INVARG' is returned.  If the programmer does not have read
2
permission on <object>, then `E_PERM' is returned.
38
5
4
41
2
Syntax:  move (obj <what>, obj <where>)   => none
2

2
Changes <what>'s location to be <where>.  This is a complex process
2
because a number of permissions checks and notifications must be performed.
2
The actual movement takes place as described in the following paragraphs.
2

2
<what> should be a valid object and <where> should be either a valid
2
object or `#-1' (denoting a location of 'nowhere'); otherwise
2
`E_INVARG' is returned.  The programmer must be either the owner of
2
<what> or a wizard; otherwise, `E_PERM' is returned.
2

2
If <where> is a valid object, then the verb-call
2

2
    <where>:accept(<what>)
2

2
is performed before any movement takes place.  If the verb returns a
2
false value and the programmer is not a wizard, then <where> is
2
considered to have refused entrance to <what>; `move()' returns
2
`E_NACC'.  If <where> does not define an `accept' verb, then it
2
is treated as if it defined one that always returned false.
2

2
If moving <what> into <where> would create a loop in the containment
2
hierarchy (i.e., <what> would contain itself, even indirectly), then
2
`E_RECMOVE' is returned instead.
2

2
The `location' property of <what> is changed to be <where>, and
2
the `contents' properties of the old and new locations are modified
2
appropriately.  Let <old-where> be the location of <what> before it was
2
moved.  If <old-where> is a valid object, then the verb-call
2

2
    <old-where>:exitfunc(<what>)
2

2
is performed and its result is ignored; it is not an error if <old-where>
2
does not define a verb named `exitfunc'.  Finally, if <where> and
2
<what> are still valid objects, and <where> is still the location of
2
<what>, then the verb-call
2

2
    <where>:enterfunc(<what>)
2

2
is performed and its result is ignored; again, it is not an error if
2
<where> does not define a verb named `enterfunc'.
38
5
4
6
2
Syntax:  max_object ()   => obj
2

2
Returns the largest object number yet assigned to a created object.  Note that
2
the object with this number may no longer exist; it may have been recycled.
2
The next object created will be assigned the object number one larger than the
2
value of `max_object()'.
38
5
4
14
2
Syntax:  recycle (obj <object>)   => none
2

2
The given <object> is destroyed, irrevocably.  The programmer must either
2
own <object> or be a wizard; otherwise, `E_PERM' is returned.  If
2
<object> is not valid, then `E_INVARG' is returned.  The children of
2
<object> are reparented to the parent of <object>.  Before <object>
2
is recycled, each object in its contents is moved to `#-1' (implying a
2
call to <object>'s `exitfunc' verb, if any) and then <object>'s
2
`recycle' verb, if any, is called with no arguments.
2

2
After <object> is recycled, if the owner of the former object has a
2
property named `ownership_quota' and the value of that property is a
2
number, then `recycle()' treats that value as a "quota" and increments
2
it by one, storing the result back into the `ownership_quota' property.
38
5
4
2
2
*forward*
2
parent()
38
5
4
5
2
Syntax:  parent (obj <object>)   => obj
2
       children (obj <object>)   => list
2

2
These functions return the parent and a list of the children of <object>,
2
respectively.  If <object> is not valid, then `E_INVARG' is returned.
38
5
4
8
2
Syntax:  valid (obj <object>)   => num
2

2
Returns a non-zero number (i.e., a true value) if <object> is a valid
2
object (one that has been created and not yet recycled) and zero (i.e., a false
2
value) otherwise.
2

2
    valid(#0)    =>   1
2
    valid(#-1)   =>   0
38
5
4
27
2
Syntax:  chparent (obj <object>, obj <new-parent>)   => none
2

2
Changes the parent of <object> to be <new-parent>.  If the programmer
2
is neither a wizard or the owner of <object>, or if <new-parent> is not
2
fertile (i.e., its `f' bit is not set) and the programmer is neither the
2
owner of <new-parent> nor a wizard, then `E_PERM' is returned.  If
2
<object> is not valid or if <object> or one of its descendants defines
2
a property with the same name as one defined either on <new-parent> or on
2
one of its ancestors, then `E_INVARG' is returned.
2

2
Changing an object's parent can have the effect of removing some properties
2
from and adding some other properties to that object and all of its descendants
2
(i.e., its children and its children's children, etc.).  Let <common> be
2
the nearest ancestor that <object> and <new-parent> have in common
2
before the parent of <object> is changed.  Then all properties defined by
2
ancestors of <object> under <common> (that is, those ancestors of
2
<object> that are in turn descendants of <common>) are removed from
2
<object> and all of its descendants.  All properties defined by
2
<new-parent> or its ancestors under <common> are added to <object>
2
and all of its descendants.  As with `create()', the newly-added
2
properties are given the same permission bits as they have on <new-parent>,
2
the owner of each added property is either the owner of the object it's added
2
to (if the `c' permissions bit is set) or the owner of that property on
2
<new-parent>, and the value of each added property is "clear"; see the
2
description of the built-in function `clear_property()' for details.  All
2
properties that are not removed or added in the reparenting process are 
2
completely unchanged.
38
5
4
45
2
Syntax:  create (obj <parent> [, obj <owner>])   => obj
2

2
Creates and returns a new object whose parent is <parent> and whose owner
2
is as described below.  Either the given <parent> object must be fertile
2
(i.e., its `f' bit must be set) or else the programmer must own
2
<parent> or be a wizard; otherwise `E_PERM' is returned.
2
`E_PERM' is also returned if <owner> is provided and not the same as 
2
the programmer, unless the programmer is a wizard.  After the new object is
2
created, its `initialize' verb, if any, is called with no arguments.
2

2
The new object is assigned the least non-negative object number that has not
2
yet been used for a created object.  Note that no object number is ever reused,
2
even if the object with that number is recycled.
2

2
The owner of the new object is either the programmer (if <owner> is not
2
provided), the new object itself (if <owner> was given as `#-1'), or
2
<owner> (otherwise).
2

2
The other built-in properties of the new object are initialized as follows:
2
    name         ""
2
    location     #-1
2
    contents     {}
2
    programmer   0
2
    wizard       0
2
    r            0
2
    w            0
2
    f            0
2

2
In addition, the new object inherits all of the other properties on
2
<parent>.  These properties have the same permission bits as on
2
<parent>.  If the `c' permissions bit is set, then the owner of the
2
property on the new object is the same as the owner of the new object itself;
2
otherwise, the owner of the property on the new object is the same as that on
2
<parent>.  The initial value of every inherited property is "clear";
2
see the description of the built-in function `clear_property()' for
2
details.
2

2

2
If the intended owner of the new object has a property named
2
`ownership_quota' and the value of that property is a number, then
2
`create()' treats that value as a "quota".  If the quota is less than
2
or equal to zero, then the quota is considered to be exhausted and
2
`create()' returns `E_QUOTA' instead of creating an object.
2
Otherwise, the quota is decremented and stored back into the
2
`ownership_quota' property as a part of the creation of the new object.
38
5
4
2
2
*forward*
2
setadd()
38
5
4
16
2
Syntax:  setadd (list <list>, <value>)   => list
2
      setremove (list <list>, <value>)   => list
2

2
Returns a copy of <list> with the given <value> added or removed, as
2
appropriate.  `setadd()' only adds <value> if it is not already an
2
element of <list>; <list> is thus treated as a mathematical set.
2
<value> is added at the end of the resulting list, if at all.  Similarly,
2
`setremove()' returns a list identical to <list> if <value> is not
2
an element.  If <value> appears more than once in <list>, only the
2
first occurrence is removed in the returned copy.
2

2
    setadd({1, 2, 3}, 3)         =>   {1, 2, 3}
2
    setadd({1, 2, 3}, 4)         =>   {1, 2, 3, 4}
2
    setremove({1, 2, 3}, 3)      =>   {1, 2}
2
    setremove({1, 2, 3}, 4)      =>   {1, 2, 3}
2
    setremove({1, 2, 3, 2}, 2)   =>   {1, 3, 2}
38
5
4
8
2
Syntax:  listset (list <list>, <value>, num <index>)   => list
2

2
Returns a copy of <list> with the <index>th element replaced by
2
<value>.  If <index> is not in the range
2
`[1..length(<list>)]', then `E_RANGE' is returned.
2

2
    x = {"foo", "bar", "baz"};
2
    listset(x, "mumble", 2)   =>   {"foo", "mumble", "baz"}
38
5
4
8
2
Syntax:  listdelete (list <list>, num <index>)   => list
2

2
Returns a copy of <list> with the <index>th element removed.  If
2
<index> is not in the range `[1..length(<list>)]', then
2
`E_RANGE' is returned.
2

2
    x = {"foo", "bar", "baz"};
2
    listdelete(x, 2)   =>   {"foo", "baz"}
38
5
4
27
2
Syntax:  listinsert (list <list>, <value> [, num <index>])   => list
2
         listappend (list <list>, <value> [, num <index>])   => list
2

2
These functions return a copy of <list> with <value> added as a new
2
element.  `listinsert()' and `listappend()' add <value> before
2
and after (respectively) the existing element with the given <index>, if
2
provided.
2

2
The following three expressions always have the same value:
2

2
    listinsert(<list>, <element>, <index>)
2
    listappend(<list>, <element>, <index> - 1)
2
    {@<list>[1..<index> - 1], <element>, @<list>[<index>..length(<list>)]}
2

2
If <index> is not provided, then `listappend()' adds the <value>
2
at the end of the list and `listinsert()' adds it at the beginning; this
2
usage is discouraged, however, since the same intent can be more clearly
2
expressed using the list-construction expression, as shown in the examples
2
below.
2

2
    x = {1, 2, 3};
2
    listappend(x, 4, 2)   =>   {1, 2, 4, 3}
2
    listinsert(x, 4, 2)   =>   {1, 4, 2, 3}
2
    listappend(x, 4)      =>   {1, 2, 3, 4}
2
    listinsert(x, 4)      =>   {4, 1, 2, 3}
2
    {@x, 4}               =>   {1, 2, 3, 4}
2
    {4, @x}               =>   {4, 1, 2, 3}
38
5
4
2
2
*forward*
2
listinsert()
38
5
4
8
2
Syntax:  strcmp (str <str1>, str <str2>)   => num
2

2
Performs a case-sensitive comparison of the two argument strings.  If
2
<str1> is lexicographically less than <str2>, the
2
`strcmp()' returns a negative number.  If the two strings are
2
identical, `strcmp()' returns zero.  Otherwise, `strcmp()'
2
returns a positive number.  The ASCII character ordering is used for the
2
comparison.
38
5
4
2
2
*forward*
2
index()
38
5
4
15
2
Syntax:  index (str <str1>, str <str2> [, <case-matters>])   => num
2
        rindex (str <str1>, str <str2> [, <case-matters>])   => num
2

2
The function `index()' (`rindex()') returns the index of the first
2
character of the first (last) occurrence of <str2> in <str1>, or zero
2
if <str2> does not occur in <str1> at all.  By default the search for
2
an occurrence of <str2> is done while ignoring the upper/lower case
2
distinction.  If <case-matters> is provided and true, then case is treated
2
as significant in all comparisons.
2

2
    index("foobar", "o")        =>   2
2
    rindex("foobar", "o")       =>   3
2
    index("foobar", "x")        =>   0
2
    index("foobar", "oba")      =>   3
2
    index("Foobar", "foo", 1)   =>   0
38
5
4
19
2
Syntax:  crypt (str <text> [, str <salt>])   => str
2

2
Encrypts the given <text> using the standard UNIX encryption method.  If
2
provided, <salt> should be a two-character string for use as the extra
2
encryption ``salt'' in the algorithm.  If <salt> is not provided, a random
2
pair of characters is used.  In any case, the salt used is also returned as the
2
first two characters of the resulting encrypted string.
2

2
Aside from the possibly-random selection of the salt, the encryption algorithm
2
is entirely deterministic.  In particular, you can test whether or not a given
2
string is the same as the one used to produced a given piece of encrypted text;
2
simply extract the first two characters of the encrypted text and pass the
2
candidate string and those two characters to `crypt()'.  If the result is
2
identical to the given encrypted text, then you've got a match.
2

2
    crypt("foobar")         =>   "J3fSFQfgkp26w"
2
    crypt("foobar", "J3")   =>   "J3fSFQfgkp26w"
2
    crypt("mumble", "J3")   =>   "J3D0.dh.jjmWQ"
2
    crypt("foobar", "J4")   =>   "J4AcPxOJ4ncq2"
38
5
4
12
2
Syntax:  strsub (str <subject>, str <what>, str <with> [, <case-matters>])   => str
2

2
Replaces all occurrences in <subject> of <what> with <with>,
2
performing string substitution.  The occurrences are found from left to right
2
and all substitutions happen simultaneously.  By default, occurrences of
2
<what> are searched for while ignoring the upper/lower case distinction.
2
If <case-matters> is provided and true, then case is treated as significant
2
in all comparisons.
2

2
    strsub("%n is a fink.", "%n", "Fred")   =>   "Fred is a fink."
2
    strsub("foobar", "OB", "b")             =>   "fobar"
2
    strsub("foobar", "OB", "b", 1)          =>   "foobar"
38
5
4
8
2
Syntax:  length (<list or string>)   => num
2

2
Returns the number of characters in <list or string>.  
2

2
    length("foo")       =>   3
2
    length("")          =>   0
2
    length({1, 2, 3})   =>   3
2
    length({})          =>   0
38
5
4
17
2
Syntax:  ctime ([num <time>])   => str
2

2
Interprets <time> as a time, using the same representation as given in the
2
description of `time()', and converts it into a 28-character,
2
human-readable string in the following format:
2

2
    Mon Aug 13 19:13:20 1990 PDT
2

2
If the current day of the month is less than 10, then an extra blank appears
2
between the month and the day:
2

2
    Mon Apr  1 14:10:43 1991 PST
2

2
If <time> is not provided, then the current time is used.
2

2
Note that `ctime()' interprets <time> for the local time zone of the
2
computer on which the MOO server is running.
38
5
4
4
2
Syntax:  time ()   => num
2

2
Returns the current time, represented as the number of seconds that have
2
elapsed since midnight on 1 January 1970, Greenwich Mean Time.
38
5
4
4
2
Syntax:  random (num <mod>)   => num
2

2
<mod> must be a positive number; otherwise, `E_INVARG' is returned.  A
2
number is chosen randomly from the range `[1..<mod>]' and returned.
38
5
4
4
2
Syntax:  abs (num <x>)   => num
2

2
Returns the absolute value of <x>.  If <x> is negative, then the result
2
is `-<x>'; otherwise, the result is <x>.
38
5
4
2
2
*forward*
2
min()
38
5
4
6
2
Syntax:  min (num <x>, ...)   => num
2
         max (num <x>, ...)   => num
2

2
These two functions return the smallest or largest of their arguments,
2
respectively.  All of the arguments must be numbers; otherwise `E_TYPE' is
2
returned.
38
5
4
10
2
Syntax:  toobj (<value>)   => obj
2

2
Converts the given MOO value into an object number and returns that object
2
number.  The conversions are very similar to those for `tonum()' except
2
that for strings, the number *may* be preceded by `#'.
2

2
    toobj("34")       =>   #34
2
    toobj("#34")      =>   #34
2
    toobj("foo")      =>   #0
2
    toobj({1, 2})     -error->   E_TYPE
38
5
4
14
2
Syntax:  tonum (<value>)   => num
2

2
Converts the given MOO value into a number and returns that number.  Object
2
numbers are converted into the equivalent numbers, strings are parsed as the
2
decimal encoding of a number, and errors are converted into numbers obeying the
2
same ordering (with respect to `<=' as the errors themselves.
2
`tonum()' returns `E_TYPE' if <value> is a list.  If <value>
2
is a string but the string does not contain a syntactically-correct number,
2
then `tonum()' returns 0.
2

2
    tonum(#34)         =>   34
2
    tonum("34")        =>   34
2
    tonum(" - 34  ")   =>  -34
2
    tonum(E_TYPE)      =>    1
38
5
4
15
2
Syntax:  tostr (<value>, ...)   => str
2

2
Converts all of the given MOO values into strings and returns the concatenation
2
of the results.
2

2
    tostr(17)                  =>   "17"
2
    tostr(#17)                 =>   "#17"
2
    tostr("foo")               =>   "foo"
2
    tostr({1, 2})              =>   "{list}"
2
    tostr(E_PERM)              =>   "Permission denied"
2
    tostr("3 + 4 = ", 3 + 4)   =>   "3 + 4 = 7"
2

2
Note that `tostr()' does not do a good job of converting lists into
2
strings; all lists, including the empty list, are converted into the string
2
`"{list}"'.
38
5
4
14
2
Syntax:  typeof (<value>)   => num
2

2
Takes any MOO value and returns a number representing the type of <value>.
2
The result is the same as the initial value of one of these built-in variables:
2
`NUM', `STR', `LIST', `OBJ', or `ERR'.  Thus, one
2
usually writes code like this:
2

2
    if (typeof(x) == LIST) ...
2

2
and not like this:
2

2
    if (typeof(x) == 3) ...
2

2
because the former is much more readable than the latter.
38
5
4
15
2
Syntax:  clear_property (obj <object>, str <prop-name>)  => none
2
      is_clear_property (obj <object>, str <prop-name>)  => boolean
2

2
These two functions test for clear and set to clear, respectively, the property
2
named <prop-name> on the given <object>.  If <object> is not valid,
2
then `E_INVARG' is returned.  If <object> has no non-built-in property
2
named <prop-name>, then `E_PROPNF' is returned.  If the programmer
2
does not have read (write) permission on the property in question, then
2
`is_clear_property()' (`clear_property()') returns `E_PERM'.
2
If a property is clear, then when the value of that property is queried the
2
value of the parent's property of the same name is returned.  If the parent's
2
property is clear, then the parent's parent's value is examined, and so on.
2
If <object> is the definer of the property <prop-name>, as opposed to
2
an inheritor of the property, then `clear_property()' returns
2
`E_INVARG'.
38
5
4
2
2
*forward*
2
clear_property()
38
5
5
38
5
5
38
4
4
1
2
Builtin Function Help
38
5
4
32
2
A help database (in the sense of anything that is usable by $player:help()) is any object having the following two verbs:
2

2
  :find_topics(string)
2
     returns a list of strings or some boolean false value.
2

2
  :get_topic(string)
2
     given one of the strings returned by :find_topics this either
2
     returns a list of strings (text to be spewed to the player) or
2
     returns 1 to indicate that it has already taken care of printing
2
     information to the player.
2

2
$player:help() consults any .help properties that exist on the player, its ancestors, player.location and its ancestors (in that order).  These properties are assumed to have values that are objects or lists of objects, each object itself assumed to be a help database in the above sense.  The main help database ($help) is placed at the end of the list of databases to be consulted.
2

2
The Generic Help Database (this object) is the standard model help database of which the actual help database itself ($help) is an instance.  On help databases of this type, every help topic has a corresponding property, interpreted as follows:
2

2
this.(topic) = string           - one-line help text.
2
this.(topic) = {"*verb*",@args} - call this:verb(@args) to get text
2
this.(topic) = any other list   - multi-line help text
2

2
For the {"*verb*",...} form, the current verbs available are
2

2
  {"*forward*", topic2, @rest}   
2
     - get topic2 help text and then append rest.  
2
       rest may, in turn, begin with a "*verb*"...
2

2
  {"*subst*", @lines} 
2
     - all occurences of %[exp] in lines are replaced with value of exp.  
2
       exp is assumed to evaluate to a string.  Evaluation is done using 
2
       $no_one's permissions so exp can only refer to public information.
2

2
  {"*index*"}
2
     - returns a list of all topics in this database, arranged in columns.
38
5
4
2
0
65428
0
750669221
2
1
#31
New-Prog-Log

0
38
47
-1
-1
46
-1
16
7
init_for_core
2
173
-1
receive_message
38
173
-1
display_seq_headers display_seq_full
38
173
-1
from_msg_seq
38
173
-1
to_msg_seq
38
173
-1
%to_msg_seq subject_msg_seq
2
173
-1
%from_msg_seq
2
173
-1
0
18
5
38
5
0
0
38
1
4
0
38
0
0
1
38
5
2
%n (%#) can't send to moderated list %t (%[#t]) directly.
38
5
4
0
38
5
4
0
38
5
4
1
1
2
38
1
4
2
1
2
1
31
38
1
0
2592000
38
5
0
0
38
1
4
0
38
0
5
38
5
5
38
5
5
38
4
4
3
2
New-Prog-Log
2
New_Prog_Log
2
NPL
38
1
2
Record of who's been made a @programmer.
38
5
4
2
0
44304
0
750756205
2
1
#32
Generic Help Database

144
38
-1
-1
-1
1
61
17
10
find_topics
2
165
-1
get_topic
2
165
-1
sort_topics
38
173
-1
columnize
38
173
-1
forward pass
38
165
-1
subst
38
173
-1
index
38
173
-1
initialize
2
173
-1
verbdoc
2
173
-1
dump_topic
2
165
-1
1
index
5
4
0
38
5
5
38
4
4
1
2
Generic Help Database
38
5
2
A help database of the standard form in need of a description. See `help $generic_help'...
38
5
4
2
0
7944
0
750670916
2
1
#33
Generic Guest

16
38
-1
-1
-1
6
-1
4
18
@password
2
93
-2
boot
2
173
-1
disfunc
2
173
-1
defer
2
173
-1
mail_catch_up
2
173
-1
create
38
89
-2
eject
38
173
-1
log
38
173
-1
confunc
2
173
-1
log_disconnect
2
165
-1
@last-c*onnection
2
29
-1
connection_name_hash
2
173
-1
my_huh
2
173
-1
@read
38
89
-2
set_current_folder
38
173
-1
@request*-character @register
2
89
11
init_for_core
2
173
-1
set_name set_aliases
2
173
-1
4
default_gender
default_description
request
extra_confunc_msg
61
2
neuter
38
1
4
1
2
By definition, guests appear nondescript.
38
1
0
0
2
0
2

38
5
4
0
38
1
5
2
0
5
38
5
5
2
0
5
2
1
0
0
38
5
5
38
5
5
38
1
5
38
1
5
38
0
5
38
1
5
38
5
5
2
1
0
79
38
1
5
38
4
5
2
0
5
2
0
5
38
5
5
38
4
5
38
5
4
0
38
4
0
30
38
4
5
38
5
5
38
5
5
38
5
5
38
5
5
38
5
5
38
5
2
%t (%[#t]) is a guest character.
38
5
5
38
5
5
38
5
5
38
4
5
38
4
5
2
1
0
0
2
0
5
38
5
5
38
5
5
38
5
5
38
5
5
38
5
5
38
5
5
38
5
5
38
5
5
38
5
5
38
5
0
0
2
0
5
38
5
0
1
38
5
5
38
5
5
38
5
5
38
5
5
2
1
5
38
4
5
38
4
4
1
2
Generic Guest
2
1
4
1
2
By definition, guests appear nondescript.
38
5
4
2
0
11509
0
750668629
2
1
#34
Mr. Spell

16
38
-1
-1
-1
39
-1
-1
19
description
38
173
-1
valid
38
173
-1
get_input
38
165
-1
guess_words
38
165
-1
strip_chars
38
173
-1
find_exact
38
173
-1
sort
38
173
-1
_every_key
38
173
-1
_suspend
38
173
-1
insert delete delete2
38
173
-1
add_word
38
173
-1
remove_word
38
173
-1
submit
38
173
-1
words
38
13
-1
purge_entire_database
38
173
-1
random
38
173
-1
help_msg
38
13
-1
init_for_core
2
173
-1
clear-submitted
38
141
4
11863
 worthl
 drive
 driver
 uns
 topi
 frien
 computa
entries
 activa
 messa
 locatio
 setti
 sett
 creati
 lambd
 rigoro
 rigo
 programmer
 harde
 redef
 redem
 keybi
 keyb
 buffe
 artifice
 horizont
 vertica
 automati
 trunc
 redr
 scrol
 connecti
 emac
 fris
 cyni
 interse
 corner
 headlin
 keyw
 tablesp
 irritat
 bonu
 intere
 graz
 dozen
 pastu
 rollin
 fields
 proofr
 foote
 locati
 times
 inser
 clipb
 savi
 unk
 faili
 faile
 missp
 playe
 zigz
 zes
 zer
 zen
 zea
 zealo
 Ze
 Zan
 zag
 za
 Yv
 Yuk
 Yug
 Yuc
 yu
 yt
 yout
 yourse
 yours
 Youngs
 youn
 Yos
 York
 yor
 yon
 Yoke
 yok
 yog
 Yod
 yip
 yi
 yest
 yes
 yeo
 yell
 yello
 yel
 yeas
 year
 yaw
 yarm
 Yard
 yar
 yap
 Yank
 yan
 Yam
 Yal
 Yak
 yac
 yachts
 ya
 xyle
 xy
 Xero
 Xer
 xen
 xe
 X
 wyn
 Wya
 Wy
 Wu
 wron
 Wrong
 wrongd
 wro
 write
 writ
 wris
 wrin
 wrig
 wri
 wres
 wrec
 wrea
 wreat
 wre
 wrat
 wrap
 wra
 wr
 wov
 woul
 wou
 Wort
 worsh
 worse
 wors
 worr
 worm
 worl
 worksh
 works
 workp
 workma
 workm
 workb
 Words
 wool
 woody
 woodw
 woods
 woodr
 woodla
 Woodl
 woodc
 Wood
 woo
 wonde
 wond
 won
 womb
 woma
 wolv
 Wolf
 wol
 wok
 woe
 witt
 withs
 withh
 withe
 withdra
 withd
 witc
 with
 wisp
 wish
 wise
 wis
 wire
 wiretapp
 wiret
 wirem
 wir
 Winte
 Wint
 wins
 Winnip
 Winni
 Winn
 wink
 wingm
 wing
 winem
 wine
 Winds
 windo
 windb
 wind
 Winch
 winc
 win
 Wilso
 Wils
 Wilm
 willow
 willo
 Willia
 Williams
 Willi
 Willa
 Will
 Wilkin
 Wilki
 Wilk
 Wilh
 wilf
 Wile
 wildc
 wild
 Wil
 wiggl
 wiggi
 Wigg
 wig
 wie
 widt
 wido
 widg
 wide
 wid
 wick
 wic
 whos
 whoo
 whom
 whole
 wholes
 whol
 who'
 whiz
 Whitt
 whiteh
 white
 whit
 whist
 whis
 whirl
 whir
 whipp
 whip
 whin
 whims
 whim
 whic
 whet
 wherew
 where'
 whereo
 wherea
 wher
 when
 whel
 wheez
 wheel
 whee
 Whea
 what'
 what
 Whar
 Whal
 wha
 wet
 western
 weste
 Wesl
 West
 Wert
 Were
 wer
 Wend
 Wen
 Welles
 Welle
 well
 Weld
 welc
 Wel
 weir
 Wein
 weight
 weig
 Wei
 weed
 week
 wed
 we'
 Web
 weathers
 weat
 weari
 wear
 weap
 wealt
 weal
 weak
 wea
 ways
 wayl
 wax
 wave
 wavel
 wavef
 wav
 watt
 waters
 waterm
 Waterl
 waterf
 Wate
 watchma
 watchm
 watc
 Wat
 waste
 wast
 wasp
 washbo
 washb
 wash
 wart
 warra
 warr
 warp
 warm
 wareh
 ware
 wardr
 ward
 war
 wap
 wang
 wand
 want
 waltz
 Walte
 Walt
 wallo
 walle
 Walla
 wall
 walko
 walk
 Waldo
 Wald
 Wal
 wakef
 Wak
 Wait
 wais
 Wain
 wai
 Wah
 wagg
 wag
 waf
 wad
 wack
 wac
 vu
 vow
 Vouc
 vou
 vot
 vorti
 vort
 vora
 vor
 volunta
 volun
 volume
 volum
 volu
 Voltai
 volta
 Volt
 voll
 volcani
 volc
 vol
 voic
 vog
 voca
 vocal
 vocab
 vocabu
 voc
 voi
 Vl
 vivi
 Viva
 vivaci
 vivac
 viv
 vitrio
 vitri
 vitr
 vita
 vit
 visit
 visio
 Visi
 viscou
 visco
 visce
 visc
 visa
 vis
 viru
 virtuos
 virtuosi
 virtuo
 virt
 virg
 Virgi
 Virgini
 virgin
 vir
 viole
 viola
 vio
 vint
 vine
 vind
 vin
 villa
 villai
 vill
 vil
 vii
 vigi
 vigila
 vig
 viewp
 Vietn
 Viet
 Vienn
 Vien
 view
 video
 vide
 vid
 victoria
 Victori
 Victo
 vict
 Vick
 vicin
 vici
 vice
 vica
 vic
 vibr
 vibrat
 vib
 via
 vie
 vexa
 vex
 veteri
 vete
 vet
 vestig
 vesti
 vest
 ves
 vertic
 verti
 verte
 verteb
 vert
 versa
 versat
 Vers
 Vero
 Verna
 vern
 vermo
 vermi
 verm
 verit
 veri
 verdi
 Verd
 verbo
 verba
 verb
 veran
 verac
 vera
 Ver
 Venu
 venture
 ventu
 vent
 venom
 veno
 Veni
 veng
 Venet
 venera
 vener
 vene
 vend
 ven
 velv
 velo
 vell
 vela
 Vel
 vei
 vehi
 veh
 vege
 veg
 veer
 vee
 vec
 ve
 Vaug
 Vaud
 Vau
 Vat
 Vass
 vase
 vas
 vari
 varie
 varian
 varia
 var
 vap
 vani
 Vander
 Vande
 Vand
 Vanc
 van
 vam
 valu
 vall
 valid
 vali
 Valer
 valen
 valedicto
 valed
 vale
 val
 vain
 vai
 vagi
 vaga
 vag
 Vad
 vacuol
 vacuo
 vacu
 vacc
 vaca
 vacat
 vac
 utt
 uto
 utili
 util
 uti
 uter
 ute
 Ut
 usurp
 usur
 usua
 USI
 USC
 usa
 U.
 Ursu
 Urs
 urina
 urin
 uri
 urge
 urgen
 urg
 uret
 ure
 Urb
 ura
 Urani
 uran
 ur
 upw
 upto
 Upt
 upsta
 upstat
 upst
 upsi
 upse
 ups
 uproa
 upro
 upri
 upr
 uppercl
 upperc
 upp
 upl
 uphols
 upho
 uphe
 uph
 upd
 upbr
 upb
 unive
 univa
 Univ
 unite
 unitar
 unita
 unit
 unis
 unip
 unim
 unif
 unid
 unde
 underc
 und
 unc
 unb
 unan
 una
 umb
 umbra
 umbr
 umbi
 um
 ulti
 ult
 ulc
 ul
 Ukr
 Uk
 ug
 ub
 tyra
 tyrann
 Tyranni
 tyr
 typog
 typo
 typi
 typho
 Typh
 type
 typew
 typesett
 typese
 types
 Typ
 two
 twitc
 twit
 twis
 twir
 twin
 twil
 twig
 twi
 twen
 twel
 tweed
 twee
 twe
 twa
 TW
 TV
 tuto
 tut
 Tusk
 tusc
 Tuscan
 Tus
 turt
 turp
 turno
 turne
 turna
 turk
 Turi
 turbo
 turbin
 turbid
 turbi
 turb
 turn
 tup
 Tunis
 Tuni
 tungs
 tung
 tune
 tun
 tumu
 tumb
 tum
 tula
 tul
 tug
 tuf
 Tuck
 Tuc
 tubu
 tuber
 tube
 tub
 TT
 tsa
 ts
 trut
 trust
 trus
 trun
 trumpe
 trump
 Trum
 Trud
 truc
 trua
 Trout
 troub
 troubles
 troubl
 trou
 tropos
 tropo
 troph
 trop
 trom
 trol
 trod
 tro
 trivia
 trivi
 triv
 trium
 triumpha
 triu
 trit
 trist
 Tris
 tripo
 triple
 Triplet
 tripl
 trip
 trio
 trini
 trinit
 trin
 trime
 trim
 trilo
 trill
 trilli
 tril
 trigo
 trig
 triflu
 trif
 trie
 trid
 trick
 trichl
 trich
 Tric
 tribut
 tribun
 tribu
 tribes
 tribe
 trib
 Triang
 Triangula
 triangu
 trian
 tria
 tri
 tres
 trend
 trenc
 trenche
 tren
 trem
 tree
 trea
 treat
 treasu
 treaso
 treas
 tread
 treac
 tre
 travers
 traversa
 traver
 travel
 trave
 trav
 trau
 Trash
 tras
 trapezo
 trape
 trap
 transver
 transv
 transshipp
 transs
 transpos
 transpor
 transpo
 transpl
 transpi
 transpa
 transp
 transo
 transmu
 transmi
 transmitte
 transmitta
 transmitt
 transmit
 transmis
 transm
 transl
 transiti
 Transit
 transi
 transg
 transfu
 transfo
 transfi
 transfe
 transferr
 transfere
 transf
 transe
 transd
 transcrip
 transcr
 transco
 transce
 transcende
 transcen
 transc
 transa
 trans
 tranq
 tran
 your
 tramp
 you'
 you
 yo
 tram
 ye
 yea
 y
 traito
 trait
 trainm
 work
 word
 traine
 wor
 wom
 wo
 trail
 wit
 train
 tragi
 wi
 trage
 trag
 who
 traffick
 traf
 whi
 whe
 tradi
 trades
 wh
 wes
 trade
 wee
 tract
 we
 wa
 track
 trace
 way
 was
 trac
 Toy
 toxic
 wan
 w
 vo
 tox
 townsm
 vi
 va
 v
 towns
 town
 usu
 towh
 use
 us
 up
 towe
 un
 unio
 towa
 uni
 u
 ty
 tour
 touc
 tur
 tu
 tou
 try
 tru
 totem
 tote
 tra
 trai
 trad
 tota
 tr
 tow
 tot
 tos
 tortu
 torto
 tort
 tors
 thing
 Torr
 torp
 Toroi
 telephone
 toro
 torn
 teams
 take
 Tor
 suppor
 Tops
 topol
 style
 topo
 statesm
 top
 toothp
 standa
 spend
 tooth
 toot
 specifi
 spaces
 sovi
 tool
 sourc
 too
 tons
 someti
 smalle
 toni
 size
 situa
 tong
 sincer
 ton
 tomog
 tomo
 tomm
 serve
 tomb
 send
 toma
 tom
 seem
 secur
 toll
 toler
 tole
 Tol
 say
 tok
 toile
 rul
 toi
 revie
 togg
 tog
 retu
 tof
 TOE
 resou
 require
 todd
 Toda
 tod
 requir
 Toba
 remai
 Tob
 toas
 relatio
 relati
 relate
 toad
 toa
 to
 relat
 regio
 TN
 recor
 recen
 Titu
 receive
 receiv
 reas
 titi
 titani
 reache
 reach
 tita
 Tit
 raisi
 tire
 tira
 raise
 Tir
 quickl
 tipp
 provide
 tip
 tint
 proposi
 propose
 tink
 programm
 ting
 profit
 productiv
 producti
 product
 Tin
 timo
 produci
 produce
 processi
 probab
 time
 price
 timbe
 timb
 tim
 presen
 tilt
 possi
 populat
 til
 Tigr
 tigh
 tig
 tif
 plann
 tie
 tide
 performa
 tid
 tickl
 tick
 tic
 particular
 tibe
 Tibet
 Tib
 Ti
 ours
 thyroi
 organiz
 thyro
 thyr
 order
 thym
 thy
 operati
 operate
 thw
 open
 Thur
 thunders
 thunderb
 thun
 thumb
 number
 thum
 thul
 numbe
 numb
 thug
 thu
 thrus
 thru
 never
 throw
 throu
 name
 thron
 names
 ms
 mrs
 throa
 thro
 movi
 move
 thrif
 thri
 month
 thres
 three
 threa
 threat
 thread
 thre
 thra
 thr
 membe
 thous
 meeti
 thought
 thoug
 medica
 thou
 matter
 matte
 markete
 thoro
 fucke
 fuck
 fuch
 Thorn
 manager
 thori
 Thor
 thom
 make
 makes
 Tho
 thist
 this
 thirte
 thirt
 longe
 locate
 thirs
 thir
 locat
 livin
 thio
 thin
 Thim
 thiev
 thie
 thicke
 thic
 thi
 leadsm
 leader
 they'
 they
 Thet
 larges
 these
 thes
 keys
 Thermo
 keep
 thermi
 therm
 thereu
 its
 issue
 theret
 involve
 involv
 thereo
 investo
 there'
 therefo
 interna
 theref
 inflati
 therea
 individual
 there
 thera
 increase
 ther
 include
 includ
 theore
 theoret
 theor
 theol
 Theod
 Theo
 thenc
 then
 them
 theis
 thei
 thea
 havi
 The
 tha
 that'
 that
 thank
 than
 give
 thall
 thal
 Thai
 getty
 Th
 textur
 general
 textu
 text
 texa
 Tex
 tetrahedra
 tetrah
 forme
 tetraf
 tetr
 tet
 followe
 testim
 testic
 testi
 find
 testam
 figure
 testa
 test
 tess
 feel
 tes
 territ
 terrif
 eyes
 experienc
 terri
 terre
 Terra
 executiv
 terr
 examp
 terp
 europea
 tern
 termin
 estat
 termina
 estab
 termi
 term
 espe
 employe
 tera
 ter
 electroni
 tep
 tenu
 effo
 educat
 tenta
 tent
 economic
 tensio
 earni
 tensi
 tens
 earl
 teno
 doors
 tenne
 Tenn
 dolla
 does
 tene
 tender
 tende
 tend
 deve
 tenac
 tena
 ten
 describe
 describ
 tempt
 departm
 deman
 tempor
 tempo
 defensi
 Temple
 templ
 tempe
 decisio
 tempes
 temper
 temperat
 decide
 tempera
 temp
 tem
 tell
 custome
 telev
 telety
 telet
 create
 teles
 telepro
 telepr
 countri
 telephon
 teleph
 corporati
 telepa
 telep
 corporat
 teleo
 telegrap
 teleg
 continui
 Telec
 continue
 tele
 tel
 consumer
 Tek
 Teh
 consume
 constructi
 teethe
 teeth
 teet
 computer
 compute
 teen
 companio
 tee
 tedi
 communicati
 Ted
 communicat
 tech
 technoc
 techno
 comin
 Technic
 techni
 techn
 tec
 tea
 citiz
 teasp
 tease
 teas
 tear
 team
 teak
 teac
 te
 cause
 taxp
 taxo
 taxi
 buy
 tax
 taw
 buildi
 tav
 taut
 tau
 bring
 tattl
 tatt
 tate
 tat
 bette
 taste
 tast
 benefit
 tass
 believ
 Task
 tas
 Tarta
 tart
 Tarr
 tarpa
 tarp
 avera
 avai
 taran
 tara
 tar
 associati
 tapp
 associat
 tapi
 aske
 tape
 tap
 arms
 Tao
 announce
 tanta
 annou
 tantal
 Tant
 amou
 american
 alw
 tangen
 tange
 tang
 Tana
 tan
 Tamp
 additio
 adden
 activ
 actio
 accordi
 tamar
 tama
 tam
 tally
 Tall
 talk
 tali
 tale
 talc
 tal
 takeo
 tak
 tail
 tai
 Tah
 tag
 Taff
 taf
 tad
 tactic
 tacti
 tact
 tack
 Taci
 tach
 tachi
 tac
 tabul
 tabu
 table
 tables
 tablea
 tabl
 tab
 ta
 T
 systemi
 sys
 syru
 syring
 syrin
 syri
 Syr
 synthes
 synth
 synta
 synt
 synops
 synop
 synon
 syno
 synergi
 syne
 syndi
 synd
 synch
 synchron
 sync
 syna
 synaps
 synap
 syn
 sympt
 sympo
 symph
 sympa
 symp
 symb
 symbo
 symbi
 sym
 Sylva
 Sylv
 Syll
 syllo
 sylla
 syllabi
 syl
 syco
 syc
 syb
 Sy
 swu
 sword
 swor
 swo
 Switz
 Switc
 switchb
 swit
 swish
 swis
 swir
 swing
 swin
 swim
 swig
 swi
 swelt
 swel
 sweet
 sweep
 swee
 Swede
 Swed
 Swea
 sweat
 swe
 swath
 swat
 Swarth
 Swart
 swar
 swank
 swan
 swamp
 swam
 swal
 swag
 swab
 swa
 sw
 suze
 suz
 Sut
 sust
 suspi
 suspe
 suspens
 suspen
 susp
 susc
 Susa
 Sus
 survi
 surve
 survey
 surv
 surt
 surro
 surre
 surr
 surp
 surm
 surj
 surge
 surg
 surfa
 surf
 sure
 surc
 sur
 supre
 supra
 supr
 suppressi
 suppr
 suppos
 suppo
 suppl
 supple
 supp
 superv
 superst
 supers
 supern
 superl
 superi
 superfl
 superf
 superb
 supe
 sup
 suntann
 sunt
 sunshi
 sunsh
 suns
 Sunn
 sunl
 sunk
 sung
 sunf
 sunde
 sund
 sunbu
 sunb
 sun
 summi
 summe
 Summa
 summat
 summar
 summ
 Sume
 Suma
 sum
 sulta
 sult
 Sull
 sulk
 sulf
 sulfu
 sulfi
 sulfa
 sul
 suit
 suic
 sui
 suggesti
 sugg
 sug
 suffr
 Suffo
 suffic
 suffi
 suf
 sue
 Suda
 Sud
 suck
 succ
 succu
 succe
 successi
 succes
 suc
 subv
 subu
 subtr
 subtle
 subtl
 subte
 subt
 subsume
 subsu
 substituti
 substitut
 substi
 substa
 substantia
 subst
 subsis
 subsid
 subsi
 subs
 submitt
 submi
 subm
 subl
 subje
 subj
 sub
 su
 Styr
 styli
 styl
 sty
 Stut
 stur
 stupe
 stupef
 stup
 stun
 stump
 stum
 stuf
 studi
 stude
 Stud
 stuc
 stubb
 stub
 Stu
 struc
 struct
 stru
 strop
 strong
 stron
 Strom
 strob
 stro
 striv
 strip
 strin
 strik
 strid
 strict
 strick
 Stric
 stri
 stres
 strep
 streng
 stren
 stree
 strea
 stream
 stre
 stra
 straw
 strato
 strategi
 strate
 strata
 strat
 strang
 stran
 straig
 strai
 strab
 str
 stowa
 stow
 story
 storm
 store
 stor
 stop
 stoo
 stone
 stonewa
 stonew
 ston
 stom
 stole
 stol
 Stok
 stoi
 stoc
 Stockh
 stock
 sto
 Stir
 stip
 stink
 sting
 stin
 stimula
 stimulat
 stim
 still
 stile
 stil
 stig
 stiff
 stif
 stic
 stickl
 sti
 Steward
 stewa
 stew
 Stevens
 Steven
 stev
 Stet
 stern
 stere
 ster
 Stephens
 Stephe
 Stepha
 steph
 step
 stenog
 steno
 stenc
 sten
 stel
 Stei
 steepl
 steep
 Steel
 stee
 stea
 stear
 steam
 stealt
 steal
 stead
 ste
 stay
 Staun
 stau
 statut
 statue
 statu
 stationa
 statio
 stati
 state
 statesma
 states
 stater
 Stat
 stas
 starv
 start
 starli
 starl
 Stark
 starc
 star
 Stapl
 staph
 stap
 stann
 stand
 stanch
 stanc
 stan
 stamp
 stami
 Stam
 stall
 stale
 stal
 stairw
 stair
 stai
 stagn
 stage
 stag
 Staf
 stad
 stac
 stab
 stablem
 stabl
 sta
 st
 SS
 squirm
 squire
 squir
 squi
 squee
 squea
 squeak
 sque
 squa
 squaw
 squatte
 squatt
 squat
 squas
 squal
 squad
 sq
 spy
 zig
 sput
 spur
 spun
 spum
 spu
 spru
 sprou
 Spro
 spring
 springt
 sprin
 sprig
 spri
 spre
 spra
 spr
 spou
 spot
 sportswrite
 sportswr
 sportsw
 sportsm
 sports
 sport
 spor
 spoon
 spook
 spoo
 spont
 spong
 spon
 spokesm
 spokes
 spoke
 spok
 Spoi
 spo
 splu
 splo
 splint
 splin
 spli
 splen
 splee
 sple
 spla
 splay
 splas
 spl
 spite
 spit
 spiri
 spir
 spino
 spinn
 spina
 spin
 spil
 spike
 spik
 spid
 spic
 spice
 spi
 sphero
 sphe
 spha
 sph
 Sperm
 Zu
 Zoro
 Zor
 zoo
 zom
 Zod
 zo
 zi
 zir
 zip
 Zio
 zin
 z
 sper
 spenc
 Spen
 spel
 speed
 spee
 specu
 spectros
 spectrog
 spectrograp
 spectro
 spectra
 spectr
 Specta
 spectac
 spect
 speck
 specif
 specie
 speci
 spec
 spea
 spear
 speak
 spe
 spa
 spay
 spat
 spas
 Spart
 spark
 spar
 spani
 span
 space
 spac
 sp
 soy
 sow
 sove
 sov
 southwe
 southw
 souther
 southea
 southe
 South
 sout
 sour
 soun
 soul
 soug
 sou
 sort
 sorro
 sorr
 Soren
 Sore
 sor
 sophom
 sophoc
 Sopho
 Sophi
 sophist
 sophis
 Soph
 Sop
 sooths
 sooth
 soot
 soo
 sonor
 Sono
 sonn
 songb
 song
 sona
 son
 Somm
 somew
 somet
 Somers
 somer
 someo
 someb
 some
 somb
 soma
 Somal
 som
 solve
 solv
 solut
 solu
 Solo
 solita
 solit
 solid
 solic
 solicito
 soli
 sole
 soldi
 sold
 sola
 sol
 soi
 softw
 soft
 sof
 sod
 Socr
 socke
 sock
 socio
 Socie
 socia
 soci
 soc
 sobr
 sob
 soaps
 soap
 soa
 so
 Sny
 snugg
 snug
 snuf
 snu
 snowf
 snow
 snor
 snoop
 snoo
 snob
 snobb
 sno
 snipp
 snip
 sniff
 snif
 Sni
 snee
 snea
 sne
 sna
 snar
 snapp
 snap
 snak
 snag
 sn
 Smy
 smut
 smug
 smud
 smu
 smoot
 smoo
 smoke
 smokes
 smok
 smo
 smith
 smit
 smi
 smel
 sme
 sma
 Smal
 sm
 slur
 slum
 slugg
 slug
 slu
 slow
 Slove
 slov
 slou
 sloth
 slot
 slop
 sloga
 slog
 sloa
 Slo
 sliv
 slit
 slipp
 slip
 slin
 slim
 slid
 slic
 sli
 slei
 sleet
 sleep
 slee
 sled
 sledg
 sle
 sla
 slavi
 slave
 slav
 slau
 slate
 slat
 slap
 sland
 slan
 slac
 sl
 skyw
 skyli
 skyl
 Sky
 skul
 skull
 sku
 skit
 skir
 skip
 skin
 skimp
 skim
 skil
 skid
 ski
 sket
 skel
 ske
 ska
 skate
 sk
 siz
 sixte
 sixt
 six
 situ
 sit
 Sisy
 Sist
 sis
 sire
 sir
 sinuso
 sinus
 sinu
 sink
 sini
 singlet
 singl
 Singa
 sing
 sinew
 sine
 Since
 sinc
 Sin
 simult
 simu
 simplic
 simpli
 simple
 simpl
 simp
 Simo
 Simm
 simi
 sim
 Silv
 silt
 sill
 silk
 silico
 silici
 silica
 sili
 sila
 sil
 Signo
 signi
 signa
 sign
 Sigm
 sigh
 sights
 sight
 sig
 sien
 Sieg
 Siege
 Sie
 side
 sidewi
 sidewa
 sidewal
 sidew
 sidest
 sides
 sider
 sidem
 sideli
 sidel
 sideb
 sid
 sickl
 sick
 Sici
 Sic
 sibl
 Sib
 sia
 Siam
 SI
 Shy
 shutt
 shuto
 shut
 shun
 shuf
 shud
 shu
 shrun
 shrug
 shrub
 shru
 shro
 shriv
 shrink
 shrin
 shril
 shri
 shrew
 Shre
 shra
 shr
 showp
 showm
 show
 shov
 shoul
 shou
 shot
 shorts
 shortc
 short
 shore
 shor
 shop
 shoo
 shoe
 shod
 Shoc
 sho
 shive
 shiv
 shirt
 shir
 shipma
 shipm
 Shipl
 shipbu
 shipb
 ship
 shin
 shim
 Shil
 shif
 shi
 Sherw
 sherr
 sheri
 sher
 shep
 shen
 Shelt
 Shell
 she'
 Shel
 Shei
 sheep
 shee
 Shed
 sheat
 Shear
 shea
 She
 sha
 shaw
 shav
 Shatte
 shat
 sharpe
 Sharp
 share
 shar
 Shap
 shant
 shan
 shamef
 shame
 sham
 shallo
 shall
 shal
 shake
 Shakespeare
 Shakes
 shak
 shagg
 shag
 Shaf
 shado
 shad
 shac
 sh
 sextu
 sext
 Sex
 Sewa
 sew
 Seve
 severa
 sever
 seven
 sevente
 sevent
 sev
 set
 ses
 servo
 servic
 servicem
 servi
 serv
 serpent
 serp
 seria
 seri
 serg
 serend
 sere
 Sera
 serap
 ser
 sequi
 seque
 seques
 sequen
 sequ
 seq
 sepu
 septu
 septi
 septe
 septa
 sept
 sepa
 separ
 sep
 senti
 sente
 sent
 sensu
 senso
 sensi
 sens
 Seno
 seni
 Sene
 sena
 sen
 Semit
 Semina
 seminar
 semin
 semi
 sema
 sem
 sell
 self
 seleni
 selena
 selen
 Selec
 selectm
 sele
 sel
 seiz
 seismog
 seismo
 seis
 sei
 segr
 Segm
 seg
 seep
 seed
 see
 seduc
 seduct
 sedu
 sedit
 sedim
 sedimenta
 sedi
 sede
 seda
 sed
 secu
 sect
 secreti
 secretari
 secreta
 secret
 secr
 seco
 secl
 sece
 sec
 seaw
 seat
 seaso
 seas
 searc
 sear
 sean
 seam
 seal
 seag
 seaf
 sea
 se
 Scyt
 scy
 scut
 scurr
 scur
 sculptu
 sculpt
 sculp
 scul
 scuf
 scu
 scrut
 scrupu
 scrup
 scru
 scro
 scriptu
 script
 scrip
 scrim
 scrib
 scri
 screwb
 screw
 screen
 screec
 scree
 scre
 scra
 scraw
 scrat
 scrap
 scram
 scr
 scour
 scou
 Scott
 Scots
 scot
 scorp
 scorn
 score
 scor
 scop
 scoo
 sco
 scl
 scient
 scie
 sci
 Schwa
 Schw
 Schuy
 Schum
 Schul
 Schu
 Schr
 school
 schoolm
 schoolg
 schoolb
 schoo
 schol
 Scho
 Schna
 schn
 Schm
 Schli
 schl
 schizop
 schiz
 schis
 schi
 schema
 schemat
 schem
 sche
 scha
 Sch
 scen
 scene
 sce
 scatt
 scat
 scarl
 scarf
 scare
 Scar
 scapu
 scap
 scant
 scandi
 Scanda
 scand
 scan
 scam
 scala
 scal
 scab
 sca
 sc
 saxon
 Saxo
 sax
 sawt
 sawf
 saw
 Savoy
 savo
 sava
 savan
 Savag
 sav
 saut
 Saul
 Saud
 Sauc
 sauce
 sau
 Saturn
 Satura
 saturat
 satu
 satisfa
 satis
 satir
 satia
 sati
 sata
 sat
 Sask
 Sash
 sas
 sars
 sard
 sarco
 sarca
 sarc
 sara
 Sar
 sapp
 sapi
 sap
 Santa
 Sant
 sanitar
 sanit
 sani
 sanguine
 sangu
 sang
 sandpi
 sandp
 Sande
 sandb
 sanda
 sand
 sancti
 sanct
 sanch
 Sanc
 sanat
 sana
 San
 Samu
 Samp
 samo
 sam
 salva
 Salvat
 salvag
 salv
 saluta
 salut
 salu
 salt
 saloo
 salo
 salm
 sall
 saliv
 Salis
 salin
 Sali
 salesm
 Sales
 Sale
 salam
 sala
 Sal
 sail
 Sai
 Sagit
 sagi
 sage
 sagac
 saga
 sag
 safe
 saf
 sadis
 sadi
 saddl
 sadd
 sad
 sacril
 sacrif
 sacri
 sacra
 Sacram
 sacr
 Sach
 sac
 Sabi
 Sabb
 sab
 sa
 s
 Ryd
 Ry
 Rutl
 Ruthe
 ruth
 rut
 rust
 russe
 Russ
 Rush
 rus
 rup
 runt
 Runn
 Rung
 runa
 run
 rump
 rumm
 Rum
 rui
 ruff
 ruf
 rue
 Rudy
 Rudo
 rudi
 rudd
 rud
 rubi
 Rube
 rubb
 rub
 ru
 roya
 roy
 Rowl
 Rowe
 row
 rout
 Rous
 roundh
 roun
 roug
 rough
 rou
 rotu
 roto
 Roth
 rotar
 rota
 Rot
 rost
 roset
 Rosenb
 Rosen
 roseb
 rose
 rosa
 Ros
 roose
 Roos
 room
 rook
 rooft
 roof
 roo
 Ron
 Rome
 Roma
 rom
 Rolli
 roll
 rol
 roi
 rog
 roe
 rode
 rod
 rocke
 rocka
 rock
 roc
 robo
 Robi
 Rober
 Robe
 robb
 rob
 roa
 roads
 roadb
 road
 ro
 river
 rive
 riva
 riv
 rit
 risk
 rise
 ris
 ripe
 rip
 riot
 Rio
 ring
 rin
 rim
 rill
 ril
 righ
 Rigg
 Rig
 riflem
 rifl
 rif
 Rie
 ridi
 Ridge
 ridg
 ridd
 rid
 rico
 Ricke
 rick
 Richa
 Rich
 ric
 ribos
 ribo
 rib
 ri
 rhyt
 rhy
 rhombi
 rhom
 rhodo
 Rhodes
 Rhode
 Rhod
 Rho
 rhino
 rhine
 rhi
 rheuma
 rheu
 rhet
 rheo
 rhen
 Rhe
 Rha
 rh
 Rey
 revv
 revolu
 revol
 revo
 reviv
 revisi
 revisa
 revis
 revi
 reversi
 revers
 reveren
 revere
 rever
 reven
 revela
 revel
 reve
 rev
 Reub
 Reu
 retrogre
 retrog
 retrofitt
 retrof
 retro
 retrie
 retri
 retr
 retir
 retina
 retin
 retic
 reticu
 reti
 rete
 retarda
 retar
 retal
 retai
 reta
 ret
 resur
 resum
 resul
 resu
 restra
 restr
 resto
 resti
 resta
 rest
 responsi
 respons
 respond
 respo
 respir
 respira
 respirato
 respi
 respe
 resp
 resor
 reson
 resol
 resolu
 reso
 resisti
 resis
 resin
 resig
 resid
 residua
 residu
 reside
 residen
 resi
 reserv
 reser
 resen
 resem
 rese
 resc
 res
 requis
 requi
 req
 reput
 repul
 repub
 repu
 rept
 repris
 repri
 repre
 repress
 repres
 repr
 repor
 repo
 repli
 reple
 repl
 repetitio
 repet
 reper
 repen
 repelle
 repell
 repel
 repea
 repeat
 repe
 repar
 repai
 repa
 rep
 rent
 reno
 rene
 rende
 rend
 rena
 ren
 Remu
 remor
 remo
 remitt
 remit
 remis
 remin
 remini
 remi
 remem
 remed
 remedi
 reme
 Rema
 reman
 rem
 relig
 relie
 relic
 reli
 rele
 rela
 rel
 rejo
 rej
 rein
 reim
 Rei
 rehe
 reh
 regul
 Regula
 regulat
 regu
 regrett
 regret
 regres
 regressi
 regr
 registra
 regist
 regis
 Regin
 Regim
 regiment
 regimen
 regi
 rega
 regal
 reg
 refut
 refug
 refu
 refra
 refrac
 refracto
 refr
 reflec
 refl
 refe
 referr
 referent
 referend
 referen
 referee
 refere
 refer
 ref
 Reev
 reed
 ree
 reduc
 redu
 Redst
 reds
 rede
 redd
 redb
 reda
 red
 recus
 recurr
 recur
 recu
 recto
 rectif
 recti
 recta
 rect
 recr
 recon
 reco
 recl
 reck
 recit
 reciproca
 recipr
 recip
 reci
 recessi
 reces
 recepti
 recep
 recei
 rece
 rec
 rebutt
 rebut
 rebu
 rebellio
 rebelli
 rebell
 rebel
 rebe
 Reb
 realt
 real
 read
 reac
 react
 rea
 re
 razo
 raz
 Ray
 raw
 ravi
 raven
 rave
 rav
 Rau
 rattl
 ratt
 ratio
 rati
 rate
 rat
 Rast
 rasp
 ras
 Rare
 rar
 rapt
 rapp
 rapi
 rap
 rans
 Ranki
 Rank
 range
 rang
 rando
 Rand
 ranch
 ranc
 ran
 rampa
 ramp
 Rama
 Ram
 ral
 rak
 raj
 rais
 rain
 rail
 rai
 rag
 raffi
 raff
 Raf
 radiu
 radioch
 radioc
 radioa
 radio
 radic
 radia
 radian
 radi
 Rad
 racke
 rack
 Rach
 race
 rac
 rab
 rabi
 rabbi
 rabb
 ra
 r
 quota
 quot
 quo
 quizz
 quiz
 quix
 quit
 quirk
 quir
 quip
 quinti
 quint
 quin
 quill
 quil
 quiet
 quie
 quicks
 quic
 qui
 questi
 ques
 quer
 quee
 Que
 qua
 quat
 quasi
 quas
 quartz
 quarti
 quarter
 quarte
 quart
 quarrym
 quarry
 quarre
 quarr
 quar
 quantit
 quanti
 Quant
 quan
 quali
 qualit
 qual
 Quak
 quai
 quadru
 quadrill
 quadril
 quadric
 quadri
 quadra
 quadrat
 quadran
 quadrang
 quadr
 quad
 quac
 qu
 Q
 pytha
 Pyt
 pyrox
 pyrol
 pyro
 pyri
 Pyre
 pyram
 pyra
 pyr
 Pyg
 py
 putt
 put
 puss
 push
 Pus
 purve
 purv
 pursu
 purs
 purpose
 purpo
 purp
 purl
 purit
 purin
 Puri
 purga
 purgati
 purg
 Purc
 purch
 pur
 puppy
 puppe
 pupp
 pupa
 pup
 punk
 puni
 pund
 punctua
 punct
 punc
 pun
 pumpk
 pump
 pum
 pulsa
 puls
 pulp
 pull
 Pul
 Pug
 puf
 Puer
 pue
 puddl
 puddi
 pud
 puck
 puc
 Pub
 public
 publ
 pube
 pu
 Pto
 ptA
 pt
 psyc
 psychoth
 psychot
 psychos
 psychoph
 psychopa
 psychop
 psychoanalys
 psychoan
 psychoa
 psycho
 psychia
 psychiatri
 psychi
 psy
 psa
 ps
 prud
 pru
 proxi
 proxima
 prox
 prow
 provoc
 provocati
 provo
 provis
 provin
 provid
 providen
 provi
 prove
 prover
 proven
 prov
 Prou
 protrus
 protru
 protr
 protoz
 protot
 protopl
 protop
 proto
 protesta
 protes
 proteo
 protecto
 protec
 protea
 prote
 prota
 prot
 prosti
 prost
 prosper
 prospec
 prosp
 prosod
 proso
 prosec
 prose
 proscr
 prosc
 pros
 pror
 propy
 proprio
 proprie
 propr
 propos
 propor
 propo
 propit
 propi
 prophet
 proph
 proper
 propel
 propelle
 propell
 prope
 propag
 propagan
 propa
 prop
 proo
 pronounc
 prono
 pron
 promp
 promo
 promisc
 promis
 promi
 promethe
 Promet
 Prome
 prom
 prolon
 prolo
 prolif
 proli
 prol
 Prok
 proj
 prohibiti
 proh
 progressi
 progre
 progra
 programme
 progr
 progn
 proge
 prog
 profus
 profu
 profi
 professo
 profe
 prof
 produ
 prodi
 prod
 proct
 Procru
 procr
 procla
 procl
 proces
 proced
 proce
 proc
 probl
 proba
 prob
 pro
 priz
 priva
 priv
 prism
 pris
 prio
 print
 princ
 Princi
 prince
 prin
 prime
 prima
 prim
 prig
 Prie
 prick
 pric
 pri
 preve
 preva
 prev
 Pret
 presump
 presu
 Presto
 presti
 prestig
 prest
 press
 presiden
 presi
 prese
 prescr
 presc
 Pres
 prepon
 prepo
 prepara
 preparati
 prepa
 prep
 premi
 premie
 prem
 prel
 preferr
 prefere
 prefer
 prefec
 prefe
 prefa
 pref
 preem
 preempti
 pree
 predic
 predict
 predica
 predi
 pred
 preco
 precis
 precipita
 precipit
 precip
 preci
 prece
 preca
 prec
 Prea
 pre
 pray
 pran
 prais
 prai
 Pragm
 pragmatis
 prag
 Prac
 practic
 practica
 pra
 pr
 power
 powe
 powd
 pow
 poun
 poul
 Pou
 Pott
 potenti
 pote
 potb
 potat
 potas
 pota
 pot
 postu
 postpr
 postpo
 postp
 posto
 postma
 postm
 posterio
 poste
 postc
 posta
 post
 posse
 possessi
 posses
 possem
 poss
 positi
 posi
 Pose
 pos
 portug
 Portu
 portray
 portrai
 portr
 porti
 portent
 porten
 porte
 porta
 port
 porp
 poro
 porn
 porc
 por
 populi
 popula
 popu
 popl
 pop
 Pool
 poo
 pontifi
 pontif
 ponti
 Pont
 ponde
 pond
 ponc
 ponch
 Pon
 pompo
 pompe
 pompa
 pomp
 pom
 polyt
 polyph
 Polyp
 polymo
 polyme
 polym
 Polyhe
 polyhedra
 polyh
 polygo
 polyg
 poly
 polon
 polo
 Pollut
 pollu
 pollo
 Poll
 polka
 polk
 politi
 polit
 polis
 polio
 polic
 police
 policem
 poli
 pole
 Polarog
 polarograp
 polaro
 polaris
 Polari
 polar
 pola
 Pol
 pok
 poiso
 pois
 point
 poin
 poi
 pog
 poet
 poe
 podi
 pod
 Pock
 poc
 po
 pneumo
 pn
 Ply
 pluton
 pluto
 Plut
 plush
 plus
 plun
 plumba
 plumb
 plum
 plugg
 plug
 pluc
 plu
 plow
 plo
 plia
 pli
 pleu
 plent
 pleni
 plen
 Plei
 pleb
 plea
 pleas
 ple
 playw
 playb
 play
 Platonis
 Platon
 plato
 platit
 plati
 plate
 plat
 plasti
 plast
 plasm
 plas
 planta
 plant
 plano
 plank
 planetari
 planeta
 planet
 plane
 plan
 plaint
 Plain
 plai
 plagu
 plagi
 plagia
 plag
 plac
 placen
 place
 placa
 pla
 pl
 piz
 pix
 piv
 Pitts
 Pitt
 piti
 pith
 pitc
 pit
 pistol
 pisto
 pist
 pisc
 Pis
 piro
 pira
 Pir
 piq
 pipe
 pip
 Pion
 pio
 pint
 Pins
 pinn
 pinki
 pink
 pinh
 pine
 pinc
 pin
 pim
 pillo
 pilla
 pill
 pilg
 pilf
 pile
 pil
 pigm
 piggi
 pigg
 pige
 pig
 piet
 pier
 piec
 pie
 pid
 pictu
 pict
 pico
 picnicke
 picnick
 picn
 Picket
 picker
 Picke
 pick
 picc
 Pica
 Pic
 pian
 piani
 pia
 pi
 physiot
 physio
 Physic
 phys
 Phyl
 phy
 phr
 photol
 photog
 phot
 phosphore
 phospho
 phosphi
 phosp
 phos
 phono
 phonem
 phone
 phon
 phoen
 Phoe
 pho
 phl
 philos
 philo
 Philip
 Phili
 philan
 phila
 Phil
 Phi
 pheny
 pheno
 phenomeno
 phenomena
 phenom
 phenol
 phen
 Phe
 Pha
 pharmaco
 phar
 phan
 phalan
 phal
 phag
 ph
 Pf
 pew
 petu
 pett
 petrol
 petro
 petri
 petr
 peti
 Peter
 Pete
 pet
 pestil
 pesti
 pest
 pess
 pessimi
 pes
 pervers
 perve
 perva
 pervas
 perv
 perus
 peru
 pertu
 perti
 pert
 persuas
 persu
 perspir
 perspic
 perspicu
 perspi
 persp
 persona
 perso
 persis
 persi
 Perse
 persev
 Persec
 pers
 perpe
 perpetua
 perpetu
 perpet
 perp
 permu
 permitt
 permit
 permis
 permi
 perme
 perma
 perm
 Perk
 perj
 peris
 periphe
 periph
 perip
 perio
 Peril
 peric
 Peri
 perfum
 perfu
 perform
 perfo
 perfi
 perfe
 perf
 pere
 percu
 perch
 perce
 percepti
 percep
 percen
 perc
 per
 Peps
 peppe
 pepp
 pep
 peo
 penur
 penu
 pente
 pentag
 pentago
 penta
 pent
 pensi
 pens
 penny
 penna
 penn
 penm
 penitenti
 penit
 peni
 penet
 pene
 pend
 penc
 penal
 pena
 pen
 pem
 pelv
 pelt
 pell
 pel
 Pegg
 Peg
 peep
 pee
 pedia
 pedi
 pede
 peda
 pedan
 pedag
 ped
 pecul
 pecu
 pect
 pec
 pea
 Peas
 pearl
 Pear
 Peal
 peak
 Peach
 peace
 peac
 Pe
 pay
 pawn
 paw
 pav
 paun
 Pauls
 Pauli
 Paul
 Pau
 Patte
 Patt
 patron
 patrol
 patrolm
 patroll
 patro
 patri
 patrio
 patrim
 patrici
 Patric
 Patria
 patr
 pati
 pathog
 patho
 path
 patern
 pater
 paten
 pate
 patc
 Pat
 pasto
 pasti
 Pasteu
 paste
 past
 passiv
 passio
 passi
 passe
 Passag
 passa
 pass
 pasc
 Pas
 particu
 partici
 participa
 partic
 parti
 part
 parso
 parsim
 parsi
 Pars
 Parr
 parol
 paro
 parliamenta
 parli
 parla
 parl
 parki
 Park
 parish
 paris
 pari
 parenthes
 parenth
 parenta
 paren
 pare
 parc
 parasi
 paras
 paraph
 parap
 paranoi
 paranoia
 paran
 parama
 param
 paralle
 parall
 paral
 parago
 parag
 parado
 paradig
 paradi
 parad
 parab
 parabolo
 para
 par
 papy
 papp
 paperw
 pape
 papa
 pap
 panto
 panthei
 panth
 pant
 panor
 pano
 panick
 pani
 pane
 pandem
 pande
 panda
 Pand
 pancr
 Panc
 pana
 pan
 pamp
 Pam
 Palo
 palm
 palli
 palladia
 Palla
 pall
 palin
 pali
 Paleo
 Pale
 palaz
 Palat
 pala
 pal
 Pak
 pair
 paint
 Pain
 pai
 pagea
 page
 pag
 padd
 pad
 Packa
 pack
 pacifi
 pacifis
 paci
 pace
 pac
 Pab
 Pa
 p
 oz
 oxy
 oxida
 oxi
 oxe
 oxa
 ox
 owl
 Owe
 ow
 ovi
 overt
 over
 oven
 ove
 ova
 ov
 ouz
 outl
 out
 our
 oug
 ou
 Otto
 Ott
 Oti
 oth
 otherw
 other
 ot
 ostra
 Ostrac
 ostr
 oste
 osteopa
 osteop
 osteo
 osten
 ost
 oss
 osmo
 osm
 Osi
 O'S
 oscilla
 osci
 osc
 Osb
 Os
 Orw
 orthop
 orthog
 orthodox
 orthodon
 orthod
 ortho
 orth
 ort
 Orpha
 orp
 Oro
 orna
 ornam
 orn
 Orl
 Orio
 Orin
 origina
 orig
 orie
 ori
 orga
 organ
 organi
 org
 Ores
 Oreg
 ore
 ordi
 orde
 ord
 orchi
 orche
 orc
 orbi
 orb
 oratori
 orato
 orat
 orange
 oran
 ora
 or
 opu
 optom
 opto
 optimi
 optima
 optim
 opti
 opth
 opt
 oppre
 oppressi
 oppr
 opposi
 oppos
 oppo
 opp
 opin
 opi
 opera
 operat
 operan
 oper
 Ope
 OPa
 opal
 op
 oo
 onto
 ont
 ons
 onr
 Onom
 ono
 onlo
 onl
 One
 onco
 onc
 on
 omnip
 omn
 omitt
 omit
 omi
 ome
 omb
 oma
 Om
 Oly
 Ols
 olivi
 Olive
 Oliv
 Olig
 oligo
 oliga
 oli
 ole
 olds
 Olde
 old
 ola
 Ol
 ok
 oil
 oilm
 oi
 ohm
 Oh
 ogr
 og
 ofte
 oft
 offsh
 offse
 offs
 officio
 officia
 official
 offici
 office
 offi
 offer
 offen
 offe
 off
 of
 oed
 Oe
 Ody
 odo
 O'D
 odi
 Ode
 od
 octo
 octi
 octe
 Octav
 octan
 octahedra
 octah
 octag
 octa
 oct
 O'Co
 O'C
 o'
 ocea
 oceani
 Oce
 occurre
 occurr
 occur
 occupa
 occup
 occul
 occu
 occlus
 occl
 occid
 occi
 occ
 oc
 obvi
 obv
 obtr
 obt
 obstr
 obsti
 obst
 obso
 obsessi
 obses
 observa
 observat
 obser
 obseq
 obse
 obsc
 obs
 obo
 obliv
 oblig
 obliga
 obli
 obl
 objec
 obj
 obf
 obe
 obd
 ob
 oat
 oas
 Oakl
 oak
 oa
 o
 nympho
 nym
 NY
 nutritio
 nutrit
 nutr
 nut
 nurs
 nur
 numis
 numi
 numero
 Numeri
 numera
 nume
 num
 nul
 nug
 nud
 nucle
 nucleol
 nucleo
 nuclei
 nuclea
 nuc
 nub
 nu
 now
 Novo
 novi
 Novel
 nove
 Nova
 nov
 nou
 notor
 noto
 notic
 noti
 note
 nota
 not
 nostra
 Nostr
 Nosta
 nost
 nose
 noseb
 nos
 Norwa
 Norw
 North
 northwe
 northw
 Northr
 northern
 norther
 northea
 northe
 Nort
 Norman
 normal
 norma
 Norm
 Nord
 Nor
 noon
 noo
 none
 nonc
 non
 nomo
 nomina
 nomi
 noma
 nom
 Nol
 noise
 noi
 Noe
 nodu
 nod
 noc
 nobo
 noblem
 nobl
 nobe
 Nob
 Noa
 NO
 NN
 nitrog
 nitroge
 nitro
 nitri
 nitr
 nit
 Nipp
 nip
 nio
 ninete
 ninet
 nine
 nin
 NIMb
 nim
 Nil
 Nik
 nihi
 nih
 nightm
 nightc
 night
 nigh
 nigg
 nige
 Nig
 Niel
 Nie
 nicot
 Nico
 nick
 Nichols
 Nicho
 Nich
 nice
 nic
 nib
 nia
 Ni
 Newto
 newt
 newspaperm
 newsp
 newsm
 news
 newl
 Newf
 Newe
 newc
 newb
 New
 neve
 neva
 Nev
 neutr
 neut
 neuros
 neurop
 neuron
 neuroa
 neuroana
 neuro
 neura
 neural
 neur
 neu
 nett
 Neth
 net
 nest
 nes
 nerv
 Ner
 nept
 nep
 neop
 neona
 neon
 neol
 neo
 Nels
 Nell
 Nel
 nei
 Negr
 nego
 neglige
 negli
 negl
 neg
 needl
 need
 nee
 nect
 necrom
 necromanc
 necr
 neckl
 neck
 nece
 necessi
 nec
 nebula
 nebu
 neb
 neat
 near
 Nea
 Ne
 Nd
 NC
 NB
 Nazi
 Naza
 Naz
 navi
 nave
 nava
 nav
 naut
 nausea
 naus
 nau
 natu
 natio
 nati
 Nath
 Nata
 Nat
 nast
 Nash
 nasA
 nas
 narra
 narr
 narco
 narci
 narc
 nar
 Napo
 nap
 Nan
 nam
 nak
 naiv
 Nair
 nai
 Nag
 nad
 Nab
 na
 N
 myt
 mysti
 myste
 myst
 mys
 myr
 myop
 myoc
 myo
 Myn
 Myel
 mye
 myco
 myce
 Myc
 My
 Muz
 mutu
 mutt
 mutin
 muti
 muta
 mutat
 mutan
 mut
 mustac
 musta
 must
 musl
 musko
 muske
 Musk
 musi
 mush
 muse
 musc
 muscu
 Musco
 mus
 murr
 murk
 Muri
 murd
 mur
 Muo
 munic
 muni
 munc
 Mun
 mum
 multit
 multiplica
 multiplicat
 multipli
 multiple
 multiplex
 multip
 mult
 mullig
 mulli
 Mulle
 mull
 mulc
 mul
 mugg
 mug
 muf
 mue
 muddl
 mudd
 Mud
 muc
 mu
 Mr
 mov
 Mouth
 mout
 mous
 mour
 mounta
 mount
 moun
 moul
 Mou
 mott
 moto
 motiv
 moti
 mothe
 moth
 mote
 mot
 moss
 mosq
 Mose
 Mos
 morti
 mortgage
 mortg
 morta
 mort
 mors
 morri
 Morris
 morr
 morpho
 morphi
 morphe
 morp
 moroc
 Moro
 mori
 morg
 Morel
 more
 mora
 moral
 mor
 Moor
 moonl
 Moon
 mood
 moo
 Montr
 Montev
 Monte
 Montag
 Monta
 mont
 monstr
 monst
 mons
 Monr
 monot
 monome
 monom
 monolo
 monol
 monog
 monoc
 mono
 monke
 monk
 monit
 monic
 Moni
 mong
 money
 monet
 mone
 Mona
 monast
 monas
 monar
 monad
 Mon
 mome
 momenta
 mom
 molybde
 moly
 molt
 molly
 molli
 Moll
 Moli
 molec
 mole
 Mold
 mola
 mol
 moist
 mois
 Moi
 Moha
 Moh
 Moe
 modula
 modu
 modi
 Modes
 moder
 mode
 mod
 mocke
 mock
 moc
 mobi
 mob
 moa
 mo
 mn
 mix
 mitt
 mitr
 mito
 mite
 Mit
 mist
 Misso
 Missis
 missio
 missi
 miss
 miso
 mise
 misce
 miscel
 misc
 misa
 mis
 mira
 mirac
 mir
 minute
 minutem
 minut
 minus
 minue
 minu
 minst
 minsk
 Mins
 mino
 Minne
 Minn
 minis
 minima
 minim
 mini
 mines
 Minera
 miner
 mine
 Mind
 minc
 min
 mimick
 mimic
 mimi
 Mime
 mim
 Milto
 Milt
 millio
 Milli
 millen
 millenn
 mille
 Mill
 milk
 militi
 milita
 militari
 militar
 milit
 mili
 miles
 mile
 mild
 mila
 Mil
 migrat
 migr
 migh
 mig
 midwi
 Midwes
 Midwe
 midw
 midst
 midsh
 mids
 midg
 Middlet
 middlem
 Middl
 midd
 Mid
 Micron
 micr
 Micke
 Mick
 Miche
 Micha
 Mich
 mic
 mias
 mia
 Mi
 Mex
 mett
 metrop
 metro
 metr
 meti
 methy
 Methu
 metho
 metha
 methan
 meth
 meteorit
 meteori
 meteo
 mete
 metap
 metamorpho
 metamorphi
 metam
 metallurgi
 metallu
 metallo
 metalli
 metall
 metal
 metab
 metaboli
 meta
 met
 messi
 mess
 meso
 mesc
 mes
 merry
 merri
 merrim
 Merr
 merl
 merit
 merid
 meri
 merg
 Mere
 merc
 mercuri
 mercu
 merch
 merce
 Merca
 Mer
 ment
 mensu
 mens
 meni
 mende
 menda
 mend
 mena
 men
 memora
 memoran
 memorab
 memor
 memo
 memb
 mem
 Melv
 melod
 melodr
 melodi
 melo
 mell
 meli
 melani
 Melan
 mela
 mel
 mei
 megaw
 megal
 megab
 mega
 meg
 meet
 mee
 medl
 Medit
 medio
 medicin
 medici
 medic
 media
 medi
 meda
 med
 mechanis
 mech
 mec
 meat
 meas
 meant
 mean
 meal
 mead
 meado
 mea
 me
 McNa
 McN
 McM
 McLe
 McL
 McKi
 McKen
 McKe
 McK
 McI
 McGra
 McGr
 McGo
 McGi
 McG
 McF
 McDon
 McDo
 McD
 McCon
 McCo
 McClu
 McCl
 McCa
 McCar
 McCal
 McC
 McA
 Mc
 Mb
 maz
 mayor
 mayo
 Mayf
 maya
 May
 Maxw
 Maxim
 maxima
 maxi
 max
 maw
 Mav
 Maurit
 Mauric
 Mauri
 Maur
 mau
 matu
 Matt
 Mats
 matro
 matri
 matrim
 matric
 matria
 matr
 matin
 mati
 Mathi
 Mathew
 Mathem
 Mathematic
 mathe
 math
 matern
 materi
 mater
 Mate
 matc
 mat
 masti
 maste
 mast
 massi
 Masse
 massac
 massa
 Mass
 masq
 Masoni
 Mason
 masoc
 maso
 Mase
 masc
 mas
 Mary
 Marve
 marv
 martyr
 marty
 Martini
 Martin
 martia
 Marti
 marte
 mart
 Marshal
 marsha
 Marsh
 mars
 marro
 marri
 Marria
 marr
 marque
 marq
 marm
 Marlb
 Marl
 marks
 Marko
 marke
 mark
 Marj
 marit
 marion
 Mario
 marina
 marin
 Marie
 Maria
 Mari
 margina
 margi
 Marga
 marg
 Marcel
 Marce
 Marc
 mara
 mar
 map
 Mao
 manumit
 manum
 Manu
 mantl
 mantis
 manti
 mant
 Manse
 mans
 mano
 mann
 manip
 manife
 manif
 mania
 maniac
 mani
 manh
 mange
 mang
 mane
 mandr
 manda
 mandat
 mand
 Manage
 manag
 mana
 man
 mamma
 mammal
 mamm
 mam
 malto
 Malt
 malp
 Malon
 Malo
 maln
 mallo
 malle
 mall
 malig
 malic
 mali
 malfo
 malf
 male
 Maldi
 mald
 malcon
 malc
 Mala
 Malay
 malar
 malada
 malad
 mal
 mak
 maje
 maj
 maint
 mains
 mainl
 Main
 mailm
 mail
 Maid
 maide
 mai
 Maho
 maha
 Mah
 Magnu
 magnif
 magni
 magneti
 magnet
 magnes
 magne
 magna
 magnan
 magn
 magis
 magic
 magi
 maggo
 magg
 Mag
 Mae
 mads
 madri
 Madr
 madm
 Madel
 Made
 Madd
 Madam
 mada
 Mad
 macros
 macrom
 macr
 mackina
 Macki
 macke
 MacK
 machine
 machin
 machi
 Mach
 Maced
 Mace
 MacD
 maca
 mac
 Ma
 m
 lyse
 lys
 lyr
 Lync
 Lyn
 lympho
 lymp
 lym
 Ly
 luxuri
 luxuria
 luxu
 Luxe
 lux
 Luth
 lute
 lut
 lust
 lus
 lur
 lung
 Lund
 lunc
 luna
 lunat
 lunar
 lun
 lump
 lumino
 lumina
 lumi
 lumb
 lumberm
 lumbe
 lum
 lull
 lul
 luk
 lugg
 luge
 lug
 Luf
 Lud
 Lucret
 Lucre
 lucr
 luck
 lucia
 Luci
 Luc
 Lub
 lubrici
 lubrica
 lubr
 Lu
 l'
 loya
 loy
 Lowe
 low
 lovela
 Lovel
 lov
 Louv
 louse
 lous
 Loun
 Loui
 louds
 loud
 lou
 Lotte
 lott
 lot
 loss
 los
 Loren
 Lore
 lord
 lor
 loquac
 loq
 lops
 Lope
 lop
 loos
 loop
 Loom
 look
 loo
 longit
 longi
 longh
 long
 lone
 lon
 Lomb
 Lomba
 Lom
 loll
 lol
 Loin
 loi
 logic
 logi
 logg
 logar
 loga
 Log
 lof
 loe
 lodg
 lod
 locus
 locu
 locom
 locomoto
 locomoti
 loco
 Lockh
 Lock
 loca
 local
 loc
 lobu
 lobs
 lob
 loat
 loam
 loa
 lo
 liz
 Livi
 live
 Liverp
 Liver
 liv
 litu
 litto
 littl
 litt
 litiga
 liti
 lithos
 lithog
 litho
 lithi
 lith
 literat
 lite
 lit
 list
 Lis
 liqui
 lique
 liquef
 liq
 lipsc
 Lips
 lip
 lione
 Lio
 Lino
 link
 lingua
 lingu
 linge
 ling
 linem
 linea
 line
 Linds
 Lindb
 Lind
 Lin
 limp
 limi
 lime
 limb
 Lim
 Lilli
 Lill
 Lila
 lil
 lik
 lign
 lighth
 ligh
 Ligg
 Liga
 lig
 LIFe
 lifes
 lifeb
 lif
 lieu
 Lie
 lice
 licens
 licen
 lic
 Libret
 libre
 libra
 librar
 libr
 libi
 libert
 Libera
 liber
 libel
 libe
 lib
 lia
 li
 Lexic
 lexico
 lex
 lew
 Levit
 Levin
 Levi
 lever
 leve
 lev
 leu
 lette
 letterm
 lett
 Letha
 leth
 let
 Lest
 lesso
 lesse
 less
 les
 lep
 Leop
 leoni
 Leonar
 Leona
 Leon
 Leo
 lenti
 Lent
 Lenn
 Lenin
 Leni
 leng
 Len
 lemo
 lemm
 lem
 leit
 Leig
 Lei
 Leh
 legu
 legit
 legis
 legi
 legg
 legen
 lege
 legate
 legat
 lega
 leg
 lef
 leew
 leer
 lee
 led
 lect
 lech
 lec
 Lebe
 leba
 Leb
 Lea
 Leaven
 leav
 leat
 lease
 leas
 lear
 leap
 Lean
 leak
 leaf
 leads
 leade
 lead
 leac
 le
 lazy
 laz
 layo
 laym
 lay
 lax
 laws
 lawr
 lawma
 lawm
 lawg
 lawb
 law
 lava
 lav
 Laurent
 Lauren
 laure
 laur
 laund
 laun
 laug
 Laud
 lauda
 lau
 latt
 latitudi
 latit
 latin
 Lati
 lath
 latera
 later
 late
 lat
 lass
 lasc
 las
 laryng
 lary
 larv
 Lars
 Lark
 larg
 Lare
 larc
 lar
 lape
 lap
 Lao
 lanth
 lant
 lank
 langui
 langu
 Lang
 lands
 land
 lanca
 Lanc
 Lan
 lamp
 lami
 lamen
 lame
 lamb
 Lama
 Lam
 Lak
 laid
 Lai
 Lagr
 Lago
 lag
 lady
 lad
 lacun
 lacu
 lact
 lack
 Lacer
 lace
 lac
 labr
 labor
 labo
 labil
 labia
 labi
 Lab
 la
 l
 Ky
 Kur
 kud
 ku
 Kru
 Kris
 Kri
 Kre
 Kra
 krau
 Krak
 Kr
 Kowa
 Kow
 Kor
 Kon
 kol
 Koe
 Koda
 kod
 Koc
 Ko
 Knut
 Knud
 Knuc
 knu
 Knox
 Knowle
 Knowled
 knowl
 know
 knott
 Knot
 knoc
 knob
 kno
 Knig
 knic
 Kni
 knee
 kne
 kna
 knap
 Kn
 Kle
 kla
 Kl
 kiw
 kiv
 kitte
 kitt
 kitc
 Kit
 Kirk
 Kirc
 Kir
 Kio
 kink
 Kings
 king
 kines
 kine
 kind
 kin
 Kimb
 Kim
 kill
 kil
 Kie
 kidna
 kidnapp
 kidn
 kidd
 Kid
 kic
 kib
 ki
 Kha
 kh
 keyne
 Keyn
 key
 kett
 keto
 ketc
 ket
 kes
 kerr
 kern
 Ker
 kep
 Keny
 Kent
 Kenne
 Kenn
 Ken
 kell
 Kelle
 Kel
 Keen
 keel
 kee
 kea
 Ke
 kay
 Kau
 Kath
 Kat
 Kara
 Kar
 kap
 kao
 kan
 kam
 Kalm
 kalei
 kale
 kal
 Kaf
 Kab
 Ka
 K
 jux
 jut
 Justin
 justic
 justi
 jus
 jurisp
 juris
 juri
 jura
 Jur
 junke
 junk
 juni
 June
 Junc
 junct
 jun
 jump
 jumb
 jum
 Julie
 Juli
 Jule
 Jul
 Juk
 juj
 jui
 jugg
 jug
 Judic
 judicia
 judici
 judica
 judicat
 judi
 Juda
 Jud
 jub
 jua
 Ju
 Joy
 jow
 Jovi
 Jov
 journeym
 journe
 journa
 jour
 jou
 Jose
 Josep
 Jos
 Jorgen
 Jorg
 Jor
 Jona
 Jon
 joll
 Jol
 joi
 Johnst
 Johns
 John
 Joha
 Johans
 Johann
 Johanne
 Joh
 jogg
 jog
 Joe
 jocu
 jock
 joc
 job
 Joan
 Joann
 Joa
 Jo
 jit
 jin
 jimm
 Jim
 jil
 jigg
 jig
 ji
 Jewel
 Jewe
 jew
 jet
 Jesu
 jess
 Jessi
 Jes
 Jero
 jerk
 Jere
 Jerem
 Jer
 jeo
 jenni
 Jenn
 Jen
 jel
 jej
 Jef
 Jea
 Jean
 jeal
 je
 jaz
 jaw
 jav
 jau
 jas
 jar
 Jap
 Janu
 janit
 jani
 Jane
 Jan
 Jame
 Jam
 jak
 Jai
 jag
 Jacq
 Jacobs
 Jacobi
 Jaco
 JACk
 Jacks
 jacka
 jac
 jab
 Ja
 j
 Iva
 Iv
 it'
 iti
 ite
 Itali
 ita
 It
 Ist
 iss
 Israeli
 Isr
 isot
 isomo
 isom
 Isol
 isoc
 isoch
 iso
 isla
 islam
 Isl
 Isin
 isi
 Isab
 Isaa
 Isa
 Is
 Irv
 irrit
 irri
 irreve
 irrev
 irresp
 irresolu
 irreso
 irres
 irrepro
 irrepr
 irrep
 irrem
 irrede
 irreden
 irred
 irrec
 irreco
 irre
 irra
 irr
 Iron
 irons
 iro
 irk
 Irishm
 Irish
 Iris
 iri
 Ire
 Ira
 Ir
 ips
 ip
 iono
 ion
 iodin
 iodi
 iod
 io
 involu
 involut
 invol
 invo
 invite
 invit
 invio
 invi
 investi
 inves
 invert
 invers
 inver
 invento
 inventi
 inven
 invei
 inve
 inva
 invas
 invar
 invali
 inval
 inv
 inu
 intuiti
 intu
 intrus
 intru
 introv
 introd
 introduct
 intro
 intric
 intri
 intra
 intran
 intr
 intox
 inton
 intol
 into
 intima
 intimat
 inti
 intes
 interve
 interv
 interst
 inters
 interrupti
 interru
 interro
 interr
 interpr
 interpo
 interpola
 interp
 intern
 intermi
 interm
 interi
 interfere
 interf
 interce
 interc
 inter
 intent
 intensi
 intens
 intend
 inten
 intem
 intellige
 intelli
 intelle
 intel
 integ
 integra
 integr
 inte
 inta
 int
 insur
 insupp
 insup
 insula
 insul
 insuf
 insub
 insu
 instrum
 instruc
 instr
 instit
 instin
 instil
 insti
 inste
 insta
 instan
 instal
 inst
 inspi
 inspe
 insp
 insom
 insolv
 insol
 inso
 insis
 insin
 insign
 insigh
 insig
 insid
 insi
 insen
 insec
 insect
 inse
 inscri
 insc
 insa
 ins
 inquisiti
 inquis
 inquir
 inqui
 inq
 inp
 inor
 inope
 inop
 ino
 innu
 innoc
 inno
 inna
 inn
 inm
 inla
 inl
 ink
 injur
 injun
 Inju
 inj
 init
 iniq
 inim
 ini
 inhu
 inhom
 inho
 inhibito
 inhi
 inheri
 inhere
 inhe
 inha
 inhal
 inhab
 inhabita
 inh
 ingra
 ingrati
 ingrat
 ingr
 ingesti
 inges
 Ingen
 ingenu
 inge
 ing
 infusi
 infus
 infu
 infra
 infr
 informat
 informa
 info
 influe
 influent
 influ
 infle
 infla
 inflate
 inflat
 inflam
 inflammat
 inflamm
 infl
 infir
 infinitu
 infinite
 infin
 infim
 infi
 infes
 inferr
 infern
 infere
 infer
 infel
 infec
 infe
 infa
 infantrym
 infantr
 infan
 infam
 inf
 inext
 inexpli
 inexpl
 inexpe
 inexper
 inexp
 inex
 ines
 inerti
 inert
 iner
 inequit
 inequi
 ineq
 inel
 ineffi
 ineffe
 inef
 ine
 industri
 indus
 indul
 induct
 induc
 indu
 Indoc
 indo
 individ
 indiv
 indist
 indispo
 indisp
 indisc
 indiscre
 indiscr
 indis
 indir
 indigna
 indign
 indige
 indiges
 indigen
 indig
 indica
 indic
 india
 Indian
 Indi
 Inde
 indet
 indes
 inden
 indel
 indefi
 indef
 indecis
 indeci
 indec
 ind
 incurre
 incurr
 incur
 incul
 incub
 incu
 incre
 incredu
 incred
 increa
 incr
 incorr
 incorp
 incor
 inconv
 incontr
 incont
 inconsid
 inconsi
 incons
 incong
 inconc
 incon
 incompreh
 incompr
 incompl
 incompa
 incomp
 incommu
 incomme
 incomm
 incom
 inco
 inclus
 inclu
 incli
 incl
 incis
 incid
 inci
 incest
 inces
 incep
 incen
 ince
 incar
 incapac
 incap
 incant
 incan
 inca
 Inc
 inbr
 inbo
 inb
 inaug
 inau
 inat
 inapt
 inapp
 inappro
 inappr
 inap
 inan
 inal
 inadv
 inade
 inad
 inactiv
 inact
 inacc
 inaccu
 inac
 ina
 in
 imput
 impul
 impu
 improvis
 improvi
 improv
 improp
 impro
 impri
 impressi
 impress
 impres
 impreg
 imprec
 impre
 impra
 impr
 impost
 impos
 importu
 importa
 impor
 impol
 impo
 implica
 impli
 imple
 impla
 implan
 impl
 impi
 impet
 impert
 impers
 imperm
 imperi
 imperc
 imper
 impen
 impelle
 impell
 impel
 imped
 impe
 impassi
 impas
 impar
 impal
 impa
 imp
 immun
 immu
 immor
 immodes
 immod
 immob
 immo
 immig
 immi
 immer
 immed
 imme
 imma
 immat
 imm
 imi
 imbr
 imb
 ima
 imagina
 imagi
 image
 im
 illust
 illusi
 illusio
 illus
 illum
 illumi
 illu
 illit
 illi
 illegit
 illegi
 ille
 ill
 I'
 Ili
 il
 ii
 ignora
 ignor
 igno
 igni
 ign
 ig
 if
 idy
 ido
 idiot
 idios
 idiom
 idi
 ideo
 iden
 idea
 ide
 Ida
 Id
 icosahedra
 icos
 icon
 icono
 ico
 Icel
 iceb
 ice
 IC
 ibi
 ibe
 ib
 ia
 I
 hysteri
 hystere
 hys
 hypothes
 hypothe
 hypotha
 hypoth
 hypot
 hypocrit
 hypocr
 hypoch
 hypoc
 hypo
 hypn
 hyph
 hype
 hyperb
 hyperbolo
 hyp
 hymn
 hym
 hygr
 hyg
 hydroxyl
 hydroxy
 hydrox
 hydros
 hydropho
 hydrop
 hydrol
 hydrog
 hydrochl
 hydroch
 hydroc
 hydro
 hydra
 hydran
 hydr
 hyd
 hya
 Hy
 Hux
 Hutchin
 Hutchi
 Hutc
 hut
 Hust
 husb
 husbandm
 hus
 hurt
 hurra
 hurr
 hurl
 hurd
 hur
 Hunt
 Hunga
 Hung
 hund
 hun
 hump
 humm
 humil
 humid
 humidi
 humi
 Humb
 huma
 hum
 hul
 Hugh
 Hugg
 hug
 Huf
 Hud
 huc
 hub
 Hube
 Hubb
 Hu
 hoyd
 hoy
 hows
 Howe
 How
 hov
 House
 housewi
 housew
 housebr
 houseb
 hous
 hour
 Houg
 houd
 Hou
 hoth
 hote
 hotb
 hot
 hoste
 host
 hospit
 hosp
 hos
 Hort
 horsew
 horsep
 horsem
 horsef
 hors
 horri
 horr
 horo
 Hornbl
 hornb
 horn
 hori
 hora
 Hor
 Hopk
 hope
 hop
 hoov
 Hoos
 hoop
 hook
 hoof
 hood
 hoo
 honora
 honorari
 honor
 hono
 honey
 hones
 hone
 hond
 hon
 homom
 homol
 homogene
 homog
 homo
 homic
 homi
 homew
 homes
 homeom
 homeo
 homem
 homebu
 homeb
 home
 hom
 holy
 holste
 Hols
 holog
 holoc
 Holo
 Holm
 holly
 Hollo
 Holli
 Holle
 holla
 Holl
 hole
 hold
 Hol
 hog
 Hof
 Hodge
 hod
 hock
 hoc
 Hobo
 hobby
 hobb
 Hob
 hoar
 hoag
 Hoa
 ho
 hith
 Hitc
 Hit
 histori
 histor
 histoc
 histo
 hist
 His
 hirs
 Hiro
 hire
 hir
 hippo
 Hippoc
 Hipp
 hip
 hint
 Hind
 hin
 Him
 Hilt
 hillm
 hill
 Hila
 hil
 highwaym
 highw
 highl
 highb
 high
 hig
 Hiero
 hiera
 hierar
 hie
 hideo
 hide
 hid
 Hic
 Hibe
 Hib
 Hiat
 hia
 Hi
 hey
 hexag
 hexa
 hex
 Hew
 Heus
 heu
 Hett
 Hete
 heteros
 heteroge
 heterog
 het
 Hess
 Hesi
 hesitat
 hes
 Hert
 Hersh
 hers
 herr
 herp
 heroin
 heroi
 Hero
 hermi
 Herme
 herma
 Herm
 heri
 hereu
 hereto
 heret
 hereina
 herei
 hered
 herea
 here
 herd
 Herc
 Herb
 Hera
 Her
 Hepa
 hep
 henri
 Henr
 Hendr
 Hend
 hench
 hence
 henc
 hen
 Hemp
 hemor
 hemo
 hemis
 hemi
 hem
 help
 helms
 helm
 Helle
 hell
 he'
 helio
 helic
 heli
 Hele
 Hel
 heir
 Hein
 height
 heig
 hei
 heg
 hef
 hee
 hedo
 hedg
 hed
 hect
 heck
 heca
 hec
 Hebr
 Hebe
 heb
 heavy
 heave
 heaven
 heav
 heathe
 heath
 heat
 heartb
 heart
 hears
 hear
 healt
 Heal
 head
 headwa
 headw
 headst
 headsm
 heads
 headli
 headl
 hea
 he
 hazel
 haze
 haza
 haz
 Hayd
 Hay
 Hawt
 Hawk
 Hawa
 Haw
 haven
 have
 hav
 haun
 haul
 haug
 hau
 Hatti
 Hatt
 Hath
 hate
 hatc
 hat
 haste
 hast
 hash
 has
 Harves
 harve
 harv
 Hart
 hars
 harri
 Harris
 Harr
 harp
 harmonic
 harmoni
 harmo
 harm
 Harle
 Harl
 hare
 hardwo
 hardw
 hardt
 hardbo
 hardb
 hard
 harb
 Hara
 har
 happe
 happ
 haploi
 hapl
 hap
 Hanso
 Hanse
 Hans
 Hanov
 Hano
 Hanna
 Hann
 Hanl
 Hank
 hango
 hangm
 hanga
 hang
 handym
 handy
 handwr
 handw
 hands
 handm
 handle
 handl
 handic
 handicrafts
 handicr
 handica
 handicappe
 handicapp
 handi
 handc
 handb
 hand
 Han
 Hamp
 Hammo
 hamm
 Haml
 hamb
 Ham
 Halve
 halv
 Hals
 halo
 Hallo
 Halle
 hall
 hali
 half
 Hale
 hal
 Hait
 hair
 hails
 hail
 hai
 hagg
 hage
 Hag
 hadr
 hadd
 Had
 hack
 hac
 habitu
 habitat
 habita
 habit
 habi
 Habe
 Haber
 hab
 Haa
 Ha
 h
 gyro
 gyr
 gyps
 gyp
 gym
 gymna
 gymnast
 gymn
 gy
 Gw
 Guy
 Gut
 Gustav
 Gusta
 Gust
 gus
 Gur
 guns
 gunp
 gunn
 gunm
 gunk
 gunfi
 gunf
 Gun
 gum
 Gull
 gul
 guilt
 guill
 guild
 guil
 guide
 guid
 gui
 guess
 gues
 guer
 Gue
 guardi
 guard
 guara
 guarante
 guar
 guani
 guan
 gua
 Gu
 Grum
 grub
 gru
 grown
 grow
 grov
 group
 groun
 grounds
 grou
 Grot
 Gross
 gros
 groo
 groc
 groa
 gro
 griz
 grit
 grist
 gris
 grip
 grind
 grin
 Grime
 Grima
 grim
 gril
 Grif
 griev
 grie
 grid
 gri
 grey
 Gret
 Gren
 greg
 Greenw
 greens
 greene
 Greenbe
 Greenb
 Green
 greed
 gree
 grea
 great
 greas
 gre
 gra
 gray
 gravi
 grave
 graves
 grav
 gratu
 grati
 grate
 grat
 grass
 gras
 graphi
 graph
 grape
 grap
 granula
 granu
 grant
 grani
 grands
 grandp
 grandn
 grandm
 grandi
 grandc
 grand
 gran
 grammar
 gram
 grain
 grai
 graf
 gradu
 grad
 grace
 grac
 gr
 gov
 gour
 Gou
 Gott
 Goth
 Got
 goss
 gosh
 gos
 gorge
 gorg
 Gore
 gord
 Gor
 gop
 goos
 goof
 Goody
 Goodw
 good
 goo
 Gonz
 gon
 Gold
 Goldst
 Golds
 goldf
 golde
 Gol
 gog
 Goe
 godw
 gods
 Godf
 godd
 God
 gobb
 gob
 goa
 Go
 gnom
 gnomo
 gno
 gna
 gn
 GM
 glyc
 glyco
 glyce
 glyceri
 glycerin
 gly
 glutami
 gluta
 glut
 glue
 glu
 glot
 glos
 glori
 gloria
 Glor
 gloo
 glom
 globu
 glob
 glo
 glit
 glis
 glim
 glid
 Gli
 Glend
 Glen
 glee
 glea
 gle
 gla
 glau
 glassw
 glass
 glas
 gland
 glan
 glamor
 glam
 gladi
 gladd
 glad
 glac
 glacia
 gl
 giv
 Giu
 girli
 girl
 gird
 gir
 ginsb
 Gins
 ging
 Gin
 gimb
 Gim
 Gille
 Gill
 Gile
 Gilb
 gil
 gigg
 giga
 gig
 gif
 Gidd
 gid
 gibb
 gibbo
 gibbe
 gib
 gia
 gian
 gi
 ghou
 gho
 ghe
 Gha
 gh
 Gett
 get
 gesta
 Ges
 gerundi
 geru
 germin
 germic
 germi
 germani
 germa
 Germ
 Gerh
 gerb
 Gera
 geral
 Ger
 George
 Geor
 geoph
 geop
 geom
 geog
 geode
 geodes
 geod
 geoc
 geoche
 geoch
 geo
 genu
 gentlem
 gentl
 gentil
 genti
 gent
 geno
 genit
 geni
 Genev
 genes
 genero
 genera
 gener
 gene
 gen
 Gemi
 gem
 gelat
 gela
 gel
 geig
 Gei
 gee
 ge
 gaz
 Gay
 gaw
 Gave
 gav
 Gaus
 gaun
 gaul
 Gauge
 gaug
 gauc
 gau
 gate
 Gat
 gastron
 gastr
 gast
 Gasp
 Gas
 Gart
 Garri
 garr
 garn
 garl
 gari
 garg
 Garde
 gard
 garb
 gar
 gap
 gant
 Gann
 gangli
 gangl
 Gang
 gan
 game
 gambi
 gamb
 Gam
 Galva
 galvani
 galv
 gallu
 gallow
 gallon
 gallo
 galli
 galle
 gallan
 galla
 Gall
 galen
 Gale
 Galat
 galac
 gala
 gal
 Gait
 Gaine
 Gain
 gail
 Gai
 gagg
 gag
 gaf
 gadg
 gad
 Gabr
 gabb
 gab
 ga
 G
 fuz
 fut
 fuss
 fusi
 fuse
 fus
 furth
 further
 furtherm
 furt
 furr
 furni
 furn
 furlo
 furl
 fur
 funn
 fungi
 fung
 fune
 fund
 functo
 functi
 func
 fun
 fumi
 fum
 full
 ful
 Fuj
 fug
 fuc
 Fu
 FT
 Fry
 frustr
 frus
 frui
 Fru
 froz
 frow
 frot
 frostb
 fros
 frontiers
 fronti
 fronta
 fron
 fro
 friv
 frit
 fril
 Frigi
 frigh
 Frig
 fried
 Frie
 Fric
 fria
 fri
 Frey
 Freu
 Fresn
 freshm
 fresh
 fresc
 fres
 frenc
 Frenchm
 Fren
 freew
 Freet
 freem
 freeh
 freedm
 freed
 free
 Frederick
 Frede
 Fredd
 Fred
 frea
 fre
 fra
 fraz
 fraud
 frau
 frat
 frankfu
 Frankf
 Frank
 Franco
 Francisc
 Francis
 Franci
 France
 franc
 fran
 frame
 fram
 frai
 fragmenta
 fragm
 frag
 frac
 fracti
 fraction
 fr
 foxho
 foxh
 fox
 fourte
 fourt
 fours
 four
 founta
 fount
 found
 foun
 foul
 fou
 fost
 foss
 fossi
 fos
 fortun
 fortu
 fortr
 forti
 forth
 Forte
 fort
 forsa
 fors
 formu
 formic
 Formi
 formatt
 format
 formal
 forma
 form
 fork
 forgo
 forgi
 forgett
 forget
 forge
 forg
 forfei
 forf
 fores
 fore
 Ford
 force
 forc
 forbo
 forbidd
 forbi
 Forbea
 forbe
 forb
 fora
 for
 fop
 footw
 foots
 footpa
 footp
 footm
 footb
 foot
 fool
 food
 foo
 Fonta
 Font
 fond
 fon
 follo
 folli
 foll
 folks
 folk
 folia
 foli
 Fold
 fol
 foi
 fogg
 Fog
 focu
 foc
 foa
 foam
 fo
 FM
 fly
 flut
 flus
 fluorid
 fluori
 fluore
 fluo
 fluf
 flue
 flu
 flowe
 flow
 flour
 floun
 flou
 flot
 Florid
 flori
 Flore
 Flora
 flor
 flop
 floor
 flood
 floodl
 floo
 flog
 floc
 flo
 flirta
 flir
 flip
 flint
 flin
 fli
 flexu
 flex
 Flet
 fles
 flem
 flee
 fledg
 fled
 flea
 fle
 flax
 flau
 flatu
 flatt
 flat
 flash
 flas
 Flan
 flam
 flak
 flai
 flags
 flage
 flag
 fla
 fl
 fiz
 fix
 fiv
 Fitz
 Fitc
 Fit
 fist
 fissi
 fiss
 Fisk
 fisherm
 fishe
 fish
 fisc
 Fisch
 Fis
 firs
 firm
 firewo
 firew
 Fires
 firep
 firem
 fireb
 fire
 fir
 Finn
 Finl
 fini
 fing
 fines
 fine
 financi
 finan
 final
 fina
 fin
 filth
 filt
 film
 fill
 fili
 file
 fila
 fil
 figura
 figu
 fig
 fifte
 fift
 FIF
 fier
 fien
 fiel
 fief
 fie
 fide
 fidd
 fid
 fict
 fic
 fibro
 fibr
 Fibe
 fib
 fia
 fian
 fi
 fev
 feuda
 feu
 fett
 feti
 fet
 festi
 fest
 fes
 ferru
 ferrom
 ferro
 ferri
 ferre
 Ferr
 fero
 Fern
 fermi
 ferme
 ferm
 Fer
 fenc
 fen
 feminis
 femi
 fem
 felo
 fell
 felic
 felicit
 felici
 Feli
 Feld
 fel
 fei
 feed
 fee
 fede
 fed
 Febr
 feb
 featherbe
 featherb
 feath
 feat
 feas
 fear
 fea
 fe
 Faye
 Fay
 Faus
 faun
 fault
 faul
 Fau
 fatt
 Fati
 fath
 fate
 fat
 fast
 fasc
 fascis
 fascic
 fas
 fart
 farm
 fare
 farc
 Fara
 far
 fanta
 fantasi
 fant
 fang
 fanf
 fanc
 fan
 famil
 famili
 familia
 fami
 fam
 fals
 fallo
 falla
 fall
 falc
 fal
 fait
 Fairf
 Fair
 fain
 fail
 fails
 fai
 Fah
 fade
 fad
 factor
 facto
 fact
 facil
 faci
 facet
 face
 fac
 fabr
 Fab
 Fa
 F
 Ez
 eyel
 eyebr
 eyeb
 ey
 exulta
 exul
 exud
 exu
 extrus
 extru
 extro
 extric
 extri
 extrema
 extre
 extra
 extrav
 extrad
 extract
 extrac
 extr
 extol
 extolle
 extoll
 exto
 extin
 exti
 exter
 extensi
 extens
 extend
 exten
 extem
 exte
 ext
 expu
 expre
 expressi
 expr
 exposito
 exposi
 expos
 expor
 expon
 exponenti
 expo
 explos
 explora
 explor
 exploi
 explo
 explica
 expli
 expla
 explan
 expl
 expir
 expia
 expi
 expert
 experi
 experim
 experie
 exper
 expens
 expend
 expen
 expell
 expel
 expediti
 expedit
 exped
 expec
 expecto
 expecta
 expe
 expa
 expan
 expansi
 expans
 exp
 exoti
 exot
 exorc
 exor
 exoga
 exog
 exo
 existe
 exis
 exi
 exhu
 exho
 exhib
 exhi
 exha
 exhausti
 exhau
 exh
 exerc
 exer
 exempt
 exempl
 exempla
 exem
 exeg
 exec
 executi
 execu
 execr
 exe
 excus
 excur
 excul
 excu
 excre
 excret
 excr
 exco
 exclusio
 exclus
 exclu
 excla
 exclam
 excl
 excita
 excit
 excis
 exci
 excha
 exch
 exces
 excep
 excelle
 excell
 excel
 exce
 exc
 exa
 exas
 exami
 exam
 exal
 exac
 ex
 evolu
 evol
 evoc
 evo
 evil
 evid
 evi
 every
 everg
 Evere
 Ever
 eventu
 event
 even
 Eve
 eva
 evas
 Evans
 evang
 evan
 eval
 ev
 eute
 Eut
 Europe
 Euro
 Euri
 eur
 euphori
 eupho
 euphe
 eup
 eule
 Eul
 eugeni
 Eug
 Euc
 Eucl
 Eu
 eti
 ethy
 etho
 ethno
 ethn
 Ethi
 ether
 ethe
 Etha
 eth
 ete
 etc
 et
 estu
 estop
 esto
 esti
 Este
 esta
 est
 Essen
 esse
 Ess
 espou
 espo
 esp
 eso
 Esc
 escr
 Esch
 esca
 escape
 escap
 es
 e'
 erup
 erud
 eru
 Ers
 erro
 errat
 erran
 errant
 erra
 err
 erot
 erosi
 eros
 Erod
 ero
 Erne
 Ern
 Eric
 Eri
 erg
 ere
 era
 Erat
 eras
 erad
 er
 equiv
 equita
 equit
 equipp
 equipo
 equip
 equino
 equin
 equilibri
 equili
 equil
 equi
 equa
 equat
 eq
 Eps
 epoc
 epo
 epithel
 epith
 epita
 epitax
 epit
 epist
 episo
 episc
 episcopal
 Epis
 epiphy
 epip
 epil
 epigram
 epigr
 epig
 epider
 epidem
 epid
 epic
 epicy
 Epicu
 epi
 Ephe
 Ephes
 Ephem
 ephemeri
 eph
 epA
 ep
 eo
 enz
 envi
 enve
 env
 enun
 enum
 enu
 entre
 entra
 entr
 ento
 entir
 enti
 enthusiast
 enthu
 enth
 ente
 enter
 ent
 ens
 enr
 enq
 enor
 eno
 enig
 eni
 Englishm
 Engli
 Engle
 Engla
 Engl
 engi
 eng
 enfo
 enf
 energ
 ener
 ene
 endot
 endoga
 endog
 endo
 end
 encu
 encr
 encom
 enco
 enc
 en
 emuls
 emu
 empo
 emplo
 empl
 empi
 emphy
 empha
 emphas
 emph
 emp
 Emo
 Emma
 Emm
 emitte
 emitt
 emit
 emissi
 emis
 Emil
 Emig
 emi
 emeri
 emerg
 emer
 eme
 embry
 embroid
 embro
 embra
 embr
 embod
 embo
 embl
 embed
 embedde
 embedd
 embe
 emba
 embarg
 embar
 emb
 eman
 ema
 em
 elys
 Ely
 elut
 elu
 Elsi
 Else
 Els
 elo
 Elm
 Ellis
 ellips
 ellipsoi
 ellipso
 ellip
 ellio
 Elli
 Ell
 Elk
 Eliz
 Elis
 eli
 eleve
 elev
 elep
 elem
 eleg
 electrop
 electron
 electrolyt
 electrol
 electroencephalograp
 electroe
 electroc
 electro
 electric
 electri
 electre
 electr
 electora
 electo
 elec
 elea
 Ele
 Elde
 eld
 elb
 elas
 Ela
 el
 Ek
 eje
 ej
 Eis
 einsteini
 Ein
 eighte
 eigh
 eige
 eigenv
 eigens
 eig
 eid
 ei
 Eh
 Egy
 egr
 egot
 ego
 egg
 ega
 Eg
 eff
 effluv
 efflu
 efflo
 effl
 Effic
 effica
 effi
 effec
 effectu
 effe
 effa
 ef
 eer
 EEl
 ee
 Edwi
 Edwa
 Edwardi
 Edw
 educ
 edu
 Edmo
 Edmond
 Edm
 edito
 Edit
 edif
 edi
 Edge
 edg
 ede
 edd
 Ed
 ecum
 ecu
 ect
 ecs
 economi
 econome
 Econ
 ecol
 eco
 ecli
 ecl
 echo
 echi
 ech
 ecc
 eccl
 Ec
 Eb
 eaves
 eav
 eate
 eat
 easy
 Eastw
 easte
 east
 ease
 eas
 earthmo
 earthm
 earthe
 eart
 earn
 ear
 eag
 Ea
 e
 dysp
 dys
 dyna
 dynas
 dynam
 dynami
 dyn
 dye
 dya
 dy
 dwi
 dwe
 dwa
 dw
 duti
 dutc
 Dutchm
 dut
 dust
 dusk
 duse
 Dus
 Durk
 dure
 Dura
 Duran
 dur
 duplica
 dupli
 dupl
 dup
 duo
 Dunl
 Dunk
 dung
 Dune
 dunc
 Dun
 Dump
 dumb
 dum
 dull
 dul
 Dug
 duf
 due
 Dud
 duct
 duck
 duc
 dubi
 Dub
 Dua
 du
 dry
 drun
 drum
 drug
 drud
 dru
 drows
 drow
 dros
 drop
 droop
 droo
 dro
 driz
 driv
 drip
 drib
 dri
 dres
 drea
 dream
 dread
 dre
 drawb
 draw
 drap
 dramati
 dramat
 drama
 dram
 drai
 dragon
 drago
 drag
 draftsm
 drafts
 draf
 Dra
 dr
 doz
 downw
 downtr
 downt
 downst
 downs
 downp
 down
 dow
 dov
 Dougl
 Dough
 doug
 doub
 doubt
 doubl
 double
 doublet
 Dou
 dot
 dos
 Doro
 dorm
 Dori
 Dorc
 Dora
 Dor
 dop
 doorm
 doorke
 doork
 door
 doom
 Dool
 Doo
 Dono
 Donne
 Donn
 Done
 Donal
 Dona
 Don
 dominic
 Domini
 domina
 domin
 domi
 domes
 Dome
 dom
 dolt
 Dolom
 dolo
 doll
 dole
 dol
 dogt
 dogmat
 dogm
 dogg
 dogb
 dog
 doe
 dodecahedra
 dode
 Dod
 documenta
 docu
 doctrina
 doctr
 docto
 doctora
 doct
 dock
 doc
 dobb
 Dob
 Do
 Dn
 Dixi
 dix
 divo
 divisi
 divis
 divin
 divid
 divi
 dives
 diversio
 diversi
 divers
 diverg
 diver
 dive
 diva
 div
 ditt
 dit
 distu
 distrib
 distributi
 distri
 distr
 distin
 distil
 disti
 dista
 dist
 dissi
 disse
 dissem
 diss
 disrupti
 disr
 disq
 dispu
 dispo
 dispersi
 disper
 dispensa
 dispen
 dispel
 dispell
 dispe
 dispa
 disp
 Disn
 dism
 dishw
 dish
 disg
 disd
 discuss
 discu
 discriminat
 discri
 discre
 discreti
 discret
 discr
 disco
 discipli
 disci
 disce
 disc
 disa
 dis
 dirt
 directr
 directo
 direc
 dire
 dir
 diplomat
 diplom
 diploi
 dipl
 diph
 dip
 dior
 diop
 Dion
 dioc
 dio
 dinn
 ding
 Din
 diminu
 dimi
 dime
 dim
 dilut
 dilu
 Dill
 dile
 dila
 dilat
 dil
 digre
 digr
 dignit
 dign
 digita
 digi
 digesti
 dige
 dig
 diff
 diffusi
 diffu
 diffr
 diffic
 diffi
 diffe
 differenti
 differe
 differ
 diffeo
 dif
 diet
 diel
 Die
 did
 dicti
 dicta
 dictat
 dict
 Dicke
 dick
 dicho
 dich
 dic
 dia
 diatom
 diato
 diath
 diat
 diaph
 diap
 Dian
 diama
 diam
 diale
 dial
 diagr
 diagn
 diagnost
 diag
 diac
 diab
 diabe
 di
 dh
 dextr
 dexte
 dex
 dew
 devou
 devote
 devot
 Devon
 devo
 devis
 devil
 devia
 devi
 dev
 deut
 deu
 detra
 detr
 deton
 deto
 detes
 deterre
 deterr
 determina
 determ
 deter
 deten
 detec
 dete
 deta
 d'
 detai
 det
 desu
 destru
 destr
 desti
 destin
 dest
 dess
 despot
 despon
 despo
 despi
 despe
 desp
 desol
 deso
 desir
 desig
 desid
 desi
 deser
 desec
 dese
 descripti
 descrip
 descr
 descend
 desce
 desca
 Desc
 des
 derr
 dero
 deriv
 deris
 deri
 dere
 Derb
 dera
 der
 depu
 depri
 depressi
 depres
 deprec
 depreci
 depreca
 depre
 depr
 deposito
 deposi
 depos
 depor
 depo
 deplo
 deple
 depl
 depe
 depa
 dep
 deox
 deo
 denud
 denu
 dent
 dens
 denou
 denota
 denot
 deno
 Denn
 denia
 deni
 Dene
 dend
 den
 demurre
 demurr
 demur
 demu
 demons
 demoni
 demon
 demol
 democ
 democrat
 demo
 demitt
 demit
 demis
 demi
 demen
 deme
 dema
 demar
 demag
 dem
 delus
 delu
 delt
 delphin
 Delp
 Dell
 deliv
 delir
 deliq
 deline
 delin
 delim
 delig
 delica
 delicat
 delic
 deli
 delete
 delet
 deleg
 delec
 dele
 Delan
 Dela
 Del
 dej
 dei
 deh
 degu
 degre
 degra
 degr
 dege
 dega
 deg
 defra
 defr
 deform
 defore
 defor
 defo
 defle
 defla
 defl
 definiti
 defini
 defin
 defic
 defi
 deferr
 defer
 defens
 defend
 defen
 defect
 defec
 defe
 defa
 def
 deers
 Deer
 deep
 dee
 deduct
 dedu
 ded
 decryp
 decry
 decre
 decree
 decr
 decor
 deconv
 decont
 decontroll
 decon
 decompr
 decompo
 decom
 decoll
 decol
 deco
 declin
 decli
 decla
 declara
 declarato
 declarati
 declar
 declam
 decl
 decis
 decim
 decid
 deci
 decep
 decen
 deceit
 decei
 dece
 Decat
 decad
 deca
 dec
 debut
 debug
 debugge
 debugg
 debu
 debt
 debri
 debr
 Debo
 debil
 debi
 Debb
 Deba
 debau
 debat
 debar
 deb
 deat
 Dear
 Dean
 deal
 deaf
 deadl
 dead
 deac
 deaco
 dea
 de
 daz
 Dayto
 Dayt
 dayb
 day
 Daw
 Davis
 David
 Davi
 Dave
 dav
 daup
 daug
 Dau
 date
 data
 dat
 dash
 das
 Darw
 Dart
 Darr
 darl
 dark
 dar
 dapp
 dap
 Danu
 Danie
 Dani
 dange
 dang
 dand
 Dan
 damp
 damn
 damas
 Dama
 dam
 dall
 Dale
 Dal
 Dak
 dais
 dairym
 Dair
 Dai
 Dahl
 dah
 daf
 Dad
 dact
 dac
 Dab
 da
 d
 Czec
 Cze
 cza
 cz
 cyt
 cys
 Cyri
 Cyr
 Cypri
 Cyp
 Cyn
 cyl
 cyclot
 Cyclop
 cyclo
 cycli
 cycl
 Cyc
 cya
 cyani
 cyana
 cy
 cuttl
 cutt
 cuto
 cutle
 cutl
 cut
 custom
 custod
 custodi
 custo
 cust
 cush
 Cushi
 cus
 curva
 curv
 curta
 curt
 curso
 curs
 curricula
 curri
 curra
 curr
 curl
 curio
 curi
 curd
 curb
 cur
 cupr
 cupi
 cup
 Cunn
 cun
 cumu
 Cumm
 cumb
 cum
 culv
 cultu
 culti
 cult
 culpa
 culp
 cul
 cuf
 cudd
 cud
 cuc
 cub
 Cu
 crystallo
 crystalli
 crystall
 crys
 cryptograp
 crypto
 cryptanalys
 crypta
 cryp
 cryo
 cry
 crus
 crump
 crumb
 crum
 crui
 crue
 crud
 cruc
 crucifi
 crucif
 cru
 crowb
 crow
 crou
 crot
 crosswa
 crossw
 crossb
 cross
 cros
 croo
 cron
 Crom
 croco
 Crocke
 crock
 croc
 croa
 Cro
 criti
 crite
 crit
 criss
 Crisp
 cris
 crin
 crime
 Crim
 cri
 crewm
 crew
 creti
 Creta
 Cret
 crest
 cresc
 cres
 crep
 Creo
 crem
 creep
 creek
 creed
 cree
 credu
 credit
 credi
 crede
 credent
 cred
 crea
 creat
 cream
 creak
 cre
 cra
 craz
 cray
 crawl
 Craw
 crave
 crav
 crat
 cras
 crap
 crank
 crani
 Cran
 Cram
 crag
 craftsp
 craftsm
 crafts
 craf
 crac
 crab
 cr
 cp
 coz
 coy
 cox
 cowpo
 cowp
 cowm
 cowl
 cowh
 cowb
 cowar
 cowa
 Cow
 covet
 covera
 cover
 coven
 cove
 cova
 covari
 covar
 cov
 cous
 courtes
 courte
 court
 coura
 cour
 coup
 county
 countrym
 country
 countr
 counters
 counterpr
 counterpo
 counterp
 counterm
 counterf
 countera
 counter
 counte
 count
 couns
 counc
 councilw
 councilm
 coun
 could
 coul
 coug
 cou
 cotto
 cotta
 cott
 cot
 Cost
 cosmo
 cosm
 cose
 cos
 corv
 coru
 corte
 cort
 corrupti
 corrup
 corru
 corros
 corrod
 corrob
 corro
 corrige
 corrig
 corri
 corres
 correc
 corre
 corra
 corr
 corpus
 corpu
 corpsm
 corps
 corpora
 corpo
 corp
 corone
 corona
 Coron
 coro
 cornf
 Corneli
 Cornel
 Corne
 corn
 cork
 Corin
 Cori
 Core
 cordi
 cord
 Corb
 cora
 cor
 coq
 copy
 copr
 Copp
 Coper
 Cope
 cop
 Coor
 coop
 cool
 cooke
 cook
 coo
 convulsi
 convu
 convolu
 convol
 convo
 convi
 convey
 convert
 conversa
 convers
 converg
 conver
 convent
 conven
 conve
 conva
 conval
 conv
 contu
 controvers
 controv
 control
 controlle
 controll
 contro
 contriv
 contrit
 contrib
 contributo
 contri
 contra
 contrave
 contrav
 contrar
 contral
 contradis
 contradic
 contrad
 contract
 contrace
 contrac
 contrab
 contr
 conto
 continuo
 continua
 continu
 contine
 contin
 contig
 conti
 contex
 contes
 contenti
 content
 conten
 contem
 contempt
 contempo
 conte
 conta
 contam
 contag
 cont
 consump
 consum
 consul
 consultat
 consulta
 consult
 consula
 consu
 construc
 constru
 constri
 constra
 constr
 constituti
 constitut
 consti
 conste
 consta
 Constanti
 Const
 conspira
 conspirat
 conspir
 consp
 consor
 conson
 consol
 conso
 consis
 consig
 consid
 consi
 conserva
 conservato
 conservati
 conser
 conseq
 consen
 consec
 conse
 conscr
 consci
 conscio
 conscie
 consc
 consa
 cons
 Conr
 conque
 conquer
 conq
 connota
 connot
 Conno
 conniv
 conni
 Connec
 Conne
 Conn
 conjun
 conjug
 conju
 conjo
 conje
 conj
 conif
 coni
 congressw
 congressm
 congres
 congre
 congra
 congr
 Congo
 conge
 congesti
 conges
 congeni
 congen
 cong
 confus
 confuc
 Confu
 confro
 confr
 conforma
 confor
 confo
 confl
 confiscat
 confis
 confirma
 confir
 config
 confid
 confiden
 confide
 confida
 confi
 confes
 conferr
 confere
 confer
 confed
 confec
 confe
 conf
 cone
 conduc
 conduct
 condu
 condo
 condi
 conde
 condes
 conden
 condem
 condemna
 cond
 concurre
 concurr
 concur
 concu
 concr
 concor
 conco
 conclus
 conclu
 concl
 concis
 concil
 conci
 conces
 concerti
 concert
 concer
 concep
 concen
 concei
 conce
 conca
 conc
 Cona
 Con
 comput
 compul
 compulsi
 compu
 compt
 compre
 compressi
 compres
 compreh
 comprehens
 compr
 composi
 compos
 compon
 compo
 complim
 complic
 compli
 complex
 complet
 complem
 complementar
 complementa
 comple
 compla
 complain
 complai
 compl
 compi
 competiti
 competi
 compete
 compet
 compensat
 compens
 compend
 compen
 compel
 compell
 compe
 compa
 compat
 compassi
 compas
 compara
 compar
 compani
 compan
 Compac
 comp
 commut
 commun
 communic
 communi
 commu
 commonw
 common
 commod
 commodi
 commo
 committeew
 committeem
 committee
 committe
 committa
 committ
 commit
 commissa
 commiss
 commis
 commi
 commer
 commenta
 comment
 commens
 commend
 commenda
 commen
 comme
 comma
 comman
 comm
 Comi
 comet
 -
 comed
 come
 combu
 combina
 combinato
 combi
 comba
 comb
 coma
 Com
 column
 columb
 Columbi
 colu
 colt
 Colos
 colora
 colorat
 color
 coloni
 colon
 Colom
 Colo
 collu
 colloqui
 colloquia
 colloqu
 colloq
 collo
 Collin
 Collie
 colli
 collegi
 colleg
 collec
 colle
 colla
 collat
 collar
 collap
 collag
 coll
 coli
 Cole
 cola
 col
 coinciden
 coinc
 coin
 coi
 coho
 Cohe
 cohes
 coher
 coh
 cogniz
 cognit
 cogni
 cogna
 cogn
 cog
 coffee
 coffe
 coff
 cof
 coexi
 coex
 coerci
 coer
 coed
 coe
 codo
 codi
 code
 codd
 cod
 coco
 cockl
 cock
 Cochr
 coch
 coca
 coc
 cobbl
 cobb
 Cob
 coax
 Coat
 coas
 coar
 coale
 coal
 coag
 coac
 coachm
 coa
 CO
 Cly
 clut
 clum
 club
 clu
 cloud
 clou
 clothesm
 clothes
 clothe
 cloth
 clot
 close
 clos
 clon
 clog
 clod
 clockw
 cloc
 cloa
 clo
 clip
 Clint
 clini
 cling
 clin
 clima
 climat
 clim
 Cliff
 clif
 clie
 clic
 cli
 clev
 clerg
 clergym
 cler
 Clem
 clea
 cleav
 clear
 clean
 cle
 cla
 Clay
 claust
 Clause
 claus
 Claud
 Claudi
 Clau
 clat
 classif
 classi
 class
 clas
 Clark
 clari
 Claren
 Clare
 Clar
 clap
 clan
 clam
 clair
 Claim
 clai
 clad
 cl
 civil
 civi
 civ
 city
 citro
 citr
 citi
 cita
 cit
 circumv
 circumst
 circumsp
 circumsc
 circums
 circumfe
 circumf
 circumc
 circumcis
 circum
 circulat
 circul
 circui
 circu
 circl
 Cir
 cinn
 Cinem
 cine
 Cinde
 Cind
 cinc
 Cin
 cil
 cig
 Cice
 Cic
 ci
 chut
 churc
 churchw
 churchm
 Churchi
 churchg
 chur
 chunk
 chun
 chum
 chug
 chuc
 chub
 chu
 Chry
 chronog
 chrono
 chroni
 chron
 chrom
 chromi
 chroma
 chromatograp
 chromato
 chromati
 chro
 chri
 Christop
 Christo
 Christin
 Christia
 Christi
 Christens
 Christe
 christ
 Chr
 chow
 chos
 choreo
 chore
 chordat
 chorda
 chord
 chora
 chor
 Chop
 choo
 Chom
 chole
 chol
 chok
 choir
 choi
 choc
 cho
 chloropl
 chlorop
 chloro
 chlori
 chl
 chiva
 chiv
 chit
 Chis
 chir
 chip
 Chine
 chinc
 Chinam
 China
 chin
 Chime
 chimer
 chim
 chill
 child
 chil
 chig
 chie
 chick
 Chican
 chicag
 Chica
 Chic
 chia
 Chi
 chevr
 Chev
 Cheste
 Chest
 Ches
 cheru
 Cher
 Chen
 chemi
 chemist
 chemiso
 chemis
 chem
 cheese
 cheesec
 chees
 cheer
 cheek
 chee
 checksumm
 checks
 checke
 chec
 chea
 cheat
 che
 cha
 chau
 chatt
 chate
 chat
 chasti
 chast
 chas
 chartre
 chartr
 Chart
 Charlo
 Charle
 Charles
 Charl
 charit
 charis
 chari
 charg
 chara
 char
 Chapl
 chaper
 chape
 chap
 chao
 chant
 change
 chang
 chand
 chanc
 chance
 chancel
 chan
 Champa
 champ
 chamo
 chamb
 cham
 chalk
 chalc
 chal
 chairw
 chairm
 chair
 chai
 chaf
 Chad
 Ch
 Cet
 cess
 ces
 cerv
 certif
 certi
 certa
 cert
 ceri
 ceremoni
 cerem
 cerebr
 cereb
 cere
 Cera
 cer
 centu
 centrifuga
 centrif
 centri
 centr
 centi
 center
 centen
 cente
 cent
 censu
 censo
 cens
 cen
 cem
 cellulo
 cellu
 cell
 celes
 celer
 celeb
 celebra
 celebr
 cele
 Cela
 Cel
 ced
 Ceci
 Cec
 Ce
 Cay
 cavil
 cavi
 caver
 cavem
 cave
 cava
 cav
 caution
 caut
 causa
 caus
 caul
 cauc
 Cauca
 Cau
 cattlem
 cattl
 catt
 cats
 cati
 cathod
 catho
 Cather
 Cathe
 cath
 cater
 categ
 cate
 catc
 catat
 catas
 catalys
 cataly
 catal
 Cata
 cat
 casu
 Casti
 caste
 cast
 Cassi
 casse
 cass
 cask
 cash
 case
 casc
 cas
 carv
 cartog
 carto
 carti
 carte
 cart
 carry
 carro
 Carri
 Carra
 carr
 carpen
 carpe
 Carp
 Caroli
 Carol
 caro
 Carne
 carna
 carn
 carmi
 Carme
 Carm
 carlo
 Carli
 Carl
 carib
 Cari
 cargo
 carg
 caret
 caref
 caree
 care
 cardio
 Cardi
 card
 carcinog
 carci
 carc
 carbu
 carbox
 carboni
 carbona
 carbon
 Carbo
 carbi
 carb
 Cara
 car
 captiv
 captio
 capti
 capta
 capt
 capst
 caps
 capr
 Capito
 capita
 capit
 Capi
 cape
 capacita
 capacit
 capa
 cap
 canv
 Canton
 canto
 canti
 canter
 Cante
 canta
 Cant
 canon
 Cano
 cannon
 canno
 canni
 canne
 canna
 cann
 cank
 canis
 Cani
 candl
 candida
 candi
 cande
 cand
 cancer
 cancel
 cancell
 canc
 Canad
 Cana
 Can
 campa
 camp
 Camil
 Cami
 Camero
 Camera
 cameram
 camer
 Camelo
 camel
 came
 cambr
 Camb
 cam
 Calve
 calv
 calumn
 calu
 calo
 callig
 calli
 Calla
 call
 caliph
 calip
 calif
 calib
 calibr
 cali
 calf
 calen
 cale
 Calde
 cald
 Calcul
 calcula
 calcu
 calci
 calc
 calami
 calam
 cala
 Cal
 Cair
 Cain
 Cai
 cah
 cag
 caf
 caden
 cade
 cadd
 cada
 cad
 cact
 caco
 cach
 cac
 cabine
 cabi
 caba
 cab
 ca
 c
 Byz
 byw
 Byron
 Byro
 Byr
 bypa
 byp
 byl
 by
 Buz
 Buxt
 Bux
 butyr
 buty
 Buttr
 button
 butto
 Butterf
 butter
 butte
 butt
 bute
 butc
 buta
 but
 bust
 businessm
 busi
 bush
 bus
 Burt
 burst
 burs
 Burro
 burr
 Burn
 Burm
 burle
 burl
 Burgu
 burgl
 burge
 burg
 buret
 burea
 bureaucrat
 bureauc
 bure
 burde
 burd
 Bur
 buo
 bunk
 bung
 bund
 bun
 bump
 bumb
 bum
 bully
 bullh
 bullf
 bulle
 bulld
 bull
 bulk
 bulg
 Bulb
 bul
 built
 build
 buil
 bui
 bugg
 bug
 buf
 Bue
 budget
 budg
 Buddhi
 Buddh
 Budd
 Bud
 bucks
 Buckl
 bucket
 bucke
 buck
 buch
 Bucha
 Buc
 Bub
 bu
 bryop
 bryo
 Brya
 Bry
 brut
 brush
 brus
 brun
 brui
 Bruc
 Bruce
 bru
 browni
 Browne
 Brown
 brow
 brou
 brothe
 brot
 broom
 Brookl
 Brook
 brood
 broo
 bronz
 Bronc
 bronch
 bronchi
 bronchio
 bron
 bromi
 brom
 brok
 brock
 broc
 broa
 broad
 bro
 Britt
 brita
 Britan
 Brit
 Brist
 bris
 brink
 brind
 brin
 brim
 Bril
 bright
 brigh
 brigad
 briga
 brig
 brie
 bridgew
 Bridget
 bridg
 bride
 brid
 brickl
 brick
 bric
 brib
 bria
 bri
 brew
 breve
 brev
 Bret
 Brenn
 Brend
 Bren
 brem
 breez
 bree
 brea
 breat
 breas
 breaka
 break
 bread
 bre
 bra
 Brazil
 Brazi
 braz
 brave
 brav
 brass
 Bras
 brandy
 Brande
 Brand
 bran
 brak
 Brain
 Brai
 Brahms
 Brah
 bragg
 Brag
 Brad
 brac
 bracke
 brack
 brace
 br
 Boyl
 boyc
 boy
 box
 bowm
 bowl
 Bowe
 Bowd
 Bow
 bout
 bourg
 bourb
 bour
 bound
 bounc
 boun
 boul
 boug
 bou
 botu
 botto
 bottl
 bott
 both
 bota
 botani
 bot
 boson
 boso
 Bos
 borr
 boro
 Borne
 born
 Bori
 Borea
 Bore
 borderl
 border
 bord
 Bora
 bor
 boots
 bootlegg
 bootl
 Boot
 boor
 Boon
 boom
 booksh
 books
 booki
 book
 boo
 Bonne
 bonn
 boni
 bong
 bonds
 bond
 bona
 bon
 bombas
 bomba
 bom
 Bolt
 bolsh
 Bolshe
 Bolshevis
 Bols
 Bolo
 Boli
 bole
 bold
 bol
 Bois
 Boi
 Boh
 bogg
 boge
 bog
 Boe
 bodyb
 body
 bod
 boc
 bobbi
 bobb
 Bob
 boa
 boatm
 boat
 boas
 board
 boar
 bo
 blust
 blus
 blur
 blun
 Blum
 blueg
 bluebo
 bluebi
 blueb
 blue
 blu
 blow
 blot
 Bloom
 blood
 bloodst
 bloodsh
 bloods
 bloo
 blon
 Blom
 blocka
 block
 Bloc
 blo
 blit
 bliss
 blis
 blind
 blin
 bli
 bles
 Blen
 Blee
 blea
 ble
 bla
 blaz
 blat
 blast
 blasp
 blas
 blank
 bland
 blanc
 Blanch
 blan
 blam
 Blai
 bladd
 blad
 Blacks
 Blackm
 blackbo
 blackb
 blac
 bl
 biz
 biva
 biv
 bitu
 bittern
 bitter
 bitte
 bitt
 bit
 bist
 bisma
 Bism
 bish
 bise
 bis
 birt
 bird
 bir
 bipa
 bip
 bioti
 biot
 biom
 bio
 bino
 Bingh
 bing
 bind
 bina
 bin
 bimo
 Bime
 bim
 billio
 Billi
 bill
 bili
 bila
 bil
 bije
 bij
 bigo
 Big
 bif
 bienn
 bie
 bidi
 bidd
 bid
 bico
 bica
 bic
 biblio
 bibli
 bibl
 bib
 bia
 bi
 Bh
 bey
 bewi
 bewa
 bew
 beve
 Bever
 bev
 betw
 bett
 Bets
 betro
 betra
 betr
 beto
 Bethe
 beth
 Bete
 beta
 bet
 bests
 besto
 bestir
 besti
 best
 Besse
 Bess
 bespe
 besp
 besi
 bese
 beset
 bes
 bery
 Bertr
 Berth
 bert
 berr
 Bernie
 Berni
 Berne
 Bernar
 Berna
 Bern
 Berm
 Berl
 Berke
 berk
 beri
 Bergs
 Bergl
 berg
 berea
 Bere
 ber
 beq
 Beo
 benze
 Benz
 benth
 Bent
 Benn
 beni
 Beng
 benefic
 benefici
 benefice
 benefi
 benef
 Benedic
 benedicti
 Bened
 Bene
 Bend
 benc
 ben
 bemA
 bem
 belv
 Belt
 belo
 belly
 bellm
 Bellin
 belli
 bella
 Bell
 belie
 beli
 Belgi
 Belg
 belf
 bela
 Bel
 bei
 behe
 beha
 behav
 beh
 begu
 bego
 beginn
 begi
 begga
 begg
 bege
 beg
 befor
 befog
 befo
 befi
 befa
 bef
 Beet
 beef
 Beec
 beeb
 Bee
 bedsp
 beds
 bedro
 bedr
 bedimm
 bedi
 Bedf
 bed
 beck
 Beca
 bec
 beauti
 beaut
 Beau
 beatif
 beati
 beate
 beat
 beas
 Beard
 bear
 bead
 beac
 beach
 bea
 be
 bayon
 Bayo
 bay
 bawd
 baw
 Baud
 bau
 battlef
 battl
 batte
 batt
 Bato
 bathr
 bath
 bate
 Batc
 Bat
 bast
 bassi
 Bass
 baske
 bask
 basil
 basi
 bash
 basep
 basem
 basel
 baseba
 baseb
 base
 basa
 bas
 Barto
 Barth
 Barte
 barten
 bart
 Barry
 barri
 barret
 barre
 barrac
 barra
 barr
 barone
 baron
 baro
 Barnet
 Barne
 barna
 Barn
 Barl
 bark
 bari
 barg
 baref
 bare
 Barc
 barbi
 barber
 barbe
 barbari
 barbar
 Barba
 Barb
 bar
 baptiste
 Baptist
 Baptism
 bap
 Bantu
 bant
 bankr
 bank
 bani
 bangl
 bang
 bane
 bandw
 bands
 band
 bana
 Ban
 Bamb
 Bam
 Baltim
 Balt
 bals
 balm
 ballo
 ballet
 balle
 Balla
 ball
 Balk
 Bali
 bale
 bald
 Bal
 Bake
 baker
 Bak
 bail
 Bai
 Bah
 bagg
 bag
 baf
 Bade
 bad
 bacteria
 bact
 backwa
 backw
 backst
 backs
 backpl
 backp
 backl
 backb
 back
 baci
 bach
 Bacc
 Bacca
 bac
 bab
 babysi
 babys
 Baby
 Babe
 Babb
 ba
 b
 Azt
 azi
 Az
 Aye
 Ay
 axo
 axis
 axiom
 axio
 axi
 ax
 awe
 awa
 awar
 awak
 aw
 avoi
 Avoc
 avoca
 avo
 avia
 aviat
 avi
 avers
 averr
 aver
 Aven
 ave
 Ava
 avar
 av
 autu
 auton
 automo
 automa
 autom
 autocrat
 autocr
 autoco
 autoc
 auto
 auti
 auth
 authori
 autho
 authe
 aut
 Austra
 Austr
 Auste
 aust
 ausp
 aus
 auro
 Auri
 aure
 Aura
 aur
 aun
 Augus
 augu
 augm
 auge
 Aug
 audito
 audit
 audio
 audi
 auda
 aud
 auct
 auc
 Aub
 Au
 Atw
 attrib
 attributi
 attri
 attr
 attic
 Atti
 attes
 attent
 attend
 atten
 atte
 atta
 attai
 attac
 attach
 att
 Atroph
 atrop
 atroc
 atro
 atr
 aton
 atom
 ato
 atm
 atlan
 Atlantic
 Atlanti
 atl
 Atk
 athl
 Athen
 Athei
 athe
 ath
 atav
 ata
 At
 asyn
 asymp
 asym
 asy
 asu
 astrop
 astron
 astrono
 astrona
 astro
 astri
 astra
 astr
 Astor
 Asto
 asti
 astero
 asteri
 aste
 asta
 ast
 Assy
 assur
 assum
 assu
 assoc
 asso
 assis
 Assim
 assig
 assid
 assi
 asses
 assem
 asse
 assas
 Assai
 assail
 assa
 ass
 aspira
 aspir
 aspi
 asph
 asper
 aspe
 aspa
 aspara
 asp
 ask
 asia
 Asi
 ashm
 Ashl
 Ashe
 ash
 ascr
 asce
 ascen
 ascend
 asc
 as
 aru
 artis
 artifi
 artif
 Artic
 articu
 arti
 Arth
 arteri
 arteriol
 arterio
 arter
 artem
 arte
 Art
 arse
 arseni
 arsena
 ars
 arrow
 arrog
 arro
 arri
 arre
 arra
 arran
 Arr
 arp
 arous
 arou
 arom
 aro
 Armo
 armi
 Armc
 armat
 Armad
 arma
 arm
 Arle
 Arl
 Arka
 Ark
 Aristote
 Aristot
 Aristoc
 aristocrat
 arist
 arise
 aris
 aria
 Ari
 argumenta
 argum
 argu
 Argon
 argo
 argi
 arg
 arena
 aren
 areaw
 area
 are
 arde
 ard
 arcta
 arct
 arcs
 archiv
 architectu
 archit
 Archi
 archet
 arche
 archai
 archa
 arch
 arcc
 arcan
 arcad
 Arca
 arc
 arbo
 arbi
 arbitr
 arb
 arac
 Arab
 Arabi
 ara
 Ar
 Aqui
 aque
 aqua
 Aquar
 aq
 apt
 apro
 apri
 Apr
 approx
 approv
 approp
 appro
 apprehens
 appreh
 apprec
 appre
 appra
 appr
 appos
 appoi
 appointe
 appo
 applic
 appli
 Apple
 appla
 appl
 appendi
 appen
 appel
 appea
 appeas
 appear
 appe
 appa
 appare
 appar
 appal
 app
 apot
 apos
 apolo
 apoll
 Apol
 apoc
 apocr
 Apoca
 apo
 api
 apha
 aph
 aper
 ape
 apa
 apath
 apat
 apar
 ap
 A&
 anyw
 anyb
 any
 anx
 antony
 Anton
 Antoi
 Anto
 antis
 antiqua
 antiquar
 antiq
 antipa
 antip
 antigo
 Antig
 antici
 antic
 anti
 anthro
 anthra
 anthr
 Antho
 anthe
 anth
 anten
 ante
 Antarc
 Antar
 antag
 Anta
 ant
 ANSe
 Ans
 anorthi
 anort
 anor
 anon
 anoma
 anom
 anod
 ano
 annull
 annul
 annu
 annoy
 anno
 anni
 anne
 Annale
 Annal
 anna
 Ann
 ank
 aniso
 anise
 anis
 anio
 anima
 animad
 anim
 ani
 anhydri
 anhy
 Anh
 angu
 angs
 Ango
 Anglo
 angli
 Angle
 Angl
 angi
 Ange
 angel
 Angelin
 Angelic
 Angeli
 Ang
 anec
 ane
 Andro
 Andre
 Andr
 Ando
 andesi
 andes
 Ander
 Ande
 And
 anci
 anchor
 anch
 ance
 ancestr
 anc
 anatom
 anato
 Anat
 anasto
 anasti
 anas
 anar
 analys
 analy
 analo
 anal
 anag
 anach
 anac
 Anab
 Ana
 an
 amy
 amu
 ampli
 ampl
 amphib
 amphibo
 amphibi
 amphi
 amph
 Amper
 ampe
 amp
 amor
 amon
 amoe
 amo
 ammonia
 ammon
 ammo
 amme
 Amm
 amin
 amid
 ami
 amet
 america
 Ameri
 Amer
 amend
 amen
 amel
 ame
 ambus
 ambul
 ambu
 ambrosi
 ambr
 ambl
 ambit
 ambig
 ambi
 amb
 Amaz
 amate
 amat
 Amar
 aman
 amal
 Ama
 AM
 alve
 alva
 Alv
 alum
 alumna
 alumn
 alumi
 alu
 altr
 alto
 alti
 alth
 altern
 alte
 alta
 alt
 Also
 als
 Alpha
 alphab
 alph
 Alpe
 alp
 along
 alon
 alo
 almo
 alma
 Alm
 ally
 alluv
 allus
 allu
 Alls
 allow
 allott
 allot
 alloc
 allo
 Allis
 alli
 alley
 aller
 Allen
 alleg
 allegr
 allego
 alle
 Alla
 All
 alkali
 alk
 Alis
 alig
 alie
 Alic
 alia
 ali
 algor
 Algo
 algi
 Alger
 Algeb
 alge
 alga
 algae
 alg
 alfred
 Alfr
 alf
 Alexandr
 Alexa
 Alex
 Alec
 Ale
 aldr
 Alde
 alderm
 alder
 ald
 alcoh
 alco
 alc
 Album
 albu
 Albr
 Albert
 Alber
 Albe
 Albani
 Alban
 alba
 alb
 Alam
 alabam
 Alab
 Ala
 al
 Ak
 Aj
 airs
 airp
 airma
 airm
 airli
 airl
 airf
 Aire
 air
 Ain
 aile
 ail
 Aid
 Aide
 Ai
 ahe
 ah
 agric
 agricu
 agri
 agre
 agr
 agon
 ago
 agno
 agne
 Agn
 agi
 aggressi
 aggres
 aggre
 aggr
 aggl
 agglu
 agg
 agen
 Age
 aga
 Agat
 Agai
 ag
 afterw
 afte
 aft
 afr
 afor
 afo
 afl
 afi
 Afg
 affr
 affore
 affo
 affl
 affirma
 affir
 affi
 affec
 affe
 affa
 aff
 af
 aest
 aes
 aeros
 aerob
 aero
 aer
 Aeo
 Aen
 Aeg
 ae
 advo
 adviso
 advise
 advis
 advi
 advert
 advers
 adverb
 adver
 adven
 adventu
 adve
 adva
 advant
 adv
 adulte
 adult
 adu
 adsorp
 adsorb
 ads
 Adria
 Adri
 Adre
 adr
 ador
 adopti
 adop
 Adolp
 Adol
 ado
 admo
 admi
 admix
 admitt
 admit
 admis
 admira
 admiral
 admir
 admin
 administrat
 administr
 adm
 adjud
 adju
 adjoi
 adjo
 adje
 adj
 adi
 adhes
 adher
 adh
 adeq
 adeno
 aden
 Adel
 Ade
 addr
 addit
 Addis
 Addi
 adde
 add
 adap
 adam
 adag
 ada
 Ad
 acu
 actu
 acto
 actin
 actino
 actini
 acti
 Act
 acry
 acrob
 acrobat
 acro
 acre
 acr
 acquitt
 acquit
 acquis
 acquie
 acqui
 acqua
 acq
 aco
 acm
 ackn
 Ack
 aci
 Achi
 ach
 acet
 acer
 ace
 accusa
 accusati
 accus
 accur
 accu
 accru
 accred
 accre
 accr
 accoun
 accou
 accor
 accompl
 accompa
 accompani
 accomp
 accom
 acco
 accla
 accl
 accid
 acci
 acce
 accessi
 acces
 accep
 accentu
 accen
 accel
 acc
 acad
 Acade
 academi
 academic
 aca
 ac
 Abyss
 aby
 abutt
 abut
 abus
 abu
 abstra
 abstr
 abst
 absorp
 absorb
 absor
 absol
 absolu
 abso
 absente
 abse
 absc
 absci
 abs
 abro
 abri
 abre
 abra
 abras
 Abram
 Abr
 abov
 abou
 abori
 abor
 abom
 abol
 abo
 abn
 abla
 abl
 Abid
 Abi
 abh
 abey
 abett
 abet
 aberr
 Aber
 Abel
 abe
 abdo
 abd
 Abbo
 abbe
 abb
 abA
 abas
 abac
 Ab
 Aar
 AaA
 AA
 A
submitted
trusted
 procedure
 quoti
 abbr
 evaluat
 introduce
 define
 own
 propert
 ancesto
 defau
 uncl
 manne
 modif
 modifi
 reduce
 behavi
 newel
 behave
 severe
 contai
 bless
 relea
 toug
 remov
 imprope
 satisfy
 notif
 securi
 belon
 smell
 temporar
 eage
 chirp
 obvio
 branc
 optio
 owne
 menti
 liste
 suppli
 remove
 seemi
 shorte
 solidi
 fiddle
 flic
 slig
 please
 teach
 optiona
 functiona
 centre
 parse
 personal
 alias
 owner
 zool
 finis
 complete
 fak
 initial
 cure
 modific
 elim
 unf
 actual
 easi
 faste
 impai
 simplif
 subjecti
 interfe
 specifica
 alterna
 present
 existent
 extreme
 carefu
 curre
 definite
 sandw
 reasona
 instant
 finishe
 unsc
 represe
 implic
 generat
 frid
 fille
 neate
 backwar
 basic
 circumstanc
 incidenta
 conveni
 delib
 whil
 applicat
 critic
11870
4
3
2
ess
2

4
2
2
worthlessness
2
worthless
38
1
4
3
2

2
r
4
3
2
driveway
2
driven
2
drive
38
1
4
3
2

2

4
2
2
drivers
2
driver
38
1
4
3
2

2
c
4
1
2
unsure
38
1
4
3
2
c
2

4
2
2
topical
2
topic
38
1
4
3
2
d
2

4
3
2
friendly
2
friends
2
friend
38
1
4
3
2
tion
2

4
2
2
computations
2
computation
38
1
0
25132
38
1
4
3
2
t
2

4
2
2
activating
2
activate
38
1
4
3
2
ge
2

4
2
2
messages
2
message
38
1
4
3
2
n
2

4
2
2
locations
2
location
38
1
4
3
2
ng
2

4
2
2
settings
2
setting
38
1
4
3
2

2
i
4
1
2
settle
38
1
4
3
2

2

4
2
2
creation
2
creating
38
1
4
3
2
a
2

4
2
2
lambdahouse
2
lambda
38
1
4
3
2
us
2

4
2
2
rigorously
2
rigorous
38
1
4
3
2
r
2
o
4
1
2
rigor
38
1
4
3
2

2

4
2
2
programmers
2
programmer
38
1
4
3
2

2

4
2
2
harder
2
harden
38
1
4
3
2
in
2

4
2
2
redefining
2
redefine
38
1
4
3
2
pti
2

4
2
2
redemptive
2
redemption
38
1
4
3
2
nding
2

4
2
2
keybindings
2
keybinding
38
1
4
3
2

2
i
4
1
2
keyboard
38
1
4
3
2

2

4
2
2
buffer
2
buffet
38
1
4
3
2

2

4
2
2
artificer
2
artifice
38
1
4
3
2
al
2

4
2
2
horizontally
2
horizontal
38
1
4
3
2
l
2

4
2
2
vertically
2
vertical
38
1
4
3
2
c
2

4
2
2
automatically
2
automatic
38
1
4
3
2
ate
2

4
2
2
truncated
2
truncate
38
1
4
3
2
aw
2

4
2
2
redraw
2
redraws
38
1
4
3
2
l
2

4
2
2
scrolling
2
scroll
38
1
4
3
2

2

4
2
2
connection
2
Connecticut
38
1
4
3
2

2

4
2
2
emacs
2
emaciate
38
1
4
3
2

2

4
2
2
frisbee
2
frisky
38
1
4
3
2
c
2

4
2
2
cynical
2
cynic
38
1
4
3
2
ct
2

4
2
2
intersection
2
intersect
38
1
4
3
2

2

4
2
2
corner
2
cornerstone
38
1
4
3
2
e
2

4
2
2
headlines
2
headline
38
1
4
3
2
ord
2

4
2
2
keywords
2
keyword
38
1
4
3
2
oon
2

4
2
2
tablespoonful
2
tablespoon
38
1
4
3
2
e
2

4
2
2
irritated
2
irritate
38
1
4
3
2
s
2

4
2
2
bonuses
2
bonus
38
1
4
3
2
st
2

4
2
2
interesting
2
interest
38
1
4
3
2

2

4
2
2
grazing
2
graze
38
1
4
3
2

2

4
2
2
dozens
2
dozen
38
1
4
3
2
re
2

4
2
2
pastures
2
pasture
38
1
4
3
2

2

4
2
2
rolling
2
Rollins
38
1
4
3
2

2

4
2
2
fields
2
fieldstone
38
1
4
3
2
ead
2

4
2
2
proofreading
2
proofread
38
1
4
3
2

2

4
2
2
footer
2
Foote
38
1
4
3
2

2
o
4
1
2
locating
38
1
4
3
2

2

4
2
2
times
2
timeshare
38
1
4
3
2
t
2

4
2
2
insertion
2
insert
38
1
4
3
2
oard
2

4
2
2
clipboards
2
clipboard
38
1
4
3
2

2

4
2
2
saving
2
Saviour
38
1
4
3
2

2

4
2
2
unknown
2
unkempt
38
1
4
3
2
ng
2

4
2
2
failings
2
failing
38
1
4
3
2

2

4
2
2
failer
2
failed
38
1
4
3
2
elling
2

4
2
2
misspellings
2
misspelling
38
1
4
3
2
r
2

4
2
2
players
2
player
38
1
4
3
2
ag
2

4
2
2
zigzag
2
zigzagging
38
1
4
3
2
t
2

4
2
2
zesty
2
zest
38
1
4
3
2
o
2

4
3
2
zeroth
2
zeroes
2
zero
38
1
4
3
2

2

4
2
2
zenith
2
Zen
38
1
4
3
2
l
2
o
4
2
2
Zealand
2
zeal
38
1
4
3
2

2

4
2
2
zealous
2
zealot
38
1
4
3
2

2
anrs
4
5
2
Zeus
2
zeta
2
Zellerbach
2
Zeiss
2
zebra
38
1
4
3
2

2

4
2
2
Zanzibar
2
Zan
38
1
4
3
2

2

4
3
2
Zagreb
2
zagging
2
zag
38
1
4
3
2

2
gn
4
5
2
zazen
2
zap
2
Zambia
2
Zaire
2
Zachary
38
1
4
3
2
e
2

4
2
2
Yvette
2
Yves
38
1
4
3
2

2

4
2
2
Yukon
2
Yuki
38
1
4
3
2
oslav
2

4
2
2
Yugoslavia
2
Yugoslav
38
1
4
3
2

2

4
3
2
yuck
2
yucca
2
Yucatan
38
1
4
3
2

2
cgk
4
2
2
yule
2
yuh
38
1
4
3
2
t
2

4
2
2
yttrium
2
ytterbium
38
1
4
3
2
h
2

4
2
2
youthful
2
youth
38
1
4
3
2
l
2

4
2
2
yourselves
2
yourself
38
1
4
3
2

2
e
4
1
2
yours
38
1
4
3
2
t
2

4
2
2
Youngstown
2
youngster
38
1
4
3
2
g
2
s
4
2
2
youngish
2
young
38
1
4
3
2

2

4
2
2
Yost
2
Yosemite
38
1
4
3
2

2

4
2
2
Yorktown
2
york
38
1
4
3
2

2
k
4
1
2
yore
38
1
4
3
2

2

4
3
2
Yonkers
2
yond
2
yon
38
1
4
3
2

2

4
2
2
yokel
2
yoke
38
1
4
3
2

2
e
4
2
2
Yokuts
2
Yokohama
38
1
4
3
2

2

4
4
2
yogurt
2
yogi
2
yoghurt
2
yoga
38
1
4
3
2
e
2

4
2
2
Yoder
2
yodel
38
1
4
3
2

2

4
2
2
yipping
2
yip
38
1
4
3
2

2
p
4
3
2
yin
2
yield
2
Yiddish
38
1
4
3
2
er
2

4
2
2
yesteryear
2
yesterday
38
1
4
3
2

2
t
4
2
2
yeshiva
2
yes
38
1
4
3
2
man
2

4
2
2
yeomanry
2
yeoman
38
1
4
3
2

2
o
4
1
2
yell
38
1
4
3
2
w
2

4
4
2
Yellowstone
2
Yellowknife
2
yellowish
2
yellow
38
1
4
3
2

2
l
4
1
2
yelp
38
1
4
3
2
t
2

4
2
2
yeasty
2
yeast
38
1
4
3
2

2

4
4
2
yearn
2
yearbook
2
years
2
year
38
1
4
3
2

2

4
3
2
yawn
2
yawl
2
yaw
38
1
4
3
2

2

4
2
2
yarmulke
2
Yarmouth
38
1
4
3
2

2

4
3
2
yardstick
2
yardage
2
yard
38
1
4
3
2

2
dm
4
2
2
yarrow
2
yarn
38
1
4
3
2

2

4
2
2
yapping
2
yap
38
1
4
3
2

2

4
3
2
Yankton
2
Yankee
2
yank
38
1
4
3
2

2
k
4
1
2
yang
38
1
4
3
2

2

4
2
2
Yamaha
2
yam
38
1
4
3
2

2

4
2
2
Yalta
2
Yale
38
1
4
3
2

2

4
2
2
Yakima
2
yak
38
1
4
3
2
ht
2
s
4
1
2
yacht
38
1
4
3
2
m
2

4
2
2
yachtsmen
2
yachtsman
38
1
4
3
2

2
cklmnprw
4
4
2
Yates
2
Yaqui
2
Yaounde
2
yah
38
1
4
3
2

2

4
2
2
xylene
2
xylem
38
1
4
3
2
l
2
e
4
1
2
xylophone
38
1
4
3
2

2

4
2
2
Xerox
2
xerography
38
1
4
3
2

2
o
4
1
2
Xerxes
38
1
4
3
2
o
2

4
2
2
xenophobia
2
xenon
38
1
4
3
2

2
nr
4
0
38
1
4
3
2

2
ey
4
4
2
x's
2
xi
2
Xavier
2
x
38
1
4
3
2

2

4
2
2
wynn
2
Wyner
38
1
4
3
2

2

4
2
2
Wyatt
2
Wyandotte
38
1
4
3
2

2
an
4
5
2
Wyoming
2
Wyman
2
Wylie
2
Wyeth
2
WY
38
1
4
3
2

2

4
2
2
Wuhan
2
Wu
38
1
4
3
2

2
g
4
1
2
Wronskian
38
1
4
3
2

2
d
4
2
2
wrongful
2
wrong
38
1
4
3
2
o
2

4
3
2
wrongdoing
2
wrongdoer
2
wrongdo
38
1
4
3
2

2
n
4
2
2
wrought
2
wrote
38
1
4
3
2

2

4
2
2
writeup
2
write
38
1
4
3
2

2
e
4
3
2
writhe
2
writ
2
written
38
1
4
3
2
t
2

4
3
2
wristwatch
2
wristband
2
wrist
38
1
4
3
2

2

4
2
2
wrinkle
2
wring
38
1
4
3
2

2

4
3
2
Wrigley
2
wright
2
wriggle
38
1
4
3
2

2
gnst
4
0
38
1
4
3
2
t
2

4
2
2
wrestle
2
wrest
38
1
4
3
2
k
2

4
2
2
wreckage
2
wreck
38
1
4
3
2

2
t
4
1
2
wreak
38
1
4
3
2
h
2

4
2
2
wreathe
2
wreath
38
1
4
3
2

2
acs
4
2
2
wretch
2
wrench
38
1
4
3
2
h
2

4
2
2
wrathful
2
wrath
38
1
4
3
2

2

4
2
2
wrapup
2
wrap
38
1
4
3
2

2
pt
4
3
2
wrangle
2
wraith
2
wrack
38
1
4
3
2

2
aeio
4
1
2
wry
38
1
4
3
2
e
2

4
2
2
woven
2
wove
38
1
4
3
2
d
2

4
2
2
wouldn't
2
would
38
1
4
3
2

2
l
4
1
2
wound
38
1
4
3
2
h
2
l
4
4
2
worthy
2
worthwhile
2
Worthington
2
worth
38
1
4
3
2
ip
2

4
2
2
worshipful
2
worship
38
1
4
3
2

2

4
2
2
worsen
2
worse
38
1
4
3
2

2
eh
4
1
2
worst
38
1
4
3
2

2

4
2
2
worry
2
worrisome
38
1
4
3
2

2

4
2
2
wormy
2
worm
38
1
4
3
2
d
2

4
2
2
worldwide
2
world
38
1
4
3
2

2

4
2
2
workshop
2
worksheet
38
1
4
3
2

2
h
4
3
2
workstation
2
workspace
2
works
38
1
4
3
2

2

4
2
2
workplace
2
workpiece
38
1
4
3
2
n
2

4
2
2
workmanlike
2
workman
38
1
4
3
2

2
a
4
1
2
workmen
38
1
4
3
2

2

4
2
2
workbook
2
workbench
38
1
4
3
2

2

4
2
2
Wordsworth
2
words
38
1
4
3
2

2

4
3
2
Woolworth
2
woolgather
2
wool
38
1
4
3
2

2

4
2
2
woodyard
2
woody
38
1
4
3
2

2

4
3
2
woodwork
2
woodwind
2
Woodward
38
1
4
3
2

2

4
3
2
woodside
2
woodshed
2
Woods
38
1
4
3
2

2

4
2
2
woodruff
2
Woodrow
38
1
4
3
2

2

4
2
2
Woodlawn
2
woodland
38
1
4
3
2

2
a
4
1
2
woodlot
38
1
4
3
2

2

4
3
2
woodcut
2
woodcock
2
woodcarver
38
1
4
3
2

2
clrswy
4
7
2
woodpeck
2
woodhen
2
woodgrain
2
wooden
2
Woodbury
2
Woodard
2
wood
38
1
4
3
2

2
dl
4
2
2
Wooster
2
woo
38
1
4
3
2
r
2

4
3
2
wonderland
2
wonderful
2
wonder
38
1
4
3
2

2
e
4
1
2
wondrous
38
1
4
3
2

2
d
4
4
2
wont
2
won't
2
Wong
2
won
38
1
4
3
2

2

4
2
2
wombat
2
womb
38
1
4
3
2
n
2

4
2
2
womanhood
2
woman
38
1
4
3
2
e
2

4
2
2
wolves
2
wolve
38
1
4
3
2

2

4
5
2
wolfish
2
Wolfgang
2
Wolff
2
Wolfe
2
wolf
38
1
4
3
2

2
fv
4
2
2
wold
2
Wolcott
38
1
4
3
2

2

4
2
2
woke
2
wok
38
1
4
3
2

2

4
3
2
woeful
2
woebegone
2
woe
38
1
4
3
2

2

4
2
2
witty
2
Witt
38
1
4
3
2
t
2

4
2
2
withstood
2
withstand
38
1
4
3
2

2

4
2
2
withhold
2
withheld
38
1
4
3
2

2

4
2
2
wither
2
withe
38
1
4
3
2
w
2

4
3
2
withdrawn
2
withdrawal
2
withdraw
38
1
4
3
2
r
2
a
4
1
2
withdrew
38
1
4
3
2
h
2

4
2
2
witchcraft
2
witch
38
1
4
3
2

2
dehs
4
5
2
withy
2
withal
2
without
2
within
2
with
38
1
4
3
2

2

4
2
2
wispy
2
wisp
38
1
4
3
2

2

4
4
2
wishy
2
wishful
2
wishbone
2
wish
38
1
4
3
2

2

4
4
2
wisenheimer
2
wisecrack
2
wiseacre
2
wise
38
1
4
3
2

2
ehp
4
3
2
wistful
2
wisdom
2
Wisconsin
38
1
4
3
2

2
mt
4
1
2
wire
38
1
4
3
2

2

4
2
2
wiretapping
2
wiretapper
38
1
4
3
2
ap
2
p
4
1
2
wiretap
38
1
4
3
2

2

4
2
2
wiremen
2
wireman
38
1
4
3
2

2
e
4
1
2
wiry
38
1
4
3
2
r
2

4
3
2
wintertime
2
Winters
2
winter
38
1
4
3
2

2
e
4
2
2
wintry
2
Winthrop
38
1
4
3
2

2

4
3
2
Winston
2
winsome
2
Winslow
38
1
4
3
2
e
2

4
2
2
Winnipesaukee
2
Winnipeg
38
1
4
3
2

2
p
4
1
2
Winnie
38
1
4
3
2

2
i
4
2
2
winnow
2
Winnetka
38
1
4
3
2

2

4
2
2
winkle
2
wink
38
1
4
3
2

2

4
2
2
wingmen
2
wingman
38
1
4
3
2

2
m
4
4
2
wingtip
2
wingspan
2
wingback
2
wing
38
1
4
3
2
a
2

4
2
2
winemaster
2
winemake
38
1
4
3
2

2
m
4
3
2
wineskin
2
winery
2
wine
38
1
4
3
2

2

4
4
2
windsurf
2
windstorm
2
Windsor
2
windshield
38
1
4
3
2
w
2

4
3
2
windowsill
2
windowpane
2
window
38
1
4
3
2

2

4
2
2
windbreak
2
windbag
38
1
4
3
2

2
bos
4
6
2
windy
2
windward
2
windup
2
windmill
2
windfall
2
wind
38
1
4
3
2

2

4
2
2
Winchester
2
winch
38
1
4
3
2

2
h
4
1
2
wince
38
1
4
3
2

2
cdegknst
4
5
2
winy
2
wino
2
Winifred
2
Winfield
2
win
38
1
4
3
2
n
2

4
2
2
Wilsonian
2
Wilson
38
1
4
3
2

2
o
4
1
2
Wilshire
38
1
4
3
2

2

4
2
2
Wilmington
2
Wilma
38
1
4
3
2

2

4
2
2
willowy
2
willow
38
1
4
3
2

2
w
4
1
2
Willoughby
38
1
4
3
2
m
2
s
4
1
2
William
38
1
4
3
2

2

4
3
2
Williamson
2
Williamsburg
2
Williams
38
1
4
3
2

2
a
4
2
2
Willis
2
Willie
38
1
4
3
2

2

4
2
2
Willard
2
Willa
38
1
4
3
2

2
aio
4
3
2
Wills
2
willful
2
will
38
1
4
3
2
s
2

4
2
2
Wilkinson
2
Wilkins
38
1
4
3
2

2
n
4
1
2
Wilkie
38
1
4
3
2

2
i
4
1
2
Wilkes
38
1
4
3
2
elm
2

4
2
2
Wilhelmina
2
Wilhelm
38
1
4
3
2

2

4
2
2
wilful
2
Wilfred
38
1
4
3
2

2

4
2
2
Wiley
2
wile
38
1
4
3
2
at
2

4
2
2
wildcatter
2
wildcat
38
1
4
3
2

2
c
4
4
2
wildlife
2
wildfire
2
wilderness
2
wild
38
1
4
3
2

2
defhklms
4
4
2
wily
2
wilt
2
Wilcox
2
Wilbur
38
1
4
3
2

2

4
2
2
wiggly
2
wiggle
38
1
4
3
2
n
2

4
2
2
Wiggins
2
wigging
38
1
4
3
2

2
il
4
0
38
1
4
3
2

2
g
4
4
2
wigwam
2
wigmake
2
Wightman
2
wig
38
1
4
3
2

2

4
3
2
Wier
2
wiener
2
wield
38
1
4
3
2
h
2

4
2
2
widthwise
2
width
38
1
4
3
2
w
2

4
2
2
widowhood
2
widow
38
1
4
3
2
e
2

4
2
2
widget
2
widgeon
38
1
4
3
2

2

4
3
2
widespread
2
widen
2
wide
38
1
4
3
2

2
egot
4
0
38
1
4
3
2

2

4
2
2
wicket
2
wick
38
1
4
3
2

2
k
4
1
2
Wichita
38
1
4
3
2

2

4
2
2
whosoever
2
whose
38
1
4
3
2

2

4
2
2
whoosh
2
whoop
38
1
4
3
2

2

4
3
2
whomsoever
2
whomever
2
whom
38
1
4
3
2

2
s
4
2
2
wholehearted
2
whole
38
1
4
3
2

2

4
2
2
wholesome
2
wholesale
38
1
4
3
2

2
e
4
1
2
wholly
38
1
4
3
2

2

4
3
2
who'll
2
who'd
2
who've
38
1
4
3
2

2

4
2
2
whizzing
2
whiz
38
1
4
3
2

2

4
3
2
whittle
2
Whittier
2
Whittaker
38
1
4
3
2

2

4
3
2
Whitehorse
2
whitehead
2
Whitehall
38
1
4
3
2

2
h
4
5
2
whitewash
2
whitetail
2
whiten
2
whiteface
2
white
38
1
4
3
2

2
et
4
7
2
Whitney
2
Whitman
2
Whitlock
2
whither
2
Whitcomb
2
Whitaker
2
whit
38
1
4
3
2
le
2

4
2
2
whistleable
2
whistle
38
1
4
3
2

2
t
4
3
2
whisper
2
whisk
2
whish
38
1
4
3
2

2

4
4
2
whirlwind
2
whirlpool
2
whirligig
2
whirl
38
1
4
3
2

2
l
4
1
2
whir
38
1
4
3
2

2

4
3
2
Whipple
2
whippet
2
Whippany
38
1
4
3
2

2
p
4
3
2
whipsaw
2
whiplash
2
whip
38
1
4
3
2

2

4
2
2
whinny
2
whine
38
1
4
3
2

2

4
2
2
whimsic
2
whimsey
38
1
4
3
2

2
s
4
2
2
whimper
2
whim
38
1
4
3
2
h
2

4
2
2
whichever
2
which
38
1
4
3
2

2

4
2
2
whet
2
whether
38
1
4
3
2
ith
2

4
2
2
wherewithal
2
wherewith
38
1
4
3
2

2

4
2
2
where're
2
where'd
38
1
4
3
2

2

4
2
2
whereon
2
whereof
38
1
4
3
2

2

4
2
2
whereas
2
whereabout
38
1
4
3
2
e
2
ao'w
4
7
2
wherever
2
whereupon
2
wheresoever
2
wherein
2
wherefore
2
whereby
2
where
38
1
4
3
2

2

4
3
2
whenever
2
whence
2
when
38
1
4
3
2

2

4
5
2
whelp
2
whelm
2
Wheller
2
whelk
2
Whelan
38
1
4
3
2

2

4
2
2
wheezy
2
wheeze
38
1
4
3
2

2

4
4
2
wheelhouse
2
wheelchair
2
wheelbase
2
wheel
38
1
4
3
2

2
lz
4
2
2
wheedle
2
whee
38
1
4
3
2
t
2

4
2
2
Wheatstone
2
wheat
38
1
4
3
2

2

4
2
2
what're
2
what'd
38
1
4
3
2

2
'
4
5
2
whatsoever
2
whatnot
2
Whatley
2
whatever
2
what
38
1
4
3
2

2

4
3
2
wharves
2
Wharton
2
wharf
38
1
4
3
2
e
2

4
2
2
Whalen
2
whale
38
1
4
3
2

2
lrt
4
2
2
wham
2
whack
38
1
4
3
2

2

4
2
2
wetland
2
wet
38
1
4
3
2

2

4
2
2
westernmost
2
western
38
1
4
3
2
r
2
n
4
1
2
westerly
38
1
4
3
2
ey
2

4
2
2
Wesleyan
2
Wesley
38
1
4
3
2

2
e
4
8
2
westward
2
Weston
2
Westminster
2
Westinghouse
2
Westfield
2
Westchester
2
westbound
2
west
38
1
4
3
2

2

4
2
2
Werther
2
wert
38
1
4
3
2

2

4
2
2
weren't
2
were
38
1
4
3
2

2
et
4
1
2
Werner
38
1
4
3
2

2

4
2
2
Wendy
2
Wendell
38
1
4
3
2

2
d
4
1
2
went
38
1
4
3
2

2

4
2
2
Wellesley
2
Welles
38
1
4
3
2

2
s
4
1
2
Weller
38
1
4
3
2

2
e
4
4
2
Wells
2
wellington
2
wellbeing
2
well
38
1
4
3
2

2

4
2
2
Weldon
2
weld
38
1
4
3
2

2

4
2
2
welcome
2
Welch
38
1
4
3
2

2
cdl
4
3
2
welt
2
welsh
2
welfare
38
1
4
3
2

2

4
2
2
weird
2
weir
38
1
4
3
2

2

4
2
2
Weinstein
2
Weinberg
38
1
4
3
2

2

4
2
2
weighty
2
weight
38
1
4
3
2
h
2
t
4
1
2
weigh
38
1
4
3
2

2
gnr
4
3
2
Weiss
2
Weierstrass
2
Wei
38
1
4
3
2

2

4
2
2
weedy
2
weed
38
1
4
3
2

2

4
4
2
weekend
2
weekday
2
weeks
2
week
38
1
4
3
2

2

4
4
2
wedlock
2
wedge
2
wed
2
wednesday
38
1
4
3
2

2

4
4
2
we've
2
we'll
2
we'd
2
we're
38
1
4
3
2

2

4
4
2
Webster
2
weber
2
Webb
2
web
38
1
4
3
2
trip
2

4
2
2
weatherstripping
2
weatherstrip
38
1
4
3
2
her
2
s
4
3
2
weatherproof
2
weatherbeaten
2
weather
38
1
4
3
2

2

4
2
2
wearisome
2
wearied
38
1
4
3
2

2
i
4
3
2
wearable
2
weary
2
wear
38
1
4
3
2
on
2

4
2
2
weaponry
2
weapon
38
1
4
3
2
h
2

4
2
2
wealthy
2
wealth
38
1
4
3
2

2
t
4
1
2
weal
38
1
4
3
2

2

4
2
2
weaken
2
weak
38
1
4
3
2

2
klprt
4
3
2
weave
2
weasel
2
wean
38
1
4
3
2

2

4
2
2
wayside
2
ways
38
1
4
3
2
a
2

4
2
2
waylay
2
waylaid
38
1
4
3
2

2

4
4
2
waxy
2
waxwork
2
waxen
2
wax
38
1
4
3
2

2
fl
4
3
2
wavenumber
2
waveguide
2
wave
38
1
4
3
2
e
2

4
2
2
wavelet
2
wavelength
38
1
4
3
2

2

4
2
2
wavefront
2
waveform
38
1
4
3
2

2
e
4
1
2
wavy
38
1
4
3
2

2

4
4
2
Watts
2
wattle
2
wattage
2
watt
38
1
4
3
2

2

4
3
2
waterside
2
watershed
2
Waters
38
1
4
3
2

2

4
2
2
watermelon
2
Waterman
38
1
4
3
2

2

4
2
2
Waterloo
2
waterline
38
1
4
3
2

2

4
2
2
waterfront
2
waterfall
38
1
4
3
2
r
2
flms
4
9
2
watery
2
waterway
2
Watertown
2
waterproof
2
Waterhouse
2
Watergate
2
watercourse
2
Waterbury
2
water
38
1
4
3
2

2

4
2
2
watchman
2
watchmake
38
1
4
3
2

2
a
4
1
2
watchmen
38
1
4
3
2
h
2
m
4
5
2
watchword
2
watchful
2
watchdog
2
watchband
2
watch
38
1
4
3
2

2
cet
4
3
2
Watson
2
Watkins
2
Watanabe
38
1
4
3
2

2

4
5
2
wastewater
2
wasteland
2
wasteful
2
wastebasket
2
waste
38
1
4
3
2

2
e
4
3
2
wastrel
2
wastage
2
wast
38
1
4
3
2

2

4
2
2
waspish
2
wasp
38
1
4
3
2

2

4
2
2
washbowl
2
washboard
38
1
4
3
2

2
o
4
2
2
Washburn
2
washbasin
38
1
4
3
2

2
b
4
4
2
washy
2
washout
2
wash
2
washington
38
1
4
3
2

2

4
3
2
warty
2
wartime
2
wart
38
1
4
3
2
nt
2

4
2
2
warranty
2
warrant
38
1
4
3
2

2
a
4
2
2
warrior
2
warren
38
1
4
3
2

2

4
2
2
warplane
2
warp
38
1
4
3
2

2

4
6
2
warmup
2
warmth
2
warmonger
2
warmish
2
warmhearted
2
warm
38
1
4
3
2
ouse
2

4
2
2
warehouseman
2
warehouse
38
1
4
3
2

2
h
4
1
2
ware
38
1
4
3
2
o
2

4
2
2
wardroom
2
wardrobe
38
1
4
3
2

2
r
4
2
2
warden
2
ward
38
1
4
3
2

2
demprt
4
10
2
wary
2
Warwick
2
Warsaw
2
warn
2
warlike
2
Waring
2
warhead
2
warfare
2
warble
2
war
38
1
4
3
2

2

4
3
2
Wappinger
2
wapiti
2
wapato
38
1
4
3
2

2

4
2
2
wangle
2
Wang
38
1
4
3
2

2

4
2
2
wander
2
wand
38
1
4
3
2

2

4
5
2
wanton
2
wants
2
wanting
2
wanted
2
want
38
1
4
3
2

2

4
2
2
waltzing
2
waltz
38
1
4
3
2
r
2

4
2
2
Walters
2
Walter
38
1
4
3
2

2
ez
4
3
2
Walton
2
Waltham
2
Walt
38
1
4
3
2

2

4
2
2
wallow
2
wallop
38
1
4
3
2

2

4
2
2
wallet
2
Waller
38
1
4
3
2

2

4
2
2
Wallace
2
wallaby
38
1
4
3
2

2
aeo
4
6
2
wally
2
Walls
2
wallpaper
2
Wallis
2
wallboard
2
wall
38
1
4
3
2

2

4
2
2
walkover
2
walkout
38
1
4
3
2

2
o
4
3
2
walkway
2
walkie
2
walk
38
1
4
3
2

2

4
2
2
Waldorf
2
Waldo
38
1
4
3
2

2
o
4
2
2
Waldron
2
Walden
38
1
4
3
2

2
dklt
4
7
2
Walsh
2
walrus
2
Walpole
2
walnut
2
Walgreen
2
wale
2
Walcott
38
1
4
3
2

2

4
2
2
wakeful
2
Wakefield
38
1
4
3
2
e
2
f
4
4
2
wakeup
2
wakerobin
2
waken
2
wake
38
1
4
3
2

2

4
3
2
waitress
2
Waite
2
wait
38
1
4
3
2
t
2

4
3
2
waistline
2
waistcoat
2
waist
38
1
4
3
2

2

4
2
2
Wainwright
2
wainscot
38
1
4
3
2

2
nst
4
2
2
waive
2
wail
38
1
4
3
2

2

4
2
2
Wahl
2
wah
38
1
4
3
2

2

4
2
2
waggle
2
wagging
38
1
4
3
2

2
g
4
4
2
wagoneer
2
Wagner
2
wage
2
wag
38
1
4
3
2

2

4
2
2
wafer
2
waffle
38
1
4
3
2

2

4
5
2
Wadsworth
2
wadi
2
wade
2
waddle
2
wad
38
1
4
3
2

2

4
3
2
wacky
2
wacke
2
wack
38
1
4
3
2

2
k
4
2
2
Waco
2
WAC
38
1
4
3
2
l
2

4
5
2
vulture
2
vulpine
2
vulnerable
2
vulgar
2
Vulcan
38
1
4
3
2

2

4
2
2
vowel
2
vow
38
1
4
3
2
h
2

4
2
2
vouchsafe
2
vouch
38
1
4
3
2

2
c
4
1
2
Vought
38
1
4
3
2

2

4
3
2
votive
2
vote
2
votary
38
1
4
3
2
c
2

4
2
2
vorticity
2
vortices
38
1
4
3
2

2
i
4
1
2
vortex
38
1
4
3
2
ci
2

4
2
2
voracity
2
voracious
38
1
4
3
2

2
at
4
0
38
1
4
3
2
r
2

4
2
2
voluntary
2
voluntarism
38
1
4
3
2
t
2
a
4
1
2
volunteer
38
1
4
3
2

2

4
2
2
volumetric
2
volume
38
1
4
3
2

2
e
4
1
2
voluminous
38
1
4
3
2

2
mn
4
2
2
voluptuous
2
voluble
38
1
4
3
2

2

4
2
2
Voltaire
2
voltaic
38
1
4
3
2

2
i
4
2
2
voltage
2
Volta
38
1
4
3
2

2
a
4
3
2
voltmeter
2
Volterra
2
volt
38
1
4
3
2
ey
2

4
2
2
volleyball
2
volley
38
1
4
3
2

2

4
2
2
volcanism
2
volcanic
38
1
4
3
2
an
2
i
4
1
2
volcano
38
1
4
3
2

2
cltu
4
5
2
Volvo
2
Volstead
2
Volkswagen
2
volition
2
volatile
38
1
4
3
2
e
2

4
3
2
voiceband
2
voices
2
voice
38
1
4
3
2

2

4
2
2
vogue
2
Vogel
38
1
4
3
2

2
bl
4
1
2
vocate
38
1
4
3
2

2

4
2
2
vocalic
2
vocal
38
1
4
3
2

2
u
4
1
2
vocable
38
1
4
3
2
lar
2

4
2
2
vocabulary
2
vocabularian
38
1
4
3
2

2
a
4
1
2
vociferous
38
1
4
3
2

2
c
4
1
2
void
38
1
4
3
2
adi
2

4
2
2
Vladivostok
2
Vladimir
38
1
4
3
2

2

4
3
2
vivify
2
vivid
2
Vivian
38
1
4
3
2

2
c
4
2
2
Vivaldi
2
viva
38
1
4
3
2

2

4
2
2
vivacity
2
vivacious
38
1
4
3
2

2
i
4
1
2
vivace
38
1
4
3
2

2
ai
4
1
2
vivo
38
1
4
3
2
l
2

4
2
2
vitriolic
2
vitriol
38
1
4
3
2

2
o
4
1
2
vitrify
38
1
4
3
2

2
i
4
2
2
vitro
2
vitreous
38
1
4
3
2

2

4
4
2
vitamin
2
vital
2
vitae
2
vita
38
1
4
3
2

2
ar
4
2
2
Vito
2
vitiate
38
1
4
3
2

2

4
3
2
visitor
2
visitation
2
visit
38
1
4
3
2
n
2

4
2
2
visionary
2
vision
38
1
4
3
2

2
ot
4
2
2
Visigoth
2
visible
38
1
4
3
2

2

4
2
2
viscous
2
viscount
38
1
4
3
2

2
u
4
3
2
viscosity
2
viscometer
2
viscoelastic
38
1
4
3
2
ra
2

4
2
2
visceral
2
viscera
38
1
4
3
2

2
eo
4
0
38
1
4
3
2

2

4
2
2
visage
2
visa
38
1
4
3
2

2
aci
4
6
2
visual
2
vista
2
visor
2
Vishnu
2
vise
2
vis
38
1
4
3
2

2

4
2
2
virus
2
virulent
38
1
4
3
2

2
i
4
1
2
virtuoso
38
1
4
3
2

2

4
2
2
virtuosity
2
virtuosi
38
1
4
3
2

2
s
4
1
2
virtuous
38
1
4
3
2
u
2
o
4
2
2
virtue
2
virtual
38
1
4
3
2

2
i
4
2
2
virgule
2
Virgo
38
1
4
3
2

2
n
4
1
2
Virgil
38
1
4
3
2
a
2

4
2
2
Virginian
2
Virginia
38
1
4
3
2

2
i
4
2
2
virginal
2
virgin
38
1
4
3
2

2
gtu
4
1
2
virile
38
1
4
3
2

2

4
2
2
violet
2
violent
38
1
4
3
2

2

4
2
2
violate
2
viola
38
1
4
3
2
l
2
ae
4
1
2
violin
38
1
4
3
2

2

4
2
2
vintner
2
vintage
38
1
4
3
2

2

4
3
2
vineyard
2
vinegar
2
vine
38
1
4
3
2
ic
2

4
2
2
vindictive
2
vindicate
38
1
4
3
2

2
det
4
3
2
vinyl
2
Vinson
2
Vincent
38
1
4
3
2

2
i
4
2
2
village
2
villa
38
1
4
3
2
n
2

4
2
2
villainous
2
villain
38
1
4
3
2

2
a
4
1
2
villein
38
1
4
3
2

2
l
4
2
2
vilify
2
vile
38
1
4
3
2

2

4
2
2
viii
2
vii
38
1
4
3
2
l
2
a
4
1
2
vigil
38
1
4
3
2
nt
2

4
3
2
vigilantism
2
vigilante
2
vigilant
38
1
4
3
2

2
i
4
2
2
vigorous
2
vignette
38
1
4
3
2
o
2

4
2
2
viewport
2
viewpoint
38
1
4
3
2
am
2

4
2
2
Vietnamese
2
Vietnam
38
1
4
3
2

2
n
4
1
2
Viet
38
1
4
3
2

2

4
2
2
Viennese
2
Vienna
38
1
4
3
2

2
n
4
1
2
Vientiane
38
1
4
3
2

2
p
4
2
2
views
2
view
38
1
4
3
2

2

4
2
2
videotape
2
video
38
1
4
3
2

2
o
4
1
2
vide
38
1
4
3
2

2
e
4
1
2
Vida
38
1
4
3
2

2

4
2
2
Victorian
2
Victoria
38
1
4
3
2

2
a
4
1
2
victorious
38
1
4
3
2
r
2
i
4
2
2
victory
2
victor
38
1
4
3
2

2
o
4
3
2
victual
2
victrola
2
victim
38
1
4
3
2

2

4
2
2
Vicky
2
Vicksburg
38
1
4
3
2

2

4
2
2
vicinity
2
vicinal
38
1
4
3
2

2
n
4
2
2
vicissitude
2
vicious
38
1
4
3
2

2

4
2
2
viceroy
2
vice
38
1
4
3
2
r
2

4
2
2
vicarious
2
vicar
38
1
4
3
2

2
aeikt
4
1
2
Vichy
38
1
4
3
2
a
2
t
4
1
2
vibrant
38
1
4
3
2

2

4
2
2
vibrato
2
vibrate
38
1
4
3
2

2
r
4
1
2
viburnum
38
1
4
3
2

2

4
3
2
vial
2
viaduct
2
via
38
1
4
3
2

2
wnt
4
1
2
vie
38
1
4
3
2
tio
2

4
2
2
vexatious
2
vexation
38
1
4
3
2

2
a
4
1
2
vex
38
1
4
3
2
nar
2

4
2
2
veterinary
2
veterinarian
38
1
4
3
2
r
2
i
4
1
2
veteran
38
1
4
3
2

2
e
4
3
2
veto
2
vetch
2
vet
38
1
4
3
2

2

4
2
2
vestigial
2
vestige
38
1
4
3
2

2
g
4
1
2
vestibule
38
1
4
3
2

2
i
4
3
2
vestry
2
vestal
2
vest
38
1
4
3
2

2
t
4
3
2
vessel
2
vesper
2
vesicular
38
1
4
3
2

2
a
4
1
2
vertices
38
1
4
3
2

2
c
4
1
2
vertigo
38
1
4
3
2

2
b
4
1
2
vertex
38
1
4
3
2
ra
2

4
4
2
vertebrate
2
vertebral
2
vertebrae
2
vertebra
38
1
4
3
2

2
ei
4
0
38
1
4
3
2

2
t
4
2
2
Versailles
2
versa
38
1
4
3
2

2

4
2
2
versatile
2
versatec
38
1
4
3
2

2
a
4
3
2
versus
2
version
2
verse
38
1
4
3
2
n
2

4
2
2
Veronica
2
Verona
38
1
4
3
2

2

4
3
2
vernal
2
vernacular
2
Verna
38
1
4
3
2

2
a
4
3
2
Vernon
2
vernier
2
Verne
38
1
4
3
2

2

4
2
2
vermouth
2
Vermont
38
1
4
3
2

2

4
3
2
vermin
2
vermilion
2
vermiculite
38
1
4
3
2

2
io
4
1
2
vermeil
38
1
4
3
2

2

4
2
2
verity
2
veritable
38
1
4
3
2

2
t
4
3
2
verisimilitude
2
verify
2
veridic
38
1
4
3
2

2

4
2
2
verdict
2
Verdi
38
1
4
3
2

2
i
4
2
2
Verde
2
verdant
38
1
4
3
2
s
2

4
2
2
verbosity
2
verbose
38
1
4
3
2

2

4
2
2
verbatim
2
verbal
38
1
4
3
2

2
ao
4
3
2
verbiage
2
verbena
2
verb
38
1
4
3
2
da
2

4
2
2
verandah
2
veranda
38
1
4
3
2
i
2

4
2
2
veracity
2
veracious
38
1
4
3
2

2
cn
4
1
2
Vera
38
1
4
3
2

2
abdimnost
4
4
2
verve
2
Verlag
2
verge
2
very
38
1
4
3
2
s
2

4
2
2
Venusian
2
Venus
38
1
4
3
2

2

4
2
2
venturesome
2
venture
38
1
4
3
2
r
2
e
4
1
2
venturi
38
1
4
3
2

2
u
4
3
2
ventricle
2
ventilate
2
vent
38
1
4
3
2

2

4
2
2
venomous
2
venom
38
1
4
3
2

2
m
4
1
2
venous
38
1
4
3
2

2

4
3
2
venison
2
Venice
2
venial
38
1
4
3
2
e
2

4
2
2
vengeful
2
vengeance
38
1
4
3
2

2

4
2
2
Veneto
2
Venetian
38
1
4
3
2

2

4
2
2
venerate
2
venerable
38
1
4
3
2

2
a
4
1
2
venereal
38
1
4
3
2

2
rt
4
2
2
Venezuela
2
veneer
38
1
4
3
2

2

4
4
2
vendor
2
vendible
2
vendetta
2
vend
38
1
4
3
2

2
degiotu
4
1
2
venal
38
1
4
3
2
et
2

4
2
2
velvety
2
velvet
38
1
4
3
2

2

4
2
2
velours
2
velocity
38
1
4
3
2

2

4
2
2
vellum
2
Vella
38
1
4
3
2

2

4
2
2
Velasquez
2
velar
38
1
4
3
2

2
alov
4
1
2
veldt
38
1
4
3
2

2

4
2
2
vein
2
veil
38
1
4
3
2
c
2

4
2
2
vehicular
2
vehicle
38
1
4
3
2

2
i
4
1
2
vehement
38
1
4
3
2
ta
2

4
3
2
vegetate
2
vegetarian
2
vegetable
38
1
4
3
2

2
e
4
1
2
Vega
38
1
4
3
2

2

4
2
2
veery
2
veer
38
1
4
3
2

2
r
4
1
2
vee
38
1
4
3
2
tor
2

4
2
2
vectorial
2
vector
38
1
4
3
2

2
ceghilnrstx
4
2
2
Veda
2
veal
38
1
4
3
2
h
2

4
2
2
Vaughn
2
Vaughan
38
1
4
3
2

2

4
2
2
Vaudois
2
vaudeville
38
1
4
3
2

2
dg
4
2
2
vaunt
2
vault
38
1
4
3
2

2

4
2
2
Vatican
2
vat
38
1
4
3
2
a
2

4
2
2
Vassar
2
vassal
38
1
4
3
2

2

4
2
2
vasectomy
2
vase
38
1
4
3
2

2
es
4
3
2
vast
2
Vasquez
2
vascular
38
1
4
3
2

2
ae
4
3
2
Varitype
2
varistor
2
various
38
1
4
3
2

2

4
2
2
variety
2
variegate
38
1
4
3
2

2

4
2
2
variant
2
Varian
38
1
4
3
2

2
n
4
3
2
variate
2
variac
2
variable
38
1
4
3
2

2
i
4
3
2
vary
2
varsity
2
varnish
38
1
4
3
2

2

4
2
2
vaporous
2
vapid
38
1
4
3
2

2

4
3
2
vanity
2
vanish
2
vanilla
38
1
4
3
2

2

4
2
2
Vanderpoel
2
Vanderbilt
38
1
4
3
2

2
r
4
1
2
Vandenberg
38
1
4
3
2

2
e
4
1
2
vandal
38
1
4
3
2

2

4
2
2
Vancouver
2
Vance
38
1
4
3
2

2
cdi
4
6
2
vantage
2
vanquish
2
vanguard
2
vane
2
vanadium
2
van
38
1
4
3
2
p
2

4
2
2
vampire
2
vamp
38
1
4
3
2

2

4
2
2
valuate
2
value
38
1
4
3
2
e
2

4
2
2
valley
2
Valletta
38
1
4
3
2

2

4
2
2
validate
2
valid
38
1
4
3
2

2
d
4
2
2
valine
2
valiant
38
1
4
3
2

2

4
2
2
Valery
2
Valerie
38
1
4
3
2
t
2

4
2
2
valentine
2
valent
38
1
4
3
2
r
2

4
2
2
valedictory
2
valedictorian
38
1
4
3
2
ict
2
o
4
1
2
valediction
38
1
4
3
2

2
dnr
4
3
2
valeur
2
valet
2
vale
38
1
4
3
2

2
eilu
4
5
2
valve
2
Valparaiso
2
Valois
2
Valkyrie
2
Valhalla
38
1
4
3
2

2

4
2
2
vainglorious
2
vain
38
1
4
3
2

2
n
4
1
2
Vail
38
1
4
3
2
na
2

4
2
2
vaginal
2
vagina
38
1
4
3
2

2

4
2
2
vagary
2
vagabond
38
1
4
3
2

2
ai
4
2
2
vague
2
vagrant
38
1
4
3
2

2

4
2
2
Vaduz
2
vade
38
1
4
3
2

2

4
2
2
vacuole
2
vacuolate
38
1
4
3
2

2
l
4
2
2
vacuous
2
vacuo
38
1
4
3
2

2
o
4
2
2
vacuum
2
vacua
38
1
4
3
2
in
2

4
2
2
vaccine
2
vaccinate
38
1
4
3
2

2
t
4
1
2
vacant
38
1
4
3
2

2

4
2
2
vacationland
2
vacate
38
1
4
3
2

2
acu
4
1
2
vacillate
38
1
4
3
2
er
2

4
3
2
uttermost
2
utterance
2
utter
38
1
4
3
2
pia
2

4
2
2
utopian
2
utopia
38
1
4
3
2
t
2

4
3
2
utilities
2
utility
2
utilitarian
38
1
4
3
2

2
i
4
1
2
utile
38
1
4
3
2

2
l
4
1
2
Utica
38
1
4
3
2

2

4
2
2
uterus
2
uterine
38
1
4
3
2

2
r
4
1
2
utensil
38
1
4
3
2

2
eiot
4
4
2
Utrecht
2
utmost
2
Utah
2
UT
38
1
4
3
2

2

4
2
2
usurpation
2
usurp
38
1
4
3
2

2
p
4
3
2
usury
2
usurious
2
usurer
38
1
4
3
2
l
2

4
2
2
usually
2
usual
38
1
4
3
2

2

4
2
2
USIA
2
using
38
1
4
3
2

2

4
2
2
USC&GS
2
USC
38
1
4
3
2

2

4
4
2
usage
2
USAF
2
usable
2
USA
38
1
4
3
2
S
2

4
2
2
U.S.A
2
U.S
38
1
4
3
2
l
2

4
2
2
Ursuline
2
Ursula
38
1
4
3
2

2
u
4
1
2
Ursa
38
1
4
3
2

2

4
2
2
urinary
2
urinal
38
1
4
3
2

2
a
4
1
2
urine
38
1
4
3
2

2
n
4
2
2
Uris
2
Uri
38
1
4
3
2

2
n
4
1
2
urge
38
1
4
3
2

2

4
2
2
urgent
2
urgency
38
1
4
3
2

2
e
4
1
2
urging
38
1
4
3
2
h
2

4
2
2
urethra
2
urethane
38
1
4
3
2

2
t
4
2
2
uremia
2
urea
38
1
4
3
2
an
2

4
4
2
urbanite
2
urbane
2
Urbana
2
urban
38
1
4
3
2

2
n
4
1
2
uracil
38
1
4
3
2

2

4
2
2
uranium
2
urania
38
1
4
3
2

2
i
4
2
2
uranyl
2
Uranus
38
1
4
3
2

2
abegis
4
3
2
Uruguay
2
urn
2
urchin
38
1
4
3
2

2

4
2
2
upwind
2
upward
38
1
4
3
2

2

4
2
2
uptown
2
Upton
38
1
4
3
2

2
o
4
3
2
upturn
2
uptrend
2
uptake
38
1
4
3
2

2
t
4
3
2
upstart
2
upstand
2
upstair
38
1
4
3
2
e
2

4
2
2
upstater
2
upstate
38
1
4
3
2

2
a
4
1
2
upstream
38
1
4
3
2

2

4
2
2
upsilon
2
upside
38
1
4
3
2
t
2

4
2
2
upsetting
2
upset
38
1
4
3
2

2
eit
4
4
2
upswing
2
upsurge
2
upslope
2
upshot
38
1
4
3
2
r
2

4
2
2
uproarious
2
uproar
38
1
4
3
2

2
a
4
1
2
uproot
38
1
4
3
2

2

4
3
2
upriver
2
uprise
2
upright
38
1
4
3
2

2
io
4
1
2
upraise
38
1
4
3
2
assm
2

4
2
2
upperclassmen
2
upperclassman
38
1
4
3
2

2
l
4
1
2
uppercut
38
1
4
3
2
er
2
c
4
2
2
uppermost
2
upper
38
1
4
3
2

2

4
2
2
uplift
2
upland
38
1
4
3
2
ter
2

4
2
2
upholstery
2
upholster
38
1
4
3
2
l
2
s
4
1
2
uphold
38
1
4
3
2

2

4
2
2
upheld
2
upheaval
38
1
4
3
2

2
eo
4
1
2
uphill
38
1
4
3
2

2

4
2
2
updraft
2
update
38
1
4
3
2

2

4
2
2
upbring
2
upbraid
38
1
4
3
2

2
r
4
1
2
upbeat
38
1
4
3
2
rs
2

4
3
2
universe
2
universal
2
university
38
1
4
3
2

2

4
3
2
univariate
2
univalent
2
Univac
38
1
4
3
2

2
ae
4
0
38
1
4
3
2

2

4
2
2
unite
2
united
38
1
4
3
2

2

4
2
2
unitary
2
unitarian
38
1
4
3
2

2
r
4
1
2
unital
38
1
4
3
2

2
ae
4
2
2
unity
2
unit
38
1
4
3
2

2

4
2
2
unison
2
unisex
38
1
4
3
2

2

4
3
2
uniprocessor
2
unipolar
2
uniplex
38
1
4
3
2
od
2

4
2
2
unimodular
2
unimodal
38
1
4
3
2

2

4
2
2
unify
2
uniform
38
1
4
3
2
i
2

4
2
2
unidirectional
2
unidimensional
38
1
4
3
2
r
2
c
4
3
2
understand
2
underling
2
under
38
1
4
3
2
lassm
2

4
2
2
underclassmen
2
underclassman
38
1
4
3
2

2
e
4
1
2
undulate
38
1
4
3
2

2
l
4
4
2
unceremoniously
2
unction
2
uncouth
2
unchristian
38
1
4
3
2

2

4
2
2
unbidden
2
unbeknownst
38
1
4
3
2
im
2

4
2
2
unanimous
2
unanimity
38
1
4
3
2

2
n
4
1
2
unary
38
1
4
3
2

2
ir
4
1
2
umber
38
1
4
3
2

2

4
2
2
umbrage
2
umbra
38
1
4
3
2

2
a
4
1
2
umbrella
38
1
4
3
2
lic
2

4
3
2
umbilicus
2
umbilici
2
umbilical
38
1
4
3
2

2
b
4
2
2
umpire
2
umlaut
38
1
4
3
2
mat
2

4
2
2
ultimatum
2
ultimate
38
1
4
3
2

2
i
4
2
2
ultra
2
ulterior
38
1
4
3
2
er
2

4
2
2
ulcerate
2
ulcer
38
1
4
3
2

2
ct
4
4
2
Ulysses
2
Ulster
2
Ullman
2
Ulan
38
1
4
3
2
ain
2

4
2
2
Ukrainian
2
Ukraine
38
1
4
3
2

2
r
4
1
2
UK
38
1
4
3
2

2

4
3
2
ugly
2
ugh
2
Uganda
38
1
4
3
2
iquit
2

4
2
2
ubiquity
2
ubiquitous
38
1
4
3
2
n
2
n
4
1
2
tyrant
38
1
4
3
2

2
i
4
2
2
tyranny
2
Tyrannosaurus
38
1
4
3
2
c
2

4
2
2
tyrannicide
2
tyrannic
38
1
4
3
2

2
a
4
1
2
tyrosine
38
1
4
3
2
raph
2

4
2
2
typography
2
typographer
38
1
4
3
2

2
g
4
2
2
typology
2
typo
38
1
4
3
2

2

4
3
2
typing
2
typify
2
typic
38
1
4
3
2

2

4
3
2
typhoon
2
Typhon
2
typhoid
38
1
4
3
2

2
o
4
1
2
typhus
38
1
4
3
2

2
sw
4
3
2
typed
2
typeface
2
type
38
1
4
3
2
rit
2

4
2
2
typewritten
2
typewrite
38
1
4
3
2

2

4
2
2
typesetting
2
typesetter
38
1
4
3
2
t
2
t
4
1
2
typeset
38
1
4
3
2

2
e
4
2
2
typescript
2
types
38
1
4
3
2

2
ehio
4
0
38
1
4
3
2

2

4
4
2
twosome
2
Twombly
2
twofold
2
two
38
1
4
3
2
h
2

4
2
2
twitchy
2
twitch
38
1
4
3
2

2
c
4
1
2
twit
38
1
4
3
2
t
2

4
2
2
twisty
2
twist
38
1
4
3
2
l
2

4
2
2
twirly
2
twirl
38
1
4
3
2

2

4
4
2
twinkle
2
twinge
2
twine
2
twin
38
1
4
3
2

2

4
2
2
twill
2
twilight
38
1
4
3
2

2

4
2
2
twigging
2
twig
38
1
4
3
2

2
glnrst
4
2
2
twiddle
2
twice
38
1
4
3
2
t
2

4
2
2
twenty
2
twentieth
38
1
4
3
2

2

4
2
2
twelve
2
twelfth
38
1
4
3
2

2

4
2
2
tweedy
2
tweed
38
1
4
3
2

2
d
4
1
2
tweeze
38
1
4
3
2

2
eln
4
1
2
tweak
38
1
4
3
2

2

4
3
2
twain
2
twaddle
2
TWA
38
1
4
3
2

2
aeio
4
1
2
TWX
38
1
4
3
2

2

4
2
2
TVA
2
TV
38
1
4
3
2
r
2

4
2
2
tutorial
2
tutor
38
1
4
3
2

2
o
4
3
2
tutu
2
Tuttle
2
tutelage
38
1
4
3
2

2

4
2
2
Tuskegee
2
tusk
38
1
4
3
2
a
2
n
4
2
2
Tuscarora
2
Tuscaloosa
38
1
4
3
2

2

4
2
2
Tuscany
2
Tuscan
38
1
4
3
2

2
ck
4
1
2
tussle
38
1
4
3
2
le
2

4
3
2
turtleneck
2
turtleback
2
turtle
38
1
4
3
2

2

4
2
2
turpitude
2
turpentine
38
1
4
3
2

2

4
3
2
turnover
2
turnout
2
turnoff
38
1
4
3
2

2

4
2
2
turnery
2
turned
38
1
4
3
2

2

4
2
2
turnaround
2
turnabout
38
1
4
3
2

2

4
3
2
Turkish
2
turkey
2
turk
38
1
4
3
2
n
2

4
2
2
Turing
2
Turin
38
1
4
3
2

2

4
2
2
turbojet
2
turbofan
38
1
4
3
2

2

4
2
2
turbine
2
turbinate
38
1
4
3
2

2

4
2
2
turbidity
2
turbid
38
1
4
3
2

2
dn
4
0
38
1
4
3
2

2
io
4
2
2
turbulent
2
turban
38
1
4
3
2

2
aeo
4
6
2
turntable
2
turnstone
2
turnpike
2
turnkey
2
turnip
2
turn
38
1
4
3
2

2

4
2
2
tuple
2
tupelo
38
1
4
3
2

2

4
2
2
Tunisia
2
Tunis
38
1
4
3
2

2
s
4
1
2
tunic
38
1
4
3
2
t
2

4
2
2
tungsten
2
tungstate
38
1
4
3
2

2
s
4
1
2
tung
38
1
4
3
2

2

4
3
2
tuned
2
tuneful
2
tune
38
1
4
3
2

2
egi
4
4
2
tunnel
2
tundra
2
tuna
2
tun
38
1
4
3
2
lt
2

4
2
2
tumultuous
2
tumult
38
1
4
3
2

2

4
2
2
tumbrel
2
tumble
38
1
4
3
2

2
bu
4
1
2
tum
38
1
4
3
2

2

4
2
2
tularemia
2
Tulane
38
1
4
3
2

2
a
4
3
2
Tulsa
2
tulle
2
tulip
38
1
4
3
2

2

4
2
2
tugging
2
tug
38
1
4
3
2

2

4
2
2
tuft
2
tuff
38
1
4
3
2

2

4
2
2
Tucker
2
tuck
38
1
4
3
2

2
k
4
1
2
Tucson
38
1
4
3
2
l
2

4
2
2
tubule
2
tubular
38
1
4
3
2
cul
2

4
2
2
tuberculosis
2
tuberculin
38
1
4
3
2

2
r
4
1
2
tube
38
1
4
3
2

2
eu
4
2
2
tuba
2
tub
38
1
4
3
2

2

4
2
2
TTY
2
TTL
38
1
4
3
2
r
2

4
2
2
tsarina
2
tsar
38
1
4
3
2

2
a
4
1
2
tsunami
38
1
4
3
2
h
2

4
2
2
truthful
2
truth
38
1
4
3
2

2

4
4
2
trustworthy
2
trustful
2
trustee
2
trust
38
1
4
3
2

2
t
4
1
2
truss
38
1
4
3
2

2
c
4
2
2
trunk
2
trundle
38
1
4
3
2

2

4
2
2
trumpet
2
trumpery
38
1
4
3
2

2
e
4
1
2
trump
38
1
4
3
2

2
p
4
2
2
Trumbull
2
Truman
38
1
4
3
2

2

4
2
2
Trudy
2
trudge
38
1
4
3
2

2

4
3
2
truculent
2
truck
2
truce
38
1
4
3
2
n
2

4
2
2
truant
2
truancy
38
1
4
3
2

2

4
2
2
Troutman
2
trout
38
1
4
3
2

2
l
4
1
2
troubador
38
1
4
3
2

2

4
2
2
troublesome
2
troubleshoot
38
1
4
3
2
e
2
s
4
1
2
trouble
38
1
4
3
2

2
bt
4
4
2
trouser
2
troupe
2
trounce
2
trough
38
1
4
3
2
pher
2

4
2
2
tropospheric
2
troposphere
38
1
4
3
2

2
s
4
1
2
tropopause
38
1
4
3
2

2

4
2
2
trophy
2
trophic
38
1
4
3
2

2
ho
4
1
2
tropic
38
1
4
3
2

2

4
2
2
trompe
2
trombone
38
1
4
3
2
l
2

4
3
2
trollop
2
trolley
2
troll
38
1
4
3
2

2

4
2
2
trodden
2
trod
38
1
4
3
2

2
dlmpu
4
6
2
troy
2
trot
2
troop
2
Trojan
2
troika
2
troglodyte
38
1
4
3
2

2

4
2
2
trivial
2
trivia
38
1
4
3
2

2
a
4
1
2
trivium
38
1
4
3
2

2
i
4
1
2
trivalent
38
1
4
3
2
ph
2
a
4
1
2
triumph
38
1
4
3
2

2

4
2
2
triumphant
2
triumphal
38
1
4
3
2

2
m
4
1
2
triune
38
1
4
3
2

2

4
3
2
triton
2
tritium
2
trite
38
1
4
3
2
a
2

4
2
2
tristate
2
Tristan
38
1
4
3
2

2
t
4
2
2
trisyllable
2
trisodium
38
1
4
3
2

2

4
2
2
tripoli
2
tripod
38
1
4
3
2

2
t
4
2
2
triplex
2
triple
38
1
4
3
2

2

4
2
2
Triplett
2
triplet
38
1
4
3
2

2
e
4
1
2
triplicate
38
1
4
3
2

2
lo
4
5
2
triptych
2
triphenylphosphine
2
tripe
2
tripartite
2
trip
38
1
4
3
2

2

4
3
2
trioxide
2
triode
2
trio
38
1
4
3
2

2
t
4
1
2
Trinidad
38
1
4
3
2

2

4
2
2
trinity
2
trinitarian
38
1
4
3
2

2
i
4
1
2
trinket
38
1
4
3
2

2

4
2
2
trimester
2
trimer
38
1
4
3
2

2
e
4
1
2
trim
38
1
4
3
2

2

4
2
2
trilogy
2
trilobite
38
1
4
3
2

2
i
4
1
2
trill
38
1
4
3
2
on
2

4
2
2
trillionth
2
trillion
38
1
4
3
2

2
lo
4
0
38
1
4
3
2
n
2

4
2
2
trigonometry
2
trigonal
38
1
4
3
2

2
o
4
2
2
trigram
2
trig
38
1
4
3
2
o
2

4
2
2
trifluouride
2
trifluoride
38
1
4
3
2
l
2
u
4
1
2
trifle
38
1
4
3
2

2

4
3
2
tries
2
triennial
2
tried
38
1
4
3
2

2

4
2
2
tridiagonal
2
trident
38
1
4
3
2

2

4
5
2
tricky
2
trickster
2
trickle
2
trickery
2
trick
38
1
4
3
2
oro
2

4
2
2
trichloroethane
2
trichloroacetic
38
1
4
3
2

2
l
4
2
2
trichrome
2
Trichinella
38
1
4
3
2

2
hk
4
1
2
Triceratops
38
1
4
3
2

2

4
2
2
tribute
2
tributary
38
1
4
3
2

2

4
2
2
tribune
2
tribunal
38
1
4
3
2

2
nt
4
1
2
tribulate
38
1
4
3
2
m
2

4
2
2
tribesmen
2
tribesman
38
1
4
3
2

2
s
4
1
2
tribe
38
1
4
3
2

2
eu
4
1
2
tribal
38
1
4
3
2

2
u
4
1
2
triangle
38
1
4
3
2

2

4
2
2
triangulate
2
triangular
38
1
4
3
2
l
2
a
4
1
2
Triangulum
38
1
4
3
2

2
g
4
1
2
Trianon
38
1
4
3
2

2
n
4
6
2
triatomic
2
Triassic
2
trial
2
triad
2
triac
2
triable
38
1
4
3
2

2
abcdefglmnopstuv
4
1
2
trihedral
38
1
4
3
2

2

4
3
2
trestle
2
tress
2
trespass
38
1
4
3
2

2

4
2
2
trendy
2
trend
38
1
4
3
2
h
2
e
4
2
2
trenchant
2
trench
38
1
4
3
2
rm
2

4
2
2
trenchermen
2
trencherman
38
1
4
3
2

2
cd
4
1
2
Trenton
38
1
4
3
2

2

4
4
2
tremulous
2
tremor
2
tremendous
2
tremble
38
1
4
3
2

2

4
2
2
treetop
2
tree
38
1
4
3
2

2
cdst
4
0
38
1
4
3
2

2

4
3
2
treaty
2
treatise
2
treat
38
1
4
3
2
r
2

4
2
2
treasury
2
treasure
38
1
4
3
2
n
2

4
2
2
treasonous
2
treason
38
1
4
3
2

2
ou
4
0
38
1
4
3
2

2

4
3
2
treadmill
2
treadle
2
tread
38
1
4
3
2
her
2

4
2
2
treachery
2
treacherous
38
1
4
3
2

2
aemns
4
6
2
Trevelyan
2
trepidation
2
trellis
2
trek
2
trefoil
2
treble
38
1
4
3
2

2
a
4
1
2
traverse
38
1
4
3
2

2

4
2
2
traversal
2
traversable
38
1
4
3
2

2
s
4
1
2
travertine
38
1
4
3
2

2

4
2
2
travelogue
2
travel
38
1
4
3
2

2
lr
4
1
2
travesty
38
1
4
3
2

2
e
4
2
2
Travis
2
travail
38
1
4
3
2
ma
2

4
2
2
traumatic
2
trauma
38
1
4
3
2

2

4
2
2
trashy
2
trash
38
1
4
3
2

2
h
4
1
2
Trastevere
38
1
4
3
2
id
2

4
2
2
trapezoidal
2
trapezoid
38
1
4
3
2
z
2
o
4
1
2
trapezium
38
1
4
3
2

2
e
4
1
2
trap
38
1
4
3
2
s
2

4
2
2
transverse
2
transversal
38
1
4
3
2
e
2
r
4
1
2
transvestite
38
1
4
3
2

2

4
2
2
transshipping
2
transshipped
38
1
4
3
2
hip
2
p
4
1
2
transship
38
1
4
3
2

2

4
3
2
transposition
2
transpose
2
transposable
38
1
4
3
2
t
2

4
3
2
transporter
2
transportation
2
transport
38
1
4
3
2

2
rs
4
1
2
transpond
38
1
4
3
2
ant
2

4
2
2
transplantation
2
transplant
38
1
4
3
2
r
2

4
2
2
transpire
2
transpiration
38
1
4
3
2

2

4
2
2
transparent
2
transpacific
38
1
4
3
2

2
ailo
4
0
38
1
4
3
2

2

4
2
2
transom
2
transoceanic
38
1
4
3
2
t
2

4
2
2
transmute
2
transmutation
38
1
4
3
2

2
st
4
0
38
1
4
3
2

2

4
2
2
transmitter
2
transmitted
38
1
4
3
2

2

4
3
2
transmittance
2
transmittal
2
transmittable
38
1
4
3
2

2
ae
4
1
2
transmitting
38
1
4
3
2

2
t
4
1
2
transmit
38
1
4
3
2
si
2

4
2
2
transmission
2
transmissible
38
1
4
3
2

2
iu
4
1
2
transmogrify
38
1
4
3
2

2

4
3
2
translucent
2
transliterate
2
translate
38
1
4
3
2

2

4
2
2
transitive
2
transition
38
1
4
3
2

2
i
4
3
2
transitory
2
Transite
2
transit
38
1
4
3
2

2
t
4
2
2
transistor
2
transient
38
1
4
3
2
ress
2

4
3
2
transgressor
2
transgression
2
transgress
38
1
4
3
2
s
2

4
3
2
transfusion
2
transfuse
2
transfusable
38
1
4
3
2
rm
2

4
2
2
transformation
2
transform
38
1
4
3
2

2

4
2
2
transfix
2
transfinite
38
1
4
3
2
r
2
er
4
3
2
transferor
2
transferable
2
transfer
38
1
4
3
2

2

4
3
2
transferring
2
transferred
2
transferral
38
1
4
3
2

2

4
2
2
transference
2
transferee
38
1
4
3
2

2
eiou
4
0
38
1
4
3
2

2

4
2
2
transept
2
transect
38
1
4
3
2
uc
2

4
2
2
transduction
2
transducer
38
1
4
3
2
t
2

4
2
2
transcription
2
transcript
38
1
4
3
2
i
2
p
4
1
2
transcribe
38
1
4
3
2
n
2

4
2
2
transcontinental
2
transconductance
38
1
4
3
2

2
n
4
1
2
transceiver
38
1
4
3
2
nt
2

4
2
2
transcendental
2
transcendent
38
1
4
3
2
d
2
e
4
1
2
transcend
38
1
4
3
2

2
eor
4
0
38
1
4
3
2

2

4
3
2
transatlantic
2
transalpine
2
transact
38
1
4
3
2

2
acdefgilmopsv
4
1
2
Transylvania
38
1
4
3
2
uil
2

4
2
2
tranquillity
2
tranquil
38
1
4
3
2

2
qs
4
1
2
trance
38
1
4
3
2

2
s
4
1
2
your
38
1
4
3
2

2

4
2
2
trample
2
tramp
38
1
4
3
2

2

4
4
2
you've
2
you're
2
you'll
2
you'd
38
1
4
3
2

2
'rnt
4
1
2
you
38
1
4
3
2

2
udgknrs
4
2
2
yow
2
yolk
38
1
4
3
2

2
p
4
3
2
tramway
2
trammel
2
tram
38
1
4
3
2

2
alos
4
5
2
Yerkes
2
yen
2
Yemen
2
yet
2
ye
38
1
4
3
2

2
rs
4
4
2
Yeats
2
yeah
2
Yeager
2
yea
38
1
4
3
2

2
eoaituv
4
5
2
YWCA
2
y's
2
Ypsilanti
2
YMCA
2
y
38
1
4
3
2
r
2

4
2
2
traitorous
2
traitor
38
1
4
3
2

2
o
4
1
2
trait
38
1
4
3
2

2

4
2
2
trainmen
2
trainman
38
1
4
3
2

2
bmps
4
10
2
worktable
2
workout
2
workload
2
workhorse
2
workforce
2
workday
2
workaday
2
working
2
worked
2
work
38
1
4
3
2

2
s
4
2
2
wordy
2
word
38
1
4
3
2

2

4
2
2
trainee
2
trained
38
1
4
3
2

2
dklmrst
4
3
2
worn
2
wore
2
Worcester
38
1
4
3
2

2
ab
4
1
2
women
38
1
4
3
2

2
mreklnouv
4
4
2
wow
2
Wotan
2
wop
2
wobble
38
1
4
3
2

2

4
4
2
trailside
2
trailhead
2
trailblaze
2
trail
38
1
4
3
2

2
hct
4
2
2
witness
2
wit
38
1
4
3
2

2
em
4
2
2
training
2
train
38
1
4
3
2
c
2

4
2
2
tragicomic
2
tragic
38
1
4
3
2

2
tcdeglnrs
4
5
2
wizard
2
wive
2
wipe
2
wife
2
WI
38
1
4
3
2
d
2

4
2
2
tragedy
2
tragedian
38
1
4
3
2

2
ei
4
1
2
trag
38
1
4
3
2

2
'lmos
4
5
2
whore
2
whop
2
whoever
2
whoa
2
who
38
1
4
3
2

2

4
2
2
trafficking
2
trafficked
38
1
4
3
2
fic
2
k
4
1
2
traffic
38
1
4
3
2

2
cmnprstzl
4
2
2
whig
2
whiff
38
1
4
3
2

2
aelnrt
4
0
38
1
4
3
2
tion
2

4
2
2
tradition
2
traditional
38
1
4
3
2
m
2

4
2
2
tradesmen
2
tradesman
38
1
4
3
2

2
eioa
4
2
2
whup
2
why
38
1
4
3
2

2
tl
4
0
38
1
4
3
2

2
s
4
3
2
tradeoff
2
trademark
2
trade
38
1
4
3
2

2
kd
4
2
2
weep
2
wee
38
1
4
3
2

2

4
2
2
tractor
2
tract
38
1
4
3
2

2
esab'dilnrt
4
5
2
Weyerhauser
2
wept
2
Wehr
2
WECo
2
we
38
1
4
3
2

2
nsycdfghiklprtvx
4
3
2
Wabash
2
Waals
2
WA
38
1
4
3
2

2

4
2
2
trackage
2
track
38
1
4
3
2

2

4
4
2
traceback
2
tracery
2
traceable
2
trace
38
1
4
3
2

2
ls
4
4
2
wayward
2
Wayne
2
waybill
2
way
38
1
4
3
2

2
hpt
4
3
2
Wasserman
2
wasn't
2
was
38
1
4
3
2

2
ekt
4
2
2
Tracy
2
trachea
38
1
4
3
2

2

4
2
2
Toyota
2
toy
38
1
4
3
2

2

4
2
2
toxicology
2
toxic
38
1
4
3
2

2
tdg
4
2
2
wane
2
wan
38
1
4
3
2

2
aehioruy
4
3
2
WV
2
w's
2
w
38
1
4
3
2

2
icglrtuw
4
5
2
voyage
2
Voss
2
voodoo
2
von
2
vomit
38
1
4
3
2
i
2
c
4
1
2
toxin
38
1
4
3
2

2

4
2
2
townsmen
2
townsman
38
1
4
3
2

2
eabcdgilnorstv
4
4
2
viz
2
vixen
2
Viking
2
vi
38
1
4
3
2

2
cdgilmnprstu
4
1
2
VA
38
1
4
3
2

2
aioelu
4
6
2
vying
2
VT
2
v's
2
Vreeland
2
VHF
2
v
38
1
4
3
2

2
m
4
1
2
Townsend
38
1
4
3
2

2
s
4
2
2
townhouse
2
town
38
1
4
3
2

2
ar
4
0
38
1
4
3
2
e
2

4
2
2
towhee
2
towhead
38
1
4
3
2

2

4
5
2
useless
2
uses
2
useful
2
used
2
use
38
1
4
3
2

2
euaCI
4
7
2
USSR
2
USPS
2
USN
2
usher
2
USGS
2
USDA
2
us
38
1
4
3
2

2
bdhlprstw
4
6
2
upkeep
2
upgrade
2
upend
2
upcome
2
upon
2
up
38
1
4
3
2

2

4
2
2
tower
2
towel
38
1
4
3
2

2
iabcdksf
4
6
2
unless
2
unwieldy
2
unruly
2
UNESCO
2
until
2
UN
38
1
4
3
2
n
2

4
2
2
unions
2
union
38
1
4
3
2
rd
2

4
2
2
towards
2
toward
38
1
4
3
2

2
odfmpstv
4
7
2
Unix
2
Uniroyal
2
unique
2
uninominal
2
unilateral
2
unicorn
2
uniaxial
38
1
4
3
2

2
npsbgklmr.t
4
4
2
u's
2
UHF
2
UCLA
2
u
38
1
4
3
2

2
pr
4
6
2
Tyson
2
Tyndall
2
Tyler
2
tying
2
tycoon
2
Tyburn
38
1
4
3
2

2

4
2
2
tournament
2
tour
38
1
4
3
2
h
2

4
4
2
touchy
2
touchstone
2
touchdown
2
touch
38
1
4
3
2

2
nbikpt
4
6
2
turvy
2
turret
2
turquoise
2
turmoil
2
turgid
2
turf
38
1
4
3
2

2
rbcfglmnpst
4
4
2
tuxedo
2
tuition
2
Tudor
2
tuesday
38
1
4
3
2

2
crg
4
2
2
tout
2
tousle
38
1
4
3
2

2

4
4
2
trytophan
2
trypsin
2
trying
2
try
38
1
4
3
2

2
acdmnst
4
3
2
truism
2
truly
2
true
38
1
4
3
2

2

4
2
2
totemic
2
totem
38
1
4
3
2

2
m
4
1
2
tote
38
1
4
3
2

2
dicfgmnpsuv
4
3
2
tray
2
trawl
2
trajectory
38
1
4
3
2

2
nlt
4
1
2
traipse
38
1
4
3
2

2
ei
4
0
38
1
4
3
2
l
2

4
2
2
totalitarian
2
total
38
1
4
3
2

2
auyeio
4
1
2
TRW
38
1
4
3
2

2
aehn
4
2
2
towboat
2
tow
38
1
4
3
2

2
ae
4
1
2
tot
38
1
4
3
2

2

4
2
2
toss
2
Toshiba
38
1
4
3
2

2

4
2
2
torture
2
tortuous
38
1
4
3
2
ise
2

4
2
2
tortoiseshell
2
tortoise
38
1
4
3
2

2
ou
4
1
2
tort
38
1
4
3
2

2

4
2
2
torso
2
torsion
38
1
4
3
2

2

4
2
2
things
2
thing
38
1
4
3
2

2

4
4
2
torrid
2
torrent
2
Torrance
2
torr
38
1
4
3
2

2

4
3
2
torpor
2
torpid
2
torpedo
38
1
4
3
2
d
2

4
2
2
toroidal
2
toroid
38
1
4
3
2

2

4
2
2
telephones
2
telephone
38
1
4
3
2

2
i
4
1
2
Toronto
38
1
4
3
2

2

4
2
2
tornado
2
torn
38
1
4
3
2

2

4
2
2
teams
2
teamster
38
1
4
3
2

2
o
4
5
2
taker
2
takes
2
taketh
2
taken
2
take
38
1
4
3
2

2
noprst
4
8
2
tory
2
torus
2
torque
2
tori
2
tore
2
torch
2
Torah
2
tor
38
1
4
3
2
t
2

4
2
2
supports
2
support
38
1
4
3
2

2

4
2
2
Topsy
2
topsoil
38
1
4
3
2
og
2

4
2
2
topology
2
topologize
38
1
4
3
2

2

4
2
2
styles
2
style
38
1
4
3
2

2
l
4
2
2
topography
2
topocentric
38
1
4
3
2

2
a
4
1
2
statesmen
38
1
4
3
2

2
osi
4
8
2
topple
2
topnotch
2
topmost
2
topgallant
2
Topeka
2
topcoat
2
topaz
2
top
38
1
4
3
2

2

4
2
2
toothpick
2
toothpaste
38
1
4
3
2
rd
2

4
2
2
standards
2
standard
38
1
4
3
2

2

4
2
2
spending
2
spend
38
1
4
3
2

2
p
4
2
2
toothbrush
2
tooth
38
1
4
3
2

2
h
4
2
2
tootle
2
toot
38
1
4
3
2
c
2
a
4
1
2
specific
38
1
4
3
2

2

4
3
2
spaceship
2
spaces
2
spacesuit
38
1
4
3
2
et
2

4
2
2
soviets
2
soviet
38
1
4
3
2

2

4
4
2
toolsmith
2
toolmake
2
toolkit
2
tool
38
1
4
3
2
e
2

4
2
2
sources
2
source
38
1
4
3
2

2
lt
4
3
2
took
2
toodle
2
too
38
1
4
3
2
il
2

4
2
2
tonsillitis
2
tonsil
38
1
4
3
2
me
2

4
2
2
sometimes
2
sometime
38
1
4
3
2

2

4
2
2
smaller
2
Smalley
38
1
4
3
2

2

4
3
2
tonight
2
tonic
2
Toni
38
1
4
3
2

2

4
2
2
sizes
2
size
38
1
4
3
2
t
2

4
2
2
situation
2
situate
38
1
4
3
2

2

4
2
2
tongue
2
tong
38
1
4
3
2
e
2

4
2
2
sincerely
2
sincere
38
1
4
3
2

2
gis
4
6
2
tony
2
tonnage
2
tonk
2
tone
2
tonal
2
ton
38
1
4
3
2
raph
2

4
2
2
tomography
2
tomograph
38
1
4
3
2

2
g
4
1
2
tomorrow
38
1
4
3
2

2

4
2
2
tommy
2
Tommie
38
1
4
3
2

2

4
3
2
server
2
served
2
serve
38
1
4
3
2

2

4
2
2
tombstone
2
tomb
38
1
4
3
2

2

4
3
2
sends
2
sending
2
send
38
1
4
3
2
to
2

4
2
2
tomatoes
2
tomato
38
1
4
3
2

2
abmo
4
4
2
Tompkins
2
Tomlinson
2
tome
2
Tom
38
1
4
3
2

2
i
4
3
2
seems
2
seemed
2
seem
38
1
4
3
2

2
i
4
1
2
secure
38
1
4
3
2

2

4
3
2
tollhouse
2
tollgate
2
toll
38
1
4
3
2
a
2

4
3
2
tolerate
2
tolerant
2
tolerable
38
1
4
3
2

2
r
4
1
2
Toledo
38
1
4
3
2

2
el
4
3
2
toluene
2
Tolstoy
2
told
38
1
4
3
2

2

4
3
2
says
2
saying
2
say
38
1
4
3
2

2

4
3
2
Tokyo
2
token
2
tokamak
38
1
4
3
2
t
2

4
2
2
toiletry
2
toilet
38
1
4
3
2
e
2

4
2
2
rules
2
rule
38
1
4
3
2
l
2
e
4
2
2
toilsome
2
toil
38
1
4
3
2
w
2

4
2
2
reviews
2
review
38
1
4
3
2

2

4
2
2
toggle
2
togging
38
1
4
3
2

2
g
4
4
2
togs
2
Togo
2
together
2
tog
38
1
4
3
2
rn
2

4
3
2
returning
2
returned
2
return
38
1
4
3
2

2

4
2
2
tofu
2
toffee
38
1
4
3
2

2

4
3
2
toenail
2
TOEFL
2
toe
38
1
4
3
2
rce
2

4
3
2
resources
2
resource
2
resourceful
38
1
4
3
2

2

4
4
2
requirements
2
requires
2
required
2
require
38
1
4
3
2

2

4
2
2
toddle
2
Todd
38
1
4
3
2
y
2

4
2
2
today'll
2
today
38
1
4
3
2

2
ad
4
0
38
1
4
3
2

2
e
4
1
2
requiring
38
1
4
3
2

2

4
2
2
Tobago
2
tobacco
38
1
4
3
2
n
2

4
3
2
remains
2
remain
2
remainder
38
1
4
3
2

2
a
4
1
2
Toby
38
1
4
3
2
t
2

4
2
2
toastmaster
2
toast
38
1
4
3
2
n
2

4
2
2
relations
2
relation
38
1
4
3
2

2
o
4
1
2
relating
38
1
4
3
2

2

4
2
2
related
2
relate
38
1
4
3
2

2

4
2
2
toady
2
toad
38
1
4
3
2

2
ds
4
0
38
1
4
3
2

2
abdEfgiklmnoprstwuxy
4
2
2
toccata
2
to
38
1
4
3
2

2
ei
4
0
38
1
4
3
2
n
2

4
2
2
regions
2
region
38
1
4
3
2

2

4
2
2
TNT
2
TN
38
1
4
3
2
d
2

4
2
2
records
2
record
38
1
4
3
2
t
2

4
2
2
recently
2
recent
38
1
4
3
2

2

4
2
2
Titus
2
titular
38
1
4
3
2

2

4
2
2
received
2
receive
38
1
4
3
2

2
e
4
1
2
receiving
38
1
4
3
2
on
2
a
4
2
2
reasons
2
reason
38
1
4
3
2

2

4
2
2
titillate
2
titian
38
1
4
3
2

2

4
2
2
titanium
2
titanic
38
1
4
3
2

2

4
2
2
reaches
2
reached
38
1
4
3
2

2
e
4
2
2
reaching
2
reach
38
1
4
3
2
n
2
i
4
2
2
titanate
2
Titan
38
1
4
3
2

2
aiu
4
5
2
titrate
2
titmouse
2
title
2
tithe
2
tit
38
1
4
3
2
n
2

4
2
2
raising
2
raisin
38
1
4
3
2

2

4
2
2
tiresome
2
tire
38
1
4
3
2

2

4
2
2
Tirana
2
tirade
38
1
4
3
2

2

4
3
2
raises
2
raised
2
raise
38
1
4
3
2

2
ae
4
0
38
1
4
3
2

2

4
2
2
quickly
2
quicklime
38
1
4
3
2

2

4
3
2
tippy
2
tipple
2
Tipperary
38
1
4
3
2

2
n
4
3
2
provides
2
provided
2
provide
38
1
4
3
2

2
p
4
4
2
tiptoe
2
tipsy
2
tipoff
2
tip
38
1
4
3
2

2

4
2
2
tintype
2
tint
38
1
4
3
2

2

4
2
2
proposing
2
proposition
38
1
4
3
2

2

4
3
2
proposes
2
proposed
2
propose
38
1
4
3
2

2

4
2
2
tinkle
2
tinker
38
1
4
3
2

2
e
4
2
2
programming
2
programmable
38
1
4
3
2

2

4
2
2
tingle
2
tinge
38
1
4
3
2

2

4
2
2
profits
2
profit
38
1
4
3
2

2

4
2
2
productivity
2
productive
38
1
4
3
2

2
v
4
1
2
production
38
1
4
3
2

2
i
4
2
2
products
2
product
38
1
4
3
2

2
gkt
4
8
2
tiny
2
tinsel
2
tinfoil
2
tine
2
tinder
2
tincture
2
Tina
2
tin
38
1
4
3
2

2

4
2
2
timothy
2
Timon
38
1
4
3
2

2

4
2
2
producing
2
producible
38
1
4
3
2

2

4
3
2
produces
2
produced
2
produce
38
1
4
3
2

2

4
2
2
processing
2
procession
38
1
4
3
2

2

4
2
2
probably
2
probabilist
38
1
4
3
2

2
s
4
7
2
timeless
2
Timex
2
timeworn
2
timetable
2
timepiece
2
timeout
2
time
38
1
4
3
2

2

4
2
2
prices
2
price
38
1
4
3
2
r
2

4
2
2
timberland
2
timber
38
1
4
3
2

2
e
4
1
2
timbre
38
1
4
3
2

2
beo
4
2
2
timid
2
Tim
38
1
4
3
2

2
t
4
1
2
presence
38
1
4
3
2

2

4
2
2
tilth
2
tilt
38
1
4
3
2
bl
2

4
2
2
possibly
2
possible
38
1
4
3
2

2

4
2
2
population
2
populate
38
1
4
3
2

2
t
4
4
2
till
2
tile
2
tilde
2
til
38
1
4
3
2

2

4
2
2
Tigris
2
tigress
38
1
4
3
2
t
2

4
2
2
tighten
2
tight
38
1
4
3
2

2
hr
4
1
2
tiger
38
1
4
3
2

2

4
2
2
tift
2
Tiffany
38
1
4
3
2

2

4
2
2
planning
2
planned
38
1
4
3
2

2

4
4
2
tier
2
Tientsin
2
tied
2
tie
38
1
4
3
2

2

4
3
2
tidewater
2
tideland
2
tide
38
1
4
3
2
nce
2

4
2
2
performances
2
performance
38
1
4
3
2

2
e
4
4
2
tidy
2
tidbit
2
tidal
2
tid
38
1
4
3
2

2

4
2
2
ticklish
2
tickle
38
1
4
3
2

2
l
4
2
2
ticket
2
tick
38
1
4
3
2

2
k
4
1
2
tic
38
1
4
3
2

2

4
2
2
particularly
2
particular
38
1
4
3
2

2
t
4
1
2
Tiber
38
1
4
3
2

2

4
2
2
Tibetan
2
Tibet
38
1
4
3
2

2
e
4
1
2
tibia
38
1
4
3
2

2
bcdefglmnprt
4
3
2
tissue
2
Tioga
2
ti
38
1
4
3
2

2

4
2
2
ours
2
ourselves
38
1
4
3
2
d
2

4
2
2
thyroidal
2
thyroid
38
1
4
3
2
ation
2

4
2
2
organizations
2
organization
38
1
4
3
2

2
i
4
4
2
thyroxine
2
thyrotoxic
2
thyronine
2
thyroglobulin
38
1
4
3
2

2
o
4
1
2
thyratron
38
1
4
3
2

2

4
3
2
ordered
2
orders
2
order
38
1
4
3
2

2

4
3
2
thymus
2
thymine
2
thyme
38
1
4
3
2

2
mr
4
1
2
thy
38
1
4
3
2

2

4
3
2
operation
2
operating
2
operatic
38
1
4
3
2

2

4
2
2
operated
2
operate
38
1
4
3
2
a
2

4
2
2
thwart
2
thwack
38
1
4
3
2

2

4
4
2
opens
2
opening
2
opened
2
open
38
1
4
3
2

2

4
2
2
Thursday
2
Thurman
38
1
4
3
2

2

4
2
2
thunderstorm
2
thundershower
38
1
4
3
2

2

4
2
2
thunderbolt
2
thunderbird
38
1
4
3
2
der
2
bs
4
4
2
thunderous
2
thunderflower
2
thunderclap
2
thunder
38
1
4
3
2

2

4
2
2
thumbnail
2
thumb
38
1
4
3
2

2

4
2
2
numbers
2
number
38
1
4
3
2

2
b
4
1
2
thump
38
1
4
3
2

2

4
2
2
thulium
2
Thule
38
1
4
3
2

2
r
4
1
2
numbed
38
1
4
3
2

2
e
4
1
2
numb
38
1
4
3
2

2

4
2
2
thuggee
2
thug
38
1
4
3
2

2
glmnr
4
3
2
thus
2
thud
2
Thuban
38
1
4
3
2

2

4
2
2
thrust
2
thrush
38
1
4
3
2

2
s
4
2
2
Thruway
2
thrum
38
1
4
3
2

2

4
2
2
never
2
nevertheless
38
1
4
3
2

2

4
4
2
thrown
2
throwback
2
throwaway
2
throw
38
1
4
3
2
gh
2

4
3
2
throughput
2
throughout
2
through
38
1
4
3
2

2
s
4
4
2
named
2
nameplate
2
nameable
2
name
38
1
4
3
2

2

4
2
2
throng
2
throne
38
1
4
3
2

2

4
2
2
names
2
namesake
38
1
4
3
2

2

4
2
2
ms.
2
Ms
38
1
4
3
2

2

4
2
2
mrs.
2
Mrs
38
1
4
3
2
t
2

4
2
2
throaty
2
throat
38
1
4
3
2

2
anuw
4
4
2
throttle
2
thrombosis
2
throes
2
throb
38
1
4
3
2

2

4
2
2
moving
2
movie
38
1
4
3
2

2

4
4
2
moves
2
movement
2
moved
2
move
38
1
4
3
2
t
2

4
2
2
thrifty
2
thrift
38
1
4
3
2

2
f
4
4
2
thrive
2
thrips
2
thrill
2
thrice
38
1
4
3
2

2

4
2
2
months
2
month
38
1
4
3
2
h
2

4
2
2
threshold
2
thresh
38
1
4
3
2

2

4
3
2
threesome
2
threefold
2
three
38
1
4
3
2

2
dt
4
0
38
1
4
3
2

2

4
2
2
threaten
2
threat
38
1
4
3
2

2

4
2
2
threadbare
2
thread
38
1
4
3
2

2
aes
4
2
2
threw
2
threonine
38
1
4
3
2

2

4
2
2
thrash
2
thrall
38
1
4
3
2

2
aeiou
4
0
38
1
4
3
2
r
2

4
2
2
members
2
member
38
1
4
3
2
and
2

4
3
2
thousandth
2
thousandfold
2
thousand
38
1
4
3
2
ng
2

4
3
2
meetings
2
meeting
2
meetinghouse
38
1
4
3
2

2

4
3
2
thoughts
2
thoughtful
2
thought
38
1
4
3
2
h
2
t
4
1
2
though
38
1
4
3
2

2

4
2
2
medical
2
medicate
38
1
4
3
2

2
gs
4
1
2
thou
38
1
4
3
2

2

4
2
2
matters
2
matter
38
1
4
3
2

2
r
4
1
2
matte
38
1
4
3
2

2

4
2
2
marketed
2
marketeer
38
1
4
3
2
ugh
2

4
4
2
thoroughgoing
2
thoroughfare
2
thoroughbred
2
thorough
38
1
4
3
2

2

4
2
2
fucker
2
fucked
38
1
4
3
2

2
e
4
3
2
fucks
2
fucking
2
fuck
38
1
4
3
2
s
2

4
2
2
Fuchsia
2
Fuchs
38
1
4
3
2

2

4
3
2
thorny
2
Thornton
2
thorn
38
1
4
3
2

2

4
3
2
managers
2
manager
2
managerial
38
1
4
3
2

2

4
2
2
thorium
2
thoriate
38
1
4
3
2

2
ino
4
4
2
Thorstein
2
Thorpe
2
Thoreau
2
Thor
38
1
4
3
2

2

4
4
2
Thomson
2
Thompson
2
Thomistic
2
Thomas
38
1
4
3
2

2
s
4
2
2
makeup
2
make
38
1
4
3
2

2

4
2
2
makes
2
makeshift
38
1
4
3
2

2
mru
4
2
2
those
2
thong
38
1
4
3
2
le
2

4
2
2
thistledown
2
thistle
38
1
4
3
2

2
t
4
2
2
this'll
2
this
38
1
4
3
2
en
2

4
2
2
thirteenth
2
thirteen
38
1
4
3
2

2
e
4
2
2
thirty
2
thirtieth
38
1
4
3
2

2

4
2
2
longer
2
longevity
38
1
4
3
2

2

4
2
2
located
2
locate
38
1
4
3
2
t
2

4
2
2
thirsty
2
thirst
38
1
4
3
2

2
st
4
1
2
third
38
1
4
3
2

2
ei
4
0
38
1
4
3
2
g
2

4
2
2
living
2
Livingston
38
1
4
3
2

2

4
2
2
thiouracil
2
thiocyanate
38
1
4
3
2

2
g
4
4
2
thinnish
2
think
2
thine
2
thin
38
1
4
3
2
b
2

4
2
2
Thimbu
2
thimble
38
1
4
3
2

2

4
2
2
thieving
2
thieves
38
1
4
3
2

2
v
4
1
2
thief
38
1
4
3
2

2

4
2
2
thicket
2
thicken
38
1
4
3
2
k
2
e
4
2
2
thickish
2
thick
38
1
4
3
2

2
cemnors
4
3
2
thither
2
thigh
2
thiamin
38
1
4
3
2

2

4
2
2
leadsmen
2
leadsman
38
1
4
3
2

2

4
2
2
leaders
2
leader
38
1
4
3
2

2

4
4
2
they've
2
they're
2
they'll
2
they'd
38
1
4
3
2

2
'
4
1
2
they
38
1
4
3
2

2

4
2
2
Thetis
2
theta
38
1
4
3
2

2

4
2
2
largest
2
largesse
38
1
4
3
2

2

4
3
2
Theseus
2
theses
2
these
38
1
4
3
2

2
e
4
3
2
thespian
2
thesis
2
thesaurus
38
1
4
3
2

2

4
2
2
keys
2
keystone
38
1
4
3
2

2

4
3
2
thermostat
2
Thermofax
2
thermo
38
1
4
3
2

2

4
2
2
keeps
2
keep
38
1
4
3
2

2

4
2
2
thermistor
2
thermionic
38
1
4
3
2

2
io
4
1
2
thermal
38
1
4
3
2

2

4
2
2
thereupon
2
thereunder
38
1
4
3
2

2

4
2
2
its
2
itself
38
1
4
3
2

2

4
2
2
issues
2
issue
38
1
4
3
2
o
2

4
2
2
theretofore
2
thereto
38
1
4
3
2

2

4
2
2
involved
2
involve
38
1
4
3
2

2
e
4
1
2
involving
38
1
4
3
2

2

4
2
2
thereon
2
thereof
38
1
4
3
2
r
2

4
2
2
investors
2
investor
38
1
4
3
2

2

4
2
2
there'll
2
there'd
38
1
4
3
2
r
2

4
2
2
therefore
2
therefor
38
1
4
3
2

2

4
2
2
international
2
internal
38
1
4
3
2

2
o
4
1
2
therefrom
38
1
4
3
2
on
2

4
2
2
inflation
2
inflationary
38
1
4
3
2

2

4
3
2
thereat
2
thereafter
2
thereabouts
38
1
4
3
2

2

4
2
2
individuals
2
individual
38
1
4
3
2

2
af'otu
4
5
2
therewith
2
Theresa
2
therein
2
thereby
2
there
38
1
4
3
2
p
2

4
3
2
therapy
2
therapist
2
therapeutic
38
1
4
3
2

2

4
3
2
increases
2
increased
2
increase
38
1
4
3
2

2
aem
4
0
38
1
4
3
2

2

4
2
2
included
2
include
38
1
4
3
2

2
e
4
1
2
including
38
1
4
3
2

2
t
4
1
2
theorem
38
1
4
3
2
ic
2

4
2
2
theoretician
2
theoretic
38
1
4
3
2

2
e
4
2
2
theory
2
theorist
38
1
4
3
2
og
2

4
2
2
theology
2
theologian
38
1
4
3
2
o
2

4
2
2
Theodosian
2
Theodore
38
1
4
3
2

2
dlr
4
1
2
theocracy
38
1
4
3
2
e
2

4
2
2
thenceforth
2
thence
38
1
4
3
2

2
c
4
1
2
then
38
1
4
3
2

2

4
4
2
themselves
2
theme
2
thematic
2
them
38
1
4
3
2

2

4
2
2
theist
2
theism
38
1
4
3
2

2
s
4
1
2
their
38
1
4
3
2

2

4
2
2
theatric
2
Thea
38
1
4
3
2

2

4
2
2
having
2
Havilland
38
1
4
3
2

2
aimnorsty
4
5
2
Thelma
2
theft
2
thee
2
Thebes
2
the
38
1
4
3
2

2
ilnt
4
2
2
Thayer
2
thaw
38
1
4
3
2

2

4
2
2
that'll
2
that'd
38
1
4
3
2

2
'
4
2
2
thatch
2
that
38
1
4
3
2

2

4
3
2
thanksgiving
2
thankful
2
thank
38
1
4
3
2

2
k
4
1
2
than
38
1
4
3
2

2

4
5
2
gives
2
giveth
2
given
2
giveaway
2
give
38
1
4
3
2

2

4
2
2
thallophyte
2
thallium
38
1
4
3
2

2
l
4
1
2
Thalia
38
1
4
3
2

2

4
2
2
Thailand
2
Thai
38
1
4
3
2

2

4
2
2
Gettysburg
2
Getty
38
1
4
3
2

2
aeioruwy
4
0
38
1
4
3
2

2

4
2
2
texture
2
textural
38
1
4
3
2

2

4
2
2
generally
2
general
38
1
4
3
2

2
r
4
1
2
textual
38
1
4
3
2

2
u
4
4
2
Textron
2
textile
2
textbook
2
text
38
1
4
3
2

2

4
3
2
Texas
2
Texan
2
Texaco
38
1
4
3
2

2
at
4
0
38
1
4
3
2

2

4
2
2
tetrahedral
2
tetrahedra
38
1
4
3
2
edr
2
a
4
1
2
tetrahedron
38
1
4
3
2

2

4
2
2
former
2
formed
38
1
4
3
2
luo
2

4
2
2
tetrafluouride
2
tetrafluoride
38
1
4
3
2
a
2
fh
4
3
2
tetravalent
2
tetragonal
2
tetrachloride
38
1
4
3
2

2
r
4
3
2
tether
2
tete
2
tetanus
38
1
4
3
2

2

4
2
2
followed
2
followeth
38
1
4
3
2
on
2

4
2
2
testimony
2
testimonial
38
1
4
3
2

2

4
2
2
testicular
2
testicle
38
1
4
3
2

2
cm
4
1
2
testify
38
1
4
3
2

2

4
2
2
finds
2
find
38
1
4
3
2
ent
2

4
2
2
testamentary
2
testament
38
1
4
3
2

2

4
2
2
figures
2
figure
38
1
4
3
2

2
m
4
1
2
testate
38
1
4
3
2

2
ai
4
5
2
tests
2
testy
2
testes
2
testbed
2
test
38
1
4
3
2

2

4
2
2
tessellate
2
Tess
38
1
4
3
2

2

4
2
2
feels
2
feel
38
1
4
3
2

2
st
4
0
38
1
4
3
2
or
2

4
2
2
territory
2
territorial
38
1
4
3
2

2

4
2
2
terrify
2
terrific
38
1
4
3
2

2

4
2
2
eyes
2
eyesight
38
1
4
3
2
e
2

4
2
2
experiences
2
experience
38
1
4
3
2

2
ft
4
2
2
terrier
2
terrible
38
1
4
3
2

2

4
2
2
terrestrial
2
Terre
38
1
4
3
2

2

4
5
2
terrapin
2
terramycin
2
terrain
2
terrace
2
Terra
38
1
4
3
2
e
2

4
2
2
executives
2
executive
38
1
4
3
2

2
aei
4
2
2
terry
2
terror
38
1
4
3
2
le
2

4
2
2
examples
2
example
38
1
4
3
2
sichore
2

4
2
2
terpsichorean
2
Terpsichore
38
1
4
3
2
n
2

4
2
2
europeans
2
European
38
1
4
3
2

2

4
2
2
ternary
2
tern
38
1
4
3
2

2
a
4
3
2
terminus
2
terminology
2
termini
38
1
4
3
2
e
2

4
2
2
estates
2
estate
38
1
4
3
2

2

4
3
2
terminate
2
terminal
2
terminable
38
1
4
3
2
lish
2

4
3
2
establishing
2
established
2
establish
38
1
4
3
2

2
n
4
1
2
termite
38
1
4
3
2

2
i
4
2
2
terms
2
term
38
1
4
3
2
cial
2

4
2
2
especially
2
especial
38
1
4
3
2
e
2

4
2
2
employees
2
employee
38
1
4
3
2
to
2

4
2
2
teratology
2
teratogenic
38
1
4
3
2

2
amnpr
4
5
2
tertiary
2
terse
2
Teresa
2
tercel
2
terbium
38
1
4
3
2
c
2

4
2
2
electronics
2
electronic
38
1
4
3
2

2

4
2
2
tepid
2
tepee
38
1
4
3
2

2

4
2
2
tenure
2
tenuous
38
1
4
3
2
rt
2

4
2
2
efforts
2
effort
38
1
4
3
2

2

4
2
2
education
2
educate
38
1
4
3
2

2

4
2
2
tentative
2
tentacle
38
1
4
3
2

2
a
4
3
2
tenth
2
tenterhooks
2
tent
38
1
4
3
2

2

4
2
2
economics
2
economic
38
1
4
3
2
n
2

4
2
2
tensional
2
tension
38
1
4
3
2
ng
2

4
2
2
earnings
2
earning
38
1
4
3
2

2
o
4
1
2
tensile
38
1
4
3
2

2
i
4
3
2
tenspot
2
tensor
2
tense
38
1
4
3
2

2

4
3
2
early
2
earlier
2
earl
38
1
4
3
2

2

4
2
2
tenor
2
tenon
38
1
4
3
2

2

4
2
2
doors
2
doorstep
38
1
4
3
2

2

4
3
2
Tenney
2
Tennessee
2
Tenneco
38
1
4
3
2

2
e
4
2
2
Tennyson
2
tennis
38
1
4
3
2
r
2

4
2
2
dollars
2
dollar
38
1
4
3
2

2

4
2
2
does
2
doesn't
38
1
4
3
2

2

4
3
2
tenet
2
tenement
2
tenebrous
38
1
4
3
2

2

4
2
2
tenderloin
2
tenderfoot
38
1
4
3
2

2
r
4
1
2
tendency
38
1
4
3
2

2
e
4
2
2
tendon
2
tend
38
1
4
3
2
lop
2

4
4
2
develops
2
development
2
developed
2
develop
38
1
4
3
2
i
2

4
2
2
tenacity
2
tenacious
38
1
4
3
2

2
c
4
2
2
tenant
2
tenable
38
1
4
3
2

2
adenostu
4
2
2
tenfold
2
ten
38
1
4
3
2

2

4
2
2
described
2
describe
38
1
4
3
2

2
e
4
1
2
describing
38
1
4
3
2

2

4
3
2
temptress
2
temptation
2
tempt
38
1
4
3
2
ent
2

4
2
2
departments
2
department
38
1
4
3
2
d
2

4
2
2
demands
2
demand
38
1
4
3
2
a
2
r
4
1
2
temporal
38
1
4
3
2

2
r
4
1
2
tempo
38
1
4
3
2

2

4
2
2
defensive
2
defensible
38
1
4
3
2

2

4
2
2
Templeton
2
temple
38
1
4
3
2

2
e
4
1
2
template
38
1
4
3
2

2
rs
4
0
38
1
4
3
2
n
2

4
2
2
decisions
2
decision
38
1
4
3
2
t
2

4
2
2
tempestuous
2
tempest
38
1
4
3
2

2
a
4
1
2
temper
38
1
4
3
2

2

4
2
2
temperature
2
temperate
38
1
4
3
2

2

4
3
2
decides
2
decided
2
decide
38
1
4
3
2

2
t
4
2
2
temperance
2
tempera
38
1
4
3
2

2
elot
4
0
38
1
4
3
2

2
p
4
1
2
temerity
38
1
4
3
2

2

4
6
2
telling
2
tells
2
tellurium
2
telltale
2
teller
2
tell
38
1
4
3
2
r
2

4
2
2
customers
2
customer
38
1
4
3
2
is
2

4
2
2
television
2
televise
38
1
4
3
2
pe
2

4
3
2
teletypewrite
2
teletypesetting
2
teletype
38
1
4
3
2

2
y
4
1
2
telethon
38
1
4
3
2

2

4
2
2
created
2
create
38
1
4
3
2
cop
2

4
2
2
telescopic
2
telescope
38
1
4
3
2

2

4
2
2
teleprompter
2
teleprocessing
38
1
4
3
2

2
o
4
1
2
teleprinter
38
1
4
3
2

2

4
2
2
countries
2
countrify
38
1
4
3
2

2
e
4
2
2
telephony
2
telephonic
38
1
4
3
2
o
2
n
4
1
2
telephotography
38
1
4
3
2
on
2

4
2
2
corporations
2
corporation
38
1
4
3
2
th
2

4
2
2
telepathy
2
telepathic
38
1
4
3
2

2
ahr
4
0
38
1
4
3
2

2
i
4
1
2
corporate
38
1
4
3
2

2

4
2
2
teleost
2
teleology
38
1
4
3
2
h
2

4
2
2
telegraphy
2
telegraph
38
1
4
3
2
ra
2
p
4
1
2
telegram
38
1
4
3
2

2

4
2
2
continuing
2
continuity
38
1
4
3
2
o
2

4
2
2
teleconference
2
telecommunicate
38
1
4
3
2

2

4
3
2
continues
2
continued
2
continue
38
1
4
3
2

2
cgopstv
4
5
2
Telex
2
telemeter
2
telekinesis
2
Telefunken
2
Teledyne
38
1
4
3
2

2
el
4
1
2
Tel
38
1
4
3
2

2

4
2
2
consumers
2
consumer
38
1
4
3
2
t
2

4
2
2
Tektronix
2
tektite
38
1
4
3
2

2

4
2
2
Tehran
2
Teheran
38
1
4
3
2

2
r
4
2
2
consumed
2
consume
38
1
4
3
2

2

4
2
2
construction
2
constructible
38
1
4
3
2

2

4
2
2
teethed
2
teethe
38
1
4
3
2

2
e
4
2
2
teething
2
teeth
38
1
4
3
2

2
h
4
3
2
teetotal
2
teeter
2
teet
38
1
4
3
2

2

4
2
2
computers
2
computer
38
1
4
3
2

2
r
4
1
2
compute
38
1
4
3
2

2

4
3
2
teensy
2
teenage
2
teen
38
1
4
3
2
n
2

4
3
2
companionship
2
companionway
2
companion
38
1
4
3
2

2
nt
4
3
2
teem
2
teeing
2
tee
38
1
4
3
2

2

4
2
2
tedium
2
tedious
38
1
4
3
2
on
2

4
2
2
communications
2
communication
38
1
4
3
2

2
i
4
2
2
Teddy
2
Ted
38
1
4
3
2

2
i
4
1
2
communicate
38
1
4
3
2

2
n
4
1
2
tech
38
1
4
3
2
rat
2

4
2
2
technocratic
2
technocrat
38
1
4
3
2

2
c
4
1
2
technology
38
1
4
3
2

2

4
2
2
coming
2
Cominform
38
1
4
3
2

2

4
2
2
technician
2
technic
38
1
4
3
2

2
c
4
2
2
technique
2
Technion
38
1
4
3
2

2
io
4
1
2
technetium
38
1
4
3
2

2
h
4
2
2
tecum
2
tectonic
38
1
4
3
2

2
ckmrs
4
5
2
teat
2
teapot
2
teal
2
teahouse
2
tea
38
1
4
3
2
en
2

4
2
2
citizenry
2
citizen
38
1
4
3
2
oon
2

4
2
2
teaspoonful
2
teaspoon
38
1
4
3
2

2

4
2
2
teasel
2
tease
38
1
4
3
2

2
ep
4
0
38
1
4
3
2

2

4
3
2
tearful
2
teardrop
2
tear
38
1
4
3
2

2
s
4
3
2
teamwork
2
teammate
2
team
38
1
4
3
2

2

4
2
2
teakwood
2
teakettle
38
1
4
3
2

2
h
4
2
2
teacup
2
teacart
38
1
4
3
2

2
acdehklmnprstx
4
3
2
Teutonic
2
Tegucigalpa
2
Teflon
38
1
4
3
2

2

4
3
2
causes
2
caused
2
cause
38
1
4
3
2
ay
2

4
2
2
taxpaying
2
taxpayer
38
1
4
3
2
nom
2

4
2
2
taxonomy
2
taxonomic
38
1
4
3
2

2

4
4
2
taxiway
2
taxied
2
taxicab
2
taxi
38
1
4
3
2

2

4
2
2
buys
2
buy
38
1
4
3
2

2
iop
4
3
2
taxes
2
taxation
2
tax
38
1
4
3
2

2

4
2
2
tawny
2
tawdry
38
1
4
3
2
ng
2

4
2
2
buildings
2
building
38
1
4
3
2
ern
2

4
2
2
taverna
2
tavern
38
1
4
3
2

2

4
2
2
tautology
2
taut
38
1
4
3
2

2
t
4
4
2
Taurus
2
taunt
2
taught
2
tau
38
1
4
3
2

2

4
2
2
brings
2
bring
38
1
4
3
2
e
2

4
3
2
tattletale
2
tattler
2
tattle
38
1
4
3
2

2
l
4
2
2
tatty
2
tattoo
38
1
4
3
2

2

4
2
2
tater
2
tate
38
1
4
3
2

2
et
4
1
2
tat
38
1
4
3
2

2

4
2
2
better
2
Bette
38
1
4
3
2

2

4
2
2
tasteful
2
taste
38
1
4
3
2

2
e
4
2
2
tasty
2
tasting
38
1
4
3
2

2

4
2
2
benefits
2
benefit
38
1
4
3
2

2

4
2
2
tassel
2
Tass
38
1
4
3
2
e
2

4
2
2
believes
2
believe
38
1
4
3
2

2

4
2
2
taskmaster
2
task
38
1
4
3
2

2
kst
4
1
2
Tasmania
38
1
4
3
2
r
2

4
2
2
Tartary
2
tartar
38
1
4
3
2

2
a
4
1
2
tart
38
1
4
3
2
y
2

4
2
2
Tarrytown
2
tarry
38
1
4
3
2

2

4
2
2
tarpaulin
2
tarpaper
38
1
4
3
2

2
a
4
1
2
tarpon
38
1
4
3
2
ge
2

4
2
2
averages
2
average
38
1
4
3
2
l
2

4
2
2
available
2
avail
38
1
4
3
2
t
2

4
2
2
tarantula
2
tarantara
38
1
4
3
2

2
n
4
1
2
tara
38
1
4
3
2

2
aprt
4
7
2
Tarzan
2
tarnish
2
tariff
2
target
2
tardy
2
Tarbell
2
tar
38
1
4
3
2
on
2

4
2
2
associations
2
association
38
1
4
3
2

2

4
2
2
tappet
2
tappa
38
1
4
3
2

2
i
4
1
2
associate
38
1
4
3
2

2

4
2
2
tapis
2
tapir
38
1
4
3
2

2

4
2
2
asked
2
askew
38
1
4
3
2

2

4
4
2
tapeworm
2
tapestry
2
taper
2
tape
38
1
4
3
2

2
eip
4
2
2
tapa
2
tap
38
1
4
3
2

2

4
2
2
arms
2
Armstrong
38
1
4
3
2

2

4
3
2
Taos
2
Taoist
2
tao
38
1
4
3
2

2

4
2
2
announced
2
announce
38
1
4
3
2

2
l
4
1
2
tantamount
38
1
4
3
2
nc
2
e
4
1
2
announcing
38
1
4
3
2
u
2

4
2
2
Tantalus
2
tantalum
38
1
4
3
2

2
a
4
1
2
tantrum
38
1
4
3
2
nt
2

4
2
2
amounts
2
amount
38
1
4
3
2

2

4
2
2
american
2
Americana
38
1
4
3
2
ay
2

4
2
2
always
2
alway
38
1
4
3
2
t
2

4
2
2
tangential
2
tangent
38
1
4
3
2

2
n
4
1
2
tangerine
38
1
4
3
2

2
e
4
5
2
tangy
2
tango
2
tangle
2
tangible
2
tang
38
1
4
3
2

2

4
3
2
Tananarive
2
Tanaka
2
tanager
38
1
4
3
2

2
agt
4
8
2
Tanzania
2
Tanya
2
tansy
2
tannin
2
tank
2
tanh
2
tandem
2
tan
38
1
4
3
2

2

4
3
2
tampon
2
Tampa
2
tamp
38
1
4
3
2
n
2

4
3
2
additions
2
additional
2
addition
38
1
4
3
2
d
2

4
3
2
addendum
2
addenda
2
addend
38
1
4
3
2

2
a
4
1
2
activities
38
1
4
3
2
n
2

4
2
2
actions
2
action
38
1
4
3
2

2

4
2
2
according
2
accordion
38
1
4
3
2

2

4
2
2
tamarind
2
tamarack
38
1
4
3
2

2
r
4
1
2
tamale
38
1
4
3
2

2
ap
4
4
2
Tammany
2
tame
2
tambourine
2
tam
38
1
4
3
2

2

4
2
2
tallyho
2
tally
38
1
4
3
2

2
y
4
3
2
tallow
2
Tallahassee
2
tall
38
1
4
3
2

2

4
4
2
talky
2
talkie
2
talkative
2
talk
38
1
4
3
2
sman
2

4
2
2
talismanic
2
talisman
38
1
4
3
2

2

4
2
2
talent
2
tale
38
1
4
3
2

2

4
2
2
talcum
2
talc
38
1
4
3
2

2
ceikl
4
3
2
talus
2
talon
2
Talmud
38
1
4
3
2

2

4
2
2
takeover
2
takeoff
38
1
4
3
2

2
e
4
1
2
taking
38
1
4
3
2

2

4
5
2
tailwind
2
tailspin
2
tailor
2
tailgate
2
tail
38
1
4
3
2

2
l
4
3
2
Taiwan
2
Taipei
2
taint
38
1
4
3
2

2

4
2
2
Tahoe
2
Tahiti
38
1
4
3
2

2

4
2
2
tagging
2
tag
38
1
4
3
2

2

4
2
2
taffy
2
taffeta
38
1
4
3
2

2
f
4
1
2
Taft
38
1
4
3
2

2

4
2
2
tadpole
2
tad
38
1
4
3
2

2

4
2
2
tactician
2
tactic
38
1
4
3
2

2
c
4
1
2
tactile
38
1
4
3
2

2
i
4
3
2
tactual
2
tactful
2
tact
38
1
4
3
2

2

4
3
2
tacky
2
tackle
2
tack
38
1
4
3
2
t
2

4
2
2
Tacitus
2
tacit
38
1
4
3
2

2
i
4
1
2
tachometer
38
1
4
3
2

2

4
2
2
tachistoscope
2
tachinid
38
1
4
3
2

2
hikt
4
1
2
Tacoma
38
1
4
3
2
a
2

4
3
2
tabulate
2
tabular
2
tabula
38
1
4
3
2

2
l
4
1
2
tabu
38
1
4
3
2

2
as
4
4
2
tablet
2
tableland
2
tablecloth
2
table
38
1
4
3
2

2
p
4
1
2
tables
38
1
4
3
2
u
2

4
2
2
tableaux
2
tableau
38
1
4
3
2

2
e
4
1
2
tabloid
38
1
4
3
2

2
lu
4
3
2
taboo
2
tabernacle
2
tab
38
1
4
3
2

2
bcdfghiklmnoprstuvwx
4
2
2
Taylor
2
TA
38
1
4
3
2

2
aehiNoruysTVW
4
3
2
TX
2
t's
2
t
38
1
4
3
2

2

4
2
2
systemization
2
systemic
38
1
4
3
2
tem
2
i
4
3
2
systemwide
2
systematic
2
system
38
1
4
3
2
p
2

4
2
2
syrupy
2
syrup
38
1
4
3
2

2

4
2
2
syringe
2
syringa
38
1
4
3
2

2
g
4
1
2
syrinx
38
1
4
3
2

2
n
4
1
2
Syria
38
1
4
3
2

2
iu
4
1
2
Syracuse
38
1
4
3
2

2

4
2
2
synthesis
2
syntheses
38
1
4
3
2
e
2
s
4
1
2
synthetic
38
1
4
3
2

2

4
2
2
syntax
2
syntactic
38
1
4
3
2

2
ah
4
0
38
1
4
3
2

2

4
2
2
synopsis
2
synopses
38
1
4
3
2

2
s
4
1
2
synoptic
38
1
4
3
2
ym
2

4
3
2
synonymy
2
synonymous
2
synonym
38
1
4
3
2

2
np
4
1
2
synod
38
1
4
3
2
s
2

4
2
2
synergistic
2
synergism
38
1
4
3
2
rg
2
i
4
1
2
synergy
38
1
4
3
2
c
2

4
2
2
syndicate
2
syndic
38
1
4
3
2

2
i
4
1
2
syndrome
38
1
4
3
2
ro
2
n
4
1
2
synchrotron
38
1
4
3
2

2

4
3
2
synchrony
2
synchronous
2
synchronism
38
1
4
3
2

2
h
4
1
2
syncopate
38
1
4
3
2

2
p
4
1
2
synagogue
38
1
4
3
2
e
2

4
2
2
synapses
2
synapse
38
1
4
3
2

2
s
4
1
2
synaptic
38
1
4
3
2

2
acdeot
4
1
2
Synge
38
1
4
3
2
om
2

4
2
2
symptomatic
2
symptom
38
1
4
3
2
si
2

4
2
2
symposium
2
symposia
38
1
4
3
2
on
2

4
2
2
symphony
2
symphonic
38
1
4
3
2
th
2

4
2
2
sympathy
2
sympathetic
38
1
4
3
2

2
ahot
4
1
2
symplectic
38
1
4
3
2

2
io
4
0
38
1
4
3
2
l
2

4
2
2
symbolic
2
symbol
38
1
4
3
2
o
2

4
2
2
symbiotic
2
symbiosis
38
1
4
3
2

2
bp
4
1
2
symmetry
38
1
4
3
2
n
2

4
2
2
Sylvania
2
sylvan
38
1
4
3
2

2
a
4
2
2
Sylvia
2
Sylvester
38
1
4
3
2

2
ao
4
0
38
1
4
3
2
gis
2

4
2
2
syllogistic
2
syllogism
38
1
4
3
2
b
2
i
4
2
2
syllabus
2
syllable
38
1
4
3
2

2

4
3
2
syllabify
2
syllabic
2
syllabi
38
1
4
3
2

2
lv
4
1
2
Sylow
38
1
4
3
2
phant
2

4
2
2
sycophantic
2
sycophant
38
1
4
3
2

2
o
4
1
2
sycamore
38
1
4
3
2

2

4
2
2
Sybil
2
sybarite
38
1
4
3
2

2
bclmnrs
4
4
2
syzygy
2
Sykes
2
syenite
2
Sydney
38
1
4
3
2

2

4
2
2
swung
2
swum
38
1
4
3
2

2

4
4
2
swordtail
2
swordplay
2
swordfish
2
sword
38
1
4
3
2

2
d
4
2
2
sworn
2
swore
38
1
4
3
2

2
r
4
2
2
swoop
2
swollen
38
1
4
3
2
er
2

4
2
2
Switzerland
2
Switzer
38
1
4
3
2
h
2
b
4
4
2
switches
2
switchman
2
switchgear
2
switch
38
1
4
3
2

2

4
2
2
switchboard
2
switchblade
38
1
4
3
2

2
cz
4
0
38
1
4
3
2

2

4
2
2
swishy
2
swish
38
1
4
3
2

2
h
4
1
2
swiss
38
1
4
3
2
l
2

4
2
2
swirly
2
swirl
38
1
4
3
2

2

4
3
2
swingy
2
swingable
2
swing
38
1
4
3
2

2
g
4
2
2
swine
2
swindle
38
1
4
3
2

2

4
2
2
swimsuit
2
swim
38
1
4
3
2

2

4
2
2
swigging
2
swig
38
1
4
3
2

2
gmnrst
4
4
2
swizzle
2
swivel
2
swipe
2
swift
38
1
4
3
2

2

4
2
2
swelter
2
swelt
38
1
4
3
2

2
t
4
1
2
swell
38
1
4
3
2

2

4
4
2
sweetish
2
sweetheart
2
sweeten
2
sweet
38
1
4
3
2

2

4
2
2
sweepstake
2
sweep
38
1
4
3
2

2
pt
4
1
2
Sweeney
38
1
4
3
2

2

4
2
2
Sweden
2
Swede
38
1
4
3
2

2
e
4
1
2
Swedish
38
1
4
3
2

2
t
4
1
2
swear
38
1
4
3
2

2

4
5
2
sweaty
2
sweatshirt
2
sweater
2
sweatband
2
sweat
38
1
4
3
2

2
adel
4
3
2
swerve
2
swept
2
Swenson
38
1
4
3
2

2

4
2
2
swathe
2
swath
38
1
4
3
2

2
h
4
2
2
swatch
2
swat
38
1
4
3
2

2

4
3
2
swarthy
2
Swarthout
2
Swarthmore
38
1
4
3
2

2
h
4
1
2
swart
38
1
4
3
2

2
t
4
1
2
swarm
38
1
4
3
2

2

4
2
2
swanky
2
swank
38
1
4
3
2

2
k
4
3
2
Swanson
2
swanlike
2
swan
38
1
4
3
2

2

4
2
2
swampy
2
swamp
38
1
4
3
2

2
p
4
2
2
swami
2
swam
38
1
4
3
2
low
2

4
2
2
swallowtail
2
swallow
38
1
4
3
2

2

4
2
2
swage
2
swag
38
1
4
3
2

2

4
2
2
swabby
2
swab
38
1
4
3
2

2
bglmnrt
4
6
2
Swaziland
2
sway
2
swastika
2
swap
2
swain
2
Swahili
38
1
4
3
2

2
aeiou
4
1
2
SW
38
1
4
3
2
rain
2

4
2
2
suzerainty
2
suzerain
38
1
4
3
2

2
e
4
2
2
Suzuki
2
Suzanne
38
1
4
3
2

2

4
3
2
suture
2
Sutton
2
Sutherland
38
1
4
3
2

2

4
2
2
sustenance
2
sustain
38
1
4
3
2
cio
2

4
2
2
suspicious
2
suspicion
38
1
4
3
2

2
n
4
1
2
suspect
38
1
4
3
2

2

4
3
2
suspensor
2
suspension
2
suspense
38
1
4
3
2

2
s
4
1
2
suspend
38
1
4
3
2

2
ei
4
0
38
1
4
3
2
ept
2

4
2
2
susceptible
2
susceptance
38
1
4
3
2
n
2

4
2
2
Susanne
2
Susan
38
1
4
3
2

2
acpt
4
4
2
Sussex
2
Susie
2
sushi
2
Sus
38
1
4
3
2
v
2

4
3
2
survivor
2
survive
2
survival
38
1
4
3
2

2
y
4
1
2
surveillant
38
1
4
3
2

2

4
3
2
surveys
2
surveyor
2
survey
38
1
4
3
2

2
ei
4
0
38
1
4
3
2

2

4
2
2
surtout
2
surtax
38
1
4
3
2

2

4
2
2
surround
2
surrogate
38
1
4
3
2

2

4
4
2
surrey
2
surreptitious
2
surrender
2
surreal
38
1
4
3
2

2
eo
4
0
38
1
4
3
2

2

4
3
2
surprise
2
surplus
2
surpass
38
1
4
3
2

2

4
2
2
surmount
2
surmise
38
1
4
3
2
ecti
2

4
2
2
surjective
2
surjection
38
1
4
3
2

2

4
3
2
surgery
2
surgeon
2
surge
38
1
4
3
2

2
e
4
1
2
surgical
38
1
4
3
2
c
2

4
2
2
surfactant
2
surface
38
1
4
3
2

2
a
4
2
2
surfeit
2
surf
38
1
4
3
2

2

4
2
2
surety
2
sure
38
1
4
3
2

2

4
2
2
surcharge
2
surcease
38
1
4
3
2

2
cefgjmprtv
4
1
2
surname
38
1
4
3
2
m
2

4
3
2
supremum
2
supreme
2
supremacy
38
1
4
3
2

2

4
2
2
supranational
2
supra
38
1
4
3
2

2
ae
4
0
38
1
4
3
2

2

4
2
2
suppression
2
suppressible
38
1
4
3
2
ess
2
i
4
2
2
suppressor
2
suppress
38
1
4
3
2

2

4
3
2
supposition
2
suppose
2
supposable
38
1
4
3
2

2
sr
4
0
38
1
4
3
2

2
ei
4
2
2
supply
2
supplant
38
1
4
3
2

2

4
2
2
supplementary
2
supple
38
1
4
3
2

2
lor
4
0
38
1
4
3
2

2

4
2
2
supervisory
2
supervene
38
1
4
3
2
itio
2

4
2
2
superstitious
2
superstition
38
1
4
3
2

2
t
4
1
2
supersede
38
1
4
3
2

2

4
2
2
supernovae
2
supernatant
38
1
4
3
2

2

4
2
2
superlunary
2
superlative
38
1
4
3
2

2

4
2
2
superior
2
superintendent
38
1
4
3
2
u
2

4
2
2
superfluous
2
superfluity
38
1
4
3
2

2
l
4
1
2
superficial
38
1
4
3
2

2

4
2
2
superbly
2
superb
38
1
4
3
2
r
2
bfilnsv
4
4
2
superposable
2
supercilious
2
superannuate
2
super
38
1
4
3
2

2
epr
4
2
2
supine
2
sup
38
1
4
3
2

2

4
2
2
suntanning
2
suntanned
38
1
4
3
2
an
2
n
4
1
2
suntan
38
1
4
3
2
n
2

4
2
2
sunshiny
2
sunshine
38
1
4
3
2

2
i
4
1
2
sunshade
38
1
4
3
2

2
h
4
3
2
sunspot
2
sunset
2
sunscreen
38
1
4
3
2
y
2

4
2
2
Sunnyvale
2
sunny
38
1
4
3
2
i
2

4
2
2
sunlit
2
sunlight
38
1
4
3
2

2

4
2
2
sunken
2
sunk
38
1
4
3
2

2

4
2
2
sunglasses
2
sung
38
1
4
3
2

2

4
2
2
sunflower
2
sunfish
38
1
4
3
2

2

4
2
2
sundew
2
sunder
38
1
4
3
2

2
e
4
4
2
sundry
2
sundown
2
sundial
2
Sunday
38
1
4
3
2
rn
2

4
2
2
sunburnt
2
sunburn
38
1
4
3
2

2
u
4
2
2
sunbonnet
2
sunbeam
38
1
4
3
2

2
bdfgklnst
4
3
2
SUNY
2
sunrise
2
sun
38
1
4
3
2
t
2

4
2
2
summitry
2
summit
38
1
4
3
2
r
2

4
3
2
summertime
2
Summers
2
summer
38
1
4
3
2

2
rt
4
1
2
summand
38
1
4
3
2

2

4
2
2
summation
2
summate
38
1
4
3
2

2

4
2
2
summary
2
summarily
38
1
4
3
2

2
aei
4
1
2
summon
38
1
4
3
2
ria
2

4
2
2
Sumerian
2
Sumeria
38
1
4
3
2

2

4
2
2
Sumatra
2
sumac
38
1
4
3
2

2
aem
4
4
2
Sumter
2
sumptuous
2
Sumner
2
sum
38
1
4
3
2
n
2

4
2
2
sultanate
2
sultan
38
1
4
3
2

2
a
4
1
2
sultry
38
1
4
3
2

2

4
3
2
sully
2
Sullivan
2
sullen
38
1
4
3
2

2

4
2
2
sulky
2
sulk
38
1
4
3
2

2
aiu
4
1
2
sulfonamide
38
1
4
3
2
r
2

4
3
2
sulfurous
2
sulfuric
2
sulfur
38
1
4
3
2

2

4
2
2
sulfite
2
sulfide
38
1
4
3
2

2

4
3
2
sulfate
2
sulfanilamide
2
sulfa
38
1
4
3
2

2
fklt
4
1
2
sulphur
38
1
4
3
2

2

4
4
2
suitor
2
suite
2
suitcase
2
suit
38
1
4
3
2
id
2

4
2
2
suicide
2
suicidal
38
1
4
3
2

2
ct
4
0
38
1
4
3
2

2

4
3
2
suggestive
2
suggestion
2
suggestible
38
1
4
3
2
est
2
i
4
1
2
suggest
38
1
4
3
2

2
g
4
1
2
sugar
38
1
4
3
2
age
2

4
2
2
suffragette
2
suffrage
38
1
4
3
2

2

4
2
2
Suffolk
2
suffocate
38
1
4
3
2

2

4
2
2
sufficient
2
suffice
38
1
4
3
2

2
c
4
1
2
suffix
38
1
4
3
2
f
2
ior
4
2
2
suffuse
2
suffer
38
1
4
3
2

2

4
3
2
Suez
2
suey
2
sue
38
1
4
3
2
n
2

4
2
2
Sudanese
2
Sudan
38
1
4
3
2

2
a
4
3
2
suds
2
sudden
2
sud
38
1
4
3
2

2

4
2
2
suckling
2
suck
38
1
4
3
2

2
eu
4
1
2
succinct
38
1
4
3
2

2

4
2
2
succumb
2
succubus
38
1
4
3
2

2
s
4
1
2
succeed
38
1
4
3
2

2

4
2
2
successive
2
succession
38
1
4
3
2
s
2
i
4
3
2
successor
2
successful
2
success
38
1
4
3
2

2
ck
4
3
2
suction
2
sucrose
2
such
38
1
4
3
2
er
2

4
2
2
subvert
2
subversive
38
1
4
3
2
rb
2

4
2
2
suburbia
2
suburb
38
1
4
3
2
a
2

4
2
2
subtrahend
2
subtracter
38
1
4
3
2

2

4
2
2
subtlety
2
subtle
38
1
4
3
2

2
e
4
1
2
subtly
38
1
4
3
2
r
2

4
2
2
subterranean
2
subterfuge
38
1
4
3
2

2
elr
4
0
38
1
4
3
2

2

4
2
2
subsumed
2
subsume
38
1
4
3
2
m
2
e
4
1
2
subsuming
38
1
4
3
2
on
2

4
2
2
substitutionary
2
substitution
38
1
4
3
2

2
i
4
1
2
substitute
38
1
4
3
2
tu
2
t
4
1
2
substituent
38
1
4
3
2
nti
2
a
4
1
2
substantive
38
1
4
3
2

2

4
2
2
substantiate
2
substantial
38
1
4
3
2

2
ai
4
1
2
substrate
38
1
4
3
2
t
2

4
2
2
subsistent
2
subsist
38
1
4
3
2

2

4
2
2
subsidy
2
subsidiary
38
1
4
3
2

2
ds
4
0
38
1
4
3
2

2
itu
4
1
2
subservient
38
1
4
3
2

2

4
3
2
submitting
2
submitted
2
submittal
38
1
4
3
2
t
2
t
4
1
2
submit
38
1
4
3
2

2
i
4
1
2
submersible
38
1
4
3
2
im
2

4
2
2
subliminal
2
sublimate
38
1
4
3
2
ct
2
i
4
2
2
subjects
2
subject
38
1
4
3
2

2
e
4
1
2
subjunctive
38
1
4
3
2

2
jlmstuv
4
3
2
subrogation
2
subpoena
2
sub
38
1
4
3
2

2
bcdefgilmnprstz
4
1
2
suave
38
1
4
3
2

2

4
2
2
Styrofoam
2
styrene
38
1
4
3
2

2

4
3
2
stylites
2
stylish
2
styli
38
1
4
3
2

2
ie
4
1
2
stylus
38
1
4
3
2

2
lr
4
3
2
Styx
2
stymie
2
Stygian
38
1
4
3
2
t
2

4
2
2
Stuttgart
2
stutter
38
1
4
3
2

2

4
4
2
Sturm
2
sturgeon
2
sturdy
2
Sturbridge
38
1
4
3
2

2
f
4
1
2
stupendous
38
1
4
3
2

2

4
2
2
stupefy
2
stupefaction
38
1
4
3
2

2
e
4
2
2
stupor
2
stupid
38
1
4
3
2

2

4
4
2
stunt
2
stunk
2
stung
2
stun
38
1
4
3
2

2

4
3
2
stumpy
2
stumpage
2
stump
38
1
4
3
2

2
p
4
1
2
stumble
38
1
4
3
2
f
2

4
2
2
stuffy
2
stuff
38
1
4
3
2
o
2

4
2
2
studious
2
studio
38
1
4
3
2

2

4
2
2
student
2
Studebaker
38
1
4
3
2

2
ei
4
2
2
study
2
stud
38
1
4
3
2

2

4
2
2
stuck
2
stucco
38
1
4
3
2

2

4
3
2
stubby
2
stubborn
2
stubble
38
1
4
3
2

2
b
4
1
2
stub
38
1
4
3
2

2
bcdfmnprt
4
4
2
Stuyvesant
2
stultify
2
Stuart
2
Stu
38
1
4
3
2

2
t
4
1
2
struck
38
1
4
3
2
ur
2

4
2
2
structure
2
structural
38
1
4
3
2

2
c
4
4
2
strut
2
strung
2
strum
2
struggle
38
1
4
3
2

2

4
2
2
strophe
2
strop
38
1
4
3
2

2

4
3
2
strongroom
2
stronghold
2
strong
38
1
4
3
2

2
g
4
1
2
strontium
38
1
4
3
2

2

4
2
2
Stromberg
2
Strom
38
1
4
3
2

2

4
2
2
stroboscopic
2
strobe
38
1
4
3
2

2
bmnp
4
4
2
strove
2
stroll
2
stroke
2
strode
38
1
4
3
2
e
2

4
2
2
striven
2
strive
38
1
4
3
2

2

4
4
2
stripy
2
striptease
2
stripe
2
strip
38
1
4
3
2
g
2

4
4
2
strings
2
stringy
2
stringent
2
string
38
1
4
3
2
e
2

4
2
2
strikebreak
2
strike
38
1
4
3
2
e
2

4
2
2
strident
2
stride
38
1
4
3
2

2

4
3
2
stricture
2
stricter
2
strict
38
1
4
3
2

2

4
2
2
Strickland
2
stricken
38
1
4
3
2

2
kt
4
0
38
1
4
3
2

2
cdknpv
4
2
2
strife
2
striate
38
1
4
3
2
s
2

4
2
2
stressful
2
stress
38
1
4
3
2
to
2

4
2
2
streptomycin
2
streptococcus
38
1
4
3
2
th
2

4
2
2
strengthen
2
strength
38
1
4
3
2

2
g
4
1
2
strenuous
38
1
4
3
2
t
2

4
3
2
streets
2
streetcar
2
street
38
1
4
3
2

2
m
4
1
2
streak
38
1
4
3
2

2

4
3
2
streamside
2
streamline
2
stream
38
1
4
3
2

2
aenps
4
2
2
strewn
2
stretch
38
1
4
3
2

2
bintw
4
6
2
stray
2
Strauss
2
strap
2
straggle
2
strafe
2
straddle
38
1
4
3
2

2

4
3
2
strawflower
2
strawberry
2
straw
38
1
4
3
2
spher
2

4
2
2
stratospheric
2
stratosphere
38
1
4
3
2

2

4
2
2
strategist
2
strategic
38
1
4
3
2
g
2
i
4
1
2
strategy
38
1
4
3
2

2

4
2
2
stratagem
2
strata
38
1
4
3
2

2
aeo
4
4
2
stratum
2
Stratton
2
stratify
2
Stratford
38
1
4
3
2

2

4
3
2
strangulate
2
strangle
2
strange
38
1
4
3
2

2
g
4
1
2
strand
38
1
4
3
2
ht
2

4
5
2
straightway
2
straightforward
2
straighten
2
straightaway
2
straight
38
1
4
3
2

2
g
4
2
2
strait
2
strain
38
1
4
3
2
ism
2

4
2
2
strabismus
2
strabismic
38
1
4
3
2

2
aeiou
4
1
2
strychnine
38
1
4
3
2

2

4
2
2
stowaway
2
stowage
38
1
4
3
2

2
a
4
1
2
stow
38
1
4
3
2

2

4
3
2
storyteller
2
storyboard
2
story
38
1
4
3
2

2

4
3
2
stormy
2
stormbound
2
storm
38
1
4
3
2

2

4
5
2
Storey
2
storeroom
2
storekeep
2
storehouse
2
store
38
1
4
3
2

2
emy
4
2
2
stork
2
storage
38
1
4
3
2

2

4
7
2
stopwatch
2
stoppage
2
stopover
2
stopgap
2
stopcock
2
stopband
2
stop
38
1
4
3
2

2

4
4
2
stoop
2
stool
2
stooge
2
stood
38
1
4
3
2

2
w
4
3
2
Stonehenge
2
stonecrop
2
stone
38
1
4
3
2

2

4
2
2
stoneware
2
stonewall
38
1
4
3
2

2
a
4
1
2
stonewort
38
1
4
3
2

2
e
4
1
2
stony
38
1
4
3
2

2

4
2
2
stomp
2
stomach
38
1
4
3
2

2

4
2
2
stolen
2
stole
38
1
4
3
2

2
e
4
1
2
stolid
38
1
4
3
2
e
2

4
2
2
Stokes
2
stoke
38
1
4
3
2
c
2

4
2
2
stoichiometry
2
stoic
38
1
4
3
2

2
k
4
1
2
stochastic
38
1
4
3
2
ol
2

4
2
2
Stockholm
2
stockholder
38
1
4
3
2

2
h
4
7
2
stocky
2
Stockton
2
stockroom
2
stockpile
2
stockbroker
2
stockade
2
stock
38
1
4
3
2

2
ciklmnoprw
4
3
2
stove
2
stout
2
stodgy
38
1
4
3
2

2

4
3
2
stirrup
2
Stirling
2
stir
38
1
4
3
2

2

4
3
2
stipulate
2
stipple
2
stipend
38
1
4
3
2

2

4
3
2
stinky
2
stinkpot
2
stink
38
1
4
3
2

2

4
2
2
stingy
2
sting
38
1
4
3
2

2
gk
4
1
2
stint
38
1
4
3
2

2
t
4
1
2
stimulant
38
1
4
3
2

2

4
2
2
stimulatory
2
stimulate
38
1
4
3
2
ul
2
a
4
2
2
stimulus
2
stimuli
38
1
4
3
2

2

4
3
2
stillwater
2
stillbirth
2
still
38
1
4
3
2

2

4
2
2
stiletto
2
stile
38
1
4
3
2

2
el
4
1
2
stilt
38
1
4
3
2
ma
2

4
2
2
stigmata
2
stigma
38
1
4
3
2

2

4
2
2
stiffen
2
stiff
38
1
4
3
2

2
f
4
1
2
stifle
38
1
4
3
2
k
2
l
4
4
2
sticky
2
sticktight
2
stickpin
2
stick
38
1
4
3
2
e
2

4
2
2
stickleback
2
stickle
38
1
4
3
2

2
cfglmnpr
4
1
2
stitch
38
1
4
3
2

2

4
2
2
stewardess
2
steward
38
1
4
3
2
r
2
d
4
1
2
Stewart
38
1
4
3
2

2
a
4
1
2
stew
38
1
4
3
2

2

4
2
2
Stevenson
2
Stevens
38
1
4
3
2

2
s
4
1
2
Steven
38
1
4
3
2
e
2
n
4
2
2
stevedore
2
Steve
38
1
4
3
2

2

4
2
2
Stetson
2
stethoscope
38
1
4
3
2

2

4
5
2
sternum
2
Sterno
2
Sternberg
2
sternal
2
stern
38
1
4
3
2
o
2

4
3
2
stereoscopy
2
stereography
2
stereo
38
1
4
3
2

2
en
4
4
2
steroid
2
sterling
2
sterile
2
steradian
38
1
4
3
2

2

4
2
2
Stephenson
2
Stephens
38
1
4
3
2
n
2
s
4
1
2
Stephen
38
1
4
3
2
n
2

4
2
2
stephanotis
2
Stephanie
38
1
4
3
2

2
ae
4
0
38
1
4
3
2

2
h
4
7
2
stepwise
2
stepson
2
steprelation
2
steppe
2
stepmother
2
stepchild
2
step
38
1
4
3
2
raph
2

4
2
2
stenography
2
stenographer
38
1
4
3
2

2
g
4
1
2
stenotype
38
1
4
3
2

2

4
2
2
stencil
2
stench
38
1
4
3
2

2
co
4
0
38
1
4
3
2
la
2

4
2
2
stellar
2
Stella
38
1
4
3
2
n
2

4
3
2
Steiner
2
Steinberg
2
stein
38
1
4
3
2
e
2

4
3
2
steeplechase
2
steeplebush
2
steeple
38
1
4
3
2

2
l
4
2
2
steepen
2
steep
38
1
4
3
2

2

4
4
2
steely
2
steelmake
2
Steele
2
steel
38
1
4
3
2

2
lp
4
4
2
steeve
2
steer
2
Steen
2
steed
38
1
4
3
2

2
dlmr
4
1
2
steak
38
1
4
3
2

2

4
3
2
Stearns
2
stearic
2
stearate
38
1
4
3
2

2

4
4
2
steaming
2
steamy
2
steamboat
2
steam
38
1
4
3
2
h
2

4
2
2
stealthy
2
stealth
38
1
4
3
2

2
t
4
1
2
steal
38
1
4
3
2

2

4
3
2
steady
2
steadfast
2
stead
38
1
4
3
2

2
aeilnprtvw
4
4
2
Steuben
2
stem
2
Stegosaurus
2
Stefan
38
1
4
3
2

2

4
3
2
stays
2
stayed
2
stay
38
1
4
3
2

2

4
2
2
Staunton
2
staunch
38
1
4
3
2

2
n
4
1
2
Stauffer
38
1
4
3
2

2

4
2
2
statutory
2
statute
38
1
4
3
2

2

4
2
2
statuette
2
statue
38
1
4
3
2

2
et
4
3
2
status
2
stature
2
statuary
38
1
4
3
2
r
2

4
2
2
stationary
2
stationarity
38
1
4
3
2
n
2
a
4
2
2
stationmaster
2
stationery
38
1
4
3
2

2
o
4
2
2
statistician
2
static
38
1
4
3
2

2
rs
4
4
2
stated
2
statewide
2
Staten
2
state
38
1
4
3
2
n
2

4
2
2
statesmanlike
2
statesman
38
1
4
3
2

2
m
4
1
2
states
38
1
4
3
2

2

4
2
2
stateroom
2
stater
38
1
4
3
2

2
eiu
4
2
2
stator
2
Statler
38
1
4
3
2

2

4
2
2
stasis
2
stash
38
1
4
3
2

2

4
2
2
starve
2
starvation
38
1
4
3
2

2

4
6
2
starts
2
starting
2
started
2
startup
2
startle
2
start
38
1
4
3
2

2

4
2
2
starling
2
starlight
38
1
4
3
2

2
i
4
1
2
starlet
38
1
4
3
2

2

4
2
2
Starkey
2
stark
38
1
4
3
2
h
2

4
2
2
starchy
2
starch
38
1
4
3
2

2
ckltv
4
8
2
starship
2
Starr
2
stargaze
2
starfish
2
stare
2
stardom
2
starboard
2
star
38
1
4
3
2
e
2

4
2
2
Stapleton
2
staple
38
1
4
3
2

2

4
2
2
staphylococcus
2
staph
38
1
4
3
2

2
hl
4
0
38
1
4
3
2

2

4
2
2
stannous
2
stannic
38
1
4
3
2

2
a
4
7
2
standstill
2
standpoint
2
standoff
2
Standish
2
standeth
2
standby
2
stand
38
1
4
3
2

2

4
2
2
stanchion
2
stanch
38
1
4
3
2

2
h
4
1
2
stance
38
1
4
3
2

2
cdn
4
7
2
stanza
2
Stanton
2
Stanley
2
stank
2
Stanhope
2
Stanford
2
Stan
38
1
4
3
2

2

4
2
2
stampede
2
stamp
38
1
4
3
2
na
2

4
2
2
staminate
2
stamina
38
1
4
3
2

2
ip
4
3
2
stammer
2
Stamford
2
stamen
38
1
4
3
2

2

4
2
2
stallion
2
stall
38
1
4
3
2

2

4
3
2
Staley
2
stalemate
2
stale
38
1
4
3
2

2
el
4
4
2
stalwart
2
stalk
2
Stalin
2
stalactite
38
1
4
3
2

2

4
2
2
stairwell
2
stairway
38
1
4
3
2

2
w
4
2
2
staircase
2
stair
38
1
4
3
2

2
r
4
2
2
stain
2
staid
38
1
4
3
2
a
2

4
2
2
stagnate
2
stagnant
38
1
4
3
2

2

4
3
2
stagestruck
2
stagecoach
2
stage
38
1
4
3
2

2
en
4
2
2
stagy
2
stag
38
1
4
3
2
f
2

4
2
2
Stafford
2
staff
38
1
4
3
2
i
2

4
2
2
stadium
2
stadia
38
1
4
3
2

2

4
3
2
Stacy
2
stack
2
staccato
38
1
4
3
2

2
l
4
2
2
stabile
2
stab
38
1
4
3
2

2

4
2
2
stablemen
2
stableman
38
1
4
3
2
e
2
m
4
1
2
stable
38
1
4
3
2

2
bcdfgilmnprstuy
4
3
2
stave
2
stake
2
Stahl
38
1
4
3
2

2
aeioruy
4
1
2
St
38
1
4
3
2

2

4
3
2
SSW
2
SST
2
SSE
38
1
4
3
2

2

4
2
2
squirmy
2
squirm
38
1
4
3
2

2

4
2
2
squirehood
2
squire
38
1
4
3
2

2
em
4
2
2
squirt
2
squirrel
38
1
4
3
2

2
r
4
5
2
squishy
2
squint
2
squill
2
squid
2
Squibb
38
1
4
3
2

2

4
2
2
squeeze
2
squeegee
38
1
4
3
2

2
k
4
2
2
squeamish
2
squeal
38
1
4
3
2

2

4
2
2
squeaky
2
squeak
38
1
4
3
2

2
ae
4
1
2
squelch
38
1
4
3
2

2
dlstw
4
4
2
square
2
squander
2
squamous
2
squabble
38
1
4
3
2

2

4
4
2
squawroot
2
squawk
2
squawbush
2
squaw
38
1
4
3
2

2

4
2
2
squatter
2
squatted
38
1
4
3
2

2
e
4
1
2
squatting
38
1
4
3
2

2
t
4
1
2
squat
38
1
4
3
2
h
2

4
3
2
squashy
2
squashberry
2
squash
38
1
4
3
2

2

4
2
2
squall
2
squalid
38
1
4
3
2

2

4
2
2
squadron
2
squad
38
1
4
3
2
u
2
aei
4
0
38
1
4
3
2

2

4
2
2
spyglass
2
spy
38
1
4
3
2

2
z
4
2
2
zigging
2
zig
38
1
4
3
2

2

4
2
2
sputter
2
sputnik
38
1
4
3
2

2

4
5
2
spurt
2
spurn
2
spurious
2
spurge
2
spur
38
1
4
3
2

2

4
2
2
spunk
2
spun
38
1
4
3
2

2

4
2
2
spumoni
2
spume
38
1
4
3
2

2
mnrt
4
1
2
spud
38
1
4
3
2

2

4
3
2
sprung
2
sprue
2
spruce
38
1
4
3
2

2

4
2
2
sprout
2
Sproul
38
1
4
3
2

2
u
4
1
2
sprocket
38
1
4
3
2

2
t
4
5
2
springy
2
Springfield
2
springe
2
springboard
2
spring
38
1
4
3
2

2

4
2
2
springtime
2
springtail
38
1
4
3
2

2
g
4
2
2
sprint
2
sprinkle
38
1
4
3
2

2

4
2
2
sprightly
2
sprig
38
1
4
3
2

2
gn
4
1
2
sprite
38
1
4
3
2

2

4
2
2
spree
2
spread
38
1
4
3
2

2

4
5
2
spray
2
sprawl
2
sprang
2
sprain
2
Sprague
38
1
4
3
2

2
aeiou
4
0
38
1
4
3
2

2

4
2
2
spout
2
spouse
38
1
4
3
2

2

4
3
2
spotty
2
spotlight
2
spot
38
1
4
3
2

2

4
2
2
sportswriter
2
sportswrite
38
1
4
3
2
it
2
e
4
1
2
sportswriting
38
1
4
3
2

2
r
4
1
2
sportswear
38
1
4
3
2

2

4
2
2
sportsmen
2
sportsman
38
1
4
3
2

2
mw
4
0
38
1
4
3
2

2
s
4
2
2
sporty
2
sport
38
1
4
3
2

2
t
4
2
2
spore
2
sporadic
38
1
4
3
2

2

4
2
2
spoonful
2
spoon
38
1
4
3
2

2

4
2
2
spooky
2
spook
38
1
4
3
2

2
kn
4
2
2
spool
2
spoof
38
1
4
3
2
ane
2

4
2
2
spontaneous
2
spontaneity
38
1
4
3
2

2

4
2
2
spongy
2
sponge
38
1
4
3
2

2
gt
4
1
2
sponsor
38
1
4
3
2

2

4
2
2
spokesmen
2
spokesman
38
1
4
3
2

2
m
4
1
2
spokesperson
38
1
4
3
2

2
s
4
2
2
spoken
2
spoke
38
1
4
3
2

2
e
4
1
2
Spokane
38
1
4
3
2
l
2

4
2
2
spoilage
2
spoil
38
1
4
3
2

2
iknortu
4
0
38
1
4
3
2

2

4
2
2
splutter
2
splurge
38
1
4
3
2
tch
2

4
2
2
splotchy
2
splotch
38
1
4
3
2

2

4
2
2
splintery
2
splint
38
1
4
3
2

2
t
4
1
2
spline
38
1
4
3
2

2
n
4
2
2
split
2
splice
38
1
4
3
2

2

4
2
2
splenetic
2
splendid
38
1
4
3
2
n
2

4
2
2
spleenwort
2
spleen
38
1
4
3
2

2
en
4
0
38
1
4
3
2

2
sy
4
1
2
splat
38
1
4
3
2

2

4
2
2
splayed
2
splay
38
1
4
3
2
h
2

4
2
2
splashy
2
splash
38
1
4
3
2

2
aeiou
4
0
38
1
4
3
2

2

4
2
2
spiteful
2
spite
38
1
4
3
2

2
e
4
4
2
spitz
2
spittle
2
spitfire
2
spit
38
1
4
3
2
t
2

4
2
2
spiritual
2
spirit
38
1
4
3
2

2
i
4
3
2
Spiro
2
spire
2
spiral
38
1
4
3
2

2

4
2
2
spinoff
2
spinodal
38
1
4
3
2

2

4
2
2
spinneret
2
spinnaker
38
1
4
3
2

2

4
2
2
spinal
2
spinach
38
1
4
3
2

2
ano
4
5
2
spiny
2
spinster
2
spine
2
spindle
2
spin
38
1
4
3
2

2

4
2
2
spilt
2
spill
38
1
4
3
2

2

4
2
2
spikenard
2
spike
38
1
4
3
2

2
e
4
1
2
spiky
38
1
4
3
2
er
2

4
3
2
spidery
2
spiderwort
2
spider
38
1
4
3
2

2
e
4
2
2
spicy
2
Spica
38
1
4
3
2

2

4
2
2
spicebush
2
spice
38
1
4
3
2

2
cdklnrt
4
2
2
spigot
2
Spiegel
38
1
4
3
2
id
2

4
2
2
spheroidal
2
spheroid
38
1
4
3
2
r
2
o
4
3
2
spherule
2
spheric
2
sphere
38
1
4
3
2

2

4
2
2
sphalerite
2
sphagnum
38
1
4
3
2

2
ae
4
1
2
sphinx
38
1
4
3
2

2

4
2
2
spermatophyte
2
sperm
38
1
4
3
2

2

4
2
2
Zurich
2
zucchini
38
1
4
3
2
ast
2

4
2
2
Zoroastrian
2
Zoroaster
38
1
4
3
2

2
o
4
1
2
Zorn
38
1
4
3
2

2
l
4
2
2
zoom
2
zoo
38
1
4
3
2
b
2

4
2
2
zombie
2
Zomba
38
1
4
3
2
iac
2

4
2
2
zodiacal
2
zodiac
38
1
4
3
2

2
dmor
4
3
2
zounds
2
zone
2
Zoe
38
1
4
3
2

2
noprg
4
3
2
Ziegler
2
Zimmerman
2
zilch
38
1
4
3
2
con
2

4
2
2
zirconium
2
zircon
38
1
4
3
2

2

4
2
2
zippy
2
zip
38
1
4
3
2
n
2

4
2
2
Zionism
2
Zion
38
1
4
3
2

2

4
2
2
zing
2
zinc
38
1
4
3
2

2
iouae
4
4
2
zygote
2
z's
2
zloty
2
z
38
1
4
3
2

2
m
4
1
2
Sperry
38
1
4
3
2
er
2

4
2
2
Spencerian
2
Spencer
38
1
4
3
2

2
cd
4
1
2
spent
38
1
4
3
2
l
2

4
3
2
spellcheck
2
spellbound
2
spell
38
1
4
3
2

2

4
6
2
speedy
2
speedwell
2
speedup
2
speedometer
2
speedboat
2
speed
38
1
4
3
2

2
d
4
1
2
speech
38
1
4
3
2
la
2

4
2
2
speculate
2
specular
38
1
4
3
2
cop
2

4
3
2
spectroscopy
2
spectroscopic
2
spectroscope
38
1
4
3
2
ra
2
p
4
1
2
spectrogram
38
1
4
3
2
h
2

4
2
2
spectrography
2
spectrograph
38
1
4
3
2

2
gs
4
2
2
spectrophotometer
2
spectrometer
38
1
4
3
2

2

4
2
2
spectral
2
spectra
38
1
4
3
2

2
ao
4
1
2
spectrum
38
1
4
3
2

2
c
4
1
2
spectator
38
1
4
3
2

2

4
2
2
spectacular
2
spectacle
38
1
4
3
2

2
ar
4
1
2
Spector
38
1
4
3
2

2

4
2
2
speckle
2
speck
38
1
4
3
2

2
i
4
1
2
specify
38
1
4
3
2

2

4
2
2
species
2
specie
38
1
4
3
2

2
ef
4
3
2
specious
2
specimen
2
special
38
1
4
3
2

2
iktu
4
1
2
spec
38
1
4
3
2

2
kr
4
0
38
1
4
3
2

2

4
3
2
spearmint
2
spearhead
2
spear
38
1
4
3
2

2

4
2
2
speakeasy
2
speak
38
1
4
3
2

2
acelnr
4
2
2
spew
2
sped
38
1
4
3
2

2
cnrsty
4
8
2
spawn
2
spavin
2
Spaulding
2
spalding
2
Spain
2
spaghetti
2
spade
2
spa
38
1
4
3
2

2

4
2
2
spayed
2
spay
38
1
4
3
2

2

4
6
2
spatula
2
spatterdock
2
spatlum
2
spatial
2
spate
2
spat
38
1
4
3
2

2

4
2
2
spastic
2
spasm
38
1
4
3
2
a
2

4
2
2
Spartan
2
Sparta
38
1
4
3
2

2

4
4
2
sparky
2
Sparkman
2
sparkle
2
spark
38
1
4
3
2

2
kt
4
6
2
sparse
2
sparrow
2
sparling
2
sparge
2
spare
2
spar
38
1
4
3
2

2

4
3
2
Spanish
2
spaniel
2
Spaniard
38
1
4
3
2

2
i
4
3
2
spangle
2
spandrel
2
span
38
1
4
3
2

2
s
4
3
2
spacetime
2
spacecraft
2
space
38
1
4
3
2

2
e
4
1
2
spacious
38
1
4
3
2

2
aehiloruy
4
0
38
1
4
3
2

2

4
3
2
soybean
2
soya
2
soy
38
1
4
3
2

2

4
3
2
sown
2
sowbelly
2
sow
38
1
4
3
2
reign
2

4
2
2
sovereignty
2
sovereign
38
1
4
3
2

2
ei
4
1
2
sovkhoz
38
1
4
3
2
st
2

4
2
2
southwestern
2
southwest
38
1
4
3
2

2
e
4
1
2
southward
38
1
4
3
2
n
2

4
2
2
southernmost
2
southern
38
1
4
3
2
st
2

4
2
2
southeastern
2
southeast
38
1
4
3
2

2
ar
4
1
2
Southey
38
1
4
3
2

2
ew
4
5
2
southpaw
2
southland
2
southbound
2
Southampton
2
south
38
1
4
3
2

2
h
4
1
2
soutane
38
1
4
3
2

2
c
4
4
2
sourwood
2
sourdough
2
sourberry
2
sour
38
1
4
3
2
d
2

4
3
2
sounds
2
soundproof
2
sound
38
1
4
3
2

2

4
2
2
soulful
2
soul
38
1
4
3
2
h
2

4
2
2
sought
2
sough
38
1
4
3
2

2
glnrt
4
5
2
souvenir
2
Sousa
2
soup
2
souffle
2
sou
38
1
4
3
2

2

4
3
2
sorted
2
sortie
2
sort
38
1
4
3
2
w
2

4
2
2
sorrowful
2
sorrow
38
1
4
3
2

2
o
4
2
2
sorry
2
sorrel
38
1
4
3
2
s
2

4
2
2
Sorenson
2
Sorensen
38
1
4
3
2

2
n
4
1
2
sore
38
1
4
3
2

2
ert
4
7
2
sorption
2
sorority
2
sorghum
2
sordid
2
sorcery
2
sorb
2
sora
38
1
4
3
2
or
2

4
2
2
sophomoric
2
sophomore
38
1
4
3
2
le
2

4
2
2
Sophocles
2
Sophoclean
38
1
4
3
2

2
cm
4
0
38
1
4
3
2

2
s
4
2
2
Sophie
2
Sophia
38
1
4
3
2

2

4
2
2
sophistry
2
sophisticate
38
1
4
3
2

2
t
4
1
2
sophism
38
1
4
3
2

2
io
4
0
38
1
4
3
2

2
h
4
2
2
soprano
2
sop
38
1
4
3
2
ay
2

4
2
2
soothsayer
2
soothsay
38
1
4
3
2

2
s
4
2
2
soothe
2
sooth
38
1
4
3
2

2
h
4
1
2
soot
38
1
4
3
2

2
t
4
1
2
soon
38
1
4
3
2

2

4
3
2
sonorous
2
sonority
2
Sonora
38
1
4
3
2

2
r
4
2
2
Sonoma
2
sonogram
38
1
4
3
2

2

4
2
2
sonny
2
sonnet
38
1
4
3
2

2

4
2
2
songbook
2
songbag
38
1
4
3
2

2
b
4
2
2
songful
2
song
38
1
4
3
2

2

4
3
2
sonata
2
sonar
2
sonant
38
1
4
3
2

2
agno
4
3
2
Sony
2
sonic
2
son
38
1
4
3
2
e
2

4
2
2
Sommerfeld
2
sommelier
38
1
4
3
2
h
2

4
2
2
somewhere
2
somewhat
38
1
4
3
2

2
i
4
1
2
something
38
1
4
3
2

2

4
3
2
Somerset
2
somersault
2
Somers
38
1
4
3
2

2
s
4
1
2
Somerville
38
1
4
3
2
ne
2

4
2
2
someone'll
2
someone
38
1
4
3
2
ody
2

4
2
2
somebody'll
2
somebody
38
1
4
3
2

2
bortw
4
4
2
someplace
2
somehow
2
someday
2
some
38
1
4
3
2

2

4
2
2
sombre
2
somber
38
1
4
3
2

2
l
4
2
2
somatic
2
soma
38
1
4
3
2

2

4
2
2
Somali
2
somal
38
1
4
3
2

2
abem
4
1
2
somnolent
38
1
4
3
2

2

4
2
2
solvent
2
solve
38
1
4
3
2

2
e
4
1
2
solvate
38
1
4
3
2

2

4
2
2
solution
2
solute
38
1
4
3
2

2
t
4
1
2
soluble
38
1
4
3
2

2

4
3
2
Solon
2
Solomon
2
solo
38
1
4
3
2

2

4
2
2
solitary
2
solitaire
38
1
4
3
2

2
a
4
2
2
solitude
2
soliton
38
1
4
3
2

2
i
4
3
2
solidus
2
solidarity
2
solid
38
1
4
3
2
it
2
o
4
3
2
solicitude
2
solicitation
2
solicit
38
1
4
3
2

2

4
2
2
solicitous
2
solicitor
38
1
4
3
2

2
cdt
4
2
2
solipsism
2
soliloquy
38
1
4
3
2

2

4
4
2
solenoid
2
solemn
2
solecism
2
sole
38
1
4
3
2
er
2

4
2
2
soldiery
2
soldier
38
1
4
3
2

2
i
4
2
2
solder
2
sold
38
1
4
3
2

2

4
2
2
solar
2
solace
38
1
4
3
2

2
adeiouv
4
2
2
solstice
2
Sol
38
1
4
3
2

2

4
3
2
soiree
2
soil
2
soignee
38
1
4
3
2

2

4
2
2
softwood
2
software
38
1
4
3
2

2
w
4
3
2
soften
2
softball
2
soft
38
1
4
3
2

2
t
4
3
2
Sofia
2
soffit
2
sofa
38
1
4
3
2

2

4
4
2
sodium
2
sodden
2
soda
2
sod
38
1
4
3
2
at
2

4
2
2
Socratic
2
Socrates
38
1
4
3
2

2

4
2
2
sockeye
2
socket
38
1
4
3
2

2
e
4
1
2
sock
38
1
4
3
2

2

4
3
2
sociometry
2
sociology
2
socioeconomic
38
1
4
3
2
t
2

4
3
2
society
2
Societe
2
societal
38
1
4
3
2

2

4
2
2
social
2
sociable
38
1
4
3
2

2
aeo
4
0
38
1
4
3
2

2
ikr
4
2
2
soccer
2
Soc
38
1
4
3
2
i
2

4
2
2
sobriquet
2
sobriety
38
1
4
3
2

2
r
4
2
2
sober
2
sob
38
1
4
3
2

2

4
2
2
soapsud
2
soapstone
38
1
4
3
2

2
s
4
2
2
soapy
2
soap
38
1
4
3
2

2
p
4
2
2
soar
2
soak
38
1
4
3
2

2
abcdfilmnopruvwy
4
3
2
sojourn
2
soggy
2
so
38
1
4
3
2

2

4
2
2
Snyder
2
snyaptic
38
1
4
3
2
l
2

4
2
2
snuggly
2
snuggle
38
1
4
3
2

2
g
4
1
2
snug
38
1
4
3
2
f
2

4
2
2
snuffle
2
snuff
38
1
4
3
2

2
fg
4
1
2
snub
38
1
4
3
2

2

4
2
2
snowflake
2
snowfall
38
1
4
3
2

2
f
4
4
2
snowy
2
snowstorm
2
snowball
2
snow
38
1
4
3
2

2

4
3
2
snort
2
snorkel
2
snore
38
1
4
3
2

2

4
2
2
snoopy
2
snoop
38
1
4
3
2

2
p
4
1
2
snook
38
1
4
3
2

2
b
4
1
2
snob
38
1
4
3
2

2

4
2
2
snobbish
2
snobbery
38
1
4
3
2

2
borw
4
2
2
snout
2
snotty
38
1
4
3
2

2

4
2
2
snippy
2
snippet
38
1
4
3
2

2
p
4
2
2
snipe
2
snip
38
1
4
3
2

2

4
2
2
sniffle
2
sniff
38
1
4
3
2

2
f
4
1
2
snifter
38
1
4
3
2

2
fp
4
4
2
snivel
2
snigger
2
Snider
2
snick
38
1
4
3
2

2

4
2
2
sneeze
2
sneer
38
1
4
3
2
k
2

4
2
2
sneaky
2
sneak
38
1
4
3
2

2
ae
4
1
2
snell
38
1
4
3
2

2
gkpr
4
5
2
snazzy
2
snatch
2
snail
2
snafu
2
snack
38
1
4
3
2

2

4
3
2
snarl
2
snark
2
snare
38
1
4
3
2

2

4
2
2
snappy
2
snappish
38
1
4
3
2

2
p
4
4
2
snapshot
2
snapdragon
2
snapback
2
snap
38
1
4
3
2
e
2

4
3
2
snakeroot
2
snakebird
2
snake
38
1
4
3
2

2

4
2
2
snagging
2
snag
38
1
4
3
2

2
aeiouy
4
0
38
1
4
3
2

2

4
2
2
Smythe
2
Smyrna
38
1
4
3
2

2

4
2
2
smutty
2
smut
38
1
4
3
2

2

4
2
2
smuggle
2
smug
38
1
4
3
2
g
2

4
2
2
smudgy
2
smudge
38
1
4
3
2

2
dgt
4
1
2
Smucker
38
1
4
3
2
h
2

4
2
2
smoothbore
2
smooth
38
1
4
3
2

2
t
4
1
2
smooch
38
1
4
3
2

2
s
4
2
2
smokehouse
2
smoke
38
1
4
3
2

2

4
2
2
smokestack
2
smokescreen
38
1
4
3
2

2
e
4
1
2
smoky
38
1
4
3
2

2
ko
4
3
2
smother
2
smolder
2
smog
38
1
4
3
2

2

4
5
2
smithy
2
Smithson
2
Smithfield
2
smithereens
2
smith
38
1
4
3
2

2
h
4
1
2
smitten
38
1
4
3
2

2
t
4
2
2
smirk
2
smile
38
1
4
3
2

2
l
4
1
2
smelt
38
1
4
3
2

2
l
4
1
2
smear
38
1
4
3
2

2
l
4
4
2
smattering
2
smash
2
smart
2
smack
38
1
4
3
2
l
2
e
4
4
2
smalltime
2
smallpox
2
smallish
2
small
38
1
4
3
2

2
aeiouy
4
0
38
1
4
3
2

2

4
3
2
slurry
2
slurp
2
slur
38
1
4
3
2

2

4
3
2
slump
2
slumber
2
slum
38
1
4
3
2
i
2

4
2
2
sluggish
2
slugging
38
1
4
3
2

2
g
4
1
2
slug
38
1
4
3
2

2
gmr
4
3
2
slung
2
sluice
2
sludge
38
1
4
3
2

2

4
2
2
slowdown
2
slow
38
1
4
3
2
n
2

4
2
2
Slovenia
2
sloven
38
1
4
3
2

2
e
4
1
2
Slovakia
38
1
4
3
2

2

4
2
2
slough
2
slouch
38
1
4
3
2

2

4
2
2
slothful
2
sloth
38
1
4
3
2

2
h
4
1
2
slot
38
1
4
3
2

2

4
3
2
sloppy
2
slope
2
slop
38
1
4
3
2
n
2

4
2
2
sloganeer
2
slogan
38
1
4
3
2

2
a
4
2
2
slogging
2
slog
38
1
4
3
2
n
2

4
2
2
Sloane
2
Sloan
38
1
4
3
2

2
agptuvw
4
5
2
slosh
2
sloop
2
sloe
2
Slocum
2
slob
38
1
4
3
2
er
2

4
2
2
slivery
2
sliver
38
1
4
3
2

2

4
2
2
slither
2
slit
38
1
4
3
2

2

4
2
2
slippery
2
slippage
38
1
4
3
2

2
p
4
1
2
slip
38
1
4
3
2
g
2

4
2
2
slingshot
2
sling
38
1
4
3
2

2

4
3
2
slimy
2
slime
2
slim
38
1
4
3
2

2

4
2
2
slide
2
slid
38
1
4
3
2

2

4
2
2
slick
2
slice
38
1
4
3
2

2
cdmnptvg
4
0
38
1
4
3
2
gh
2

4
2
2
sleight
2
sleigh
38
1
4
3
2

2

4
2
2
sleety
2
sleet
38
1
4
3
2

2

4
3
2
sleepy
2
sleepwalk
2
sleep
38
1
4
3
2

2
pt
4
2
2
sleeve
2
sleek
38
1
4
3
2

2
g
4
1
2
sled
38
1
4
3
2
e
2

4
2
2
sledgehammer
2
sledge
38
1
4
3
2

2
dei
4
4
2
slew
2
sleuth
2
slept
2
slender
38
1
4
3
2

2
cnptuv
4
8
2
slay
2
slash
2
slam
2
slake
2
slain
2
slag
2
sladang
2
slab
38
1
4
3
2

2

4
2
2
slavish
2
Slavic
38
1
4
3
2

2

4
2
2
slavery
2
slave
38
1
4
3
2

2
ei
4
2
2
Slavonic
2
Slav
38
1
4
3
2
ghter
2

4
2
2
slaughterhouse
2
slaughter
38
1
4
3
2

2

4
2
2
slater
2
slate
38
1
4
3
2

2
e
4
1
2
slat
38
1
4
3
2

2

4
2
2
slapstick
2
slap
38
1
4
3
2
er
2

4
2
2
slanderous
2
slander
38
1
4
3
2

2
d
4
2
2
slant
2
slang
38
1
4
3
2
k
2

4
2
2
slacken
2
slack
38
1
4
3
2

2
aeiou
4
1
2
sly
38
1
4
3
2
a
2

4
3
2
skyway
2
skywave
2
skyward
38
1
4
3
2

2

4
2
2
skyline
2
skylight
38
1
4
3
2

2
i
4
1
2
skylark
38
1
4
3
2

2
lw
4
6
2
skyscrape
2
skyrocket
2
skyjack
2
skyhook
2
Skye
2
sky
38
1
4
3
2

2
l
4
1
2
skulk
38
1
4
3
2

2

4
3
2
skullduggery
2
skullcap
2
skull
38
1
4
3
2

2
l
4
1
2
skunk
38
1
4
3
2

2

4
2
2
skittle
2
skit
38
1
4
3
2

2

4
2
2
skirt
2
skirmish
38
1
4
3
2

2

4
3
2
Skippy
2
skipjack
2
skip
38
1
4
3
2

2

4
3
2
skinny
2
skindive
2
skin
38
1
4
3
2

2

4
2
2
skimpy
2
skimp
38
1
4
3
2

2
p
4
2
2
skimmer
2
skim
38
1
4
3
2
l
2

4
3
2
skillful
2
skillet
2
skill
38
1
4
3
2

2

4
2
2
skiddy
2
skid
38
1
4
3
2

2
dlmnprt
4
2
2
skiff
2
ski
38
1
4
3
2
ch
2

4
4
2
sketchy
2
sketchpad
2
sketchbook
2
sketch
38
1
4
3
2
et
2

4
2
2
skeleton
2
skeletal
38
1
4
3
2

2
lt
4
3
2
skew
2
skeptic
2
skeet
38
1
4
3
2
t
2
e
4
1
2
skat
38
1
4
3
2

2

4
2
2
skater
2
skate
38
1
4
3
2

2
aeiuy
4
1
2
Skopje
38
1
4
3
2

2
e
4
1
2
sizzle
38
1
4
3
2
en
2

4
2
2
sixteenth
2
sixteen
38
1
4
3
2

2
e
4
3
2
sixty
2
sixtieth
2
sixth
38
1
4
3
2

2
t
4
3
2
sixgun
2
sixfold
2
six
38
1
4
3
2

2
a
4
2
2
situs
2
situ
38
1
4
3
2

2
u
4
2
2
site
2
sit
38
1
4
3
2
ph
2

4
2
2
Sisyphus
2
Sisyphean
38
1
4
3
2

2

4
2
2
Sistine
2
sister
38
1
4
3
2

2
ty
4
3
2
siskin
2
sisal
2
sis
38
1
4
3
2

2

4
2
2
siren
2
sire
38
1
4
3
2

2
e
4
3
2
sirs
2
Sirius
2
sir
38
1
4
3
2
id
2

4
2
2
sinusoidal
2
sinusoid
38
1
4
3
2

2
o
4
1
2
sinus
38
1
4
3
2

2
s
4
1
2
sinuous
38
1
4
3
2

2

4
2
2
sinkhole
2
sink
38
1
4
3
2
st
2

4
2
2
sinistral
2
sinister
38
1
4
3
2

2

4
2
2
singleton
2
singlet
38
1
4
3
2
e
2
t
4
2
2
singlehanded
2
single
38
1
4
3
2

2

4
2
2
Singapore
2
singable
38
1
4
3
2

2
al
4
4
2
singular
2
singsong
2
singe
2
sing
38
1
4
3
2

2

4
2
2
sinewy
2
sinew
38
1
4
3
2

2
w
4
1
2
sine
38
1
4
3
2

2
r
4
1
2
since
38
1
4
3
2

2
e
4
1
2
Sinclair
38
1
4
3
2

2
cegiku
4
5
2
sinter
2
sinh
2
sinful
2
Sinai
2
sin
38
1
4
3
2
ane
2

4
2
2
simultaneous
2
simultaneity
38
1
4
3
2
l
2
t
4
2
2
simulcast
2
simulate
38
1
4
3
2
i
2

4
2
2
simplicity
2
simplicial
38
1
4
3
2

2
cf
4
1
2
simplistic
38
1
4
3
2

2

4
5
2
simplex
2
simpleton
2
simpleminded
2
simplectic
2
simple
38
1
4
3
2

2
ei
4
1
2
simply
38
1
4
3
2

2
l
4
2
2
Simpson
2
simper
38
1
4
3
2
n
2

4
2
2
Simonson
2
Simon
38
1
4
3
2

2

4
2
2
Simmons
2
simmer
38
1
4
3
2
l
2

4
3
2
similitude
2
simile
2
similar
38
1
4
3
2

2
imopu
4
2
2
Sims
2
sima
38
1
4
3
2
er
2

4
5
2
silvery
2
silverware
2
silversmith
2
Silverman
2
silver
38
1
4
3
2

2

4
4
2
silty
2
siltstone
2
siltation
2
silt
38
1
4
3
2

2

4
2
2
silly
2
sill
38
1
4
3
2

2

4
4
2
silky
2
silkworm
2
silken
2
silk
38
1
4
3
2
n
2

4
2
2
silicone
2
silicon
38
1
4
3
2

2

4
2
2
silicide
2
silicic
38
1
4
3
2

2

4
2
2
silicate
2
silica
38
1
4
3
2
c
2
aio
4
1
2
siliceous
38
1
4
3
2

2

4
3
2
Silas
2
silane
2
silage
38
1
4
3
2

2
aikltv
4
3
2
silo
2
silhouette
2
silent
38
1
4
3
2
r
2

4
2
2
Signora
2
Signor
38
1
4
3
2
f
2

4
2
2
signify
2
significant
38
1
4
3
2

2

4
2
2
signature
2
signal
38
1
4
3
2

2
aio
4
4
2
signpost
2
signet
2
signboard
2
sign
38
1
4
3
2

2

4
2
2
Sigmund
2
sigma
38
1
4
3
2

2
t
4
1
2
sigh
38
1
4
3
2
ee
2

4
3
2
sightseer
2
sightseeing
2
sightsee
38
1
4
3
2

2
s
4
1
2
sight
38
1
4
3
2

2
hmn
4
0
38
1
4
3
2

2

4
2
2
sienna
2
Siena
38
1
4
3
2

2
e
4
3
2
Siegmund
2
Sieglinda
2
Siegfried
38
1
4
3
2

2

4
2
2
Siegel
2
siege
38
1
4
3
2

2
gn
4
4
2
sieve
2
siesta
2
sierra
2
Siemens
38
1
4
3
2

2
blmrsw
4
4
2
sidetrack
2
sidecar
2
sidearm
2
side
38
1
4
3
2

2

4
2
2
sidewise
2
sidewinder
38
1
4
3
2

2
l
4
1
2
sideway
38
1
4
3
2

2

4
2
2
sidewall
2
sidewalk
38
1
4
3
2

2
ai
4
0
38
1
4
3
2
ep
2

4
2
2
sidestepping
2
sidestep
38
1
4
3
2

2
t
4
2
2
sideshow
2
sidesaddle
38
1
4
3
2

2

4
2
2
siderite
2
sidereal
38
1
4
3
2

2

4
2
2
sidemen
2
sideman
38
1
4
3
2

2

4
2
2
sideline
2
sidelight
38
1
4
3
2

2
i
4
1
2
sidelong
38
1
4
3
2

2

4
2
2
sideboard
2
sideband
38
1
4
3
2

2
e
4
2
2
Sidney
2
sidle
38
1
4
3
2
e
2

4
2
2
sicklewort
2
sickle
38
1
4
3
2

2
l
4
4
2
sickroom
2
sickish
2
sicken
2
sick
38
1
4
3
2
l
2

4
2
2
Sicily
2
Sicilian
38
1
4
3
2

2
ik
4
1
2
sic
38
1
4
3
2

2

4
2
2
sibling
2
Sibley
38
1
4
3
2

2
l
4
4
2
sibyl
2
sibilant
2
Siberia
2
sib
38
1
4
3
2

2
m
4
2
2
Sian
2
sial
38
1
4
3
2

2

4
2
2
Siamese
2
SIAM
38
1
4
3
2

2
abcdeglmnrstxz
4
5
2
siva
2
sip
2
Sioux
2
Sikorsky
2
sift
38
1
4
3
2

2

4
2
2
Shylock
2
shy
38
1
4
3
2
le
2

4
2
2
shuttlecock
2
shuttle
38
1
4
3
2

2

4
2
2
shutout
2
shutoff
38
1
4
3
2

2
ot
4
2
2
shutdown
2
shut
38
1
4
3
2

2

4
2
2
shunt
2
shun
38
1
4
3
2
fle
2

4
2
2
shuffleboard
2
shuffle
38
1
4
3
2
der
2

4
2
2
shuddery
2
shudder
38
1
4
3
2

2
dfnt
4
3
2
Shulman
2
shuck
2
Shu
38
1
4
3
2
k
2

4
2
2
shrunken
2
shrunk
38
1
4
3
2

2

4
2
2
shrugging
2
shrug
38
1
4
3
2

2

4
2
2
shrubbery
2
shrub
38
1
4
3
2

2
bgn
4
0
38
1
4
3
2

2

4
2
2
shrove
2
shroud
38
1
4
3
2
e
2

4
2
2
shrivel
2
shrive
38
1
4
3
2

2

4
2
2
shrinkage
2
shrink
38
1
4
3
2

2
k
4
1
2
shrine
38
1
4
3
2
l
2

4
2
2
shrilly
2
shrill
38
1
4
3
2

2
lnv
4
4
2
shrimp
2
shrike
2
shrift
2
shriek
38
1
4
3
2

2

4
3
2
shrewish
2
shrewd
2
shrew
38
1
4
3
2

2
w
4
2
2
Shreveport
2
shred
38
1
4
3
2

2

4
2
2
shrapnel
2
shrank
38
1
4
3
2

2
aeiou
4
0
38
1
4
3
2

2

4
2
2
showplace
2
showpiece
38
1
4
3
2

2

4
2
2
showmen
2
showman
38
1
4
3
2

2
mp
4
7
2
showy
2
showroom
2
shown
2
showdown
2
showcase
2
showboat
2
show
38
1
4
3
2
e
2

4
2
2
shovel
2
shove
38
1
4
3
2
d
2

4
3
2
shouldn't
2
shoulder
2
should
38
1
4
3
2

2
l
4
1
2
shout
38
1
4
3
2

2

4
3
2
shotgun
2
shotbush
2
shot
38
1
4
3
2

2

4
2
2
shortstop
2
shortsighted
38
1
4
3
2

2

4
2
2
shortcut
2
shortcoming
38
1
4
3
2

2
cse
4
5
2
shortish
2
shorthand
2
shortfall
2
shortage
2
short
38
1
4
3
2

2

4
2
2
shoreline
2
shore
38
1
4
3
2

2
et
4
0
38
1
4
3
2

2

4
3
2
shopworn
2
shopkeep
2
shop
38
1
4
3
2

2

4
4
2
shoot
2
shook
2
shoofly
2
shoo
38
1
4
3
2

2

4
5
2
shoestring
2
shoemake
2
shoelace
2
shoehorn
2
shoe
38
1
4
3
2

2

4
2
2
shoddy
2
shod
38
1
4
3
2
k
2

4
2
2
Shockley
2
shock
38
1
4
3
2

2
cdeoprtuvw
4
3
2
shone
2
shoji
2
shoal
38
1
4
3
2
r
2

4
2
2
shivery
2
shiver
38
1
4
3
2

2
e
4
1
2
shiv
38
1
4
3
2

2

4
2
2
shirtmake
2
shirt
38
1
4
3
2

2
t
4
3
2
Shirley
2
shirk
2
shire
38
1
4
3
2

2

4
2
2
shipmate
2
shipman
38
1
4
3
2

2
a
4
1
2
shipmen
38
1
4
3
2

2

4
2
2
Shipley
2
shiplap
38
1
4
3
2
ild
2

4
2
2
shipbuilding
2
shipbuild
38
1
4
3
2

2
u
4
1
2
shipboard
38
1
4
3
2

2
blm
4
4
2
shipyard
2
shipwreck
2
shipshape
2
ship
38
1
4
3
2

2

4
6
2
shiny
2
Shinto
2
shingle
2
shine
2
shinbone
2
shin
38
1
4
3
2

2

4
2
2
shimmy
2
shim
38
1
4
3
2

2

4
2
2
Shiloh
2
shill
38
1
4
3
2
t
2

4
2
2
shifty
2
shift
38
1
4
3
2

2
flmnprv
4
4
2
shitepoke
2
shish
2
shield
2
shibboleth
38
1
4
3
2

2

4
2
2
Sherwood
2
Sherwin
38
1
4
3
2

2

4
2
2
sherry
2
Sherrill
38
1
4
3
2

2

4
2
2
sheriff
2
Sheridan
38
1
4
3
2

2
irw
4
4
2
Sherman
2
Sherlock
2
sherbet
2
Sheraton
38
1
4
3
2

2

4
3
2
Sheppard
2
shepherd
2
Shepard
38
1
4
3
2
an
2

4
2
2
shenanigan
2
Shenandoah
38
1
4
3
2

2

4
2
2
Shelton
2
shelter
38
1
4
3
2

2

4
2
2
Shelley
2
shell
38
1
4
3
2

2

4
2
2
she'll
2
she'd
38
1
4
3
2

2
lt
4
4
2
shelve
2
shelf
2
Sheldon
2
Shelby
38
1
4
3
2

2

4
2
2
Sheila
2
sheik
38
1
4
3
2

2

4
2
2
sheepskin
2
sheep
38
1
4
3
2

2
p
4
4
2
sheet
2
sheer
2
sheen
2
Sheehan
38
1
4
3
2

2

4
2
2
Shedir
2
shed
38
1
4
3
2
h
2

4
2
2
sheathe
2
sheath
38
1
4
3
2

2

4
2
2
Shearer
2
shear
38
1
4
3
2

2
rt
4
3
2
sheave
2
sheaf
2
Shea
38
1
4
3
2

2
adeil'npr
4
2
2
Sheffield
2
she
38
1
4
3
2

2
cdfgklmnprtvw
4
4
2
shay
2
Shasta
2
shah
2
shabby
38
1
4
3
2

2

4
3
2
Shawnee
2
shawl
2
shaw
38
1
4
3
2
e
2

4
2
2
shaven
2
shave
38
1
4
3
2
r
2

4
2
2
shatterproof
2
shatter
38
1
4
3
2
t
2
e
4
1
2
Shattuck
38
1
4
3
2

2

4
2
2
sharpen
2
Sharpe
38
1
4
3
2

2
e
4
2
2
sharpshoot
2
sharp
38
1
4
3
2

2

4
4
2
shares
2
shareholder
2
sharecrop
2
share
38
1
4
3
2

2
ep
4
4
2
Sharon
2
shark
2
Shari
2
shard
38
1
4
3
2

2

4
2
2
Shapiro
2
shape
38
1
4
3
2

2

4
2
2
shanty
2
Shantung
38
1
4
3
2

2
t
4
4
2
shan't
2
Shannon
2
shank
2
Shanghai
38
1
4
3
2

2

4
2
2
shameful
2
shameface
38
1
4
3
2

2
f
4
1
2
shame
38
1
4
3
2

2
e
4
4
2
shamrock
2
shampoo
2
shamble
2
sham
38
1
4
3
2

2

4
2
2
shallow
2
shallot
38
1
4
3
2

2
o
4
1
2
shall
38
1
4
3
2

2
l
4
2
2
shalom
2
shale
38
1
4
3
2

2
s
4
4
2
shaken
2
shakedown
2
shakeable
2
shake
38
1
4
3
2

2

4
2
2
Shakespearean
2
Shakespeare
38
1
4
3
2
pear
2
e
4
1
2
Shakespearian
38
1
4
3
2

2
e
4
2
2
shaky
2
shako
38
1
4
3
2

2

4
2
2
shaggy
2
shagging
38
1
4
3
2

2
g
4
2
2
shagbark
2
shag
38
1
4
3
2

2

4
3
2
shaft
2
Shaffer
2
Shafer
38
1
4
3
2
w
2

4
2
2
shadowy
2
shadow
38
1
4
3
2

2
o
4
5
2
shady
2
shadflower
2
shade
2
shadbush
2
shad
38
1
4
3
2
k
2

4
2
2
shackle
2
shack
38
1
4
3
2

2
aeioruy
4
1
2
Shmuel
38
1
4
3
2
ple
2

4
2
2
sextuplet
2
sextuple
38
1
4
3
2

2
u
4
4
2
sexton
2
sextillion
2
sextet
2
Sextans
38
1
4
3
2

2
t
4
3
2
sexy
2
sexual
2
sex
38
1
4
3
2

2

4
2
2
Seward
2
sewage
38
1
4
3
2

2
a
4
3
2
sewn
2
sewerage
2
sew
38
1
4
3
2

2
nr
4
0
38
1
4
3
2
l
2

4
3
2
severalty
2
severalfold
2
several
38
1
4
3
2

2
ae
4
2
2
Severn
2
sever
38
1
4
3
2

2
t
4
2
2
sevenfold
2
seven
38
1
4
3
2
en
2

4
2
2
seventeenth
2
seventeen
38
1
4
3
2

2
e
4
3
2
seventy
2
seventieth
2
seventh
38
1
4
3
2

2
e
4
1
2
Seville
38
1
4
3
2

2
t
4
6
2
setup
2
setscrew
2
Seton
2
Seth
2
setback
2
set
38
1
4
3
2

2

4
2
2
session
2
sesame
38
1
4
3
2

2

4
2
2
servomechanism
2
servo
38
1
4
3
2
e
2
m
4
3
2
serviceberry
2
serviceable
2
service
38
1
4
3
2

2

4
2
2
servicemen
2
serviceman
38
1
4
3
2

2
c
4
3
2
servitor
2
servile
2
serviette
38
1
4
3
2

2
ioe
4
1
2
servant
38
1
4
3
2

2

4
2
2
serpentine
2
serpent
38
1
4
3
2
en
2
t
4
1
2
Serpens
38
1
4
3
2

2

4
2
2
seriatim
2
serial
38
1
4
3
2

2
a
4
4
2
serious
2
serine
2
serif
2
series
38
1
4
3
2
e
2

4
3
2
Sergei
2
sergeant
2
serge
38
1
4
3
2
ipit
2

4
2
2
serendipity
2
serendipitous
38
1
4
3
2
n
2
d
4
2
2
serene
2
serenade
38
1
4
3
2

2
p
4
2
2
seraglio
2
sera
38
1
4
3
2

2

4
2
2
seraphim
2
serape
38
1
4
3
2

2
aegipv
4
5
2
serum
2
serology
2
sermon
2
serf
2
Serbia
38
1
4
3
2

2

4
2
2
sequitur
2
sequin
38
1
4
3
2

2
ns
4
1
2
sequel
38
1
4
3
2
t
2

4
2
2
sequestration
2
sequester
38
1
4
3
2
t
2

4
2
2
sequential
2
sequent
38
1
4
3
2

2
ei
4
1
2
Sequoia
38
1
4
3
2

2
u
4
1
2
seq
38
1
4
3
2

2

4
2
2
sepulchral
2
sepuchral
38
1
4
3
2

2

4
2
2
septum
2
septuagenarian
38
1
4
3
2

2

4
2
2
septillion
2
septic
38
1
4
3
2

2

4
2
2
septennial
2
September
38
1
4
3
2

2

4
2
2
septate
2
septa
38
1
4
3
2

2
aeiu
4
1
2
sept
38
1
4
3
2

2
r
4
1
2
sepal
38
1
4
3
2
a
2

4
2
2
separate
2
separable
38
1
4
3
2

2
atu
4
2
2
Sepoy
2
sepia
38
1
4
3
2

2

4
3
2
sentinel
2
sentiment
2
sentient
38
1
4
3
2
n
2

4
2
2
sentential
2
sentence
38
1
4
3
2

2
ei
4
2
2
sentry
2
sent
38
1
4
3
2

2

4
2
2
sensuous
2
sensual
38
1
4
3
2
r
2

4
2
2
sensory
2
sensor
38
1
4
3
2

2

4
2
2
sensitive
2
sensible
38
1
4
3
2

2
iou
4
2
2
sense
2
sensate
38
1
4
3
2
r
2

4
3
2
senorita
2
Senora
2
senor
38
1
4
3
2

2

4
2
2
senior
2
senile
38
1
4
3
2

2

4
2
2
Senegal
2
Seneca
38
1
4
3
2
t
2

4
2
2
senatorial
2
senate
38
1
4
3
2

2
aeiostd
4
1
2
sen
38
1
4
3
2

2

4
2
2
Semitic
2
Semite
38
1
4
3
2

2
r
4
1
2
seminal
38
1
4
3
2

2

4
3
2
seminary
2
seminarian
2
seminar
38
1
4
3
2

2
a
4
1
2
Seminole
38
1
4
3
2

2
nt
4
2
2
Semiramis
2
semi
38
1
4
3
2

2

4
2
2
semaphore
2
semantic
38
1
4
3
2

2
ai
4
3
2
semper
2
semester
2
semblance
38
1
4
3
2

2

4
4
2
sells
2
selling
2
sellout
2
sell
38
1
4
3
2

2

4
4
2
Selfridge
2
selfish
2
selfadjoint
2
self
38
1
4
3
2

2

4
2
2
selenium
2
selenite
38
1
4
3
2

2

4
2
2
selenate
2
Selena
38
1
4
3
2

2
ai
4
0
38
1
4
3
2
t
2
m
4
3
2
Selectric
2
selector
2
select
38
1
4
3
2

2

4
2
2
selectmen
2
selectman
38
1
4
3
2

2
cn
4
0
38
1
4
3
2

2
efl
4
6
2
Selwyn
2
selves
2
seltzer
2
Selma
2
Selkirk
2
seldom
38
1
4
3
2

2

4
2
2
seizure
2
seize
38
1
4
3
2
raph
2

4
2
2
seismography
2
seismograph
38
1
4
3
2

2
g
4
1
2
seismology
38
1
4
3
2
m
2
o
4
1
2
seismic
38
1
4
3
2

2
sz
4
1
2
Seidel
38
1
4
3
2
ega
2

4
2
2
segregate
2
segregant
38
1
4
3
2
ent
2

4
2
2
segmentation
2
segment
38
1
4
3
2

2
mr
4
2
2
Segundo
2
Segovia
38
1
4
3
2

2

4
2
2
seepage
2
seep
38
1
4
3
2

2

4
4
2
seedy
2
seedling
2
seedbed
2
seed
38
1
4
3
2

2
dpm
4
7
2
seethe
2
seersucker
2
seen
2
seek
2
seeing
2
seeable
2
see
38
1
4
3
2

2
t
4
1
2
seduce
38
1
4
3
2
i
2

4
2
2
seductive
2
seduction
38
1
4
3
2

2
c
4
1
2
sedulous
38
1
4
3
2
io
2

4
2
2
seditious
2
sedition
38
1
4
3
2
ent
2
a
4
1
2
sediment
38
1
4
3
2

2

4
2
2
sedimentation
2
sedimentary
38
1
4
3
2

2
mt
4
0
38
1
4
3
2

2

4
2
2
seder
2
sedentary
38
1
4
3
2

2

4
2
2
sedate
2
sedan
38
1
4
3
2

2
aeiu
4
1
2
sedge
38
1
4
3
2

2
r
4
1
2
secular
38
1
4
3
2

2

4
4
2
sector
2
section
2
sectarian
2
sect
38
1
4
3
2

2

4
2
2
secretive
2
secretion
38
1
4
3
2
a
2

4
2
2
secretariat
2
secretarial
38
1
4
3
2
r
2
i
4
1
2
secretary
38
1
4
3
2

2
ai
4
2
2
secrete
2
secret
38
1
4
3
2
e
2
t
4
1
2
secrecy
38
1
4
3
2
nd
2

4
4
2
seconds
2
secondhand
2
secondary
2
second
38
1
4
3
2
u
2

4
2
2
seclusion
2
seclude
38
1
4
3
2

2

4
2
2
secession
2
secede
38
1
4
3
2

2
elortu
4
2
2
secant
2
sec
38
1
4
3
2

2

4
2
2
seaweed
2
seaward
38
1
4
3
2

2

4
3
2
Seattle
2
seater
2
seat
38
1
4
3
2
n
2

4
2
2
seasonal
2
season
38
1
4
3
2

2
o
4
2
2
seaside
2
seashore
38
1
4
3
2
h
2

4
3
2
searching
2
searchlight
2
search
38
1
4
3
2

2
c
4
1
2
sear
38
1
4
3
2

2

4
2
2
seance
2
Sean
38
1
4
3
2

2

4
5
2
seamy
2
seamstress
2
seamen
2
seaman
2
seam
38
1
4
3
2

2

4
2
2
sealant
2
seal
38
1
4
3
2

2

4
2
2
seagull
2
Seagram
38
1
4
3
2

2

4
2
2
seafood
2
seafare
38
1
4
3
2

2
fglmnrstw
4
6
2
seaquake
2
seaport
2
seahorse
2
seacoast
2
seaboard
2
sea
38
1
4
3
2

2
acdegilmnpqrstvwx
4
4
2
Seymour
2
Seoul
2
Sebastian
2
SE
38
1
4
3
2
h
2

4
2
2
Scythia
2
scythe
38
1
4
3
2

2
t
4
1
2
Scylla
38
1
4
3
2

2

4
2
2
scutum
2
scuttle
38
1
4
3
2

2

4
2
2
scurry
2
scurrilous
38
1
4
3
2

2
r
4
1
2
scurvy
38
1
4
3
2
r
2

4
2
2
sculpture
2
sculptural
38
1
4
3
2

2
u
4
2
2
sculptor
2
sculpt
38
1
4
3
2

2
t
4
1
2
sculpin
38
1
4
3
2

2
p
4
1
2
scull
38
1
4
3
2
f
2

4
2
2
scuffle
2
scuff
38
1
4
3
2

2
flrt
4
3
2
scum
2
scud
2
scuba
38
1
4
3
2

2

4
2
2
scrutiny
2
scrutable
38
1
4
3
2
lo
2

4
2
2
scrupulous
2
scrupulosity
38
1
4
3
2

2
u
4
1
2
scruple
38
1
4
3
2

2
pt
4
3
2
scruffy
2
scrumptious
2
scrub
38
1
4
3
2

2
l
4
3
2
scrounge
2
scrotum
2
scrooge
38
1
4
3
2
r
2

4
2
2
scripture
2
scriptural
38
1
4
3
2

2
u
4
2
2
scription
2
script
38
1
4
3
2

2
t
4
1
2
Scripps
38
1
4
3
2

2

4
2
2
scrimmage
2
scrim
38
1
4
3
2

2

4
3
2
Scribners
2
scribe
2
scribble
38
1
4
3
2

2
bmp
4
1
2
scriven
38
1
4
3
2

2

4
2
2
screwbean
2
screwball
38
1
4
3
2

2
b
4
3
2
screwworm
2
screwdriver
2
screw
38
1
4
3
2

2

4
2
2
screenplay
2
screen
38
1
4
3
2
h
2

4
2
2
screechy
2
screech
38
1
4
3
2

2
cn
4
1
2
screed
38
1
4
3
2

2
ew
4
1
2
scream
38
1
4
3
2

2
mptw
4
3
2
Scranton
2
scraggly
2
scrabble
38
1
4
3
2

2

4
2
2
scrawny
2
scrawl
38
1
4
3
2
ch
2

4
2
2
scratchy
2
scratch
38
1
4
3
2

2

4
3
2
scrape
2
scrapbook
2
scrap
38
1
4
3
2

2

4
2
2
scramble
2
scram
38
1
4
3
2

2
aeiou
4
0
38
1
4
3
2

2

4
2
2
scourge
2
scour
38
1
4
3
2

2
r
4
2
2
scout
2
scoundrel
38
1
4
3
2

2

4
4
2
Scotty
2
Scottsdale
2
Scottish
2
Scott
38
1
4
3
2
m
2

4
2
2
Scotsmen
2
Scotsman
38
1
4
3
2

2
st
4
4
2
Scotland
2
Scotia
2
scotch
2
Scot
38
1
4
3
2
io
2

4
2
2
scorpion
2
Scorpio
38
1
4
3
2

2

4
2
2
scornful
2
scorn
38
1
4
3
2

2

4
3
2
scorecard
2
scoreboard
2
score
38
1
4
3
2

2
enp
4
2
2
scoria
2
scorch
38
1
4
3
2

2

4
3
2
scops
2
scopic
2
scope
38
1
4
3
2

2

4
2
2
scoot
2
scoop
38
1
4
3
2

2
oprtu
4
3
2
scowl
2
scold
2
scoff
38
1
4
3
2
ero
2

4
2
2
sclerotic
2
sclerosis
38
1
4
3
2
i
2

4
2
2
scientist
2
scientific
38
1
4
3
2
n
2
t
4
1
2
science
38
1
4
3
2

2
e
4
6
2
scissor
2
scion
2
scintillate
2
scimitar
2
sciatica
2
Sci
38
1
4
3
2

2

4
2
2
Schwartz
2
Schwab
38
1
4
3
2

2
a
4
1
2
Schweitzer
38
1
4
3
2
l
2

4
2
2
Schuylkill
2
Schuyler
38
1
4
3
2
a
2

4
2
2
Schumann
2
Schumacher
38
1
4
3
2

2

4
2
2
Schulz
2
Schultz
38
1
4
3
2

2
lmy
4
2
2
Schuster
2
Schubert
38
1
4
3
2
oed
2

4
2
2
Schroedinger
2
Schroeder
38
1
4
3
2

2
bgm
4
5
2
schoolwork
2
schoolteacher
2
schoolroom
2
schoolhouse
2
school
38
1
4
3
2
a
2

4
3
2
schoolmate
2
schoolmaster
2
schoolmarm
38
1
4
3
2
irl
2

4
2
2
schoolgirlish
2
schoolgirl
38
1
4
3
2
o
2

4
2
2
schoolboy
2
schoolbook
38
1
4
3
2

2
l
4
1
2
schooner
38
1
4
3
2
a
2

4
2
2
scholastic
2
scholar
38
1
4
3
2

2
lo
4
3
2
Schottky
2
Schofield
2
Schoenberg
38
1
4
3
2

2

4
2
2
schnapps
2
Schnabel
38
1
4
3
2

2
a
4
1
2
Schneider
38
1
4
3
2
i
2

4
2
2
Schmitt
2
Schmidt
38
1
4
3
2

2

4
2
2
Schlitz
2
schlieren
38
1
4
3
2

2
i
4
2
2
Schloss
2
Schlesinger
38
1
4
3
2
hreni
2

4
2
2
schizophrenic
2
schizophrenia
38
1
4
3
2
o
2
p
4
2
2
schizomycetes
2
schizoid
38
1
4
3
2

2

4
2
2
schist
2
schism
38
1
4
3
2

2
sz
4
1
2
Schiller
38
1
4
3
2

2
t
4
1
2
schema
38
1
4
3
2

2

4
2
2
schematic
2
schemata
38
1
4
3
2

2
a
4
1
2
scheme
38
1
4
3
2

2
m
4
4
2
scherzo
2
Schenectady
2
schelling
2
schedule
38
1
4
3
2

2

4
3
2
Schantz
2
Schafer
2
Schaefer
38
1
4
3
2

2
aeilmnoruw
4
0
38
1
4
3
2

2
e
4
3
2
scent
2
scenic
2
scenario
38
1
4
3
2

2

4
2
2
scenery
2
scene
38
1
4
3
2

2
n
4
1
2
sceptic
38
1
4
3
2
er
2

4
2
2
scattergun
2
scatterbrain
38
1
4
3
2

2
t
4
2
2
scathe
2
scat
38
1
4
3
2

2

4
2
2
scarlet
2
Scarlatti
38
1
4
3
2

2

4
2
2
scarface
2
scarf
38
1
4
3
2

2

4
2
2
scarecrow
2
scare
38
1
4
3
2

2
efl
4
7
2
scary
2
scarves
2
Scarsdale
2
scarify
2
scarce
2
Scarborough
2
scar
38
1
4
3
2
la
2

4
2
2
scapular
2
scapula
38
1
4
3
2

2
u
4
1
2
scapegoat
38
1
4
3
2

2

4
2
2
scanty
2
scant
38
1
4
3
2

2

4
2
2
scandium
2
Scandinavia
38
1
4
3
2
l
2

4
2
2
scandalous
2
scandal
38
1
4
3
2

2
ai
4
0
38
1
4
3
2

2
dt
4
1
2
scan
38
1
4
3
2

2

4
2
2
scamp
2
scam
38
1
4
3
2

2

4
2
2
scalar
2
Scala
38
1
4
3
2

2
a
4
4
2
scalp
2
scallop
2
scale
2
scald
38
1
4
3
2

2

4
4
2
scabrous
2
scabious
2
scabbard
2
scab
38
1
4
3
2

2
blmnprt
4
3
2
scavenge
2
scaup
2
scaffold
38
1
4
3
2

2
aehiloruy
4
2
2
SCM
2
SC
38
1
4
3
2

2

4
2
2
Saxony
2
Saxon
38
1
4
3
2

2
n
4
1
2
saxophone
38
1
4
3
2

2
o
4
2
2
saxifrage
2
sax
38
1
4
3
2

2

4
2
2
sawtooth
2
sawtimber
38
1
4
3
2

2

4
2
2
sawfly
2
sawfish
38
1
4
3
2

2
ft
4
5
2
sawyer
2
sawmill
2
sawdust
2
sawbelly
2
saw
38
1
4
3
2

2

4
2
2
Savoyard
2
savoy
38
1
4
3
2

2
y
4
1
2
Savonarola
38
1
4
3
2

2
gn
4
0
38
1
4
3
2

2

4
2
2
savant
2
Savannah
38
1
4
3
2
e
2

4
2
2
savagery
2
savage
38
1
4
3
2

2
aoi
4
2
2
savvy
2
save
38
1
4
3
2
e
2

4
2
2
sauterne
2
saute
38
1
4
3
2

2

4
2
2
Sault
2
Saul
38
1
4
3
2

2

4
2
2
Saudi
2
Saud
38
1
4
3
2

2
e
4
1
2
saucy
38
1
4
3
2

2

4
2
2
saucepan
2
sauce
38
1
4
3
2

2
cdlt
4
3
2
sausage
2
Saunders
2
sauerkraut
38
1
4
3
2

2

4
3
2
saturnine
2
Saturnalia
2
Saturn
38
1
4
3
2

2
t
4
1
2
saturable
38
1
4
3
2
e
2

4
2
2
saturater
2
saturate
38
1
4
3
2
r
2
an
4
1
2
Saturday
38
1
4
3
2
ct
2

4
2
2
satisfactory
2
satisfaction
38
1
4
3
2
f
2
ay
4
1
2
satisfied
38
1
4
3
2

2

4
2
2
satiric
2
satire
38
1
4
3
2

2

4
2
2
satiate
2
satiable
38
1
4
3
2

2
ars
4
2
2
satin
2
satiety
38
1
4
3
2
n
2

4
2
2
satanic
2
satan
38
1
4
3
2

2
aiu
4
3
2
satyr
2
satellite
2
sat
38
1
4
3
2
at
2

4
2
2
Saskatoon
2
Saskatchewan
38
1
4
3
2

2

4
2
2
sashay
2
sash
38
1
4
3
2

2
hk
4
1
2
sassafras
38
1
4
3
2

2

4
2
2
sarsparilla
2
sarsaparilla
38
1
4
3
2

2

4
2
2
sardonic
2
sardine
38
1
4
3
2

2

4
2
2
sarcoma
2
sarcophagus
38
1
4
3
2
s
2

4
2
2
sarcastic
2
sarcasm
38
1
4
3
2

2
ao
4
0
38
1
4
3
2

2

4
6
2
Saratoga
2
Sarasota
2
Saran
2
Sarah
2
Saracen
2
Sara
38
1
4
3
2

2
acds
4
2
2
sari
2
Sargent
38
1
4
3
2

2

4
2
2
sappy
2
sapphire
38
1
4
3
2
en
2

4
2
2
sapient
2
sapiens
38
1
4
3
2

2
ip
4
4
2
sapsucker
2
saponify
2
sapling
2
sap
38
1
4
3
2

2

4
2
2
Santayana
2
Santa
38
1
4
3
2

2
a
4
2
2
Santo
2
Santiago
38
1
4
3
2

2

4
2
2
sanitary
2
sanitarium
38
1
4
3
2
a
2
r
4
1
2
sanitate
38
1
4
3
2

2
t
4
1
2
sanicle
38
1
4
3
2

2

4
2
2
sanguineous
2
sanguine
38
1
4
3
2
in
2
e
4
1
2
sanguinary
38
1
4
3
2

2
u
4
2
2
sangaree
2
sang
38
1
4
3
2

2

4
2
2
sandpiper
2
sandpile
38
1
4
3
2

2
i
4
1
2
sandpaper
38
1
4
3
2
r
2

4
2
2
Sanderson
2
sanderling
38
1
4
3
2

2

4
3
2
Sandburg
2
sandblast
2
sandbag
38
1
4
3
2
l
2

4
2
2
sandalwood
2
sandal
38
1
4
3
2

2
abepw
4
8
2
sandy
2
Sandusky
2
sandstone
2
Sandra
2
sandman
2
Sandia
2
sandhill
2
sand
38
1
4
3
2

2

4
4
2
sanctity
2
sanction
2
sanctimonious
2
sanctify
38
1
4
3
2

2
i
4
1
2
sanctuary
38
1
4
3
2

2

4
2
2
Sancho
2
Sanchez
38
1
4
3
2

2
ht
4
0
38
1
4
3
2
ori
2

4
2
2
sanatorium
2
sanatoria
38
1
4
3
2

2
t
4
1
2
Sana
38
1
4
3
2

2
acdgit
4
7
2
sans
2
sank
2
Sanhedrin
2
Sanford
2
sane
2
Sanborn
2
San
38
1
4
3
2
el
2

4
2
2
Samuelson
2
Samuel
38
1
4
3
2

2

4
2
2
Sampson
2
sample
38
1
4
3
2

2

4
2
2
samovar
2
Samoa
38
1
4
3
2

2
opu
4
6
2
Samson
2
Sammy
2
same
2
samba
2
samarium
2
Sam
38
1
4
3
2

2
gt
4
1
2
Salvador
38
1
4
3
2

2

4
2
2
Salvatore
2
salvation
38
1
4
3
2
e
2

4
2
2
salvageable
2
salvage
38
1
4
3
2

2
a
4
2
2
salvo
2
salve
38
1
4
3
2

2

4
2
2
salutation
2
salutary
38
1
4
3
2

2
a
4
1
2
salute
38
1
4
3
2

2
t
4
1
2
salubrious
38
1
4
3
2

2

4
4
2
salty
2
saltwater
2
saltbush
2
salt
38
1
4
3
2
n
2

4
2
2
saloonkeep
2
saloon
38
1
4
3
2

2
o
4
1
2
salon
38
1
4
3
2
on
2

4
3
2
salmonella
2
salmonberry
2
salmon
38
1
4
3
2

2

4
3
2
sally
2
sallow
2
Salle
38
1
4
3
2
a
2

4
3
2
salivate
2
salivary
2
saliva
38
1
4
3
2

2

4
2
2
Salish
2
Salisbury
38
1
4
3
2

2

4
2
2
saline
2
Salina
38
1
4
3
2

2
nsv
4
1
2
salient
38
1
4
3
2

2

4
2
2
salesmen
2
salesman
38
1
4
3
2

2
m
4
5
2
salesperson
2
saleslady
2
Salesian
2
salesgirl
2
sales
38
1
4
3
2

2
s
4
3
2
Salerno
2
Salem
2
sale
38
1
4
3
2

2

4
2
2
salami
2
salamander
38
1
4
3
2

2
m
4
4
2
salary
2
salad
2
salacious
2
Salaam
38
1
4
3
2

2
aeilmotuv
4
3
2
salsify
2
Salk
2
Sal
38
1
4
3
2

2

4
4
2
sailor
2
sailfish
2
sailboat
2
sail
38
1
4
3
2

2
l
4
3
2
saint
2
Saigon
2
said
38
1
4
3
2
ta
2

4
2
2
Sagittarius
2
sagittal
38
1
4
3
2

2
t
4
1
2
Saginaw
38
1
4
3
2

2

4
2
2
sagebrush
2
sage
38
1
4
3
2
i
2

4
2
2
sagacity
2
sagacious
38
1
4
3
2

2
c
4
1
2
saga
38
1
4
3
2

2
aei
4
4
2
saguaro
2
sago
2
sagging
2
sag
38
1
4
3
2

2

4
5
2
safely
2
safety
2
safekeeping
2
safeguard
2
safe
38
1
4
3
2

2
e
4
2
2
saffron
2
safari
38
1
4
3
2

2

4
2
2
sadist
2
sadism
38
1
4
3
2

2
s
4
1
2
Sadie
38
1
4
3
2
e
2

4
2
2
saddlebag
2
saddle
38
1
4
3
2

2
l
4
1
2
sadden
38
1
4
3
2

2
di
4
2
2
Sadler
2
sad
38
1
4
3
2
eg
2

4
2
2
sacrilegious
2
sacrilege
38
1
4
3
2
ic
2

4
2
2
sacrificial
2
sacrifice
38
1
4
3
2

2
fl
4
0
38
1
4
3
2

2
m
4
1
2
sacral
38
1
4
3
2
ent
2

4
2
2
Sacramento
2
sacrament
38
1
4
3
2

2
ai
4
2
2
sacrosanct
2
sacred
38
1
4
3
2

2

4
2
2
Sachs
2
sachem
38
1
4
3
2

2
hr
4
3
2
sack
2
saccharine
2
sac
38
1
4
3
2
n
2

4
2
2
Sabine
2
Sabina
38
1
4
3
2
at
2

4
2
2
sabbatical
2
sabbath
38
1
4
3
2

2
bi
4
3
2
sabra
2
sabotage
2
sable
38
1
4
3
2

2
bcdfgilmnprstuvwxy
4
4
2
Sao
2
sake
2
Sahara
2
sa
38
1
4
3
2

2
acehIklmnopqStuwy
4
7
2
Szilard
2
svelte
2
s's
2
Sri
2
sforzando
2
SD
2
s
38
1
4
3
2

2

4
2
2
Ryder
2
Rydberg
38
1
4
3
2

2
d
4
2
2
rye
2
Ryan
38
1
4
3
2

2

4
2
2
Rutledge
2
Rutland
38
1
4
3
2

2

4
2
2
Rutherford
2
ruthenium
38
1
4
3
2

2
e
4
2
2
ruthless
2
Ruth
38
1
4
3
2

2
hl
4
5
2
rutty
2
rutile
2
Rutgers
2
rutabaga
2
rut
38
1
4
3
2

2

4
5
2
rusty
2
rustproof
2
rustle
2
rustic
2
rust
38
1
4
3
2

2

4
2
2
russet
2
Russell
38
1
4
3
2

2
e
4
4
2
russula
2
Russo
2
Russia
2
Russ
38
1
4
3
2

2

4
2
2
Rushmore
2
rush
38
1
4
3
2

2
hst
4
2
2
rusk
2
ruse
38
1
4
3
2

2

4
2
2
rupture
2
rupee
38
1
4
3
2

2

4
2
2
runty
2
runt
38
1
4
3
2

2

4
3
2
running
2
Runnymede
2
runneth
38
1
4
3
2

2

4
2
2
Runge
2
rung
38
1
4
3
2

2

4
2
2
runaway
2
runabout
38
1
4
3
2

2
agnt
4
7
2
Runyon
2
runway
2
runoff
2
runic
2
rune
2
rundown
2
run
38
1
4
3
2

2

4
3
2
rumpus
2
rumple
2
rump
38
1
4
3
2

2

4
2
2
rummy
2
rummage
38
1
4
3
2

2
mp
4
6
2
ruminant
2
Rumford
2
rumen
2
rumble
2
Rumania
2
rum
38
1
4
3
2
n
2

4
3
2
ruinous
2
ruination
2
ruin
38
1
4
3
2

2

4
2
2
ruffle
2
ruffian
38
1
4
3
2

2
f
4
2
2
Rufus
2
rufous
38
1
4
3
2

2

4
2
2
rueful
2
rue
38
1
4
3
2

2

4
2
2
Rudyard
2
Rudy
38
1
4
3
2
l
2

4
2
2
Rudolph
2
Rudolf
38
1
4
3
2
ment
2

4
2
2
rudimentary
2
rudiment
38
1
4
3
2

2

4
2
2
ruddy
2
rudder
38
1
4
3
2

2
dioy
4
1
2
rude
38
1
4
3
2

2

4
3
2
Rubin
2
rubidium
2
rubicund
38
1
4
3
2

2

4
2
2
Ruben
2
Rube
38
1
4
3
2

2

4
3
2
rubble
2
rubbish
2
rubbery
38
1
4
3
2

2
bei
4
4
2
ruby
2
rubric
2
rubdown
2
rub
38
1
4
3
2

2
bdefimnpstl
4
4
2
rural
2
rug
2
ruckus
2
Ruanda
38
1
4
3
2
l
2

4
2
2
royalty
2
royal
38
1
4
3
2

2
a
4
2
2
Royce
2
Roy
38
1
4
3
2

2

4
2
2
Rowley
2
Rowland
38
1
4
3
2

2

4
2
2
Rowena
2
Rowe
38
1
4
3
2

2
el
4
3
2
rowdy
2
rowboat
2
row
38
1
4
3
2

2

4
3
2
routine
2
route
2
rout
38
1
4
3
2

2

4
3
2
roustabout
2
Rousseau
2
rouse
38
1
4
3
2

2

4
2
2
roundhouse
2
roundhead
38
1
4
3
2
d
2
h
4
6
2
roundworm
2
roundup
2
roundtable
2
roundoff
2
roundabout
2
round
38
1
4
3
2

2
h
4
1
2
rouge
38
1
4
3
2

2

4
7
2
roughly
2
roughshod
2
roughneck
2
roughish
2
roughen
2
roughcast
2
rough
38
1
4
3
2

2
gnst
4
1
2
roulette
38
1
4
3
2
nd
2

4
2
2
rotunda
2
rotund
38
1
4
3
2

2

4
3
2
rototill
2
rotor
2
rotogravure
38
1
4
3
2

2

4
2
2
Rothschild
2
Roth
38
1
4
3
2

2

4
2
2
rotary
2
Rotarian
38
1
4
3
2

2
r
4
1
2
rotate
38
1
4
3
2

2
ahou
4
4
2
rotten
2
rotenone
2
ROTC
2
rot
38
1
4
3
2

2

4
2
2
rostrum
2
roster
38
1
4
3
2
t
2

4
2
2
rosette
2
Rosetta
38
1
4
3
2

2

4
2
2
Rosenblum
2
Rosenberg
38
1
4
3
2

2
b
4
3
2
Rosenzweig
2
Rosenthal
2
Rosen
38
1
4
3
2
u
2

4
2
2
rosebush
2
rosebud
38
1
4
3
2

2
bnt
4
3
2
rosemary
2
Roseland
2
rose
38
1
4
3
2

2

4
3
2
rosary
2
Rosalie
2
Rosa
38
1
4
3
2

2
aet
4
2
2
rosy
2
Ross
38
1
4
3
2
velt
2

4
2
2
Rooseveltian
2
Roosevelt
38
1
4
3
2

2
e
4
1
2
roost
38
1
4
3
2

2

4
5
2
rooms
2
roomy
2
roommate
2
roomful
2
room
38
1
4
3
2

2

4
3
2
rooky
2
rookie
2
rook
38
1
4
3
2

2

4
2
2
rooftree
2
rooftop
38
1
4
3
2

2
t
4
1
2
roof
38
1
4
3
2

2
fkms
4
2
2
root
2
rood
38
1
4
3
2

2

4
4
2
Ronnie
2
rondo
2
Ronald
2
Ron
38
1
4
3
2

2

4
2
2
Romeo
2
Rome
38
1
4
3
2
n
2

4
5
2
romantic
2
Romano
2
Romania
2
romance
2
Roman
38
1
4
3
2

2
ae
4
2
2
Romulus
2
romp
38
1
4
3
2

2
n
4
1
2
rollick
38
1
4
3
2

2
i
4
2
2
rollback
2
roll
38
1
4
3
2

2
l
4
2
2
role
2
Roland
38
1
4
3
2

2

4
2
2
roister
2
roil
38
1
4
3
2

2

4
2
2
rogue
2
Roger
38
1
4
3
2

2

4
3
2
Roentgen
2
roebuck
2
roe
38
1
4
3
2

2

4
3
2
rodeo
2
rodent
2
rode
38
1
4
3
2

2
e
4
4
2
Rodriguez
2
Rodney
2
Rodgers
2
rod
38
1
4
3
2

2

4
2
2
rocket
2
Rockefeller
38
1
4
3
2

2

4
2
2
rockaway
2
rockabye
38
1
4
3
2

2
ae
4
7
2
rocky
2
Rockwell
2
Rockland
2
Rockies
2
Rockford
2
rockbound
2
rock
38
1
4
3
2

2
k
4
2
2
rococo
2
Rochester
38
1
4
3
2
t
2

4
2
2
robotics
2
robot
38
1
4
3
2
n
2

4
2
2
Robinson
2
robin
38
1
4
3
2
t
2

4
4
2
Robertson
2
Roberto
2
Roberta
2
Robert
38
1
4
3
2

2
r
4
1
2
robe
38
1
4
3
2

2

4
2
2
robbin
2
robbery
38
1
4
3
2

2
beio
4
2
2
robust
2
rob
38
1
4
3
2

2
d
4
4
2
roast
2
roar
2
roam
2
roach
38
1
4
3
2

2

4
2
2
roadster
2
roadside
38
1
4
3
2

2

4
2
2
roadblock
2
roadbed
38
1
4
3
2

2
bs
4
3
2
roadway
2
roadhouse
2
road
38
1
4
3
2

2
abcdegilmnostuwy
4
3
2
Roxbury
2
rove
2
rope
38
1
4
3
2

2

4
5
2
riverside
2
riverine
2
riverfront
2
riverbank
2
river
38
1
4
3
2

2
r
4
2
2
rivet
2
riven
38
1
4
3
2
l
2

4
2
2
rivalry
2
rival
38
1
4
3
2

2
ae
4
2
2
rivulet
2
Riviera
38
1
4
3
2

2

4
5
2
Ritz
2
ritual
2
Ritter
2
rite
2
Ritchie
38
1
4
3
2

2

4
2
2
risky
2
risk
38
1
4
3
2

2

4
3
2
rises
2
risen
2
rise
38
1
4
3
2

2
ek
4
1
2
risible
38
1
4
3
2

2

4
2
2
ripen
2
ripe
38
1
4
3
2

2
e
4
5
2
ripple
2
ripoff
2
Ripley
2
riparian
2
rip
38
1
4
3
2

2

4
2
2
riotous
2
riot
38
1
4
3
2

2
t
4
2
2
Riordan
2
Rio
38
1
4
3
2

2

4
3
2
ringside
2
ringlet
2
ring
38
1
4
3
2

2
g
4
3
2
rinse
2
rink
2
Rinehart
38
1
4
3
2

2

4
3
2
rimy
2
rime
2
rim
38
1
4
3
2

2

4
2
2
rilly
2
rill
38
1
4
3
2

2
l
4
1
2
Riley
38
1
4
3
2
t
2

4
5
2
rightward
2
rightmost
2
rightful
2
righteous
2
right
38
1
4
3
2

2

4
2
2
Riggs
2
rigging
38
1
4
3
2

2
gho
4
4
2
rigid
2
Rigel
2
Riga
2
rig
38
1
4
3
2

2

4
2
2
riflemen
2
rifleman
38
1
4
3
2
e
2
m
4
1
2
rifle
38
1
4
3
2

2
l
4
2
2
rift
2
riffle
38
1
4
3
2
mann
2

4
2
2
Riemannian
2
Riemann
38
1
4
3
2
cul
2

4
2
2
ridiculous
2
ridicule
38
1
4
3
2

2

4
2
2
ridgepole
2
ridge
38
1
4
3
2

2
e
4
1
2
Ridgway
38
1
4
3
2

2

4
3
2
riddle
2
ridden
2
riddance
38
1
4
3
2

2
dgi
4
2
2
ride
2
rid
38
1
4
3
2

2

4
2
2
ricochet
2
Rico
38
1
4
3
2
t
2

4
3
2
rickety
2
Rickettsia
2
rickets
38
1
4
3
2

2
e
4
2
2
rickshaw
2
rick
38
1
4
3
2
rd
2

4
2
2
Richardson
2
Richard
38
1
4
3
2

2
a
4
4
2
Richter
2
Richmond
2
Richfield
2
rich
38
1
4
3
2

2
hko
4
2
2
rice
2
Rica
38
1
4
3
2

2

4
2
2
ribosome
2
ribose
38
1
4
3
2

2
s
4
2
2
ribonucleic
2
riboflavin
38
1
4
3
2

2
o
4
3
2
ribbon
2
ribald
2
rib
38
1
4
3
2

2
bcdefglmnopstv
4
2
2
Riyadh
2
RI
38
1
4
3
2
hm
2

4
2
2
rhythmic
2
rhythm
38
1
4
3
2

2
t
4
1
2
rhyme
38
1
4
3
2

2

4
2
2
rhombic
2
rhombi
38
1
4
3
2
b
2
i
4
1
2
rhombus
38
1
4
3
2

2

4
3
2
rhodonite
2
rhodolite
2
rhododendron
38
1
4
3
2

2

4
2
2
Rhodesia
2
Rhodes
38
1
4
3
2

2
s
4
1
2
Rhode
38
1
4
3
2

2
eo
4
2
2
rhodium
2
Rhoda
38
1
4
3
2

2
dm
4
1
2
rho
38
1
4
3
2

2

4
2
2
rhinoceros
2
rhino
38
1
4
3
2

2

4
2
2
rhinestone
2
Rhine
38
1
4
3
2
n
2
eo
4
0
38
1
4
3
2
ti
2

4
2
2
rheumatism
2
rheumatic
38
1
4
3
2
m
2
a
4
1
2
rheum
38
1
4
3
2
oric
2

4
2
2
rhetorician
2
rhetoric
38
1
4
3
2

2

4
2
2
rheostat
2
rheology
38
1
4
3
2
i
2

4
2
2
rhenium
2
Rhenish
38
1
4
3
2

2
notu
4
2
2
rhesus
2
Rhea
38
1
4
3
2
psod
2

4
2
2
rhapsody
2
rhapsodic
38
1
4
3
2

2
aeioy
4
1
2
rhubarb
38
1
4
3
2

2

4
2
2
Reynolds
2
Reykjavik
38
1
4
3
2

2

4
2
2
revving
2
revved
38
1
4
3
2
tion
2

4
2
2
revolutionary
2
revolution
38
1
4
3
2

2
u
4
2
2
revolve
2
revolt
38
1
4
3
2

2
l
4
2
2
revoke
2
revocable
38
1
4
3
2

2

4
2
2
revive
2
revival
38
1
4
3
2
on
2

4
2
2
revisionary
2
revision
38
1
4
3
2

2

4
2
2
revisal
2
revisable
38
1
4
3
2

2
ai
4
1
2
revise
38
1
4
3
2

2
sve
4
1
2
revile
38
1
4
3
2

2

4
2
2
reversion
2
reversible
38
1
4
3
2

2
i
4
2
2
reverse
2
reversal
38
1
4
3
2

2

4
2
2
reverent
2
reverend
38
1
4
3
2

2
n
4
1
2
revere
38
1
4
3
2

2
es
4
5
2
revery
2
revert
2
reverie
2
reverberate
2
rever
38
1
4
3
2

2

4
2
2
revenue
2
revenge
38
1
4
3
2
t
2

4
2
2
revelatory
2
revelation
38
1
4
3
2

2
a
4
2
2
revelry
2
revel
38
1
4
3
2

2
lnr
4
2
2
revet
2
reveal
38
1
4
3
2

2
eiov
4
2
2
revulsion
2
rev
38
1
4
3
2

2

4
2
2
Reuben
2
Reub
38
1
4
3
2

2
b
4
1
2
Reuters
38
1
4
3
2
ss
2

4
2
2
retrogressive
2
retrogress
38
1
4
3
2
r
2
e
4
1
2
retrograde
38
1
4
3
2

2

4
2
2
retrofitting
2
retrofitted
38
1
4
3
2
it
2
t
4
1
2
retrofit
38
1
4
3
2

2
fg
4
4
2
retrovision
2
retrospect
2
retrorocket
2
retroactive
38
1
4
3
2
v
2

4
2
2
retrieve
2
retrieval
38
1
4
3
2

2
e
4
1
2
retribution
38
1
4
3
2

2
io
4
1
2
retract
38
1
4
3
2
e
2

4
2
2
retiree
2
retire
38
1
4
3
2

2

4
2
2
retinal
2
retina
38
1
4
3
2

2
a
4
1
2
retinue
38
1
4
3
2

2
u
4
1
2
reticent
38
1
4
3
2
l
2

4
2
2
reticulum
2
reticulate
38
1
4
3
2

2
cnr
4
0
38
1
4
3
2
nti
2

4
2
2
retentive
2
retention
38
1
4
3
2

2

4
2
2
retardation
2
retardant
38
1
4
3
2
d
2
a
4
1
2
retard
38
1
4
3
2
iat
2

4
2
2
retaliatory
2
retaliate
38
1
4
3
2

2

4
2
2
retain
2
retail
38
1
4
3
2

2
ilr
4
0
38
1
4
3
2

2
aeiru
4
3
2
retort
2
retch
2
ret
38
1
4
3
2

2

4
2
2
resurrect
2
resurgent
38
1
4
3
2

2

4
2
2
resumption
2
resume
38
1
4
3
2
t
2

4
3
2
results
2
resultant
2
result
38
1
4
3
2

2
lmr
4
1
2
resuscitate
38
1
4
3
2
in
2

4
2
2
restraint
2
restrain
38
1
4
3
2

2
a
4
2
2
restroom
2
restrict
38
1
4
3
2
rati
2

4
2
2
restorative
2
restoration
38
1
4
3
2

2

4
2
2
restive
2
restitution
38
1
4
3
2
ura
2

4
2
2
restaurateur
2
restaurant
38
1
4
3
2

2
aior
4
2
2
restful
2
rest
38
1
4
3
2

2

4
2
2
responsive
2
responsible
38
1
4
3
2

2
i
4
1
2
response
38
1
4
3
2

2

4
2
2
respondent
2
respond
38
1
4
3
2
n
2
ds
4
0
38
1
4
3
2

2
a
4
1
2
respire
38
1
4
3
2
t
2
o
4
1
2
respiration
38
1
4
3
2
r
2

4
2
2
respiratory
2
respirator
38
1
4
3
2

2
r
4
1
2
respite
38
1
4
3
2
ct
2

4
2
2
respectful
2
respect
38
1
4
3
2

2
eio
4
1
2
resplendent
38
1
4
3
2

2

4
2
2
resort
2
resorcinol
38
1
4
3
2
a
2

4
2
2
resonate
2
resonant
38
1
4
3
2

2
u
4
1
2
resolve
38
1
4
3
2
t
2

4
2
2
resolution
2
resolute
38
1
4
3
2

2
lnru
4
0
38
1
4
3
2

2

4
2
2
resistive
2
resistible
38
1
4
3
2
t
2
i
4
3
2
resistor
2
resistant
2
resist
38
1
4
3
2

2

4
2
2
resiny
2
resin
38
1
4
3
2
n
2

4
2
2
resignation
2
resign
38
1
4
3
2

2
eu
4
0
38
1
4
3
2

2

4
2
2
residuary
2
residual
38
1
4
3
2

2
a
4
2
2
residuum
2
residue
38
1
4
3
2

2
n
4
1
2
reside
38
1
4
3
2
t
2

4
2
2
residential
2
resident
38
1
4
3
2

2
dgns
4
1
2
resilient
38
1
4
3
2

2

4
3
2
reservoir
2
reserve
2
reservation
38
1
4
3
2

2
v
4
1
2
reserpine
38
1
4
3
2
t
2

4
2
2
resentful
2
resent
38
1
4
3
2
bl
2

4
3
2
resembling
2
resemble
2
resemblant
38
1
4
3
2

2
mnr
4
1
2
research
38
1
4
3
2

2

4
2
2
rescue
2
rescind
38
1
4
3
2

2
ceioptu
4
0
38
1
4
3
2
it
2

4
2
2
requisition
2
requisite
38
1
4
3
2

2
sr
4
1
2
requited
38
1
4
3
2
u
2
i
4
1
2
request
38
1
4
3
2

2

4
2
2
repute
2
reputation
38
1
4
3
2
si
2

4
2
2
repulsive
2
repulsion
38
1
4
3
2
lic
2

4
2
2
republican
2
republic
38
1
4
3
2

2
blt
4
2
2
repugnant
2
repudiate
38
1
4
3
2
il
2

4
2
2
reptilian
2
reptile
38
1
4
3
2

2

4
2
2
reprise
2
reprisal
38
1
4
3
2

2
s
4
2
2
reprimand
2
reprieve
38
1
4
3
2

2
s
4
1
2
reprehensible
38
1
4
3
2
i
2

4
2
2
repressive
2
repression
38
1
4
3
2

2
se
4
0
38
1
4
3
2

2
ei
4
1
2
reproach
38
1
4
3
2
t
2

4
5
2
reports
2
reporting
2
reported
2
reportorial
2
report
38
1
4
3
2

2
r
4
1
2
repository
38
1
4
3
2
ca
2

4
2
2
replicate
2
replica
38
1
4
3
2

2

4
2
2
replete
2
replenish
38
1
4
3
2

2
ei
4
1
2
replaceable
38
1
4
3
2

2

4
2
2
repetitious
2
repetition
38
1
4
3
2
iti
2
o
4
1
2
repetitive
38
1
4
3
2
to
2

4
2
2
repertory
2
repertoire
38
1
4
3
2
t
2

4
2
2
repentant
2
repent
38
1
4
3
2

2

4
2
2
repellent
2
repelled
38
1
4
3
2

2
e
4
1
2
repelling
38
1
4
3
2

2
l
4
1
2
repel
38
1
4
3
2

2
t
4
1
2
repeal
38
1
4
3
2

2

4
2
2
repeater
2
repeat
38
1
4
3
2

2
alnrt
4
0
38
1
4
3
2

2

4
2
2
repartee
2
reparation
38
1
4
3
2
rm
2

4
2
2
repairmen
2
repairman
38
1
4
3
2

2
ir
4
0
38
1
4
3
2

2
aelortu
4
1
2
rep
38
1
4
3
2

2

4
2
2
rental
2
rent
38
1
4
3
2

2

4
4
2
renown
2
renovate
2
renounce
2
Renoir
38
1
4
3
2

2

4
3
2
renewal
2
renegotiable
2
Rene
38
1
4
3
2

2

4
2
2
rendezvous
2
render
38
1
4
3
2

2
e
4
2
2
rendition
2
rend
38
1
4
3
2

2

4
4
2
Renault
2
renal
2
renaissance
2
Rena
38
1
4
3
2

2
adeot
4
2
2
renunciate
2
Rensselaer
38
1
4
3
2

2

4
2
2
Remus
2
remunerate
38
1
4
3
2
se
2

4
2
2
remorseful
2
remorse
38
1
4
3
2

2
rv
4
2
2
remote
2
remonstrate
38
1
4
3
2

2

4
3
2
remitting
2
remitted
2
remittance
38
1
4
3
2

2
t
4
1
2
remit
38
1
4
3
2
s
2

4
2
2
remission
2
remiss
38
1
4
3
2

2
i
4
1
2
Remington
38
1
4
3
2
sce
2

4
2
2
reminiscent
2
reminisce
38
1
4
3
2

2
nst
4
0
38
1
4
3
2
b
2

4
2
2
remembrance
2
remember
38
1
4
3
2

2
i
4
1
2
remedy
38
1
4
3
2
a
2

4
2
2
remedial
2
remediable
38
1
4
3
2

2
dm
4
0
38
1
4
3
2

2
ni
4
1
2
remark
38
1
4
3
2

2

4
2
2
remand
2
reman
38
1
4
3
2

2
aeiou
4
2
2
remnant
2
Rembrandt
38
1
4
3
2
io
2

4
3
2
religious
2
religiosity
2
religion
38
1
4
3
2

2

4
2
2
relieve
2
relief
38
1
4
3
2

2

4
2
2
relict
2
relic
38
1
4
3
2

2
ceg
4
4
2
relish
2
reliquary
2
relinquish
2
reliant
38
1
4
3
2

2
a
4
1
2
relevant
38
1
4
3
2

2
t
4
1
2
relaxation
38
1
4
3
2

2
aei
4
1
2
reluctant
38
1
4
3
2
i
2

4
2
2
rejoinder
2
rejoice
38
1
4
3
2

2
o
4
1
2
reject
38
1
4
3
2

2

4
5
2
reinstate
2
Reinhold
2
reinforce
2
reindeer
2
rein
38
1
4
3
2
burs
2

4
2
2
reimburse
2
reimbursable
38
1
4
3
2

2
mn
4
4
2
Reilly
2
reign
2
Reid
2
Reich
38
1
4
3
2
ars
2

4
2
2
rehearse
2
rehearsal
38
1
4
3
2

2
e
4
1
2
rehabilitate
38
1
4
3
2

2
a
4
1
2
Regulus
38
1
4
3
2

2
t
4
1
2
regular
38
1
4
3
2

2

4
2
2
regulatory
2
regulate
38
1
4
3
2

2
l
4
1
2
regurgitate
38
1
4
3
2

2

4
3
2
regretting
2
regretted
2
regrettable
38
1
4
3
2

2
t
4
2
2
regretful
2
regret
38
1
4
3
2
s
2
i
4
1
2
regress
38
1
4
3
2

2

4
2
2
regressive
2
regression
38
1
4
3
2
e
2
st
4
0
38
1
4
3
2

2

4
4
2
registration
2
registrar
2
registrant
2
registrable
38
1
4
3
2
r
2
a
4
1
2
registry
38
1
4
3
2

2
t
4
1
2
Regis
38
1
4
3
2
a
2

4
2
2
Reginald
2
Regina
38
1
4
3
2
e
2
n
4
1
2
regime
38
1
4
3
2

2

4
2
2
regimentation
2
regiment
38
1
4
3
2

2
t
4
1
2
regimen
38
1
4
3
2

2
mnso
4
0
38
1
4
3
2

2
l
4
2
2
regatta
2
regard
38
1
4
3
2

2

4
3
2
regalia
2
regale
2
regal
38
1
4
3
2

2
airu
4
1
2
regent
38
1
4
3
2

2

4
2
2
refute
2
refutation
38
1
4
3
2
e
2

4
2
2
refugee
2
refuge
38
1
4
3
2

2
gt
4
1
2
refusal
38
1
4
3
2

2
c
4
1
2
refrain
38
1
4
3
2
t
2
o
4
1
2
refract
38
1
4
3
2

2

4
2
2
refractory
2
refractometer
38
1
4
3
2

2
a
4
1
2
refrigerate
38
1
4
3
2
t
2

4
3
2
reflector
2
reflectance
2
reflect
38
1
4
3
2
e
2
c
4
1
2
reflexive
38
1
4
3
2

2
r
4
1
2
refectory
38
1
4
3
2

2

4
3
2
referring
2
referred
2
referral
38
1
4
3
2

2

4
2
2
referential
2
referent
38
1
4
3
2

2

4
2
2
referendum
2
referenda
38
1
4
3
2

2
dt
4
1
2
reference
38
1
4
3
2

2

4
2
2
refereeing
2
referee
38
1
4
3
2

2
en
4
0
38
1
4
3
2

2
er
4
1
2
refer
38
1
4
3
2

2
elru
4
1
2
reformatory
38
1
4
3
2
e
2

4
2
2
Reeves
2
reeve
38
1
4
3
2

2

4
3
2
reedy
2
reedbuck
2
reed
38
1
4
3
2

2
dv
4
4
2
Reese
2
reel
2
reek
2
reef
38
1
4
3
2

2
e
4
1
2
reducible
38
1
4
3
2

2
c
4
1
2
redundant
38
1
4
3
2

2

4
2
2
Redstone
2
redstart
38
1
4
3
2

2
t
4
1
2
redshank
38
1
4
3
2

2
mf
4
0
38
1
4
3
2

2

4
2
2
reddish
2
redden
38
1
4
3
2

2

4
2
2
redbud
2
redbird
38
1
4
3
2
ct
2

4
2
2
redactor
2
redact
38
1
4
3
2

2
abdesur
4
9
2
redwood
2
redtop
2
redpoll
2
redound
2
redneck
2
Redmond
2
redhead
2
redcoat
2
red
38
1
4
3
2

2

4
2
2
recuse
2
recusant
38
1
4
3
2

2

4
2
2
recurring
2
recurred
38
1
4
3
2

2
r
4
2
2
recursion
2
recur
38
1
4
3
2

2
rs
4
2
2
recuperate
2
recumbent
38
1
4
3
2
r
2

4
2
2
rectory
2
rector
38
1
4
3
2

2

4
2
2
rectify
2
rectifier
38
1
4
3
2

2
f
4
2
2
rectitude
2
rectilinear
38
1
4
3
2
ng
2

4
2
2
rectangular
2
rectangle
38
1
4
3
2

2
aio
4
0
38
1
4
3
2

2

4
2
2
recruit
2
recriminate
38
1
4
3
2

2

4
3
2
reconnaissance
2
recondite
2
reconcile
38
1
4
3
2

2
nr
4
2
2
recovery
2
recompense
38
1
4
3
2

2

4
3
2
recluse
2
recline
2
reclamation
38
1
4
3
2

2

4
2
2
reckon
2
reck
38
1
4
3
2
a
2

4
2
2
recitative
2
recital
38
1
4
3
2

2

4
2
2
reciprocate
2
reciprocal
38
1
4
3
2
oc
2
a
4
1
2
reciprocity
38
1
4
3
2

2
r
4
2
2
recipient
2
recipe
38
1
4
3
2

2
pt
4
1
2
Recife
38
1
4
3
2

2

4
2
2
recessive
2
recession
38
1
4
3
2
s
2
i
4
1
2
recess
38
1
4
3
2

2

4
2
2
receptive
2
reception
38
1
4
3
2
t
2
i
4
2
2
receptor
2
receptacle
38
1
4
3
2

2
v
4
1
2
receipt
38
1
4
3
2

2
ipsn
4
0
38
1
4
3
2

2
eiklortu
4
3
2
recycle
2
recherche
2
recalcitrant
38
1
4
3
2

2

4
3
2
rebutting
2
rebutted
2
rebuttal
38
1
4
3
2

2
t
4
1
2
rebut
38
1
4
3
2

2
t
4
1
2
rebuke
38
1
4
3
2

2

4
2
2
rebellious
2
rebellion
38
1
4
3
2

2
o
4
1
2
rebelling
38
1
4
3
2

2
i
4
1
2
rebelled
38
1
4
3
2

2
l
4
1
2
rebel
38
1
4
3
2

2
l
4
1
2
Rebecca
38
1
4
3
2

2
eu
4
1
2
reb
38
1
4
3
2

2

4
2
2
realty
2
realtor
38
1
4
3
2

2
t
4
4
2
really
2
realm
2
realisable
2
real
38
1
4
3
2

2

4
3
2
ready
2
readout
2
read
38
1
4
3
2

2
th
4
0
38
1
4
3
2

2

4
2
2
reactionary
2
reactant
38
1
4
3
2

2
cdls
4
5
2
reave
2
rear
2
reap
2
ream
2
Reagan
38
1
4
3
2

2
abcdefghijlmnpqstuvy
4
4
2
Rex
2
reward
2
reredos
2
re
38
1
4
3
2
r
2

4
2
2
razorback
2
razor
38
1
4
3
2

2
o
4
1
2
raze
38
1
4
3
2

2

4
4
2
Raytheon
2
Raymond
2
Rayleigh
2
ray
38
1
4
3
2

2

4
4
2
Rawlinson
2
rawhide
2
rawboned
2
raw
38
1
4
3
2

2

4
2
2
ravish
2
ravine
38
1
4
3
2

2

4
2
2
ravenous
2
raven
38
1
4
3
2

2
n
4
2
2
ravel
2
rave
38
1
4
3
2

2
ei
4
1
2
ravage
38
1
4
3
2

2

4
2
2
Raul
2
raucous
38
1
4
3
2
e
2

4
2
2
rattlesnake
2
rattle
38
1
4
3
2

2
l
4
1
2
rattail
38
1
4
3
2

2

4
3
2
rationale
2
ratiocinate
2
ratio
38
1
4
3
2

2
o
4
1
2
ratify
38
1
4
3
2

2

4
3
2
rates
2
rater
2
rate
38
1
4
3
2

2
eit
4
3
2
rather
2
rata
2
rat
38
1
4
3
2

2

4
2
2
Rastus
2
raster
38
1
4
3
2

2

4
2
2
raspberry
2
rasp
38
1
4
3
2

2
pt
4
4
2
Rasmussen
2
rash
2
rascal
2
rasa
38
1
4
3
2

2

4
2
2
rarefy
2
rare
38
1
4
3
2

2
e
4
1
2
Raritan
38
1
4
3
2

2

4
2
2
rapture
2
rapt
38
1
4
3
2

2

4
2
2
rapprochement
2
rapport
38
1
4
3
2

2

4
2
2
rapier
2
rapid
38
1
4
3
2

2
ipt
4
4
2
Raphael
2
rape
2
rapacious
2
rap
38
1
4
3
2

2

4
2
2
ransom
2
ransack
38
1
4
3
2
n
2

4
2
2
Rankine
2
Rankin
38
1
4
3
2

2
i
4
2
2
rankle
2
rank
38
1
4
3
2

2

4
2
2
rangeland
2
range
38
1
4
3
2

2
e
4
3
2
rangy
2
Rangoon
2
rang
38
1
4
3
2

2

4
2
2
random
2
Randolph
38
1
4
3
2

2
o
4
3
2
randy
2
Randall
2
Rand
38
1
4
3
2

2

4
2
2
rancho
2
ranch
38
1
4
3
2

2
h
4
2
2
rancorous
2
rancid
38
1
4
3
2

2
cdgks
4
3
2
rant
2
Ranier
2
ran
38
1
4
3
2

2

4
3
2
rampart
2
rampant
2
rampage
38
1
4
3
2

2
a
4
1
2
ramp
38
1
4
3
2

2

4
2
2
Raman
2
Ramada
38
1
4
3
2

2
ap
4
6
2
Ramsey
2
ramrod
2
Ramo
2
ramify
2
ramble
2
ram
38
1
4
3
2

2

4
4
2
Ralston
2
Ralph
2
rally
2
Raleigh
38
1
4
3
2

2

4
2
2
rakish
2
rake
38
1
4
3
2

2

4
2
2
rajah
2
raj
38
1
4
3
2

2
ei
4
0
38
1
4
3
2

2

4
7
2
rainy
2
rainstorm
2
rainfall
2
raindrop
2
raincoat
2
rainbow
2
rain
38
1
4
3
2

2

4
6
2
railway
2
railroad
2
raillery
2
railhead
2
railbird
2
rail
38
1
4
3
2

2
lns
4
1
2
raid
38
1
4
3
2

2

4
5
2
ragweed
2
ragout
2
ragging
2
rage
2
rag
38
1
4
3
2

2

4
2
2
raffish
2
raffia
38
1
4
3
2

2
i
4
1
2
Rafferty
38
1
4
3
2

2
f
4
2
2
raft
2
Rafael
38
1
4
3
2

2

4
2
2
radius
2
radium
38
1
4
3
2
emi
2

4
2
2
radiochemistry
2
radiochemical
38
1
4
3
2

2
h
4
1
2
radiocarbon
38
1
4
3
2

2

4
2
2
radioastronomy
2
radioactive
38
1
4
3
2

2
ac
4
7
2
radiotherapy
2
radiosonde
2
radiophysics
2
radiometer
2
radiology
2
radiography
2
radio
38
1
4
3
2

2

4
2
2
radices
2
radical
38
1
4
3
2

2
n
4
2
2
radiate
2
radial
38
1
4
3
2

2

4
2
2
radiant
2
radian
38
1
4
3
2

2
acou
4
3
2
radix
2
radish
2
radii
38
1
4
3
2

2
i
4
3
2
radon
2
Radcliffe
2
radar
38
1
4
3
2
t
2

4
3
2
rackety
2
racketeer
2
racket
38
1
4
3
2

2
e
4
1
2
rack
38
1
4
3
2

2

4
2
2
Rachmaninoff
2
Rachel
38
1
4
3
2

2

4
3
2
raceway
2
racetrack
2
race
38
1
4
3
2

2
ehk
4
3
2
racy
2
racial
2
raccoon
38
1
4
3
2

2
bi
4
1
2
rabat
38
1
4
3
2

2

4
3
2
Rabin
2
rabies
2
rabid
38
1
4
3
2

2

4
2
2
rabbit
2
rabbi
38
1
4
3
2

2
i
4
2
2
rabble
2
rabbet
38
1
4
3
2

2
bcdfgijklmnprstuvwyz
4
2
2
Raoul
2
Rae
38
1
4
3
2

2
aehiouy
4
9
2
Rwanda
2
RSVP
2
r's
2
RPM
2
RNA
2
R&D
2
Rd
2
RCA
2
r
38
1
4
3
2

2

4
2
2
quotation
2
quota
38
1
4
3
2

2
ai
4
1
2
quote
38
1
4
3
2

2
t
4
4
2
quorum
2
quonset
2
quod
2
quo
38
1
4
3
2

2

4
2
2
quizzical
2
quizzes
38
1
4
3
2

2
z
4
1
2
quiz
38
1
4
3
2
ot
2

4
2
2
quixotic
2
Quixote
38
1
4
3
2

2

4
4
2
quitting
2
Quito
2
quite
2
quit
38
1
4
3
2

2

4
2
2
quirky
2
quirk
38
1
4
3
2

2
k
4
2
2
quirt
2
Quirinal
38
1
4
3
2

2

4
2
2
quipping
2
quip
38
1
4
3
2

2

4
2
2
quintillion
2
quintic
38
1
4
3
2

2
i
4
3
2
quintus
2
quintet
2
quint
38
1
4
3
2

2
t
4
3
2
Quinn
2
quinine
2
quince
38
1
4
3
2

2

4
2
2
quillwort
2
quill
38
1
4
3
2

2
l
4
1
2
quilt
38
1
4
3
2

2

4
2
2
quietus
2
quiet
38
1
4
3
2

2
t
4
1
2
quiescent
38
1
4
3
2

2

4
3
2
quickstep
2
quicksilver
2
quicksand
38
1
4
3
2
k
2
sl
4
3
2
quickie
2
quicken
2
quick
38
1
4
3
2

2
celnprtxz
4
3
2
quiver
2
quid
2
quibble
38
1
4
3
2
on
2

4
3
2
questions
2
questionnaire
2
question
38
1
4
3
2
t
2
i
4
1
2
quest
38
1
4
3
2

2

4
2
2
query
2
querulous
38
1
4
3
2

2

4
2
2
queer
2
queen
38
1
4
3
2

2
ers
4
7
2
Quezon
2
queue
2
quetzal
2
quench
2
quell
2
Quebec
2
queasy
38
1
4
3
2

2
cdiklnrst
4
6
2
quay
2
quaver
2
quahog
2
quagmire
2
quaff
2
qua
38
1
4
3
2

2

4
2
2
quatrain
2
quaternary
38
1
4
3
2

2

4
2
2
quasiparticle
2
quasi
38
1
4
3
2

2
i
4
2
2
quash
2
quasar
38
1
4
3
2

2

4
2
2
quartzite
2
quartz
38
1
4
3
2

2

4
2
2
quartile
2
quartic
38
1
4
3
2

2

4
2
2
quartermaster
2
quarterback
38
1
4
3
2

2
r
4
1
2
quartet
38
1
4
3
2

2
eiz
4
1
2
quart
38
1
4
3
2

2

4
2
2
quarrymen
2
quarryman
38
1
4
3
2

2
m
4
1
2
quarry
38
1
4
3
2
l
2

4
2
2
quarrelsome
2
quarrel
38
1
4
3
2

2
ey
4
0
38
1
4
3
2

2
rt
4
2
2
quark
2
quarantine
38
1
4
3
2

2

4
3
2
quantities
2
quantity
2
quantitative
38
1
4
3
2

2
t
4
3
2
quantile
2
quantify
2
Quantico
38
1
4
3
2

2
i
4
2
2
quantum
2
quanta
38
1
4
3
2

2
t
4
1
2
quandary
38
1
4
3
2

2
t
4
1
2
qualify
38
1
4
3
2

2

4
2
2
quality
2
qualitative
38
1
4
3
2

2
i
4
1
2
qualm
38
1
4
3
2
e
2

4
2
2
Quakeress
2
quake
38
1
4
3
2

2

4
2
2
quaint
2
quail
38
1
4
3
2
p
2

4
2
2
quadrupole
2
quadruple
38
1
4
3
2

2

4
2
2
quadrillion
2
quadrille
38
1
4
3
2

2
l
4
1
2
quadrilateral
38
1
4
3
2

2

4
2
2
quadriceps
2
quadric
38
1
4
3
2

2
cl
4
2
2
quadrivium
2
quadripartite
38
1
4
3
2

2
nt
4
0
38
1
4
3
2

2

4
2
2
quadrature
2
quadratic
38
1
4
3
2

2
g
4
1
2
quadrant
38
1
4
3
2

2

4
2
2
quadrangular
2
quadrangle
38
1
4
3
2

2
aiu
4
1
2
quadrennial
38
1
4
3
2

2
r
4
1
2
quad
38
1
4
3
2
k
2

4
2
2
quackery
2
quack
38
1
4
3
2

2
aeio
4
0
38
1
4
3
2

2
u
4
4
2
q's
2
QED
2
Qatar
2
q
38
1
4
3
2
gor
2

4
2
2
Pythagorean
2
Pythagoras
38
1
4
3
2
h
2
a
4
1
2
python
38
1
4
3
2
en
2

4
2
2
pyroxenite
2
pyroxene
38
1
4
3
2
ys
2

4
2
2
pyrolysis
2
pyrolyse
38
1
4
3
2

2
lx
4
4
2
pyrotechnic
2
pyrophosphate
2
pyrometer
2
pyroelectric
38
1
4
3
2

2

4
3
2
pyrite
2
pyrimidine
2
pyridine
38
1
4
3
2

2

4
2
2
Pyrex
2
pyre
38
1
4
3
2
id
2

4
2
2
pyramidal
2
pyramid
38
1
4
3
2

2
m
4
1
2
pyracanth
38
1
4
3
2

2
aeio
4
1
2
Pyrrhic
38
1
4
3
2
m
2

4
2
2
pygmy
2
Pygmalion
38
1
4
3
2

2
grt
4
3
2
Pyongyang
2
Pyle
2
pyknotic
38
1
4
3
2

2

4
2
2
putty
2
putt
38
1
4
3
2

2
t
4
4
2
puts
2
Putnam
2
putative
2
put
38
1
4
3
2
y
2

4
2
2
pussycat
2
pussy
38
1
4
3
2

2

4
4
2
pushpin
2
pushout
2
pushbutton
2
push
38
1
4
3
2

2
hs
4
3
2
Pusey
2
Pusan
2
pus
38
1
4
3
2
y
2

4
2
2
purveyor
2
purvey
38
1
4
3
2

2
e
4
1
2
purview
38
1
4
3
2

2

4
3
2
pursuit
2
pursue
2
pursuant
38
1
4
3
2

2
u
4
2
2
purslane
2
purse
38
1
4
3
2

2

4
2
2
purposeful
2
purpose
38
1
4
3
2
s
2
e
4
1
2
purposive
38
1
4
3
2

2
o
4
1
2
purple
38
1
4
3
2

2

4
2
2
purloin
2
purl
38
1
4
3
2
an
2

4
2
2
puritanic
2
Puritan
38
1
4
3
2

2

4
2
2
purine
2
Purina
38
1
4
3
2

2
nt
4
1
2
purify
38
1
4
3
2
t
2
i
4
1
2
purgatory
38
1
4
3
2

2

4
2
2
purgative
2
purgation
38
1
4
3
2

2
a
4
1
2
purge
38
1
4
3
2

2
h
4
1
2
Purcell
38
1
4
3
2
as
2

4
2
2
purchase
2
purchasable
38
1
4
3
2

2
cgilpsv
4
3
2
purr
2
pure
2
Purdue
38
1
4
3
2

2

4
2
2
puppyish
2
puppy
38
1
4
3
2
t
2

4
2
2
puppeteer
2
puppet
38
1
4
3
2

2
ey
4
0
38
1
4
3
2

2

4
2
2
pupate
2
pupal
38
1
4
3
2

2
ap
4
2
2
pupil
2
pup
38
1
4
3
2

2

4
2
2
punky
2
punk
38
1
4
3
2

2

4
3
2
punitive
2
punish
2
Punic
38
1
4
3
2
it
2

4
2
2
punditry
2
pundit
38
1
4
3
2

2

4
2
2
punctuate
2
punctual
38
1
4
3
2
u
2
a
4
1
2
puncture
38
1
4
3
2

2
t
4
1
2
punch
38
1
4
3
2

2
cdik
4
5
2
puny
2
punt
2
punster
2
pungent
2
pun
38
1
4
3
2
in
2

4
2
2
pumpkinseed
2
pumpkin
38
1
4
3
2

2
k
4
1
2
pump
38
1
4
3
2

2
p
4
3
2
pummel
2
pumice
2
puma
38
1
4
3
2

2

4
2
2
pulsate
2
pulsar
38
1
4
3
2

2
a
4
1
2
pulse
38
1
4
3
2

2

4
2
2
pulpit
2
pulp
38
1
4
3
2

2

4
5
2
pullover
2
Pullman
2
pulley
2
pullback
2
pull
38
1
4
3
2

2
lps
4
4
2
pulverable
2
pulmonary
2
Pulitzer
2
Pulaski
38
1
4
3
2

2

4
2
2
Pugh
2
pug
38
1
4
3
2
f
2

4
5
2
puffy
2
puffin
2
puffery
2
puffball
2
puff
38
1
4
3
2

2

4
2
2
Puerto
2
puerile
38
1
4
3
2

2
r
4
1
2
pueblo
38
1
4
3
2

2

4
2
2
puddly
2
puddle
38
1
4
3
2
ng
2

4
2
2
puddingstone
2
pudding
38
1
4
3
2
d
2
il
4
0
38
1
4
3
2

2

4
2
2
puckish
2
puck
38
1
4
3
2

2
k
4
1
2
Puccini
38
1
4
3
2

2
el
4
1
2
pub
38
1
4
3
2

2

4
2
2
publication
2
public
38
1
4
3
2
i
2
c
4
1
2
publish
38
1
4
3
2

2

4
2
2
pubescent
2
puberty
38
1
4
3
2

2
bcdefglmnprst
4
3
2
puzzle
2
puke
2
puissant
38
1
4
3
2
lem
2

4
2
2
Ptolemy
2
Ptolemaic
38
1
4
3
2

2

4
2
2
ptarmigan
2
PTA
38
1
4
3
2

2
Ao
4
1
2
pterodactyl
38
1
4
3
2
h
2
io
4
2
2
psyche
2
psych
38
1
4
3
2
erap
2

4
3
2
psychotherapy
2
psychotherapist
2
psychotherapeutic
38
1
4
3
2

2
h
4
1
2
psychotic
38
1
4
3
2

2

4
3
2
psychosomatic
2
psychosis
2
psychoses
38
1
4
3
2
ysi
2

4
2
2
psychophysiology
2
psychophysic
38
1
4
3
2
th
2

4
2
2
psychopathic
2
psychopath
38
1
4
3
2

2
ah
4
1
2
psychopomp
38
1
4
3
2

2

4
2
2
psychoanalyst
2
psychoanalysis
38
1
4
3
2
aly
2
s
4
1
2
psychoanalytic
38
1
4
3
2

2
n
4
1
2
psychoacoustic
38
1
4
3
2

2
apst
4
4
2
psychometry
2
psychology
2
psychobiology
2
psycho
38
1
4
3
2
tr
2
i
4
1
2
psychiatry
38
1
4
3
2

2

4
2
2
psychiatrist
2
psychiatric
38
1
4
3
2

2
a
4
1
2
psychic
38
1
4
3
2

2
c
4
1
2
psyllium
38
1
4
3
2
l
2

4
2
2
psalter
2
psalm
38
1
4
3
2

2
ay
4
2
2
psi
2
pseudo
38
1
4
3
2
ent
2

4
2
2
prudential
2
prudent
38
1
4
3
2

2
d
4
3
2
Prussia
2
prurient
2
prune
38
1
4
3
2
m
2
a
4
1
2
proximity
38
1
4
3
2

2

4
2
2
proximate
2
proximal
38
1
4
3
2

2
i
4
1
2
proxy
38
1
4
3
2

2

4
3
2
prowl
2
prowess
2
prow
38
1
4
3
2
at
2
i
4
1
2
provocateur
38
1
4
3
2

2

4
2
2
provocative
2
provocation
38
1
4
3
2

2
c
4
2
2
provost
2
provoke
38
1
4
3
2

2

4
2
2
proviso
2
provision
38
1
4
3
2
c
2

4
2
2
provincial
2
province
38
1
4
3
2

2
e
4
1
2
providing
38
1
4
3
2
t
2

4
2
2
providential
2
provident
38
1
4
3
2

2
dns
4
0
38
1
4
3
2

2
nr
4
1
2
prove
38
1
4
3
2
b
2

4
2
2
proverbial
2
proverb
38
1
4
3
2

2

4
2
2
provenance
2
proven
38
1
4
3
2

2
eio
4
0
38
1
4
3
2

2

4
2
2
Proust
2
proud
38
1
4
3
2
i
2

4
2
2
protrusive
2
protrusion
38
1
4
3
2

2
s
4
1
2
protrude
38
1
4
3
2

2
u
4
1
2
protract
38
1
4
3
2
oa
2

4
2
2
protozoan
2
Protozoa
38
1
4
3
2
yp
2

4
2
2
prototypic
2
prototype
38
1
4
3
2
asm
2

4
2
2
protoplasmic
2
protoplasm
38
1
4
3
2

2
l
4
1
2
Protophyta
38
1
4
3
2

2
ptz
4
2
2
proton
2
protocol
38
1
4
3
2

2

4
2
2
protestation
2
protestant
38
1
4
3
2
t
2
a
4
1
2
protest
38
1
4
3
2
ly
2

4
2
2
proteolytic
2
proteolysis
38
1
4
3
2
r
2

4
2
2
protectorate
2
protector
38
1
4
3
2
t
2
o
4
1
2
protect
38
1
4
3
2

2

4
2
2
protease
2
protean
38
1
4
3
2

2
acos
4
2
2
protein
2
protege
38
1
4
3
2

2

4
2
2
protagonist
2
protactinium
38
1
4
3
2

2
aeor
4
2
2
protuberant
2
prothonotary
38
1
4
3
2
tut
2

4
2
2
prostitution
2
prostitute
38
1
4
3
2

2
i
4
3
2
prostrate
2
prosthetic
2
prostate
38
1
4
3
2

2

4
2
2
prosperous
2
prosper
38
1
4
3
2
t
2

4
3
2
prospectus
2
prospector
2
prospect
38
1
4
3
2
e
2
cr
4
0
38
1
4
3
2

2

4
2
2
prosody
2
prosodic
38
1
4
3
2

2
d
4
1
2
prosopopoeia
38
1
4
3
2
ut
2

4
3
2
prosecutor
2
prosecution
2
prosecute
38
1
4
3
2

2
c
4
2
2
Proserpine
2
prose
38
1
4
3
2
i
2

4
2
2
proscription
2
proscribe
38
1
4
3
2

2
r
4
1
2
proscenium
38
1
4
3
2

2
ceopt
4
1
2
prosaic
38
1
4
3
2

2

4
2
2
prorogue
2
prorate
38
1
4
3
2
l
2

4
2
2
propylene
2
propyl
38
1
4
3
2
cepti
2

4
2
2
proprioceptive
2
proprioception
38
1
4
3
2
t
2

4
3
2
propriety
2
proprietor
2
proprietary
38
1
4
3
2
i
2
eo
4
0
38
1
4
3
2

2
ei
4
2
2
proposal
2
propos
38
1
4
3
2
tion
2

4
2
2
proportionate
2
proportion
38
1
4
3
2

2
rs
4
1
2
proponent
38
1
4
3
2
i
2

4
2
2
propitious
2
propitiate
38
1
4
3
2

2
t
4
1
2
propionate
38
1
4
3
2

2

4
2
2
prophetic
2
prophet
38
1
4
3
2
e
2
t
4
2
2
prophesy
2
prophecy
38
1
4
3
2

2
t
4
1
2
proper
38
1
4
3
2

2
l
4
1
2
propel
38
1
4
3
2

2

4
2
2
propeller
2
propelled
38
1
4
3
2

2
e
4
2
2
propelling
2
propellant
38
1
4
3
2

2
lr
4
1
2
propensity
38
1
4
3
2
a
2
n
4
1
2
propagate
38
1
4
3
2
d
2

4
2
2
propagandist
2
propaganda
38
1
4
3
2

2
g
4
1
2
propane
38
1
4
3
2

2
aehiory
4
2
2
propulsion
2
prop
38
1
4
3
2
f
2
r
4
1
2
proof
38
1
4
3
2
e
2

4
2
2
pronounceable
2
pronounce
38
1
4
3
2
un
2
c
4
1
2
pronoun
38
1
4
3
2

2
o
4
4
2
pronunciation
2
pronto
2
prong
2
prone
38
1
4
3
2
t
2

4
2
2
promptitude
2
prompt
38
1
4
3
2
t
2

4
2
2
promotion
2
promote
38
1
4
3
2
u
2

4
2
2
promiscuous
2
promiscuity
38
1
4
3
2

2
c
4
1
2
promise
38
1
4
3
2

2
s
4
1
2
prominent
38
1
4
3
2

2

4
2
2
Prometheus
2
Promethean
38
1
4
3
2
h
2
e
4
1
2
promethium
38
1
4
3
2

2
t
4
1
2
promenade
38
1
4
3
2

2
eiop
4
2
2
promulgate
2
prom
38
1
4
3
2
g
2

4
2
2
prolongate
2
prolong
38
1
4
3
2

2
n
4
1
2
prologue
38
1
4
3
2

2

4
2
2
prolific
2
proliferate
38
1
4
3
2

2
f
4
2
2
prolix
2
proline
38
1
4
3
2

2
io
4
3
2
prolusion
2
proletariat
2
prolate
38
1
4
3
2

2

4
2
2
Prokofieff
2
prokaryote
38
1
4
3
2
ect
2

4
3
2
projector
2
projectile
2
project
38
1
4
3
2

2

4
2
2
prohibitive
2
prohibition
38
1
4
3
2
ibit
2
i
4
2
2
prohibitory
2
prohibit
38
1
4
3
2

2

4
2
2
progressive
2
progression
38
1
4
3
2
ss
2
i
4
1
2
progress
38
1
4
3
2
m
2
m
4
2
2
programs
2
program
38
1
4
3
2

2
r
4
1
2
programmed
38
1
4
3
2

2
ae
4
0
38
1
4
3
2
os
2

4
2
2
prognosticate
2
prognosis
38
1
4
3
2
n
2

4
2
2
progeny
2
progenitor
38
1
4
3
2

2
enr
4
0
38
1
4
3
2

2

4
2
2
profusion
2
profuse
38
1
4
3
2

2
s
4
1
2
profundity
38
1
4
3
2

2
t
4
2
2
profile
2
proficient
38
1
4
3
2
r
2

4
2
2
professorial
2
professor
38
1
4
3
2
ss
2
o
4
2
2
profession
2
profess
38
1
4
3
2

2
eiu
4
5
2
profound
2
profligate
2
proffer
2
profane
2
Prof
38
1
4
3
2
c
2
eit
4
0
38
1
4
3
2
g
2

4
3
2
prodigy
2
prodigious
2
prodigal
38
1
4
3
2

2
iu
4
1
2
prod
38
1
4
3
2

2

4
2
2
proctor
2
Procter
38
1
4
3
2
ste
2

4
2
2
Procrustes
2
procrustean
38
1
4
3
2

2
u
4
2
2
procreate
2
procrastinate
38
1
4
3
2

2

4
2
2
proclamation
2
proclaim
38
1
4
3
2

2
a
4
1
2
proclivity
38
1
4
3
2
s
2
i
4
3
2
processed
2
processor
2
process
38
1
4
3
2
ur
2
e
4
1
2
procedural
38
1
4
3
2

2
ds
4
1
2
proceed
38
1
4
3
2

2
elrt
4
3
2
Procyon
2
procure
2
procaine
38
1
4
3
2
em
2

4
3
2
problems
2
problematic
2
problem
38
1
4
3
2

2
b
4
1
2
probate
38
1
4
3
2

2
al
4
1
2
probe
38
1
4
3
2

2
bcdfghjklmnoprstuvwx
4
1
2
pro
38
1
4
3
2
e
2

4
2
2
prizewinning
2
prize
38
1
4
3
2

2

4
2
2
private
2
privacy
38
1
4
3
2

2
a
4
3
2
privy
2
privilege
2
privet
38
1
4
3
2

2

4
2
2
prismatic
2
prism
38
1
4
3
2

2
m
4
4
2
pristine
2
prissy
2
prison
2
Priscilla
38
1
4
3
2
r
2

4
3
2
priory
2
priori
2
prior
38
1
4
3
2

2

4
3
2
printout
2
printmake
2
print
38
1
4
3
2

2
ei
4
0
38
1
4
3
2
p
2

4
3
2
principle
2
Principia
2
principal
38
1
4
3
2

2

4
3
2
Princeton
2
princess
2
prince
38
1
4
3
2

2
ct
4
0
38
1
4
3
2

2

4
3
2
primed
2
primeval
2
prime
38
1
4
3
2

2

4
5
2
primate
2
primary
2
primal
2
primacy
2
prima
38
1
4
3
2

2
ae
4
4
2
primrose
2
primp
2
primitive
2
prim
38
1
4
3
2

2

4
2
2
priggish
2
prig
38
1
4
3
2
st
2

4
2
2
Priestley
2
priest
38
1
4
3
2

2

4
2
2
prickle
2
prick
38
1
4
3
2

2
ke
4
0
38
1
4
3
2

2
cegmnosvz
4
3
2
Pritchard
2
pride
2
Priam
38
1
4
3
2
nti
2

4
2
2
preventive
2
prevention
38
1
4
3
2

2

4
2
2
prevalent
2
prevail
38
1
4
3
2

2
ae
4
1
2
previous
38
1
4
3
2

2

4
3
2
pretty
2
Pretoria
2
pretentious
38
1
4
3
2
ti
2

4
2
2
presumptive
2
presumption
38
1
4
3
2
m
2
p
4
2
2
presuming
2
presume
38
1
4
3
2

2

4
2
2
Preston
2
presto
38
1
4
3
2

2
g
4
1
2
prestidigitate
38
1
4
3
2

2

4
2
2
prestigious
2
prestige
38
1
4
3
2

2
io
4
0
38
1
4
3
2

2

4
2
2
pressure
2
press
38
1
4
3
2
t
2

4
2
2
presidential
2
president
38
1
4
3
2
de
2
n
4
1
2
preside
38
1
4
3
2

2
n
4
1
2
preservation
38
1
4
3
2
ipti
2

4
2
2
prescriptive
2
prescription
38
1
4
3
2

2
r
4
1
2
Prescott
38
1
4
3
2

2
ceistu
4
1
2
Presbyterian
38
1
4
3
2
dera
2

4
2
2
preponderate
2
preponderant
38
1
4
3
2

2
n
4
1
2
preposterous
38
1
4
3
2
t
2
i
4
1
2
preparatory
38
1
4
3
2

2

4
2
2
preparative
2
preparation
38
1
4
3
2
r
2
a
4
1
2
prepare
38
1
4
3
2

2
ao
4
1
2
prep
38
1
4
3
2

2
e
4
2
2
premium
2
premise
38
1
4
3
2
r
2

4
2
2
premiere
2
premier
38
1
4
3
2

2
i
4
1
2
premonition
38
1
4
3
2

2

4
2
2
prelude
2
preliminary
38
1
4
3
2

2

4
2
2
preferring
2
preferred
38
1
4
3
2
n
2

4
2
2
preferential
2
preference
38
1
4
3
2

2
er
4
1
2
prefer
38
1
4
3
2
t
2

4
2
2
prefecture
2
prefect
38
1
4
3
2

2
cr
4
0
38
1
4
3
2

2

4
2
2
prefatory
2
prefab
38
1
4
3
2

2
ae
4
0
38
1
4
3
2
pt
2
i
4
2
2
preemptor
2
preempt
38
1
4
3
2

2

4
2
2
preemptive
2
preemption
38
1
4
3
2

2
m
4
1
2
preen
38
1
4
3
2

2
at
4
0
38
1
4
3
2

2

4
2
2
predictor
2
predict
38
1
4
3
2

2

4
2
2
predicate
2
predicament
38
1
4
3
2

2
c
4
1
2
predilect
38
1
4
3
2

2
i
4
2
2
predecessor
2
predatory
38
1
4
3
2
ci
2

4
2
2
precocity
2
precocious
38
1
4
3
2

2

4
2
2
precision
2
precise
38
1
4
3
2

2

4
2
2
precipitate
2
precipitable
38
1
4
3
2

2
a
4
1
2
precipitous
38
1
4
3
2
i
2
t
4
1
2
precipice
38
1
4
3
2

2
ps
4
2
2
precious
2
precinct
38
1
4
3
2

2

4
3
2
precess
2
precept
2
precedent
38
1
4
3
2

2

4
2
2
precarious
2
Precambrian
38
1
4
3
2

2
aeio
4
1
2
preclude
38
1
4
3
2
ch
2

4
2
2
preachy
2
preach
38
1
4
3
2

2
acdeflmpstv
4
6
2
prey
2
prexy
2
prerogative
2
Prentice
2
prejudice
2
pregnant
38
1
4
3
2

2

4
2
2
prayerful
2
pray
38
1
4
3
2

2

4
2
2
prank
2
prance
38
1
4
3
2
e
2

4
2
2
praiseworthy
2
praise
38
1
4
3
2

2
s
4
1
2
prairie
38
1
4
3
2
ati
2
s
4
1
2
pragmatic
38
1
4
3
2

2

4
2
2
pragmatist
2
pragmatism
38
1
4
3
2

2
m
4
1
2
Prague
38
1
4
3
2
ti
2
c
4
2
2
practitioner
2
practise
38
1
4
3
2

2
a
4
1
2
practice
38
1
4
3
2

2

4
2
2
practical
2
practicable
38
1
4
3
2

2
cginy
4
6
2
Pravda
2
Pratt
2
praseodymium
2
pram
2
praecox
2
Prado
38
1
4
3
2

2
aeiou
4
2
2
pry
2
PR
38
1
4
3
2

2

4
3
2
powerhouse
2
powerful
2
power
38
1
4
3
2

2
r
4
1
2
Powell
38
1
4
3
2
er
2

4
3
2
powdery
2
powderpuff
2
powder
38
1
4
3
2

2
de
4
1
2
pow
38
1
4
3
2

2

4
2
2
pound
2
pounce
38
1
4
3
2
t
2

4
2
2
poultry
2
poultice
38
1
4
3
2

2
ln
4
4
2
pout
2
pour
2
Poughkeepsie
2
pouch
38
1
4
3
2

2

4
2
2
Potts
2
pottery
38
1
4
3
2

2

4
2
2
potentiometer
2
potential
38
1
4
3
2
nt
2
i
4
2
2
potentate
2
potent
38
1
4
3
2

2

4
2
2
potboil
2
potbelly
38
1
4
3
2
o
2

4
2
2
potatoes
2
potato
38
1
4
3
2

2

4
2
2
potassium
2
potash
38
1
4
3
2

2
st
4
1
2
potable
38
1
4
3
2

2
abet
4
6
2
potpourri
2
Potomac
2
potlatch
2
potion
2
pothole
2
pot
38
1
4
3
2

2

4
2
2
posture
2
postulate
38
1
4
3
2
ocess
2

4
2
2
postprocessor
2
postprocess
38
1
4
3
2

2

4
2
2
postposition
2
postpone
38
1
4
3
2

2
or
4
0
38
1
4
3
2

2

4
2
2
postorder
2
postoperative
38
1
4
3
2

2

4
3
2
postmaster
2
postmark
2
postman
38
1
4
3
2

2
a
4
3
2
postmultiply
2
postmortem
2
postmen
38
1
4
3
2
r
2

4
2
2
posteriori
2
posterior
38
1
4
3
2
ri
2
o
4
1
2
posterity
38
1
4
3
2

2

4
2
2
postcondition
2
postcard
38
1
4
3
2

2

4
2
2
postal
2
postage
38
1
4
3
2

2
acemopu
4
8
2
postwar
2
postscript
2
postlude
2
posthumous
2
postgraduate
2
postfix
2
postdoctoral
2
post
38
1
4
3
2

2
ms
4
1
2
posse
38
1
4
3
2

2

4
2
2
possessive
2
possession
38
1
4
3
2
s
2
i
4
2
2
possessor
2
possess
38
1
4
3
2

2

4
2
2
possemen
2
posseman
38
1
4
3
2

2
ei
4
1
2
possum
38
1
4
3
2

2

4
2
2
positive
2
position
38
1
4
3
2
t
2
i
4
2
2
positron
2
posit
38
1
4
3
2

2

4
4
2
posey
2
poseur
2
Poseidon
2
pose
38
1
4
3
2

2
eist
4
4
2
posy
2
Posner
2
posh
2
posable
38
1
4
3
2

2

4
2
2
Portuguese
2
Portugal
38
1
4
3
2

2
g
4
1
2
portulaca
38
1
4
3
2

2

4
2
2
portrayal
2
portray
38
1
4
3
2
t
2

4
2
2
portraiture
2
portrait
38
1
4
3
2
a
2
iy
4
0
38
1
4
3
2

2

4
2
2
portico
2
Portia
38
1
4
3
2

2

4
2
2
portentous
2
portent
38
1
4
3
2

2
t
4
1
2
portend
38
1
4
3
2

2
n
4
2
2
porterhouse
2
Porte
38
1
4
3
2

2

4
3
2
portable
2
portal
2
portage
38
1
4
3
2

2
aeiru
4
6
2
Portsmouth
2
Porto
2
portmanteau
2
portland
2
portfolio
2
port
38
1
4
3
2

2

4
2
2
porpoise
2
porphyry
38
1
4
3
2

2

4
2
2
porous
2
porosity
38
1
4
3
2
ograph
2

4
2
2
pornography
2
pornographer
38
1
4
3
2

2

4
4
2
porcupine
2
porcine
2
porch
2
porcelain
38
1
4
3
2

2
cnopt
4
3
2
porridge
2
pork
2
pore
38
1
4
3
2
s
2

4
2
2
populist
2
populism
38
1
4
3
2

2
t
4
2
2
popular
2
populace
38
1
4
3
2
l
2
ai
4
1
2
populous
38
1
4
3
2

2

4
2
2
poplin
2
poplar
38
1
4
3
2

2
lu
4
4
2
poppy
2
popish
2
pope
2
pop
38
1
4
3
2

2

4
2
2
Poole
2
pool
38
1
4
3
2

2
l
4
5
2
poor
2
poop
2
pooh
2
poodle
2
pooch
38
1
4
3
2
c
2

4
2
2
pontificate
2
pontific
38
1
4
3
2

2
i
4
1
2
pontiff
38
1
4
3
2

2
f
4
1
2
Pontiac
38
1
4
3
2

2
i
4
1
2
pont
38
1
4
3
2
r
2

4
2
2
ponderous
2
ponder
38
1
4
3
2

2
e
4
1
2
pond
38
1
4
3
2

2
h
4
1
2
Ponce
38
1
4
3
2

2

4
2
2
poncho
2
Ponchartrain
38
1
4
3
2

2
cdt
4
2
2
pony
2
pong
38
1
4
3
2

2

4
3
2
pompous
2
pomposity
2
pompon
38
1
4
3
2

2

4
2
2
pompey
2
Pompeii
38
1
4
3
2

2

4
2
2
pompano
2
pompadour
38
1
4
3
2

2
aeo
4
1
2
pomp
38
1
4
3
2

2
p
4
3
2
Pomona
2
pomegranate
2
pomade
38
1
4
3
2

2

4
3
2
polytypy
2
polytope
2
polytechnic
38
1
4
3
2

2

4
2
2
polyphony
2
Polyphemus
38
1
4
3
2

2
h
4
1
2
polyploidy
38
1
4
3
2
rph
2

4
2
2
polymorphic
2
polymorph
38
1
4
3
2
r
2

4
3
2
polymeric
2
polymerase
2
polymer
38
1
4
3
2

2
eo
4
0
38
1
4
3
2
dr
2
a
4
1
2
polyhedron
38
1
4
3
2

2

4
2
2
polyhedral
2
polyhedra
38
1
4
3
2

2
e
4
1
2
Polyhymnia
38
1
4
3
2
n
2

4
2
2
polygonal
2
polygon
38
1
4
3
2

2
o
4
1
2
polygynous
38
1
4
3
2

2
ghmpt
4
2
2
polysaccharide
2
polynomial
38
1
4
3
2

2

4
2
2
polonium
2
polonaise
38
1
4
3
2

2
n
4
2
2
polopony
2
polo
38
1
4
3
2

2

4
3
2
pollution
2
pollute
2
pollutant
38
1
4
3
2

2
t
4
1
2
Pollux
38
1
4
3
2

2

4
2
2
polloi
2
pollock
38
1
4
3
2

2
ou
4
4
2
pollinate
2
pollen
2
Pollard
2
poll
38
1
4
3
2

2

4
2
2
polkadot
2
polka
38
1
4
3
2

2
a
4
1
2
Polk
38
1
4
3
2
c
2

4
6
2
politics
2
political
2
politico
2
politicking
2
politician
2
politic
38
1
4
3
2

2
i
4
3
2
polity
2
polite
2
Politburo
38
1
4
3
2

2

4
2
2
polish
2
polis
38
1
4
3
2

2

4
2
2
poliomyelitis
2
polio
38
1
4
3
2

2
e
4
2
2
policies
2
policy
38
1
4
3
2

2
m
4
1
2
police
38
1
4
3
2

2

4
2
2
policemen
2
policeman
38
1
4
3
2

2
cost
4
0
38
1
4
3
2

2

4
3
2
polemic
2
polecat
2
pole
38
1
4
3
2
ra
2
p
4
1
2
polarogram
38
1
4
3
2
h
2

4
2
2
polarography
2
polarograph
38
1
4
3
2

2
g
4
2
2
polaron
2
Polaroid
38
1
4
3
2

2

4
2
2
polariscope
2
Polaris
38
1
4
3
2

2
s
4
2
2
polariton
2
polarimeter
38
1
4
3
2

2
io
4
1
2
polar
38
1
4
3
2

2
r
4
1
2
Poland
38
1
4
3
2

2
aeikloy
4
1
2
pol
38
1
4
3
2
e
2

4
2
2
pokerface
2
poke
38
1
4
3
2
n
2

4
2
2
poisonous
2
poison
38
1
4
3
2

2
o
4
2
2
Poisson
2
poise
38
1
4
3
2

2

4
3
2
points
2
pointwise
2
point
38
1
4
3
2

2
t
4
2
2
poinsettia
2
Poincare
38
1
4
3
2

2
ns
4
2
2
poignant
2
poi
38
1
4
3
2

2

4
2
2
pogrom
2
pogo
38
1
4
3
2

2

4
3
2
poetry
2
poetic
2
poet
38
1
4
3
2

2
t
4
3
2
poesy
2
poem
2
Poe
38
1
4
3
2

2

4
2
2
podium
2
podia
38
1
4
3
2

2
i
4
2
2
podge
2
pod
38
1
4
3
2
et
2

4
3
2
pocketful
2
pocketbook
2
pocket
38
1
4
3
2

2
k
4
1
2
Pocono
38
1
4
3
2

2
cdegiklmnoprstuw
4
5
2
Poynting
2
poverty
2
POBox
2
poach
2
Po
38
1
4
3
2

2

4
2
2
pneumonia
2
pneumococcus
38
1
4
3
2
eum
2
o
4
1
2
pneumatic
38
1
4
3
2

2

4
4
2
plywood
2
plyscore
2
Plymouth
2
ply
38
1
4
3
2

2

4
2
2
plutonium
2
pluton
38
1
4
3
2

2
n
4
1
2
Pluto
38
1
4
3
2

2
o
4
1
2
Plutarch
38
1
4
3
2

2

4
2
2
plushy
2
plush
38
1
4
3
2

2
h
4
1
2
plus
38
1
4
3
2

2

4
3
2
plunk
2
plunge
2
plunder
38
1
4
3
2

2

4
2
2
plumbate
2
plumbago
38
1
4
3
2

2
a
4
1
2
plumb
38
1
4
3
2

2
b
4
5
2
plump
2
plummet
2
plume
2
plumage
2
plum
38
1
4
3
2

2

4
2
2
plugging
2
pluggable
38
1
4
3
2

2
g
4
2
2
plugboard
2
plug
38
1
4
3
2
k
2

4
2
2
plucky
2
pluck
38
1
4
3
2

2
cgmnst
4
2
2
plural
2
pluperfect
38
1
4
3
2

2

4
3
2
plowshare
2
plowman
2
plow
38
1
4
3
2

2
w
4
4
2
plover
2
plot
2
plop
2
plod
38
1
4
3
2

2

4
2
2
pliant
2
pliable
38
1
4
3
2

2
a
4
3
2
Pliocene
2
Pliny
2
plight
38
1
4
3
2
ra
2

4
2
2
pleural
2
pleura
38
1
4
3
2

2

4
2
2
plenty
2
plentiful
38
1
4
3
2

2

4
2
2
plenitude
2
plenipotentiary
38
1
4
3
2

2
it
4
2
2
plenum
2
plenary
38
1
4
3
2

2

4
2
2
Pleistocene
2
Pleiades
38
1
4
3
2

2

4
2
2
plebian
2
plebeian
38
1
4
3
2

2
s
4
3
2
pleat
2
plead
2
plea
38
1
4
3
2

2
e
4
2
2
pleasure
2
pleasant
38
1
4
3
2

2
abinu
4
3
2
Plexiglas
2
plethora
2
pledge
38
1
4
3
2
ri
2

4
2
2
playwriting
2
playwright
38
1
4
3
2

2

4
2
2
playboy
2
playback
38
1
4
3
2

2
bwe
4
11
2
playing
2
plays
2
playtime
2
playroom
2
playoff
2
playmate
2
playhouse
2
playground
2
playful
2
playa
2
play
38
1
4
3
2

2

4
2
2
Platonist
2
Platonism
38
1
4
3
2
i
2
s
4
1
2
platonic
38
1
4
3
2

2
n
4
2
2
platoon
2
Plato
38
1
4
3
2
ud
2

4
2
2
platitudinous
2
platitude
38
1
4
3
2

2
t
4
1
2
platinum
38
1
4
3
2

2

4
4
2
platen
2
platelet
2
plateau
2
plate
38
1
4
3
2

2
eio
4
4
2
platypus
2
Platte
2
platform
2
plat
38
1
4
3
2

2

4
2
2
plastisol
2
plastic
38
1
4
3
2

2
i
4
2
2
plastron
2
plaster
38
1
4
3
2

2

4
3
2
plasmon
2
plasma
2
plasm
38
1
4
3
2

2
mt
4
0
38
1
4
3
2

2

4
2
2
plantation
2
plantain
38
1
4
3
2

2
a
4
2
2
plants
2
plant
38
1
4
3
2
con
2

4
2
2
planoconvex
2
planoconcave
38
1
4
3
2

2

4
2
2
plankton
2
plank
38
1
4
3
2

2

4
2
2
planetarium
2
planetaria
38
1
4
3
2
r
2
i
4
1
2
planetary
38
1
4
3
2

2
a
4
3
2
planetoid
2
planetesimal
2
planet
38
1
4
3
2

2
t
4
2
2
planeload
2
plane
38
1
4
3
2

2
ekotn
4
4
2
plans
2
Planck
2
planar
2
plan
38
1
4
3
2
i
2

4
2
2
plaintive
2
plaintiff
38
1
4
3
2

2
t
4
2
2
Plainfield
2
plain
38
1
4
3
2

2
n
4
1
2
plaid
38
1
4
3
2
e
2

4
2
2
plaguey
2
plague
38
1
4
3
2

2
a
4
1
2
plagioclase
38
1
4
3
2
ris
2

4
2
2
plagiarist
2
plagiarism
38
1
4
3
2

2
iu
4
0
38
1
4
3
2

2
ae
4
1
2
placid
38
1
4
3
2
ta
2

4
2
2
placental
2
placenta
38
1
4
3
2

2
n
4
5
2
places
2
placeholder
2
placebo
2
placeable
2
place
38
1
4
3
2
te
2

4
2
2
placater
2
placate
38
1
4
3
2

2
cginsty
4
3
2
plaza
2
plausible
2
plaque
38
1
4
3
2

2
aeiouy
4
1
2
Pl
38
1
4
3
2
z
2

4
2
2
pizzicato
2
pizza
38
1
4
3
2

2

4
2
2
pixy
2
pixel
38
1
4
3
2
ot
2

4
2
2
pivotal
2
pivot
38
1
4
3
2

2

4
3
2
Pittston
2
Pittsfield
2
Pittsburgh
38
1
4
3
2

2
s
4
1
2
Pitt
38
1
4
3
2

2

4
2
2
pitiful
2
pitiable
38
1
4
3
2

2

4
2
2
pithy
2
pith
38
1
4
3
2
h
2

4
4
2
pitchstone
2
pitchfork
2
pitchblende
2
pitch
38
1
4
3
2

2
chit
4
7
2
pity
2
pituitary
2
Pitney
2
pitman
2
pitfall
2
piteous
2
pit
38
1
4
3
2

2

4
2
2
pistole
2
pistol
38
1
4
3
2

2
l
4
1
2
piston
38
1
4
3
2

2
o
4
1
2
pistachio
38
1
4
3
2

2

4
2
2
Pisces
2
Piscataway
38
1
4
3
2

2
ct
4
1
2
piss
38
1
4
3
2

2

4
2
2
pirouette
2
pirogue
38
1
4
3
2

2

4
3
2
pirate
2
Piraeus
2
piracy
38
1
4
3
2

2
ao
4
0
38
1
4
3
2
u
2

4
2
2
pique
2
piquant
38
1
4
3
2

2

4
3
2
pipette
2
pipeline
2
pipe
38
1
4
3
2

2
e
4
2
2
pipsissewa
2
pip
38
1
4
3
2

2

4
2
2
pioneer
2
pion
38
1
4
3
2

2
n
4
2
2
pious
2
Piotr
38
1
4
3
2

2

4
3
2
pinto
2
pintail
2
pint
38
1
4
3
2

2

4
2
2
Pinsky
2
pinscher
38
1
4
3
2
a
2

4
2
2
pinnate
2
pinnacle
38
1
4
3
2

2

4
2
2
pinkish
2
pinkie
38
1
4
3
2

2
i
4
1
2
pink
38
1
4
3
2

2

4
2
2
pinhole
2
pinhead
38
1
4
3
2

2

4
3
2
Pinehurst
2
pineapple
2
pine
38
1
4
3
2

2

4
2
2
pincushion
2
pinch
38
1
4
3
2

2
cehknst
4
9
2
pinxter
2
pinwheel
2
pinpoint
2
pinochle
2
pinion
2
ping
2
pinball
2
pinafore
2
pin
38
1
4
3
2
p
2

4
2
2
pimple
2
pimp
38
1
4
3
2

2

4
2
2
pillow
2
pillory
38
1
4
3
2

2

4
2
2
pillar
2
pillage
38
1
4
3
2

2
ao
4
2
2
Pillsbury
2
pill
38
1
4
3
2
rim
2

4
2
2
pilgrimage
2
pilgrim
38
1
4
3
2
er
2

4
2
2
pilferage
2
pilfer
38
1
4
3
2

2

4
2
2
pilewort
2
pile
38
1
4
3
2

2
efgl
4
2
2
pilot
2
Pilate
38
1
4
3
2
ent
2

4
2
2
pigmentation
2
pigment
38
1
4
3
2

2

4
2
2
piggish
2
pigging
38
1
4
3
2

2
i
4
1
2
piggy
38
1
4
3
2
on
2

4
4
2
pigeonhole
2
pigeonfoot
2
pigeonberry
2
pigeon
38
1
4
3
2

2
egm
4
5
2
pigtail
2
pigskin
2
pigroot
2
pigpen
2
pig
38
1
4
3
2

2

4
2
2
piety
2
pietism
38
1
4
3
2

2

4
4
2
Pierson
2
Pierre
2
pierce
2
pier
38
1
4
3
2
e
2

4
3
2
piecewise
2
piecemeal
2
piece
38
1
4
3
2

2
crt
4
3
2
piezoelectric
2
Piedmont
2
pie
38
1
4
3
2

2

4
2
2
pidgin
2
piddle
38
1
4
3
2
re
2

4
2
2
picturesque
2
picture
38
1
4
3
2

2
u
4
1
2
pictorial
38
1
4
3
2

2

4
3
2
picosecond
2
picojoule
2
picofarad
38
1
4
3
2

2

4
2
2
picnicker
2
picnicked
38
1
4
3
2

2
e
4
1
2
picnicking
38
1
4
3
2
ic
2
k
4
1
2
picnic
38
1
4
3
2

2

4
2
2
Pickett
2
picket
38
1
4
3
2

2

4
2
2
Pickering
2
pickerel
38
1
4
3
2

2
rt
4
0
38
1
4
3
2

2
e
4
8
2
picky
2
pickup
2
pickoff
2
Pickman
2
pickle
2
Pickford
2
pickaxe
2
pick
38
1
4
3
2

2

4
2
2
piccolo
2
Piccadilly
38
1
4
3
2

2

4
3
2
picayune
2
Picasso
2
pica
38
1
4
3
2

2
acknot
4
0
38
1
4
3
2

2
i
4
1
2
piano
38
1
4
3
2
s
2

4
2
2
pianist
2
pianissimo
38
1
4
3
2

2
n
4
1
2
piazza
38
1
4
3
2

2
acdeglmnopqrstvxz
4
3
2
Pius
2
pike
2
pi
38
1
4
3
2
herap
2

4
2
2
physiotherapy
2
physiotherapist
38
1
4
3
2

2
t
4
3
2
physiology
2
physiognomy
2
physiochemical
38
1
4
3
2

2

4
2
2
physician
2
physic
38
1
4
3
2
i
2
co
4
2
2
physique
2
Physik
38
1
4
3
2

2

4
3
2
phylogeny
2
Phyllis
2
phyla
38
1
4
3
2

2
ls
4
2
2
phytoplankton
2
phycomycetes
38
1
4
3
2
ase
2

4
3
2
phraseology
2
phrasemake
2
phrase
38
1
4
3
2
y
2

4
2
2
photolytic
2
photolysis
38
1
4
3
2

2

4
2
2
photography
2
photogenic
38
1
4
3
2
o
2
gl
4
3
2
photon
2
photometry
2
photo
38
1
4
3
2
sce
2

4
2
2
phosphorescent
2
phosphoresce
38
1
4
3
2
r
2
e
4
4
2
phosphorylate
2
phosphorus
2
phosphoric
2
phosphor
38
1
4
3
2

2

4
2
2
phosphine
2
phosphide
38
1
4
3
2
h
2
io
4
1
2
phosphate
38
1
4
3
2

2
p
4
1
2
phosgene
38
1
4
3
2

2

4
3
2
phonon
2
phonology
2
phonograph
38
1
4
3
2

2

4
2
2
phonemic
2
phoneme
38
1
4
3
2

2
m
4
2
2
phonetic
2
phone
38
1
4
3
2

2
eo
4
3
2
phony
2
phonic
2
phon
38
1
4
3
2
i
2

4
2
2
phoenix
2
Phoenicia
38
1
4
3
2

2
n
4
1
2
phoebe
38
1
4
3
2

2
enst
4
1
2
phobic
38
1
4
3
2
o
2

4
2
2
phlox
2
phloem
38
1
4
3
2
oph
2

4
3
2
philosophy
2
philosophic
2
philosoph
38
1
4
3
2

2
s
4
2
2
philology
2
philodendron
38
1
4
3
2

2

4
2
2
Philippine
2
Philip
38
1
4
3
2

2
p
4
1
2
Philistine
38
1
4
3
2
throp
2

4
3
2
philanthropy
2
philanthropic
2
philanthrope
38
1
4
3
2

2
n
4
1
2
Philadelphia
38
1
4
3
2

2
aio
4
3
2
Phillip
2
philharmonic
2
Phil
38
1
4
3
2

2
l
4
2
2
Phipps
2
phi
38
1
4
3
2
l
2

4
2
2
phenylalanine
2
phenyl
38
1
4
3
2

2
lm
4
1
2
phenotype
38
1
4
3
2

2

4
2
2
phenomenon
2
phenomenology
38
1
4
3
2

2

4
2
2
phenomenal
2
phenomena
38
1
4
3
2
en
2
ao
4
0
38
1
4
3
2

2

4
2
2
phenolic
2
phenol
38
1
4
3
2

2
oy
4
0
38
1
4
3
2

2
n
4
2
2
Phelps
2
pheasant
38
1
4
3
2

2
glnr
4
1
2
phase
38
1
4
3
2

2

4
2
2
pharmacopoeia
2
pharmacology
38
1
4
3
2
mac
2
o
4
3
2
pharmacy
2
pharmacist
2
pharmaceutic
38
1
4
3
2
t
2

4
2
2
phantom
2
phantasy
38
1
4
3
2

2

4
2
2
phalanx
2
phalanger
38
1
4
3
2
a
2
n
4
1
2
phalarope
38
1
4
3
2

2

4
2
2
phagocyte
2
phage
38
1
4
3
2

2
aeilory
4
2
2
phthalate
2
PhD
38
1
4
3
2

2

4
2
2
Pfizer
2
pfennig
38
1
4
3
2

2

4
3
2
pewter
2
pewee
2
pew
38
1
4
3
2

2

4
2
2
petunia
2
petulant
38
1
4
3
2

2

4
2
2
petty
2
petticoat
38
1
4
3
2

2

4
3
2
petrology
2
petroleum
2
petrol
38
1
4
3
2

2
l
4
2
2
petroglyph
2
petrochemical
38
1
4
3
2

2

4
2
2
petrify
2
petri
38
1
4
3
2

2
io
4
1
2
petrel
38
1
4
3
2
t
2

4
3
2
petition
2
petite
2
petit
38
1
4
3
2
s
2

4
3
2
Peterson
2
Petersen
2
Petersburg
38
1
4
3
2

2
r
4
1
2
Pete
38
1
4
3
2

2
eirtu
4
3
2
pets
2
petal
2
pet
38
1
4
3
2
ent
2

4
2
2
pestilential
2
pestilent
38
1
4
3
2

2
l
4
1
2
pesticide
38
1
4
3
2

2
i
4
3
2
pestle
2
peste
2
pest
38
1
4
3
2
im
2
i
4
2
2
pessimum
2
pessimal
38
1
4
3
2
s
2

4
2
2
pessimist
2
pessimism
38
1
4
3
2

2
st
4
0
38
1
4
3
2

2

4
2
2
perversion
2
perverse
38
1
4
3
2
r
2
s
4
1
2
pervert
38
1
4
3
2

2
s
4
1
2
pervade
38
1
4
3
2
i
2

4
2
2
pervasive
2
pervasion
38
1
4
3
2

2
ae
4
0
38
1
4
3
2

2

4
2
2
peruse
2
perusal
38
1
4
3
2

2
s
4
2
2
Peruvian
2
Peru
38
1
4
3
2
rb
2

4
2
2
perturbate
2
perturb
38
1
4
3
2
n
2

4
2
2
pertinent
2
pertinacious
38
1
4
3
2

2
iu
4
3
2
Perth
2
pertain
2
pert
38
1
4
3
2
i
2

4
2
2
persuasive
2
persuasion
38
1
4
3
2
a
2
s
4
1
2
persuade
38
1
4
3
2

2

4
2
2
perspire
2
perspiration
38
1
4
3
2

2
u
4
1
2
perspicacious
38
1
4
3
2

2

4
2
2
perspicuous
2
perspicuity
38
1
4
3
2

2
cr
4
0
38
1
4
3
2

2
i
4
1
2
perspective
38
1
4
3
2

2
l
4
2
2
personage
2
persona
38
1
4
3
2
n
2
a
4
3
2
personnel
2
personify
2
person
38
1
4
3
2
t
2

4
2
2
persistent
2
persist
38
1
4
3
2

2
s
4
3
2
persimmon
2
persiflage
2
Persia
38
1
4
3
2

2
cv
4
1
2
Perseus
38
1
4
3
2
er
2

4
2
2
persevere
2
perseverant
38
1
4
3
2
ut
2

4
3
2
persecutory
2
persecution
2
persecute
38
1
4
3
2

2
eiopu
4
1
2
Pershing
38
1
4
3
2

2
t
4
1
2
perpendicular
38
1
4
3
2

2

4
2
2
perpetuate
2
perpetual
38
1
4
3
2

2
a
4
1
2
perpetuity
38
1
4
3
2

2
u
4
1
2
perpetrate
38
1
4
3
2

2
e
4
1
2
perplex
38
1
4
3
2
t
2

4
2
2
permute
2
permutation
38
1
4
3
2

2

4
2
2
permitting
2
permitted
38
1
4
3
2

2
t
4
1
2
permit
38
1
4
3
2
si
2

4
3
2
permissive
2
permission
2
permissible
38
1
4
3
2

2
st
4
1
2
Permian
38
1
4
3
2
a
2

4
2
2
permeate
2
permeable
38
1
4
3
2

2

4
2
2
permanent
2
permalloy
38
1
4
3
2

2
aeiu
4
0
38
1
4
3
2

2

4
3
2
perky
2
Perkins
2
perk
38
1
4
3
2
ur
2

4
2
2
perjury
2
perjure
38
1
4
3
2

2

4
2
2
perish
2
periscope
38
1
4
3
2
r
2

4
2
2
periphery
2
peripheral
38
1
4
3
2

2
e
4
1
2
periphrastic
38
1
4
3
2

2
h
4
1
2
peripatetic
38
1
4
3
2
d
2

4
2
2
periodic
2
period
38
1
4
3
2

2

4
3
2
perilous
2
Perilla
2
peril
38
1
4
3
2
le
2

4
2
2
Pericles
2
Periclean
38
1
4
3
2

2
clops
4
5
2
periwinkle
2
peritectic
2
perimeter
2
perihelion
2
peridotite
38
1
4
3
2
e
2

4
2
2
perfumery
2
perfume
38
1
4
3
2

2
m
4
2
2
perfusion
2
perfunctory
38
1
4
3
2

2
a
4
1
2
perform
38
1
4
3
2
r
2
m
4
2
2
perforce
2
perforate
38
1
4
3
2
d
2

4
2
2
perfidy
2
perfidious
38
1
4
3
2
ct
2

4
2
2
perfectible
2
perfect
38
1
4
3
2

2
eiou
4
0
38
1
4
3
2

2

4
4
2
perestroika
2
Perez
2
perennial
2
peremptory
38
1
4
3
2
ssi
2

4
2
2
percussive
2
percussion
38
1
4
3
2

2

4
3
2
perchlorate
2
perchance
2
perch
38
1
4
3
2

2
np
4
1
2
perceive
38
1
4
3
2

2

4
3
2
perceptive
2
perception
2
perceptible
38
1
4
3
2
t
2
i
4
2
2
perceptual
2
percept
38
1
4
3
2
t
2

4
3
2
percentile
2
percentage
2
percent
38
1
4
3
2

2
ehu
4
3
2
Percy
2
percolate
2
Percival
38
1
4
3
2

2
cefijkmpstuv
4
9
2
Perry
2
perquisite
2
peroxide
2
pernicious
2
Perle
2
perhaps
2
Pergamon
2
perdition
2
per
38
1
4
3
2
i
2

4
2
2
PepsiCo
2
Pepsi
38
1
4
3
2
r
2

4
4
2
peppery
2
pepperoni
2
peppermint
2
peppergrass
38
1
4
3
2

2
e
4
1
2
peppy
38
1
4
3
2

2
ps
4
2
2
peptide
2
pep
38
1
4
3
2

2

4
3
2
Peoria
2
people
2
peony
38
1
4
3
2

2

4
2
2
penury
2
penurious
38
1
4
3
2

2
r
4
2
2
penumbra
2
penultimate
38
1
4
3
2
cost
2

4
2
2
pentecostal
2
Pentecost
38
1
4
3
2

2
o
4
1
2
pentagram
38
1
4
3
2
n
2

4
2
2
pentagonal
2
pentagon
38
1
4
3
2

2
g
4
1
2
pentane
38
1
4
3
2

2
ae
4
2
2
penthouse
2
pent
38
1
4
3
2

2

4
2
2
pensive
2
pension
38
1
4
3
2

2
i
4
1
2
Pensacola
38
1
4
3
2

2

4
2
2
pennyroyal
2
penny
38
1
4
3
2

2

4
2
2
pennant
2
penna
38
1
4
3
2

2
ay
4
2
2
Pennsylvania
2
Penn
38
1
4
3
2

2

4
2
2
penmen
2
penman
38
1
4
3
2
a
2

4
2
2
penitentiary
2
penitential
38
1
4
3
2
ent
2
i
4
1
2
penitent
38
1
4
3
2

2
t
4
3
2
penis
2
peninsula
2
penicillin
38
1
4
3
2
ra
2

4
2
2
penetrate
2
penetrable
38
1
4
3
2

2
t
4
1
2
Penelope
38
1
4
3
2

2

4
3
2
pendulum
2
pendant
2
pend
38
1
4
3
2

2

4
3
2
pencil
2
penchant
2
pence
38
1
4
3
2

2

4
2
2
penalty
2
penal
38
1
4
3
2

2
l
4
2
2
penates
2
penance
38
1
4
3
2

2
acdeimnstu
4
4
2
Penrose
2
Penh
2
penguin
2
pen
38
1
4
3
2

2

4
2
2
pemmican
2
Pembroke
38
1
4
3
2
i
2

4
2
2
pelvis
2
pelvic
38
1
4
3
2

2

4
2
2
peltry
2
pelt
38
1
4
3
2

2

4
2
2
pellet
2
pellagra
38
1
4
3
2

2
ltv
4
2
2
pelican
2
Pelham
38
1
4
3
2

2

4
2
2
Peggy
2
pegging
38
1
4
3
2

2
g
4
3
2
pegboard
2
Pegasus
2
peg
38
1
4
3
2

2

4
3
2
peepy
2
peephole
2
peep
38
1
4
3
2

2
p
4
4
2
peer
2
peel
2
peek
2
pee
38
1
4
3
2
tric
2

4
2
2
pediatrician
2
pediatric
38
1
4
3
2

2
a
4
2
2
pediment
2
pedigree
38
1
4
3
2
st
2

4
2
2
pedestrian
2
pedestal
38
1
4
3
2

2
gn
4
1
2
pedal
38
1
4
3
2
t
2

4
3
2
pedantry
2
pedantic
2
pedant
38
1
4
3
2
og
2

4
3
2
pedagogy
2
pedagogue
2
pedagogic
38
1
4
3
2

2
aei
4
2
2
Pedro
2
peddle
38
1
4
3
2

2

4
2
2
peculiar
2
peculate
38
1
4
3
2

2
l
4
1
2
pecuniary
38
1
4
3
2
oral
2

4
2
2
pectoralis
2
pectoral
38
1
4
3
2

2
tu
4
4
2
Pecos
2
peck
2
peccary
2
pecan
38
1
4
3
2

2
cklrs
4
5
2
peat
2
peanut
2
peafowl
2
Peabody
2
pea
38
1
4
3
2

2

4
2
2
Pease
2
peasant
38
1
4
3
2

2

4
3
2
pearlstone
2
pearlite
2
pearl
38
1
4
3
2

2
l
4
3
2
Pearson
2
Pearce
2
pear
38
1
4
3
2

2

4
2
2
Peale
2
peal
38
1
4
3
2

2

4
2
2
peaky
2
peak
38
1
4
3
2

2

4
2
2
Peachtree
2
peach
38
1
4
3
2

2

4
5
2
peacetime
2
peacemake
2
peaceful
2
peaceable
2
peace
38
1
4
3
2

2
eh
4
1
2
peacock
38
1
4
3
2

2
acdeglmnoprstw
4
4
2
Peugeot
2
Peking
2
pejorative
2
pebble
38
1
4
3
2

2

4
7
2
payroll
2
payoff
2
Payne
2
paymaster
2
payday
2
paycheck
2
pay
38
1
4
3
2

2

4
2
2
pawnshop
2
pawn
38
1
4
3
2

2
n
4
2
2
Pawtucket
2
paw
38
1
4
3
2

2

4
4
2
Pavlov
2
pavilion
2
pave
2
pavanne
38
1
4
3
2
ch
2

4
2
2
paunchy
2
paunch
38
1
4
3
2

2

4
2
2
Paulson
2
Paulsen
38
1
4
3
2

2

4
2
2
Pauline
2
Pauli
38
1
4
3
2

2
is
4
5
2
Paulus
2
Paulo
2
Paulette
2
Paula
2
Paul
38
1
4
3
2

2
ln
4
3
2
pause
2
pauper
2
paucity
38
1
4
3
2
r
2

4
2
2
Patterson
2
pattern
38
1
4
3
2

2
e
4
3
2
patty
2
Patton
2
Patti
38
1
4
3
2

2

4
3
2
patroness
2
patronage
2
patron
38
1
4
3
2

2
lm
4
1
2
patrol
38
1
4
3
2

2

4
2
2
patrolmen
2
patrolman
38
1
4
3
2

2

4
2
2
patrolling
2
patrolled
38
1
4
3
2

2
ln
4
0
38
1
4
3
2

2
acmo
4
1
2
patristic
38
1
4
3
2
t
2

4
2
2
patriotic
2
patriot
38
1
4
3
2
on
2

4
2
2
patrimony
2
patrimonial
38
1
4
3
2
a
2

4
2
2
patrician
2
Patricia
38
1
4
3
2

2
i
4
2
2
Patrick
2
Patrice
38
1
4
3
2
rch
2

4
3
2
patriarchy
2
patriarchal
2
patriarch
38
1
4
3
2

2
io
4
0
38
1
4
3
2

2

4
3
2
patio
2
patina
2
patient
38
1
4
3
2
en
2

4
3
2
pathogenic
2
pathogenesis
2
pathogen
38
1
4
3
2

2
g
4
2
2
pathos
2
pathology
38
1
4
3
2

2
o
4
3
2
pathway
2
pathetic
2
path
38
1
4
3
2

2

4
2
2
paternoster
2
paternal
38
1
4
3
2

2
n
4
2
2
Paterson
2
pater
38
1
4
3
2
t
2

4
2
2
patentee
2
patent
38
1
4
3
2

2
nr
4
1
2
pate
38
1
4
3
2
h
2

4
3
2
patchy
2
patchwork
2
patch
38
1
4
3
2

2
cehirt
4
3
2
Patsy
2
Patagonia
2
pat
38
1
4
3
2
r
2

4
2
2
pastoral
2
pastor
38
1
4
3
2

2

4
2
2
pastime
2
pastiche
38
1
4
3
2

2

4
2
2
Pasteur
2
pasteup
38
1
4
3
2

2
u
4
3
2
pastel
2
pasteboard
2
paste
38
1
4
3
2

2
eiou
4
3
2
pasty
2
pastry
2
past
38
1
4
3
2

2

4
2
2
passive
2
passivate
38
1
4
3
2
n
2

4
2
2
passionate
2
passion
38
1
4
3
2

2
ov
4
1
2
passing
38
1
4
3
2

2

4
4
2
passed
2
passerby
2
passenger
2
passe
38
1
4
3
2
e
2

4
2
2
passageway
2
passage
38
1
4
3
2

2
g
4
1
2
Passaic
38
1
4
3
2

2
aei
4
5
2
password
2
passport
2
Passover
2
passband
2
pass
38
1
4
3
2

2

4
2
2
paschal
2
Pascal
38
1
4
3
2

2
cst
4
3
2
Paso
2
pasha
2
Pasadena
38
1
4
3
2
la
2
r
4
1
2
particulate
38
1
4
3
2
p
2
a
4
1
2
participle
38
1
4
3
2

2

4
2
2
participate
2
participant
38
1
4
3
2

2
iu
4
1
2
particle
38
1
4
3
2

2
c
4
3
2
partition
2
partisan
2
partial
38
1
4
3
2

2
i
4
8
2
parts
2
party
2
partridge
2
partook
2
partner
2
Parthenon
2
partake
2
part
38
1
4
3
2
n
2

4
2
2
parsonage
2
parson
38
1
4
3
2
on
2

4
2
2
parsimony
2
parsimonious
38
1
4
3
2

2
m
4
1
2
Parsifal
38
1
4
3
2

2
ioe
4
2
2
parsnip
2
parsley
38
1
4
3
2

2

4
4
2
parry
2
parrot
2
Parrish
2
Parr
38
1
4
3
2
e
2

4
2
2
parolee
2
parole
38
1
4
3
2

2
l
4
2
2
parody
2
parochial
38
1
4
3
2
r
2

4
2
2
parliamentary
2
parliamentarian
38
1
4
3
2
ament
2
a
4
1
2
parliament
38
1
4
3
2

2

4
2
2
parlay
2
parlance
38
1
4
3
2

2
ai
4
1
2
parley
38
1
4
3
2

2

4
2
2
parkish
2
Parkinson
38
1
4
3
2

2
i
4
4
2
parkway
2
parkland
2
Parke
2
park
38
1
4
3
2

2

4
2
2
parishioner
2
parish
38
1
4
3
2

2
h
4
2
2
Parisian
2
Paris
38
1
4
3
2

2
s
4
2
2
parimutuel
2
pariah
38
1
4
3
2

2

4
2
2
parenthesis
2
parentheses
38
1
4
3
2
e
2
s
4
1
2
parenthetic
38
1
4
3
2

2

4
2
2
parental
2
parentage
38
1
4
3
2
t
2
ah
4
1
2
parent
38
1
4
3
2

2
n
4
3
2
Pareto
2
paregoric
2
pare
38
1
4
3
2

2

4
2
2
parch
2
parcel
38
1
4
3
2
t
2

4
2
2
parasitic
2
parasite
38
1
4
3
2

2
i
4
2
2
parasympathetic
2
parasol
38
1
4
3
2

2

4
2
2
paraphrase
2
paraphernalia
38
1
4
3
2

2
h
4
2
2
parapsychology
2
parapet
38
1
4
3
2

2
a
4
1
2
paranoid
38
1
4
3
2

2

4
2
2
paranoiac
2
paranoia
38
1
4
3
2
o
2
i
4
1
2
paranormal
38
1
4
3
2
gnet
2

4
2
2
paramagnetic
2
paramagnet
38
1
4
3
2

2
a
4
4
2
Paramus
2
paramount
2
paramilitary
2
parameter
38
1
4
3
2
l
2

4
2
2
parallelepiped
2
parallel
38
1
4
3
2

2
e
4
1
2
parallax
38
1
4
3
2

2
l
4
2
2
paralysis
2
paralinguistic
38
1
4
3
2
n
2

4
2
2
paragonite
2
paragon
38
1
4
3
2

2
o
4
2
2
Paraguay
2
paragraph
38
1
4
3
2
x
2

4
2
2
paradoxic
2
paradox
38
1
4
3
2
m
2

4
2
2
paradigmatic
2
paradigm
38
1
4
3
2

2
g
4
1
2
paradise
38
1
4
3
2

2
io
4
1
2
parade
38
1
4
3
2
ol
2
o
4
2
2
parabolic
2
parabola
38
1
4
3
2
id
2

4
2
2
paraboloidal
2
paraboloid
38
1
4
3
2

2
bdglmnps
4
5
2
paraxial
2
paratroop
2
parakeet
2
paraffin
2
parachute
38
1
4
3
2

2
aceiklorst
4
5
2
parvenu
2
parquet
2
pardon
2
parboil
2
par
38
1
4
3
2
r
2

4
2
2
papyrus
2
papyri
38
1
4
3
2

2

4
2
2
pappy
2
Pappas
38
1
4
3
2

2

4
2
2
paperwork
2
paperweight
38
1
4
3
2
r
2
w
4
4
2
papers
2
papery
2
paperback
2
paper
38
1
4
3
2

2

4
3
2
papaw
2
papal
2
papa
38
1
4
3
2

2
aepy
4
5
2
Papua
2
paprika
2
papoose
2
papillary
2
pap
38
1
4
3
2
mim
2

4
2
2
pantomimic
2
pantomime
38
1
4
3
2
s
2

4
2
2
pantheist
2
pantheism
38
1
4
3
2
e
2
i
4
2
2
panther
2
pantheon
38
1
4
3
2

2
ho
4
3
2
panty
2
pantry
2
pant
38
1
4
3
2
am
2

4
2
2
panoramic
2
panorama
38
1
4
3
2

2
r
4
1
2
panoply
38
1
4
3
2

2

4
2
2
panicky
2
panicked
38
1
4
3
2
c
2
k
4
2
2
panicle
2
panic
38
1
4
3
2

2

4
2
2
panel
2
pane
38
1
4
3
2

2

4
2
2
pandemonium
2
pandemic
38
1
4
3
2

2
m
4
1
2
pander
38
1
4
3
2

2

4
2
2
Pandanus
2
panda
38
1
4
3
2

2
ae
4
1
2
Pandora
38
1
4
3
2
ea
2

4
2
2
pancreatic
2
pancreas
38
1
4
3
2

2
r
4
2
2
Pancho
2
pancake
38
1
4
3
2

2

4
2
2
panama
2
panacea
38
1
4
3
2

2
acdeiot
4
5
2
pansy
2
panjandrum
2
panhandle
2
pang
2
pan
38
1
4
3
2

2

4
3
2
pamphlet
2
pamper
2
pampa
38
1
4
3
2

2
p
4
2
2
Pamela
2
Pam
38
1
4
3
2

2

4
2
2
Palomar
2
Palo
38
1
4
3
2

2

4
5
2
Palmyra
2
Palmolive
2
palmetto
2
palmate
2
palm
38
1
4
3
2

2

4
2
2
pallid
2
palliate
38
1
4
3
2

2

4
2
2
Palladian
2
palladia
38
1
4
3
2
di
2
a
4
1
2
palladium
38
1
4
3
2

2
ai
4
2
2
pallet
2
pall
38
1
4
3
2
drom
2

4
2
2
palindromic
2
palindrome
38
1
4
3
2

2
n
4
1
2
palisade
38
1
4
3
2

2

4
2
2
Paleozoic
2
Paleolithic
38
1
4
3
2

2
o
4
4
2
palette
2
Palestine
2
Palermo
2
pale
38
1
4
3
2
z
2

4
2
2
palazzo
2
palazzi
38
1
4
3
2

2

4
2
2
Palatine
2
palate
38
1
4
3
2

2
tz
4
1
2
palace
38
1
4
3
2

2
aeilmo
4
4
2
palsy
2
palpable
2
palfrey
2
pal
38
1
4
3
2
istan
2

4
2
2
Pakistani
2
Pakistan
38
1
4
3
2

2

4
2
2
pairwise
2
pair
38
1
4
3
2

2

4
2
2
paintbrush
2
paint
38
1
4
3
2

2
t
4
4
2
painstaking
2
painful
2
Paine
2
pain
38
1
4
3
2

2
nr
4
3
2
paisley
2
pail
2
paid
38
1
4
3
2
nt
2

4
2
2
pageantry
2
pageant
38
1
4
3
2

2
a
4
1
2
page
38
1
4
3
2

2
e
4
3
2
pagoda
2
paginate
2
pagan
38
1
4
3
2

2

4
3
2
paddy
2
paddock
2
paddle
38
1
4
3
2

2
d
4
3
2
padre
2
padlock
2
pad
38
1
4
3
2

2

4
2
2
Packard
2
package
38
1
4
3
2

2
a
4
2
2
packet
2
pack
38
1
4
3
2

2
s
4
1
2
pacific
38
1
4
3
2

2

4
2
2
pacifist
2
pacifism
38
1
4
3
2
f
2
i
4
1
2
pacify
38
1
4
3
2

2

4
3
2
pacesetting
2
pacemake
2
pace
38
1
4
3
2

2
eik
4
1
2
pact
38
1
4
3
2

2

4
2
2
Pabst
2
Pablo
38
1
4
3
2

2
bcdgiklmnprstuvwy
4
5
2
Paz
2
pax
2
Paoli
2
paean
2
pa
38
1
4
3
2

2
aefhilnorstuy
4
8
2
pc
2
PVC
2
p's
2
ppm
2
PM
2
PDP
2
PBS
2
p
38
1
4
3
2

2

4
2
2
ozone
2
Ozark
38
1
4
3
2
gen
2

4
2
2
oxygenate
2
oxygen
38
1
4
3
2

2

4
2
2
oxidate
2
oxidant
38
1
4
3
2
d
2
a
4
1
2
oxide
38
1
4
3
2

2

4
2
2
oxeye
2
oxen
38
1
4
3
2
l
2

4
2
2
oxalic
2
oxalate
38
1
4
3
2

2
aeiy
4
5
2
Oxnard
2
Oxonian
2
Oxford
2
oxcart
2
ox
38
1
4
3
2

2

4
2
2
owly
2
owl
38
1
4
3
2

2

4
2
2
Owens
2
owe
38
1
4
3
2

2
eln
4
1
2
ow
38
1
4
3
2

2

4
2
2
oviform
2
Ovid
38
1
4
3
2

2

4
2
2
overture
2
overt
38
1
4
3
2

2
t
4
2
2
overview
2
over
38
1
4
3
2

2

4
2
2
ovenbird
2
oven
38
1
4
3
2

2
nr
4
0
38
1
4
3
2

2

4
4
2
ovate
2
ovary
2
oval
2
ova
38
1
4
3
2

2
aei
4
0
38
1
4
3
2

2

4
2
2
ouzo
2
ouzel
38
1
4
3
2
a
2

4
2
2
outlawry
2
outlandish
38
1
4
3
2

2
l
4
5
2
output
2
outside
2
outrageous
2
outermost
2
out
38
1
4
3
2

2
s
4
1
2
our
38
1
4
3
2
ht
2

4
2
2
oughtn't
2
ought
38
1
4
3
2

2
grtz
4
5
2
ouvre
2
oust
2
ounce
2
ouch
2
Ouagadougou
38
1
4
3
2

2

4
2
2
Ottoman
2
Otto
38
1
4
3
2

2
o
4
3
2
otter
2
Ottawa
2
Ott
38
1
4
3
2

2

4
2
2
Otis
2
otiose
38
1
4
3
2
e
2
r
4
1
2
Othello
38
1
4
3
2

2

4
2
2
otherworld
2
otherwise
38
1
4
3
2

2
w
4
2
2
others
2
other
38
1
4
3
2

2
hit
4
0
38
1
4
3
2

2
c
4
1
2
Ostrander
38
1
4
3
2

2

4
2
2
ostracod
2
ostracism
38
1
4
3
2

2
a
4
1
2
ostrich
38
1
4
3
2

2
no
4
0
38
1
4
3
2
th
2

4
3
2
osteopathy
2
osteopathic
2
osteopath
38
1
4
3
2

2
a
4
1
2
osteoporosis
38
1
4
3
2

2
p
4
1
2
osteology
38
1
4
3
2

2

4
2
2
ostentatious
2
ostensible
38
1
4
3
2

2
er
4
0
38
1
4
3
2

2

4
2
2
ossify
2
osseous
38
1
4
3
2

2

4
2
2
osmotic
2
osmosis
38
1
4
3
2

2
o
4
1
2
osmium
38
1
4
3
2

2

4
2
2
Osiris
2
osier
38
1
4
3
2

2

4
3
2
O'Sullivan
2
O'Shea
2
o's
38
1
4
3
2
t
2

4
2
2
oscillatory
2
oscillate
38
1
4
3
2
ll
2
a
4
1
2
oscilloscope
38
1
4
3
2

2
i
4
1
2
Oscar
38
1
4
3
2
orn
2

4
2
2
Osborne
2
Osborn
38
1
4
3
2

2
bcimst
4
6
2
Oswald
2
osprey
2
Oslo
2
Oshkosh
2
Osgood
2
Osaka
38
1
4
3
2
ell
2

4
2
2
Orwellian
2
Orwell
38
1
4
3
2

2

4
2
2
orthophosphate
2
orthopedic
38
1
4
3
2

2

4
2
2
orthography
2
orthogonal
38
1
4
3
2

2

4
2
2
orthodoxy
2
orthodox
38
1
4
3
2
ti
2

4
2
2
orthodontist
2
orthodontic
38
1
4
3
2
o
2
nx
4
0
38
1
4
3
2

2
dgp
4
3
2
orthorhombic
2
orthonormal
2
orthoclase
38
1
4
3
2

2
o
4
2
2
orthicon
2
orthant
38
1
4
3
2

2
h
4
1
2
Ortega
38
1
4
3
2
n
2

4
2
2
orphanage
2
orphan
38
1
4
3
2
h
2
a
4
2
2
Orphic
2
Orpheus
38
1
4
3
2

2

4
2
2
Orono
2
orography
38
1
4
3
2

2
m
4
1
2
ornate
38
1
4
3
2
ent
2

4
2
2
ornamentation
2
ornament
38
1
4
3
2

2
a
4
1
2
ornery
38
1
4
3
2

2

4
2
2
Orleans
2
Orlando
38
1
4
3
2

2

4
2
2
Orion
2
oriole
38
1
4
3
2

2

4
2
2
Orinoco
2
Orin
38
1
4
3
2

2

4
2
2
originate
2
original
38
1
4
3
2
in
2
a
4
1
2
origin
38
1
4
3
2
nt
2

4
3
2
oriented
2
oriental
2
orient
38
1
4
3
2

2
egno
4
1
2
orifice
38
1
4
3
2

2
n
4
1
2
orgasm
38
1
4
3
2

2
i
4
3
2
organometallic
2
organdy
2
organ
38
1
4
3
2

2
z
4
2
2
organismic
2
organic
38
1
4
3
2

2
a
4
2
2
orgy
2
orgiastic
38
1
4
3
2
te
2

4
2
2
Orestes
2
Oresteia
38
1
4
3
2

2

4
2
2
Oregon
2
oregano
38
1
4
3
2

2
gs
4
1
2
ore
38
1
4
3
2
na
2

4
4
2
ordinate
2
ordinary
2
ordinance
2
ordinal
38
1
4
3
2

2
r
4
1
2
ordeal
38
1
4
3
2

2
ei
4
2
2
ordnance
2
ordain
38
1
4
3
2

2

4
2
2
orchis
2
orchid
38
1
4
3
2
stra
2

4
3
2
orchestrate
2
orchestral
2
orchestra
38
1
4
3
2
h
2
ei
4
1
2
orchard
38
1
4
3
2
t
2

4
2
2
orbital
2
orbit
38
1
4
3
2

2
i
4
1
2
orb
38
1
4
3
2

2

4
2
2
oratorio
2
oratoric
38
1
4
3
2
r
2
i
4
1
2
oratory
38
1
4
3
2

2
o
4
1
2
orate
38
1
4
3
2

2

4
2
2
orangeroot
2
orange
38
1
4
3
2
g
2
e
4
1
2
orangutan
38
1
4
3
2

2
nt
4
2
2
oral
2
oracle
38
1
4
3
2

2
abcdegilnoptw
4
4
2
Orville
2
Orr
2
Orkney
2
or
38
1
4
3
2

2

4
2
2
opus
2
opulent
38
1
4
3
2
etr
2

4
2
2
optometry
2
optometrist
38
1
4
3
2

2
m
4
2
2
optoisolate
2
optoacoustic
38
1
4
3
2
s
2

4
2
2
optimist
2
optimism
38
1
4
3
2

2

4
2
2
optimal
2
optima
38
1
4
3
2

2
ai
4
1
2
optimum
38
1
4
3
2

2
mo
4
1
2
optic
38
1
4
3
2
alm
2

4
2
2
opthalmology
2
opthalmic
38
1
4
3
2

2
hio
4
1
2
opt
38
1
4
3
2
ss
2
i
4
2
2
oppressor
2
oppress
38
1
4
3
2

2

4
2
2
oppressive
2
oppression
38
1
4
3
2

2
e
4
1
2
opprobrium
38
1
4
3
2
t
2

4
2
2
opposition
2
opposite
38
1
4
3
2

2
i
4
2
2
oppose
2
opposable
38
1
4
3
2

2
s
4
2
2
opportune
2
opponent
38
1
4
3
2

2
or
4
1
2
Oppenheimer
38
1
4
3
2
ion
2

4
2
2
opinionate
2
opinion
38
1
4
3
2

2
n
4
2
2
opium
2
opiate
38
1
4
3
2

2
nt
4
2
2
operable
2
opera
38
1
4
3
2

2
ei
4
0
38
1
4
3
2

2

4
2
2
operant
2
operand
38
1
4
3
2

2
a
4
2
2
operon
2
operetta
38
1
4
3
2

2
rn
4
2
2
Opel
2
OPEC
38
1
4
3
2

2
l
4
2
2
opaque
2
opacity
38
1
4
3
2

2

4
2
2
opalescent
2
opal
38
1
4
3
2

2
aeiptu
4
2
2
opossum
2
Ophiucus
38
1
4
3
2

2

4
3
2
ooze
2
oodles
2
oocyte
38
1
4
3
2

2

4
3
2
ontology
2
ontogeny
2
onto
38
1
4
3
2

2
o
4
1
2
Ontario
38
1
4
3
2

2

4
2
2
onslaught
2
onset
38
1
4
3
2
ush
2

4
2
2
onrushing
2
onrush
38
1
4
3
2
atopoei
2

4
2
2
onomatopoeic
2
onomatopoeia
38
1
4
3
2

2
m
4
1
2
Onondaga
38
1
4
3
2
ok
2

4
2
2
onlooking
2
onlooker
38
1
4
3
2

2
o
4
2
2
online
2
only
38
1
4
3
2

2

4
6
2
oneupmanship
2
onetime
2
oneself
2
onerous
2
Oneida
2
one
38
1
4
3
2

2

4
2
2
oncoming
2
oncology
38
1
4
3
2

2
o
4
1
2
once
38
1
4
3
2

2
celorst
4
7
2
onboard
2
onyx
2
onward
2
onus
2
onion
2
ongoing
2
on
38
1
4
3
2

2

4
2
2
omnipresent
2
omnipotent
38
1
4
3
2
i
2
p
4
2
2
omniscient
2
omnibus
38
1
4
3
2

2

4
2
2
omitting
2
omitted
38
1
4
3
2

2
t
4
1
2
omit
38
1
4
3
2

2
t
4
3
2
omission
2
ominous
2
omicron
38
1
4
3
2

2

4
3
2
omen
2
omelet
2
omega
38
1
4
3
2
uds
2

4
2
2
ombudsperson
2
ombudsman
38
1
4
3
2

2

4
2
2
Oman
2
Omaha
38
1
4
3
2

2
abein
4
0
38
1
4
3
2
mpi
2

4
2
2
Olympic
2
Olympia
38
1
4
3
2

2

4
2
2
Olson
2
Olsen
38
1
4
3
2

2

4
2
2
olivine
2
Olivia
38
1
4
3
2

2

4
2
2
Olivetti
2
olive
38
1
4
3
2

2
ei
4
0
38
1
4
3
2

2
ao
4
0
38
1
4
3
2

2

4
2
2
oligopoly
2
oligoclase
38
1
4
3
2
rch
2

4
2
2
oligarchy
2
oligarchic
38
1
4
3
2

2
gv
4
1
2
Olin
38
1
4
3
2

2

4
3
2
oleomargarine
2
olefin
2
oleander
38
1
4
3
2

2

4
2
2
oldster
2
Oldsmobile
38
1
4
3
2
n
2

4
2
2
Oldenburg
2
olden
38
1
4
3
2

2
es
4
2
2
oldy
2
old
38
1
4
3
2

2

4
2
2
Olav
2
Olaf
38
1
4
3
2

2
adeisy
4
2
2
Olga
2
olfactory
38
1
4
3
2

2

4
4
2
Oklahoma
2
Okinawa
2
okay
2
OK
38
1
4
3
2

2
m
4
4
2
oily
2
oilseed
2
oilcloth
2
oil
38
1
4
3
2

2

4
2
2
oilmen
2
oilman
38
1
4
3
2

2
l
4
1
2
oint
38
1
4
3
2

2

4
3
2
ohmmeter
2
ohmic
2
ohm
38
1
4
3
2

2
m
4
2
2
Ohio
2
oh
38
1
4
3
2
e
2

4
2
2
ogress
2
ogre
38
1
4
3
2

2
r
4
2
2
ogle
2
Ogden
38
1
4
3
2
n
2

4
2
2
oftentimes
2
often
38
1
4
3
2

2
e
4
1
2
oft
38
1
4
3
2
o
2

4
2
2
offshore
2
offshoot
38
1
4
3
2
t
2

4
2
2
offsetting
2
offset
38
1
4
3
2

2
eh
4
3
2
offstage
2
offspring
2
offsaddle
38
1
4
3
2

2

4
2
2
officious
2
officio
38
1
4
3
2

2
l
4
1
2
officiate
38
1
4
3
2

2

4
3
2
officials
2
officialdom
2
official
38
1
4
3
2

2
ao
4
0
38
1
4
3
2

2

4
4
2
offices
2
officemate
2
officeholder
2
office
38
1
4
3
2
c
2
ei
4
0
38
1
4
3
2

2

4
5
2
offers
2
offering
2
offered
2
offertory
2
offer
38
1
4
3
2

2

4
3
2
offensive
2
offend
2
Offenbach
38
1
4
3
2

2
nr
4
0
38
1
4
3
2

2
eis
4
5
2
offload
2
offhand
2
offbeat
2
offal
2
off
38
1
4
3
2

2
ft
4
1
2
of
38
1
4
3
2
ip
2

4
2
2
Oedipus
2
Oedipal
38
1
4
3
2

2
d
4
1
2
oersted
38
1
4
3
2
sse
2

4
2
2
Odyssey
2
Odysseus
38
1
4
3
2

2

4
2
2
odorous
2
odometer
38
1
4
3
2

2

4
3
2
O'Dwyer
2
O'Donnell
2
O'Dell
38
1
4
3
2

2

4
3
2
odium
2
odious
2
Odin
38
1
4
3
2

2

4
2
2
Odessa
2
ode
38
1
4
3
2

2
eioy
4
1
2
odd
38
1
4
3
2

2

4
4
2
octoroon
2
octopus
2
octogenarian
2
October
38
1
4
3
2
l
2

4
2
2
octillion
2
octile
38
1
4
3
2

2

4
2
2
octet
2
octennial
38
1
4
3
2

2

4
2
2
Octavia
2
octave
38
1
4
3
2

2

4
2
2
octant
2
octane
38
1
4
3
2

2

4
2
2
octahedral
2
octahedra
38
1
4
3
2
edr
2
a
4
1
2
octahedron
38
1
4
3
2
on
2

4
2
2
octagonal
2
octagon
38
1
4
3
2

2
ghnv
4
1
2
octal
38
1
4
3
2

2
aeio
4
1
2
Oct
38
1
4
3
2
nn
2

4
2
2
O'Connor
2
O'Connell
38
1
4
3
2

2
o
4
1
2
o'clock
38
1
4
3
2

2
CDS
4
5
2
O'Neill
2
O'Leary
2
O'Hare
2
o'er
2
O'Brien
38
1
4
3
2
n
2
i
4
3
2
oceanside
2
oceanography
2
ocean
38
1
4
3
2

2

4
2
2
oceanic
2
Oceania
38
1
4
3
2

2
a
4
1
2
ocelot
38
1
4
3
2

2

4
2
2
occurrent
2
occurred
38
1
4
3
2

2
e
4
1
2
occurring
38
1
4
3
2

2
r
4
1
2
occur
38
1
4
3
2

2

4
2
2
occupation
2
occupant
38
1
4
3
2

2
a
4
1
2
occupy
38
1
4
3
2
t
2

4
2
2
occultate
2
occult
38
1
4
3
2

2
lpr
4
0
38
1
4
3
2
i
2

4
2
2
occlusive
2
occlusion
38
1
4
3
2
u
2
s
4
1
2
occlude
38
1
4
3
2
ent
2

4
2
2
occidental
2
occident
38
1
4
3
2

2
d
4
1
2
occipital
38
1
4
3
2

2
ilu
4
1
2
occasion
38
1
4
3
2

2
cet
4
2
2
ocular
2
ocarina
38
1
4
3
2

2
o
4
1
2
obviate
38
1
4
3
2

2
i
4
1
2
obverse
38
1
4
3
2
u
2

4
2
2
obtrusive
2
obtrude
38
1
4
3
2

2
r
4
1
2
obtain
38
1
4
3
2
u
2

4
2
2
obstruent
2
obstruct
38
1
4
3
2
na
2

4
2
2
obstinate
2
obstinacy
38
1
4
3
2

2
ir
4
2
2
obstetric
2
obstacle
38
1
4
3
2
le
2

4
2
2
obsolete
2
obsolescent
38
1
4
3
2

2

4
2
2
obsessive
2
obsession
38
1
4
3
2
s
2
i
4
1
2
obsess
38
1
4
3
2

2
t
4
1
2
observant
38
1
4
3
2

2

4
2
2
observatory
2
observation
38
1
4
3
2
v
2
a
4
1
2
observe
38
1
4
3
2
u
2

4
2
2
obsequy
2
obsequious
38
1
4
3
2

2
qrs
4
0
38
1
4
3
2

2

4
2
2
obscure
2
obscene
38
1
4
3
2

2
ceot
4
1
2
obsidian
38
1
4
3
2

2

4
2
2
oboist
2
oboe
38
1
4
3
2
io
2

4
2
2
oblivious
2
oblivion
38
1
4
3
2

2
a
4
1
2
oblige
38
1
4
3
2
t
2

4
2
2
obligatory
2
obligate
38
1
4
3
2

2
gv
4
2
2
obliterate
2
oblique
38
1
4
3
2

2
i
4
2
2
oblong
2
oblate
38
1
4
3
2
t
2

4
5
2
object's
2
objects
2
objector
2
objectify
2
object
38
1
4
3
2
e
2
c
4
1
2
objet
38
1
4
3
2
uscat
2

4
2
2
obfuscatory
2
obfuscate
38
1
4
3
2

2

4
6
2
obey
2
obese
2
Oberlin
2
obelisk
2
obeisant
2
obedient
38
1
4
3
2
ura
2

4
2
2
obdurate
2
obduracy
38
1
4
3
2

2
defjlostv
4
2
2
obnoxious
2
obituary
38
1
4
3
2

2

4
3
2
oatmeal
2
oath
2
oat
38
1
4
3
2

2

4
2
2
oasis
2
oases
38
1
4
3
2

2

4
2
2
Oakley
2
Oakland
38
1
4
3
2

2
l
4
3
2
oakwood
2
oaken
2
oak
38
1
4
3
2

2
kst
4
2
2
oar
2
oaf
38
1
4
3
2

2
abc'defghiklmnoprstuvwxz
4
2
2
oyster
2
o
38
1
4
3
2
mania
2

4
2
2
nymphomaniac
2
nymphomania
38
1
4
3
2
ph
2
o
4
1
2
nymph
38
1
4
3
2

2
m
4
5
2
NYU
2
Nyquist
2
nylon
2
NYC
2
NY
38
1
4
3
2

2

4
2
2
nutritious
2
nutrition
38
1
4
3
2
i
2
o
4
1
2
nutritive
38
1
4
3
2
i
2
t
4
2
2
nutrient
2
nutria
38
1
4
3
2

2
r
4
6
2
nutshell
2
nutmeg
2
nuthatch
2
nutcrack
2
nutate
2
nut
38
1
4
3
2
e
2

4
2
2
nursery
2
nurse
38
1
4
3
2

2
s
4
1
2
nurture
38
1
4
3
2
mati
2

4
2
2
numismatist
2
numismatic
38
1
4
3
2

2
s
4
1
2
numinous
38
1
4
3
2

2

4
2
2
numerous
2
numerology
38
1
4
3
2

2

4
2
2
Numerische
2
numeric
38
1
4
3
2

2

4
3
2
numerate
2
numeral
2
numerable
38
1
4
3
2
r
2
aio
4
0
38
1
4
3
2

2
eib
4
0
38
1
4
3
2
l
2

4
3
2
Nullstellensatz
2
nullify
2
null
38
1
4
3
2

2

4
2
2
nugget
2
nugatory
38
1
4
3
2

2

4
2
2
nudge
2
nude
38
1
4
3
2

2
aio
4
1
2
nucleus
38
1
4
3
2

2

4
2
2
nucleolus
2
nucleoli
38
1
4
3
2

2
l
4
1
2
nucleotide
38
1
4
3
2

2

4
2
2
nucleic
2
nuclei
38
1
4
3
2

2

4
3
2
nucleate
2
nuclear
2
nucleant
38
1
4
3
2
l
2
e
4
1
2
nuclide
38
1
4
3
2
i
2

4
2
2
nubile
2
Nubia
38
1
4
3
2

2
bcdglmrt
4
6
2
nuzzle
2
nuptial
2
nun
2
nuisance
2
nuance
2
nu
38
1
4
3
2

2

4
4
2
nowise
2
nowhere
2
nowaday
2
now
38
1
4
3
2

2

4
2
2
Novosibirsk
2
novo
38
1
4
3
2

2

4
2
2
novitiate
2
novice
38
1
4
3
2

2

4
2
2
novelty
2
novel
38
1
4
3
2

2
l
4
1
2
November
38
1
4
3
2

2

4
2
2
Novak
2
nova
38
1
4
3
2

2
aeio
4
1
2
Nov
38
1
4
3
2

2

4
4
2
nouveau
2
nourish
2
noun
2
Nouakchott
38
1
4
3
2
i
2

4
2
2
notorious
2
notoriety
38
1
4
3
2

2
r
4
1
2
notocord
38
1
4
3
2
e
2

4
2
2
noticeable
2
notice
38
1
4
3
2

2
cf
4
1
2
notion
38
1
4
3
2

2

4
6
2
notepad
2
notes
2
noted
2
noteworthy
2
notebook
2
note
38
1
4
3
2

2

4
2
2
notate
2
notary
38
1
4
3
2

2
aeio
4
6
2
notwithstanding
2
Nottingham
2
Notre
2
nothing
2
notch
2
not
38
1
4
3
2

2

4
2
2
Nostrand
2
Nostradamus
38
1
4
3
2

2
a
4
1
2
nostril
38
1
4
3
2
lgi
2

4
2
2
nostalgic
2
nostalgia
38
1
4
3
2

2
ar
4
0
38
1
4
3
2

2
b
4
1
2
nose
38
1
4
3
2

2

4
2
2
nosebleed
2
nosebag
38
1
4
3
2

2
et
4
0
38
1
4
3
2

2

4
2
2
Norway
2
Norwalk
38
1
4
3
2

2
a
4
2
2
Norwich
2
Norwegian
38
1
4
3
2

2
erw
4
5
2
Northumberland
2
northland
2
northbound
2
Northampton
2
north
38
1
4
3
2
st
2

4
2
2
northwestern
2
northwest
38
1
4
3
2

2
e
4
1
2
northward
38
1
4
3
2

2

4
2
2
Northrup
2
Northrop
38
1
4
3
2

2

4
2
2
northernmost
2
northern
38
1
4
3
2

2
n
4
1
2
northerly
38
1
4
3
2
st
2

4
2
2
northeastern
2
northeast
38
1
4
3
2

2
ar
4
0
38
1
4
3
2

2
h
4
1
2
Norton
38
1
4
3
2

2

4
2
2
Normandy
2
Norman
38
1
4
3
2

2

4
3
2
normally
2
normalcy
2
normal
38
1
4
3
2

2
ln
4
2
2
normative
2
Norma
38
1
4
3
2

2
a
4
1
2
norm
38
1
4
3
2

2

4
2
2
Nordstrom
2
Nordhoff
38
1
4
3
2

2
dmtw
4
5
2
Norris
2
Norfolk
2
Noreen
2
Nora
2
nor
38
1
4
3
2

2

4
2
2
noontime
2
noon
38
1
4
3
2

2
n
4
3
2
noose
2
nook
2
noodle
38
1
4
3
2

2

4
2
2
nonetheless
2
none
38
1
4
3
2

2

4
2
2
nonchalant
2
nonce
38
1
4
3
2

2
ce
4
5
2
non-recursive
2
nonsensic
2
nonogenarian
2
nondescript
2
non
38
1
4
3
2
gra
2

4
2
2
nomograph
2
nomogram
38
1
4
3
2

2

4
2
2
nominate
2
nominal
38
1
4
3
2
n
2
a
4
1
2
nominee
38
1
4
3
2
d
2

4
2
2
nomadic
2
nomad
38
1
4
3
2

2
aio
4
1
2
nomenclature
38
1
4
3
2

2

4
3
2
nolo
2
Noll
2
Nolan
38
1
4
3
2

2

4
2
2
noisemake
2
noise
38
1
4
3
2
s
2
e
4
1
2
noisy
38
1
4
3
2

2

4
2
2
Noetherian
2
Noel
38
1
4
3
2
l
2

4
2
2
nodule
2
nodular
38
1
4
3
2

2
u
4
3
2
node
2
nodal
2
nod
38
1
4
3
2
turn
2

4
2
2
nocturne
2
nocturnal
38
1
4
3
2
dy
2

4
2
2
nobody'd
2
nobody
38
1
4
3
2

2

4
2
2
noblemen
2
nobleman
38
1
4
3
2
e
2
m
4
2
2
noblesse
2
noble
38
1
4
3
2
l
2

4
2
2
nobelium
2
Nobel
38
1
4
3
2

2
elo
4
1
2
nob
38
1
4
3
2

2

4
2
2
Noah
2
NOAA
38
1
4
3
2

2
abcdeilmnorstuvw
4
3
2
nozzle
2
noxious
2
no
38
1
4
3
2

2

4
2
2
NNW
2
NNE
38
1
4
3
2

2
e
4
1
2
nitroglycerine
38
1
4
3
2
n
2

4
2
2
nitrogenous
2
nitrogen
38
1
4
3
2

2
g
4
1
2
nitrous
38
1
4
3
2

2

4
3
2
nitrite
2
nitride
2
nitric
38
1
4
3
2

2
io
4
1
2
nitrate
38
1
4
3
2

2
r
4
3
2
nitty
2
nitpick
2
nit
38
1
4
3
2

2

4
2
2
Nippon
2
nipple
38
1
4
3
2

2
p
4
1
2
nip
38
1
4
3
2
b
2

4
2
2
niobium
2
Niobe
38
1
4
3
2
en
2

4
2
2
nineteenth
2
nineteen
38
1
4
3
2

2
e
4
2
2
ninety
2
ninetieth
38
1
4
3
2

2
t
4
4
2
Nineveh
2
ninefold
2
ninebark
2
nine
38
1
4
3
2

2
e
4
2
2
ninth
2
Nina
38
1
4
3
2

2

4
2
2
nimbus
2
nimble
38
1
4
3
2

2
b
4
1
2
NIMH
38
1
4
3
2

2

4
3
2
nilpotent
2
Nile
2
nil
38
1
4
3
2

2

4
2
2
Nikolai
2
Nikko
38
1
4
3
2
lis
2

4
2
2
nihilist
2
nihilism
38
1
4
3
2

2
i
4
1
2
NIH
38
1
4
3
2
ar
2

4
2
2
nightmarish
2
nightmare
38
1
4
3
2

2

4
2
2
nightclub
2
nightcap
38
1
4
3
2

2
cm
4
8
2
nighttime
2
nightshirt
2
nightingale
2
nighthawk
2
nightgown
2
nightfall
2
nightdress
2
night
38
1
4
3
2

2
t
4
1
2
nigh
38
1
4
3
2

2

4
3
2
niggle
2
nigger
2
niggardly
38
1
4
3
2
r
2

4
2
2
Nigeria
2
Niger
38
1
4
3
2

2
egh
4
0
38
1
4
3
2
s
2

4
2
2
Nielson
2
Nielsen
38
1
4
3
2

2
l
4
2
2
Nietzsche
2
niece
38
1
4
3
2
in
2

4
2
2
nicotine
2
nicotinamide
38
1
4
3
2

2
t
4
2
2
Nicosia
2
Nicodemus
38
1
4
3
2

2

4
3
2
nickname
2
nickel
2
nick
38
1
4
3
2

2

4
2
2
Nicholson
2
Nichols
38
1
4
3
2
l
2
s
4
2
2
Nicholls
2
Nicholas
38
1
4
3
2

2
o
4
2
2
nichrome
2
niche
38
1
4
3
2

2

4
2
2
nicety
2
nice
38
1
4
3
2

2
ehko
4
1
2
Nicaragua
38
1
4
3
2

2

4
3
2
Nibelung
2
nibble
2
nib
38
1
4
3
2

2

4
3
2
Niamey
2
Niagara
2
niacin
38
1
4
3
2

2
abceghklmnopt
4
2
2
Nixon
2
nirvana
38
1
4
3
2
n
2

4
2
2
Newtonian
2
newton
38
1
4
3
2

2
o
4
2
2
newts
2
newt
38
1
4
3
2

2

4
2
2
newspapermen
2
newspaperman
38
1
4
3
2
aper
2
m
4
1
2
newspaper
38
1
4
3
2

2

4
2
2
newsmen
2
newsman
38
1
4
3
2

2
mp
4
7
2
Newsweek
2
newsstand
2
newsreel
2
newsletter
2
newscast
2
newsboy
2
news
38
1
4
3
2

2

4
2
2
newlywed
2
newline
38
1
4
3
2
ound
2

4
2
2
Newfoundland
2
newfound
38
1
4
3
2

2
l
4
1
2
newest
38
1
4
3
2

2

4
2
2
newcomer
2
Newcastle
38
1
4
3
2
o
2

4
2
2
newborn
2
Newbold
38
1
4
3
2

2
bceflst
4
4
2
Newport
2
Newman
2
Newark
2
new
38
1
4
3
2

2
r
4
1
2
neve
38
1
4
3
2

2

4
2
2
Nevada
2
Neva
38
1
4
3
2

2
ae
4
1
2
Nevins
38
1
4
3
2

2

4
3
2
neutron
2
neutrino
2
neutral
38
1
4
3
2

2
r
4
1
2
neuter
38
1
4
3
2

2

4
2
2
neurosis
2
neuroses
38
1
4
3
2

2

4
3
2
neuropsychiatric
2
neurophysiology
2
neuropathology
38
1
4
3
2

2

4
2
2
neuronal
2
neuron
38
1
4
3
2
n
2
a
4
1
2
neuroanotomy
38
1
4
3
2
tom
2

4
2
2
neuroanatomy
2
neuroanatomic
38
1
4
3
2

2
anps
4
3
2
neurotic
2
neuromuscular
2
neurology
38
1
4
3
2

2
l
4
1
2
neurasthenic
38
1
4
3
2

2

4
2
2
neuralgia
2
neural
38
1
4
3
2

2
ao
4
1
2
neuritis
38
1
4
3
2

2
rt
4
1
2
Neumann
38
1
4
3
2
le
2

4
2
2
nettlesome
2
nettle
38
1
4
3
2
er
2

4
3
2
netherworld
2
Netherlands
2
nether
38
1
4
3
2

2
ht
4
2
2
network
2
net
38
1
4
3
2

2

4
4
2
nested
2
Nestor
2
nestle
2
nest
38
1
4
3
2

2
t
4
1
2
Ness
38
1
4
3
2

2

4
2
2
nervous
2
nerve
38
1
4
3
2

2
v
4
2
2
Nero
2
nereid
38
1
4
3
2
un
2

4
2
2
neptunium
2
Neptune
38
1
4
3
2

2
t
4
3
2
nephew
2
nepenthe
2
Nepal
38
1
4
3
2

2

4
2
2
neoprene
2
neophyte
38
1
4
3
2
t
2

4
2
2
neonate
2
neonatal
38
1
4
3
2

2
a
4
1
2
neon
38
1
4
3
2

2

4
2
2
neologism
2
neolithic
38
1
4
3
2

2
lnp
4
2
2
neodymium
2
neoclassic
38
1
4
3
2

2

4
2
2
Nelson
2
Nelsen
38
1
4
3
2

2

4
2
2
Nellie
2
Nell
38
1
4
3
2

2
ls
4
0
38
1
4
3
2

2

4
2
2
neither
2
Neil
38
1
4
3
2
o
2

4
3
2
Negroid
2
Negroes
2
Negro
38
1
4
3
2
tia
2

4
2
2
negotiate
2
negotiable
38
1
4
3
2

2

4
2
2
negligent
2
negligee
38
1
4
3
2
g
2
e
4
1
2
negligible
38
1
4
3
2

2
i
4
1
2
neglect
38
1
4
3
2

2
lor
4
1
2
negate
38
1
4
3
2
e
2

4
2
2
needlepoint
2
needle
38
1
4
3
2

2
l
4
8
2
needs
2
needing
2
needed
2
needy
2
needn't
2
needham
2
needful
2
need
38
1
4
3
2

2
d
4
1
2
nee
38
1
4
3
2
ar
2

4
4
2
nectary
2
nectarine
2
nectareous
2
nectar
38
1
4
3
2
an
2
c
4
1
2
necromantic
38
1
4
3
2

2

4
2
2
necromancy
2
necromancer
38
1
4
3
2
o
2
m
4
3
2
necrotic
2
necrosis
2
necropsy
38
1
4
3
2

2

4
2
2
neckline
2
necklace
38
1
4
3
2

2
l
4
2
2
necktie
2
neck
38
1
4
3
2
ss
2
i
4
1
2
necessary
38
1
4
3
2
t
2

4
2
2
necessity
2
necessitate
38
1
4
3
2

2
ekrt
4
0
38
1
4
3
2

2

4
3
2
nebular
2
nebulae
2
nebula
38
1
4
3
2
l
2
a
4
1
2
nebulous
38
1
4
3
2

2
u
4
1
2
Nebraska
38
1
4
3
2

2
e
4
2
2
neath
2
neat
38
1
4
3
2

2

4
5
2
nearing
2
nearly
2
nearsighted
2
nearby
2
near
38
1
4
3
2

2
rt
4
3
2
Neapolitan
2
Neanderthal
2
Neal
38
1
4
3
2

2
abcegiloprstuvw
4
6
2
next
2
nemesis
2
Nehru
2
Neff
2
Ned
2
ne
38
1
4
3
2

2

4
2
2
Ndjamena
2
ND
38
1
4
3
2

2

4
4
2
NCR
2
NCO
2
NCAA
2
NC
38
1
4
3
2

2

4
2
2
NBS
2
NBC
38
1
4
3
2

2

4
2
2
Nazism
2
Nazi
38
1
4
3
2
re
2

4
2
2
Nazareth
2
Nazarene
38
1
4
3
2

2
ai
4
0
38
1
4
3
2
ga
2

4
2
2
navigate
2
navigable
38
1
4
3
2

2

4
2
2
navel
2
nave
38
1
4
3
2

2

4
2
2
naval
2
Navajo
38
1
4
3
2

2
aei
4
1
2
navy
38
1
4
3
2
i
2

4
2
2
nautilus
2
nautical
38
1
4
3
2

2

4
2
2
nauseate
2
nausea
38
1
4
3
2
e
2
a
4
1
2
nauseum
38
1
4
3
2

2
st
4
1
2
naughty
38
1
4
3
2
r
2

4
3
2
naturopath
2
nature
2
natural
38
1
4
3
2
n
2

4
4
2
nations
2
national
2
nationwide
2
nation
38
1
4
3
2

2
o
4
1
2
native
38
1
4
3
2
an
2

4
2
2
Nathaniel
2
Nathan
38
1
4
3
2
l
2

4
2
2
Natalie
2
natal
38
1
4
3
2

2
ahiu
4
5
2
natty
2
NATO
2
Natchez
2
Nate
2
Nat
38
1
4
3
2

2

4
2
2
nasty
2
nasturtium
38
1
4
3
2

2

4
3
2
Nashville
2
Nashua
2
Nash
38
1
4
3
2

2

4
2
2
nasal
2
NASA
38
1
4
3
2

2
Aht
4
2
2
Nassau
2
nascent
38
1
4
3
2

2

4
2
2
narrate
2
Narragansett
38
1
4
3
2

2
a
4
1
2
narrow
38
1
4
3
2

2

4
2
2
narcotic
2
narcosis
38
1
4
3
2
ss
2

4
2
2
narcissus
2
narcissist
38
1
4
3
2

2
io
4
0
38
1
4
3
2

2
cr
4
2
2
nary
2
Narbonne
38
1
4
3
2
leon
2

4
2
2
Napoleonic
2
Napoleon
38
1
4
3
2

2
o
4
3
2
Naples
2
napkin
2
nap
38
1
4
3
2

2

4
6
2
Nantucket
2
nanosecond
2
Nanking
2
Nanette
2
Nancy
2
Nan
38
1
4
3
2

2
e
4
1
2
naming
38
1
4
3
2

2

4
2
2
naked
2
Nakayama
38
1
4
3
2
e
2

4
2
2
naivete
2
naive
38
1
4
3
2

2

4
2
2
Nairobi
2
Nair
38
1
4
3
2

2
rv
4
2
2
nail
2
naiad
38
1
4
3
2

2

4
5
2
Nagy
2
Nagoya
2
nagging
2
Nagasaki
2
nag
38
1
4
3
2
i
2

4
2
2
nadir
2
Nadine
38
1
4
3
2

2

4
2
2
Nabisco
2
nab
38
1
4
3
2

2
bdgikmnprstuvz
4
3
2
nay
2
Naomi
2
NAACP
38
1
4
3
2

2
aBCdeiNOuY
4
11
2
NW
2
NV
2
NTIS
2
NSF
2
n's
2
NRC
2
NM
2
NJ
2
NH
2
Nguyen
2
n
38
1
4
3
2
h
2

4
3
2
mythology
2
mythic
2
myth
38
1
4
3
2

2

4
3
2
mystique
2
mystify
2
mystic
38
1
4
3
2
r
2

4
2
2
mystery
2
mysterious
38
1
4
3
2

2
ei
4
0
38
1
4
3
2

2
t
4
1
2
myself
38
1
4
3
2

2

4
5
2
myrtle
2
myrrh
2
Myron
2
myriad
2
Myra
38
1
4
3
2
i
2

4
2
2
myopic
2
myopia
38
1
4
3
2
ardi
2

4
2
2
myocardium
2
myocardial
38
1
4
3
2

2
cp
4
3
2
myosin
2
myoglobin
2
myofibril
38
1
4
3
2

2

4
2
2
Mynheer
2
mynah
38
1
4
3
2

2

4
3
2
myeloid
2
myeline
2
myel
38
1
4
3
2

2
l
4
1
2
Myers
38
1
4
3
2

2

4
2
2
mycology
2
mycobacteria
38
1
4
3
2
nae
2

4
2
2
Mycenaean
2
Mycenae
38
1
4
3
2

2
eo
4
0
38
1
4
3
2

2
cenorst
4
2
2
mylar
2
my
38
1
4
3
2

2

4
3
2
muzzle
2
Muzo
2
Muzak
38
1
4
3
2

2

4
2
2
mutuel
2
mutual
38
1
4
3
2

2

4
3
2
mutton
2
mutter
2
mutt
38
1
4
3
2

2

4
2
2
mutiny
2
mutineer
38
1
4
3
2

2
n
4
1
2
mutilate
38
1
4
3
2

2
nt
4
1
2
mutagen
38
1
4
3
2

2

4
2
2
mutatis
2
mutate
38
1
4
3
2

2

4
2
2
mutant
2
mutandis
38
1
4
3
2

2
aitu
4
1
2
mute
38
1
4
3
2
h
2

4
2
2
mustachio
2
mustache
38
1
4
3
2

2
c
4
2
2
mustard
2
mustang
38
1
4
3
2

2
a
4
3
2
musty
2
mustn't
2
must
38
1
4
3
2
i
2

4
2
2
muslin
2
muslim
38
1
4
3
2
x
2

4
2
2
muskoxen
2
muskox
38
1
4
3
2

2

4
3
2
musket
2
muskellunge
2
Muskegon
38
1
4
3
2

2
eo
4
3
2
muskrat
2
muskmelon
2
musk
38
1
4
3
2
c
2

4
4
2
musicology
2
musician
2
musicale
2
music
38
1
4
3
2

2

4
3
2
mushy
2
mushroom
2
mush
38
1
4
3
2

2

4
2
2
museum
2
muse
38
1
4
3
2

2
ou
4
2
2
muscle
2
Muscat
38
1
4
3
2
la
2

4
2
2
musculature
2
muscular
38
1
4
3
2
v
2

4
2
2
Muscovy
2
Muscovite
38
1
4
3
2

2
cehiklt
4
1
2
mussel
38
1
4
3
2

2

4
2
2
murre
2
Murray
38
1
4
3
2

2

4
2
2
murky
2
murk
38
1
4
3
2

2

4
2
2
Muriel
2
muriatic
38
1
4
3
2
er
2

4
2
2
murderous
2
murder
38
1
4
3
2

2
dikr
4
3
2
Murphy
2
murmur
2
mural
38
1
4
3
2
n
2

4
2
2
Muong
2
muon
38
1
4
3
2

2

4
2
2
municipal
2
Munich
38
1
4
3
2

2
c
4
2
2
munition
2
munificent
38
1
4
3
2

2

4
2
2
Muncie
2
munch
38
1
4
3
2

2
ci
4
3
2
Munson
2
mung
2
mundane
38
1
4
3
2

2

4
4
2
mummy
2
Mumford
2
mumble
2
mum
38
1
4
3
2
ud
2

4
2
2
multitudinous
2
multitude
38
1
4
3
2

2
t
4
1
2
multiplicand
38
1
4
3
2
i
2

4
2
2
multiplicative
2
multiplication
38
1
4
3
2
c
2
a
4
1
2
multiplicity
38
1
4
3
2

2
x
4
2
2
multiplet
2
multiple
38
1
4
3
2

2

4
2
2
multiplexor
2
multiplex
38
1
4
3
2
l
2
ei
4
0
38
1
4
3
2
i
2
pt
4
4
2
multi-purpose
2
multinomial
2
multifarious
2
multi
38
1
4
3
2
a
2

4
2
2
mulligatawny
2
mulligan
38
1
4
3
2

2
g
4
1
2
mullion
38
1
4
3
2

2

4
2
2
Mullen
2
mullein
38
1
4
3
2

2
ei
4
2
2
mullah
2
mull
38
1
4
3
2

2

4
2
2
mulct
2
mulch
38
1
4
3
2

2
clt
4
4
2
mulish
2
mule
2
mulberry
2
mulatto
38
1
4
3
2

2

4
2
2
muggy
2
mugging
38
1
4
3
2

2
g
4
2
2
mugho
2
mug
38
1
4
3
2
f
2

4
3
2
muffle
2
muffin
2
muff
38
1
4
3
2

2

4
2
2
muezzin
2
Mueller
38
1
4
3
2
e
2

4
2
2
muddlehead
2
muddle
38
1
4
3
2

2
l
4
2
2
muddy
2
Mudd
38
1
4
3
2

2
d
4
3
2
mudsling
2
mudguard
2
mud
38
1
4
3
2

2

4
5
2
mucus
2
mucosa
2
muck
2
mucilage
2
much
38
1
4
3
2

2
cdefglmnorstz
4
3
2
Mukden
2
Muir
2
mu
38
1
4
3
2

2
s
4
2
2
mr.
2
Mr
38
1
4
3
2

2
ei
4
0
38
1
4
3
2

2

4
3
2
mouthpiece
2
mouthful
2
mouth
38
1
4
3
2

2
h
4
1
2
Mouton
38
1
4
3
2

2

4
3
2
mousy
2
moustache
2
mouse
38
1
4
3
2
n
2

4
2
2
mournful
2
mourn
38
1
4
3
2
in
2

4
4
2
mountainside
2
mountainous
2
mountaineer
2
mountain
38
1
4
3
2

2
a
4
1
2
mount
38
1
4
3
2

2
t
4
1
2
mound
38
1
4
3
2

2

4
2
2
Moulton
2
mould
38
1
4
3
2

2
lnrst
4
0
38
1
4
3
2

2

4
2
2
motto
2
mottle
38
1
4
3
2
r
2

4
3
2
Motorola
2
motorcycle
2
motor
38
1
4
3
2

2

4
2
2
motive
2
motivate
38
1
4
3
2

2
v
4
2
2
motion
2
motif
38
1
4
3
2
r
2

4
3
2
mothers
2
motherland
2
mother
38
1
4
3
2

2
e
4
1
2
moth
38
1
4
3
2

2

4
2
2
motet
2
motel
38
1
4
3
2

2
ehiot
4
2
2
motley
2
mot
38
1
4
3
2

2

4
2
2
mossy
2
moss
38
1
4
3
2
u
2

4
2
2
mosquito
2
mosque
38
1
4
3
2

2

4
2
2
Moses
2
Moser
38
1
4
3
2

2
eqs
4
4
2
most
2
Moslem
2
Moscow
2
mosaic
38
1
4
3
2

2

4
3
2
mortise
2
mortify
2
mortician
38
1
4
3
2

2

4
2
2
mortgagee
2
mortgage
38
1
4
3
2
ag
2
e
4
1
2
mortgagor
38
1
4
3
2

2

4
2
2
mortar
2
mortal
38
1
4
3
2

2
agi
4
3
2
Morton
2
mortem
2
mort
38
1
4
3
2
e
2

4
2
2
morsel
2
Morse
38
1
4
3
2

2
s
4
1
2
Morrill
38
1
4
3
2

2

4
4
2
Morristown
2
Morrissey
2
Morrison
2
morris
38
1
4
3
2

2
i
4
1
2
morrow
38
1
4
3
2

2

4
2
2
morphophonemic
2
morphology
38
1
4
3
2

2

4
2
2
morphism
2
morphine
38
1
4
3
2
m
2

4
2
2
morphemic
2
morpheme
38
1
4
3
2
h
2
eio
4
0
38
1
4
3
2
c
2

4
2
2
Morocco
2
Moroccan
38
1
4
3
2

2
c
4
2
2
morose
2
moron
38
1
4
3
2

2

4
2
2
moribund
2
Moriarty
38
1
4
3
2

2

4
3
2
morgue
2
morgen
2
Morgan
38
1
4
3
2

2

4
2
2
Moreland
2
morel
38
1
4
3
2

2
l
4
3
2
Moresby
2
moreover
2
more
38
1
4
3
2

2
l
4
5
2
Moravia
2
moratorium
2
morass
2
Moran
2
moraine
38
1
4
3
2

2

4
2
2
morale
2
moral
38
1
4
3
2

2
aegioprst
4
4
2
morn
2
Mormon
2
Morley
2
morbid
38
1
4
3
2

2

4
3
2
Moorish
2
Moore
2
moor
38
1
4
3
2
i
2

4
2
2
moonlit
2
moonlight
38
1
4
3
2

2
l
4
2
2
Mooney
2
moon
38
1
4
3
2

2

4
2
2
moody
2
mood
38
1
4
3
2

2
dnr
4
3
2
moot
2
moose
2
moo
38
1
4
3
2

2

4
2
2
Montreal
2
Montrachet
38
1
4
3
2

2

4
2
2
Montevideo
2
Monteverdi
38
1
4
3
2

2
v
4
3
2
Monterey
2
Montenegrin
2
monte
38
1
4
3
2

2

4
2
2
Montague
2
montage
38
1
4
3
2

2
g
4
1
2
Montana
38
1
4
3
2

2
aerh
4
7
2
Monty
2
Montpelier
2
Montmartre
2
Monticello
2
Montgomery
2
Montclair
2
Mont
38
1
4
3
2
o
2

4
2
2
monstrous
2
monstrosity
38
1
4
3
2

2
r
4
1
2
monster
38
1
4
3
2

2
t
4
3
2
monsoon
2
monsieur
2
Monsanto
38
1
4
3
2
o
2

4
2
2
Monrovia
2
Monroe
38
1
4
3
2

2

4
2
2
monotreme
2
monotonous
38
1
4
3
2
r
2

4
2
2
monomeric
2
monomer
38
1
4
3
2

2
e
4
1
2
monomial
38
1
4
3
2
g
2

4
2
2
monologue
2
monologist
38
1
4
3
2

2
o
4
1
2
monolith
38
1
4
3
2
am
2

4
2
2
monogamy
2
monogamous
38
1
4
3
2

2

4
3
2
monocular
2
monochromator
2
Monoceros
38
1
4
3
2

2
cglmt
4
3
2
monoxide
2
monopoly
2
Monongahela
38
1
4
3
2
y
2

4
2
2
monkeyflower
2
monkey
38
1
4
3
2

2
e
4
2
2
monkish
2
monk
38
1
4
3
2
or
2

4
3
2
monitoring
2
monitory
2
monitor
38
1
4
3
2

2

4
2
2
Monica
2
monic
38
1
4
3
2

2
ct
4
1
2
monies
38
1
4
3
2
o
2

4
2
2
mongoose
2
Mongolia
38
1
4
3
2

2

4
3
2
moneywort
2
moneymake
2
money
38
1
4
3
2
ar
2

4
2
2
monetary
2
monetarism
38
1
4
3
2

2
ty
4
1
2
monel
38
1
4
3
2

2
drs
4
3
2
monaural
2
Monaco
2
Mona
38
1
4
3
2

2

4
2
2
monastic
2
monastery
38
1
4
3
2

2
t
4
1
2
Monash
38
1
4
3
2
ch
2

4
3
2
monarchy
2
monarchic
2
monarch
38
1
4
3
2

2

4
2
2
monadic
2
monad
38
1
4
3
2

2
aegikorst
4
3
2
monument
2
Monmouth
2
Monday
38
1
4
3
2
nt
2
a
4
4
2
moments
2
momentum
2
momentous
2
moment
38
1
4
3
2

2

4
2
2
momentary
2
momenta
38
1
4
3
2

2
e
4
1
2
mommy
38
1
4
3
2
n
2

4
2
2
molybdenum
2
molybdenite
38
1
4
3
2
bd
2
e
4
1
2
molybdate
38
1
4
3
2

2

4
2
2
molten
2
molt
38
1
4
3
2

2

4
2
2
mollycoddle
2
Molly
38
1
4
3
2

2

4
2
2
mollify
2
Mollie
38
1
4
3
2

2
iy
4
2
2
mollusk
2
Moll
38
1
4
3
2

2

4
2
2
Moline
2
Moliere
38
1
4
3
2
ul
2

4
2
2
molecule
2
molecular
38
1
4
3
2

2
c
4
3
2
molest
2
molehill
2
mole
38
1
4
3
2

2

4
3
2
moldboard
2
Moldavia
2
mold
38
1
4
3
2

2

4
3
2
molasses
2
molar
2
molal
38
1
4
3
2

2
adeilty
4
2
2
Moluccas
2
Moloch
38
1
4
3
2

2

4
3
2
moisture
2
moisten
2
moist
38
1
4
3
2

2
t
4
1
2
Moiseyev
38
1
4
3
2

2
s
4
3
2
moire
2
Moines
2
moiety
38
1
4
3
2

2

4
2
2
Mohawk
2
Mohammedan
38
1
4
3
2

2
a
4
1
2
Mohr
38
1
4
3
2

2

4
2
2
Moen
2
Moe
38
1
4
3
2

2

4
2
2
modulate
2
modular
38
1
4
3
2
l
2
a
4
4
2
modulus
2
modulo
2
moduli
2
module
38
1
4
3
2

2
f
4
2
2
modish
2
modicum
38
1
4
3
2
t
2

4
3
2
modesty
2
Modesto
2
modest
38
1
4
3
2

2

4
2
2
modern
2
moderate
38
1
4
3
2

2
rs
4
3
2
modem
2
model
2
mode
38
1
4
3
2

2
eiu
4
1
2
modal
38
1
4
3
2
r
2

4
2
2
mockery
2
mockernut
38
1
4
3
2

2
e
4
3
2
mockup
2
mockingbird
2
mock
38
1
4
3
2

2
k
4
1
2
moccasin
38
1
4
3
2
l
2

4
3
2
mobility
2
mobile
2
Mobil
38
1
4
3
2

2
i
4
3
2
mobster
2
mobcap
2
mob
38
1
4
3
2

2

4
2
2
moat
2
moan
38
1
4
3
2

2
abcdehilmnorstuv
4
6
2
Mozart
2
Moyer
2
mow
2
mop
2
Mogadiscio
2
MO
38
1
4
3
2

2

4
2
2
mnemonic
2
MN
38
1
4
3
2

2

4
3
2
mixup
2
mixture
2
mix
38
1
4
3
2

2

4
2
2
mitten
2
mitt
38
1
4
3
2

2

4
2
2
mitre
2
mitral
38
1
4
3
2

2

4
2
2
mitosis
2
mitochondria
38
1
4
3
2

2

4
2
2
miterwort
2
mite
38
1
4
3
2

2
eort
4
3
2
mitigate
2
Mitchell
2
MIT
38
1
4
3
2

2

4
5
2
mistaken
2
misty
2
mistress
2
mistletoe
2
mist
38
1
4
3
2
u
2

4
2
2
Missouri
2
Missoula
38
1
4
3
2
sippi
2

4
2
2
Mississippian
2
Mississippi
38
1
4
3
2
n
2

4
2
2
missionary
2
mission
38
1
4
3
2

2
os
4
3
2
missing
2
missive
2
missile
38
1
4
3
2

2
iop
4
4
2
missed
2
Missy
2
misshapen
2
miss
38
1
4
3
2
gyn
2

4
2
2
misogyny
2
misogynist
38
1
4
3
2
r
2

4
2
2
misery
2
miser
38
1
4
3
2

2
l
4
1
2
miscegenation
38
1
4
3
2
lan
2

4
2
2
miscellany
2
miscellaneous
38
1
4
3
2

2
e
4
3
2
miscreant
2
mischievous
2
miscible
38
1
4
3
2
nthrop
2

4
2
2
misanthropic
2
misanthrope
38
1
4
3
2

2
aceost
4
2
2
mislaid
2
misnomer
38
1
4
3
2

2
c
4
3
2
Miranda
2
mirage
2
Mira
38
1
4
3
2

2

4
2
2
miraculous
2
miracle
38
1
4
3
2

2
a
4
5
2
mirth
2
mirror
2
Miriam
2
Mirfak
2
mire
38
1
4
3
2

2
m
4
1
2
minute
38
1
4
3
2

2

4
2
2
minutemen
2
minuteman
38
1
4
3
2

2
e
4
1
2
minutiae
38
1
4
3
2

2

4
2
2
minuscule
2
minus
38
1
4
3
2

2

4
2
2
minuet
2
minuend
38
1
4
3
2

2
est
4
0
38
1
4
3
2
rel
2

4
2
2
minstrelsy
2
minstrel
38
1
4
3
2

2

4
2
2
Minsky
2
Minsk
38
1
4
3
2

2
kt
4
0
38
1
4
3
2

2

4
4
2
minot
2
Minos
2
minor
2
Minoan
38
1
4
3
2

2

4
2
2
Minnesota
2
Minneapolis
38
1
4
3
2

2
e
4
2
2
minnow
2
Minnie
38
1
4
3
2
t
2

4
2
2
ministry
2
ministerial
38
1
4
3
2

2

4
3
2
minimax
2
minimal
2
minima
38
1
4
3
2

2
a
4
2
2
minimum
2
minim
38
1
4
3
2

2
ms
4
4
2
minion
2
minicomputer
2
miniature
2
mini
38
1
4
3
2

2

4
2
2
minesweeper
2
minestrone
38
1
4
3
2
l
2

4
2
2
mineralogy
2
mineral
38
1
4
3
2

2
a
4
1
2
Minerva
38
1
4
3
2

2
rs
4
2
2
minefield
2
mine
38
1
4
3
2

2

4
3
2
mindful
2
Mindanao
2
mind
38
1
4
3
2
e
2

4
2
2
mincemeat
2
mince
38
1
4
3
2

2
cdeinosu
4
5
2
mint
2
mink
2
mingle
2
minaret
2
min
38
1
4
3
2

2

4
2
2
mimicking
2
mimicked
38
1
4
3
2

2
k
4
1
2
mimic
38
1
4
3
2

2
c
4
1
2
Mimi
38
1
4
3
2

2

4
3
2
mimetic
2
mimesis
2
mimeograph
38
1
4
3
2

2
ei
4
0
38
1
4
3
2
n
2

4
2
2
Miltonic
2
Milton
38
1
4
3
2

2
o
4
1
2
milt
38
1
4
3
2
n
2

4
4
2
millions
2
millionth
2
millionaire
2
million
38
1
4
3
2

2
o
4
4
2
millipede
2
millinery
2
Millikan
2
Millie
38
1
4
3
2

2
n
4
2
2
millenia
2
millenarian
38
1
4
3
2
i
2

4
2
2
millennium
2
millennia
38
1
4
3
2

2
n
4
1
2
millet
38
1
4
3
2

2
ei
4
3
2
millstone
2
Millard
2
mill
38
1
4
3
2

2

4
3
2
milky
2
milkweed
2
milk
38
1
4
3
2
a
2

4
2
2
militiamen
2
militia
38
1
4
3
2

2
r
4
2
2
militate
2
militant
38
1
4
3
2
s
2

4
2
2
militarist
2
militarism
38
1
4
3
2

2
i
4
1
2
military
38
1
4
3
2

2
ai
4
0
38
1
4
3
2

2
t
4
1
2
milieu
38
1
4
3
2

2

4
2
2
milestone
2
Miles
38
1
4
3
2

2
s
4
2
2
mileage
2
mile
38
1
4
3
2

2

4
3
2
Mildred
2
mildew
2
mild
38
1
4
3
2

2

4
2
2
Milan
2
mila
38
1
4
3
2

2
adeiklt
4
3
2
Milwaukee
2
milord
2
milch
38
1
4
3
2

2

4
2
2
migratory
2
migrate
38
1
4
3
2
a
2
t
4
1
2
migrant
38
1
4
3
2
t
2

4
3
2
mighty
2
mightn't
2
might
38
1
4
3
2

2
hr
4
3
2
Miguel
2
mignon
2
mig
38
1
4
3
2

2

4
3
2
midwives
2
midwinter
2
midwife
38
1
4
3
2
t
2

4
2
2
Midwestern
2
Midwest
38
1
4
3
2

2
s
4
1
2
midweek
38
1
4
3
2

2
ei
4
1
2
midway
38
1
4
3
2

2

4
2
2
midstream
2
midst
38
1
4
3
2
ipm
2

4
2
2
midshipmen
2
midshipman
38
1
4
3
2

2
ht
4
3
2
midspan
2
midsection
2
midscale
38
1
4
3
2
e
2

4
2
2
midget
2
midge
38
1
4
3
2
o
2

4
2
2
Middletown
2
Middleton
38
1
4
3
2

2

4
2
2
middlemen
2
middleman
38
1
4
3
2
e
2
mt
4
4
2
middleweight
2
Middlesex
2
Middlebury
2
middle
38
1
4
3
2

2
l
4
1
2
midday
38
1
4
3
2

2
dgsw
4
9
2
midterm
2
midrange
2
midpoint
2
midnight
2
midmorn
2
midland
2
midband
2
Midas
2
mid
38
1
4
3
2

2

4
2
2
Micronesia
2
micron
38
1
4
3
2
o
2
n
4
5
2
microscopy
2
micrography
2
microcosm
2
microbial
2
micro
38
1
4
3
2

2

4
2
2
Mickey
2
Mickelson
38
1
4
3
2

2
e
4
1
2
Micky
38
1
4
3
2
l
2

4
5
2
Michelson
2
Michelin
2
Michele
2
Michelangelo
2
Michel
38
1
4
3
2
el
2

4
2
2
Michaelangelo
2
Michael
38
1
4
3
2

2
ae
4
1
2
michigan
38
1
4
3
2

2
hkr
4
2
2
mice
2
mica
38
1
4
3
2
ma
2

4
2
2
miasmal
2
miasma
38
1
4
3
2

2
s
4
1
2
Miami
38
1
4
3
2

2
acdglmnrstx
4
6
2
Mizar
2
Miocene
2
mike
2
miff
2
mien
2
mi
38
1
4
3
2
ic
2

4
2
2
Mexico
2
Mexican
38
1
4
3
2
le
2

4
2
2
mettlesome
2
mettle
38
1
4
3
2
oli
2

4
2
2
metropolitan
2
metropolis
38
1
4
3
2

2
p
4
2
2
metronome
2
metro
38
1
4
3
2

2
o
4
1
2
metric
38
1
4
3
2

2

4
2
2
metier
2
meticulous
38
1
4
3
2
l
2

4
2
2
methylene
2
methyl
38
1
4
3
2

2

4
2
2
Methuselah
2
Methuen
38
1
4
3
2
d
2

4
4
2
methods
2
methodology
2
methodic
2
method
38
1
4
3
2

2
n
4
1
2
methacrylate
38
1
4
3
2

2

4
2
2
methanol
2
methane
38
1
4
3
2

2
aouy
4
1
2
methionine
38
1
4
3
2

2

4
2
2
meteoritic
2
meteorite
38
1
4
3
2

2
t
4
1
2
meteoric
38
1
4
3
2
r
2
i
4
2
2
meteorology
2
meteor
38
1
4
3
2

2
o
4
2
2
meter
2
mete
38
1
4
3
2
hor
2

4
2
2
metaphoric
2
metaphor
38
1
4
3
2
s
2

4
2
2
metamorphosis
2
metamorphose
38
1
4
3
2

2

4
2
2
metamorphism
2
metamorphic
38
1
4
3
2
orph
2
io
4
0
38
1
4
3
2

2

4
2
2
metallurgist
2
metallurgic
38
1
4
3
2
rg
2
i
4
1
2
metallurgy
38
1
4
3
2

2

4
2
2
metalloid
2
metallography
38
1
4
3
2

2

4
2
2
metalliferous
2
metallic
38
1
4
3
2

2
iou
4
0
38
1
4
3
2

2
l
4
2
2
metalwork
2
metal
38
1
4
3
2
ol
2
i
4
1
2
metabole
38
1
4
3
2

2

4
3
2
metabolite
2
metabolism
2
metabolic
38
1
4
3
2

2
blmp
4
0
38
1
4
3
2

2
aehirt
4
3
2
Metzler
2
Metcalf
2
met
38
1
4
3
2

2

4
2
2
messieurs
2
Messiah
38
1
4
3
2

2
ia
4
4
2
messy
2
Messrs
2
messenger
2
mess
38
1
4
3
2

2

4
4
2
Mesozoic
2
Mesopotamia
2
meson
2
mesoderm
38
1
4
3
2
al
2

4
2
2
mescaline
2
mescal
38
1
4
3
2

2
cos
4
5
2
mesquite
2
mesmeric
2
mesh
2
mesenteric
2
mesa
38
1
4
3
2

2

4
2
2
merrymake
2
merry
38
1
4
3
2

2
m
4
3
2
Merritt
2
Merrill
2
Merriam
38
1
4
3
2

2

4
2
2
merriment
2
Merrimack
38
1
4
3
2

2
iy
4
0
38
1
4
3
2

2

4
2
2
merlin
2
Merle
38
1
4
3
2

2

4
2
2
meritorious
2
merit
38
1
4
3
2
i
2

4
2
2
meridional
2
meridian
38
1
4
3
2

2
dt
4
1
2
meringue
38
1
4
3
2

2

4
2
2
merge
2
merganser
38
1
4
3
2

2

4
4
2
merely
2
meretricious
2
Meredith
2
mere
38
1
4
3
2

2
aehu
4
3
2
mercy
2
Merck
2
merciful
38
1
4
3
2

2

4
2
2
mercuric
2
mercurial
38
1
4
3
2
r
2
i
4
1
2
mercury
38
1
4
3
2
an
2

4
2
2
merchant
2
merchandise
38
1
4
3
2

2

4
3
2
mercer
2
mercenary
2
Mercedes
38
1
4
3
2

2

4
2
2
Mercator
2
mercantile
38
1
4
3
2

2
cegilr
4
2
2
Mervin
2
mermaid
38
1
4
3
2

2
i
4
2
2
mentor
2
mental
38
1
4
3
2
ra
2

4
2
2
mensuration
2
mensurable
38
1
4
3
2

2
u
4
1
2
menstruate
38
1
4
3
2

2

4
3
2
meniscus
2
meningitis
2
menial
38
1
4
3
2
l
2

4
3
2
Mendelssohn
2
mendelevium
2
Mendel
38
1
4
3
2
ci
2

4
2
2
mendacity
2
mendacious
38
1
4
3
2

2
ae
4
1
2
mend
38
1
4
3
2

2

4
3
2
menarche
2
menagerie
2
menace
38
1
4
3
2

2
adist
4
8
2
Menzies
2
menu
2
Mennonite
2
Menlo
2
menhaden
2
menfolk
2
Menelaus
2
men
38
1
4
3
2

2
bn
4
0
38
1
4
3
2
d
2

4
2
2
memorandum
2
memoranda
38
1
4
3
2

2

4
2
2
memorable
2
memorabilia
38
1
4
3
2

2
a
4
2
2
memory
2
memorial
38
1
4
3
2

2
r
4
2
2
memoir
2
memo
38
1
4
3
2

2
e
4
1
2
membrane
38
1
4
3
2

2
bo
4
2
2
Memphis
2
memento
38
1
4
3
2
i
2

4
2
2
Melvin
2
Melville
38
1
4
3
2

2
ir
4
1
2
melody
38
1
4
3
2
ama
2

4
2
2
melodramatic
2
melodrama
38
1
4
3
2

2

4
2
2
melodious
2
melodic
38
1
4
3
2

2
d
4
1
2
melon
38
1
4
3
2
o
2

4
2
2
mellow
2
Mellon
38
1
4
3
2

2

4
3
2
Melissa
2
meliorate
2
Melinda
38
1
4
3
2

2

4
2
2
melanin
2
Melanie
38
1
4
3
2

2
i
4
4
2
melanoma
2
melange
2
Melanesia
2
melancholy
38
1
4
3
2

2
n
4
1
2
melamine
38
1
4
3
2

2
ailov
4
7
2
melt
2
Melpomene
2
melee
2
meld
2
Melcher
2
Melbourne
2
Mel
38
1
4
3
2

2

4
3
2
Meistersinger
2
meiosis
2
Meier
38
1
4
3
2

2

4
2
2
megaword
2
megawatt
38
1
4
3
2
omania
2

4
2
2
megalomaniac
2
megalomania
38
1
4
3
2

2

4
2
2
megabyte
2
megabit
38
1
4
3
2

2
blw
4
3
2
megavolt
2
megaton
2
megahertz
38
1
4
3
2

2
a
4
2
2
megohm
2
Meg
38
1
4
3
2

2
i
4
2
2
meets
2
meet
38
1
4
3
2

2
t
4
1
2
meek
38
1
4
3
2

2

4
2
2
medley
2
medlar
38
1
4
3
2

2

4
2
2
Mediterranean
2
meditate
38
1
4
3
2
cr
2

4
2
2
mediocrity
2
mediocre
38
1
4
3
2

2

4
2
2
medicine
2
medicinal
38
1
4
3
2

2
n
4
1
2
Medici
38
1
4
3
2

2
ia
4
2
2
medico
2
medic
38
1
4
3
2

2

4
4
2
mediate
2
median
2
medial
2
media
38
1
4
3
2

2
acot
4
1
2
medium
38
1
4
3
2
l
2

4
2
2
medallion
2
medal
38
1
4
3
2

2
ail
4
4
2
Medusa
2
Medford
2
Medea
2
meddle
38
1
4
3
2

2

4
2
2
mechanist
2
mechanism
38
1
4
3
2
ani
2
s
4
1
2
mechanic
38
1
4
3
2

2
h
4
2
2
mecum
2
Mecca
38
1
4
3
2

2

4
2
2
meaty
2
meat
38
1
4
3
2

2

4
2
2
measure
2
measle
38
1
4
3
2

2

4
2
2
meantime
2
meant
38
1
4
3
2

2
t
4
5
2
means
2
meanwhile
2
meaningful
2
meander
2
mean
38
1
4
3
2

2

4
3
2
mealy
2
mealtime
2
meal
38
1
4
3
2

2
o
4
1
2
mead
38
1
4
3
2
w
2

4
3
2
meadowsweet
2
meadowland
2
meadow
38
1
4
3
2

2
dlnst
4
1
2
meager
38
1
4
3
2

2
acdegilmnrstx
4
6
2
mezzo
2
Meyer
2
mew
2
Mephistopheles
2
Mekong
2
me
38
1
4
3
2

2

4
2
2
McNaughton
2
McNally
38
1
4
3
2

2
a
4
2
2
McNulty
2
McNeil
38
1
4
3
2

2

4
3
2
McMullen
2
McMillan
2
McMahon
38
1
4
3
2

2

4
2
2
McLeod
2
McLean
38
1
4
3
2

2
e
4
1
2
McLaughlin
38
1
4
3
2
n
2

4
2
2
McKinney
2
McKinley
38
1
4
3
2

2

4
2
2
McKenzie
2
McKenna
38
1
4
3
2

2
n
4
3
2
McKesson
2
McKeon
2
McKee
38
1
4
3
2

2
ei
4
2
2
McKnight
2
McKay
38
1
4
3
2
nt
2

4
2
2
McIntyre
2
McIntosh
38
1
4
3
2

2

4
2
2
McGraw
2
McGrath
38
1
4
3
2

2
a
4
1
2
McGregor
38
1
4
3
2

2

4
2
2
McGowan
2
McGovern
38
1
4
3
2

2

4
2
2
McGinnis
2
McGill
38
1
4
3
2

2
ior
4
2
2
McGuire
2
McGee
38
1
4
3
2
a
2

4
2
2
McFarland
2
McFadden
38
1
4
3
2

2

4
2
2
McDonnell
2
McDonald
38
1
4
3
2

2
n
4
2
2
McDowell
2
McDougall
38
1
4
3
2

2
o
4
2
2
McDermott
2
McDaniel
38
1
4
3
2
nel
2

4
2
2
McConnell
2
McConnel
38
1
4
3
2

2
n
4
2
2
McCoy
2
McCormick
38
1
4
3
2

2

4
2
2
McCluskey
2
McClure
38
1
4
3
2

2
u
4
2
2
McClellan
2
McClain
38
1
4
3
2

2
lr
4
3
2
McCauley
2
McCann
2
McCabe
38
1
4
3
2
t
2

4
2
2
McCarty
2
McCarthy
38
1
4
3
2
l
2

4
2
2
McCallum
2
McCall
38
1
4
3
2

2
alo
4
2
2
McCullough
2
McCracken
38
1
4
3
2

2

4
2
2
McAllister
2
McAdams
38
1
4
3
2

2
ACDFGIKLMN
4
4
2
McPherson
2
McHugh
2
McElroy
2
McBride
38
1
4
3
2
A
2

4
2
2
Mbabane
2
MBA
38
1
4
3
2

2

4
3
2
mazurka
2
maze
2
Mazda
38
1
4
3
2

2

4
2
2
mayoral
2
mayor
38
1
4
3
2

2
r
4
2
2
mayonnaise
2
Mayo
38
1
4
3
2

2

4
2
2
Mayflower
2
Mayfair
38
1
4
3
2

2

4
2
2
mayapple
2
Maya
38
1
4
3
2

2
afo
4
6
2
mayst
2
Maynard
2
mayhem
2
Mayer
2
maybe
2
may
38
1
4
3
2
ell
2

4
2
2
Maxwellian
2
maxwell
38
1
4
3
2

2
a
4
3
2
maximum
2
Maximilian
2
maxim
38
1
4
3
2

2

4
2
2
maximal
2
maxima
38
1
4
3
2

2
m
4
1
2
Maxine
38
1
4
3
2

2
iw
4
1
2
max
38
1
4
3
2

2

4
3
2
Mawr
2
mawkish
2
maw
38
1
4
3
2

2

4
2
2
Mavis
2
maverick
38
1
4
3
2

2

4
2
2
Mauritius
2
Mauritania
38
1
4
3
2

2

4
2
2
Mauricio
2
Maurice
38
1
4
3
2

2
ct
4
1
2
Maurine
38
1
4
3
2

2
i
4
1
2
Maureen
38
1
4
3
2

2
r
4
4
2
mauve
2
mausoleum
2
maul
2
maudlin
38
1
4
3
2
r
2

4
2
2
mature
2
maturate
38
1
4
3
2

2
e
4
4
2
Mattson
2
mattress
2
mattock
2
Matthew
38
1
4
3
2

2

4
2
2
Matsumoto
2
Matson
38
1
4
3
2

2

4
2
2
matron
2
matroid
38
1
4
3
2

2
acm
4
1
2
matrix
38
1
4
3
2
on
2

4
2
2
matrimony
2
matrimonial
38
1
4
3
2

2

4
2
2
matriculate
2
matrices
38
1
4
3
2
rch
2

4
2
2
matriarchal
2
matriarch
38
1
4
3
2

2
io
4
0
38
1
4
3
2

2

4
3
2
matins
2
matinee
2
matinal
38
1
4
3
2

2
n
4
2
2
Matisse
2
Matilda
38
1
4
3
2

2

4
2
2
Mathieu
2
Mathias
38
1
4
3
2
s
2

4
2
2
Mathewson
2
Mathews
38
1
4
3
2
ati
2
c
4
1
2
Mathematik
38
1
4
3
2

2

4
2
2
mathematician
2
mathematic
38
1
4
3
2

2
mw
4
0
38
1
4
3
2

2
ei
4
1
2
math
38
1
4
3
2

2

4
2
2
maternity
2
maternal
38
1
4
3
2

2

4
2
2
materiel
2
material
38
1
4
3
2

2
in
4
1
2
mater
38
1
4
3
2

2
r
4
2
2
Mateo
2
mate
38
1
4
3
2
h
2

4
4
2
matching
2
matchmake
2
matchbook
2
match
38
1
4
3
2

2
cehirstu
4
1
2
mat
38
1
4
3
2

2

4
2
2
mastiff
2
mastic
38
1
4
3
2
r
2

4
6
2
masters
2
mastery
2
masterpiece
2
mastermind
2
masterful
2
master
38
1
4
3
2

2
ei
4
3
2
masturbate
2
mastodon
2
mast
38
1
4
3
2

2

4
2
2
massive
2
massif
38
1
4
3
2

2

4
2
2
Massey
2
masseur
38
1
4
3
2

2

4
2
2
massacre
2
Massachusetts
38
1
4
3
2

2
c
4
1
2
massage
38
1
4
3
2

2
aei
4
1
2
mass
38
1
4
3
2
ue
2

4
2
2
masquerade
2
masque
38
1
4
3
2

2

4
2
2
Masonite
2
Masonic
38
1
4
3
2

2
i
4
2
2
masonry
2
mason
38
1
4
3
2
his
2

4
2
2
masochist
2
masochism
38
1
4
3
2

2
cn
4
0
38
1
4
3
2
r
2

4
2
2
Maseru
2
maser
38
1
4
3
2

2

4
2
2
masculine
2
mascara
38
1
4
3
2

2
ceoqst
4
2
2
mask
2
mash
38
1
4
3
2

2

4
2
2
Maryland
2
Mary
38
1
4
3
2
l
2

4
2
2
marvelous
2
marvel
38
1
4
3
2

2
e
4
1
2
Marvin
38
1
4
3
2

2

4
2
2
martyrdom
2
martyr
38
1
4
3
2

2
r
4
1
2
Marty
38
1
4
3
2

2

4
2
2
Martinique
2
martini
38
1
4
3
2

2
i
4
4
2
Martinson
2
martingale
2
Martinez
2
martin
38
1
4
3
2

2

4
2
2
Martian
2
martial
38
1
4
3
2

2
an
4
0
38
1
4
3
2
n
2

4
2
2
martensite
2
marten
38
1
4
3
2

2
eiy
4
2
2
Martha
2
mart
38
1
4
3
2

2

4
2
2
Marshall
2
marshal
38
1
4
3
2

2
l
4
1
2
Marsha
38
1
4
3
2

2
a
4
3
2
marshmallow
2
marshland
2
marsh
38
1
4
3
2

2
h
4
2
2
marsupial
2
Marseilles
38
1
4
3
2
w
2

4
2
2
marrowbone
2
marrow
38
1
4
3
2

2
a
4
2
2
Marriott
2
Marrietta
38
1
4
3
2
ge
2

4
2
2
marriageable
2
marriage
38
1
4
3
2

2
io
4
1
2
marry
38
1
4
3
2

2

4
4
2
Marquette
2
marquess
2
marquee
2
marque
38
1
4
3
2
u
2
e
4
1
2
marquis
38
1
4
3
2

2

4
2
2
marmot
2
marmalade
38
1
4
3
2
oro
2

4
2
2
Marlborough
2
Marlboro
38
1
4
3
2

2
b
4
3
2
Marlowe
2
marlin
2
Marlene
38
1
4
3
2
m
2

4
2
2
marksmen
2
marksman
38
1
4
3
2
v
2

4
2
2
Markovian
2
Markov
38
1
4
3
2
t
2
e
4
5
2
markets
2
marketing
2
marketwise
2
marketplace
2
market
38
1
4
3
2

2
eos
4
2
2
Markham
2
mark
38
1
4
3
2
or
2

4
3
2
Marjory
2
Marjorie
2
marjoram
38
1
4
3
2

2

4
2
2
maritime
2
marital
38
1
4
3
2

2

4
2
2
marionette
2
Marion
38
1
4
3
2

2
n
4
1
2
Mario
38
1
4
3
2

2

4
3
2
marinate
2
marinade
2
marina
38
1
4
3
2

2
a
4
3
2
Marino
2
marine
2
Marin
38
1
4
3
2

2

4
2
2
Marietta
2
Marie
38
1
4
3
2

2

4
2
2
Marianne
2
maria
38
1
4
3
2

2
aenot
4
4
2
marimba
2
Marilyn
2
marijuana
2
marigold
38
1
4
3
2
l
2

4
2
2
marginalia
2
marginal
38
1
4
3
2
n
2
a
4
1
2
margin
38
1
4
3
2
r
2

4
2
2
margarine
2
Margaret
38
1
4
3
2

2
ai
4
3
2
Marguerite
2
Margo
2
Margery
38
1
4
3
2

2

4
2
2
Marcello
2
Marcel
38
1
4
3
2

2
l
4
1
2
Marceau
38
1
4
3
2

2
e
4
6
2
Marcy
2
Marcus
2
Marco
2
Marcia
2
march
2
Marc
38
1
4
3
2

2

4
2
2
maraud
2
marathon
38
1
4
3
2

2
acgijklmqrstvy
4
6
2
Marx
2
maroon
2
mare
2
Mardi
2
marble
2
mar
38
1
4
3
2

2

4
2
2
maple
2
map
38
1
4
3
2

2

4
2
2
Maori
2
Mao
38
1
4
3
2

2

4
2
2
manumitted
2
manumit
38
1
4
3
2
i
2
t
4
1
2
manumission
38
1
4
3
2

2
m
4
5
2
manuscript
2
manure
2
manufacture
2
Manuel
2
manual
38
1
4
3
2
e
2

4
2
2
mantlepiece
2
mantle
38
1
4
3
2

2

4
2
2
mantissa
2
mantis
38
1
4
3
2

2
s
4
1
2
mantic
38
1
4
3
2

2
il
4
2
2
mantrap
2
mantel
38
1
4
3
2

2

4
2
2
manservant
2
manse
38
1
4
3
2

2
e
4
3
2
manslaughter
2
mansion
2
Mansfield
38
1
4
3
2

2

4
2
2
manor
2
manometer
38
1
4
3
2

2
e
4
2
2
manna
2
Mann
38
1
4
3
2
ula
2

4
2
2
manipulate
2
manipulable
38
1
4
3
2
st
2

4
2
2
manifestation
2
manifest
38
1
4
3
2

2
e
4
1
2
manifold
38
1
4
3
2

2
c
4
1
2
mania
38
1
4
3
2

2

4
2
2
maniacal
2
maniac
38
1
4
3
2

2
afp
4
4
2
Manitoba
2
Manila
2
manikin
2
manic
38
1
4
3
2

2

4
2
2
manhole
2
Manhattan
38
1
4
3
2

2

4
2
2
mangel
2
mange
38
1
4
3
2

2
e
4
2
2
mangle
2
manganese
38
1
4
3
2

2

4
2
2
maneuver
2
mane
38
1
4
3
2

2

4
3
2
mandrill
2
mandrel
2
mandrake
38
1
4
3
2

2
t
4
2
2
mandarin
2
mandamus
38
1
4
3
2

2

4
2
2
mandatory
2
mandate
38
1
4
3
2

2
ar
4
0
38
1
4
3
2

2
r
4
5
2
manages
2
management
2
managed
2
manageable
2
manage
38
1
4
3
2

2
e
4
2
2
managing
2
Managua
38
1
4
3
2

2
g
4
3
2
manatee
2
Manama
2
mana
38
1
4
3
2

2
adeghinostu
4
9
2
manzanita
2
many
2
Manville
2
manpower
2
Manley
2
mankind
2
Manfred
2
Manchester
2
man
38
1
4
3
2

2
l
4
1
2
mamma
38
1
4
3
2

2

4
2
2
mammalian
2
mammal
38
1
4
3
2

2
a
4
1
2
mammoth
38
1
4
3
2

2
m
4
1
2
mambo
38
1
4
3
2

2

4
2
2
maltose
2
Malton
38
1
4
3
2

2
o
4
4
2
maltreat
2
Maltese
2
Malta
2
malt
38
1
4
3
2

2

4
2
2
malpractice
2
malposed
38
1
4
3
2
e
2

4
2
2
Maloney
2
Malone
38
1
4
3
2

2
n
4
1
2
malocclusion
38
1
4
3
2

2

4
2
2
malnutrition
2
malnourished
38
1
4
3
2

2

4
2
2
mallow
2
Mallory
38
1
4
3
2

2

4
2
2
mallet
2
malleable
38
1
4
3
2

2
eo
4
2
2
mallard
2
mall
38
1
4
3
2
n
2

4
2
2
malignant
2
malign
38
1
4
3
2

2

4
2
2
malicious
2
malice
38
1
4
3
2

2
cg
4
1
2
Mali
38
1
4
3
2
rm
2

4
2
2
malformed
2
malformation
38
1
4
3
2

2
o
4
2
2
malfunction
2
malfeasant
38
1
4
3
2

2

4
3
2
malevolent
2
maledict
2
male
38
1
4
3
2

2

4
2
2
Maldive
2
maldistribute
38
1
4
3
2

2
i
4
1
2
Malden
38
1
4
3
2

2

4
2
2
malcontent
2
malconduct
38
1
4
3
2
o
2
n
4
1
2
Malcolm
38
1
4
3
2

2
dry
4
5
2
Malawi
2
malaprop
2
malaise
2
Malagasy
2
Malabar
38
1
4
3
2

2

4
2
2
Malaysia
2
Malay
38
1
4
3
2
ia
2

4
2
2
malarial
2
malaria
38
1
4
3
2
pt
2

4
2
2
maladaptive
2
maladapt
38
1
4
3
2

2
a
4
3
2
malady
2
maladroit
2
maladjust
38
1
4
3
2

2
acdefilnopt
4
1
2
Malraux
38
1
4
3
2

2
e
4
1
2
making
38
1
4
3
2
st
2

4
2
2
majesty
2
majestic
38
1
4
3
2

2
e
4
1
2
major
38
1
4
3
2

2

4
2
2
maintenance
2
maintain
38
1
4
3
2
t
2

4
2
2
mainstream
2
mainstay
38
1
4
3
2

2

4
3
2
mainly
2
mainline
2
mainland
38
1
4
3
2

2
lst
4
2
2
Maine
2
main
38
1
4
3
2

2

4
2
2
mailmen
2
mailman
38
1
4
3
2

2
m
4
3
2
mailing
2
mailbox
2
mail
38
1
4
3
2

2
e
4
2
2
maidservant
2
maid
38
1
4
3
2
n
2

4
2
2
maidenhair
2
maiden
38
1
4
3
2

2
dln
4
3
2
maitre
2
maim
2
Maier
38
1
4
3
2

2

4
2
2
Mahoney
2
mahogany
38
1
4
3
2
yan
2

4
2
2
Mahayanist
2
Mahayana
38
1
4
3
2

2
ao
4
0
38
1
4
3
2

2

4
2
2
Magnuson
2
magnum
38
1
4
3
2

2

4
2
2
magnify
2
magnificent
38
1
4
3
2

2
f
4
1
2
magnitude
38
1
4
3
2

2

4
2
2
magnetite
2
magnetic
38
1
4
3
2

2
i
4
3
2
magnetron
2
magneto
2
magnet
38
1
4
3
2
i
2

4
3
2
magnesium
2
magnesite
2
magnesia
38
1
4
3
2

2
st
4
0
38
1
4
3
2

2
n
4
2
2
magnate
2
magna
38
1
4
3
2
im
2

4
2
2
magnanimous
2
magnanimity
38
1
4
3
2

2
aeiu
4
1
2
magnolia
38
1
4
3
2
t
2

4
2
2
magistrate
2
magisterial
38
1
4
3
2

2

4
2
2
magician
2
magic
38
1
4
3
2

2
cs
4
1
2
magi
38
1
4
3
2
t
2

4
2
2
maggoty
2
maggot
38
1
4
3
2

2
o
4
1
2
Maggie
38
1
4
3
2

2
gin
4
7
2
Magruder
2
magpie
2
Magog
2
magma
2
magenta
2
Magdalene
2
magazine
38
1
4
3
2

2

4
3
2
maestro
2
Maelstrom
2
Mae
38
1
4
3
2

2

4
2
2
madstone
2
Madsen
38
1
4
3
2

2

4
2
2
madrigal
2
Madrid
38
1
4
3
2

2
i
4
1
2
Madras
38
1
4
3
2

2

4
2
2
madmen
2
madman
38
1
4
3
2

2

4
2
2
Madeline
2
Madeleine
38
1
4
3
2

2
l
4
2
2
Madeira
2
made
38
1
4
3
2

2

4
2
2
Maddox
2
madden
38
1
4
3
2

2

4
2
2
Madame
2
madam
38
1
4
3
2

2
m
4
1
2
Madagascar
38
1
4
3
2

2
ademrs
4
5
2
Madonna
2
Madison
2
madhouse
2
madcap
2
mad
38
1
4
3
2

2

4
2
2
macrostructure
2
macroscopic
38
1
4
3
2
olecul
2

4
2
2
macromolecule
2
macromolecular
38
1
4
3
2
o
2
ms
4
2
2
macrophage
2
macro
38
1
4
3
2

2

4
2
2
Mackinaw
2
Mackinac
38
1
4
3
2
n
2
a
4
1
2
mackintosh
38
1
4
3
2

2

4
3
2
Mackey
2
mackerel
2
MacKenzie
38
1
4
3
2

2
ei
4
1
2
mack
38
1
4
3
2

2

4
2
2
machinery
2
machine
38
1
4
3
2

2
e
4
1
2
machination
38
1
4
3
2

2
n
4
2
2
machismo
2
Machiavelli
38
1
4
3
2

2
i
4
2
2
macho
2
Mach
38
1
4
3
2
on
2

4
2
2
Macedonia
2
Macedon
38
1
4
3
2

2
d
4
1
2
mace
38
1
4
3
2
o
2

4
2
2
MacDougall
2
MacDonald
38
1
4
3
2

2

4
4
2
Macassar
2
MacArthur
2
macaque
2
macabre
38
1
4
3
2

2
aDehKr
4
6
2
Macon
2
MacMillan
2
macintosh
2
MacGregor
2
Macbeth
2
Mac
38
1
4
3
2

2
cdeghijklmnoprstuvwxyz
4
2
2
Mabel
2
ma
38
1
4
3
2

2
abceinoruys
4
5
2
Mt
2
m's
2
MPH
2
MD
2
m
38
1
4
3
2

2

4
2
2
lysergic
2
Lysenko
38
1
4
3
2

2
e
4
1
2
lysine
38
1
4
3
2

2

4
2
2
lyric
2
Lyra
38
1
4
3
2
h
2

4
2
2
Lynchburg
2
lynch
38
1
4
3
2

2
c
4
2
2
lynx
2
Lynn
38
1
4
3
2

2

4
2
2
lymphoma
2
lymphocyte
38
1
4
3
2
h
2
o
4
1
2
lymph
38
1
4
3
2

2
p
4
1
2
Lyman
38
1
4
3
2

2
mnrs
4
7
2
Lyon
2
Lyle
2
Lykes
2
lying
2
lye
2
Lydia
2
lycopodium
38
1
4
3
2

2
a
4
1
2
luxurious
38
1
4
3
2

2

4
2
2
luxuriate
2
luxuriant
38
1
4
3
2
r
2
i
4
1
2
luxury
38
1
4
3
2

2

4
2
2
Luxembourg
2
luxe
38
1
4
3
2

2
eu
4
1
2
lux
38
1
4
3
2
er
2

4
2
2
Lutheran
2
Luther
38
1
4
3
2

2

4
2
2
lutetium
2
lute
38
1
4
3
2

2
eh
4
2
2
Lutz
2
lutanist
38
1
4
3
2

2

4
4
2
lusty
2
lustrous
2
lustful
2
lust
38
1
4
3
2

2
t
4
3
2
lush
2
luscious
2
Lusaka
38
1
4
3
2

2

4
5
2
lurk
2
lurid
2
lure
2
lurch
2
Lura
38
1
4
3
2

2

4
2
2
lunge
2
lung
38
1
4
3
2

2

4
3
2
Lundquist
2
Lundberg
2
Lund
38
1
4
3
2
h
2

4
4
2
lunchtime
2
lunchroom
2
luncheon
2
lunch
38
1
4
3
2

2
rt
4
1
2
lunacy
38
1
4
3
2

2

4
2
2
lunatic
2
lunate
38
1
4
3
2

2

4
2
2
lunary
2
lunar
38
1
4
3
2

2
acdg
4
0
38
1
4
3
2

2

4
4
2
lumpy
2
Lumpur
2
lumpish
2
lump
38
1
4
3
2

2

4
2
2
luminous
2
luminosity
38
1
4
3
2

2

4
2
2
luminary
2
luminance
38
1
4
3
2
n
2
ao
4
1
2
luminescent
38
1
4
3
2

2
e
4
1
2
lumbar
38
1
4
3
2

2

4
2
2
lumbermen
2
lumberman
38
1
4
3
2
r
2
m
4
1
2
lumber
38
1
4
3
2

2
bip
4
2
2
lummox
2
lumen
38
1
4
3
2

2

4
2
2
lullaby
2
lull
38
1
4
3
2

2
l
4
1
2
lulu
38
1
4
3
2
e
2

4
3
2
lukewarm
2
lukemia
2
luke
38
1
4
3
2

2

4
2
2
lugging
2
luggage
38
1
4
3
2

2

4
2
2
luger
2
luge
38
1
4
3
2

2
eg
4
1
2
lug
38
1
4
3
2
t
2

4
2
2
Luftwaffe
2
Lufthansa
38
1
4
3
2

2

4
3
2
Ludwig
2
Ludlow
2
ludicrous
38
1
4
3
2
i
2

4
2
2
Lucretius
2
Lucretia
38
1
4
3
2

2
t
4
1
2
lucre
38
1
4
3
2

2
e
4
1
2
lucrative
38
1
4
3
2

2

4
2
2
lucky
2
luck
38
1
4
3
2

2

4
2
2
Lucian
2
Lucia
38
1
4
3
2

2
a
4
4
2
Lucius
2
Lucille
2
Lucifer
2
lucid
38
1
4
3
2

2
ikr
4
3
2
lucy
2
Lucerne
2
Lucas
38
1
4
3
2

2
r
4
2
2
Lubell
2
Lubbock
38
1
4
3
2

2

4
2
2
lubricity
2
lubricious
38
1
4
3
2

2

4
2
2
lubricate
2
lubricant
38
1
4
3
2
ic
2
ai
4
0
38
1
4
3
2

2
bcdfgklmnrstx
4
3
2
Luzon
2
lupine
2
Luis
38
1
4
3
2

2

4
3
2
L'vov
2
l's
2
l'oeil
38
1
4
3
2
l
2

4
2
2
loyalty
2
loyal
38
1
4
3
2

2
a
4
1
2
loy
38
1
4
3
2

2

4
3
2
lower
2
Lowell
2
Lowe
38
1
4
3
2

2
e
4
5
2
Lowry
2
lowland
2
lowdown
2
lowboy
2
low
38
1
4
3
2

2

4
2
2
Loveland
2
Lovelace
38
1
4
3
2

2
a
4
1
2
lovelorn
38
1
4
3
2
e
2
l
4
3
2
loves
2
lovebird
2
love
38
1
4
3
2

2

4
2
2
Louvre
2
louver
38
1
4
3
2

2

4
2
2
lousewort
2
louse
38
1
4
3
2

2
e
4
1
2
lousy
38
1
4
3
2

2

4
2
2
Lounsbury
2
lounge
38
1
4
3
2
s
2

4
5
2
Louisville
2
Louisiana
2
Louise
2
Louisa
2
Louis
38
1
4
3
2
peak
2

4
2
2
loudspeaking
2
loudspeaker
38
1
4
3
2

2
s
4
1
2
loud
38
1
4
3
2

2
dinsv
4
2
2
Lourdes
2
Lou
38
1
4
3
2

2

4
2
2
lottery
2
Lotte
38
1
4
3
2

2
e
4
1
2
Lottie
38
1
4
3
2

2
t
4
4
2
lots
2
lotus
2
lotion
2
lot
38
1
4
3
2

2

4
2
2
lossy
2
loss
38
1
4
3
2

2
s
4
3
2
lost
2
lose
2
losable
38
1
4
3
2

2

4
2
2
Lorenz
2
Loren
38
1
4
3
2

2
n
4
2
2
Lorelei
2
lore
38
1
4
3
2

2

4
2
2
lordosis
2
lord
38
1
4
3
2

2
de
4
2
2
Lorraine
2
Lorinda
38
1
4
3
2
i
2

4
2
2
loquacity
2
loquacious
38
1
4
3
2
ua
2
c
4
1
2
loquat
38
1
4
3
2

2

4
2
2
lopsided
2
lopseed
38
1
4
3
2

2

4
2
2
Lopez
2
lope
38
1
4
3
2

2
es
4
1
2
lop
38
1
4
3
2
e
2

4
4
2
loosestrife
2
loosen
2
looseleaf
2
loose
38
1
4
3
2

2

4
2
2
loophole
2
loop
38
1
4
3
2

2

4
2
2
Loomis
2
loom
38
1
4
3
2

2

4
6
2
looks
2
looking
2
looked
2
lookup
2
lookout
2
look
38
1
4
3
2

2
kmps
4
2
2
loot
2
loon
38
1
4
3
2
ud
2

4
2
2
longitudinal
2
longitude
38
1
4
3
2

2
t
4
1
2
longish
38
1
4
3
2

2

4
2
2
longhorn
2
longhand
38
1
4
3
2

2
hie
4
6
2
longue
2
longtime
2
longstanding
2
longleg
2
Longfellow
2
long
38
1
4
3
2

2

4
2
2
lonesome
2
lone
38
1
4
3
2

2
eg
4
1
2
London
38
1
4
3
2

2
a
4
1
2
Lomb
38
1
4
3
2
rd
2

4
2
2
Lombardy
2
Lombard
38
1
4
3
2

2
b
4
1
2
Lome
38
1
4
3
2

2

4
3
2
lolly
2
lollipop
2
loll
38
1
4
3
2

2
l
4
1
2
Lola
38
1
4
3
2

2

4
2
2
loincloth
2
loin
38
1
4
3
2

2
n
4
3
2
loiter
2
Lois
2
Loire
38
1
4
3
2

2

4
2
2
logician
2
logic
38
1
4
3
2

2
c
4
1
2
logistic
38
1
4
3
2

2

4
2
2
logging
2
loggerhead
38
1
4
3
2
ithm
2

4
2
2
logarithmic
2
logarithm
38
1
4
3
2

2
r
4
1
2
Logan
38
1
4
3
2

2
agi
4
4
2
logout
2
logjam
2
loge
2
log
38
1
4
3
2
t
2

4
2
2
lofty
2
loft
38
1
4
3
2

2

4
2
2
loess
2
Loeb
38
1
4
3
2
e
2

4
2
2
lodgepole
2
lodge
38
1
4
3
2

2
g
4
2
2
Lodowick
2
lodestone
38
1
4
3
2

2

4
2
2
locust
2
locus
38
1
4
3
2

2
s
4
1
2
locutor
38
1
4
3
2
ot
2
io
4
1
2
locomote
38
1
4
3
2
r
2

4
2
2
locomotory
2
locomotor
38
1
4
3
2

2

4
2
2
locomotive
2
locomotion
38
1
4
3
2

2
m
4
1
2
locoweed
38
1
4
3
2

2

4
2
2
Lockheed
2
Lockhart
38
1
4
3
2

2
h
4
8
2
Lockwood
2
lockup
2
locksmith
2
lockout
2
locknut
2
Lockian
2
Locke
2
lock
38
1
4
3
2

2
lt
4
0
38
1
4
3
2

2

4
2
2
locale
2
local
38
1
4
3
2

2
akou
4
1
2
loci
38
1
4
3
2
l
2

4
2
2
lobule
2
lobular
38
1
4
3
2

2

4
2
2
lobster
2
lobscouse
38
1
4
3
2

2
su
4
6
2
lobo
2
loblolly
2
lobe
2
lobby
2
lobar
2
lob
38
1
4
3
2
h
2

4
3
2
loathsome
2
loathe
2
loath
38
1
4
3
2

2

4
2
2
loamy
2
loam
38
1
4
3
2

2
mt
4
4
2
loaves
2
loan
2
loaf
2
load
38
1
4
3
2

2
abcdefgilmnopqrstuvwy
4
3
2
lozenge
2
Loki
2
lo
38
1
4
3
2

2

4
3
2
Lizzie
2
lizard
2
Liz
38
1
4
3
2

2
n
4
1
2
livid
38
1
4
3
2

2
r
4
4
2
liveth
2
livestock
2
liven
2
live
38
1
4
3
2

2

4
2
2
Liverpudlian
2
Liverpool
38
1
4
3
2

2
p
4
3
2
livery
2
liverwort
2
Livermore
38
1
4
3
2

2
ei
4
1
2
livre
38
1
4
3
2
rg
2

4
2
2
liturgy
2
liturgic
38
1
4
3
2

2

4
2
2
littoral
2
Litton
38
1
4
3
2
e
2

4
3
2
Littleton
2
littleneck
2
little
38
1
4
3
2

2
lo
4
1
2
litterbug
38
1
4
3
2

2

4
2
2
litigate
2
litigant
38
1
4
3
2
g
2
a
4
1
2
litigious
38
1
4
3
2
pher
2

4
2
2
lithospheric
2
lithosphere
38
1
4
3
2
raph
2

4
2
2
lithography
2
lithograph
38
1
4
3
2

2
gs
4
1
2
lithology
38
1
4
3
2

2

4
2
2
lithium
2
lithic
38
1
4
3
2

2
io
4
2
2
Lithuania
2
lithe
38
1
4
3
2

2

4
2
2
literature
2
literate
38
1
4
3
2
ra
2
t
4
3
2
literary
2
literal
2
literacy
38
1
4
3
2

2
ehitu
4
3
2
litmus
2
litany
2
lit
38
1
4
3
2

2
e
4
2
2
lists
2
list
38
1
4
3
2

2
t
4
6
2
Lissajous
2
lisp
2
lisle
2
Lise
2
Lisbon
2
Lisa
38
1
4
3
2
d
2

4
2
2
liquidate
2
liquid
38
1
4
3
2

2
f
4
1
2
liqueur
38
1
4
3
2

2

4
2
2
liquefy
2
liquefaction
38
1
4
3
2
u
2
ei
4
1
2
liquor
38
1
4
3
2

2

4
2
2
Lipscomb
2
Lipschitz
38
1
4
3
2

2
c
4
1
2
lipstick
38
1
4
3
2

2
s
4
4
2
Lipton
2
Lippincott
2
lipid
2
lip
38
1
4
3
2

2

4
2
2
lioness
2
Lionel
38
1
4
3
2
n
2
e
4
1
2
lion
38
1
4
3
2

2

4
2
2
Linotype
2
linoleum
38
1
4
3
2

2

4
2
2
linkage
2
link
38
1
4
3
2

2

4
2
2
lingual
2
lingua
38
1
4
3
2

2
a
4
1
2
linguist
38
1
4
3
2
r
2

4
2
2
lingerie
2
linger
38
1
4
3
2

2
eu
4
1
2
lingo
38
1
4
3
2

2

4
2
2
linemen
2
lineman
38
1
4
3
2

2

4
3
2
linear
2
lineal
2
lineage
38
1
4
3
2

2
am
4
6
2
lines
2
lineup
2
lineprinter
2
linen
2
linebacker
2
line
38
1
4
3
2

2

4
3
2
Lindstrom
2
Lindsey
2
Lindsay
38
1
4
3
2
erg
2

4
2
2
Lindbergh
2
Lindberg
38
1
4
3
2

2
bs
4
5
2
Lindquist
2
Lindholm
2
linden
2
Linda
2
Lind
38
1
4
3
2

2
degko
4
6
2
Linus
2
lint
2
linseed
2
liniment
2
Lincoln
2
Lin
38
1
4
3
2

2

4
4
2
limpkin
2
limpid
2
limpet
2
limp
38
1
4
3
2
t
2

4
5
2
limits
2
limiting
2
limited
2
limitate
2
limit
38
1
4
3
2

2

4
4
2
limestone
2
Limerick
2
limelight
2
lime
38
1
4
3
2

2

4
3
2
limbo
2
limbic
2
limb
38
1
4
3
2

2
beip
4
3
2
limousine
2
Lima
2
lim
38
1
4
3
2

2

4
2
2
Lilliputian
2
Lillian
38
1
4
3
2

2
i
4
1
2
Lilly
38
1
4
3
2

2

4
2
2
lilac
2
Lila
38
1
4
3
2

2
al
4
3
2
lily
2
lilt
2
Lilian
38
1
4
3
2
e
2

4
4
2
likely
2
likewise
2
liken
2
like
38
1
4
3
2

2

4
2
2
lignum
2
lignite
38
1
4
3
2

2

4
2
2
lighthouse
2
lighthearted
38
1
4
3
2
t
2
h
4
6
2
lightweight
2
lightproof
2
lightning
2
lightface
2
lighten
2
light
38
1
4
3
2
et
2

4
2
2
Liggett
2
Ligget
38
1
4
3
2

2

4
3
2
ligature
2
ligand
2
ligament
38
1
4
3
2

2
aghn
4
0
38
1
4
3
2

2
bs
4
4
2
lifetime
2
lifelong
2
lifeguard
2
life
38
1
4
3
2

2

4
2
2
lifestyle
2
lifespan
38
1
4
3
2

2

4
2
2
lifeboat
2
lifeblood
38
1
4
3
2

2
e
4
2
2
lift
2
LIFO
38
1
4
3
2

2

4
2
2
lieutenant
2
lieu
38
1
4
3
2

2
u
4
3
2
lien
2
Liechtenstein
2
lie
38
1
4
3
2

2
n
4
1
2
lice
38
1
4
3
2

2

4
3
2
licensor
2
licensee
2
licensable
38
1
4
3
2

2
s
4
1
2
licentious
38
1
4
3
2

2
e
4
3
2
licorice
2
lick
2
lichen
38
1
4
3
2
t
2

4
2
2
libretto
2
librettist
38
1
4
3
2

2
t
4
1
2
Libreville
38
1
4
3
2

2
r
4
1
2
librate
38
1
4
3
2

2

4
2
2
library
2
librarian
38
1
4
3
2

2
ae
4
0
38
1
4
3
2
d
2

4
2
2
libido
2
libidinous
38
1
4
3
2

2

4
3
2
liberty
2
libertine
2
libertarian
38
1
4
3
2

2

4
2
2
liberate
2
liberal
38
1
4
3
2

2
at
4
1
2
Liberia
38
1
4
3
2

2

4
2
2
libelous
2
libel
38
1
4
3
2

2
lr
4
0
38
1
4
3
2

2
eir
4
2
2
Libya
2
libation
38
1
4
3
2

2

4
3
2
liar
2
liaison
2
liable
38
1
4
3
2

2
abcefgklmnopqstvz
4
1
2
lid
38
1
4
3
2

2
o
4
1
2
lexical
38
1
4
3
2

2

4
2
2
lexicon
2
lexicography
38
1
4
3
2
i
2
c
4
1
2
Lexington
38
1
4
3
2

2

4
3
2
lewis
2
lewd
2
lew
38
1
4
3
2

2

4
4
2
levity
2
Levitt
2
Leviticus
2
levitate
38
1
4
3
2

2

4
2
2
Levine
2
Levin
38
1
4
3
2

2
nt
4
2
2
Levis
2
Levi
38
1
4
3
2

2

4
2
2
leverage
2
lever
38
1
4
3
2

2
r
4
2
2
level
2
levee
38
1
4
3
2

2
ei
4
3
2
levy
2
levulose
2
Lev
38
1
4
3
2

2

4
2
2
leukemia
2
leucine
38
1
4
3
2
r
2
m
4
1
2
letterhead
38
1
4
3
2

2

4
2
2
lettermen
2
letterman
38
1
4
3
2

2
e
4
2
2
letting
2
lettuce
38
1
4
3
2

2

4
2
2
lethargy
2
lethal
38
1
4
3
2

2
a
4
1
2
Lethe
38
1
4
3
2

2
ht
4
3
2
lets
2
Letitia
2
let
38
1
4
3
2

2

4
2
2
Lester
2
lest
38
1
4
3
2

2

4
2
2
lessor
2
lesson
38
1
4
3
2

2

4
2
2
lessen
2
lessee
38
1
4
3
2

2
eo
4
1
2
less
38
1
4
3
2

2
st
4
4
2
Lesotho
2
Leslie
2
lesion
2
Lesbian
38
1
4
3
2

2

4
3
2
leprosy
2
lepidolite
2
leper
38
1
4
3
2

2

4
2
2
Leopold
2
leopard
38
1
4
3
2

2

4
2
2
leonine
2
Leonid
38
1
4
3
2
d
2

4
2
2
Leonardo
2
Leonard
38
1
4
3
2

2
r
4
1
2
Leona
38
1
4
3
2

2
ai
4
2
2
Leone
2
Leon
38
1
4
3
2

2
np
4
1
2
Leo
38
1
4
3
2

2

4
2
2
lentil
2
lenticular
38
1
4
3
2

2
i
4
2
2
Lenten
2
lent
38
1
4
3
2

2

4
2
2
Lenny
2
Lennox
38
1
4
3
2

2

4
2
2
Leningrad
2
Lenin
38
1
4
3
2

2
n
4
1
2
lenient
38
1
4
3
2
th
2

4
4
2
lengthy
2
lengthwise
2
lengthen
2
length
38
1
4
3
2

2
gint
4
5
2
lens
2
Lenore
2
lend
2
Lena
2
Len
38
1
4
3
2
n
2

4
2
2
lemonade
2
lemon
38
1
4
3
2

2

4
2
2
lemming
2
lemma
38
1
4
3
2

2
mo
4
1
2
Lemuel
38
1
4
3
2
moti
2

4
2
2
leitmotiv
2
leitmotif
38
1
4
3
2
h
2

4
2
2
Leighton
2
Leigh
38
1
4
3
2

2
gt
4
2
2
leisure
2
Leila
38
1
4
3
2

2

4
2
2
Lehman
2
Lehigh
38
1
4
3
2
m
2

4
2
2
leguminous
2
legume
38
1
4
3
2
ima
2

4
2
2
legitimate
2
legitimacy
38
1
4
3
2
lat
2

4
2
2
legislature
2
legislate
38
1
4
3
2

2
st
4
2
2
legion
2
legible
38
1
4
3
2

2

4
2
2
leggy
2
legging
38
1
4
3
2
d
2

4
3
2
Legendre
2
legendary
2
legend
38
1
4
3
2

2
n
4
1
2
legerdemain
38
1
4
3
2

2

4
2
2
legatee
2
legate
38
1
4
3
2

2
e
4
1
2
legato
38
1
4
3
2

2
t
4
2
2
legal
2
legacy
38
1
4
3
2

2
aegiu
4
2
2
leghorn
2
leg
38
1
4
3
2
t
2

4
5
2
lefty
2
leftward
2
leftover
2
leftmost
2
left
38
1
4
3
2
a
2

4
2
2
leeway
2
leeward
38
1
4
3
2

2

4
2
2
leery
2
leer
38
1
4
3
2

2
rw
4
5
2
Leeuwenhoek
2
leek
2
Leeds
2
leech
2
lee
38
1
4
3
2

2

4
2
2
ledge
2
led
38
1
4
3
2

2

4
2
2
lecture
2
lectionary
38
1
4
3
2
er
2

4
2
2
lechery
2
lecher
38
1
4
3
2

2
ht
4
0
38
1
4
3
2

2

4
2
2
Lebesgue
2
lebensraum
38
1
4
3
2
n
2

4
2
2
Lebanon
2
Lebanese
38
1
4
3
2

2
ae
4
0
38
1
4
3
2

2
cdfknprstv
4
2
2
league
2
lea
38
1
4
3
2

2

4
2
2
Leavenworth
2
leaven
38
1
4
3
2
e
2
n
4
2
2
leaves
2
leave
38
1
4
3
2
her
2

4
5
2
leathery
2
leatherwork
2
leatherneck
2
leatherback
2
leather
38
1
4
3
2

2

4
2
2
leasehold
2
lease
38
1
4
3
2

2
e
4
2
2
least
2
leash
38
1
4
3
2

2

4
2
2
learn
2
Lear
38
1
4
3
2

2

4
3
2
leapt
2
leapfrog
2
leap
38
1
4
3
2

2

4
2
2
Leander
2
lean
38
1
4
3
2

2

4
3
2
leaky
2
leakage
2
leak
38
1
4
3
2

2

4
3
2
leafy
2
leaflet
2
leaf
38
1
4
3
2

2
m
4
1
2
leads
38
1
4
3
2

2
r
4
2
2
leadeth
2
leaden
38
1
4
3
2

2
es
4
2
2
leading
2
lead
38
1
4
3
2
h
2

4
2
2
leachate
2
leach
38
1
4
3
2

2
abcdefghimnopstuvwx
4
3
2
Leyden
2
Leroy
2
Leland
38
1
4
3
2

2

4
2
2
lazybones
2
lazy
38
1
4
3
2

2
y
4
2
2
laze
2
Lazarus
38
1
4
3
2

2

4
2
2
layout
2
layoff
38
1
4
3
2

2

4
2
2
laymen
2
layman
38
1
4
3
2

2
mo
4
4
2
layup
2
Layton
2
layette
2
lay
38
1
4
3
2

2

4
2
2
laxative
2
lax
38
1
4
3
2

2

4
2
2
lawsuit
2
Lawson
38
1
4
3
2
enc
2

4
2
2
lawrencium
2
Lawrence
38
1
4
3
2

2

4
2
2
lawman
2
lawmake
38
1
4
3
2

2
a
4
1
2
lawmen
38
1
4
3
2
iv
2

4
2
2
lawgiving
2
lawgiver
38
1
4
3
2
reak
2

4
2
2
lawbreaking
2
lawbreaker
38
1
4
3
2

2
bgmrs
4
4
2
lawyer
2
lawn
2
lawful
2
law
38
1
4
3
2

2

4
3
2
lavatory
2
lavabo
2
lava
38
1
4
3
2

2
a
4
3
2
Lavoisier
2
lavish
2
lavender
38
1
4
3
2

2

4
2
2
Laurentian
2
Laurent
38
1
4
3
2

2
t
4
1
2
Lauren
38
1
4
3
2

2
n
4
2
2
laurel
2
laureate
38
1
4
3
2

2
e
4
2
2
Laurie
2
laura
38
1
4
3
2

2

4
2
2
laundry
2
launder
38
1
4
3
2

2
d
4
1
2
launch
38
1
4
3
2
h
2

4
4
2
laughter
2
Laughlin
2
laughingstock
2
laugh
38
1
4
3
2

2
a
4
2
2
Lauderdale
2
laud
38
1
4
3
2

2

4
2
2
laudatory
2
laudanum
38
1
4
3
2

2
dgnr
4
2
2
Lausanne
2
Laue
38
1
4
3
2

2

4
2
2
lattice
2
latter
38
1
4
3
2
na
2

4
2
2
latitudinary
2
latitudinal
38
1
4
3
2
ud
2
i
4
1
2
latitude
38
1
4
3
2

2

4
2
2
Latinate
2
Latin
38
1
4
3
2

2
nt
4
0
38
1
4
3
2

2

4
3
2
Lathrop
2
lathe
2
lath
38
1
4
3
2

2

4
3
2
Lateran
2
lateral
2
latera
38
1
4
3
2

2
a
4
2
2
laterite
2
later
38
1
4
3
2

2
r
4
4
2
latest
2
latex
2
latent
2
late
38
1
4
3
2

2
ehit
4
4
2
Latvia
2
latus
2
Latrobe
2
latch
38
1
4
3
2

2

4
2
2
lasso
2
lass
38
1
4
3
2

2

4
2
2
lascivious
2
lascar
38
1
4
3
2

2
cs
4
4
2
Laszlo
2
last
2
lash
2
lase
38
1
4
3
2
e
2

4
2
2
larynges
2
laryngeal
38
1
4
3
2
n
2
g
4
1
2
larynx
38
1
4
3
2
a
2

4
3
2
larval
2
larvae
2
larva
38
1
4
3
2

2

4
3
2
Larson
2
Larsen
2
Lars
38
1
4
3
2

2

4
3
2
larkspur
2
Larkin
2
lark
38
1
4
3
2
e
2
s
4
3
2
larger
2
largemouth
2
large
38
1
4
3
2

2

4
2
2
Lares
2
Laredo
38
1
4
3
2

2

4
2
2
larch
2
larceny
38
1
4
3
2

2
cegksvy
4
4
2
Larry
2
lariat
2
lard
2
Laramie
38
1
4
3
2
l
2

4
2
2
lapelled
2
lapel
38
1
4
3
2

2
e
4
5
2
lapse
2
lappet
2
Laplace
2
lapidary
2
lap
38
1
4
3
2

2

4
4
2
Laotian
2
Laos
2
Laocoon
2
Lao
38
1
4
3
2
an
2

4
2
2
lanthanum
2
lanthanide
38
1
4
3
2

2
h
4
1
2
lantern
38
1
4
3
2

2

4
2
2
lanky
2
Lanka
38
1
4
3
2

2

4
2
2
languish
2
languid
38
1
4
3
2

2
i
4
1
2
language
38
1
4
3
2

2
u
4
4
2
Langmuir
2
Langley
2
Lange
2
Lang
38
1
4
3
2

2

4
2
2
landslide
2
landscape
38
1
4
3
2

2
s
4
8
2
landowner
2
landmark
2
landlord
2
Landis
2
landhold
2
landfill
2
landau
2
land
38
1
4
3
2
s
2

4
2
2
Lancaster
2
Lancashire
38
1
4
3
2

2
a
4
1
2
lance
38
1
4
3
2

2
cdgkt
4
3
2
Lansing
2
lane
2
Lana
38
1
4
3
2

2

4
5
2
lamprey
2
lampoon
2
lamplight
2
lampblack
2
lamp
38
1
4
3
2
na
2

4
2
2
laminate
2
laminar
38
1
4
3
2
t
2

4
2
2
lamentation
2
lament
38
1
4
3
2

2
n
4
2
2
lamellar
2
lame
38
1
4
3
2

2
d
4
2
2
lambert
2
lamb
38
1
4
3
2
r
2

4
2
2
Lamarck
2
Lamar
38
1
4
3
2

2
abeip
4
1
2
lam
38
1
4
3
2
e
2

4
3
2
lakeside
2
Lakehurst
2
lake
38
1
4
3
2

2

4
2
2
Laidlaw
2
laid
38
1
4
3
2

2
d
4
4
2
laity
2
laissez
2
lair
2
lain
38
1
4
3
2
ang
2

4
2
2
Lagrangian
2
Lagrange
38
1
4
3
2

2

4
2
2
Lagos
2
lagoon
38
1
4
3
2

2
or
4
4
2
Laguerre
2
lagging
2
lager
2
lag
38
1
4
3
2

2

4
2
2
ladyfern
2
lady
38
1
4
3
2

2
y
4
3
2
ladle
2
laden
2
lad
38
1
4
3
2
a
2

4
2
2
lacunae
2
lacuna
38
1
4
3
2

2
n
4
1
2
lacustrine
38
1
4
3
2

2

4
2
2
lactose
2
lactate
38
1
4
3
2

2

4
3
2
lackey
2
lackadaisic
2
lack
38
1
4
3
2

2

4
2
2
Lacerta
2
lacerate
38
1
4
3
2

2
r
4
2
2
lacewing
2
lace
38
1
4
3
2

2
ektu
4
6
2
lacy
2
lacrosse
2
lacquer
2
laconic
2
Lachesis
2
lac
38
1
4
3
2
ador
2

4
2
2
labradorite
2
Labrador
38
1
4
3
2

2

4
3
2
laborious
2
laboratory
2
labor
38
1
4
3
2

2
r
4
1
2
labour
38
1
4
3
2

2

4
2
2
lability
2
labile
38
1
4
3
2

2

4
2
2
labial
2
labia
38
1
4
3
2

2
al
4
0
38
1
4
3
2

2
ior
4
4
2
labyrinth
2
label
2
Laban
2
lab
38
1
4
3
2

2
bcdgikmnoprstuvwxyz
4
3
2
Lahore
2
Lafayette
2
la
38
1
4
3
2

2
aeio'uy
4
5
2
LCD
2
LTV
2
LSI
2
Lloyd
2
l
38
1
4
3
2

2

4
3
2
Kyoto
2
Kyle
2
KY
38
1
4
3
2

2

4
2
2
Kurt
2
Kurd
38
1
4
3
2

2

4
2
2
kudzu
2
kudo
38
1
4
3
2

2
dr
4
5
2
Kuwait
2
kumquat
2
kulak
2
Kuhn
2
Ku
38
1
4
3
2

2

4
3
2
Kruse
2
Kruger
2
Krueger
38
1
4
3
2

2

4
2
2
Kristin
2
Krishna
38
1
4
3
2

2
s
4
1
2
Krieger
38
1
4
3
2

2

4
3
2
Kresge
2
Kremlin
2
Krebs
38
1
4
3
2

2
ku
4
2
2
Kramer
2
kraft
38
1
4
3
2

2

4
2
2
kraut
2
Krause
38
1
4
3
2

2

4
2
2
Krakow
2
Krakatoa
38
1
4
3
2

2
aeiu
4
2
2
krypton
2
Kronecker
38
1
4
3
2
l
2

4
2
2
Kowalski
2
Kowalewski
38
1
4
3
2

2
a
4
1
2
Kowloon
38
1
4
3
2

2

4
2
2
Korea
2
Koran
38
1
4
3
2

2

4
2
2
Konrad
2
Kong
38
1
4
3
2

2

4
2
2
kolkhoz
2
kola
38
1
4
3
2
nig
2

4
2
2
Koenigsberg
2
Koenig
38
1
4
3
2

2

4
2
2
kodak
2
Kodachrome
38
1
4
3
2

2
a
4
1
2
Kodiak
38
1
4
3
2
h
2

4
2
2
Kochab
2
Koch
38
1
4
3
2

2
cdelnrw
4
8
2
Kovacs
2
kosher
2
Koppers
2
kombu
2
koinonia
2
kohlrabi
2
Kobayashi
2
koala
38
1
4
3
2
s
2

4
2
2
Knutson
2
Knutsen
38
1
4
3
2
s
2

4
2
2
Knudson
2
Knudsen
38
1
4
3
2
kle
2

4
2
2
knuckleball
2
knuckle
38
1
4
3
2

2
cdt
4
1
2
knurl
38
1
4
3
2

2

4
2
2
Knoxville
2
Knox
38
1
4
3
2

2
d
4
1
2
Knowles
38
1
4
3
2
ge
2

4
2
2
knowledgeable
2
knowledge
38
1
4
3
2

2
e
4
1
2
Knowlton
38
1
4
3
2

2
l
4
5
2
knows
2
known
2
knowhow
2
knoweth
2
know
38
1
4
3
2

2

4
2
2
knotty
2
Knott
38
1
4
3
2

2
t
4
1
2
knot
38
1
4
3
2
k
2

4
3
2
knockout
2
knockdown
2
knock
38
1
4
3
2

2

4
2
2
knobby
2
knob
38
1
4
3
2

2
bctwx
4
1
2
knoll
38
1
4
3
2
ht
2

4
2
2
Knightsbridge
2
knight
38
1
4
3
2
k
2

4
2
2
Knickerbocker
2
knick
38
1
4
3
2

2
cg
4
3
2
knives
2
knit
2
knife
38
1
4
3
2

2

4
3
2
kneel
2
kneecap
2
knee
38
1
4
3
2

2
e
4
3
2
knew
2
knelt
2
knead
38
1
4
3
2

2
p
4
2
2
Knauer
2
knack
38
1
4
3
2

2

4
2
2
knapsack
2
Knapp
38
1
4
3
2

2
aeiou
4
0
38
1
4
3
2

2

4
2
2
Klein
2
kleenex
38
1
4
3
2

2

4
3
2
klaxon
2
Klaus
2
Klan
38
1
4
3
2

2
ae
4
3
2
klystron
2
Klux
2
Kline
38
1
4
3
2

2

4
2
2
kiwi
2
Kiwanis
38
1
4
3
2

2

4
2
2
kivu
2
kiva
38
1
4
3
2
n
2

4
2
2
kittenish
2
kitten
38
1
4
3
2

2
e
4
2
2
kitty
2
kittle
38
1
4
3
2
hen
2

4
2
2
kitchenette
2
kitchen
38
1
4
3
2

2
ct
4
3
2
kite
2
Kitakyushu
2
kit
38
1
4
3
2

2

4
3
2
Kirkpatrick
2
Kirkland
2
kirk
38
1
4
3
2
h
2

4
2
2
Kirchoff
2
Kirchner
38
1
4
3
2

2
ck
4
2
2
Kirov
2
Kirby
38
1
4
3
2

2

4
2
2
Kiowa
2
kiosk
38
1
4
3
2

2

4
2
2
kinky
2
kink
38
1
4
3
2

2

4
3
2
Kingston
2
Kingsley
2
Kingsbury
38
1
4
3
2

2
s
4
6
2
kingpin
2
kinglet
2
kingfisher
2
kingdom
2
kingbird
2
king
38
1
4
3
2

2

4
2
2
kinesthesis
2
kinesic
38
1
4
3
2

2
s
4
2
2
kinetic
2
kinematic
38
1
4
3
2

2

4
4
2
kindred
2
kindle
2
kindergarten
2
kind
38
1
4
3
2

2
degk
4
3
2
Kinshasha
2
Kinney
2
kin
38
1
4
3
2

2

4
2
2
Kimberly
2
Kimball
38
1
4
3
2

2
b
4
2
2
kimono
2
Kim
38
1
4
3
2

2

4
3
2
killjoy
2
killdeer
2
kill
38
1
4
3
2

2
l
4
2
2
kilohm
2
Kilgore
38
1
4
3
2

2

4
3
2
Kiewit
2
Kiev
2
Kieffer
38
1
4
3
2
p
2
p
4
1
2
kidnap
38
1
4
3
2

2

4
2
2
kidnapping
2
kidnapped
38
1
4
3
2

2
a
4
1
2
kidney
38
1
4
3
2

2

4
2
2
kiddie
2
Kidde
38
1
4
3
2

2
dn
4
1
2
kid
38
1
4
3
2
k
2

4
3
2
kickoff
2
kickback
2
kick
38
1
4
3
2

2

4
2
2
kibitz
2
kibbutzim
38
1
4
3
2

2
bcdelmnortvw
4
4
2
kiss
2
Kipling
2
Kikuyu
2
Kigali
38
1
4
3
2

2

4
3
2
Khartoum
2
khan
2
khaki
38
1
4
3
2

2
a
4
2
2
Khrushchev
2
Khmer
38
1
4
3
2
s
2

4
2
2
Keynesian
2
Keynes
38
1
4
3
2

2
e
4
1
2
keynote
38
1
4
3
2

2
nswb
4
4
2
keypunch
2
keyhole
2
Keyes
2
key
38
1
4
3
2

2

4
2
2
kettle
2
Kettering
38
1
4
3
2

2

4
2
2
ketosis
2
ketone
38
1
4
3
2
h
2

4
2
2
ketchup
2
ketch
38
1
4
3
2

2
cot
4
0
38
1
4
3
2

2

4
2
2
kestrel
2
Kessler
38
1
4
3
2

2

4
2
2
kerry
2
Kerr
38
1
4
3
2

2

4
3
2
Kernighan
2
kernel
2
kern
38
1
4
3
2

2
nr
4
4
2
kerygma
2
kerosene
2
Kermit
2
kerchief
38
1
4
3
2

2

4
2
2
kept
2
Kepler
38
1
4
3
2

2

4
2
2
Kenyon
2
Kenya
38
1
4
3
2

2

4
3
2
Kentucky
2
Kenton
2
Kent
38
1
4
3
2

2

4
5
2
Kenney
2
Kenneth
2
kennel
2
Kennedy
2
Kennecott
38
1
4
3
2

2
e
4
1
2
Kennan
38
1
4
3
2

2
nty
4
4
2
Kensington
2
keno
2
Kendall
2
ken
38
1
4
3
2

2
e
4
2
2
kelly
2
Kellogg
38
1
4
3
2

2

4
2
2
Kelley
2
Keller
38
1
4
3
2

2
l
4
3
2
Kelvin
2
Kelsey
2
kelp
38
1
4
3
2

2

4
2
2
Keenan
2
keen
38
1
4
3
2

2

4
2
2
keelson
2
keel
38
1
4
3
2

2
lnp
4
1
2
keeshond
38
1
4
3
2
t
2

4
2
2
Keats
2
Keaton
38
1
4
3
2

2
aelnprsty
4
5
2
Kevin
2
Kemp
2
Keith
2
keg
2
keddah
38
1
4
3
2

2

4
2
2
kayo
2
Kay
38
1
4
3
2
f
2

4
2
2
Kaufman
2
Kauffman
38
1
4
3
2

2

4
4
2
Kathy
2
Kathleen
2
Katherine
2
Katharine
38
1
4
3
2

2
h
4
5
2
Katz
2
Katowice
2
Katmandu
2
Katie
2
Kate
38
1
4
3
2

2

4
3
2
karate
2
Karamazov
2
Karachi
38
1
4
3
2

2
a
4
6
2
karyatid
2
Karp
2
Karol
2
karma
2
Karl
2
Karen
38
1
4
3
2

2

4
3
2
kappa
2
kapok
2
Kaplan
38
1
4
3
2
lin
2

4
2
2
kaolinite
2
kaolin
38
1
4
3
2

2

4
5
2
Kant
2
Kansas
2
Kankakee
2
kangaroo
2
Kane
38
1
4
3
2

2

4
3
2
Kampala
2
kamikaze
2
Kamchatka
38
1
4
3
2

2

4
2
2
Kalmuk
2
kalmia
38
1
4
3
2
d
2

4
2
2
kaleidoscope
2
kaleidescope
38
1
4
3
2

2
i
4
1
2
kale
38
1
4
3
2

2
em
4
1
2
Kalamazoo
38
1
4
3
2
ka
2

4
2
2
Kafkaesque
2
Kafka
38
1
4
3
2
u
2

4
2
2
Kabul
2
Kabuki
38
1
4
3
2

2
bflmnoprtuy
4
7
2
kazoo
2
kava
2
Kaskaskia
2
Kajar
2
kaiser
2
Kahn
2
Kaddish
38
1
4
3
2

2
aehilnoruy
4
4
2
kwashiorkor
2
KS
2
k's
2
k
38
1
4
3
2
tapos
2

4
2
2
juxtaposition
2
juxtapose
38
1
4
3
2

2

4
3
2
Jutish
2
jute
2
jut
38
1
4
3
2

2

4
2
2
Justinian
2
Justine
38
1
4
3
2

2

4
2
2
justiciable
2
justice
38
1
4
3
2

2
cn
4
1
2
justify
38
1
4
3
2
t
2
i
4
1
2
just
38
1
4
3
2
rudent
2

4
2
2
jurisprudential
2
jurisprudent
38
1
4
3
2

2
p
4
1
2
jurisdiction
38
1
4
3
2

2
s
4
1
2
juridic
38
1
4
3
2

2

4
2
2
Jurassic
2
Jura
38
1
4
3
2

2
ai
4
3
2
jury
2
juror
2
jure
38
1
4
3
2

2

4
2
2
junketeer
2
junkerdom
38
1
4
3
2

2
e
4
2
2
junky
2
junk
38
1
4
3
2

2

4
2
2
juniper
2
junior
38
1
4
3
2

2

4
2
2
Juneau
2
June
38
1
4
3
2

2
t
4
1
2
junco
38
1
4
3
2

2

4
3
2
juncture
2
junctor
2
junction
38
1
4
3
2

2
ceik
4
3
2
junta
2
Juno
2
jungle
38
1
4
3
2

2

4
2
2
jumpy
2
jump
38
1
4
3
2

2

4
2
2
jumbo
2
jumble
38
1
4
3
2

2
bp
4
0
38
1
4
3
2

2

4
2
2
Juliet
2
Julie
38
1
4
3
2

2
e
4
3
2
Julius
2
Julio
2
Julia
38
1
4
3
2

2

4
2
2
Jules
2
julep
38
1
4
3
2

2
ei
4
1
2
July
38
1
4
3
2
e
2

4
2
2
Jukes
2
juke
38
1
4
3
2
u
2

4
2
2
jujube
2
juju
38
1
4
3
2
c
2

4
2
2
juicy
2
juice
38
1
4
3
2

2

4
2
2
juggle
2
jugging
38
1
4
3
2

2
g
4
3
2
Jugoslavia
2
jugate
2
jug
38
1
4
3
2

2
ai
4
0
38
1
4
3
2

2

4
2
2
judiciary
2
judicial
38
1
4
3
2

2
a
4
1
2
judicious
38
1
4
3
2

2
t
4
1
2
judicable
38
1
4
3
2

2

4
2
2
judicature
2
judicatory
38
1
4
3
2

2
c
4
1
2
Judith
38
1
4
3
2

2

4
2
2
Judas
2
Judaism
38
1
4
3
2

2
ai
4
6
2
Judy
2
Judson
2
judo
2
judge
2
Jude
2
Judd
38
1
4
3
2
ila
2

4
2
2
jubilate
2
jubilant
38
1
4
3
2
n
2

4
2
2
Juanita
2
Juan
38
1
4
3
2

2
abdgijklmnrstx
4
2
2
juvenile
2
Jupiter
38
1
4
3
2

2

4
6
2
joystick
2
joyride
2
joyous
2
joyful
2
Joyce
2
joy
38
1
4
3
2
l
2

4
2
2
jowly
2
jowl
38
1
4
3
2
a
2

4
2
2
Jovian
2
jovial
38
1
4
3
2

2
i
4
2
2
Jove
2
Jovanovich
38
1
4
3
2

2

4
2
2
journeymen
2
journeyman
38
1
4
3
2
y
2
m
4
1
2
journey
38
1
4
3
2
l
2

4
2
2
journalese
2
journal
38
1
4
3
2
n
2
ae
4
0
38
1
4
3
2

2
r
4
3
2
joust
2
jounce
2
joule
38
1
4
3
2

2
p
4
2
2
Josef
2
Jose
38
1
4
3
2
h
2

4
4
2
Josephus
2
Josephson
2
Josephine
2
Joseph
38
1
4
3
2

2
e
4
4
2
jostle
2
joss
2
Josiah
2
Joshua
38
1
4
3
2
s
2

4
2
2
Jorgenson
2
Jorgensen
38
1
4
3
2
e
2
n
4
1
2
Jorge
38
1
4
3
2

2
g
4
1
2
Jordan
38
1
4
3
2

2

4
2
2
Jonathan
2
Jonas
38
1
4
3
2

2
a
4
3
2
jonquil
2
Jones
2
Jon
38
1
4
3
2

2

4
2
2
jolly
2
Jolla
38
1
4
3
2

2
l
4
2
2
jolt
2
Joliet
38
1
4
3
2
n
2

4
2
2
joint
2
join
38
1
4
3
2
o
2

4
2
2
Johnstown
2
Johnston
38
1
4
3
2

2
t
4
2
2
Johnson
2
Johnsen
38
1
4
3
2

2
s
4
2
2
Johnny
2
John
38
1
4
3
2
n
2
ns
4
0
38
1
4
3
2

2

4
2
2
Johanson
2
Johansen
38
1
4
3
2

2
e
4
1
2
Johann
38
1
4
3
2
s
2

4
2
2
Johannesburg
2
Johannes
38
1
4
3
2

2
an
4
0
38
1
4
3
2

2

4
2
2
joggle
2
jogging
38
1
4
3
2

2
g
4
1
2
jog
38
1
4
3
2

2

4
3
2
joey
2
Joel
2
Joe
38
1
4
3
2

2

4
2
2
jocund
2
jocular
38
1
4
3
2

2

4
3
2
jockstrap
2
jockey
2
jock
38
1
4
3
2

2
ku
4
1
2
jocose
38
1
4
3
2

2

4
3
2
jobs
2
jobholder
2
job
38
1
4
3
2

2
n
4
1
2
Joan
38
1
4
3
2

2

4
2
2
Joanne
2
Joanna
38
1
4
3
2

2
n
4
1
2
Joaquin
38
1
4
3
2

2
abceghilnrsuvwy
4
3
2
jot
2
joke
2
Jo
38
1
4
3
2
ter
2

4
3
2
jittery
2
jitterbug
2
jitter
38
1
4
3
2

2

4
2
2
jinx
2
jingle
38
1
4
3
2

2

4
2
2
jimmy
2
Jimmie
38
1
4
3
2

2
m
4
2
2
Jimenez
2
Jim
38
1
4
3
2

2

4
2
2
jilt
2
Jill
38
1
4
3
2

2

4
2
2
jiggle
2
jigging
38
1
4
3
2

2
g
4
2
2
jigsaw
2
jig
38
1
4
3
2

2
glmnt
4
3
2
jive
2
jiffy
2
jibe
38
1
4
3
2

2

4
3
2
jewelry
2
Jewell
2
jewel
38
1
4
3
2

2
l
4
1
2
Jewett
38
1
4
3
2

2
e
4
2
2
Jewish
2
Jew
38
1
4
3
2

2

4
3
2
jettison
2
jetliner
2
jet
38
1
4
3
2

2

4
2
2
Jesus
2
Jesuit
38
1
4
3
2

2
i
4
2
2
Jesse
2
jess
38
1
4
3
2

2

4
2
2
Jessie
2
Jessica
38
1
4
3
2

2
su
4
1
2
jest
38
1
4
3
2

2

4
2
2
Jerome
2
Jeroboam
38
1
4
3
2

2

4
2
2
jerky
2
jerk
38
1
4
3
2

2
m
4
1
2
Jeres
38
1
4
3
2

2

4
2
2
Jeremy
2
Jeremiah
38
1
4
3
2

2
eko
4
4
2
Jerusalem
2
jersey
2
jerry
2
Jericho
38
1
4
3
2
pard
2

4
2
2
jeopardy
2
jeopard
38
1
4
3
2

2

4
3
2
Jennings
2
Jennifer
2
Jennie
38
1
4
3
2

2
i
4
1
2
jenny
38
1
4
3
2

2
n
4
2
2
Jensen
2
Jenkins
38
1
4
3
2
ly
2

4
2
2
jellyfish
2
jelly
38
1
4
3
2
un
2

4
2
2
jejunum
2
jejune
38
1
4
3
2
f
2

4
3
2
Jeffrey
2
Jefferson
2
Jeff
38
1
4
3
2

2
ln
4
0
38
1
4
3
2

2

4
2
2
Jeannie
2
jean
38
1
4
3
2
ous
2

4
2
2
jealousy
2
jealous
38
1
4
3
2

2
afjlnorstw
4
3
2
Jehovah
2
jeep
2
Jed
38
1
4
3
2
z
2

4
2
2
jazzy
2
jazz
38
1
4
3
2

2

4
2
2
jawbone
2
jaw
38
1
4
3
2

2

4
2
2
javelin
2
Java
38
1
4
3
2
n
2

4
2
2
jaunty
2
jaundice
38
1
4
3
2

2

4
2
2
jasper
2
Jason
38
1
4
3
2

2

4
3
2
Jarvin
2
jargon
2
jar
38
1
4
3
2
an
2

4
2
2
Japanese
2
Japan
38
1
4
3
2

2

4
2
2
Janus
2
January
38
1
4
3
2
or
2

4
2
2
janitorial
2
janitor
38
1
4
3
2

2
t
4
2
2
janissary
2
Janice
38
1
4
3
2

2

4
3
2
Janet
2
Janeiro
2
Jane
38
1
4
3
2

2
eiu
4
4
2
Jansenist
2
Janos
2
jangle
2
Jan
38
1
4
3
2
s
2

4
2
2
Jamestown
2
James
38
1
4
3
2

2
e
4
3
2
jamboree
2
Jamaica
2
jam
38
1
4
3
2

2

4
2
2
jake
2
Jakarta
38
1
4
3
2

2

4
2
2
Jaime
2
jail
38
1
4
3
2

2

4
3
2
jaguar
2
jagging
2
jag
38
1
4
3
2
ue
2

4
2
2
Jacques
2
Jacqueline
38
1
4
3
2

2

4
2
2
Jacobson
2
Jacobsen
38
1
4
3
2

2

4
3
2
Jacobite
2
Jacobian
2
Jacobi
38
1
4
3
2
b
2
is
4
3
2
Jacobus
2
Jacobean
2
Jacob
38
1
4
3
2

2
as
4
9
2
Jacky
2
jackpot
2
Jackman
2
jackknife
2
Jackie
2
jacket
2
jackdaw
2
jackboot
2
jack
38
1
4
3
2
on
2

4
2
2
Jacksonville
2
Jackson
38
1
4
3
2

2

4
2
2
jackass
2
jackanapes
38
1
4
3
2

2
koq
4
1
2
JACM
38
1
4
3
2

2

4
2
2
Jablonsky
2
jab
38
1
4
3
2

2
bcgikmnprsuvwz
4
4
2
jay
2
jalopy
2
Jaeger
2
jade
38
1
4
3
2

2
aeiou
4
3
2
j's
2
Jr
2
j
38
1
4
3
2
n
2

4
2
2
Ivanhoe
2
Ivan
38
1
4
3
2

2
a
4
4
2
ivy
2
ivory
2
Iverson
2
iv
38
1
4
3
2

2

4
3
2
it's
2
it'll
2
it'd
38
1
4
3
2
nera
2

4
2
2
itinerary
2
itinerant
38
1
4
3
2

2

4
2
2
iterate
2
item
38
1
4
3
2

2

4
2
2
italic
2
Italian
38
1
4
3
2
l
2
i
4
1
2
Italy
38
1
4
3
2

2
aei's
4
6
2
ITT
2
IT&T
2
Ito
2
Ithaca
2
itch
2
it
38
1
4
3
2

2

4
2
2
Istvan
2
Istanbul
38
1
4
3
2
u
2
e
4
1
2
issuant
38
1
4
3
2

2

4
2
2
Israelite
2
Israeli
38
1
4
3
2
ael
2
i
4
1
2
Israel
38
1
4
3
2

2

4
3
2
isotropy
2
isotope
2
isotherm
38
1
4
3
2
rph
2

4
2
2
isomorphic
2
isomorph
38
1
4
3
2

2
o
4
1
2
isomer
38
1
4
3
2

2

4
2
2
Isolde
2
isolate
38
1
4
3
2

2
h
4
1
2
isocline
38
1
4
3
2
ron
2

4
2
2
isochronous
2
isochronal
38
1
4
3
2

2
clmt
4
1
2
isopleth
38
1
4
3
2

2
m
4
1
2
island
38
1
4
3
2

2

4
3
2
Islamic
2
Islamabad
2
Islam
38
1
4
3
2

2
a
4
1
2
isle
38
1
4
3
2
g
2

4
2
2
isinglass
2
Ising
38
1
4
3
2

2
n
4
1
2
Isis
38
1
4
3
2
el
2

4
2
2
Isabella
2
Isabel
38
1
4
3
2
c
2

4
2
2
Isaacson
2
Isaac
38
1
4
3
2

2
ab
4
2
2
Isaiah
2
Isadore
38
1
4
3
2

2
ailorst
4
4
2
isn't
2
Isfahan
2
isentropic
2
is
38
1
4
3
2
in
2

4
3
2
Irving
2
Irvine
2
Irvin
38
1
4
3
2
a
2
t
4
2
2
irritant
2
irritable
38
1
4
3
2

2
t
4
1
2
irrigate
38
1
4
3
2
r
2

4
2
2
irreversible
2
irreverent
38
1
4
3
2

2
e
4
1
2
irrevocable
38
1
4
3
2

2

4
2
2
irresponsible
2
irrespective
38
1
4
3
2
t
2

4
2
2
irresolution
2
irresolute
38
1
4
3
2
l
2
u
4
1
2
irresolvable
38
1
4
3
2

2
op
4
1
2
irresistible
38
1
4
3
2

2

4
2
2
irreproducible
2
irreproachable
38
1
4
3
2

2
o
4
1
2
irrepressible
38
1
4
3
2

2
r
4
2
2
irreplaceable
2
irreparable
38
1
4
3
2

2

4
2
2
irremovable
2
irremediable
38
1
4
3
2

2
n
4
1
2
irredeemable
38
1
4
3
2
tis
2

4
2
2
irredentist
2
irredentism
38
1
4
3
2

2
e
4
1
2
irreducible
38
1
4
3
2

2
o
4
1
2
irreclaimable
38
1
4
3
2

2

4
2
2
irrecoverable
2
irreconcilable
38
1
4
3
2

2
cdmpsv
4
4
2
irretrievable
2
irrelevant
2
irregular
2
irrefutable
38
1
4
3
2

2

4
3
2
Irrawaddy
2
irrational
2
irradiate
38
1
4
3
2

2
aei
4
1
2
irruption
38
1
4
3
2

2
s
4
4
2
irony
2
ironwood
2
ironic
2
iron
38
1
4
3
2

2

4
2
2
ironstone
2
ironside
38
1
4
3
2

2
n
4
1
2
Iroquois
38
1
4
3
2

2

4
2
2
irksome
2
irk
38
1
4
3
2

2

4
2
2
Irishmen
2
Irishman
38
1
4
3
2

2
m
4
1
2
Irish
38
1
4
3
2

2
h
4
1
2
iris
38
1
4
3
2

2
s
4
1
2
iridium
38
1
4
3
2

2

4
3
2
Irene
2
Ireland
2
ire
38
1
4
3
2

2

4
4
2
irate
2
Iraq
2
Iran
2
Ira
38
1
4
3
2

2
aeikorv
4
4
2
Irwin
2
IRS
2
Irma
2
IR
38
1
4
3
2

2

4
2
2
ipso
2
ipsilateral
38
1
4
3
2

2
s
4
1
2
ipecac
38
1
4
3
2
spher
2

4
2
2
ionospheric
2
ionosphere
38
1
4
3
2

2
o
4
2
2
ionic
2
ion
38
1
4
3
2

2

4
2
2
iodine
2
iodinate
38
1
4
3
2

2
n
4
1
2
iodide
38
1
4
3
2

2
i
4
1
2
iodate
38
1
4
3
2

2
dn
4
3
2
Iowa
2
iota
2
Io
38
1
4
3
2

2
t
4
1
2
involuntary
38
1
4
3
2

2

4
3
2
involutorial
2
involution
2
involute
38
1
4
3
2

2
uv
4
0
38
1
4
3
2

2
l
4
3
2
invoke
2
invoice
2
invocate
38
1
4
3
2

2

4
2
2
invitee
2
invite
38
1
4
3
2

2
e
4
1
2
invitation
38
1
4
3
2
la
2

4
2
2
inviolate
2
inviolable
38
1
4
3
2

2
ot
4
5
2
invisible
2
invincible
2
invigorate
2
invidious
2
inviable
38
1
4
3
2
gat
2

4
2
2
investigatory
2
investigate
38
1
4
3
2
t
2
io
4
2
2
investment
2
invest
38
1
4
3
2

2

4
3
2
invertible
2
invertebrate
2
invert
38
1
4
3
2

2

4
2
2
inversion
2
inverse
38
1
4
3
2

2
st
4
1
2
Inverness
38
1
4
3
2
r
2

4
2
2
inventory
2
inventor
38
1
4
3
2

2

4
2
2
inventive
2
invention
38
1
4
3
2
t
2
io
4
1
2
invent
38
1
4
3
2
g
2

4
2
2
inveigle
2
inveigh
38
1
4
3
2

2
inrs
4
2
2
inveterate
2
invective
38
1
4
3
2

2
lrs
4
1
2
invade
38
1
4
3
2
i
2

4
2
2
invasive
2
invasion
38
1
4
3
2
ia
2

4
2
2
invariant
2
invariable
38
1
4
3
2
d
2

4
2
2
invalidate
2
invalid
38
1
4
3
2

2
i
4
1
2
invaluable
38
1
4
3
2

2
aeio
4
1
2
invulnerable
38
1
4
3
2

2

4
2
2
inure
2
inundate
38
1
4
3
2

2

4
2
2
intuitive
2
intuition
38
1
4
3
2
it
2
i
4
1
2
intuitable
38
1
4
3
2
i
2

4
2
2
intrusive
2
intrusion
38
1
4
3
2

2
s
4
1
2
intrude
38
1
4
3
2
er
2

4
2
2
introvert
2
introversion
38
1
4
3
2
uc
2
te
4
1
2
introducing
38
1
4
3
2

2

4
2
2
introductory
2
introduction
38
1
4
3
2

2
dv
4
3
2
introspect
2
introject
2
introit
38
1
4
3
2
a
2

4
2
2
intricate
2
intricacy
38
1
4
3
2

2
c
4
2
2
intrinsic
2
intrigue
38
1
4
3
2

2
n
4
1
2
intractable
38
1
4
3
2
si
2

4
2
2
intransitive
2
intransigent
38
1
4
3
2

2
aiou
4
1
2
intrepid
38
1
4
3
2
ica
2

4
2
2
intoxicate
2
intoxicant
38
1
4
3
2

2

4
2
2
intone
2
intonate
38
1
4
3
2
era
2

4
2
2
intolerant
2
intolerable
38
1
4
3
2

2
lnx
4
1
2
into
38
1
4
3
2

2
t
4
2
2
intimal
2
intimacy
38
1
4
3
2
e
2

4
2
2
intimater
2
intimate
38
1
4
3
2
m
2
a
4
1
2
intimidate
38
1
4
3
2
t
2

4
2
2
intestine
2
intestate
38
1
4
3
2
n
2

4
3
2
intervention
2
intervenor
2
intervene
38
1
4
3
2

2
e
4
2
2
interviewee
2
interval
38
1
4
3
2
i
2

4
2
2
interstitial
2
interstice
38
1
4
3
2

2
te
4
1
2
intersperse
38
1
4
3
2

2

4
2
2
interruption
2
interruptible
38
1
4
3
2
pt
2
i
4
1
2
interrupt
38
1
4
3
2
gat
2

4
2
2
interrogatory
2
interrogate
38
1
4
3
2

2
ou
4
1
2
interregnum
38
1
4
3
2
et
2

4
4
2
interpreter
2
interpretive
2
interpretation
2
interpret
38
1
4
3
2
l
2
a
4
1
2
Interpol
38
1
4
3
2
t
2

4
2
2
interpolatory
2
interpolate
38
1
4
3
2

2
or
4
0
38
1
4
3
2

2
a
4
2
2
internescine
2
intern
38
1
4
3
2
t
2

4
2
2
intermittent
2
intermit
38
1
4
3
2

2
i
4
1
2
intermediary
38
1
4
3
2

2

4
2
2
interior
2
interim
38
1
4
3
2

2

4
2
2
interference
2
interfere
38
1
4
3
2

2
e
4
1
2
interface
38
1
4
3
2
pt
2

4
3
2
interceptor
2
interception
2
intercept
38
1
4
3
2

2
e
4
3
2
interchangeably
2
intercom
2
intercalate
38
1
4
3
2

2
cfimnprsve
4
4
2
interlude
2
interject
2
interdict
2
inter
38
1
4
3
2

2

4
2
2
intention
2
intent
38
1
4
3
2

2

4
2
2
intensive
2
intensify
38
1
4
3
2

2
i
4
1
2
intense
38
1
4
3
2

2

4
3
2
intended
2
intendant
2
intend
38
1
4
3
2

2
dst
4
0
38
1
4
3
2
pera
2

4
2
2
intemperate
2
intemperance
38
1
4
3
2
nt
2

4
2
2
intelligentsia
2
intelligent
38
1
4
3
2
g
2
e
4
1
2
intelligible
38
1
4
3
2
ct
2

4
2
2
intellectual
2
intellect
38
1
4
3
2
l
2
ei
4
0
38
1
4
3
2

2
r
4
2
2
integument
2
integer
38
1
4
3
2

2

4
4
2
integrate
2
integrand
2
integral
2
integrable
38
1
4
3
2

2
a
4
1
2
integrity
38
1
4
3
2

2
glmnrs
4
0
38
1
4
3
2

2

4
3
2
intangible
2
intake
2
intact
38
1
4
3
2

2
aeioru
4
0
38
1
4
3
2

2

4
5
2
insurrect
2
insurmountable
2
insurgent
2
insure
2
insurance
38
1
4
3
2

2

4
2
2
insuppressible
2
insupportable
38
1
4
3
2

2
p
4
1
2
insuperable
38
1
4
3
2

2

4
2
2
insulate
2
insular
38
1
4
3
2

2
a
4
2
2
insult
2
insulin
38
1
4
3
2
f
2

4
2
2
insufficient
2
insufferable
38
1
4
3
2

2

4
2
2
insubstantial
2
insubordinate
38
1
4
3
2

2
bflpr
4
0
38
1
4
3
2
ent
2

4
2
2
instrumentation
2
instrument
38
1
4
3
2
t
2

4
2
2
instructor
2
instruct
38
1
4
3
2
u
2
cm
4
0
38
1
4
3
2
ut
2

4
2
2
institution
2
institute
38
1
4
3
2
ct
2

4
2
2
instinctual
2
instinct
38
1
4
3
2
l
2

4
2
2
instillation
2
instill
38
1
4
3
2

2
lnt
4
1
2
instigate
38
1
4
3
2

2

4
2
2
instep
2
instead
38
1
4
3
2

2
ln
4
1
2
instable
38
1
4
3
2

2
t
4
1
2
instance
38
1
4
3
2
l
2

4
3
2
installed
2
installation
2
install
38
1
4
3
2

2
aeir
4
0
38
1
4
3
2
r
2

4
2
2
inspire
2
inspiration
38
1
4
3
2
ct
2

4
2
2
inspector
2
inspect
38
1
4
3
2

2
ei
4
0
38
1
4
3
2
nia
2

4
2
2
insomniac
2
insomnia
38
1
4
3
2

2

4
2
2
insolvent
2
insolvable
38
1
4
3
2

2
v
4
2
2
insoluble
2
insolent
38
1
4
3
2

2
lm
4
2
2
insouciant
2
insofar
38
1
4
3
2
t
2

4
3
2
insisting
2
insistent
2
insist
38
1
4
3
2

2

4
2
2
insinuate
2
insincere
38
1
4
3
2
i
2

4
2
2
insignificant
2
insignia
38
1
4
3
2
t
2

4
2
2
insightful
2
insight
38
1
4
3
2

2
hn
4
0
38
1
4
3
2

2

4
2
2
insidious
2
inside
38
1
4
3
2

2
dgns
4
1
2
insipid
38
1
4
3
2
si
2

4
2
2
insensitive
2
insensible
38
1
4
3
2

2
t
4
1
2
insecure
38
1
4
3
2

2

4
2
2
insecticide
2
insect
38
1
4
3
2

2
cnr
4
3
2
inset
2
inseparable
2
inseminate
38
1
4
3
2

2

4
2
2
inscription
2
inscribe
38
1
4
3
2
r
2
i
4
1
2
inscrutable
38
1
4
3
2

2

4
2
2
insatiable
2
insane
38
1
4
3
2

2
aceioptu
4
1
2
inshore
38
1
4
3
2

2

4
2
2
inquisitive
2
inquisition
38
1
4
3
2
it
2
i
4
1
2
inquisitor
38
1
4
3
2

2

4
2
2
inquiry
2
inquire
38
1
4
3
2

2
rs
4
0
38
1
4
3
2
u
2
i
4
1
2
inquest
38
1
4
3
2
ut
2

4
2
2
inputting
2
input
38
1
4
3
2

2

4
2
2
inorganic
2
inordinate
38
1
4
3
2
ra
2

4
2
2
inoperative
2
inoperable
38
1
4
3
2

2
e
4
1
2
inopportune
38
1
4
3
2

2
pr
4
1
2
inoculate
38
1
4
3
2

2

4
2
2
innumerable
2
innuendo
38
1
4
3
2

2

4
2
2
innocuous
2
innocent
38
1
4
3
2

2
c
4
1
2
innovate
38
1
4
3
2

2

4
2
2
innate
2
innards
38
1
4
3
2

2
aou
4
3
2
innkeeper
2
innermost
2
inn
38
1
4
3
2
a
2

4
2
2
inmate
2
Inman
38
1
4
3
2

2

4
3
2
inlay
2
inland
2
inlaid
38
1
4
3
2

2
a
4
1
2
inlet
38
1
4
3
2

2

4
2
2
inkling
2
ink
38
1
4
3
2

2

4
3
2
injury
2
injurious
2
injure
38
1
4
3
2

2

4
2
2
injunct
2
Injun
38
1
4
3
2

2
nr
4
2
2
injustice
2
injudicious
38
1
4
3
2

2
u
4
1
2
inject
38
1
4
3
2
ia
2
l
4
1
2
initiate
38
1
4
3
2
uit
2

4
2
2
iniquity
2
iniquitous
38
1
4
3
2
i
2

4
2
2
inimitable
2
inimical
38
1
4
3
2

2
mqt
4
0
38
1
4
3
2
man
2

4
2
2
inhumane
2
inhuman
38
1
4
3
2
ogene
2

4
2
2
inhomogeneous
2
inhomogeneity
38
1
4
3
2

2
m
4
2
2
inhospitable
2
inholding
38
1
4
3
2
r
2

4
2
2
inhibitory
2
inhibitor
38
1
4
3
2
bit
2
o
4
2
2
inhibition
2
inhibit
38
1
4
3
2
t
2

4
4
2
inherited
2
inheritor
2
inheritance
2
inherit
38
1
4
3
2

2

4
2
2
inherent
2
inhere
38
1
4
3
2
r
2
ei
4
0
38
1
4
3
2

2
bl
4
1
2
inharmonious
38
1
4
3
2

2

4
2
2
inhale
2
inhalation
38
1
4
3
2
it
2
a
4
1
2
inhabit
38
1
4
3
2

2

4
2
2
inhabitation
2
inhabitant
38
1
4
3
2

2
aeiou
4
0
38
1
4
3
2

2
t
4
1
2
Ingram
38
1
4
3
2

2

4
2
2
ingratitude
2
ingratiate
38
1
4
3
2

2
i
4
1
2
ingrate
38
1
4
3
2

2
a
4
2
2
ingrown
2
ingredient
38
1
4
3
2

2

4
2
2
ingestion
2
ingestible
38
1
4
3
2
t
2
i
4
1
2
ingest
38
1
4
3
2

2
u
4
1
2
ingenious
38
1
4
3
2

2

4
2
2
ingenuous
2
ingenuity
38
1
4
3
2

2
ns
4
1
2
Ingersoll
38
1
4
3
2

2
er
4
3
2
ingot
2
inglorious
2
ingather
38
1
4
3
2

2

4
2
2
infusion
2
infusible
38
1
4
3
2

2
i
4
1
2
infuse
38
1
4
3
2

2
s
4
1
2
infuriate
38
1
4
3
2

2

4
4
2
infrastructure
2
infrared
2
infract
2
infra
38
1
4
3
2

2
a
4
2
2
infringe
2
infrequent
38
1
4
3
2
i
2

4
3
2
informative
2
information
2
Informatica
38
1
4
3
2

2
t
4
2
2
informant
2
informal
38
1
4
3
2
rm
2
a
4
1
2
inform
38
1
4
3
2
n
2
t
4
2
2
influenza
2
influence
38
1
4
3
2

2

4
2
2
influential
2
influent
38
1
4
3
2

2
e
4
1
2
influx
38
1
4
3
2

2

4
2
2
inflexible
2
inflect
38
1
4
3
2

2
mt
4
0
38
1
4
3
2

2

4
2
2
inflater
2
inflate
38
1
4
3
2

2
ei
4
0
38
1
4
3
2

2
m
4
1
2
inflame
38
1
4
3
2

2

4
2
2
inflammatory
2
inflammation
38
1
4
3
2
a
2
t
4
1
2
inflammable
38
1
4
3
2

2
aeu
4
2
2
inflow
2
inflict
38
1
4
3
2
m
2

4
2
2
infirmary
2
infirm
38
1
4
3
2

2

4
2
2
infinitum
2
infinitude
38
1
4
3
2

2

4
2
2
infinitesimal
2
infinite
38
1
4
3
2
it
2
eu
4
2
2
infinity
2
infinitive
38
1
4
3
2

2

4
2
2
infimum
2
infima
38
1
4
3
2

2
mnr
4
5
2
infix
2
infiltrate
2
infighting
2
infield
2
infidel
38
1
4
3
2
t
2

4
2
2
infestation
2
infest
38
1
4
3
2

2

4
2
2
inferring
2
inferred
38
1
4
3
2

2

4
2
2
inferno
2
infernal
38
1
4
3
2
n
2

4
2
2
inferential
2
inference
38
1
4
3
2

2
enr
4
3
2
infertile
2
inferior
2
infer
38
1
4
3
2
icit
2

4
2
2
infelicity
2
infelicitous
38
1
4
3
2
t
2

4
2
2
infectious
2
infect
38
1
4
3
2

2
clrs
4
1
2
infeasible
38
1
4
3
2

2
mn
4
3
2
infatuate
2
infarct
2
infallible
38
1
4
3
2

2

4
2
2
infantrymen
2
infantryman
38
1
4
3
2
y
2
m
4
1
2
infantry
38
1
4
3
2
t
2
r
4
2
2
infantile
2
infant
38
1
4
3
2

2

4
2
2
infamy
2
infamous
38
1
4
3
2

2
aeiloru
4
0
38
1
4
3
2

2

4
2
2
inextricable
2
inextinguishable
38
1
4
3
2
c
2

4
2
2
inexplicit
2
inexplicable
38
1
4
3
2

2
i
4
1
2
inexplainable
38
1
4
3
2

2
r
4
2
2
inexpensive
2
inexpedient
38
1
4
3
2

2

4
2
2
inexpert
2
inexperience
38
1
4
3
2

2
el
4
2
2
inexpressible
2
inexpiable
38
1
4
3
2

2
pt
4
4
2
inexorable
2
inexhaustible
2
inexcusable
2
inexact
38
1
4
3
2

2

4
2
2
inestimable
2
inescapable
38
1
4
3
2
a
2

4
2
2
inertial
2
inertia
38
1
4
3
2

2
i
4
2
2
inertance
2
inert
38
1
4
3
2

2
t
4
1
2
ineradicable
38
1
4
3
2

2

4
2
2
inequity
2
inequitable
38
1
4
3
2

2
t
4
1
2
inequivalent
38
1
4
3
2
u
2
i
4
1
2
inequality
38
1
4
3
2

2

4
4
2
ineluctable
2
ineligible
2
inelegant
2
inelastic
38
1
4
3
2
c
2

4
2
2
inefficient
2
inefficacy
38
1
4
3
2
ct
2

4
2
2
ineffectual
2
ineffective
38
1
4
3
2
f
2
ei
4
1
2
ineffable
38
1
4
3
2

2
flqrsx
4
3
2
inevitable
2
inept
2
ineducable
38
1
4
3
2

2

4
3
2
industries
2
industrious
2
industrial
38
1
4
3
2
tr
2
i
4
1
2
industry
38
1
4
3
2
ge
2

4
2
2
indulgent
2
indulge
38
1
4
3
2

2

4
4
2
inductor
2
inductee
2
inductance
2
induct
38
1
4
3
2

2
t
4
2
2
inducible
2
induce
38
1
4
3
2

2
cls
4
1
2
indubitable
38
1
4
3
2

2

4
2
2
indoctrinate
2
Indochina
38
1
4
3
2

2
c
4
6
2
indorse
2
indoor
2
Indonesia
2
indomitable
2
indolent
2
Indoeuropean
38
1
4
3
2
ua
2
l
4
1
2
individuate
38
1
4
3
2
i
2
d
4
1
2
indivisible
38
1
4
3
2
in
2

4
2
2
indistinguishable
2
indistinct
38
1
4
3
2
s
2

4
2
2
indisposition
2
indispose
38
1
4
3
2

2
o
4
2
2
indisputable
2
indispensable
38
1
4
3
2

2
r
4
2
2
indiscoverable
2
indiscernible
38
1
4
3
2

2

4
2
2
indiscretion
2
indiscreet
38
1
4
3
2

2
e
4
1
2
indiscriminate
38
1
4
3
2

2
cpt
4
1
2
indissoluble
38
1
4
3
2

2

4
2
2
indirect
2
Indira
38
1
4
3
2

2

4
2
2
indignation
2
indignant
38
1
4
3
2

2
a
4
1
2
indignity
38
1
4
3
2

2
ns
4
0
38
1
4
3
2
ti
2

4
2
2
indigestion
2
indigestible
38
1
4
3
2

2

4
3
2
indigent
2
indigenous
2
indigene
38
1
4
3
2

2
en
4
1
2
indigo
38
1
4
3
2

2

4
2
2
indicate
2
indicant
38
1
4
3
2

2
a
4
2
2
indict
2
indices
38
1
4
3
2

2
n
4
1
2
India
38
1
4
3
2
a
2

4
2
2
Indianapolis
2
Indiana
38
1
4
3
2

2
acgrsv
4
3
2
indium
2
indifferent
2
Indies
38
1
4
3
2

2
cflnst
4
5
2
index
2
independent
2
indemnity
2
indeed
2
indebted
38
1
4
3
2
ermina
2

4
3
2
indeterminate
2
indeterminacy
2
indeterminable
38
1
4
3
2

2

4
2
2
indestructible
2
indescribable
38
1
4
3
2
t
2

4
3
2
indenture
2
indentation
2
indent
38
1
4
3
2
i
2

4
2
2
indelicate
2
indelible
38
1
4
3
2
n
2

4
2
2
indefinite
2
indefinable
38
1
4
3
2

2
i
4
2
2
indefensible
2
indefatigable
38
1
4
3
2
i
2

4
2
2
indecisive
2
indecision
38
1
4
3
2

2
s
4
1
2
indecipherable
38
1
4
3
2

2
i
4
2
2
indecomposable
2
indecent
38
1
4
3
2

2
eiou
4
2
2
indy
2
indwell
38
1
4
3
2

2

4
2
2
incurrer
2
incurred
38
1
4
3
2

2
e
4
1
2
incurring
38
1
4
3
2

2
r
4
2
2
incursion
2
incur
38
1
4
3
2

2

4
2
2
inculpable
2
inculcate
38
1
4
3
2

2

4
3
2
incubus
2
incubi
2
incubate
38
1
4
3
2

2
blr
4
1
2
incumbent
38
1
4
3
2

2
ad
4
1
2
increment
38
1
4
3
2
l
2

4
2
2
incredulous
2
incredulity
38
1
4
3
2

2
u
4
1
2
incredible
38
1
4
3
2
s
2
e
4
2
2
increasing
2
increasable
38
1
4
3
2

2
e
4
1
2
incriminate
38
1
4
3
2

2

4
3
2
incorruptible
2
incorrigible
2
incorrect
38
1
4
3
2
ora
2

4
2
2
incorporate
2
incorporable
38
1
4
3
2

2
pr
4
0
38
1
4
3
2
e
2

4
2
2
inconvertible
2
inconvenient
38
1
4
3
2
o
2

4
2
2
incontrovertible
2
incontrollable
38
1
4
3
2

2
r
4
1
2
incontestable
38
1
4
3
2
era
2

4
2
2
inconsiderate
2
inconsiderable
38
1
4
3
2

2
d
4
1
2
inconsistent
38
1
4
3
2

2
i
4
4
2
inconstant
2
inconspicuous
2
inconsolable
2
inconsequential
38
1
4
3
2
ru
2

4
2
2
incongruous
2
incongruity
38
1
4
3
2

2

4
2
2
inconclusive
2
inconceivable
38
1
4
3
2

2
cgstv
4
1
2
incondensable
38
1
4
3
2
ensi
2

4
2
2
incomprehension
2
incomprehensible
38
1
4
3
2
e
2
h
4
1
2
incompressible
38
1
4
3
2
et
2

4
2
2
incompletion
2
incomplete
38
1
4
3
2

2

4
2
2
incompatible
2
incomparable
38
1
4
3
2

2
alr
4
2
2
incomputable
2
incompetent
38
1
4
3
2

2

4
2
2
incommutable
2
incommunicable
38
1
4
3
2
nsura
2

4
2
2
incommensurate
2
incommensurable
38
1
4
3
2

2
eu
4
0
38
1
4
3
2

2
mp
4
2
2
income
2
incombustible
38
1
4
3
2

2
mnr
4
1
2
incoherent
38
1
4
3
2
i
2

4
2
2
inclusive
2
inclusion
38
1
4
3
2

2
sd
4
0
38
1
4
3
2
n
2

4
2
2
incline
2
inclination
38
1
4
3
2

2
iu
4
2
2
inclose
2
inclement
38
1
4
3
2

2

4
2
2
incisive
2
incise
38
1
4
3
2
ent
2
a
4
1
2
incident
38
1
4
3
2

2
ds
4
3
2
incite
2
incipient
2
incinerate
38
1
4
3
2

2

4
2
2
incestuous
2
incest
38
1
4
3
2

2
t
4
1
2
incessant
38
1
4
3
2
t
2

4
2
2
inceptor
2
inception
38
1
4
3
2

2

4
3
2
incentive
2
incense
2
incendiary
38
1
4
3
2

2
nps
4
0
38
1
4
3
2

2

4
2
2
incarnate
2
incarcerate
38
1
4
3
2
it
2

4
2
2
incapacity
2
incapacitate
38
1
4
3
2
a
2
c
4
1
2
incapable
38
1
4
3
2

2

4
2
2
incantation
2
incant
38
1
4
3
2

2
t
4
1
2
incandescent
38
1
4
3
2

2
npr
4
3
2
incautious
2
incalculable
2
Inca
38
1
4
3
2

2
aeiloru
4
2
2
inch
2
Inc
38
1
4
3
2
e
2

4
2
2
inbreed
2
inbred
38
1
4
3
2

2

4
2
2
inborn
2
inboard
38
1
4
3
2

2
or
4
0
38
1
4
3
2
ura
2

4
2
2
inaugurate
2
inaugural
38
1
4
3
2

2
g
4
2
2
inauspicious
2
inaudible
38
1
4
3
2
tenti
2

4
2
2
inattentive
2
inattention
38
1
4
3
2

2

4
2
2
inaptitude
2
inapt
38
1
4
3
2

2
r
4
2
2
inapplicable
2
inappeasable
38
1
4
3
2

2

4
2
2
inappropriate
2
inapproachable
38
1
4
3
2

2
o
4
1
2
inappreciable
38
1
4
3
2

2
pt
4
0
38
1
4
3
2

2

4
2
2
inanimate
2
inane
38
1
4
3
2

2

4
2
2
inalterable
2
inalienable
38
1
4
3
2

2

4
2
2
inadvisable
2
inadvertent
38
1
4
3
2
qua
2

4
2
2
inadequate
2
inadequacy
38
1
4
3
2

2
ev
4
1
2
inadmissible
38
1
4
3
2

2

4
2
2
inactive
2
inactivate
38
1
4
3
2
i
2
v
4
1
2
inaction
38
1
4
3
2

2
u
4
1
2
inaccessible
38
1
4
3
2
ra
2

4
2
2
inaccurate
2
inaccuracy
38
1
4
3
2

2
ct
4
0
38
1
4
3
2

2
cdlnptu
4
3
2
inasmuch
2
inarticulate
2
inability
38
1
4
3
2

2
abcdefghijklmnopqstuv
4
3
2
inward
2
inroad
2
in
38
1
4
3
2

2

4
2
2
impute
2
imputation
38
1
4
3
2
s
2

4
2
2
impulsive
2
impulse
38
1
4
3
2

2
lt
4
4
2
impure
2
impunity
2
impugn
2
impudent
38
1
4
3
2

2

4
2
2
improvise
2
improvisate
38
1
4
3
2

2
s
4
1
2
improvident
38
1
4
3
2

2
i
4
1
2
improve
38
1
4
3
2

2
e
4
1
2
impropriety
38
1
4
3
2

2
pv
4
2
2
impromptu
2
improbable
38
1
4
3
2

2

4
3
2
imprison
2
imprint
2
imprimatur
38
1
4
3
2

2

4
3
2
impressive
2
impression
2
impressible
38
1
4
3
2

2
i
4
2
2
impressed
2
impress
38
1
4
3
2

2
s
4
1
2
impresario
38
1
4
3
2
na
2

4
2
2
impregnate
2
impregnable
38
1
4
3
2

2

4
2
2
imprecise
2
imprecate
38
1
4
3
2

2
cgs
4
0
38
1
4
3
2
ctica
2

4
2
2
impractical
2
impracticable
38
1
4
3
2

2
aeio
4
1
2
imprudent
38
1
4
3
2

2

4
2
2
imposture
2
impost
38
1
4
3
2

2
t
4
3
2
impossible
2
imposition
2
impose
38
1
4
3
2
n
2

4
2
2
importune
2
importunate
38
1
4
3
2

2

4
2
2
importation
2
important
38
1
4
3
2
t
2
au
4
1
2
import
38
1
4
3
2
it
2

4
2
2
impolitic
2
impolite
38
1
4
3
2

2
lrs
4
4
2
impoverish
2
impound
2
impotent
2
imponderable
38
1
4
3
2

2

4
2
2
implicate
2
implicant
38
1
4
3
2

2
c
4
1
2
implied
38
1
4
3
2
ment
2

4
5
2
implementing
2
implementor
2
implementer
2
implementation
2
implement
38
1
4
3
2

2
n
4
2
2
implausible
2
implacable
38
1
4
3
2
t
2

4
2
2
implantation
2
implant
38
1
4
3
2

2
aei
4
1
2
implore
38
1
4
3
2

2

4
4
2
impish
2
impious
2
impinge
2
impiety
38
1
4
3
2
u
2

4
2
2
impetus
2
impetuous
38
1
4
3
2

2

4
2
2
imperturbable
2
impertinent
38
1
4
3
2
ona
2

4
2
2
impersonate
2
impersonal
38
1
4
3
2

2

4
2
2
impermissible
2
impermeable
38
1
4
3
2

2

4
4
2
imperishable
2
imperious
2
imperil
2
imperial
38
1
4
3
2
e
2

4
2
2
imperceptible
2
imperceivable
38
1
4
3
2

2
cimst
4
3
2
impervious
2
imperfect
2
imperate
38
1
4
3
2

2

4
2
2
impenetrable
2
impend
38
1
4
3
2

2

4
2
2
impeller
2
impelled
38
1
4
3
2

2
e
4
1
2
impelling
38
1
4
3
2

2
l
4
1
2
impel
38
1
4
3
2

2

4
3
2
impediment
2
impede
2
impedance
38
1
4
3
2

2
dlnrt
4
2
2
impeccable
2
impeach
38
1
4
3
2

2

4
2
2
impassive
2
impassion
38
1
4
3
2
s
2
i
4
2
2
impasse
2
impassable
38
1
4
3
2
t
2

4
3
2
impartial
2
impartation
2
impart
38
1
4
3
2

2

4
2
2
impalpable
2
impale
38
1
4
3
2

2
lrsi
4
2
2
impatient
2
impact
38
1
4
3
2

2
aeiloru
4
1
2
imp
38
1
4
3
2

2

4
2
2
immunoelectrophoresis
2
immune
38
1
4
3
2

2
n
4
1
2
immutable
38
1
4
3
2

2

4
2
2
immortal
2
immoral
38
1
4
3
2
t
2

4
2
2
immodesty
2
immodest
38
1
4
3
2
e
2
s
4
1
2
immoderate
38
1
4
3
2
il
2

4
2
2
immobility
2
immobile
38
1
4
3
2

2
bdr
4
1
2
immovable
38
1
4
3
2
ra
2

4
2
2
immigrate
2
immigrant
38
1
4
3
2

2
g
4
2
2
imminent
2
immiscible
38
1
4
3
2
s
2

4
2
2
immersion
2
immerse
38
1
4
3
2
ia
2

4
2
2
immediate
2
immediacy
38
1
4
3
2

2
dr
4
3
2
immense
2
immemorial
2
immeasurable
38
1
4
3
2

2
t
4
2
2
immanent
2
immaculate
38
1
4
3
2

2

4
2
2
immature
2
immaterial
38
1
4
3
2

2
aeiou
4
0
38
1
4
3
2
ta
2

4
2
2
imitate
2
imitable
38
1
4
3
2

2

4
3
2
imbrue
2
imbroglio
2
Imbrium
38
1
4
3
2

2
r
4
4
2
imbue
2
imbibe
2
imbecile
2
imbalance
38
1
4
3
2
g
2
ei
4
0
38
1
4
3
2

2

4
2
2
imaginate
2
imaginary
38
1
4
3
2
n
2
a
4
1
2
imagine
38
1
4
3
2

2

4
3
2
imagery
2
imagen
2
image
38
1
4
3
2

2
abimp
4
0
38
1
4
3
2
r
2

4
2
2
illustrious
2
illustrate
38
1
4
3
2

2
o
4
1
2
illusive
38
1
4
3
2
n
2

4
2
2
illusionary
2
illusion
38
1
4
3
2

2
it
4
1
2
illusory
38
1
4
3
2

2
i
4
1
2
illume
38
1
4
3
2
n
2

4
2
2
illumine
2
illuminate
38
1
4
3
2

2
ms
4
0
38
1
4
3
2
era
2

4
2
2
illiterate
2
illiteracy
38
1
4
3
2

2
t
4
3
2
Illinois
2
illimitable
2
illicit
38
1
4
3
2
ima
2

4
2
2
illegitimate
2
illegitimacy
38
1
4
3
2

2
t
4
1
2
illegible
38
1
4
3
2
g
2
i
4
1
2
illegal
38
1
4
3
2

2
eiu
4
2
2
illogic
2
ill
38
1
4
3
2

2

4
5
2
I've
2
i's
2
I'm
2
I'll
2
I'd
38
1
4
3
2
a
2

4
2
2
Iliad
2
iliac
38
1
4
3
2

2
il
4
4
2
Ilyushin
2
Ilona
2
ileum
2
IL
38
1
4
3
2

2

4
2
2
iii
2
ii
38
1
4
3
2

2

4
2
2
ignorant
2
ignoramus
38
1
4
3
2

2
a
4
1
2
ignore
38
1
4
3
2

2
r
4
2
2
ignominious
2
ignoble
38
1
4
3
2
t
2

4
2
2
ignition
2
ignite
38
1
4
3
2

2
io
4
1
2
igneous
38
1
4
3
2

2
n
4
2
2
Igor
2
igloo
38
1
4
3
2

2

4
3
2
Ifni
2
iffy
2
if
38
1
4
3
2
ll
2

4
2
2
idyllic
2
idyll
38
1
4
3
2
l
2

4
2
2
idolatry
2
idol
38
1
4
3
2

2

4
2
2
idiotic
2
idiot
38
1
4
3
2
yncra
2

4
2
2
idiosyncratic
2
idiosyncrasy
38
1
4
3
2

2

4
2
2
idiomatic
2
idiom
38
1
4
3
2
o
2
mst
4
1
2
idiocy
38
1
4
3
2
l
2

4
2
2
ideology
2
ideolect
38
1
4
3
2
ti
2

4
3
2
identity
2
identify
2
identical
38
1
4
3
2

2

4
4
2
ideas
2
ideate
2
ideal
2
idea
38
1
4
3
2

2
ano
4
1
2
idempotent
38
1
4
3
2

2

4
2
2
Idaho
2
Ida
38
1
4
3
2

2
aeioy
4
2
2
idle
2
ID
38
1
4
3
2

2

4
2
2
icosahedral
2
icosahedra
38
1
4
3
2
ahedr
2
a
4
1
2
icosahedron
38
1
4
3
2

2
o
4
1
2
icon
38
1
4
3
2
clas
2

4
2
2
iconoclast
2
iconoclasm
38
1
4
3
2

2
ns
4
0
38
1
4
3
2
and
2

4
2
2
Icelandic
2
iceland
38
1
4
3
2

2

4
2
2
icebox
2
iceberg
38
1
4
3
2

2
bl
4
1
2
ice
38
1
4
3
2

2
eo
4
6
2
icy
2
icky
2
icicle
2
ichneumon
2
ICC
2
Icarus
38
1
4
3
2

2

4
2
2
ibis
2
ibid
38
1
4
3
2

2

4
2
2
ibex
2
Iberia
38
1
4
3
2

2
ei
4
2
2
Ibn
2
IBM
38
1
4
3
2

2

4
3
2
Ian
2
iambic
2
IA
38
1
4
3
2

2
abCdfgil'mnoprstv
4
6
2
Izvestia
2
ix
2
IQ
2
Ike
2
IEEE
2
i
38
1
4
3
2

2

4
2
2
hysteric
2
hysteria
38
1
4
3
2

2

4
2
2
hysteresis
2
hysterectomy
38
1
4
3
2
ter
2
ei
4
1
2
hysteron
38
1
4
3
2

2

4
2
2
hypothesis
2
hypotheses
38
1
4
3
2

2
s
4
1
2
hypothetic
38
1
4
3
2
lam
2

4
2
2
hypothalamus
2
hypothalamic
38
1
4
3
2

2
ae
4
1
2
hypothyroid
38
1
4
3
2

2
h
4
1
2
hypotenuse
38
1
4
3
2

2

4
2
2
hypocritic
2
hypocrite
38
1
4
3
2
i
2
t
4
1
2
hypocrisy
38
1
4
3
2
lor
2

4
2
2
hypochlorous
2
hypochlorite
38
1
4
3
2

2
hr
4
1
2
hypocycloid
38
1
4
3
2

2
ct
4
3
2
hypophyseal
2
hypodermic
2
hypoactive
38
1
4
3
2
o
2

4
2
2
hypnotic
2
hypnosis
38
1
4
3
2
en
2

4
2
2
hyphenate
2
hyphen
38
1
4
3
2
r
2
b
4
1
2
hypertensive
38
1
4
3
2
ol
2
o
4
2
2
hyperbolic
2
hyperbola
38
1
4
3
2
id
2

4
2
2
hyperboloidal
2
hyperboloid
38
1
4
3
2

2
ehno
4
0
38
1
4
3
2

2

4
2
2
hymnal
2
hymn
38
1
4
3
2

2
n
4
2
2
hymen
2
Hyman
38
1
4
3
2
o
2

4
2
2
hygroscopic
2
hygrometer
38
1
4
3
2

2
r
4
1
2
hygiene
38
1
4
3
2

2

4
2
2
hydroxylate
2
hydroxyl
38
1
4
3
2

2
l
4
1
2
hydroxy
38
1
4
3
2

2
y
4
1
2
hydroxide
38
1
4
3
2

2

4
2
2
hydrostatic
2
hydrosphere
38
1
4
3
2
bi
2

4
2
2
hydrophobic
2
hydrophobia
38
1
4
3
2
h
2
o
4
1
2
hydrophilic
38
1
4
3
2

2

4
2
2
hydrolysis
2
hydrology
38
1
4
3
2
en
2

4
2
2
hydrogenate
2
hydrogen
38
1
4
3
2
ori
2

4
2
2
hydrochloride
2
hydrochloric
38
1
4
3
2

2
l
4
1
2
hydrochemistry
38
1
4
3
2

2
h
4
1
2
hydrocarbon
38
1
4
3
2

2
cglpsx
4
8
2
hydrous
2
hydrothermal
2
hydronium
2
hydrometer
2
hydrofluoric
2
hydroelectric
2
hydrodynamic
2
hydro
38
1
4
3
2

2
n
4
3
2
hydraulic
2
hydrate
2
hydra
38
1
4
3
2

2

4
2
2
hydrant
2
hydrangea
38
1
4
3
2

2
ao
4
1
2
hydride
38
1
4
3
2

2
r
4
1
2
Hyde
38
1
4
3
2

2

4
4
2
Hyannis
2
hyaline
2
Hyades
2
hyacinth
38
1
4
3
2

2
adgmps
4
3
2
hying
2
hyena
2
hybrid
38
1
4
3
2

2

4
2
2
Huxtable
2
Huxley
38
1
4
3
2
s
2

4
2
2
Hutchinson
2
Hutchins
38
1
4
3
2

2
n
4
1
2
Hutchison
38
1
4
3
2
h
2
i
4
1
2
hutch
38
1
4
3
2

2
c
4
1
2
hut
38
1
4
3
2

2

4
2
2
Huston
2
hustle
38
1
4
3
2
and
2
m
4
2
2
husbandry
2
husband
38
1
4
3
2

2

4
2
2
husbandmen
2
husbandman
38
1
4
3
2

2
bt
4
2
2
husky
2
hush
38
1
4
3
2

2

4
3
2
hurty
2
hurtle
2
hurt
38
1
4
3
2

2

4
2
2
hurray
2
hurrah
38
1
4
3
2

2
a
4
2
2
hurry
2
hurricane
38
1
4
3
2

2

4
2
2
hurley
2
hurl
38
1
4
3
2

2

4
2
2
hurdle
2
Hurd
38
1
4
3
2

2
dlrt
4
3
2
Hurwitz
2
Hurst
2
Huron
38
1
4
3
2

2

4
4
2
Huntsville
2
Huntley
2
Huntington
2
hunt
38
1
4
3
2
r
2

4
2
2
Hungary
2
Hungarian
38
1
4
3
2

2
a
4
2
2
hungry
2
hung
38
1
4
3
2
red
2

4
3
2
hundredth
2
hundredfold
2
hundred
38
1
4
3
2

2
dgt
4
3
2
hunk
2
hunch
2
Hun
38
1
4
3
2

2

4
4
2
humpty
2
Humphrey
2
humpback
2
hump
38
1
4
3
2

2

4
3
2
hummock
2
hummingbird
2
Hummel
38
1
4
3
2
i
2

4
2
2
humility
2
humiliate
38
1
4
3
2

2
i
4
1
2
humid
38
1
4
3
2

2

4
2
2
humidistat
2
humidify
38
1
4
3
2

2
dl
4
0
38
1
4
3
2

2

4
2
2
Humboldt
2
humble
38
1
4
3
2
n
2

4
3
2
humanitarian
2
humane
2
human
38
1
4
3
2

2
abimp
4
4
2
humus
2
humorous
2
humerus
2
hum
38
1
4
3
2

2

4
2
2
hull
2
hulk
38
1
4
3
2

2

4
2
2
Hughes
2
Hugh
38
1
4
3
2
in
2

4
2
2
Huggins
2
hugging
38
1
4
3
2

2
gh
4
3
2
Hugo
2
huge
2
hug
38
1
4
3
2
f
2

4
2
2
Huffman
2
huff
38
1
4
3
2

2

4
2
2
Hudson
2
huddle
38
1
4
3
2
k
2

4
3
2
huckster
2
huckleberry
2
huck
38
1
4
3
2

2
be
4
2
2
hubris
2
hub
38
1
4
3
2
r
2

4
2
2
Hubert
2
Huber
38
1
4
3
2

2

4
4
2
hubby
2
hubbub
2
Hubbell
2
Hubbard
38
1
4
3
2

2
bcdfglmnrstx
4
3
2
huzzah
2
huh
2
hue
38
1
4
3
2
en
2

4
2
2
hoydenish
2
hoyden
38
1
4
3
2

2
d
4
2
2
Hoyt
2
hoy
38
1
4
3
2
o
2

4
2
2
howsomever
2
howsoever
38
1
4
3
2

2

4
3
2
however
2
Howell
2
Howe
38
1
4
3
2

2
es
4
4
2
howl
2
howdy
2
Howard
2
how
38
1
4
3
2
e
2

4
3
2
hover
2
hovel
2
hove
38
1
4
3
2

2
bw
4
5
2
houses
2
housekeep
2
household
2
housefly
2
house
38
1
4
3
2

2

4
2
2
housewives
2
housewife
38
1
4
3
2

2
i
4
1
2
housework
38
1
4
3
2

2

4
2
2
housebroken
2
housebreak
38
1
4
3
2

2
r
4
1
2
houseboat
38
1
4
3
2

2
e
4
1
2
Houston
38
1
4
3
2

2

4
3
2
hours
2
hourglass
2
hour
38
1
4
3
2
h
2

4
2
2
Houghton
2
hough
38
1
4
3
2

2

4
2
2
Houdini
2
Houdaille
38
1
4
3
2

2
dgrs
4
1
2
hound
38
1
4
3
2

2

4
2
2
hothouse
2
hothead
38
1
4
3
2
l
2

4
2
2
hotelman
2
hotel
38
1
4
3
2

2

4
2
2
hotbox
2
hotbed
38
1
4
3
2

2
beh
4
2
2
hotrod
2
hot
38
1
4
3
2

2

4
2
2
hostess
2
hostelry
38
1
4
3
2

2
e
4
4
2
hostler
2
hostile
2
hostage
2
host
38
1
4
3
2
a
2

4
2
2
hospital
2
hospitable
38
1
4
3
2
i
2
t
4
1
2
hospice
38
1
4
3
2

2
pt
4
2
2
hosiery
2
hose
38
1
4
3
2

2

4
2
2
Horton
2
horticulture
38
1
4
3
2
om
2

4
2
2
horsewomen
2
horsewoman
38
1
4
3
2

2

4
2
2
horsepower
2
horseplay
38
1
4
3
2

2

4
2
2
horsemen
2
horseman
38
1
4
3
2
l
2

4
2
2
horsefly
2
horseflesh
38
1
4
3
2
e
2
fmpw
4
6
2
horsetail
2
horseshoe
2
horsehair
2
horsedom
2
horseback
2
horse
38
1
4
3
2

2

4
3
2
horrify
2
horrid
2
horrible
38
1
4
3
2

2
i
4
2
2
horror
2
horrendous
38
1
4
3
2

2

4
3
2
Horowitz
2
horoscope
2
horology
38
1
4
3
2

2

4
2
2
Hornblower
2
hornblende
38
1
4
3
2

2
l
4
1
2
hornbeam
38
1
4
3
2

2
b
4
6
2
horny
2
hornwort
2
horntail
2
hornmouth
2
hornet
2
horn
38
1
4
3
2
zon
2
t
4
1
2
horizon
38
1
4
3
2

2

4
2
2
Horatio
2
Horace
38
1
4
3
2

2
ainorst
4
4
2
Horus
2
hormone
2
horehound
2
horde
38
1
4
3
2
ins
2

4
2
2
Hopkinsian
2
Hopkins
38
1
4
3
2

2

4
2
2
hopeful
2
hope
38
1
4
3
2

2
ek
4
3
2
hopscotch
2
hopple
2
hop
38
1
4
3
2
e
2

4
2
2
hooves
2
Hoover
38
1
4
3
2

2

4
2
2
Hoosier
2
hoosegow
38
1
4
3
2

2

4
2
2
hoopla
2
hoop
38
1
4
3
2

2

4
3
2
hookworm
2
hookup
2
hook
38
1
4
3
2

2

4
2
2
hoofmark
2
hoof
38
1
4
3
2

2

4
2
2
hoodlum
2
hood
38
1
4
3
2

2
dfkpsv
4
3
2
hoot
2
hooligan
2
hooch
38
1
4
3
2
r
2
i
4
1
2
honorary
38
1
4
3
2

2

4
2
2
honoraria
2
honorarium
38
1
4
3
2

2
a
4
2
2
honorific
2
honoree
38
1
4
3
2

2
r
4
1
2
Honolulu
38
1
4
3
2

2

4
7
2
Honeywell
2
honeysuckle
2
honeymoon
2
honeydew
2
honeycomb
2
honeybee
2
honey
38
1
4
3
2
t
2

4
2
2
honesty
2
honest
38
1
4
3
2

2
sy
4
1
2
hone
38
1
4
3
2

2

4
3
2
Honduras
2
hondo
2
Honda
38
1
4
3
2

2
deo
4
3
2
Honshu
2
honk
2
hong
38
1
4
3
2
orphi
2

4
2
2
homomorphism
2
homomorphic
38
1
4
3
2
og
2

4
3
2
homology
2
homologue
2
homologous
38
1
4
3
2

2

4
2
2
homogeneous
2
homogeneity
38
1
4
3
2
en
2
e
4
1
2
homogenate
38
1
4
3
2

2
glm
4
6
2
homozygous
2
homotopy
2
homosexual
2
homophobia
2
homonym
2
homo
38
1
4
3
2
id
2

4
2
2
homicide
2
homicidal
38
1
4
3
2

2
c
4
1
2
homily
38
1
4
3
2

2

4
2
2
homework
2
homeward
38
1
4
3
2

2

4
2
2
homestead
2
homesick
38
1
4
3
2
orph
2

4
2
2
homeomorphic
2
homeomorph
38
1
4
3
2

2
m
4
2
2
homeowner
2
homeopath
38
1
4
3
2
a
2

4
2
2
homemake
2
homemade
38
1
4
3
2
ild
2

4
2
2
homebuilding
2
homebuilder
38
1
4
3
2

2
u
4
1
2
homebound
38
1
4
3
2

2
bmosw
4
4
2
Homeric
2
homeland
2
homecoming
2
home
38
1
4
3
2

2
eio
4
3
2
homunculus
2
homage
2
Hom
38
1
4
3
2

2

4
2
2
holystone
2
Holyoke
38
1
4
3
2

2

4
2
2
holster
2
Holstein
38
1
4
3
2
t
2
e
4
1
2
Holst
38
1
4
3
2
ra
2

4
2
2
holography
2
hologram
38
1
4
3
2

2

4
2
2
Holocene
2
holocaust
38
1
4
3
2

2
cg
4
0
38
1
4
3
2

2

4
5
2
holmium
2
Holmes
2
Holmdel
2
Holman
2
Holm
38
1
4
3
2

2

4
3
2
Hollywood
2
hollyhock
2
holly
38
1
4
3
2
w
2

4
3
2
hollowware
2
Holloway
2
hollow
38
1
4
3
2

2

4
2
2
Hollister
2
Hollingsworth
38
1
4
3
2
r
2

4
2
2
Hollerith
2
holler
38
1
4
3
2
nd
2

4
2
2
Hollandaise
2
Holland
38
1
4
3
2

2
aeioy
4
0
38
1
4
3
2

2

4
2
2
holeable
2
hole
38
1
4
3
2

2

4
6
2
holds
2
holding
2
holdup
2
holdover
2
holden
2
hold
38
1
4
3
2

2
delmosy
4
4
2
holt
2
holiday
2
Holcomb
2
Holbrook
38
1
4
3
2

2

4
3
2
hogging
2
hogan
2
hog
38
1
4
3
2
f
2

4
2
2
Hoffman
2
Hoff
38
1
4
3
2

2

4
3
2
Hodges
2
hodgepodge
2
hodge
38
1
4
3
2
g
2
e
4
1
2
Hodgkin
38
1
4
3
2

2

4
2
2
hockey
2
hock
38
1
4
3
2

2
k
4
1
2
hoc
38
1
4
3
2

2

4
2
2
Hoboken
2
hobo
38
1
4
3
2

2

4
2
2
hobbyhorse
2
hobby
38
1
4
3
2

2
y
4
3
2
Hobbs
2
hobble
2
Hobbes
38
1
4
3
2

2
bo
4
2
2
Hobart
2
hob
38
1
4
3
2

2

4
4
2
hoarse
2
hoarfrost
2
hoard
2
hoar
38
1
4
3
2

2

4
3
2
hoagy
2
Hoagland
2
hoagie
38
1
4
3
2

2
gr
4
0
38
1
4
3
2

2
abcdfglmnoprstuvwy
4
4
2
Hokan
2
hoi
2
hoe
2
ho
38
1
4
3
2
er
2

4
2
2
hitherto
2
hither
38
1
4
3
2
h
2

4
2
2
Hitchcock
2
hitch
38
1
4
3
2

2
ch
4
3
2
Hitler
2
Hitachi
2
hit
38
1
4
3
2

2

4
3
2
historiography
2
historic
2
historian
38
1
4
3
2

2
i
4
1
2
history
38
1
4
3
2
hemi
2

4
2
2
histochemistry
2
histochemic
38
1
4
3
2

2
cr
4
2
2
histology
2
histogram
38
1
4
3
2

2
o
4
3
2
histrionic
2
histidine
2
histamine
38
1
4
3
2

2
t
4
3
2
hiss
2
Hispanic
2
his
38
1
4
3
2

2

4
2
2
hirsute
2
Hirsch
38
1
4
3
2
shi
2

4
2
2
Hiroshima
2
Hiroshi
38
1
4
3
2

2

4
2
2
hireling
2
hire
38
1
4
3
2

2
eos
4
1
2
Hiram
38
1
4
3
2

2
c
4
3
2
hippopotamus
2
hippodrome
2
hippo
38
1
4
3
2
rat
2

4
2
2
Hippocratic
2
Hippocrates
38
1
4
3
2

2
o
4
1
2
hippy
38
1
4
3
2

2
p
4
2
2
hipster
2
hip
38
1
4
3
2

2

4
2
2
hinterland
2
hint
38
1
4
3
2

2

4
6
2
hinder
2
Hindu
2
hindsight
2
hindrance
2
hindmost
2
hind
38
1
4
3
2

2
dt
4
3
2
Hinman
2
hinge
2
Hines
38
1
4
3
2

2

4
3
2
himself
2
Himalaya
2
him
38
1
4
3
2

2

4
2
2
Hilton
2
hilt
38
1
4
3
2

2

4
2
2
hillmen
2
hillman
38
1
4
3
2

2
m
4
8
2
hilly
2
hilltop
2
hillside
2
hillock
2
Hillel
2
Hillcrest
2
hillbilly
2
hill
38
1
4
3
2
ri
2

4
2
2
hilarity
2
hilarious
38
1
4
3
2

2
alt
4
3
2
hilum
2
Hildebrand
2
Hilbert
38
1
4
3
2

2

4
2
2
highwaymen
2
highwayman
38
1
4
3
2
ay
2
m
4
1
2
highway
38
1
4
3
2

2

4
3
2
highly
2
highlight
2
highland
38
1
4
3
2

2

4
2
2
highboy
2
highball
38
1
4
3
2

2
blw
4
7
2
high-level
2
higher
2
hightail
2
highroad
2
highhanded
2
highfalutin
2
high
38
1
4
3
2

2
h
4
1
2
Higgins
38
1
4
3
2

2

4
2
2
Hieronymus
2
hieroglyphic
38
1
4
3
2

2
r
4
1
2
hieratic
38
1
4
3
2
ch
2

4
3
2
hierarchy
2
hierarchic
2
hierarchal
38
1
4
3
2
r
2
ao
4
0
38
1
4
3
2
u
2

4
2
2
hideout
2
hideous
38
1
4
3
2

2
o
4
2
2
hideaway
2
hide
38
1
4
3
2

2
e
4
3
2
hidden
2
hidalgo
2
hid
38
1
4
3
2
k
2

4
4
2
hickory
2
Hickman
2
Hickey
2
hick
38
1
4
3
2
rn
2

4
2
2
Hibernia
2
hibernate
38
1
4
3
2

2
e
4
2
2
Hibbard
2
hibachi
38
1
4
3
2

2

4
2
2
hiatus
2
Hiatt
38
1
4
3
2

2
t
4
1
2
Hiawatha
38
1
4
3
2

2
abcdeglmnprst
4
5
2
hive
2
hike
2
hijack
2
hifalutin
2
hi
38
1
4
3
2

2

4
2
2
heyday
2
hey
38
1
4
3
2
on
2

4
2
2
hexagonal
2
hexagon
38
1
4
3
2

2
g
4
5
2
hexane
2
hexameter
2
hexafluoride
2
hexadecimal
2
hexachloride
38
1
4
3
2

2
a
4
1
2
hex
38
1
4
3
2

2

4
5
2
hewn
2
Hewlett
2
Hewitt
2
Hewett
2
hew
38
1
4
3
2
e
2

4
2
2
Heuser
2
Heusen
38
1
4
3
2

2
s
4
2
2
heuristic
2
Heublein
38
1
4
3
2

2

4
2
2
Hetty
2
Hettie
38
1
4
3
2
ro
2
gs
4
3
2
heterozygous
2
heterodyne
2
heterocyclic
38
1
4
3
2

2

4
2
2
heterostructure
2
heterosexual
38
1
4
3
2
ne
2

4
2
2
heterogeneous
2
heterogeneity
38
1
4
3
2

2
e
4
1
2
heterogamous
38
1
4
3
2

2
et
4
1
2
Hetman
38
1
4
3
2

2

4
3
2
Hessian
2
Hesse
2
Hess
38
1
4
3
2
ta
2
t
4
1
2
hesitant
38
1
4
3
2
e
2

4
2
2
hesitater
2
hesitate
38
1
4
3
2

2
is
4
2
2
Hester
2
Hesperus
38
1
4
3
2
z
2

4
2
2
Hertzog
2
hertz
38
1
4
3
2
e
2

4
2
2
Hershey
2
Hershel
38
1
4
3
2

2
h
4
3
2
herself
2
Herschel
2
hers
38
1
4
3
2

2

4
2
2
herringbone
2
Herr
38
1
4
3
2
e
2

4
2
2
herpetology
2
herpes
38
1
4
3
2

2

4
2
2
heroine
2
heroin
38
1
4
3
2

2
n
4
2
2
heroism
2
heroic
38
1
4
3
2

2
i
4
4
2
heron
2
heroes
2
Herodotus
2
hero
38
1
4
3
2
t
2

4
2
2
hermitian
2
Hermite
38
1
4
3
2

2

4
3
2
hermetic
2
Hermes
2
hermeneutic
38
1
4
3
2
n
2

4
2
2
Hermann
2
Herman
38
1
4
3
2

2
aei
4
1
2
Hermosa
38
1
4
3
2
ta
2

4
2
2
heritage
2
heritable
38
1
4
3
2
n
2

4
2
2
hereunto
2
hereunder
38
1
4
3
2

2

4
2
2
heretofore
2
hereto
38
1
4
3
2

2
o
4
1
2
heretic
38
1
4
3
2

2

4
2
2
hereinafter
2
hereinabove
38
1
4
3
2
n
2
a
4
2
2
hereinbelow
2
herein
38
1
4
3
2
it
2

4
2
2
heredity
2
hereditary
38
1
4
3
2

2

4
2
2
hereafter
2
hereabout
38
1
4
3
2

2
aditu
4
6
2
herewith
2
heresy
2
hereof
2
Hereford
2
hereby
2
here
38
1
4
3
2

2

4
2
2
herdsman
2
herd
38
1
4
3
2
ule
2

4
2
2
Hercules
2
Herculean
38
1
4
3
2

2

4
2
2
Herbert
2
herb
38
1
4
3
2

2

4
3
2
herald
2
Heraclitus
2
Hera
38
1
4
3
2

2
abcdeimoprst
4
3
2
Hernandez
2
Herkimer
2
her
38
1
4
3
2
ti
2

4
2
2
hepatitis
2
hepatica
38
1
4
3
2

2
a
4
2
2
heptane
2
Hepburn
38
1
4
3
2

2

4
2
2
Henrietta
2
Henri
38
1
4
3
2

2
i
4
1
2
henry
38
1
4
3
2
ick
2

4
2
2
Hendrickson
2
Hendrick
38
1
4
3
2

2
r
4
1
2
Henderson
38
1
4
3
2
m
2

4
2
2
henchmen
2
henchman
38
1
4
3
2

2

4
2
2
henceforth
2
hence
38
1
4
3
2

2
eh
4
0
38
1
4
3
2

2
cdr
4
5
2
henpeck
2
Henley
2
henequen
2
henbane
2
hen
38
1
4
3
2

2

4
2
2
Hempstead
2
hemp
38
1
4
3
2
rh
2

4
2
2
hemorrhoid
2
hemorrhage
38
1
4
3
2

2
r
4
3
2
hemosiderin
2
hemolytic
2
hemoglobin
38
1
4
3
2
pher
2

4
2
2
hemispheric
2
hemisphere
38
1
4
3
2

2
s
4
1
2
Hemingway
38
1
4
3
2

2
iop
4
3
2
hemlock
2
hematite
2
hem
38
1
4
3
2

2

4
4
2
helps
2
helpmate
2
helpful
2
help
38
1
4
3
2
m
2

4
2
2
helmsmen
2
helmsman
38
1
4
3
2

2
s
4
4
2
Helmut
2
Helmholtz
2
helmet
2
helm
38
1
4
3
2

2

4
2
2
Hellenic
2
hellebore
38
1
4
3
2

2
e
4
6
2
hello
2
hellish
2
hellgrammite
2
hellfire
2
hellbender
2
hell
38
1
4
3
2

2

4
2
2
he'll
2
he'd
38
1
4
3
2

2

4
2
2
heliotrope
2
heliocentric
38
1
4
3
2

2

4
2
2
helicopter
2
helical
38
1
4
3
2

2
co
4
2
2
helix
2
helium
38
1
4
3
2
n
2

4
3
2
Helene
2
Helena
2
Helen
38
1
4
3
2

2
eilmp
4
4
2
Helvetica
2
Helsinki
2
Helga
2
held
38
1
4
3
2

2

4
3
2
heirarchy
2
heiress
2
heir
38
1
4
3
2

2

4
3
2
Heinz
2
Heinrich
2
Heine
38
1
4
3
2

2

4
2
2
heighten
2
height
38
1
4
3
2
h
2
t
4
1
2
heigh
38
1
4
3
2

2
gnr
4
2
2
Heisenberg
2
Heidelberg
38
1
4
3
2
e
2

4
2
2
hegemony
2
Hegelian
38
1
4
3
2
t
2

4
2
2
hefty
2
heft
38
1
4
3
2

2

4
2
2
heel
2
heed
38
1
4
3
2
nis
2

4
2
2
hedonist
2
hedonism
38
1
4
3
2
e
2

4
2
2
hedgehog
2
hedge
38
1
4
3
2

2
go
4
0
38
1
4
3
2

2

4
2
2
hector
2
hectic
38
1
4
3
2

2

4
3
2
Heckman
2
heckle
2
heck
38
1
4
3
2
t
2

4
2
2
hecatomb
2
Hecate
38
1
4
3
2

2
akt
4
1
2
Hecuba
38
1
4
3
2

2

4
2
2
Hebrew
2
Hebraic
38
1
4
3
2

2

4
2
2
hebephrenic
2
Hebe
38
1
4
3
2

2
er
4
0
38
1
4
3
2

2

4
2
2
heavyweight
2
heavy
38
1
4
3
2

2
n
4
1
2
heave
38
1
4
3
2

2

4
2
2
heavenward
2
heaven
38
1
4
3
2

2
ey
4
0
38
1
4
3
2
n
2

4
2
2
heathenish
2
heathen
38
1
4
3
2

2
e
4
2
2
Heathkit
2
heath
38
1
4
3
2

2
h
4
2
2
heater
2
heat
38
1
4
3
2

2

4
2
2
heartbreak
2
heartbeat
38
1
4
3
2

2
b
4
5
2
hearty
2
hearth
2
heartfelt
2
hearten
2
heart
38
1
4
3
2

2

4
3
2
Hearst
2
hearse
2
hearsay
38
1
4
3
2

2
st
4
3
2
hearken
2
heard
2
hear
38
1
4
3
2
h
2

4
3
2
healthy
2
healthful
2
health
38
1
4
3
2

2
t
4
3
2
Healy
2
Healey
2
heal
38
1
4
3
2

2
lsw
4
10
2
header
2
heady
2
headroom
2
headquarter
2
headphone
2
headmaster
2
headdress
2
headboard
2
headache
2
head
38
1
4
3
2

2

4
3
2
headway
2
headwater
2
headwall
38
1
4
3
2

2
a
4
1
2
headwind
38
1
4
3
2

2

4
3
2
headstrong
2
headstone
2
headstand
38
1
4
3
2

2

4
2
2
headsmen
2
headsman
38
1
4
3
2

2
mt
4
1
2
headset
38
1
4
3
2

2
n
4
1
2
headlight
38
1
4
3
2

2
i
4
1
2
headland
38
1
4
3
2

2
dlrtv
4
1
2
heap
38
1
4
3
2

2
abcdefgil'mnprstuwxy
4
1
2
he
38
1
4
3
2

2

4
2
2
hazelnut
2
hazel
38
1
4
3
2

2
l
4
1
2
haze
38
1
4
3
2
rd
2

4
2
2
hazardous
2
hazard
38
1
4
3
2

2
ae
4
1
2
hazy
38
1
4
3
2

2

4
2
2
Haydn
2
Hayden
38
1
4
3
2

2
d
4
6
2
hayward
2
haystack
2
Haynes
2
hayfield
2
Hayes
2
hay
38
1
4
3
2
horn
2

4
2
2
Hawthorne
2
hawthorn
38
1
4
3
2

2

4
2
2
Hawkins
2
hawk
38
1
4
3
2
ii
2

4
2
2
Hawaiian
2
Hawaii
38
1
4
3
2

2
akt
4
2
2
Hawley
2
haw
38
1
4
3
2

2

4
2
2
haven't
2
haven
38
1
4
3
2

2
n
4
1
2
have
38
1
4
3
2

2
ei
4
2
2
havoc
2
Havana
38
1
4
3
2

2

4
2
2
haunt
2
haunch
38
1
4
3
2

2

4
2
2
haulage
2
haul
38
1
4
3
2

2

4
2
2
haughty
2
Haugen
38
1
4
3
2

2
gln
4
1
2
Hausdorff
38
1
4
3
2
e
2

4
2
2
Hattiesburg
2
Hattie
38
1
4
3
2

2
i
4
1
2
Hatteras
38
1
4
3
2

2

4
2
2
Hathaway
2
hath
38
1
4
3
2

2

4
3
2
hater
2
hateful
2
hate
38
1
4
3
2
h
2

4
3
2
hatchway
2
hatchet
2
hatch
38
1
4
3
2

2
ceht
4
3
2
hatred
2
Hatfield
2
hat
38
1
4
3
2

2

4
2
2
hasten
2
haste
38
1
4
3
2

2
e
4
3
2
hasty
2
Hastings
2
hast
38
1
4
3
2

2

4
2
2
hashish
2
hash
38
1
4
3
2

2
ht
4
4
2
hassle
2
hasp
2
hasn't
2
has
38
1
4
3
2
t
2

4
2
2
harvestman
2
harvest
38
1
4
3
2

2
s
4
1
2
Harvey
38
1
4
3
2

2
e
4
1
2
Harvard
38
1
4
3
2

2

4
4
2
Hartman
2
Hartley
2
Hartford
2
hart
38
1
4
3
2
h
2

4
2
2
harshen
2
harsh
38
1
4
3
2

2
s
4
3
2
Harrington
2
Harriman
2
Harriet
38
1
4
3
2

2

4
3
2
Harrison
2
Harrisburg
2
Harris
38
1
4
3
2

2
i
4
2
2
harry
2
harrow
38
1
4
3
2

2

4
4
2
Harpy
2
harpsichord
2
harpoon
2
harp
38
1
4
3
2

2

4
2
2
harmonica
2
harmonic
38
1
4
3
2

2
c
4
1
2
harmonious
38
1
4
3
2
n
2
i
4
2
2
harmony
2
Harmon
38
1
4
3
2

2
o
4
2
2
harmful
2
harm
38
1
4
3
2

2

4
2
2
Harley
2
Harlem
38
1
4
3
2

2
e
4
1
2
Harlan
38
1
4
3
2

2

4
3
2
harem
2
harelip
2
hare
38
1
4
3
2

2

4
2
2
hardworking
2
hardwood
38
1
4
3
2

2
o
4
1
2
hardware
38
1
4
3
2

2

4
2
2
hardtop
2
hardtack
38
1
4
3
2

2

4
2
2
hardboiled
2
hardboard
38
1
4
3
2

2
o
4
1
2
hardbake
38
1
4
3
2

2
btwe
4
6
2
hardy
2
hardscrabble
2
Hardin
2
hardhat
2
hardcopy
2
hard
38
1
4
3
2
in
2

4
2
2
harbinger
2
Harbin
38
1
4
3
2

2

4
2
2
harass
2
harangue
38
1
4
3
2

2
abdelmprstv
4
4
2
Harold
2
harness
2
hark
2
Harcourt
38
1
4
3
2
n
2

4
3
2
happened
2
happenstance
2
happen
38
1
4
3
2

2
e
4
1
2
happy
38
1
4
3
2
d
2

4
2
2
haploidy
2
haploid
38
1
4
3
2
o
2
i
4
1
2
haplology
38
1
4
3
2

2
lp
4
3
2
Hapsburg
2
haphazard
2
hap
38
1
4
3
2

2

4
2
2
Hanson
2
hansom
38
1
4
3
2

2

4
2
2
Hansen
2
Hansel
38
1
4
3
2

2
eo
4
1
2
Hans
38
1
4
3
2
er
2

4
2
2
Hanoverian
2
Hanover
38
1
4
3
2

2
v
4
1
2
Hanoi
38
1
4
3
2

2

4
2
2
Hannah
2
Hanna
38
1
4
3
2

2
a
4
1
2
Hannibal
38
1
4
3
2

2

4
2
2
Hanlon
2
Hanley
38
1
4
3
2

2

4
2
2
Hankel
2
hank
38
1
4
3
2

2

4
2
2
hangover
2
hangout
38
1
4
3
2

2

4
2
2
hangmen
2
hangman
38
1
4
3
2

2

4
2
2
hangar
2
hangable
38
1
4
3
2

2
amo
4
1
2
hang
38
1
4
3
2

2

4
2
2
handymen
2
handyman
38
1
4
3
2

2
m
4
1
2
handy
38
1
4
3
2
it
2

4
2
2
handwritten
2
handwrite
38
1
4
3
2

2
r
4
1
2
handwaving
38
1
4
3
2

2

4
6
2
handstand
2
handspike
2
handsome
2
handshake
2
handset
2
hands
38
1
4
3
2
a
2

4
2
2
handmaiden
2
handmade
38
1
4
3
2

2

4
3
2
handlebar
2
handleable
2
handle
38
1
4
3
2

2
e
4
1
2
handline
38
1
4
3
2

2
ar
4
0
38
1
4
3
2
m
2

4
2
2
handicraftsmen
2
handicraftsman
38
1
4
3
2
aft
2
s
4
1
2
handicraft
38
1
4
3
2
p
2
p
4
1
2
handicap
38
1
4
3
2

2

4
2
2
handicapper
2
handicapped
38
1
4
3
2

2
e
4
1
2
handicapping
38
1
4
3
2

2
c
4
1
2
handiwork
38
1
4
3
2

2

4
2
2
handcuff
2
handclasp
38
1
4
3
2

2

4
2
2
handbook
2
handbag
38
1
4
3
2

2
bcilmswy
4
7
2
handout
2
handkerchief
2
handhold
2
handgun
2
handful
2
Handel
2
hand
38
1
4
3
2

2
dgklnos
4
5
2
Hanukkah
2
Hanford
2
Haney
2
Hancock
2
Han
38
1
4
3
2

2

4
3
2
Hampton
2
Hampshire
2
hamper
38
1
4
3
2

2

4
2
2
Hammond
2
hammock
38
1
4
3
2

2
o
4
1
2
hammerhead
38
1
4
3
2

2

4
2
2
Hamlin
2
hamlet
38
1
4
3
2
urg
2

4
2
2
hamburger
2
Hamburg
38
1
4
3
2

2
blmp
4
4
2
hamster
2
Hamilton
2
Hamal
2
ham
38
1
4
3
2

2

4
2
2
Halverson
2
halve
38
1
4
3
2

2
e
4
1
2
halvah
38
1
4
3
2

2

4
2
2
Halstead
2
Halsey
38
1
4
3
2

2

4
3
2
halogen
2
halocarbon
2
halo
38
1
4
3
2
w
2

4
2
2
Halloween
2
hallow
38
1
4
3
2

2

4
2
2
Halley
2
hallelujah
38
1
4
3
2

2
eo
4
4
2
hallway
2
hallucinate
2
hallmark
2
hall
38
1
4
3
2

2

4
4
2
halite
2
Halifax
2
halide
2
halibut
38
1
4
3
2

2

4
4
2
halfway
2
halfhearted
2
halfback
2
half
38
1
4
3
2

2

4
2
2
Haley
2
hale
38
1
4
3
2

2
efilosv
4
5
2
halt
2
Halpern
2
halma
2
halcyon
2
Hal
38
1
4
3
2
i
2

4
2
2
Haitian
2
Haiti
38
1
4
3
2

2

4
5
2
hairy
2
hairpin
2
hairdo
2
haircut
2
hair
38
1
4
3
2
to
2

4
2
2
hailstorm
2
hailstone
38
1
4
3
2

2
s
4
1
2
hail
38
1
4
3
2

2
lrt
4
3
2
Haines
2
haiku
2
Haifa
38
1
4
3
2

2

4
2
2
haggle
2
haggard
38
1
4
3
2

2

4
2
2
Hager
2
Hagen
38
1
4
3
2

2
eg
4
2
2
Hague
2
Hagstrom
38
1
4
3
2

2

4
2
2
hadron
2
Hadrian
38
1
4
3
2

2

4
2
2
haddock
2
Haddad
38
1
4
3
2

2
dr
4
5
2
hadn't
2
Hadley
2
Hades
2
Hadamard
2
had
38
1
4
3
2

2

4
7
2
hacksaw
2
hackney
2
hackmatack
2
hackle
2
Hackett
2
hackberry
2
hack
38
1
4
3
2

2
k
4
1
2
hacienda
38
1
4
3
2
a
2

4
2
2
habituate
2
habitual
38
1
4
3
2

2

4
2
2
habitation
2
habitat
38
1
4
3
2

2
t
4
1
2
habitant
38
1
4
3
2

2
au
4
1
2
habit
38
1
4
3
2

2
t
4
1
2
Habib
38
1
4
3
2

2
r
4
1
2
habeas
38
1
4
3
2

2

4
2
2
Haberman
2
haberdashery
38
1
4
3
2

2
ei
4
0
38
1
4
3
2

2

4
2
2
Haas
2
Haag
38
1
4
3
2

2
abcdgilmnprstuvwyz
4
3
2
Hahn
2
hafnium
2
ha
38
1
4
3
2

2
aeiouy
4
3
2
h's
2
Hrothgar
2
h
38
1
4
3
2

2

4
3
2
gyroscope
2
gyrocompass
2
gyro
38
1
4
3
2

2
o
4
2
2
gyrfalcon
2
gyrate
38
1
4
3
2

2

4
3
2
gypsy
2
gypsum
2
gypsite
38
1
4
3
2

2
s
4
1
2
gyp
38
1
4
3
2

2
n
4
1
2
gym
38
1
4
3
2
s
2
t
4
1
2
gymnasium
38
1
4
3
2

2

4
2
2
gymnastic
2
gymnast
38
1
4
3
2

2
a
4
1
2
gymnosperm
38
1
4
3
2

2
mpr
4
0
38
1
4
3
2

2

4
2
2
Gwyn
2
Gwen
38
1
4
3
2

2

4
2
2
Guyana
2
guy
38
1
4
3
2

2

4
5
2
guttural
2
gutsy
2
Guthrie
2
Gutenberg
2
gut
38
1
4
3
2

2

4
3
2
Gustavus
2
Gustave
2
Gustav
38
1
4
3
2

2
v
4
1
2
Gustafson
38
1
4
3
2

2
a
4
3
2
gusty
2
gusto
2
gust
38
1
4
3
2

2
t
4
3
2
gusset
2
gush
2
Gus
38
1
4
3
2

2

4
3
2
guru
2
Gurkha
2
gurgle
38
1
4
3
2

2

4
2
2
gunsling
2
gunshot
38
1
4
3
2

2

4
2
2
gunpowder
2
gunplay
38
1
4
3
2

2

4
2
2
gunny
2
gunnery
38
1
4
3
2

2

4
2
2
gunmen
2
gunman
38
1
4
3
2

2

4
2
2
gunky
2
gunk
38
1
4
3
2

2

4
2
2
gunfire
2
gunfight
38
1
4
3
2

2
i
4
1
2
gunflint
38
1
4
3
2

2
fkmnps
4
3
2
Gunther
2
Gunderson
2
gun
38
1
4
3
2

2

4
6
2
gumshoe
2
gumption
2
gummy
2
gumdrop
2
gumbo
2
gum
38
1
4
3
2

2

4
5
2
gully
2
gullible
2
gullet
2
Gullah
2
gull
38
1
4
3
2

2
l
4
3
2
gulp
2
gulf
2
gules
38
1
4
3
2

2

4
2
2
guilty
2
guilt
38
1
4
3
2

2

4
2
2
guillotine
2
guillemot
38
1
4
3
2

2

4
3
2
guildsman
2
guildhall
2
guild
38
1
4
3
2

2
dlt
4
2
2
Guilford
2
guile
38
1
4
3
2

2

4
4
2
guidepost
2
guideline
2
guidebook
2
guide
38
1
4
3
2

2
e
4
1
2
guidance
38
1
4
3
2

2
dl
4
5
2
guitar
2
guise
2
guinea
2
guignol
2
Guiana
38
1
4
3
2

2

4
2
2
guesswork
2
guess
38
1
4
3
2

2
s
4
1
2
guest
38
1
4
3
2

2

4
3
2
guerrilla
2
guernsey
2
guerdon
38
1
4
3
2

2
rs
4
2
2
Guenther
2
Guelph
38
1
4
3
2
a
2

4
2
2
guardian
2
Guardia
38
1
4
3
2

2
i
4
2
2
guardhouse
2
guard
38
1
4
3
2
nt
2
e
4
1
2
guaranty
38
1
4
3
2
e
2

4
2
2
guaranteeing
2
guarantee
38
1
4
3
2

2
ad
4
0
38
1
4
3
2

2

4
2
2
guanine
2
guanidine
38
1
4
3
2

2
i
4
1
2
guano
38
1
4
3
2

2
nr
4
2
2
Guatemala
2
Guam
38
1
4
3
2

2
aeilmnrsty
4
5
2
guzzle
2
Guggenheim
2
guffaw
2
gubernatorial
2
GU
38
1
4
3
2

2

4
2
2
Grumman
2
grumble
38
1
4
3
2

2

4
2
2
grubby
2
grub
38
1
4
3
2

2
bm
4
4
2
grunt
2
gruff
2
gruesome
2
grudge
38
1
4
3
2

2

4
2
2
grownup
2
grown
38
1
4
3
2

2
n
4
4
2
growing
2
growth
2
growl
2
grow
38
1
4
3
2
e
2

4
3
2
Grover
2
grovel
2
grove
38
1
4
3
2

2

4
3
2
groups
2
groupoid
2
group
38
1
4
3
2
d
2
s
4
2
2
groundwork
2
ground
38
1
4
3
2

2

4
2
2
groundskeep
2
groundsel
38
1
4
3
2

2
np
4
1
2
grout
38
1
4
3
2

2

4
2
2
Groton
2
grotesque
38
1
4
3
2

2

4
3
2
Grossman
2
Grosset
2
gross
38
1
4
3
2

2
s
4
2
2
Grosvenor
2
grosbeak
38
1
4
3
2

2

4
2
2
groove
2
groom
38
1
4
3
2
er
2

4
2
2
grocery
2
grocer
38
1
4
3
2

2

4
2
2
groat
2
groan
38
1
4
3
2

2
acostuvw
4
4
2
grope
2
grommet
2
groin
2
groggy
38
1
4
3
2
zl
2

4
2
2
grizzly
2
grizzle
38
1
4
3
2

2

4
2
2
gritty
2
grit
38
1
4
3
2

2

4
2
2
gristmill
2
grist
38
1
4
3
2

2
t
4
2
2
Griswold
2
grisly
38
1
4
3
2

2

4
3
2
grippe
2
gripe
2
grip
38
1
4
3
2

2

4
2
2
grindstone
2
grind
38
1
4
3
2

2
d
4
1
2
grin
38
1
4
3
2

2

4
2
2
Grimes
2
grime
38
1
4
3
2

2

4
2
2
Grimaldi
2
grimace
38
1
4
3
2

2
ae
4
2
2
Grimm
2
grim
38
1
4
3
2
l
2

4
3
2
grillwork
2
grille
2
grill
38
1
4
3
2
fi
2

4
2
2
Griffith
2
griffin
38
1
4
3
2

2

4
3
2
grievous
2
grieve
2
grievance
38
1
4
3
2

2
v
4
1
2
grief
38
1
4
3
2

2

4
3
2
gridiron
2
griddle
2
grid
38
1
4
3
2

2
deflmnpstz
4
0
38
1
4
3
2

2

4
3
2
greylag
2
greyhound
2
grey
38
1
4
3
2

2

4
2
2
Gretchen
2
Greta
38
1
4
3
2

2

4
3
2
Grenoble
2
Grendel
2
grenade
38
1
4
3
2

2

4
4
2
Gregory
2
Gregg
2
gregarious
2
Greg
38
1
4
3
2

2

4
3
2
greenwood
2
Greenwich
2
greenware
38
1
4
3
2

2

4
2
2
greensward
2
Greensboro
38
1
4
3
2

2

4
2
2
greenery
2
Greene
38
1
4
3
2

2

4
2
2
Greenberg
2
Greenbelt
38
1
4
3
2

2
e
4
2
2
Greenbriar
2
Greenblatt
38
1
4
3
2

2
besw
4
6
2
Greenland
2
greenish
2
greenhouse
2
greengrocer
2
Greenfield
2
green
38
1
4
3
2

2

4
2
2
greedy
2
greed
38
1
4
3
2

2
dn
4
4
2
greet
2
Greer
2
Greek
2
Greece
38
1
4
3
2

2
st
4
0
38
1
4
3
2

2

4
3
2
greater
2
greatcoat
2
great
38
1
4
3
2

2

4
2
2
greasy
2
grease
38
1
4
3
2

2
aegnty
4
5
2
grew
2
Gresham
2
gremlin
2
Grecian
2
grebe
38
1
4
3
2

2
cdfimnpstvyz
4
2
2
graham
2
grab
38
1
4
3
2

2

4
4
2
graywacke
2
Grayson
2
graybeard
2
gray
38
1
4
3
2

2

4
2
2
gravitate
2
gravid
38
1
4
3
2

2
s
4
4
2
graveyard
2
graven
2
gravel
2
grave
38
1
4
3
2

2

4
2
2
gravestone
2
Graves
38
1
4
3
2

2
ei
4
1
2
gravy
38
1
4
3
2
it
2

4
2
2
gratuity
2
gratuitous
38
1
4
3
2

2

4
3
2
gratitude
2
gratis
2
gratify
38
1
4
3
2

2

4
3
2
grater
2
grateful
2
grate
38
1
4
3
2

2
eiu
4
1
2
grata
38
1
4
3
2

2

4
3
2
grassy
2
grassland
2
grass
38
1
4
3
2

2
s
4
1
2
grasp
38
1
4
3
2

2

4
2
2
graphite
2
graphic
38
1
4
3
2

2
i
4
2
2
grapheme
2
graph
38
1
4
3
2

2

4
3
2
grapevine
2
grapefruit
2
grape
38
1
4
3
2

2
eh
4
1
2
grapple
38
1
4
3
2

2

4
2
2
granulate
2
granular
38
1
4
3
2
l
2
a
4
1
2
granule
38
1
4
3
2

2

4
3
2
grantor
2
grantee
2
grant
38
1
4
3
2
t
2

4
2
2
granitic
2
granite
38
1
4
3
2

2

4
2
2
grandstand
2
grandson
38
1
4
3
2
a
2

4
2
2
grandparent
2
grandpa
38
1
4
3
2

2

4
2
2
grandniece
2
grandnephew
38
1
4
3
2

2

4
2
2
grandmother
2
grandma
38
1
4
3
2

2

4
2
2
grandiose
2
grandiloquent
38
1
4
3
2
hild
2

4
2
2
grandchildren
2
grandchild
38
1
4
3
2

2
cimnps
4
4
2
grandfather
2
grandeur
2
granddaughter
2
grand
38
1
4
3
2

2
ditu
4
4
2
Granville
2
granola
2
granny
2
granary
38
1
4
3
2

2

4
2
2
grammarian
2
grammar
38
1
4
3
2
ma
2
r
4
1
2
grammatic
38
1
4
3
2

2

4
2
2
grainy
2
grain
38
1
4
3
2

2
n
4
1
2
grail
38
1
4
3
2

2

4
2
2
graft
2
Graff
38
1
4
3
2
a
2

4
2
2
graduate
2
gradual
38
1
4
3
2

2
u
4
5
2
Grady
2
gradient
2
grade
2
gradate
2
grad
38
1
4
3
2

2

4
2
2
graceful
2
grace
38
1
4
3
2

2
e
4
2
2
grackle
2
gracious
38
1
4
3
2

2
aeiou
4
1
2
gryphon
38
1
4
3
2
ern
2

4
5
2
government
2
governor
2
governess
2
governance
2
govern
38
1
4
3
2

2

4
2
2
gourmet
2
gourd
38
1
4
3
2

2
r
4
5
2
gout
2
Gould
2
gouge
2
Gouda
2
Goucher
38
1
4
3
2

2

4
2
2
Gottfried
2
gotten
38
1
4
3
2

2

4
2
2
Gothic
2
Gotham
38
1
4
3
2

2
ht
4
1
2
got
38
1
4
3
2

2

4
2
2
gossip
2
gossamer
38
1
4
3
2

2

4
2
2
goshawk
2
gosh
38
1
4
3
2

2
hs
4
2
2
gospel
2
gosling
38
1
4
3
2

2

4
2
2
gorgeous
2
gorge
38
1
4
3
2

2
e
4
1
2
gorgon
38
1
4
3
2

2

4
2
2
Goren
2
gore
38
1
4
3
2

2

4
2
2
Gordon
2
Gordian
38
1
4
3
2

2
deg
4
7
2
gorbachev
2
gory
2
Gorton
2
gorse
2
Gorky
2
gorilla
2
Gorham
38
1
4
3
2

2

4
2
2
gopher
2
GOP
38
1
4
3
2
e
2

4
2
2
gooseberry
2
goose
38
1
4
3
2

2

4
2
2
goofy
2
goof
38
1
4
3
2

2

4
2
2
Goodyear
2
goody
38
1
4
3
2
i
2

4
2
2
Goodwin
2
goodwill
38
1
4
3
2

2
wy
4
5
2
Goodrich
2
Goodman
2
Goode
2
goodbye
2
good
38
1
4
3
2

2
dfs
4
1
2
goober
38
1
4
3
2
ale
2

4
2
2
Gonzalez
2
Gonzales
38
1
4
3
2

2
z
4
3
2
gong
2
gone
2
gondola
38
1
4
3
2

2
efs
4
4
2
Goldwater
2
Goldman
2
Goldberg
2
gold
38
1
4
3
2

2

4
2
2
Goldstine
2
Goldstein
38
1
4
3
2

2
t
4
1
2
goldsmith
38
1
4
3
2
i
2

4
2
2
goldfish
2
goldfinch
38
1
4
3
2
n
2

4
4
2
goldenseal
2
goldenrod
2
goldeneye
2
golden
38
1
4
3
2

2
d
4
4
2
golly
2
Goliath
2
golf
2
Goleta
38
1
4
3
2

2

4
4
2
gogo
2
Gogh
2
goggle
2
gog
38
1
4
3
2

2

4
2
2
Goethe
2
goes
38
1
4
3
2
i
2

4
2
2
godwit
2
Godwin
38
1
4
3
2

2

4
2
2
godson
2
godsend
38
1
4
3
2

2

4
2
2
Godfrey
2
godfather
38
1
4
3
2

2

4
2
2
goddess
2
Goddard
38
1
4
3
2

2
dfsw
4
5
2
godparent
2
godmother
2
godkin
2
godhead
2
god
38
1
4
3
2
le
2

4
2
2
gobbledygook
2
gobble
38
1
4
3
2

2
b
4
2
2
goblet
2
gob
38
1
4
3
2

2

4
4
2
goat
2
goal
2
goad
2
Goa
38
1
4
3
2

2
abdeglnoprstuv
4
4
2
going
2
gown
2
Goff
2
go
38
1
4
3
2

2
o
4
1
2
gnome
38
1
4
3
2
n
2

4
2
2
gnomonic
2
gnomon
38
1
4
3
2

2
m
4
1
2
gnostic
38
1
4
3
2

2

4
4
2
gnaw
2
gnat
2
gnash
2
gnarl
38
1
4
3
2

2
ao
4
3
2
gnu
2
GNP
2
gneiss
38
1
4
3
2

2

4
2
2
GMT
2
GM
38
1
4
3
2

2
eo
4
1
2
glycine
38
1
4
3
2

2

4
2
2
glycol
2
glycogen
38
1
4
3
2
r
2
i
4
1
2
glycerol
38
1
4
3
2

2
n
4
1
2
glyceride
38
1
4
3
2

2

4
3
2
glycerine
2
glycerinate
2
glycerin
38
1
4
3
2

2
c
4
1
2
glyph
38
1
4
3
2

2

4
2
2
glutamic
2
glutamine
38
1
4
3
2
m
2
i
4
1
2
glutamate
38
1
4
3
2

2
a
4
3
2
glutton
2
glutinous
2
glut
38
1
4
3
2

2

4
2
2
gluey
2
glue
38
1
4
3
2

2
et
4
2
2
glum
2
glucose
38
1
4
3
2
t
2

4
2
2
glottis
2
glottal
38
1
4
3
2
s
2

4
4
2
glossy
2
glossolalia
2
glossary
2
gloss
38
1
4
3
2

2
a
4
2
2
glorious
2
glorify
38
1
4
3
2

2

4
2
2
Gloriana
2
Gloria
38
1
4
3
2

2
i
4
1
2
glory
38
1
4
3
2
m
2

4
2
2
gloomy
2
gloom
38
1
4
3
2

2

4
2
2
glomerular
2
glom
38
1
4
3
2
l
2

4
3
2
globulin
2
globule
2
globular
38
1
4
3
2

2
u
4
3
2
globe
2
global
2
glob
38
1
4
3
2

2
bmorst
4
4
2
glow
2
glove
2
Gloucester
2
gloat
38
1
4
3
2

2

4
2
2
glitter
2
glitch
38
1
4
3
2

2

4
2
2
glisten
2
glissade
38
1
4
3
2

2

4
2
2
glimpse
2
glimmer
38
1
4
3
2

2

4
2
2
glide
2
Glidden
38
1
4
3
2

2
dmst
4
2
2
glint
2
glib
38
1
4
3
2
a
2

4
2
2
Glendale
2
Glenda
38
1
4
3
2

2
d
4
2
2
Glenn
2
glen
38
1
4
3
2

2

4
2
2
gleeful
2
glee
38
1
4
3
2

2

4
3
2
Gleason
2
glean
2
gleam
38
1
4
3
2

2
aen
4
0
38
1
4
3
2

2
cdmnsu
4
2
2
glaze
2
glare
38
1
4
3
2
co
2

4
2
2
glaucous
2
glaucoma
38
1
4
3
2

2

4
2
2
glasswort
2
glassware
38
1
4
3
2

2
w
4
3
2
glassy
2
glassine
2
glass
38
1
4
3
2

2
s
4
3
2
glasnost
2
Glaswegian
2
Glasgow
38
1
4
3
2

2

4
2
2
glandular
2
gland
38
1
4
3
2

2
d
4
2
2
glans
2
glance
38
1
4
3
2

2

4
2
2
glamorous
2
glamor
38
1
4
3
2
o
2
r
4
1
2
glamour
38
1
4
3
2

2

4
2
2
gladiolus
2
gladiator
38
1
4
3
2

2

4
2
2
gladdy
2
gladden
38
1
4
3
2

2
di
4
4
2
Gladys
2
Gladstone
2
glade
2
glad
38
1
4
3
2
i
2
a
4
2
2
glacis
2
glacier
38
1
4
3
2

2

4
2
2
glaciate
2
glacial
38
1
4
3
2

2
aeiouy
4
0
38
1
4
3
2

2
e
4
1
2
giving
38
1
4
3
2

2

4
2
2
Giuseppe
2
Giuliano
38
1
4
3
2

2

4
2
2
girlish
2
girlie
38
1
4
3
2

2
i
4
1
2
girl
38
1
4
3
2

2

4
2
2
girdle
2
gird
38
1
4
3
2

2
dl
4
2
2
girth
2
giraffe
38
1
4
3
2

2

4
2
2
Ginsburg
2
Ginsberg
38
1
4
3
2

2
b
4
1
2
ginseng
38
1
4
3
2

2

4
3
2
gingko
2
gingham
2
ginger
38
1
4
3
2

2
gs
4
6
2
Gino
2
Ginn
2
ginmill
2
ginkgo
2
Gina
2
gin
38
1
4
3
2

2

4
2
2
Gimbel
2
gimbal
38
1
4
3
2

2
b
4
1
2
gimpy
38
1
4
3
2

2

4
2
2
Gillette
2
Gillespie
38
1
4
3
2

2
e
4
2
2
Gilligan
2
gill
38
1
4
3
2

2

4
2
2
Giles
2
Gilead
38
1
4
3
2
ert
2

4
2
2
Gilbertson
2
gilbert
38
1
4
3
2

2
bel
4
6
2
gilt
2
Gilmore
2
gild
2
Gilchrist
2
gila
2
Gil
38
1
4
3
2

2

4
2
2
giggle
2
gigging
38
1
4
3
2

2

4
5
2
gigawatt
2
gigavolt
2
gigantic
2
gigahertz
2
gigacycle
38
1
4
3
2

2
ag
4
1
2
gig
38
1
4
3
2

2

4
2
2
gift
2
Gifford
38
1
4
3
2

2

4
2
2
giddy
2
giddap
38
1
4
3
2

2
d
4
1
2
Gideon
38
1
4
3
2

2
eo
4
2
2
gibby
2
Gibbs
38
1
4
3
2

2

4
2
2
gibbous
2
gibbon
38
1
4
3
2

2

4
2
2
gibbet
2
gibberish
38
1
4
3
2

2
b
4
4
2
Gibson
2
Gibraltar
2
giblet
2
gibe
38
1
4
3
2

2
n
4
1
2
Giacomo
38
1
4
3
2
t
2

4
2
2
giantess
2
giant
38
1
4
3
2

2
abdfglmnruv
4
2
2
gist
2
Giovanni
38
1
4
3
2
l
2

4
2
2
ghoulish
2
ghoul
38
1
4
3
2

2
u
4
1
2
ghost
38
1
4
3
2

2

4
3
2
ghetto
2
gherkin
2
Ghent
38
1
4
3
2

2

4
2
2
ghastly
2
Ghana
38
1
4
3
2

2
aeo
4
0
38
1
4
3
2

2
y
4
1
2
getting
38
1
4
3
2

2
t
4
3
2
gets
2
getaway
2
get
38
1
4
3
2

2

4
2
2
Gestapo
2
gestalt
38
1
4
3
2
t
2
a
4
2
2
gesture
2
gesticulate
38
1
4
3
2

2

4
2
2
gerundive
2
gerundial
38
1
4
3
2
nd
2
i
4
1
2
gerund
38
1
4
3
2
a
2

4
2
2
germinate
2
germinal
38
1
4
3
2
id
2

4
2
2
germicide
2
germicidal
38
1
4
3
2

2
cn
4
0
38
1
4
3
2

2

4
2
2
germanium
2
Germanic
38
1
4
3
2
n
2
i
4
4
2
Germany
2
Germantown
2
germane
2
German
38
1
4
3
2

2
ai
4
1
2
germ
38
1
4
3
2
ard
2

4
2
2
Gerhardt
2
Gerhard
38
1
4
3
2

2

4
2
2
gerbil
2
Gerber
38
1
4
3
2

2
l
4
2
2
Gerard
2
geranium
38
1
4
3
2
d
2

4
2
2
Geraldine
2
Gerald
38
1
4
3
2

2
abhmu
4
4
2
Gertrude
2
Gershwin
2
Gerry
2
geriatric
38
1
4
3
2

2

4
2
2
Georgetown
2
George
38
1
4
3
2
g
2
e
4
1
2
Georgia
38
1
4
3
2
ysic
2

4
2
2
geophysics
2
geophysical
38
1
4
3
2

2
h
4
1
2
geopolitic
38
1
4
3
2
et
2

4
2
2
geometrician
2
geometer
38
1
4
3
2
raph
2

4
2
2
geography
2
geographer
38
1
4
3
2

2
s
4
1
2
geodetic
38
1
4
3
2

2

4
2
2
geodesy
2
geodesic
38
1
4
3
2

2
e
4
1
2
geoduck
38
1
4
3
2

2
h
4
1
2
geocentric
38
1
4
3
2
mi
2

4
2
2
geochemistry
2
geochemical
38
1
4
3
2

2
e
4
1
2
geochronology
38
1
4
3
2

2
cdgmpr
4
2
2
geology
2
Geoffrey
38
1
4
3
2

2

4
2
2
genus
2
genuine
38
1
4
3
2

2

4
2
2
gentlemen
2
gentleman
38
1
4
3
2
e
2
m
4
1
2
gentle
38
1
4
3
2

2

4
2
2
gentility
2
gentile
38
1
4
3
2

2
l
4
1
2
gentian
38
1
4
3
2

2
il
4
3
2
gentry
2
genteel
2
gent
38
1
4
3
2

2

4
2
2
genotype
2
Genoa
38
1
4
3
2

2

4
2
2
genitive
2
genital
38
1
4
3
2

2
t
4
4
2
genius
2
genii
2
genie
2
genial
38
1
4
3
2

2

4
2
2
Genevieve
2
Geneva
38
1
4
3
2

2

4
2
2
genesis
2
Genesco
38
1
4
3
2

2

4
2
2
generous
2
generosity
38
1
4
3
2

2
lt
4
1
2
genera
38
1
4
3
2

2
ao
4
1
2
generic
38
1
4
3
2

2
rsv
4
3
2
genetic
2
genealogy
2
gene
38
1
4
3
2

2
eiotu
4
2
2
genre
2
gender
38
1
4
3
2
n
2

4
2
2
Gemini
2
geminate
38
1
4
3
2

2
i
4
3
2
gemstone
2
Gemma
2
gem
38
1
4
3
2
in
2

4
3
2
gelatinous
2
gelatine
2
gelatin
38
1
4
3
2

2
t
4
1
2
gelable
38
1
4
3
2

2
a
4
2
2
geld
2
gel
38
1
4
3
2

2

4
2
2
Geigy
2
Geiger
38
1
4
3
2

2
g
4
1
2
geisha
38
1
4
3
2

2

4
2
2
geese
2
gee
38
1
4
3
2

2
eilmnorst
4
5
2
geyser
2
Gegenschein
2
gecko
2
gear
2
GE
38
1
4
3
2
e
2

4
3
2
gazette
2
gazelle
2
gaze
38
1
4
3
2

2

4
2
2
Gaylord
2
gay
38
1
4
3
2
k
2

4
2
2
gawky
2
gawk
38
1
4
3
2

2

4
2
2
gavel
2
gave
38
1
4
3
2

2
e
4
2
2
gavotte
2
Gavin
38
1
4
3
2
s
2

4
2
2
Gaussian
2
gauss
38
1
4
3
2
t
2

4
2
2
gauntlet
2
gaunt
38
1
4
3
2

2

4
3
2
Gaulle
2
gauleiter
2
Gaul
38
1
4
3
2

2

4
2
2
gaugeable
2
gauge
38
1
4
3
2

2
e
4
1
2
Gauguin
38
1
4
3
2
he
2

4
2
2
gaucherie
2
gauche
38
1
4
3
2

2
cglns
4
3
2
gauze
2
gaur
2
gaudy
38
1
4
3
2

2

4
3
2
gateway
2
Gates
2
gate
38
1
4
3
2

2
e
4
3
2
gator
2
Gatlinburg
2
gather
38
1
4
3
2
om
2

4
2
2
gastronomy
2
gastronome
38
1
4
3
2
o
2
n
4
1
2
gastrointestinal
38
1
4
3
2

2
r
4
1
2
Gaston
38
1
4
3
2

2

4
2
2
Gaspee
2
gasp
38
1
4
3
2

2
pt
4
9
2
gassy
2
gasoline
2
gaslight
2
gasket
2
gasify
2
gash
2
gaseous
2
Gascony
2
gas
38
1
4
3
2

2

4
2
2
Garth
2
garter
38
1
4
3
2
son
2

4
2
2
Garrisonian
2
garrison
38
1
4
3
2

2
i
4
3
2
Garry
2
garrulous
2
Garrett
38
1
4
3
2
e
2

4
2
2
garnet
2
garner
38
1
4
3
2

2

4
2
2
garlic
2
garland
38
1
4
3
2

2

4
2
2
garish
2
Garibaldi
38
1
4
3
2

2

4
2
2
gargle
2
gargantuan
38
1
4
3
2
n
2

4
2
2
gardenia
2
garden
38
1
4
3
2

2
e
4
1
2
Gardner
38
1
4
3
2

2

4
3
2
garble
2
garbage
2
garb
38
1
4
3
2

2
bdgilnrt
4
6
2
Gary
2
Garvey
2
Garfield
2
Garcia
2
garage
2
gar
38
1
4
3
2

2

4
2
2
gape
2
gap
38
1
4
3
2

2

4
2
2
gantry
2
gantlet
38
1
4
3
2
et
2

4
2
2
Gannett
2
gannet
38
1
4
3
2

2

4
2
2
ganglion
2
gangling
38
1
4
3
2

2
i
4
1
2
gangland
38
1
4
3
2

2
l
4
5
2
gangway
2
gangster
2
gangplank
2
Ganges
2
gang
38
1
4
3
2

2
gnt
4
2
2
Ganymede
2
gander
38
1
4
3
2

2

4
3
2
games
2
gamecock
2
game
38
1
4
3
2

2

4
2
2
gambit
2
Gambia
38
1
4
3
2

2
i
4
2
2
gambol
2
gamble
38
1
4
3
2

2
be
4
4
2
gamut
2
gamma
2
gamin
2
gam
38
1
4
3
2
n
2
i
4
1
2
galvanometer
38
1
4
3
2

2

4
2
2
galvanism
2
galvanic
38
1
4
3
2

2
a
4
1
2
Galveston
38
1
4
3
2

2

4
2
2
gallus
2
Gallup
38
1
4
3
2

2

4
2
2
gallows
2
Galloway
38
1
4
3
2

2

4
2
2
gallonage
2
gallon
38
1
4
3
2

2
nw
4
1
2
gallop
38
1
4
3
2

2

4
3
2
gallivant
2
gallium
2
gallinule
38
1
4
3
2

2

4
2
2
galley
2
gallery
38
1
4
3
2
t
2

4
2
2
gallantry
2
gallant
38
1
4
3
2

2
n
4
1
2
Gallagher
38
1
4
3
2

2
aeiou
4
3
2
gallstone
2
gallberry
2
gall
38
1
4
3
2

2

4
3
2
galenite
2
galena
2
Galen
38
1
4
3
2

2
n
4
1
2
gale
38
1
4
3
2

2

4
2
2
Galatia
2
Galatea
38
1
4
3
2
t
2

4
2
2
galactose
2
galactic
38
1
4
3
2

2
ct
4
3
2
galaxy
2
Galapagos
2
gala
38
1
4
3
2

2
aelv
4
6
2
Galway
2
Galt
2
Galois
2
Galilee
2
Galbreath
2
gal
38
1
4
3
2

2

4
2
2
Gaithersburg
2
gait
38
1
4
3
2
s
2

4
2
2
Gainesville
2
Gaines
38
1
4
3
2

2
e
4
2
2
gainful
2
gain
38
1
4
3
2

2

4
2
2
gaillardia
2
Gail
38
1
4
3
2

2
lnt
4
1
2
gaiety
38
1
4
3
2

2

4
2
2
gaggle
2
gagging
38
1
4
3
2

2
g
4
3
2
gagwriter
2
gage
2
gag
38
1
4
3
2
f
2

4
2
2
gaffe
2
gaff
38
1
4
3
2
et
2

4
2
2
gadgetry
2
gadget
38
1
4
3
2

2
g
4
4
2
gadwall
2
gadolinium
2
gadfly
2
gad
38
1
4
3
2
iel
2

4
2
2
Gabrielle
2
Gabriel
38
1
4
3
2

2

4
2
2
gabbro
2
gabble
38
1
4
3
2

2
br
4
5
2
Gabon
2
gable
2
Gaberones
2
gabardine
2
gab
38
1
4
3
2

2
bdfgilmnprstuvwyz
4
3
2
GAO
2
Gaelic
2
GA
38
1
4
3
2

2
aehilMnoruwy
4
4
2
GSA
2
g's
2
GPO
2
g
38
1
4
3
2
z
2

4
2
2
fuzzy
2
fuzz
38
1
4
3
2

2

4
2
2
future
2
futile
38
1
4
3
2

2

4
2
2
fussy
2
fuss
38
1
4
3
2

2

4
4
2
fusion
2
fusillade
2
fusiform
2
fusible
38
1
4
3
2

2

4
2
2
fuselage
2
fuse
38
1
4
3
2

2
eis
4
1
2
fusty
38
1
4
3
2
e
2
r
4
1
2
furthest
38
1
4
3
2

2
m
4
1
2
further
38
1
4
3
2
o
2

4
2
2
furthermost
2
furthermore
38
1
4
3
2

2
h
4
1
2
furtive
38
1
4
3
2

2

4
3
2
furry
2
furrow
2
furrier
38
1
4
3
2

2

4
2
2
furniture
2
furnish
38
1
4
3
2

2
i
4
1
2
furnace
38
1
4
3
2

2

4
2
2
furlough
2
furlong
38
1
4
3
2

2
o
4
1
2
furl
38
1
4
3
2

2
lnrt
4
6
2
furze
2
fury
2
Furman
2
furious
2
furbish
2
fur
38
1
4
3
2

2

4
2
2
funny
2
funnel
38
1
4
3
2

2

4
3
2
fungicide
2
fungible
2
fungi
38
1
4
3
2

2
i
4
3
2
fungus
2
fungoid
2
fungal
38
1
4
3
2
r
2

4
2
2
funereal
2
funeral
38
1
4
3
2

2

4
3
2
funds
2
fundamental
2
fund
38
1
4
3
2
r
2

4
2
2
functorial
2
functor
38
1
4
3
2
on
2
a
4
2
2
functions
2
function
38
1
4
3
2
t
2
io
4
0
38
1
4
3
2

2
cdegn
4
2
2
funk
2
fun
38
1
4
3
2
ga
2

4
2
2
fumigate
2
fumigant
38
1
4
3
2

2
i
4
3
2
fume
2
fumble
2
fum
38
1
4
3
2

2

4
4
2
fully
2
Fullerton
2
fullback
2
full
38
1
4
3
2

2
l
4
5
2
Fulton
2
fulsome
2
fulminate
2
fulfill
2
fulcrum
38
1
4
3
2
i
2

4
2
2
Fujitsu
2
Fuji
38
1
4
3
2

2

4
3
2
fugue
2
fugitive
2
fugal
38
1
4
3
2

2
hk
4
0
38
1
4
3
2

2
cgjlmnrstz
4
2
2
fuel
2
fudge
38
1
4
3
2

2

4
2
2
FTC
2
Ft
38
1
4
3
2

2

4
2
2
Frye
2
fry
38
1
4
3
2
ate
2

4
2
2
frustrater
2
frustrate
38
1
4
3
2
t
2
r
4
1
2
frustum
38
1
4
3
2
t
2

4
3
2
fruition
2
fruitful
2
fruit
38
1
4
3
2

2
is
4
3
2
frugal
2
Fruehauf
2
fructose
38
1
4
3
2
e
2

4
2
2
frozen
2
froze
38
1
4
3
2

2

4
2
2
frowzy
2
frown
38
1
4
3
2
h
2

4
2
2
frothy
2
froth
38
1
4
3
2
it
2

4
2
2
frostbitten
2
frostbite
38
1
4
3
2
t
2
b
4
2
2
frosty
2
frost
38
1
4
3
2
m
2

4
2
2
frontiersmen
2
frontiersman
38
1
4
3
2
er
2
s
4
1
2
frontier
38
1
4
3
2

2

4
2
2
frontal
2
frontage
38
1
4
3
2
t
2
ai
4
1
2
front
38
1
4
3
2

2
nstwz
4
5
2
from
2
frolic
2
frog
2
frock
2
fro
38
1
4
3
2
ol
2

4
2
2
frivolous
2
frivolity
38
1
4
3
2

2

4
3
2
Fritz
2
fritter
2
fritillary
38
1
4
3
2
l
2

4
2
2
frilly
2
frill
38
1
4
3
2
d
2

4
2
2
Frigidaire
2
frigid
38
1
4
3
2
t
2

4
3
2
frightful
2
frighten
2
fright
38
1
4
3
2

2
hi
4
2
2
Frigga
2
frigate
38
1
4
3
2

2

4
2
2
Friedrich
2
Friedman
38
1
4
3
2

2
dn
4
1
2
frieze
38
1
4
3
2

2

4
3
2
friction
2
Frick
2
fricative
38
1
4
3
2

2

4
2
2
friar
2
friable
38
1
4
3
2

2
acegltvsd
4
2
2
frizzle
2
fringe
38
1
4
3
2

2

4
2
2
Freya
2
Frey
38
1
4
3
2
d
2

4
2
2
Freudian
2
Freud
38
1
4
3
2

2

4
2
2
Fresno
2
Fresnel
38
1
4
3
2

2

4
2
2
freshmen
2
freshman
38
1
4
3
2

2
m
4
3
2
freshwater
2
freshen
2
fresh
38
1
4
3
2
o
2

4
2
2
frescoes
2
fresco
38
1
4
3
2

2
chn
4
0
38
1
4
3
2
h
2
m
4
1
2
French
38
1
4
3
2

2

4
2
2
Frenchmen
2
Frenchman
38
1
4
3
2

2
c
4
2
2
frenzy
2
frenetic
38
1
4
3
2

2

4
2
2
freewheel
2
freeway
38
1
4
3
2

2

4
2
2
Freetown
2
freethink
38
1
4
3
2

2

4
2
2
freemen
2
freeman
38
1
4
3
2

2

4
2
2
freehold
2
freehand
38
1
4
3
2

2

4
2
2
freedmen
2
Freedman
38
1
4
3
2

2
m
4
1
2
freedom
38
1
4
3
2

2
dhmtw
4
6
2
freeze
2
freestone
2
Freeport
2
freeing
2
freeboot
2
free
38
1
4
3
2

2

4
2
2
Fredericksburg
2
Frederick
38
1
4
3
2
ric
2
k
4
2
2
Fredericton
2
Frederic
38
1
4
3
2

2

4
2
2
Freddy
2
Freddie
38
1
4
3
2

2
de
4
3
2
Fredrickson
2
Fredholm
2
Fred
38
1
4
3
2
k
2

4
2
2
freakish
2
freak
38
1
4
3
2

2
adensuy
4
5
2
fret
2
frequent
2
freon
2
freight
2
freckle
38
1
4
3
2

2
cgimntuz
4
2
2
fray
2
Fraser
38
1
4
3
2

2

4
2
2
frazzle
2
Frazier
38
1
4
3
2

2

4
2
2
fraudulent
2
fraud
38
1
4
3
2

2
d
4
2
2
fraught
2
Frau
38
1
4
3
2
ern
2

4
2
2
fraternity
2
fraternal
38
1
4
3
2
rt
2

4
2
2
frankfurter
2
Frankfurt
38
1
4
3
2

2
u
4
1
2
Frankfort
38
1
4
3
2

2
f
4
3
2
franklin
2
Frankel
2
frank
38
1
4
3
2

2

4
2
2
Francoise
2
franco
38
1
4
3
2

2

4
2
2
Francisco
2
Franciscan
38
1
4
3
2

2
c
4
1
2
Francis
38
1
4
3
2

2
s
4
2
2
francium
2
Francine
38
1
4
3
2

2

4
2
2
Frances
2
France
38
1
4
3
2

2
eio
4
3
2
franchise
2
franca
2
franc
38
1
4
3
2

2
ck
4
4
2
Franz
2
frantic
2
frangipani
2
Fran
38
1
4
3
2

2

4
2
2
framework
2
frame
38
1
4
3
2

2
e
4
1
2
frambesia
38
1
4
3
2
l
2

4
2
2
frailty
2
frail
38
1
4
3
2

2

4
2
2
fragmentation
2
fragmentary
38
1
4
3
2
ent
2
a
4
1
2
fragment
38
1
4
3
2

2
m
4
2
2
fragrant
2
fragile
38
1
4
3
2
t
2
i
4
1
2
fracture
38
1
4
3
2
o
2
n
4
1
2
fractious
38
1
4
3
2

2

4
2
2
fractionate
2
fraction
38
1
4
3
2

2
aeiouy
4
0
38
1
4
3
2

2

4
2
2
foxhound
2
foxhole
38
1
4
3
2

2
o
4
1
2
Foxhall
38
1
4
3
2

2
h
4
4
2
foxy
2
foxtail
2
foxglove
2
fox
38
1
4
3
2
en
2

4
2
2
fourteenth
2
fourteen
38
1
4
3
2

2
e
4
1
2
fourth
38
1
4
3
2

2

4
2
2
foursquare
2
foursome
38
1
4
3
2

2
st
4
3
2
Fourier
2
fourfold
2
four
38
1
4
3
2
in
2

4
2
2
fountainhead
2
fountain
38
1
4
3
2

2
a
4
1
2
fount
38
1
4
3
2

2

4
4
2
foundry
2
foundling
2
foundation
2
found
38
1
4
3
2

2
dt
4
0
38
1
4
3
2

2

4
2
2
foulmouth
2
foul
38
1
4
3
2

2
lnr
4
1
2
fought
38
1
4
3
2
er
2

4
2
2
fosterite
2
foster
38
1
4
3
2

2
i
4
1
2
Foss
38
1
4
3
2
l
2

4
2
2
fossiliferous
2
fossil
38
1
4
3
2

2
st
4
0
38
1
4
3
2

2

4
2
2
fortune
2
fortunate
38
1
4
3
2

2
n
4
1
2
fortuitous
38
1
4
3
2

2

4
2
2
fortress
2
fortran
38
1
4
3
2

2

4
5
2
fortitude
2
fortiori
2
fortin
2
fortify
2
fortieth
38
1
4
3
2

2

4
4
2
forthwith
2
forthright
2
forthcome
2
forth
38
1
4
3
2

2

4
2
2
Fortescue
2
forte
38
1
4
3
2

2
ehiru
4
3
2
forty
2
fortnight
2
fort
38
1
4
3
2
ke
2

4
2
2
forsaken
2
forsake
38
1
4
3
2

2
a
4
3
2
Forsythe
2
forswear
2
forsook
38
1
4
3
2
la
2

4
4
2
formulate
2
formulaic
2
formulae
2
formula
38
1
4
3
2

2

4
2
2
Formica
2
formic
38
1
4
3
2

2
c
4
1
2
formidable
38
1
4
3
2

2

4
2
2
formatting
2
formatted
38
1
4
3
2

2
t
4
2
2
formate
2
format
38
1
4
3
2

2

4
2
2
formaldehyde
2
formal
38
1
4
3
2

2
lt
4
1
2
formant
38
1
4
3
2

2
aiue
4
3
2
forms
2
Formosa
2
form
38
1
4
3
2

2

4
2
2
forklift
2
fork
38
1
4
3
2
t
2

4
2
2
forgotten
2
forgot
38
1
4
3
2
ve
2

4
2
2
forgiven
2
forgive
38
1
4
3
2

2

4
2
2
forgetting
2
forgettable
38
1
4
3
2

2
t
4
2
2
forgetful
2
forget
38
1
4
3
2

2
t
4
2
2
forgery
2
forge
38
1
4
3
2

2
eio
4
1
2
forgave
38
1
4
3
2
t
2

4
2
2
forfeiture
2
forfeit
38
1
4
3
2
e
2
i
4
1
2
forfend
38
1
4
3
2
t
2

4
2
2
forestry
2
forest
38
1
4
3
2

2
s
4
4
2
forever
2
forensic
2
foreign
2
fore
38
1
4
3
2

2

4
2
2
Fordham
2
ford
38
1
4
3
2

2

4
3
2
forces
2
forceful
2
force
38
1
4
3
2

2
e
4
1
2
forcible
38
1
4
3
2
r
2

4
2
2
forborne
2
forbore
38
1
4
3
2

2

4
2
2
forbidding
2
forbidden
38
1
4
3
2
d
2
d
4
1
2
forbid
38
1
4
3
2
r
2

4
2
2
forbearance
2
forbear
38
1
4
3
2

2
a
4
1
2
Forbes
38
1
4
3
2

2
eio
4
1
2
forbade
38
1
4
3
2

2

4
2
2
foray
2
forage
38
1
4
3
2

2
abcdefgkmst
4
4
2
forward
2
forum
2
forlorn
2
for
38
1
4
3
2

2

4
2
2
foppish
2
fop
38
1
4
3
2

2

4
2
2
footwork
2
footwear
38
1
4
3
2
t
2

4
2
2
footstool
2
footstep
38
1
4
3
2

2

4
2
2
footpath
2
footpad
38
1
4
3
2

2
a
4
1
2
footprint
38
1
4
3
2

2

4
2
2
footmen
2
footman
38
1
4
3
2

2

4
2
2
footbridge
2
football
38
1
4
3
2

2
bmpswe
4
5
2
footnote
2
foothill
2
footfall
2
footage
2
foot
38
1
4
3
2

2

4
5
2
fooled
2
foolproof
2
foolish
2
foolhardy
2
fool
38
1
4
3
2

2

4
2
2
foodstuff
2
food
38
1
4
3
2

2
dlt
4
0
38
1
4
3
2
ine
2

4
2
2
Fontainebleau
2
Fontaine
38
1
4
3
2

2
a
4
1
2
font
38
1
4
3
2

2

4
2
2
fondle
2
fond
38
1
4
3
2

2
dt
4
0
38
1
4
3
2
w
2
e
4
2
2
following
2
follow
38
1
4
3
2
c
2

4
2
2
follicular
2
follicle
38
1
4
3
2

2
io
4
1
2
folly
38
1
4
3
2

2

4
2
2
folksy
2
folksong
38
1
4
3
2

2
s
4
2
2
folklore
2
folk
38
1
4
3
2

2

4
2
2
foliate
2
foliage
38
1
4
3
2

2
a
4
1
2
folio
38
1
4
3
2

2

4
2
2
foldout
2
fold
38
1
4
3
2

2
dikl
4
1
2
Foley
38
1
4
3
2

2

4
3
2
foist
2
foil
2
foible
38
1
4
3
2

2

4
2
2
foggy
2
fogging
38
1
4
3
2

2
g
4
3
2
fogy
2
Fogarty
2
fog
38
1
4
3
2
s
2

4
2
2
focussed
2
focus
38
1
4
3
2

2
u
4
2
2
foci
2
focal
38
1
4
3
2

2
m
4
1
2
foal
38
1
4
3
2

2

4
3
2
foamy
2
foamflower
2
foam
38
1
4
3
2

2
acgilnoprsux
4
7
2
foyer
2
fowl
2
fovea
2
Fomalhaut
2
foe
2
fodder
2
fob
38
1
4
3
2

2

4
2
2
FMC
2
FM
38
1
4
3
2

2

4
5
2
flyway
2
Flynn
2
flyer
2
flycatcher
2
fly
38
1
4
3
2

2

4
2
2
flutter
2
flute
38
1
4
3
2

2

4
2
2
fluster
2
flush
38
1
4
3
2

2

4
2
2
fluoride
2
fluoridate
38
1
4
3
2

2
d
4
2
2
fluorite
2
fluorine
38
1
4
3
2
sce
2

4
3
2
fluorescent
2
fluorescein
2
fluoresce
38
1
4
3
2
r
2
ei
4
2
2
fluorspar
2
fluorocarbon
38
1
4
3
2
f
2

4
2
2
fluffy
2
fluff
38
1
4
3
2

2

4
2
2
fluent
2
flue
38
1
4
3
2

2
efost
4
8
2
flux
2
flurry
2
flung
2
fluke
2
fluid
2
fluctuate
2
flub
2
flu
38
1
4
3
2
r
2

4
2
2
flowery
2
flowerpot
38
1
4
3
2

2
e
4
3
2
flown
2
flowchart
2
flow
38
1
4
3
2

2

4
3
2
floury
2
flourish
2
flour
38
1
4
3
2

2

4
2
2
flounder
2
flounce
38
1
4
3
2

2
nr
4
1
2
flout
38
1
4
3
2

2

4
2
2
flotilla
2
flotation
38
1
4
3
2

2

4
3
2
Floridian
2
Florida
2
florid
38
1
4
3
2

2
d
4
3
2
florist
2
florin
2
florican
38
1
4
3
2
n
2

4
2
2
Florentine
2
Florence
38
1
4
3
2

2

4
2
2
floral
2
flora
38
1
4
3
2

2
aei
4
0
38
1
4
3
2

2

4
2
2
floppy
2
flop
38
1
4
3
2

2

4
2
2
floorboard
2
floor
38
1
4
3
2

2
l
4
2
2
floodgate
2
flood
38
1
4
3
2
i
2

4
2
2
floodlit
2
floodlight
38
1
4
3
2

2
dr
4
0
38
1
4
3
2

2

4
2
2
flogging
2
flog
38
1
4
3
2

2

4
3
2
flock
2
flocculate
2
floc
38
1
4
3
2

2
cgoprtuw
4
4
2
Floyd
2
floe
2
float
2
Flo
38
1
4
3
2
tio
2

4
2
2
flirtatious
2
flirtation
38
1
4
3
2
t
2
a
4
1
2
flirt
38
1
4
3
2

2

4
3
2
flippant
2
flipflop
2
flip
38
1
4
3
2

2

4
3
2
flinty
2
flintlock
2
flint
38
1
4
3
2

2
t
4
2
2
fling
2
flinch
38
1
4
3
2

2
nprc
4
3
2
flit
2
flimsy
2
flight
38
1
4
3
2
r
2

4
2
2
flexure
2
flexural
38
1
4
3
2

2
u
4
2
2
flexible
2
flex
38
1
4
3
2
ch
2

4
2
2
Fletcher
2
fletch
38
1
4
3
2
h
2

4
2
2
fleshy
2
flesh
38
1
4
3
2
i
2

4
2
2
flemish
2
Fleming
38
1
4
3
2

2

4
4
2
fleet
2
fleeing
2
fleece
2
flee
38
1
4
3
2

2

4
2
2
fledgling
2
fledge
38
1
4
3
2

2
g
4
1
2
fled
38
1
4
3
2

2

4
3
2
fleawort
2
fleabane
2
flea
38
1
4
3
2

2
ademstx
4
2
2
flew
2
fleck
38
1
4
3
2

2

4
3
2
flaxseed
2
flaxen
2
flax
38
1
4
3
2

2

4
2
2
flautist
2
flaunt
38
1
4
3
2

2

4
2
2
flatus
2
flatulent
38
1
4
3
2
e
2

4
2
2
flattery
2
flatten
38
1
4
3
2

2
tu
4
6
2
flatworm
2
flatland
2
flatiron
2
flathead
2
flatbed
2
flat
38
1
4
3
2

2

4
4
2
flashy
2
flashlight
2
flashback
2
flash
38
1
4
3
2

2
h
4
1
2
flask
38
1
4
3
2

2

4
5
2
flannel
2
flank
2
flange
2
Flanders
2
Flanagan
38
1
4
3
2

2

4
5
2
flammable
2
flamingo
2
flame
2
flamboyant
2
flam
38
1
4
3
2

2

4
3
2
flaky
2
flake
2
flak
38
1
4
3
2

2

4
2
2
flair
2
flail
38
1
4
3
2
t
2

4
2
2
flagstone
2
Flagstaff
38
1
4
3
2

2

4
2
2
flageolet
2
flagellate
38
1
4
3
2

2
es
4
5
2
flagrant
2
flagpole
2
Flagler
2
flagging
2
flag
38
1
4
3
2

2
gikmnstux
4
5
2
flaw
2
flare
2
flap
2
flack
2
flabbergast
38
1
4
3
2

2
aeiouy
4
1
2
FL
38
1
4
3
2

2

4
2
2
fizzle
2
Fizeau
38
1
4
3
2

2

4
4
2
fixed
2
fixture
2
fixate
2
fix
38
1
4
3
2
e
2

4
2
2
fivefold
2
five
38
1
4
3
2

2

4
3
2
Fitzroy
2
Fitzpatrick
2
Fitzgerald
38
1
4
3
2
h
2

4
2
2
Fitchburg
2
Fitch
38
1
4
3
2

2
cz
4
2
2
fitful
2
fit
38
1
4
3
2

2

4
2
2
fisticuff
2
fist
38
1
4
3
2

2

4
2
2
fission
2
fissile
38
1
4
3
2

2
i
4
1
2
fissure
38
1
4
3
2

2

4
2
2
Fiske
2
Fisk
38
1
4
3
2

2

4
2
2
fishermen
2
fisherman
38
1
4
3
2
r
2
m
4
1
2
fishery
38
1
4
3
2

2
e
4
4
2
fishy
2
fishpond
2
fishmonger
2
fish
38
1
4
3
2

2
h
4
1
2
fiscal
38
1
4
3
2

2

4
2
2
Fischer
2
Fischbein
38
1
4
3
2

2
chkst
4
0
38
1
4
3
2
t
2

4
2
2
firsthand
2
first
38
1
4
3
2

2

4
3
2
firms
2
firmware
2
firm
38
1
4
3
2

2

4
2
2
firework
2
firewood
38
1
4
3
2

2
o
4
1
2
firewall
38
1
4
3
2

2

4
2
2
Firestone
2
fireside
38
1
4
3
2

2

4
3
2
fireproof
2
firepower
2
fireplace
38
1
4
3
2

2

4
2
2
firemen
2
fireman
38
1
4
3
2

2

4
3
2
firebug
2
firebreak
2
fireboat
38
1
4
3
2

2
bmpsw
4
6
2
firelight
2
firehouse
2
firefly
2
firecracker
2
firearm
2
fire
38
1
4
3
2

2
ems
4
1
2
fir
38
1
4
3
2

2

4
4
2
finny
2
Finnish
2
Finnegan
2
Finn
38
1
4
3
2

2

4
2
2
Finley
2
Finland
38
1
4
3
2

2
s
4
3
2
finite
2
finicky
2
finial
38
1
4
3
2
er
2

4
4
2
fingertip
2
fingerprint
2
fingernail
2
finger
38
1
4
3
2
s
2

4
2
2
finessing
2
finesse
38
1
4
3
2

2
s
4
2
2
finery
2
fine
38
1
4
3
2

2

4
2
2
financier
2
financial
38
1
4
3
2
c
2
i
4
1
2
finance
38
1
4
3
2

2

4
3
2
finally
2
finale
2
final
38
1
4
3
2

2
ln
4
0
38
1
4
3
2

2
aegilnd
4
3
2
fink
2
finch
2
fin
38
1
4
3
2

2

4
2
2
filthy
2
filth
38
1
4
3
2

2
h
4
2
2
filtrate
2
filter
38
1
4
3
2

2

4
5
2
filmy
2
filmstrip
2
filmmake
2
filmdom
2
film
38
1
4
3
2

2
e
4
3
2
filly
2
fillip
2
fill
38
1
4
3
2

2

4
4
2
Filipino
2
filigree
2
filibuster
2
filial
38
1
4
3
2

2

4
2
2
filet
2
file
38
1
4
3
2
ment
2

4
2
2
filamentary
2
filament
38
1
4
3
2

2
aeilmt
4
2
2
filch
2
filbert
38
1
4
3
2

2

4
2
2
figurate
2
figural
38
1
4
3
2
r
2
ae
4
1
2
figurine
38
1
4
3
2

2
u
4
3
2
fight
2
figaro
2
fig
38
1
4
3
2
en
2

4
2
2
fifteenth
2
fifteen
38
1
4
3
2

2
e
4
3
2
fifty
2
fiftieth
2
fifth
38
1
4
3
2

2
t
4
2
2
FIFO
2
fife
38
1
4
3
2

2

4
2
2
fiery
2
fierce
38
1
4
3
2
d
2

4
2
2
fiendish
2
fiend
38
1
4
3
2
d
2
s
4
2
2
fieldwork
2
field
38
1
4
3
2

2

4
2
2
fiefdom
2
fief
38
1
4
3
2

2
flnr
4
1
2
fiesta
38
1
4
3
2

2

4
2
2
fidelity
2
fide
38
1
4
3
2
l
2
e
4
1
2
fiddling
38
1
4
3
2

2
de
4
2
2
fiducial
2
fidget
38
1
4
3
2
i
2

4
3
2
fictive
2
fictitious
2
fiction
38
1
4
3
2

2
t
4
2
2
fickle
2
fiche
38
1
4
3
2

2

4
2
2
fibrous
2
fibrosis
38
1
4
3
2

2
o
4
2
2
fibrin
2
fibration
38
1
4
3
2
r
2

4
2
2
Fiberglas
2
fiberboard
38
1
4
3
2

2
er
4
2
2
Fibonacci
2
fib
38
1
4
3
2

2
n
4
2
2
fiat
2
fiasco
38
1
4
3
2
ce
2

4
2
2
fiancee
2
fiance
38
1
4
3
2

2
abcdeFglnrstvxz
4
0
38
1
4
3
2
er
2

4
2
2
feverish
2
fever
38
1
4
3
2

2

4
2
2
feudatory
2
feudal
38
1
4
3
2
d
2
a
4
1
2
feud
38
1
4
3
2

2

4
2
2
fettle
2
fetter
38
1
4
3
2

2

4
2
2
fetish
2
fetid
38
1
4
3
2

2
it
4
4
2
fetus
2
fete
2
fetch
2
fetal
38
1
4
3
2
v
2

4
2
2
festive
2
festival
38
1
4
3
2

2
i
4
1
2
fest
38
1
4
3
2

2
t
4
1
2
fescue
38
1
4
3
2

2

4
2
2
ferrule
2
ferruginous
38
1
4
3
2
agnet
2

4
2
2
ferromagnetic
2
ferromagnet
38
1
4
3
2

2
m
4
2
2
ferrous
2
ferroelectric
38
1
4
3
2

2

4
3
2
ferrite
2
ferris
2
ferric
38
1
4
3
2

2

4
3
2
ferret
2
Ferrer
2
Ferreira
38
1
4
3
2

2
eiou
4
1
2
ferry
38
1
4
3
2
ci
2

4
2
2
ferocity
2
ferocious
38
1
4
3
2

2

4
3
2
fernery
2
Fernando
2
fern
38
1
4
3
2

2

4
3
2
fermium
2
fermion
2
Fermi
38
1
4
3
2
nt
2

4
2
2
fermentation
2
ferment
38
1
4
3
2

2
ei
4
1
2
Fermat
38
1
4
3
2

2
mnor
4
5
2
fervent
2
fertile
2
Ferguson
2
Ferdinand
2
Ferber
38
1
4
3
2
e
2

4
2
2
fencepost
2
fence
38
1
4
3
2

2
c
4
4
2
fenugreek
2
Fenton
2
fennel
2
fend
38
1
4
3
2

2

4
2
2
feminist
2
feminism
38
1
4
3
2
ni
2
s
4
1
2
feminine
38
1
4
3
2

2
i
4
2
2
femur
2
female
38
1
4
3
2
n
2

4
3
2
felony
2
felonious
2
felon
38
1
4
3
2

2

4
2
2
fellow
2
fell
38
1
4
3
2

2
i
4
1
2
Felice
38
1
4
3
2

2

4
2
2
felicity
2
felicitous
38
1
4
3
2

2
t
4
1
2
Felicia
38
1
4
3
2

2
c
4
2
2
Felix
2
feline
38
1
4
3
2

2

4
2
2
feldspar
2
Feldman
38
1
4
3
2

2
dilo
4
2
2
felt
2
felsite
38
1
4
3
2

2

4
2
2
feint
2
feign
38
1
4
3
2

2

4
2
2
feedback
2
feed
38
1
4
3
2

2
dl
4
4
2
feet
2
Feeney
2
feeble
2
fee
38
1
4
3
2
ra
2

4
2
2
federate
2
federal
38
1
4
3
2

2
e
4
2
2
Fedora
2
fed
38
1
4
3
2

2

4
2
2
February
2
febrile
38
1
4
3
2

2
r
4
1
2
Feb
38
1
4
3
2
d
2

4
2
2
featherbedding
2
featherbed
38
1
4
3
2

2
e
4
1
2
featherbrain
38
1
4
3
2
er
2
b
4
4
2
feathery
2
featherweight
2
feathertop
2
feather
38
1
4
3
2

2
h
4
2
2
feature
2
feat
38
1
4
3
2

2

4
2
2
feast
2
feasible
38
1
4
3
2

2

4
3
2
fearsome
2
fearful
2
fear
38
1
4
3
2

2
rst
4
1
2
fealty
38
1
4
3
2

2
abdeilmnrstuv
4
3
2
few
2
fecund
2
Fe
38
1
4
3
2
tte
2

4
2
2
Fayetteville
2
Fayette
38
1
4
3
2

2
e
4
1
2
fay
38
1
4
3
2
t
2

4
3
2
Faustus
2
Faustian
2
Faust
38
1
4
3
2

2

4
2
2
fauna
2
faun
38
1
4
3
2

2

4
2
2
faulty
2
fault
38
1
4
3
2

2
t
4
1
2
Faulkner
38
1
4
3
2

2
lns
4
1
2
faucet
38
1
4
3
2

2

4
2
2
fatty
2
fatten
38
1
4
3
2

2

4
2
2
Fatima
2
fatigue
38
1
4
3
2

2

4
2
2
fathom
2
father
38
1
4
3
2

2

4
2
2
fateful
2
fate
38
1
4
3
2

2
ehit
4
3
2
fatuous
2
fatal
2
fat
38
1
4
3
2

2
e
4
2
2
fastidious
2
fast
38
1
4
3
2
i
2
cs
4
1
2
fascinate
38
1
4
3
2

2

4
2
2
fascist
2
fascism
38
1
4
3
2

2

4
2
2
fasciculate
2
fascicle
38
1
4
3
2

2
ct
4
1
2
fashion
38
1
4
3
2
he
2

4
2
2
farthest
2
farther
38
1
4
3
2

2

4
4
2
farmland
2
Farmington
2
farmhouse
2
farm
38
1
4
3
2

2

4
2
2
farewell
2
fare
38
1
4
3
2

2

4
2
2
farcical
2
farce
38
1
4
3
2
d
2

4
2
2
Faraday
2
farad
38
1
4
3
2

2
acemt
4
11
2
farsighted
2
Farrell
2
faro
2
Farnsworth
2
Farley
2
Farkas
2
farina
2
Fargo
2
farfetched
2
Farber
2
far
38
1
4
3
2
s
2
i
4
2
2
fantasy
2
fantastic
38
1
4
3
2

2

4
2
2
fantasist
2
fantasia
38
1
4
3
2

2
a
4
1
2
fantod
38
1
4
3
2

2

4
2
2
fangled
2
fang
38
1
4
3
2

2

4
2
2
fanfold
2
fanfare
38
1
4
3
2

2

4
2
2
fancy
2
fanciful
38
1
4
3
2

2
cfgt
4
4
2
fanout
2
Fanny
2
fanatic
2
fan
38
1
4
3
2

2
i
4
1
2
family
38
1
4
3
2

2
a
4
1
2
familism
38
1
4
3
2

2

4
2
2
familiar
2
familial
38
1
4
3
2

2
l
4
2
2
famish
2
famine
38
1
4
3
2

2
i
4
2
2
famous
2
fame
38
1
4
3
2

2

4
3
2
Falstaff
2
falsify
2
false
38
1
4
3
2

2

4
3
2
fallow
2
fallout
2
falloff
38
1
4
3
2
c
2

4
2
2
fallacy
2
fallacious
38
1
4
3
2

2
ao
4
3
2
fallible
2
fallen
2
fall
38
1
4
3
2
on
2

4
2
2
falconry
2
falcon
38
1
4
3
2

2
cls
4
2
2
falter
2
Falmouth
38
1
4
3
2
h
2

4
2
2
faithful
2
faith
38
1
4
3
2

2

4
2
2
Fairfield
2
Fairfax
38
1
4
3
2

2
f
4
7
2
fairly
2
fairy
2
fairway
2
Fairport
2
fairgoer
2
Fairchild
2
fair
38
1
4
3
2

2

4
2
2
faint
2
fain
38
1
4
3
2

2
sei
4
2
2
failure
2
fail
38
1
4
3
2

2

4
3
2
failsoft
2
failsafe
2
fails
38
1
4
3
2

2
lnrt
4
0
38
1
4
3
2

2

4
2
2
Fahrenheit
2
Fahey
38
1
4
3
2

2

4
2
2
fadeout
2
fade
38
1
4
3
2

2
e
4
1
2
fad
38
1
4
3
2

2

4
3
2
factory
2
factorial
2
factor
38
1
4
3
2

2
r
4
1
2
facto
38
1
4
3
2

2
o
4
3
2
factual
2
factious
2
fact
38
1
4
3
2

2

4
2
2
facilitate
2
facile
38
1
4
3
2

2
l
4
1
2
facial
38
1
4
3
2

2

4
2
2
facetious
2
facet
38
1
4
3
2

2
t
4
3
2
faces
2
faceplate
2
face
38
1
4
3
2

2
eit
4
3
2
faculty
2
facsimile
2
facade
38
1
4
3
2
ic
2

4
2
2
fabricate
2
fabric
38
1
4
3
2

2
r
4
4
2
fabulous
2
fable
2
Fabian
2
Faber
38
1
4
3
2

2
bcdhilmnrstuyk
4
6
2
faze
2
fawn
2
fag
2
Fafnir
2
faery
2
FAA
38
1
4
3
2

2
aeilMorTu
4
7
2
fjord
2
f's
2
FPC
2
FDA
2
FCC
2
FBI
2
f
38
1
4
3
2

2

4
2
2
Ezra
2
Ezekiel
38
1
4
3
2

2

4
3
2
eyelid
2
eyelet
2
eyelash
38
1
4
3
2

2

4
2
2
eyebrow
2
eyebright
38
1
4
3
2

2
r
4
1
2
eyeball
38
1
4
3
2
e
2
bls
4
5
2
eyewitness
2
eyepiece
2
eyeglass
2
eyeful
2
eye
38
1
4
3
2

2

4
2
2
exultation
2
exultant
38
1
4
3
2
t
2
a
4
1
2
exult
38
1
4
3
2

2

4
2
2
exude
2
exudate
38
1
4
3
2

2
dl
4
1
2
exuberant
38
1
4
3
2
i
2

4
2
2
extrusive
2
extrusion
38
1
4
3
2

2
s
4
1
2
extrude
38
1
4
3
2
ver
2

4
2
2
extrovert
2
extroversion
38
1
4
3
2
a
2

4
2
2
extricate
2
extricable
38
1
4
3
2

2
c
4
1
2
extrinsic
38
1
4
3
2

2

4
2
2
extremal
2
extrema
38
1
4
3
2
m
2
ae
4
1
2
extremum
38
1
4
3
2

2
cdv
4
7
2
extraterrestrial
2
extrapolate
2
extraordinary
2
extraneous
2
extramarital
2
extralegal
2
extra
38
1
4
3
2
agan
2

4
2
2
extravaganza
2
extravagant
38
1
4
3
2
it
2

4
2
2
extradition
2
extradite
38
1
4
3
2

2

4
2
2
extractor
2
extract
38
1
4
3
2

2
t
4
1
2
extracellular
38
1
4
3
2

2
aeiou
4
0
38
1
4
3
2

2
l
4
1
2
extol
38
1
4
3
2

2

4
2
2
extoller
2
extolled
38
1
4
3
2

2
e
4
1
2
extolling
38
1
4
3
2

2
l
4
1
2
extort
38
1
4
3
2

2

4
2
2
extinguish
2
extinct
38
1
4
3
2

2
n
4
1
2
extirpate
38
1
4
3
2

2

4
3
2
external
2
exterminate
2
exterior
38
1
4
3
2

2

4
3
2
extensive
2
extension
2
extensible
38
1
4
3
2

2
i
4
1
2
extensor
38
1
4
3
2

2

4
2
2
extendible
2
extend
38
1
4
3
2

2
ds
4
2
2
extenuate
2
extent
38
1
4
3
2
por
2

4
2
2
extempore
2
extemporaneous
38
1
4
3
2

2
mnr
4
0
38
1
4
3
2

2
eior
4
1
2
extant
38
1
4
3
2

2

4
3
2
expurgate
2
expunge
2
expulsion
38
1
4
3
2
ss
2
i
4
2
2
expressway
2
express
38
1
4
3
2

2

4
3
2
expressive
2
expression
2
expressible
38
1
4
3
2

2
e
4
1
2
expropriate
38
1
4
3
2
r
2

4
2
2
expository
2
expositor
38
1
4
3
2
t
2
o
4
2
2
exposition
2
exposit
38
1
4
3
2

2
i
4
2
2
exposure
2
expose
38
1
4
3
2
t
2

4
2
2
exportation
2
export
38
1
4
3
2
ent
2
i
4
1
2
exponent
38
1
4
3
2
a
2

4
2
2
exponentiate
2
exponential
38
1
4
3
2

2
nrs
4
1
2
expound
38
1
4
3
2
i
2

4
2
2
explosive
2
explosion
38
1
4
3
2
t
2

4
2
2
exploratory
2
exploration
38
1
4
3
2

2
a
4
1
2
explore
38
1
4
3
2
t
2

4
2
2
exploitation
2
exploit
38
1
4
3
2

2
irs
4
1
2
explode
38
1
4
3
2

2

4
2
2
explicate
2
explicable
38
1
4
3
2
c
2
a
4
1
2
explicit
38
1
4
3
2

2
n
4
1
2
explain
38
1
4
3
2
at
2

4
2
2
explanatory
2
explanation
38
1
4
3
2

2
aio
4
1
2
expletive
38
1
4
3
2

2

4
2
2
expire
2
expiration
38
1
4
3
2

2

4
2
2
expiate
2
expiable
38
1
4
3
2

2
ar
4
0
38
1
4
3
2

2

4
2
2
expertise
2
expert
38
1
4
3
2

2
em
4
0
38
1
4
3
2
ent
2

4
2
2
experimentation
2
experiment
38
1
4
3
2
n
2
c
4
1
2
experiential
38
1
4
3
2

2
it
4
0
38
1
4
3
2

2

4
2
2
expensive
2
expense
38
1
4
3
2

2

4
2
2
expenditure
2
expend
38
1
4
3
2

2
ds
4
0
38
1
4
3
2

2

4
3
2
expelling
2
expelled
2
expellable
38
1
4
3
2

2
l
4
1
2
expel
38
1
4
3
2
o
2

4
2
2
expeditious
2
expedition
38
1
4
3
2

2
i
4
1
2
expedite
38
1
4
3
2
i
2
t
4
1
2
expedient
38
1
4
3
2
t
2
ao
4
3
2
expecting
2
expected
2
expect
38
1
4
3
2
ra
2

4
2
2
expectorate
2
expectorant
38
1
4
3
2

2

4
2
2
expectation
2
expectant
38
1
4
3
2

2
cdlnr
4
0
38
1
4
3
2

2
n
4
1
2
expatiate
38
1
4
3
2

2
s
4
1
2
expand
38
1
4
3
2

2

4
3
2
expansive
2
expansion
2
expansible
38
1
4
3
2

2
i
4
1
2
expanse
38
1
4
3
2

2
aeiloru
4
0
38
1
4
3
2
c
2

4
2
2
exotica
2
exotic
38
1
4
3
2

2
i
4
1
2
exothermic
38
1
4
3
2
is
2

4
3
2
exorcist
2
exorcism
2
exorcise
38
1
4
3
2

2
c
4
1
2
exorbitant
38
1
4
3
2
m
2

4
2
2
exogamy
2
exogamous
38
1
4
3
2

2
a
4
1
2
exogenous
38
1
4
3
2

2
grt
4
3
2
exoskeleton
2
exonerate
2
exodus
38
1
4
3
2
n
2
t
4
1
2
existence
38
1
4
3
2
t
2
e
4
1
2
exist
38
1
4
3
2

2
s
4
3
2
exit
2
exile
2
exigent
38
1
4
3
2
m
2

4
2
2
exhume
2
exhumation
38
1
4
3
2
rt
2

4
2
2
exhortation
2
exhort
38
1
4
3
2
it
2

4
3
2
exhibitor
2
exhibition
2
exhibit
38
1
4
3
2

2
b
4
1
2
exhilarate
38
1
4
3
2

2
u
4
1
2
exhale
38
1
4
3
2

2

4
3
2
exhaustive
2
exhaustion
2
exhaustible
38
1
4
3
2
st
2
i
4
1
2
exhaust
38
1
4
3
2

2
aiou
4
0
38
1
4
3
2
is
2

4
2
2
exercise
2
exercisable
38
1
4
3
2

2
c
4
1
2
exert
38
1
4
3
2

2

4
2
2
exemption
2
exempt
38
1
4
3
2

2
a
4
1
2
exemplify
38
1
4
3
2
r
2

4
2
2
exemplary
2
exemplar
38
1
4
3
2
p
2
lt
4
0
38
1
4
3
2
e
2

4
2
2
exegete
2
exegesis
38
1
4
3
2

2
ru
4
0
38
1
4
3
2

2
v
4
1
2
execution
38
1
4
3
2
t
2
i
4
3
2
executrix
2
executor
2
execute
38
1
4
3
2
a
2

4
2
2
execrate
2
execrable
38
1
4
3
2

2
cgmr
4
1
2
Exeter
38
1
4
3
2

2

4
2
2
excuse
2
excusable
38
1
4
3
2
s
2

4
2
2
excursus
2
excursion
38
1
4
3
2
pat
2

4
2
2
exculpatory
2
exculpate
38
1
4
3
2

2
lrs
4
0
38
1
4
3
2

2
t
4
1
2
excrescent
38
1
4
3
2

2

4
3
2
excretory
2
excretion
2
excrete
38
1
4
3
2

2
e
4
1
2
excruciate
38
1
4
3
2

2

4
2
2
excoriate
2
excommunicate
38
1
4
3
2
n
2

4
2
2
exclusionary
2
exclusion
38
1
4
3
2
i
2
o
4
1
2
exclusive
38
1
4
3
2

2
s
4
1
2
exclude
38
1
4
3
2

2
m
4
1
2
exclaim
38
1
4
3
2
at
2

4
2
2
exclamatory
2
exclamation
38
1
4
3
2

2
au
4
0
38
1
4
3
2
t
2

4
2
2
excitatory
2
excitation
38
1
4
3
2

2
a
4
2
2
exciton
2
excite
38
1
4
3
2

2

4
3
2
excision
2
excise
2
excisable
38
1
4
3
2

2
st
4
0
38
1
4
3
2
nge
2

4
2
2
exchangeable
2
exchange
38
1
4
3
2

2
a
4
1
2
exchequer
38
1
4
3
2
s
2

4
2
2
excessive
2
excess
38
1
4
3
2
t
2

4
2
2
exception
2
except
38
1
4
3
2

2

4
2
2
excellent
2
excelled
38
1
4
3
2

2
e
4
1
2
excelling
38
1
4
3
2

2
l
4
2
2
excelsior
2
excel
38
1
4
3
2

2
lps
4
2
2
excerpt
2
exceed
38
1
4
3
2

2
ehiloru
4
1
2
excavate
38
1
4
3
2

2
clms
4
1
2
exaggerate
38
1
4
3
2
perate
2

4
2
2
exasperater
2
exasperate
38
1
4
3
2
n
2

4
2
2
examine
2
examination
38
1
4
3
2

2
ip
4
1
2
exam
38
1
4
3
2
t
2

4
2
2
exaltation
2
exalt
38
1
4
3
2

2

4
2
2
exact
2
exacerbate
38
1
4
3
2

2
acehioptu
4
2
2
Exxon
2
exquisite
38
1
4
3
2
tion
2

4
2
2
evolutionary
2
evolution
38
1
4
3
2

2
u
4
1
2
evolve
38
1
4
3
2
a
2

4
2
2
evocate
2
evocable
38
1
4
3
2

2
cl
4
1
2
evoke
38
1
4
3
2

2

4
2
2
evildoer
2
evil
38
1
4
3
2
ent
2

4
2
2
evidential
2
evident
38
1
4
3
2

2
dl
4
2
2
evince
2
evict
38
1
4
3
2

2

4
7
2
everywhere
2
everything
2
everyone
2
everyman
2
everyday
2
everybody
2
every
38
1
4
3
2

2

4
2
2
evergreen
2
Everglades
38
1
4
3
2

2

4
2
2
Everett
2
Eveready
38
1
4
3
2

2
egy
4
3
2
everlasting
2
Everhart
2
ever
38
1
4
3
2
a
2

4
2
2
eventuate
2
eventual
38
1
4
3
2

2
u
4
3
2
eventide
2
eventful
2
event
38
1
4
3
2

2
t
4
3
2
evensong
2
evenhanded
2
even
38
1
4
3
2

2
nr
4
2
2
Evelyn
2
eve
38
1
4
3
2

2
lns
4
4
2
evaporate
2
evade
2
evacuate
2
Eva
38
1
4
3
2
i
2

4
2
2
evasive
2
evasion
38
1
4
3
2

2

4
3
2
Evansville
2
Evanston
2
Evans
38
1
4
3
2
el
2

4
2
2
evangelic
2
evangel
38
1
4
3
2

2
gs
4
1
2
evanescent
38
1
4
3
2
ua
2
t
4
1
2
evaluable
38
1
4
3
2

2
aeio
4
1
2
evzone
38
1
4
3
2

2

4
2
2
Euterpe
2
eutectic
38
1
4
3
2

2
e
4
1
2
euthanasia
38
1
4
3
2

2
a
4
1
2
Europe
38
1
4
3
2
p
2
e
4
2
2
europium
2
Europa
38
1
4
3
2

2

4
2
2
Euripides
2
Euridyce
38
1
4
3
2

2
io
4
3
2
Eurydice
2
eureka
2
Eurasia
38
1
4
3
2

2

4
2
2
euphoric
2
euphoria
38
1
4
3
2
r
2
i
4
1
2
euphorbia
38
1
4
3
2
mis
2

4
2
2
euphemist
2
euphemism
38
1
4
3
2
h
2
eo
4
1
2
Euphrates
38
1
4
3
2
r
2

4
2
2
Eulerian
2
Euler
38
1
4
3
2

2
e
4
1
2
eulogy
38
1
4
3
2

2

4
2
2
eugenic
2
Eugenia
38
1
4
3
2
en
2
i
4
1
2
Eugene
38
1
4
3
2

2
l
4
3
2
eucre
2
Eucharist
2
eucalyptus
38
1
4
3
2
id
2

4
2
2
Euclidean
2
Euclid
38
1
4
3
2

2
cglprt
4
3
2
Eunice
2
Eumenides
2
eukaryote
38
1
4
3
2

2

4
2
2
etiquette
2
etiology
38
1
4
3
2
l
2

4
2
2
ethylene
2
ethyl
38
1
4
3
2

2

4
2
2
ethos
2
ethology
38
1
4
3
2

2

4
2
2
ethnology
2
ethnography
38
1
4
3
2

2
o
4
1
2
ethnic
38
1
4
3
2

2

4
2
2
Ethiopia
2
ethic
38
1
4
3
2

2

4
2
2
ethereal
2
ether
38
1
4
3
2

2
r
4
1
2
Ethel
38
1
4
3
2
n
2

4
3
2
ethanol
2
ethane
2
Ethan
38
1
4
3
2

2
aeinoy
4
0
38
1
4
3
2
rn
2

4
2
2
eternity
2
eternal
38
1
4
3
2

2

4
2
2
etch
2
etc
38
1
4
3
2

2
cehi
4
5
2
etymology
2
etude
2
Etruscan
2
eta
2
et
38
1
4
3
2
ar
2

4
2
2
estuary
2
estuarine
38
1
4
3
2

2

4
2
2
estoppal
2
estop
38
1
4
3
2

2
p
4
1
2
Estonia
38
1
4
3
2
ma
2

4
2
2
estimate
2
estimable
38
1
4
3
2

2

4
4
2
Estes
2
ester
2
Estella
2
esteem
38
1
4
3
2

2
bt
4
0
38
1
4
3
2

2
aeiou
4
3
2
estrange
2
Esther
2
EST
38
1
4
3
2

2

4
3
2
essential
2
essence
2
Essen
38
1
4
3
2

2
n
4
1
2
Essex
38
1
4
3
2

2
e
4
1
2
essay
38
1
4
3
2
s
2

4
2
2
espouse
2
espousal
38
1
4
3
2

2
u
4
1
2
Esposito
38
1
4
3
2

2
oe
4
3
2
esprit
2
esplanade
2
espionage
38
1
4
3
2

2

4
2
2
esoteric
2
esophagi
38
1
4
3
2

2
ahr
4
2
2
escutcheon
2
escort
38
1
4
3
2

2

4
2
2
escrow
2
escritoire
38
1
4
3
2
e
2

4
3
2
eschew
2
Escherichia
2
escheat
38
1
4
3
2

2
p
4
2
2
escalate
2
escadrille
38
1
4
3
2

2

4
2
2
escapee
2
escape
38
1
4
3
2

2
e
4
1
2
escapade
38
1
4
3
2

2
copst
4
3
2
esquire
2
Esmark
2
Eskimo
38
1
4
3
2

2

4
2
2
e's
2
e'er
38
1
4
3
2
t
2

4
2
2
eruption
2
erupt
38
1
4
3
2
it
2

4
2
2
erudition
2
erudite
38
1
4
3
2

2
dp
4
0
38
1
4
3
2

2

4
2
2
Erskine
2
ersatz
38
1
4
3
2

2

4
3
2
error
2
erroneous
2
Errol
38
1
4
3
2

2

4
3
2
erratum
2
erratic
2
errata
38
1
4
3
2

2
t
4
1
2
errand
38
1
4
3
2

2

4
2
2
errantry
2
errant
38
1
4
3
2

2
nt
4
0
38
1
4
3
2

2
ao
4
1
2
err
38
1
4
3
2
ic
2

4
2
2
erotica
2
erotic
38
1
4
3
2

2

4
3
2
erosive
2
erosion
2
erosible
38
1
4
3
2

2
i
4
1
2
Eros
38
1
4
3
2

2

4
2
2
erodible
2
erode
38
1
4
3
2

2
dst
4
0
38
1
4
3
2
st
2

4
2
2
Ernestine
2
Ernest
38
1
4
3
2

2
e
4
2
2
Ernst
2
Ernie
38
1
4
3
2

2

4
4
2
Ericsson
2
Erickson
2
Erich
2
Eric
38
1
4
3
2

2
c
4
2
2
Erik
2
Erie
38
1
4
3
2

2

4
3
2
ergodic
2
ergative
2
erg
38
1
4
3
2

2

4
2
2
erect
2
ere
38
1
4
3
2

2
dst
4
1
2
era
38
1
4
3
2
o
2

4
2
2
Eratosthenes
2
Erato
38
1
4
3
2

2

4
5
2
erasure
2
Erastus
2
Erasmus
2
erase
2
erasable
38
1
4
3
2
ica
2

4
2
2
eradicate
2
eradicable
38
1
4
3
2

2
aeginorsu
4
5
2
Erwin
2
Ervin
2
Erlenmeyer
2
ERDA
2
erbium
38
1
4
3
2

2

4
2
2
equivocal
2
equivalent
38
1
4
3
2

2

4
2
2
equitation
2
equitable
38
1
4
3
2

2
a
4
1
2
equity
38
1
4
3
2

2

4
2
2
equipping
2
equipped
38
1
4
3
2

2

4
2
2
equipotent
2
equipoise
38
1
4
3
2

2
op
4
2
2
equipment
2
equip
38
1
4
3
2

2

4
2
2
equinox
2
equinoctial
38
1
4
3
2

2
o
4
1
2
equine
38
1
4
3
2

2

4
2
2
equilibrium
2
equilibria
38
1
4
3
2
br
2
i
4
1
2
equilibrate
38
1
4
3
2

2
i
4
1
2
equilateral
38
1
4
3
2

2
lnptv
4
1
2
equidistant
38
1
4
3
2

2
t
4
3
2
equanimity
2
equal
2
equable
38
1
4
3
2

2

4
2
2
equatorial
2
equate
38
1
4
3
2
u
2
ai
4
1
2
equestrian
38
1
4
3
2

2

4
3
2
Epstein
2
Epsom
2
epsilon
38
1
4
3
2
h
2

4
2
2
epochal
2
epoch
38
1
4
3
2

2
c
4
1
2
epoxy
38
1
4
3
2
i
2

4
2
2
epithelium
2
epithelial
38
1
4
3
2
e
2
l
4
1
2
epithet
38
1
4
3
2

2
x
4
1
2
epitaph
38
1
4
3
2

2

4
2
2
epitaxy
2
epitaxial
38
1
4
3
2

2
ah
4
1
2
epitome
38
1
4
3
2

2

4
3
2
epistolatory
2
epistle
2
epistemology
38
1
4
3
2
d
2

4
2
2
episodic
2
episode
38
1
4
3
2
opa
2
l
4
1
2
episcopate
38
1
4
3
2

2

4
2
2
Episcopalian
2
episcopal
38
1
4
3
2

2
cot
4
0
38
1
4
3
2
s
2

4
2
2
epiphysis
2
epiphyseal
38
1
4
3
2
h
2
y
4
1
2
Epiphany
38
1
4
3
2

2

4
2
2
epilogue
2
epileptic
38
1
4
3
2

2

4
2
2
epigrammatic
2
epigram
38
1
4
3
2
a
2
m
4
1
2
epigraph
38
1
4
3
2

2
r
4
1
2
epigenetic
38
1
4
3
2
mi
2

4
2
2
epidermis
2
epidermic
38
1
4
3
2
i
2

4
2
2
epidemiology
2
epidemic
38
1
4
3
2
e
2
mr
4
0
38
1
4
3
2

2
uy
4
1
2
epic
38
1
4
3
2
cl
2

4
2
2
epicyclic
2
epicycle
38
1
4
3
2
re
2

4
2
2
Epicurean
2
epicure
38
1
4
3
2

2
cdglpst
4
1
2
epimorphism
38
1
4
3
2

2
ms
4
0
38
1
4
3
2

2

4
2
2
Ephesus
2
Ephesian
38
1
4
3
2
er
2
i
4
1
2
ephemeral
38
1
4
3
2

2

4
2
2
ephemeris
2
ephemerides
38
1
4
3
2

2
e
4
1
2
Ephraim
38
1
4
3
2

2

4
2
2
epaulet
2
EPA
38
1
4
3
2

2
Ahios
4
0
38
1
4
3
2

2

4
3
2
eosine
2
eohippus
2
Eocene
38
1
4
3
2
ym
2

4
3
2
enzymology
2
enzyme
2
enzymatic
38
1
4
3
2

2

4
3
2
environ
2
envious
2
enviable
38
1
4
3
2
lop
2

4
2
2
envelope
2
envelop
38
1
4
3
2

2
ei
4
2
2
envy
2
envoy
38
1
4
3
2
cia
2

4
2
2
enunciate
2
enunciable
38
1
4
3
2
era
2

4
2
2
enumerate
2
enumerable
38
1
4
3
2

2
mn
4
0
38
1
4
3
2
preneur
2

4
2
2
entrepreneurial
2
entrepreneur
38
1
4
3
2
n
2

4
2
2
entrant
2
entranceway
38
1
4
3
2

2
ae
4
2
2
entry
2
entropy
38
1
4
3
2

2

4
2
2
entourage
2
entomology
38
1
4
3
2
e
2

4
2
2
entirety
2
entire
38
1
4
3
2

2
r
4
2
2
entity
2
entice
38
1
4
3
2

2

4
2
2
enthusiastic
2
enthusiast
38
1
4
3
2
sias
2
t
4
1
2
enthusiasm
38
1
4
3
2

2
u
4
1
2
enthalpy
38
1
4
3
2

2
r
4
1
2
entendre
38
1
4
3
2

2

4
3
2
entertain
2
enterprise
2
enter
38
1
4
3
2

2
ehior
4
0
38
1
4
3
2

2

4
3
2
enstatite
2
ensemble
2
ensconce
38
1
4
3
2

2

4
2
2
enrollee
2
Enrico
38
1
4
3
2
uir
2

4
2
2
enquiry
2
enquire
38
1
4
3
2
m
2

4
2
2
enormous
2
enormity
38
1
4
3
2

2
r
4
4
2
enough
2
Enos
2
enol
2
Enoch
38
1
4
3
2
ma
2

4
2
2
enigmatic
2
enigma
38
1
4
3
2

2
g
4
1
2
Enid
38
1
4
3
2

2

4
2
2
Englishmen
2
Englishman
38
1
4
3
2
sh
2
m
4
1
2
English
38
1
4
3
2

2

4
2
2
Englewood
2
Engle
38
1
4
3
2
nd
2

4
2
2
Englander
2
England
38
1
4
3
2

2
aei
4
0
38
1
4
3
2
ne
2

4
2
2
engineer
2
engine
38
1
4
3
2

2
il
4
3
2
Engel
2
engage
2
Eng
38
1
4
3
2
rc
2

4
2
2
enforcible
2
enforceable
38
1
4
3
2

2
o
4
1
2
enfant
38
1
4
3
2

2

4
2
2
energy
2
energetic
38
1
4
3
2

2
g
4
1
2
enervate
38
1
4
3
2

2
r
4
1
2
enemy
38
1
4
3
2
he
2

4
2
2
endothermic
2
endothelial
38
1
4
3
2
m
2

4
2
2
endogamy
2
endogamous
38
1
4
3
2

2
a
4
1
2
endogenous
38
1
4
3
2

2
gt
4
5
2
endow
2
endosperm
2
endorse
2
endomorphism
2
endoderm
38
1
4
3
2

2
o
4
5
2
endure
2
endpoint
2
Endicott
2
endgame
2
end
38
1
4
3
2
mb
2

4
2
2
encumbrance
2
encumber
38
1
4
3
2

2

4
2
2
encryption
2
encroach
38
1
4
3
2
i
2

4
2
2
encomium
2
encomia
38
1
4
3
2

2
m
4
1
2
encore
38
1
4
3
2

2
oru
4
5
2
encyclopedic
2
enclave
2
enchantress
2
encephalitis
2
encapsulate
38
1
4
3
2

2
cdefgioqrstuvz
4
6
2
enmity
2
enlargeable
2
enjoinder
2
enhance
2
enamel
2
en
38
1
4
3
2
i
2

4
2
2
emulsion
2
emulsify
38
1
4
3
2
l
2
s
4
1
2
emulate
38
1
4
3
2

2

4
2
2
empower
2
emporium
38
1
4
3
2
y
2
e
4
1
2
employ
38
1
4
3
2

2
o
4
1
2
emplace
38
1
4
3
2
r
2

4
2
2
empiric
2
empire
38
1
4
3
2
sema
2

4
2
2
emphysematous
2
emphysema
38
1
4
3
2

2
s
4
1
2
emphatic
38
1
4
3
2

2

4
2
2
emphasis
2
emphases
38
1
4
3
2

2
ay
4
0
38
1
4
3
2

2
hilo
4
5
2
empyrean
2
empty
2
empress
2
emperor
2
empathy
38
1
4
3
2

2

4
3
2
emotion
2
Emory
2
emolument
38
1
4
3
2

2

4
2
2
Emmanuel
2
emma
38
1
4
3
2

2
a
4
1
2
Emmett
38
1
4
3
2

2

4
2
2
emitter
2
emitted
38
1
4
3
2

2
e
4
2
2
emitting
2
emittance
38
1
4
3
2

2
t
4
1
2
emit
38
1
4
3
2

2

4
2
2
emissivity
2
emission
38
1
4
3
2
s
2
i
4
1
2
emissary
38
1
4
3
2

2

4
4
2
Emily
2
Emilio
2
Emile
2
Emil
38
1
4
3
2
ra
2

4
2
2
emigrate
2
emigrant
38
1
4
3
2

2
glst
4
2
2
emirate
2
eminent
38
1
4
3
2
t
2

4
2
2
emeritus
2
emeriti
38
1
4
3
2
e
2

4
2
2
emergent
2
emerge
38
1
4
3
2

2
gi
4
3
2
Emery
2
Emerson
2
emerald
38
1
4
3
2

2
r
4
1
2
emendable
38
1
4
3
2
o
2

4
3
2
embryonic
2
embryology
2
embryo
38
1
4
3
2
er
2

4
2
2
embroidery
2
embroider
38
1
4
3
2
i
2
d
4
1
2
embroil
38
1
4
3
2
ce
2

4
2
2
embraceable
2
embrace
38
1
4
3
2

2
aoy
4
1
2
embrittle
38
1
4
3
2

2

4
2
2
embody
2
embodiment
38
1
4
3
2

2
d
4
4
2
embower
2
embouchure
2
emboss
2
embolden
38
1
4
3
2
em
2

4
2
2
emblematic
2
emblem
38
1
4
3
2

2
d
4
1
2
embed
38
1
4
3
2

2

4
2
2
embedder
2
embedded
38
1
4
3
2

2
e
4
2
2
embedding
2
embeddable
38
1
4
3
2

2
d
4
3
2
embezzle
2
ember
2
embellish
38
1
4
3
2

2
r
4
4
2
embattle
2
embassy
2
embank
2
embalm
38
1
4
3
2
o
2

4
2
2
embargoes
2
embargo
38
1
4
3
2

2
g
4
3
2
embarrass
2
embark
2
embarcadero
38
1
4
3
2

2
aelor
4
0
38
1
4
3
2

2

4
3
2
Emanuel
2
emancipate
2
emanate
38
1
4
3
2

2
nc
4
1
2
emasculate
38
1
4
3
2

2
abeimopu
4
2
2
emcee
2
em
38
1
4
3
2

2

4
2
2
elysian
2
Elysee
38
1
4
3
2

2
s
4
1
2
Ely
38
1
4
3
2

2

4
2
2
elution
2
elute
38
1
4
3
2

2
t
4
4
2
elusive
2
elude
2
elucidate
2
eluate
38
1
4
3
2

2

4
2
2
Elsinore
2
Elsie
38
1
4
3
2

2

4
3
2
elsewhere
2
Elsevier
2
else
38
1
4
3
2

2
ei
4
0
38
1
4
3
2

2

4
4
2
eloquent
2
elope
2
elongate
2
Eloise
38
1
4
3
2

2

4
5
2
Elmsford
2
Elmira
2
Elmhurst
2
Elmer
2
elm
38
1
4
3
2

2

4
2
2
Ellison
2
Ellis
38
1
4
3
2

2
o
4
2
2
ellipsis
2
ellipse
38
1
4
3
2
d
2

4
2
2
ellipsoidal
2
ellipsoid
38
1
4
3
2

2
i
4
1
2
ellipsometer
38
1
4
3
2

2
s
4
1
2
elliptic
38
1
4
3
2
t
2

4
2
2
Elliott
2
Elliot
38
1
4
3
2

2
ops
4
0
38
1
4
3
2

2
i
4
5
2
Ellwood
2
Ellsworth
2
Ellen
2
Ella
2
ell
38
1
4
3
2

2

4
2
2
Elkhart
2
elk
38
1
4
3
2
abeth
2

4
2
2
Elizabethan
2
Elizabeth
38
1
4
3
2

2

4
3
2
elision
2
Elisha
2
Elisabeth
38
1
4
3
2

2
szm
4
8
2
elite
2
Eliot
2
Elinor
2
Elijah
2
eligible
2
elide
2
elicit
2
Eli
38
1
4
3
2
n
2

4
2
2
eleventh
2
eleven
38
1
4
3
2

2
e
4
1
2
elevate
38
1
4
3
2
hant
2

4
2
2
elephantine
2
elephant
38
1
4
3
2
ent
2

4
2
2
elementary
2
element
38
1
4
3
2

2

4
3
2
elegy
2
elegiac
2
elegant
38
1
4
3
2
hor
2

4
2
2
electrophorus
2
electrophoresis
38
1
4
3
2

2
i
4
1
2
electron
38
1
4
3
2

2

4
2
2
electrolytic
2
electrolyte
38
1
4
3
2
y
2
t
4
1
2
electrolysis
38
1
4
3
2
h
2

4
2
2
electroencephalography
2
electroencephalograph
38
1
4
3
2
ncephalogra
2
p
4
1
2
electroencephalogram
38
1
4
3
2
ardiogra
2

4
2
2
electrocardiograph
2
electrocardiogram
38
1
4
3
2

2
celnp
4
2
2
electrode
2
electro
38
1
4
3
2

2

4
2
2
electrician
2
electric
38
1
4
3
2

2
c
4
1
2
electrify
38
1
4
3
2

2

4
2
2
electret
2
electress
38
1
4
3
2

2
eio
4
1
2
Electra
38
1
4
3
2

2

4
2
2
electorate
2
electoral
38
1
4
3
2
r
2
a
4
1
2
elector
38
1
4
3
2
t
2
or
4
1
2
elect
38
1
4
3
2

2

4
2
2
Eleazar
2
Eleanor
38
1
4
3
2

2
acgmpv
4
1
2
Elena
38
1
4
3
2

2

4
2
2
eldest
2
elder
38
1
4
3
2

2
e
4
1
2
Eldon
38
1
4
3
2

2

4
2
2
elbow
2
Elba
38
1
4
3
2
t
2

4
2
2
elastomer
2
elastic
38
1
4
3
2

2
s
4
5
2
elate
2
elapse
2
elan
2
Elaine
2
elaborate
38
1
4
3
2

2
abdeiklmosuy
4
5
2
elves
2
Elton
2
Elgin
2
elfin
2
el
38
1
4
3
2

2

4
3
2
Ektachrome
2
Ekstrom
2
eke
38
1
4
3
2
ct
2

4
2
2
ejector
2
eject
38
1
4
3
2

2
e
4
1
2
ejaculate
38
1
4
3
2

2

4
2
2
Eisner
2
Eisenhower
38
1
4
3
2

2

4
2
2
einsteinium
2
Einsteinian
38
1
4
3
2
stein
2
i
4
1
2
Einstein
38
1
4
3
2
en
2

4
2
2
eighteenth
2
eighteen
38
1
4
3
2
t
2
e
4
5
2
eighty
2
eightieth
2
eighth
2
eightfold
2
eight
38
1
4
3
2
n
2
sv
4
1
2
eigenfunction
38
1
4
3
2

2

4
2
2
eigenvector
2
eigenvalue
38
1
4
3
2

2

4
2
2
eigenstate
2
eigenspace
38
1
4
3
2

2
eh
4
0
38
1
4
3
2
e
2

4
2
2
eidetic
2
eider
38
1
4
3
2

2
dgns
4
3
2
either
2
Eire
2
Eileen
38
1
4
3
2

2

4
2
2
Ehrlich
2
eh
38
1
4
3
2
pt
2

4
2
2
Egyptian
2
Egypt
38
1
4
3
2
e
2

4
3
2
egret
2
egress
2
egregious
38
1
4
3
2
is
2

4
2
2
egotist
2
egotism
38
1
4
3
2

2
t
4
2
2
egocentric
2
ego
38
1
4
3
2

2

4
4
2
eggshell
2
eggplant
2
egghead
2
egg
38
1
4
3
2

2

4
2
2
Egan
2
egalitarian
38
1
4
3
2

2
agory
4
0
38
1
4
3
2

2
aeilo
4
1
2
effusive
38
1
4
3
2
i
2

4
2
2
effluvium
2
effluvia
38
1
4
3
2

2
v
4
1
2
effluent
38
1
4
3
2
resce
2

4
2
2
efflorescent
2
effloresce
38
1
4
3
2

2
ou
4
0
38
1
4
3
2

2
a
4
1
2
efficient
38
1
4
3
2
c
2

4
2
2
efficacy
2
efficacious
38
1
4
3
2

2
c
4
1
2
Effie
38
1
4
3
2
t
2
u
4
3
2
effects
2
effective
2
effect
38
1
4
3
2
a
2

4
2
2
effectuate
2
effectual
38
1
4
3
2

2
c
4
3
2
effete
2
efferent
2
effeminate
38
1
4
3
2
ce
2

4
2
2
effaceable
2
efface
38
1
4
3
2

2
f
4
1
2
eft
38
1
4
3
2
i
2

4
2
2
eerily
2
eerie
38
1
4
3
2

2

4
2
2
eelgrass
2
eel
38
1
4
3
2

2
lr
4
1
2
EEOC
38
1
4
3
2
n
2

4
2
2
Edwina
2
Edwin
38
1
4
3
2
rd
2
i
4
1
2
Edward
38
1
4
3
2

2

4
2
2
Edwardine
2
Edwardian
38
1
4
3
2

2
ai
4
0
38
1
4
3
2
a
2
t
4
1
2
educable
38
1
4
3
2

2
c
4
1
2
Eduardo
38
1
4
3
2
n
2
d
4
1
2
Edmonton
38
1
4
3
2
s
2

4
2
2
Edmondson
2
Edmonds
38
1
4
3
2

2
o
4
1
2
Edmund
38
1
4
3
2
r
2

4
3
2
editors
2
editorial
2
editor
38
1
4
3
2

2
o
4
3
2
edition
2
Edith
2
edit
38
1
4
3
2

2

4
2
2
edify
2
edifice
38
1
4
3
2

2
ft
4
4
2
Edison
2
Edinburgh
2
edict
2
edible
38
1
4
3
2

2

4
3
2
edgewise
2
Edgerton
2
edge
38
1
4
3
2

2
e
4
3
2
edgy
2
edging
2
Edgar
38
1
4
3
2

2

4
3
2
Eden
2
edematous
2
edelweiss
38
1
4
3
2

2

4
2
2
eddy
2
Eddie
38
1
4
3
2

2
degimuw
4
3
2
EDT
2
Edna
2
Ed
38
1
4
3
2
eni
2

4
2
2
ecumenist
2
ecumenic
38
1
4
3
2

2
m
4
1
2
Ecuador
38
1
4
3
2
o
2

4
2
2
ectopic
2
ectoderm
38
1
4
3
2
ta
2

4
2
2
ecstatic
2
ecstasy
38
1
4
3
2

2
c
4
1
2
economist
38
1
4
3
2
tric
2

4
2
2
Econometrica
2
econometric
38
1
4
3
2
om
2
ei
4
1
2
economy
38
1
4
3
2

2

4
2
2
ecology
2
Ecole
38
1
4
3
2

2
ln
4
1
2
ecosystem
38
1
4
3
2
p
2

4
2
2
ecliptic
2
eclipse
38
1
4
3
2

2
i
4
3
2
eclogue
2
eclectic
2
eclat
38
1
4
3
2

2

4
2
2
echoes
2
echo
38
1
4
3
2

2

4
2
2
echinoderm
2
echidna
38
1
4
3
2

2
io
4
1
2
echelon
38
1
4
3
2

2
l
4
1
2
eccentric
38
1
4
3
2
es
2

4
2
2
ecclesiastic
2
Eccles
38
1
4
3
2

2
chlostu
4
0
38
1
4
3
2

2

4
4
2
ebullient
2
ebony
2
Eben
2
ebb
38
1
4
3
2
drop
2

4
2
2
eavesdropping
2
eavesdrop
38
1
4
3
2
e
2
s
4
1
2
eave
38
1
4
3
2

2

4
2
2
eater
2
eaten
38
1
4
3
2

2
e
4
2
2
Eaton
2
eat
38
1
4
3
2

2

4
2
2
easygoing
2
easy
38
1
4
3
2

2

4
2
2
Eastwood
2
eastward
38
1
4
3
2
rn
2

4
2
2
easternmost
2
eastern
38
1
4
3
2

2
ew
4
4
2
Eastman
2
Eastland
2
eastbound
2
east
38
1
4
3
2

2

4
2
2
easel
2
ease
38
1
4
3
2

2
etyi
4
0
38
1
4
3
2
v
2

4
2
2
earthmoving
2
earthmover
38
1
4
3
2

2
o
4
1
2
earthmen
38
1
4
3
2
n
2

4
2
2
earthenware
2
earthen
38
1
4
3
2
h
2
em
4
4
2
earthy
2
earthworm
2
earthquake
2
earth
38
1
4
3
2

2
i
4
2
2
earnest
2
earn
38
1
4
3
2

2
ntl
4
7
2
earwig
2
earsplitting
2
earring
2
earphone
2
earmark
2
eardrum
2
ear
38
1
4
3
2

2
e
4
2
2
eagle
2
Eagan
38
1
4
3
2

2
grstv
4
1
2
each
38
1
4
3
2

2
abcdefghijklmnopqr'stuvxyz
4
2
2
ewe
2
e
38
1
4
3
2

2

4
3
2
dysprosium
2
dysplasia
2
dyspeptic
38
1
4
3
2

2
p
4
2
2
dystrophy
2
dysentery
38
1
4
3
2

2
ms
4
0
38
1
4
3
2
t
2

4
3
2
dynasty
2
dynastic
2
dynast
38
1
4
3
2

2
i
4
1
2
dynamo
38
1
4
3
2

2

4
3
2
dynamite
2
dynamism
2
dynamic
38
1
4
3
2

2
a
4
1
2
dyne
38
1
4
3
2

2

4
2
2
dyeing
2
dye
38
1
4
3
2
d
2

4
2
2
dyadic
2
dyad
38
1
4
3
2

2
aens
4
3
2
Dylan
2
Dyke
2
dying
38
1
4
3
2

2

4
2
2
dwindle
2
Dwight
38
1
4
3
2
l
2

4
2
2
dwelt
2
dwell
38
1
4
3
2
r
2

4
2
2
dwarves
2
dwarf
38
1
4
3
2

2
aei
4
1
2
Dwyer
38
1
4
3
2

2

4
2
2
dutiful
2
dutiable
38
1
4
3
2
h
2
m
4
2
2
dutchess
2
Dutch
38
1
4
3
2

2

4
2
2
Dutchmen
2
Dutchman
38
1
4
3
2

2
ci
4
2
2
duty
2
Dutton
38
1
4
3
2

2

4
3
2
dusty
2
dustbin
2
dust
38
1
4
3
2

2

4
2
2
dusky
2
dusk
38
1
4
3
2
nb
2

4
2
2
Dusenbury
2
Dusenberg
38
1
4
3
2

2
ekt
4
1
2
Dusseldorf
38
1
4
3
2

2

4
2
2
Durkin
2
Durkee
38
1
4
3
2

2

4
2
2
duress
2
Durer
38
1
4
3
2

2
n
4
2
2
duration
2
durable
38
1
4
3
2

2

4
2
2
Durango
2
durance
38
1
4
3
2

2
aek
4
4
2
Durward
2
Durrell
2
during
2
Durham
38
1
4
3
2

2

4
2
2
duplicate
2
duplicable
38
1
4
3
2
c
2
a
4
1
2
duplicity
38
1
4
3
2

2
i
4
1
2
duplex
38
1
4
3
2

2
l
4
2
2
DuPont
2
dupe
38
1
4
3
2
pol
2

4
2
2
duopoly
2
duopolist
38
1
4
3
2

2

4
2
2
Dunlop
2
Dunlap
38
1
4
3
2

2

4
2
2
Dunkirk
2
dunk
38
1
4
3
2

2

4
2
2
dungeon
2
dung
38
1
4
3
2

2

4
2
2
Dunedin
2
dune
38
1
4
3
2

2

4
2
2
dunce
2
Duncan
38
1
4
3
2

2
cegkl
4
4
2
Dunn
2
Dunham
2
Dunbar
2
dun
38
1
4
3
2

2

4
4
2
dumped
2
dumpy
2
Dumpty
2
dump
38
1
4
3
2

2

4
2
2
dumbbell
2
dumb
38
1
4
3
2

2
bp
4
2
2
dummy
2
Duma
38
1
4
3
2

2

4
2
2
dully
2
dull
38
1
4
3
2

2
l
4
4
2
duly
2
Duluth
2
dulse
2
dulcet
38
1
4
3
2

2

4
3
2
dugout
2
Dugan
2
dug
38
1
4
3
2
f
2

4
3
2
Duffy
2
duffel
2
duff
38
1
4
3
2

2

4
4
2
dues
2
duet
2
duel
2
due
38
1
4
3
2

2

4
2
2
Dudley
2
dud
38
1
4
3
2

2

4
3
2
ductwork
2
ductile
2
duct
38
1
4
3
2

2

4
2
2
duckling
2
duck
38
1
4
3
2

2
kt
4
2
2
duchess
2
ducat
38
1
4
3
2

2

4
2
2
dubitable
2
dubious
38
1
4
3
2

2
i
4
3
2
Dublin
2
Dubhe
2
dub
38
1
4
3
2

2

4
2
2
Duane
2
dual
38
1
4
3
2

2
abcdefglmnoprst
4
3
2
Duquesne
2
duke
2
du
38
1
4
3
2

2

4
3
2
Dryden
2
dryad
2
dry
38
1
4
3
2
k
2

4
3
2
drunken
2
drunkard
2
drunk
38
1
4
3
2

2

4
4
2
Drummond
2
drumlin
2
drumhead
2
drum
38
1
4
3
2

2

4
3
2
drugstore
2
drugging
2
drug
38
1
4
3
2
ge
2

4
2
2
drudgery
2
drudge
38
1
4
3
2

2
dgmn
4
3
2
Drury
2
druid
2
drub
38
1
4
3
2

2

4
2
2
drowsy
2
drowse
38
1
4
3
2

2
s
4
1
2
drown
38
1
4
3
2

2

4
2
2
dross
2
drosophila
38
1
4
3
2

2

4
4
2
dropout
2
droplet
2
drophead
2
drop
38
1
4
3
2

2

4
2
2
droopy
2
droop
38
1
4
3
2

2
p
4
1
2
drool
38
1
4
3
2

2
opsw
4
5
2
drove
2
drought
2
drone
2
dromedary
2
droll
38
1
4
3
2
zl
2

4
2
2
drizzly
2
drizzle
38
1
4
3
2

2
e
4
1
2
driving
38
1
4
3
2

2

4
2
2
drippy
2
drip
38
1
4
3
2

2

4
2
2
dribble
2
drib
38
1
4
3
2

2
bpvz
4
4
2
Driscoll
2
drink
2
drill
2
drift
38
1
4
3
2
s
2

4
3
2
dressy
2
dressmake
2
dress
38
1
4
3
2

2
dm
4
1
2
dreary
38
1
4
3
2

2

4
4
2
dreamy
2
dreamt
2
dreamboat
2
dream
38
1
4
3
2

2

4
3
2
dreadnought
2
dreadful
2
dread
38
1
4
3
2

2
as
4
6
2
Dreyfuss
2
Drexel
2
drew
2
drench
2
dreg
2
dredge
38
1
4
3
2

2

4
2
2
drawbridge
2
drawback
38
1
4
3
2

2
b
4
3
2
drawn
2
drawl
2
draw
38
1
4
3
2
e
2

4
2
2
drapery
2
drape
38
1
4
3
2

2

4
2
2
dramatist
2
dramatic
38
1
4
3
2

2
i
4
1
2
dramaturgy
38
1
4
3
2

2
t
4
1
2
drama
38
1
4
3
2

2
a
4
1
2
dram
38
1
4
3
2
n
2

4
2
2
drainage
2
drain
38
1
4
3
2

2

4
3
2
dragonhead
2
dragonfly
2
dragon
38
1
4
3
2

2
n
4
1
2
dragoon
38
1
4
3
2

2
o
4
3
2
dragnet
2
dragging
2
drag
38
1
4
3
2

2

4
2
2
draftsmen
2
draftsman
38
1
4
3
2

2
m
4
1
2
draftsperson
38
1
4
3
2
t
2
s
4
3
2
drafty
2
draftee
2
draft
38
1
4
3
2

2
fgimpw
4
5
2
drastic
2
drank
2
drake
2
Draco
2
drab
38
1
4
3
2

2
aeiouy
4
1
2
Dr
38
1
4
3
2
e
2
n
4
1
2
doze
38
1
4
3
2

2

4
2
2
downwind
2
downward
38
1
4
3
2

2

4
2
2
downtrodden
2
downtrend
38
1
4
3
2

2
r
4
2
2
downturn
2
downtown
38
1
4
3
2

2

4
2
2
downstream
2
downstairs
38
1
4
3
2

2
t
4
3
2
downspout
2
downslope
2
downside
38
1
4
3
2

2

4
2
2
downpour
2
downplay
38
1
4
3
2

2
pstw
4
9
2
downright
2
downhill
2
downgrade
2
downfall
2
Downey
2
downdraft
2
downcast
2
downbeat
2
down
38
1
4
3
2

2
n
4
6
2
dowry
2
Dowling
2
dowitcher
2
dowel
2
dowager
2
Dow
38
1
4
3
2
e
2

4
3
2
dovetail
2
dovekie
2
dove
38
1
4
3
2
as
2

4
2
2
Douglass
2
Douglas
38
1
4
3
2

2

4
3
2
doughnut
2
Dougherty
2
dough
38
1
4
3
2

2
hl
4
1
2
Doug
38
1
4
3
2

2
lt
4
0
38
1
4
3
2

2

4
2
2
doubtful
2
doubt
38
1
4
3
2

2
e
4
1
2
doubloon
38
1
4
3
2

2
t
4
3
2
doubleheader
2
Doubleday
2
double
38
1
4
3
2

2

4
2
2
doubleton
2
doublet
38
1
4
3
2

2
bg
4
3
2
douse
2
dour
2
douce
38
1
4
3
2

2

4
2
2
dote
2
dot
38
1
4
3
2

2

4
5
2
Dostoevsky
2
dossier
2
dosimeter
2
dose
2
dosage
38
1
4
3
2
th
2

4
2
2
Dorothy
2
Dorothea
38
1
4
3
2

2

4
2
2
dormitory
2
dormant
38
1
4
3
2

2

4
3
2
Doris
2
Doric
2
Doria
38
1
4
3
2

2

4
2
2
Dorchester
2
Dorcas
38
1
4
3
2

2

4
2
2
Dorado
2
Dora
38
1
4
3
2

2
acimo
4
3
2
Dortmund
2
Dorset
2
Doreen
38
1
4
3
2

2

4
3
2
Doppler
2
dope
2
dopant
38
1
4
3
2

2

4
2
2
doormen
2
doorman
38
1
4
3
2
ep
2

4
2
2
doorkeeper
2
doorkeep
38
1
4
3
2

2
e
4
1
2
doorknob
38
1
4
3
2

2
kms
4
3
2
doorway
2
doorbell
2
door
38
1
4
3
2

2

4
2
2
doomsday
2
doom
38
1
4
3
2

2

4
2
2
Doolittle
2
Dooley
38
1
4
3
2

2
lmr
4
1
2
doodle
38
1
4
3
2

2

4
2
2
Donovan
2
donor
38
1
4
3
2

2

4
2
2
Donner
2
Donnelly
38
1
4
3
2

2
e
4
2
2
donnybrook
2
Donna
38
1
4
3
2

2

4
2
2
Doneck
2
done
38
1
4
3
2
d
2

4
2
2
Donaldson
2
Donald
38
1
4
3
2

2
l
4
2
2
donate
2
Donahue
38
1
4
3
2

2
aeno
4
3
2
don't
2
donkey
2
don
38
1
4
3
2

2

4
3
2
Dominick
2
Dominican
2
Dominic
38
1
4
3
2

2
c
4
2
2
Dominique
2
dominion
38
1
4
3
2

2

4
2
2
dominate
2
dominant
38
1
4
3
2

2
ai
4
3
2
domino
2
Domingo
2
domineer
38
1
4
3
2

2
n
4
1
2
domicile
38
1
4
3
2

2

4
2
2
domestic
2
Domesday
38
1
4
3
2

2
s
4
2
2
Domenico
2
dome
38
1
4
3
2

2
ei
4
1
2
domain
38
1
4
3
2

2

4
2
2
doltish
2
dolt
38
1
4
3
2
it
2

4
2
2
dolomitic
2
dolomite
38
1
4
3
2

2
m
4
1
2
Dolores
38
1
4
3
2

2
a
4
3
2
dolly
2
dollop
2
doll
38
1
4
3
2

2

4
2
2
doleful
2
dole
38
1
4
3
2

2
elot
4
4
2
dolphin
2
doldrum
2
dolce
2
Dolan
38
1
4
3
2

2

4
2
2
dogtrot
2
dogtooth
38
1
4
3
2
i
2

4
2
2
dogmatism
2
dogmatic
38
1
4
3
2
a
2
t
4
1
2
dogma
38
1
4
3
2

2

4
2
2
doggone
2
dogging
38
1
4
3
2

2

4
2
2
dogberry
2
dogbane
38
1
4
3
2

2
bgmt
4
6
2
dogwood
2
dogleg
2
doghouse
2
dogfish
2
Doge
2
dog
38
1
4
3
2

2
s
4
1
2
doe
38
1
4
3
2

2

4
2
2
dodecahedral
2
dodecahedra
38
1
4
3
2
cahedr
2
a
4
1
2
dodecahedron
38
1
4
3
2

2
e
4
5
2
Dodson
2
dodo
2
dodge
2
Dodd
2
DOD
38
1
4
3
2

2

4
2
2
documentation
2
documentary
38
1
4
3
2
ment
2
a
4
1
2
document
38
1
4
3
2

2

4
2
2
doctrinal
2
doctrinaire
38
1
4
3
2
in
2
a
4
1
2
doctrine
38
1
4
3
2
r
2
a
4
1
2
doctor
38
1
4
3
2

2

4
2
2
doctorate
2
doctoral
38
1
4
3
2

2
or
4
0
38
1
4
3
2

2

4
4
2
dockyard
2
dockside
2
docket
2
dock
38
1
4
3
2

2
ktu
4
1
2
docile
38
1
4
3
2

2

4
2
2
Dobbs
2
Dobbin
38
1
4
3
2

2
b
4
2
2
dobson
2
doberman
38
1
4
3
2

2
bcdeglmnoprstuvwz
4
5
2
doing
2
Doyle
2
Doherty
2
doff
2
do
38
1
4
3
2

2

4
2
2
Dnieper
2
DNA
38
1
4
3
2
e
2

4
2
2
dixieland
2
Dixie
38
1
4
3
2

2
i
4
1
2
Dixon
38
1
4
3
2
rce
2

4
2
2
divorcee
2
divorce
38
1
4
3
2

2

4
3
2
divisive
2
division
2
divisible
38
1
4
3
2

2
i
4
1
2
divisor
38
1
4
3
2

2

4
2
2
divine
2
divination
38
1
4
3
2
e
2

4
2
2
dividend
2
divide
38
1
4
3
2

2
dns
4
0
38
1
4
3
2
t
2

4
2
2
divestiture
2
divest
38
1
4
3
2
n
2

4
2
2
diversionary
2
diversion
38
1
4
3
2

2
o
4
1
2
diversify
38
1
4
3
2

2
i
4
1
2
diverse
38
1
4
3
2
e
2

4
2
2
divergent
2
diverge
38
1
4
3
2

2
gs
4
1
2
divert
38
1
4
3
2

2
rs
4
1
2
dive
38
1
4
3
2

2

4
3
2
divan
2
divalent
2
diva
38
1
4
3
2

2
aeio
4
1
2
divulge
38
1
4
3
2

2

4
2
2
ditty
2
ditto
38
1
4
3
2

2
t
4
2
2
dither
2
ditch
38
1
4
3
2
rb
2

4
2
2
disturbance
2
disturb
38
1
4
3
2
ut
2
i
4
1
2
distributor
38
1
4
3
2

2

4
2
2
distributive
2
distribution
38
1
4
3
2

2
b
4
1
2
district
38
1
4
3
2

2
i
4
1
2
distraught
38
1
4
3
2

2

4
2
2
distinguish
2
distinct
38
1
4
3
2
l
2

4
2
2
distillery
2
distillate
38
1
4
3
2

2
ln
4
0
38
1
4
3
2

2

4
3
2
distant
2
distal
2
distaff
38
1
4
3
2

2
airu
4
1
2
distort
38
1
4
3
2

2

4
2
2
dissipate
2
dissident
38
1
4
3
2

2
m
4
2
2
dissertation
2
dissension
38
1
4
3
2

2

4
2
2
disseminate
2
dissemble
38
1
4
3
2

2
ei
4
2
2
dissuade
2
dissociate
38
1
4
3
2

2

4
2
2
disruptive
2
disruption
38
1
4
3
2
upt
2
i
4
1
2
disrupt
38
1
4
3
2
ui
2

4
2
2
disquisition
2
disquietude
38
1
4
3
2
t
2

4
2
2
dispute
2
disputant
38
1
4
3
2
sa
2

4
2
2
disposal
2
disposable
38
1
4
3
2

2

4
3
2
dispersive
2
dispersion
2
dispersible
38
1
4
3
2
s
2
i
4
2
2
disperse
2
dispersal
38
1
4
3
2

2

4
3
2
dispensate
2
dispensary
2
dispensable
38
1
4
3
2
s
2
a
4
1
2
dispense
38
1
4
3
2

2
l
4
1
2
dispel
38
1
4
3
2

2

4
2
2
dispelling
2
dispelled
38
1
4
3
2

2
lnr
4
0
38
1
4
3
2
ra
2

4
2
2
disparate
2
disparage
38
1
4
3
2

2
aeou
4
1
2
display
38
1
4
3
2
ey
2

4
2
2
Disneyland
2
Disney
38
1
4
3
2

2

4
2
2
dismissal
2
dismal
38
1
4
3
2
a
2

4
2
2
dishwater
2
dishwasher
38
1
4
3
2

2
w
4
2
2
dishevel
2
dish
38
1
4
3
2

2

4
2
2
disgustful
2
disgruntle
38
1
4
3
2
ain
2

4
2
2
disdainful
2
disdain
38
1
4
3
2

2

4
3
2
discussion
2
discussant
2
discuss
38
1
4
3
2
s
2
s
4
1
2
discus
38
1
4
3
2

2

4
2
2
discriminatory
2
discriminate
38
1
4
3
2
mina
2
t
4
2
2
discriminant
2
discriminable
38
1
4
3
2

2
t
4
2
2
discrepant
2
discreet
38
1
4
3
2
on
2

4
2
2
discretionary
2
discretion
38
1
4
3
2

2
i
4
1
2
discrete
38
1
4
3
2

2
ei
4
0
38
1
4
3
2

2

4
4
2
discovery
2
discordant
2
discomfit
2
discoid
38
1
4
3
2
n
2

4
2
2
discipline
2
disciplinary
38
1
4
3
2
pl
2
i
4
1
2
disciple
38
1
4
3
2
rn
2

4
2
2
discernible
2
discern
38
1
4
3
2

2
eioru
4
2
2
discarded
2
disc
38
1
4
3
2

2

4
5
2
disappears
2
disagree
2
disastrous
2
disambiguate
2
disaccharide
38
1
4
3
2

2
acdghmnpqrst
4
7
2
disyllable
2
disulfide
2
disk
2
disjunct
2
disembowel
2
disburse
2
Dis
38
1
4
3
2

2

4
2
2
dirty
2
dirt
38
1
4
3
2
i
2

4
2
2
directrix
2
directrices
38
1
4
3
2
r
2

4
3
2
directory
2
directorate
2
director
38
1
4
3
2
t
2
or
4
3
2
directed
2
directly
2
direct
38
1
4
3
2

2
c
4
1
2
dire
38
1
4
3
2

2
et
4
3
2
Dirichlet
2
dirge
2
Dirac
38
1
4
3
2

2

4
2
2
diplomatic
2
diplomat
38
1
4
3
2
a
2
t
4
2
2
diplomacy
2
diploma
38
1
4
3
2
d
2

4
2
2
diploidy
2
diploid
38
1
4
3
2
o
2
im
4
0
38
1
4
3
2
th
2

4
2
2
diphthong
2
diphtheria
38
1
4
3
2

2
hl
4
2
2
dipole
2
dip
38
1
4
3
2

2

4
2
2
diorite
2
diorama
38
1
4
3
2

2

4
2
2
diopter
2
Diophantine
38
1
4
3
2
ys
2

4
2
2
Dionysus
2
Dionysian
38
1
4
3
2
es
2

4
2
2
diocese
2
diocesan
38
1
4
3
2

2
cnpr
4
2
2
dioxide
2
diode
38
1
4
3
2
er
2

4
2
2
dinnerware
2
dinnertime
38
1
4
3
2

2

4
4
2
dingy
2
dingo
2
dinghy
2
ding
38
1
4
3
2

2
gn
4
5
2
dint
2
dinosaur
2
dine
2
Dinah
2
din
38
1
4
3
2
ti
2

4
2
2
diminutive
2
diminution
38
1
4
3
2
n
2
u
4
1
2
diminish
38
1
4
3
2

2

4
3
2
dimethyl
2
dimension
2
dime
38
1
4
3
2

2
ei
4
2
2
dimple
2
dim
38
1
4
3
2

2

4
2
2
dilution
2
dilute
38
1
4
3
2

2
t
4
1
2
diluent
38
1
4
3
2

2

4
2
2
Dillon
2
dill
38
1
4
3
2

2

4
2
2
dilettante
2
dilemma
38
1
4
3
2

2
t
4
1
2
dilapidate
38
1
4
3
2

2

4
3
2
dilatory
2
dilate
2
dilatation
38
1
4
3
2

2
aelu
4
2
2
dilogarithm
2
diligent
38
1
4
3
2
ss
2

4
2
2
digression
2
digress
38
1
4
3
2

2
e
4
1
2
digram
38
1
4
3
2

2

4
2
2
dignity
2
dignitary
38
1
4
3
2
i
2
t
4
1
2
dignify
38
1
4
3
2
l
2

4
2
2
digitalis
2
digital
38
1
4
3
2
t
2
a
4
1
2
digit
38
1
4
3
2

2

4
3
2
digestive
2
digestion
2
digestible
38
1
4
3
2
st
2
i
4
1
2
digest
38
1
4
3
2

2
einr
4
2
2
digging
2
dig
38
1
4
3
2

2
eiru
4
0
38
1
4
3
2

2

4
3
2
diffusive
2
diffusion
2
diffusible
38
1
4
3
2
s
2
i
4
1
2
diffuse
38
1
4
3
2
act
2

4
2
2
diffractometer
2
diffract
38
1
4
3
2
ult
2

4
2
2
difficulty
2
difficult
38
1
4
3
2

2
c
4
1
2
diffident
38
1
4
3
2

2
or
4
0
38
1
4
3
2
a
2

4
3
2
differentiate
2
differential
2
differentiable
38
1
4
3
2
nt
2
i
4
2
2
differently
2
different
38
1
4
3
2

2
e
4
1
2
differ
38
1
4
3
2
morphi
2

4
2
2
diffeomorphism
2
diffeomorphic
38
1
4
3
2

2
f
4
1
2
difluoride
38
1
4
3
2

2

4
8
2
Dietz
2
diety
2
Dietrich
2
dietician
2
diethylstilbestrol
2
dietetic
2
dietary
2
diet
38
1
4
3
2

2

4
2
2
dielectric
2
dieldrin
38
1
4
3
2

2
lt
4
6
2
diesel
2
diem
2
diehard
2
Diego
2
Diebold
2
die
38
1
4
3
2

2

4
5
2
Dido
2
didn't
2
diddle
2
didactic
2
did
38
1
4
3
2
on
2

4
2
2
dictionary
2
diction
38
1
4
3
2

2
t
4
1
2
dicta
38
1
4
3
2

2

4
2
2
dictatorial
2
dictate
38
1
4
3
2

2
ai
4
1
2
dictum
38
1
4
3
2

2

4
3
2
dickey
2
Dickerson
2
dickens
38
1
4
3
2

2
e
4
4
2
Dickson
2
Dickinson
2
dickcissel
2
dick
38
1
4
3
2

2

4
2
2
dichotomy
2
dichondra
38
1
4
3
2

2
o
4
1
2
dichloride
38
1
4
3
2

2
hkt
4
2
2
dicotyledon
2
dice
38
1
4
3
2

2
bcglmnpt
4
2
2
diary
2
diadem
38
1
4
3
2

2

4
3
2
diatomic
2
diatomaceous
2
diatom
38
1
4
3
2

2
m
4
1
2
diatonic
38
1
4
3
2
e
2

4
2
2
diathesis
2
diathermy
38
1
4
3
2

2
ho
4
0
38
1
4
3
2

2

4
2
2
diaphragm
2
diaphanous
38
1
4
3
2

2
h
4
2
2
diapason
2
diaper
38
1
4
3
2

2

4
3
2
Dianne
2
Diane
2
Diana
38
1
4
3
2
gneti
2

4
2
2
diamagnetism
2
diamagnetic
38
1
4
3
2

2
a
4
2
2
diamond
2
diameter
38
1
4
3
2
ct
2

4
2
2
dialectic
2
dialect
38
1
4
3
2

2
e
4
4
2
dialysis
2
dialup
2
dialogue
2
dial
38
1
4
3
2
am
2

4
2
2
diagrammatic
2
diagram
38
1
4
3
2
os
2
t
4
3
2
diagnosis
2
diagnose
2
diagnosable
38
1
4
3
2
ic
2

4
2
2
diagnostician
2
diagnostic
38
1
4
3
2

2
nr
4
1
2
diagonal
38
1
4
3
2

2

4
2
2
diacritic
2
diachronic
38
1
4
3
2

2
e
4
2
2
diabolic
2
diabase
38
1
4
3
2
t
2

4
2
2
diabetic
2
diabetes
38
1
4
3
2

2
acdefglmnoprstvx
4
4
2
dizzy
2
diurnal
2
dihedral
2
dibble
38
1
4
3
2
a
2

4
2
2
dharma
2
Dhabi
38
1
4
3
2
o
2

4
2
2
dextrous
2
dextrose
38
1
4
3
2
r
2

4
2
2
dexterity
2
dexter
38
1
4
3
2
t
2
er
4
0
38
1
4
3
2

2

4
6
2
dewy
2
Dewitt
2
Dewey
2
dewdrop
2
dewar
2
dew
38
1
4
3
2

2

4
2
2
devout
2
devour
38
1
4
3
2

2

4
2
2
devotee
2
devote
38
1
4
3
2

2
e
4
1
2
devotion
38
1
4
3
2

2

4
2
2
Devonshire
2
Devon
38
1
4
3
2

2
ntu
4
2
2
devolve
2
devoid
38
1
4
3
2
e
2

4
2
2
devisee
2
devise
38
1
4
3
2

2

4
2
2
devilish
2
devil
38
1
4
3
2

2

4
2
2
deviate
2
deviant
38
1
4
3
2

2
als
4
2
2
devious
2
device
38
1
4
3
2

2
ioe
4
1
2
devastate
38
1
4
3
2
er
2

4
2
2
deuterium
2
deuterate
38
1
4
3
2

2
t
4
2
2
deus
2
deuce
38
1
4
3
2
ct
2

4
2
2
detractor
2
detract
38
1
4
3
2

2
a
4
2
2
Detroit
2
detriment
38
1
4
3
2
a
2

4
2
2
detonate
2
detonable
38
1
4
3
2

2
n
4
2
2
detoxify
2
detour
38
1
4
3
2
t
2

4
2
2
detestation
2
detest
38
1
4
3
2

2

4
2
2
deterrent
2
deterred
38
1
4
3
2

2
e
4
1
2
deterring
38
1
4
3
2

2

4
2
2
determinate
2
determinant
38
1
4
3
2
in
2
a
4
1
2
determine
38
1
4
3
2

2
mr
4
3
2
deteriorate
2
detergent
2
deter
38
1
4
3
2
t
2

4
3
2
detention
2
detente
2
detent
38
1
4
3
2
t
2

4
2
2
detector
2
detect
38
1
4
3
2

2
cnrs
4
0
38
1
4
3
2

2
i
4
1
2
detach
38
1
4
3
2

2

4
4
2
d's
2
d'oeuvre
2
d'etat
2
d'art
38
1
4
3
2

2

4
2
2
detain
2
detail
38
1
4
3
2

2
aeor
4
0
38
1
4
3
2

2

4
2
2
desultory
2
desuetude
38
1
4
3
2
ct
2

4
2
2
destructor
2
destruct
38
1
4
3
2

2
u
4
1
2
destroy
38
1
4
3
2

2
n
4
1
2
destitute
38
1
4
3
2

2

4
3
2
destiny
2
destine
2
destinate
38
1
4
3
2

2
ir
4
0
38
1
4
3
2

2

4
2
2
dessicate
2
dessert
38
1
4
3
2

2

4
2
2
despotic
2
despot
38
1
4
3
2
d
2

4
2
2
despondent
2
despond
38
1
4
3
2

2
nt
4
1
2
despoil
38
1
4
3
2

2

4
3
2
despite
2
despise
2
despicable
38
1
4
3
2
ra
2

4
2
2
desperate
2
desperado
38
1
4
3
2

2
eio
4
1
2
despair
38
1
4
3
2
ate
2

4
2
2
desolater
2
desolate
38
1
4
3
2

2
l
4
1
2
desorption
38
1
4
3
2

2

4
2
2
desirous
2
desire
38
1
4
3
2
n
2

4
4
2
designs
2
designed
2
designate
2
design
38
1
4
3
2
erat
2

4
2
2
desideratum
2
desiderata
38
1
4
3
2

2
dgr
4
1
2
desist
38
1
4
3
2

2

4
2
2
deserve
2
desert
38
1
4
3
2
rate
2

4
2
2
desecrater
2
desecrate
38
1
4
3
2

2
cr
4
1
2
desegregate
38
1
4
3
2

2

4
2
2
descriptive
2
description
38
1
4
3
2
t
2
i
4
1
2
descriptor
38
1
4
3
2
i
2
pb
4
0
38
1
4
3
2

2

4
3
2
descendent
2
descendant
2
descend
38
1
4
3
2
n
2
d
4
1
2
descent
38
1
4
3
2

2

4
2
2
Descartes
2
descant
38
1
4
3
2

2
aer
4
0
38
1
4
3
2

2
ceiopstu
4
3
2
Desmond
2
desk
2
Des
38
1
4
3
2
i
2

4
2
2
derriere
2
derrick
38
1
4
3
2
gat
2

4
2
2
derogatory
2
derogate
38
1
4
3
2

2

4
2
2
derive
2
derivate
38
1
4
3
2
i
2

4
2
2
derisive
2
derision
38
1
4
3
2

2
sv
4
1
2
deride
38
1
4
3
2

2

4
4
2
derelict
2
Derek
2
deregulate
2
dereference
38
1
4
3
2
y
2

4
2
2
Derbyshire
2
derby
38
1
4
3
2

2

4
3
2
derate
2
derange
2
derail
38
1
4
3
2

2
abeior
4
1
2
dervish
38
1
4
3
2
t
2

4
3
2
deputy
2
depute
2
deputation
38
1
4
3
2
v
2

4
2
2
deprive
2
deprivation
38
1
4
3
2

2

4
3
2
depressive
2
depression
2
depressible
38
1
4
3
2
s
2
i
4
3
2
depressor
2
depressant
2
depress
38
1
4
3
2

2
ai
4
0
38
1
4
3
2
a
2

4
2
2
depreciate
2
depreciable
38
1
4
3
2
t
2

4
2
2
deprecatory
2
deprecate
38
1
4
3
2

2
cs
4
0
38
1
4
3
2

2
ei
4
1
2
deprave
38
1
4
3
2
r
2

4
2
2
depository
2
depositor
38
1
4
3
2
t
2
o
4
3
2
deposition
2
depositary
2
deposit
38
1
4
3
2

2
i
4
1
2
depose
38
1
4
3
2
t
2

4
3
2
deportee
2
deportation
2
deport
38
1
4
3
2

2
rs
4
1
2
depot
38
1
4
3
2

2

4
2
2
deploy
2
deplore
38
1
4
3
2
t
2

4
2
2
depletion
2
deplete
38
1
4
3
2

2
eo
4
0
38
1
4
3
2
nd
2

4
2
2
dependent
2
depend
38
1
4
3
2
rt
2
m
4
2
2
departure
2
depart
38
1
4
3
2

2
aeloru
4
2
2
depth
2
depict
38
1
4
3
2
yribo
2

4
2
2
deoxyribose
2
deoxyribonucleic
38
1
4
3
2

2
x
4
1
2
deodorant
38
1
4
3
2

2

4
2
2
denude
2
denudation
38
1
4
3
2

2
d
4
2
2
denunciate
2
denumerable
38
1
4
3
2

2

4
5
2
denture
2
Denton
2
dentistry
2
dental
2
dent
38
1
4
3
2

2

4
2
2
densitometer
2
dense
38
1
4
3
2

2

4
2
2
denounce
2
denouement
38
1
4
3
2
ti
2

4
2
2
denotative
2
denotation
38
1
4
3
2

2
a
4
1
2
denote
38
1
4
3
2

2
tu
4
1
2
denominate
38
1
4
3
2

2

4
2
2
Denny
2
Dennis
38
1
4
3
2

2

4
2
2
denial
2
deniable
38
1
4
3
2

2
a
4
3
2
denied
2
denizen
2
denigrate
38
1
4
3
2
b
2

4
2
2
Denebola
2
Deneb
38
1
4
3
2
rit
2

4
2
2
dendritic
2
dendrite
38
1
4
3
2

2
deinostu
4
5
2
deny
2
Denver
2
Denmark
2
denature
2
den
38
1
4
3
2

2

4
2
2
demurrer
2
demurred
38
1
4
3
2

2
e
4
1
2
demurring
38
1
4
3
2

2
r
4
2
2
demure
2
demur
38
1
4
3
2

2
r
4
1
2
demultiplex
38
1
4
3
2
tra
2

4
2
2
demonstrate
2
demonstrable
38
1
4
3
2

2

4
2
2
demonic
2
demoniac
38
1
4
3
2

2
is
4
1
2
demon
38
1
4
3
2
i
2

4
2
2
demolition
2
demolish
38
1
4
3
2
ra
2
t
4
1
2
democracy
38
1
4
3
2

2

4
2
2
democratic
2
democrat
38
1
4
3
2

2
cln
4
4
2
demountable
2
demote
2
demography
2
demodulate
38
1
4
3
2

2

4
2
2
demitting
2
demitted
38
1
4
3
2

2
t
4
1
2
demit
38
1
4
3
2

2

4
2
2
demise
2
demiscible
38
1
4
3
2

2
st
4
2
2
demijohn
2
demigod
38
1
4
3
2
t
2

4
2
2
dementia
2
demented
38
1
4
3
2

2
n
4
2
2
demerit
2
demean
38
1
4
3
2

2
grn
4
0
38
1
4
3
2

2

4
2
2
demark
2
demarcate
38
1
4
3
2

2

4
2
2
demagogue
2
demagnify
38
1
4
3
2

2
aeiou
4
2
2
demystify
2
Dempsey
38
1
4
3
2
i
2

4
2
2
delusive
2
delusion
38
1
4
3
2

2
s
4
3
2
deluxe
2
deluge
2
delude
38
1
4
3
2

2

4
2
2
deltoid
2
delta
38
1
4
3
2

2

4
3
2
Delphinus
2
delphinium
2
delphine
38
1
4
3
2
hi
2
n
4
2
2
Delphic
2
Delphi
38
1
4
3
2

2

4
2
2
Della
2
dell
38
1
4
3
2
er
2

4
3
2
delivery
2
deliverance
2
deliver
38
1
4
3
2
i
2

4
2
2
delirium
2
delirious
38
1
4
3
2
uesce
2

4
2
2
deliquescent
2
deliquesce
38
1
4
3
2
a
2

4
2
2
delineate
2
delineament
38
1
4
3
2

2
e
4
1
2
delinquent
38
1
4
3
2
it
2

4
2
2
delimitation
2
delimit
38
1
4
3
2
ht
2

4
2
2
delightful
2
delight
38
1
4
3
2

2
t
4
1
2
delicacy
38
1
4
3
2
e
2

4
2
2
delicatessen
2
delicate
38
1
4
3
2

2
a
4
2
2
delicti
2
delicious
38
1
4
3
2

2
cgmnqrvb
4
2
2
Delilah
2
Delia
38
1
4
3
2

2

4
3
2
deleted
2
deleterious
2
delete
38
1
4
3
2

2
e
4
1
2
deletion
38
1
4
3
2
a
2

4
2
2
delegate
2
delegable
38
1
4
3
2
ta
2

4
2
2
delectate
2
delectable
38
1
4
3
2

2
cgt
4
0
38
1
4
3
2

2

4
2
2
Delano
2
Delaney
38
1
4
3
2

2
n
4
2
2
delay
2
Delaware
38
1
4
3
2

2
aeilptu
4
6
2
delve
2
delouse
2
Delmarva
2
Delhi
2
Delft
2
Del
38
1
4
3
2

2

4
2
2
deject
2
deja
38
1
4
3
2

2

4
3
2
deity
2
deign
2
deify
38
1
4
3
2

2

4
2
2
dehydrate
2
dehumidify
38
1
4
3
2
m
2

4
2
2
degumming
2
degum
38
1
4
3
2

2

4
2
2
degree
2
degrease
38
1
4
3
2
d
2

4
2
2
degrade
2
degradation
38
1
4
3
2

2
ae
4
0
38
1
4
3
2
nera
2

4
2
2
degenerate
2
degeneracy
38
1
4
3
2
s
2

4
2
2
degassing
2
degas
38
1
4
3
2

2
aeru
4
0
38
1
4
3
2

2

4
2
2
defray
2
defraud
38
1
4
3
2

2
a
4
1
2
defrost
38
1
4
3
2

2

4
2
2
deformation
2
deform
38
1
4
3
2
st
2

4
2
2
deforestation
2
deforest
38
1
4
3
2

2
em
4
0
38
1
4
3
2

2
r
4
1
2
defocus
38
1
4
3
2
ct
2

4
2
2
deflector
2
deflect
38
1
4
3
2
te
2

4
2
2
deflater
2
deflate
38
1
4
3
2

2
ae
4
0
38
1
4
3
2

2

4
2
2
definitive
2
definition
38
1
4
3
2
t
2
ie
4
0
38
1
4
3
2

2
ie
4
0
38
1
4
3
2
i
2

4
2
2
deficit
2
deficient
38
1
4
3
2

2
cn
4
1
2
defiant
38
1
4
3
2

2

4
3
2
deferring
2
deferred
2
deferrable
38
1
4
3
2

2
r
4
2
2
deferent
2
defer
38
1
4
3
2

2
i
4
1
2
defense
38
1
4
3
2

2

4
2
2
defendant
2
defend
38
1
4
3
2

2
ds
4
0
38
1
4
3
2

2

4
2
2
defector
2
defect
38
1
4
3
2

2
t
4
1
2
defecate
38
1
4
3
2

2
cnr
4
1
2
defeat
38
1
4
3
2

2
u
4
1
2
deface
38
1
4
3
2

2
aeilor
4
3
2
defy
2
defunct
2
deft
38
1
4
3
2

2

4
2
2
deerstalker
2
deerskin
38
1
4
3
2

2
s
4
2
2
Deere
2
deer
38
1
4
3
2

2

4
2
2
deepen
2
deep
38
1
4
3
2

2
pr
4
3
2
deem
2
deed
2
Dee
38
1
4
3
2

2

4
2
2
deductible
2
deduct
38
1
4
3
2
c
2
t
4
2
2
deducible
2
deduce
38
1
4
3
2

2
u
4
1
2
dedicate
38
1
4
3
2
t
2

4
2
2
decryption
2
decrypt
38
1
4
3
2

2
p
4
1
2
decry
38
1
4
3
2

2
e
4
2
2
decrement
2
decrease
38
1
4
3
2

2

4
2
2
decreeing
2
decree
38
1
4
3
2

2
ey
4
0
38
1
4
3
2

2

4
5
2
decorum
2
decorticate
2
decorous
2
decorate
2
decor
38
1
4
3
2
ol
2

4
2
2
deconvolve
2
deconvolution
38
1
4
3
2
rol
2
l
4
1
2
decontrol
38
1
4
3
2

2

4
2
2
decontrolling
2
decontrolled
38
1
4
3
2

2
tv
4
0
38
1
4
3
2
ess
2

4
2
2
decompression
2
decompress
38
1
4
3
2
s
2

4
3
2
decomposition
2
decompose
2
decomposable
38
1
4
3
2
p
2
or
4
1
2
decompile
38
1
4
3
2

2

4
2
2
decollimate
2
decolletage
38
1
4
3
2

2
l
4
1
2
decolonize
38
1
4
3
2

2
lmnr
4
2
2
decouple
2
decode
38
1
4
3
2

2

4
2
2
decline
2
declination
38
1
4
3
2

2
n
4
1
2
declivity
38
1
4
3
2

2
mr
4
2
2
declassify
2
declaim
38
1
4
3
2
t
2
io
4
0
38
1
4
3
2
r
2

4
2
2
declaratory
2
declarator
38
1
4
3
2

2

4
2
2
declarative
2
declaration
38
1
4
3
2

2
a
4
1
2
declare
38
1
4
3
2
at
2

4
2
2
declamatory
2
declamation
38
1
4
3
2

2
ai
4
0
38
1
4
3
2
i
2
o
4
1
2
decisive
38
1
4
3
2
a
2

4
2
2
decimate
2
decimal
38
1
4
3
2

2
e
4
2
2
deciding
2
deciduous
38
1
4
3
2

2
dms
4
3
2
decipher
2
decile
2
decibel
38
1
4
3
2
ti
2

4
2
2
deceptive
2
deception
38
1
4
3
2

2

4
2
2
decent
2
decennial
38
1
4
3
2

2

4
2
2
deceitful
2
deceit
38
1
4
3
2

2
t
4
1
2
deceive
38
1
4
3
2

2
inp
4
5
2
decertify
2
December
2
decelerate
2
decedent
2
decease
38
1
4
3
2

2

4
2
2
Decatur
2
decathlon
38
1
4
3
2
e
2

4
2
2
decadent
2
decade
38
1
4
3
2

2
dt
4
3
2
decay
2
decant
2
decal
38
1
4
3
2

2
aeilor
4
3
2
deck
2
Decca
2
Dec
38
1
4
3
2

2

4
2
2
debutante
2
debut
38
1
4
3
2

2
g
4
1
2
debug
38
1
4
3
2

2

4
2
2
debugger
2
debugged
38
1
4
3
2

2
e
4
1
2
debugging
38
1
4
3
2

2
gt
4
2
2
Debussy
2
debunk
38
1
4
3
2

2

4
2
2
debtor
2
debt
38
1
4
3
2

2

4
2
2
debris
2
debrief
38
1
4
3
2

2
i
4
1
2
Debra
38
1
4
3
2

2

4
2
2
Deborah
2
debonair
38
1
4
3
2
it
2

4
2
2
debility
2
debilitate
38
1
4
3
2

2
l
4
1
2
debit
38
1
4
3
2

2

4
2
2
Debby
2
Debbie
38
1
4
3
2

2
rtu
4
2
2
debase
2
debacle
38
1
4
3
2
ch
2

4
2
2
debauchery
2
debauch
38
1
4
3
2
e
2

4
2
2
debater
2
debate
38
1
4
3
2

2

4
2
2
debarring
2
debar
38
1
4
3
2

2
abiortu
4
1
2
debenture
38
1
4
3
2
h
2

4
3
2
deathward
2
deathbed
2
death
38
1
4
3
2

2

4
4
2
dearth
2
dearie
2
Dearborn
2
dear
38
1
4
3
2

2

4
3
2
Deanna
2
Deane
2
dean
38
1
4
3
2

2

4
4
2
deals
2
dealt
2
deallocate
2
deal
38
1
4
3
2

2

4
2
2
deafen
2
deaf
38
1
4
3
2

2

4
2
2
deadlock
2
deadline
38
1
4
3
2

2
l
4
4
2
deadwood
2
deadhead
2
deaden
2
dead
38
1
4
3
2

2
o
4
1
2
deactivate
38
1
4
3
2
n
2

4
2
2
deaconess
2
deacon
38
1
4
3
2

2
cdflnrt
4
0
38
1
4
3
2

2
abcdefghijlmnoprstuvwx
4
2
2
dey
2
De
38
1
4
3
2

2

4
2
2
dazzle
2
daze
38
1
4
3
2
n
2

4
2
2
Daytona
2
Dayton
38
1
4
3
2

2
o
4
1
2
daytime
38
1
4
3
2

2

4
2
2
daybreak
2
daybed
38
1
4
3
2

2
bt
4
4
2
days
2
daylight
2
daydream
2
day
38
1
4
3
2

2

4
2
2
Dawson
2
dawn
38
1
4
3
2

2

4
2
2
Davison
2
Davis
38
1
4
3
2

2

4
2
2
Davidson
2
David
38
1
4
3
2

2
ds
4
2
2
davit
2
Davies
38
1
4
3
2

2

4
2
2
davenport
2
Dave
38
1
4
3
2

2
ei
4
1
2
Davy
38
1
4
3
2
hin
2

4
2
2
dauphine
2
dauphin
38
1
4
3
2
h
2

4
2
2
daughter
2
Daugherty
38
1
4
3
2

2
gp
4
2
2
daunt
2
daub
38
1
4
3
2

2

4
4
2
dates
2
dater
2
dateline
2
date
38
1
4
3
2

2

4
2
2
database
2
data
38
1
4
3
2

2
ae
4
2
2
datum
2
Datsun
38
1
4
3
2

2

4
2
2
dashboard
2
dash
38
1
4
3
2

2
h
4
1
2
dastard
38
1
4
3
2
in
2

4
2
2
Darwinian
2
Darwin
38
1
4
3
2

2

4
2
2
Dartmouth
2
dart
38
1
4
3
2

2

4
2
2
Darry
2
Darrell
38
1
4
3
2

2

4
2
2
darling
2
Darlene
38
1
4
3
2

2

4
3
2
darkle
2
darken
2
dark
38
1
4
3
2

2
klrtw
4
5
2
DARPA
2
darn
2
Darius
2
dare
2
Dar
38
1
4
3
2

2

4
2
2
dapple
2
dapper
38
1
4
3
2

2
p
4
1
2
Daphne
38
1
4
3
2
b
2

4
2
2
Danubian
2
Danube
38
1
4
3
2
l
2

4
2
2
Danielson
2
Daniel
38
1
4
3
2

2
e
4
1
2
Danish
38
1
4
3
2
r
2

4
2
2
dangerous
2
danger
38
1
4
3
2

2
e
4
2
2
dangle
2
dang
38
1
4
3
2

2

4
2
2
dandy
2
dandelion
38
1
4
3
2

2
dgiu
4
9
2
Danzig
2
Dante
2
Danny
2
dank
2
Dane
2
dance
2
Danbury
2
Dana
2
Dan
38
1
4
3
2

2

4
2
2
dampen
2
damp
38
1
4
3
2

2

4
2
2
damnation
2
damn
38
1
4
3
2

2

4
2
2
damask
2
Damascus
38
1
4
3
2

2
s
4
1
2
damage
38
1
4
3
2

2
anp
4
4
2
damsel
2
Damon
2
dame
2
dam
38
1
4
3
2

2

4
2
2
dally
2
Dallas
38
1
4
3
2

2

4
2
2
Daley
2
dale
38
1
4
3
2

2
el
4
4
2
Dalzell
2
Daly
2
Dalton
2
Dalhousie
38
1
4
3
2

2

4
2
2
Dakota
2
Dakar
38
1
4
3
2

2

4
2
2
daisy
2
dais
38
1
4
3
2

2

4
2
2
dairymen
2
dairyman
38
1
4
3
2
y
2
m
4
2
2
Dairylea
2
dairy
38
1
4
3
2

2
rs
4
3
2
dainty
2
Daimler
2
Dailey
38
1
4
3
2

2

4
2
2
dahlia
2
Dahl
38
1
4
3
2

2
l
4
1
2
Dahomey
38
1
4
3
2
f
2

4
2
2
daffy
2
daffodil
38
1
4
3
2

2

4
4
2
Dade
2
daddy
2
Dada
2
dad
38
1
4
3
2
yl
2

4
2
2
dactylic
2
dactyl
38
1
4
3
2

2
t
4
2
2
dachshund
2
Dacca
38
1
4
3
2

2

4
2
2
dabble
2
dab
38
1
4
3
2

2
bcdfhiklmnprstuvwyz
4
2
2
dagger
2
Daedalus
38
1
4
3
2

2
ae'hinoruwy
4
3
2
Djakarta
2
DC
2
d
38
1
4
3
2
h
2

4
2
2
Czechoslovakia
2
Czech
38
1
4
3
2

2
c
4
1
2
Czerniak
38
1
4
3
2
r
2

4
2
2
czarina
2
czar
38
1
4
3
2

2
ae
4
1
2
CZ
38
1
4
3
2
o
2

4
4
2
cytosine
2
cytoplasm
2
cytolysis
2
cytochemistry
38
1
4
3
2
t
2

4
2
2
cysteine
2
cyst
38
1
4
3
2
l
2

4
2
2
Cyrillic
2
Cyril
38
1
4
3
2

2
i
4
1
2
Cyrus
38
1
4
3
2

2

4
2
2
Cypriot
2
Cyprian
38
1
4
3
2
r
2
i
4
2
2
Cyprus
2
cypress
38
1
4
3
2

2
i
4
1
2
Cynthia
38
1
4
3
2
ind
2

4
2
2
cylindric
2
cylinder
38
1
4
3
2

2

4
2
2
cyclotron
2
cyclotomic
38
1
4
3
2

2

4
2
2
Cyclops
2
cyclopean
38
1
4
3
2

2
pt
4
2
2
cyclorama
2
cyclone
38
1
4
3
2

2

4
2
2
cyclist
2
cyclic
38
1
4
3
2

2
io
4
2
2
cycle
2
Cyclades
38
1
4
3
2

2
l
4
1
2
cycad
38
1
4
3
2
n
2
ai
4
0
38
1
4
3
2

2

4
2
2
cyanide
2
cyanic
38
1
4
3
2

2

4
2
2
cyanate
2
Cyanamid
38
1
4
3
2

2
aclnprst
4
2
2
Cygnus
2
cybernetic
38
1
4
3
2
e
2

4
2
2
cuttlefish
2
cuttlebone
38
1
4
3
2

2
l
4
1
2
cutthroat
38
1
4
3
2

2

4
3
2
cutover
2
cutout
2
cutoff
38
1
4
3
2

2

4
2
2
cutlet
2
cutler
38
1
4
3
2

2
e
4
1
2
cutlass
38
1
4
3
2

2
lot
4
6
2
cutworm
2
cutset
2
cute
2
cutback
2
cutaneous
2
cut
38
1
4
3
2

2
e
4
3
2
customhouse
2
customary
2
custom
38
1
4
3
2

2
i
4
1
2
custody
38
1
4
3
2
a
2

4
2
2
custodian
2
custodial
38
1
4
3
2

2
dm
4
0
38
1
4
3
2

2
o
4
1
2
Custer
38
1
4
3
2

2
i
4
1
2
Cushman
38
1
4
3
2

2

4
2
2
cushion
2
Cushing
38
1
4
3
2

2
ht
4
1
2
cusp
38
1
4
3
2

2

4
2
2
curvature
2
curvaceous
38
1
4
3
2

2
a
4
2
2
curvilinear
2
curve
38
1
4
3
2
i
2

4
2
2
curtain
2
curtail
38
1
4
3
2

2
a
4
3
2
curtsey
2
Curtis
2
curt
38
1
4
3
2
r
2

4
2
2
cursory
2
cursor
38
1
4
3
2

2
o
4
2
2
cursive
2
curse
38
1
4
3
2

2

4
2
2
curricular
2
curricula
38
1
4
3
2
cul
2
a
4
1
2
curriculum
38
1
4
3
2
n
2

4
2
2
currant
2
Curran
38
1
4
3
2

2
aie
4
1
2
curry
38
1
4
3
2

2

4
3
2
curlicue
2
curlew
2
curl
38
1
4
3
2

2

4
3
2
curious
2
curiosity
2
curio
38
1
4
3
2

2
o
4
3
2
curium
2
curie
2
curia
38
1
4
3
2

2

4
2
2
curdle
2
curd
38
1
4
3
2

2

4
2
2
curbside
2
curb
38
1
4
3
2

2
bdilrstve
4
3
2
curfew
2
curate
2
cur
38
1
4
3
2

2

4
2
2
cuprous
2
cupric
38
1
4
3
2
d
2

4
2
2
cupidity
2
Cupid
38
1
4
3
2

2
ir
4
3
2
cupful
2
cupboard
2
cup
38
1
4
3
2
ing
2

4
2
2
Cunningham
2
cunning
38
1
4
3
2

2
n
4
2
2
CUNY
2
Cunard
38
1
4
3
2
l
2

4
2
2
cumulus
2
cumulate
38
1
4
3
2
in
2

4
2
2
Cummins
2
Cummings
38
1
4
3
2
er
2

4
2
2
cumbersome
2
Cumberland
38
1
4
3
2

2
bmu
4
1
2
cumin
38
1
4
3
2
er
2

4
2
2
culvert
2
Culver
38
1
4
3
2
r
2

4
2
2
culture
2
cultural
38
1
4
3
2
va
2

4
2
2
cultivate
2
cultivable
38
1
4
3
2

2
iu
4
1
2
cult
38
1
4
3
2

2

4
2
2
culpable
2
culpa
38
1
4
3
2

2
a
4
1
2
culprit
38
1
4
3
2

2
ptv
4
4
2
culminate
2
cull
2
culinary
2
Culbertson
38
1
4
3
2
f
2

4
2
2
cufflink
2
cuff
38
1
4
3
2
l
2

4
2
2
cuddly
2
cuddle
38
1
4
3
2

2
d
4
2
2
cudgel
2
cud
38
1
4
3
2

2

4
2
2
cucumber
2
cuckoo
38
1
4
3
2

2

4
5
2
cubic
2
cube
2
cubbyhole
2
Cuba
2
cub
38
1
4
3
2

2
bcdflmnprst
4
2
2
cuisine
2
cue
38
1
4
3
2
graph
2

4
2
2
crystallography
2
crystallographer
38
1
4
3
2

2

4
2
2
crystallite
2
crystalline
38
1
4
3
2

2
io
4
0
38
1
4
3
2
tal
2
l
4
1
2
crystal
38
1
4
3
2
h
2

4
2
2
cryptography
2
cryptographer
38
1
4
3
2
gra
2
p
4
1
2
cryptogram
38
1
4
3
2

2

4
2
2
cryptanalyst
2
cryptanalysis
38
1
4
3
2
naly
2
s
4
1
2
cryptanalytic
38
1
4
3
2
t
2
ao
4
2
2
cryptic
2
crypt
38
1
4
3
2

2

4
2
2
cryostat
2
cryogenic
38
1
4
3
2

2
ops
4
1
2
cry
38
1
4
3
2

2

4
4
2
crust
2
Crusoe
2
crush
2
crusade
38
1
4
3
2

2

4
2
2
crumple
2
crump
38
1
4
3
2

2

4
2
2
crumble
2
crumb
38
1
4
3
2

2
bp
4
1
2
crummy
38
1
4
3
2

2

4
2
2
cruise
2
Cruickshank
38
1
4
3
2
l
2

4
2
2
cruelty
2
cruel
38
1
4
3
2

2

4
3
2
crude
2
cruddy
2
crud
38
1
4
3
2
i
2
f
4
2
2
crucible
2
crucial
38
1
4
3
2
x
2

4
2
2
crucifixion
2
crucifix
38
1
4
3
2

2
i
4
1
2
crucify
38
1
4
3
2

2
cdeims
4
5
2
Cruz
2
crux
2
crutch
2
crupper
2
crunch
38
1
4
3
2

2

4
2
2
crowberry
2
crowbait
38
1
4
3
2

2
b
4
5
2
crown
2
Crowley
2
crowfoot
2
crowd
2
crow
38
1
4
3
2

2

4
2
2
croupier
2
crouch
38
1
4
3
2
ch
2

4
2
2
crotchety
2
crotch
38
1
4
3
2

2

4
2
2
crossway
2
crosswalk
38
1
4
3
2

2
a
4
2
2
crosswort
2
crosswise
38
1
4
3
2

2

4
2
2
crossbill
2
crossbar
38
1
4
3
2

2
bw
4
9
2
crosstalk
2
crossroad
2
crosspoint
2
crossover
2
crosslink
2
crosshatch
2
crosscut
2
crossarm
2
cross
38
1
4
3
2

2
s
4
1
2
Crosby
38
1
4
3
2

2

4
2
2
croon
2
crook
38
1
4
3
2

2

4
2
2
crony
2
crone
38
1
4
3
2
well
2

4
2
2
Cromwellian
2
Cromwell
38
1
4
3
2
dil
2

4
2
2
crocodilian
2
crocodile
38
1
4
3
2

2

4
2
2
Crockett
2
crockery
38
1
4
3
2

2
e
4
1
2
crock
38
1
4
3
2

2
ko
4
2
2
crocus
2
crochet
38
1
4
3
2

2

4
2
2
Croatia
2
croak
38
1
4
3
2

2
acmnostuw
4
4
2
croydon
2
crop
2
Croix
2
croft
38
1
4
3
2

2
c
4
1
2
critique
38
1
4
3
2
ri
2

4
2
2
criterion
2
criteria
38
1
4
3
2

2
ei
4
1
2
critter
38
1
4
3
2

2

4
2
2
crisscross
2
criss
38
1
4
3
2

2

4
2
2
Crispin
2
crisp
38
1
4
3
2

2
ps
4
2
2
crisis
2
crises
38
1
4
3
2

2

4
2
2
crinkle
2
cringe
38
1
4
3
2

2

4
2
2
Crimea
2
crime
38
1
4
3
2

2
e
4
3
2
crimson
2
crimp
2
criminal
38
1
4
3
2

2
mnst
4
3
2
cripple
2
cricket
2
crib
38
1
4
3
2

2

4
2
2
crewmen
2
crewman
38
1
4
3
2

2
m
4
3
2
crewel
2
crewcut
2
crew
38
1
4
3
2
n
2

4
2
2
cretinous
2
cretin
38
1
4
3
2

2

4
2
2
Cretan
2
Cretaceous
38
1
4
3
2

2
ai
4
1
2
Crete
38
1
4
3
2

2

4
3
2
Crestview
2
crestfallen
2
crest
38
1
4
3
2
en
2

4
2
2
crescent
2
crescendo
38
1
4
3
2

2
ct
4
1
2
cress
38
1
4
3
2

2

4
2
2
crept
2
crepe
38
1
4
3
2

2

4
3
2
creosote
2
Creon
2
Creole
38
1
4
3
2
at
2

4
2
2
crematory
2
cremate
38
1
4
3
2

2

4
2
2
creepy
2
creep
38
1
4
3
2

2

4
2
2
creekside
2
creek
38
1
4
3
2

2

4
2
2
creedal
2
creed
38
1
4
3
2

2
dkp
4
0
38
1
4
3
2
l
2

4
2
2
credulous
2
credulity
38
1
4
3
2

2

4
2
2
creditor
2
credit
38
1
4
3
2

2
t
4
1
2
credible
38
1
4
3
2
n
2
t
4
1
2
credenza
38
1
4
3
2

2

4
2
2
credential
2
credent
38
1
4
3
2

2
eiu
4
1
2
credo
38
1
4
3
2

2
kmt
4
1
2
crease
38
1
4
3
2

2
ei
4
1
2
creature
38
1
4
3
2

2

4
3
2
creamy
2
creamery
2
cream
38
1
4
3
2

2

4
2
2
creaky
2
creak
38
1
4
3
2

2
ademopstw
4
2
2
crevice
2
creche
38
1
4
3
2

2
bcfgmnpstvwyz
4
2
2
Craig
2
cradle
38
1
4
3
2

2

4
2
2
crazy
2
craze
38
1
4
3
2

2

4
2
2
crayon
2
crayfish
38
1
4
3
2

2

4
2
2
crawlspace
2
crawl
38
1
4
3
2

2
l
4
2
2
Crawford
2
craw
38
1
4
3
2

2

4
2
2
craven
2
crave
38
1
4
3
2

2
e
4
1
2
cravat
38
1
4
3
2
e
2

4
2
2
crater
2
crate
38
1
4
3
2

2

4
2
2
crass
2
crash
38
1
4
3
2

2

4
2
2
crappie
2
crap
38
1
4
3
2

2

4
4
2
cranky
2
crankshaft
2
crankcase
2
crank
38
1
4
3
2

2

4
2
2
cranium
2
crania
38
1
4
3
2

2
ik
4
6
2
Cranston
2
cranny
2
Cranford
2
crane
2
Crandall
2
cranberry
38
1
4
3
2

2

4
3
2
cramp
2
Cramer
2
cram
38
1
4
3
2

2

4
2
2
craggy
2
crag
38
1
4
3
2
e
2

4
2
2
craftsperson
2
craftspeople
38
1
4
3
2

2

4
2
2
craftsmen
2
craftsman
38
1
4
3
2

2
mp
4
0
38
1
4
3
2
t
2
s
4
2
2
crafty
2
craft
38
1
4
3
2
k
2

4
3
2
crackpot
2
crackle
2
crack
38
1
4
3
2

2

4
2
2
crabapple
2
crab
38
1
4
3
2

2
aeiouy
4
1
2
CRT
38
1
4
3
2

2

4
2
2
cpu
2
CPA
38
1
4
3
2

2

4
2
2
cozy
2
cozen
38
1
4
3
2

2

4
3
2
coypu
2
coyote
2
coy
38
1
4
3
2

2

4
2
2
coxcomb
2
cox
38
1
4
3
2

2

4
3
2
cowpox
2
cowpony
2
cowpoke
38
1
4
3
2

2
o
4
2
2
cowpunch
2
cowpea
38
1
4
3
2

2

4
2
2
cowmen
2
cowman
38
1
4
3
2

2

4
2
2
cowlick
2
cowl
38
1
4
3
2

2

4
3
2
cowhide
2
cowherd
2
cowhand
38
1
4
3
2

2

4
3
2
cowboy
2
cowbird
2
cowbell
38
1
4
3
2
d
2

4
2
2
cowardice
2
coward
38
1
4
3
2

2
r
4
1
2
Cowan
38
1
4
3
2

2
abhlmp
4
4
2
cowslip
2
cowry
2
coworker
2
cow
38
1
4
3
2

2

4
2
2
covetous
2
covet
38
1
4
3
2

2

4
2
2
coverall
2
coverage
38
1
4
3
2

2
a
4
5
2
covering
2
covered
2
covert
2
coverlet
2
cover
38
1
4
3
2

2

4
3
2
Coventry
2
covenant
2
coven
38
1
4
3
2

2
nrt
4
1
2
cove
38
1
4
3
2

2
r
4
1
2
covalent
38
1
4
3
2
a
2

4
2
2
covariate
2
covariant
38
1
4
3
2

2
i
4
1
2
covary
38
1
4
3
2

2
ae
4
0
38
1
4
3
2

2

4
2
2
cousin
2
couscous
38
1
4
3
2

2

4
2
2
courtesy
2
courtesan
38
1
4
3
2

2
s
4
1
2
courteous
38
1
4
3
2

2
e
4
6
2
courtyard
2
courtroom
2
Courtney
2
courtier
2
courthouse
2
court
38
1
4
3
2
ge
2

4
2
2
courageous
2
courage
38
1
4
3
2

2
at
4
2
2
course
2
courier
38
1
4
3
2

2

4
4
2
coupon
2
couple
2
coupe
2
coup
38
1
4
3
2

2

4
2
2
countywide
2
county
38
1
4
3
2

2

4
2
2
countrymen
2
countryman
38
1
4
3
2

2
m
4
3
2
countrywide
2
countryside
2
country
38
1
4
3
2

2
yi
4
0
38
1
4
3
2

2

4
2
2
countersunk
2
countersink
38
1
4
3
2
o
2

4
2
2
counterproposal
2
counterproductive
38
1
4
3
2
i
2

4
2
2
counterpoise
2
counterpoint
38
1
4
3
2

2
or
4
1
2
counterpart
38
1
4
3
2

2

4
2
2
countermen
2
counterman
38
1
4
3
2

2

4
2
2
counterflow
2
counterfeit
38
1
4
3
2

2

4
3
2
counterattack
2
counterargument
2
counteract
38
1
4
3
2

2
afmps
4
5
2
countervail
2
counterintuitive
2
counterexample
2
counterclockwise
2
counterbalance
38
1
4
3
2

2
r
4
1
2
countenance
38
1
4
3
2

2
ery
4
3
2
counting
2
countdown
2
count
38
1
4
3
2
el
2

4
2
2
counselor
2
counsel
38
1
4
3
2
il
2
mw
4
1
2
council
38
1
4
3
2
om
2

4
2
2
councilwomen
2
councilwoman
38
1
4
3
2

2

4
2
2
councilmen
2
councilman
38
1
4
3
2

2
cst
4
0
38
1
4
3
2

2

4
2
2
couldn't
2
could
38
1
4
3
2

2
d
4
2
2
Coulter
2
coulomb
38
1
4
3
2

2

4
2
2
cough
2
cougar
38
1
4
3
2

2
glnprs
4
2
2
couturier
2
couch
38
1
4
3
2
n
2

4
5
2
cottony
2
cottonwood
2
cottonseed
2
cottonmouth
2
cotton
38
1
4
3
2

2

4
2
2
cottage
2
cotta
38
1
4
3
2

2
ao
4
2
2
cotty
2
Cottrell
38
1
4
3
2

2
t
4
6
2
cotyledon
2
cotoneaster
2
cotman
2
cotillion
2
cotangent
2
cot
38
1
4
3
2

2

4
5
2
costs
2
costume
2
Costello
2
Costa
2
cost
38
1
4
3
2

2

4
3
2
cosmos
2
cosmopolitan
2
cosmology
38
1
4
3
2

2
o
4
2
2
cosmic
2
cosmetic
38
1
4
3
2

2

4
2
2
coset
2
cosec
38
1
4
3
2

2
emt
4
7
2
cosy
2
Cossack
2
cosponsor
2
cosine
2
cosh
2
Cosgrove
2
cos
38
1
4
3
2

2

4
3
2
Corvus
2
corvette
2
Corvallis
38
1
4
3
2

2

4
2
2
coruscate
2
corundum
38
1
4
3
2

2

4
2
2
cortex
2
cortege
38
1
4
3
2

2
e
4
2
2
Cortland
2
cortical
38
1
4
3
2

2

4
2
2
corruption
2
corruptible
38
1
4
3
2
t
2
i
4
1
2
corrupt
38
1
4
3
2

2
p
4
1
2
corrugate
38
1
4
3
2
i
2

4
2
2
corrosive
2
corrosion
38
1
4
3
2

2

4
2
2
corrodible
2
corrode
38
1
4
3
2
or
2

4
2
2
corroboree
2
corroborate
38
1
4
3
2

2
bds
4
0
38
1
4
3
2
nd
2

4
2
2
corrigendum
2
corrigenda
38
1
4
3
2

2
e
4
1
2
corrigible
38
1
4
3
2

2
g
4
1
2
corridor
38
1
4
3
2
pond
2

4
2
2
correspondent
2
correspond
38
1
4
3
2
t
2

4
2
2
corrector
2
correct
38
1
4
3
2

2
cs
4
1
2
correlate
38
1
4
3
2
l
2

4
2
2
corralled
2
corral
38
1
4
3
2

2
aeiou
4
0
38
1
4
3
2

2

4
2
2
corpuscular
2
corpus
38
1
4
3
2

2
s
4
1
2
corpulent
38
1
4
3
2

2

4
2
2
corpsmen
2
corpsman
38
1
4
3
2

2
m
4
2
2
corpse
2
corps
38
1
4
3
2

2
t
4
2
2
corporal
2
corpora
38
1
4
3
2
r
2
a
4
1
2
corporeal
38
1
4
3
2

2
osu
4
1
2
Corp
38
1
4
3
2

2

4
2
2
coronet
2
coroner
38
1
4
3
2

2

4
4
2
coronate
2
coronary
2
Coronado
2
corona
38
1
4
3
2

2
ae
4
0
38
1
4
3
2

2
n
4
2
2
coroutine
2
corollary
38
1
4
3
2

2

4
2
2
cornflower
2
cornfield
38
1
4
3
2

2

4
2
2
Cornelius
2
Cornelia
38
1
4
3
2

2
i
4
1
2
Cornell
38
1
4
3
2

2
lr
4
2
2
cornet
2
cornea
38
1
4
3
2

2
ef
4
8
2
corny
2
Cornwall
2
cornucopia
2
cornstarch
2
cornmeal
2
cornish
2
cornbread
2
corn
38
1
4
3
2

2

4
2
2
corkscrew
2
cork
38
1
4
3
2
th
2

4
2
2
Corinthian
2
Corinth
38
1
4
3
2

2
n
4
2
2
Coriolanus
2
coriander
38
1
4
3
2

2

4
2
2
Corey
2
core
38
1
4
3
2

2

4
2
2
cordite
2
cordial
38
1
4
3
2

2
i
4
4
2
corduroy
2
cordon
2
cordage
2
cord
38
1
4
3
2
e
2

4
2
2
Corbett
2
corbel
38
1
4
3
2
l
2

4
3
2
coralline
2
coralberry
2
coral
38
1
4
3
2

2
abdeiknoprtuv
4
3
2
corsage
2
cormorant
2
Corcoran
38
1
4
3
2
u
2

4
2
2
coquina
2
coquette
38
1
4
3
2

2

4
4
2
copywriter
2
copyright
2
copybook
2
copy
38
1
4
3
2

2

4
3
2
coproduct
2
coprinus
2
copra
38
1
4
3
2
er
2

4
4
2
coppery
2
copperhead
2
Copperfield
2
copperas
38
1
4
3
2
nic
2

4
2
2
Copernicus
2
Copernican
38
1
4
3
2

2
r
4
3
2
Copenhagen
2
Copeland
2
cope
38
1
4
3
2

2
epry
4
5
2
copter
2
copolymer
2
coplanar
2
copious
2
cop
38
1
4
3
2

2

4
3
2
coorespondence
2
Coors
2
coordinate
38
1
4
3
2

2

4
2
2
cooperate
2
coop
38
1
4
3
2

2

4
5
2
Coolidge
2
coolheaded
2
Cooley
2
coolant
2
cool
38
1
4
3
2

2

4
2
2
cookery
2
Cooke
38
1
4
3
2

2
e
4
4
2
cooky
2
cookie
2
cookbook
2
cook
38
1
4
3
2

2
klpr
4
3
2
coot
2
coon
2
coo
38
1
4
3
2

2

4
2
2
convulsive
2
convulsion
38
1
4
3
2
ls
2
i
4
1
2
convulse
38
1
4
3
2
t
2

4
2
2
convolution
2
convolute
38
1
4
3
2

2
u
4
1
2
convolve
38
1
4
3
2

2
l
4
3
2
convoy
2
convoke
2
convocate
38
1
4
3
2

2

4
3
2
convivial
2
convince
2
convict
38
1
4
3
2

2

4
3
2
conveyor
2
conveyance
2
convey
38
1
4
3
2

2

4
2
2
convertible
2
convert
38
1
4
3
2

2

4
2
2
conversation
2
conversant
38
1
4
3
2

2
a
4
2
2
conversion
2
converse
38
1
4
3
2
e
2

4
2
2
convergent
2
converge
38
1
4
3
2

2
gst
4
0
38
1
4
3
2

2

4
2
2
convention
2
convent
38
1
4
3
2

2
ti
4
1
2
convene
38
1
4
3
2

2
nry
4
2
2
convex
2
convect
38
1
4
3
2

2
l
4
1
2
Convair
38
1
4
3
2
esce
2

4
2
2
convalescent
2
convalesce
38
1
4
3
2

2
aeiou
4
0
38
1
4
3
2

2

4
2
2
contusion
2
contumacy
38
1
4
3
2

2

4
2
2
controversy
2
controversial
38
1
4
3
2
er
2
s
4
1
2
controvertible
38
1
4
3
2

2
l
4
1
2
control
38
1
4
3
2

2

4
2
2
controller
2
controlled
38
1
4
3
2

2
e
4
2
2
controlling
2
controllable
38
1
4
3
2

2
lv
4
0
38
1
4
3
2

2

4
2
2
contrive
2
contrivance
38
1
4
3
2

2

4
2
2
contrition
2
contrite
38
1
4
3
2
ut
2
o
4
2
2
contribution
2
contribute
38
1
4
3
2
r
2

4
2
2
contributory
2
contributor
38
1
4
3
2

2
btv
4
0
38
1
4
3
2

2
bcdlrv
4
2
2
contrast
2
contraption
38
1
4
3
2
n
2

4
2
2
contravention
2
contravene
38
1
4
3
2

2
e
4
1
2
contravariant
38
1
4
3
2

2

4
2
2
contrary
2
contrariety
38
1
4
3
2

2

4
2
2
contralto
2
contralateral
38
1
4
3
2
tin
2

4
2
2
contradistinguish
2
contradistinct
38
1
4
3
2
t
2

4
2
2
contradictory
2
contradict
38
1
4
3
2
i
2
cs
4
0
38
1
4
3
2

2

4
4
2
contracts
2
contractual
2
contractor
2
contract
38
1
4
3
2
pti
2

4
2
2
contraceptive
2
contraception
38
1
4
3
2

2
et
4
0
38
1
4
3
2
a
2

4
2
2
contrabass
2
contraband
38
1
4
3
2

2
aio
4
1
2
contretemps
38
1
4
3
2

2

4
2
2
contour
2
contort
38
1
4
3
2

2

4
2
2
continuous
2
continuo
38
1
4
3
2

2

4
4
2
continuation
2
continuant
2
continual
2
continua
38
1
4
3
2

2
aoei
4
1
2
continuum
38
1
4
3
2
nt
2

4
2
2
continental
2
continent
38
1
4
3
2

2
eu
4
1
2
contingent
38
1
4
3
2
u
2

4
2
2
contiguous
2
contiguity
38
1
4
3
2

2
gn
4
0
38
1
4
3
2
t
2

4
2
2
contextual
2
context
38
1
4
3
2
t
2

4
2
2
contestant
2
contest
38
1
4
3
2
o
2

4
2
2
contentious
2
contention
38
1
4
3
2

2
i
4
2
2
contents
2
content
38
1
4
3
2

2
t
4
1
2
contend
38
1
4
3
2
p
2
ot
4
1
2
contemplate
38
1
4
3
2

2

4
3
2
contemptuous
2
contemptible
2
contempt
38
1
4
3
2
ra
2

4
2
2
contemporary
2
contemporaneous
38
1
4
3
2

2
mnsx
4
0
38
1
4
3
2

2
gmi
4
1
2
contact
38
1
4
3
2
ina
2

4
2
2
contaminate
2
contaminant
38
1
4
3
2
io
2

4
2
2
contagious
2
contagion
38
1
4
3
2

2
aeioru
4
0
38
1
4
3
2
ti
2

4
2
2
consumptive
2
consumption
38
1
4
3
2

2
pe
4
3
2
consumable
2
consuming
2
consummate
38
1
4
3
2

2
at
4
1
2
consul
38
1
4
3
2
i
2

4
2
2
consultative
2
consultation
38
1
4
3
2

2
t
4
1
2
consultant
38
1
4
3
2

2
a
4
1
2
consult
38
1
4
3
2

2

4
2
2
consulate
2
consular
38
1
4
3
2

2
lm
4
0
38
1
4
3
2
t
2
i
4
2
2
constructor
2
construct
38
1
4
3
2

2
c
4
1
2
construe
38
1
4
3
2
ct
2

4
2
2
constrictor
2
constrict
38
1
4
3
2
in
2

4
2
2
constraint
2
constrain
38
1
4
3
2

2
aiu
4
0
38
1
4
3
2

2

4
2
2
constitutive
2
constitution
38
1
4
3
2

2
i
4
1
2
constitute
38
1
4
3
2
tu
2
t
4
1
2
constituent
38
1
4
3
2

2

4
2
2
consternate
2
constellate
38
1
4
3
2
nt
2
i
4
1
2
constant
38
1
4
3
2
n
2

4
2
2
Constantinople
2
Constantine
38
1
4
3
2

2
aeir
4
0
38
1
4
3
2

2
t
4
1
2
conspiracy
38
1
4
3
2
or
2

4
2
2
conspiratorial
2
conspirator
38
1
4
3
2

2
a
4
1
2
conspire
38
1
4
3
2
i
2
r
4
1
2
conspicuous
38
1
4
3
2
t
2

4
2
2
consortium
2
consort
38
1
4
3
2
ant
2

4
2
2
consonantal
2
consonant
38
1
4
3
2

2

4
3
2
consolidate
2
console
2
consolation
38
1
4
3
2

2
lnr
4
0
38
1
4
3
2
t
2

4
2
2
consistent
2
consist
38
1
4
3
2
n
2

4
3
2
consignor
2
consignee
2
consign
38
1
4
3
2
er
2

4
4
2
considering
2
considered
2
considerate
2
consider
38
1
4
3
2

2
dgs
4
0
38
1
4
3
2
t
2
io
4
0
38
1
4
3
2
r
2

4
2
2
conservatory
2
conservator
38
1
4
3
2

2

4
3
2
conservative
2
conservatism
2
conservation
38
1
4
3
2
v
2
a
4
1
2
conserve
38
1
4
3
2
uent
2

4
2
2
consequential
2
consequent
38
1
4
3
2

2

4
2
2
consent
2
consensus
38
1
4
3
2

2

4
2
2
consecutive
2
consecrate
38
1
4
3
2

2
cnqr
4
0
38
1
4
3
2
ipt
2

4
2
2
conscription
2
conscript
38
1
4
3
2

2
eo
4
0
38
1
4
3
2

2

4
2
2
conscious
2
conscionable
38
1
4
3
2
n
2

4
2
2
conscientious
2
conscience
38
1
4
3
2

2
ir
4
0
38
1
4
3
2
nguine
2

4
2
2
consanguineous
2
consanguine
38
1
4
3
2

2
aceioptu
4
0
38
1
4
3
2
a
2

4
2
2
Conrail
2
Conrad
38
1
4
3
2

2
r
4
1
2
conquest
38
1
4
3
2

2

4
2
2
conqueror
2
conquer
38
1
4
3
2
u
2
e
4
1
2
conquistador
38
1
4
3
2
ti
2

4
2
2
connotative
2
connotation
38
1
4
3
2

2
a
4
1
2
connote
38
1
4
3
2

2
t
4
2
2
Connors
2
connoisseur
38
1
4
3
2

2

4
2
2
connive
2
connivance
38
1
4
3
2

2
v
4
1
2
Connie
38
1
4
3
2
t
2
i
4
2
2
connector
2
connect
38
1
4
3
2

2
c
4
1
2
Conner
38
1
4
3
2

2
eio
4
3
2
connubial
2
Connally
2
conn
38
1
4
3
2
ct
2

4
2
2
conjuncture
2
conjunct
38
1
4
3
2
a
2

4
3
2
conjugate
2
conjugacy
2
conjugal
38
1
4
3
2

2
gn
4
1
2
conjure
38
1
4
3
2
in
2

4
2
2
conjoint
2
conjoin
38
1
4
3
2
ctur
2

4
2
2
conjecture
2
conjectural
38
1
4
3
2

2
eou
4
0
38
1
4
3
2
er
2

4
2
2
coniferous
2
conifer
38
1
4
3
2

2
f
4
1
2
conic
38
1
4
3
2
om
2

4
2
2
congresswomen
2
congresswoman
38
1
4
3
2

2

4
2
2
congressmen
2
congressman
38
1
4
3
2
s
2
mw
4
2
2
congressional
2
congress
38
1
4
3
2

2
s
4
1
2
congregate
38
1
4
3
2
tulat
2

4
2
2
congratulatory
2
congratulate
38
1
4
3
2

2
ae
4
1
2
congruent
38
1
4
3
2

2

4
2
2
Congolese
2
Congo
38
1
4
3
2

2
ns
4
1
2
congeal
38
1
4
3
2

2

4
2
2
congestive
2
congestion
38
1
4
3
2
t
2
i
4
1
2
congest
38
1
4
3
2

2

4
2
2
congenital
2
congenial
38
1
4
3
2

2
i
4
1
2
congener
38
1
4
3
2

2
eor
4
1
2
conglomerate
38
1
4
3
2

2

4
2
2
confusion
2
confuse
38
1
4
3
2
i
2

4
2
2
Confucius
2
Confucian
38
1
4
3
2

2
cs
4
1
2
confute
38
1
4
3
2
nt
2

4
2
2
confrontation
2
confront
38
1
4
3
2

2
o
4
1
2
confrere
38
1
4
3
2

2

4
3
2
conformation
2
conformance
2
conformal
38
1
4
3
2
m
2
a
4
1
2
conform
38
1
4
3
2

2
r
4
2
2
confound
2
confocal
38
1
4
3
2

2

4
3
2
confluent
2
conflict
2
conflagrate
38
1
4
3
2

2

4
2
2
confiscatory
2
confiscate
38
1
4
3
2
ca
2
t
4
1
2
confiscable
38
1
4
3
2
t
2

4
2
2
confirmatory
2
confirmation
38
1
4
3
2
m
2
a
4
1
2
confirm
38
1
4
3
2
ur
2

4
2
2
configure
2
configuration
38
1
4
3
2

2
ae
4
0
38
1
4
3
2
t
2

4
2
2
confidential
2
confident
38
1
4
3
2

2
n
4
1
2
confide
38
1
4
3
2
nt
2

4
2
2
confidante
2
confidant
38
1
4
3
2

2
dgrs
4
1
2
confine
38
1
4
3
2
s
2

4
3
2
confessor
2
confession
2
confess
38
1
4
3
2

2

4
3
2
conferring
2
conferred
2
conferrable
38
1
4
3
2

2

4
2
2
conference
2
conferee
38
1
4
3
2

2
er
4
1
2
confer
38
1
4
3
2
era
2

4
2
2
confederate
2
confederacy
38
1
4
3
2
t
2

4
2
2
confectionery
2
confect
38
1
4
3
2

2
cdrs
4
0
38
1
4
3
2

2
eiloru
4
1
2
confabulate
38
1
4
3
2

2

4
4
2
coney
2
Conestoga
2
coneflower
2
cone
38
1
4
3
2

2
t
4
2
2
conducive
2
conduce
38
1
4
3
2

2

4
3
2
conductor
2
conductance
2
conduct
38
1
4
3
2

2
c
4
1
2
conduit
38
1
4
3
2

2

4
2
2
condone
2
condolence
38
1
4
3
2

2

4
2
2
condition
2
condiment
38
1
4
3
2

2
mns
4
0
38
1
4
3
2
cen
2

4
2
2
condescension
2
condescend
38
1
4
3
2
s
2

4
3
2
condensible
2
condense
2
condensate
38
1
4
3
2
n
2
a
4
1
2
condemn
38
1
4
3
2
t
2

4
2
2
condemnatory
2
condemnate
38
1
4
3
2

2
eiou
4
0
38
1
4
3
2

2

4
2
2
concurrent
2
concurred
38
1
4
3
2

2
e
4
1
2
concurring
38
1
4
3
2

2
r
4
1
2
concur
38
1
4
3
2

2
r
4
2
2
concussion
2
concubine
38
1
4
3
2
et
2

4
2
2
concretion
2
concrete
38
1
4
3
2
d
2

4
2
2
concordant
2
concord
38
1
4
3
2

2
r
4
3
2
concourse
2
concomitant
2
concoct
38
1
4
3
2
i
2

4
2
2
conclusive
2
conclusion
38
1
4
3
2

2
s
4
1
2
conclude
38
1
4
3
2

2
u
4
1
2
conclave
38
1
4
3
2

2

4
2
2
concision
2
concise
38
1
4
3
2
iat
2

4
2
2
conciliatory
2
conciliate
38
1
4
3
2

2
ls
4
1
2
concierge
38
1
4
3
2
sion
2

4
2
2
concessionaire
2
concession
38
1
4
3
2

2

4
2
2
concertina
2
concerti
38
1
4
3
2

2
i
4
3
2
concerto
2
concertmaster
2
concert
38
1
4
3
2

2
t
4
1
2
concern
38
1
4
3
2
t
2

4
3
2
conceptual
2
conception
2
concept
38
1
4
3
2
tr
2

4
2
2
concentric
2
concentrate
38
1
4
3
2

2

4
2
2
conceive
2
conceit
38
1
4
3
2

2
inprs
4
2
2
concede
2
conceal
38
1
4
3
2

2

4
2
2
concave
2
concatenate
38
1
4
3
2

2
aeiloru
4
1
2
conch
38
1
4
3
2

2

4
2
2
Conant
2
Conakry
38
1
4
3
2

2
acdefgijnqrstv
4
6
2
cony
2
Conway
2
conundrum
2
Conley
2
Conklin
2
con
38
1
4
3
2

2
ea
4
0
38
1
4
3
2
s
2
i
4
1
2
compulsory
38
1
4
3
2

2

4
2
2
compulsive
2
compulsion
38
1
4
3
2

2
lt
4
0
38
1
4
3
2

2

4
2
2
comptroller
2
Compton
38
1
4
3
2

2
hs
4
0
38
1
4
3
2

2

4
3
2
compressive
2
compression
2
compressible
38
1
4
3
2
s
2
i
4
2
2
compressor
2
compress
38
1
4
3
2
en
2
s
4
1
2
comprehend
38
1
4
3
2
i
2

4
3
2
comprehensive
2
comprehension
2
comprehensible
38
1
4
3
2

2
e
4
2
2
compromise
2
comprise
38
1
4
3
2
t
2

4
3
2
compositor
2
composition
2
composite
38
1
4
3
2

2
i
4
3
2
composure
2
compost
2
compose
38
1
4
3
2
ent
2

4
2
2
componentry
2
component
38
1
4
3
2

2
ns
4
3
2
compound
2
compote
2
comport
38
1
4
3
2
ent
2

4
2
2
complimentary
2
compliment
38
1
4
3
2

2

4
2
2
complicity
2
complicate
38
1
4
3
2

2
cm
4
2
2
compline
2
compliant
38
1
4
3
2

2

4
2
2
complexion
2
complex
38
1
4
3
2

2
e
4
1
2
completion
38
1
4
3
2
ent
2
a
4
1
2
complement
38
1
4
3
2

2

4
2
2
complementary
2
complementarity
38
1
4
3
2

2
r
4
1
2
complementation
38
1
4
3
2

2
mtx
4
0
38
1
4
3
2

2
i
4
1
2
complacent
38
1
4
3
2

2

4
3
2
complaint
2
complainant
2
complain
38
1
4
3
2

2
n
4
1
2
complaisant
38
1
4
3
2

2
aei
4
1
2
comply
38
1
4
3
2
l
2

4
2
2
compile
2
compilation
38
1
4
3
2

2

4
2
2
competitive
2
competition
38
1
4
3
2
t
2
i
4
1
2
competitor
38
1
4
3
2

2

4
2
2
competent
2
compete
38
1
4
3
2

2
ei
4
0
38
1
4
3
2

2

4
2
2
compensatory
2
compensate
38
1
4
3
2
a
2
t
4
1
2
compensable
38
1
4
3
2
i
2

4
2
2
compendium
2
compendia
38
1
4
3
2

2
ds
4
0
38
1
4
3
2

2
l
4
1
2
compel
38
1
4
3
2

2

4
3
2
compelling
2
compelled
2
compellable
38
1
4
3
2

2
lnt
4
0
38
1
4
3
2

2
cnrst
4
1
2
Compagnie
38
1
4
3
2

2

4
2
2
compatriot
2
compatible
38
1
4
3
2
on
2

4
2
2
compassionate
2
compassion
38
1
4
3
2
s
2
i
4
1
2
compass
38
1
4
3
2
t
2

4
2
2
comparator
2
comparative
38
1
4
3
2

2
a
4
3
2
compartment
2
comparison
2
compare
38
1
4
3
2

2
o
4
1
2
companies
38
1
4
3
2

2
i
4
1
2
company
38
1
4
3
2
t
2

4
2
2
compactify
2
compact
38
1
4
3
2

2
aeilortu
4
0
38
1
4
3
2

2

4
2
2
commute
2
commutate
38
1
4
3
2

2
i
4
2
2
commune
2
communal
38
1
4
3
2
a
2
t
4
2
2
communicant
2
communicable
38
1
4
3
2

2
c
4
3
2
community
2
communique
2
communion
38
1
4
3
2

2
nt
4
0
38
1
4
3
2
eal
2

4
2
2
commonwealth
2
commonweal
38
1
4
3
2

2
w
4
3
2
commonplace
2
commonality
2
common
38
1
4
3
2

2
i
4
1
2
commodore
38
1
4
3
2

2

4
2
2
commodity
2
commodious
38
1
4
3
2

2
dn
4
1
2
commotion
38
1
4
3
2
om
2

4
2
2
committeewomen
2
committeewoman
38
1
4
3
2

2

4
2
2
committeemen
2
committeeman
38
1
4
3
2

2
mw
4
2
2
committees
2
committee
38
1
4
3
2

2
e
4
1
2
committed
38
1
4
3
2

2

4
2
2
committal
2
committable
38
1
4
3
2

2
ae
4
1
2
committing
38
1
4
3
2

2
t
4
1
2
commit
38
1
4
3
2
r
2

4
2
2
commissary
2
commissariat
38
1
4
3
2

2
a
4
1
2
commission
38
1
4
3
2

2
s
4
1
2
commiserate
38
1
4
3
2

2
st
4
1
2
commingle
38
1
4
3
2
c
2

4
2
2
commercial
2
commerce
38
1
4
3
2

2

4
2
2
commentator
2
commentary
38
1
4
3
2

2
a
4
1
2
comment
38
1
4
3
2
ura
2

4
2
2
commensurate
2
commensurable
38
1
4
3
2

2
a
4
1
2
commend
38
1
4
3
2
t
2

4
2
2
commendatory
2
commendation
38
1
4
3
2

2
dst
4
0
38
1
4
3
2

2
nr
4
1
2
commemorate
38
1
4
3
2

2
n
4
1
2
comma
38
1
4
3
2
d
2

4
4
2
commando
2
commandeer
2
commandant
2
command
38
1
4
3
2

2
aeiou
4
0
38
1
4
3
2

2
n
4
1
2
comic
38
1
4
3
2

2

4
3
2
cometh
2
cometary
2
comet
38
1
4
3
2

2

4
2
2
--
2
-
38
1
4
3
2

2

4
2
2
comedy
2
comedian
38
1
4
3
2

2
dt
4
2
2
comeback
2
come
38
1
4
3
2
sti
2

4
2
2
combustion
2
combustible
38
1
4
3
2
t
2
o
4
1
2
combinate
38
1
4
3
2
ri
2

4
2
2
combinatoric
2
combinatorial
38
1
4
3
2
n
2
a
4
1
2
combine
38
1
4
3
2
t
2

4
3
2
combatted
2
combatant
2
combat
38
1
4
3
2

2
aiu
4
1
2
comb
38
1
4
3
2

2

4
3
2
comatose
2
Comanche
2
coma
38
1
4
3
2

2
abeimp
4
2
2
comrade
2
comfort
38
1
4
3
2

2

4
2
2
columnar
2
column
38
1
4
3
2

2
i
4
1
2
Columbus
38
1
4
3
2

2

4
2
2
columbine
2
Columbia
38
1
4
3
2
m
2
bn
4
0
38
1
4
3
2

2

4
3
2
coltsfoot
2
coltish
2
colt
38
1
4
3
2
s
2

4
4
2
colossus
2
colossi
2
Colosseum
2
colossal
38
1
4
3
2

2
t
4
1
2
Colorado
38
1
4
3
2

2

4
2
2
coloratura
2
colorate
38
1
4
3
2

2
a
4
3
2
colors
2
colorimeter
2
color
38
1
4
3
2

2

4
2
2
colonist
2
colonial
38
1
4
3
2

2
i
4
4
2
colony
2
colonnade
2
colonel
2
colon
38
1
4
3
2
b
2

4
2
2
Colombo
2
Colombia
38
1
4
3
2

2
mnrs
4
1
2
Cologne
38
1
4
3
2

2

4
2
2
collusion
2
collude
38
1
4
3
2

2
a
4
1
2
colloquium
38
1
4
3
2

2

4
2
2
colloquial
2
colloquia
38
1
4
3
2

2
i
4
1
2
colloquy
38
1
4
3
2

2
u
4
1
2
Colloq
38
1
4
3
2

2
q
4
2
2
colloidal
2
collocation
38
1
4
3
2

2

4
2
2
Collins
2
collinear
38
1
4
3
2

2

4
2
2
Collier
2
collie
38
1
4
3
2

2
en
4
3
2
collision
2
collimate
2
collide
38
1
4
3
2
a
2

4
2
2
collegiate
2
collegian
38
1
4
3
2

2
i
4
1
2
college
38
1
4
3
2
t
2

4
3
2
collector
2
collectible
2
collect
38
1
4
3
2

2
cg
4
2
2
collet
2
colleague
38
1
4
3
2

2
gprt
4
1
2
collaborate
38
1
4
3
2
e
2

4
2
2
collateral
2
collate
38
1
4
3
2

2

4
3
2
collard
2
collarbone
2
collar
38
1
4
3
2
s
2

4
2
2
collapsible
2
collapse
38
1
4
3
2
e
2

4
2
2
collagen
2
collage
38
1
4
3
2

2
aeiou
4
0
38
1
4
3
2

2

4
3
2
coliseum
2
coliform
2
colicky
38
1
4
3
2

2

4
5
2
coleus
2
Colette
2
Coleridge
2
Coleman
2
Cole
38
1
4
3
2

2

4
3
2
colatitude
2
colander
2
cola
38
1
4
3
2

2
aeilotu
4
5
2
colza
2
Colgate
2
cold
2
Colby
2
col
38
1
4
3
2
t
2

4
2
2
coincidental
2
coincident
38
1
4
3
2
ide
2
n
4
1
2
coincide
38
1
4
3
2

2
c
4
2
2
coinage
2
coin
38
1
4
3
2

2
n
4
2
2
coil
2
coiffure
38
1
4
3
2

2

4
3
2
cohosh
2
cohort
2
cohomology
38
1
4
3
2

2
rs
4
1
2
Cohen
38
1
4
3
2
i
2

4
2
2
cohesive
2
cohesion
38
1
4
3
2
e
2

4
2
2
coherent
2
cohere
38
1
4
3
2

2
eo
4
1
2
Cohn
38
1
4
3
2
a
2

4
2
2
cognizant
2
cognizable
38
1
4
3
2
i
2

4
2
2
cognitive
2
cognition
38
1
4
3
2

2
tz
4
0
38
1
4
3
2

2

4
2
2
cognate
2
cognac
38
1
4
3
2

2
ai
4
0
38
1
4
3
2

2
n
4
3
2
cogitate
2
cogent
2
cog
38
1
4
3
2

2

4
3
2
coffeepot
2
coffeecup
2
coffee
38
1
4
3
2

2
e
4
2
2
Coffey
2
coffer
38
1
4
3
2

2
e
4
2
2
Coffman
2
coffin
38
1
4
3
2

2
f
4
1
2
cofactor
38
1
4
3
2
st
2

4
2
2
coexistent
2
coexist
38
1
4
3
2

2
i
4
1
2
coextensive
38
1
4
3
2

2

4
3
2
coercive
2
coercion
2
coercible
38
1
4
3
2
c
2
i
4
1
2
coerce
38
1
4
3
2

2

4
3
2
coeducation
2
coeditor
2
coed
38
1
4
3
2

2
drx
4
2
2
coequal
2
coefficient
38
1
4
3
2

2

4
2
2
codon
2
codomain
38
1
4
3
2

2

4
2
2
codify
2
codicil
38
1
4
3
2

2

4
5
2
codeword
2
codetermine
2
codeposit
2
codebreak
2
code
38
1
4
3
2

2

4
2
2
coddle
2
Coddington
38
1
4
3
2

2
deio
4
5
2
Cody
2
codpiece
2
codfish
2
coda
2
cod
38
1
4
3
2

2

4
4
2
cocoon
2
coconut
2
cocoa
2
coco
38
1
4
3
2
e
2

4
3
2
cockleshell
2
cocklebur
2
cockle
38
1
4
3
2

2
l
4
9
2
cocky
2
cocktail
2
cocksure
2
cockroach
2
cockpit
2
cockeye
2
cockcrow
2
cockatoo
2
cock
38
1
4
3
2
an
2

4
2
2
Cochrane
2
Cochran
38
1
4
3
2

2
r
4
2
2
cochlea
2
cochineal
38
1
4
3
2

2

4
2
2
cocaine
2
coca
38
1
4
3
2

2
ahko
4
1
2
coccidiosis
38
1
4
3
2
e
2

4
2
2
cobblestone
2
cobble
38
1
4
3
2

2
l
4
1
2
Cobb
38
1
4
3
2

2
b
4
4
2
cobweb
2
cobra
2
Cobol
2
cobalt
38
1
4
3
2

2

4
2
2
coaxial
2
coax
38
1
4
3
2

2

4
3
2
coattail
2
Coates
2
coat
38
1
4
3
2
t
2

4
3
2
coastline
2
coastal
2
coast
38
1
4
3
2
se
2

4
2
2
coarsen
2
coarse
38
1
4
3
2
sce
2

4
2
2
coalescent
2
coalesce
38
1
4
3
2

2
e
4
2
2
coalition
2
coal
38
1
4
3
2
ula
2

4
2
2
coagulate
2
coagulable
38
1
4
3
2
h
2
m
4
2
2
coachwork
2
coach
38
1
4
3
2

2

4
2
2
coachmen
2
coachman
38
1
4
3
2

2
cglrstx
4
2
2
coauthor
2
coadjutor
38
1
4
3
2

2
abcdefghilmnopqrstuvwxyz
4
2
2
coke
2
CO
38
1
4
3
2

2

4
2
2
Clytemnestra
2
Clyde
38
1
4
3
2

2

4
2
2
clutter
2
clutch
38
1
4
3
2

2

4
2
2
clumsy
2
clump
38
1
4
3
2

2

4
3
2
clubroom
2
clubhouse
2
club
38
1
4
3
2

2
bmt
4
5
2
cluster
2
clung
2
Cluj
2
clue
2
cluck
38
1
4
3
2

2

4
3
2
cloudy
2
cloudburst
2
cloud
38
1
4
3
2

2
d
4
1
2
clout
38
1
4
3
2

2

4
2
2
clothesmen
2
clothesman
38
1
4
3
2

2
m
4
3
2
clothesline
2
clotheshorse
2
clothesbrush
38
1
4
3
2

2
s
4
1
2
clothe
38
1
4
3
2

2
e
4
4
2
Clotho
2
clothier
2
clothbound
2
cloth
38
1
4
3
2

2
h
4
2
2
cloture
2
clot
38
1
4
3
2

2

4
5
2
closed
2
closes
2
closeup
2
closet
2
close
38
1
4
3
2

2
e
4
2
2
closing
2
closure
38
1
4
3
2

2

4
2
2
clonic
2
clone
38
1
4
3
2

2

4
2
2
clogging
2
clog
38
1
4
3
2

2

4
2
2
cloddish
2
clod
38
1
4
3
2

2

4
3
2
clockwork
2
clockwise
2
clockwatcher
38
1
4
3
2
k
2
w
4
1
2
clock
38
1
4
3
2
k
2

4
2
2
cloakroom
2
cloak
38
1
4
3
2

2
acdgnstu
4
6
2
cloy
2
clown
2
clove
2
clomp
2
cloister
2
clobber
38
1
4
3
2

2
b
4
1
2
clip
38
1
4
3
2

2

4
2
2
Clinton
2
Clint
38
1
4
3
2
c
2

4
2
2
clinician
2
clinic
38
1
4
3
2

2

4
2
2
clinging
2
cling
38
1
4
3
2

2
git
4
2
2
clink
2
clinch
38
1
4
3
2

2
t
4
2
2
climax
2
climactic
38
1
4
3
2

2

4
3
2
climatology
2
climatic
2
climate
38
1
4
3
2

2
a
4
2
2
clime
2
climb
38
1
4
3
2

2

4
3
2
Clifford
2
cliffhang
2
cliff
38
1
4
3
2

2
f
4
1
2
Clifton
38
1
4
3
2
nt
2

4
2
2
clientele
2
client
38
1
4
3
2

2

4
2
2
click
2
cliche
38
1
4
3
2

2
cefmnp
4
4
2
Clive
2
clitoris
2
clique
2
Clio
38
1
4
3
2
e
2

4
2
2
clever
2
Cleveland
38
1
4
3
2
y
2
m
4
1
2
clergy
38
1
4
3
2

2

4
2
2
clergymen
2
clergyman
38
1
4
3
2

2
g
4
2
2
clerk
2
cleric
38
1
4
3
2

2

4
2
2
Clemson
2
clement
38
1
4
3
2

2
nrv
4
1
2
cleat
38
1
4
3
2

2

4
2
2
cleave
2
cleavage
38
1
4
3
2

2

4
4
2
Clearwater
2
clearheaded
2
clearance
2
clear
38
1
4
3
2

2

4
3
2
cleanup
2
cleanse
2
clean
38
1
4
3
2

2
amrv
4
2
2
clench
2
cleft
38
1
4
3
2

2
dimnprstuy
4
1
2
claw
38
1
4
3
2

2

4
2
2
Clayton
2
clay
38
1
4
3
2
rophobi
2

4
2
2
claustrophobic
2
claustrophobia
38
1
4
3
2

2

4
2
2
Clausen
2
clause
38
1
4
3
2

2
et
4
2
2
Clausius
2
Claus
38
1
4
3
2

2
i
4
1
2
Claude
38
1
4
3
2

2

4
2
2
Claudio
2
Claudia
38
1
4
3
2

2
ds
4
0
38
1
4
3
2
ter
2

4
2
2
clattery
2
clatter
38
1
4
3
2

2

4
2
2
classify
2
classificatory
38
1
4
3
2

2
f
4
1
2
classic
38
1
4
3
2

2
i
4
4
2
classy
2
classroom
2
classmate
2
class
38
1
4
3
2

2
s
4
2
2
clasp
2
clash
38
1
4
3
2

2

4
2
2
Clarke
2
Clark
38
1
4
3
2

2

4
3
2
clarity
2
clarinet
2
clarify
38
1
4
3
2

2

4
2
2
Clarendon
2
Clarence
38
1
4
3
2

2
n
4
3
2
claret
2
Claremont
2
Clare
38
1
4
3
2

2
eik
4
1
2
Clara
38
1
4
3
2

2

4
3
2
Clapeyron
2
clapboard
2
clap
38
1
4
3
2

2

4
5
2
clannish
2
clank
2
clang
2
clandestine
2
clan
38
1
4
3
2

2

4
5
2
clamshell
2
clamp
2
clammy
2
clamber
2
clam
38
1
4
3
2

2

4
2
2
clairvoyant
2
Claire
38
1
4
3
2

2

4
2
2
claimant
2
claim
38
1
4
3
2

2
mr
4
0
38
1
4
3
2

2

4
2
2
cladophora
2
clad
38
1
4
3
2

2
aeiouy
4
0
38
1
4
3
2

2

4
2
2
civilian
2
civil
38
1
4
3
2

2
l
4
1
2
civic
38
1
4
3
2

2
i
4
1
2
civet
38
1
4
3
2

2

4
3
2
citywide
2
cityscape
2
city
38
1
4
3
2

2

4
2
2
citron
2
Citroen
38
1
4
3
2

2
o
4
3
2
citrus
2
citric
2
citrate
38
1
4
3
2

2
z
4
1
2
cities
38
1
4
3
2

2

4
2
2
citation
2
citadel
38
1
4
3
2

2
airy
4
2
2
cite
2
cit
38
1
4
3
2
ent
2

4
3
2
circumvented
2
circumvention
2
circumvent
38
1
4
3
2
an
2
c
4
1
2
circumstantial
38
1
4
3
2

2

4
2
2
circumsphere
2
circumspect
38
1
4
3
2
ri
2

4
2
2
circumscription
2
circumscribe
38
1
4
3
2

2
cpt
4
0
38
1
4
3
2
ren
2

4
2
2
circumferential
2
circumference
38
1
4
3
2

2
e
4
1
2
circumflex
38
1
4
3
2
i
2
s
4
1
2
circumcircle
38
1
4
3
2

2

4
2
2
circumcision
2
circumcise
38
1
4
3
2

2
cfsv
4
2
2
circumpolar
2
circumlocution
38
1
4
3
2

2

4
2
2
circulatory
2
circulate
38
1
4
3
2
a
2
t
4
2
2
circular
2
circulant
38
1
4
3
2
t
2

4
3
2
circuitry
2
circuitous
2
circuit
38
1
4
3
2

2
ilm
4
1
2
circus
38
1
4
3
2
e
2

4
2
2
circlet
2
circle
38
1
4
3
2
c
2
lu
4
2
2
Circe
2
circa
38
1
4
3
2
a
2

4
2
2
cinnamon
2
cinnabar
38
1
4
3
2
a
2

4
2
2
cinematic
2
cinema
38
1
4
3
2

2
m
4
1
2
Cinerama
38
1
4
3
2
r
2

4
2
2
Cinderella
2
cinder
38
1
4
3
2

2
e
4
1
2
Cindy
38
1
4
3
2

2

4
2
2
Cincinnati
2
cinch
38
1
4
3
2

2
cden
4
1
2
cinquefoil
38
1
4
3
2
ia
2

4
2
2
ciliate
2
cilia
38
1
4
3
2
ar
2

4
2
2
cigarette
2
cigar
38
1
4
3
2
ro
2

4
2
2
Ciceronian
2
Cicero
38
1
4
3
2

2
e
4
1
2
cicada
38
1
4
3
2

2
cglnrtv
4
4
2
cistern
2
cipher
2
cider
2
CIA
38
1
4
3
2

2

4
2
2
chutney
2
chute
38
1
4
3
2
h
2
gimw
4
2
2
churchyard
2
church
38
1
4
3
2
om
2

4
2
2
churchwomen
2
churchwoman
38
1
4
3
2

2

4
2
2
churchmen
2
churchman
38
1
4
3
2
ll
2

4
2
2
Churchillian
2
Churchill
38
1
4
3
2
o
2

4
2
2
churchgoing
2
churchgoer
38
1
4
3
2

2
c
4
1
2
churn
38
1
4
3
2

2

4
2
2
chunky
2
chunk
38
1
4
3
2

2
k
4
1
2
Chungking
38
1
4
3
2

2

4
3
2
chump
2
chummy
2
chum
38
1
4
3
2

2

4
2
2
chugging
2
chug
38
1
4
3
2
k
2

4
3
2
chuckwalla
2
chuckle
2
chuck
38
1
4
3
2

2

4
2
2
chubby
2
chub
38
1
4
3
2

2
bcgmnrt
4
1
2
chuff
38
1
4
3
2
s
2

4
3
2
chrysolite
2
Chrysler
2
chrysanthemum
38
1
4
3
2
raph
2

4
2
2
chronography
2
chronograph
38
1
4
3
2

2
g
4
1
2
chronology
38
1
4
3
2
c
2

4
2
2
chronicle
2
chronic
38
1
4
3
2

2
io
4
0
38
1
4
3
2

2
ai
4
2
2
chromosphere
2
chrome
38
1
4
3
2

2

4
2
2
chromium
2
chromic
38
1
4
3
2
t
2
io
4
1
2
chromate
38
1
4
3
2
h
2

4
2
2
chromatography
2
chromatograph
38
1
4
3
2
gra
2
p
4
1
2
chromatogram
38
1
4
3
2

2

4
2
2
chromatin
2
chromatic
38
1
4
3
2

2
mn
4
0
38
1
4
3
2
s
2
t
4
1
2
Chris
38
1
4
3
2
h
2

4
2
2
Christopher
2
Christoph
38
1
4
3
2

2
p
4
1
2
Christoffel
38
1
4
3
2

2

4
2
2
Christine
2
Christina
38
1
4
3
2
n
2

4
3
2
Christianson
2
Christiana
2
Christian
38
1
4
3
2

2
an
4
1
2
Christie
38
1
4
3
2

2

4
2
2
Christenson
2
Christensen
38
1
4
3
2
n
2
s
4
2
2
Christendom
2
christen
38
1
4
3
2

2
eio
4
3
2
Christy
2
Christmas
2
Christ
38
1
4
3
2

2
ioy
4
0
38
1
4
3
2

2

4
2
2
chowder
2
chow
38
1
4
3
2
e
2

4
2
2
chosen
2
chose
38
1
4
3
2
graph
2

4
2
2
choreography
2
choreograph
38
1
4
3
2

2
o
4
1
2
chore
38
1
4
3
2

2

4
2
2
chordate
2
chordata
38
1
4
3
2

2
t
4
1
2
chordal
38
1
4
3
2

2
a
4
1
2
chord
38
1
4
3
2
l
2

4
2
2
chorale
2
choral
38
1
4
3
2

2
ade
4
3
2
chorus
2
chortle
2
chorine
38
1
4
3
2

2

4
3
2
choppy
2
Chopin
2
chop
38
1
4
3
2
s
2

4
2
2
choosy
2
choose
38
1
4
3
2

2

4
2
2
Chomsky
2
chomp
38
1
4
3
2

2

4
2
2
cholesterol
2
cholera
38
1
4
3
2

2
e
4
1
2
cholinesterase
38
1
4
3
2
e
2

4
2
2
chokeberry
2
choke
38
1
4
3
2

2

4
2
2
choirmaster
2
choir
38
1
4
3
2

2
r
4
1
2
choice
38
1
4
3
2

2

4
3
2
Choctaw
2
chocolate
2
chock
38
1
4
3
2

2
ciklmoprsw
4
1
2
Chou
38
1
4
3
2
a
2

4
2
2
chloroplatinate
2
chloroplast
38
1
4
3
2

2
l
4
1
2
chlorophyll
38
1
4
3
2

2
p
4
1
2
chloroform
38
1
4
3
2

2

4
2
2
chlorine
2
chloride
38
1
4
3
2
or
2
io
4
2
2
chlordane
2
chlorate
38
1
4
3
2
lr
2

4
2
2
chivalry
2
chivalrous
38
1
4
3
2

2
a
4
1
2
chive
38
1
4
3
2

2

4
2
2
chiton
2
chit
38
1
4
3
2

2

4
2
2
Chisholm
2
chisel
38
1
4
3
2

2
p
4
1
2
chiropractor
38
1
4
3
2

2

4
4
2
Chippendale
2
chipmunk
2
chipboard
2
chip
38
1
4
3
2

2

4
2
2
Chinese
2
chine
38
1
4
3
2
h
2

4
2
2
chinchilla
2
chinch
38
1
4
3
2

2

4
2
2
Chinamen
2
Chinaman
38
1
4
3
2

2
m
4
2
2
Chinatown
2
china
38
1
4
3
2

2
ace
4
4
2
chinquapin
2
Chinook
2
chink
2
chin
38
1
4
3
2

2
r
4
1
2
chime
38
1
4
3
2

2

4
2
2
chimeric
2
chimera
38
1
4
3
2

2
e
4
3
2
chimpanzee
2
chimney
2
Chimique
38
1
4
3
2

2

4
2
2
chilly
2
chill
38
1
4
3
2

2

4
4
2
children
2
childish
2
childbirth
2
child
38
1
4
3
2

2
dl
4
3
2
chili
2
Chile
2
chilblain
38
1
4
3
2

2

4
2
2
chignon
2
chigger
38
1
4
3
2
f
2

4
3
2
chieftain
2
chiefdom
2
chief
38
1
4
3
2

2

4
4
2
chickweed
2
chicken
2
chickadee
2
chick
38
1
4
3
2

2

4
2
2
Chicano
2
chicanery
38
1
4
3
2
o
2

4
2
2
Chicagoan
2
Chicago
38
1
4
3
2

2
gn
4
0
38
1
4
3
2

2
ak
4
2
2
chicory
2
chic
38
1
4
3
2
n
2

4
2
2
chianti
2
Chiang
38
1
4
3
2

2
aceglmnprstv
4
3
2
chiffon
2
chide
2
chi
38
1
4
3
2
o
2

4
2
2
chevron
2
Chevrolet
38
1
4
3
2

2
r
4
2
2
chevy
2
chevalier
38
1
4
3
2
r
2

4
2
2
Chesterton
2
Chester
38
1
4
3
2

2
e
4
2
2
chestnut
2
chest
38
1
4
3
2

2
t
4
3
2
chess
2
Cheshire
2
Chesapeake
38
1
4
3
2
b
2

4
2
2
cherubim
2
cherub
38
1
4
3
2

2
u
4
5
2
Cheryl
2
chert
2
cherry
2
Cherokee
2
cherish
38
1
4
3
2

2

4
3
2
chenille
2
Cheney
2
Chen
38
1
4
3
2

2
s
4
1
2
chemic
38
1
4
3
2

2

4
2
2
chemistry
2
chemist
38
1
4
3
2
r
2

4
2
2
chemisorption
2
chemisorb
38
1
4
3
2

2
ot
4
1
2
chemise
38
1
4
3
2

2
i
4
1
2
chemotherapy
38
1
4
3
2

2
c
4
1
2
cheese
38
1
4
3
2

2

4
2
2
cheesecloth
2
cheesecake
38
1
4
3
2

2
e
4
1
2
cheesy
38
1
4
3
2

2

4
4
2
cheery
2
cheerleader
2
cheerful
2
cheer
38
1
4
3
2

2

4
3
2
cheeky
2
cheekbone
2
cheek
38
1
4
3
2

2
krs
4
1
2
cheetah
38
1
4
3
2

2

4
2
2
checksumming
2
checksummed
38
1
4
3
2
um
2
m
4
1
2
checksum
38
1
4
3
2
rb
2

4
2
2
checkerboard
2
checkerberry
38
1
4
3
2
k
2
es
4
6
2
checkup
2
checkpoint
2
checkout
2
checklist
2
checkbook
2
check
38
1
4
3
2

2
t
4
1
2
cheap
38
1
4
3
2

2

4
2
2
cheater
2
cheat
38
1
4
3
2

2
acemnrsv
4
4
2
Cheyenne
2
chew
2
chelate
2
chef
38
1
4
3
2

2
dfilmnoprstu
4
3
2
chaw
2
chagrin
2
Chablis
38
1
4
3
2

2

4
4
2
Chautauqua
2
Chauncey
2
chauffeur
2
Chaucer
38
1
4
3
2

2

4
3
2
chatty
2
chattel
2
Chattanooga
38
1
4
3
2
au
2

4
2
2
chateaux
2
chateau
38
1
4
3
2

2
et
4
2
2
Chatham
2
chat
38
1
4
3
2

2

4
2
2
chastity
2
chastise
38
1
4
3
2

2
i
4
1
2
chaste
38
1
4
3
2

2
t
4
3
2
chassis
2
chasm
2
chase
38
1
4
3
2

2

4
2
2
chartreuse
2
Chartres
38
1
4
3
2

2
e
4
1
2
chartroom
38
1
4
3
2

2
r
4
2
2
Charta
2
chart
38
1
4
3
2
tte
2

4
2
2
Charlottesville
2
Charlotte
38
1
4
3
2

2
s
4
2
2
Charley
2
Charlemagne
38
1
4
3
2

2

4
2
2
Charleston
2
Charles
38
1
4
3
2

2
eo
4
1
2
Charlie
38
1
4
3
2

2

4
2
2
charity
2
charitable
38
1
4
3
2
ma
2

4
2
2
charismatic
2
charisma
38
1
4
3
2

2
st
4
1
2
chariot
38
1
4
3
2
e
2

4
3
2
charges
2
chargeable
2
charge
38
1
4
3
2
cter
2

4
2
2
characteristic
2
character
38
1
4
3
2

2
agilt
4
6
2
Charybdis
2
Charon
2
charm
2
chard
2
charcoal
2
char
38
1
4
3
2

2

4
2
2
Chaplin
2
chaplain
38
1
4
3
2
on
2

4
2
2
chaperone
2
chaperon
38
1
4
3
2

2
r
4
1
2
chapel
38
1
4
3
2

2
el
4
4
2
chapter
2
Chapman
2
chaparral
2
chap
38
1
4
3
2

2

4
3
2
chaotic
2
chaos
2
Chao
38
1
4
3
2

2

4
4
2
chantry
2
Chantilly
2
chantey
2
chant
38
1
4
3
2

2

4
5
2
changes
2
changed
2
changeover
2
changeable
2
change
38
1
4
3
2

2
e
4
2
2
changing
2
Chang
38
1
4
3
2

2

4
2
2
chandler
2
chandelier
38
1
4
3
2

2
e
4
1
2
chancy
38
1
4
3
2

2
l
4
3
2
chances
2
chancery
2
chance
38
1
4
3
2

2

4
2
2
chancellor
2
chancel
38
1
4
3
2

2
cdgt
4
2
2
chanson
2
channel
38
1
4
3
2

2

4
2
2
Champaign
2
champagne
38
1
4
3
2

2
a
4
3
2
Champlain
2
champion
2
champ
38
1
4
3
2

2

4
2
2
chamomile
2
chamois
38
1
4
3
2
er
2

4
3
2
chambermaid
2
chamberlain
2
chamber
38
1
4
3
2

2
bop
4
2
2
chamfer
2
chameleon
38
1
4
3
2

2

4
3
2
chalky
2
chalkline
2
chalk
38
1
4
3
2

2

4
2
2
chalcocite
2
chalcedony
38
1
4
3
2

2
ck
4
3
2
Chalmers
2
challenge
2
chalice
38
1
4
3
2
om
2

4
2
2
chairwomen
2
chairwoman
38
1
4
3
2

2

4
2
2
chairmen
2
chairman
38
1
4
3
2

2
mw
4
3
2
chairperson
2
chairlady
2
chair
38
1
4
3
2

2
r
4
2
2
chaise
2
chain
38
1
4
3
2

2

4
2
2
chaff
2
chafe
38
1
4
3
2

2

4
2
2
Chadwick
2
Chad
38
1
4
3
2

2
aeiloru
4
0
38
1
4
3
2

2

4
2
2
Cetus
2
cetera
38
1
4
3
2

2

4
3
2
Cessna
2
cession
2
cessation
38
1
4
3
2

2
s
4
2
2
cesium
2
Cesare
38
1
4
3
2

2

4
2
2
cervix
2
Cervantes
38
1
4
3
2

2

4
2
2
certify
2
certificate
38
1
4
3
2

2
f
4
2
2
certitude
2
certiorari
38
1
4
3
2
in
2

4
2
2
certainty
2
certain
38
1
4
3
2

2
ai
4
0
38
1
4
3
2

2

4
2
2
cerium
2
cerise
38
1
4
3
2

2

4
2
2
ceremonious
2
ceremonial
38
1
4
3
2
on
2
i
4
1
2
ceremony
38
1
4
3
2
a
2

4
2
2
cerebrate
2
cerebral
38
1
4
3
2

2
r
4
1
2
cerebellum
38
1
4
3
2

2
bm
4
3
2
cereus
2
Ceres
2
cereal
38
1
4
3
2
mi
2

4
2
2
ceramium
2
ceramic
38
1
4
3
2

2
aeitv
4
3
2
cerulean
2
CERN
2
Cerberus
38
1
4
3
2

2

4
2
2
century
2
centum
38
1
4
3
2

2

4
2
2
centrifugate
2
centrifugal
38
1
4
3
2
ug
2
a
4
1
2
centrifuge
38
1
4
3
2

2
f
4
2
2
centrist
2
centric
38
1
4
3
2

2
ie
4
2
2
centroid
2
central
38
1
4
3
2

2

4
2
2
centipede
2
centigrade
38
1
4
3
2

2

4
3
2
centerpiece
2
centerline
2
center
38
1
4
3
2

2

4
2
2
centennial
2
centenary
38
1
4
3
2

2
nr
4
0
38
1
4
3
2

2
eiru
4
2
2
centaur
2
cent
38
1
4
3
2

2

4
2
2
census
2
censure
38
1
4
3
2
r
2

4
2
2
censorial
2
censor
38
1
4
3
2

2
ou
4
0
38
1
4
3
2

2
st
4
1
2
Cenozoic
38
1
4
3
2
e
2

4
2
2
cemetery
2
cement
38
1
4
3
2

2

4
2
2
cellulose
2
celluloid
38
1
4
3
2
l
2
o
4
1
2
cellular
38
1
4
3
2

2
u
4
3
2
cellophane
2
cellar
2
cell
38
1
4
3
2
t
2

4
2
2
celestial
2
celesta
38
1
4
3
2

2

4
2
2
celery
2
celerity
38
1
4
3
2

2
r
4
1
2
Celebes
38
1
4
3
2

2

4
2
2
celebrate
2
celebrant
38
1
4
3
2

2
a
4
1
2
celebrity
38
1
4
3
2

2
brs
4
0
38
1
4
3
2
n
2

4
2
2
Celanese
2
celandine
38
1
4
3
2

2
ael
4
3
2
Celtic
2
Celsius
2
Celia
38
1
4
3
2

2

4
4
2
Cedric
2
cedilla
2
cede
2
cedar
38
1
4
3
2
l
2

4
2
2
Cecilia
2
Cecil
38
1
4
3
2

2
i
4
1
2
Cecropia
38
1
4
3
2

2
cdlmnrst
4
5
2
Cezanne
2
Ceylon
2
Cepheus
2
ceil
2
cease
38
1
4
3
2

2

4
3
2
Cayuga
2
Cayley
2
cayenne
38
1
4
3
2

2

4
2
2
cavilling
2
cavil
38
1
4
3
2

2
l
4
2
2
Caviness
2
caviar
38
1
4
3
2
n
2

4
2
2
cavernous
2
cavern
38
1
4
3
2

2

4
2
2
cavemen
2
caveman
38
1
4
3
2

2
mr
4
3
2
Cavendish
2
caveat
2
cave
38
1
4
3
2
l
2

4
3
2
cavalry
2
cavalier
2
cavalcade
38
1
4
3
2

2
aei
4
1
2
cavort
38
1
4
3
2

2

4
2
2
cautionary
2
caution
38
1
4
3
2
io
2
n
4
1
2
cautious
38
1
4
3
2

2

4
2
2
causate
2
causal
38
1
4
3
2

2
ae
4
2
2
causing
2
caustic
38
1
4
3
2

2

4
2
2
caulk
2
cauliflower
38
1
4
3
2

2
a
4
2
2
caucus
2
Cauchy
38
1
4
3
2
s
2

4
2
2
Caucasus
2
Caucasian
38
1
4
3
2

2
clst
4
1
2
caught
38
1
4
3
2

2

4
2
2
cattlemen
2
cattleman
38
1
4
3
2
e
2
m
4
1
2
cattle
38
1
4
3
2

2
l
4
1
2
cattail
38
1
4
3
2

2

4
2
2
catsup
2
Catskill
38
1
4
3
2
on
2

4
2
2
cationic
2
cation
38
1
4
3
2

2

4
2
2
cathodic
2
cathode
38
1
4
3
2

2
d
4
1
2
catholic
38
1
4
3
2

2

4
2
2
Catherwood
2
Catherine
38
1
4
3
2

2
r
4
2
2
catheter
2
cathedral
38
1
4
3
2

2
eo
4
2
2
Cathy
2
catharsis
38
1
4
3
2

2

4
2
2
caterpillar
2
cater
38
1
4
3
2
or
2

4
2
2
category
2
categoric
38
1
4
3
2

2
gr
4
2
2
catenate
2
catechism
38
1
4
3
2
h
2

4
4
2
catchy
2
catchword
2
catchup
2
catch
38
1
4
3
2
oni
2

4
2
2
catatonic
2
catatonia
38
1
4
3
2
troph
2

4
2
2
catastrophic
2
catastrophe
38
1
4
3
2

2

4
2
2
catalyst
2
catalysis
38
1
4
3
2

2
s
4
1
2
catalytic
38
1
4
3
2

2
y
4
3
2
catalpa
2
catalogue
2
Catalina
38
1
4
3
2

2
lst
4
4
2
catawba
2
cataract
2
catapult
2
cataclysmic
38
1
4
3
2

2
acehist
4
5
2
catnip
2
catkin
2
catfish
2
catbird
2
cat
38
1
4
3
2
al
2

4
2
2
casualty
2
casual
38
1
4
3
2

2

4
2
2
Castillo
2
castigate
38
1
4
3
2

2

4
2
2
casteth
2
caste
38
1
4
3
2

2
ei
4
5
2
Castro
2
castor
2
castle
2
castanet
2
cast
38
1
4
3
2

2

4
2
2
Cassius
2
Cassiopeia
38
1
4
3
2

2

4
2
2
cassette
2
casserole
38
1
4
3
2

2
ei
4
2
2
cassock
2
Cassandra
38
1
4
3
2

2

4
2
2
casket
2
cask
38
1
4
3
2

2

4
4
2
cashmere
2
cashier
2
cashew
2
cash
38
1
4
3
2

2

4
5
2
Casey
2
casework
2
casein
2
casebook
2
case
38
1
4
3
2
a
2

4
2
2
cascara
2
cascade
38
1
4
3
2

2
cehkstu
4
3
2
casino
2
casbah
2
Casanova
38
1
4
3
2
e
2

4
2
2
carven
2
carve
38
1
4
3
2
raph
2

4
2
2
cartography
2
cartographer
38
1
4
3
2

2
g
4
2
2
cartoon
2
carton
38
1
4
3
2
lag
2

4
2
2
cartilaginous
2
cartilage
38
1
4
3
2

2

4
3
2
Cartesian
2
cartel
2
carte
38
1
4
3
2

2
eio
4
4
2
cartwheel
2
cartridge
2
Carthage
2
cart
38
1
4
3
2

2

4
2
2
carryover
2
carry
38
1
4
3
2

2

4
2
2
carrot
2
Carroll
38
1
4
3
2

2

4
3
2
carrion
2
Carrie
2
carriage
38
1
4
3
2

2

4
2
2
Carrara
2
carrageen
38
1
4
3
2

2
aioy
4
3
2
Carruthers
2
carrel
2
Carr
38
1
4
3
2
t
2

4
2
2
carpentry
2
carpenter
38
1
4
3
2

2
n
4
1
2
carpet
38
1
4
3
2

2
e
4
3
2
carport
2
Carpathia
2
carp
38
1
4
3
2
n
2

4
4
2
Carolinian
2
Carolingian
2
Caroline
2
Carolina
38
1
4
3
2

2
i
4
2
2
Carolyn
2
carol
38
1
4
3
2

2
l
4
2
2
carouse
2
carob
38
1
4
3
2

2

4
3
2
carney
2
Carnegie
2
carne
38
1
4
3
2

2

4
3
2
carnation
2
carnal
2
carnage
38
1
4
3
2

2
ae
4
1
2
carnival
38
1
4
3
2

2

4
2
2
carmine
2
Carmichael
38
1
4
3
2

2

4
2
2
Carmen
2
Carmela
38
1
4
3
2

2
ei
4
0
38
1
4
3
2

2

4
2
2
carload
2
Carlo
38
1
4
3
2

2

4
2
2
Carlisle
2
Carlin
38
1
4
3
2

2
io
4
6
2
Carlyle
2
Carlton
2
Carlson
2
Carleton
2
Carla
2
Carl
38
1
4
3
2

2

4
3
2
caribou
2
Caribbean
2
Carib
38
1
4
3
2

2
b
4
1
2
caricature
38
1
4
3
2

2

4
2
2
cargoes
2
cargo
38
1
4
3
2

2
o
4
1
2
Cargill
38
1
4
3
2

2

4
2
2
caretaker
2
caret
38
1
4
3
2

2
u
4
1
2
carefree
38
1
4
3
2

2

4
2
2
career
2
careen
38
1
4
3
2

2
eft
4
4
2
Carey
2
careworn
2
caress
2
care
38
1
4
3
2

2

4
3
2
cardiovascular
2
cardiology
2
cardiod
38
1
4
3
2

2
o
4
3
2
cardinal
2
Cardiff
2
cardiac
38
1
4
3
2

2
i
4
3
2
cardboard
2
cardamom
2
card
38
1
4
3
2
en
2

4
2
2
carcinogenic
2
carcinogen
38
1
4
3
2
no
2
g
4
1
2
carcinoma
38
1
4
3
2

2
i
4
1
2
carcass
38
1
4
3
2

2

4
2
2
carburetor
2
carbuncle
38
1
4
3
2
y
2

4
2
2
carboxylic
2
carboxy
38
1
4
3
2

2

4
2
2
carbonium
2
carbonic
38
1
4
3
2

2

4
2
2
carbonate
2
carbonaceous
38
1
4
3
2

2
ai
4
4
2
carbonyl
2
Carbone
2
Carbondale
2
carbon
38
1
4
3
2

2
nx
4
4
2
carboy
2
carborundum
2
Carboloy
2
carbohydrate
38
1
4
3
2

2

4
2
2
carbine
2
carbide
38
1
4
3
2

2
iou
4
0
38
1
4
3
2

2

4
5
2
caraway
2
caravan
2
caramel
2
Caracas
2
carabao
38
1
4
3
2

2
abcdegilmnoprtv
4
3
2
Caruso
2
Carson
2
car
38
1
4
3
2

2

4
2
2
captive
2
captivate
38
1
4
3
2

2

4
2
2
captious
2
caption
38
1
4
3
2

2
ov
4
0
38
1
4
3
2
in
2

4
2
2
captaincy
2
captain
38
1
4
3
2

2
ai
4
2
2
capture
2
captor
38
1
4
3
2

2

4
2
2
capstone
2
capstan
38
1
4
3
2

2
t
4
2
2
capsule
2
capsize
38
1
4
3
2
ic
2

4
3
2
Capricorn
2
capricious
2
caprice
38
1
4
3
2
l
2

4
2
2
Capitoline
2
capitol
38
1
4
3
2

2

4
2
2
capital
2
capita
38
1
4
3
2

2
ao
4
1
2
capitulate
38
1
4
3
2

2
t
4
2
2
Capistrano
2
capillary
38
1
4
3
2

2

4
4
2
Capetown
2
caper
2
capella
2
cape
38
1
4
3
2

2

4
2
2
capacitate
2
capacitance
38
1
4
3
2

2
a
4
3
2
capacity
2
capacitor
2
capacitive
38
1
4
3
2
ci
2
t
4
1
2
capacious
38
1
4
3
2

2
aeirst
4
4
2
capybara
2
Caputo
2
capo
2
cap
38
1
4
3
2
as
2

4
3
2
canvass
2
canvasback
2
canvas
38
1
4
3
2

2

4
2
2
Cantonese
2
canton
38
1
4
3
2

2
n
4
2
2
cantor
2
canto
38
1
4
3
2

2

4
2
2
cantilever
2
canticle
38
1
4
3
2

2

4
2
2
canterelle
2
Canterbury
38
1
4
3
2

2
r
4
1
2
canteen
38
1
4
3
2

2

4
2
2
cantaloupe
2
Cantabrigian
38
1
4
3
2

2
aeio
4
2
2
cantle
2
cant
38
1
4
3
2

2

4
2
2
canonic
2
canon
38
1
4
3
2

2
n
4
3
2
canopy
2
Canoga
2
canoe
38
1
4
3
2

2

4
2
2
cannonball
2
cannon
38
1
4
3
2

2
n
4
1
2
cannot
38
1
4
3
2

2

4
2
2
cannister
2
cannibal
38
1
4
3
2

2

4
2
2
cannery
2
cannel
38
1
4
3
2

2

4
2
2
cannabis
2
canna
38
1
4
3
2

2
aeio
4
1
2
canny
38
1
4
3
2
er
2

4
2
2
cankerworm
2
canker
38
1
4
3
2

2

4
2
2
canister
2
Canis
38
1
4
3
2

2
s
4
1
2
canine
38
1
4
3
2
e
2

4
4
2
candlewick
2
candlestick
2
candlelight
2
candle
38
1
4
3
2

2

4
2
2
candidate
2
candidacy
38
1
4
3
2
d
2
a
4
2
2
Candide
2
candid
38
1
4
3
2
la
2

4
2
2
candelabra
2
candela
38
1
4
3
2

2
eil
4
1
2
candy
38
1
4
3
2

2

4
2
2
cancerous
2
cancer
38
1
4
3
2

2
l
4
1
2
cancel
38
1
4
3
2

2

4
3
2
cancelling
2
cancelled
2
cancellate
38
1
4
3
2
e
2
lr
4
0
38
1
4
3
2

2

4
2
2
Canadian
2
Canada
38
1
4
3
2

2
d
4
4
2
Canaveral
2
canary
2
canal
2
Canaan
38
1
4
3
2

2
acdiknotv
4
6
2
canyon
2
can't
2
Canfield
2
cane
2
Canberra
2
can
38
1
4
3
2

2

4
2
2
campanile
2
campaign
38
1
4
3
2

2
a
4
7
2
campus
2
campsite
2
campion
2
campground
2
campfire
2
Campbell
2
camp
38
1
4
3
2
l
2

4
2
2
Camille
2
camilla
38
1
4
3
2

2
l
4
1
2
Camino
38
1
4
3
2

2

4
2
2
Cameroun
2
Cameron
38
1
4
3
2

2
m
4
1
2
camera
38
1
4
3
2

2

4
2
2
cameramen
2
cameraman
38
1
4
3
2

2
ao
4
0
38
1
4
3
2

2

4
2
2
Camelot
2
camelopard
38
1
4
3
2

2
o
4
3
2
camellia
2
camelback
2
camel
38
1
4
3
2

2
lr
4
2
2
cameo
2
came
38
1
4
3
2
i
2

4
3
2
Cambridge
2
cambric
2
Cambrian
38
1
4
3
2

2
r
4
2
2
Cambodia
2
camber
38
1
4
3
2

2
beip
4
4
2
camouflage
2
Camden
2
camaraderie
2
cam
38
1
4
3
2

2

4
2
2
Calvert
2
calve
38
1
4
3
2

2
e
4
2
2
Calvin
2
Calvary
38
1
4
3
2

2

4
2
2
calumny
2
calumniate
38
1
4
3
2
m
2
n
4
1
2
Calumet
38
1
4
3
2
ri
2

4
3
2
calorimeter
2
calorie
2
caloric
38
1
4
3
2
raph
2

4
2
2
calligraphy
2
calligraph
38
1
4
3
2

2
g
4
3
2
calling
2
Callisto
2
calliope
38
1
4
3
2

2

4
4
2
callable
2
Callahan
2
Callaghan
2
calla
38
1
4
3
2

2
ai
4
5
2
calls
2
called
2
callus
2
callous
2
call
38
1
4
3
2

2

4
2
2
caliphate
2
caliph
38
1
4
3
2

2
h
4
1
2
caliper
38
1
4
3
2
orni
2

4
2
2
californium
2
California
38
1
4
3
2

2
r
4
1
2
caliber
38
1
4
3
2

2

4
2
2
calibre
2
calibrate
38
1
4
3
2

2
bfp
4
2
2
calisthenic
2
calico
38
1
4
3
2

2

4
2
2
calfskin
2
calf
38
1
4
3
2
d
2

4
2
2
calendrical
2
calendar
38
1
4
3
2

2
n
4
1
2
Caleb
38
1
4
3
2
r
2

4
2
2
caldera
2
Calder
38
1
4
3
2

2
e
4
1
2
Caldwell
38
1
4
3
2

2
a
4
2
2
calculus
2
calculi
38
1
4
3
2

2

4
2
2
calculate
2
calculable
38
1
4
3
2

2
l
4
1
2
Calcutta
38
1
4
3
2

2

4
3
2
calcium
2
calcite
2
calcify
38
1
4
3
2

2
iu
4
1
2
calcareous
38
1
4
3
2
t
2

4
2
2
calamity
2
calamitous
38
1
4
3
2

2
i
4
1
2
calamus
38
1
4
3
2

2
m
4
1
2
Calais
38
1
4
3
2

2
acdefilouv
4
6
2
calypso
2
calm
2
Calkins
2
Calhoun
2
Calgary
2
Cal
38
1
4
3
2

2

4
2
2
Cairo
2
cairn
38
1
4
3
2

2

4
2
2
Caine
2
Cain
38
1
4
3
2

2
nr
4
1
2
caiman
38
1
4
3
2

2

4
2
2
cahoot
2
Cahill
38
1
4
3
2
e
2

4
2
2
cagey
2
cage
38
1
4
3
2
e
2

4
2
2
cafeteria
2
cafe
38
1
4
3
2

2

4
2
2
cadenza
2
cadent
38
1
4
3
2

2
n
4
1
2
cadet
38
1
4
3
2

2

4
2
2
caddy
2
caddis
38
1
4
3
2
ver
2

4
2
2
cadaverous
2
cadaver
38
1
4
3
2

2
ade
4
4
2
Cady
2
cadre
2
cadmium
2
Cadillac
38
1
4
3
2

2

4
2
2
cactus
2
cacti
38
1
4
3
2
phon
2

4
2
2
cacophony
2
cacophonist
38
1
4
3
2

2

4
2
2
cache
2
cachalot
38
1
4
3
2

2
hot
4
3
2
CACM
2
cackle
2
cacao
38
1
4
3
2
t
2

4
3
2
cabinetry
2
cabinetmake
2
cabinet
38
1
4
3
2
n
2
e
4
1
2
cabin
38
1
4
3
2

2

4
3
2
cabaret
2
cabana
2
cabal
38
1
4
3
2

2
ai
4
5
2
Cabot
2
cable
2
cabdriver
2
cabbage
2
cab
38
1
4
3
2

2
bcdfghilmnprstuvy
4
5
2
caw
2
cake
2
cajole
2
Caesar
2
CA
38
1
4
3
2

2
aehilOpruyz
4
7
2
CT
2
csnet
2
c's
2
cf
2
CDC
2
CBS
2
c
38
1
4
3
2
anti
2

4
2
2
Byzantium
2
Byzantine
38
1
4
3
2

2

4
2
2
byword
2
byway
38
1
4
3
2

2

4
2
2
Byronic
2
Byron
38
1
4
3
2

2
n
4
1
2
byroad
38
1
4
3
2

2
o
4
2
2
Byrne
2
Byrd
38
1
4
3
2

2

4
2
2
bypath
2
bypass
38
1
4
3
2

2
a
4
1
2
byproduct
38
1
4
3
2

2

4
2
2
byline
2
bylaw
38
1
4
3
2

2
lprwz
4
5
2
byte
2
bystander
2
bygone
2
bye
2
by
38
1
4
3
2
z
2

4
5
2
buzzy
2
buzzword
2
buzzing
2
Buzzard
2
buzz
38
1
4
3
2

2

4
2
2
Buxton
2
Buxtehude
38
1
4
3
2

2
t
4
1
2
buxom
38
1
4
3
2

2

4
2
2
butyric
2
butyrate
38
1
4
3
2

2
r
4
1
2
butyl
38
1
4
3
2

2

4
2
2
Buttrick
2
buttress
38
1
4
3
2

2

4
3
2
buttonweed
2
buttonhole
2
button
38
1
4
3
2

2
n
4
1
2
buttock
38
1
4
3
2

2

4
3
2
butterfly
2
Butterfield
2
butterfat
38
1
4
3
2

2
f
4
5
2
buttery
2
butternut
2
buttermilk
2
buttercup
2
butterball
38
1
4
3
2

2
r
4
1
2
butte
38
1
4
3
2

2
eor
4
1
2
butt
38
1
4
3
2

2

4
2
2
buteo
2
butene
38
1
4
3
2
h
2

4
2
2
butchery
2
butch
38
1
4
3
2

2

4
2
2
butane
2
butadiene
38
1
4
3
2

2
acety
4
2
2
butler
2
but
38
1
4
3
2

2

4
3
2
bustle
2
bustard
2
bust
38
1
4
3
2

2

4
2
2
businessmen
2
businessman
38
1
4
3
2
ness
2
m
4
2
2
businesses
2
business
38
1
4
3
2

2

4
6
2
bushy
2
bushwhack
2
Bushnell
2
bushmaster
2
bushel
2
bush
38
1
4
3
2

2
hit
4
5
2
busy
2
buss
2
Busch
2
busboy
2
bus
38
1
4
3
2

2

4
3
2
Burtt
2
Burton
2
Burt
38
1
4
3
2

2

4
2
2
bursty
2
burst
38
1
4
3
2

2
t
4
1
2
bursitis
38
1
4
3
2

2

4
3
2
burrow
2
Burroughs
2
burro
38
1
4
3
2

2
o
4
1
2
Burr
38
1
4
3
2

2

4
7
2
burnt
2
Burnside
2
burnout
2
burnish
2
Burnham
2
Burnett
2
burn
38
1
4
3
2

2

4
2
2
Burmese
2
Burma
38
1
4
3
2

2

4
2
2
burley
2
burlesque
38
1
4
3
2

2
e
4
4
2
burly
2
Burlington
2
burlap
2
burl
38
1
4
3
2
nd
2

4
2
2
Burgundy
2
Burgundian
38
1
4
3
2
ar
2

4
3
2
burglary
2
burglarproof
2
burglar
38
1
4
3
2

2

4
2
2
burgess
2
burgeon
38
1
4
3
2

2
elu
4
2
2
burgher
2
burg
38
1
4
3
2

2

4
2
2
burette
2
buret
38
1
4
3
2
u
2
c
4
1
2
bureau
38
1
4
3
2

2

4
2
2
bureaucratic
2
bureaucrat
38
1
4
3
2
ra
2
t
4
1
2
bureaucracy
38
1
4
3
2

2
at
4
0
38
1
4
3
2
n
2

4
2
2
burdensome
2
burden
38
1
4
3
2

2
e
4
1
2
burdock
38
1
4
3
2

2
deglmnrst
4
7
2
bury
2
Burundi
2
burp
2
Burke
2
burial
2
Burch
2
burbank
38
1
4
3
2
y
2

4
2
2
buoyant
2
buoy
38
1
4
3
2

2

4
2
2
bunkmate
2
bunk
38
1
4
3
2

2

4
2
2
bungle
2
bungalow
38
1
4
3
2

2

4
4
2
bundy
2
Bundoora
2
bundle
2
Bundestag
38
1
4
3
2

2
dgk
4
6
2
Bunyan
2
bunt
2
Bunsen
2
bunny
2
bunch
2
bun
38
1
4
3
2

2

4
2
2
bumptious
2
bump
38
1
4
3
2
le
2

4
2
2
bumblebee
2
bumble
38
1
4
3
2

2
bp
4
1
2
bum
38
1
4
3
2

2

4
2
2
bullyboy
2
bully
38
1
4
3
2

2

4
2
2
bullhide
2
bullhead
38
1
4
3
2

2

4
2
2
bullfrog
2
bullfinch
38
1
4
3
2
t
2

4
2
2
bulletin
2
bullet
38
1
4
3
2
o
2

4
2
2
bulldoze
2
bulldog
38
1
4
3
2

2
defhy
4
5
2
bullwhack
2
bullseye
2
bullock
2
bullish
2
bull
38
1
4
3
2

2

4
3
2
bulky
2
bulkhead
2
bulk
38
1
4
3
2

2

4
2
2
bulge
2
Bulgaria
38
1
4
3
2

2

4
2
2
bulblet
2
bulb
38
1
4
3
2

2
bgkl
4
2
2
bulwark
2
bulrush
38
1
4
3
2

2

4
3
2
built-in
2
builtin
2
built
38
1
4
3
2

2
i
4
2
2
buildup
2
build
38
1
4
3
2

2
dt
4
0
38
1
4
3
2

2
l
4
1
2
Buick
38
1
4
3
2

2

4
2
2
buggy
2
bugging
38
1
4
3
2

2
g
4
4
2
bugle
2
bugeyed
2
bugaboo
2
bug
38
1
4
3
2
f
2
e
4
4
2
buffoon
2
bufflehead
2
buffalo
2
buff
38
1
4
3
2
n
2

4
2
2
Buenos
2
Buena
38
1
4
3
2

2

4
2
2
budgetary
2
budget
38
1
4
3
2
e
2
t
4
1
2
budge
38
1
4
3
2
s
2

4
2
2
Buddhist
2
Buddhism
38
1
4
3
2

2
i
4
1
2
Buddha
38
1
4
3
2

2
h
4
2
2
buddy
2
Budd
38
1
4
3
2

2
dg
4
3
2
Budweiser
2
Budapest
2
bud
38
1
4
3
2

2

4
2
2
buckskin
2
buckshot
38
1
4
3
2
e
2

4
2
2
Buckley
2
buckle
38
1
4
3
2

2

4
2
2
bucketfull
2
bucket
38
1
4
3
2

2
t
4
1
2
buckeye
38
1
4
3
2

2
els
4
7
2
buckwheat
2
buckthorn
2
Bucknell
2
buckhorn
2
buckboard
2
buckaroo
2
buck
38
1
4
3
2

2
a
4
2
2
Buchwald
2
Buchenwald
38
1
4
3
2

2

4
2
2
Bucharest
2
Buchanan
38
1
4
3
2

2
hk
4
1
2
bucolic
38
1
4
3
2

2

4
2
2
bubble
2
bub
38
1
4
3
2

2
bcdefgilmnorstxzy
4
1
2
Bujumbura
38
1
4
3
2
hyt
2

4
2
2
bryophyte
2
bryophyta
38
1
4
3
2

2
p
4
1
2
bryozoa
38
1
4
3
2
n
2

4
2
2
Bryant
2
Bryan
38
1
4
3
2

2
ao
4
2
2
Bryn
2
Bryce
38
1
4
3
2

2

4
2
2
brute
2
brutal
38
1
4
3
2

2

4
4
2
brushy
2
brushwork
2
brushfire
2
brush
38
1
4
3
2

2
h
4
2
2
Brussels
2
brusque
38
1
4
3
2

2

4
6
2
brunt
2
Brunswick
2
Bruno
2
Brunhilde
2
brunette
2
brunch
38
1
4
3
2

2

4
2
2
bruit
2
bruise
38
1
4
3
2

2
e
4
1
2
Bruckner
38
1
4
3
2

2

4
2
2
brucellosis
2
Bruce
38
1
4
3
2

2
cinst
4
2
2
Brumidi
2
Bruegel
38
1
4
3
2

2

4
3
2
brownish
2
brownie
2
Brownian
38
1
4
3
2

2

4
2
2
Brownell
2
Browne
38
1
4
3
2

2
ei
4
1
2
brown
38
1
4
3
2

2
n
4
3
2
browse
2
browbeaten
2
brow
38
1
4
3
2

2

4
2
2
brouhaha
2
brought
38
1
4
3
2

2

4
2
2
brother
2
brothel
38
1
4
3
2
h
2
e
4
1
2
broth
38
1
4
3
2

2

4
2
2
broomcorn
2
broom
38
1
4
3
2

2

4
2
2
Brooklyn
2
Brookline
38
1
4
3
2

2
l
4
4
2
brookside
2
Brookhaven
2
Brooke
2
brook
38
1
4
3
2

2

4
2
2
broody
2
brood
38
1
4
3
2

2
dkm
4
0
38
1
4
3
2

2

4
2
2
bronzy
2
bronze
38
1
4
3
2

2
h
4
1
2
bronco
38
1
4
3
2

2
i
4
1
2
bronchus
38
1
4
3
2

2
o
4
3
2
bronchitis
2
bronchial
2
bronchi
38
1
4
3
2
l
2

4
2
2
bronchiole
2
bronchiolar
38
1
4
3
2

2
cz
4
2
2
Bronx
2
Brontosaurus
38
1
4
3
2

2

4
2
2
bromine
2
bromide
38
1
4
3
2

2
i
4
2
2
Bromley
2
Bromfield
38
1
4
3
2
e
2

4
3
2
brokerage
2
broken
2
broke
38
1
4
3
2

2

4
2
2
brockle
2
Brock
38
1
4
3
2

2
k
4
3
2
brochure
2
broccoli
2
brocade
38
1
4
3
2

2
d
4
1
2
broach
38
1
4
3
2

2

4
6
2
Broadway
2
broadside
2
broadloom
2
broaden
2
broadcast
2
broad
38
1
4
3
2

2
ackmnotuw
4
2
2
broil
2
Broglie
38
1
4
3
2

2

4
3
2
brittle
2
Britten
2
Brittany
38
1
4
3
2

2
n
4
1
2
Britain
38
1
4
3
2
nic
2

4
2
2
Britannica
2
Britannic
38
1
4
3
2

2
at
4
3
2
Briton
2
British
2
britches
38
1
4
3
2

2

4
2
2
Bristol
2
bristle
38
1
4
3
2

2
t
4
2
2
brisk
2
Brisbane
38
1
4
3
2

2

4
2
2
brinkmanship
2
brink
38
1
4
3
2

2

4
2
2
brindle
2
Brindisi
38
1
4
3
2

2
dkg
4
2
2
briny
2
brine
38
1
4
3
2

2

4
3
2
brimstone
2
brimful
2
brim
38
1
4
3
2
l
2

4
2
2
Brillouin
2
brilliant
38
1
4
3
2

2

4
3
2
Brighton
2
brighten
2
bright
38
1
4
3
2

2
t
4
1
2
Brigham
38
1
4
3
2

2

4
2
2
brigadier
2
brigade
38
1
4
3
2

2
d
4
1
2
brigantine
38
1
4
3
2

2
ah
4
2
2
Briggs
2
brig
38
1
4
3
2
f
2

4
2
2
briefcase
2
brief
38
1
4
3
2

2

4
2
2
bridgework
2
Bridgewater
38
1
4
3
2

2

4
2
2
Bridgetown
2
Bridget
38
1
4
3
2
e
2
tw
4
4
2
Bridgeport
2
bridgehead
2
bridgeable
2
bridge
38
1
4
3
2

2

4
3
2
bridesmaid
2
bridegroom
2
bride
38
1
4
3
2

2
eg
4
2
2
bridle
2
bridal
38
1
4
3
2
ay
2

4
2
2
bricklaying
2
bricklayer
38
1
4
3
2

2
l
4
2
2
brickbat
2
brick
38
1
4
3
2

2
k
4
1
2
Brice
38
1
4
3
2
e
2

4
2
2
bribery
2
bribe
38
1
4
3
2

2

4
2
2
briar
2
Brian
38
1
4
3
2

2
abcdeglmnst
4
0
38
1
4
3
2

2

4
3
2
Brewster
2
brewery
2
brew
38
1
4
3
2

2

4
2
2
brevet
2
breve
38
1
4
3
2

2
e
4
1
2
brevity
38
1
4
3
2

2

4
3
2
Brett
2
Breton
2
brethren
38
1
4
3
2

2

4
2
2
Brenner
2
Brennan
38
1
4
3
2
a
2

4
2
2
Brendan
2
Brenda
38
1
4
3
2

2
dn
4
1
2
Brent
38
1
4
3
2

2

4
2
2
bremsstrahlung
2
Bremen
38
1
4
3
2

2

4
2
2
breezy
2
breeze
38
1
4
3
2

2
z
4
2
2
breed
2
breech
38
1
4
3
2

2
dkst
4
2
2
bream
2
breach
38
1
4
3
2
h
2

4
4
2
breathy
2
breathtaking
2
breathe
2
breath
38
1
4
3
2
t
2

4
3
2
breastwork
2
breastplate
2
breast
38
1
4
3
2

2

4
2
2
breakaway
2
breakage
38
1
4
3
2

2
a
4
8
2
breakwater
2
breakup
2
breakthrough
2
breakpoint
2
breakoff
2
breakfast
2
breakdown
2
break
38
1
4
3
2

2

4
5
2
breadth
2
breadroot
2
breadfruit
2
breadboard
2
bread
38
1
4
3
2

2
aemntvw
4
3
2
Brest
2
bred
2
breccia
38
1
4
3
2

2
cdghiknsvz
4
6
2
bray
2
brawl
2
Braun
2
bratwurst
2
bramble
2
brae
38
1
4
3
2

2

4
2
2
Brazilian
2
Brazil
38
1
4
3
2

2
l
4
1
2
brazier
38
1
4
3
2

2
i
4
2
2
Brazzaville
2
brazen
38
1
4
3
2

2

4
2
2
bravery
2
brave
38
1
4
3
2

2
e
4
3
2
bravura
2
bravo
2
bravado
38
1
4
3
2

2

4
3
2
brassy
2
brassiere
2
brass
38
1
4
3
2

2
s
4
2
2
Brasilia
2
brash
38
1
4
3
2

2

4
2
2
brandywine
2
brandy
38
1
4
3
2

2

4
2
2
Brandenburg
2
Brandeis
38
1
4
3
2

2
ey
4
4
2
Brandt
2
Brandon
2
brandish
2
brand
38
1
4
3
2

2
dc
4
3
2
brant
2
Braniff
2
bran
38
1
4
3
2
e
2

4
2
2
brakeman
2
brake
38
1
4
3
2

2

4
5
2
brainy
2
brainwash
2
brainstorm
2
Brainard
2
brain
38
1
4
3
2

2
n
4
2
2
Braille
2
braid
38
1
4
3
2

2

4
2
2
Brahmsian
2
Brahms
38
1
4
3
2
m
2
s
4
1
2
Brahmaputra
38
1
4
3
2

2

4
2
2
bragging
2
Bragg
38
1
4
3
2

2
g
4
1
2
brag
38
1
4
3
2

2

4
6
2
Brady
2
Bradshaw
2
Bradley
2
Bradford
2
Bradbury
2
brad
38
1
4
3
2

2
ek
4
1
2
bract
38
1
4
3
2

2

4
2
2
bracket
2
bracken
38
1
4
3
2

2
e
4
1
2
brackish
38
1
4
3
2

2

4
2
2
bracelet
2
brace
38
1
4
3
2

2
aeiouy
4
0
38
1
4
3
2

2

4
2
2
Boylston
2
Boyle
38
1
4
3
2

2

4
2
2
boycott
2
Boyce
38
1
4
3
2

2
cl
4
4
2
boyish
2
Boyd
2
boyar
2
boy
38
1
4
3
2

2

4
4
2
boxy
2
boxwood
2
boxcar
2
box
38
1
4
3
2

2

4
2
2
bowmen
2
bowman
38
1
4
3
2

2

4
2
2
bowline
2
bowl
38
1
4
3
2

2

4
2
2
Bowen
2
bowel
38
1
4
3
2

2

4
2
2
Bowdoin
2
Bowditch
38
1
4
3
2

2
delm
4
4
2
bowstring
2
bowie
2
bowfin
2
bow
38
1
4
3
2

2

4
2
2
boutique
2
bout
38
1
4
3
2
eois
2

4
2
2
bourgeoisie
2
bourgeois
38
1
4
3
2

2

4
2
2
bourbon
2
Bourbaki
38
1
4
3
2

2
bg
4
1
2
bourn
38
1
4
3
2

2

4
2
2
boundary
2
bound
38
1
4
3
2

2

4
2
2
bouncy
2
bounce
38
1
4
3
2

2
cd
4
1
2
bounty
38
1
4
3
2

2

4
2
2
boulevard
2
boulder
38
1
4
3
2
h
2

4
2
2
bought
2
bough
38
1
4
3
2

2
glnrt
4
4
2
boustrophedon
2
bouquet
2
bouffant
2
Boucher
38
1
4
3
2
li
2

4
2
2
botulism
2
botulin
38
1
4
3
2
m
2

4
2
2
bottommost
2
bottom
38
1
4
3
2
e
2

4
2
2
bottleneck
2
bottle
38
1
4
3
2

2
lo
4
0
38
1
4
3
2

2

4
2
2
bothersome
2
both
38
1
4
3
2
n
2
i
4
1
2
botany
38
1
4
3
2

2

4
2
2
botanist
2
botanic
38
1
4
3
2

2
ahtu
4
3
2
Botswana
2
botfly
2
botch
38
1
4
3
2

2

4
2
2
bosonic
2
boson
38
1
4
3
2

2
n
4
1
2
bosom
38
1
4
3
2

2
o
4
5
2
Boswell
2
Boston
2
boss
2
Bose
2
Bosch
38
1
4
3
2
o
2

4
2
2
borrow
2
Borroughs
38
1
4
3
2

2

4
3
2
borough
2
borosilicate
2
boron
38
1
4
3
2

2

4
2
2
Borneo
2
borne
38
1
4
3
2

2
e
4
1
2
born
38
1
4
3
2

2

4
2
2
Boris
2
boric
38
1
4
3
2

2

4
2
2
Boreas
2
Borealis
38
1
4
3
2

2
a
4
2
2
boredom
2
bore
38
1
4
3
2

2

4
2
2
borderline
2
borderland
38
1
4
3
2

2
l
4
1
2
border
38
1
4
3
2
e
2
r
4
3
2
Borden
2
bordello
2
Bordeaux
38
1
4
3
2

2

4
2
2
borax
2
borate
38
1
4
3
2

2
adeinor
4
1
2
Borg
38
1
4
3
2
trap
2

4
2
2
bootstrapping
2
bootstrap
38
1
4
3
2

2

4
2
2
bootlegging
2
bootlegger
38
1
4
3
2
eg
2
g
4
1
2
bootleg
38
1
4
3
2

2
ls
4
4
2
booty
2
booth
2
Bootes
2
boot
38
1
4
3
2

2

4
2
2
boorish
2
boor
38
1
4
3
2

2

4
2
2
Boone
2
boon
38
1
4
3
2

2

4
2
2
boomerang
2
boom
38
1
4
3
2
el
2

4
2
2
bookshelves
2
bookshelf
38
1
4
3
2

2
h
4
2
2
bookstore
2
bookseller
38
1
4
3
2

2

4
2
2
bookish
2
bookie
38
1
4
3
2

2
is
4
8
2
booky
2
bookplate
2
booklet
2
bookkeep
2
bookend
2
bookcase
2
bookbind
2
book
38
1
4
3
2

2
kmnrt
4
6
2
booze
2
boost
2
boolean
2
boogie
2
booby
2
boo
38
1
4
3
2

2

4
2
2
Bonneville
2
bonnet
38
1
4
3
2

2
e
4
2
2
Bonnie
2
Bonn
38
1
4
3
2

2

4
2
2
bonito
2
Boniface
38
1
4
3
2

2

4
2
2
bongo
2
bong
38
1
4
3
2
m
2

4
2
2
bondsmen
2
bondsman
38
1
4
3
2

2
s
4
2
2
bondage
2
bond
38
1
4
3
2

2

4
4
2
Bonaventure
2
Bonaparte
2
bonanza
2
bona
38
1
4
3
2

2
adginu
4
5
2
bonze
2
bony
2
bonfire
2
bone
2
bon
38
1
4
3
2
t
2

4
2
2
bombastic
2
bombast
38
1
4
3
2

2
s
4
2
2
Bombay
2
bombard
38
1
4
3
2
b
2
a
4
2
2
bombproof
2
bomb
38
1
4
3
2

2

4
3
2
Boltzmann
2
Bolton
2
bolt
38
1
4
3
2

2
e
4
1
2
Bolshoi
38
1
4
3
2
vi
2
s
4
1
2
Bolshevik
38
1
4
3
2

2

4
2
2
Bolshevist
2
Bolshevism
38
1
4
3
2

2
h
4
1
2
bolster
38
1
4
3
2

2

4
3
2
bolometer
2
Bologna
2
bolo
38
1
4
3
2
v
2

4
2
2
Bolivia
2
bolivar
38
1
4
3
2

2

4
2
2
boletus
2
bole
38
1
4
3
2

2

4
2
2
boldface
2
bold
38
1
4
3
2

2
deiost
4
0
38
1
4
3
2

2

4
3
2
boisterous
2
Boise
2
Bois
38
1
4
3
2

2
s
4
1
2
boil
38
1
4
3
2

2

4
2
2
Bohr
2
Bohemia
38
1
4
3
2

2

4
3
2
boggy
2
boggle
2
bogging
38
1
4
3
2
y
2

4
2
2
bogeymen
2
bogey
38
1
4
3
2

2
eg
4
4
2
bogy
2
bogus
2
Bogota
2
bog
38
1
4
3
2

2

4
2
2
Boeotia
2
Boeing
38
1
4
3
2
uild
2

4
2
2
bodybuilding
2
bodybuilder
38
1
4
3
2

2
b
4
2
2
bodyguard
2
body
38
1
4
3
2

2
y
4
4
2
Bodleian
2
bodice
2
bodhisattva
2
bode
38
1
4
3
2

2

4
2
2
bock
2
Boca
38
1
4
3
2

2

4
2
2
bobbin
2
Bobbie
38
1
4
3
2

2
i
4
2
2
bobby
2
bobble
38
1
4
3
2

2
b
4
3
2
bobolink
2
bobcat
2
bob
38
1
4
3
2

2
rst
4
1
2
boa
38
1
4
3
2

2

4
2
2
boatmen
2
boatman
38
1
4
3
2

2
m
4
5
2
boatyard
2
boatswain
2
boatload
2
boathouse
2
boat
38
1
4
3
2
t
2

4
3
2
boasts
2
boastful
2
boast
38
1
4
3
2

2

4
2
2
boardinghouse
2
board
38
1
4
3
2

2
d
4
1
2
boar
38
1
4
3
2

2
abcdeghilmnorstuwxy
4
2
2
bovine
2
bop
38
1
4
3
2
er
2

4
2
2
blustery
2
bluster
38
1
4
3
2

2
t
4
1
2
blush
38
1
4
3
2

2

4
3
2
blurt
2
blurry
2
blur
38
1
4
3
2

2

4
2
2
blunt
2
blunder
38
1
4
3
2

2

4
2
2
Blumenthal
2
Blum
38
1
4
3
2

2

4
2
2
bluegrass
2
bluegill
38
1
4
3
2

2

4
2
2
bluebook
2
bluebonnet
38
1
4
3
2

2

4
2
2
bluebird
2
bluebill
38
1
4
3
2

2
io
4
3
2
bluebush
2
blueberry
2
blueback
38
1
4
3
2

2
bg
4
6
2
bluet
2
bluestocking
2
blueprint
2
bluejacket
2
bluefish
2
blue
38
1
4
3
2

2
emnrs
4
5
2
blutwurst
2
bluish
2
bluff
2
bludgeon
2
blubber
38
1
4
3
2

2

4
4
2
blowup
2
blown
2
blowfish
2
blow
38
1
4
3
2

2

4
2
2
blotch
2
blot
38
1
4
3
2

2

4
3
2
Bloomington
2
Bloomfield
2
bloom
38
1
4
3
2

2
s
4
6
2
bloody
2
bloodroot
2
bloodline
2
bloodhound
2
bloodbath
2
blood
38
1
4
3
2

2

4
3
2
bloodstream
2
bloodstone
2
bloodstain
38
1
4
3
2

2

4
2
2
bloodshot
2
bloodshed
38
1
4
3
2

2
ht
4
0
38
1
4
3
2

2
dm
4
1
2
bloop
38
1
4
3
2
d
2

4
2
2
blonde
2
blond
38
1
4
3
2

2

4
2
2
Blomquist
2
Blomberg
38
1
4
3
2

2

4
2
2
blockage
2
blockade
38
1
4
3
2

2
a
4
3
2
blocky
2
blockhouse
2
block
38
1
4
3
2

2
k
4
2
2
Bloch
2
bloc
38
1
4
3
2

2
cmnotw
4
5
2
blouse
2
blossom
2
bloke
2
blob
2
bloat
38
1
4
3
2

2

4
2
2
blitz
2
blithe
38
1
4
3
2

2

4
2
2
blissful
2
bliss
38
1
4
3
2

2
s
4
1
2
blister
38
1
4
3
2

2

4
2
2
blindfold
2
blind
38
1
4
3
2

2
d
4
2
2
Blinn
2
blink
38
1
4
3
2

2
nst
4
4
2
blizzard
2
blip
2
blimp
2
blight
38
1
4
3
2

2
s
4
1
2
blest
38
1
4
3
2

2

4
2
2
Blenheim
2
blend
38
1
4
3
2

2

4
2
2
Bleeker
2
bleed
38
1
4
3
2

2

4
4
2
bleat
2
bleary
2
bleak
2
bleach
38
1
4
3
2

2
aens
4
3
2
blew
2
blemish
2
bled
38
1
4
3
2

2
cdimnstz
4
3
2
blare
2
Blake
2
blab
38
1
4
3
2

2

4
2
2
blazon
2
blaze
38
1
4
3
2

2

4
4
2
Blatz
2
blather
2
blatant
2
blat
38
1
4
3
2

2

4
2
2
blastula
2
blast
38
1
4
3
2
hem
2

4
3
2
blasphemy
2
blasphemous
2
blaspheme
38
1
4
3
2

2
pt
4
0
38
1
4
3
2

2

4
2
2
blanket
2
blank
38
1
4
3
2

2

4
2
2
blandish
2
bland
38
1
4
3
2

2
h
4
1
2
blanc
38
1
4
3
2

2

4
3
2
Blanche
2
Blanchard
2
blanch
38
1
4
3
2

2
cdk
4
0
38
1
4
3
2
e
2

4
2
2
blameworthy
2
blame
38
1
4
3
2

2

4
2
2
Blair
2
Blaine
38
1
4
3
2
er
2

4
3
2
bladderwort
2
bladdernut
2
bladder
38
1
4
3
2

2
d
4
1
2
blade
38
1
4
3
2

2

4
2
2
Blackstone
2
blacksmith
38
1
4
3
2
a
2

4
2
2
Blackman
2
blackmail
38
1
4
3
2

2

4
2
2
blackbody
2
blackboard
38
1
4
3
2

2
o
4
4
2
Blackburn
2
blackbird
2
blackberry
2
blackball
38
1
4
3
2
k
2
bms
4
7
2
blackness
2
Blackwell
2
blackout
2
blackjack
2
Blackfeet
2
blacken
2
black
38
1
4
3
2

2
aeiou
4
2
2
Blythe
2
Blvd
38
1
4
3
2

2

4
3
2
Bizet
2
bizarre
2
biz
38
1
4
3
2

2

4
2
2
bivariate
2
bivalve
38
1
4
3
2

2
a
4
1
2
bivouac
38
1
4
3
2
m
2

4
2
2
bituminous
2
bitumen
38
1
4
3
2

2

4
2
2
bitternut
2
bittern
38
1
4
3
2

2
n
4
2
2
bittersweet
2
bitterroot
38
1
4
3
2

2
r
4
1
2
bitten
38
1
4
3
2

2
e
4
1
2
bitt
38
1
4
3
2

2
tu
4
6
2
bits
2
bitwise
2
bitnet
2
bite
2
bitch
2
bit
38
1
4
3
2
a
2

4
2
2
bistate
2
bistable
38
1
4
3
2
r
2

4
2
2
Bismark
2
Bismarck
38
1
4
3
2

2
a
4
1
2
bismuth
38
1
4
3
2
op
2

4
2
2
bishopric
2
bishop
38
1
4
3
2

2

4
2
2
bisexual
2
bisect
38
1
4
3
2

2
ehmt
4
4
2
Bissau
2
bisque
2
bison
2
biscuit
38
1
4
3
2
h
2

4
4
2
birthright
2
birthplace
2
birthday
2
birth
38
1
4
3
2

2

4
5
2
birdwatch
2
birdseed
2
birdie
2
birdbath
2
bird
38
1
4
3
2

2
dt
4
5
2
Birmingham
2
Birgit
2
birefringent
2
birch
2
biracial
38
1
4
3
2
rti
2

4
2
2
bipartite
2
bipartisan
38
1
4
3
2

2
a
4
2
2
bipolar
2
biplane
38
1
4
3
2

2

4
2
2
biotite
2
biotic
38
1
4
3
2

2
i
4
1
2
biota
38
1
4
3
2
etr
2

4
2
2
biometry
2
Biometrika
38
1
4
3
2

2
mt
4
4
2
biopsy
2
biology
2
biography
2
biochemic
38
1
4
3
2

2

4
2
2
binomial
2
binocular
38
1
4
3
2
am
2

4
2
2
Binghamton
2
Bingham
38
1
4
3
2

2
h
4
3
2
bingle
2
binge
2
bing
38
1
4
3
2

2

4
5
2
bindings
2
bindweed
2
bindle
2
bindery
2
bind
38
1
4
3
2

2

4
2
2
binaural
2
binary
38
1
4
3
2

2
adgo
4
3
2
binuclear
2
Bini
2
bin
38
1
4
3
2

2

4
3
2
bimonthly
2
bimolecular
2
bimodal
38
1
4
3
2
talli
2

4
2
2
bimetallism
2
bimetallic
38
1
4
3
2

2
eo
4
1
2
Bimini
38
1
4
3
2
n
2

4
3
2
billions
2
billionth
2
billion
38
1
4
3
2

2
o
4
3
2
Billiken
2
Billie
2
billiard
38
1
4
3
2

2
i
4
5
2
billy
2
billow
2
billet
2
billboard
2
bill
38
1
4
3
2
n
2

4
2
2
bilingual
2
bilinear
38
1
4
3
2

2

4
3
2
bilayer
2
bilateral
2
bilabial
38
1
4
3
2

2
ail
4
5
2
Biltmore
2
bilk
2
bilharziasis
2
bilge
2
bile
38
1
4
3
2
cti
2

4
2
2
bijective
2
bijection
38
1
4
3
2

2
e
4
1
2
bijouterie
38
1
4
3
2
t
2

4
2
2
bigotry
2
bigot
38
1
4
3
2

2
o
4
3
2
Biggs
2
Bigelow
2
big
38
1
4
3
2

2

4
2
2
bifurcate
2
bifocal
38
1
4
3
2
i
2

4
2
2
biennium
2
biennial
38
1
4
3
2
n
2
n
4
1
2
bien
38
1
4
3
2

2

4
2
2
bidirectional
2
bidiagonal
38
1
4
3
2

2

4
2
2
biddy
2
bidden
38
1
4
3
2

2
di
4
2
2
bide
2
bid
38
1
4
3
2
n
2

4
2
2
biconnected
2
biconcave
38
1
4
3
2

2

4
2
2
bicarbonate
2
bicameral
38
1
4
3
2

2
ao
4
4
2
bicycle
2
bicker
2
bichromate
2
bicep
38
1
4
3
2

2

4
2
2
bibliophile
2
bibliography
38
1
4
3
2

2
o
4
1
2
biblical
38
1
4
3
2

2
i
4
1
2
Bible
38
1
4
3
2

2
l
4
2
2
bibb
2
bib
38
1
4
3
2

2

4
4
2
biaxial
2
bias
2
bianco
2
Bialystok
38
1
4
3
2

2
abcdefgjlmnoprstvz
4
2
2
bikini
2
biharmonic
38
1
4
3
2

2

4
2
2
Bhutan
2
bhoy
38
1
4
3
2

2

4
2
2
beyond
2
bey
38
1
4
3
2

2

4
2
2
bewitch
2
bewilder
38
1
4
3
2

2

4
2
2
beware
2
bewail
38
1
4
3
2

2
ai
4
1
2
bewhisker
38
1
4
3
2

2
r
4
1
2
bevel
38
1
4
3
2

2

4
2
2
Beverly
2
beverage
38
1
4
3
2

2
e
4
1
2
bevy
38
1
4
3
2

2

4
2
2
betwixt
2
between
38
1
4
3
2

2
e
4
2
2
Betty
2
bettor
38
1
4
3
2

2

4
2
2
Betsy
2
Betsey
38
1
4
3
2
th
2

4
2
2
betrothal
2
betroth
38
1
4
3
2
y
2

4
2
2
betrayal
2
betray
38
1
4
3
2

2
ao
4
0
38
1
4
3
2

2

4
2
2
betony
2
betoken
38
1
4
3
2

2

4
2
2
Bethesda
2
bethel
38
1
4
3
2

2
e
4
3
2
bethought
2
Bethlehem
2
beth
38
1
4
3
2
l
2

4
2
2
Betelgeuse
2
betel
38
1
4
3
2

2

4
2
2
betatron
2
beta
38
1
4
3
2

2
aehorstw
4
2
2
betide
2
bet
38
1
4
3
2
ell
2

4
2
2
bestselling
2
bestseller
38
1
4
3
2
w
2

4
2
2
bestowal
2
bestow
38
1
4
3
2

2

4
2
2
bestirring
2
bestir
38
1
4
3
2

2
r
4
1
2
bestial
38
1
4
3
2

2
ios
4
2
2
bestubble
2
best
38
1
4
3
2

2

4
2
2
Bessemer
2
Bessel
38
1
4
3
2

2
e
4
2
2
Bessie
2
Bess
38
1
4
3
2

2

4
2
2
bespectacled
2
bespeak
38
1
4
3
2

2
e
4
1
2
bespoke
38
1
4
3
2

2

4
2
2
besiege
2
beside
38
1
4
3
2

2
t
4
1
2
beseech
38
1
4
3
2

2

4
2
2
besetting
2
beset
38
1
4
3
2

2
eipst
4
2
2
besotted
2
besmirch
38
1
4
3
2
l
2

4
2
2
beryllium
2
beryl
38
1
4
3
2
a
2

4
2
2
Bertrand
2
Bertram
38
1
4
3
2

2

4
2
2
Bertha
2
berth
38
1
4
3
2

2
hr
4
2
2
Bertie
2
Bert
38
1
4
3
2

2

4
2
2
berry
2
Berra
38
1
4
3
2

2

4
2
2
Berniece
2
Bernie
38
1
4
3
2

2
e
4
2
2
Bernini
2
Bernice
38
1
4
3
2

2

4
2
2
Bernet
2
berne
38
1
4
3
2
d
2

4
3
2
Bernardo
2
Bernardino
2
Bernard
38
1
4
3
2

2
r
4
1
2
Bernadine
38
1
4
3
2

2
aei
4
4
2
Bernstein
2
Bernoulli
2
Bernhard
2
Bern
38
1
4
3
2

2

4
2
2
Bermuda
2
Berman
38
1
4
3
2
i
2

4
3
2
Berlitz
2
Berlioz
2
Berlin
38
1
4
3
2
l
2

4
2
2
berkelium
2
Berkeley
38
1
4
3
2

2
e
4
2
2
Berkshire
2
Berkowitz
38
1
4
3
2
b
2

4
2
2
beriberi
2
beribbon
38
1
4
3
2

2

4
2
2
Bergstrom
2
Bergson
38
1
4
3
2

2

4
2
2
Berglund
2
Bergland
38
1
4
3
2

2
ls
4
4
2
Bergman
2
Bergen
2
bergamot
2
berg
38
1
4
3
2

2

4
2
2
bereave
2
Berea
38
1
4
3
2

2
a
4
4
2
beret
2
Berenices
2
bereft
2
Beresford
38
1
4
3
2

2
egiklmnrty
4
3
2
Berwick
2
berserk
2
berate
38
1
4
3
2
ue
2

4
2
2
bequest
2
bequeath
38
1
4
3
2

2

4
2
2
Beowulf
2
Beograd
38
1
4
3
2

2

4
2
2
benzene
2
Benzedrine
38
1
4
3
2

2
e
4
1
2
Benz
38
1
4
3
2

2

4
2
2
benthic
2
Bentham
38
1
4
3
2

2
h
4
3
2
Benton
2
Bentley
2
bent
38
1
4
3
2

2

4
3
2
Benny
2
Bennington
2
Bennett
38
1
4
3
2
g
2

4
2
2
benign
2
benight
38
1
4
3
2
al
2

4
2
2
Bengali
2
Bengal
38
1
4
3
2

2
ei
4
0
38
1
4
3
2
a
2

4
2
2
beneficiary
2
beneficial
38
1
4
3
2

2

4
2
2
beneficent
2
benefice
38
1
4
3
2

2
ct
4
0
38
1
4
3
2

2
i
4
1
2
benefactor
38
1
4
3
2
t
2
i
4
1
2
Benedict
38
1
4
3
2

2

4
2
2
benediction
2
Benedictine
38
1
4
3
2
i
2
c
4
1
2
Benedikt
38
1
4
3
2

2
df
4
3
2
benevolent
2
Benelux
2
beneath
38
1
4
3
2

2

4
2
2
Bendix
2
bend
38
1
4
3
2
h
2

4
2
2
benchmark
2
bench
38
1
4
3
2

2
cdegintz
4
3
2
Benson
2
Benjamin
2
Ben
38
1
4
3
2

2

4
3
2
beman
2
bemadden
2
BEMA
38
1
4
3
2

2
A
4
2
2
bemuse
2
bemoan
38
1
4
3
2

2

4
2
2
belvidere
2
belvedere
38
1
4
3
2

2

4
2
2
Beltsville
2
belt
38
1
4
3
2

2
n
4
3
2
below
2
belove
2
Beloit
38
1
4
3
2

2

4
3
2
bellyfull
2
bellyache
2
belly
38
1
4
3
2

2

4
2
2
bellmen
2
bellman
38
1
4
3
2

2

4
2
2
Bellini
2
Bellingham
38
1
4
3
2

2
n
4
2
2
belligerent
2
bellicose
38
1
4
3
2

2

4
4
2
Bellatrix
2
Bellamy
2
belladonna
2
Bella
38
1
4
3
2

2
aimy
4
8
2
bellwether
2
bellum
2
bellow
2
bellhop
2
bellflower
2
belle
2
bellboy
2
bell
38
1
4
3
2

2
v
4
2
2
belief
2
belie
38
1
4
3
2

2
e
4
1
2
belittle
38
1
4
3
2

2

4
2
2
Belgium
2
Belgian
38
1
4
3
2

2
i
4
1
2
Belgrade
38
1
4
3
2

2

4
2
2
belfry
2
Belfast
38
1
4
3
2

2

4
2
2
belate
2
Bela
38
1
4
3
2

2
afgilotv
4
5
2
belying
2
Belshazzar
2
Belmont
2
belch
2
bel
38
1
4
3
2

2

4
4
2
Beirut
2
being
2
beige
2
Beijing
38
1
4
3
2

2

4
2
2
beheld
2
behead
38
1
4
3
2

2
v
4
1
2
behalf
38
1
4
3
2

2
ie
4
0
38
1
4
3
2

2
ae
4
2
2
behold
2
behind
38
1
4
3
2

2

4
2
2
begun
2
beguile
38
1
4
3
2

2

4
2
2
begotten
2
begonia
38
1
4
3
2

2

4
2
2
beginning
2
beginner
38
1
4
3
2
n
2
n
4
1
2
begin
38
1
4
3
2
r
2

4
2
2
beggary
2
beggar
38
1
4
3
2

2
a
4
1
2
begging
38
1
4
3
2
t
2

4
2
2
begetting
2
beget
38
1
4
3
2

2
egiou
4
3
2
begrudge
2
began
2
beg
38
1
4
3
2
e
2

4
2
2
beforehand
2
before
38
1
4
3
2

2

4
2
2
befogging
2
befog
38
1
4
3
2

2
gr
4
1
2
befoul
38
1
4
3
2
t
2

4
2
2
befitting
2
befit
38
1
4
3
2
ll
2

4
2
2
befallen
2
befall
38
1
4
3
2

2
aio
4
2
2
befuddle
2
befell
38
1
4
3
2

2

4
3
2
beetle
2
Beethoven
2
beet
38
1
4
3
2

2

4
3
2
beefy
2
beefsteak
2
beef
38
1
4
3
2
h
2

4
3
2
beechwood
2
Beecham
2
beech
38
1
4
3
2

2

4
2
2
beebread
2
Beebe
38
1
4
3
2

2
bcft
4
5
2
beer
2
beep
2
been
2
beehive
2
bee
38
1
4
3
2
r
2

4
2
2
bedspring
2
bedspread
38
1
4
3
2

2
p
4
2
2
bedstraw
2
bedside
38
1
4
3
2

2

4
2
2
bedroom
2
bedrock
38
1
4
3
2

2
o
4
2
2
bedridden
2
bedraggle
38
1
4
3
2

2

4
2
2
bedimming
2
bedimmed
38
1
4
3
2
m
2
m
4
1
2
bedim
38
1
4
3
2

2

4
2
2
Bedford
2
bedfast
38
1
4
3
2

2
firs
4
6
2
bedtime
2
bedpost
2
bedlam
2
bedbug
2
bedazzle
2
bed
38
1
4
3
2

2

4
5
2
Becky
2
beckon
2
Beckman
2
becket
2
beck
38
1
4
3
2

2

4
3
2
because
2
became
2
becalm
38
1
4
3
2

2
ak
4
2
2
become
2
Bechtel
38
1
4
3
2
f
2

4
2
2
beautify
2
beautiful
38
1
4
3
2

2
i
4
2
2
beauty
2
beauteous
38
1
4
3
2

2
t
4
5
2
beaux
2
Beauregard
2
Beaumont
2
Beaujolais
2
beau
38
1
4
3
2

2

4
2
2
beatify
2
beatific
38
1
4
3
2

2
f
4
1
2
beatitude
38
1
4
3
2

2

4
2
2
beater
2
beaten
38
1
4
3
2

2
ei
4
3
2
Beatrice
2
beatnik
2
beat
38
1
4
3
2
t
2

4
2
2
beastie
2
beast
38
1
4
3
2

2

4
2
2
Beardsley
2
beard
38
1
4
3
2

2
d
4
3
2
bearish
2
bearberry
2
bear
38
1
4
3
2

2

4
3
2
beady
2
beadle
2
bead
38
1
4
3
2

2
h
4
1
2
beacon
38
1
4
3
2

2

4
2
2
beachhead
2
beach
38
1
4
3
2

2
cdrstu
4
4
2
beaver
2
bean
2
beam
2
beak
38
1
4
3
2

2
acdefghilmnoqrstvwy
4
4
2
bezel
2
beplaster
2
bebop
2
be
38
1
4
3
2

2

4
2
2
Bayonne
2
bayonet
38
1
4
3
2

2
n
4
1
2
bayou
38
1
4
3
2

2
o
4
7
2
Bayreuth
2
Bayport
2
Baylor
2
Bayesian
2
Bayda
2
bayberry
2
bay
38
1
4
3
2

2

4
2
2
bawdy
2
bawd
38
1
4
3
2

2
d
4
1
2
bawl
38
1
4
3
2

2

4
2
2
Baudelaire
2
baud
38
1
4
3
2

2
d
4
5
2
bauxite
2
Bausch
2
Bauhaus
2
Bauer
2
bauble
38
1
4
3
2

2

4
2
2
battlefront
2
battlefield
38
1
4
3
2
e
2
f
4
2
2
battleground
2
battle
38
1
4
3
2

2

4
3
2
battery
2
batten
2
Battelle
38
1
4
3
2

2
el
4
2
2
battalion
2
batt
38
1
4
3
2

2

4
2
2
Bator
2
baton
38
1
4
3
2
o
2

4
2
2
bathroom
2
bathrobe
38
1
4
3
2

2
r
4
5
2
Bathurst
2
bathtub
2
bathos
2
bathe
2
bath
38
1
4
3
2

2

4
4
2
bater
2
Bateman
2
bateau
2
bate
38
1
4
3
2
h
2

4
2
2
Batchelder
2
batch
38
1
4
3
2

2
cehot
4
4
2
batwing
2
batik
2
Batavia
2
bat
38
1
4
3
2

2

4
3
2
bastion
2
baste
2
bastard
38
1
4
3
2

2

4
2
2
bassinet
2
bassi
38
1
4
3
2

2
i
4
4
2
basswood
2
basso
2
Bassett
2
bass
38
1
4
3
2
t
2

4
2
2
basketball
2
basket
38
1
4
3
2

2
e
4
1
2
bask
38
1
4
3
2

2

4
3
2
basilisk
2
basilar
2
basil
38
1
4
3
2

2
lc
4
3
2
basis
2
basin
2
basidiomycetes
38
1
4
3
2

2

4
3
2
bashful
2
bashaw
2
bash
38
1
4
3
2

2

4
2
2
basepoint
2
baseplate
38
1
4
3
2

2

4
2
2
basemen
2
baseman
38
1
4
3
2

2

4
2
2
baseline
2
Basel
38
1
4
3
2

2

4
2
2
baseband
2
baseball
38
1
4
3
2

2
a
4
1
2
baseboard
38
1
4
3
2

2
blmp
4
2
2
based
2
base
38
1
4
3
2
l
2

4
2
2
basalt
2
basal
38
1
4
3
2

2
aehikst
4
1
2
basophilic
38
1
4
3
2

2

4
2
2
Barton
2
Bartok
38
1
4
3
2

2

4
2
2
Bartholomew
2
Barth
38
1
4
3
2

2
n
4
1
2
barter
38
1
4
3
2
d
2

4
2
2
bartender
2
bartend
38
1
4
3
2

2
eho
4
1
2
Bartlett
38
1
4
3
2

2

4
2
2
Barrymore
2
Barry
38
1
4
3
2

2

4
3
2
Barrington
2
barrier
2
barricade
38
1
4
3
2
t
2

4
2
2
barrette
2
Barrett
38
1
4
3
2

2
t
4
3
2
barren
2
barrel
2
barre
38
1
4
3
2

2

4
2
2
barracuda
2
barrack
38
1
4
3
2

2
c
4
1
2
barrage
38
1
4
3
2

2
aeiy
4
2
2
barrow
2
Barr
38
1
4
3
2

2

4
2
2
baronet
2
baroness
38
1
4
3
2

2
e
4
3
2
barony
2
baronial
2
baron
38
1
4
3
2

2
n
4
2
2
baroque
2
barometer
38
1
4
3
2

2

4
2
2
Barnett
2
Barnet
38
1
4
3
2

2
t
4
2
2
Barney
2
Barnes
38
1
4
3
2

2

4
3
2
Barnard
2
barnacle
2
Barnabas
38
1
4
3
2

2
ae
4
4
2
barnyard
2
barnstorm
2
Barnhard
2
barn
38
1
4
3
2

2

4
2
2
Barlow
2
barley
38
1
4
3
2

2

4
2
2
barkeep
2
bark
38
1
4
3
2

2

4
2
2
barium
2
baritone
38
1
4
3
2

2

4
2
2
barge
2
bargain
38
1
4
3
2

2

4
2
2
barefoot
2
barefaced
38
1
4
3
2

2
f
4
1
2
bare
38
1
4
3
2

2

4
2
2
Barclay
2
Barcelona
38
1
4
3
2
t
2

4
2
2
barbiturate
2
barbital
38
1
4
3
2

2

4
2
2
barberry
2
barber
38
1
4
3
2

2
r
4
2
2
barbell
2
barbecue
38
1
4
3
2

2

4
3
2
barbarism
2
barbaric
2
barbarian
38
1
4
3
2

2
i
4
2
2
barbarous
2
Barbara
38
1
4
3
2

2
r
4
1
2
Barbados
38
1
4
3
2

2
aei
4
3
2
barbudo
2
Barbour
2
barb
38
1
4
3
2

2
bcegiklnort
4
5
2
barycentric
2
Barstow
2
barfly
2
bard
2
bar
38
1
4
3
2

2

4
2
2
baptistery
2
Baptiste
38
1
4
3
2

2
e
4
1
2
Baptist
38
1
4
3
2

2

4
2
2
baptismal
2
baptism
38
1
4
3
2
tis
2
mt
4
0
38
1
4
3
2

2

4
2
2
Bantus
2
Bantu
38
1
4
3
2

2
u
4
2
2
banter
2
bantam
38
1
4
3
2
upt
2

4
2
2
bankruptcy
2
bankrupt
38
1
4
3
2

2
r
4
2
2
banks
2
bank
38
1
4
3
2
s
2

4
2
2
banister
2
banish
38
1
4
3
2

2

4
2
2
bangle
2
Bangladesh
38
1
4
3
2

2
l
4
4
2
Bangui
2
Bangor
2
bangkok
2
bang
38
1
4
3
2

2

4
3
2
baneful
2
baneberry
2
bane
38
1
4
3
2

2

4
2
2
bandwidth
2
bandwagon
38
1
4
3
2
t
2

4
2
2
bandstop
2
bandstand
38
1
4
3
2

2
sw
4
6
2
bandy
2
bandpass
2
bandit
2
bandgap
2
bandage
2
band
38
1
4
3
2

2

4
3
2
banana
2
banal
2
Banach
38
1
4
3
2

2
adegikt
4
5
2
banshee
2
banquet
2
banjo
2
Banbury
2
ban
38
1
4
3
2

2

4
3
2
bamboo
2
Bambi
2
Bamberger
38
1
4
3
2

2
b
4
2
2
Bamako
2
bam
38
1
4
3
2
ore
2

4
2
2
Baltimorean
2
Baltimore
38
1
4
3
2
i
2
m
4
1
2
Baltic
38
1
4
3
2
a
2

4
2
2
balsam
2
balsa
38
1
4
3
2

2

4
2
2
balmy
2
balm
38
1
4
3
2

2

4
2
2
ballot
2
balloon
38
1
4
3
2

2

4
2
2
balletomane
2
ballet
38
1
4
3
2

2
t
4
1
2
ballerina
38
1
4
3
2

2

4
3
2
ballast
2
Ballard
2
ballad
38
1
4
3
2

2
aeo
4
4
2
ballyhoo
2
ballroom
2
ballfield
2
ball
38
1
4
3
2

2

4
3
2
balky
2
Balkan
2
balk
38
1
4
3
2

2

4
2
2
Balinese
2
Bali
38
1
4
3
2

2

4
3
2
baleful
2
baleen
2
bale
38
1
4
3
2

2

4
4
2
baldy
2
Baldwin
2
baldpate
2
bald
38
1
4
3
2

2
deiklmst
4
6
2
Balzac
2
balustrade
2
Balfour
2
balcony
2
Balboa
2
balance
38
1
4
3
2

2
r
4
2
2
Bakelite
2
bake
38
1
4
3
2

2

4
2
2
bakery
2
Bakersfield
38
1
4
3
2

2
e
4
3
2
Baku
2
baklava
2
Bakhtiari
38
1
4
3
2

2

4
3
2
bailiff
2
Bailey
2
bail
38
1
4
3
2

2
l
4
3
2
bait
2
Baird
2
bainite
38
1
4
3
2

2

4
3
2
Bahrein
2
Bahama
2
bah
38
1
4
3
2

2

4
3
2
baggy
2
bagging
2
baggage
38
1
4
3
2

2
g
4
5
2
bagpipe
2
Bagley
2
Baghdad
2
bagatelle
2
bag
38
1
4
3
2
f
2

4
2
2
baffle
2
Baffin
38
1
4
3
2

2

4
2
2
Baden
2
bade
38
1
4
3
2

2
e
4
5
2
badminton
2
badland
2
badinage
2
badge
2
bad
38
1
4
3
2

2

4
2
2
bacterial
2
bacteria
38
1
4
3
2
eri
2
a
4
1
2
bacterium
38
1
4
3
2

2
r
4
1
2
backwater
38
1
4
3
2

2
a
4
1
2
backwood
38
1
4
3
2

2

4
3
2
backstop
2
backstitch
2
backstage
38
1
4
3
2

2
t
4
2
2
backspace
2
backside
38
1
4
3
2
a
2

4
2
2
backplate
2
backplane
38
1
4
3
2

2
l
4
1
2
backpack
38
1
4
3
2

2

4
2
2
backlog
2
backlash
38
1
4
3
2
o
2

4
2
2
backbone
2
backboard
38
1
4
3
2

2
blpsw
4
9
2
backyard
2
backup
2
backtrack
2
backorder
2
backhand
2
background
2
backfill
2
backdrop
2
back
38
1
4
3
2
ll
2

4
2
2
bacillus
2
bacilli
38
1
4
3
2

2

4
2
2
bachelor
2
Bach
38
1
4
3
2

2
a
4
1
2
Bacchus
38
1
4
3
2

2

4
2
2
baccarat
2
baccalaureate
38
1
4
3
2

2
chikt
4
1
2
bacon
38
1
4
3
2

2
bey
4
2
2
baboon
2
Babcock
38
1
4
3
2
t
2

4
2
2
babysitting
2
babysit
38
1
4
3
2

2
i
4
1
2
babysat
38
1
4
3
2

2
s
4
2
2
Babylon
2
baby
38
1
4
3
2

2

4
2
2
Babel
2
babe
38
1
4
3
2

2

4
2
2
babble
2
babbitt
38
1
4
3
2

2
bcdfghiklmnprstuwy
4
3
2
bazaar
2
Baxter
2
Bavaria
38
1
4
3
2

2
aehiloruy
4
6
2
BTL
2
BSTJ
2
b's
2
BP
2
BMW
2
b
38
1
4
3
2
ec
2

4
2
2
Aztecan
2
Aztec
38
1
4
3
2
muth
2

4
2
2
azimuthal
2
azimuth
38
1
4
3
2

2
it
4
4
2
azure
2
Azerbaijan
2
azalea
2
AZ
38
1
4
3
2

2

4
2
2
Ayers
2
aye
38
1
4
3
2

2
e
4
1
2
Aylesbury
38
1
4
3
2

2

4
2
2
axon
2
axolotl
38
1
4
3
2

2

4
2
2
axisymmetric
2
axis
38
1
4
3
2

2

4
2
2
axiomatic
2
axiom
38
1
4
3
2

2
m
4
1
2
axiology
38
1
4
3
2

2
os
4
1
2
axial
38
1
4
3
2

2
io
4
3
2
axle
2
axe
2
ax
38
1
4
3
2

2

4
2
2
awesome
2
awe
38
1
4
3
2

2
kr
4
3
2
away
2
awash
2
await
38
1
4
3
2

2

4
2
2
aware
2
award
38
1
4
3
2
e
2

4
2
2
awaken
2
awake
38
1
4
3
2

2
ae
4
7
2
awry
2
awoke
2
awn
2
awl
2
awkward
2
awhile
2
awful
38
1
4
3
2
d
2

4
2
2
avoidance
2
avoid
38
1
4
3
2

2
a
4
1
2
avocet
38
1
4
3
2

2

4
2
2
avocate
2
avocado
38
1
4
3
2

2
ci
4
3
2
avow
2
Avon
2
Avogadro
38
1
4
3
2

2
t
4
1
2
aviary
38
1
4
3
2

2

4
2
2
aviatrix
2
aviate
38
1
4
3
2

2
a
4
4
2
Aviv
2
Avis
2
avionic
2
avid
38
1
4
3
2

2

4
2
2
aversion
2
averse
38
1
4
3
2

2

4
2
2
averring
2
averred
38
1
4
3
2

2
rsa
4
3
2
Avery
2
avert
2
aver
38
1
4
3
2

2

4
3
2
avenue
2
Aventine
2
avenge
38
1
4
3
2

2
nr
4
2
2
Avesta
2
Ave
38
1
4
3
2

2
ri
4
1
2
avalanche
38
1
4
3
2
ic
2

4
2
2
avaricious
2
avarice
38
1
4
3
2

2
aeio
4
0
38
1
4
3
2
mn
2

4
2
2
autumnal
2
autumn
38
1
4
3
2
om
2

4
3
2
autonomy
2
autonomous
2
autonomic
38
1
4
3
2

2

4
3
2
automotive
2
automorphism
2
automobile
38
1
4
3
2
t
2
i
4
4
2
automaton
2
automate
2
automata
2
automat
38
1
4
3
2

2
ao
4
0
38
1
4
3
2

2

4
2
2
autocratic
2
autocrat
38
1
4
3
2
a
2
t
4
1
2
autocracy
38
1
4
3
2

2

4
2
2
autocorrelate
2
autocollimate
38
1
4
3
2

2
or
4
1
2
autoclave
38
1
4
3
2

2
cmn
4
6
2
autotransformer
2
autosuggestible
2
autopsy
2
autograph
2
autobiography
2
auto
38
1
4
3
2
s
2

4
2
2
autistic
2
autism
38
1
4
3
2

2
eo
4
0
38
1
4
3
2
ta
2

4
2
2
authoritative
2
authoritarian
38
1
4
3
2
r
2
i
4
1
2
author
38
1
4
3
2
ntic
2

4
2
2
authenticate
2
authentic
38
1
4
3
2

2
hiou
4
0
38
1
4
3
2
li
2

4
3
2
australite
2
Australis
2
Australia
38
1
4
3
2

2
a
4
1
2
Austria
38
1
4
3
2

2

4
2
2
austere
2
austenite
38
1
4
3
2

2
er
4
1
2
Austin
38
1
4
3
2
ic
2

4
2
2
auspicious
2
auspices
38
1
4
3
2

2
pt
4
1
2
Auschwitz
38
1
4
3
2

2

4
2
2
aurora
2
aurochs
38
1
4
3
2

2

4
2
2
Auriga
2
auric
38
1
4
3
2

2

4
2
2
aureomycin
2
Aurelius
38
1
4
3
2

2

4
2
2
aural
2
aura
38
1
4
3
2

2
aeio
4
0
38
1
4
3
2
t
2

4
2
2
auntie
2
aunt
38
1
4
3
2
t
2

4
4
2
Augustus
2
Augustine
2
Augusta
2
august
38
1
4
3
2

2
s
4
1
2
augur
38
1
4
3
2
ent
2

4
2
2
augmentation
2
augment
38
1
4
3
2

2

4
2
2
auger
2
Augean
38
1
4
3
2

2
emu
4
2
2
augite
2
Aug
38
1
4
3
2
r
2

4
3
2
auditory
2
auditorium
2
auditor
38
1
4
3
2

2
o
4
2
2
audition
2
audit
38
1
4
3
2

2

4
3
2
audiovisual
2
audiotape
2
audio
38
1
4
3
2

2
ot
4
2
2
audience
2
audible
38
1
4
3
2
ci
2

4
2
2
audacity
2
audacious
38
1
4
3
2

2
ai
4
2
2
Audubon
2
Audrey
38
1
4
3
2
ion
2

4
2
2
auctioneer
2
auction
38
1
4
3
2

2
t
4
1
2
Auckland
38
1
4
3
2

2

4
3
2
auburn
2
Aubrey
2
Auberge
38
1
4
3
2

2
bcdgnrst
4
3
2
auxiliary
2
auk
2
Auerbach
38
1
4
3
2

2

4
2
2
Atwood
2
Atwater
38
1
4
3
2
ut
2
i
4
1
2
attribute
38
1
4
3
2

2

4
2
2
attributive
2
attribution
38
1
4
3
2

2
b
4
1
2
attrition
38
1
4
3
2

2
i
4
1
2
attract
38
1
4
3
2

2

4
2
2
Attica
2
attic
38
1
4
3
2

2
c
4
2
2
attitude
2
attire
38
1
4
3
2
t
2

4
2
2
attestation
2
attest
38
1
4
3
2
i
2

4
2
2
attentive
2
attention
38
1
4
3
2

2

4
3
2
attendee
2
attendant
2
attend
38
1
4
3
2

2
dt
4
1
2
attenuate
38
1
4
3
2

2
ns
4
1
2
attempt
38
1
4
3
2

2
ci
4
0
38
1
4
3
2
n
2

4
2
2
attainder
2
attain
38
1
4
3
2

2
h
4
1
2
attack
38
1
4
3
2

2

4
2
2
attache
2
attach
38
1
4
3
2

2
aeir
4
2
2
attune
2
attorney
38
1
4
3
2

2

4
2
2
atrophy
2
atrophic
38
1
4
3
2

2
h
4
1
2
Atropos
38
1
4
3
2
i
2

4
2
2
atrocity
2
atrocious
38
1
4
3
2

2
cp
4
0
38
1
4
3
2

2
o
4
1
2
Atreus
38
1
4
3
2

2

4
2
2
atone
2
atonal
38
1
4
3
2

2

4
2
2
atomic
2
atom
38
1
4
3
2

2
mn
4
1
2
atop
38
1
4
3
2
ospher
2

4
2
2
atmospheric
2
atmosphere
38
1
4
3
2
t
2
i
4
2
2
atlantes
2
Atlanta
38
1
4
3
2

2

4
2
2
Atlantica
2
atlantic
38
1
4
3
2

2
c
4
1
2
Atlantis
38
1
4
3
2
a
2
n
4
1
2
atlas
38
1
4
3
2
ins
2

4
2
2
Atkinson
2
Atkins
38
1
4
3
2
et
2

4
2
2
athletic
2
athlete
38
1
4
3
2

2

4
3
2
Athens
2
Athenian
2
Athena
38
1
4
3
2
s
2

4
2
2
atheist
2
atheism
38
1
4
3
2

2
in
4
0
38
1
4
3
2

2
el
4
2
2
athwart
2
Athabascan
38
1
4
3
2
is
2

4
2
2
atavistic
2
atavism
38
1
4
3
2

2
v
4
1
2
Atalanta
38
1
4
3
2

2
ahklmortw
4
5
2
atypic
2
AT&T
2
ate
2
Atchison
2
at
38
1
4
3
2
chron
2

4
2
2
asynchrony
2
asynchronous
38
1
4
3
2
tot
2

4
2
2
asymptotic
2
asymptote
38
1
4
3
2

2
p
4
1
2
asymmetry
38
1
4
3
2

2
mn
4
1
2
asylum
38
1
4
3
2
n
2

4
2
2
asunder
2
Asuncion
38
1
4
3
2
hysic
2

4
2
2
astrophysics
2
astrophysical
38
1
4
3
2

2
ao
4
0
38
1
4
3
2
m
2

4
3
2
astronomy
2
astronomic
2
astronomer
38
1
4
3
2
ut
2

4
2
2
astronautic
2
astronaut
38
1
4
3
2

2
np
4
0
38
1
4
3
2

2

4
2
2
astringent
2
astride
38
1
4
3
2

2

4
3
2
astray
2
astral
2
astraddle
38
1
4
3
2

2
aio
4
0
38
1
4
3
2

2

4
2
2
Astoria
2
Astor
38
1
4
3
2

2
r
4
2
2
astound
2
astonish
38
1
4
3
2
gmat
2

4
2
2
astigmatic
2
astigmat
38
1
4
3
2
id
2

4
2
2
asteroidal
2
asteroid
38
1
4
3
2

2

4
2
2
asterisk
2
asteria
38
1
4
3
2
r
2
io
4
2
2
astern
2
aster
38
1
4
3
2

2

4
2
2
astatine
2
Astarte
38
1
4
3
2

2
aeior
4
3
2
astute
2
ASTM
2
asthma
38
1
4
3
2
ri
2

4
2
2
Assyriology
2
Assyria
38
1
4
3
2

2

4
2
2
assure
2
assurance
38
1
4
3
2

2

4
2
2
assumption
2
assume
38
1
4
3
2

2
mr
4
1
2
assuage
38
1
4
3
2
ia
2
t
4
1
2
associable
38
1
4
3
2

2
c
4
2
2
assort
2
assonant
38
1
4
3
2
t
2

4
2
2
assistant
2
assist
38
1
4
3
2
ila
2

4
2
2
Assimilate
2
assimilable
38
1
4
3
2
n
2

4
4
2
assigning
2
assignee
2
assignation
2
assign
38
1
4
3
2
u
2

4
2
2
assiduous
2
assiduity
38
1
4
3
2

2
dgms
4
0
38
1
4
3
2
s
2

4
2
2
assessor
2
assess
38
1
4
3
2
bl
2

4
2
2
assemble
2
assemblage
38
1
4
3
2

2
ms
4
3
2
asset
2
assert
2
assent
38
1
4
3
2
sin
2

4
2
2
assassinate
2
assassin
38
1
4
3
2

2
l
4
1
2
assai
38
1
4
3
2

2

4
2
2
assailant
2
assail
38
1
4
3
2

2
is
4
3
2
assay
2
assault
2
Assam
38
1
4
3
2

2
aeiouy
4
1
2
ass
38
1
4
3
2

2

4
2
2
aspirate
2
aspirant
38
1
4
3
2

2
a
4
2
2
aspirin
2
aspire
38
1
4
3
2

2
r
4
1
2
aspidistra
38
1
4
3
2

2

4
3
2
asphyxiate
2
aspheric
2
asphalt
38
1
4
3
2

2

4
2
2
aspersion
2
asperity
38
1
4
3
2

2
r
4
2
2
aspen
2
aspect
38
1
4
3
2
r
2
a
4
1
2
aspartic
38
1
4
3
2
g
2

4
2
2
asparagus
2
asparagine
38
1
4
3
2

2
aehi
4
1
2
asplenium
38
1
4
3
2

2
e
4
3
2
asking
2
askance
2
ask
38
1
4
3
2

2

4
2
2
Asiatic
2
Asia
38
1
4
3
2

2
a
4
3
2
asinine
2
Asilomar
2
aside
38
1
4
3
2

2

4
3
2
Ashmolean
2
ashmen
2
ashman
38
1
4
3
2

2

4
2
2
Ashley
2
Ashland
38
1
4
3
2

2

4
3
2
Asheville
2
Asher
2
ashen
38
1
4
3
2

2
elm
4
5
2
ashy
2
ashtray
2
ashore
2
ashame
2
ash
38
1
4
3
2
i
2

4
2
2
ascription
2
ascribe
38
1
4
3
2

2
n
4
2
2
ascetic
2
ascertain
38
1
4
3
2

2
d
4
2
2
ascent
2
ascension
38
1
4
3
2

2

4
2
2
ascendant
2
ascend
38
1
4
3
2

2
er
4
2
2
ASCII
2
ascomycetes
38
1
4
3
2

2
chikpstuy
4
5
2
asocial
2
asleep
2
aseptic
2
asbestos
2
as
38
1
4
3
2

2

4
2
2
arum
2
Aruba
38
1
4
3
2

2

4
2
2
artistry
2
artisan
38
1
4
3
2
c
2
e
4
1
2
artificial
38
1
4
3
2

2
i
4
1
2
artifact
38
1
4
3
2

2
u
4
2
2
article
2
artichoke
38
1
4
3
2
lat
2

4
2
2
articulatory
2
articulate
38
1
4
3
2

2
cfs
4
2
2
artillery
2
Artie
38
1
4
3
2

2

4
2
2
Arthur
2
arthritis
38
1
4
3
2

2
o
4
1
2
arterial
38
1
4
3
2

2

4
2
2
arteriolosclerosis
2
arteriole
38
1
4
3
2

2
l
4
1
2
arteriosclerosis
38
1
4
3
2

2
i
4
1
2
artery
38
1
4
3
2
is
2

4
2
2
artemisia
2
Artemis
38
1
4
3
2

2
mr
4
0
38
1
4
3
2

2
ehi
4
5
2
arty
2
artwork
2
Arturo
2
artful
2
art
38
1
4
3
2
n
2
ai
4
0
38
1
4
3
2

2

4
2
2
arsenide
2
arsenic
38
1
4
3
2

2

4
2
2
arsenate
2
arsenal
38
1
4
3
2

2
e
4
2
2
arson
2
arsine
38
1
4
3
2

2

4
3
2
arrowroot
2
arrowhead
2
arrow
38
1
4
3
2
a
2

4
2
2
arrogate
2
arrogant
38
1
4
3
2

2
gw
4
1
2
arroyo
38
1
4
3
2
v
2

4
2
2
arrive
2
arrival
38
1
4
3
2

2

4
2
2
arrest
2
arrear
38
1
4
3
2

2
n
4
4
2
array
2
arraign
2
Arragon
2
arrack
38
1
4
3
2
ge
2

4
2
2
arrangeable
2
arrange
38
1
4
3
2

2
aeio
4
1
2
Arrhenius
38
1
4
3
2

2

4
2
2
arpeggio
2
ARPA
38
1
4
3
2

2

4
2
2
arouse
2
arousal
38
1
4
3
2

2
s
4
1
2
around
38
1
4
3
2
a
2

4
2
2
aromatic
2
aroma
38
1
4
3
2

2
mu
4
1
2
arose
38
1
4
3
2

2

4
3
2
Armour
2
Armonk
2
armoire
38
1
4
3
2

2

4
2
2
armistice
2
armillaria
38
1
4
3
2

2

4
2
2
Armco
2
armchair
38
1
4
3
2

2

4
2
2
armature
2
Armata
38
1
4
3
2

2

4
2
2
armadillo
2
armada
38
1
4
3
2

2
dt
4
2
2
armament
2
Armageddon
38
1
4
3
2

2
acios
4
7
2
army
2
armpit
2
armload
2
armhole
2
armful
2
Armenia
2
arm
38
1
4
3
2
n
2

4
2
2
Arlene
2
Arlen
38
1
4
3
2

2
e
4
1
2
Arlington
38
1
4
3
2
nsa
2

4
2
2
Arkansas
2
Arkansan
38
1
4
3
2

2
a
4
1
2
ark
38
1
4
3
2
l
2

4
2
2
Aristotelian
2
Aristotelean
38
1
4
3
2

2
e
4
1
2
Aristotle
38
1
4
3
2
ra
2
t
4
1
2
aristocracy
38
1
4
3
2

2

4
2
2
aristocratic
2
aristocrat
38
1
4
3
2
o
2
ct
4
0
38
1
4
3
2

2

4
2
2
arisen
2
arise
38
1
4
3
2

2
et
4
0
38
1
4
3
2

2

4
2
2
Arianism
2
Ariadne
38
1
4
3
2

2
as
4
4
2
Arizona
2
arithmetic
2
Aries
2
arid
38
1
4
3
2
ti
2

4
2
2
argumentative
2
argumentation
38
1
4
3
2
ent
2
a
4
1
2
argument
38
1
4
3
2

2
m
4
2
2
Argus
2
argue
38
1
4
3
2

2

4
3
2
Argonne
2
Argonaut
2
argon
38
1
4
3
2

2
n
4
2
2
argot
2
argo
38
1
4
3
2

2

4
3
2
Argive
2
arginine
2
argillaceous
38
1
4
3
2

2
iou
4
1
2
Argentina
38
1
4
3
2

2

4
2
2
arenaceous
2
arena
38
1
4
3
2

2
a
4
1
2
aren't
38
1
4
3
2

2

4
2
2
areawide
2
areaway
38
1
4
3
2

2
w
4
1
2
area
38
1
4
3
2

2
an
4
3
2
Ares
2
Arequipa
2
are
38
1
4
3
2
n
2

4
2
2
ardent
2
Arden
38
1
4
3
2

2
e
4
1
2
arduous
38
1
4
3
2
n
2

4
2
2
arctangent
2
arctan
38
1
4
3
2

2
a
4
2
2
Arcturus
2
arctic
38
1
4
3
2
in
2

4
2
2
arcsine
2
arcsin
38
1
4
3
2

2

4
2
2
archive
2
archival
38
1
4
3
2
r
2

4
2
2
architecture
2
architectural
38
1
4
3
2
ect
2
u
4
2
2
architectonic
2
architect
38
1
4
3
2

2
tv
4
3
2
archipelago
2
Archimedes
2
Archibald
38
1
4
3
2
yp
2

4
2
2
archetypical
2
archetype
38
1
4
3
2

2
t
4
2
2
archery
2
archenemy
38
1
4
3
2

2

4
2
2
archaism
2
archaic
38
1
4
3
2

2
i
4
2
2
archangel
2
archae
38
1
4
3
2

2
aei
4
4
2
archfool
2
archdiocese
2
archbishop
2
arch
38
1
4
3
2
os
2

4
2
2
arccosine
2
arccos
38
1
4
3
2

2

4
2
2
arcane
2
arcana
38
1
4
3
2

2

4
2
2
Arcadia
2
arcade
38
1
4
3
2

2
dn
4
0
38
1
4
3
2

2
achst
4
3
2
arclength
2
arcing
2
arc
38
1
4
3
2
re
2

4
2
2
arboretum
2
arboreal
38
1
4
3
2
t
2
r
4
1
2
arbiter
38
1
4
3
2
a
2

4
3
2
arbitrate
2
arbitrary
2
arbitrage
38
1
4
3
2

2
io
4
1
2
arbutus
38
1
4
3
2
hn
2

4
2
2
arachnid
2
Arachne
38
1
4
3
2

2
i
4
3
2
Araby
2
arabesque
2
Arab
38
1
4
3
2

2

4
2
2
Arabic
2
Arabia
38
1
4
3
2

2
bc
4
0
38
1
4
3
2

2
abcdegiklmoprstu
4
4
2
aryl
2
Arnold
2
arhat
2
AR
38
1
4
3
2

2

4
2
2
Aquinas
2
Aquila
38
1
4
3
2

2

4
2
2
aqueous
2
aqueduct
38
1
4
3
2

2
r
4
2
2
aquatic
2
aqua
38
1
4
3
2
iu
2

4
2
2
Aquarius
2
aquarium
38
1
4
3
2
u
2
aei
4
0
38
1
4
3
2

2

4
2
2
aptitude
2
apt
38
1
4
3
2

2

4
2
2
apropos
2
apron
38
1
4
3
2

2

4
2
2
April
2
apricot
38
1
4
3
2

2
io
4
0
38
1
4
3
2
ima
2

4
3
2
approximate
2
approximant
2
approximable
38
1
4
3
2

2

4
2
2
approve
2
approval
38
1
4
3
2
ria
2

4
2
2
appropriate
2
appropriable
38
1
4
3
2

2
pvx
4
2
2
approbation
2
approach
38
1
4
3
2
i
2

4
2
2
apprehensive
2
apprehension
38
1
4
3
2
en
2
s
4
1
2
apprehend
38
1
4
3
2
ia
2

4
2
2
appreciate
2
appreciable
38
1
4
3
2

2
ch
4
1
2
apprentice
38
1
4
3
2
is
2

4
2
2
appraise
2
appraisal
38
1
4
3
2

2
aeo
4
1
2
apprise
38
1
4
3
2
it
2

4
2
2
apposition
2
apposite
38
1
4
3
2
nt
2
e
4
1
2
appoint
38
1
4
3
2

2

4
2
2
appointee
2
appointe
38
1
4
3
2

2
is
4
1
2
apport
38
1
4
3
2
a
2
t
4
2
2
applicant
2
applicable
38
1
4
3
2

2
c
4
2
2
applique
2
appliance
38
1
4
3
2

2

4
4
2
Appleton
2
applejack
2
Appleby
2
apple
38
1
4
3
2
u
2

4
2
2
applause
2
applaud
38
1
4
3
2

2
aei
4
1
2
apply
38
1
4
3
2

2

4
2
2
appendix
2
appendices
38
1
4
3
2
d
2
i
4
2
2
appendage
2
append
38
1
4
3
2
la
2

4
2
2
appellate
2
appellant
38
1
4
3
2

2
rs
4
1
2
appeal
38
1
4
3
2

2

4
2
2
appease
2
appeasable
38
1
4
3
2

2

4
2
2
appearance
2
appear
38
1
4
3
2

2
aln
4
2
2
appetite
2
appertain
38
1
4
3
2

2
lr
4
1
2
appanage
38
1
4
3
2

2

4
2
2
apparent
2
apparel
38
1
4
3
2

2
e
4
2
2
apparition
2
apparatus
38
1
4
3
2

2

4
2
2
appall
2
Appalachia
38
1
4
3
2

2
aelor
4
1
2
Appian
38
1
4
3
2
he
2

4
3
2
apotheosis
2
apothegm
2
apothecary
38
1
4
3
2
t
2

4
4
2
apostrophe
2
apostolic
2
apostle
2
apostate
38
1
4
3
2
g
2

4
3
2
apology
2
apologia
2
apologetic
38
1
4
3
2
o
2

4
2
2
Apollonian
2
Apollo
38
1
4
3
2

2
lo
4
0
38
1
4
3
2

2
ar
4
0
38
1
4
3
2
ypha
2

4
2
2
apocryphal
2
Apocrypha
38
1
4
3
2
lyp
2

4
2
2
apocalyptic
2
apocalypse
38
1
4
3
2

2
clst
4
1
2
apogee
38
1
4
3
2

2

4
2
2
apiece
2
apices
38
1
4
3
2
si
2

4
2
2
aphasic
2
aphasia
38
1
4
3
2

2
a
4
4
2
Aphrodite
2
aphorism
2
aphid
2
aphelion
38
1
4
3
2

2

4
2
2
aperture
2
aperiodic
38
1
4
3
2

2
r
4
2
2
apex
2
ape
38
1
4
3
2

2
rt
4
1
2
apache
38
1
4
3
2

2

4
2
2
apathy
2
apathetic
38
1
4
3
2

2
h
4
1
2
apatite
38
1
4
3
2
t
2

4
2
2
apartheid
2
apart
38
1
4
3
2

2
aehioprt
4
2
2
apse
2
aplomb
38
1
4
3
2

2

4
2
2
A&P
2
A&M
38
1
4
3
2

2

4
2
2
anywhere
2
anyway
38
1
4
3
2
ody
2

4
2
2
anybody'd
2
anybody
38
1
4
3
2

2
bw
4
5
2
anything
2
anyplace
2
anyone
2
anyhow
2
any
38
1
4
3
2
i
2

4
2
2
anxious
2
anxiety
38
1
4
3
2

2

4
2
2
antonym
2
Antony
38
1
4
3
2

2
y
4
2
2
Antonio
2
Anton
38
1
4
3
2
ne
2

4
2
2
Antoinette
2
Antoine
38
1
4
3
2

2
in
4
0
38
1
4
3
2
emit
2

4
2
2
antisemitic
2
antisemite
38
1
4
3
2

2
r
4
1
2
antiquated
38
1
4
3
2

2

4
2
2
antiquary
2
antiquarian
38
1
4
3
2
u
2
a
4
2
2
antiquity
2
antique
38
1
4
3
2

2

4
2
2
antipathy
2
antipasto
38
1
4
3
2

2
a
4
3
2
antipode
2
antiphonal
2
antiperspirant
38
1
4
3
2

2

4
2
2
antigorite
2
Antigone
38
1
4
3
2

2
o
4
1
2
antigen
38
1
4
3
2
pat
2

4
2
2
anticipatory
2
anticipate
38
1
4
3
2

2
i
4
1
2
antic
38
1
4
3
2

2
cgpqs
4
5
2
antithetic
2
Antioch
2
antimony
2
Antietam
2
anti
38
1
4
3
2
po
2

4
3
2
anthropomorphic
2
anthropology
2
anthropogenic
38
1
4
3
2
c
2

4
2
2
anthracnose
2
anthracite
38
1
4
3
2

2
ao
4
0
38
1
4
3
2

2

4
2
2
Anthony
2
anthology
38
1
4
3
2

2

4
2
2
anther
2
anthem
38
1
4
3
2

2
eor
4
0
38
1
4
3
2
na
2

4
2
2
antennae
2
antenna
38
1
4
3
2

2
n
4
7
2
anterior
2
antelope
2
antedate
2
antecedent
2
antebellum
2
anteater
2
ante
38
1
4
3
2
tic
2

4
2
2
Antarctica
2
antarctic
38
1
4
3
2

2
c
4
1
2
Antares
38
1
4
3
2
onis
2

4
2
2
antagonist
2
antagonism
38
1
4
3
2

2
gr
4
2
2
Antaeus
2
antacid
38
1
4
3
2

2
aehio
4
3
2
Antwerp
2
antler
2
ant
38
1
4
3
2
lm
2

4
2
2
Anselmo
2
Anselm
38
1
4
3
2

2
e
4
2
2
answer
2
ANSI
38
1
4
3
2

2

4
2
2
anorthite
2
anorthic
38
1
4
3
2
h
2
i
4
1
2
anorthosite
38
1
4
3
2

2
t
4
1
2
anorexia
38
1
4
3
2
ym
2

4
2
2
anonymous
2
anonymity
38
1
4
3
2
l
2

4
2
2
anomaly
2
anomalous
38
1
4
3
2

2
a
4
1
2
anomie
38
1
4
3
2

2

4
2
2
anodic
2
anode
38
1
4
3
2

2
dmnr
4
1
2
another
38
1
4
3
2

2

4
2
2
annulling
2
annulled
38
1
4
3
2

2
l
4
4
2
annulus
2
annuli
2
annular
2
annul
38
1
4
3
2

2
l
4
4
2
annunciate
2
annum
2
annuity
2
annual
38
1
4
3
2

2

4
2
2
annoyance
2
annoy
38
1
4
3
2

2
yu
4
1
2
annotate
38
1
4
3
2

2

4
3
2
anniversary
2
annihilate
2
Annie
38
1
4
3
2

2

4
4
2
annex
2
Annette
2
anneal
2
Anne
38
1
4
3
2

2

4
2
2
Annalen
2
Annale
38
1
4
3
2

2
e
4
1
2
annal
38
1
4
3
2

2
l
4
2
2
Annapolis
2
Anna
38
1
4
3
2

2
aeiou
4
1
2
Ann
38
1
4
3
2

2

4
2
2
ankle
2
Ankara
38
1
4
3
2
trop
2

4
2
2
anisotropy
2
anisotropic
38
1
4
3
2

2

4
2
2
aniseikonic
2
anise
38
1
4
3
2

2
eo
4
0
38
1
4
3
2
n
2

4
2
2
anionic
2
anion
38
1
4
3
2

2
d
4
2
2
animate
2
animal
38
1
4
3
2
ver
2

4
2
2
animadvert
2
animadversion
38
1
4
3
2

2
a
4
2
2
animosity
2
animism
38
1
4
3
2

2
mos
4
3
2
Anita
2
aniline
2
ani
38
1
4
3
2

2

4
2
2
anhydrite
2
anhydride
38
1
4
3
2
dr
2
i
4
1
2
anhydrous
38
1
4
3
2

2
y
4
2
2
Anheuser
2
anharmonic
38
1
4
3
2

2

4
3
2
Angus
2
angular
2
anguish
38
1
4
3
2
t
2

4
2
2
angstrom
2
angst
38
1
4
3
2

2

4
2
2
Angora
2
Angola
38
1
4
3
2

2

4
2
2
Anglophobia
2
Anglo
38
1
4
3
2

2

4
2
2
angling
2
Anglican
38
1
4
3
2

2

4
2
2
Angles
2
angle
38
1
4
3
2

2
eio
4
0
38
1
4
3
2

2

4
2
2
angiosperm
2
Angie
38
1
4
3
2

2
l
4
1
2
anger
38
1
4
3
2

2
i
4
5
2
Angelo
2
angelfish
2
Angeles
2
Angela
2
angel
38
1
4
3
2

2

4
2
2
Angeline
2
Angelina
38
1
4
3
2

2

4
2
2
Angelica
2
angelic
38
1
4
3
2

2
cn
4
0
38
1
4
3
2

2
eilosu
4
1
2
angry
38
1
4
3
2
dot
2

4
2
2
anecdote
2
anecdotal
38
1
4
3
2

2
c
4
3
2
anew
2
anent
2
anemone
38
1
4
3
2
m
2

4
2
2
Andromeda
2
Andromache
38
1
4
3
2

2

4
4
2
Andrew
2
Andrei
2
Andrea
2
Andre
38
1
4
3
2

2
eo
4
0
38
1
4
3
2

2

4
2
2
Andover
2
Andorra
38
1
4
3
2

2

4
2
2
andesite
2
andesine
38
1
4
3
2

2
i
4
1
2
Andes
38
1
4
3
2
s
2

4
2
2
Anderson
2
Andersen
38
1
4
3
2

2
rs
4
1
2
Andean
38
1
4
3
2

2
eor
4
2
2
Andy
2
and
38
1
4
3
2

2

4
2
2
ancillary
2
ancient
38
1
4
3
2

2

4
3
2
anchorite
2
anchorage
2
anchor
38
1
4
3
2
o
2
r
4
1
2
anchovy
38
1
4
3
2
st
2
ro
4
0
38
1
4
3
2

2

4
2
2
ancestry
2
ancestral
38
1
4
3
2

2
ehi
4
0
38
1
4
3
2

2

4
2
2
anatomy
2
anatomic
38
1
4
3
2

2
m
4
1
2
Anatole
38
1
4
3
2

2
o
4
1
2
anathema
38
1
4
3
2
mo
2

4
2
2
anastomotic
2
anastomosis
38
1
4
3
2
gmat
2

4
2
2
anastigmatic
2
anastigmat
38
1
4
3
2
t
2
io
4
1
2
Anastasia
38
1
4
3
2
ch
2

4
3
2
anarchy
2
anarchic
2
anarch
38
1
4
3
2

2

4
3
2
analyst
2
analysis
2
analyses
38
1
4
3
2

2
s
4
2
2
analyze
2
analytic
38
1
4
3
2
g
2

4
3
2
analogy
2
analogue
2
analogous
38
1
4
3
2

2
oy
4
2
2
analgesic
2
analeptic
38
1
4
3
2

2

4
2
2
anagram
2
anaglyph
38
1
4
3
2
ronis
2

4
2
2
anachronistic
2
anachronism
38
1
4
3
2

2
h
4
1
2
anaconda
38
1
4
3
2

2

4
2
2
Anabel
2
Anabaptist
38
1
4
3
2

2
bcglrst
4
5
2
anaplasmosis
2
anamorphic
2
Anaheim
2
anaerobic
2
ana
38
1
4
3
2

2
acdeghiknostxy
4
3
2
anvil
2
anus
2
an
38
1
4
3
2

2

4
2
2
amygdaloid
2
amy
38
1
4
3
2

2

4
2
2
amuse
2
amulet
38
1
4
3
2

2

4
2
2
amplitude
2
amplify
38
1
4
3
2

2
i
4
2
2
amply
2
ample
38
1
4
3
2

2
io
4
0
38
1
4
3
2
l
2

4
2
2
amphibology
2
amphibole
38
1
4
3
2

2

4
2
2
amphibious
2
amphibian
38
1
4
3
2

2
b
4
1
2
amphioxis
38
1
4
3
2

2
i
4
1
2
amphetamine
38
1
4
3
2

2

4
3
2
ampersand
2
ampere
2
amperage
38
1
4
3
2

2
r
4
1
2
Ampex
38
1
4
3
2

2
ehl
4
2
2
amputate
2
amp
38
1
4
3
2

2

4
3
2
amort
2
amorphous
2
amoral
38
1
4
3
2
g
2

4
2
2
amongst
2
among
38
1
4
3
2
ba
2

4
2
2
amoebae
2
amoeba
38
1
4
3
2

2
enru
4
3
2
Amos
2
amok
2
Amoco
38
1
4
3
2

2

4
2
2
ammoniac
2
ammonia
38
1
4
3
2
i
2
a
4
1
2
ammonium
38
1
4
3
2

2
n
4
1
2
ammo
38
1
4
3
2

2

4
2
2
ammeter
2
Ammerman
38
1
4
3
2

2
eo
4
2
2
ammunition
2
Amman
38
1
4
3
2
o
2

4
2
2
aminobenzoic
2
amino
38
1
4
3
2

2

4
3
2
amidst
2
amide
2
amid
38
1
4
3
2

2
dn
4
5
2
amity
2
amiss
2
amigo
2
amicable
2
ami
38
1
4
3
2
hyst
2

4
2
2
amethystine
2
amethyst
38
1
4
3
2

2
n
4
1
2
America
38
1
4
3
2
c
2
a
4
1
2
americium
38
1
4
3
2

2
i
4
1
2
Amerada
38
1
4
3
2

2

4
2
2
amende
2
amend
38
1
4
3
2

2
d
4
1
2
amen
38
1
4
3
2
i
2

4
2
2
ameliorate
2
Amelia
38
1
4
3
2

2
lnrt
4
1
2
Ames
38
1
4
3
2

2

4
2
2
ambush
2
ambuscade
38
1
4
3
2
a
2

4
2
2
ambulatory
2
ambulant
38
1
4
3
2

2
ls
4
0
38
1
4
3
2
a
2

4
2
2
ambrosial
2
ambrosia
38
1
4
3
2
os
2
i
4
1
2
ambrose
38
1
4
3
2

2

4
2
2
ambling
2
amble
38
1
4
3
2
io
2

4
2
2
ambitious
2
ambition
38
1
4
3
2
u
2

4
2
2
ambiguous
2
ambiguity
38
1
4
3
2

2
gt
4
4
2
ambivalent
2
ambient
2
ambidextrous
2
ambiance
38
1
4
3
2

2
ilru
4
2
2
amber
2
ambassador
38
1
4
3
2

2

4
2
2
Amazon
2
amaze
38
1
4
3
2
ur
2

4
2
2
amateurish
2
amateur
38
1
4
3
2

2
e
4
1
2
amatory
38
1
4
3
2

2

4
2
2
Amarillo
2
amaranth
38
1
4
3
2

2

4
2
2
amanuensis
2
amanita
38
1
4
3
2
gam
2

4
2
2
amalgamate
2
amalgam
38
1
4
3
2

2
lnrtz
4
3
2
amass
2
Amadeus
2
AMA
38
1
4
3
2

2
abeimopuy
4
5
2
Amtrak
2
Amsterdam
2
amra
2
Amherst
2
am
38
1
4
3
2
ol
2

4
3
2
alveolus
2
alveoli
2
alveolar
38
1
4
3
2

2

4
2
2
Alvarez
2
Alva
38
1
4
3
2

2
ae
4
1
2
Alvin
38
1
4
3
2

2
in
4
1
2
alum
38
1
4
3
2

2

4
2
2
alumnae
2
alumna
38
1
4
3
2

2
a
4
2
2
alumnus
2
alumni
38
1
4
3
2
na
2

4
2
2
aluminate
2
alumina
38
1
4
3
2

2
m
4
1
2
alundum
38
1
4
3
2
uis
2

4
2
2
altruist
2
altruism
38
1
4
3
2

2

4
3
2
Alton
2
altogether
2
alto
38
1
4
3
2

2

4
2
2
altitude
2
altimeter
38
1
4
3
2

2

4
2
2
although
2
althea
38
1
4
3
2

2
a
4
1
2
altern
38
1
4
3
2
r
2
n
4
4
2
alterman
2
altercate
2
alterate
2
alter
38
1
4
3
2

2

4
2
2
altar
2
Altair
38
1
4
3
2

2
aehior
4
0
38
1
4
3
2

2

4
2
2
Alsop
2
also
38
1
4
3
2

2
o
4
1
2
Alsatian
38
1
4
3
2

2
b
4
2
2
alphanumeric
2
alpha
38
1
4
3
2
et
2

4
2
2
alphabetic
2
alphabet
38
1
4
3
2

2
a
4
2
2
Alphonse
2
Alpheratz
38
1
4
3
2

2

4
2
2
Alpert
2
alpenstock
38
1
4
3
2

2
eh
4
2
2
alpine
2
alp
38
1
4
3
2

2

4
2
2
alongside
2
along
38
1
4
3
2

2
g
4
1
2
alone
38
1
4
3
2

2
n
4
5
2
aloud
2
aloof
2
aloha
2
aloft
2
aloe
38
1
4
3
2

2

4
2
2
almost
2
almond
38
1
4
3
2

2

4
4
2
almanac
2
almagest
2
Almaden
2
alma
38
1
4
3
2

2
ao
4
1
2
almighty
38
1
4
3
2

2

4
3
2
Allyn
2
allyl
2
ally
38
1
4
3
2
i
2

4
2
2
alluvium
2
alluvial
38
1
4
3
2
i
2

4
2
2
allusive
2
allusion
38
1
4
3
2

2
sv
4
2
2
allure
2
allude
38
1
4
3
2

2

4
2
2
Allstate
2
allspice
38
1
4
3
2

2

4
4
2
allowed
2
allows
2
allowance
2
allow
38
1
4
3
2

2

4
2
2
allotting
2
allotted
38
1
4
3
2

2
t
4
2
2
allotropic
2
allot
38
1
4
3
2
a
2

4
2
2
allocate
2
allocable
38
1
4
3
2

2
ctw
4
1
2
alloy
38
1
4
3
2

2

4
2
2
Allison
2
Allis
38
1
4
3
2

2
s
4
3
2
alliterate
2
alligator
2
alliance
38
1
4
3
2

2

4
2
2
alleyway
2
alley
38
1
4
3
2
g
2

4
2
2
allergy
2
allergic
38
1
4
3
2

2

4
2
2
Allentown
2
Allen
38
1
4
3
2

2
or
4
4
2
allegiant
2
Allegheny
2
allege
2
allegate
38
1
4
3
2

2

4
2
2
allegro
2
Allegra
38
1
4
3
2
r
2

4
2
2
allegory
2
allegoric
38
1
4
3
2

2
gnry
4
3
2
alleviate
2
allemand
2
allele
38
1
4
3
2

2

4
3
2
allay
2
Allan
2
Allah
38
1
4
3
2

2
aeiosuy
4
1
2
all
38
1
4
3
2

2

4
2
2
alkaline
2
alkali
38
1
4
3
2
al
2
i
4
1
2
alkaloid
38
1
4
3
2

2

4
2
2
Alistair
2
Alison
38
1
4
3
2

2

4
2
2
align
2
alight
38
1
4
3
2
n
2

4
2
2
alienate
2
alien
38
1
4
3
2

2

4
2
2
Alicia
2
Alice
38
1
4
3
2

2
s
4
1
2
alia
38
1
4
3
2

2
acegs
4
8
2
alizarin
2
alive
2
aliquot
2
aliphatic
2
alimony
2
alike
2
alibi
2
Ali
38
1
4
3
2
ithm
2

4
2
2
algorithmic
2
algorithm
38
1
4
3
2

2
r
4
2
2
Algonquin
2
Algol
38
1
4
3
2

2

4
2
2
alginate
2
Algiers
38
1
4
3
2

2

4
2
2
Algeria
2
Alger
38
1
4
3
2
ra
2

4
2
2
algebraic
2
algebra
38
1
4
3
2

2
br
4
1
2
Algenib
38
1
4
3
2

2
e
4
2
2
algal
2
alga
38
1
4
3
2

2

4
2
2
algaecide
2
algae
38
1
4
3
2

2
aeio
4
0
38
1
4
3
2

2

4
2
2
Alfredo
2
Alfred
38
1
4
3
2
e
2
d
4
1
2
alfresco
38
1
4
3
2

2
r
4
2
2
alfonso
2
alfalfa
38
1
4
3
2

2

4
3
2
Alexandria
2
Alexandre
2
Alexandra
38
1
4
3
2
nd
2
r
4
1
2
Alexander
38
1
4
3
2

2
a
4
3
2
Alexis
2
Alexei
2
Alex
38
1
4
3
2

2

4
2
2
Aleck
2
Alec
38
1
4
3
2

2
cx
4
4
2
alewife
2
alert
2
aleph
2
ale
38
1
4
3
2
i
2

4
2
2
aldrin
2
Aldrich
38
1
4
3
2

2
r
4
3
2
Alden
2
aldehyde
2
Aldebaran
38
1
4
3
2

2

4
2
2
aldermen
2
alderman
38
1
4
3
2

2
m
4
1
2
alder
38
1
4
3
2

2
er
4
0
38
1
4
3
2
ol
2

4
2
2
alcoholic
2
alcohol
38
1
4
3
2

2
h
4
3
2
alcove
2
Alcott
2
Alcoa
38
1
4
3
2

2
o
4
3
2
Alcmena
2
alchemy
2
Alcestis
38
1
4
3
2

2

4
2
2
albumin
2
album
38
1
4
3
2

2
m
4
1
2
Albuquerque
38
1
4
3
2

2

4
2
2
Albright
2
Albrecht
38
1
4
3
2

2

4
3
2
Alberto
2
Alberta
2
Albert
38
1
4
3
2

2
t
4
1
2
Alberich
38
1
4
3
2

2
r
4
1
2
albeit
38
1
4
3
2
a
2

4
2
2
Albanian
2
Albania
38
1
4
3
2

2
i
4
1
2
Albany
38
1
4
3
2

2
n
4
3
2
albatross
2
albacore
2
alba
38
1
4
3
2

2
aeru
4
1
2
alb
38
1
4
3
2

2

4
2
2
Alamo
2
Alameda
38
1
4
3
2

2

4
2
2
Alabamian
2
Alabama
38
1
4
3
2
a
2
m
4
1
2
alabaster
38
1
4
3
2

2
bm
4
6
2
Alaska
2
alarm
2
alan
2
alai
2
alacrity
2
ala
38
1
4
3
2

2
abcdefgiklmopstuvw
4
4
2
alyssum
2
already
2
Alhambra
2
AL
38
1
4
3
2

2

4
4
2
Akron
2
akin
2
Akers
2
AK
38
1
4
3
2
a
2

4
2
2
Ajax
2
ajar
38
1
4
3
2

2

4
2
2
airstrip
2
airspeed
38
1
4
3
2

2

4
3
2
airport
2
airplane
2
airpark
38
1
4
3
2

2

4
3
2
airmass
2
airman
2
airmail
38
1
4
3
2

2
a
4
1
2
airmen
38
1
4
3
2

2

4
2
2
airline
2
airlift
38
1
4
3
2

2
i
4
1
2
airlock
38
1
4
3
2

2

4
4
2
airframe
2
airflow
2
airfield
2
airfare
38
1
4
3
2

2

4
2
2
Aires
2
airedale
38
1
4
3
2

2
eflmps
4
7
2
airy
2
airway
2
airtight
2
airdrop
2
aircraft
2
airborne
2
air
38
1
4
3
2

2

4
2
2
Ainu
2
ain't
38
1
4
3
2

2

4
2
2
aileron
2
aile
38
1
4
3
2

2
e
4
2
2
ailanthus
2
ail
38
1
4
3
2

2
e
4
2
2
Aida
2
aid
38
1
4
3
2

2

4
2
2
Aides
2
aide
38
1
4
3
2

2
dlnr
4
4
2
Aitken
2
aisle
2
aim
2
Aiken
38
1
4
3
2

2

4
2
2
ahem
2
ahead
38
1
4
3
2

2
e
4
3
2
ahoy
2
Ahmedabad
2
ah
38
1
4
3
2

2
u
4
1
2
Agricola
38
1
4
3
2
ltur
2

4
2
2
agriculture
2
agricultural
38
1
4
3
2

2
c
4
1
2
agrimony
38
1
4
3
2
e
2

4
5
2
agreement
2
agreed
2
agreeing
2
agreeable
2
agree
38
1
4
3
2

2
ei
4
1
2
agrarian
38
1
4
3
2

2

4
2
2
agony
2
agone
38
1
4
3
2

2
n
4
2
2
agouti
2
ago
38
1
4
3
2

2

4
2
2
agnostic
2
agnomen
38
1
4
3
2

2

4
2
2
Agnew
2
Agnes
38
1
4
3
2

2
eo
4
0
38
1
4
3
2

2

4
3
2
agitate
2
aging
2
agile
38
1
4
3
2

2

4
2
2
aggressive
2
aggression
38
1
4
3
2
s
2
i
4
1
2
aggressor
38
1
4
3
2

2
s
4
1
2
aggregate
38
1
4
3
2

2
e
4
2
2
aggrieve
2
aggravate
38
1
4
3
2

2
u
4
1
2
agglomerate
38
1
4
3
2
tin
2

4
2
2
agglutinin
2
agglutinate
38
1
4
3
2

2
lr
4
0
38
1
4
3
2

2

4
3
2
agency
2
agent
2
agenda
38
1
4
3
2

2
n
4
2
2
Agee
2
age
38
1
4
3
2

2
it
4
2
2
agave
2
Agamemnon
38
1
4
3
2

2

4
2
2
Agatha
2
agate
38
1
4
3
2
n
2

4
2
2
against
2
again
38
1
4
3
2

2
aeginor
4
4
2
Agway
2
ague
2
agleam
2
aghast
38
1
4
3
2

2

4
2
2
afterword
2
afterward
38
1
4
3
2
r
2
w
4
8
2
afterthought
2
afternoon
2
aftermath
2
afterlife
2
afterimage
2
afterglow
2
aftereffect
2
after
38
1
4
3
2

2
e
4
1
2
aft
38
1
4
3
2

2

4
4
2
afro
2
Africa
2
afresh
2
afraid
38
1
4
3
2
e
2

4
3
2
aforethought
2
aforesaid
2
aforementioned
38
1
4
3
2

2
r
4
1
2
afoot
38
1
4
3
2

2

4
2
2
afloat
2
aflame
38
1
4
3
2

2

4
3
2
afire
2
afield
2
aficionado
38
1
4
3
2
han
2

4
2
2
Afghanistan
2
Afghan
38
1
4
3
2

2

4
2
2
affront
2
affricate
38
1
4
3
2
st
2

4
2
2
afforestation
2
afforest
38
1
4
3
2
r
2
e
4
1
2
afford
38
1
4
3
2

2

4
2
2
affluent
2
afflict
38
1
4
3
2
ti
2

4
2
2
affirmative
2
affirmation
38
1
4
3
2
m
2
a
4
1
2
affirm
38
1
4
3
2

2
r
4
5
2
affix
2
affine
2
affiliate
2
affidavit
2
affiance
38
1
4
3
2
t
2

4
3
2
affectionate
2
affectate
2
affect
38
1
4
3
2

2
c
4
1
2
afferent
38
1
4
3
2

2

4
2
2
affair
2
affable
38
1
4
3
2

2
aeilor
4
0
38
1
4
3
2

2
fgilort
4
1
2
afar
38
1
4
3
2
het
2

4
2
2
aesthetic
2
aesthete
38
1
4
3
2

2
t
4
1
2
Aeschylus
38
1
4
3
2

2

4
2
2
aerospace
2
aerosol
38
1
4
3
2

2

4
2
2
aerobic
2
Aerobacter
38
1
4
3
2

2
bs
4
3
2
aeronautic
2
aerogene
2
aerodynamic
38
1
4
3
2

2
o
4
2
2
aerial
2
aerate
38
1
4
3
2
l
2

4
2
2
Aeolus
2
aeolian
38
1
4
3
2
e
2

4
2
2
Aeneid
2
Aeneas
38
1
4
3
2

2

4
2
2
aegis
2
Aegean
38
1
4
3
2

2
gnors
4
0
38
1
4
3
2
ca
2

4
2
2
advocate
2
advocacy
38
1
4
3
2
r
2

4
2
2
advisory
2
advisor
38
1
4
3
2

2

4
2
2
advisee
2
advise
38
1
4
3
2

2
eo
4
1
2
advisable
38
1
4
3
2

2
s
4
1
2
advice
38
1
4
3
2

2

4
2
2
advertise
2
advert
38
1
4
3
2

2

4
2
2
adverse
2
adversary
38
1
4
3
2

2

4
2
2
adverbial
2
adverb
38
1
4
3
2

2
bst
4
0
38
1
4
3
2
t
2
u
4
2
2
adventitious
2
advent
38
1
4
3
2
r
2

4
2
2
adventurous
2
adventure
38
1
4
3
2

2
nr
4
0
38
1
4
3
2
n
2
t
4
1
2
advance
38
1
4
3
2
age
2

4
2
2
advantageous
2
advantage
38
1
4
3
2

2
aeio
4
0
38
1
4
3
2
r
2

4
3
2
adultery
2
adulterous
2
adulterate
38
1
4
3
2

2
e
4
1
2
adult
38
1
4
3
2
l
2
t
4
1
2
adulate
38
1
4
3
2
ti
2

4
2
2
adsorptive
2
adsorption
38
1
4
3
2

2

4
2
2
adsorbate
2
adsorb
38
1
4
3
2
or
2
bp
4
0
38
1
4
3
2

2

4
2
2
Adriatic
2
Adrian
38
1
4
3
2

2
a
4
2
2
adrift
2
Adrienne
38
1
4
3
2
nal
2

4
2
2
adrenaline
2
adrenal
38
1
4
3
2

2
ei
4
1
2
adroit
38
1
4
3
2

2

4
2
2
adorn
2
adore
38
1
4
3
2

2

4
2
2
adoptive
2
adoption
38
1
4
3
2
t
2
i
4
1
2
adopt
38
1
4
3
2
h
2

4
2
2
Adolphus
2
Adolph
38
1
4
3
2

2
p
4
1
2
adolescent
38
1
4
3
2

2
lpr
4
3
2
Adonis
2
adobe
2
ado
38
1
4
3
2
ni
2

4
2
2
admonition
2
admonish
38
1
4
3
2

2
nrstx
4
0
38
1
4
3
2

2

4
2
2
admixture
2
admix
38
1
4
3
2

2

4
3
2
admitting
2
admitted
2
admittance
38
1
4
3
2

2
t
4
1
2
admit
38
1
4
3
2
si
2

4
2
2
admission
2
admissible
38
1
4
3
2

2
l
4
1
2
admiration
38
1
4
3
2

2

4
2
2
admiralty
2
admiral
38
1
4
3
2

2
a
4
1
2
admire
38
1
4
3
2
ist
2
r
4
1
2
administer
38
1
4
3
2

2

4
3
2
administration
2
administratrix
2
administrate
38
1
4
3
2
a
2
t
4
1
2
administrable
38
1
4
3
2

2
io
4
0
38
1
4
3
2

2

4
2
2
adjudicate
2
adjudge
38
1
4
3
2

2
d
4
3
2
adjutant
2
adjust
2
adjunct
38
1
4
3
2
n
2

4
2
2
adjoint
2
adjoin
38
1
4
3
2

2
i
4
1
2
adjourn
38
1
4
3
2
ct
2

4
2
2
adjectival
2
adject
38
1
4
3
2

2
eou
4
1
2
adjacent
38
1
4
3
2

2

4
4
2
Adirondack
2
adipic
2
adieu
2
adiabatic
38
1
4
3
2
i
2

4
2
2
adhesive
2
adhesion
38
1
4
3
2
e
2

4
2
2
adherent
2
adhere
38
1
4
3
2
e
2
rs
4
0
38
1
4
3
2
ua
2

4
2
2
adequate
2
adequacy
38
1
4
3
2

2

4
2
2
adenosine
2
adenoma
38
1
4
3
2

2
o
4
2
2
adenine
2
Aden
38
1
4
3
2

2

4
3
2
Adelia
2
Adele
2
Adelaide
38
1
4
3
2

2
lnq
4
1
2
adept
38
1
4
3
2
ess
2

4
3
2
Addressograph
2
addressee
2
address
38
1
4
3
2
i
2
o
4
1
2
additive
38
1
4
3
2

2

4
2
2
Addison
2
Addis
38
1
4
3
2

2
st
4
2
2
adding
2
addict
38
1
4
3
2

2
n
4
1
2
added
38
1
4
3
2

2
eir
4
3
2
adduce
2
addle
2
add
38
1
4
3
2
t
2

4
3
2
adaptive
2
adaptation
2
adapt
38
1
4
3
2

2

4
3
2
Adamson
2
adamant
2
Adam
38
1
4
3
2

2

4
2
2
adagio
2
adage
38
1
4
3
2

2
gmp
4
2
2
Adair
2
Ada
38
1
4
3
2

2
adehijmorsuv
4
4
2
adposition
2
Adler
2
Adkins
2
ad
38
1
4
3
2

2

4
3
2
acute
2
acumen
2
acuity
38
1
4
3
2
a
2
l
4
2
2
actuate
2
actuarial
38
1
4
3
2

2

4
2
2
actor
2
Acton
38
1
4
3
2

2
io
4
0
38
1
4
3
2

2

4
2
2
actinometer
2
actinolite
38
1
4
3
2

2

4
3
2
actinium
2
actinide
2
actinic
38
1
4
3
2

2
nov
4
0
38
1
4
3
2

2
iou
4
3
2
actress
2
Actaeon
2
act
38
1
4
3
2
l
2

4
2
2
acrylic
2
acrylate
38
1
4
3
2
a
2
t
4
1
2
acrobacy
38
1
4
3
2

2

4
2
2
acrobatic
2
acrobat
38
1
4
3
2

2
b
4
3
2
across
2
acropolis
2
acronym
38
1
4
3
2

2

4
2
2
acreage
2
acre
38
1
4
3
2

2
eoy
4
1
2
acrid
38
1
4
3
2

2

4
2
2
acquitting
2
acquittal
38
1
4
3
2

2
t
4
1
2
acquit
38
1
4
3
2
iti
2

4
2
2
acquisitive
2
acquisition
38
1
4
3
2
sce
2

4
2
2
acquiescent
2
acquiesce
38
1
4
3
2

2
est
4
1
2
acquire
38
1
4
3
2
int
2

4
2
2
acquaintance
2
acquaint
38
1
4
3
2
u
2
ai
4
0
38
1
4
3
2

2

4
3
2
acoustic
2
acorn
2
acolyte
38
1
4
3
2

2

4
2
2
acme
2
ACM
38
1
4
3
2
owledge
2

4
2
2
acknowledgeable
2
acknowledge
38
1
4
3
2

2
n
4
2
2
Ackley
2
Ackerman
38
1
4
3
2
d
2

4
3
2
acidulous
2
acidic
2
acid
38
1
4
3
2

2

4
3
2
aching
2
Achilles
2
achieve
38
1
4
3
2

2
i
4
2
2
achromatic
2
ache
38
1
4
3
2

2

4
4
2
acetylene
2
acetone
2
acetic
2
acetate
38
1
4
3
2
bi
2

4
2
2
acerbity
2
acerbic
38
1
4
3
2

2
rt
4
1
2
ace
38
1
4
3
2
t
2
i
4
1
2
accusatory
38
1
4
3
2

2

4
2
2
accusative
2
accusation
38
1
4
3
2

2
a
4
2
2
accustom
2
accuse
38
1
4
3
2
a
2

4
2
2
accurate
2
accuracy
38
1
4
3
2

2
rs
4
2
2
accumulate
2
acculturate
38
1
4
3
2

2

4
2
2
accrue
2
accrual
38
1
4
3
2
it
2

4
2
2
accreditate
2
accredit
38
1
4
3
2

2
d
4
1
2
accretion
38
1
4
3
2

2
eu
4
1
2
Accra
38
1
4
3
2
t
2

4
3
2
accounts
2
accountant
2
account
38
1
4
3
2

2
n
4
1
2
accouter
38
1
4
3
2
d
2
i
4
2
2
accordant
2
accord
38
1
4
3
2
i
2

4
2
2
accomplish
2
accomplice
38
1
4
3
2
n
2
i
4
1
2
accompany
38
1
4
3
2

2

4
2
2
accompanist
2
accompaniment
38
1
4
3
2

2
al
4
0
38
1
4
3
2

2
p
4
1
2
accommodate
38
1
4
3
2

2
mru
4
2
2
accost
2
accolade
38
1
4
3
2

2

4
2
2
acclamation
2
acclaim
38
1
4
3
2

2
a
4
1
2
acclimate
38
1
4
3
2
ent
2

4
2
2
accidental
2
accident
38
1
4
3
2

2
d
4
1
2
accipiter
38
1
4
3
2

2
lnps
4
1
2
accede
38
1
4
3
2

2

4
2
2
accession
2
accessible
38
1
4
3
2
s
2
i
4
2
2
accessory
2
access
38
1
4
3
2
t
2

4
4
2
accepted
2
acceptor
2
acceptant
2
accept
38
1
4
3
2
a
2

4
2
2
accentuate
2
accentual
38
1
4
3
2
t
2
u
4
1
2
accent
38
1
4
3
2
er
2

4
2
2
accelerometer
2
accelerate
38
1
4
3
2

2
eiloru
4
0
38
1
4
3
2

2
e
4
1
2
Acadia
38
1
4
3
2
m
2
i
4
1
2
academy
38
1
4
3
2

2
c
4
1
2
academia
38
1
4
3
2

2

4
2
2
academician
2
academic
38
1
4
3
2

2
d
4
2
2
Acapulco
2
acanthus
38
1
4
3
2

2
acehikmoqrtu
4
2
2
acyclic
2
AC
38
1
4
3
2

2

4
2
2
Abyssinia
2
abyss
38
1
4
3
2
s
2
s
4
1
2
abysmal
38
1
4
3
2

2

4
2
2
abutting
2
abutted
38
1
4
3
2

2
t
4
1
2
abut
38
1
4
3
2

2

4
3
2
abusive
2
abuse
2
abusable
38
1
4
3
2

2
st
4
2
2
abundant
2
abuilding
38
1
4
3
2
ct
2

4
2
2
abstractor
2
abstract
38
1
4
3
2

2
a
4
1
2
abstruse
38
1
4
3
2

2
r
4
3
2
abstinent
2
abstention
2
abstain
38
1
4
3
2
ti
2

4
2
2
absorptive
2
absorption
38
1
4
3
2

2

4
2
2
absorbent
2
absorb
38
1
4
3
2

2
bp
4
0
38
1
4
3
2

2
u
4
1
2
absolve
38
1
4
3
2
t
2

4
2
2
absolution
2
absolute
38
1
4
3
2

2
lr
4
0
38
1
4
3
2
e
2

4
2
2
absenteeism
2
absentee
38
1
4
3
2
nt
2
e
4
3
2
absentminded
2
absentia
2
absent
38
1
4
3
2

2
i
4
1
2
abscess
38
1
4
3
2
ssa
2

4
2
2
abscissae
2
abscissa
38
1
4
3
2

2
ceot
4
2
2
absurd
2
absinthe
38
1
4
3
2

2

4
2
2
abrogate
2
abroad
38
1
4
3
2
dg
2

4
2
2
abridgment
2
abridge
38
1
4
3
2
a
2

4
2
2
abreast
2
abreact
38
1
4
3
2

2
ms
4
2
2
Abraham
2
abrade
38
1
4
3
2
i
2

4
2
2
abrasive
2
abrasion
38
1
4
3
2

2

4
2
2
Abramson
2
Abram
38
1
4
3
2

2
aeio
4
1
2
abrupt
38
1
4
3
2
e
2

4
4
2
abovementioned
2
aboveground
2
aboveboard
2
above
38
1
4
3
2

2

4
2
2
about
2
abound
38
1
4
3
2
gin
2

4
2
2
aborigine
2
aboriginal
38
1
4
3
2

2
i
4
2
2
abort
2
aborning
38
1
4
3
2
ina
2

4
2
2
abominate
2
abominable
38
1
4
3
2
i
2

4
2
2
abolition
2
abolish
38
1
4
3
2

2
lmruv
4
3
2
abode
2
aboard
2
Abo
38
1
4
3
2

2

4
2
2
abnormal
2
Abner
38
1
4
3
2

2

4
2
2
ablaze
2
ablate
38
1
4
3
2

2
a
4
2
2
ablution
2
able
38
1
4
3
2

2

4
2
2
Abidjan
2
abide
38
1
4
3
2

2
d
4
2
2
abilities
2
Abigail
38
1
4
3
2
orre
2

4
2
2
abhorrent
2
abhorred
38
1
4
3
2
an
2

4
2
2
abeyant
2
abeyance
38
1
4
3
2

2

4
2
2
abetting
2
abetted
38
1
4
3
2

2
t
4
1
2
abet
38
1
4
3
2
a
2

4
2
2
aberrate
2
aberrant
38
1
4
3
2

2
r
4
2
2
Abernathy
2
Aberdeen
38
1
4
3
2

2

4
3
2
Abelson
2
Abelian
2
Abel
38
1
4
3
2

2
lrty
4
2
2
abed
2
Abe
38
1
4
3
2
m
2

4
2
2
abdominal
2
abdomen
38
1
4
3
2

2
o
4
2
2
abduct
2
abdicate
38
1
4
3
2
t
2

4
2
2
Abbott
2
abbot
38
1
4
3
2

2

4
2
2
abbey
2
abbe
38
1
4
3
2

2
eor
4
1
2
abbas
38
1
4
3
2

2
cs
4
5
2
abate
2
abandon
2
abalone
2
Ababa
2
ABA
38
1
4
3
2

2

4
2
2
abash
2
abase
38
1
4
3
2

2

4
2
2
abacus
2
aback
38
1
4
3
2

2
Abdehilnorsuy
4
2
2
abject
2
abc
38
1
4
3
2

2

4
2
2
Aaron
2
Aarhus
38
1
4
3
2

2

4
2
2
AAAS
2
AAA
38
1
4
3
2

2
Ar
4
0
38
1
4
3
2

2
AbcdefghijklMn&pqrstuvwxyz
4
3
2
a's
2
aorta
2
a
38
1
4
54
2
glowing
2
mostly
2
appears
2
reading
2
warning
2
lowercase
2
faux
2
picked
2
letters
2
singer
2
logged
2
teleport
2
becomes
2
refuses
2
disturbed
2
technically
2
entries
2
randomly
2
seriously
2
probabilities
2
choosing
2
stranger
2
similarities
2
letter
2
mostly
2
profusely
2
writer
2
liking
2
reasoned
2
shortened
2
spelling
2
abbreviated
2
humor
2
evidence
2
firmly
2
direction
2
posting
2
disconnected
2
timing
2
grammatically
2
assuming
2
permissions
2
correctly
2
caller
2
containing
2
generating
2
unhelpful
2
regardless
2
occurence
2
replaced
2
capitalised
2
precede
2
pules
2
neftehkefeh
38
5
4
0
38
5
4
3
2

2

4
2
2
procedures
2
procedure
38
1
4
3
2

2

4
2
2
quoting
2
quotient
38
1
4
3
2
eviat
2

4
2
2
abbreviation
2
abbreviate
38
1
4
3
2

2

4
2
2
evaluation
2
evaluate
38
1
4
3
2

2

4
3
2
introduced
2
introduces
2
introduce
38
1
4
3
2

2

4
3
2
defined
2
defines
2
define
38
1
4
3
2

2
e
4
1
2
own
38
1
4
3
2

2

4
2
2
properties
2
property
38
1
4
3
2
r
2

4
2
2
ancestors
2
ancestor
38
1
4
3
2
lt
2

4
2
2
defaults
2
default
38
1
4
3
2
e
2

4
2
2
unclear
2
uncle
38
1
4
3
2

2

4
2
2
manner
2
mannequin
38
1
4
3
2

2
i
4
1
2
modify
38
1
4
3
2

2
c
4
1
2
modified
38
1
4
3
2

2

4
2
2
reduced
2
reduce
38
1
4
3
2
or
2

4
2
2
behavior
2
behavioral
38
1
4
3
2

2

4
2
2
Newell
2
newel
38
1
4
3
2

2

4
2
2
behaves
2
behave
38
1
4
3
2

2

4
2
2
severely
2
severe
38
1
4
3
2
n
2

4
2
2
container
2
contain
38
1
4
3
2

2

4
2
2
blessed
2
bless
38
1
4
3
2
s
2

4
2
2
release
2
releasable
38
1
4
3
2
h
2

4
2
2
toughened
2
tough
38
1
4
3
2

2
e
4
1
2
removal
38
1
4
3
2
r
2

4
2
2
improperly
2
improper
38
1
4
3
2

2

4
2
2
satisfying
2
satisfy
38
1
4
3
2

2

4
2
2
notifies
2
notify
38
1
4
3
2

2

4
2
2
securing
2
security
38
1
4
3
2
g
2

4
2
2
belonging
2
belong
38
1
4
3
2

2

4
2
2
smelly
2
smell
38
1
4
3
2

2

4
2
2
temporarily
2
temporary
38
1
4
3
2
r
2

4
2
2
eagerly
2
eager
38
1
4
3
2

2

4
2
2
chirps
2
chirp
38
1
4
3
2
us
2

4
2
2
obviously
2
obvious
38
1
4
3
2
h
2

4
2
2
branches
2
branch
38
1
4
3
2
n
2
a
4
1
2
option
38
1
4
3
2

2
r
4
1
2
owned
38
1
4
3
2
on
2

4
2
2
mentioned
2
mention
38
1
4
3
2

2

4
2
2
listed
2
listen
38
1
4
3
2

2

4
2
2
supplied
2
supplicate
38
1
4
3
2

2

4
2
2
removes
2
remove
38
1
4
3
2
ng
2

4
2
2
seemingly
2
seeming
38
1
4
3
2

2

4
2
2
shorter
2
shorten
38
1
4
3
2
f
2

4
2
2
solidifies
2
solidify
38
1
4
3
2

2

4
2
2
fiddlestick
2
fiddle
38
1
4
3
2
k
2

4
2
2
flickers
2
flick
38
1
4
3
2
ht
2

4
2
2
slightly
2
slight
38
1
4
3
2

2

4
2
2
pleased
2
please
38
1
4
3
2

2

4
2
2
teaches
2
teach
38
1
4
3
2
l
2

4
2
2
optionally
2
optional
38
1
4
3
2

2

4
2
2
functional
2
functionary
38
1
4
3
2

2

4
2
2
centre
2
centrex
38
1
4
3
2

2

4
2
2
parsecs
2
parse
38
1
4
3
2

2

4
2
2
personality
2
personal
38
1
4
3
2

2

4
2
2
aliases
2
alias
38
1
4
3
2

2

4
2
2
owners
2
owner
38
1
4
3
2
og
2

4
2
2
zoologist
2
zoology
38
1
4
3
2
h
2
e
4
1
2
finish
38
1
4
3
2

2

4
2
2
completely
2
complete
38
1
4
3
2

2

4
2
2
fakir
2
fake
38
1
4
3
2

2

4
2
2
initialize
2
initial
38
1
4
3
2

2

4
2
2
cured
2
cure
38
1
4
3
2
ation
2

4
2
2
modifications
2
modification
38
1
4
3
2
inat
2

4
2
2
eliminating
2
eliminate
38
1
4
3
2

2

4
2
2
unfriendly
2
unfortunately
38
1
4
3
2

2

4
2
2
actually
2
actual
38
1
4
3
2

2

4
2
2
easier
2
easily
38
1
4
3
2

2

4
2
2
faster
2
fasten
38
1
4
3
2
r
2

4
2
2
impaired
2
impair
38
1
4
3
2

2

4
2
2
simplified
2
simplify
38
1
4
3
2
v
2

4
2
2
subjective
2
subjectivity
38
1
4
3
2
r
2
e
4
1
2
interferometer
38
1
4
3
2

2

4
2
2
specification
2
specifically
38
1
4
3
2
t
2

4
2
2
alternative
2
alternate
38
1
4
3
2

2

4
5
2
presently
2
presenting
2
presented
2
present
2
presentation
38
1
4
3
2

2

4
2
2
existential
2
existent
38
1
4
3
2

2

4
2
2
extremely
2
extreme
38
1
4
3
2
l
2

4
2
2
carefully
2
careful
38
1
4
3
2
nt
2

4
2
2
currently
2
current
38
1
4
3
2

2

4
2
2
definitely
2
definite
38
1
4
3
2
ich
2

4
2
2
sandwiches
2
sandwich
38
1
4
3
2
bl
2

4
2
2
reasonably
2
reasonable
38
1
4
3
2

2

4
4
2
instantly
2
instantiate
2
instantaneous
2
instant
38
1
4
3
2

2

4
2
2
finishes
2
finished
38
1
4
3
2
rew
2

4
2
2
unscrew
2
unscrews
38
1
4
3
2
nt
2

4
2
2
represents
2
representative
38
1
4
3
2

2
a
4
1
2
implicit
38
1
4
3
2
e
2

4
2
2
generated
2
generate
38
1
4
3
2

2

4
2
2
fridge
2
Friday
38
1
4
3
2

2

4
2
2
filled
2
fillet
38
1
4
3
2

2

4
2
2
neatest
2
neater
38
1
4
3
2
d
2

4
2
2
backwards
2
backward
38
1
4
3
2

2

4
2
2
basically
2
basic
38
1
4
3
2
e
2

4
2
2
circumstances
2
circumstance
38
1
4
3
2
l
2

4
2
2
incidentally
2
incidental
38
1
4
3
2
ent
2

4
2
2
conveniently
2
convenient
38
1
4
3
2
erate
2

4
2
2
deliberately
2
deliberate
38
1
4
3
2

2

4
2
2
whilst
2
while
38
1
4
3
2

2

4
2
2
applications
2
applicate
38
1
4
3
2

2

4
2
2
criticism
2
critic
38
1
5
38
5
0
3
38
1
4
4
2

2
Abc-deFGhIjKlmNopQrszTuvwyX
4
0
4
0
38
0
5
38
4
4
2
2
Mr. Spell
2
spell
38
5
2
For help on using the speller, use 'help spelling' and 'help @spell'.
38
5
4
2
0
1299340
0
750753035
2
1
#35
sequence utilities

16
38
-1
-1
-1
1
-1
39
17
add remove
38
173
-1
contains
38
173
-1
complement
38
173
-1
union intersection
38
173
-1
tostr
38
173
-1
for
38
173
-1
extract
38
173
-1
tolist
38
173
-1
from_list
38
173
-1
from_sorted_list
38
173
-1
first
38
173
-1
last
38
173
-1
size
38
173
-1
from_string
38
173
-1
firstn
38
173
-1
lastn
38
173
-1
range
38
173
-1
0
4
5
38
4
4
3
2
sequence utilities
2
seq_utils
2
squ
38
5
4
35
2
A sequence is a set of integers (*)
2
This package supplies the following verbs:
2

2
  :add      (seq,f,t)  => seq with [f..t] interval added
2
  :remove   (seq,f,t)  => seq with [f..t] interval removed
2
  :range    (f,t)      => sequence corresponding to [f..t]
2
  {}                   => empty sequence
2
  :contains (seq,n)    => n in seq
2
  :size     (seq)      => number of elements in seq
2
  :first    (seq)      => first integer in seq or E_NONE
2
  :firstn   (seq,n)    => first n integers in seq (as a sequence)
2
  :last     (seq)      => last integer in seq  or E_NONE
2
  :lastn    (seq,n)    => last n integers in seq (as a sequence)
2

2
  :complement(seq)       => [-2147483648..2147483647] - seq
2
  :union    (seq,seq,...) 
2
  :intersect(seq,seq,...) 
2

2
  :extract(seq,array)           => array[@seq]
2
  :for([n,]seq,obj,verb,@args)  => for s in (seq) obj:verb(s,@args); endfor
2

2
  :tolist(seq)            => list corresponding to seq
2
  :tostr(seq)             => contents of seq as a string
2
  :from_list(list)        => sequence corresponding to list
2
  :from_sorted_list(list) => sequence corresponding to list (assumed sorted)
2
  :from_string(string)    => sequence corresponding to string
2

2
For boolean expressions, note that
2
  the representation of the empty sequence is {} (boolean FALSE) and
2
  all non-empty sequences are represented as nonempty lists (boolean TRUE).
2

2
The representation used works better than the usual list implementation for sets consisting of long uninterrupted ranges of integers.  
2
For sparse sets of integers the representation is decidedly non-optimal (though it never takes more than double the space of the usual list representation).
2

2
(*) Actually what this package implements is sets of integers-mod-2^32, but this assumes the underlying machine on which the server runs has 32-bit integers.  If not, you need to change this.maxneg to be the largest negative ("smallest"?) integer available.
38
5
4
2
0
10857
0
750671620
2
1
#36
Quota-Log

0
38
-1
-1
-1
46
-1
31
1
init_for_core
38
173
-1
0
18
4
0
38
5
0
0
38
1
4
0
38
0
0
1
38
5
2
%n (%#) can't send to moderated list %t (%[#t]) directly.
38
5
4
0
38
5
4
0
38
5
4
1
1
2
38
1
4
2
1
2
1
36
38
1
0
2592000
38
5
0
0
38
1
4
0
38
0
5
38
5
5
38
5
5
38
4
4
3
2
Quota-Log
2
Quota_Log
2
QL
38
1
2
Record of whose quota has been messed with and why.
38
5
4
2
0
79287
0
750753799
2
1
#37
you

16
38
-1
-1
-1
77
-1
-1
3
verb_sub
38
173
-1
say_action
38
165
-1
fixpos
38
173
-1
1
conjugations
16
4
4
4
2
2
is
2
are
4
2
2
was
2
were
4
2
2
does
2
do
4
2
2
has
2
have
38
1
2
2nd
38
5
2
Yours
38
5
2
yours
38
5
2
Your
38
5
2
your
38
5
2
Yourself
38
5
2
yourself
38
5
2
You
38
5
2
you
38
5
2
You
38
5
2
you
38
5
5
38
4
4
1
2
you
38
5
4
1
2
an object useful for pronoun substitution
38
5
4
2
0
3130
0
750752033
2
1
#38
Hacker

19
38
-1
-1
-1
59
-1
71
0
0
62
5
38
1
5
38
5
5
38
5
5
38
5
5
38
5
4
0
38
1
5
2
0
5
38
5
5
2
0
0
2147483647
2
1
0
0
38
5
5
38
5
5
38
1
5
38
1
5
38
0
5
38
1
5
38
5
0
0
2
1
5
38
1
1
18105
38
4
5
2
0
5
2
0
5
38
5
4
0
38
4
5
38
5
4
0
38
4
5
38
4
5
38
5
5
38
5
5
38
5
5
38
5
5
38
5
5
38
5
5
38
5
5
38
5
5
38
5
4
2
0
0
0
0
38
4
4
1
4
2
0
1
4
9
0
745871896
2
Moriah (#50459)
2
Quinn (#19845), Won_Hong_Lao (#31829), Cpt.Vader (#50739), Dagard (#49807), and Hacker (#18105)
2
dungeons
2

2
Sending this cause we're all owners of the Groovie LRPG Dungeon (#5804).. I've completed an improved version that includes options of search, details, and more.. if you'd like more info.. go to #9200 and type about here.. there are more detailed help on topics you can see after that (about here will point you in the right direction.)
2
Anyway, enjoy. _M
2

2
P.S. I've hacked a generic dungeon thing (#3637) to use specially in these dungeons.. look #3637 for details.
38
4
0
2147483647
2
1
0
10633
2
0
5
38
5
5
38
5
5
38
5
5
38
5
5
38
5
5
38
5
5
38
5
5
38
5
5
38
5
1
-1
38
5
5
2
0
5
38
5
5
38
5
5
38
5
5
38
5
5
38
5
0
0
2
1
5
38
4
5
38
4
4
1
2
Hacker
2
1
2
You see a player who should type '@describe me as ...'.
38
5
4
2
0
2337
0
750753172
2
1
#39
Generic Database

144
38
-1
-1
-1
1
41
32
19
find find_key
38
173
-1
find_exact
38
173
-1
find_all find_all_keys
38
173
-1
_only
38
173
-1
_every
38
173
-1
_every_key
38
173
-1
insert
38
173
-1
delete
38
173
-1
delete2
38
173
-1
set_node
38
173
-1
make_node
2
173
-1
kill_node
2
173
-1
clearall
2
173
-1
clearall_big
38
173
-1
_kill_subtrees
38
173
-1
depth
38
173
-1
count_entries
38
173
-1
count_chars
38
173
-1
count
38
153
3
3
node_perms
data
 
7
2
r
38
5
0
4
38
1
4
4
2

2

4
0
4
0
38
0
5
38
4
4
1
2
Generic Database
38
5
2
A generic `database' (well, really more like a string-indexed array if you want the truth...). See `help $generic_db' for details.
38
5
4
2
0
17561
0
750753121
2
1
#40
Everyman

19
38
-1
-1
-1
6
-1
33
4
eval
2
165
-1
moveto
38
173
-1
eval_d
2
165
-1
call_verb
2
173
-1
0
57
4
0
38
1
5
2
0
5
38
5
2
$no_one
2
0
0
2147483647
2
1
0
0
38
5
5
38
5
5
38
1
5
38
1
5
38
0
5
38
1
5
38
5
4
0
2
1
5
38
1
5
38
4
5
2
0
5
2
0
5
38
5
4
0
38
4
5
38
5
5
38
4
5
38
4
5
38
5
5
38
5
5
38
5
5
38
5
2
... no one out there to see it.
38
5
5
38
5
4
1
1
-1
38
5
5
38
5
5
38
5
5
38
4
5
38
4
0
2147483647
2
1
0
0
2
0
5
38
5
5
38
5
5
38
5
5
38
5
5
38
5
5
38
5
5
38
5
5
38
5
5
38
5
1
-1
38
5
5
2
0
5
38
5
5
38
5
5
38
5
5
38
5
5
38
5
0
0
2
1
5
38
4
5
38
4
4
4
2
Everyman
2
everyone
2
no_one
2
noone
2
1
2
... He never even got to go to Disneyland.
38
5
4
2
0
3164
0
750671045
2
1
#41
Player Database

16
38
-1
-1
-1
39
-1
27
5
load
38
173
-1
check
38
45
-1
init_for_core
38
173
-1
available
38
173
-1
suspend_restart
38
173
-1
6
stupid_names
frozen
reserved
 H
 e
 n
13
4
27
2
with
2
using
2
at
2
to
2
in
2
into
2
on
2
onto
2
upon
2
out
2
from
2
inside
2
over
2
through
2
under
2
underneath
2
beneath
2
behind
2
beside
2
for
2
about
2
is
2
as
2
off
2
of
2
me
2
you
38
5
0
0
38
5
4
0
38
1
4
4
2

2

4
2
2
Hacker
2
housekeeper
4
2
1
38
1
71
38
1
4
4
2
very
2

4
2
2
everyone
2
Everyman
4
2
1
40
1
40
38
1
4
4
2
o
2

4
2
2
noone
2
no_one
4
2
1
40
1
40
38
1
5
38
5
5
38
1
4
4
2

2
Hen
4
1
2
Wizard
4
1
1
2
38
0
5
38
4
4
3
2
player_db
2
plyrdb
2
pdb
38
5
4
2
2
A database containing all player names and aliases.  
2
See `help $player_db' for more information.
38
5
4
2
0
589212
0
750670166
2
1
#42
permissions utilities

24
2
-1
-1
-1
1
-1
60
4
controls
2
173
-1
apply
38
173
-1
caller
2
173
-1
controls_prop controls_property
2
165
-1
0
4
5
2
4
5
2
5
5
2
5
4
2
0
1842
0
750665281
2
1
#43
gender utilities

16
38
-1
-1
-1
1
-1
77
8
set
2
165
-1
add
2
173
-1
get_pronoun
38
165
-1
get_conj*ugation
38
165
-1
_verb_plural
38
173
-1
_verb_singular
38
165
-1
_do
38
165
-1
pronoun_sub
2
173
-1
15
is_plural
have
be
pronouns
genders
ps
po
pp
pq
pr
psc
poc
ppc
pqc
prc
19
4
11
0
0
0
0
0
0
0
0
0
0
0
0
0
1
0
1
0
1
0
1
0
1
38
5
4
11
2
has
2
has
2
has
2
has
2
has
2
has
2
have
2
have
2
have
2
have
2
have
38
5
4
11
2
is
2
is
2
is
2
is
2
is
2
is
2
are
2
am
2
are
2
are
2
are
38
5
4
10
2
ps
2
po
2
pp
2
pq
2
pr
2
psc
2
poc
2
ppc
2
pqc
2
prc
38
5
4
10
2
neuter
2
male
2
female
2
either
2
Spivak
2
splat
2
plural
2
egotistical
2
royal
2
2nd
38
5
4
10
2
it
2
he
2
she
2
s/he
2
e
2
*e
2
they
2
I
2
we
2
you
38
5
4
10
2
it
2
him
2
her
2
him/her
2
em
2
h*
2
them
2
me
2
us
2
you
38
5
4
10
2
its
2
his
2
her
2
his/her
2
eir
2
h*
2
their
2
my
2
our
2
your
38
5
4
10
2
its
2
his
2
hers
2
his/hers
2
eirs
2
h*s
2
theirs
2
mine
2
ours
2
yours
38
5
4
10
2
itself
2
himself
2
herself
2
(him/her)self
2
eirself
2
h*self
2
themselves
2
myself
2
ourselves
2
yourself
38
5
4
10
2
It
2
He
2
She
2
S/He
2
E
2
*E
2
They
2
I
2
We
2
You
38
5
4
10
2
It
2
Him
2
Her
2
Him/Her
2
Em
2
H*
2
Them
2
Me
2
Us
2
You
38
5
4
10
2
Its
2
His
2
Her
2
His/Her
2
Eir
2
H*
2
Their
2
My
2
Our
2
Your
38
5
4
10
2
Its
2
His
2
Hers
2
His/Hers
2
Eirs
2
H*s
2
Theirs
2
Mine
2
Ours
2
Yours
38
5
4
10
2
Itself
2
Himself
2
Herself
2
(Him/Her)self
2
Eirself
2
H*self
2
Themselves
2
Myself
2
Ourselves
2
Yourself
38
5
5
38
4
4
1
2
Gender_Utilities
38
5
4
18
2
Defines the list of standard genders, the default pronouns for each, and routines for adding or setting pronoun properties on any gendered object.
2

2
Properties:
2
  .genders  -- list of standard genders
2
  .pronouns -- list of pronoun properties
2
  .ps .po .pp .pq .pr .psc .poc .ppc .pqc .prc 
2
            -- lists of pronouns for each of the standard genders
2

2
  If foo is of gender this.gender[n], 
2
  then the default pronoun foo.p is this.p[n] 
2
  (where p is one of ps/po/pp/pq...)
2

2
Verbs:
2
  :set(object,newgender) -- changes pronoun properties to match new gender.
2
  :add(object[,perms[,owner]]) -- adds pronoun properties to object.
2

2
  :get_pronoun     (which,object) -- return pronoun for a given object
2
  :get_conj*ugation(verbspec,object) -- return appropriately conjugated verb
38
5
4
2
0
14567
0
750669693
2
1
#44
time utilities

16
38
-1
-1
-1
1
-1
47
16
day
38
13
-1
month
38
13
-1
ampm
38
13
-1
to_seconds
38
173
-1
sun
38
173
-1
from_ctime
38
173
-1
dhms dayshoursminutesseconds
38
173
-1
english_time
38
173
-1
from_day
38
173
-1
from_month
38
173
-1
dst_midnight
38
173
-1
time_sub
38
173
-1
mmddyy ddmmyy
38
173
-1
parse_english_time_interval
38
173
-1
seconds_until_date
38
165
-1
seconds_until_time
38
165
-1
12
monthlens
timezones
stsd
ctcd
ct
corr
dayabbrs
days
months
monthabbrs
zones
time_units
16
4
12
0
31
0
28
0
31
0
30
0
31
0
30
0
31
0
31
0
30
0
31
0
30
0
31
38
5
4
15
4
2
2
AuEST
0
-10
4
2
2
AuCST
0
-9
4
2
2
AuWST
0
-8
4
2
2
WET
0
-1
4
2
2
GMT
0
0
4
2
2
AST
0
4
4
2
2
EDT
0
4
4
2
2
EST
0
5
4
2
2
CDT
0
5
4
2
2
CST
0
6
4
2
2
MDT
0
6
4
2
2
MST
0
7
4
2
2
PDT
0
7
4
2
2
PST
0
8
4
2
2
HST
0
10
38
5
0
2427
38
5
0
7276
38
5
0
7934
38
5
0
-122
38
5
4
7
2
Sun
2
Mon
2
Tue
2
Wed
2
Thu
2
Fri
2
Sat
38
5
4
7
2
Sunday
2
Monday
2
Tuesday
2
Wednesday
2
Thursday
2
Friday
2
Saturday
38
5
4
12
2
January
2
February
2
March
2
April
2
May
2
June
2
July
2
August
2
September
2
October
2
November
2
December
38
5
4
12
2
Jan
2
Feb
2
Mar
2
Apr
2
May
2
Jun
2
Jul
2
Aug
2
Sep
2
Oct
2
Nov
2
Dec
38
5
4
5
4
2
4
4
2
est
2
edt
2
Massachusetts
2
MA
0
10800
4
2
4
2
2
cst
2
cdt
0
7200
4
2
4
2
2
mst
2
mdt
0
3600
4
2
4
5
2
pst
2
pdt
2
California
2
CA
2
Lambda
0
0
4
2
4
1
2
gmt
0
28800
38
5
4
7
4
4
0
31536000
2
year
2
years
2
yrs
4
5
0
2678400
2
month
2
months
2
mnths
2
mo
4
5
0
604800
2
week
2
weeks
2
wk
2
wks
4
5
0
86400
2
day
2
days
2
dy
2
dys
4
5
0
3600
2
hour
2
hours
2
hr
2
hrs
4
5
0
60
2
minute
2
minutes
2
min
2
mins
4
5
0
1
2
second
2
seconds
2
sec
2
secs
38
5
5
38
4
4
2
2
time utilities
2
time
38
5
4
30
2
    Converting from seconds-since-1970    
2
dhms          (time)                 => string ...DD:HH:MM:SS
2
english_time  (time[, reference time)=> string of y, m, d, m, s
2

2
    Converting to seconds
2
to_seconds    ("hh:mm:ss")           => seconds since 00:00:00
2
from_ctime    (ctime)                => corresponding time-since-1970
2
from_day      (day_of_week, which)   => time-since-1970 for the given day*
2
from_month    (month, which)         => time-since-1970 for the given month*
2
    (* the first midnight of that day/month)
2
parse_english_time_interval("n1 u1 n2 u2...")
2
                                     => seconds in interval
2
seconds_until_time("hh:mm:ss")       => number of seconds from now until then
2
seconds_until_date("month",day,"hh:mm:ss",flag 
2
                                     => number of seconds from now until then
2
                                        (see verb help for details)
2

2
    Converting to some standard English formats
2
day           ([c]time)              => what day it is
2
month         ([c]time)              => what month it is
2
ampm          ([c]time[, precision]) => what time it is, with am or pm
2
mmddyy        ([c]time)              => date in format MM/DD/YY
2
ddmmyy        ([c]time)              => date in format DD/MM/YY
2

2
    Substitution
2
time_sub      (string, time)         => substitute time information
2

2
    Miscellaneous
2
sun           ([time])               => angle between sun and zenith
2
dst_midnight  (time)                 
38
5
4
2
0
26541
0
750668627
2
1
#45
Editor Help

16
38
-1
-1
-1
32
-1
30
0
43
summary
edit-index
emote
say
delete
insert
view
depublish
perish
unpublish
publish
mode
enter
quit
unsubscribe
subscribe
reply-to
moo
find
edit
compile
save
showlists
subject
to
also-to
who
print
send
list
next
prev
subst
join
fill
move
copy
what
abort
done
pause
ranges
cc
48
4
11
2
You are inside an editor.  Do
2

2
look          -- for list of commands
2
what          -- to find out what you're editing.
2
list          -- to list out some portion of the text
2
say / emote   -- to add new text to whatever you're editing
2

2
help edit-index -- for a full list of editor help topics
2
help editors    -- for a general discussion about editors
2
help moo        -- for the general MOO help summary (i.e., what you get by 
2
                   typing `help' with no arguments from outside the editor).
38
5
4
2
2
*index*
2
Editor Help Topics
38
5
4
19
2
Syntax: emote <text>
2
        :<text>
2

2
(EDITOR)
2
Appends <text> to the end of the line before the insertion point.
2
The second form is equivalent to the first except that it doesn't strip leading blanks off of <text> (just as with the normal `emote' and `:' commands).
2
The insertion point is left unmoved.
2

2
    >list .
2
    _37_ Hello there
2
    ^38^ Oh, I'm fine.
2
    >:, how are you
2
    Appended to line 37.
2
    >:?
2
    Appended to line 37.
2
    >list .
2
    _37_ Hello there, how are you?
2
    ^38^ Oh, I'm fine.
2

38
5
4
17
2
Syntax: say <text>
2
        "<text>
2

2
(EDITOR)
2
Adds <text> to whatever you are editing.
2
The second form is equivalent to the first except in that it doesn't strip leading blanks off of <text> (just as with the normal `say' and `"' commands).
2

2
The added text appears as a new line at the insertion point.  The insertion point, in turn, gets moved so as to be after the added text.  For example:
2

2
    >"first line
2
    Line 1 added.
2
    >"  second line"
2
    Line 2 added.
2
    >list
2
      1: first line
2
    __2_   second line"
2
    ^^^^
38
5
4
5
2
Syntax:  del*ete [<range>] 
2

2
(EDITOR)
2
Deletes the specified range of lines
2
<range> defaults to the line *before* the current insertion point.
38
5
4
21
2
Syntax:  ins*ert [<ins>] ["<text>]
2
         .                    (`.' == `insert' without arguments)
2

2
(EDITOR)
2
Many editor commands refer to an "insertion point" which is (usually) the place right below where the most recent line was inserted.  The insertion point should really be thought of as sitting *between* lines.  In listings, the line above the insertion point is marked with `_' while the one below is marked with `^'.
2

2
The `insert' command, when given an argument, sets the insertion point.
2
If <text> is provided, a new line will be created and inserted as with `say'.
2
<ins>, both here and in other commands that require specifying an insertion point (e.g., copy/move), can be one of
2
          
2
    ^n   above line n
2
     n   above line n
2
    _n   below line n
2
     $   at the end
2
    ^$   before the last line
2
   n^$   n lines before the end
2
     .   the current insertion point  (i.e., `insert .' is a no-op)
2
    +n   n lines below the current insertion point.
2
    -n   n lines above the current insertion point.
2

2
For the truly perverse, there are other combinations that also work due to artifacts of the parsing process, but these might go away...
38
5
4
10
2
Syntax:  view <player> [<range>] [nonum]
2
         view
2

2
Prints some subset of the specified player's text.
2
Said player must have previously made his text readable with `publish'.
2
<ranges> are specified as in other commands (see `help ranges').
2
References to the insertion point refer to wherever the other player has set his/her insertion point; you have no control over it.
2
The default range is as in list.
2

2
If no arguments are given, this lists all of the players that have published anything in this editor.
38
5
4
2
2
*forward*
2
unpublish
38
5
4
2
2
*forward*
2
unpublish
38
5
4
5
2
Syntax:  unpub*lish
2
         depub*lish
2
         perish
2

2
This command reverses the effects of `publish', making your text readable only by you.
38
5
4
6
2
Syntax:  pub*lish
2

2
By default, only you (and wizards) can read the text you are editing.
2
This command makes your text readable by the entire world (see `help view').
2
This is useful if you need help from someone or if you just want to show off your programming acumen.
2
Use `unpublish' to make your text private again.
38
5
4
12
2
(NOTE EDITOR)
2
Syntax:  mode
2
         mode string
2
         mode list
2
         
2
There are (currently) two modes the note editor can be in.
2
One is string mode, in which if the text being edited is one line or less, 
2
it will be saved as a single string (or an empty string) rather than as a list.
2
The other is list mode, in which text is always saved as a list of strings.
2
The mode is set when the text is first loaded (string mode if the text is a string, list mode otherwise), but can be changed using this command.
2

2
The first form above (i.e., without any arguments) reports the current mode.
38
5
4
12
2
Syntax:  enter
2

2
(EDITOR)
2
Enters a sequence of lines at the insertion point (see `help insert').
2
This is similar to .program in that every line you type after the `enter' command is inserted verbatim into the text until you type a line with a single period (`.') on it.  This command is essentially for if you don't like the idea of putting " at the beginning of each line you type.  The only exceptions, i.e., lines that are not entered verbatim (aside from the `.' line), are
2

2
 - If you type a line whose sole text is `@abort', 
2
   that aborts this command without making any changes to the text.  
2
 - Any line whose first nonblank character is `.' and has additional text
2
   is entered but with its first `.' stripped off.  
2

2
Thus, to enter a line whose text is `@abort', you could enter it as `.@abort'.
38
5
4
7
2
Syntax:  q*uit
2
         done
2
         pause  
2

2
(EDITOR)
2
Leaves the editor.  If you have unsaved text it will be there when you return (and in fact you will not be able to do anything else with this editor until you 'abort' or save the text).
2

38
5
4
9
2
Syntax: unsubscribe from <list-name>
2
        unsubscribe <name>... from <list-name>
2

2
(MAILROOM)
2
Remove yourself from the given mailing list.
2
The second form removes arbitrary people from a mailing list.
2
You can only do this if you own whatever is being removed or you own the list.
2

2
Use the `who' command to determine if you are on a given mailing list.
38
5
4
11
2
Syntax: subscribe to <list-name>
2
        subscribe [<name>...] to <list-name>
2

2
(MAILROOM)
2
Add yourself to the given mailing list.  
2
The second form adds arbitrary people to a mailing list.
2
You can only do this if you own the list or if it is listed as [Public] and you own whatever is being added.
2

2
The first form of this command is probably obsolete since if <list-name> is public, you can already read it via `@mail on *<list-name>' and it's much better for the MOO if you do so.  `@mail-option +sticky' makes this even easier.
2

2
Use the `who' command to determine if you are on a given mailing list.
38
5
4
11
2
Syntax:  reply-to [<recipients>]
2

2
(MAIL ROOM)
2
Reports the current contents of the Reply-to: field of your message.
2
With arguments, adds (or changes) the Reply-to: field.
2

2
When someone @answers a message, the Reply-to: field is checked first when determining to whom the reply should be sent --- see `help @answer'.
2

2
To clear the Reply-to: field, do
2

2
         reply-to ""
38
5
4
2
2
*pass*
2

38
5
4
9
2
Syntax:  f*ind  /<str>[/[c][<ins>]]
2
         /<str>[/[c][<ins>]]
2

2
Searches for the first line after <ins> containing <str>.  <ins> defaults to  the current insertion point (see `help insert' for how to specify other places).  With the first form, any character (not just `/') may be used as a delimiter.
2
For the second form, you must use '/'.
2

2
The 'c' flag, if given, indicates that case is to be ignored while searching.
2

2
[Bug: With the second form, there are problems if the search string contains quotes, backslashes or a run of spaces.  The first whitespace will always be treated as a single space.  Likewise, quotes and backslashes occuring in the first word of the command (i.e., the "verb") need to be escaped with `\'.  Unfortunately it will not be possible to fix this until we get a new command parser.]
38
5
4
17
2
(VERB EDITOR)
2
Syntax:  edit <object>:<verb>
2

2
Changes what verb you are editing and loads the code for that verb
2
into the editor. 
2
Equivalent to @edit <object>:<verb>.
2

2
(NOTE EDITOR)
2
Syntax:  edit <note-object>
2
         edit <object>.<property>
2

2
Changes to a different note or a different object text property and 
2
loads its text into the editor.
2
These are equivalent to @notedit <note> or @notedit <object>.<property>
2
respectively.
2

2
For both the verb-editor and note-editor commands, <object> will match on the room you came from, though if the room you came from was another editor, then all bets are off...
38
5
4
5
2
Syntax:  compile [as <object>:<verb>]
2

2
(VERB EDITOR)
2
Installs the new program into the system if there are no syntax errors.
2
If a new object:verb is specified and actually turns out to exist, that <object>:<verb> becomes the default for subsequent compilations.
38
5
4
5
2
Syntax:  save [<note-object>]
2
         save [<object>.<property>]
2

2
(NOTE EDITOR)
2
Installs the freshly edited text.  If <note> or <object>.<property> is specified, text is installed on that note or property instead of the original one.  In addition the new note or property becomes the default for future save commands.
38
5
4
4
2
Syntax:  showlists
2

2
(MAIL ROOM)
2
Print a list of the publically available mailing lists/archives and other non-player entities that can receive mail.
38
5
4
4
2
Syntax:  subj*ect [<text>]
2

2
(MAIL ROOM)
2
Specifies a Subject: line for your message.  If <text> is "", the Subject: line is removed.
38
5
4
6
2
Syntax:  to [<recipients>]
2

2
(MAIL ROOM)
2
Specifies a new set of recipients (the To: line) for your message.
2
Recipient names not beginning with * are matched against the list of players.
2
Recipient names beginning with * are interpreted as mailing-lists/archives/other types of non-person addresses and are matched against all such publically available objects (see `help showlists').  If the list you want to use isn't in the database (i.e., isn't located in the database ($mail_agent)) you need to refer to it by object id.
38
5
4
7
2
Syntax:  also-to [<recipients>]
2

2
Synonym: cc
2

2
(MAIL ROOM)
2
Adds additional recipients to the To: line of your message.
2
Same rules apply as for the `to' command.
38
5
4
7
2
Syntax:  who 
2
         who <rcpt>...
2

2
(MAIL ROOM)
2
Invokes $mail_agent's mail-forwarding tracer and determines who (or what) is actually going to receive your message.  The resulting list will not include destinations that will simply forward the message without :receive_message()'ing a copy for themselves.
2

2
The second form expands an arbitrary list of recipients, for if e.g., you're curious about the members of particular mailing list.
38
5
4
6
2
Syntax:  pri*nt
2

2
Display your text without line numbers.
2

2
(MAIL ROOM)
2
Display your message including headers.
38
5
4
8
2
Syntax:  send
2

2
(MAIL ROOM)
2
Send the message, then exit the mail room if all of the addresses on the To: line turn out to be valid and usable (you can use the `who' command to check these in advance, though the status of recipients may change without warning).
2
If the To: line turns out to contain invalid recipients or recipients that are not usable by you, the message will not be sent and you will remain in the mail room.
2
It may be, however, that valid addresses on your To: line will forward to other addresses that are bogus; you'll receive warnings about these, but in this case your message will still be delivered to those addresses that are valid.
2

2
Note that there may be particularly long delays when sending to recipients with large forwarding/notification lists or when sending on occasions when the MOO is heavily loaded in general.  In such a case, it is possible to continue editing the message while the send is in progress; any such edits affect only the text in the editor.  In particular, the text of the message currently being sent remains as it was when you first typed the send command.  However, any editing will mark the text as "changed" meaning that you will need to explicitly `abort' or `quit' in order to leave the mail room even if the send concludes successfully.
38
5
4
8
2
Syntax:  lis*t [<range>] [nonum]
2

2
Prints some subset of the current verb text.
2
The default range is some reasonable collection of lines around the current insertion point:  currently this is 8_-8^, ie., 8 lines above the insertion point to 8 lines below it unless this runs up against the beginning or end of file, in which case we just take the first or last 16 lines, or just 1-$ if there aren't that many.  (See `help ranges' for how to specify line numbers and ranges.)
2

2
`nonum' prints without line numbers.
2

2
Yes, window heights will be customizable some day.
38
5
4
4
2
Syntax:  n*ext [n] ["<text>]
2

2
Moves the insertion point down n lines.  If <text> is provided, inserts a new line there just like `say'.
2
Equivalent to `insert +n'.  As one might expect, n defaults to 1.
38
5
4
4
2
Syntax:  p*rev [n] ["<text>]
2

2
Moves the insertion point up n lines.  If <text> is provided, a new line is inserted as with `say'.
2
Equivalent to `insert -n'.  As one might expect, n defaults to 1.
38
5
4
13
2
Syntax:  s*ubst/<str1>/<str2>[/[g][c][<range>]]
2

2
Substitutes <str2> for <str1>, in all of the lines of <range>.
2
Any character (not just `/') may be used to delimit the strings. 
2
If <str1> is blank, <str2> is inserted at the beginning of the line.  
2
(For inserting a string at the end of a line use emote/:).
2

2
Normally, only one substitution is done per line in the specified range, but if the 'g' flag is given, *all* instances of <str1> are replaced.
2
The 'c' flag indicates that case is not significant when searching for substitution instances.
2
<range> defaults to the line *before* the insertion point.
2

2
You do *not* need a space between the verb and the delimeter before <str1>.
2
[Bug: If you omit the space and the first whitespace in <str1> is a run of more than one space, those spaces get treated as one.  Likewise, quotes and backslashes occuring in the first word of the command (i.e., the "verb") need to be escaped with `\'.  The fix on this will have to wait for a new command parser.]
38
5
4
4
2
Syntax:  join        [<range>]
2
         joinliteral [<range>]
2

2
combines the lines in the specified range.  Normally, spaces are inserted and double space appears after periods and colons, but 'joinliteral' (abbreviates to 'joinl') supresses this and joins the lines as is.  <range> defaults to the two lines surrounding the insertion point.
38
5
4
3
2
Syntax:  fill [<range>] [@ c]
2

2
combines the specified lines as in join and then splits them so that no line is more than c characters (except in cases of pathological lines with very long words).  c defaults to 70.  <range> defaults to the single line preceding the insertion point.
38
5
4
6
2
Syntax:  m*ove [<range>] to <ins>
2

2
Moves the range of lines to place specified by <ins>.
2
If <ins> happens to be the current insertion point, the insertion point is moved to the end of the freshly moved lines.  If the range of lines contains the insertion point, the insertion point is carried over to the range's new location.
2

2
See `help insert' for a list of possibilities for <ins>.
38
5
4
7
2
Syntax:  c*opy [<range>] to <ins>
2

2
Copies the specified range of lines to place given by <ins>.
2
If <ins> happens to be the current insertion point, the insertion 
2
point moves to the end of the inserted lines.
2

2
See `help insert' for a list of possibilities for <ins>.
38
5
4
3
2
Syntax:  w*hat
2

2
Prints information about the editing session.
38
5
4
3
2
Syntax:  abort
2

2
Abandons this editing session and any changes.
38
5
4
2
2
*forward*
2
quit
38
5
4
2
2
*forward*
2
quit
38
5
4
20
2
Most editor commands act upon a particular range of lines.
2
Essentially, one needs to specify a first line and a last line.
2
Line numbers may be given in any of the following forms
2
  
2
  n      (i.e., the nth line of text)
2
  n^     n-th line after/below  the current insertion point
2
  n_     n-th line before/above the current insertion point
2
  n$     n-th line before the end.
2

2
In the latter three, n defaults to 1, so that `^' by itself refers to the line below the current (i.e., the line that gets `^' printed before it), and likewise for `_' while `$' refers to the last line.  Note that the usage depends on whether you are specifying a line or an insertion point (space between lines). `^5' is the space above/before line 5, while `5^' is the fifth line after/below the current insertion point.
2

2
Ranges of lines may be specified in any of the
2
following ways:
2

2
  <line>                  just that line
2
  from <line> to <line>   what it says; the following two forms are equivalent:
2
  <line>-<line>            
2
  <line> <line>
2

2
With the `from l to l' form, either the from or the to can be left off and it will default to whatever is usual for that command (usually a line above or below the insertion point).  Actually I was thinking of punting the `from'/`to' specifications entirely because they're so verbose.  Opinions?
38
5
4
2
2
*forward*
2
also-to
38
5
5
38
5
5
38
4
4
1
2
Editor Help
38
5
0
0
38
5
4
2
0
20847
0
750669214
2
1
#46
Generic Mail Recipient

144
38
-1
-1
-1
1
36
43
33
set_aliases
38
173
-1
look_self
38
173
-1
is_writable_by
38
173
-1
is_readable_by
38
173
-1
is_usable_by
38
165
-1
mail_notify
38
173
-1
mail_forward
38
173
-1
moderator_forward
38
173
-1
add_forward
38
173
-1
delete_forward
38
173
-1
add_notify
38
173
-1
delete_notify
38
173
-1
receive_message
38
173
-1
ok
38
173
-1
ok_write
38
173
-1
parse_message_seq from_msg_seq %from_msg_seq to_msg_seq %to_msg_seq subject_msg_seq body_msg_seq display_seq_headers display_seq_full messages_in_seq list_rmm new_message_num length_num_le length_date_le length_all_msgs exists_num_eq
38
173
-1
length_date_gt
38
173
-1
rm_message_seq
38
173
-1
undo_rmm expunge_rmm renumber
38
173
-1
own_messages_filter
38
173
-1
messages
38
173
-1
date_sort
38
173
-1
_fix_last_msg_date
38
173
-1
moderator_notify
38
173
-1
msg_summary_line
38
173
-1
__check
38
173
-1
__fix
2
173
-1
init_for_core
2
173
-1
initialize
2
173
-1
mail_name
38
173
-1
mail_names
38
173
-1
expire_old_messages
2
173
-1
moveto
38
173
-1
14
moderator_notify
last_msg_date
messages_going
moderated
moderator_forward
writers
readers
mail_notify
mail_forward
expire_period
last_used_time
messages
rmm_own_msgs
guests_can_send_here
18
4
0
38
5
0
0
38
1
4
0
38
0
4
0
38
5
2
%n (%#) can't send to moderated list %t (%[#t]) directly.
38
5
4
0
38
5
4
0
38
5
4
0
38
1
2
%t (%[#t]) is a generic recipient.
38
1
0
2592000
38
5
0
0
38
1
4
0
38
0
0
0
38
5
0
0
38
5
5
38
4
4
1
2
Generic Mail Recipient
38
1
2
This can either be a mailing list or a mail folder, depending on what mood you're in...
38
5
4
2
0
17791
0
750669071
2
1
#47
Mail Distribution Center

16
38
-1
31
-1
1
-1
46
46
resolve_addr
38
173
-1
sends_to
38
173
-1
send_message
38
173
-1
raw_send
2
173
-1
mail_forward mail_notify
38
173
-1
touch
38
173
-1
look_self
38
173
-1
acceptable
38
173
-1
check_names
38
173
-1
match
38
173
-1
match_recipient
38
173
-1
match_failed
38
173
-1
make_message
38
173
-1
name
38
173
-1
name_list
38
173
-1
parse_address_field
38
173
-1
display_seq_full
2
173
-1
display_seq_headers
2
173
-1
rm_message_seq
2
165
-1
undo_rmm
2
173
-1
expunge_rmm list_rmm
2
173
-1
renumber
2
173
-1
msg_summary_line
38
173
-1
msg_summary_line(slow)
38
173
-1
parse_message_seq
2
173
-1
_parse_from _parse_to
38
173
-1
_parse_date
38
173
-1
new_message_num
2
173
-1
length_all_msgs
2
173
-1
length_date_le
2
173
-1
length_date_gt
2
173
-1
length_num_le
2
173
-1
exists_num_eq
2
173
-1
from_msg_seq
2
173
-1
%from_msg_seq
2
173
-1
to_msg_seq
2
173
-1
%to_msg_seq
2
173
-1
subject_msg_seq
2
173
-1
body_msg_seq
2
173
-1
messages_in_seq
2
173
-1
__convert_new
2
173
-1
to_text
38
173
-1
is_readable_by is_writable_by is_usable_by
38
173
-1
raw_send(new)
2
169
-1
reserved_pattern
38
173
-1
is_recipient
38
165
-1
3
options
reserved_patterns
total_recipients
7
4
11
2
include
2
noinclude
2
all
2
sender
2
nosubject
2
expert
2
enter
2
sticky
2
@mail
2
manymsgs
2
replyto
38
5
4
2
4
2
2
^Petition:%|^Ballot:%|^P:%|^B:
1
33842
4
2
2
^Dispute:%|^D:
1
223
38
1
4
10
0
47906
0
2662
0
511
0
174
0
75
0
30
0
25
0
9
0
12
0
94
38
5
5
38
4
4
2
2
Mail Distribution Center
2
Postmaster
38
5
4
5
2
This is the database of mailing-list/mail-folder objects.
2
The basic procedure for creating a new list/folder is to create a child of $mail_recipient (Generic Mail Recipient) assign it a suitable name&aliases, set a suitable .mail_forward/.mail_notify (or create suitable :mail_forward() and :mail_notify() verbs) and then teleport it here.
2

2
Avaliable aliases:
2

38
5
4
2
0
53086
0
750669068
2
1
#48
Mail Room

16
38
-1
-1
-1
51
-1
-1
25
working_on
38
165
-1
parse_invoke
38
173
-1
init_session
38
173
-1
pri*nt
38
25
-1
message_with_headers
38
173
-1
subj*ect:
38
89
-2
set_subject
38
173
-1
to*:
38
89
-2
also*-to: cc*:
38
89
-2
parse_recipients
38
173
-1
recipient_names
38
173
-1
make_message
38
173
-1
name_list
38
173
-1
parse_msg_headers
38
173
-1
check_answer_flags
38
173
-1
reply-to*: replyto*:
38
89
-2
send
2
9
-1
who
38
29
-1
showlists
38
25
-1
subsc*ribe
38
89
1
unsubsc*ribe
38
89
5
parse_msg_headers(slow)
38
173
-1
retain_session_on_exit
38
173
-1
no_littering_msg
38
173
-1
local_editing_info
38
173
-1
4
replytos
recipients
subjects
sending
42
4
0
38
0
4
0
38
0
4
0
38
0
4
0
38
0
4
0
38
1
4
0
38
1
4
2
4
12
2
say
2
emote
2
lis*t
2
ins*ert
2
n*ext,p*rev
2
enter
2
del*ete
2
f*ind
2
s*ubst
2
m*ove,c*opy
2
join*l
2
fill
4
11
2
w*hat
2
subj*ect
2
to
2
also-to
2
reply-to
2
showlists,unsubscribe
2
who
2
pri*nt
2
send
2
abort
2
q*uit,done,pause
38
5
1
45
38
5
2
Message body is empty.
38
5
4
8
4
2
2
subj*ect
2
[<text>]
4
2
2
to
2
[<rcpt>..]
4
2
2
also-to
2
[<rcpt>..]
4
2
2
reply-to
2
[<rcpt>..]
4
2
2
who
2
[<rcpt>..]
4
2
2
pri*nt
2

4
2
2
send
2

4
2
2
showlists,unsubscribe
2

38
5
0
0
38
1
0
1
38
5
2
You need to either SEND it or ABORT it before you can start another message.
38
5
4
8
4
2
2
sending
0
0
4
2
2
replytos
4
0
4
2
2
recipients
4
0
4
2
2
subjects
2

4
2
2
texts
4
0
4
2
2
changes
0
0
4
2
2
inserting
0
1
4
2
2
readable
0
0
38
1
2
%N flattens out into a largish 29 cent postage stamp and floats away.
38
5
2
A largish 29 cent postage stamp floats into the room and fattens up into %n.
38
5
4
4
2
Saving your message so that you can finish it later.
2
To come back, give the `@send' command with no arguments.
2
Please come back and SEND or ABORT if you don't intend to be working on this
2
message in the immediate future.  Keep Our MOO Clean!  No Littering!
38
5
5
38
5
5
38
5
2
You're not editing anything!
38
5
4
0
38
0
4
0
38
1
4
0
38
0
4
0
38
0
4
0
38
1
2
%L [mailing]
38
5
5
38
5
5
38
5
5
38
5
5
38
5
5
38
5
0
1
38
5
4
0
38
4
1
-1
38
5
0
1570767528
38
5
5
38
4
5
38
5
5
38
5
5
38
4
4
1
2
Mail Room
38
5
5
38
5
4
2
0
31126
0
750668673
2
1
#49
Note Editor

16
38
-1
-1
-1
51
-1
48
11
e*dit
38
25
-1
save
38
25
-1
init_session
38
173
-1
working_on
38
173
-1
parse_invoke
38
173
-1
note_text
2
165
-1
set_note_text
2
165
-1
note_match_failed
38
173
-1
w*hat
38
9
-1
mode
38
25
-1
local_editing_info
38
173
-1
2
strmode
objects
40
4
0
38
1
4
0
38
5
4
0
38
1
4
0
38
1
4
2
4
12
2
say
2
emote
2
lis*t
2
ins*ert
2
n*ext,p*rev
2
enter
2
del*ete
2
f*ind
2
s*ubst
2
m*ove,c*opy
2
join*l
2
fill
4
6
2
w*hat
2
mode
2
e*dit
2
save
2
abort
2
q*uit,done,pause
38
5
1
45
38
5
2
Note is devoid of text.
38
5
4
3
4
2
2
e*dit
2
<note>
4
2
2
save
2
[<note>]
4
2
2
mode
2
[string|list]
38
5
0
0
38
1
5
38
5
2
You need to ABORT or SAVE this note before editing any other.
38
5
4
6
4
2
2
strmode
0
0
4
2
2
objects
0
0
4
2
2
texts
0
0
4
2
2
changes
0
0
4
2
2
inserting
0
1
4
2
2
readable
0
0
38
1
2
A small swarm of 3x5 index cards arrives, engulfs %n, and carries %o away.
38
5
2
A small swarm of 3x5 index cards blows in and disperses, revealing %n.
38
5
4
3
2
Partially edited text will be here when you get back.
2
To return, give the `@notedit' command with no arguments.
2
Please come back and SAVE or ABORT if you don't intend to be working on this text in the immediate future.  Keep Our MOO Clean!  No Littering!
38
5
2
Note has not been modified since the last save.
38
5
2
There are changes.
38
5
2
Use the EDIT command to select a note.
38
5
4
0
38
0
4
0
38
1
4
0
38
0
4
0
38
0
4
0
38
1
2
%L [editing notes]
38
5
5
38
5
5
38
5
5
38
5
5
38
5
5
38
5
0
1
38
5
4
0
38
4
1
-1
38
5
0
1141642826
38
5
4
0
38
4
5
38
5
5
38
5
5
38
4
4
2
2
Note Editor
2
nedit
38
5
5
38
5
4
2
0
18255
0
750668592
2
1
#50
Verb Editor

16
38
-1
-1
-1
51
-1
49
10
e*dit
38
25
-1
com*pile
38
73
-2
working_on
38
173
-1
init_session
38
173
-1
parse_invoke
38
173
-1
fetch_verb_code
2
165
-1
set_verb_code
2
165
-1
local_editing_info
2
173
-1
verb_name
2
165
-1
verb_args
2
165
-1
2
objects
verbnames
40
4
0
38
0
4
0
38
0
4
0
38
1
4
0
38
1
4
2
4
12
2
say
2
emote
2
lis*t
2
ins*ert
2
n*ext,p*rev
2
enter
2
del*ete
2
f*ind
2
s*ubst
2
m*ove,c*opy
2
join*l
2
fill
4
5
2
w*hat
2
e*dit
2
com*pile
2
abort
2
q*uit,done,pause
38
5
1
45
38
5
2
Verb body is empty.
38
5
4
2
4
2
2
e*dit
2
<obj>:<verb>
4
2
2
com*pile
2
[as <obj>:<verb>]
38
5
0
0
38
1
5
38
5
2
You need to either COMPILE or ABORT this verb before you can start on another.
38
5
4
6
4
2
2
objects
0
0
4
2
2
verbnames
0
0
4
2
2
texts
0
0
4
2
2
changes
0
0
4
2
2
inserting
0
1
4
2
2
readable
0
0
38
1
2
You hear the bips of keyclick, the sliding of mice and the hum of computers in the distance as %n fades slowly out of view, heading towards them.
38
5
2
There are the light bips of keyclick and the sliding of mice as %n fades into view, shoving %r away from the console, which promptly fades away.
38
5
4
3
2
Keeping your verb for later work.  
2
To return, give the `@edit' command with no arguments.
2
Please come back and COMPILE or ABORT if you don't intend to be working on this verb in the immediate future.  Keep Our MOO Clean!  No Littering!
38
5
2
The verb has no pending changes.
38
5
2
You have changed the verb since last successful compile.
38
5
2
First, you have to select a verb to edit with the EDIT command.
38
5
4
0
38
0
4
0
38
1
4
0
38
0
4
0
38
0
4
0
38
1
2
%L [editing verbs]
38
5
5
38
5
5
38
5
5
38
5
5
38
5
5
38
5
0
1
38
5
4
0
38
4
1
-1
38
5
0
472956876
38
5
4
0
38
4
5
38
5
5
38
5
5
38
4
4
4
2
Verb Editor
2
vedit
2
verbedit
2
verb edit
38
5
5
38
5
4
2
0
22976
0
750668212
2
1
#51
Generic Editor

144
38
-1
-1
-1
3
50
11
66
say
38
93
-2
emote
38
93
-2
enter
38
25
-1
lis*t view
38
89
-2
ins*ert n*ext p*revious .
38
25
-1
del*ete
38
89
-2
f*ind
38
93
-2
s*ubst
38
93
-2
m*ove c*opy
38
89
-2
join*literal
38
89
-2
fill
38
89
-2
pub*lish perish unpub*lish depub*lish
38
9
-1
w*hat
38
13
-1
abort
38
9
-1
done q*uit pause
38
13
-1
huh2
2
173
-1
insertion
38
173
-1
set_insertion
38
173
-1
changed retain_session_on_exit
38
173
-1
set_changed
38
173
-1
origin
38
173
-1
set_origin
38
173
-1
readable
38
173
-1
set_readable
38
173
-1
text
38
165
-1
load
38
173
-1
working_on
38
173
-1
ok
38
173
-1
loaded
38
173
-1
list_line
38
173
-1
insert_line
38
173
-1
append_line
38
173
-1
join_lines
38
173
-1
parse_number
38
173
-1
parse_range
38
173
-1
parse_insert
38
173
-1
parse_subst
38
173
-1
invoke
38
173
-1
suck_in
38
173
-1
new_session
2
173
-1
kill_session
2
173
-1
reset_session
2
173
-1
kill_all_sessions
2
173
-1
acceptable
38
173
-1
enterfunc
38
173
-1
exitfunc
38
173
-1
@flush
38
105
-2
@stateprop
38
153
11
@rmstateprop
38
153
5
initialize
38
173
-1
init_for_core
2
173
-1
set_stateprops
38
165
-1
description
38
173
-1
commands_info
38
173
-1
match_object
38
173
-1
who_location_msg
38
165
-1
nothing_loaded_msg no_text_msg change_msg no_change_msg no_littering_msg depart_msg return_msg previous_session_msg
38
173
-1
announce announce_all announce_all_but tell_contents
38
173
-1
fill_string
38
173
-1
here_huh
38
173
-1
match
2
173
-1
get_room
38
173
-1
invoke_local_editor
2
173
-1
_stateprop_length
2
173
-1
print
2
9
-1
accept
38
173
-1
21
readable
times
commands2
help
no_text_msg
commands
invoke_task
exit_on_abort
previous_session_msg
stateprops
depart_msg
return_msg
no_littering_msg
no_change_msg
change_msg
nothing_loaded_msg
texts
active
changes
inserting
original
38
4
0
38
1
4
0
38
1
4
2
4
11
2
say
2
emote
2
lis*t
2
ins*ert
2
n*ext,p*rev
2
del*ete
2
f*ind
2
s*ubst
2
m*ove,c*opy
2
join*l
2
fill
4
3
2
w*hat
2
abort
2
q*uit,done,pause
38
5
1
45
38
5
2
There are no lines of text.
38
5
4
15
4
2
2
say
2
<text>
4
2
2
emote
2
<text>
4
2
2
lis*t
2
[<range>] [nonum]
4
2
2
ins*ert
2
[<ins>] ["<text>]
4
2
2
n*ext,p*rev
2
[n] ["<text>]
4
2
2
del*ete
2
[<range>]
4
2
2
f*ind
2
/<str>[/[c][<range>]]
4
2
2
s*ubst
2
/<str1>/<str2>[/[g][c][<range>]]
4
2
2
m*ove,c*opy
2
[<range>] to <ins>
4
2
2
join*l
2
[<range>]
4
2
2
fill
2
[<range>] [@<col>]
4
2
2
w*hat
2

4
2
2
abort
2

4
2
2
q*uit,done,pause
2

4
2
2
enter
2

38
5
0
0
38
1
0
0
38
5
2

38
5
4
4
4
2
2
texts
0
0
4
2
2
changes
0
0
4
2
2
inserting
0
1
4
2
2
readable
0
0
38
1
2
%N heads off to the Generic Editing Room.
38
5
2
%N comes back from the Generic Editing Room.
38
5
2
Keeping your [whatever] for later work.  Since this the Generic Editor, you have to do your own :set_changed(0) so that we'll know to get rid of whatever it you're working on when you leave.  Please don't litter... especially in the Generic Editor.
38
5
2
There have been no changes since the last save.
38
5
2
Text has been altered since the last save.
38
5
2
You're not currently editing anything.
38
5
4
0
38
0
4
0
38
1
4
0
38
0
4
0
38
0
4
0
38
1
2
%L [editing]
38
5
5
38
5
5
38
5
5
38
5
5
38
5
5
38
5
0
1
38
5
4
0
38
4
1
13310
38
5
0
1308305860
38
5
5
38
4
5
38
5
5
38
5
5
38
4
4
3
2
Generic Editor
2
gedit
2
edit
38
5
4
0
38
5
4
2
0
51150
0
750668204
2
1
#52
matching utilities

16
38
-1
-1
-1
1
-1
54
6
match
38
173
-1
match_nth
38
173
-1
match_verb
2
173
-1
match_list
38
173
-1
parse_ordinal_reference parse_ordref
38
173
-1
parse_possessive_reference
38
173
-1
3
ordn
ordw
ordinal_regexp
7
4
10
2
first
2
second
2
third
2
fourth
2
fifth
2
sixth
2
seventh
2
eighth
2
ninth
2
tenth
38
5
4
10
2
1st
2
2nd
2
3rd
2
4th
2
5th
2
6th
2
7th
2
8th
2
9th
2
10th
38
5
2
%<%(first%|second%|third%|fourth%|fifth%|sixth%|seventh%|eighth%|ninth%|tenth%|1st%|2nd%|3rd%|4th%|5th%|6th%|7th%|8th%|9th%|10th%)%>
38
5
5
38
4
4
1
2
matching utilities
38
5
5
38
5
4
2
0
8330
0
750666659
2
1
#53
object utilities

16
2
-1
-1
-1
1
-1
44
25
has_property
2
165
-1
all_properties
2
165
-1
has_verb
2
165
-1
has_callable_verb
2
165
-1
all_verbs
2
165
-1
match_verb
2
165
-1
isa
38
173
-1
ancestors
38
173
-1
descendants descendents
38
173
-1
descendants_suspended descendents_suspended
2
173
-1
ordered_descendants
38
173
-1
branches
38
173
-1
branches_suspended
2
173
-1
leaves
38
173
-1
leaves_suspended
2
173
-1
contains
38
173
-1
all_contents
38
173
-1
findable_properties
2
173
-1
owned_properties
2
173
-1
property_conflicts
2
165
-1
descendants_with_property_suspended
2
165
-1
locations
2
173
-1
all_properties_suspended
2
165
-1
connected
38
165
-1
isoneof
38
173
-1
0
4
5
2
4
4
1
2
object utilities
2
5
4
26
2
These routines are useful for finding out information about individual objects.
2

2
Examining everything an object has defined on it:
2
  all_verbs          (object) => like it says
2
  all_properties     (object) => likewise
2
  findable_properties(object) => tests to see if caller can "find" them
2
  owned_properties   (object[, owner]) => tests for ownership
2

2
Investigating inheritance:
2
  ancestors(object[,object...]) => all ancestors
2
  descendants      (object)     => all descendants
2
  ordered_descendants(object)   => descendants, in a different order
2
  leaves           (object)     => descendants with no children
2
  branches         (object)     => descendants with children 
2
  isa        (object,class) => true iff object is a descendant of class (or ==)
2

2
Considering containment:
2
  contains      (obj1, obj2) => Does obj1 contain obj2 (nested)?
2
  all_contents      (object) => return all the (nested) contents of object
2

2
Verifying verbs and properties:
2
  has_property(object,pname) => false/true   according as object.(pname) exists
2
  has_verb    (object,vname) => false/{#obj} according as object:(vname) exists
2
  has_callable_verb          => same, but verb must be callable from a program
2
  match_verb  (object,vname) => false/{location, newvname}
2
                               (identify location and usable name of verb)
2
5
4
2
0
14459
0
750666798
2
1
#54
lock utilities

16
2
-1
-1
-1
1
-1
28
11
init_scanner
2
173
-1
scan_token
2
173
-1
canonicalize_spaces
2
173
-1
parse_keyexp
2
173
-1
parse_E
2
173
-1
parse_A
2
173
-1
eval_key
2
173
-1
match_object
2
173
-1
unparse_key
2
173
-1
eval_key_new
2
173
-1
parse_A_new
2
173
-1
4
player
input_index
input_length
input_string
8
1
49888
2
5
0
3
2
5
0
2
2
5
2
me
2
5
5
2
4
4
1
2
lock utilities
2
5
5
2
5
4
2
0
9518
0
750666718
2
1
#55
generic letter

144
2
-1
-1
-1
9
-1
-1
3
burn
2
41
-1
burn_succeeded_msg oburn_succeeded_msg burn_failed_msg oburn_failed_msg
2
173
-1
do_burn
2
165
-1
4
oburn_succeeded_msg
oburn_failed_msg
burn_failed_msg
burn_succeeded_msg
19
2
stares at %t; %[tps] bursts into flame and disappears, leaving no ash.
2
5
0
0
2
5
2
%T might be damp.  In any case, %[tps] won't burn.
2
5
2
%T burns with a smokeless flame and leaves no ash.
2
5
5
2
5
5
38
4
5
38
5
5
2
5
5
2
5
5
2
5
5
2
5
5
38
5
5
38
5
5
38
5
2
This is a private letter.
38
5
5
38
4
4
1
2
generic letter
38
5
2
Some writing on the letter explains that you should 'read letter', and when you've finished, 'burn letter'.
38
5
4
2
0
1793
0
750666085
2
1
#56
list utilities

16
38
-1
-1
-1
1
-1
5
30
make
38
173
-1
range
38
173
-1
map_prop*erty
2
173
-1
map_verb
2
173
-1
map_arg
2
173
-1
map_builtin
2
173
-1
find_insert
38
173
-1
remove_duplicates
38
173
-1
arrayset
38
173
-1
setremove_all
38
173
-1
append
38
173
-1
reverse
38
173
-1
_reverse
38
173
-1
compress
38
173
-1
sort
38
173
-1
sort_suspended
2
173
-1
slice
38
173
-1
assoc
38
165
-1
iassoc
38
165
-1
iassoc_suspended
2
165
-1
assoc_prefix
38
173
-1
iassoc_prefix
38
173
-1
iassoc_sorted
38
173
-1
sort_alist
38
173
-1
sort_alist_suspended
2
173
-1
randomly_permute
38
173
-1
count
2
173
-1
flatten
38
173
-1
longest shortest
38
173
-1
check_nonstring_tell_lines
38
173
-1
1
nonstring_tell_lines
5
4
0
38
1
5
38
4
4
1
2
list_utilities
38
5
4
31
2
append            (list,list,..) => result of concatenating the given lists
2
reverse           (list)         => reversed list
2
remove_duplicates (list)         => list with all duplicates removed
2
compress          (list)         => list with consecutive duplicates removed
2
setremove_all     (list,elt)     => list with all occurrences of elt removed
2
find_insert       (sortedlist,e) => index of first element > e in sortedlist
2
sort              (list[,keys])  => sorted list
2
count             (elt,list)     => count of elt found in list.
2
flatten           (list)         => flatten all recursive lists into one list
2

2
make              (n[,e])        => list of n copies of e
2
range             (m,n)          => {m,m+1,...,n}
2

2
arrayset   (list,val,i[,j,k...]) => array modified so that list[i][j][k]==val
2

2
-- Mapping functions (take a list and do something to each element):
2

2
map_prop ({o...},prop)              => list of o.(prop)            for all o
2
map_verb ({o...},verb[,args)        => list of o:(verb)(@args)     for all o
2
map_arg  ([n,]obj,verb,{a...},args) => list of obj:(verb)(a,@args) for all a
2

2
-- Association list functions --
2

2
An association list (alist) is a list of pairs (2-element lists), though the following functions have been generalized for lists of n-tuples (n-element lists).  In each case i defaults to 1.
2

2
assoc        (targ,alist[,i]) => 1st tuple in alist whose i-th element is targ
2
iassoc       (targ,alist[,i]) => index of same.
2
assoc_prefix (targ,alist[,i]) => ... whose i-th element has targ as a prefix
2
iassoc_prefix(targ,alist[,i]) => index of same.
2
slice             (alist[,i]) => list of i-th elements
2
sort_alist        (alist[,i]) => alist sorted on i-th elements.
38
5
4
2
0
22960
0
750665820
2
1
#57
command utilities

16
2
-1
-1
-1
1
-1
56
18
object_match_failed
2
173
-1
player_match_result player_match_failed
2
173
-1
read
2
165
-1
read_lines
2
165
-1
yes_or_no
2
165
-1
read_lines_escape
2
173
-1
suspend
2
173
-1
running_out_of_time
38
173
-1
suspend_if_needed
2
173
-1
dump_lines
38
173
-1
explain_syntax
2
173
-1
do_huh
2
165
-1
suspend_database_add
2
173
-1
suspend_database_remove
2
173
-1
suspend_database_cleanup
2
173
-1
task_info
2
173
-1
suspend_database_display
2
173
-1
init_for_core
2
173
-1
1
suspend_database
5
4
0
2
0
5
2
4
5
2
5
4
31
2
$command_utils is the repository for verbs that are of general usefulness to authors of all sorts of commands.  For more details about any of these verbs, use `help $command_utils:<verb-name>'.
2

2
Detecting and Handling Failures in Matching
2
-------------------------------------------
2
:object_match_failed(match_result, name)
2
    Test whether or not a :match_object() call failed and print messages if so.
2
:player_match_failed(match_result, name)
2
    Test whether or not a :match_player() call failed and print messages if so.
2
:player_match_result(match_results, names)
2
    ...similar to :player_match_failed, but does a whole list at once.
2

2
Reading Input from the Player
2
-----------------------------
2
:read()         -- Read one line of input from the player and return it.
2
:yes_or_no([prompt])
2
                -- Prompt for and read a `yes' or `no' answer.
2
:read_lines()   -- Read zero or more lines of input from the player.
2
:dump_lines(lines) 
2
                -- Return list of lines quoted so that feeding them to 
2
                   :read_lines() will reproduce the original lines.
2

2
Utilities for Suspending
2
------------------------
2
:running_out_of_time()
2
                -- Return true if we're low on ticks or seconds.
2
:suspend_if_needed(time)
2
                -- Suspend (and return true) if we're running out of time.
2

2
Client Support for Lengthy Commands
2
-----------------------------------
2
:suspend(args)  -- Handle PREFIX and SUFFIX for clients in long commands.
2
5
4
2
0
24431
0
750665769
2
1
#58
generic wizard

16
2
-1
-1
-1
59
2
38
30
@chown
2
81
-2
@shout
2
89
-2
@grant @grants* @transfer
2
89
1
@programmer
2
25
-1
make-core-database
2
25
-1
@shutdown
2
89
-2
@dump-d*atabase
2
9
-1
@who-calls
2
89
-2
mcd_2
2
13
-1
@toad @toad! @toad!!
2
89
-2
@untoad @detoad
2
89
-2
@quota
2
81
12
@players
2
89
-2
kill_aux_wizard_parse
2
173
-1
@grepcore @egrepcore
2
89
-2
@net-who @@who
2
89
-2
@make-player
2
89
-2
@abort-sh*utdown
2
89
-2
toad_msg toad_victim_msg programmer_msg programmer_victim_msg newt_msg newt_victim_msg
2
173
-1
moveto
2
165
-1
@newt
2
17
-1
@unnewt @denewt @get-better
2
81
-2
@register
2
89
-2
@new-password @newpassword
2
89
12
@log
2
89
-2
@guests
2
25
-1
@rn mail_catch_up check_mail_lists current_message set_current_message get_current_message make_current_message kill_current_message
2
13
-1
@blacklist @graylist @redlist @unblacklist @ungraylist @unredlist @spooflist @unspooflist
2
89
-2
@corify
2
81
13
@make-guest
2
25
-1
8
newt_victim_msg
newt_msg
public_identity
programmer_msg
programmer_victim_msg
toad_victim_msg
toad_msg
mail_identity
70
2

2
5
2
%n @newts %d (%[#d])
2
5
1
-1
2
5
2
%d is now a programmer.
2
5
2
You are now a programmer.
2
5
2
Have a nice life...
2
5
2
%n @toads %d (%[#d])
2
5
1
-1
2
4
5
38
1
5
2
5
5
2
5
5
2
5
5
2
5
5
38
1
5
2
0
5
2
5
5
2
0
5
2
1
1
25
2
5
5
2
5
5
38
1
5
38
1
5
38
0
5
38
1
5
2
5
5
2
1
5
38
1
5
2
4
5
2
0
5
2
0
5
2
5
5
2
4
5
2
5
5
2
4
5
2
4
5
2
5
5
2
5
5
2
5
5
2
5
5
2
5
5
2
5
5
2
5
5
2
5
5
2
5
5
2
4
5
2
4
5
2
1
5
2
0
5
2
5
5
2
5
5
2
5
5
2
5
5
2
5
5
2
5
5
2
5
5
2
5
5
2
5
1
11
2
5
2
really impossible password to type
2
0
5
2
5
5
2
5
5
2
5
5
2
5
5
2
5
5
2
1
5
2
4
5
2
4
4
1
2
player
2
1
2
You see a wizard who chooses not to reveal its true appearance.
2
5
4
2
0
75799
0
750665764
2
1
#59
generic programmer

144
2
-1
-1
-1
4
58
-1
29
@prop*erty
2
81
-2
@chmod
2
81
-2
@args
2
81
-2
eval*-d
2
81
-2
@rmprop*erty
2
81
-2
@verb
2
81
-2
@rmverb
2
17
-1
@list
2
81
-2
@forked
2
17
-1
@kill
2
17
-1
@edit
38
89
-2
@copy @copy-x
2
81
1
_kill_task_message
2
173
-1
@prog*ram
2
81
-2
@setenv
2
81
-2
@pros*pectus pros*pectus
2
85
-2
@d*isplay
2
17
-1
@db*size
2
9
-1
@gethelp
2
85
-2
@grep @egrep
2
81
-2
@s*how
2
89
-2
@check-p*roperty
2
17
-1
set_eval_env
2
165
-1
@clearp*roperty @clprop*erty
2
17
-1
@disown @disinherit
2
89
-2
eval_cmd_string
2
173
-1
@dump
2
81
-2
#*
2
89
-2
eval_value_to_string
2
173
-1
4
eval_subs
eval_time
eval_ticks
eval_env
62
4
0
38
1
0
0
2
5
0
0
2
5
2

2
5
5
2
5
5
38
1
5
2
0
5
2
5
5
2
0
5
2
1
4
4
1
24
1
30
1
22
1
23
2
5
5
2
5
5
38
1
5
38
1
5
38
0
5
38
1
5
2
5
5
2
1
5
38
1
5
2
4
5
2
0
5
2
0
5
2
5
5
2
4
5
2
5
5
2
4
5
2
4
5
2
5
5
2
5
5
2
5
5
2
5
5
2
5
5
2
5
5
2
5
5
2
5
5
2
5
5
2
4
5
2
4
5
2
1
0
0
2
0
5
2
5
5
2
5
5
2
5
5
2
5
5
2
5
5
2
5
5
2
5
5
2
5
5
2
5
1
11
2
5
5
2
0
5
2
5
5
2
5
5
2
5
5
2
5
5
2
5
5
2
1
5
2
4
5
2
4
4
2
2
generic
2
programmer
2
1
2
You see a player who is too experienced to have any excuse for not having a description.
2
5
4
2
0
66107
0
750665750
2
1
#60
code utilities

16
38
-1
-1
-1
1
-1
57
48
eval_d
2
85
-2
1
2
165
-1
tonum
38
173
-1
toobj
38
173
-1
toerr
38
173
-1
error_name
38
173
-1
show_object
2
165
-1
show_property
2
165
-1
show_verbdef
2
165
-1
explain_verb_syntax
2
173
-1
verb_p*erms verb_permi*ssions
2
173
-1
verb_loc*ation
38
173
-1
verb_documentation
2
165
-1
set_verb_documentation
2
173
-1
parse_propref
2
173
-1
parse_verbref
2
173
-1
parse_argspec
38
173
-1
prepositions
38
173
-1
short_prep
38
173
-1
full_prep
38
173
-1
get_prep
38
165
-1
_fix_preps
38
165
1
find_verb_named
2
165
-1
find_last_verb_named
2
165
-1
find_callable_verb_named
2
165
-1
verbname_match(new)
38
173
-1
find_verbs_containing
2
173
-1
_find_verbs_containing
2
165
-1
find_verbs_matching
2
173
-1
_find_verbs_matching
2
165
-1
_grep_verb_code
2
165
-1
_egrep_verb_code
2
165
-1
_parse_audit_args
38
173
-1
help_db_list
2
165
-1
help_db_search
38
165
-1
corify_object
38
165
-1
substitute
2
173
-1
inside_quotes
2
173
-1
verb_or_property
2
165
-1
task_valid
2
165
-1
task_owner
2
173
-1
argstr
2
173
-1
verbname_match
38
173
-1
show_who_listing
2
165
-1
_egrep_verb_code_all
2
173
-1
_grep_verb_code_all
2
173
-1
_grep_verb_code_all
38
173
-1
verb_usage
2
165
-1
10
prepositions
_version
_multi_preps
_other_preps_n
_other_preps
_short_preps
_all_preps
builtin_props
error_names
error_list
14
4
15
2
with/using
2
at/to
2
in front of
2
in/inside/into
2
on top of/on/onto/upon
2
out of/from inside/from
2
over
2
through
2
under/underneath/beneath
2
behind
2
beside
2
for/about
2
is
2
as
2
off/off of
38
5
2
1.7.6
38
5
4
7
2
off
2
from
2
out
2
on
2
on top
2
in
2
in front
38
5
4
13
0
1
0
2
0
4
0
4
0
5
0
5
0
5
0
6
0
6
0
9
0
9
0
12
0
15
38
5
4
13
2
using
2
at
2
inside
2
into
2
on top of
2
onto
2
upon
2
out of
2
from inside
2
underneath
2
beneath
2
about
2
off of
38
5
4
15
2
with
2
to
2
in front of
2
in
2
on
2
from
2
over
2
through
2
under
2
behind
2
beside
2
for
2
is
2
as
2
off
38
5
4
28
2
with
2
using
2
at
2
to
2
in front of
2
in
2
inside
2
into
2
on top of
2
on
2
onto
2
upon
2
out of
2
from inside
2
from
2
over
2
through
2
under
2
underneath
2
beneath
2
behind
2
beside
2
for
2
about
2
is
2
as
2
off
2
off of
38
5
4
9
2
name
2
r
2
w
2
f
2
programmer
2
wizard
2
owner
2
location
2
contents
2
1
4
15
2
E_NONE
2
E_TYPE
2
E_DIV
2
E_PERM
2
E_PROPNF
2
E_VERBNF
2
E_VARNF
2
E_INVIND
2
E_RECMOVE
2
E_MAXREC
2
E_RANGE
2
E_ARGS
2
E_NACC
2
E_INVARG
2
E_QUOTA
38
5
4
15
3
0
3
1
3
2
3
3
3
4
3
5
3
6
3
7
3
8
3
9
3
10
3
11
3
12
3
13
3
14
38
5
5
38
4
4
2
2
code
2
utils
38
5
4
45
2
parse_propref("foo.bar")  => {"foo","bar"} (or 0 if arg. isn't a property ref.)
2
parse_verbref("foo:bar")  => {"foo","bar"} (or 0 if arg. isn't a verb ref.)
2
parse_argspec("any","in","front","of","this","baz"...)
2
                          => {{"any", "in front of", "this"},{"baz"...}} 
2
                                           (or string if args don't parse)
2

2
tonum(string)           => number (or E_TYPE if string is not a number)
2
toobj(string)           => object (or E_TYPE if string is not an object)
2
toerr(number or string) => error value (or 1 if out of range or unrecognized)
2
error_name(error value) => name of error (e.g., error_name(E_PERM) => "E_PERM")
2

2
verb_perms()    => the current task_perms (as set by set_task_perms()).
2
verb_location() => the object where the current verb is defined.
2
verb_documentation([object,verbname]) => documentation at beginning of
2
           verb code, if any -- default is the calling verb
2

2
   Preposition routines
2

2
prepositions()     => full list of prepostions
2
full_prep ("in")   => "in/inside/into"
2
short_prep("into") => "in"
2
short_prep("in/inside/into") => "in"
2
get_prep  ("off", "of", "the", "table") => {"off of", "the", "table"}
2

2
   Verb routines
2

2
verbname_match (fullname,name) => can `name' be used to call `fullname'
2
find_verb_named          (object,name[,n]) => verb number or -1 if not found
2
find_callable_verb_named (object,name[,n]) => verb number or -1 if not found
2
find_verbs_containing (pattern[,object|objlist])
2

2
   Verbs that do the actual dirty work for @show:
2

2
show_object  (object)
2
show_property(object,propname)
2
show_verbdef (object,verbname)
2

2
   Dirty work for explain_syntax
2

2
explain_verb_syntax(thisname,verbname,@verbargs)
2

2
   A random but useful verb
2

2
verb_or_property(object,name[,@args]) => result of verb or property call,
2
                                         or E_PROPNF
38
5
4
2
0
52654
0
750665678
2
1
#61
Help Database

16
38
-1
-1
-1
32
-1
45
8
player_quota
2
173
-1
prog_quota
2
173
-1
get_topic
2
165
-1
find_topics
2
165
-1
full_index
38
173
-1
index_list
38
165
-1
wizard_list
2
165
-1
dump_topic
38
173
-1
175
@locations
@uptime
@mailoptions
@sort-owned
@verify-owned
@add-owned
@mail-options
wizard-list
@wrap
full-index
 index
gen-index
mail-forwarding
@pagelength
@more
programming
@forward
@subscribe
@rn
@unsubscribe
@skip
negative_quota
zombie-messages
message-sequences
common_quota
@recreate
@linelength
room-messages
@unrmmail
@gaglist
::
@comment
@remove-entrance
@remove-exit
@parents
@contents

spoofing
privacy
@realm
@resident
@examine
security
@sweep
@paranoid
@check
@reply
@eject
@quit
whereis
@suggest
@idea
@bug
@typo
@renumber
@notedit
editors
@prev
@unlock_for_open
@lock_for_open
@opacity
container-messages
@memory
"
:
@lastlog
@version
miscellaneous
insert
information
?
put
remove
burn
letters
decrypt
encrypt
delete
erase
write
read
examine
hand
key-representation
keys
@unlock
@lock
locking
thing-messages
throw
take
@messages
pronouns
exit-messages
messages
descriptions
@describe
@add-entrance
@add-exit
topology
@classes
@audit
@count
@quota
@create
tinymud
@next
@answer
@rmmail
@read
@send
mail
@gripe
creation
@mail
@listgag
@ungag
@gag
go
@password
@sethome
@who
introduction
give
news
gagging
@dig
@move
inventory
@entrances
@exits
@gender
@recycle
@rename
containers
notes
look
drop
get
manipulation
help
rooms
movement
home
communication
say
whisper
page
emote
building
players
summary
@edit-options
@editoptions
@add-feature
@remove-feature
@features
features
@dump
me
@rmalias
@addalias
commands
 name
 alias
@setprop
@set
@peek
@subscribed
@request-character
player-names
@registerme
@netforward
@eject!
gopher
180
4
7
2
Syntax:  @locations object
2

2
Prints out the names and object numbers of all containing objects.
2

2
Example:
2
  @locations ur-Rog
2
  ur-Rog(#6349)   ur-Rog's Display Case(#6355)   Editorial Boardroom(#5747)
38
5
4
4
2
Syntax:  @uptime
2

2
   The @uptime command displays the amount of time since the last restart of the server.
2
   Note to programmers:  The last restart time of the server is stored in $last_restart_time.
38
5
4
2
2
*forward*
2
@mail-options
38
1
4
3
2
Syntax:  @sort-owned
2

2
Sorts your .owned_objects property so @audit shows up sorted.  See help @audit for more information.
38
5
4
3
2
Syntax:  @verify-owned
2

2
Checks that all the objects in your .owned_objects property are actually owned by you, and effects repairs if needed.  See help @audit for more information.
38
5
4
3
2
Syntax:  @add-owned <object>
2

2
Adds an object to your .owned_objects property in case it managed not to get updated properly upon creation of that object.  Checks to ensure that the objects is really owned by you and otherwise belongs in your .owned_objects property.  See help @audit for more information.
38
5
4
55
2
Syntax:  @mail-option
2
         @mail-option <option>
2

2
Synonym:  @mailoption
2

2
The first form displays all of your mail options
2
The second displays just that one option, which may be either `@mail', `replyto', or one of the flags listed below.  The mail options control various annoying details of your mail reading and mail editing commands.
2

2
The remaining forms of this command are for setting your mail options:
2

2
         @mail-option +<flag>
2
         @mail-option -<flag>
2
         @mail-option !<flag>           (equivalent to -<flag>)
2

2
These respectively set and reset the specified flag
2

2
 -include      @reply's start out with a blank message body
2
 +include      @reply's start with original message included
2
 -all          @reply's go to sender only
2
 +all          @reply's go to sender and all original recipients
2
 -nosubject    @send forces you to provide a Subject: line
2
 +nosubject    allow entering the mail editor without giving a subject line
2
 -enter        start each mail editing session in the usual command mode.
2
 +enter        start each mail editing session with an implicit `enter' command
2
 -expert       novice mail user (various annoying messages will be printed)
2
 +expert       expert mail user (suppress printing of annoying messages)
2
 -sticky       each mail command applies by default to one's own collection
2
 +sticky       each mail command applies by default to the same message 
2
                 collection that the previous successful command did
2
 -netmail      mail to you accumulates in your MOO mailbox
2
 +netmail      mail to you is actually forwarded to your registered email
2
                address, if you have one.
2

2
For "sticky", `mail command' is one of @mail, @read, @prev, @next, @answer.
2
All flags default to the `-' settings.  
2

2
Next, we have
2

2
         @mail-option  manymsgs [is] <number>
2
         @mail-option  manymsgs=<number>
2
         @mail-option -manymsgs
2

2
The first two forms specify that if you give a @mail or @read command asking for <number> or more messages, you will first be given a yes-or-no prompt to continue, the idea being that you many not actually have wanted to see that many messages.  The third form turns off this behavior.
2

2
         @mail-option  @mail [is] <message-sequence>
2

2
The "@mail" option determines what message-sequence the @mail command uses by 
2
default.  Initially, this is "last:15", but other reasonable choices include
2
"new" and "1-last"
2

2
         @mail-option  replyto [is] <recipient> [<recipient>...]
2
         @mail-option -replyto
2

2
The first form specifies that a Reply-To: field is to be placed in all messages constructed by @send or @answer.  Note this can still be changed before sending via the mail room's reply-to command.  
2
The second form resets this option so that no Reply-to: is initially inserted.
38
5
4
4
2
*subst*
2

2
%;this:wizard_list()
2

38
5
4
2
2
*forward*
2
@linelength
38
1
4
1
2
*full_index*
38
5
4
1
2
*index_list*
38
5
4
2
2
*index*
2
General Help Topics
38
5
4
30
2
There are 3 personal properties that you can use to customize how your mail is composed and forwarded
2

2
.mail_forward 
2
 -- list of objects that will receive any mail that gets sent to you.
2
    Objects on this list should either be players or descendants of 
2
    $mail_recipient.
2
    If this list is nonempty, you will not receive any mail yourself unless
2
    you are on it.  E.g., if Rog is #4292 and ur-Rog is #6349
2

2
  #6349.mail_forward={}            -- usual case; ur-Rog gets his own mail.
2
  #6349.mail_forward={#4292}       -- Rog gets ur-Rog's mail instead.
2
  #6349.mail_forward={#6349,#4292} -- ur-Rog gets mail and Rog gets a copy.
2
  #6349.mail_forward={#-1}         -- ur-Rog's mail disappears without a trace.
2

2
.mail_notify
2
 -- list of objects to be notified whenever mail is sent to you.
2
    This list may include anything that has a :notify_mail() verb.
2
    Notification will take place regardless of whether or how your mail
2
    is forwarded.  
2

2
Thus, in the previous example
2

2
  #4292.mail_notify={#6349} --- means that ur-Rog will be told
2
                                whenever Rog is sent new mail.
2

2
.mail_options
2
 -- this controls lots of miscellaneous things.  Use the @mail-option command
2
    to view and set these options (see `help @mail-option')
2

2
See `help mail-resolve' for more detail on how mail forwarding and mail notification work.  See `help MR-subscribing' for information on how to change .mail_forward and .mail_notify on $mail_recipient children, where they are !c properties.
38
5
4
21
2
Syntax:  @pagelength <number>
2
         @pagelength
2

2
If the lines you see scroll off the top of your screen too quickly for you to
2
read and your client program is such that any lines scrolling off the top are
2
gone forever, you can use the @pagelength command to invoke page buffering to
2
limit the number of lines sent at a time.  E.g., if your terminal has a 24 line
2
screen, you can do @pagelength 24 and output will stop every 24 lines if you
2
don't type any other commands.
2

2
You will need to use the @more command to continue reading output once it 
2
has been stopped.  Make sure you read `help @more' before setting @pagelength.
2

2
@pagelength 0 means no page buffering will be done by the MOO.
2

2
By default the MOO will assume you have an infinitely wide terminal screen, so
2
you may wish to set @linelength as well, and ensure wrapping is on with @wrap
2
on.  (See help @linelength and help @wrap.)  As with word wrapping, you are
2
best off running a client that can do its own page buffering; the MOO server's
2
page buffering is inherently slower and many MUD's do not have page buffering
2
at all.
2
1
4
19
2
*subst*
2
Syntax:  @more
2
         @more rest
2
         @more flush
2

2
If you have @pagelength set (see `help @pagelength') and some combination of events or commands produces sufficiently many lines of output, you will see a message of the form
2

2
%[strsub(player.more_msg,"%%n","37")]
2

2
indicating (in this case) 37 more lines of text waiting to be read.  
2
At this point, you should give one of the @more commands above.  
2

2
@more without arguments prints sufficiently many lines to fill your screen,
2
assuming you've set @pagelength correctly, unless there are not that many
2
lines left to print.
2

2
@more rest will print all of the remaining lines, regardless of your @pagelength setting.  
2

2
@more flush discards all remaining lines
2
1
4
3
2
MOO contains a rich programming language for the creation of interesting rooms, exits, and other objects.
2

2
Not every player is allowed to program in MOO, including (at the moment, anyway) you.  If you would like to be, find a wizard and convince them that you've got good ideas that the MOO needs.  Good luck!
38
5
4
3
2
Syntax:  @forward <msg> [on *<collection>] to <recipient> [<recipient>...]
2

2
Takes the indicated message in your (or some other) message collection, creates a new message whose body is the original message (both headers and body) and sends it on to the given recipients.
38
5
4
24
2
Syntax:  @subscribe *<collection> [with notification]
2
         @subscribe
2

2
The first form of this command does two things:
2

2
(1) it sets up a current message and a last-read-time for the given mail 
2
    collection so that when next you log in, you will be informed about new 
2
    mail that has appeared there.  Note that this happens automatically
2
    whenever you @read messages on a given collection, so if this much is 
2
    all you care about, you don't need to use this command; just do, e.g.,
2
             @read last on *<collection>
2

2
(2) if you added the "with notification clause, adds you to the .mail_notify
2
    list for that collection, so that you will be notified *immediately*
2
    whenever new mail is sent there.
2

2
You can only @subscribe to collections that are readable by you.
2
The second form of the command gives a list of collections available to you.
2

2
Note that this is entirely different from the Mail Room `subscribe' command
2
which actually adds you to the .mail_forward list for a given collection/
2
mailing-list, so that mail sent to the list actually shows up in your own
2
mail collection.
2
We're probably going to phase out the Mail Room `subscribe' command...
38
5
4
5
2
Syntax:  @rn
2

2
For each collection of mail messages that you read other from your own, a last-read-time is kept.  This command tells you which collections (out of all those you have ever read) have recently had messages added to them, i.e., more recently than when you last did a @read, @prev, @next, or @skip on that collection.
2

2
Etymologists' note:  If you thought @rn had anything to do with the popular UNIX newsreading program `rn', it's just your imagination.
38
5
4
2
2
*forward*
2
@skip
38
5
4
8
2
Syntax:  @skip [<collection>...]
2
         @unsubscribe [<collection>...]
2

2
For each collection of mail messages that you read other from your own, a current message and a last-read-time is kept.  Normally, if you neglect to actually @read any messages on a collection other from your own, @rn (or :check_mail_lists) will continue to remind you that they are there.
2

2
The @skip command indicates that you're not interested in reading the rest of the messages that currently exist in that given collection.  
2

2
The @unsubscribe command flushes the current-message/last-read-time information completely, indicating that you are not only uninterested in the rest of the messages on that collection, but also likewise uninterested in anything else that may appear on that collection later on.  @unsubscribe also removes you from the collection's .mail_notify list.
38
5
4
10
2
*subst*
2
We recently reduced the initial quota for new players to %[$help:player_quota()].
2
Those of you who were around before this are covered by a grandfather clause
2
i.e., you get to keep your over-quota objects.  However this means that 
2
your quota for creating new objects may now be *more than* used up, i.e.,
2
negative.  In particular, this means that if you recycle an object, 
2
you will not be able to @create one in its place.
2

2
You can, however, re-use your over-quota objects by using the @recreate 
2
command instead (see `help recreate').
38
5
4
2
2
*forward*
2
@unrmmail
38
5
4
45
2
Certain mail commands, including @mail, @read, and @rmmail, allow a <message-sequence> argument that indicates to which messages in one's collection the command is to apply.  Any combination of the following may appear as a <message-sequence> argument to any of the various mail commands (@mail, @read, @answer, @rmm).
2

2
  17        message number 17 if there is one (and likewise for other integers)
2
  17..23    all messages numbered between 17 and 23 (inclusive), if any.
2
  cur       the current message
2
  prev      the message before
2
  next      the message after
2
  last      the final message if any (`$' is a synonym for `last')
2

2
You may use as many of these at once as sanity permits, e.g.,
2

2
  @mail cur 1..5 last
2

2
which will display the header for your current message, your messages in the range 1..5, and your last message.  Though some of these ranges may overlap, the header for any given message is only shown once in any event.
2

2
In addition, there are other message-sequence arguments that act as filters
2
on whatever precedes them
2

2
 before:<date>               messages strictly before the given date
2
 after:<date>                messages strictly after the given date
2
 since:<date>                messages on or after the given date
2
 until:<date>                messages on or before the given date
2
 from:<player>[|<player...]  messages from the given player(s)
2
 to:<recip>[|<recip>...]     messages to the given recipient(s)
2
 subject:<string>            messages with <string> in the subject
2
 body:<string>               messages with <string> in the body (SLOW!!!)
2
 first:<number>              the first <number> messages
2
 last:<number>               the last <number> messages
2

2
<date>  is either a weekday, an dd-Month, dd-Month-yy or dd-Month-yyyy date
2
<recip> is either <player> or *<$mail_recipient kid>
2

2
Examples:
2

2
  @read from:G7|Gemba              read all messages from G7 or Gemba
2
  @rmm to:yduJ|*Core               remove messages that are to yduJ or to *Core
2
  @mail since:1-Jan before:1-Feb   show messages dated in January
2
  @mail since:Tues                 show messages dated on or after Tuesday
2
  @rmm subject:manners             remove msgs with `manners' in the subject:
2
  @mail subject:"stupid idiots"    (search string contains a space => need "'s)
2
  @rmm to:yduJ to:*Core            remove messages that are to yduJ and *Core
2
  @mail from:Haakon last:5         show the last 5 messages from Haakon
2
  @mail last:10 body:fribble       show those of the last 10 messages having
2
                                   `fribble' in the body (one should always try
2
                                   to narrow body searches in this way).
38
5
4
7
2
Syntax:  @quota
2

2
Each player has a limit as to how many objects that player may create, called their 'quota'.  Every object they create lowers the quota by one and every object they recycle increases it by one.  If the quota goes to zero, then that player may not create any more objects (unless, of course, they recycle some first).
2

2
The @quota command prints out your current quota.
2

2
The quota mechanism is intended to solve a long-standing problem in many MUDs: database bloat.  The problem is that a large number of people build a large number of dull objects and areas that are subsequently never used or visited.  The database becomes quite large and difficult to manage without getting substantially more interesting.  With the quota system, we can make it possible for players to experiment and learn while simultaneously keeping random building to acceptable levels.
2
1
4
5
2
Usage: @recreate <object> as <parent> named <name spec>
2

2
This is a combination of @create and @chparent.  It takes an existing object, completely strips it of any verbs, properties, and values for inherited properties.  This object is then reshaped into a child of the parent specified, as though @create had been called, but retaining the same object number as the original.
2

2
The <parent> and <name spec> arguments are as in @create.
38
5
4
22
2
Syntax:  @wrap <on|off>
2
         @wrap
2

2
         @linelength <number>
2
         @linelength
2

2
If the lines you see get cut off at the edge of your screen (you don't have
2
word-wrap), you can get LambdaMOO to split lines for you.  The @linelength
2
command tells the MOO how many columns you have on your screen--you probably
2
want @linelength 79--and "@wrap on" tells the MOO you want it to do word-
2
wrap.
2

2
It's better if you can fix this problem without LambdaMOO's help, though,
2
because the MOO's solution will be slower than a local solution, and
2
because not all MUDs are willing to do word-wrap.
2

2
If you don't want the MOO to split lines for you, there might still be some
2
use for the @linelength command.  Certain commands, like @who and @check,
2
print truncated lines so they can print in neat columns.  The default for
2
these is generally about 79 columns, which looks fine if you have an
2
eighty-column screen.  If your screen is a different width, though, you
2
can set @linelength and some of these commands will react accordingly.
38
5
4
13
2
*subst*
2
A few different messages can be set on a room object (see 'help messages' for instructions on doing so); they are printed to various audiences when a player or other object is ejected from the room.  (See 'help @eject'.)  The standard pronoun substitutions are made on each message before it is printed; see 'help pronouns' for details.
2

2
The default message is given in brackets after each name below:
2

2
@ejection  [%[$room.ejection_msg]]
2
  Printed to the player doing the ejecting.
2

2
@victim_ejection  [%[$room.victim_ejection_msg]]
2
  Printed to the object being ejected.
2

2
@oejection  [%[$room.oejection_msg]]
2
  Printed to others in the room from which the object is being ejected.
38
5
4
13
2
Syntax:  @unrmmail [list|expunge] [on *<collection>]
2

2
When you do @rmmail on a particular message collection, the messages removed don't go away immediately, but are rather saved elsewhere.  These "zombie" messages can be brought back or examined using the @UNrmmail command.
2

2
Without `list' or `expunge', @unrmm restores the zombie messages, thus undoing the effect of the most recent @rmmail command.  Only the most recent @rmmail can be undone in this way; messages deleted by any previous @rmmail commands on this same collection are lost and gone forever.
2

2
The `list' option merely lists the headers of the zombie messages without actually restoring them.
2

2
The `expunge' option banishes the zombie messages forever.
2

2
Note that the message numbers used by zombie messages are held in reserve against the possibility that you might @unrmm them some day; with such messages around, new messages received will be given higher numbers than you might have expected.  @renumber does an implicit @unrmm expunge.
2

2
`@unrmmail' and `@unrmmail expunge' on collections other than your own are only allowed when you have write access.  Likewise, `@unrmmail list' on other collections is only possible when they are readable by you.
38
5
4
2
2
*forward*
2
@listgag
38
5
4
2
2
*forward*
2
emote
38
5
4
2
2
*forward*
2
@typo
38
5
4
3
2
Syntax:  @remove-entrance <entrance>
2

2
Remove the specified entrance from the current entrances list of the room.  Entrance may be either the name or object number of an entrance to this room.
38
5
4
3
2
Syntax:  @remove-exit <exit>
2

2
Remove the specified exit from the current exits list of the room.  Exit may be either the name or object number of an exit from this room.
38
5
4
8
2
Syntax:  @parents object
2

2
A quick way to find out the ancestry of an object.  Prints out the names and object numbers of all ancestors.
2

2
Example:
2
  @parents Haakon
2
  Haakon(#2)   generic wizard(#218)   generic programmer(#217)   generic 
2
  player(#6)   Root Class(#1)
38
5
4
8
2
Syntax:  @contents object
2

2
A quick way to find out the contents of an object.  Prints out the names and object numbers of all direct contents.  This can be useful when you need to refer to something by object number because something is wrong with its aliases.
2

2
Example:
2
  @contents here
2
  The Entrance Hall(#19) contains:
2
  Strasbourg Clock(#71)   mirror at about head height(#7444)
38
5
4
5
2
*forward*
2
summary
2

2
Type 'help <topic>' for information on a particular topic.
2

38
5
4
2
2
*forward*
2
security
38
1
4
15
2
Some things you should be aware of:
2

2
 -*-*- OMNISCIENT WIZARDS AND SYSADMINS: -*-*-
2
Wizards can look at absolutely *anything* in the MOO database.  
2
The arch-wizard and the sysadmin for the MOO-server host have complete access not only to the MOO database itself but to many other possibly-relevant things.
2
The above mentioned parties (wizards et al), while they will endeavor to be discreet about anything incidental that turns up, nevertheless reserve the right look at anything they want, if only for the sake of being able to resolve technical problems.
2

2
 -*-*- LOGGING: -*-*- 
2
Some client programs (the "client" is the program you use to connect to the MOO, e.g., telnet, tinytalk, tinyfugue, emacs with mud.el...) are capable of logging everything that happens to the corresponding player.  In fact, with some clients this happens by default.  If a given player's client has logging enabled and said player is either in the room with you or is monitoring an object that is in the room with you, then *everything* you say and emote gets recorded.  Also, if you are in a room owned by someone else, all bets are off.  There is *no way* that the MOO server can know about what client a given player is using; thus, anyone who can hear you is a potential logger.
2

2
In and of itself this would not be a problem --- indeed, logs are often useful for reference purposes.  However, there is no guarantee that the log will not end up someplace where you'd rather it didn't, e.g., posted on the rec.games.mud Usenet newsgroup.  While it considered bad form (i.e., rude) to circulate or post a log without having the permission of at least the major participants in the activities logged, there is not a whole lot we can do on the technical side to prevent it from happening.
2

2
Be aware of the problem.  The @sweep command (see `help @sweep') attempts to determine what players can be listening at any given moment.  If anything, it errs on the side of paranoia.  Even so, it doesn't cover *all* possible avenues of eavesdropping, and there's no hope for it covering the situations like the one where someone manages to convince one of the participants in your discussion who kept a log that it really doesn't need to be kept private after all.
2

2
If you've got something really sensitive to discuss, you are best off doing it by encrypted email or in person.
38
5
4
17
2
Syntax: @realm [owners] [from root] [missing descendants]
2

2
Displays a part of the parenting tree of objects on the MOO, i.e. all
2
the descendants of a given object owned by particular players.
2

2
owners:      a list of players whose objects you are interested in. If
2
             one of these is * or !, @realm will display objects only if
2
             they belong to players you didn't mention. (defaults to you)
2
root:        the object which is an ancestor of all the objects you are
2
             interested in. (defaults to $root_class).
2
descendants: a list of objects (descendants of root) which you are not
2
             interested in. Neither they nor their descendants will be
2
             displayed.
2

2
@realm also displays the objects which are ancestors of root, and, if it
2
is not redundant, the owners of all objects. @realm has a habit of
2
running out of ticks if you try displaying large chunks of the MOO.
38
5
4
13
2
Syntax: @resident player
2
        @resident !player
2
        @resident
2

2
Adds or removes a player from the residents list of a room.  The residents list controls who is allowed to use @sethome in that room.  This defaults to just the owner of the room; by manipulating the residents list you may allow additional players to use that room as their home.
2

2
@resident player adds that player to the list.  
2
@resident !player removes that player from the list.
2
@resident with no arguments simply displays the current list (which may be "none", indicating no additional people besides the owner may use that room as their home).
2

2
See also help @sethome.
2

2
Hints for programmers: The verb $room:accept_for_abode is called by @sethome.  By overriding this verb you can give different criteria to @sethome.  It should return 1 for allowed and 0 for denied.
38
5
4
12
2
Syntax:  @examine <object>
2
         @exam <object>
2

2
Prints several useful pieces of information about the named object, including the following:
2
        + its full name, aliases, and object number
2
        + its owner's name and object number
2
        + its description
2
        + its key expression (if it is locked and if you own it)
2
        + its contents and their object numbers
2
        + the 'obvious' verbs defined on it
2

2
[Note to programmers: the 'obvious' verbs are those that are readable and that can be invoked as commands.  To keep a verb off this list, either make it unreadable (see 'help @chmod') or, if it shouldn't be used as a command, give it 'args' of 'this none this' (see 'help @args').]
38
5
4
5
2
There are several commands available to determine the origins of messages and to check that your communications with other players are secure. Help is available on the following topics:
2

2
@paranoid -- keeping a record of messages your character hears.
2
@check    -- looking at that record to determine responsibility for messages.
2
@sweep    -- checking who is listening in on your conversation.
38
5
4
3
2
Syntax: @sweep
2

2
Used when you wish to have a private conversation, and are concerned someone may be listening in. @sweep tries to list the avenues by which information may be leaving the room. In a manner analogous to @check, it assumes that you don't want to hear about your own verbs, or those belonging to wizards, who presumably wouldn't stoop to bugging.
38
5
4
6
2
Syntax:  @paranoid
2
         @paranoid off
2
         @paranoid immediate
2
         @paranoid <number>
2

2
In immediate mode, the monitor prepends everything you hear with the name of the character it considers responsible for the message. Otherwise, it keeps records of the last <number> (defaults to 20) lines you have heard. These records can be accessed by the @check command.
38
5
4
23
2
Syntax:   @check <options>
2

2
where <options> is one or more of:
2
-- the number of lines to be displayed
2
-- a player's name, someone to be "trusted" during the assignment of responsibility for the message.
2
-- a player's named prefixed by !, someone not to be "trusted".
2

2
          @check-full <options>
2
where <options is either 
2
-- the number of lines to be displayed
2
-- a search string: only lines containing that string will be displayed.
2

2
Used when you are suspicious about the origin of some of the messages your character has just heard.
2

2
Output from @check is in columns that contain, in order, the monitor's best guess as to:
2
    what object the message came from,
2
    what verb on that object that was responsible,
2
    whose permissions that verb was running with, and
2
    the beginning of the actual message.
2

2
Output from @check-full is in columns that contains a description of all the verbs that were responsible for the noise heard, not just the best guess as to who was responsible.
2

2
@check operates by examining the list of verbs that were involved in delivering the message, and assigning responsibility to the first owner it sees who is not "trusted".  By default, it trusts you and all the wizards.  It uses the records maintained by @paranoid, so you must have used that command before you received the message.
38
5
4
2
2
*forward*
2
@answer
38
5
4
11
2
Syntax: @eject[!] <object> [from <place>]
2

2
This command is used to remove unwanted objects from places you own.  Players thus removed are unceremoniously dumped in their homes (unless that's this room, in which case they are dumped in the default player starting place).  Other kinds of objects are checked for a .home property and sent there if possible, otherwise they get thrown into #-1.  Unlike @move, @eject does *not* check to see if the object wants to be moved, and with the destination being what it is, there is no question of the destination refusing the move, either.  Generally, you should only resort to @eject if @move doesn't work.
2

2
`@eject <object>' removes <object> from the current room, whereas `@eject <object> from <place>' removes the object from the specified location (in most cases, <place> will need to be specified as an object number).  In either case, this command only works if you own the room/entity from which the object is being ejected.
2

2
`@eject ... from me' suffices to get rid of some unwanted object in your inventory.
2

2
The verbs @eject! and @eject!! are provided for those rare situations in which @eject does not work.  @eject! does not check for .home properties, sending the offending object to #-1 immediately, but with a notification.  @eject!! is just like @eject! but provides no notification to the object.
2

2
See 'help room-messages' for a list of messages one can set regarding the @eject command.
38
5
4
3
2
Syntax:  @quit
2

2
Disconnect from the MOO.  This breaks your network connection and leaves your player sleeping.  Disconnecting in most parts of the MOO automatically returns your player to its designated home (see 'help home').
38
1
4
4
2
Syntax:  whereis [<player> [<player>...]]
2
        @whereis [<player> [<player>...]]
2

2
Returns the current location of each of the specified players, or of all players if not arguments given.
38
5
4
2
2
*forward*
2
@typo
38
5
4
2
2
*forward*
2
@typo
38
5
4
2
2
*forward*
2
@typo
38
5
4
12
2
Syntax:  @typo    [<text>]
2
         @bug     [<text>]
2
         @suggest [<text>]
2
         @idea    [<text>]
2
         @comment [<text>]
2

2
If <text> is given, a one-line message is sent to the owner of the room, presumably about something that you've noticed.  If <text> is not given, we assume you have more to say than can fit comfortably on a single line; the usual mail editor is invoked.  The convention is that @typo is for typographical errors on the room or objects found therein, @bug is for anomalous or nonintuitive behaviour of some sort, @idea/@suggest for any particular brainstorms or criticisms you might happen to have, and @comment for anything else.
2

2
If you're sending a bug report to someone because you got an error traceback when you used some object of theirs, please give them enough information to work on the problem.  In particular, please tell them *exactly* what you typed and *all* of the error messages that were printed to you, including the entire traceback, up to the line `(End of traceback.)'.  Without this information, it is nearly impossible for the programmer to discover, let alone fix, the problem.
2

2
The usual mail editor is only invoked for this command when in rooms that allow free entry, i.e., rooms that are likely to allow you back after you are done editing your message.  Otherwise these commands will require <text> and only let you do one-line messages.  
2
Most adventuring scenario rooms fall into this latter category.
38
5
4
5
2
Syntax:  @renumber [<collection>]
2

2
Renumbers the messages in your collection to go from 1 to however many you have at the moment.  The optional argument allows you to renumber the messages stored in some other collection (@renumber, like @rmmail, requires write access).
2

2
Note that if you have zombie messages from a previous @rmmail command (see `help zombie-messages'), these will be expunged.
38
5
4
8
2
Syntax:  @notedit <note-object>
2
         @notedit <object>.<property>
2

2
Enters the MOO Note Editor to edit the text on the named object
2
For the first form, <note-object> must be a descendant of $note.  
2
For the second form, <object>.<property> can be any string-valued or text-valued (i.e., list of strings) property on any object.
2

2
See 'help editors' for more detail.
38
5
4
40
2
One can always enter an editor by teleporting to it, or you can use one of the commands provided
2

2
    @edit     <object>:<verb>    invokes the Verb Editor (edits verb code)
2
    @notedit  <note_object>      invokes the Note Editor (edits note text)
2
    @notedit  <object>.<prop>    invokes the Note Editor (edits text property)
2
    @send     <list of recipients>        invokes the Mailer (edits a mail msg)
2
    @answer   [<msg_number>] [<flags>...] invokes the Mailer (edits a reply)
2

2
This will transport you to one of several special rooms that have editing commands available.  These editors are admittedly not as good as EMACS, but for those with no other editing capability on their host systems, they are better than nothing.
2

2
There is a generic editor that provides basic editing commands that are applicable to all editors.  Documentation for these commands can be obtained by typing `help <topic>' within the editor:
2

2
    abort              emote/:            pause              send      (M) 
2
    also-to (M)        fill               prev               showlists (M) 
2
    compile (V)        insert             print     (M)      subject   (M) 
2
    copy               join               quit               subst         
2
    delete             list               ranges             to    (M)     
2
    done               move               save      (N)      what          
2
    edit    (V,N)      next               say/"              who   (M)     
2

2
In addition, individual editors provide their own additional commands for loading text from places, saving text to places, and various other specialized functions which are denoted in the above list with (M),(N),(V) according as they apply to the mail editor, the note editor, or the verb editor, respectively.
2

2
Note that a given editor only allows you one session at a time (ie. one verb, one note, or one mail message).  If you leave an editor without either aborting or compiling/saving/sending the item you're working on, that editor remembers what you are doing next time you enter it, whether you enter it by teleporting or by using the appropriate command.  Note that editors are periodically flushed so anything left there for sufficiently long will eventually go away.
2

2
A player may have his own .edit_options property which is a list containing one or more (string) flags from the following list
2

2
  quiet_insert
2
      suppresses those annoying "Line n added." or "Appended..." messages
2
      that one gets in response to 'say' or 'emote'.  This is useful if you're
2
      entering a long list of lines, perhaps via some macro on your client,
2
      and you don't want to see an equally long list of "Line n added..."
2
      messages.  What you do want, however is some indication that this all
2
      got through, which is why the "." command is an abbreviation for insert.
2

2
  eval_subs
2
      Enables the verb editor to process your eval_subs property when
2
      compiling your verb.  See `help eval' for more information about
2
      the eval_subs property.
2

2
There will be more options, some day.
38
5
4
3
2
Syntax:  @prev [on <collection>]
2

2
Print the 'previous' message in a given email collection (defaults to your own).  The mail system's notion of your 'current message' for that collection is decremented.  Thus, e.g., one can review all of one's previous messages one-by-one simply by typing '@prev' repeatedly.
38
5
4
6
2
Syntax:
2
  @unlock_for_open <container>
2

2
Clears the lock which restricts who may open <container>.  See 'help locking' for general information about locking. 
2

2
See 'help containers' for information on containers.
38
5
4
6
2
Syntax:
2
  @lock_for_open <container> with <key expression>
2

2
Set the lock on <container> which restricts who can open it.  See 'help locking' for general information about locking and 'help keys' for the syntax and semantics of key expressions.
2

2
See 'help containers' for information on containers.
38
5
4
9
2
Syntax:
2
  @opacity <container> is <integer>
2

2
The opacity can take on one of three values:
2
   0:  The container is transparent and you can always see into it.
2
   1:  The container is opaque, and you cannot see into it when closed
2
   2:  The container is a black hole, and you can never see into it whether closed or open.  
2

2
The default @opacity is 1.
38
5
4
49
2
*subst*
2
Several kinds of messages can be set on a container object; they are printed to various audiences at certain times whenever an attempt is made to use the container.  The ones whose names begin with 'o' are always shown prefixed with the name of the player making the attempt and a single space character.  The standard pronoun substitutions (with respect to the player) are made on each message before it is printed; see 'help pronouns' for details.
2

2
The default message is given in brackets after each name below:
2

2
@empty[%[$container.empty_msg]]
2
  Printed in place of the contents list when the container is empty.
2

2
@open  [%[$container.open_msg]]
2
  Printed to the player who successfully opens the container.
2

2
@oopen  [%[$container.oopen_msg]]
2
  Printed to others in the same room if the player successfully opens the container.
2

2
@open_fail  [%[$container.open_fail_msg]]
2
  Printed to the player who cannot open the container.
2

2
@oopen_fail  [%[$container.oopen_fail_msg]]
2
  Printed to others in the room when a player fails to open a container.
2

2
@close  [%[$container.close_msg]]
2
  Printed to the player who closes a container.
2

2
@oclose  [%[$container.oclose_msg]]
2
  Printed to others in the room when a player closes a container.
2

2
@put  [%[$container.put_msg]]
2
  Printed to a player when an object is successfully placed in a container.
2

2
@oput  [%[$container.oput_msg]]
2
  Printed to others in the room when a player successfully places an object in a container.
2

2
@put_fail  [%[$container.put_fail_msg]]
2
  Printed when a player fails to put an object in a container.
2

2
@oput_fail  [%[$container.oput_fail_msg]]
2
  Printed to others in the room when a player fails to place an object in a container.
2

2
@remove  [%[$container.remove_msg]]
2
  Printed when a player succeeds in removing an object from a container.
2

2
@oremove  [%[$container.oremove_msg]]
2
  Printed to others in the room when a player succeeds in removing an object from a container.
2

2
@remove_fail  [%[$container.remove_fail_msg]]
2
  Printed when a player fails to remove an object from a container.
2

2
@oremove_fail  [%[$container.oremove_fail_msg]]
2
  Printed to others in the room when a player fails to remove an object from a container.
38
5
4
3
2
Syntax:  @memory
2

2
Prints out all information available on the current memory-usage behavior of the MOO server.  Probably only a wizard, if anyone, cares about this.
38
1
4
2
2
*forward*
2
say
38
1
4
2
2
*forward*
2
emote
38
1
4
6
2
Syntax:  @lastlog
2
         @lastlog <player>
2

2
The first form prints out a list of all players, roughly sorted by how long it's been since that player last connected to the MOO.  For each player, the precise time of their last connection is printed.
2

2
The second form only shows the last-connection time for the named player.
38
1
4
3
2
Syntax:  @version
2

2
Prints out the version number for the currently-executing MOO server.
38
1
4
4
2
Here are a few commands of occasional utility that didn't fit into any of the neat categories for the rest of the help system:
2

2
@version -- printing the MOO server version number
2
@lastlog -- finding out when some player last connected to the MOO
38
1
4
2
2
*forward*
2
put
38
1
4
2
2
*forward*
2
help
38
1
4
2
2
*forward*
2
help
38
1
4
4
2
Syntax:  put <object> into <container>
2
         insert <object> in <container>
2

2
Moves the named object into the named container.  Sometimes the owners of the object and/or the container will not allow you to do this.
38
1
4
2
2
*forward*
2
take
38
1
4
3
2
Syntax:  burn <letter>
2

2
Destroy the named letter irretrievably.  Only players who can read the letter can do this.
38
1
4
1
2
A letter is a special kind of note (see 'help notes') with the added feature that it can be recycled by anyone who can read it.  This is often useful for notes from one player to another.  You create the letter as a child of the generic letter, $letter (see 'help @create' and 'help write'), encrypt it so that only you and the other player can read it (see 'help encrypt') and then either give it to the player in question or leave it where they will find it.  Once they've read it, they can use the 'burn' command to recycle the letter; see 'help burn' for details.
38
1
4
3
2
Syntax:  decrypt <note>
2

2
Removes any restriction on who may read the named note or letter.  Only the owner of a note may do this.
38
1
4
3
2
Syntax:  encrypt <note> with <key-expression>
2

2
Restricts the set of players who can read the named note or letter to those for whom the given key expression is true.  See 'help keys' for information on the syntax and semantics of key expressions.  Only the owner of a note may do this.
38
1
4
3
2
Syntax:  delete <line-number> from <note>
2

2
Removes a single line of text from a note.  The first line of text is numbered 1, the second is 2, and so on.  Only the owner of a note may do this.
38
1
4
3
2
Syntax:  erase <note>
2

2
Deletes all of the text written on a note or letter.  Only the owner of a note may do this.
38
1
4
3
2
Syntax:  write "<any text>" on <note>
2

2
Adds a line of text to the named note or letter.  Only the owner of a note may do this.
38
1
4
3
2
Syntax:  read <note>
2

2
Prints the text written on the named object, usually a note or letter.  Some notes are encrypted so that only certain players may read them.
38
1
4
10
2
Syntax:  examine <object>
2
         exam <object>
2

2
Prints several useful pieces of information about the named object, including the following:
2
        + its full name, object number, and aliases
2
        + its owner's name
2
        + its description
2
        + its key expression (if it is locked and if you own it)
2
        + its contents
2
        + the 'obvious' verbs defined on it
38
1
4
2
2
*forward*
2
give
38
1
4
10
2
The representation of key expressions is very simple and makes it easy to construct new keys on the fly.
2

2
Objects are represented by their object numbers and all other kinds of key expressions are represented by lists.  These lists have as their first element a string drawn from the following set:
2
        "&&"     "||"     "!"     "?"
2
For the first two of these, the list should be three elements long; the second and third elements are the representations of the key expressions on the left- and right-hand sides of the appropriate operator.  In the third case, "!", the list should be two elements long; the second element is again a representation of the operand.  Finally, in the "?" case, the list is also two elements long but the second element must be an object number.
2

2
As an example, the key expression
2
        #45  &&  ?#46  &&  (#47  ||  !#48)
2
would be represented as follows:
2
        {"&&", {"&&", #45, {"?", #46}}, {"||", #47, {"!", #48}}}
38
1
4
24
2
LambdaMOO supports a simple but powerful notation for specifying locks on objects, encryption on notes, and other applications.  The idea is to describe a constraint that must be satisfied concerning what some object must be or contain in order to use some other object.
2

2
The constraint is given in the form of a logical expression, made up of object numbers connected with the operators 'and', 'or', and 'not' (written '&&', '||', and '!', for compatibility with the MOO programming language).  When writing such expressions, though, one usually does not use object numbers directly, but rather gives their names, as with most MOO commands.
2

2
These logical expressions (called 'key expressions') are always evaluated in the context of some particular 'candidate' object, to see if that object meets the constraint.  To do so, we consider the candidate object, along with every object it contains (and the ones those objects contain, and so on), to be 'true' and all other objects to be 'false'.
2

2
As an example, suppose the player Munchkin wanted to lock the exit leading to his home so that only he and the holder of his magic wand could use it.  Further, suppose that Munchkin was object #999 and the wand was #1001.  Munchkin would use the '@lock' command to lock the exit with the following key expression:
2
        me || magic wand
2
and the system would understand this to mean
2
        #999 || #1001
2
That is, players could only use the exit if they were (or were carrying) either #999 or #1001.
2

2
To encrypt a note so that it could only be read by Munchkin or someone carrying his book, his bell, and his candle, Munchkin would use the 'encrypt' command with the key expression
2
        me || (bell && book && candle)
2

2
Finally, to keep players from taking a large gold coffin through a particularly narrow exit, Munchkin would use this key expression:
2
        ! coffin
2
That is, the expression would be false for any object that was or was carrying the coffin.
2

2
There is one other kind of clause that can appear in a key expression:
2
        ? <object>
2
This is evaluated by testing whether the given object is unlocked for the candidate object; if so, this clause is true, and otherwise, it is false.  This allows you to have several locks all sharing some single other one; when the other one is changed, all of the locks change their behavior simultaneously.
2

2
[Note to programmers: The internal representation of key expressions, as stored in .key on every object, for example, is very simple and easy to construct on the fly.  For details, see 'help key-representation'.]
38
1
4
3
2
Syntax:  @unlock <object>
2

2
Clear any lock that might exist on the given object.  See 'help locking' for general information about locking.
38
1
4
5
2
Syntax:  @lock <object> with <key expression>
2

2
Set a lock on <object> to restrict its use.  See 'help locking' for general information about locking and 'help keys' for the syntax and semantics of key expressions.
2

2
N.B.  In the case of rooms, you are actually better off setting room.free_entry to 0 thus preventing teleportation and then @locking the various entrances.  The problem with @locking the room itself is that this can make it impossible to drop objects in the room.
38
1
4
21
2
It is frequently useful to restrict the use of some object.  For example, one might want to keep people from using a particular exit unless they're carrying a bell, a book, and a candle.  Alternatively, one might allow anyone to use the exit unless they're carrying that huge golden coffin in the corner.  LambdaMOO supports a general locking mechanism designed to make such restrictions easy to implement, usually without any programming.
2

2
Every object supports a notion of being 'locked' with respect to certain other objects.  For example, the exit above might be locked for any object that was carrying the coffin object but unlocked for all other objects.  In general, if some object 'A' is locked for another object, 'B', then 'B' is usually prevented from using 'A'.  Of course, the meaning of 'use' in this context depends upon the kind of object.
2

2
The various standard classes of objects use locking as follows:
2
  + Rooms and containers refuse to allow any object inside them if they're locked for it.
2
  + Exits refuse to transport any object that they're locked for.
2
  + Things (including notes and letters) cannot be moved to locations that they're locked for.
2

2
There are two sides to locking:
2
  + How is it specified whether one object is locked for another one?
2
  + What is the effect of an object being locked?
2
Note that these two questions are entirely independent: one could invent a brand-new way to specify locking, but the effect of an exit being locked would be unchanged.
2

2
[Note to programmers: the interface between these two sides is the verb x:is_unlocked_for(y), which is called by x to determine if it is locked for the object y.  The way in which 'is_unlocked_for' is implemented is entirely independent of the ways in which x uses its results.  Note that you can play on either side of this interface with your own objects, either defining new implementations of 'is_unlocked_for' that match your particular circumstances or having your objects interpret their being locked in new ways.]
2

2
There is a default way to specify locks on objects; the following help topics cover the relevant commands:
2

2
@lock -- setting a lock on an object
2
@unlock -- clearing the lock on an object
2
keys -- describes the language used to describe lock keys
38
1
4
28
2
*subst*
2
Several kinds of messages can be set on 'things', objects that have $thing as an ancestor (see 'help messages' for instructions on doing so).  They are printed to various audiences under various circumstances when an attempt is made to 'take' or 'drop' a thing.  The ones whose names begin with 'o' are always shown prefixed with the name of the player making the attempt and a single space character.  The standard pronoun substitutions (with respect to the player) are made on each message before it is printed; see 'help pronouns' for details.
2

2
The default message is given in brackets after each name below:
2

2
@take_failed  [%[$thing.take_failed_msg]]
2
  Printed to a player who fails to take the object.
2

2
@otake_failed [%[$thing.otake_failed_msg]]
2
  Printed to others in the same room if a player fails to take the object.
2

2
@take_succeeded  [%[$thing.take_succeeded_msg]]
2
  Printed to a player who succeeds in taking the object.
2

2
@otake_succeeded  [%[$thing.otake_succeeded_msg]]
2
  Printed to others in the same room if a player succeeds in taking the object.
2

2
@drop_failed  [%[$thing.drop_failed_msg]]
2
  Printed to a player who fails to drop the object.
2

2
@odrop_failed [%[$thing.odrop_failed_msg]]
2
  Printed to others in the same room if a player fails to drop the object.
2

2
@drop_succeeded  [%[$thing.drop_succeeded_msg]]
2
  Printed to a player who succeeds in dropping the object.
2

2
@odrop_succeeded  [%[$thing.odrop_succeeded_msg]]
2
  Printed to others in the room if a player succeeds in dropping the object.
38
1
4
2
2
*forward*
2
drop
38
1
4
9
2
Syntax:  take <object>
2
         get <object>
2
         take <object> from <container>
2
         get <object> from <container>
2
         remove <object> from <container>
2

2
The first two forms pick up the named object and place it in your inventory.  Sometimes the owner of the object won't allow it to be picked up for some reason.
2

2
The remaining forms move the named object from inside the named container (see 'help containers') into your inventory.  As before, sometimes the owner of an object will not allow you to do this.
38
1
4
3
2
Syntax:  @messages <object>
2

2
List all of the messages that can be set on the named object and their current values.  See 'help messages' for more details.
38
1
4
67
2
Some kinds of messages are not printed directly to players; they are allowed to contain special characters marking places to include the appropriate pronoun for some player.  For example, a builder might have a doorway that's very short, so that people have to crawl to get through it.  When they do so, the builder wants a little message like this to be printed:
2

2
        Balthazar crawls through the little doorway, bruising his knee.
2

2
The problem is the use of 'his' in the message; what if the player in question is female?  The correct setting of the 'oleave' message on that doorway is as follows:
2

2
        "crawls through the little doorway, bruising %p knee."
2

2
The '%p' in the message will be replaced by either 'his', 'her', or 'its', depending upon the gender of the player.  
2

2
As it happens, you can also refer to elements of the command line (e.g., direct and indirect objects) the object issuing the message, and the location where this is all happening.  In addition one can refer to arbitrary string properties on these objects, or get the object numbers themselves.
2

2
The complete set of substitutions is as follows:
2

2
        %% => `%'  (just in case you actually want to talk about percentages).
2
    Names:
2
        %n => the player
2
        %t => this object (i.e., the object issuing the message,... usually)
2
        %d => the direct object from the command line
2
        %i => the indirect object from the command line
2
        %l => the location of the player
2
    Pronouns:
2
        %s => subject pronoun:          either `he',  `she', or `it'
2
        %o => object pronoun:           either `him', `her', or `it'
2
        %p => posessive pronoun (adj):  either `his', `her', or `its'  
2
        %q => posessive pronoun (noun): either `his', `hers', or `its'
2
        %r => reflexive pronoun:  either `himself', `herself', or `itself'
2
    General properties:
2
        %(foo) => player.foo 
2
        %[tfoo], %[dfoo], %[ifoo], %[lfoo]
2
               => this.foo, dobj.foo, iobj.foo, and player.location.foo
2
    Object numbers:
2
        %#  => player's object number
2
        %[#t], %[#d], %[#i], %[#l]
2
            => object numbers for this, direct obj, indirect obj, and location.
2

2
In addition there is a set of capitalized substitutions for use at the 
2
beginning of sentences.  These are, respectively, 
2

2
   %N, %T, %D, %I, %L for object names, 
2
   %S, %O, %P, %Q, %R for pronouns, and
2
   %(Foo), %[dFoo] (== %[Dfoo] == %[DFoo]),... for general properties
2

2
Note: there is a special exception for player .name's which are assumed to
2
already be capitalized as desired.
2

2
There may be situations where the standard algorithm, i.e., upcasing the first letter, yields something incorrect, in which case a "capitalization" for a particular string property can be specified explicitly.  If your object has a ".foo" property that is like this, you need merely add a ".fooc" (in general .(propertyname+"c")) specifying the correct capitalization.  This will also work for player .name's if you want to specify a capitalization that is different from your usual .name
2

2
Example:  
2
Rog makes a hand-grenade with a customizable explode message.
2
Suppose someone sets grenade.explode_msg to:
2

2
  "%N(%#) drops %t on %p foot.  %T explodes.  
2
   %L is engulfed in flames."
2

2
If the current location happens to be #3443 ("yduJ's Hairdressing Salon"),
2
the resulting substitution may produce, eg.,
2

2
  "Rog(#4292) drops grenade on his foot.  Grenade explodes.  
2
   YduJ's Hairdressing Salon is engulfed in flames."
2

2
which contains an incorrect capitalization.  
2
yduJ may remedy this by setting #3443.namec="yduJ's Hairdressing Salon".
2

2
Note for programmers:  
2
 In programs, use $string_utils:pronoun_sub().
2
 %n actually calls player:title() while %(name) refers to player.name directly.
38
1
4
22
2
*subst*
2
Several kinds of messages can be set on an exit object (see 'help messages' for instructions on doing so); they are printed to various audiences at certain times whenever an attempt is made to go through the exit.  The ones whose names begin with 'o' are always shown prefixed with the name of the player making the attempt and a single space character.  The standard pronoun substitutions (with respect to the player) are made on each message before it is printed; see 'help pronouns' for details.
2

2
The default message is given in brackets after each name below:
2

2
@leave  [%[$exit.leave_msg]]
2
  Printed to the player just before they successfully use the exit.
2

2
@oleave  [%[$exit.oleave_msg||"has left."]]
2
  Printed to others in the source room when a player successfully uses the exit.
2

2
@arrive  [%[$exit.arrive_msg]]
2
  Printed to the player just after they successfully use the exit.
2

2
@oarrive  [%[$exit.oarrive_msg||"has arrived."]]
2
  Printed to others in the destination room when a player successfully uses the exit.
2

2
@nogo  [%[$exit.nogo_msg||"You can't go that way."]]
2
  Printed to the player when they fail in using the exit.
2

2
@onogo  [%[$exit.onogo_msg]]
2
  Printed to others when a player fails in using the exit.
38
1
4
18
2
Most objects have messages that are printed when a player succeeds or fails in manipulating the object in some way.  Of course, the kinds of messages printed are specific to the kinds of manipulations and those, in turn, are specific to the kind of object.  Regardless of the kind of object, though, there is a uniform means for listing the kinds of messages that can be set and then for setting them.
2

2
The '@messages' command prints out all of the messages you can set on any object you own.  Type 'help @messages' for details.
2

2
To set a particular message on one of your objects use a command with this form:
2
        @<message-name> <object> is "<message>"
2
where '<message-name>' is the name of the message being set, <object> is the name or number of the object on which you want to set that message, and <message> is the actual text.
2

2
For example, consider the 'leave' message on an exit; it is printed to a player when they successfully use the exit to leave a room.  To set the 'leave' message on the exit 'north' from the current room, use the command
2
        @leave north is "You wander in a northerly way out of the room."
2

2
[Note to programmers: This class of commands automatically applies to any property whose name ends in '_msg'.  Thus, in the example above, the command is setting the 'leave_msg' property of the named exit.  You can get such a command to work on new kinds of objects simply by giving the appropriate properties names that end in '_msg'.  Additionally, in many cases the _msg property is accompanied by a _msg verb, which defaultly returns the named property, but which is available to be customized in more complex ways than allowed by simple string substitution.  You should check for the particular property you're considering whether the verb form exists (typically with @list).]
2

2
The following help topics describe the uses of the various messages available on standard kinds of objects:
2

2
container-messages -- the messages on objects that can contain other objects
2
exit-messages -- the messages on exit objects
2
thing-messages -- the messages on objects that can be taken and dropped
38
1
4
5
2
Most objects have one or more descriptive pieces of text associated with them; these texts are printed under various circumstances depending on the kind of text.  For example, every object has a 'description' text that is printed whenever a player looks at the object.  The following help topics discuss the commands for manipulating these descriptive texts on your objects:
2

2
@rename -- setting the name and aliases of your objects
2
@describe -- setting what others see when they look at your objects
2
messages -- listing and setting the other descriptive texts on an object
38
1
4
13
2
Syntax:  @describe <object> as <description>
2

2
Sets the description string of <object> to <description>.  This is the string that is printed out whenever someone uses the 'look' command on <object>.  To describe yourself, use 'me' as the <object>.
2

2
Example:
2
Munchkin types this:
2
  @describe me as "A very fine fellow, if a bit on the short side."
2
People who type 'look Munchkin' now see this:
2
  A very fine fellow, if a bit on the short side.
2

2
Note for programmers:
2
The description of an object is kept in its .description property.  
2
For descriptions of more than one paragraph, .description can be a list of strings.
38
1
4
3
2
Syntax:  @add-entrance <exit-object-number>
2

2
Add the exit with the given object number as a recognized entrance to the current room (that is, one whose use is not considered teleportation).  Usually, @dig does this for you, but it doesn't if you don't own the room in question.  Instead, it tells you the object number of the new exit and you have to find the owner of the room and get them to use the @add-entrance command to link it up.
38
1
4
3
2
Syntax:  @add-exit <exit-object-number>
2

2
Add the exit with the given object number as a conventional exit from the current room (that is, an exit that can be invoked simply by typing its name, like 'east').  Usually, @dig does this for you, but it doesn't if you don't own the room in question.  Instead, it tells you the object number of the new exit and you have to find the owner of the room and get them to use the @add-exit command to link it up.
38
1
4
8
2
The topology of the MOO universe is determined by the rooms that exist and the exits that connect them.  Several commands are available for creating and discovering the topology of the MOO.  Help on them is available under the following topics:
2

2
@dig -- creating new rooms and exits
2
@add-exit -- adding other players' exits from your rooms
2
@add-entrance -- adding other player's entrances to your rooms
2
@exits -- listing all of the conventional exits from your rooms
2
@entrances -- listing all of the conventional entrances to your rooms
2
@resident -- listing or changing the residents of your rooms
38
1
4
8
2
Syntax:  @classes
2
         @classes <class-name> ...
2

2
The wizards have identified several useful classes of objects in the database.  The @classes command is used to see which classes exist and what their member objects are.
2

2
The first form simply lists all of the defined classes along with short descriptions of the membership of each.
2

2
The second form prints an indented listing of that subset of the object parent/child hierarchy containing the objects in the class(es) you specify.
38
1
4
27
2
Syntax:  @audit [<player>] [for <string>] [from <number>] [to <number>] 
2

2
`@audit'        prints a report of all of the objects you own.
2
`@audit player' prints the same report for another player.
2

2
The `for' string restricts the search to objects whose names begin with that string.
2
It is also possible to restrict the range of object numbers to include only those above a given number (`from') or below a given number (`to').
2

2
All forms of @audit print a report:
2

2
   #14 Gemba                          [The Pool]
2
  #144 Popgun                         [Gemba]
2
 #1479 Cockatoo                      *[The Living Room]
2
 #1673 Bottom of Swimming Pool       
2
 #2147 Cavern                        <-*west
2
 #2148 tunnel                         Bottom of Swimming ->Cavern
2

2
The first column is the object's number, the second its name. The third column shows the object's location: Gemba is in The Pool, and is carrying the Popgun (#144).
2
For exits, the third column shows source ->dest.
2
For rooms, the third column shows any entrances owned by someone else.
2
Object location, exit sources and destinations owned by another player are preceded by a *.
2

2
@audit uses a property .owned_objects on the player, for speed.  This property is updated at the time of each object creation and destruction and ownership change.  The verb @auditdb (same args as @audit) actually searches through the entire database for objects.
2

2
See also @verify-owned, @sort-owned, and @add-owned.
2

2
See also @prospectus, which gives some additional information.
38
1
4
3
2
Syntax:  @count
2

2
Prints out the number of objects you own.  Do not be surprised if this is one larger than you think it should be: remember that your player object is owned by you as well, even though you didn't create it in the usual way.
38
1
4
4
2
*forward*
2
common_quota
2

2
To get a larger quota, talk to a wizard.  They will take a look at what you've done with the objects you've built so far and make a determination about whether or not it would be a net gain for the MOO community if you were to build some more things.  If so, they will increase your quota; if not, they will try to explain some ways in which you could build things that were more useful, entertaining, or otherwise interesting to other players.  Wizards may be more impressed by objects which are interactive and employ a fair number of verbs.
38
1
4
12
2
Syntax:  @create <class-name> named "<names>"
2
         @create <parent-object> named "<names>"
2

2
The main command for creating objects other than rooms and exits (for them, see 'help @dig'; it's much more convenient).
2

2
The first argument specifies the 'parent' of the new object: loosely speaking, the 'kind' of object you're creating.  <class-name> is one of the four standard classes of objects: $note, $letter, $thing, or $container.  As time goes on, more 'standard classes' may be added.  If the parent you have in mind for your new object isn't one of these, you may use the parent's name (if it's in the same room as you) or else its object number (e.g., #4562).
2

2
The <names> are given in the same format as in the @rename command:
2
        <name-and-alias>,<alias>,...,<alias> [preferred]
2
        <name>:<alias>,...,<alias> [not preferred]
2

2
See 'help @rename' for a discussion of the difference between a name and an alias.
38
1
4
45
2
This is yduJ's table of tinymud commands and their equivalents in LambdaMOO.  A longer document, with discussions of the different verbs and how they have changed, is available via FTP from parcftp.xerox.com as pub/MOO/contrib/TinyMUD-LambdaMOO-equivs.  All the commands mentioned here have help nodes on LambdaMOO.
2

2
The following commands are basically the same in MOO and MUD.
2

2
    drop(throw), get(take), go, help, home, inventory, look, news, say (",:)
2

2

2
The following commands have no equivalent:
2

2
    kill, rob, score, @force
2

2

2
The following commands have the same names and do similar things, but are changed in some way (both syntactic and semantic differences, sometimes quite substantial differences):
2

2
    @examine, give, page, read, whisper, @create, @dig,
2
    @lock, @password, @unlock, @describe
2

2

2
The following commands have rough equivalents in LambdaMOO but the name is different:
2

2
    TinyMUD name            LambdaMOO name
2
    ------------            --------------
2
    QUIT                    @quit
2
    gripe                   @gripe
2
    goto/move               go
2
    WHO                     @who
2
    @fail                   @take_failed, @nogo, @drop_failed
2
    @find                   @audit
2
    @link                   @dig, @sethome, @add-exit, @add-entrance
2
    @name                   @rename
2
    @ofail                  @otake_failed, @onogo, @odrop_failed
2
    @open                   @dig
2
    @osuccess               @oleave, @oarrive, @otake_succeeded, 
2
                            @odrop_succeeded
2
    @success                @leave, @arrive, @take_succeeded
2
                            @drop_succeeded
2
    @teleport               @move
2

2

2
Here are some commands for which no equivalent exists, or for which the equivalent is a complicated set of actions.
2

2
    @set, @stats, @unlink
2

2

2
Documentation on most of the LambdaMOO commands mentioned above can be acquired using 'help <command-name>'.  A notable exception is the commands like @oarrive and @take_failed that set textual messages on objects.  These are described under 'help messages'.
38
1
4
3
2
Syntax:  @next [on <collection>]
2

2
Print the `next' message in a given email collection (defaults to your own).  The mail system's notion of your 'current message' for that collection is incremented.  Thus, e.g., one can read all of one's new messages one-by-one simply by typing '@next' repeatedly.
38
1
4
13
2
Syntax:  @answer [<message-number>] [sender] [all] [include] [noinclude]
2

2
Synonym: @reply
2

2
Prepares for you to compose a MOO email message to the players who either received or composed the indicated message from your collection.  The usual editor is invoked (see `help editors' for details).  The subject line for the new message will be initialized from that of the indicated message.  If you leave off the message number, the reply will be to your current message, if that exists.  In fact you may give a general message-sequence (see `help message-sequences') argument here, provided that it indicates only a single message (e.g., `@answer last:1')
2

2
If there is a Reply-to: field in the message you are @answer'ing, its contents will be used to initialize the To: line of your reply.  Otherwise, a To: line is determined depending on whether you specified `sender' or `all' in the command line (or your .mail_options).
2

2
`include' includes the text of the original message in your reply, `noinclude' does not.  
2

2
`sender', `all', `include', and `noinclude' can each be abbreviated (e.g., `@answer i').
2

2
Defaults are `sender' and `noinclude', but you can change this by setting your .mail-options (see `help mail-options').  
38
5
4
10
2
Syntax:  @rmmail [<message-sequence>] [from *<recipient>]
2

2
Deletes the indicated messages from your MOO email collection.
2
By default, your current message is deleted.
2
See `help message-sequence' for the full list of possible arguments.
2
You get the message numbers for use here by typing the '@mail' command.
2

2
There is no confirmation for this action, so be careful.  While it is true that @unrmmail will be able to bring back the messages deleted by the last @rmm, any messages deleted before then are really gone, i.e., irrecoverable.  See `help @unrmmail' for more information.
2

2
This command may be used on other mail recipients (children of $mail_recipient), but only ones to which you have write access (you either have to own it or be on good terms with whoever does...).
38
5
4
14
2
Syntax:  @read <message-number>
2
         @read
2
         @peek ...
2

2
Prints the contents of the indiciated messages from your MOO email collection.  You get the message numbers for use here by typing the '@mail' command, which prints a table of contents for your entire MOO email collection.  If no arguments are given to @read, then the 'current message' in your collection is printed.  In any case, the 'current message' after @read finishes is the last one printed.
2

2
The most general form of the @read command is
2

2
         @read <message-sequence> [on *<collection>]  
2

2
where <message-sequence> is as described in `help message-sequences'.
2
As with the @mail command you may @read messages on any publically readable collection (child of $mail_recipient).
2

2
The @peek command is a variant of @read that works no differently except that it refrains from setting your `current message'.  This is useful, for example, if you want to see some particular message on a collection without losing track of where you are in it.
38
5
4
10
2
Syntax:  @send <recipient> [<recipient> ...]  [subj[ect]="<subject>"]
2

2
Prepares for you to compose a MOO email message to the recipients named on the command line.  A recipient can be specified by giving a player name or object-id, or a '*' followed by the name or object-id of some non-player mail recipient (e.g., a mailing list or a mail folder) -- a list of such non-player recipients is available from within the mailroom with the 'showlists' command.
2

2
The usual editor is invoked.   
2
You will be prompted for a subject line if you did not specify one in the @send command (see `help mail_options' for how to avoid this).
2
Use `say' (") to insert lines in the body of your message.  
2
See `help editors' for details.
2

2
Giving this command without arguments resumes editing the previous unsent draft message if one exists.
38
5
4
33
2
The MOO email system allows you to send and receive messages to and from other players.  It provides commands to view and manage your own collection of saved messages and, in addition, to browse through other collections that may be available (e.g.,archives of public mailing lists).  Help is available on the following commands:
2

2
@mail     -- seeing a table of contents for a collection of email messages
2
@read     -- reading individual messages 
2
@next     -- reading the 'next'     message
2
@prev     -- reading the 'previous' message
2

2
@send     -- composing and sending a message to other players
2
@answer   -- replying to one of the messages in a collection
2
@forward  -- resending one of the messages in a collection somewhere else
2

2
@rmmail   -- discarding some subset of a collection
2
@unrmmail -- undoing the most recent @rmm on a collection
2
@renumber -- renumbering the messages in a collection
2

2
@mail-option -- describes and sets various customization flags
2

2
help mail-forwarding
2
 -- describes mail forwarding
2
help message-sequences
2
 -- describes message-sequences arguments to @mail, @read, @rmm, and @answer.
2

2
For viewing collections other from your own, the following commands are useful:
2

2
@rn          -- list those collections that have new messages on them
2
@subscribe   -- indicate that you want @rn to report on a given collection
2
                  and add yourself to its .mail_notify list
2
@skip        -- ignore any remaining new messages in a given collection
2
@unsubscribe -- ignore a given collection entirely from now on
2
                  and remove yourself from its .mail_notify list
2
@unsubscribed-- show the mailing lists that you aren't subscribed to.
2
@subscribed  -- like @rn, but shows all lists that you are subscribed to
2
                even if they have no new activity
38
5
4
13
2
Syntax:  @gripe <anything> ...
2

2
Puts you into the MOO mail system to register a complaint (or, conceivably, a compliment) with the wizards.  The rest of the command line (the <anything> ... part) is used as the subject line for the message.  More information on using the MOO mail system is given once you're in it.
2

2
You may hear back from the wizards eventually; see 'help @mail' for how to read their reply.
2

2
Example:
2
Munchkin types:
2
  @gripe The little bird
2
  "How come I can't ever see the little bird in the cuckoo clock?
2
  "        -- A frustrated player
2
  send
2
and, somewhat later, the wizards reply with a note about being sure to look while the clock is chiming.
38
5
4
11
2
The primary means for players to extend the MOO is for them to create new objects with interesting behavior.  There are convenient commands for creating and recycling objects and for keeping track of the objects you've created.  Help is available on these commands in the following topics:
2

2
@dig -- conveniently building new rooms and exits
2
@create -- making other kinds of objects
2
@recycle -- destroying objects you no longer want
2
@quota -- determining how many more objects you can build
2
@count -- determining how many objects you already own
2
@audit -- listing all of your objects
2
@classes -- listing all of the public classes available for your use
2
@realm -- listing the parenting tree for objects owned by one or more players
2
@move -- moving your objects from place to place
38
1
4
16
2
Syntax:  @mail
2
         @mail new            (to see recent messages)
2
         @mail 1-$            (to see *all* messages)
2

2
Shows a table of contents for your MOO email message collection.  You are notified when you connect to the MOO if there are any such messages.  A little arrow indicates the mail system's notion of your 'current message'.  
2
The first form lists all of your messages or the last 15 if you have more than that many; the second form lists only those messages after your `current message'.  The third form shows your entire collection.
2

2
If you have a large number of mail messages, you can give arguments so that @mail only lists the messages you're interested in.  You can also list messages residing on mail recipients which are public or for which you have read access.
2
The general format is
2

2
         @mail <message-sequence> [on *<recipient>]
2

2
<recipient> must name some child of $mail_recipient (e.g., a mailing list);
2
<message-sequence> can be a sequence of message numbers; you can also scan the recipient for articles that fit a given description, as specified in `help message-sequences'.
2

2
Note that if you view mail on some other recipient and have "sticky" in your .mail_options (see `help mail-options'), all further mail commands (e.g., @read, @next, @rmm,...) will apply to that recipient.  In this case use `@mail on me' to go back to looking at your own mail.
38
1
4
4
2
Syntax:  @listgag
2
         @gaglist
2

2
Shows you a list of the players and objects currently on your 'gag list'.  You don't see any messages that result from actions initiated by the players or objects on this list.  In particular, you will not hear them if they try to speak, emote, or whisper to you.  See 'help gagging' for an explanation of gagging in general.
38
1
4
9
2
Syntax:  @ungag <player or object>
2
         @ungag everyone
2

2
Remove the given player or object (or, in the second form, everyone) from your 'gag list'.  You will once again see any messages that result from actions initiated by the ungagged player(s) or objects.  In particular, you will once again be able to hear them if they speak, emote, or whisper to you.  See 'help gagging' for an explanation of gagging in general.
2

2
Example:
2
Munchkin types:
2
  @ungag Grover
2
and is once again able to hear Grover's witty remarks.  Sigh...
38
1
4
12
2
Syntax:  @gag <player or object> [<player or object>...]
2

2
Add the given players to your 'gag list'.  You will no longer see any messages that result from actions initiated by these players.  In particular, you will not hear them if they try to speak, emote, or whisper to you.  See 'help gagging' for an explanation of gagging in general.
2

2
Example:
2
Munchkin types:
2
  @gag Grover
2
and no longer hears anything that Grover says.  What a relief!
2

2
If you specify an object, then any text originating from that object will not be printed.  Example:  Noisy Robot prints "Hi there" every 15 seconds.   In order to avoid seeing that, Munchkin types:
2
  @gag Noisy
2
and no longer hears that robot!  (Munchkin must be in the same room as Noisy Robot for this to work, or know its object number.)
38
1
4
8
2
Syntax: go <direction> ...
2

2
Invokes the named exits in the named order, moving through many rooms in a single command.
2

2
Example:
2
Munchkin types:
2
  go n e e u e e s e
2
and moves quite rapidly from the Living Room all the way to the Bovine Illuminati Atrium, all in one command.
38
1
4
7
2
Syntax: @password <old-password> <new-password>
2

2
Changes your player's password (as typed in the 'connect' command when you log in to the MOO) to <new-password>.  For security reasons, you are required to type your current (soon to be old) password as the first argument.
2

2
Your password is stored in an encrypted form in the MOO database; in principle, not even the wizards can tell what it is, though they can change it, of course.  It is recommended that your password not be your name or a common word; MOO passwords have been stolen or cracked in the past and characters have been made unhappy by such theft.  Your password is your security; choose a safe one.
2

2
Only the first 8 characters of a password are significant.
38
1
4
3
2
Syntax: @sethome
2

2
Sets your designated home (see `help home') to be the room you're in now.  If the current room wouldn't allow you to teleport in, then the `@sethome' command nicely refuses to set your home there.  This avoids later, perhaps unpleasant, surprises.  Additionally, your home must be a room that will allow you to stay there.  Rooms which you own will do this, as will rooms to which you have been added as a resident.  See the @resident command for help on adding someone as a resident to a room you own.
38
1
4
9
2
*subst*
2
Syntax: @who
2
        @who <player> [<player> ... ]
2

2
The first form lists all of the currently-connected players, along with the amount of time they've been connected, the amount of time they've been idle, and their present location in the MOO.
2

2
The second form, in which a list of player names is given, shows information for just those players.  For any listed players that are not connected, we show the last login time instead of the connect/idle times.
2

2
@who refers to the @who_location message (see 'help messages') on each player's location in order to determine what should be printed in the location column.  Pronoun substitutions are done on this string in the usual manner (see 'help pronouns').  The default value is "%[$room.who_location_msg]" (i.e., the room name).
38
1
4
17
2
LambdaMOO is a kind of virtual reality, in which players move about from place to place manipulating their environment in what we hope are amusing, entertaining, or enlightening ways.
2

2
LambdaMOO is more of a pastime than a game in the usual sense; there is no `score' kept, there are no specific goals to attain in general, and there's no competition involved.  LambdaMOO participants explore the virtual world, talk to the other participants, try out the weird gadgets that others have built, and create new places and things for others to encounter and enjoy.
2

2
Most commands have the form of simple English sentences:
2
    <verb>
2
    <verb>  <direct object>
2
    <verb>  <direct object>  <preposition>  <indirect object>
2
Don't use English articles (e.g. 'a', 'an', or 'the') in your commands; the MOO won't understand them.  You can refer to yourself as 'me' and the room you're in as 'here'.
2

2
The first five kinds of commands you'll want to know are listed below.  Type 'help <topic-name>' for details on any of them:
2

2
look -- getting a description of the current room or any other object
2
say -- speaking to the other players in the same room as you
2
@who -- showing which players are currently connected to the MOO
2
movement -- how to move around in the MOO, from room to room
2
@quit -- disconnecting from the MOO
38
1
4
4
2
Syntax:  give <object> to <player>
2
         hand <object> to <player>
2

2
Move an object from your contents to that of another player.  This doesn't change the ownership of the object.  Some players may refuse to accept gifts and some objects may refuse to be given.
38
5
4
3
2
Syntax:  news
2

2
Read the latest edition of the LambdaMOO Times, which carries articles concerning recent changes to the MOO server or to the main public classes, or whatever the wizards feel like writing about.
38
5
4
5
2
Occasionally, you may run into a situation in which you'd rather not hear from certain other players.  It might be that they're being annoying, or just that whatever they're doing makes a lot of noise.  Gagging a player will stop you from hearing the results of any task initiated by that player.  You can also gag a specific object, if you want to hear what the owner of that object says, but not the output from their noisy robot.  The commands to use gagging are listed below; detailed help is available on each of them:
2

2
@gag -- add one or more players to your gag list
2
@ungag -- remove a player from your gag list
2
@listgag -- list the players you currently have gagged
38
5
4
24
2
Syntax:  @dig "<new-room-name>"
2
         @dig <exit-spec> to "<new-room-name>"
2
         @dig <exit-spec> to <old-room-object-number>
2

2
This is the basic building tool.  The first form of the command creates a new room with the given name.  The new room is not connected to anywhere else; it is floating in limbo.  The @dig command tells you its object number, though, so you can use the @move command to get there easily.
2

2
The second form of the command not only creates the room, but one or two exits linking your current location to (and possibly from) the new room.  An <exit-spec> has one of the following two forms:
2
        <names>
2
        <names>|<names>
2
where the first form is used when you only want to create one exit, from your current room to the new room, and the second form when you also want an exit back, from the new room to your current room.  In any case, the <names> piece is just a list of names for the exit, separated by commas; these are the names of the commands players can type to use the exit.  It is usually a good idea to include explicitly the standard abbreviations for direction names (e.g., 'n' for 'north', 'se' for 'southeast', etc.).  DO NOT put spaces in the names of exits; they are useless in MOO.
2

2
The third form of the command is just like the second form except that no new room is created; you instead specify by object number the other room to/from which the new exits will connect.
2

2
NOTE: You must own the room at one end or the other of the exits you create.  If you own both, everything is hunky-dorey.  If you own only one end, then after creating the exits you should write down their object numbers.  You must then get the owner of the other room to use @add-exit and @add-entrance to link your new exits to their room.
2

2
Examples:
2
    @dig "The Conservatory"
2
creates a new room named "The Conservatory" and prints out its object number.
2
    @dig north,n to "The North Pole"
2
creates a new room and also an exit linking the player's current location to the new room; players would say either 'north' or 'n' to get from here to the new room.  No way to get back from that room is created.
2
    @dig west,w|east,e,out to "The Department of Auto-Musicology"
2
creates a new room and two exits, one taking players from here to the new room (via the commands 'west' or 'w') and one taking them from the new room to here (via 'east', 'e', or 'out').
2
    @dig up,u to #7164
2
creates an exit leading from the player's current room to #7164, which must be an existing room.
38
5
4
5
2
Syntax:  @move <thing> to <place>
2

2
Move the specified object to the specified location.  This is not guaranteed to work; in particular, the object must agree to be moved and the destination must agree to allow the object in.  This is usually the case, however.  The special case where <thing> is 'me' is useful for teleporting yourself around.
2

2
If @move doesn't work and you own the room where the object is located, try using @eject instead.
38
5
4
4
2
Syntax:  inventory
2
         i
2

2
Prints a list showing every object you're carrying.
38
5
4
3
2
Syntax:  @entrances
2

2
Prints a list of all recognized entrances to the current room (but only if you own the room).  A recognized entrance is one whose use is not considered to be teleportation.
38
5
4
3
2
Syntax:  @exits
2

2
Prints a list of all conventional exits from the current room (but only if you own the room).  A conventional exit is one that can be used simply by typing its name, like 'east'.
38
5
4
8
2
Syntax: @gender <gender>
2
        @gender
2

2
The first form, with an argument, defines your player to have the gender <gender>.  If <gender> is one of the standard genders (e.g., 'male', 'female', 'neuter',...), your various pronouns will also be set appropriately, making exits and certain other objects behave more pleasantly for you.
2

2
The second form tells you the current definition of your player's gender, your current pronouns, and the complete list of standard genders.
2

2
It should be noted that some of the "genders" on the standard gender list need verb conjugation in order to work properly and much of the MOO isn't set up for this (...yet).  For example, you should expect to see `they is' a fair amount if you @gender yourself `plural'.
38
5
4
3
2
Syntax:  @recycle <object-name-or-number>
2

2
Destroys the indicated object utterly and irretrievably.  Naturally, you may only do this to objects that you own.
38
5
4
21
2
Syntax: @rename <object>        to [name-and-alias],<alias>,...,<alias>
2
        @rename <object>        to [name]:<alias>,...,<alias>
2
        @rename <object>:<verb> to <new-verb-name>
2

2
The first two forms are used to change the name and aliases of an object.  The name is what will be used in most printed descriptions of the object.  The aliases are the names by which players can refer to the object in commands.  Typically you want to include the name in the aliases, as the MOO parser only checks .aliases when matching, so the first syntax is generally preferred.
2

2
If you leave out the "name" part of the list, @rename will leave the object's name as it is, and only change the aliases.
2

2
Note that for renaming players, more stringent rules apply.  See `help player-names'.  Certain other kinds of objects (e.g., mail recipients) also enforce their own rules w.r.t what they can be named.
2

2
Examples:
2
Munchkin names his dog:
2
  @rename #4237 to "Rover the Wonder Dog":Rover,dog
2
Now we'll see 'Rover the Wonder Dog' if we're in the same room as him and we can refer to him as either 'Rover' or just 'dog' in our commands, like 'pet dog'.  Note, however, that it will be impossible to use "Rover the Wonder Dog" to rever to the dog: if you don't include the name in the aliases, confusion can result.  It might have been better to start off with
2
  @rename #4237 to "Rover the Wonder Dog",Rover,dog
2

2
Since he didn't, Munchkin now changes his dog's aliases:
2
  @rename #4237 to ,Rover,dog,Rover the Wonder Dog
2
The name remains the same--we still see 'Rover the Wonder Dog'--but now any of 'Rover', 'dog', or 'Rover the Wonder Dog' can be used to refer to him.  This can help reduce confusion.
2

2
The third form of the @rename command is for use by programmers, to change the name of a verb they own.  If the <new-verb-name> contains spaces, the verb will have multiple names, one for each space-separated word.
38
5
4
15
2
Containers are objects that allow you to store other objects inside them.  The following help topics cover verbs that can be used with containers:
2

2
put -- putting an object into a container
2
remove -- taking an object out of a container
2

2
Containers may be open or closed, using the verbs 'open container' and 'close container'.  Containers have a separate lock to determine if a player may open them.  See the following help topics:
2

2
@lock_for_open -- setting the lock for opening a container
2
@unlock_for_open -- clearing the lock
2

2
You can make a container by creating a child of the standard container, $container (see 'help @create').
2

2
Containers have a large number of messages which get printed when players act upon them.  See 'help container-messages' for more information.
2

2
Containers have opacity.  See 'help @opacity' for more information.
38
1
4
15
2
Notes are objects that can have text written on them to be read later.  They are useful for leaving messages to people, or for documenting your creations.
2

2
The following help topics cover verbs that can be used with notes:
2

2
read -- reading the text on the note
2
write -- adding text to a note
2
erase -- removing all the text from a note
2
delete -- deleting one line of text from a note
2

2
@notedit -- general editing on the text of a note
2

2
encrypt -- restricting who can read a note
2
decrypt -- undoing a previous encryption
2

2
You can make a note by creating a child of the standard note, $note (see 'help @create').  Note that, like most objects, only the owner of a note can recycle it.  If you'd like to make it possible for a reader of your note to destroy it (this is a common desire for notes to other individual players), then you might want to look at 'help letters'.
38
5
4
11
2
Syntax: look
2
        look <object>
2
        look <object> in <container>
2

2
Show a description of something.
2

2
The first form, with no arguments, shows you the name and description of the room you're in, along with a list of the other objects that are there.
2

2
The second form lets you look at a specific object.  Most objects have descriptions that may be read this way.  You can look at your own description using 'look me'.  You can set the description for an object or room, including yourself, with the 'describe' command (see 'help describe').
2

2
The third form shows you the description of an object that is inside some other object, including objects being carried by another player.
38
5
4
4
2
Syntax:  drop <object>
2
         throw <object>
2

2
Remove an object you are carrying from your inventory and put it in your current room.  Occasionally you may find that the owner of the room won't allow you to do this.
38
5
4
2
2
*forward*
2
take
38
5
4
17
2
Objects usually have verbs defined on them that allow players to manipulate and use them in various ways. Standard ones are:
2

2
get  -- pick an object up and place it in your inventory
2
drop -- remove an object from your inventory and place it in the room
2
put  -- take an object from your inventory and place it in a container
2
give -- hand an object to some other player
2
look -- see what an object looks like
2

2
You can see what objects you're carrying with the 'inventory' command; see 'help inventory' for details.
2

2
Some specialized objects will have other commands. The programmer of the object will usually provide some way for you to find out what the commands are.  One way that works for most objects is the 'examine' command; see 'help examine' for details.
2

2
The following specialized objects have help entries you should consult:
2

2
notes -- objects that allow text to be written on them and read later
2
letters -- notes that a recipient can burn after reading
2
containers -- objects that may contain other objects
38
5
4
18
2
Syntax:  help
2
         help <topic>
2
         help index
2

2
Print out entries from the online documentation system.  The commands `?' and `information' (usually abbreviated `info') are synonyms for `help'.
2

2
The first form prints out a summary table of contents for the entire help system.  
2

2
The second form prints out the documentation available on the given topic.  Many help system entries contain references to other entries accessible in this way.  The topic name may be abbreviated; if there is no topic exactly matching the name you give, the help system checks for topics for which the name is a prefix, perhaps with the addition or omission of an initial `@', or perhaps with some confusion beween dashes (-) and underscores (_), e.g., 
2
      `bui' instead of `building', 
2
      `who' instead of `@who', 
2
     `@wri' instead of `write',
2
  `add_ent' instead of `@add-entrance',
2
 `unlock-'  instead of `@unlock_for_open'
2

2
If the abbreviation you give is ambiguous, you will be presented with a list of the matching complete topic names.
2

2
The `help index' commands prints out a list of indices for the various help databases.  Each index gives a list of topics available on that database.  It is sometimes easier to find the topics you're interested in this way, rather than tracing through the chain of cross references.
38
1
4
1
2
Rooms may be made by builders, using the DIG verb. By default, all rooms are instances of _the_ room, $room, or #3, which you can examine to see how it works. If you require a room to have a more specific behaviour, you can make a subclass of room.
38
1
4
5
2
The descriptions of most rooms outline the directions in which exits exist.  Typical directions include the eight compass points ('north', 'south', 'east', 'west', 'northeast', 'southeast', 'northwest', and 'southwest'), 'up', 'down', and 'out'.
2

2
To go in a particular direction, simply type the name of that direction (e.g, 'north', 'up').  The name of the direction can usually be abbreviated to one or two characters (e.g., 'n', 'sw').  You can also type 'go <direction>' to move; this is particularly useful if you know you're going to type several movement commands in a row (see 'help go').
2

2
In addition to such vanilla movement, some areas may contain objects allowing teleportation and almost all areas permit the use of the 'home' command to teleport you to your designated home (see 'help home' for more details).
38
1
4
6
2
*subst*
2
Syntax: home
2

2
Instantly teleports you to your designated home room.
2
Initially, this room is %[tostr($player_start.name," (",$player_start,")")].
2
You can change your designated home; see 'help @sethome' for details.
38
1
4
15
2
There are several commands available to allow you to communicate with your fellow MOOers.  Help is available on the following communication-related topics:
2

2
say      -- talking to the other connected players in the room
2
whisper  -- talking privately to someone in the same room
2
page     -- yelling to someone anywhere in the MOO
2
emote    -- non-verbal communication with others in the same room
2
gagging  -- screening out noise generated by certain other players
2
news     -- reading the wizards' most recent set of general announcements
2
@gripe   -- sending complaints to the wizards
2
@typo @bug @idea @suggest
2
         -- sending complaints/ideas to the owner of the current room
2
whereis  -- locating other players
2
@who     -- finding out who is currently logged in
2
mail     -- the MOO email system
2
security -- the facilities for detecting forged messages and eavesdropping.
38
1
4
12
2
Syntax:  say <anything> ...
2
         "<anything> ...
2

2
Says <anything> out loud, so that everyone in the same room hears it.  This is so commonly used that there's a special abbreviation for it: any command-line beginning with a double-quote ('"') is treated as a 'say' command.
2

2
Example:
2
Munchkin types this:
2
  "This is a great MOO!
2
Munchkin sees this:
2
  You say, "This is a great MOO!"
2
Others in the same room see this:
2
  Munchkin says, "This is a great MOO!"
38
1
4
2
2
whisper "<text>" to <player>
2
sends the message "<yourname> whispers, "<text>" to you " to <player>, if they are in the room.
38
1
4
27
2
*subst*
2
Syntax:  page <player> [[with] <text>]
2

2
Sends a message to a connected player, telling them your location and, optionally, <text>.
2

2
Example:
2
Munchkin types:
2
        page Frebble with "Where are you?"
2
Frebble sees:
2
        You sense that Munchkin is looking for you in the Kitchen.
2
        He pages, "Where are you?"
2
Munchkin sees:
2
        Your message has been received.
2

2
Advanced Features:
2
Page refers to the following messages on the players involved (see 'help messages'):
2

2
@page_origin [%[$player.page_origin_msg]]
2
  Determines how the recipient is told of your location.
2

2
@page_echo   [%[$player.page_echo_msg]]
2
  Determines the response received by anyone who pages you.
2

2
@page_absent [%[$player.page_absent_msg]]
2
  Determines the response received by anyone who tries to page you when you aren't connected.
2

2
All of these undergo the usual pronoun substitutions (see 'help pronouns') except that in both cases the direct object (%d) refers to the recipent of the page and the indirect object (%i) refers to the sender.  You should only change these messages if you want to add to the Virtual Reality feel of the MOO for your character.
38
1
4
18
2
Syntax:  emote <anything> ...
2
         :<anything> ...
2
         ::<anything> ...
2

2
Announces <anything> to everyone in the same room, prepending your name.  This is commonly used to express various non-verbal forms of communication.  In fact, it is so commonly used that there's a special abbreviation for it: any command-line beginning with ':' is treated as an 'emote' command.
2

2
The alternate form, '::' (less commonly 'emote :'), does not insert the space between the player name and the text.
2

2
Examples:
2
Munchkin types this:
2
  :wishes he were much taller...
2
Everyone in the same room sees this:
2
  Munchkin wishes he were much taller...
2

2
Munchkin types this:
2
  ::'s eyes are green.
2
Everyone in the same room sees this:
2
  Munchkin's eyes are green.
38
1
4
6
2
There are a number of commands available to players for building new parts of the MOO.  Help on them is available under the following topics:
2

2
creation -- making, unmaking, and listing your rooms, exits, and other objects
2
topology -- making and listing the connections between rooms and exits
2
descriptions -- setting the names and descriptive texts for new objects
2
locking -- controlling use of and access to your objects
38
1
4
8
2
There are a number of commands for modifying various characteristics of the object representing you in the MOO, your 'player'.  Help on them is available in the following topics:
2

2
@describe -- setting what others see when they look at you
2
@gender -- changing your player's gender
2
@password -- changing your player's password
2
@sethome -- changing your designated home room
2
@rename -- changing your name and/or aliases
2
@linelength -- adding word-wrap to the lines you see
38
1
4
18
2
Help is available on the following general topics:
2

2
introduction -- what's going on here and some basic commands
2
index -- index into the help system
2

2
players -- setting characteristics of yourself
2
movement -- moving yourself between rooms
2
communication -- communicating with other players
2
manipulation -- moving or using other objects
2
miscellaneous -- commands that don't fit anywhere else
2

2
building -- extending the MOO
2
programming -- writing code in the MOO programming language
2
editors -- editing text and code in the MOO
2

2
@pagelength -- what to do if lines scroll off your screen too fast
2
@linelength -- what to do if lines are truncated
2
tinymud -- a list of equivalences between MOO and TinyMUD concepts/commands
38
5
4
21
2
Syntax:  @edit-option
2
         @edit-option <option>
2

2
Synonym:  @editoption
2

2
The edit options customize the behavior of the various editors (mail editor, verb editor, etc...) to your particular taste.  The first form of this command displays all of your edit options.  The second form displays just that one option, one of the flags listed below.
2

2
The remaining forms of this command are for setting your edit options:
2

2
         @edit-option +<flag>
2
         @edit-option -<flag>
2
         @edit-option !<flag>           (equivalent to -<flag>)
2

2
These respectively set and reset the specified flag
2

2
-quiet_insert    insert (") and append (:) echo back the line numbers
2
+quiet_insert    insert (") and append (:) produce no output
2
-eval_subs       (VERB EDITOR) ignore .eval_subs when compiling verbs
2
+eval_subs       (VERB EDITOR) apply .eval_subs to verbs being compiled
2
-local           Use in-MOO text editors.
2
+local           Ship text to client for local editing.
38
5
4
2
2
*forward*
2
@edit-options
38
5
4
4
2
Usage:  @add-feature  <object>
2
 @remove-feature <object>
2

2
Add or remove a feature from your list.  A feature is an object which provides additional commands you can use.  For more information, see `help features'.
38
5
4
2
2
*forward*
2
@add-feature
38
5
4
3
2
Usage:  @features [<name>] [for <player>]
2

2
List all of <player>'s features matching <name>, or all of <player>'s features if <name> is not supplied.  <player> defaults to you.  See `help features' for more information.
38
5
4
3
2
Features are objects that provide you with commands not covered by the ordinary player objects.  The advantage of using features is that you can mix and match the things you like; whereas if you like a command that's defined on a player class, you have to also get all the commands it defines, and all the commands its ancestors define.
2

2
You can list your features with the @features command, and add or remove features from your list with the @add-feature and @remove-feature commands.
38
5
4
7
2
Syntax:  @dump <object> [with [id=#<id>] [noprops] [noverbs] [create]]
2

2
This spills out all the properties and verbs on an object, calling suspend at appropriate intervals.
2
   id=#<id> -- specifies an idnumber to use in place of the object's actual id (for porting to another MOO)
2
   noprops  -- don't show properties.
2
   noverbs  -- don't show verbs.
2
   create   -- indicates that a @create command should be generated and all of the verbs be introduced with @verb rather than @args; the default assumption is that the object already exists and you're just doing this to have a look at it.
2
1
4
1
2
The MOO helps those who help themselves.  Try starting with `help summary'.
38
5
4
7
2
Syntax: @rmalias <alias>[,...,<alias>] from <object>
2
        @rmalias <alias>[,...,<alias>] from <object>:<verb>
2

2
The first form is used to remove aliases from an object.  If the object is a valid player, space and commas will be assumed to be separations between unwanted aliases.  Otherwise, only commas will be assumed to be separations.
2
Note that @rmalias will not affect the object's name, only its aliases.
2

2
The second form is for use by programmers, to remove aliases from a verb they own.  All spaces and commas are assumed to be separations between unwanted aliases.
38
5
4
22
2
Syntax: @addalias <alias>[,...,<alias>] to <object>
2
        @addalias <alias>[,...,<alias>] to <object>:<verb>
2

2
The first form is used to add aliases to an object's list of aliases.  You can separate multiple aliases with commas.  The aliases will be checked against the object's current aliases and all aliases not already in the object's list of aliases will be added.
2

2
Example:
2
Muchkin wants to add new aliases to Rover the Wonder Dog:
2
  @addalias Dog,Wonder Dog to Rover
2
Since Rover the Wonder Dog already has the alias "Dog" but does not have the alias "Wonder Dog", Munchkin sees:
2
  Rover the Wonder Dog(#4237) already has the alias Dog.
2
  Alias Wonder Dog added to Rover the Wonder Dog(#4237).
2

2
If the object is a player, spaces will also be assumed to be separations between aliases and each alias will be checked against the Player Name Database to make sure no one else is using it. Any already used aliases will be identified.
2

2
Example:
2
Munchkin wants to add his nicknames to his own list of aliases:
2
  @addalias Foobar Davey to me
2
@Addalias recognizes that Munchkin is trying to add an alias to a valid player and checks the aliases against the Player Name Database.  Unfortunately, DaveTheMan is already using the alias "Davey" so Munchkin sees:
2
  DaveTheMan(#5432) is already using the alias Davey
2
  Alias Foobar added to Munchkin(#1523).
2

2
The second form of the @addalias command is for use by programmers, to add aliases to a verb they own.  All commas and spaces are assumed to be separations between aliases.
38
5
4
5
2
*forward*
2
summary
2

2
Type 'help <topic>' for information on a particular topic.
2

38
5
4
4
2
Every object (including players, rooms, exits) has a name and a set of aliases. The object name is commonly used to display an object in various contexts. The object aliases are used to refer to an object when players type commands.
2
Help is available on the following commands:
2
@rename -- change the names or aliases of an object or yourself.
2
@addalias, @rmalias -- add and remove aliases.
38
5
4
2
2
*forward*
2
 name
38
5
4
4
2
Syntax:  @set <object>.<prop-name> to <value>
2

2
Changes the value of the specified object's property to the given value.
2
You must have permission to modify the property, either because you own the property or if it is writable.
38
5
4
3
2
*forward*
2
@setprop
2
@set is a valid abbreviation for @setprop.
38
5
4
2
2
*forward*
2
@read
38
5
4
3
2
Syntax: @subscribed
2

2
Like @rn, but shows you ALL mailing lists to which you are subscribed, even those which have new messages.
38
5
4
5
2
Usage:  @request <player-name> for <email-address>
2

2
This command available to Guest characters only.
2

2
The @request command requests a new character, registered for your email address. Please use your primary address for this, as your password will be sent to the address provided.
38
5
4
6
2
*subst*
2
A player name must be a single word, must not contain any spaces, backslashes, or quotes, nor can it begin with the characters #, *, (, or ).  Finally it cannot be one that is in use by any other player nor any of the words on the following list:
2

2
%;;lns={};for l in ($string_utils:columnize({@$player_db.stupid_names,@$player_db.reserved},6)) lns={@lns,"  "+l}; endfor return lns;
2

2
Note that these rules apply as well to your single-word aliases, since those can equally well be used to refer to you in commands that match on player names (@who, whereis, ...).  There are no restrictions on your multi-word aliases, however the commands that expect player names will not recognize them.
38
5
4
6
2
  @registerme as <email-address>
2
This verb changes your registered email_address property. It will modify the registration, and then, to validate the email address, it will assign a new password and mail the password to the given email_address.
2
If, for some reason, this is a problem for you, contact a wizard or registrar to get your email address changed.
2

2
  @registerme
2
Prints your registered email address.
38
5
4
14
2
Syntax:  @netforward <message-number>
2
         @netforward 
2
         @netforward <message-sequence> on *collection
2

2
Forwards the contents of the indiciated messages from your MOO email collection to your registered email address.  You get the message numbers for use here by typing the '@mail' command, which prints a table of contents for your entire MOO email collection.  If no arguments are given to @netforward, then the 'current message' in your collection is sent.  In any case, the 'current message' after @netforward finishes is not affected.
2

2
The most general form of the @netforward command is
2

2
         @netforward <message-sequence> [on *<collection>]
2

2
where <message-sequence> is as described in `help message-sequences'.
2
As with the @mail command you may @netforward messages on any publically readable collection (child of $mail_recipient).
2

2
If you do not have a valid registered email address, you will not be able to use this command and must first @registerme or get a wizard to register your address. `help @registerme' for details.
38
5
4
2
2
*forward*
2
@eject
38
5
4
3
2
Gopher is an internet service for information retrieval. There are many gopher servers across the internet, providing a wide variety of information of all sorts: network news, weather, and White House press releases, campus class information, and scientific papers.
2

2
The programmer interface to Gopher is contained in the object $gopher (`help $gopher').
38
5
5
38
5
5
38
4
4
0
38
5
4
9
2
The object $help is the main help database.  For every help topic there is a corresponding property on $help, interpreted as follows:
2

2
$help.(topic) = string           - one-line help text.
2
$help.(topic) = {"*verb*",@args} - call this:verb(args,{}) to get text
2
$help.(topic) = any other list   - multi-line help text
2

2
There is also a "" property which applies in the case of `help' typed without any arguments.
2

2
See the description of $generic_help for more detail.
38
5
4
2
0
130276
0
750665652
2
1
#62
Recycling Center

16
38
-1
-1
-1
5
-1
74
11
_recreate
2
173
-1
_recycle
2
173
-1
_create
2
165
-1
addhist
2
173
-1
show*-history
2
37
-1
request
2
153
5
setup_toad
2
173
-1
add_orphan
38
173
-1
remove_orphan
38
173
-1
valid
2
173
-1
init_for_core
2
173
-1
4
orphans
announce_removal_msg
nhist
history
16
4
0
38
1
2

38
5
0
50
38
0
4
0
38
0
5
38
5
5
38
5
5
38
5
5
38
5
5
38
5
5
38
5
5
38
5
5
38
5
5
38
4
4
2
2
Recycling Center
2
Center
38
5
2
Object reuse. Call $recycler:_create() to create an object (semantics the same as create()), $recycler:_recycle() to recycle an object. Will create a new object if nothing available in its contents. Note underscores, to avoid builtin :recycle() verb called when objects are recycled. Uses $building_utils:recreate() to prepare objects.
38
5
4
2
0
8518
0
750667114
2
1
#63
Generic Garbage Object

16
2
-1
-1
-1
-1
-1
-1
4
description
2
173
-1
look_self
2
173
-1
title titlec
2
173
-1
tell
2
173
-1
1
aliases
1
4
1
2
garbage
2
1
#64
Mail Options

16
38
-1
-1
-1
67
-1
65
12
actual
38
173
-1
parse_@mail
38
173
-1
parse_sticky parse_manymsgs
38
173
-1
parse_replyto
38
173
-1
show_manymsgs
38
173
-1
show_sticky
38
173
-1
show_@mail
38
173
-1
show_replyto
38
173
-1
show
38
173
-1
check_replyto
38
173
-1
show_netmail
2
173
-1
check_netmail
2
173
-1
8
show_include
show_all
show_nosubject
show_expert
show_enter
type_manymsgs
type_@mail
type_replyto
16
4
2
2
Original message will not be included in replies
2
Original message will be included in replies
38
5
4
2
2
Replies will go to original sender only.
2
Replies will go to original sender and all previous recipients.
38
5
4
2
2
Mail editor will initially require a subject line.
2
Mail editor will not initially require a subject line.
38
5
4
2
2
Novice mail user...
2
Expert mail user...
38
5
4
2
2
Mail editor will not start with an implicit `enter' command.
2
Mail editor will start with an implicit `enter' command.
38
5
4
1
0
0
38
5
4
2
0
2
4
1
0
2
38
5
4
2
0
1
4
1
0
1
38
5
4
10
2
include
2
all
2
nosubject
2
expert
2
enter
2
sticky
2
@mail
2
manymsgs
2
replyto
2
netmail
38
1
2
!include!noinclude!all!sender!nosubject!expert!enter!sticky!@mail!manymsgs!replyto!netmail!
38
1
4
2
2
noinclude
2
sender
38
1
5
38
5
5
38
4
4
1
2
Mail Options
38
5
2
Options for mailing
38
5
4
2
0
5996
0
750669227
2
1
#65
Edit Options

16
38
-1
-1
-1
67
-1
66
0
3
show_quiet_insert
show_eval_subs
show_local
11
4
2
2
Report line numbers on insert or append.
2
No echo on insert or append.
38
5
4
2
2
Ignore .eval_subs when compiling verbs.
2
Use .eval_subs when compiling verbs.
38
5
4
2
2
Use in-MOO text editors.
2
Ship text to client for local editing.
38
5
4
3
2
quiet_insert
2
eval_subs
2
local
38
1
2
!quiet_insert!eval_subs!local!
38
1
5
38
1
0
20
38
5
5
38
4
4
1
2
Edit Options
38
5
5
38
5
4
2
0
741
0
750668540
2
1
#66
Display Options

16
38
-1
-1
-1
67
-1
68
0
3
show_blank_tnt
show_shortprep
show_thisonly
11
4
2
2
Treat `this none this' verbs like the others.
2
Blank out the args on `this none this' verbs.
38
5
4
2
2
Display prepositions in full.
2
Use short forms of prepositions.
38
5
4
2
2
./: will show ancestor properties/verbs if none on this.
2
./: will not show ancestor properties/verbs.
38
5
4
3
2
blank_tnt
2
shortprep
2
thisonly
38
1
2
!blank_tnt!shortprep!thisonly!
38
1
4
0
38
1
5
38
5
5
38
4
4
1
2
Display Options
38
5
5
38
5
4
2
0
801
0
750669753
2
1
#67
Generic Option Package

144
38
-1
-1
-1
1
64
69
12
get
38
173
-1
set
38
173
-1
parse
38
173
-1
_name
38
173
-1
add_name
38
173
-1
remove_name
38
173
-1
show
38
173
-1
actual
38
173
-1
istype
38
173
-1
islistof
38
173
-1
desc_type
38
173
-1
parsechoice
38
173
-1
4
names
_namelist
extras
namewidth
8
4
0
38
1
2
!
38
1
4
0
38
1
0
15
38
5
5
38
4
4
1
2
Generic Option Package
38
5
2
an option package in need of a description.  See `help $generic_option'...
38
5
4
2
0
14525
0
750671739
2
1
#68
List Options

0
38
-1
-1
-1
67
-1
-1
2
actual
38
173
-1
show
38
173
-1
2
show_parentheses
show_nonumbers
10
4
2
2
Parenthesize expressions in listings only as needed.
2
Fully parenthesize expressions in listings.
38
5
4
2
2
Include line numbers.
2
Omit line numbers.
38
5
4
2
2
parentheses
2
nonumbers
38
1
2
!parentheses!nonumbers!numbers!
38
1
4
1
2
numbers
38
1
0
20
38
5
5
38
4
4
1
2
List Options
38
5
5
38
5
4
2
0
1059
0
750751246
2
1
#69
Error Generator

16
2
-1
-1
-1
1
-1
72
18
raise
38
173
-1
E_NONE
38
173
-1
E_TYPE
38
173
-1
E_DIV
38
173
-1
E_PERM
38
173
-1
E_PROPNF
38
173
-1
E_VERBNF
38
173
-1
E_VARNF
38
173
-1
E_INVIND
38
173
-1
E_RECMOVE
38
173
-1
E_MAXREC
38
173
-1
E_RANGE
38
173
-1
E_ARGS
38
173
-1
E_NACC
38
173
-1
E_INVARG
38
173
-1
E_QUOTA
2
173
-1
acceptable
38
173
-1
name
38
173
-1
1
names
5
4
15
2
E_NONE
2
E_TYPE
2
E_DIV
2
E_PERM
2
E_PROPNF
2
E_VERBNF
2
E_VARNF
2
E_INVIND
2
E_RECMOVE
2
E_MAXREC
2
E_RANGE
2
E_ARGS
2
E_NACC
2
E_INVARG
2
E_QUOTA
2
5
5
2
4
4
1
2
Error Generator
2
5
4
3
2
Object to automatically generate errors.
2

2
raise(error) actually raises the error.
2
5
4
2
0
2145
0
750665657
2
1
#70
Site-Locks

0
38
-1
-1
-1
46
-1
-1
1
init_for_core
38
173
-1
0
18
4
0
38
5
0
751048546
38
1
4
0
38
0
0
1
38
5
2
%n (%#) can't send to moderated list %t (%[#t]) directly.
38
5
4
0
38
5
4
0
38
5
4
1
1
2
38
1
4
2
1
2
1
70
38
1
0
2592000
38
5
0
0
38
1
4
0
38
0
5
38
5
5
38
5
5
38
4
4
1
2
Site-Locks
38
1
2
Notes on annoying sites.
38
5
4
2
0
54872
0
750754235
2
1
#71
housekeeper

19
38
-1
-1
-1
59
-1
-1
20
look_self
38
173
-1
cleanup
38
165
-1
replace
38
165
-1
cleanup_list
38
21
-1
add_cleanup
38
93
-2
remove_cleanup
38
29
-1
controls
38
173
-1
continuous
38
165
-1
litterbug
38
173
-1
is_watching
38
173
-1
send_home
38
173
-1
moveit
2
173
-1
ejectit
2
173
-1
is_object_cleaned
38
173
-1
is_litter
38
173
-1
init_for_core
2
173
-1
clean_status
38
173
-1
is_cleaning
38
173
-1
time
38
173
-1
acceptable
2
173
-1
11
recycle_bins
owners
cleaning
litter
eschews
public_places
task
requestors
destination
clean
testing
73
4
0
38
5
4
1
1
2
38
5
1
-1
38
5
4
0
38
5
4
0
38
5
4
0
38
5
0
0
38
5
4
0
38
5
4
0
38
5
4
0
38
1
0
0
38
5
4
0
38
1
5
38
5
5
38
5
2
here=player.location;me=player
38
5
5
38
5
4
0
38
1
4
2
0
743752457
2
golden
2
0
5
38
5
5
2
0
0
745055032
2
1
0
0
38
5
5
38
5
5
38
1
5
38
1
5
38
0
5
38
1
0
276800495
38
5
4
1
1
36830
2
1
0
-80
38
1
1
36830
38
4
5
2
0
5
2
0
5
38
5
4
0
38
4
5
38
5
4
0
38
4
0
0
38
4
2
The housekeeper is too busy putting away all of the junk all over LambdaMoo that there isn't time to listen to pages and stuff like that so your page isn't listened to, too bad.
38
5
2
the housekeeper's
38
5
2
The housekeeper's
38
5
5
38
5
5
38
5
5
38
5
4
2
1
122
1
9082
38
5
5
38
5
4
0
38
5
4
2
0
2
0
0
38
4
5
38
4
0
745054858
2
1
0
21
2
0
5
38
5
2
'Self
38
5
2
The housekeeper's
38
5
2
The housekeeper
38
5
2
The housekeeper
38
5
2
'self
38
5
2
the housekeeper's
38
5
2
the housekeeper
38
5
2
the housekeeper
38
5
1
11
38
5
2
Impossible password to type
2
0
5
38
5
0
0
38
5
5
38
5
5
38
5
5
38
5
0
0
2
1
5
38
4
5
38
4
4
1
2
housekeeper
2
1
2
A very clean, neat, tidy person who doesn't mind lugging players and their gear all over the place.
38
5
4
2
0
24335
0
751015510
2
1
#72
Network Utilities

16
2
-1
-1
-1
1
-1
75
15
parse_address
2
173
-1
local_domain
2
173
-1
open
2
165
-1
close
2
165
-1
sendmail
2
29
-1
trust
2
173
-1
init_for_core
2
173
-1
raw_sendmail
2
21
-1
invalid_email_address
2
173
-1
invalid_hostname
2
173
-1
email_will_fail
2
173
-1
read
2
173
-1
is_open
38
165
-1
incoming_connection
2
173
-1
return_address_for
2
173
-1
16
site
large_domains
open_connections
connect_connections_to
postmaster
port
MOO_name
valid_host_regexp
maildrop
trusts
reply_address
active
valid_email_regexp
invalid_userids
debugging
ignore
20
2
yoursite
2
1
4
0
2
1
4
0
2
1
4
0
2
0
2
postmastername@yourhost
2
5
0
7777
2
5
2
YourMOO
2
5
2
^%([-a-z0-9]+%.%)+%(gov%|edu%|com%|org%|int%|mil%|net%|%nato%|arpa%|[a-z][a-z]%)$
2
5
2
localhost
2
5
4
0
2
1
2
moomailreplyto@yourhost
2
5
0
0
2
5
2
^[-a-z0-9_!.%]+$
2
5
4
7
2

2
sysadmin
2
root
2
postmaster
2
system
2
operator
2
bin
2
5
0
0
2
5
4
0
2
1
0
0
2
4
4
1
2
Network Utilities
2
5
4
74
2
Utilities for dealing with network connections
2
---------------
2
Creating & tracking hosts:
2

2
:open(host, port [, connect-connection-to]) => connection
2
    open a network connection (using open_network_connection).
2
    If 'connect-connection-to' is a player object, the
2
    connection will be connected to that object when it
2
    gets the first line of input.
2

2
:close(connection)
2
     closes the connection & cleans up data
2

2
------------------
2
Parsing network things:
2

2
:invalid_email_address(email)
2
     return "" or string saying why 'email' is invalid.
2
     uses .valid_email_regexp
2

2
:invalid_hostname(host)
2
     return "" or string saying why 'host' doesn't look
2
     like a valid internet host name
2

2
:local_domain(host)
2
     returns the 'important' part of a host name, e.g.
2
     golden.parc.xerox.com => parc.xerox.com
2

2
-------------------
2
Sending mail
2

2
:sendmail(to, subject, @lines)
2
     send mail to the email address 'to' with indicated subject.
2
     header fields like 'from', 'date', etc. are filled in.
2
     lines can start with additional header lines.
2

2
:raw_sendmail(to, @lines)
2
     used by :sendmail. Send mail to given user at host, just
2
     as specified, no error checking.
2

2
================================================================
2
Parameters:
2

2
.active If 0, disabled sending of mail.
2

2
.site   Where does this MOO run?
2
        (Maybe MOOnet will use it later).
2

2
.port   The network port this MOO listens on.
2

2
.large_domains 
2
        A list of sites where more than 2 levels of host name are
2
        significant, e.g., if you want 'parc.xerox.com' to be
2
        different than 'cinops.xerox.com', put "xerox.com" as an
2
        element in .large_domains.
2

2
.postmaster
2
        Email address to which problems with MOO mail should
2
        go. This should be a real email address that someone reads.
2

2
.maildrop
2
        Hostname to connect to for dropping off mail. Usually can
2
        just be "localhost".
2

2
.reply_address
2
        If a MOO character sends email, where does a reply go?
2
        Inserted in 'From:' for mail from characters without
2
        registration addresses.        
2

2
.trusts
2
        List of (non-wizard) programmers who can call
2
        :open, :sendmail, :close
2

2
                
2
5
4
2
0
15287
0
751017525
2
1
#73
Generic BigList Resident

144
38
-1
-1
-1
1
-1
22
6
_make
2
173
-1
_kill
2
173
-1
_get
38
173
-1
_put
38
173
-1
_genprop
38
173
-1
_ord
38
173
-1
3
_genprop
mowner
_mgr
7
2

38
5
1
4292
38
5
1
5533
38
5
5
38
4
4
3
2
biglist
2
resident
2
gblr
38
5
4
1
2
This is the object you want to use as a parent in order to @create a place for your biglists to live.  Suitably sick souls may wish to reimplement :_genprop and :_kill to reclaim unused properties (this :_kill just throws them away and this :_genprop just relentlessly advances....  who cares).  Anyway, you'll need to look at $biglist before this will make sense.
38
5
4
2
0
2160
0
750668560
2
1
#74
Generic Feature Object

144
38
-1
-1
-1
5
-1
76
8
help_msg
38
173
-1
look_self
38
173
-1
using this
38
173
-1
examine_commands_ok
2
173
-1
set_feature_ok
38
165
-1
hidden_verbs
38
173
-1
set_feature_verbs
38
165
-1
initialize
38
165
-1
4
warehouse
help_msg
feature_verbs
feature_ok
16
1
24300
38
1
2
The Generic Feature Object--not to be used as a feature object.
38
5
4
1
2
Using
38
1
0
1
38
1
5
38
5
5
38
5
5
38
5
5
38
5
5
38
5
5
38
5
5
38
5
5
38
5
5
38
4
4
4
2
Generic Feature Object
2
Generic .Features_Huh Object
2
Feature Object
2
.Features_Huh Object
38
5
2
This is the Generic Feature Object.  It is not meant to be used as a feature object itself, but is handy for making new feature objects.
38
5
4
2
0
4356
0
750671636
2
1
#75
Gopher utilities

16
2
-1
-1
-1
1
-1
-1
17
get_now
2
165
-1
parse
2
173
-1
show_text
2
165
-1
type
2
173
-1
summary
2
173
-1
get
2
173
-1
clear_cache
2
173
-1
unparse
2
173
-1
interpret_error
2
173
-1
trusted
2
173
-1
_textp
2
173
-1
_mail_text
2
173
-1
init_for_core
2
173
-1
display_cache
2
45
-1
get_cache
2
173
-1
cache_entry
2
173
-1
help_msg
2
173
-1
5
cache_requests
cache_times
cache_values
limit
cache_timeout
9
4
0
2
1
4
0
2
1
4
0
2
1
0
2000
2
5
0
900
2
1
0
0
2
4
4
1
2
Gopher utilities
2
5
4
30
2
An interface to Gopher internet services.
2
Copyright (c) 1992,1993 Grump,JoeFeedback@LambdaMOO.
2

2
This object contains just the raw verbs for getting data from gopher servers and parsing the results. Look at #50122 (Generic Gopher Slate) for one example of a user interface. 
2

2
:get(site, port, selection)
2
  Get data from gopher server: returns a list of strings, or an error if it couldn't connect. Results are cached.
2

2
:get_now(site, port, selection)
2
  Used by $gopher:get. Arguments are the same: this actually gets the 
2
  data without checking the cache. (Don't call this, since the
2
  caching is important to reduce lag.)
2
  
2
:show_text(who, start, end, site, port, selection)
2
  Requires wiz-perms to call.
2
  like who:notify_lines($gopher:get(..node..)[start..end])
2

2
:clear_cache()
2
  Erase the gopher cache.
2

2
:parse(string)
2
  Takes a directory line as returned by $gopher:get, and return a list
2
  {host, port, selector, label}
2
   host, port, and selector are what you send to :get.
2
  label is a string, where the first character is the type code.
2

2
:type(char)
2
   returns the name of the gopher type indicated by the character, e.g.
2
   $gopher:type("I") => "image"
2

2
5
4
2
0
19537
0
750671906
2
1
#76
NNTP

16
38
-1
-1
-1
5
-1
-1
27
open
38
165
-1
article head body
38
165
-1
check_id
38
165
-1
nntp_read
38
165
-1
init_for_core
38
13
-1
close
38
5
-1
fetch_article fetch_body fetch_head
38
165
-1
@update
38
33
-1
fixup_headers
38
173
-1
get_connection
38
165
-1
release_connection
38
165
-1
post
38
173
-1
posting_ok
38
173
-1
check_cache
38
173
-1
reorder_cache
38
173
-1
insert_cache
38
173
-1
log_error
38
173
-1
flush_cache
38
173
-1
expire_cache
38
173
-1
@expire @expire-task @expire-kill
38
41
-1
expire_task
38
173
-1
fetch_newnews
38
165
-1
newnews
38
165
-1
read_line
2
173
-1
send_line
2
173
-1
fetch_xhdr
38
173
-1
xhdr
38
173
-1
24
host
port
cache_times
cache_values
cache_requests
error_log
debug
last_groups_update
newsgroups
timeformat
connect_max
connections
in_use
posting_allowed
posting_ok
cache_limit
help_msg
line_limit
timeout
distributions
expiry
expire_task
expire_delay
xhdr_enabled
36
2

38
5
0
119
38
5
4
0
38
5
4
0
38
5
4
0
38
5
4
0
38
5
0
0
38
5
0
100000000
38
5
4
0
38
5
2
$y$1$3 $H$M$S
38
5
0
0
38
5
4
0
38
5
4
0
38
5
0
1
38
5
4
2
1
6924
1
122
38
5
0
10
38
5
4
3
2
The MOO NNTP agent fetches and posts USENET news articles.  It is designed to be used primarily as a programmer's tool, especially in situations where it is necessary, from a hypertext document, to refer to a news article.
2
The interface consists primarily of two verbs: #33339:fetch_{article,head,body}, which fetch an article, the header of an article, or the body of an article respectively, and #33339:post which posts an item to a newsgroup (if posting is enabled and the user is either a wizard or trusted to post news.)
2
For help on individual verbs, type "help #33339:fetch_article", or "help #33339:post".
38
5
0
2000
38
5
0
30
38
5
4
0
38
5
0
432000
38
5
0
0
38
5
0
172800
38
5
0
1
38
5
5
38
5
5
38
5
5
38
5
5
38
5
5
38
5
5
38
5
5
38
5
5
38
5
0
0
38
4
4
3
2
NNTP
2
Newsboy
2
Newsie
38
5
2
A lot like Dennis the Menace, with a bag of newspapers slung over one shoulder.
38
5
4
2
0
24905
0
751014194
2
1
#77
Generic Gendered Object

144
2
-1
-1
-1
1
37
35
2
set_gender
2
173
-1
@gen*der
2
105
12
11
gender
pqc
pq
ppc
pp
prc
pr
poc
po
psc
ps
15
2
neuter
2
5
2
its
2
5
2
its
2
5
2
Its
2
5
2
its
2
5
2
Itself
2
5
2
itself
2
5
2
It
2
5
2
it
2
5
2
It
2
5
2
it
2
5
0
0
2
4
4
1
2
Generic Gendered Object
2
5
5
2
5
4
2
0
2160
0
750669757
2
1
#0:0
"...This code should only be run as a server task...";
if (callers())
return E_PERM;
endif
if (typeof(h = $network:incoming_connection(player)) == OBJ)
"connected to an object";
return h;
elseif (h)
"A runaway? What's this for? -- #122 9/29/93";
return 0;
endif
host = $string_utils:connection_hostname(connection_name(player));
if ($login:redlisted(host))
boot_player(player);
server_log(tostr("REDLISTED: ", player, " from ", host));
return 0;
elseif ((length(connected_players()) >= $login.max_connections) && (!(host in $login.unlimited_hosts)))
notify(player, $login.connection_limit_msg);
boot_player(player);
server_log(tostr("CONNECTION LIMIT EXCEEDED: ", player, " from ", host));
return 0;
endif
args = $login:parse_command(@args);
return $login:(args[1])(@listdelete(args, 1));
.
#0:1
callers() || ($last_restart_time = time());
.
#0:2
saved = {#0};
for p in (properties(#0))
v = #0.(p);
if ((typeof(v) == OBJ) && valid(v))
saved = setadd(saved, v);
endif
endfor
for o in (saved)
p = parent(o);
while (valid(p))
saved = setadd(saved, p);
p = parent(p);
endwhile
endfor
return $list_utils:sort(saved);
.
#0:3
if (caller_perms().wizard)
pass();
if ("server_started" in verbs(this))
code = {"callers() || ($last_restart_time = time());"};
set_verb_code(this, "server_started", code);
endif
$shutdown_message = "";
$shutdown_time = 0;
$dump_interval = 3600;
$gripe_recipients = {player};
$class_registry = {{"generics", "Generic objects intended for use as the parents of new objects", {$room, $exit, $thing, $note, $letter, $container, $root_class, $player, $prog, $wiz, $generic_editor, $mail_recipient, $mail_agent}}, {"utilities", "Objects holding useful general-purpose verbs", {$string_utils, $gender_utils, $trig_utils, $time_utils, $match_utils, $object_utils, $lock_utils, $list_utils, $command_utils, $code_utils, $perm_utils, $building_utils}}};
endif
.
#0:4
user = args[1];
fork (0)
user:confunc();
endfork
user.location:confunc(user);
.
#0:5
user = args[1];
fork (0)
user.location:disfunc(user);
endfork
user:disfunc();
.
#1:0
if (typeof(this.owner.owned_objects) == LIST)
this.owner.owned_objects = setadd(this.owner.owned_objects, this);
endif
if ((caller == this) || $perm_utils:controls(caller_perms(), this))
this.object_size = {0, 0};
this.key = 0;
else
return E_PERM;
endif
.
#1:1
if ((caller == this) || $perm_utils:controls(caller_perms(), this))
if (typeof(this.owner.owned_objects) == LIST)
this.owner.owned_objects = setremove(this.owner.owned_objects, this);
endif
else
return E_PERM;
endif
.
#1:2
"set_name(newname) attempts to change this.name to newname";
"  => E_PERM   if you don't own this or aren't its parent, or are a player trying to do an end-run around $player_db...";
if ((!caller_perms().wizard) && (is_player(this) || ((caller_perms() != this.owner) && (this != caller))))
return E_PERM;
else
return (typeof(e = (this.name = args[1])) != ERR) || e;
endif
.
#1:3
return this.name;
.
#1:4
return $object_utils:has_property(this, "namec") ? this.namec | $string_utils:capitalize(this:title());
.
#1:5
"set_aliases(alias_list) attempts to change this.aliases to alias_list";
"  => E_PERM   if you don't own this or aren't its parent";
"  => E_TYPE   if alias_list is not a list";
"  => E_INVARG if any element of alias_list is not a string";
if (!($perm_utils:controls(caller_perms(), this) || (this == caller)))
return E_PERM;
elseif (typeof(aliases = args[1]) != LIST)
return E_TYPE;
else
for s in (aliases)
if (typeof(s) != STR)
return E_INVARG;
endif
endfor
this.aliases = aliases;
return 1;
endif
.
#1:6
c = this:contents();
return $string_utils:match(args[1], c, "name", c, "aliases");
.
#1:7
":match_object(string [,who])";
args[2..1] = {this};
return $string_utils:match_object(@args);
.
#1:8
"set_description(newdesc) attempts to change this.description to newdesc";
"  => E_PERM   if you don't own this or aren't its parent";
if (!($perm_utils:controls(caller_perms(), this) || (this == caller)))
return E_PERM;
elseif (typeof(desc = args[1]) in {LIST, STR})
this.description = desc;
return 1;
else
return E_TYPE;
endif
.
#1:9
return this.description;
.
#1:10
desc = this:description();
if (desc)
player:tell_lines(desc);
else
player:tell("You see nothing special.");
endif
.
#1:11
player:tell("The examine command has been renamed to @examine.  Please use @examine.");
.
#1:12
if (is_player(this))
notify(this, args[1]);
endif
.
#1:13
this:notify(tostr(@args));
.
#1:14
lines = args[1];
if (typeof(lines) == LIST)
for line in (lines)
this:tell(line);
endfor
else
this:tell(lines);
endif
.
#1:15
set_task_perms(caller_perms());
return this:acceptable(@args);
.
#1:16
set_task_perms(this.owner);
return move(this, args[1]);
.
#1:17
"eject(victim) --- usable by the owner of this to remove victim from this.contents.  victim goes to its home if different from here, or $nothing or $player_start according as victim is a player.";
"eject_basic(victim) --- victim goes to $nothing or $player_start according as victim is a player; victim:moveto is not called.";
what = args[1];
nice = (verb != "eject_basic");
perms = caller_perms();
if ((!perms.wizard) && (perms != this.owner))
return E_PERM;
elseif ((!(what in this.contents)) || what.wizard)
return 0;
endif
if (nice && ($object_utils:has_property(what, "home") && ((typeof(what.home) == OBJ) && ((what.home != this) && (is_player(what) ? what.home:accept_for_abode(what) | what.home:acceptable(what))))))
where = what.home;
else
where = (is_player(what) ? $player_start | $nothing);
endif
if (nice)
fork (0)
"...Some objects like to know they've been moved...";
"... this is the best we can do.  Remember :moveto() may be broken.";
what:moveto(where);
endfork
endif
return move(what, where);
.
#1:18
return (this.key == 0) || $lock_utils:eval_key(this.key, args[1]);
.
#1:19
set_task_perms(valid(caller_perms()) ? caller_perms() | player);
$command_utils:do_huh(verb, args);
.
#1:20
":set_message(msg_name,new_value)";
"Does the actual dirty work of @<msg_name> object is <new_value>";
"changing the raw value of the message msg_name to be new_value.";
"Both msg_name and new_value should be strings, though their interpretation is up to the object itself.";
" => error value (use E_PROPNF if msg_name isn't recognized)";
" => string error message if something else goes wrong.";
" => 1 (true non-string) if the message is successfully set";
" => 0 (false non-error) if the message is successfully `cleared'";
if (!((caller == this) || $perm_utils:controls(caller_perms(), this)))
return E_PERM;
else
return (this.(args[1] + "_msg") = args[2]) && 1;
endif
.
#1:21
"do_examine(examiner)";
"the guts of examine";
"call a series of verbs and report their return values to the player";
who = args[1];
"if (caller == this || caller == who)";
if (caller == who)
"set_task_perms();";
who:notify_lines(this:examine_names(who) || {});
"this:examine_names(who);";
who:notify_lines(this:examine_owner(who) || {});
"this:examine_owner(who);";
who:notify_lines(this:examine_desc(who) || {});
"this:examine_desc(who);";
who:notify_lines(this:examine_key(who) || {});
"this:examine_key(who);";
who:notify_lines(this:examine_contents(who) || {});
who:notify_lines(this:examine_verbs(who) || {});
else
return E_PERM;
endif
.
#1:22
"examine_key(examiner)";
"return a list of strings to be told to the player, indicating what the key on this type of object means, and what this object's key is set to.";
"the default will only tell the key to a wizard or this object's owner.";
who = args[1];
if (((caller == this) && $perm_utils:controls(who, this)) && (this.key != 0))
return {tostr("Key:  ", $lock_utils:unparse_key(this.key))};
"who:notify(tostr(\"Key:  \", $lock_utils:unparse_key(this.key)));";
endif
.
#1:23
"examine_names(examiner)";
"Return a list of strings to be told to the player, indicating the name and aliases (and, by default, the object number) of this.";
return {tostr(this.name, " (aka ", $string_utils:english_list({tostr(this), @this.aliases}), ")")};
.
#1:24
"examine_desc(who) - return the description, probably";
"who is the player examining";
"this should probably go away";
desc = this:description();
if (desc)
if (typeof(desc) != LIST)
desc = {desc};
endif
return desc;
else
return {"(No description set.)"};
endif
.
#1:25
"examine_contents(examiner)";
"by default, calls :tell_contents.";
"Should probably go away.";
who = args[1];
"if (caller == this && $object_utils:has_verb(this, \"tell_contents\"))";
if (caller == this)
this:tell_contents(this.contents, this.ctype);
endif
.
#1:26
"Return a list of strings to be told to the player.  Standard format says \"Obvious verbs:\" followed by a series of lines explaining syntax for each usable verb.";
if (caller != this)
return E_PERM;
endif
who = args[1];
name = dobjstr;
vrbs = {};
commands_ok = this:examine_commands_ok(who);
dull_classes = {$root_class, $room, $player, $prog, $builder};
what = this;
hidden_verbs = this:hidden_verbs(who);
while (what != $nothing)
$command_utils:suspend_if_needed(0);
if (!(what in dull_classes))
for i in [0..length(verbs(what)) - 1]
$command_utils:suspend_if_needed(0);
info = verb_info(what, tostr(i));
syntax = verb_args(what, tostr(i));
if (this:examine_verb_ok(what, i, info, syntax, commands_ok, hidden_verbs))
dobj = syntax[1];
prep = syntax[2];
iobj = syntax[3];
if (syntax == {"any", "any", "any"})
prep = "none";
endif
if (prep != "none")
for x in ($string_utils:explode(prep, "/"))
if (length(x) <= length(prep))
prep = x;
endif
endfor
endif
"This is the correct way to handle verbs ending in *";
vname = info[3];
while (i = index(vname, "* "))
vname = tostr(vname[1..i - 1], "<anything>", vname[i + 1..length(vname)]);
endwhile
if (vname[i = length(vname)] == "*")
vname = (vname[1..i - 1] + "<anything>");
endif
vname = strsub(vname, " ", "/");
rest = "";
if (prep != "none")
rest = (" " + ((prep == "any") ? "<anything>" | prep));
if (iobj != "none")
rest = tostr(rest, " ", (iobj == "this") ? name | "<anything>");
endif
endif
if (dobj != "none")
rest = tostr(" ", (dobj == "this") ? name | "<anything>", rest);
endif
vrbs = setadd(vrbs, ("  " + vname) + rest);
endif
endfor
endif
what = parent(what);
endwhile
if ($code_utils:verb_or_property(this, "help_msg"))
vrbs = {@vrbs, tostr("  help ", dobjstr)};
endif
return vrbs && {"Obvious verbs:", @vrbs};
.
#1:27
":get_message(msg_name)";
"Use this to obtain a given user-customizable message's raw value, i.e., the value prior to any pronoun-substitution or incorporation of any variant elements --- the value one needs to supply to :set_message().";
"=> error (use E_PROPNF if msg_name isn't recognized)";
"=> string or list-of-strings raw value";
"=> {2, @(list of {msg_name_n,rawvalue_n} pairs to give to :set_message)}";
"=> {1, other kind of raw value}";
"=> {E_NONE, error message} ";
if (!((caller == this) || $perm_utils:controls(caller_perms(), this)))
return E_PERM;
elseif (((t = typeof(msg = this.(msgname = (args[1] + "_msg")))) in {ERR, STR}) || ((t == LIST) && (typeof(msg[1]) == STR)))
return msg;
else
return {1, msg};
endif
.
#1:28
this.location:(verb)(@args);
.
#1:29
if (caller_perms().wizard)
vnum = 0;
while (vnum <= (length(verbs(this)) - 1))
$command_utils:suspend_if_needed(0);
info = verb_info(this, tostr(vnum))[3];
if (index(info, "(old)"))
delete_verb(this, tostr(vnum));
else
vnum = (vnum + 1);
endif
endwhile
endif
.
#1:30
"Returns a list of the objects that are apparently inside this one.  Don't confuse this with .contents, which is a property kept consistent with .location by the server.  This verb should be used in `VR' situations, for instance when looking in a room, and does not necessarily have anything to do with the value of .contents (although the default implementation does).  `Non-VR' commands (like @contents) should look directly at .contents.";
return this.contents;
.
#1:31
"examine_verb_ok(loc, index, info, syntax, commands_ok, hidden_verbs)";
"loc is the object that defines the verb; index is which verb on the object; info is verb_info; syntax is verb_args; commands_ok is determined by this:commands_ok, probably, but passed in so we don't have to calculate it for each verb.";
"hidden_verbs is passed in for the same reasons.  It should be a list, each of whose entries is either a string with the full verb name to be hidden (e.g., \"d*rop th*row\") or a list of the form {verb location, full verb name, args}.";
if ((caller == this) || $perm_utils:controls(caller_perms(), this))
loc = args[1];
info = args[3];
vname = info[3];
syntax = args[4];
hidden_verbs = args[6];
return (((((syntax[2..3] != {"none", "this"}) && (!index(vname, "("))) && (args[5] || ("this" in syntax))) && verb_code(loc, tostr(args[2]))) && (!(vname in hidden_verbs))) && (!({loc, vname, syntax} in hidden_verbs));
else
return E_PERM;
endif
.
#1:32
"return 1 if the object can hear a :tell, or cares. Useful for active objects that want to stop when nothing is listening.";
return 0;
.
#1:33
"hidden_verbs(who)";
"returns a list of verbs on this that should be hidden from examine";
"the player who's examining is passed in, so objects can hide verbs from specific players";
"verbs are returned as {location, full_verb_name, args} or just full_verb_name.  full_verb name is what shows up in verb_info(object, verb)[2], for example \"d*op th*row\".";
if ((caller == this) || $perm_utils:controls(caller_perms(), this))
hidden = {};
what = this;
while (what != $nothing)
for i in [0..length(verbs(what)) - 1]
info = verb_info(what, tostr(i));
if (!index(info[2], "r"))
hidden = setadd(hidden, {what, info[3], verb_args(what, tostr(i))});
endif
endfor
what = parent(what);
endwhile
return hidden;
else
return E_PERM;
endif
.
#1:34
"examine_owner(examiner)";
"Return a list of strings to be told to the player, indicating who owns this.";
return {tostr("Owned by ", this.owner.name, ".")};
.
#1:35
return;
.
#1:37
return 0;
"intended as a 'quiet' way to determine if :accept will succeed. Currently, some objects have a noisy :accept verb since it is the only thing that a builtin move() call is guaranteed to call.";
"if you want to tell, before trying, whether :accept will fail, use :acceptable instead. Normally, they'll do the same thing.";
.
#3:0
this:look_self(player.brief);
this:announce(player.name, " has connected.");
.
#3:1
fork (300)
if ((((valid(player) && (!(player in connected_players()))) && ((player.last_connect_time + 300) < time())) && (this != player.home)) && (player.location != player.home))
fork (0)
"This is forked so that it's protected from aborts due to errors in the player's :moveto verb.";
if (player.location != player.home)
move(player, $player_start);
endif
endfork
start = player.location;
player:moveto(player.home);
if (player.location != start)
start:announce("The housekeeper arrives to cart ", player.name, " off to bed.");
endif
if (player.location == player.home)
player.home:announce("The housekeeper arrives to drop off ", player.name, ", who is sound asleep.");
endif
endif
endfork
this:announce(player.name, " has disconnected.");
.
#3:2
player:tell("You say, \"", argstr, "\"");
this:announce(player.name, " says, \"", argstr, "\"");
.
#3:3
if ((argstr != "") && (argstr[1] == ":"))
this:announce_all(player.name, argstr[2..length(argstr)]);
else
this:announce_all(player.name, " ", argstr);
endif
.
#3:4
for dude in (setremove(this:contents(), player))
dude:tell(@args);
endfor
.
#3:5
what = args[1];
if (what)
yes = $failed_match;
for e in (this.exits)
if (valid(e) && (what in {e.name, @e.aliases}))
if (yes == $failed_match)
yes = e;
elseif (yes != e)
return $ambiguous_match;
endif
endif
endfor
return yes;
else
return $nothing;
endif
.
#3:6
set_task_perms(caller_perms());
return (this.exits = setadd(this.exits, args[1])) != E_PERM;
.
#3:7
contents = args[1];
ctype = args[2];
if ((!this.dark) && (contents != {}))
if (ctype == 0)
player:tell("Contents:");
for thing in (contents)
player:tell("  ", thing:title());
endfor
elseif (ctype == 1)
for thing in (contents)
if (is_player(thing))
player:tell(thing:title(), " is here.");
else
player:tell("You see ", thing:title(), " here.");
endif
endfor
elseif (ctype == 2)
player:tell("You see ", $string_utils:title_list(contents), " here.");
elseif (ctype == 3)
players = (things = {});
for x in (contents)
if (is_player(x))
players = {@players, x};
else
things = {@things, x};
endif
endfor
if (things)
player:tell("You see ", $string_utils:title_list(things), " here.");
endif
if (players)
player:tell($string_utils:title_listc(players), (length(players) == 1) ? " is" | " are", " here.");
endif
endif
endif
.
#3:8
if (!$perm_utils:controls(valid(caller_perms()) ? caller_perms() | player, this))
player:tell("Sorry, only the owner of a room may list its exits.");
elseif (this.exits == {})
player:tell("This room has no conventional exits.");
else
for exit in (this.exits)
player:tell(exit.name, " (", exit, ") leads to ", valid(exit.dest) ? exit.dest.name | "???", " (", exit.dest, ") via {", $string_utils:from_list(exit.aliases, ", "), "}.");
endfor
endif
.
#3:9
player:tell(this:title());
if (!(args && args[1]))
pass();
endif
this:tell_contents(setremove(this:contents(), player), this.ctype);
.
#3:10
what = args[1];
return this:is_unlocked_for(what) && (((this.free_entry || ((what == this.blessed_object) && (task_id() == this.blessed_task))) || (what.owner == this.owner)) || ((typeof(this.residents) == LIST) && (what in this.residents)));
.
#3:11
set_task_perms(caller_perms());
return (this.entrances = setadd(this.entrances, args[1])) != E_PERM;
.
#3:12
if (caller in this.entrances)
this.blessed_object = args[1];
this.blessed_task = task_id();
endif
.
#3:13
if (!$perm_utils:controls(valid(caller_perms()) ? caller_perms() | player, this))
player:tell("Sorry, only the owner of a room may list its entrances.");
elseif (this.entrances == {})
player:tell("This room has no conventional entrances.");
else
for exit in (this.entrances)
player:tell(exit.name, " (", exit, ") comes from ", valid(exit.source) ? exit.source.name | "???", " (", exit.source, ") via {", $string_utils:from_list(exit.aliases, ", "), "}.");
endfor
endif
.
#3:14
if ((!args) || (!(dir = args[1])))
player:tell("You need to specify a direction.");
return E_INVARG;
elseif (valid(exit = player.location:match_exit(dir)))
exit:invoke();
if (length(args) > 1)
"Now give objects in the room we just passed through a chance to act.";
suspend(0);
player.location:go(@listdelete(args, 1));
endif
elseif (exit == $failed_match)
player:tell("You can't go that way (", dir, ").");
else
player:tell("I don't know which direction `", dir, "' you mean.");
endif
.
#3:15
if ((dobjstr == "") && (!prepstr))
this:look_self();
elseif ((prepstr != "in") && (prepstr != "on"))
if ((!dobjstr) && (prepstr == "at"))
dobjstr = iobjstr;
iobjstr = "";
else
dobjstr = (dobjstr + (prepstr && ((dobjstr && " ") + prepstr)));
dobjstr = (dobjstr + (iobjstr && ((dobjstr && " ") + iobjstr)));
endif
dobj = this:match_object(dobjstr);
if (!$command_utils:object_match_failed(dobj, dobjstr))
dobj:look_self();
endif
elseif (!iobjstr)
player:tell(verb, " ", prepstr, " what?");
else
iobj = this:match_object(iobjstr);
if (!$command_utils:object_match_failed(iobj, iobjstr))
if (dobjstr == "")
iobj:look_self();
elseif ((thing = iobj:match(dobjstr)) == $failed_match)
player:tell("I don't see any \"", dobjstr, "\" ", prepstr, " ", iobj.name, ".");
elseif (thing == $ambiguous_match)
player:tell("There are several things ", prepstr, " ", iobj.name, " one might call \"", dobjstr, "\".");
else
thing:look_self();
endif
endif
endif
.
#3:16
for dude in (this:contents())
dude:tell(@args);
endfor
.
#3:17
text = listdelete(args, 1);
contents = this:contents();
for l in (args[1])
contents = setremove(contents, l);
endfor
for listener in (contents)
listener:tell(@text);
endfor
.
#3:18
object = args[1];
if (is_player(object))
player = object;
this:look_self(player.brief);
endif
if (object == this.blessed_object)
this.blessed_object = #-1;
endif
.
#3:19
return;
.
#3:20
exit = args[1];
if (caller != exit)
set_task_perms(caller_perms());
endif
return (this.exits = setremove(this.exits, exit)) != E_PERM;
.
#3:21
exit = args[1];
if (caller != exit)
set_task_perms(caller_perms());
endif
return (this.entrances = setremove(this.entrances, exit)) != E_PERM;
.
#3:22
set_task_perms(player);
if (!dobjstr)
player:tell("Usage:  @add-exit <exit-number>");
return;
endif
exit = this:match_object(dobjstr);
if ($command_utils:object_match_failed(exit, dobjstr))
return;
endif
if (!($exit in $object_utils:ancestors(exit)))
player:tell("That doesn't look like an exit object to me...");
return;
endif
dest = exit.dest;
source = exit.source;
if (dest == E_PERM)
player:tell("You can't read the exit's destination to check that it's consistent!");
return;
elseif (source == E_PERM)
player:tell("You can't read that exit's source to check that it's consistent!");
return;
elseif (source != this)
player:tell("That exit wasn't made to be attached here; it was made as an exit from ", source.name, " (", source, ").");
return;
elseif (((typeof(dest) != OBJ) || (!valid(dest))) || (!($room in $object_utils:ancestors(dest))))
player:tell("That exit doesn't lead to a room!");
return;
endif
if (!this:add_exit(exit))
player:tell("Sorry, but you must not have permission to add exits to this room.");
else
player:tell("You have added ", exit, " as an exit that goes to ", exit.dest.name, " (", exit.dest, ") via ", $string_utils:english_list(setadd(exit.aliases, exit.name)), ".");
endif
.
#3:23
set_task_perms(player);
if (!dobjstr)
player:tell("Usage:  @add-entrance <exit-number>");
return;
endif
exit = this:match_object(dobjstr);
if ($command_utils:object_match_failed(exit, dobjstr))
return;
endif
if (!($exit in $object_utils:ancestors(exit)))
player:tell("That doesn't look like an exit object to me...");
return;
endif
dest = exit.dest;
if (dest == E_PERM)
player:tell("You can't read the exit's destination to check that it's consistent!");
return;
elseif (dest != this)
player:tell("That exit doesn't lead here!");
return;
endif
if (!this:add_entrance(exit))
player:tell("Sorry, but you must not have permission to add entrances to this room.");
else
player:tell("You have added ", exit, " as an entrance that gets here via ", $string_utils:english_list(setadd(exit.aliases, exit.name)), ".");
endif
.
#3:24
"Make a mild attempt to keep people and objects from ending up in #-1 when people recycle a room";
if ((caller == this) || $perm_utils:controls(caller_perms(), this))
"... first try spilling them out onto the floor of enclosing room if any";
if (valid(this.location))
for x in (this.contents)
x:moveto(this.location);
endfor
endif
"... try sending them home...";
for x in (this.contents)
if (is_player(x))
if ((typeof(x.home) == OBJ) && valid(x.home))
x:moveto(x.home);
endif
if (x.location == this)
move(x, $player_start);
endif
elseif (valid(x.owner))
x:moveto(x.owner);
endif
endfor
pass(@args);
else
return E_PERM;
endif
.
#3:25
exit = this:match_exit(verb);
if (valid(exit))
exit:invoke();
elseif (exit == $failed_match)
player:tell("You can't go that way.");
else
player:tell("I don't know which direction `", verb, "' you mean.");
endif
.
#3:26
set_task_perms(player);
if ($command_utils:object_match_failed(dobj, dobjstr))
return;
elseif (dobj.location != this)
player:tell(dobj.name, "(", dobj, ") is not here.");
return;
elseif (!$perm_utils:controls(player, this))
player:tell("You are not the owner of this room.");
return;
elseif (dobj.wizard)
player:tell("Sorry, you can't ", verb, " a wizard.");
dobj:tell(player.name, " tried to ", verb, " you.");
return;
endif
iobj = this;
player:tell(this:ejection_msg());
this:((verb == "@eject") ? "eject" | "eject_basic")(dobj);
if (verb != "@eject!!")
dobj:tell(this:victim_ejection_msg());
endif
this:announce_all_but({player, dobj}, this:oejection_msg());
.
#3:27
return $string_utils:pronoun_sub(this.(verb));
.
#3:28
who = args[1];
return (valid(who) && ((this.free_home || $perm_utils:controls(who, this)) || ((typeof(residents = this.residents) == LIST) ? who in this.residents | (who == this.residents)))) && this:acceptable(who);
.
#3:29
if (!$perm_utils:controls(player, this))
player:tell("You must own this room to manipulate the legal residents list.  Try contacting ", this.owner.name, ".");
else
if (typeof(this.residents) != LIST)
this.residents = {this.residents};
endif
if (!dobjstr)
"First, remove !valid objects from this room...";
for x in (this.residents)
if (!valid(x))
player:tell("Warning: removing ", x, ", an invalid object, from the residents list.");
this.residents = setremove(this.residents, x);
endif
endfor
player:tell("Allowable residents in this room:  ", $string_utils:english_list($list_utils:map_prop(this.residents, "name"), "no one"), ".");
return;
elseif (dobjstr[1] == "!")
notflag = 1;
dobjstr = dobjstr[2..length(dobjstr)];
else
notflag = 0;
endif
result = $string_utils:match_player_or_object(dobjstr);
if (!result)
return;
else
"a one element list was returned to us if it won.";
result = result[1];
if (notflag)
if (!(result in this.residents))
player:tell(result.name, " doesn't appear to be in the residents list of ", this.name, ".");
else
this.residents = setremove(this.residents, result);
player:tell(result.name, " removed from the residents list of ", this.name, ".");
endif
else
if (result in this.residents)
player:tell(result.name, " is already an allowed resident of ", this.name, ".");
else
this.residents = {@this.residents, result};
player:tell(result.name, " added to the residents list of ", this.name, ".");
endif
endif
endif
endif
.
#3:30
target = {@this:contents(), @this:exits()};
return $string_utils:match(args[1], target, "name", target, "aliases");
.
#3:31
set_task_perms(player);
if (!dobjstr)
player:tell("Usage:  @remove-exit <exit>");
return;
endif
exit = this:match_object(dobjstr);
if (!(exit in this.exits))
if ($command_utils:object_match_failed(exit, dobjstr))
return;
endif
player:tell("Couldn't find \"", dobjstr, "\" in the exits list of ", this.name, ".");
return;
elseif (!this:remove_exit(exit))
player:tell("Sorry, but you do not have permission to remove exits from this room.");
else
name = (valid(exit) ? exit.name | "<recycled>");
player:tell("Exit ", exit, " (", name, ") removed from exit list of ", this.name, " (", this, ").");
endif
.
#3:32
set_task_perms(player);
if (!dobjstr)
player:tell("Usage:  @remove-entrance <entrance>");
return;
endif
entrance = $string_utils:match(dobjstr, this.entrances, "name", this.entrances, "aliases");
if (!valid(entrance))
"Try again to parse it.  Maybe they gave object number.  Don't complain if it's invalid though; maybe it's been recycled in some nefarious way.";
entrance = this:match_object(dobjstr);
endif
if (!(entrance in this.entrances))
player:tell("Couldn't find \"", dobjstr, "\" in the entrances list of ", this.name, ".");
return;
elseif (!this:remove_entrance(entrance))
player:tell("Sorry, but you do not have permission to remove entrances from this room.");
else
name = (valid(entrance) ? entrance.name | "<recycled>");
player:tell("Entrance ", entrance, " (", name, ") removed from entrance list of ", this.name, " (", this, ").");
endif
.
#3:33
if ((caller in {this, this.owner}) || $perm_utils:controls(caller_perms(), this))
return pass(@args);
else
return E_PERM;
endif
.
#3:34
return (msg = this.(verb)) ? $string_utils:pronoun_sub(msg, args[1]) | "";
.
#3:35
if ((caller == this) || $perm_utils:controls(caller_perms(), this))
return this.(verb);
else
return E_PERM;
endif
.
#3:36
exits = {};
for exit in (this.exits)
if (exit.obvious)
exits = setadd(exits, exit);
endif
endfor
return exits;
.
#3:37
":here_huh(verb,args)  -- room-specific :huh processing.  This should return 1 if it finds something interesting to do and 0 otherwise; see $command_utils:do_huh.";
"For the generic room, we check for the case of the caller specifying an exit for which a corresponding verb was never defined.";
set_task_perms(caller_perms());
if (args[2] || ($failed_match == (exit = this:match_exit(verb = args[1]))))
"... okay, it's not an exit.  we give up...";
return 0;
elseif (valid(exit))
exit:invoke();
else
"... ambiguous exit ...";
player:tell("I don't know which direction `", verb, "' you mean.");
endif
return 1;
.
#3:38
this:(verb[6..length(verb)])(@args);
.
#3:39
return this == args[1].location;
.
#3:40
"examine_key(examiner)";
"return a list of strings to be told to the player, indicating what the key on this type of object means, and what this object's key is set to.";
"the default will only tell the key to a wizard or this object's owner.";
who = args[1];
if (((caller == this) && $perm_utils:controls(who, this)) && (this.key != 0))
return {tostr(this:title(), " will accept only objects matching the following key:"), tostr("  ", $lock_utils:unparse_key(this.key))};
endif
.
#3:41
"examine_contents(who)";
if (caller == this)
this:tell_contents(this.contents, this.ctype);
endif
.
#4:0
if ((dobjstr == "") || (dobj == player))
q = player.ownership_quota;
total = ((typeof(player.owned_objects) == LIST) ? length(setremove(player.owned_objects, player)) | 0);
if (q == 0)
player:notify(tostr("You can't create any more objects", (total < 1) ? "." | tostr(" until you recycle some of the ", total, " you already own.")));
else
player:notify(tostr("You can create ", q, " new object", (q == 1) ? "" | "s", (total == 0) ? "." | tostr(" without recycling any of the ", total, " that you already own.")));
endif
else
set_task_perms(player);
dobj = $string_utils:match_player(dobjstr);
if (!valid(dobj))
player:notify("Show whose quota?");
return;
endif
q = dobj.ownership_quota;
if (typeof(q) == ERR)
player:notify(tostr(q));
else
player:notify(tostr(dobj.name, "'s quota is currently ", q, "."));
endif
endif
.
#4:1
set_task_perms(player);
nargs = length(args);
pos = ("named" in args);
if ((pos <= 1) || (pos == nargs))
pos = ("called" in args);
endif
if ((pos <= 1) || (pos == nargs))
player:notify("Usage:  @create <parent-class> named [name:]alias,...,alias");
player:notify("   or:  @create <parent-class> named name-and-alias,alias,...,alias");
player:notify("");
player:notify("where <parent-class> is one of the standard classes ($note, $letter, $thing, or $container) or an object number (e.g., #999), or the name of some object in the current room.");
player:notify("You can use \"called\" instead of \"named\"");
return;
endif
parentstr = $string_utils:from_list(args[1..pos - 1], " ");
namestr = $string_utils:from_list(args[pos + 1..nargs], " ");
if (parentstr[1] == "$")
parent = #0.(parentstr[2..length(parentstr)]);
if (typeof(parent) != OBJ)
player:notify(tostr("\"", parentstr, "\" does not name an object."));
return;
endif
else
parent = player:my_match_object(parentstr);
if ($command_utils:object_match_failed(parent, parentstr))
return;
endif
endif
object = player:_create(parent);
if (typeof(object) == ERR)
player:notify(tostr(object));
return;
endif
move(object, player);
$building_utils:set_names(object, namestr);
if ((other_names = setremove(object.aliases, object.name)) != {})
aka = ((" (aka " + $string_utils:english_list(other_names)) + ")");
else
aka = "";
endif
player:notify(tostr("You now have ", object.name, aka, " with object number ", object, " and parent ", parent.name, " (", parent, ")."));
.
#4:2
set_task_perms(player);
dobj = player:my_match_object(dobjstr);
if (dobj == $nothing)
player:notify(tostr("Usage:  ", verb, " <object>"));
elseif ($command_utils:object_match_failed(dobj, dobjstr))
"...bogus object...";
elseif (player == dobj)
player:notify("You don't *really* want to commit suicide, do you?");
else
name = dobj.name;
result = player:_recycle(dobj);
if (typeof(result) == ERR)
player:notify(tostr(result));
else
player:notify(tostr(name, " (", dobj, ") recycled."));
endif
endif
.
#4:3
"@recreate <object> as <parent-class> named [name:]alias,alias,...";
"  effectively recycles and creates <object> all over again.";
set_task_perms(player);
named = ("named" in args);
as = (prepstr in args);
if ((named <= (as + 1)) || (named == length(args)))
player:notify_lines({tostr("Usage:  ", verb, " <object> as <parent-class> named [name:]alias,...,alias"), "", "where <parent-class> is one of the standard classes ($note, $letter, $thing, or $container) or an object number (e.g., #999), or the name of some object in the current room.  The [name:]alias... specification is as in @create."});
return;
elseif ($command_utils:object_match_failed(dobj = player:my_match_object(dobjstr), dobjstr))
return;
elseif (is_player(dobj))
player:notify("You really *don't* want to do that!");
return;
endif
parentstr = $string_utils:from_list(args[as + 1..named - 1], " ");
namestr = $string_utils:from_list(args[named + 1..length(args)], " ");
if (parentstr[1] == "$")
parent = #0.(parentstr[2..length(parentstr)]);
if (typeof(parent) != OBJ)
player:notify(tostr("\"", parentstr, "\" does not name an object."));
return;
endif
else
parent = player:my_match_object(parentstr);
if ($command_utils:object_match_failed(parent, parentstr))
return;
endif
endif
if (!(e = $building_utils:recreate(dobj, parent)))
player:notify(tostr(e));
return;
endif
move(dobj, player);
$building_utils:set_names(dobj, namestr);
if ((other_names = setremove(dobj.aliases, dobj.name)) != {})
aka = ((" (aka " + $string_utils:english_list(other_names)) + ")");
else
aka = "";
endif
player:notify(tostr("Object number ", dobj, " is now ", dobj.name, aka, " with parent ", parent.name, " (", parent, ")."));
.
#4:4
set_task_perms(player);
nargs = length(args);
if (nargs == 1)
room = args[1];
exit_spec = "";
elseif ((nargs >= 3) && (args[2] == "to"))
exit_spec = args[1];
room = $string_utils:from_list(args[3..nargs], " ");
else
player:notify(tostr("Usage:  ", verb, " <new-room-name>"));
player:notify(tostr("    or  ", verb, " <exit-description> to <new-room-name-or-old-room-object-number>"));
return;
endif
if (room != tostr(other_room = toobj(room)))
other_room = player:_create($room);
if (typeof(other_room) == ERR)
player:notify(tostr(other_room));
return;
endif
other_room.name = room;
other_room.aliases = {room};
move(other_room, $nothing);
player:notify(tostr(other_room.name, " (", other_room, ") created."));
elseif (nargs == 1)
player:notify("You can't dig a room that already exists!");
return;
elseif ((!valid(player.location)) || (!($room in $object_utils:ancestors(player.location))))
player:notify(tostr("You may only use the ", verb, " command from inside a room."));
return;
elseif ((!valid(other_room)) || (!($room in $object_utils:ancestors(other_room))))
player:notify(tostr(other_room, " doesn't look like a room to me..."));
return;
endif
if (exit_spec)
exits = $string_utils:explode(exit_spec, "|");
if ((length(exits) < 1) || (length(exits) > 2))
player:notify("The exit-description must have the form");
player:notify("     [name:]alias,...,alias");
player:notify("or   [name:]alias,...,alias|[name:]alias,...,alias");
return;
endif
to_ok = $building_utils:make_exit(exits[1], player.location, other_room, player.recreate_enabled);
if (to_ok && (length(exits) == 2))
$building_utils:make_exit(exits[2], other_room, player.location, player.recreate_enabled);
endif
endif
.
#4:5
"Usage:  @audit [player] [from <start>] [to <end>] [for <matching string>]";
dobj = $string_utils:match_player(dobjstr);
if (!dobjstr)
dobj = player;
elseif ($command_utils:player_match_result(dobj, dobjstr)[1])
return;
endif
dobjwords = $string_utils:words(dobjstr);
if (args[1..length(dobjwords)] == dobjwords)
args = args[length(dobjwords) + 1..length(args)];
endif
if (!(parse_result = $code_utils:_parse_audit_args(@args)))
player:notify(tostr("Usage:  ", verb, " [player] [from <start>] [to <end>] [for <match>]"));
return;
endif
return $building_utils:do_audit(dobj, @parse_result);
.
#4:6
if (!dobjstr)
dobj = player;
elseif ($command_utils:player_match_result(dobj = $string_utils:match_player(dobjstr), dobjstr)[1])
return;
endif
set_task_perms(player);
if (typeof(dobj.owned_objects) == LIST)
count = length(dobj.owned_objects);
player:notify(tostr(dobj.name, " currently owns ", count, " object", (count == 1) ? "." | "s."));
else
player:notify(tostr(dobj.name, " is not enrolled in the object ownership system.  Use @countDB instead."));
endif
.
#4:7
if (!dobjstr)
dobj = player;
elseif ($command_utils:player_match_result(dobj = $string_utils:match_player(dobjstr), dobjstr)[1])
return;
endif
set_task_perms(player);
count = 0;
for i in [1..tonum(max_object())]
if ($command_utils:running_out_of_time())
player:notify("Counting...");
suspend(5);
endif
o = toobj(i);
if (valid(o) && (o.owner == dobj))
count = (count + 1);
endif
endfor
player:notify(tostr(dobj.name, " currently owns ", count, " object", (count == 1) ? "." | "s."));
.
#4:8
"$player:owned_objects -- sorts a players .owned_objects property in ascending";
"order so it looks nice on @audit.";
if (player != this)
return E_PERM;
endif
if (typeof(player.owned_objects) == LIST)
ret = $list_utils:sort(player.owned_objects);
if (typeof(ret) == LIST)
player.owned_objects = ret;
player:tell("Your .owned_objects list has been sorted.");
return 1;
else
player:tell("Something went wrong. .owned_obejcts not sorted.");
return 0;
endif
else
player:tell("You are not enrolled in .owned_objects scheme, sorry.");
endif
.
#4:9
if (player != this)
player:tell("Permission Denied");
return E_PERM;
endif
if (!valid(dobj))
player:tell("Don't understand `", dobjstr, "' as an object to add.");
elseif (dobj.owner != player)
player:tell("You don't own ", dobj.name, ".");
elseif (dobj in player.owned_objects)
player:tell(dobj.name, " is already recorded in your .owned_objects.");
else
player.owned_objects = setadd(player.owned_objects, dobj);
player:tell("Added ", dobj, " to your .owned_objects.");
endif
.
#4:10
for x in (player.owned_objects)
if ((!valid(x)) || (x.owner != player))
player.owned_objects = setremove(player.owned_objects, x);
if (valid(x))
player:tell("Removing ", x.name, "(", x, "), owned by ", valid(x.owner) ? x.owner.name | "<recycled player>", " from your .owned_objects property.");
else
player:tell("Removing invalid object ", x, " from your .owned_objects property.");
endif
endif
endfor
player:tell(".owned_objects property verified.");
.
#4:11
set_task_perms(player);
dobj = player:my_match_object(dobjstr);
if ($command_utils:object_match_failed(dobj, dobjstr))
return;
endif
res = (dobj.key = 0);
if (typeof(res) == ERR)
player:notify(tostr(res, "."));
else
player:notify(tostr("Unlocked ", dobj.name, "."));
endif
.
#4:12
set_task_perms(player);
dobj = player:my_match_object(dobjstr);
if ($command_utils:object_match_failed(dobj, dobjstr))
return;
endif
key = $lock_utils:parse_keyexp(iobjstr, player);
if (typeof(key) == STR)
player:notify("That key expression is malformed:");
player:notify(tostr("  ", key));
else
res = (dobj.key = key);
if (typeof(res) == ERR)
player:notify(tostr(res, "."));
else
player:notify(tostr("Locked ", dobj.name, " to this key:"));
player:notify(tostr("  ", $lock_utils:unparse_key(key)));
endif
endif
.
#4:13
"Usage:  @message <message-name> [<message>] [on <object>]";
"Add a message property to an object (default is player), and optionally";
"set its value.  For use by non-programmers, who aren't allowed to add";
"properties generally.";
"To undo the effects of this, use @unmessage.";
set_task_perms(player);
dobjwords = $string_utils:words(dobjstr);
if (!dobjwords)
player:notify(tostr("Usage:  ", verb, " <message-name> [<message>] [on <object>]"));
return;
endif
object = (valid(iobj) ? iobj | player);
name = this:_messagify(dobjwords[1]);
value = dobjstr[length(dobjwords[1]) + 2..length(dobjstr)];
nickname = ("@" + name[1..length(name) - 4]);
e = add_property(object, name, value, {player, "rc"});
if (typeof(e) != ERR)
player:notify(tostr(nickname, " on ", object.name, " is now \"", object.(name), "\"."));
elseif (e != E_INVARG)
player:notify(tostr(e));
elseif ($object_utils:has_property(object, name))
"object already has property";
player:notify(tostr(object.name, " already has a ", nickname, " message."));
else
player:notify(tostr("Unable to add ", nickname, " message to ", object.name, ": ", e));
endif
.
#4:14
"Usage:  @unmessage <message-name> [from <object>]";
"Remove a message property from an object (default is player).";
set_task_perms(player);
if ((!dobjstr) || (length($string_utils:words(dobjstr)) > 1))
player:notify(tostr("Usage:  ", verb, " <message-name> [from <object>]"));
return;
endif
object = (valid(iobj) ? iobj | player);
name = this:_messagify(dobjstr);
nickname = ("@" + name[1..length(name) - 4]);
e = delete_property(object, name);
if (e == E_PROPNF)
player:notify(tostr("No ", nickname, " message found on ", object.name, "."));
elseif (typeof(e) == ERR)
player:notify(tostr(e));
else
player:notify(tostr(nickname, " message removed from ", object.name, "."));
endif
.
#4:15
"Given any of several formats people are likely to use for a @message";
"property, return the canonical form (\"foobar_msg\").";
name = args[1];
if (name[1] == "@")
name = name[2..length(name)];
endif
if ((length(name) < 4) || (name[length(name) - 3..length(name)] != "_msg"))
name = (name + "_msg");
endif
return name;
.
#4:16
"'@kids <obj>' - List the children of an object. This is handy for seeing whether anybody's actually using your carefully-wrought public objects.";
thing = player:my_match_object(dobjstr);
if (!$command_utils:object_match_failed(thing, dobjstr))
kids = children(thing);
if (kids)
player:notify(tostr(thing:title(), "(", thing, ") has ", length(kids), " kid", (length(kids) == 1) ? "" | "s", "."));
player:notify(tostr($string_utils:names_of(kids)));
else
player:notify(tostr(thing:title(), "(", thing, ") has no kids."));
endif
endif
.
#4:17
"'@contents <obj> - list the contents of an object, with object numbers. This verb is by yduJ.";
set_task_perms(player);
if (!dobjstr)
dobj = player.location;
else
dobj = player:my_match_object(dobjstr);
endif
if ($command_utils:object_match_failed(dobj, dobjstr))
else
if ($object_utils:has_verb(dobj, "contents"))
contents = dobj:contents();
else
contents = dobj.contents;
endif
if (contents)
player:notify(tostr(dobj:title(), "(", dobj, ") contains:"));
player:notify(tostr($string_utils:names_of(contents)));
else
player:notify(tostr(dobj:title(), "(", dobj, ") contains nothing."));
endif
endif
.
#4:18
"'@parents <thing>' - List <thing> and its ancestors, all the way back to the Root Class (#1).";
set_task_perms(player);
if (!dobjstr)
player:notify(tostr("Usage:  ", verb, " <object>"));
return;
else
o = player:my_match_object(dobjstr);
endif
if (!$command_utils:object_match_failed(o, dobjstr))
player:notify($string_utils:names_of({o, @$object_utils:ancestors(o)}));
endif
.
#4:19
"@locations <thing> - List <thing> and its containers, all the way back to the outermost one.";
set_task_perms(player);
if (!dobjstr)
what = player;
elseif ((!valid(what = player:my_match_object(dobjstr))) && (!valid(what = $string_utils:match_player(dobjstr))))
$command_utils:object_match_failed(dobj, dobjstr);
return;
endif
player:notify($string_utils:names_of({what, @$object_utils:locations(what)}));
.
#4:20
"$class_registry is in the following format:";
"        { {name, description, members}, ... }";
"where `name' is the name of a particular class of objects, `description' is a one-sentence description of the membership of the class, and `members' is a list of object numbers, the members of the class.";
"";
if (args)
members = {};
for name in (args)
class = $list_utils:assoc_prefix(name, $class_registry);
if (class)
for o in (class[3])
members = setadd(members, o);
endfor
else
player:tell("There is no defined class of objects named `", name, "'; type `@classes' to see a complete list of defined classes.");
return;
endif
endfor
printed = {};
for o in (members)
what = o;
while (valid(what))
printed = setadd(printed, what);
what = parent(what);
endwhile
endfor
player:tell("Members of the class", (length(args) > 1) ? "es" | "", " named ", $string_utils:english_list(args), ":");
player:tell();
set_task_perms(player);
this:classes_2($root_class, "", members, printed);
player:tell();
else
"List all class names and descriptions";
player:tell("The following classes of objects have been defined:");
for class in ($class_registry)
name = class[1];
description = class[2];
player:tell();
player:tell("-- ", name, ": ", description);
endfor
player:tell();
player:tell("Type `@classes <name>' to see the members of the class with the given <name>.");
endif
.
#4:21
root = args[1];
indent = args[2];
members = args[3];
printed = args[4];
if (root in members)
player:tell(indent, root.name, " (", root, ")");
else
player:tell(indent, "<", root.name, " (", root, ")>");
endif
indent = (indent + "  ");
set_task_perms(caller_perms());
for c in (children(root))
$command_utils:suspend_if_needed(10);
if (c in printed)
this:classes_2(c, indent, members, printed);
endif
endfor
.
#4:22
set_task_perms(caller_perms());
if (this.recreate_enabled)
return $recycler:(verb)(@args);
else
return create(@args);
endif
.
#4:23
set_task_perms(caller_perms());
if (this.recreate_enabled)
return $recycler:(verb)(@args);
else
return recycle(@args);
endif
.
#4:24
set_task_perms(player);
if ($command_utils:object_match_failed(object = player:my_match_object(dobjstr), dobjstr))
"...bogus object...";
elseif ($command_utils:object_match_failed(parent = player:my_match_object(iobjstr), iobjstr))
"...bogus new parent...";
elseif ((this != player) && (!$object_utils:isa(player, $player)))
"...They chparented to #1 and want to chparent back to $prog.  Probably for some nefarious purpose...";
player:notify("You don't seem to already be a valid player class.  Perhaps chparenting away from the $player hierarchy was not such a good idea.  Permission denied.");
elseif (is_player(object) && (!$object_utils:isa(parent, $player)))
player:notify(tostr(object, " is a player and ", parent, " is not a player class."));
player:notify("You really *don't* want to do this.  Trust me.");
elseif (typeof(result = chparent(object, parent)) != ERR)
player:notify("Parent changed.");
elseif ((result == E_INVARG) && (valid(object) && valid(parent)))
player:notify(tostr("Some property existing on ", parent, " is defined on ", object, " or one of its descendants."));
player:notify(tostr("Try @check-chparent ", dobjstr, " to ", iobjstr));
else
player:notify(tostr(result));
endif
.
#4:25
"Copied from generic programmer (#217):@check-chparent by ur-Rog (#6349) Sun Nov  8 22:13:53 1992 PST";
"@check-chparent object to newparent";
"checks for property name conflicts that would make @chparent bomb.";
set_task_perms(player);
if (!(dobjstr && iobjstr))
player:notify(tostr("Usage:  ", verb, " <object> to <newparent>"));
elseif ($command_utils:object_match_failed(object = player:my_match_object(dobjstr), dobjstr))
"...bogus object...";
elseif ($command_utils:object_match_failed(parent = player:my_match_object(iobjstr), iobjstr))
"...bogus new parent...";
elseif (player != this)
player:notify(tostr(E_PERM));
elseif (typeof(result = $object_utils:property_conflicts(object, parent)) == ERR)
player:notify(tostr(result));
elseif (result)
su = $string_utils;
player:notify("");
player:notify(su:left("Property", 30) + "Also Defined on");
player:notify(su:left("--------", 30) + "---------------");
for r in (result)
player:notify(su:left(tostr(parent, ".", r[1]), 30) + su:from_list(listdelete(r, 1), " "));
$command_utils:suspend_if_needed(0);
endfor
else
player:notify("No property conflicts found.");
endif
.
#4:26
"Syntax:  @set <object>.<prop-name> to <value>";
"";
"Changes the value of the specified object's property to the given value.";
"You must have permission to modify the property, either because you own the property or if it is writable.";
set_task_perms(player);
if (this != player)
return player:tell(E_PERM);
endif
l = $code_utils:parse_propref(dobjstr);
if (l)
dobj = player:my_match_object(l[1], player.location);
if ($command_utils:object_match_failed(dobj, l[1]))
return;
endif
prop = l[2];
to_i = ("to" in args);
at_i = ("at" in args);
i = ((to_i && at_i) ? min(to_i, at_i) | (to_i || at_i));
iobjstr = argstr[$string_utils:word_start(argstr)[i][2] + 1..length(argstr)];
iobjstr = $string_utils:trim(iobjstr);
if (!iobjstr)
val = (dobj.(prop) = "");
iobjstr = "\"\"";
elseif (iobjstr[1] == "\"")
val = (dobj.(prop) = iobjstr);
iobjstr = (("\"" + iobjstr) + "\"");
else
val = $string_utils:to_value(iobjstr);
if (!val[1])
player:tell("Could not parse: ", iobjstr);
return;
endif
val = (dobj.(prop) = val[2]);
endif
player:tell("Property ", dobj, ".", prop, " set to ", $string_utils:print(val), ".");
else
player:tell("Property ", dobjstr, " not found.");
endif
.
#5:0
set_task_perms(callers() ? caller_perms() | player);
if (this.location == player)
player:tell("You already have that!");
elseif (this.location != player.location)
player:tell("I don't see that here.");
else
this:moveto(player);
if (this.location == player)
player:tell(this:take_succeeded_msg() || "Taken.");
if (msg = this:otake_succeeded_msg())
player.location:announce(player.name, " ", msg);
endif
else
player:tell(this:take_failed_msg() || "You can't pick that up.");
if (msg = this:otake_failed_msg())
player.location:announce(player.name, " ", msg);
endif
endif
endif
.
#5:1
set_task_perms(callers() ? caller_perms() | player);
if (this.location != player)
player:tell("You don't have that.");
elseif (!player.location:acceptable(this))
player:tell("You can't drop that here.");
else
this:moveto(player.location);
if (this.location == player.location)
player:tell_lines(this:drop_succeeded_msg() || "Dropped.");
if (msg = this:odrop_succeeded_msg())
player.location:announce(player.name, " ", msg);
endif
else
player:tell_lines(this:drop_failed_msg() || "You can't seem to drop that here.");
if (msg = this:odrop_failed_msg())
player.location:announce(player.name, " ", msg);
endif
endif
endif
.
#5:2
where = args[1];
"if (!valid(where) || this:is_unlocked_for(where))";
if (this:is_unlocked_for(where))
pass(where);
endif
.
#5:3
set_task_perms(caller_perms());
return $string_utils:pronoun_sub(this.(verb));
.
#5:4
set_task_perms(callers() ? caller_perms() | player);
if (this.location != player)
player:tell("You don't have that!");
elseif (!valid(player.location))
player:tell("I see no \"", iobjstr, "\" here.");
elseif ($command_utils:object_match_failed(who = player.location:match_object(iobjstr), iobjstr))
elseif (who.location != player.location)
player:tell("I see no \"", iobjstr, "\" here.");
elseif (who == player)
player:tell("Give it to yourself?");
else
this:moveto(who);
if (this.location == who)
player:tell("You hand ", this:title(), " to ", who:title(), ".");
who:tell(player:titlec(), " ", $gender_utils:get_conj("hands/hand", player), " you ", this:title(), ".");
else
player:tell(who:titlec(), " ", $gender_utils:get_conj("does/do", who), " not want that item.");
endif
endif
.
#5:5
"examine_key(examiner)";
"return a list of strings to be told to the player, indicating what the key on this type of object means, and what this object's key is set to.";
"the default will only tell the key to a wizard or this object's owner.";
who = args[1];
if (((caller == this) && $perm_utils:controls(who, this)) && (this.key != 0))
return {tostr(this:title(), " can only be moved to locations matching this key:"), tostr("  ", $lock_utils:unparse_key(this.key))};
endif
.
#6:0
if (caller_perms().wizard)
pass();
this.home = ((this in {$no_one, $hacker}) ? $nothing | $player_start);
if (a = $list_utils:assoc(this, {{$prog, {$prog_help, $builtin_function_help, $verb_help, $core_help}}, {$wiz, $wiz_help}}))
this.help = a[2];
else
this.help = 0;
endif
if (this != $player)
for p in ({"last_connect_place", "all_connect_places"})
clear_property(this, p);
endfor
endif
endif
.
#6:1
if (valid(caller_perms()) && (caller != this))
return E_PERM;
endif
nm = (this:length_all_msgs() - this:length_date_le(this:get_current_message()[2]));
if (nm)
this:notify(tostr("You have new mail (", nm, " message", (nm == 1) ? "" | "s", ").", this:mail_option("expert") ? "" | "  Type 'help mail' for info on reading it."));
endif
this:mail_catch_up();
this:check_mail_lists();
this:("@last-connection")();
$news:check();
.
#6:2
if (valid(caller_perms()) && (caller != this))
return E_PERM;
endif
this:expunge_rmm();
this.last_disconnect_time = time();
return;
.
#6:3
if ((caller == this) || $perm_utils:controls(caller_perms(), this))
this.help = 0;
return pass(@args);
else
return E_PERM;
endif
.
#6:4
set_task_perms(caller_perms());
if ((!is_player(this)) || caller_perms().wizard)
pass(@args);
return;
endif
"...start off with a wizard shout...";
for p in (connected_players())
if (p.wizard)
p:tell($string_utils:pronoun_sub("%N (%#) is currently trying to recycle %t (%[#t])"));
endif
endfor
"...Okay here's the fun part.";
"...Doing kill_task(task_id()) doesn't work because the server can";
"...figure out that it's okay to go ahead and recycle once the task finishes.";
"...Evidently, suspend() confuses the server sufficiently that it forgets to";
"...do the recycle once the task finishes or dies.  Now of course, we don't";
"...want suspended tasks hanging around indefinitely, so we fork something";
"...off to kill it.  This seems to work...";
t = task_id();
fork (1)
kill_task(t);
endfork
"...let him think he succeeded (should we do this ?)...no.";
"...boot_player(this)";
"...emergency life support...";
suspend(1073741823);
"...code not reached --- the patient lives...";
"...keep this around for posterity...";
if (is_player(this))
for a in (this.aliases)
$player_db:delete(a);
endfor
$player_db:delete(this.name);
endif
pass(@args);
.
#6:5
return !is_player(args[1]);
.
#6:6
"Extra parsing of player commands.  Called by $command_utils:do_huh.";
"This version of my_huh just handles features.";
if ((caller != this) && (!$perm_utils:controls(caller_perms(), this)))
"Standard permissions check.";
return E_PERM;
endif
"verb - obvious                 pass - would be args";
"plist - list of prepspecs that this command matches";
"dlist and ilist - likewise for dobjspecs, iobjspecs";
verb = args[1];
pass = args[2];
plist = {"any", prepstr ? $code_utils:full_prep(prepstr) | "none"};
dlist = (dobjstr ? {"any"} | {"none", "any"});
ilist = (iobjstr ? {"any"} | {"none", "any"});
for fobj in (this.features)
if (!$recycler:valid(fobj))
this:remove_feature(fobj);
elseif (valid(loc = $object_utils:has_callable_verb(fobj, verb)[1]))
vargs = verb_args(loc, verb);
if ((vargs[2] in plist) && ((vargs[1] in dlist) && (vargs[3] in ilist)))
"(got rid of notify_huh - should write a @which command)";
"if (this.notify_huh)";
"player:notify(tostr(\"Using \", what.name, \" (\", what, \")\"));";
"endif";
set_task_perms(this);
fobj:(verb)(@pass);
"Problem with verbs of the same name. If we use which=vrb in the loop instead, we have a problem with verbs that use the variable verb.";
return 1;
endif
endif
if ($command_utils:running_out_of_time())
player:tell("You have too many features.  Parsing your command runs out of ticks while checking ", fobj.name, " (", fobj, ").");
return 1;
endif
endfor
.
#6:7
":last_huh(verb,args)  final attempt to parse a command...";
set_task_perms(caller_perms());
verb = args[1];
args = args[2];
if ((verb[1] == "@") && (prepstr == "is"))
"... set or show _msg property ...";
set_task_perms(player);
$last_huh:(verb)(@args);
elseif (verb in {"give", "hand", "get", "take", "drop", "throw"})
$last_huh:(verb)(@args);
else
return 0;
endif
return 1;
.
#6:8
":my_match_object(string [,location])";
return $string_utils:match_object(@{@args, this.location}[1..2], this);
.
#6:9
c = args[1];
if (c)
longear = {};
gear = {};
width = player:linelen();
half = (width / 2);
player:tell("Carrying:");
for thing in (c)
cx = tostr(" ", thing:title());
if (length(cx) > half)
longear = {@longear, cx};
else
gear = {@gear, cx};
endif
endfor
player:tell_lines($string_utils:columnize(gear, 2, width));
player:tell_lines(longear);
endif
.
#6:10
return $object_utils:has_property(this, "namec") ? this.namec | this:title();
.
#6:11
line = args[1];
if (this.pagelen)
if (!(this in connected_players()))
"...drop it on the floor...";
return 0;
elseif ((caller != this) && (!$perm_utils:controls(caller_perms(), this)))
return E_PERM;
endif
"...need wizard perms if this and this.owner are different, since...";
"...only this can notify() and only this.owner can read .linebuffer...";
if ((player == this) && (this.linetask[2] != task_id()))
"...player has started a new task...";
"....linetask[2] is the taskid of the most recent player task...";
if (this.linetask[2] != this.linetask[1])
this.linesleft = (this.pagelen - 2);
endif
this.linetask[2] = task_id();
endif
"... digest the current line...";
if (this.linelen > 0)
lbuf = {@this.linebuffer, @this:linesplit(line, this.linelen)};
else
lbuf = {@this.linebuffer, line};
endif
"... print out what we can...";
if (this.linesleft)
howmany = min(this.linesleft, length(lbuf));
for l in (lbuf[1..howmany])
notify(this, l);
endfor
this.linesleft = (this.linesleft - howmany);
lbuf[1..howmany] = {};
endif
if (lbuf)
"...see if we need to say ***More***";
if (this.linetask[1] != this.linetask[2])
"....linetask[1] is the taskid of the most recent player task";
"...   for which ***More*** was printed...";
this.linetask[1] = this.linetask[2];
fork (0)
notify(this, strsub(this.more_msg, "%n", tostr(length(this.linebuffer))));
endfork
endif
llen = length(lbuf);
if (llen > 500)
"...way too much saved text, flush some of it...";
lbuf[1..llen - 100] = {"*** buffer overflow, lines flushed ***"};
endif
endif
this.linebuffer = lbuf;
else
if (caller != this)
set_task_perms(caller_perms());
endif
if (this.linelen > 0)
for l in (this:linesplit(line, this.linelen))
notify(this, l);
endfor
else
notify(this, line);
endif
endif
.
#6:12
if ($perm_utils:controls(caller_perms(), this) || (caller == this))
set_task_perms(caller_perms());
for line in ((typeof(lines = args[1]) != LIST) ? {lines} | lines)
this:notify(tostr(line));
endfor
else
return E_PERM;
endif
.
#6:13
":linesplit(line,len) => list of substrings of line";
"used by :notify to split up long lines if .linelen>0";
line = args[1];
len = args[2];
cline = {};
while (length(line) > len)
cutoff = rindex(line[1..len], " ");
if (nospace = (cutoff < ((4 * len) / 5)))
cutoff = (len + 1);
nospace = (line[cutoff] != " ");
endif
cline = {@cline, line[1..cutoff - 1]};
line = ((nospace ? " " | "") + line[cutoff..length(line)]);
endwhile
return {@cline, line};
.
#6:14
return abs(this.linelen);
.
#6:15
if (player != this)
"... somebody's being sneaky...";
"... Can't do set_task_perms(player) since we need to be `this'...";
"... to notify and `this.owner' to change +c properties...";
return;
elseif (!(lbuf = this.linebuffer))
this.linesleft = (this.pagelen - 2);
notify(this, "*** No more ***");
elseif (index("flush", dobjstr || "x") == 1)
this.linesleft = (this.pagelen - 2);
notify(this, tostr("*** Flushed ***  ", length(lbuf), " lines"));
this.linebuffer = {};
elseif ((index("rest", dobjstr || "x") == 1) || (!this.pagelen))
this.linesleft = (this.pagelen - 2);
for l in (lbuf)
notify(this, l);
endfor
this.linebuffer = {};
else
howmany = min(this.pagelen - 2, llen = length(lbuf = this.linebuffer));
for l in (lbuf[1..howmany])
notify(this, l);
endfor
this.linesleft = ((this.pagelen - 2) - howmany);
this.linebuffer = lbuf[howmany + 1..llen];
if (howmany < llen)
notify(this, strsub(this.more_msg, "%n", tostr(llen - howmany)));
this.linetask[1] = task_id();
endif
endif
this.linetask[2] = task_id();
.
#6:16
if (player != this)
"... someone is being sneaky...";
"... Can't do set_task_perms(player) since we need to be `this'...";
"... to notify and `this.owner' to change +c properties...";
return;
endif
linelen = player.linelen;
if (!(prepstr in {"on", "off"}))
player:notify("Usage:  @wrap on|off");
player:notify(tostr("Word wrap is currently ", (linelen > 0) ? "on" | "off", "."));
return;
endif
player.linelen = (abs(linelen) * ((prepstr == "on") ? 1 | -1));
player:notify(tostr("Word wrap is now ", prepstr, "."));
.
#6:17
if (callers() ? (caller != this) && (!$perm_utils:controls(caller_perms(), this)) | (player != this))
"... somebody is being sneaky ...";
return;
endif
curlen = player.linelen;
wrap = (curlen > 0);
wrapstr = (wrap ? "on" | "off");
if (!dobjstr)
player:notify(tostr("Usage:  ", verb, " <number>"));
player:notify(tostr("Current line length is ", abs(curlen), ".  Word wrapping is ", wrapstr, "."));
return;
endif
newlen = tonum(dobjstr);
if (newlen < 0)
player:notify("Line length can't be a negative number.");
return;
elseif (newlen < 10)
player:notify("You don't want your linelength that small.  Setting it to 10.");
newlen = 10;
endif
this:set_linelength(newlen);
player:notify(tostr("Line length is now ", abs(player.linelen), ".  Word wrapping is ", wrapstr, "."));
if (!wrap)
player:notify("To enable word wrapping, type `@wrap on'.");
endif
.
#6:18
"@pagelength number  -- sets page buffering to that many lines (or 0 to turn off page buffering)";
if (player != this)
"... somebody is being sneaky ...";
"... Can't do set_task_perms(player) since we need to be `this'...";
"... to notify and `this.owner' to change +c properties...";
return;
elseif (!dobjstr)
notify(player, tostr("Usage:  ", verb, " <number>"));
notify(player, tostr("Current page length is ", player.pagelen, "."));
return;
elseif (0 > (newlen = tonum(dobjstr)))
notify(player, "Page length can't be a negative number.");
return;
elseif (newlen == 0)
player.pagelen = 0;
notify(player, "Page buffering off.");
elseif (newlen < 5)
player.pagelen = 5;
notify(player, "Too small.  Setting it to 5.");
else
notify(player, tostr("Page length is now ", player.pagelen = newlen, "."));
endif
if (this.linebuffer)
notify(this, strsub(this.more_msg, "%n", tostr(length(this.linebuffer))));
player.linetask = {task_id(), task_id()};
player.linesleft = 0;
else
player.linetask = {0, task_id()};
player.linesleft = (player.pagelen - 2);
endif
.
#6:19
if (this.gaglist || this.paranoid)
"Check the above first, default case, to save ticks.  Paranoid gaggers are cost an extra three or so ticks by this, probably a net savings.";
if (this:gag_p())
return;
endif
if (this.paranoid == 1)
if (((len = length(this.responsible = {@this.responsible, {{@callers(), {player, "<cmd-line>", player}}, args}})) * 2) > (this.lines * 3))
this.responsible = this.responsible[(len - this.lines) + 1..len];
endif
elseif (this.paranoid == 2)
z = this:whodunnit({@callers(), {player, "", player}}, {this, $no_one}, {})[3];
args = {"(", z.name, " ", z, ") ", @args};
else
this.responsible = {};
endif
endif
pass(@args);
.
#6:20
if (player in this.gaglist)
return 1;
elseif (this.gaglist)
for x in (callers())
if (valid(x[1]))
if (x[1] in this.gaglist)
return 1;
endif
endif
endfor
endif
return 0;
.
#6:21
":set_gaglist(@newlist) => this.gaglist = newlist";
if (!((caller == this) || $perm_utils:controls(caller_perms(), this)))
return E_PERM;
else
return this.gaglist = args;
endif
.
#6:22
set_task_perms(player);
if (player != this)
player:notify("Permission denied.");
return;
endif
if (!args)
player:notify(tostr("Usage:  ", verb, " <player or object> [<player or object>...]"));
return;
endif
victims = $string_utils:match_player_or_object(@args);
changed = 0;
for p in (victims)
if (p in player.gaglist)
player:notify(tostr("You are already gagging ", p.name, "."));
elseif (p == player)
player:notify("Gagging yourself is a bad idea.");
else
changed = 1;
player:set_gaglist(@setadd(this.gaglist, p));
endif
endfor
if (changed)
this:("@listgag")("but don't fork");
endif
.
#6:23
set_task_perms(valid(caller_perms()) ? caller_perms() | player);
if (!this.gaglist)
player:notify(tostr("You are ", callers() ? "no longer gagging anything." | "not gagging anything right now."));
else
player:notify(tostr("You are ", callers() ? "now" | "currently", " gagging ", $string_utils:english_list($list_utils:map_arg(2, $string_utils, "pronoun_sub", "%n (%#)", this.gaglist)), "."));
endif
gl = {};
if (!args)
for p in (players())
if ((typeof(p.gaglist) == LIST) && (this in p.gaglist))
gl = {@gl, p};
endif
$command_utils:suspend_if_needed(0);
endfor
if (gl || (!callers()))
player:notify(tostr($string_utils:english_list($list_utils:map_arg(2, $string_utils, "pronoun_sub", "%n (%#)", gl), "No one"), " appear", (length(gl) <= 1) ? "s" | "", " to be gagging you."));
endif
endif
.
#6:24
if ((player != this) || ((caller != this) && (!$perm_utils:controls(caller_perms(), this))))
player:notify("Permission denied.");
elseif (dobjstr == "")
player:notify(tostr("Usage:  ", verb, " <player>  or  ", verb, " everyone"));
elseif (dobjstr == "everyone")
this.gaglist = {};
player:notify("You are no longer gagging anyone or anything.");
else
if (valid(dobj))
match = dobj;
elseif ((match = toobj(dobjstr)) > #0)
else
match = $string_utils:match(dobjstr, this.gaglist, "name", this.gaglist, "aliases");
endif
if (match == $failed_match)
player:notify(tostr("You don't seem to be gagging anything named ", dobjstr, "."));
elseif (match == $ambiguous_match)
player:notify(tostr("I don't know which \"", dobjstr, "\" you mean."));
else
this.gaglist = setremove(this.gaglist, match);
player:notify(tostr(valid(match) ? match.name | match, " removed from gag list."));
endif
this:("@listgag")("but don't fork");
endif
.
#6:25
record = args[1];
trust = args[2];
mistrust = args[3];
s = {this, "???", this};
for w in (record)
if (((s[3].wizard || (s[3] in trust)) && (!(s[3] in mistrust))) || (s[1] == this))
s = w;
else
return s;
endif
endfor
return s;
.
#6:26
if (typeof(this.responsible) != LIST)
this:notify("Hey, someone was mucking about with your .responsible property, and it was probably you.  Don't do it again.");
this.responsible = {};
return;
endif
if (length(verb) <= 6)
"@check, not @check-full";
n = 5;
trust = {this, $no_one};
"... trust no one, my friend.... no one....  --Herod";
mistrust = {};
for k in (args)
if (z = $code_utils:tonum(k))
n = z;
elseif (k[1] == "!")
mistrust = listappend(mistrust, $string_utils:match_player(k[2..length(k)]));
else
trust = listappend(trust, $string_utils:match_player(k));
endif
endfor
msg_width = (player:linelen() - 60);
for q in ((n > (y = length(z = this.responsible))) ? z | z[(y - n) + 1..y])
msg = tostr(@q[2]);
if (length(msg) > msg_width)
msg = msg[1..msg_width];
endif
s = this:whodunnit(q[1], trust, mistrust);
text = (valid(s[1]) ? s[1].name | "** NONE **");
this:notify(tostr($string_utils:left(tostr((length(text) > 13) ? text[1..13] | text, " (", s[1], ")"), 20), $string_utils:left(s[2], 15), $string_utils:left(tostr((length(s[3].name) > 13) ? s[3].name[1..13] | s[3].name, " (", s[3], ")"), 20), msg));
endfor
this:notify("*** finished ***");
this.responsible = z;
else
"@check-full, from @traceback by APHiD";
matches = {};
if (length(match = argstr) == 0)
player:notify(tostr("Usage: ", verb, " <string> --or-- ", verb, " <number>"));
return;
endif
if (!(responsible = player.responsible))
player:notify("No text has been saved by the monitor.  (See `help @paranoid').");
else
if (typeof(x = $code_utils:tonum(argstr)) == ERR)
for line in (responsible)
if (index(tostr(@line[length(line)]), argstr))
matches = {@matches, line};
endif
endfor
else
matches = this.responsible[((l = length(this.responsible)) - x) + 1..l];
endif
if (matches)
linelen = player:linelen();
string_utils = $string_utils;
list_utils = $list_utils;
for match in (matches)
$command_utils:suspend_if_needed(3);
text = tostr(@match[length(match)]);
player:notify("Traceback for:");
player:notify(text);
verbwidth = 0;
for verbitem in (list_utils:slice(mm = listdelete(mm = match[1], length(mm)), 2))
verbwidth = max(verbwidth, length(verbitem));
endfor
numwidth = (((linelen - verbwidth) / 4) - 1);
widths = {numwidth, verbwidth, numwidth, numwidth, numwidth};
top = (l = (between = ""));
for x in [1..5]
top = ((top + between) + string_utils:left({"This", "Verb", "Programmer", "VerbLocation", "Player"}[x], -widths[x]));
l = ((l + between) + string_utils:space(widths[x], "-"));
between = " ";
endfor
player:notify(top);
player:notify(l);
for line in (listdelete(mm = match[1], length(mm)))
output = {};
for bit in [1..5]
output = {@output, string_utils:left((typeof(word = line[bit]) == STR) ? word | tostr(word, "(", valid(word) ? list_utils:shortest({word.name, @word.aliases}) | ((word == $nothing) ? "invalid" | ((word == $ambiguous_match) ? "ambiguous match" | "Error")), ")"), -widths[bit]), " "};
endfor
player:notify(string_utils:trimr(tostr(@output)));
endfor
player:notify(l);
endfor
player:notify("**** finished ****");
else
player:notify(tostr("No matches for \"", argstr, "\" found."));
endif
endif
endif
.
#6:27
if ((args == {}) || ((typ = args[1]) == ""))
this.lines = 20;
this.paranoid = 1;
this:notify("Anti-spoofer on and keeping 20 lines.");
elseif (index("immediate", typ))
this.lines = 0;
this.paranoid = 2;
this:notify("Anti-spoofer now in immediate mode.");
elseif (index("off", typ) || (typ == "0"))
this.paranoid = 0;
this.lines = 0;
this:notify("Anti-spoofer off.");
elseif ((tostr(y = tonum(typ)) != typ) || (y < 0))
this:notify(tostr("Usage: ", verb, " <lines to be kept>     to turn on your anti-spoofer."));
this:notify(tostr("       ", verb, " off                    to turn it off."));
this:notify(tostr("       ", verb, " immediate              to use immediate mode."));
else
this.paranoid = 1;
this.lines = (y = min(y, 30));
this:notify(tostr("Anti-spoofer on and keeping ", y, " lines."));
endif
.
#6:28
buggers = 1;
found_listener = 0;
here = this.location;
for thing in (setremove(here.contents, this))
tellwhere = $object_utils:has_verb(thing, "tell");
notifywhere = $object_utils:has_verb(thing, "notify");
if (thing in connected_players())
this:notify(tostr(thing.name, " (", thing, ") is listening."));
found_listener = 1;
elseif ($object_utils:has_callable_verb(thing, "sweep_msg") && (typeof(msg = thing:sweep_msg()) == STR))
this:notify(tostr(thing.name, " (", thing, ") ", msg, "."));
found_listener = 1;
elseif (tellwhere && (((owner = verb_info(tellwhere[1], "tell")[1]) != this) && (!owner.wizard)))
this:notify(tostr(thing.name, " (", thing, ") has been taught to listen by ", owner.name, " (", owner, ")"));
found_listener = 1;
elseif (notifywhere && (((owner = verb_info(notifywhere[1], "notify")[1]) != this) && (!owner.wizard)))
this:notify(tostr(thing.name, " (", thing, ") has been taught to listen by ", owner.name, " (", owner, ")"));
found_listener = 1;
endif
endfor
buggers = {};
for v in ({"announce", "announce_all", "announce_all_but", "say", "emote", "huh", "here_huh", "huh2", "whisper"})
vwhere = $object_utils:has_verb(here, v);
if (vwhere && (((owner = verb_info(vwhere[1], v)[1]) != this) && (!owner.wizard)))
buggers = setadd(buggers, owner);
endif
endfor
if (buggers != {})
if ($object_utils:has_verb(here, "sweep_msg") && (typeof(msg = here:sweep_msg()) == STR))
this:notify(tostr(here.name, " (", here, ") ", msg, "."));
else
this:notify(tostr(here.name, " (", here, ") may have been bugged by ", $string_utils:english_list($list_utils:map_prop(buggers, "name")), "."));
endif
elseif (!found_listener)
this:notify("Communications look secure.");
endif
.
#6:29
this:tell(player.name, " whispers, \"", dobjstr, "\"");
player:tell("You whisper, \"", dobjstr, "\" to ", this.name, ".");
.
#6:30
nargs = length(args);
if (nargs < 1)
player:notify(tostr("Usage: ", verb, " <player> [with <message>]"));
return;
endif
who = $string_utils:match_player(args[1]);
if ($command_utils:player_match_result(who, args[1])[1])
return;
elseif (who in this.gaglist)
player:tell("You have ", who:title(), " @gagged.  If you paged ", who.po, ", ", who.ps, " wouldn't be able to answer you.");
return;
endif
"for pronoun_sub's benefit...";
dobj = who;
iobj = player;
header = player:page_origin_msg();
text = "";
if (nargs > 1)
if ((args[2] == "with") && (nargs > 2))
msg_start = 3;
else
msg_start = 2;
endif
msg = $string_utils:from_list(args[msg_start..nargs], " ");
text = tostr($string_utils:pronoun_sub(($string_utils:index_delimited(header, player.name) ? "%S" | "%N") + " %<pages>, \""), msg, "\"");
endif
result = (text ? who:receive_page(header, text) | who:receive_page(header));
if (result == 2)
"not connected";
player:tell((typeof(msg = who:page_absent_msg()) == STR) ? msg | $string_utils:pronoun_sub("%n is not currently logged in.", who));
else
player:tell(who:page_echo_msg());
endif
.
#6:31
"called by $player:page.  Two args, the page header and the text, all pre-processed by the page command.  Could be extended to provide haven abilities, multiline pages, etc.  Indeed, at the moment it just does :tell_lines, so we already do have multiline pages, if someone wants to take advantage of it.";
"Return codes:";
"  1:  page was received";
"  2:  player is not connected";
"  0:  page refused";
"If a specialization wants to refuse a page, it should return 0 to say it was refused.  If it uses pass(@args) it should propagate back up the return value.  It is possible that this code should interact with gagging and return 0 if the page was gagged.";
if (this:is_listening())
this:tell_lines(args);
return 1;
else
return 2;
endif
.
#6:32
"set_task_perms(this.owner)";
return (msg = this.(verb)) ? $string_utils:pronoun_sub(this.(verb), this) | "";
.
#6:33
if (c = player:contents())
this:tell_contents(c);
else
player:tell("You are empty-handed.");
endif
.
#6:34
pass();
if (!(this in connected_players()))
player:tell($gender_utils:pronoun_sub("%{:He} %{!is} sleeping.", this));
elseif ((idle = idle_seconds(this)) < 60)
player:tell($gender_utils:pronoun_sub("%{:He} %{!is} awake and %{!looks} alert.", this));
else
time = $string_utils:from_seconds(idle);
player:tell($gender_utils:pronoun_sub("%{:He} %{!is} awake, but %{!has} been staring off into space for ", this), time, ".");
endif
if (c = this:contents())
this:tell_contents(c);
endif
.
#6:35
start = this.location;
if (start == this.home)
player:tell("You're already home!");
return;
elseif (typeof(this.home) != OBJ)
player:tell("You've got a weird home, pal.  I've reset it to the default one.");
this.home = $player_start;
elseif (!valid(this.home))
player:tell("Oh no!  Your home's been recycled.  Time to look around for a new one.");
this.home = $player_start;
else
player:tell("You click your heels three times.");
endif
this:moveto(this.home);
if (!valid(start))
elseif (start == this.location)
start:announce(player.name, " learns that you can never go home...");
else
start:announce(player.name, " goes home.");
endif
if (this.location == this.home)
this.location:announce(player.name, " comes home.");
elseif (this.location == start)
player:tell("Either home doesn't want you, or you don't really want to go.");
else
player:tell("Wait a minute!  This isn't your home...");
if (valid(this.location))
this.location:announce(player.name, " arrives, looking quite bewildered.");
endif
endif
.
#6:36
set_task_perms(this);
here = this.location;
if (!$object_utils:has_callable_verb(here, "accept_for_abode"))
player:notify("This is a pretty odd place.  You should make your home in an actual room.");
elseif (here:accept_for_abode(this))
this.home = here;
player:notify(tostr(here.name, " is your new home."));
else
player:notify(tostr("This place doesn't want to be your home.  Contact ", here.owner.name, " to be added to the residents list of this place, or choose another place as your home."));
endif
.
#6:37
player:tell("This is not a pick-up joint!");
this:tell(player.name, " tried to pick you up.");
.
#6:38
set_task_perms((caller == this) ? this | $no_one);
dobj = this:my_match_object(dobjstr);
iobj = this:my_match_object(iobjstr);
if ($command_utils:object_match_failed(dobj, dobjstr) || ((iobj != $nothing) && $command_utils:object_match_failed(iobj, iobjstr)))
return;
endif
if ((!$perm_utils:controls(this, dobj)) && (this != dobj))
player:tell("You may only @move your own things.");
return;
endif
old_loc = dobj.location;
if (old_loc == iobj)
player:tell(dobj.name, " is already ", valid(iobj) ? "in " + iobj.name | "nowhere", ".");
return;
endif
dobj:moveto(iobj);
if (dobj.location == iobj)
player:tell("Moved.");
if (is_player(dobj))
if (valid(old_loc))
old_loc:announce_all(dobj.name, " disappears suddenly for parts unknown.");
if (dobj != player)
dobj:tell("You have been moved by ", player.name, ".");
endif
endif
if (valid(dobj.location))
dobj.location:announce(dobj.name, " materializes out of thin air.");
endif
endif
elseif (dobj.location == old_loc)
if ($object_utils:contains(dobj, iobj))
player:tell(iobj.name, " is inside of ", dobj.name, "!");
else
player:tell($string_utils:pronoun_sub("Either %d doesn't want to go, or %i doesn't want to accept %[dpo]."));
endif
elseif (dobj == player)
player:tell("You have been deflected from your original destination.");
else
player:tell($string_utils:pronoun_sub("%D has been deflected from %[dpp] original destination."));
endif
.
#6:39
set_task_perms(player);
if (iobjstr == "here")
iobj = player.location;
elseif (iobjstr == "me")
iobj = player;
elseif ($command_utils:object_match_failed(iobj, iobjstr))
return;
endif
if (!$perm_utils:controls(player, iobj))
player:notify(tostr("You are not the owner of ", iobj.name, "."));
return;
endif
if (dobjstr == "me")
dobj = player;
elseif (($failed_match == (dobj = $string_utils:literal_object(dobjstr))) && $command_utils:object_match_failed(dobj = iobj:match(dobjstr), dobjstr))
return;
endif
if (dobj.location != iobj)
player:notify(tostr(dobj.name, "(", dobj, ") is not in ", iobj.name, "(", iobj, ")."));
return;
endif
if (dobj.wizard)
player:notify(tostr("Sorry, you can't ", verb, " a wizard."));
dobj:tell(player.name, " tried to ", verb, " you.");
return;
endif
iobj:((verb == "@eject") ? "eject" | "eject_basic")(dobj);
player:notify($object_utils:has_callable_verb(iobj, "ejection_msg") ? iobj:ejection_msg() | $room:ejection_msg());
if (verb != "@eject!!")
dobj:tell($object_utils:has_callable_verb(iobj, "victim_ejection_msg") ? iobj:victim_ejection_msg() | $room:victim_ejection_msg());
endif
iobj:announce_all_but({player, dobj}, $object_utils:has_callable_verb(iobj, "oejection_msg") ? iobj:oejection_msg() | $room:oejection_msg());
.
#6:40
if (!args)
them = connected_players();
else
who = $command_utils:player_match_result($string_utils:match_player(args), args);
if (length(who) <= 1)
if (!who[1])
player:notify("Where is who?");
endif
return;
elseif (who[1])
player:notify("");
endif
them = listdelete(who, 1);
endif
lmax = (rmax = 0);
for p in (them)
player:notify($string_utils:pronoun_sub("%N (%#) is in %l (%[#l]).", p));
endfor
.
#6:41
if (caller != player)
return E_PERM;
endif
plyrs = (args ? listdelete($command_utils:player_match_result($string_utils:match_player(args), args), 1) | connected_players());
if (!plyrs)
return;
endif
$code_utils:show_who_listing(plyrs);
.
#6:42
"@wizards [all]";
if (caller != player)
return E_PERM;
endif
if (args)
$code_utils:show_who_listing($wiz_utils:all_wizards());
else
$code_utils:show_who_listing($wiz_utils:connected_wizards()) || player:notify("No wizards currently logged in.");
endif
.
#6:43
set_task_perms(callers() ? caller_perms() | player);
"...this code explicitly relies on being !d in several places...";
if ((index(verb, "?") != 1) || (length(verb) <= 1))
what = $string_utils:trimr(argstr);
elseif (argstr)
what = tostr(verb[2..length(verb)], " ", $string_utils:trimr(argstr));
else
what = verb[2..length(verb)];
endif
"...find a db that claims to know about `what'...";
dblist = $code_utils:help_db_list();
result = $code_utils:help_db_search(what, dblist);
if (!result)
"... note: all of the last-resort stuff...";
"... is now located on $help:find_topics/get_topic...";
"$wiz_utils:missed_help(what, result)";
player:notify(tostr("Sorry, but no help is available on `", what, "'."));
elseif (result[1] == $ambiguous_match)
"$wiz_utils:missed_help(what, result)";
player:notify_lines(tostr("Sorry, but the topic-name `", what, "' is ambiguous.  I don't know which of the following topics you mean:"));
for x in ($string_utils:columnize($help:sort_topics(result[2]), 3, 60))
player:notify(tostr("   ", x));
endfor
else
help = result[1];
topic = result[2];
if (topic != what)
player:notify(tostr("Showing help on `", topic, "':"));
player:notify("----");
endif
dblist = dblist[1 + (help in dblist)..length(dblist)];
if (1 == (text = help:get_topic(topic, dblist)))
"...get_topic took matters into its own hands...";
elseif (text)
"...these can get long...";
for line in ((typeof(text) == LIST) ? text | {text})
if (typeof(line) != STR)
player:notify("Odd results from help -- complain to a wizard.");
else
player:notify(line);
endif
$command_utils:suspend_if_needed(0);
endfor
else
player:notify(tostr("Help DB ", help, " thinks it knows about `", what, "' but something's messed up."));
player:notify(tostr("Tell ", help.owner.wizard ? "" | tostr(help.owner.name, " (", help.owner, ") or "), "a wizard."));
endif
endif
.
#6:44
$news:read();
.
#6:45
if (typeof(mf = this.(verb)) == STR)
return $string_utils:pronoun_sub(mf, @args);
else
return mf;
endif
.
#6:46
":receive_message(msg,from)";
if ((!$perm_utils:controls(caller_perms(), this)) && (caller != this))
return E_PERM;
endif
if (this:mail_option("netmail"))
msg = args[1];
message = {"Forwarded: " + msg[4], "Original-date: " + ctime(msg[1]), "Original-From: " + msg[2], "Original-To: " + msg[3], ((("Reply-To: " + args[2].name) + "@") + $network.moo_name) + ".moo.mud.org"};
for x in (msg[5..length(msg)])
message = {@message, @$generic_editor:fill_string(x, this:linelen())};
endfor
if (this:send_self_netmail(message, @listdelete(args, 1)) == 0)
return 0;
endif
endif
set_task_perms(this.owner);
new = this:new_message_num();
ncur = ((new <= 1) ? 0 | min(this:current_message(this), new));
this:set_current_message(this, ncur);
new = max(new, ncur + 1);
this.messages = {@this.messages, {new, args[1]}};
"... new-mail notification is now done directly by $mail_agent:raw_send";
"... see :notify_mail...";
return new;
.
#6:47
":display_message(preamble,msg) --- prints msg to player.";
vb = (((this._mail_task == task_id()) || (caller == $mail_editor)) ? "notify_lines" | "tell_lines");
preamble = args[1];
player:(vb)({@(typeof(preamble) == LIST) ? preamble | {preamble}, @args[2], "--------------------------"});
.
#6:48
"parse_message_seq(strings,cur)         => msg_seq";
"messages_in_seq(msg_seq);              => text of messages in msg_seq";
"display_seq_headers(msg_seq[,current]) :displays summary lines of those msgs";
"rmm_message_seq(msg_seq)               => string giving msg numbers removed";
"undo_rmm()    => msg_seq of restored messages";
"expunge_rmm() => number of messages expunged";
"list_rmm()    => number of messages awaiting expunge";
"renumber(cur) => {number of messages in folder, new_cur}";
"";
"See the corresponding routines on $mail_agent.";
if ((caller == $mail_agent) || $perm_utils:controls(caller_perms(), this))
set_task_perms(this.owner);
return $mail_agent:(verb)(@args);
else
return E_PERM;
endif
.
#6:49
return $mail_agent:msg_summary_line(@args);
.
#6:50
return $mail_agent:to_text(@args);
.
#6:51
":notify_mail(from,recipients[,msgnums])";
" used by $mail_agent:raw_send to notify this player about mail being sent";
" from <from> to <recipients>.  <msgnums> if given gives the message number(s) assigned (in the event that the corresponding recipient actually kept the mail)";
if (!$object_utils:connected(this))
return;
elseif (!((caller in {this, $mail_agent}) || $perm_utils:controls(caller_perms(), this)))
return E_PERM;
else
from = args[1];
recipients = args[2];
msgnums = {@args, {}}[3];
"... msgnums may be shorter than recipients or may have some slots filled";
"... with 0's if msg numbers are not available for some recipients.";
if ((t = (this in recipients)) && ((length(msgnums) >= t) && msgnums[t]))
"... you are getting the mail and moreover your :receive_message kept it.";
namelist = $string_utils:english_list($list_utils:map_arg($mail_agent, "name", setremove(recipients, this)), "");
this:notify(tostr("You have new mail (", msgnums[t], ") from ", from.name, " (", from, ")", namelist ? " which was also sent to " + namelist | "", "."));
if (!this:mail_option("expert"))
this:notify(tostr("Type `help mail' for info on reading it."));
endif
else
"... vanilla notification; somebody got sent mail and you're finding out.";
namelist = $string_utils:english_list({@t ? {"You"} | {}, @$list_utils:map_arg($mail_agent, "name", setremove(recipients, this))}, "");
this:notify(tostr(namelist, (length(recipients) == 1) ? " has" | " have", " just been sent new mail by ", from.name, " (", from, ")."));
endif
endif
.
#6:52
"runs the old->new format conversion on every message in this.messages.";
" => 1 if successful";
" => 0 if anything toward happened during a suspension";
"      (e.g., new message received, someone deleted stuff) ";
"      in which case this.messages is left as if this routine were never run.";
if (!$perm_utils:controls(caller_perms(), this))
return E_PERM;
endif
msgs = {};
i = 1;
for m in (oldmsgs = this.messages)
msgs = {@msgs, {m[1], $mail_agent:__convert_new(@m[2])}};
if ($command_utils:running_out_of_time())
player:notify(tostr("...", i, " ", this));
suspend(0);
if (oldmsgs != this.messages)
return 0;
endif
endif
i = (i + 1);
endfor
this.messages = msgs;
return 1;
.
#6:53
":current_message([recipient])";
" => current message number for the given recipient (defaults to this).";
" => 0 if we have no record of that recipient.";
if ((caller != this) && (!$perm_utils:controls(caller_perms(), this)))
$error:raise(E_PERM);
elseif ((!args) || (args[1] == this))
return this.current_message[1];
elseif (a = $list_utils:assoc(args[1], this.current_message))
return a[2];
else
return 0;
endif
.
#6:54
":get_current_message([recipient])";
" => {msg_num, last_read_date} for the given recipient.";
" => 0 if we have no record of that recipient.";
if ((caller != this) && (!$perm_utils:controls(caller_perms(), this)))
$error:raise(E_PERM);
elseif ((!args) || (args[1] == this))
return this.current_message[1..2];
elseif (a = $list_utils:assoc(args[1], this.current_message))
return a[2..3];
else
return 0;
endif
.
#6:55
":set_current_message(recipient[,number[,date]])";
"Returns the new {number,last-read-date} pair for recipient.";
if ((caller != this) && (!$perm_utils:controls(caller_perms(), this)))
return $error:raise(E_PERM);
endif
recip = args[1];
number = {@args, E_NONE}[2];
date = {@args, 0, 0}[3];
cm = this.current_message;
if (recip == this)
this.current_message[2] = max(date, cm[2]);
if (number != E_NONE)
this.current_message[1] = number;
endif
return this.current_message[1..2];
elseif (i = $list_utils:iassoc(recip, cm))
return (this.current_message[i] = {recip, (number == E_NONE) ? cm[i][2] | number, max(date, cm[i][3])})[2..3];
else
entry = {recip, (number != E_NONE) && number, date};
this.current_message = {@cm, entry};
return entry[2..3];
endif
.
#6:56
":make_current_message(recipient)";
"starts a new current_message record for recipient";
if ((caller != this) && (!$perm_utils:controls(caller_perms(), this)))
return $error:raise(E_PERM);
elseif (((recip = args[1]) != this) && (!$list_utils:assoc(recip, cm = this.current_message)))
this.current_message = listappend(cm, {recip, 0, 0});
endif
.
#6:57
":kill_current_message(recipient)";
"entirely forgets current message for this recipient...";
"Returns true iff successful.";
if ((caller != this) && (!$perm_utils:controls(caller_perms(), this)))
return $error:raise(E_PERM);
else
return ((recip = args[1]) != this) && ((i = $list_utils:iassoc(recip, cm = this.current_message)) && (this.current_message = listdelete(cm, i)));
endif
.
#6:58
":current_folder() => default folder to use, always an object, usually `this'";
set_task_perms(caller_perms());
return ((!this:mail_option("sticky")) || this.current_folder) && this;
.
#6:59
set_task_perms(caller_perms());
return this.current_folder = args[1];
.
#6:60
":parse_folder_spec(verb,args,expected_preposition[,allow_trailing_args_p])";
" => {folder, msg_seq_args, trailing_args}";
set_task_perms(caller_perms());
folder = this:current_folder();
if (!prepstr)
return {folder, args[2], {}};
endif
verb = args[1];
prep = args[3];
extra = {@args, 0}[4];
args = args[2];
p = (prepstr in args);
if (prepstr != prep)
"...unexpected preposition...";
if (extra && (!index(prepstr, " ")))
return {folder, args[1..p - 1], args[p..length(args)]};
else
player:tell("Usage:  ", verb, " [<message numbers>] [", prep, " <folder/list-name>]");
endif
elseif (!((p < length(args)) && (fname = args[p + 1])))
"...preposition but no iobj...";
player:tell(verb, " ", $string_utils:from_list(args, " "), " WHAT?");
elseif ($mail_agent:match_failed(folder = $mail_agent:match_recipient(fname), fname))
"...bogus mail folder...";
else
return {folder, args[1..p - 1], args[p + 2..length(args)]};
endif
return 0;
.
#6:61
":parse_mailread_cmd(verb,args,default,prep[,trailer])";
"  handles anything of the form  `VERB message_seq [PREP folder ...]'";
"    default is the default msg-seq to use if none given";
"    prep is the expected prepstr (assumes prepstr is set), usually `on'";
"    trailer, if present and true, indicates trailing args are permitted.";
"  returns {recipient object, message_seq, current_msg,\"...\"} or 0";
set_task_perms(caller_perms());
if (!(pfs = this:parse_folder_spec(@listdelete(args, 3))))
return 0;
endif
verb = args[1];
default = args[3];
extra = {@args, 0}[5];
folder = pfs[1];
cur = (this:get_current_message(folder) || {0});
if (typeof(pms = folder:parse_message_seq(pfs[2], @cur)) == LIST)
rest = {@listdelete(pms, 1), @pfs[3]};
if ((!extra) && rest)
"...everything should have been gobbled by :parse_message_seq...";
player:tell("I don't understand `", rest[1], "'");
return 0;
elseif (pms[1])
"...we have a nonempty message sequence...";
return {folder, pms[1], cur, rest};
elseif (used = ((length(pfs[2]) + 1) - length(pms)))
"...:parse_message_seq used some words, but didn't get anything out of it";
pms = (("%f %<has> no `" + $string_utils:from_list(pfs[2][1..used], " ")) + "' messages.");
elseif (typeof(pms = folder:parse_message_seq(default, @cur)) == LIST)
"...:parse_message_seq used nothing, try the default; wow it worked";
return {folder, pms[1], cur, rest};
endif
elseif (typeof(pms) == ERR)
player:tell($mail_agent:name(folder), " is not readable by you.");
if (!$object_utils:isa(folder, $mail_recipient))
player:tell("Use * to indicate a non-player mail recipient.");
endif
return 0;
endif
if (folder == this)
subst = {{"%f's", "Your"}, {"%f", "You"}, {"%<has>", "have"}};
elseif (is_player(folder))
subst = {{"%f", folder.name}, {"%<has>", $gender_utils:get_conj("has", folder)}};
else
subst = {{"%f", $mail_agent:name(folder)}, {"%<has>", "has"}};
endif
player:tell($string_utils:substitute(pms, {@subst, {"%%", "%"}}));
return 0;
.
#6:62
"@mail <msg-sequence>                --- as in help @mail";
"@mail <msg-sequence> on <recipient> --- shows mail on mailing list or player.";
set_task_perms(valid(caller_perms()) ? caller_perms() | player);
if (p = this:parse_mailread_cmd("@mail", args, this:mail_option("@mail") || "last:15", "on"))
this:set_current_folder(folder = p[1]);
msg_seq = p[2];
seq_size = $seq_utils:size(msg_seq);
if ((lim = player:mail_option("manymsgs")) && ((lim <= seq_size) && (!$command_utils:yes_or_no(tostr("You are about to see ", seq_size, " message headers.  Continue?")))))
player:notify(tostr("Aborted.  @mailoption manymsgs=", lim));
return;
endif
if (1 != seq_size)
player:notify(tostr(seq_size, " messages", (folder == this) ? "" | (" on " + $mail_agent:name(folder)), ":"));
endif
folder:display_seq_headers(msg_seq, @p[3]);
endif
.
#6:63
"@read <msg>...                  -- as in help @read";
"@read <msg>... on *<recipient>  -- reads messages on recipient.";
"@peek ...                       -- like @read, but don't set current message";
set_task_perms(valid(caller_perms()) ? caller_perms() | player);
if (p = this:parse_mailread_cmd("@read", args, "", "on"))
this:set_current_folder(folder = p[1]);
msg_seq = p[2];
if ((lim = player:mail_option("manymsgs")) && ((lim <= (seq_size = $seq_utils:size(msg_seq))) && (!$command_utils:yes_or_no(tostr("You are about to see ", seq_size, " messages.  Continue?")))))
player:notify(tostr("Aborted.  @mailoption manymsgs=", lim));
return;
endif
this._mail_task = task_id();
if (cur = folder:display_seq_full(msg_seq, tostr("Message %d", (folder == this) ? "" | (" on " + $mail_agent:name(folder)), ":")))
if (verb != "@peek")
this:set_current_message(folder, @cur);
endif
endif
endif
.
#6:64
set_task_perms(player);
if (dobjstr)
player:notify(tostr("Usage:  ", verb, " [on <recipient>]"));
else
this:("@read")(verb[2..5], @args);
endif
.
#6:65
"@rmm <message-sequence> [from <recipient>].   Use @unrmm if you screw up.";
" Beware, though.  @unrmm can only undo the most recent @rmm.";
set_task_perms(player);
if (!(p = this:parse_mailread_cmd("@rmm", args, "cur", "from")))
"...parse failed, we've already complained...";
elseif ((!prepstr) && ((p[1] != this) && (!$command_utils:yes_or_no(("@rmmail from " + $mail_agent:name(p[1])) + ".  Continue?"))))
"...wasn't the folder player was expecting...";
player:notify("@rmmail aborted.");
else
this:set_current_folder(folder = p[1]);
e = folder:rm_message_seq(p[2]);
if (typeof(e) == ERR)
player:notify(tostr(e));
else
count = (((n = $seq_utils:size(p[2])) == 1) ? "." | tostr(" (", n, " messages)."));
fname = ((folder == this) ? "" | (" from " + $mail_agent:name(folder)));
player:notify(tostr("Deleted ", e, fname, count));
endif
endif
.
#6:66
set_task_perms(player);
if (!dobjstr)
folder = this:current_folder();
elseif ($mail_agent:match_failed(folder = $mail_agent:match_recipient(dobjstr), dobjstr))
return;
endif
cur = this:current_message(folder);
fname = $mail_agent:name(folder);
if (typeof(h = folder:renumber(cur)) == ERR)
player:notify(tostr(h));
else
if (!h[1])
player:notify(tostr("No messages on ", fname, "."));
else
player:notify(tostr("Messages on ", fname, " renumbered 1-", h[1], "."));
this:set_current_folder(folder);
if (h[2] && this:set_current_message(folder, h[2]))
player:notify(tostr("Current message is now ", h[2], "."));
endif
endif
endif
.
#6:67
"@unrmm [on <recipient>]  -- undoes the previous @rmm on that recipient.";
set_task_perms(player);
if (!(p = this:parse_folder_spec("@unrmm", args, "on")))
return;
endif
dobjstr = $string_utils:from_list(p[2], " ");
if (!dobjstr)
do = "undo_rmm";
elseif (index("expunge", dobjstr) == 1)
do = "expunge_rmm";
elseif (index("list", dobjstr) == 1)
do = "list_rmm";
else
player:notify(tostr("Usage:  ", verb, " [expunge|list] [on <recipient>]"));
return;
endif
this:set_current_folder(folder = p[1]);
if (msg_seq = folder:(do)())
if (do == "undo_rmm")
player:notify(tostr($seq_utils:size(msg_seq), " messages restored to ", $mail_agent:name(folder), "."));
folder:display_seq_headers(msg_seq, 0);
else
player:notify(tostr(msg_seq, " zombie message", (msg_seq == 1) ? " " | "s ", (do == "expunge_rmm") ? "expunged from " | "on ", $mail_agent:name(folder), "."));
endif
elseif (typeof(msg_seq) == ERR)
player:notify(tostr(msg_seq));
else
player:notify(tostr("No messages to ", (do == "expunge_rmm") ? "expunge from " | "restore to ", $mail_agent:name(folder)));
endif
.
#6:68
if (args && (args[1] == "to"))
args = listdelete(args, 1);
endif
subject = {};
for a in (args)
if (((i = index(a, "=")) > 3) && (index("subject", a[1..i - 1]) == 1))
args = setremove(args, a);
a[1..i] = "";
subject = {a};
endif
endfor
$mail_editor:invoke(args, verb, @subject);
.
#6:69
"@answer <msg> [on *<recipient>] [<flags>...]";
set_task_perms(who = (valid(caller_perms()) ? caller_perms() | player));
if (p = this:parse_mailread_cmd(verb, args, "", "on", 1))
if ($seq_utils:size(p[2]) != 1)
player:notify("You can only answer *one* message at a time.");
elseif (LIST != typeof(flags_replytos = $mail_editor:check_answer_flags(@p[4])))
player:notify_lines({tostr("Usage:  ", verb, " [message-# [on <recipient>]] [flags...]"), "where flags include any of:", "  all        reply to everyone", "  sender     reply to sender only", "  include    include the original message in your reply", "  noinclude  don't include the original in your reply"});
else
this:set_current_folder(p[1]);
$mail_editor:invoke(2, verb, p[1]:messages_in_seq(p[2])[1][2], @flags_replytos);
endif
endif
.
#6:70
"@forward <msg> [on *<recipient>] to <recipient> [<recipient>...]";
set_task_perms(valid(caller_perms()) ? caller_perms() | player);
if (!(p = this:parse_mailread_cmd(verb, args, "", "on", 1)))
"...lose...";
return;
elseif ($seq_utils:size(sequence = p[2]) != 1)
player:notify("You can only forward *one* message at a time.");
return;
elseif ((length(p[4]) < 2) || (p[4][1] != "to"))
player:notify(tostr("Usage:  ", verb, " [<message>] [on <folder>] to <recip>..."));
return;
endif
recips = {};
for rs in (listdelete(p[4], 1))
if ($mail_agent:match_failed(r = $mail_agent:match_recipient(rs), rs))
return;
endif
recips = {@recips, r};
endfor
this:set_current_folder(folder = p[1]);
m = folder:messages_in_seq(sequence)[1];
msgnum = m[1];
msgtxt = m[2];
from = msgtxt[2];
if (msgtxt[4] != " ")
subject = tostr("[", from, ":  ", msgtxt[4], "]");
elseif ((h = ("" in msgtxt)) && (h < length(msgtxt)))
subject = tostr("[", from, ":  `", msgtxt[h + 1][1..min(20, length(msgtxt[h + 1]))], "']");
else
subject = tostr("[", from, "]");
endif
result = $mail_agent:send_message(player, recips, subject, $mail_agent:to_text(@msgtxt));
if (!result)
player:notify(tostr(result));
elseif (result[1])
player:notify(tostr("Message ", msgnum, @(folder == this) ? {} | {" on ", $mail_agent:name(folder)}, " @forwarded to ", $mail_agent:name_list(@listdelete(result, 1)), "."));
else
player:notify("Message not sent.");
endif
.
#6:71
$mail_editor:invoke($gripe_recipients, "@gripe", "@gripe: " + argstr);
.
#6:72
subject = tostr($string_utils:capitalize(verb[2..length(verb)]), ":  ", (loc = this.location).name, "(", loc, ")");
if (this != player)
return E_PERM;
elseif (argstr)
result = $mail_agent:send_message(this, {loc.owner}, subject, argstr);
if (result && result[1])
player:notify(tostr("Your ", verb, " sent to ", $mail_agent:name_list(@listdelete(result, 1)), ".  Input is appreciated, as always."));
else
player:notify(tostr("Huh?  This room's owner (", loc.owner, ") is invalid?  Tell a wizard..."));
endif
return;
elseif (!($object_utils:isa(loc, $room) && loc.free_entry))
player:notify_lines({tostr("You need to make it a one-liner, i.e., `", verb, " something or other'."), "This room may not let you back in if you go to the Mail Room."});
elseif ($object_utils:isa(loc, $generic_editor))
player:notify_lines({tostr("You need to make it a one-liner, i.e., `", verb, " something or other'."), "Sending you to the Mail Room from an editor is usually a bad idea."});
else
$mail_editor:invoke({tostr(loc.owner)}, verb, subject);
endif
if (verb == "@bug")
player:notify("For a @bug report, be sure to mention exactly what it was you typed to trigger the error...");
endif
.
#6:73
"@skip [*<folder/mailing_list>...]";
"  sets your last-read time for the given lists to now, indicating your";
"  disinterest in any new messages that might have appeared recently.";
set_task_perms(player);
current_folder = this:current_folder();
for a in (args || {0})
if (a ? $mail_agent:match_failed(folder = $mail_agent:match_recipient(a), a) | (folder = this:current_folder()))
"...bogus folder name, done...  No, try anyway.";
if (this:kill_current_message(this:my_match_object(a)))
player:notify("Invalid folder, but found it subscribed anyway.  Removed.");
endif
else
lseq = folder:length_all_msgs();
unread = ((n = this:get_current_message(folder)) ? folder:length_date_gt(n[2]) | lseq);
this:set_current_message(folder, lseq && folder:messages_in_seq({lseq, lseq + 1})[1][1], time());
player:notify(tostr(unread ? tostr("Ignoring ", unread) | "No", " unread message", (unread != 1) ? "s" | "", " on ", $mail_agent:name(folder)));
if (current_folder == folder)
this:set_current_folder(this);
endif
endif
endfor
.
#6:74
"@subscribe *<folder/mailing_list>";
"  causes you to be notified when new mail arrives on this list";
"@subscribe";
"   just lists available mailing lists.";
set_task_perms(player);
if (!dobjstr)
ml = $list_utils:slice(player.current_message[3..length(player.current_message)]);
for c in ({@$mail_agent.contents, @this.mail_lists})
$command_utils:suspend_if_needed(0);
if ((c:is_usable_by(player) || c:is_readable_by(player)) && ((verb != "@unsubscribed") || (!(c in ml))))
c:look_self();
endif
endfor
player:notify(tostr("-------- end of ", verb, " -------"));
return;
elseif ($mail_agent:match_failed(folder = $mail_agent:match_recipient(dobjstr), dobjstr))
return;
elseif (folder == this)
player:notify("You don't need to @subscribe to yourself");
return;
elseif ($object_utils:isa(folder, $mail_recipient) ? !folder:is_readable_by(this) | (!$perm_utils:controls(this, folder)))
player:notify("That mailing list is not readable by you.");
return;
endif
this:make_current_message(folder);
notification = (iobjstr && (iobjstr[1] == "n"));
if ($object_utils:isa(folder, $mail_recipient) && notification)
folder:add_notify(this);
endif
len = folder:length_all_msgs();
player:notify(tostr($mail_agent:name(folder), " has ", len, " message", (len == 1) ? "" | "s", ".", notification ? "  You will be notified immediately when new messages are posted." | "  Notification of new messages will be printed when you connect."));
this:set_current_folder(folder);
.
#6:75
set_task_perms((caller == this) ? this.owner | caller_perms());
new_cm = (head = {});
for n in (this.current_message)
if (typeof(n) != LIST)
head = {@head, n};
elseif ($object_utils:isa(folder = n[1], $mail_recipient) && folder:is_readable_by(this))
"...set current msg to be the last one you could possibly have read.";
if (n[3] < folder.last_msg_date)
i = folder:length_date_le(n[3]);
n[2] = (i && folder:messages_in_seq(i)[1]);
endif
new_cm = listappend(new_cm, n, $list_utils:iassoc_sorted(n[3], new_cm, 3));
endif
endfor
this.current_message = {@head, @$list_utils:reverse(new_cm)};
this:set_current_folder(this);
.
#6:76
set_task_perms((caller == this) ? this.owner | caller_perms());
which = {};
cm = this.current_message;
cm[1..2] = ((verb == "@rn") ? {{this, @cm[1..2]}} | {});
all = (verb == "@subscribed");
for n in (cm)
rcpt = n[1];
if ($mail_agent:is_recipient(rcpt))
if ((nmsgs = n[1]:length_date_gt(n[3])) || all)
which = {@which, {n[1], nmsgs}};
endif
else
player:notify(tostr("Bogus recipient ", rcpt, " removed from .current_message."));
this.current_message = setremove(this.current_message, n);
endif
$command_utils:suspend_if_needed(0);
endfor
if (which)
player:notify((verb == "@subscribed") ? "You are subscribed to the following lists:" | "There is new activity on the following lists:");
for w in (which)
name = ((w[1] == this) ? " me" | $mail_agent:name(w[1]));
player:notify(tostr($string_utils:left("    " + name, 40), " ", w[2], " new message", (w[2] == 1) ? "" | "s"));
endfor
elseif (verb == "@rn")
player:notify("No new activity on any of your lists.");
elseif (verb == "@subscribed")
player:notify("You aren't subscribed to any mailing lists.");
endif
return which;
.
#6:77
":mail_option(name)";
"Returns the value of the specified mail option";
if ((caller in {this, $mail_editor, $mail_agent}) || $perm_utils:controls(caller_perms(), this))
return $mail_options:get(this.mail_options, args[1]);
else
return E_PERM;
endif
.
#6:78
":display_option(name) => returns the value of the specified @display option";
if ((caller == this) || $perm_utils:controls(caller_perms(), this))
return $display_options:get(this.display_options, args[1]);
else
return E_PERM;
endif
.
#6:79
":edit_option(name) => returns the value of the specified edit option";
if ((caller == this) || ($object_utils:isa(caller, $generic_editor) || $perm_utils:controls(caller_perms(), this)))
return $edit_options:get(this.edit_options, args[1]);
else
return E_PERM;
endif
.
#6:80
":list_option(name) => returns the value of the specified @list option";
if ((caller == this) || $perm_utils:controls(caller_perms(), this))
return $list_options:get(this.list_options, args[1]);
else
return E_PERM;
endif
.
#6:81
":set_edit_option(oname,value)";
":set_display_option(oname,value)";
":set_mail_option(oname,value)";
"Changes the value of the named option.";
"Returns a string error if something goes wrong.";
if (!((caller == this) || $perm_utils:controls(caller_perms(), this)))
return tostr(E_PERM);
endif
"...this is kludgy, but it saves me from writing the same verb 3 times.";
"...there's got to be a better way to do this...";
verb[1..4] = "";
foo_options = (verb + "s");
"...";
if (typeof(s = #0.(foo_options):set(this.(foo_options), @args)) == STR)
return s;
elseif (s == this.(foo_options))
return 0;
else
this.(foo_options) = s;
return 1;
endif
.
#6:82
"@<what>-option <option> [is] <value>   sets <option> to <value>";
"@<what>-option <option>=<value>        sets <option> to <value>";
"@<what>-option +<option>     sets <option>   (usually equiv. to <option>=1";
"@<what>-option -<option>     resets <option> (equiv. to <option>=0)";
"@<what>-option !<option>     resets <option> (equiv. to <option>=0)";
"@<what>-option <option>      displays value of <option>";
set_task_perms(player);
what = {"mail", "edit", "display"}[index("med", verb[2])];
options = (what + "_options");
option_pkg = #0.(options);
set_option = (("set_" + what) + "_option");
if (!args)
player:notify_lines({("Current " + what) + " options:", "", @option_pkg:show(this.(options), option_pkg.names)});
return;
elseif (typeof(presult = option_pkg:parse(args)) == STR)
player:notify(presult);
return;
else
if (length(presult) > 1)
if (typeof(sresult = this:(set_option)(@presult)) == STR)
player:notify(sresult);
return;
elseif (!sresult)
player:notify("No change.");
return;
endif
endif
player:notify_lines(option_pkg:show(this.(options), presult[1]));
endif
.
#6:83
"set_name(newname) attempts to change this.name to newname";
"  => E_PERM   if you don't own this";
"  => E_INVARG if the name is already taken or prohibited for some reason";
"  => E_NACC   if the player database is not taking new names right now.";
"  => E_ARGS   if the name is too long (controlled by $login.max_player_name)";
if (!($perm_utils:controls(caller_perms(), this) || (this == caller)))
return E_PERM;
elseif (!is_player(this))
"we don't worry about the names of player classes.";
set_task_perms(caller_perms());
return pass(@args);
elseif ($player_db.frozen)
return E_NACC;
elseif (length(name = args[1]) > $login.max_player_name)
return E_ARGS;
elseif (!($player_db:available(name) in {this, 1}))
return E_INVARG;
else
old = this.name;
this.name = name;
if ((name != old) && (!(old in this.aliases)))
$player_db:delete(old);
endif
$player_db:insert(name, this);
return 1;
endif
.
#6:84
"set_aliases(alias_list)";
"For changing player aliases, we check to make sure that none of the aliases match existing player names/aliases.  Aliases containing spaces are not entered in the $player_db and so are not subject to this restriction ($string_utils:match_player will not match on them, however, so they only match if used in the immediate room, e.g., with match_object() or somesuch).";
"Also we make sure that the .name is included in the .alias list.  In any situation where .name and .aliases are both being changed, do the name change first.";
"  => E_PERM   if you don't own this";
"  => E_NACC   if the player database is not taking new aliases right now.";
"  => E_TYPE   if alias_list is not a list";
"  => E_INVARG if any element of alias_list is not a string";
if (!($perm_utils:controls(caller_perms(), this) || (this == caller)))
return E_PERM;
elseif (!is_player(this))
"we don't worry about the names of player classes.";
return pass(@args);
elseif ($player_db.frozen)
return E_NACC;
elseif (typeof(aliases = args[1]) != LIST)
return E_TYPE;
elseif ((length(aliases) > 30) && (length(aliases) > length(this.aliases)))
return E_INVARG;
else
for a in (aliases)
if (typeof(a) != STR)
return E_INVARG;
endif
if ((!index(a, " ")) && (!($player_db:available(a) in {this, 1})))
aliases = setremove(aliases, a);
endif
endfor
aliases = setadd(aliases, this.name);
old = this.aliases;
this.aliases = aliases;
for a in (old)
if (!(a in aliases))
$player_db:delete2(a, this);
endif
endfor
for a in (aliases)
if (!index(a, " "))
$player_db:insert(a, this);
endif
endfor
return 1;
endif
.
#6:85
if ((player != caller) || (player != this))
return;
endif
set_task_perms(player);
spec = $code_utils:parse_verbref(dobjstr);
if (spec)
object = this:my_match_object(spec[1]);
if (!$command_utils:object_match_failed(object, spec[1]))
vname = spec[2];
info = verb_info(object, vname);
if (info == E_VERBNF)
player:notify("That object does not define that verb.");
elseif (typeof(info) == ERR)
player:notify(tostr(info));
else
result = set_verb_info(object, vname, listset(info, iobjstr, 3));
if (typeof(result) == ERR)
player:notify(tostr(result));
else
player:notify("Verb name changed.");
endif
endif
endif
else
object = this:my_match_object(dobjstr);
if (!$command_utils:object_match_failed(object, dobjstr))
old_name = object.name;
old_aliases = object.aliases;
if (e = $building_utils:set_names(object, iobjstr))
if (strcmp(object.name, old_name) == 0)
name_message = tostr("Name of ", object, " (", old_name, ") is unchanged");
else
name_message = tostr("Name of ", object, " changed to \"", object.name, "\"");
endif
aliases = $string_utils:from_value(object.aliases, 1);
if (object.aliases == old_aliases)
alias_message = tostr(".  Aliases are unchanged (", aliases, ").");
else
alias_message = tostr(", with aliases ", aliases, ".");
endif
player:notify(name_message + alias_message);
elseif (e == E_INVARG)
player:notify("That particular name change not allowed (see help @rename).");
elseif (e == E_NACC)
player:notify("Oops.  You can't update that name right now; try again in a few minutes.");
elseif (e == E_ARGS)
player:notify(tostr("Sorry, name too long.  Maximum number of characters in a name:  ", $login.max_player_name));
else
player:notify(tostr(e));
endif
endif
endif
.
#6:86
"Syntax: @addalias <alias>[,...,<alias>] to <object>";
"        @addalias <alias>[,...,<alias>] to <object>:<verb>";
"";
"The first form is used to add aliases to an object's list of aliases.  You can separate multiple aliases with commas.  The aliases will be checked against the object's current aliases and all aliases not already in the object's list of aliases will be added.";
"";
"Example:";
"Muchkin wants to add new aliases to Rover the Wonder Dog:";
"  @addalias Dog,Wonder Dog to Rover";
"Since Rover the Wonder Dog already has the alias \"Dog\" but does not have the alias \"Wonder Dog\", Munchkin sees:";
"  Rover the Wonder Dog(#4237) already has the alias Dog.";
"  Alias Wonder Dog added to Rover the Wonder Dog(#4237).";
"";
"If the object is a player, spaces will also be assumed to be separations between aliases and each alias will be checked against the Player Name Database to make sure no one else is using it. Any already used aliases will be identified.";
"";
"Example:";
"Munchkin wants to add his nicknames to his own list of aliases:";
"  @addalias Foobar Davey to me";
"@Addalias recognizes that Munchkin is trying to add an alias to a valid player and checks the aliases against the Player Name Database.  Unfortunately, DaveTheMan is already using the alias \"Davey\" so Munchkin sees:";
"  DaveTheMan(#5432) is already using the alias Davey";
"  Alias Foobar added to Munchkin(#1523).";
"";
"The second form of the @addalias command is for use by programmers, to add aliases to a verb they own.  All commas and spaces are assumed to be separations between aliases.";
if (player != this)
return;
endif
set_task_perms(player);
spec = $code_utils:parse_verbref(iobjstr);
if (spec)
object = player:my_match_object(spec[1]);
if (!$command_utils:object_match_failed(object, spec[1]))
vname = spec[2];
info = verb_info(object, vname);
if (info == E_VERBNF)
player:notify("That object does not define that verb.");
elseif (typeof(info) == ERR)
player:notify(tostr(info));
else
old_aliases = $string_utils:explode(info[3]);
used = {};
for alias in (new_aliases = $list_utils:remove_duplicates($string_utils:explode(strsub(dobjstr, ",", " "))))
if (alias in old_aliases)
used = {@used, alias};
new_aliases = setremove(new_aliases, alias);
endif
endfor
if (used)
player:notify(tostr(object.name, "(", object, "):", vname, " already has the alias", (length(used) > 1) ? "es" | "", " ", $string_utils:english_list(used), "."));
endif
if (new_aliases)
info = listset(info, aliases = $string_utils:from_list({@old_aliases, @new_aliases}, " "), 3);
result = set_verb_info(object, vname, info);
if (typeof(result) == ERR)
player:notify(tostr(result));
else
player:notify(tostr("Alias", (length(new_aliases) > 1) ? "es" | "", " ", $string_utils:english_list(new_aliases), " added to verb ", object.name, "(", object, "):", vname));
player:notify(tostr("Verbname is now ", object.name, "(", object, "):\"", aliases, "\""));
endif
endif
endif
endif
else
object = player:my_match_object(iobjstr);
if (!$command_utils:object_match_failed(object, iobjstr))
old_aliases = object.aliases;
used = {};
for alias in (new_aliases = $list_utils:remove_duplicates($list_utils:map_arg($string_utils, "trim", $string_utils:explode(is_player(object) ? strsub(dobjstr, " ", ",") | dobjstr, ","))))
if (alias in old_aliases)
used = {@used, alias};
new_aliases = setremove(new_aliases, alias);
elseif (is_player(object) && valid(someone = $player_db:find_exact(alias)))
player:notify(tostr(someone.name, "(", someone, ") is already using the alias ", alias, "."));
new_aliases = setremove(new_aliases, alias);
endif
endfor
if (used)
player:notify(tostr(object.name, "(", object, ") already has the alias", (length(used) > 1) ? "es" | "", " ", $string_utils:english_list(used), "."));
endif
if (new_aliases)
if ((e = object:set_aliases(aliases = {@old_aliases, @new_aliases})) && (object.aliases == {@old_aliases, @new_aliases}))
player:notify(tostr("Alias", (length(new_aliases) > 1) ? "es" | "", " ", $string_utils:english_list(new_aliases), " added to ", object.name, "(", object, ")."));
player:notify(tostr("Aliases for ", object.name, "(", object, ") are now ", $string_utils:from_value(aliases, 1)));
elseif (e || (e == E_INVARG))
player:notify("That particular name change not allowed (see help @rename or help @addalias).");
elseif (e == E_NACC)
player:notify("Oops.  You can't update that object's aliases right now; try again in a few minutes.");
else
player:notify(tostr(e));
endif
endif
endif
endif
.
#6:87
"Syntax: @rmalias <alias>[,...,<alias>] from <object>";
"        @rmalias <alias>[,...,<alias>] from <object>:<verb>";
"";
"The first form is used to remove aliases from an object.  If the object is a valid player, space and commas will be assumed to be separations between unwanted aliases.  Otherwise, only commas will be assumed to be separations.";
"[5/10/93 Nosredna: flushed above is_player feature";
"Note that @rmalias will not affect the object's name, only its aliases.";
"";
"The second form is for use by programmers, to remove aliases from a verb they own.  All spaces and commas are assumed to be separations between unwanted aliases.";
if (player != this)
return;
endif
set_task_perms(player);
spec = $code_utils:parse_verbref(iobjstr);
if (spec)
object = player:my_match_object(spec[1]);
if (!$command_utils:object_match_failed(object, spec[1]))
vname = spec[2];
info = verb_info(object, vname);
if (info == E_VERBNF)
player:notify("That object does not define that verb.");
elseif (typeof(info) == ERR)
player:notify(tostr(info));
else
old_aliases = $string_utils:explode(info[3]);
not_used = {};
for alias in (bad_aliases = $list_utils:remove_duplicates($string_utils:explode(strsub(dobjstr, ",", " "))))
if (!(alias in old_aliases))
not_used = {@not_used, alias};
bad_aliases = setremove(bad_aliases, alias);
else
old_aliases = setremove(old_aliases, alias);
endif
endfor
if (not_used)
player:notify(tostr(object.name, "(", object, "):", vname, " does not have the alias", (length(not_used) > 1) ? "es" | "", " ", $string_utils:english_list(not_used), "."));
endif
if (bad_aliases && old_aliases)
info = listset(info, aliases = $string_utils:from_list(old_aliases, " "), 3);
result = set_verb_info(object, vname, info);
if (typeof(result) == ERR)
player:notify(tostr(result));
else
player:notify(tostr("Alias", (length(bad_aliases) > 1) ? "es" | "", " ", $string_utils:english_list(bad_aliases), " removed from verb ", object.name, "(", object, "):", vname));
player:notify(tostr("Verbname is now ", object.name, "(", object, "):\"", aliases, "\""));
endif
elseif (!old_aliases)
player:notify("You have to leave a verb with at least one alias.");
endif
endif
endif
else
object = player:my_match_object(iobjstr);
if (!$command_utils:object_match_failed(object, iobjstr))
old_aliases = object.aliases;
not_used = {};
for alias in (bad_aliases = $list_utils:remove_duplicates($list_utils:map_arg($string_utils, "trim", $string_utils:explode(dobjstr, ","))))
"removed is_player(object) ? strsub(dobjstr, \" \", \",\") | --Nosredna";
if (!(alias in old_aliases))
not_used = {@not_used, alias};
bad_aliases = setremove(bad_aliases, alias);
else
old_aliases = setremove(old_aliases, alias);
endif
endfor
if (not_used)
player:notify(tostr(object.name, "(", object, ") does not have the alias", (length(not_used) > 1) ? "es" | "", " ", $string_utils:english_list(not_used), "."));
endif
if (bad_aliases)
if (e = object:set_aliases(old_aliases))
player:notify(tostr("Alias", (length(bad_aliases) > 1) ? "es" | "", " ", $string_utils:english_list(bad_aliases), " removed from ", object.name, "(", object, ")."));
player:notify(tostr("Aliases for ", object.name, "(", object, ") are now ", $string_utils:from_value(old_aliases, 1)));
elseif (e == E_INVARG)
player:notify("That particular name change not allowed (see help @rename or help @rmalias).");
elseif (e == E_NACC)
player:notify("Oops.  You can't update that object's aliases right now; try again in a few minutes.");
else
player:notify(tostr(e));
endif
endif
endif
endif
.
#6:88
set_task_perms(player);
dobj = player:my_match_object(dobjstr);
if ($command_utils:object_match_failed(dobj, dobjstr))
"...lose...";
elseif (e = dobj:set_description(iobjstr))
player:notify("Description set.");
else
player:notify(tostr(e));
endif
.
#6:89
set_task_perms(player);
if (dobjstr == "")
player:notify(tostr("Usage:  ", verb, " <object>"));
return;
endif
dobj = player:my_match_object(dobjstr);
if ($command_utils:object_match_failed(dobj, dobjstr))
return;
endif
found_one = 0;
props = $object_utils:all_properties(dobj);
if (typeof(props) == ERR)
player:notify("You can't read the messages on that.");
return;
endif
for pname in (props)
len = length(pname);
if ((len > 4) && (pname[len - 3..len] == "_msg"))
found_one = 1;
msg = dobj.(pname);
if (msg == E_PERM)
value = "isn't readable by you.";
elseif (!msg)
value = "isn't set.";
elseif (typeof(msg) != STR)
value = "is corrupted! **";
else
value = ("is " + $string_utils:print(msg));
endif
player:notify(tostr("@", pname[1..len - 4], " ", dobjstr, " ", value));
endif
endfor
if (!found_one)
player:notify("That object doesn't have any messages to set.");
endif
.
#6:90
$note_editor:invoke(dobjstr, verb);
.
#6:91
if (typeof(player.password) != STR)
if (length(args) != 1)
return player:notify(tostr("Usage:  ", verb, " <new-password>"));
else
new_password = args[1];
endif
elseif (length(args) != 2)
player:notify(tostr("Usage:  ", verb, " <old-password> <new-password>"));
return;
elseif (player.password != crypt(tostr(args[1]), player.password))
player:notify("That's not your old password.");
return;
else
new_password = args[2];
endif
player.password = crypt(tostr(new_password));
player:notify("New password set.");
.
#6:92
"@last-c           reports when and from where you last connected.";
"@last-c all       adds the 10 most recent places you connected from.";
"@last-c confunc   is like `@last-c' but is silent on first login.";
opts = {"all", "confunc"};
i = 0;
if (caller != this)
return E_PERM;
elseif (args && ((length(args) > 1) || (!(i = $string_utils:find_prefix(args[1], opts)))))
this:notify(tostr("Usage:  ", verb, " [all]"));
return;
endif
opt_all = (i && (opts[i] == "all"));
opt_confunc = (i && (opts[i] == "confunc"));
if (!(prev = this.previous_connection))
this:notify("Something was broken when you logged in; tell a wizard.");
elseif (prev[1] == 0)
opt_confunc || this:notify("Your previous connection was before we started keeping track.");
elseif (prev[1] > time())
this:notify("This is your first time connected.");
else
this:notify(tostr("Last connected ", ctime(prev[1]), " from ", prev[2]));
if (opt_all)
this:notify("Previous connections have been from the following sites:");
for l in (this.all_connect_places)
this:notify("   " + l);
endfor
endif
endif
.
#6:93
"set_gender(newgender) attempts to change this.gender to newgender";
"  => E_PERM   if you don't own this or aren't its parent";
"  => Other return values as from $gender_utils:set.";
if (!($perm_utils:controls(caller_perms(), this) || (this == caller)))
return E_PERM;
else
result = $gender_utils:set(this, args[1]);
this.gender = ((typeof(result) == STR) ? result | args[1]);
return result;
endif
.
#6:94
set_task_perms(valid(caller_perms()) ? caller_perms() | player);
if (!args)
player:notify(tostr("Your gender is currently ", this.gender, "."));
player:notify($string_utils:pronoun_sub("Your pronouns:  %s,%o,%p,%q,%r,%S,%O,%P,%Q,%R"));
player:notify(tostr("Available genders:  ", $string_utils:english_list($gender_utils.genders, "", " or ")));
else
result = this:set_gender(args[1]);
quote = ((result == E_NONE) ? "\"" | "");
player:notify(tostr("Gender set to ", quote, this.gender, quote, "."));
if (typeof(result) != ERR)
player:notify($string_utils:pronoun_sub("Your pronouns:  %s,%o,%p,%q,%r,%S,%O,%P,%Q,%R"));
elseif (result != E_NONE)
player:notify(tostr("Couldn't set pronouns:  ", result));
else
player:notify("Pronouns unchanged.");
endif
endif
.
#6:95
"set_brief(value)";
"set_brief(value, anything)";
"If <anything> is given, add value to the current value; otherwise, just set the value.";
if (!($perm_utils:controls(caller_perms(), this) || (this == caller)))
return E_PERM;
else
if (length(args) == 1)
this.brief = args[1];
else
this.brief = (this.brief + args[1]);
endif
endif
.
#6:96
"@mode <mode>";
"Current modes are brief and verbose.";
"General verb for setting player `modes'.";
"Modes are coded right here in the verb.";
if (caller != this)
player:tell("You can't set someone else's modes.");
return E_PERM;
endif
modes = {"brief", "verbose"};
mode = modes[$string_utils:find_prefix(dobjstr, modes)];
if (!mode)
player:tell("Unknown mode \"", dobjstr, "\".  Known modes:");
for mode in (modes)
player:tell("  ", mode);
endfor
return 0;
elseif (mode == "brief")
this:set_brief(1);
elseif (mode == "verbose")
this:set_brief(0);
endif
player:tell($string_utils:capitalize(mode), " mode set.");
return 1;
.
#6:97
"This verb should probably go away once 'examine' is in place.";
if (dobjstr == "")
player:notify(tostr("Usage:  ", verb, " <object>"));
return;
endif
what = $string_utils:match_object(dobjstr, player.location);
if ($command_utils:object_match_failed(what, dobjstr))
return;
endif
player:notify(tostr(what.name, " (", what, ") is owned by ", valid(what.owner) ? what.owner.name | "a recycled player", " (", what.owner, ")."));
player:notify(tostr("Aliases:  ", $string_utils:english_list(what.aliases)));
desc = what:description();
if (desc)
player:notify_lines(desc);
else
player:notify("(No description set.)");
endif
if ($perm_utils:controls(player, what))
player:notify(tostr("Key:  ", $lock_utils:unparse_key(what.key)));
endif
contents = what.contents;
if (contents)
player:notify("Contents:");
for item in (contents)
player:notify(tostr("  ", item.name, " (", item, ")"));
endfor
endif
"Use dobjstr, not shortest alias.";
name = dobjstr;
"name = what.name;";
"if (typeof(what.aliases) == LIST && what.aliases != {})";
"for alias in (what.aliases)";
"if (length(alias) <= length(name))";
"name = alias;";
"endif";
"endfor";
"endif";
vrbs = {};
commands_ok = (what in {player, player.location});
dull_classes = {$root_class, $room, $player, $prog};
what = what;
printed_working_msg = 0;
while (what != $nothing)
if ($command_utils:running_out_of_time())
if (!printed_working_msg)
player:notify("Working on list of obvious verbs...");
printed_working_msg = 1;
endif
suspend(0);
endif
if (!(what in dull_classes))
for i in [0..length(verbs(what)) - 1]
if ($command_utils:running_out_of_time())
if (!printed_working_msg)
player:notify("Working on list of obvious verbs...");
printed_working_msg = 1;
endif
suspend(0);
endif
info = verb_info(what, tostr(i));
syntax = verb_args(what, tostr(i));
if ((index(info[2], "r") && ((syntax[2..3] != {"none", "this"}) && (commands_ok || ("this" in syntax)))) && verb_code(what, tostr(i)))
dobj = syntax[1];
prep = syntax[2];
iobj = syntax[3];
if (syntax == {"any", "any", "any"})
prep = "none";
endif
if (prep != "none")
for x in ($string_utils:explode(prep, "/"))
if (length(x) <= length(prep))
prep = x;
endif
endfor
endif
"This is the correct way to handle verbs ending in *";
vname = info[3];
while (i = index(vname, "* "))
vname = tostr(vname[1..i - 1], "<anything>", vname[i + 1..length(vname)]);
endwhile
if (vname[i = length(vname)] == "*")
vname = (vname[1..i - 1] + "<anything>");
endif
vname = strsub(vname, " ", "/");
rest = "";
if (prep != "none")
rest = (" " + ((prep == "any") ? "<anything>" | prep));
if (iobj != "none")
rest = tostr(rest, " ", (iobj == "this") ? name | "<anything>");
endif
endif
if (dobj != "none")
rest = tostr(" ", (dobj == "this") ? name | "<anything>", rest);
endif
vrbs = setadd(vrbs, ("  " + vname) + rest);
endif
endfor
endif
what = parent(what);
endwhile
if (vrbs)
player:notify("Obvious Verbs:");
player:notify_lines(vrbs);
printed_working_msg && player:notify("(End of list.)");
elseif (printed_working_msg)
player:notify("No obvious verbs found.");
endif
.
#6:98
set_task_perms(player);
if (!dobjstr)
player:notify(tostr("Usage:  ", verb, " <object>"));
return E_INVARG;
endif
what = player.location:match_object(dobjstr);
if ($command_utils:object_match_failed(what, dobjstr))
return;
endif
what:do_examine(player);
.
#6:99
"Add a feature to this player's features list.  Caller must be this or have suitable permissions (this or wizardly).";
"If this is a nonprogrammer, then ask feature if it is feature_ok (that is, if it has a verb :feature_ok which returns a true value, or a property .feature_ok which is true).";
"After adding feature, call feature:feature_add(this).";
"Returns true if successful, E_INVARG if not a valid object, and E_PERM if !feature_ok or if caller doesn't have permission.";
if ((caller == this) || $perm_utils:controls(caller_perms(), this))
feature = args[1];
if ((typeof(feature) != OBJ) || (!valid(feature)))
return E_INVARG;
"Not a valid object.";
endif
if ($code_utils:verb_or_property(feature, "feature_ok", this))
"The object is willing to be a feature.";
if (typeof(this.features) == LIST)
"If list, we can simply setadd the feature.";
this.features = setadd(this.features, feature);
else
"If not, we erase the old value and create a new list.";
this.features = {feature};
endif
"Tell the feature it's just been added.";
feature:feature_add(this);
return 1;
"We're done.";
else
return E_PERM;
"Feature isn't feature_ok.";
endif
else
return E_PERM;
"Caller doesn't have permission.";
endif
.
#6:100
"Remove a feature from this player's features list.  Caller must be this, or have permissions of this, a wizard, or feature.owner.";
"Returns true if successful, E_PERM if caller didn't have permission.";
feature = args[1];
if (((caller == this) || $perm_utils:controls(caller_perms(), this)) || (caller_perms() == feature.owner))
if (typeof(this.features) == LIST)
"If this is a list, we can just setremove...";
this.features = setremove(this.features, feature);
"Otherwise, we leave it alone.";
endif
"Let the feature know it's been removed.";
feature:feature_remove(this);
return 1;
"We're done.";
else
return E_PERM;
"Caller didn't have permission.";
endif
.
#6:101
"Usage:  @add-feature <feature object>";
"Add an object to your features list.";
set_task_perms(player);
if (dobjstr)
if (!$command_utils:object_match_failed(dobj, dobjstr))
if (dobj in player.features)
player:tell(dobjstr, " is already one of your features.");
elseif (player:add_feature(dobj))
player:tell(dobj, " (", dobj.name, ") added as a feature.");
else
player:tell("You can't seem to add ", dobj, " (", dobj.name, ") to your features list.");
endif
endif
else
player:tell("Usage:  @add-feature <object>");
endif
.
#6:102
"Usage:  @remove-feature <feature object>";
"Remove an object from your .features list.";
set_task_perms(player);
if (dobjstr)
features = player.features;
if (!valid(dobj))
dobj = $string_utils:match(dobjstr, features, "name", features, "aliases");
endif
if (!$command_utils:object_match_failed(dobj, dobjstr))
if (dobj in features)
player:remove_feature(dobj);
player:tell(dobj, " (", dobj.name, ") removed from your features list.");
else
player:tell(dobjstr, " is not one of your features.");
endif
endif
else
player:tell("Usage:  @remove-feature <object>");
endif
.
#6:103
"Usage:  @features [<name>] for <player>";
"List the feature objects matching <name> used by <player>.";
if (!iobjstr)
player:tell("Usage: @features [<name>] for <player>");
return;
elseif ($command_utils:player_match_failed(whose = $string_utils:match_player(iobjstr), iobjstr))
return;
endif
features = {};
for feature in (whose.features)
if (!valid(feature))
this:remove_feature(feature);
elseif ((!dobjstr) || ((dobjstr in feature.aliases) || ((pref = $string_utils:find_prefix(dobjstr, feature.aliases)) || (pref == $ambiguous_match))))
features = listappend(features, feature);
endif
endfor
if (features)
len = (max(length("Feature"), length(tostr(max_object()))) + 1);
player:tell($string_utils:left("Feature", len), "Name");
player:tell($string_utils:left("-------", len), "----");
for feature in (features)
player:tell($string_utils:left(tostr(feature), len), feature.name);
endfor
player:tell($string_utils:left("-------", len), "----");
cstr = (((tostr(length(features)) + " feature") + ((length(features) > 1) ? "s" | "")) + " found");
if (whose != this)
cstr = (((((cstr + " on ") + whose.name) + " (") + tostr(whose)) + ")");
endif
if (dobjstr)
cstr = (((cstr + " matching \"") + dobjstr) + "\"");
endif
cstr = (cstr + ".");
player:tell(cstr);
elseif (dobjstr)
player:tell("No features found on ", whose.name, " (", whose, ") matching \"", dobjstr, "\".");
else
player:tell("No features found on ", whose.name, " (", whose, ").");
endif
.
#6:104
"Usage:  @features [<name>]";
"List the feature objects matching <name> used by player.";
iobjstr = player.name;
iobj = player;
this:("@features")();
.
#6:105
stats = memory_usage();
if (!stats)
player:notify("Sorry, but no memory-usage statistics are available for this server.");
return;
endif
su = $string_utils;
player:notify("Block Size   # In Use    # Free    Bytes In Use   Bytes Free");
player:notify("----------   --------   --------   ------------   ----------");
nused = (nfree = (bytesused = (bytesfree = 0)));
kilo = 1024;
meg = (kilo * kilo);
for x in (stats)
if (x[2..3] != {0, 0})
bsize = x[1];
if ((bsize % meg) == 0)
bsize = tostr(bsize / meg, " M");
elseif ((bsize % kilo) == 0)
bsize = tostr(bsize / kilo, " K");
endif
bused = (x[1] * x[2]);
bfree = (x[1] * x[3]);
player:notify(tostr(su:left(bsize, 10), "   ", su:right(su:group_number(x[2]), 8), "   ", su:right(su:group_number(x[3]), 8), "   ", su:right(su:group_number(bused), 12), "   ", su:right(su:group_number(bfree), 10)));
nused = (nused + x[2]);
nfree = (nfree + x[3]);
bytesused = (bytesused + bused);
bytesfree = (bytesfree + bfree);
endif
endfor
player:notify("");
player:notify(tostr(su:left("Totals:", 10), "   ", su:right(su:group_number(nused), 8), "   ", su:right(su:group_number(nfree), 8), "   ", su:right(su:group_number(bytesused), 12), "   ", su:right(su:group_number(bytesfree), 10)));
player:notify("");
player:notify(tostr("Total Memory Size: ", su:group_number(bytesused + bytesfree), " bytes."));
.
#6:106
player:notify(tostr("The MOO is currently running version ", server_version(), " of the LambdaMOO server code."));
.
#6:107
player:notify(tostr("The server has been up for ", $time_utils:english_time(time() - $last_restart_time), "."));
.
#6:108
boot_player(player);
"-- argh, let the player decide; #3:disfunc() takes care of this --Rog";
"player:moveto(player.home)";
.
#6:109
return this == args[1];
.
#6:110
"return true if player is active. This verb is !d";
return typeof(idle_seconds(this)) != ERR;
.
#6:111
if (args[1] == #-1)
return E_INVARG;
this:notify("You are now in #-1, The Void.  Type `home' to get back.");
endif
set_task_perms(caller_perms());
pass(@args);
.
#6:112
return this.location:(verb)(@args);
"temporarily let player:announce be noisy to player";
if (verb == "announce_all_but")
if (this in args[1])
return;
endif
args = args[2..length(args)];
endif
this:tell("(from within you) ", @args);
.
#6:113
"Return a true value if this needs linewrapping.";
"default is true if .linelen > 0";
return this.linelen > 0;
.
#6:114
"Usage:  @set-note-{string | text} {#xx | #xx.pname}";
"        ...lines of text...";
"        .";
"";
"For use by clients' local editors, to save new text for a note or object property.  See $note_editor:local_editing_info() for details.";
set_task_perms(player);
text = $command_utils:read_lines(1);
if ((verb == "@set-note-string") && (length(text) <= 1))
text = (text ? text[1] | "");
endif
if (spec = $code_utils:parse_propref(argstr))
o = toobj(spec[1]);
p = spec[2];
e = (o.(p) = text);
if (e != text)
player:tell("Error: ", e);
else
player:tell("Set ", p, " property of ", o.name, " (", o, ").");
endif
elseif (typeof(note = $code_utils:toobj(argstr)) == OBJ)
e = note:set_text(text);
if (typeof(e) == ERR)
player:tell("Error: ", e);
else
player:tell("Set text of ", note.name, " (", note, ").");
endif
else
player:tell("Error: Malformed argument to ", verb, ": ", argstr);
endif
.
#6:115
"Copied from Generic Player Class With Additional Features of Dubious Utility (#7069):verb_sub by ur-Rog (#6349) Tue Nov 10 15:03:38 1992 PST";
text = args[1];
if (a = $list_utils:assoc(text, this.verb_subs))
return a[2];
else
return $gender_utils:get_conj(text, this);
endif
.
#6:116
if ($perm_utils:controls(caller_perms(), this))
return this.(verb);
else
return E_PERM;
endif
.
#6:117
lines = args[1];
if (typeof(lines) != LIST)
lines = {lines};
endif
if (this.gaglist || this.paranoid)
"Check the above first, default case, to save ticks.  Paranoid gaggers are cost an extra three or so ticks by this, probably a net savings.";
if (this:gag_p())
return;
endif
if (this.paranoid == 2)
z = this:whodunnit({@callers(), {player, "", player}}, {this, $no_one}, {})[3];
lines = {((("[start text by " + z.name) + " (") + tostr(z)) + ")]", @lines, ((("[end text by " + z.name) + " (") + tostr(z)) + ")]"};
elseif (this.paranoid == 1)
this.responsible = {@this.responsible, {{@callers(), {player, "<cmd-line>", player}}, lines}};
if (((len = length(this.responsible)) * 2) > (this.lines * 3))
this.responsible = this.responsible[(len - this.lines) + 1..len];
endif
else
this.responsible = {};
endif
endif
"don't gather stats for now: $list_utils:check_nonstring_tell_lines(lines)";
this:notify_lines(lines);
.
#6:118
"Copied from generic room (#3):@lastlog by Haakon (#2) Wed Dec 30 13:30:02 1992 PST";
if (dobjstr != "")
dobj = $string_utils:match_player(dobjstr);
if (!valid(dobj))
player:tell("Who?");
return;
endif
folks = {dobj};
else
folks = players();
endif
day = (week = (month = (ever = (never = {}))));
a_day = ((24 * 60) * 60);
a_week = (7 * a_day);
a_month = (30 * a_day);
now = time();
for x in (folks)
when = x.last_connect_time;
how_long = (now - when);
if ((when == 0) || (when > now))
never = {@never, x};
elseif (how_long < a_day)
day = {@day, x};
elseif (how_long < a_week)
week = {@week, x};
elseif (how_long < a_month)
month = {@month, x};
else
ever = {@ever, x};
endif
endfor
for entry in ({{day, "the last day"}, {week, "the last week"}, {month, "the last 30 days"}, {ever, "recorded history"}})
if (entry[1])
player:tell("Players who have connected within ", entry[2], ":");
for x in (entry[1])
player:tell("  ", x.name, " last connected ", ctime(x.last_connect_time), ".");
endfor
endif
endfor
if (never)
player:tell("Players who have never connected:");
player:tell("  ", $string_utils:english_list($list_utils:map_prop(never, "name")));
endif
.
#6:119
"Set linelength.  Linelength must be an integer >= 10.";
"If wrap is currently off (i.e. linelength is less than 0), maintains sign.  That is, this function *takes* an absolute value, and coerces the sign to be appropriate.";
"If you want to override the dwimming of wrap, pass in a second argument.";
"returns E_PERM if not allowed, E_INVARG if linelength is too low, otherwise the linelength.";
if ((caller != this) && (!$perm_utils:controls(caller_perms(), this)))
return E_PERM;
elseif (abs(len = args[1]) < 10)
return E_INVARG;
elseif (length(args) > 1)
this.linelen = len;
else
"DWIM here.";
this.linelen = ((this.linelen > 0) ? len | (-len));
return len;
endif
.
#6:120
"Set pagelength. Must be an integer >= 5, or 0 to turn pagelength off.";
"Returns E_PERM if you shouldn't be doing this, E_INVARG if it's too low, otherwise, what it got set to.";
if ((caller != this) && (!$perm_utils:controls(caller_perms(), this)))
return E_PERM;
elseif (((len = args[1]) < 5) && (len != 0))
return E_INVARG;
else
return this.pagelen = len;
endif
.
#6:121
"set_home(newhome) attempts to change this.home to newhome";
"E_TYPE   if newhome doesn't have a callable :accept_for_abode verb.";
"E_INVARG if newhome won't accept you as a resident.";
"E_PERM   if you don't own this and aren't its parent.";
"1        if it works.";
newhome = args[1];
if ((caller == this) || $perm_utils:controls(caller_perms(), this))
if ($object_utils:has_callable_verb(newhome, "accept_for_abode"))
if (newhome:accept_for_abode(this))
return (typeof(e = (this.home = args[1])) != ERR) || e;
else
return E_INVARG;
endif
else
return E_TYPE;
endif
else
return E_PERM;
endif
.
#6:122
"@unsubscribe [*<folder/mailing_list> ...]";
"entirely removes the record of your current message for the named folders,";
"indicating your disinterest in anything that might appear there in the future.";
set_task_perms(player);
unsubscribed = {};
current_folder = this:current_folder();
for a in (args || {0})
if (a ? $mail_agent:match_failed(folder = $mail_agent:match_recipient(a), a) | (folder = current_folder))
"...bogus folder name, done...  No, try anyway.";
if (this:kill_current_message(this:my_match_object(a)))
player:notify("Invalid folder, but found it subscribed anyway.  Removed.");
endif
elseif (folder == this)
player:notify(tostr("You can't ", verb, " yourself."));
else
if (!this:kill_current_message(folder))
player:notify(tostr("You weren't subscribed to ", $mail_agent:name(folder)));
if ($object_utils:isa(folder, $mail_recipient))
result = folder:delete_notify(this);
if ((typeof(result) == LIST) && (result[1] == this))
player:notify("Removed you from the mail notifications list.");
endif
endif
else
unsubscribed = {@unsubscribed, folder};
if ($object_utils:isa(folder, $mail_recipient))
folder:delete_notify(this);
endif
endif
endif
endfor
if (unsubscribed)
player:notify(tostr("Forgetting about ", $string_utils:english_list($list_utils:map_arg($mail_agent, "name", unsubscribed))));
if (current_folder in unsubscribed)
this:set_current_folder(this);
endif
endif
.
#6:123
"@registerme as <email-address> -- enter a new email address for player";
"   will change the database entry, assign a new password, and mail the new password to the player at the given email address.";
if (player != this)
return player:notify(tostr(E_PERM));
endif
who = this;
if ($object_utils:isa(this, $guest))
who:notify("Sorry, guests should use the '@request' command to request a character.");
return;
endif
connection = $string_utils:connection_hostname(connection_name(who));
if (!argstr)
if (who.email_address)
player:tell("You are currently registered as:  ", who.email_address);
else
player:tell("You are not currently registered.");
endif
player:tell("Use @registerme as <address> to change this.");
return;
elseif (((prepstr != "as") || (!iobjstr)) || dobjstr)
player:tell("Usage: @registerme as <address>");
return;
endif
email = iobjstr;
if (reason = $wiz_utils:check_reregistration(this.name, email, connection))
if (reason[1] == "-")
if (!$command_utils:yes_or_no(reason[2..length(reason)] + ". Automatic registration not allowed. Ask to be registered at this address anyway?"))
who:notify("Okay.");
return;
endif
else
return who:notify(tostr(reason, " Please try again."));
endif
endif
if ($network.active && (!reason))
if (!$command_utils:yes_or_no(tostr("If you continue, your password will be changed, the new password mailed to `", email, "'. Do you want to continue?")))
return who:notify("Registration terminated.");
endif
password = $wiz_utils:random_password(5);
old = (who.email_address || "[ unregistered ]");
who:notify(tostr("Registering you, and changing your password and mailing new one to ", email, "."));
result = $network:sendmail(email, tostr("Your ", $network.MOO_Name, " character, ", who.name), "Reply-to: " + $login.registration_address, @$generic_editor:fill_string(tostr("Your ", $network.MOO_name, " character, ", $string_utils:nn(who), " has been registered to this email address (", email, "), and a new password assigned.  The new password is `", password, "'. Please keep your password secure. You can change your password with the @password command."), 75));
if (result != 0)
who:notify(tostr("Mail sending did not work: ", reason, ". Reregistration terminated."));
return;
endif
who:notify(tostr("Mail with your new password forwarded. If you do not get it, send regular email to ", $login.registration_address, " with your character name."));
$mail_agent:send_message($new_player_log.autoregistration_player, $new_player_log, "reg " + $string_utils:nn(this), {email, tostr("formerly ", old)});
$registration_db:add(this, email, "Reregistered at " + ctime());
this.email_address = email;
who.password = crypt(password);
else
who:notify("No automatic reregistration: your request will be forwarded.");
if (typeof(curreg = $registration_db:find(email)) == LIST)
additional_info = {"Current registration information for this email address:", @$registration_db:describe_registration(curreg)};
else
additional_info = {};
endif
$mail_agent:send_message(this, $registration_db.registrar, "Registration request", {((("Reregistration request from " + $string_utils:nn(who)) + " connected via ") + connection) + ":", "", (("@register " + who.name) + " ") + email, ("@new-password " + who.name) + " is ", "", "Reason this request was forwarded:", reason, @additional_info});
endif
.
#6:124
":ctime([NUM time]) => STR as the function.";
"May be hacked by players and player-classes to reflect differences in time-zone.";
return ctime(@args);
.
#6:125
":send_self_netmail(msg [ ,from ])";
"return 0 if successful, otherwise error.";
if (!$perm_utils:controls(caller_perms(), this))
return E_PERM;
elseif (error = $network:invalid_email_address(this.email_address))
return "Invalid email address: " + error;
else
msg = args[1];
if (length(args) > 1)
from = args[2];
this:notify(tostr("Receiving mail from ", from:title(), " (", from, ") and forwarding it to your .email_address."));
endif
oplayer = player;
player = this;
error = $network:sendmail(this.email_address, @msg);
if (error && (length(args) > 1))
this:notify(tostr("Mail sending failed: ", error));
endif
player = oplayer;
return error;
endif
.
#6:126
"@netforward <msg>...                  -- as in help on @netforward";
"@netforward <msg>... on *<recipient>  -- netforwards messages on recipient.";
"This command forwards mail-messages to your registered email-address.";
if (player != this)
return player:tell(E_PERM);
endif
if (reason = $network:email_will_fail(email = player.email_address))
return player:notify(tostr("Cannot forward mail to your email address: ", reason));
endif
set_task_perms(valid(caller_perms()) ? caller_perms() | player);
if (p = player:parse_mailread_cmd("@read", args, "", "on"))
player:set_current_folder(folder = p[1]);
msg_seq = p[2];
folderstr = ((folder == player) ? "" | tostr(" from *", folder.name, "(", folder, ")"));
if (!$command_utils:yes_or_no(tostr("You are about to forward ", seq_size = $seq_utils:size(msg_seq), " message(s)", folderstr, " to your registered email-address, ", email, ".  Continue?")))
player:notify(tostr("@Netforward cancelled."));
return;
endif
player._mail_task = task_id();
netmail = {};
linelen = player:linelen();
maxmsg = (minmsg = 0);
for msg in (folder:messages_in_seq(msg_seq))
minmsg = (minmsg ? min(msg[1], minmsg) | msg[1]);
maxmsg = (maxmsg ? max(msg[1], maxmsg) | msg[1]);
lines = {tostr("Message ", msg[1], folderstr, ":"), tostr("Date:     ", ctime(msg[2][1])), "From:     " + msg[2][2], "To:       " + msg[2][3], @(length(subj = msg[2][4]) > 1) ? {"Subject:  " + subj} | {}};
for line in (msg[2][5..length(msg[2])])
lines = {@lines, @$generic_editor:fill_string(line, linelen)};
$command_utils:suspend_if_needed(0);
endfor
netmail = {@netmail, @lines, "", "--------------------------", "", ""};
endfor
reason = player:send_self_netmail({header = tostr($network.MOO_name, " Message(s) ", minmsg, @(minmsg != maxmsg) ? {" - ", maxmsg} | {}, folderstr), @netmail});
player:notify((reason == 0) ? tostr("@netforward of ", header, " completed.") | tostr("@netforward failed: ", reason, "."));
endif
.
#6:127
"Syntax: @@sendmail";
"This is intended for use with client editors.  You probably don't want to try using this command manually.";
"Reads a formatted mail message, extracts recipients, subject line and/or reply-to header and sends message without going to the mailroom.  Example:";
"";
"@@send";
"To: Rog (#4292)";
"Subject: random";
"";
"first line";
"second line";
".";
"";
"Currently, header lines must have the same format as in an actual message.";
set_task_perms(player);
if (args)
player:notify(tostr("The ", verb, " command takes no arguments."));
$command_utils:read_lines();
return;
elseif (this != player)
player:notify(tostr("You can't use ", this.pp, " ", verb, " verb."));
$command_utils:read_lines();
return;
endif
msg = $command_utils:read_lines();
end_head = (("" in msg) || (length(msg) + 1));
from = this;
subject = "";
replyto = "";
rcpts = {};
body = msg[end_head + 1..length(msg)];
for i in [1..end_head - 1]
line = msg[i];
if (index(line, "Subject:") == 1)
subject = $string_utils:trim(line[9..length(line)]);
elseif (index(line, "To:") == 1)
if (!(rcpts = $mail_agent:parse_address_field(line)))
player:notify("No recipients found in To: line");
return;
endif
elseif (index(line, "Reply-to:") == 1)
if ((!(replyto = $mail_agent:parse_address_field(line))) && $string_utils:trim(line[10..length(line)]))
player:notify("No address found in Reply-to: line");
return;
endif
elseif (index(line, "From:") == 1)
"... :send_message() bombs if designated sender != player ...";
if (!(from = $mail_agent:parse_address_field(line)))
player:notify("No sender found in From: line");
return;
elseif (length(from) > 1)
player:notify("Multiple senders?");
return;
endif
from = from[1];
elseif (i = index(line, ":"))
player:notify(tostr("Unknown header \"", line[1..i], "\""));
return;
else
player:notify("Blank line must separate headers from body.");
return;
endif
endfor
if (!rcpts)
player:notify("No To: line found.");
elseif (!(subject || body))
player:notify("Blank message not sent.");
else
player:notify("Sending...");
result = $mail_agent:send_message(from, rcpts, replyto ? subject | {subject, replyto}, body);
if (e = (result && result[1]))
if (length(result) == 1)
player:notify("Mail actually went to no one.");
else
player:notify(tostr("Mail actually went to ", $mail_agent:name_list(@listdelete(result, 1)), "."));
endif
else
player:notify(tostr((typeof(e) == ERR) ? e | ("Bogus recipients:  " + $string_utils:from_list(result[2]))));
player:notify("Mail not sent.");
endif
endif
.
#7:0
this:move(player);
.
#7:1
"Copied from generic exit (#7):move(new) by Haakon (#2) Sat Aug 14 12:54:22 1993 PDT";
"Copied from generic exit (#7):move by Haakon (#2) Sat Aug 14 12:43:38 1993 PDT";
what = args[1];
"if (what.location != this.source)";
"  player:tell(\"You can't go that way.\")";
"  return";
"endif";
unlocked = this:is_unlocked_for(what);
if (unlocked)
this.dest:bless_for_entry(what);
endif
if (unlocked && this.dest:acceptable(what))
start = what.location;
if (msg = this:leave_msg(what))
what:tell_lines(msg);
endif
what:moveto(this.dest);
if (what.location != start)
"Don't print oleave messages if WHAT didn't actually go anywhere...";
this:announce_msg(start, what, (this:oleave_msg(what) || this:defaulting_oleave_msg(what)) || "has left.");
endif
if (what.location == this.dest)
"Don't print arrive messages if WHAT didn't really end up there...";
if (msg = this:arrive_msg(what))
what:tell_lines(msg);
endif
this:announce_msg(what.location, what, this:oarrive_msg(what) || "has arrived.");
endif
else
if (msg = this:nogo_msg(what))
what:tell_lines(msg);
else
what:tell("You can't go that way.");
endif
if (msg = this:onogo_msg(what))
this:announce_msg(what.location, what, msg);
endif
endif
.
#7:2
if ((caller == this) || $perm_utils:controls(caller_perms(), this))
"... relies on -d...";
this.source:remove_exit(this);
this.dest:remove_entrance(this);
return pass(@args);
else
return E_PERM;
endif
.
#7:3
msg = this.(verb);
return msg ? $string_utils:pronoun_sub(msg, @args) | "";
.
#7:4
if ($perm_utils:controls(cp = caller_perms(), this) || (valid(this.source) && (this.source.owner == cp)))
return (typeof(e = (this.name = args[1])) != ERR) || e;
else
return E_PERM;
endif
.
#7:5
if ($perm_utils:controls(cp = caller_perms(), this) || (valid(this.source) && (this.source.owner == cp)))
if (typeof(e = (this.aliases = args[1])) == ERR)
return e;
else
return 1;
endif
else
return E_PERM;
endif
.
#7:6
"This is intended to be called only by exits, for announcing various oxxx messages.  First argument is room to announce in.  Second argument is as in $room:announce_all_but's first arg, who not to announce to.  Rest args are what to say.  If the final arg is a list, prepends all the other rest args to the first line and emits the lines separately.";
where = args[1];
whobut = args[2];
nargs = length(args);
last = args[nargs];
if (typeof(last) == LIST)
where:announce_all_but(whobut, @args[3..nargs - 1], last[1]);
for line in (last[2..length(last)])
where:announce_all_but(whobut, line);
endfor
else
where:announce_all_but(@args[3..nargs]);
endif
.
#7:7
for k in ({this.name, @this.aliases})
if (k in {"east", "west", "south", "north", "northeast", "southeast", "southwest", "northwest", "out", "up", "down", "nw", "sw", "ne", "se", "in"})
return ("goes " + k) + ".";
elseif (k in {"leave", "out", "exit"})
return "leaves";
endif
endfor
if ((index(this.name, "an ") == 1) || (index(this.name, "a ") == 1))
return ("leaves for " + this.name) + ".";
else
return ("leaves for the " + this.name) + ".";
endif
.
#7:8
if ((caller in {this, this.owner}) || $perm_utils:controls(caller_perms(), this))
return pass(@args);
else
return E_PERM;
endif
.
#7:9
"examine_key(examiner)";
"return a list of strings to be told to the player, indicating what the key on this type of object means, and what this object's key is set to.";
"the default will only tell the key to a wizard or this object's owner.";
who = args[1];
if (((caller == this) && $perm_utils:controls(who, this)) && (this.key != 0))
return {tostr(this:title(), " will only transport objects matching this key:"), tostr("  ", $lock_utils:unparse_key(this.key))};
endif
.
#7:10
":announce_msg(place, what, msg)";
"  announce msg in place (except to what). Prepend with what:title if it isn't part of the string";
msg = args[3];
what = args[2];
title = what:titlec();
if (index(msg, title) != 1)
msg = tostr(title, " ", msg);
endif
args[1]:announce_all_but({what}, msg);
.
#8:0
if ((this.location != player) && (this.location != player.location))
player:tell("You can't get at ", this.name, ".");
elseif (dobj == $nothing)
player:tell("What do you want to put ", prepstr, " ", this.name, "?");
elseif ($command_utils:object_match_failed(dobj, dobjstr))
elseif (!this.opened)
player:tell(this.name, " is closed.");
else
dobj:moveto(this);
if (dobj.location == this)
player:tell(this:put_msg());
if (msg = this:oput_msg())
player.location:announce(player.name, " ", msg);
endif
else
player:tell(this:put_fail_msg());
if (msg = this:oput_fail_msg())
player.location:announce(player.name, " ", msg);
endif
endif
endif
.
#8:1
if (!this.opened)
player:tell(this.name, " is not open.");
elseif (this.dark)
player:tell("You can't see into ", this.name, " to remove anything.");
elseif ((dobj = this:match_object(dobjstr)) == $nothing)
player:tell("What do you want to take from ", this.name, "?");
elseif ($command_utils:object_match_failed(dobj, dobjstr))
elseif (!(dobj in this:contents()))
player:tell(dobj.name, " isn't in ", this.name, ".");
else
dobj:moveto(player);
if (dobj.location == player)
player:tell(this:remove_msg());
if (msg = this:oremove_msg())
player.location:announce(player.name, " ", msg);
endif
else
dobj:moveto(this.location);
if (dobj.location == this.location)
player:tell(this:remove_msg());
if (msg = this:oremove_msg())
player.location:announce(player.name, " ", msg);
endif
player:tell("You can't pick up ", dobj.name, ", so it tumbles onto the floor.");
else
player:tell(this:remove_fail_msg());
if (msg = this:oremove_fail_msg())
player.location:announce(player.name, " ", msg);
endif
endif
endif
endif
.
#8:2
pass();
if (!this.dark)
this:tell_contents();
endif
.
#8:3
return !is_player(args[1]);
.
#8:4
if (this.opened)
player:tell("It's already open.");
"elseif (this:is_openable_by(player))";
elseif (this:is_openable_by(callers() ? caller_perms() | player))
this:set_opened(1);
player:tell(this:open_msg());
if (msg = this:oopen_msg())
player.location:announce(player.name, " ", msg);
endif
else
player:tell(this:open_fail_msg());
if (msg = this:oopen_fail_msg())
player.location:announce(player.name, " ", msg);
endif
endif
.
#8:5
set_task_perms(player);
key = $lock_utils:parse_keyexp(iobjstr, player);
if (typeof(key) == STR)
player:tell("That key expression is malformed:");
player:tell("  ", key);
else
res = (this.open_key = key);
if (typeof(res) == ERR)
player:tell(res, ".");
else
player:tell("Locked opening of ", this.name, " with this key:");
player:tell("  ", $lock_utils:unparse_key(key));
endif
endif
.
#8:6
return (this.open_key == 0) || $lock_utils:eval_key(this.open_key, args[1]);
.
#8:7
if (!this.opened)
player:tell("It's already closed.");
else
this:set_opened(0);
player:tell(this:close_msg());
if (msg = this:oclose_msg())
player.location:announce(player.name, " ", msg);
endif
endif
.
#8:8
set_task_perms(player);
res = (dobj.open_key = 0);
if (typeof(res) == ERR)
player:tell(res, ".");
else
player:tell("Unlocked ", dobj.name, " for opening.");
endif
.
#8:9
if (this.contents)
player:tell("Contents:");
for thing in (this.contents)
player:tell("  ", thing:title());
endfor
elseif (msg = this:empty_msg())
player:tell(msg);
endif
.
#8:10
if (!$perm_utils:controls(caller.owner, this))
return E_PERM;
else
this.opened = (opened = (!(!args[1])));
this.dark = (this.opaque > opened);
return opened;
endif
.
#8:11
if (!$perm_utils:controls(player, this))
player:tell("Can't set opacity of something you don't own.");
elseif ((iobjstr != "0") && (!tonum(iobjstr)))
player:tell("Opacity must be an integer (0, 1, 2).");
else
player:tell("Opacity changed:  Now " + {"transparent.", "opaque.", "a black hole."}[1 + this:set_opaque(tonum(iobjstr))]);
endif
.
#8:12
if (!$perm_utils:controls(caller.owner, this))
return E_PERM;
elseif (typeof(number = args[1]) != NUM)
return E_INVARG;
else
number = ((number < 0) ? 0 | ((number > 2) ? 2 | number));
this.dark = (number > this.opened);
return this.opaque = number;
endif
.
#8:13
return (msg = this.(verb)) ? $string_utils:pronoun_sub(msg) | "";
.
#9:0
if (!this:is_readable_by(valid(caller_perms()) ? caller_perms() | player))
player:tell("Sorry, but it seems to be written in some code that you can't read.");
else
this:look_self();
player:tell();
for line in (this:text())
player:tell(line);
endfor
player:tell();
player:tell("(You finish reading.)");
endif
.
#9:1
if (this:is_writable_by(valid(caller_perms()) ? caller_perms() | player))
this:set_text({});
player:tell("Note erased.");
else
player:tell("You can't erase this note.");
endif
.
#9:2
if (this:is_writable_by(valid(caller_perms()) ? caller_perms() | player))
this:set_text({@this.text, dobjstr});
player:tell("Line added to note.");
else
player:tell("You can't write on this note.");
endif
.
#9:3
if (!this:is_writable_by(player))
player:tell("You can't modify this note.");
elseif (!dobjstr)
player:tell("You must tell me which line to delete.");
else
line = tonum(dobjstr);
if (line < 0)
line = ((line + length(this.text)) + 1);
endif
if ((line <= 0) || (line > length(this.text)))
player:tell("Line out of range.");
else
this:set_text(listdelete(this.text, line));
player:tell("Line deleted.");
endif
endif
.
#9:4
set_task_perms(player);
key = $lock_utils:parse_keyexp(iobjstr, player);
if (typeof(key) == STR)
player:tell("That key expression is malformed:");
player:tell("  ", key);
else
res = (this.encryption_key = key);
if (typeof(res) == ERR)
player:tell(res, ".");
else
player:tell("Encrypted ", this.name, " with this key:");
player:tell("  ", $lock_utils:unparse_key(key));
endif
endif
.
#9:5
set_task_perms(player);
res = (dobj.encryption_key = 0);
if (typeof(res) == ERR)
player:tell(res, ".");
else
player:tell("Decrypted ", dobj.name, ".");
endif
.
#9:6
cp = caller_perms();
if ($perm_utils:controls(cp, this) || this:is_readable_by(cp))
return this.text;
else
return E_PERM;
endif
.
#9:7
key = this.encryption_key;
return (!key) || $lock_utils:eval_key(key, args[1]);
.
#9:8
cp = caller_perms();
newtext = args[1];
if ($perm_utils:controls(cp, this) || this:is_writable_by(cp))
if (typeof(newtext) == LIST)
this.text = newtext;
else
return E_TYPE;
endif
else
return E_PERM;
endif
.
#9:9
who = args[1];
wr = this.writers;
if ($perm_utils:controls(who, this))
return 1;
elseif (typeof(wr) == LIST)
return who in wr;
else
return wr;
endif
.
#9:10
"Usage:  mailme <note>";
"  uses $network to sends the text of this note to your REAL internet email address.";
if (!this:is_readable_by(player))
player:tell("Sorry, but it seems to be written in some code that you can't read.");
elseif (!player.email_address)
player:tell("Sorry, you don't have a registered email address.");
return;
elseif (!$network.active)
player:tell("Sorry, internet mail is disabled.");
elseif (!(text = this:text()))
player:tell($string_utils:pronoun_sub("%T is empty--there wouldn't be any point to mailing it."));
return;
endif
player:tell("Mailing ", this:title(), " to ", player.email_address, ".");
player:tell("... ", length(text), " lines ...");
suspend(0);
$network:sendmail(player.email_address, this:titlec(), @text);
.
#10:0
raw = ctime(this.last_write_time);
"         111111111122222";
"123456789012345678901234";
"Fri Nov 30 14:31:21 1990";
date = ((raw[1..10] + ",") + raw[20..24]);
return strsub(this.description, "%d", date);
.
#10:1
pass(@args);
pos = (player in this.readers);
if (pos)
this.readtimes[pos] = time();
elseif (!$object_utils:isa(player, $guest))
this.readers = {@this.readers, player};
this.readtimes = {@this.readtimes, time()};
endif
.
#10:2
who = caller;
pos = (who in this.readers);
if (pos)
if (this.readtimes[pos] < this.last_write_time)
this:announce_new_edition(who);
endif
else
who:notify("Don't forget to take a look at the newspaper.  Type 'news' to see it.");
endif
.
#10:3
if ($perm_utils:controls(valid(caller_perms()) ? caller_perms() | player, this))
this.last_write_time = time();
for p in (connected_players())
this:announce_new_edition(p);
endfor
if (callers() == {})
player:notify("The newspaper has been marked as newly-edited.");
endif
else
player:notify("Permission denied.");
endif
.
#10:4
if (caller_perms().wizard)
pass();
this:set_text({"There's no news unless you write it."});
this.description = "It's the latest issue of the MOO Herald-Examiner, dated %d.";
this.take_failed_msg = "Realizing that the newspaper is to be shared among all of the players, you change your mind about picking it up.";
this.readtimes = (this.readers = (this.writers = {}));
else
return E_PERM;
endif
.
#10:5
if (caller == this)
args[1]:notify("There's a new edition of the newspaper.  Type 'news' to see it.");
endif
.
#10:6
if (!$perm_utils:controls(player, this))
player:tell("Sorry, you can't hack on the newspaper.");
else
original = length(this.readers);
newplayers = {};
newtimes = {};
index = 0;
for p in (this.readers)
index = (index + 1);
if (valid(p) && is_player(p))
newplayers = {@newplayers, p};
newtimes = {@newtimes, this.readtimes[index]};
endif
$command_utils:suspend_if_needed(0);
endfor
this.readers = newplayers;
this.readtimes = newtimes;
player:tell("Done.  Removed ", original - length(this.readtimes), " bogus readers.");
endif
.
#10:7
if (this:is_writable_by(caller_perms()))
this.last_write_time = time();
return pass(@args);
else
return E_PERM;
endif
.
#11:0
junk = {};
while (1)
for x in (junk)
$command_utils:suspend_if_needed(0);
if (x in this.contents)
"This is old junk that's still around five minutes later.  Clean it up.";
if (!valid(x.owner))
move(x, $nothing);
#2:tell(">**> Cleaned up orphan object `", x.name, "' (", x, "), owned by ", x.owner, ", to #-1.");
elseif (!$object_utils:contains(x, x.owner))
move(x, x.owner);
x.owner:tell("You shouldn't leave junk in ", this.name, "; ", x.name, " (", x, ") has been moved to your inventory.");
#2:tell(">**> Cleaned up `", x.name, "' (", x, "), owned by `", x.owner.name, "' (", x.owner, "), to ", x.owner, ".");
endif
endif
endfor
junk = {};
for x in (this.contents)
if ((seconds_left() < 2) || (ticks_left() < 1000))
suspend(0);
endif
if (!is_player(x))
junk = {@junk, x};
endif
endfor
suspend(5 * 60);
endwhile
.
#11:1
who = args[1];
if (who.home == this)
move(who, $limbo);
this:announce("You hear a quiet popping sound; ", who.name, " has disconnected.");
else
pass(who);
endif
.
#11:2
who = args[1];
if ($limbo:acceptable(who))
move(who, $limbo);
else
pass(who);
endif
.
#11:3
m = pass(@args);
if (m == $failed_match)
"... it might be a player off in the body bag...";
m = $string_utils:match_player(args[1]);
if (valid(m) && (!(m.location in {this, this.body_bag})))
return $failed_match;
endif
endif
return m;
.
#11:4
if (!caller_perms().wizard)
return E_PERM;
endif
for v in ({"turn", "open"})
delete_verb($player_start, v);
endfor
for p in ({"out"})
delete_property($player_start, p);
endfor
for p in ($object_utils:all_properties($room))
clear_property($player_start, p);
endfor
$player_start.name = "The First Room";
$player_start.aliases = {};
$player_start.description = "This is all there is right now.";
$player_start.exits = ($player_start.entrances = {});
.
#12:0
if (caller != #0)
return E_PERM;
else
clist = {};
for i in [0..length(verbs(this)) - 1]
if ((verb_args(this, tostr(i)) == {"any", "none", "any"}) && index((info = verb_info(this, tostr(i)))[2], "x"))
vname = $string_utils:explode(info[3])[1];
star = index(vname + "*", "*");
clist = {@clist, $string_utils:uppercase(vname[1..star - 1]) + strsub(vname[star..length(vname)], "*", "")};
endif
endfor
notify(player, "I don't understand that.  Valid commands at this point are");
notify(player, "   " + $string_utils:english_list(setremove(clist, "?"), "", " or "));
return 0;
endif
.
#12:1
if (caller != #0)
return E_PERM;
else
msg = this.welcome_message;
version = server_version();
for line in ((typeof(msg) == LIST) ? msg | {msg})
if (typeof(line) == STR)
notify(player, strsub(line, "%v", version));
endif
endfor
this:check_player_db();
this:check_for_shutdown();
return 0;
endif
.
#12:2
masked = ($login.who_masks_wizards ? $wiz_utils:connected_wizards() | {});
if (caller != #0)
return E_PERM;
elseif (!args)
$code_utils:show_who_listing($set_utils:difference(connected_players(), masked)) || this:notify("No one logged in.");
else
plyrs = listdelete($command_utils:player_match_result($string_utils:match_player(args), args), 1);
$code_utils:show_who_listing(plyrs, $set_utils:intersection(plyrs, masked));
endif
return 0;
.
#12:3
you_lose_msg = "Either that player does not exist, or has a different password.";
if (caller != #0)
return E_PERM;
"...caller isn't :do_login_command...";
elseif (!(length(args) in {1, 2}))
notify(player, tostr("Usage:  ", verb, " <existing-player-name> <password>"));
elseif (!valid(candidate = (orig_candidate = this:_match_player(name = strsub(args[1], " ", "_")))))
notify(player, you_lose_msg);
"...unknown player...";
elseif ((typeof(candidate.password) == STR) && ((length(candidate.password) < 2) || (crypt({@args, ""}[2], candidate.password[1..2]) != candidate.password)))
notify(player, you_lose_msg);
"...bad password...";
server_log(tostr("FAILED CONNECT: ", args[1], " (", candidate, ") on ", connection_name(player), ($string_utils:connection_hostname(connection_name(player)) in candidate.all_connect_places) ? "" | "******"));
elseif ((parent(candidate) == $guest) && (!valid(candidate = candidate:defer())))
notify(player, (candidate == #-2) ? "Sorry, guest characters are not allowed from your site." | "Sorry, all of our guest characters are in use right now.");
else
if (candidate != orig_candidate)
notify(player, tostr("Okay,... ", name, " is in use.  Logging you in as `", candidate.name, "'"));
endif
this:record_connection(candidate);
return candidate;
endif
return 0;
.
#12:4
if (caller != #0)
return E_PERM;
"... caller isn't :do_login_command()...";
elseif (!this:player_creation_enabled(player))
notify(player, this:registration_string());
"... we've disabled player creation ...";
elseif (length(args) != 2)
notify(player, tostr("Usage:  ", verb, " <new-player-name> <new-password>"));
elseif ($player_db.frozen)
notify(player, "Sorry, can't create any new players right now.  Try again in a few minutes.");
elseif ((!(name = args[1])) || (name == "<>"))
notify(player, "You can't have a blank name!");
if (name)
notify(player, "Also, don't use angle brackets (<>).");
endif
elseif ((name[1] == "<") && (name[length(name)] == ">"))
notify(player, "Try that again but without the angle brackets, e.g.,");
notify(player, tostr(" ", verb, " ", name[2..length(name) - 1], " ", strsub(strsub(args[2], "<", ""), ">", "")));
notify(player, "This goes for other commands as well.");
elseif (index(name, " "))
notify(player, "Sorry, no spaces are allowed in player names.  Use dashes or underscores.");
"... lots of routines depend on there not being spaces in player names...";
elseif ((!$player_db:available(name)) || (this:_match_player(name) != $failed_match))
notify(player, "Sorry, that name is not available.  Please choose another.");
"... note the :_match_player call is not strictly necessary...";
"... it is merely there to handle the case that $player_db gets corrupted.";
elseif (!(password = args[2]))
notify(player, "You must set a password for your player.");
else
new = create($player_class, $nothing);
set_player_flag(new, 1);
new.name = name;
new.aliases = {name};
new.programmer = $player_class.programmer;
new.password = crypt(password);
new.last_connect_time = $maxint;
"Last disconnect time is creation time, until they login.";
new.last_disconnect_time = time();
"make sure the owership quota isn't clear!";
new.ownership_quota = new.ownership_quota;
this:record_connection(new);
move(new, $player_start);
$player_db:insert(name, new);
return new;
endif
return 0;
.
#12:5
if (caller != #0)
return E_PERM;
else
boot_player(player);
return 0;
endif
.
#12:6
if (caller != #0)
return E_PERM;
else
notify(player, tostr("The server has been up for ", $time_utils:english_time(time() - $last_restart_time), "."));
return 0;
endif
.
#12:7
if (caller != #0)
return E_PERM;
else
notify(player, tostr("The MOO is currently running version ", server_version(), " of the LambdaMOO server code."));
return 0;
endif
.
#12:8
":parse_command(@args) => {verb, args}";
"Given the args from #0:do_login_command,";
"  returns the actual $login verb to call and the args to use.";
"Commands available to not-logged-in users should be located on this object and given the verb_args \"any none any\"";
if (caller != #0)
return E_PERM;
endif
if (!args)
return {this.blank_command, @args};
elseif ((verb = args[1]) && ((verb_args(this, verb) == {"any", "none", "any"}) && index(verb_info(this, verb)[2], "x")))
return args;
else
return {this.bogus_command, @args};
endif
.
#12:9
when = ($shutdown_time - time());
if (when >= 0)
line = "***************************************************************************";
notify(player, "");
notify(player, "");
notify(player, line);
notify(player, line);
notify(player, "****");
notify(player, ("****  WARNING:  The server will shut down in " + $time_utils:english_time(when - (when % 60))) + ".");
for piece in ($generic_editor:fill_string($shutdown_message, 60))
notify(player, "****            " + piece);
endfor
notify(player, "****");
notify(player, line);
notify(player, line);
notify(player, "");
notify(player, "");
endif
.
#12:10
if ($player_db.frozen)
line = "***************************************************************************";
notify(player, "");
notify(player, line);
notify(player, "***");
for piece in ($generic_editor:fill_string("The character-name matcher is currently being reloaded.  This means your character name might not be recognized even though it still exists.  Don't panic.  You can either wait for the reload to finish or you can connect using your object number if you remember it (e.g., `connect #1234 yourpassword').", 65))
notify(player, "***       " + piece);
endfor
if (this:player_creation_enabled(player))
notify(player, "***       This also means that character creation is disabled.");
endif
notify(player, "***");
notify(player, line);
notify(player, "");
endif
.
#12:11
":_match_player(name)";
"This is the matching routine used by @connect.";
"returns either a valid player corresponding to name or $failed_match.";
name = args[1];
if (valid(candidate = $string_utils:literal_object(name)) && is_player(candidate))
return candidate;
endif
".....uncomment this to trust $player_db and have `connect' recognize aliases";
if (valid(candidate = $player_db:find_exact(name)) && is_player(candidate))
return candidate;
endif
".....uncomment this if $player_db gets hosed and you want by-name login";
". for candidate in (players())";
".   if (candidate.name == name)";
".     return candidate; ";
".   endif ";
". endfor ";
".....";
return $failed_match;
.
#12:12
set_task_perms(caller_perms());
notify(player, args[1]);
.
#12:13
"keeps bad things from happening if someone brings this object into a room and talks to it.";
return 0;
.
#12:14
"Accepts a player object.  If player creation is enabled for that player object, then return true.  Otherwise, return false.";
"Default implementation checks the player's connecting host via $login:blacklisted to decide.";
if (caller_perms().wizard)
return this.create_enabled && (!this:blacklisted($string_utils:connection_hostname(connection_name(args[1]))));
else
return E_PERM;
endif
.
#12:15
return $string_utils:subst(this.(verb), {{"%e", this.registration_address}, {"%%", "%"}});
.
#12:16
if (caller_perms().wizard)
pass();
this.max_connections = 999999;
this.unlimited_hosts = {"localhost"};
this.bogus_command = "?";
this.blank_command = "help";
this.create_enabled = 1;
this.registration_address = "";
this.registration_string = "Character creation is disabled.";
this.newt_registration_string = "Your character is temporarily hosed.";
this.welcome_message = {"Welcome to the LambdaCore database.", "", "Type 'connect wizard' to log in.", "", "You will probably want to change this text, which is stored in $login.welcome_message."};
this.redlist = (this.blacklist = (this.graylist = (this.spooflist = {{}, {}})));
this.who_masks_wizards = 0;
if ("monitor" in properties(this))
delete_property(this, "monitor");
endif
if ("monitor" in verbs(this))
delete_verb(this, "monitor");
endif
if ("special_action" in verbs(this))
set_verb_code(this, "special_action", {});
endif
endif
.
#12:17
.
#12:18
":blacklisted(hostname) => is hostname on the .blacklist";
":graylisted(hostname)  => is hostname on the .graylist";
":redlisted(hostname)   => is hostname on the .redlist";
sitelist = this.(this:listname(verb));
if (!caller_perms().wizard)
return E_PERM;
elseif (((hostname = args[1]) in sitelist[1]) || (hostname in sitelist[2]))
return 1;
elseif ($site_db:domain_literal(hostname))
for lit in (sitelist[1])
if ((index(hostname, lit) == 1) && ((hostname + ".")[length(lit) + 1] == "."))
return 1;
endif
endfor
else
for dom in (sitelist[2])
if (index(dom, "*"))
"...we have a wildcard; let :match_string deal with it...";
if ($string_utils:match_string(hostname, dom))
return 1;
endif
else
"...tail of hostname ...";
if ((r = rindex(hostname, dom)) && ((("." + hostname)[r] == ".") && (((r - 1) + length(dom)) == length(hostname))))
return 1;
endif
endif
endfor
endif
return 0;
.
#12:19
if (!caller_perms().wizard)
return E_PERM;
endif
where = args[1];
lname = this:listname(verb);
which = (1 + (!$site_db:domain_literal(where)));
this.(lname)[which] = setadd(this.(lname)[which], where);
return 1;
.
#12:20
if (!caller_perms().wizard)
return E_PERM;
endif
where = args[1];
lname = this:listname(verb);
which = (1 + (!$site_db:domain_literal(where)));
if (where in this.(lname)[which])
this.(lname)[which] = setremove(this.(lname)[which], where);
return 1;
else
return E_INVARG;
endif
.
#12:21
return {"???", "blacklist", "graylist", "redlist", "spooflist"}[1 + index("bgrs", (args[1] || "?")[1])];
.
#12:22
":record_connection(plyr) update plyr's connection information";
"to reflect impending login.";
if (!caller_perms().wizard)
return E_PERM;
else
plyr = args[1];
plyr.first_connect_time = min(time(), plyr.first_connect_time);
plyr.previous_connection = {plyr.last_connect_time, $string_utils:connection_hostname(plyr.last_connect_place)};
plyr.last_connect_time = time();
plyr.last_connect_place = (cn = connection_name(player));
chost = $string_utils:connection_hostname(cn);
acp = setremove(plyr.all_connect_places, chost);
plyr.all_connect_places = {chost, @acp[1..min(length(acp), 15)]};
if (parent(plyr) != $guest)
$site_db:add(plyr, chost);
endif
endif
.
#12:23
if (caller != #0)
return E_PERM;
elseif (!args)
$code_utils:show_who_listing(connected_players()) || this:notify("No one logged in.");
else
plyrs = listdelete($command_utils:player_match_result($string_utils:match_player(args), args), 1);
$code_utils:show_who_listing(plyrs);
endif
return 0;
.
#13:0
"{last_huh}  @<msg_name> <object> is [<text>]";
"If <text> is given calls <object>:set_message(<msg_name>,<text>),";
"otherwise prints the value of the specified message property";
set_task_perms(caller_perms());
nargs = length(args);
pos = ("is" in args);
if (pos == 1)
player:notify(tostr("Usage:  ", verb, " <object> is <message>"));
return;
endif
dobjstr = $string_utils:from_list(args[1..pos - 1], " ");
message = $string_utils:from_list(args[pos + 1..nargs], " ");
msg_name = verb[2..length(verb)];
dobj = player:my_match_object(dobjstr);
if ($command_utils:object_match_failed(dobj, dobjstr))
"... oh well ...";
elseif (pos == nargs)
if (E_PROPNF == (get = dobj.(msg_name + "_msg")))
player:notify(tostr(dobj.name, " (", dobj, ") has no \"", msg_name, "\" message."));
elseif (typeof(get) == ERR)
player:notify(tostr(get));
elseif (!get)
player:notify("Message is not set.");
else
player:notify(tostr("The \"", msg_name, "\" message of ", dobj.name, " (", dobj, "):"));
player:notify(tostr(get));
endif
else
set = dobj:set_message(msg_name, message);
if (set)
if (typeof(set) == STR)
player:notify(set);
else
player:notify(tostr("You set the \"", msg_name, "\" message of ", dobj.name, " (", dobj, ")."));
endif
elseif (set == E_PROPNF)
player:notify(tostr(dobj.name, " (", dobj, ") has no \"", msg_name, "\" message to set."));
elseif (typeof(set) == ERR)
player:notify(tostr(set));
else
player:notify(tostr("You clear the \"", msg_name, "\" message of ", dobj.name, " (", dobj, ")."));
endif
endif
.
#13:1
"{last_huh}  give any to any";
"a give \"verb\" that works for non-$things.";
set_task_perms(caller_perms());
if (((verb == "give") && (dobjstr == "up")) && (!prepstr))
player:tell("Try this instead: @quit");
elseif (dobj == $nothing)
player:tell("What do you want to give?");
elseif (iobj == $nothing)
player:tell("To whom/what do you want to give it?");
elseif ($command_utils:object_match_failed(dobj, dobjstr) || $command_utils:object_match_failed(iobj, iobjstr))
"...lose...";
elseif (dobj.location != player)
player:tell("You don't have that!");
elseif (iobj.location != player.location)
player:tell("I don't see ", iobj.name, " here.");
else
dobj:moveto(iobj);
if (dobj.location == iobj)
player:tell("You give ", dobj:title(), " to ", iobj.name, ".");
iobj:tell(player.name, " gives you ", dobj:title(), ".");
else
player:tell("Either that doesn't want to be given away or ", iobj.name, " doesn't want it.");
endif
endif
.
#13:2
"{last_huh}  get/take any";
"a take \"verb\" that works for non-$things.";
set_task_perms(caller_perms());
if (dobj == $nothing)
player:tell(verb, " what?");
elseif ($command_utils:object_match_failed(dobj, dobjstr))
"...lose...";
elseif (dobj.location == player)
player:tell("You already have that!");
elseif (dobj.location != player.location)
player:tell("I don't see that here.");
else
dobj:moveto(player);
if (dobj.location == player)
player:tell("Taken.");
player.location:announce(player.name, " takes ", dobj.name, ".");
else
player:tell("You can't pick that up.");
endif
endif
.
#13:3
"{last_huh}  drop/throw any";
"a drop \"verb\" that works for non-$things.";
set_task_perms(caller_perms());
if (dobj == $nothing)
player:tell(verb, " what?");
elseif ($command_utils:object_match_failed(dobj, dobjstr))
"...lose...";
elseif (dobj.location != player)
player:tell("You don't have that.");
elseif (!player.location:acceptable(dobj))
player:tell("You can't drop that here.");
else
dobj:moveto(player.location);
if (dobj.location == player.location)
player:tell_lines((verb[1] == "d") ? "Dropped." | "Thrown.");
player.location:announce(player.name, (verb[1] == "d") ? " dropped " | " threw away ", dobj.name, ".");
else
player:tell_lines("You can't seem to drop that here.");
endif
endif
.
#14:0
":enter(who,islogin,time,site)";
"adds an entry to the connection log for a given guest (caller).";
if ($object_utils:isa(caller, $guest))
$guest_log.connections = {{caller, @args}, @$guest_log.connections[1..min(99, length($guest_log.connections))]};
else
return E_PERM;
endif
.
#14:1
set_task_perms(caller_perms());
howmany = min({@args, 0}[1] || $maxint, length($guest_log.connections));
if (!caller_perms().wizard)
player:notify("Sorry.");
else
current = {};
listing = {};
last = 0;
for c in ($guest_log.connections[1..howmany])
if (c[2])
"...login...";
if (a = $list_utils:assoc(c[1], current))
listing[a[2]][3] = c[3];
current = setremove(current, a);
else
listing = {@listing, {c[1], c[4], c[3], -idle_seconds(c[1])}};
last = (last + 1);
endif
else
"...logout...";
listing = {@listing, {c[1], c[4], 0, c[3]}};
last = (last + 1);
if (i = $list_utils:iassoc(c[1], current))
current[i][2] = last;
else
current = {@current, {c[1], last}};
endif
endif
endfor
su = $string_utils;
player:notify(su:left(su:left(su:left("Guest", 20) + "Connected", 36) + "Idle/Disconn.", 52) + "From");
player:notify(su:left(su:left(su:left("-----", 20) + "---------", 36) + "-------------", 52) + "----");
for l in (listing)
on = (l[3] ? (ct = ctime(l[3]))[1..3] + ct[9..19] | "earlier");
off = ((l[4] > 0) ? (ct = ctime(l[4]))[1..3] + ct[9..19] | ("  " + $string_utils:from_seconds(-l[4])));
player:notify(su:left(su:left(su:right(tostr(strsub(l[1].name, "uest", "."), " (", l[1], ")  "), 20) + on, 36) + off, 52) + l[2]);
endfor
endif
.
#14:2
if (caller_perms().wizard)
pass(@args);
this.connections = {};
endif
.
#15:0
":length(tree) => number of leaves in tree.";
return args[1] ? args[1][2] | 0;
.
#15:1
":find_nth(tree,n) => nth leaf of tree.  Assumes n in [1..tree[2]]";
return this:_find_nth(caller, @args);
.
#15:2
":_find_ord(tree,n,comp) ";
" => index of rightmost leaf for which :(comp)(n,:_ord(leaf)) is false.";
"returns 0 if true for all leaves.";
return args[1] ? this:_find_ord(caller, @args) | 0;
.
#15:3
":set_nth(tree,n,value) => tree";
"modifies tree so that nth leaf == value";
if (((n = args[2]) < 1) || ((!(tree = args[1])) || (tree[2] < n)))
return E_RANGE;
else
this:_set_nth(caller, @args);
return (n != 1) ? tree | listset(tree, caller:_ord(args[3]), 3);
endif
.
#15:4
":kill(tree[,leafverb]) deletes tree and _kills all of the nodes that it uses.";
"if leafverb is given, caller:leafverb is called on all leaves in tree.";
if (tree = args[1])
lverb = {@args, ""}[2];
this:_skill(caller, (typeof(tree) == LIST) ? tree[1] | tree, lverb);
endif
"... otherwise nothing to do...";
.
#15:5
":insert_after(tree,subtree,n)";
":insert_before(tree,subtree,n)";
"  inserts subtree after (before) the nth leaf of tree,";
"  returning the resulting tree.";
subtree = args[2];
if (tree = args[1])
if (subtree)
where = (args[3] - (verb == "insert_before"));
if (where <= 0)
return this:_merge(caller, subtree, tree);
elseif (where >= tree[2])
return this:_merge(caller, tree, subtree);
else
s = this:_split(caller, caller:_get(tree[1])[1], where, tree);
return this:_merge(caller, this:_merge(caller, s[1], subtree), s[2]);
endif
else
return tree;
endif
else
return subtree;
endif
.
#15:6
":extract_range(tree,first,last) => {newtree,extraction}";
return this:_extract(caller, @args);
.
#15:7
":delete_range(tree,first,last[,leafkill]) => newtree";
extract = this:_extract(caller, @args);
if (die = extract[2])
this:_skill(caller, die[1], {@args, ""}[4]);
endif
return extract[1];
.
#15:8
":keep_range(tree,first,last[,leafkill]) => range";
extract = this:_extract(caller, @args);
if (die = extract[1])
this:_skill(caller, die[1], {@args, ""}[4]);
endif
return extract[2];
.
#15:9
":insert_last(tree,insert) => newtree";
"insert a new leaf to be inserted at the righthand end of the tree";
tree = args[1];
insert = args[2];
if (!tree)
return {caller:_make(0, {insert}), 1, caller:_ord(insert)};
endif
hgt = caller:_get(tree[1]);
rspine = {{tree, plen = length(kids = hgt[2])}};
for i in [1..hgt[1]]
parent = kids[plen];
kids = caller:_get(parent[1])[2];
plen = length(kids);
rspine = {{parent, plen}, @rspine};
endfor
iord = caller:_ord(insert);
for h in [1..length(rspine)]
"... tree is the plen'th (rightmost) child of parent...";
if (rspine[h][2] < this.maxfanout)
parent = rspine[h][1];
hgp = caller:_get(parent[1]);
caller:_put(parent[1], @listset(hgp, {@hgp[2], insert}, 2));
for p in (rspine[h + 1..length(rspine)])
rkid = listset(parent, parent[2] + 1, 2);
parent = p[1];
hgp = caller:_get(parent[1]);
caller:_put(parent[1], @listset(hgp, listset(hgp[2], rkid, p[2]), 2));
endfor
return listset(tree, tree[2] + 1, 2);
endif
insert = {caller:_make(h - 1, {insert}), 1, iord};
endfor
return {caller:_make(length(rspine), {tree, insert}), tree[2] + 1, tree[3]};
.
#15:10
":start(tree,first,last) => {list of leaf nodes, @handle}";
"handle is of the form {{node,next,size}...}";
if (tree = args[1])
before = max(0, args[2] - 1);
howmany = (min(args[3], tree[2]) - before);
if (howmany <= 0)
return {};
else
spine = {};
for h in [1..caller:_get(tree[1])[1]]
ik = this:_listfind_nth(kids = caller:_get(tree[1])[2], before);
newh = (kids[ik[1]][2] - ik[2]);
if (newh < howmany)
spine = {{tree[1], ik[1] + 1, howmany - newh}, @spine};
howmany = newh;
endif
tree = kids[ik[1]];
before = ik[2];
endfor
return {caller:_get(tree[1])[2][before + 1..before + howmany], @spine};
endif
else
return {};
endif
.
#15:11
":next(@handle) => {list of more leaf nodes, @newhandle}";
if (args)
spine = listdelete(args, 1);
node = args[1][1];
n = args[1][2];
size = args[1][3];
for h in [1..caller:_get(node)[1]]
nnode = caller:_get(node)[2][n];
if (size > nnode[2])
spine = {{node, n + 1, size - nnode[2]}, @spine};
size = nnode[2];
endif
n = 1;
node = nnode[1];
endfor
return {caller:_get(node)[2][n..size], @spine};
else
return {};
endif
.
#15:12
":_find_nth(home,tree,n) => nth leaf of tree.";
"...Assumes n in [1..tree[2]]";
if (caller != this)
return E_PERM;
endif
home = args[1];
tree = args[2];
n = args[3];
if ((p = home:_get(tree[1]))[1])
for k in (p[2])
if (n > k[2])
n = (n - k[2]);
else
return this:_find_nth(home, k, n);
endif
endfor
return E_RANGE;
else
return p[2][n];
endif
.
#15:13
":_find_ord(home,tree,n,comp) ";
" => index of rightmost leaf for which :(comp)(n,:_ord(leaf)) is false.";
"returns 0 if true for all leaves.";
if (caller != this)
return E_PERM;
endif
home = args[1];
tree = args[2];
n = args[3];
comp = args[4];
if ((p = home:_get(tree[1]))[1])
sz = tree[2];
for i in [-length(p[2])..-1]
k = p[2][-i];
sz = (sz - k[2]);
if (!home:(comp)(n, k[3]))
return sz + this:_find_ord(home, k, n, comp);
endif
endfor
return 0;
else
for i in [1..r = length(p[2])]
if (home:(comp)(n, home:_ord(p[2][i])))
return i - 1;
endif
endfor
return r;
endif
.
#15:14
":_set_nth(home,tree,n,value) => tree[n] = value";
"Assumes n in [1..tree[2]]";
if (caller != this)
return E_PERM;
endif
home = args[1];
tree = args[2];
n = args[3];
value = args[4];
if ((p = home:_get(tree[1]))[1])
ik = this:_listfind_nth(p[2], n - 1);
this:_set_nth(home, p[2][ik[1]], ik[2] + 1, value);
if (!ik[2])
p[2][ik[1]][3] = home:_ord(value);
home:_put(tree[1], @p);
endif
else
p[2][n] = value;
home:_put(tree[1], @p);
endif
.
#15:15
":_skill(home,node,leafverb)";
"home:_kill's node and all descendants, home:(leafverb)'s all leaves";
if (caller != this)
return E_PERM;
endif
home = args[1];
hgn = (home:_get(node = args[2]) || {0, {}});
lverb = args[3];
if (hgn[1])
for kid in (hgn[2])
this:_skill(home, kid[1], lverb);
endfor
elseif (lverb)
for kid in (hgn[2])
home:(lverb)(kid);
endfor
endif
home:_kill(node);
.
#15:16
":_extract(home,tree,first,last) => {newtree,extraction}";
if (caller != this)
return E_PERM;
endif
home = args[1];
if (!(tree = args[2]))
return {{}, {}};
endif
before = max(0, args[3] - 1);
end = min(tree[2], args[4]);
if ((end <= 0) || (before >= end))
return {tree, {}};
endif
height = home:_get(tree[1])[1];
if (end < tree[2])
r = this:_split(home, height, end, tree);
if (before)
l = this:_split(home, height, before, r[1]);
extract = l[2];
newtree = this:_merge(home, l[1], r[2]);
else
extract = r[1];
newtree = r[2];
endif
elseif (before)
l = this:_split(home, height, before, tree);
extract = l[2];
newtree = l[1];
else
return {{}, tree};
endif
return {this:_scrunch(home, newtree), this:_scrunch(home, extract)};
.
#15:17
"_merge(home,ltree,rtree) => newtree";
"assumes ltree and rtree to be nonempty.";
if (caller != this)
return E_PERM;
endif
home = args[1];
lnode = args[2];
rnode = args[3];
lh = home:_get(lnode[1])[1];
rh = home:_get(rnode[1])[1];
if (lh > rh)
return this:_rmerge(home, lnode, rnode);
endif
for h in [lh + 1..rh]
lnode[1] = home:_make(h, {lnode});
endfor
m = this:_smerge(home, rh, lnode, rnode);
return (length(m) <= 1) ? m[1] | {home:_make(rh + 1, m), m[1][2] + m[2][2], m[1][3]};
.
#15:18
"_smerge(home, height, ltree, rtree) =>{ltree[,rtree]}";
"assumes ltree and rtree are at the given height.";
"merges the trees if the combined number of children is <= maxfanout";
"otherwise returns two trees where ltree is guaranteed minfanout children and rtree is guaranteed the minimum of minfanout and however many children it started with.";
if (caller != this)
return E_PERM;
endif
home = args[1];
height = args[2];
ltree = args[3];
rtree = args[4];
llen = length(lkids = home:_get(ltree[1])[2]);
rlen = length(rkids = home:_get(rtree[1])[2]);
if (height)
m = this:_smerge(home, height - 1, lkids[llen], rkids[1]);
mlen = length(mkids = {@listdelete(lkids, llen), @m, @listdelete(rkids, 1)});
if (mlen <= this.maxfanout)
home:_put(ltree[1], height, mkids);
home:_kill(rtree[1]);
ltree[2] = (ltree[2] + rtree[2]);
return {ltree};
else
S = max(llen - 1, (mlen + 1) / 2);
home:_put(ltree[1], height, mkids[1..S]);
home:_put(rtree[1], height, mkids[S + 1..length(mkids)]);
xfer = (-lkids[llen][2]);
for k in (mkids[llen..S])
xfer = (xfer + k[2]);
endfor
ltree[2] = (ltree[2] + xfer);
rtree[2] = (rtree[2] - xfer);
rtree[3] = mkids[S + 1][3];
return {ltree, rtree};
endif
elseif ((llen * 2) >= this.maxfanout)
return {ltree, rtree};
elseif (this.maxfanout < (llen + rlen))
T = (((rlen - llen) + 1) / 2);
home:_put(ltree[1], 0, {@lkids, @rkids[1..T]});
home:_put(rtree[1], 0, rkids[T + 1..rlen]);
ltree[2] = (ltree[2] + T);
rtree[2] = (rtree[2] - T);
rtree[3] = home:_ord(rkids[T + 1]);
return {ltree, rtree};
else
home:_put(ltree[1], 0, {@lkids, @rkids});
home:_kill(rtree[1]);
ltree[2] = (ltree[2] + rtree[2]);
return {ltree};
endif
.
#15:19
"_split(home, height,lmax,ltree[,@rtrees]}) => {ltree,[mtree,]@rtrees}";
"ltree is split after the lmax'th leaf, the righthand portion grafted onto the leftmost of the rtrees, if possible.  Otherwise we create a new tree mtree, stealing from rtrees[1] if necessary.";
"Assumes 1<=lmax<ltree[2]";
if (caller != this)
return E_PERM;
endif
home = args[1];
height = args[2];
lmax = args[3];
ltree = args[4];
rtrees = args[5..length(args)];
llen = length(lkids = home:_get(ltree[1])[2]);
rlen = length(rkids = (rtrees ? home:_get(rtrees[1][1])[2] | {}));
if (height)
ik = this:_listfind_nth(lkids, lmax);
if (ik[2])
llast = ik[1];
m = this:_split(home, height - 1, ik[2], lkids[llast], @lkids[llast + 1..llen], @rkids);
lkids[llast] = m[1];
mkids = listdelete(m, 1);
else
llast = (ik[1] - 1);
mkids = {@lkids[ik[1]..llen], @rkids};
endif
home:_put(ltree[1], height, lkids[1..llast]);
mlen = length(mkids);
if ((((mlen - rlen) * 2) >= this.maxfanout) || (!rtrees))
"...residue left over from splitting ltree can stand by itself...";
return {listset(ltree, lmax, 2), {home:_make(height, mkids[1..mlen - rlen]), ltree[2] - lmax, mkids[1][3]}, @rtrees};
elseif (mlen <= this.maxfanout)
"...residue left over from splitting ltree fits in rtrees[1]...";
home:_put(rtrees[1][1], height, mkids);
rtrees[1][2] = ((ltree[2] - lmax) + rtrees[1][2]);
rtrees[1][3] = mkids[1][3];
return {listset(ltree, lmax, 2), @rtrees};
else
"...need to steal from rtrees[1]...";
if (llast < llen)
msize = (ltree[2] - lmax);
R = ((mlen - rlen) + 1);
else
msize = 0;
R = 1;
endif
for k in (mkids[R..mlen / 2])
msize = (msize + k[2]);
endfor
home:_put(rtrees[1][1], height, mkids[(mlen / 2) + 1..mlen]);
rtrees[1][2] = ((rtrees[1][2] + ltree[2]) - (lmax + msize));
rtrees[1][3] = mkids[(mlen / 2) + 1][3];
return {listset(ltree, lmax, 2), {home:_make(height, mkids[1..mlen / 2]), msize, mkids[1][3]}, @rtrees};
endif
else
home:_put(ltree[1], 0, lkids[1..lmax]);
if ((((llen - lmax) * 2) >= this.maxfanout) || (!rtrees))
"...residue left over from splitting ltree can stand by itself...";
return {listset(ltree, lmax, 2), {home:_make(0, lkids[lmax + 1..llen]), llen - lmax, home:_ord(lkids[lmax + 1])}, @rtrees};
elseif ((mlen = ((rlen + llen) - lmax)) <= this.maxfanout)
"...residue left over from splitting ltree fits in rtrees[1]...";
home:_put(rtrees[1][1], 0, {@lkids[lmax + 1..llen], @rkids});
rtrees[1][2] = mlen;
rtrees[1][3] = home:_ord(lkids[lmax + 1]);
return {listset(ltree, lmax, 2), @rtrees};
else
"...need to steal from rtrees[1]...";
home:_put(rtrees[1][1], 0, rkids[(R = (((rlen - llen) + lmax) / 2)) + 1..rlen]);
rtrees[1][2] = ((mlen + 1) / 2);
rtrees[1][3] = home:_ord(rkids[R + 1]);
return {listset(ltree, lmax, 2), {home:_make(0, {@lkids[lmax + 1..llen], @rkids[1..R]}), mlen / 2, home:_ord(lkids[lmax + 1])}, @rtrees};
endif
endif
.
#15:20
":_rmerge(home, tree, insertree) => newtree ";
"(newtree is tree with insertree appended to the right)";
"insertree is assumed to be of height < tree";
if (caller != this)
return E_PERM;
endif
home = args[1];
tree = args[2];
insert = args[3];
if (!tree)
return insert;
elseif (!insert)
return tree;
endif
iheight = home:_get(insert[1])[1];
rspine = {};
for i in [iheight + 1..home:_get(tree[1])[1]]
kids = home:_get(tree[1])[2];
tlen = length(kids);
rspine = {{tree, tlen}, @rspine};
tree = kids[tlen];
endfor
isize = insert[2];
m = this:_smerge(home, iheight, tree, insert);
for h in [1..length(rspine)]
plen = rspine[h][2];
parent = rspine[h][1];
hgp = home:_get(parent[1]);
if (((length(m) - 1) + plen) > this.maxfanout)
home:_put(parent[1], @listset(hgp, listset(hgp[2], m[1], plen), 2));
parent[2] = ((parent[2] + isize) - m[2][2]);
m = {parent, listset(m[2], home:_make(h + iheight, {m[2]}), 1)};
else
home:_put(parent[1], @listset(hgp, {@hgp[2][1..plen - 1], @m}, 2));
for p in (rspine[h + 1..length(rspine)])
parent[2] = (parent[2] + isize);
tree = parent;
parent = p[1];
hgp = home:_get(parent[1]);
home:_put(parent[1], @listset(hgp, listset(hgp[2], tree, p[2]), 2));
endfor
return listset(parent, parent[2] + isize, 2);
endif
endfor
return {home:_make((length(rspine) + iheight) + 1, m), m[1][2] + m[2][2], m[1][3]};
.
#15:21
":_scrunch(home,tree) => newtree";
"decapitates single-child nodes from the top of the tree, returns new root.";
if (caller != this)
return E_PERM;
endif
if (tree = args[2])
home = args[1];
while ((n = home:_get(tree[1]))[1] && (length(n[2]) == 1))
home:_kill(tree[1]);
tree = n[2][1];
endwhile
endif
return tree;
.
#15:22
"_listfind_nth(nodelist,key) => {i,k} where i is the smallest i such that the sum of the first i elements of intlist is > key, and k==key - sum(first i-1 elements).";
"1 <= i <= length(intlist)+1";
lst = args[1];
key = args[2];
for i in [1..length(lst)]
key = (key - lst[i][2]);
if (0 > key)
return {i, key + lst[i][2]};
endif
endfor
return {length(lst) + 1, key};
.
#15:23
if (caller != this)
return E_PERM;
endif
.
#15:24
return $perm_utils:controls(caller_perms(), this) ? this:(args[1])(@listdelete(args, 1)) | E_PERM;
.
#16:0
gp = this._genprop;
ngp = "";
for i in [1..length(gp)]
if (gp[i] != "z")
ngp = ((ngp + "bcdefghijklmnopqrstuvwxyz"[index("abcdefghijklmnopqrstuvwxy", gp[i])]) + gp[i + 1..length(gp)]);
return " " + (this._genprop = ngp);
endif
ngp = (ngp + "a");
endfor
return " " + (this._genprop = (ngp + "a"));
.
#16:1
":_make(...) => new node with value {...}";
if (!(caller in {this._mgr, this}))
return E_PERM;
endif
prop = this:_genprop();
add_property(this, prop, args, {this.mowner, ""});
return prop;
.
#16:2
":_kill(node) destroys the given node.";
if (!(caller in {this, this._mgr}))
return E_PERM;
endif
delete_property(this, args[1]);
.
#16:3
return (caller == this._mgr) ? this.(args[1]) | E_PERM;
.
#16:4
return (caller == this._mgr) ? this.(args[1]) = listdelete(args, 1) | E_PERM;
.
#16:5
return args[1][2..3];
.
#16:6
":_makemsg(ord,msg) => leafnode for msg";
"msg = $mail_agent:__convert_new(@args[2])";
msg = args[2];
if (caller != this)
return E_PERM;
elseif (h = ("" in msg))
return {this:_make(@msg[h + 1..length(msg)]), args[1], @msg[1..h - 1]};
else
return {0, args[1], @msg};
endif
.
#16:7
if (caller != this._mgr)
return E_PERM;
elseif (node = args[1][1])
this:_kill(node);
endif
.
#16:8
return args[2];
.
#16:9
return args[3];
.
#16:10
return args[3..length(args)];
.
#16:11
return {@args[3..length(args)], @args[1] ? {"", @this.(args[1])} | {}};
.
#16:12
return args[1] < args[2][1];
.
#16:13
return args[1] < args[2][2];
.
#16:14
if (!this:is_writable_by(caller_perms()))
return E_PERM;
else
new = this:new_message_num();
msgtree = this.messages;
for m in (args)
msgtree = this._mgr:insert_last(msgtree, this:_makemsg(new, m[2]));
new = (new + 1);
if ($command_utils:running_out_of_time())
this.messages = msgtree;
player:tell("... ", new);
suspend(0);
msgtree = this.messages;
new = this:new_message_num();
endif
endfor
this.messages = msgtree;
this.last_used_time = time();
return 1;
endif
.
#16:15
if (!this:is_writable_by(caller_perms()))
return E_PERM;
else
this.messages = this._mgr:insert_last(this.messages, msg = this:_makemsg(new = this:new_message_num(), args[1]));
this.last_msg_date = this:_message_date(@msg);
this.last_used_time = time();
return new;
endif
.
#16:16
if (!this:ok(caller, caller_perms()))
return E_PERM;
elseif (typeof(seq = args[1]) != LIST)
x = this._mgr:find_nth(this.messages, seq);
return {this:_message_num(@x), this:_message_text(@x)};
else
msgs = {};
while (seq)
handle = this._mgr:start(this.messages, seq[1], seq[2] - 1);
while (handle)
for x in (handle[1])
msgs = {@msgs, {this:_message_num(@x), this:_message_text(@x)}};
endfor
handle = this._mgr:next(@listdelete(handle, 1));
$command_utils:suspend_if_needed(0);
endwhile
seq = seq[3..length(seq)];
endwhile
return msgs;
endif
.
#16:17
":display_seq_headers(msg_seq[,cur[,last_read_date]])";
"This is the default header display routine.";
"Prints a list of headers of messages on this to player.  msg_seq is the handle returned by this:parse_message_seq(...).  cur is the player's current message.  last_read_date is the date of the last of the already-read messages.";
if (!this:ok(caller, caller_perms()))
return E_PERM;
endif
getmsg = (this.summary_uses_body ? "_message_text" | "_message_hdr");
seq = args[1];
cur = {@args, 0}[2];
last_old = {@args, $maxint, $maxint}[3];
width = player:linelen();
while (seq)
handle = this._mgr:start(this.messages, seq[1], seq[2] - 1);
while (handle)
for x in (handle[1])
$command_utils:suspend_if_needed(0);
line = tostr($string_utils:right(x[2], 4, (cur == x[2]) ? ">" | " "), (x[3] > last_old) ? ":+ " | ":  ", this:msg_summary_line(@this:(getmsg)(@x)));
player:tell(line[1..min(width, length(line))]);
endfor
handle = this._mgr:next(@listdelete(handle, 1));
endwhile
seq = seq[3..length(seq)];
endwhile
player:tell("----+");
.
#16:18
":display_seq_full(msg_seq[,preamble]) => {cur}";
"This is the default message display routine.";
"Prints the indicated messages on folder to player.  msg_seq is the handle returned by folder:parse_message_seq(...).  Returns the number of the final message in the sequence (to be the new current message number).";
if (!this:ok(caller, caller_perms()))
return E_PERM;
endif
seq = args[1];
preamble = {@args, ""}[2];
cur = (date = 0);
while (seq)
handle = this._mgr:start(this.messages, seq[1], seq[2] - 1);
while (handle)
for x in (handle[1])
cur = this:_message_num(@x);
date = this:_message_date(@x);
player:display_message(preamble ? strsub(preamble, "%d", tostr(cur)) | {}, player:msg_text(@this:_message_text(@x)));
endfor
handle = this._mgr:next(@listdelete(handle, 1));
$command_utils:suspend_if_needed(0);
endwhile
seq = seq[3..length(seq)];
endwhile
return {cur, date};
.
#16:19
if (!this:ok(caller, caller_perms()))
return E_PERM;
endif
len = 0;
getmsg = (this.summary_uses_body ? "_message_text" | "_message_hdr");
for s in (this.messages_going)
len = (len + s[2][2]);
handle = this._mgr:start(s[2], 1, s[2][2]);
while (handle)
for x in (handle[1])
player:tell($string_utils:right(this:_message_num(@x), 4), ":  ", this:msg_summary_line(@this:(getmsg)(@x)));
endfor
handle = this._mgr:next(@listdelete(handle, 1));
endwhile
endfor
if (len)
player:tell("----+");
endif
return len;
.
#16:20
if (!this:ok_write(caller, caller_perms()))
return E_PERM;
endif
msgtree = this.messages;
seq = {};
last = 0;
for s in (this.messages_going)
msgtree = this._mgr:insert_after(msgtree, s[2], last + s[1]);
seq = {@seq, (last + s[1]) + 1, (last = ((last + s[1]) + s[2][2])) + 1};
endfor
this.messages = msgtree;
this.messages_going = {};
this:_fix_last_msg_date();
return seq;
.
#16:21
if (!this:ok_write(caller, caller_perms()))
return E_PERM;
endif
len = 0;
for s in (this.messages_going)
len = (len + s[2][2]);
this._mgr:kill(s[2], "_killmsg");
endfor
this.messages_going = {};
return len;
.
#16:22
seq = args[1];
if (!(this:ok_write(caller, caller_perms()) || (this:ok(caller, caller_perms()) && (seq = this:own_messages_filter(caller_perms(), @args)))))
return E_PERM;
endif
msgtree = this.messages;
save = (nums = {});
onext = 1;
rmmed = 0;
for i in [1..length(seq) / 2]
if ($command_utils:suspend_if_needed(0))
player:tell("... rmm ", onext);
suspend(0);
endif
start = seq[(2 * i) - 1];
next = seq[2 * i];
x = this._mgr:extract_range(msgtree, start - rmmed, (next - 1) - rmmed);
msgtree = x[1];
zmsgs = x[2];
save = {@save, {start - onext, zmsgs}};
nums = {@nums, this:_message_num(@this._mgr:find_nth(zmsgs, 1)), this:_message_num(@this._mgr:find_nth(zmsgs, zmsgs[2])) + 1};
onext = next;
rmmed = ((rmmed + next) - start);
endfor
tmg = this.messages_going;
this.messages_going = save;
fork (0)
for s in (tmg)
this._mgr:kill(s[2], "_killmsg");
endfor
endfork
this.messages = msgtree;
this:_fix_last_msg_date();
return $seq_utils:tostr(nums);
.
#16:23
":renumber([cur]) renumbers caller.messages, doing a suspend() if necessary.";
"  => {number of messages,new cur}.";
if (!this:ok_write(caller, caller_perms()))
return E_PERM;
endif
cur = {@args, 0}[1];
this:expunge_rmm();
"... blow away @rmm'ed messages since there's no way to tell what their new numbers should be...";
if (!(msgtree = this.messages))
return {0, 0};
endif
if (cur)
cur = (this._mgr:find_ord(msgtree, cur - 1, "_lt_msgnum") + 1);
endif
while (1)
"...find first out-of-sequence message...";
n = 1;
subtree = msgtree;
if (msgtree[3][1] == 1)
while ((node = this.(subtree[1]))[1])
"...subtree[3][1]==n...";
kids = node[2];
n = (n + subtree[2]);
i = length(kids);
while ((n = (n - kids[i][2])) != kids[i][3][1])
i = (i - 1);
endwhile
subtree = kids[i];
endwhile
leaves = node[2];
n = (((firstn = n) + length(leaves)) - 1);
while (n != leaves[(n - firstn) + 1][2])
n = (n - 1);
endwhile
n = (n + 1);
endif
"... n == first out-of-sequence ...";
"...renumber as many messages as we have time for...";
while ((n <= msgtree[2]) && (!$command_utils:running_out_of_time()))
msg = this._mgr:find_nth(msgtree, n);
msgtree = this._mgr:set_nth(msgtree, n, listset(msg, n, 2));
n = (n + 1);
endwhile
this.messages = msgtree;
if (n > msgtree[2])
return {n - 1, cur};
endif
player:tell("...(renumbering to ", n - 1, ")");
suspend(0);
"...start over... may have received new mail, rmm'ed stuff, etc...";
"...so who knows what's there now?...";
if (this.messages_going)
player:tell("Renumber aborted.");
return;
endif
msgtree = this.messages;
endwhile
.
#16:24
return this:ok(caller, caller_perms()) ? this.messages ? this.messages[2] | 0 | E_PERM;
.
#16:25
return this:ok(caller, caller_perms()) ? this._mgr:find_ord(this.messages, args[1], "_lt_msgnum") | E_PERM;
.
#16:26
return this:ok(caller, caller_perms()) ? this._mgr:find_ord(this.messages, args[1], "_lt_msgdate") | E_PERM;
.
#16:27
return this:ok(caller, caller_perms()) ? (i = this._mgr:find_ord(this.messages, args[1], "_lt_msgnum")) && ((this:_message_num(@this._mgr:find_nth(this.messages, i)) == args[1]) && i) | E_PERM;
.
#16:28
new = ((msgtree = this.messages) ? this:_message_num(@this._mgr:find_nth(msgtree, msgtree[2])) + 1 | 1);
if (rmsgs = this.messages_going)
lbrm = rmsgs[length(rmsgs)][2];
return max(new, this:_message_num(@this._mgr:find_nth(lbrm, lbrm[2])) + 1);
else
return new;
endif
.
#16:29
":from_msg_seq(object or list)";
" => msg_seq of messages from any of these senders";
if (!this:ok(caller, caller_perms()))
return E_PERM;
elseif (!this.messages)
return {};
endif
if (typeof(plist = args[1]) != LIST)
plist = {plist};
endif
mask = {@args, {1, this.messages[2] + 1}}[2];
fseq = {};
for m in [1..length(mask) / 2]
handle = this._mgr:start(this.messages, i = mask[(2 * m) - 1], mask[2 * m] - 1);
while (handle)
for msg in (handle[1])
fromline = msg[4];
if (toobj(fromline[rindex(fromline, "(") + 1..rindex(fromline, ")") - 1]) in plist)
fseq = $seq_utils:add(fseq, i, i);
endif
i = (i + 1);
$command_utils:suspend_if_needed(0);
endfor
handle = this._mgr:next(@listdelete(handle, 1));
endwhile
endfor
return fseq || ("%f %<has> no messages from " + $string_utils:english_list($list_utils:map_arg(2, $string_utils, "pronoun_sub", "%n (%#)", plist), "no one", " or "));
.
#16:30
":%from_msg_seq(string or list of strings)";
" => msg_seq of messages with one of these strings in the from line";
if (!this:ok(caller, caller_perms()))
return E_PERM;
elseif (!this.messages)
return {};
endif
if (typeof(nlist = args[1]) != LIST)
nlist = {nlist};
endif
fseq = {};
mask = {@args, {1, this.messages[2] + 1}}[2];
for m in [1..length(mask) / 2]
handle = this._mgr:start(this.messages, i = mask[(2 * m) - 1], mask[2 * m] - 1);
while (handle)
for msg in (handle[1])
fromline = (" " + msg[4]);
for n in (nlist)
if (index(fromline, n))
fseq = $seq_utils:add(fseq, i, i);
endif
endfor
i = (i + 1);
$command_utils:suspend_if_needed(0);
endfor
handle = this._mgr:next(@listdelete(handle, 1));
endwhile
endfor
return fseq || ("%f %<has> no messages from " + $string_utils:english_list($list_utils:map_arg($string_utils, "print", nlist), "no one", " or "));
.
#16:31
":to_msg_seq(object or list) => msg_seq of messages to those people";
if (!this:ok(caller, caller_perms()))
return E_PERM;
elseif (!this.messages)
return {};
endif
if (typeof(plist = args[1]) != LIST)
plist = {plist};
endif
seq = {};
mask = {@args, {1, this.messages[2] + 1}}[2];
for m in [1..length(mask) / 2]
handle = this._mgr:start(this.messages, i = mask[(2 * m) - 1], mask[2 * m] - 1);
while (handle)
for msg in (handle[1])
toline = msg[5];
for r in ($mail_agent:parse_address_field(toline))
if (r in plist)
seq = $seq_utils:add(seq, i, i);
endif
endfor
i = (i + 1);
$command_utils:suspend_if_needed(0);
endfor
handle = this._mgr:next(@listdelete(handle, 1));
endwhile
endfor
return seq || ("%f %<has> no messages to " + $string_utils:english_list($list_utils:map_arg(2, $string_utils, "pronoun_sub", "%n (%#)", plist), "no one", " or "));
.
#16:32
":%to_msg_seq(string or list of strings)";
" => msg_seq of messages containing one of strings in the to line";
if (!this:ok(caller, caller_perms()))
return E_PERM;
elseif (!this.messages)
return {};
endif
if (typeof(nlist = args[1]) != LIST)
nlist = {nlist};
endif
seq = {};
mask = {@args, {1, this.messages[2] + 1}}[2];
for m in [1..length(mask) / 2]
handle = this._mgr:start(this.messages, i = mask[(2 * m) - 1], mask[2 * m] - 1);
while (handle)
for msg in (handle[1])
toline = (" " + msg[5]);
for n in (nlist)
if (index(toline, n))
seq = $seq_utils:add(seq, i, i);
endif
endfor
i = (i + 1);
$command_utils:suspend_if_needed(0);
endfor
handle = this._mgr:next(@listdelete(handle, 1));
endwhile
endfor
return seq || ("%f %<has> no messages to " + $string_utils:english_list($list_utils:map_arg($string_utils, "print", nlist), "no one", " or "));
.
#16:33
":subject_msg_seq(target) => msg_seq of messages with target in the Subject:";
if (!this:ok(caller, caller_perms()))
return E_PERM;
elseif (!this.messages)
return {};
endif
target = args[1];
seq = {};
mask = {@args, {1, this.messages[2] + 1}}[2];
for m in [1..length(mask) / 2]
handle = this._mgr:start(this.messages, i = mask[(2 * m) - 1], mask[2 * m] - 1);
while (handle)
for msg in (handle[1])
if (((subject = msg[6]) != " ") && index(subject, target))
seq = $seq_utils:add(seq, i, i);
endif
i = (i + 1);
$command_utils:suspend_if_needed(0);
endfor
handle = this._mgr:next(@listdelete(handle, 1));
endwhile
endfor
return seq || (("%f %<has> no messages with subjects containing `" + target) + "'");
.
#16:34
":body_msg_seq(target) => msg_seq of messages with target in the body";
if (!this:ok(caller, caller_perms()))
return E_PERM;
elseif (!this.messages)
return {};
endif
target = args[1];
seq = {};
mask = {@args, {1, this.messages[2] + 1}}[2];
for m in [1..length(mask) / 2]
handle = this._mgr:start(this.messages, i = mask[(2 * m) - 1], mask[2 * m] - 1);
while (handle)
for msg in (handle[1])
if (msg[1] && (body = this.(msg[1])))
l = length(body);
while ((!index(body[l], target)) && (l = (l - 1)))
$command_utils:suspend_if_needed(0);
endwhile
if (l)
seq = $seq_utils:add(seq, i, i);
endif
endif
i = (i + 1);
$command_utils:suspend_if_needed(0);
endfor
handle = this._mgr:next(@listdelete(handle, 1));
endwhile
endfor
return seq || tostr("%f %<has> no messages containing `", target, "' in the body.");
.
#16:35
return E_VERBNF;
.
#16:36
msgtree = this.messages;
this.last_msg_date = ((msgtree && this:_message_hdr(@this._mgr:find_nth(msgtree, msgtree[2]))[1]) || 0);
.
#16:37
if (!this:ok_write(caller, caller_perms()))
return E_PERM;
endif
doit = (args && args[1]);
msgtree = this.messages;
for n in [1..msgtree[2]]
msg = this._mgr:find_nth(msgtree, n);
msg = {@msg[1..2], @$mail_agent:__convert_new(@msg[3..length(msg)])};
if (doit)
msgtree = this._mgr:set_nth(msgtree, n, msg);
endif
if ($command_utils:running_out_of_time())
suspend(0);
if (this.messages != msgtree)
player:notify("urk.  someone played with this folder.");
return 0;
endif
endif
endfor
return 1;
.
#16:38
if (caller_perms().wizard)
pass();
this._mgr = $biglist;
this.mowner = $mail_recipient.owner;
endif
.
#16:39
if (this:ok(caller, caller_perms()))
date = args[1];
return (this.last_msg_date <= date) ? 0 | (this.messages[2] - this._mgr:find_ord(this.messages, args[1], "_lt_msgdate"));
else
return E_PERM;
endif
.
#17:0
what = args[1];
return is_player(what) && (!(what in connected_players()));
.
#17:1
who = args[1];
move(who, $player_start);
$player_start:announce_all_but({who}, who.name, " has connected.");
.
#17:2
return $player_start:who_location_msg(@args);
.
#18:0
return ((caller == this) || caller_perms().wizard) ? pass(@args) | E_PERM;
.
#18:1
":add(player,email[,comment])";
if (!caller_perms().wizard)
return E_PERM;
endif
who = args[1];
email = args[2];
comment = args[3..length(args)];
l = this:find_exact(email);
if (l == $failed_match)
this:insert(email, {{who, @comment}});
elseif (i = $list_utils:iassoc(who, l))
this:insert(email, listset(l, {who, @comment}, i));
else
this:insert(email, {@l, {who, @comment}});
endif
.
#18:2
if (caller_perms().wizard)
pass();
this:clearall();
this.registrar = #2;
endif
.
#18:3
"suspicious(address)";
"Determine whether an address appears to be another player in disguise.";
"returns a list of similar addresses.";
"";
"at the moment,";
"  foo@bar.baz.bing.boo";
"is considered 'similar' to anything matching";
"  foo@*.bing.boo";
if (!caller_perms().wizard)
return E_PERM;
endif
parsed = $network:parse_address(address = args[1]);
userid = parsed[1];
site = parsed[2];
exact = ((!site) && this:find_exact(address));
if (!site)
site = $network.site;
endif
site = $network:local_domain(site);
sitelen = length(site);
others = this:find_all_keys(userid + "@");
for other in (others)
if (other[(length(other) - sitelen) + 1..length(other)] != site)
others = setremove(others, other);
endif
endfor
if (exact)
others = listinsert(others, address);
endif
return others;
.
#18:4
"suspicious_userid(userid)";
"Return yes if userid is root or postmaster or something like that.";
return args[1] in {"", "sysadmin", "root", "postmaster", "bin", "SYSTEM", "OPERATOR"};
"Thinking about ruling out hyphenated names, on the grounds that they're probably mailing lists.";
.
#18:5
"Returns a list of strings describing the registration data for an email address.  Args[1] should be the result of this:find.";
result = {};
for x in (args[1])
name = ((valid(x[1]) && is_player(x[1])) ? x[1].name | "<recycled>");
email = ((valid(x[1]) && is_player(x[1])) ? x[1].email_address | "<???>");
result = {@result, tostr("  ", name, " (", x[1], ") current email: ", email, (length(x) > 1) ? (" [" + x[2]) + "]" | "")};
endfor
return result;
.
#19:0
":display_seq_headers(msg_seq[,cur])";
if (!this:ok(caller, caller_perms()))
return E_PERM;
endif
player:tell("       WHEN    BY        WHO                 EMAIL-ADDRESS");
pass(@args);
.
#19:1
when = ctime(args[1])[5..10];
from = args[2];
by = $string_utils:left(from[1..index(from, " (") - 1], -9);
subject = args[4];
who = subject[1..(open = index(subject, " (")) - 1];
if ((close = rindex(subject, ")")) > open)
who = (who[1..min(9, length(who))] + subject[open..close]);
endif
who = $string_utils:left(who, 18);
line = args[("" in args) + 1];
email = line[1..index(line + " ", " ") - 1];
if (!index(email, "@"))
email = "??";
endif
return tostr(when, "  ", by, " ", who, "  ", email);
.
#19:2
if (caller_perms().wizard)
pass();
"this:rm_message_seq({1, 1 + this:length_all_msgs()})";
"this:expunge_rmm()";
for p in (properties(this))
$command_utils:suspend_if_needed(0);
if (p && (p[1] == " "))
delete_property(this, p);
endif
endfor
this.messages = (this.messages_going = {});
this._genprop = "";
this.mail_forward = {player, this};
this.mail_notify = {player};
for p in ({"moderator_forward", "writers", "readers", "expire_period", "last_used_time"})
this.(p) = $mail_recipient.(p);
endfor
this.moderated = 1;
else
return E_PERM;
endif
.
#19:3
"Copied from Generic Mail Recipient (#6419):is_usable_by by Rog (#4292) Tue Mar  2 10:02:32 1993 PST";
return (!this.moderated) || ((this:is_writable_by(who = args[1]) || (who in this.moderated)) || who.wizard);
.
#20:0
"space(len,fill) returns a string of length abs(len) consisting of copies of fill.  If len is negative, fill is anchored on the right instead of the left.";
n = args[1];
if (typeof(n) == STR)
n = length(n);
endif
if (" " != (fill = {@args, " "}[2]))
fill = (fill + fill);
fill = (fill + fill);
fill = (fill + fill);
elseif ((n = abs(n)) < 70)
return "                                                                      "[1..n];
else
fill = "                                                                      ";
endif
m = ((n - 1) / length(fill));
while (m)
fill = (fill + fill);
m = (m / 2);
endwhile
return (n > 0) ? fill[1..n] | fill[((f = length(fill)) + 1) + n..f];
.
#20:1
text = args[1];
len = args[2];
fill = (((length(args) >= 3) && args[3]) || " ");
abslen = abs(len);
out = tostr(text);
if (length(out) < abslen)
return out + this:space(length(out) - abslen, fill);
else
return (len > 0) ? out | out[1..abslen];
endif
.
#20:2
text = args[1];
len = args[2];
fill = (((length(args) >= 3) && args[3]) || " ");
abslen = abs(len);
out = tostr(text);
if (length(out) < abslen)
return this:space(abslen - length(out), fill) + out;
else
return (len > 0) ? out | out[1..abslen];
endif
.
#20:3
text = args[1];
len = args[2];
lfill = (((length(args) >= 3) && args[3]) || " ");
rfill = ((length(args) >= 4) ? args[4] | lfill);
out = tostr(text);
abslen = abs(len);
if (length(out) < abslen)
return (this:space((abslen - length(out)) / 2, lfill) + out) + this:space(((abslen - length(out)) + 1) / -2, rfill);
else
return (len > 0) ? out | out[1..abslen];
endif
.
#20:4
"columnize (items, n [, width]) - Turn a one-column list of items into an n-column list. 'width' is the last character position that may be occupied; it defaults to a standard screen width. Example: To tell the player a list of numbers in three columns, do 'player:tell_lines ($string_utils:columnize ({1, 2, 3, 4, 5, 6, 7}, 3));'.";
items = args[1];
n = args[2];
width = ((length(args) >= 3) ? args[3] | 79);
height = (((length(items) + n) - 1) / n);
items = {@items, @$list_utils:make((height * n) - length(items), "")};
colwidths = {};
for col in [1..n - 1]
colwidths = listappend(colwidths, 1 - (((width + 1) * col) / n));
endfor
result = {};
for row in [1..height]
line = tostr(items[row]);
for col in [1..n - 1]
line = tostr(this:left(line, colwidths[col]), " ", items[row + (col * height)]);
endfor
result = listappend(result, line[1..min(length(line), width)]);
endfor
return result;
.
#20:5
"$string_utils:from_list(list [, separator])";
"Return a string being the concatenation of the string representations of the elements of LIST, each pair separated by the string SEPARATOR, which defaults to the empty string.";
LIST = args[1];
if (length(args) <= 1)
return tostr(@LIST);
elseif (LIST)
separator = args[2];
result = tostr(LIST[1]);
for elt in (listdelete(LIST, 1))
result = tostr(result, separator, elt);
endfor
return result;
else
return "";
endif
.
#20:6
"Prints the argument (must be a list) as an english list, e.g. {1, 2, 3} is printed as \"1, 2, and 3\", and {1, 2} is printed as \"1 and 2\".";
"Optional arguments are treated as follows:";
"  Second argument is the string to use when the empty list is given.  The default is \"nothing\".";
"  Third argument is the string to use in place of \" and \".  A typical application might be to use \" or \" instead.";
"  Fourth argument is the string to use instead of a comma (and space).  Gary_Severn's deranged mind actually came up with an application for this.  You can ask him.";
"  Fifth argument is a string to use after the penultimate element before the \" and \".  The default is to have a comma without a space.";
things = args[1];
nthings = length(things);
if (length(args) > 1)
nothingstr = args[2];
else
nothingstr = "nothing";
endif
if (length(args) > 2)
andstr = args[3];
else
andstr = " and ";
endif
if (length(args) > 3)
commastr = args[4];
else
commastr = ", ";
endif
if (length(args) > 4)
finalcommastr = args[5];
else
finalcommastr = ",";
endif
if (nthings == 0)
return nothingstr;
elseif (nthings == 1)
return tostr(things[1]);
elseif (nthings == 2)
return tostr(things[1], andstr, things[2]);
else
ret = "";
for k in [1..nthings - 1]
if (k == (nthings - 1))
commastr = finalcommastr;
endif
ret = tostr(ret, things[k], commastr);
endfor
return tostr(ret, andstr, things[nthings]);
endif
.
#20:7
"Return a string of the names and object numbers of the objects in a list.";
line = "";
for item in (args[1])
if ((typeof(item) == OBJ) && valid(item))
line = ((((line + item.name) + "(") + tostr(item)) + ")   ");
endif
endfor
return $string_utils:trimr(line);
.
#20:8
minute = 60;
hour = (60 * minute);
day = (24 * hour);
secs = args[1];
if (secs > day)
count = (secs / day);
unit = "day";
article = "a";
elseif (secs > hour)
count = (secs / hour);
unit = "hour";
article = "an";
elseif (secs > minute)
count = (secs / minute);
unit = "minute";
article = "a";
else
count = secs;
unit = "second";
article = "a";
endif
if (count == 1)
time = tostr(article, " ", unit);
else
time = tostr(count, " ", unit, "s");
endif
return time;
.
#20:9
":trim (string [, space]) -- remove leading and trailing spaces";
"";
"`space' should be a character (single-character string); it defaults to \" \".  Returns a copy of string with all leading and trailing copies of that character removed.  For example, $string_utils:trim(\"***foo***\", \"*\") => \"foo\".";
string = args[1];
space = {@args, " "}[2];
m = match(string, tostr("[^", space, "]%(.*[^", space, "]%)?%|$"));
return string[m[1]..m[2]];
.
#20:10
":triml(string [, space]) -- remove leading spaces";
"";
"`space' should be a character (single-character string); it defaults to \" \".  Returns a copy of string with all leading copies of that character removed.  For example, $string_utils:triml(\"***foo***\", \"*\") => \"foo***\".";
string = args[1];
what = {@args, " "}[2];
return string[match(string, tostr("[^", what, "]%|$"))[1]..length(string)];
.
#20:11
":trimr(string [, space]) -- remove trailing spaces";
"";
"`space' should be a character (single-character string); it defaults to \" \".  Returns a copy of string with all trailing copies of that character removed.  For example, $string_utils:trimr(\"***foo***\", \"*\") => \"***foo\".";
string = args[1];
what = {@args, " "}[2];
return string[1..rmatch(string, tostr("[^", what, "]%|^"))[2]];
.
#20:12
":strip_chars(string,chars) => string with chars removed";
subject = args[1];
stripped = args[2];
for i in [1..length(stripped)]
subject = strsub(subject, stripped[i], "");
endfor
return subject;
.
#20:13
":strip_all_but(string,keep) => string with chars not in `keep' removed.";
"`keep' is used in match() so if it includes ], ^, or -,";
"] should be first, ^ should be other from first, and - should be last.";
string = args[1];
wanted = (("[" + args[2]) + "]+");
output = "";
while (m = match(string, wanted))
output = (output + string[m[1]..m[2]]);
string = string[m[2] + 1..length(string)];
endwhile
return output;
.
#20:14
"lowercase(string) -- returns a lowercase version of the string.";
"uppercase(string) -- returns the uppercase version of the string.";
string = args[1];
from = (caps = "ABCDEFGHIJKLMNOPQRSTUVWXYZ");
to = (lower = "abcdefghijklmnopqrstuvwxyz");
if (verb == "uppercase")
from = lower;
to = caps;
endif
for i in [1..26]
string = strsub(string, from[i], to[i], 1);
endfor
return string;
.
#20:15
"capitalizes its argument.";
if ((string = args[1]) && (i = index("abcdefghijklmnopqrstuvwxyz", string[1], 1)))
string[1] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"[i];
endif
return string;
.
#20:16
"Matches args[1] against literal objects: #xxxxx or $variables.  Returns the object if successful, $failed_match else.";
string = args[1];
if (!string)
return $nothing;
elseif ((string[1] == "#") && (E_TYPE != (object = $code_utils:toobj(string))))
return object;
elseif ((string[1] == "$") && ($object_utils:has_property(#0, pn = string[2..length(string)]) && (typeof(object = #0.(pn)) == OBJ)))
return object;
else
return $failed_match;
endif
.
#20:17
"$string_utils:match(string [, obj-list, prop-name]*)";
"Each obj-list should be a list of objects or a single object, which is treated as if it were a list of that object.  Each prop-name should be string naming a property on every object in the corresponding obj-list.  The value of that property in each case should be either a string or a list of strings.";
"The argument string is matched against all of the strings in the property values.";
"If it exactly matches exactly one of them, the object containing that property is returned.  If it exactly matches more than one of them, $ambiguous_match is returned.";
"If there are no exact matches, then partial matches are considered, ones in which the given string is a prefix of some property string.  Again, if exactly one match is found, the object with that property is returned, and if there is more than one match, $ambiguous_match is returned.";
"Finally, if there are no exact or partial matches, then $failed_match is returned.";
subject = args[1];
if (subject == "")
return $nothing;
endif
no_exact_match = (no_partial_match = 1);
for i in [1..length(args) / 2]
prop_name = args[(2 * i) + 1];
for object in ((typeof(olist = args[2 * i]) == LIST) ? olist | {olist})
if (valid(object))
if (typeof(str_list = object.(prop_name)) != LIST)
str_list = {str_list};
endif
if (subject in str_list)
if (no_exact_match)
no_exact_match = object;
elseif (no_exact_match != object)
return $ambiguous_match;
endif
else
for string in (str_list)
if (index(string, subject) != 1)
elseif (no_partial_match)
no_partial_match = object;
elseif (no_partial_match != object)
no_partial_match = $ambiguous_match;
endif
endfor
endif
endif
endfor
endfor
return no_exact_match && (no_partial_match && $failed_match);
.
#20:18
"* wildcard matching. Returns a list of what the *s actually matched. Won't cath every match, if there are several ways to parse it.";
"Example: $string_utils:match_string(\"Jack waves to Jill\",\"* waves to *\") returns {\"Jack\", \"Jill\"}";
"Optional arguments: numbers are interpreted as case-sensitivity, strings as alternative wildcards.";
wild = "*";
case = (ret = {});
what = (args[1] + "&^%$");
targ = (args[2] + "&^%$");
for y in (args[3..length(args)])
if (typeof(y) == STR)
wild = y;
elseif (typeof(y) == NUM)
case = {y};
endif
endfor
while (targ != "")
if (z = index(targ, wild))
part = targ[1..z - 1];
else
z = length(targ);
part = targ;
endif
n = ((part == "") ? 1 | index(what, part, @case));
if (n)
ret = listappend(ret, what[1..n - 1]);
what = what[(z + n) - 1..length(what)];
targ = targ[z + 1..length(targ)];
else
return 0;
endif
endwhile
if (ret == {})
return what == "";
elseif (ret == {""})
return 1;
elseif (ret[1] == "")
return ret[2..length(ret)];
else
return 0;
endif
.
#20:19
":match_object(string,location[,someone])";
"Returns the object matching the given string for someone, on the assumption that s/he is in the given location.  `someone' defaults to player.";
"This first tries :literal_object(string), \"me\"=>someone,\"here\"=>location, then player:match(string) and finally location:match(string) if location is valid.";
"This is the default algorithm for use by room :match_object() and player :my_match_object() verbs.  Player verbs that are calling this directly should probably be calling :my_match_object instead.";
string = args[1];
here = args[2];
who = {@args, player}[3];
if ($failed_match != (object = this:literal_object(string)))
return object;
elseif (string == "me")
return who;
elseif (string == "here")
return here;
elseif ((valid(pobject = who:match(string)) && (string in {@pobject.aliases, pobject.name})) || (!valid(here)))
"...exact match in player or room is bogus...";
return pobject;
elseif ((valid(hobject = here:match(string)) && (string in {@hobject.aliases, hobject.name})) || (pobject == $failed_match))
"...exact match in room or match in player failed completely...";
return hobject;
else
return pobject;
endif
.
#20:20
"match_player(name,name,...)      => {obj,obj,...}";
"match_player(name[,meobj])       => obj";
"match_player({name,...}[,meobj]) => {obj,...}";
"objs returned are either players, $failed_match, $ambiguous_match, or $nothing in the case of an empty string.";
"meobj (what to return for instances of `me') defaults to player; if given and isn't actually a player, `me' => $failed_match";
retstr = 0;
me = player;
if ((length(args) < 2) || (typeof(me = args[2]) == OBJ))
me = ((valid(me) && is_player(me)) ? me | $failed_match);
if (typeof(args[1]) == STR)
strings = {args[1]};
retstr = 1;
"return a string, not a list";
else
strings = args[1];
endif
else
strings = args;
me = player;
endif
found = {};
for astr in (strings)
if (!astr)
aobj = $nothing;
elseif (astr == "me")
aobj = me;
elseif (valid(aobj = $string_utils:literal_object(astr)) && is_player(aobj))
"astr is a valid literal object number of some player, so we are done.";
else
aobj = $player_db:find(astr);
endif
found = {@found, aobj};
endfor
return retstr ? found[1] | found;
.
#20:21
"Accepts any number of strings, attempts to match those strings first against objects in the room, and if no objects by those names exist, matches against player names (and \"#xxxx\" style strings regardless of location).  Returns a list of valid objects so found.";
"Unlike $string_utils:match_player, does not include in the list the failed and ambiguous matches; instead has built-in error messages for such objects.  This should probably be improved.  Volunteers?";
if (!args)
return;
endif
unknowns = {};
objs = {};
"We have to do something icky here.  Parallel walk the victims and args lists.  When it's a valid object, then it's a player.  If it's an invalid object, try to get an object match from the room.  If *that* fails, complain.";
for i in [1..length(args)]
if (valid(o = player.location:match_object(args[i])))
objs = {@objs, o};
else
unknowns = {@unknowns, args[i]};
endif
endfor
victims = $string_utils:match_player(unknowns);
for i in [1..length(victims)]
if (!valid(victims[i]))
player:tell("Could not find ", unknowns[i], " as either an object or a player.");
else
objs = {@objs, victims[i]};
endif
endfor
return objs;
.
#20:22
"find_prefix(prefix, string-list) => list index of something starting with prefix, or 0 or $ambiguous_match.";
subject = args[1];
choices = args[2];
answer = 0;
for i in [1..length(choices)]
if (index(choices[i], subject) == 1)
if (answer == 0)
answer = i;
else
answer = $ambiguous_match;
endif
endif
endfor
return answer;
.
#20:23
"index_delimited(string,target[,case_matters]) is just like the corresponding call to the builtin index() but instead only matches on occurences of target delimited by word boundaries (i.e., not preceded or followed by an alphanumeric)";
args[2] = (("%(%W%|^%)" + $string_utils:regexp_quote(args[2])) + "%(%W%|$%)");
return (m = match(@args)) ? m[3][1][2] + 1 | 0;
.
#20:24
"Usage:  is_numeric(string)";
"Is string numeric (composed of one or more digits possibly preceded by a minus sign)?";
"Return true or false";
return match(args[1], "^ *[-+]?[0-9]+ *$");
digits = "1234567890";
if (!(string = args[1]))
return 0;
endif
if (string[1] == "-")
string = string[2..length(string)];
endif
for i in [1..length(string)]
if (!index(digits, string[i]))
return 0;
endif
endfor
return 1;
.
#20:25
":short_ordinal(1) => \"1st\",:short_ordinal(2) => \"2nd\",etc...";
string = tostr(n = args[1]);
n = (abs(n) % 100);
if (((n / 10) != 1) && ((n % 10) in {1, 2, 3}))
return string + {"st", "nd", "rd"}[n % 10];
else
return string + "th";
endif
.
#20:26
"$string_utils:group_number(n [, sep_char])";
"";
"Converts N to a string, inserting commas (or copies of SEP_CHAR, if given) every three digits, counting from the right.  For example, $string_utils:group_number(1234567890) returns the string \"1,234,567,890\".";
n = args[1];
comma = ((length(args) > 1) ? args[2] | ",");
result = "";
sign = ((n < 0) ? "-" | "");
n = tostr(abs(n));
while ((len = length(n)) > 3)
result = ((comma + n[len - 2..len]) + result);
n = n[1..len - 3];
endwhile
return (sign + n) + result;
.
#20:27
"$string_utils:english_number(n) -- convert the number N into English";
"";
"Produces a string containing the English phrase naming the given number.  For example, $string_utils:english_number(-1234) returns the string `negative one thousand two hundred thirty-four'.";
NUM = tonum(args[1]);
if (NUM == 0)
return "zero";
endif
labels = {"", " thousand", " million", " billion"};
numstr = "";
mod = abs(NUM);
for n in [1..4]
div = (mod % 1000);
if (div)
hun = (div / 100);
ten = (div % 100);
outstr = (this:english_tens(ten) + labels[n]);
if (hun)
outstr = (((this:english_ones(hun) + " hundred") + (ten ? " " | "")) + outstr);
endif
if (numstr)
numstr = ((outstr + " ") + numstr);
else
numstr = outstr;
endif
endif
mod = (mod / 1000);
endfor
return ((NUM < 0) ? "negative " | "") + numstr;
.
#20:28
"$string_utils:english_ordinal(n) -- convert the number N into an english ordinal (1 => \"first\", etc...)";
NUM = tonum(args[1]);
if (NUM == 0)
return "zeroth";
elseif (NUM % 100)
hundreds = ((abs(NUM) > 100) ? this:english_number((NUM / 100) * 100) + " " | ((NUM < 0) ? "negative " | ""));
NUM = (abs(NUM) % 100);
specials = {1, 2, 3, 5, 8, 9, 12, 20, 30, 40, 50, 60, 70, 80, 90};
ordinals = {"first", "second", "third", "fifth", "eighth", "ninth", "twelfth", "twentieth", "thirtieth", "fortieth", "fiftieth", "sixtieth", "seventieth", "eightieth", "ninetieth"};
if (i = (NUM in specials))
return hundreds + ordinals[i];
elseif ((NUM > 20) && (i = ((NUM % 10) in specials)))
return ((hundreds + this:english_tens((NUM / 10) * 10)) + "-") + ordinals[i];
else
return (hundreds + this:english_number(NUM)) + "th";
endif
else
return this:english_number(NUM) + "th";
endif
.
#20:29
NUM = args[1];
ones = {"", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"};
return ones[NUM + 1];
.
#20:30
NUM = args[1];
teens = {"ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", "nineteen"};
others = {"twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety"};
if (NUM < 10)
return this:english_ones(NUM);
elseif (NUM < 20)
return teens[NUM - 9];
else
return (others[(NUM / 10) - 1] + ((NUM % 10) ? "-" | "")) + this:english_ones(NUM % 10);
endif
.
#20:31
"subst(string,{{redex1,repl1},{redex2,repl2},{redex3,repl3}...}[,case])";
"  => returns string with all instances of the strings redex<n> replaced respectively by the strings repl<n>.  If the optional argument `case' is given and nonzero, the search for instances of redex<n> is case sensitive.";
"  Substitutions are done in parallel, i.e., instances of redex<n> that appear in any of the replacement strings are ignored.  In the event that two redexes overlap, whichever is leftmost in `string' takes precedence.  For two redexes beginning at the same position, the longer one takes precedence.";
"";
"subst(\"hoahooaho\",{{\"ho\",\"XhooX\"},{\"hoo\",\"mama\"}}) => \"XhooXamamaaXhooX\"";
"subst(\"Cc: banana\",{{\"a\",\"b\"},{\"b\",\"c\"},{\"c\",\"a\"}},1) => \"Ca: cbnbnb\"";
if (typeof(ostr = args[1]) != STR)
return ostr;
endif
case = {@args, 0}[3];
len = length(ostr);
" - - - find the first instance of each substitution - -";
indices = {};
substs = {};
for s in (args[2])
if (i = index(ostr, s[1], case))
fi = ($list_utils:find_insert(indices, i = (i - len)) - 1);
while (fi && ((indices[fi] == i) && (length(substs[fi][1]) < length(s[1]))))
"...give preference to longer redexes...";
fi = (fi - 1);
endwhile
indices = listappend(indices, i, fi);
substs = listappend(substs, s, fi);
endif
endfor
"- - - - - perform substitutions - ";
nstr = "";
while (substs)
ind = (len + indices[1]);
sub = substs[1];
indices = listdelete(indices, 1);
substs = listdelete(substs, 1);
if (ind > 0)
nstr = ((nstr + ostr[1..ind - 1]) + sub[2]);
ostr = ostr[ind + length(sub[1])..len];
len = length(ostr);
endif
if (next = index(ostr, sub[1], case))
fi = ($list_utils:find_insert(indices, next = (next - len)) - 1);
while (fi && ((indices[fi] == next) && (length(substs[fi][1]) < length(sub[1]))))
"...give preference to longer redexes...";
fi = (fi - 1);
endwhile
indices = listappend(indices, next, fi);
substs = listappend(substs, sub, fi);
endif
endwhile
return nstr + ostr;
.
#20:32
"subst(string,{{redex1,repl1},{redex2,repl2},{redex3,repl3}...}[,case])";
"Just like :substitute() but it uses index_delimited() instead of index()";
if (typeof(ostr = args[1]) != STR)
return ostr;
endif
case = {@args, 0}[3];
len = length(ostr);
" - - - find the first instance of each substitution - -";
indices = {};
substs = {};
for s in (args[2])
if (i = this:index_delimited(ostr, s[1], case))
fi = ($list_utils:find_insert(indices, i = (i - len)) - 1);
while (fi && ((indices[fi] == i) && (length(substs[fi][1]) < length(s[1]))))
"...give preference to longer redexes...";
fi = (fi - 1);
endwhile
indices = listappend(indices, i, fi);
substs = listappend(substs, s, fi);
endif
endfor
"- - - - - perform substitutions - ";
nstr = "";
while (substs)
ind = (len + indices[1]);
sub = substs[1];
indices = listdelete(indices, 1);
substs = listdelete(substs, 1);
if (ind > 0)
nstr = ((nstr + ostr[1..ind - 1]) + sub[2]);
ostr = ostr[ind + length(sub[1])..len];
len = length(ostr);
endif
if (next = this:index_delimited(ostr, sub[1], case))
fi = ($list_utils:find_insert(indices, next = (next - len)) - 1);
while (fi && ((indices[fi] == next) && (length(substs[fi][1]) < length(sub[1]))))
"...give preference to longer redexes...";
fi = (fi - 1);
endwhile
indices = listappend(indices, next, fi);
substs = listappend(substs, sub, fi);
endif
endwhile
return nstr + ostr;
.
#20:33
"cap_property(what,prop[,ucase]) returns what.(prop) but capitalized if either ucase is true or the prop name specified is capitalized.";
"If prop is blank, returns what:title().";
"If prop is bogus or otherwise irretrievable, returns the error.";
"If capitalization is indicated, we return what.(prop+\"c\") if that exists, else we capitalize what.(prop) in the usual fashion.  There is a special exception for is_player(what)&&prop==\"name\" where we just return what.name if no .namec is provided --- ie., a player's .name is never capitalized in the usual fashion.";
"If args[1] is a list, calls itself on each element of the list and returns $string_utils:english_list(those results).";
set_task_perms(caller_perms());
if (typeof(what = args[1]) == LIST)
nargs = listdelete(args, 1);
result = {};
for who in (what)
result = {@result, this:_cap_property(who, @nargs)};
endfor
return $string_utils:english_list(result);
endif
prop = args[2];
ucase = ((prop && (strcmp(prop, "a") < 0)) || ((length(args) >= 3) && args[3]));
if (!prop)
return valid(what) ? ucase ? what:titlec() | what:title() | ((ucase ? "N" | "n") + "othing");
elseif ((!ucase) || (typeof(s = what.(prop + "c")) == ERR))
if (prop == "name")
s = (valid(what) ? what.name | "nothing");
ucase = (ucase && (!is_player(what)));
else
s = ($object_utils:has_property(what, prop) ? what.(prop) | $player.(prop));
endif
if ((((ucase && s) && (typeof(s) == STR)) && ((z = strcmp(s[1], "`")) < 27)) && (z > 0))
s = ("ABCDEFGHIJKLMNOPQRSTUVWXYZ"[z] + s[2..length(s)]);
endif
endif
return (typeof(s) == ERR) ? s | tostr(s);
.
#20:34
"Pronoun (and other things) substitution. See 'help pronouns' for details.";
"syntax:  $string_utils:pronoun_sub(text[,who[,thing[,location]]])";
"%s,%o,%p,%q,%r    => <who>'s pronouns.  <who> defaults to player.";
"%n,%d,%i,%t,%l,%% => <who>, dobj, iobj, <thing>, location and %";
"<thing> defaults to caller; <location> defaults to who.location";
"%S,%O,%P,%Q,%R, %N,%D,%I,%T,%L have corresponding capitalized substitutions.";
" %[#n], %[#d], ...  =>  <who>, dobj, etc.'s object number";
"%(foo) => <who>.foo and %(Foo) => <who>.foo capitalized. %[dfoo] => dobj.foo, etc..";
"%<foo> -> whatever <who> does when normal people foo. This is determined by calling :verb_sub() on the <who>.";
"%<d:foo> -> whatever <dobj> does when normal people foo.";
who = ((length(args) >= 2) ? args[2] | player);
thing = ((length(args) >= 3) ? args[3] | caller);
where = ((length(args) >= 4) ? args[4] | (valid(who) ? who.location | $nothing));
set_task_perms($no_one);
if (typeof(args[1]) == LIST)
plines = {};
for line in (args[1])
plines = {@plines, this:(verb)(line, who, thing, where)};
endfor
return plines;
endif
old = tostr(args[1]);
new = "";
objspec = "nditl";
objects = {who, (length(args) >= 5) ? args[5] | dobj, (length(args) >= 6) ? args[6] | iobj, thing, where};
prnspec = "sopqrSOPQR";
prprops = {"ps", "po", "pp", "pq", "pr", "Ps", "Po", "Pp", "Pq", "Pr"};
oldlen = length(old);
while ((prcnt = index(old, "%")) && (prcnt < oldlen))
s = old[k = (prcnt + 1)];
if ((s == "<") && (gt = index(old[k + 2..length(old)], ">")))
"handling %<verb> ";
gt = ((gt + k) + 1);
vb = old[k + 1..gt - 1];
vbs = who;
if ((length(vb) > 2) && (vb[2] == ":"))
" %<d:verb>";
vbs = objects[index(objspec, vb[1]) || 1];
vb = vb[3..length(vb)];
endif
vb = ($object_utils:has_verb(vbs, "verb_sub") ? vbs:verb_sub(vb) | this:(verb)(vb, vbs));
new = ((new + old[1..prcnt - 1]) + vb);
k = gt;
else
cp_args = {};
if (brace = index("([", s))
if (!(w = index(old[k + 1..oldlen], ")]"[brace])))
return new + old;
else
p = old[prcnt + 2..(k = (k + w)) - 1];
if (brace == 1)
"%(property)";
cp_args = {who, p};
elseif (p[1] == "#")
"%[#n] => object number";
s = ((o = index(objspec, p[2])) ? tostr(objects[o]) | (("[" + p) + "]"));
elseif (!(o = index(objspec, p[1])))
s = (("[" + p) + "]");
else
" %[dproperty] ";
cp_args = {objects[o], p[2..w - 1], strcmp(p[1], "a") < 0};
endif
endif
elseif (o = index(objspec, s))
cp_args = {objects[o], "", strcmp(s, "a") < 0};
elseif (w = index(prnspec, s, 1))
cp_args = {who, prprops[w]};
elseif (s == "#")
s = tostr(who);
elseif (s != "%")
s = ("%" + s);
endif
new = ((new + old[1..prcnt - 1]) + ((!cp_args) ? s | ((typeof(sub = $string_utils:_cap_property(@cp_args)) != ERR) ? sub | (("%(" + tostr(sub)) + ")"))));
endif
old = old[k + 1..oldlen];
oldlen = (oldlen - k);
endwhile
return new + old;
.
#20:35
"$string_utils:pronoun_sub_secure(string[,who[,thing[,location]]], default)";
"Do pronoun_sub on string with the arguments given (see help";
"string_utils:pronoun_sub for more information).  Return pronoun_subbed";
"<default> if the subbed string does not contain <who>.name (<who>";
"defaults to player).";
len = length(args);
who = ((len > 2) ? args[2] | player);
default = args[len];
result = this:pronoun_sub(@args[1..len - 1]);
return this:index_delimited(result, who.name) ? result | this:pronoun_sub(@{default, @args[2..len - 1]});
.
#20:36
" pronoun_quote(string) => quoted_string";
" pronoun_quote(list of strings) => list of quoted_strings";
" pronoun_quote(list of {key,string} pairs) => list of {key,quoted_string} pairs";
"";
"Here `quoted' means quoted in the sense of $string_utils:pronoun_sub, i.e., given a string X, the corresponding `quoted' string Y is such that pronoun_sub(Y) => X.  For example, pronoun_quote(\"--%Spam%--\") => \"--%%Spam%%--\".  This is for including literal text into a string that will eventually be pronoun_sub'ed, i.e., including it in such a way that the pronoun_sub will not expand anything in the included text.";
"";
"The 3rd form above (with {key,string} pairs) is for use with $string_utils:substitute().  If you have your own set of substitutions to be done in parallel with the pronoun substitutions, do";
"";
"  msg=$string_utils:substitute(msg,$string_utils:pronoun_quote(your_substs));";
"  msg=$string_utils:pronoun_sub(msg);";
if (typeof(what = args[1]) == STR)
return strsub(what, "%", "%%");
else
ret = {};
for w in (what)
if (typeof(w) == LIST)
ret = listappend(ret, listset(w, strsub(w[2], "%", "%%"), 2));
else
ret = listappend(ret, strsub(w, "%", "%%"));
endif
endfor
return ret;
endif
.
#20:37
"Pronoun (and other things) substitution. See 'help pronouns' for details.";
"syntax:  $string_utils:pronoun_sub(text[,who[,thing[,location]]])";
"%s,%o,%p,%q,%r    => <who>'s pronouns.  <who> defaults to player.";
"%n,%d,%i,%t,%l,%% => <who>, dobj, iobj, this, <who>.location and %";
"%S,%O,%P,%Q,%R, %N,%D,%I,%T,%L have corresponding capitalized substitutions.";
" %[#n], %[#d], ...  =>  <who>, dobj, etc.'s object number";
"%(foo) => <who>.foo and %(Foo) => <who>.foo capitalized. %[dfoo] => dobj.foo, etc..";
"%<foo> -> whatever <who> does when normal people foo. This is determined by calling :verb_sub() on the <who>.";
"%<d:foo> -> whatever <dobj> does when normal people foo.";
who = ((length(args) >= 2) ? args[2] | player);
thing = ((length(args) >= 3) ? args[3] | caller);
where = ((length(args) >= 4) ? args[4] | (valid(who) ? who.location | $nothing));
if (typeof(args[1]) == LIST)
plines = {};
for line in (args[1])
plines = {@plines, this:(verb)(line, who, thing, where)};
endfor
return plines;
endif
old = tostr(args[1]);
new = "";
objspec = "nditl";
objects = {who, dobj, iobj, thing, where};
prnspec = "sopqrSOPQR";
prprops = {"ps", "po", "pp", "pq", "pr", "Ps", "Po", "Pp", "Pq", "Pr"};
oldlen = length(old);
while ((prcnt = index(old, "%")) && (prcnt < oldlen))
s = old[k = (prcnt + 1)];
if ((s == "<") && (gt = index(old[k + 2..length(old)], ">")))
"handling %<verb> ";
gt = ((gt + k) + 1);
vb = old[k + 1..gt - 1];
vbs = who;
if ((length(vb) > 2) && (vb[2] == ":"))
" %<d:verb>";
vbs = objects[index(objspec, vb[1]) || 1];
vb = vb[3..length(vb)];
endif
vb = ($object_utils:has_verb(vbs, "verb_sub") ? vbs:verb_sub(vb) | this:(verb)(vb, vbs));
new = ((new + old[1..prcnt - 1]) + vb);
k = gt;
else
cp_args = {};
if (brace = index("([", s))
if (!(w = index(old[k + 1..oldlen], ")]"[brace])))
return new + old;
else
p = old[prcnt + 2..(k = (k + w)) - 1];
if (brace == 1)
"%(property)";
cp_args = {who, p};
elseif (p[1] == "#")
"%[#n] => object number";
s = ((o = index(objspec, p[2])) ? tostr(objects[o]) | (("[" + p) + "]"));
elseif (!(o = index(objspec, p[1])))
s = (("[" + p) + "]");
else
" %[dproperty] ";
cp_args = {objects[o], p[2..w - 1], strcmp(p[1], "a") < 0};
endif
endif
elseif (o = index(objspec, s))
cp_args = {objects[o], "", strcmp(s, "a") < 0};
elseif (w = index(prnspec, s, 1))
cp_args = {who, prprops[w]};
elseif (s == "#")
s = tostr(who);
elseif (s != "%")
s = ("%" + s);
endif
new = ((new + old[1..prcnt - 1]) + ((!cp_args) ? s | ((typeof(sub = $string_utils:_cap_property(@cp_args)) != ERR) ? sub | (("%(" + tostr(sub)) + ")"))));
endif
old = old[k + 1..oldlen];
oldlen = (oldlen - k);
endwhile
return new + old;
.
#20:38
" #0.string_utils:explode(subject [, break])";
" Return a list of those substrings of subject separated by runs of break[1].";
" break defaults to space.";
if (length(args) >= 2)
break = args[2][1];
else
break = " ";
endif
subject = (args[1] + break);
parts = {};
while (subject)
if ((i = index(subject, break)) > 1)
parts = {@parts, subject[1..i - 1]};
endif
subject = subject[i + 1..length(subject)];
endwhile
return parts;
.
#20:39
"This breaks up the argument string into words, the resulting list being obtained exactly the way the command line parser obtains `args' from `argstr'.";
rest = args[1];
"...trim leading blanks...";
rest[1..match(rest, "^ *")[2]] = "";
if (!rest)
return {};
endif
quote = 0;
toklist = {};
token = "";
pattern = " +%|\\.?%|\"";
while (m = match(rest, pattern))
"... find the next occurence of a special character, either";
"... a block of spaces, a quote or a backslash escape sequence...";
"notify(#4292,tostr(\"match(\",#20:print(rest),\",\",#20:print(pattern),\") => \",#20:print(m)))";
char = rest[m[1]];
token = (token + rest[1..m[1] - 1]);
if (char == " ")
toklist = {@toklist, token};
token = "";
elseif (char == "\"")
"... beginning or end of quoted string...";
"... within a quoted string spaces aren't special...";
pattern = ((quote = (!quote)) ? "\\.?%|\"" | " +%|\\.?%|\"");
elseif (m[1] < m[2])
"... char has to be a backslash...";
"... include next char literally if there is one";
token = (token + rest[m[2]]);
endif
rest[1..m[2]] = "";
endwhile
return (rest || (char != " ")) ? {@toklist, token + rest} | toklist;
.
#20:40
"This breaks up the argument string into words, returning a list of indices into argstr corresponding to the starting points of each of the arguments.";
rest = args[1];
"... find first nonspace...";
wstart = match(rest, "[^ ]%|$")[1];
wbefore = (wstart - 1);
rest[1..wbefore] = "";
if (!rest)
return {};
endif
quote = 0;
wslist = {};
pattern = " +%|\\.?%|\"";
while (m = match(rest, pattern))
"... find the next occurence of a special character, either";
"... a block of spaces, a quote or a backslash escape sequence...";
char = rest[m[1]];
if (char == " ")
wslist = {@wslist, {wstart, (wbefore + m[1]) - 1}};
wstart = ((wbefore + m[2]) + 1);
elseif (char == "\"")
"... beginning or end of quoted string...";
"... within a quoted string spaces aren't special...";
pattern = ((quote = (!quote)) ? "\\.?%|\"" | " +%|\\.?%|\"");
endif
rest[1..m[2]] = "";
wbefore = (wbefore + m[2]);
endwhile
return (rest || (char != " ")) ? {@wslist, {wstart, wbefore + length(rest)}} | wslist;
.
#20:41
":to_value(string) tries to parse string as a value (i.e., object, number, string, error, or list thereof).";
"Returns {1,value} or {0,error_message} according as the attempt was successful or not.";
result = this:_tolist(string = (args[1] + "}"));
if (result[1] && (result[1] != $string_utils:space(result[1])))
return {0, tostr("after char ", length(string) - result[1], ":  ", result[2])};
elseif (typeof(result[1]) == NUM)
return {0, "missing } or \""};
elseif (length(result[2]) > 1)
return {0, "comma unexpected."};
elseif (result[2])
return {1, result[2][1]};
else
return {0, "missing expression"};
endif
.
#20:42
":prefix_to_value(string) tries to parse string as a value (i.e., object, number, string, error, or list thereof).";
"Returns {rest-of-string,value} or {0,error_message} according as the attempt was successful or not.";
alen = length(args[1]);
slen = length(string = this:triml(args[1]));
if (!string)
return {0, "empty string"};
elseif (w = index("{\"", string[1]))
result = this:({"_tolist", "_unquote"}[w])(string[2..slen]);
if (typeof(result[1]) != NUM)
return result;
elseif (result[1] == 0)
return {0, "missing } or \""};
else
return {0, result[2], (alen - result[1]) + 1};
endif
else
thing = string[1..tlen = (index(string + " ", " ") - 1)];
if (typeof(s = this:_toscalar(thing)) != STR)
return {string[tlen + 1..slen], s};
else
return {0, s, (alen - slen) + 1};
endif
endif
.
#20:43
"_tolist(string) --- auxiliary for :to_value()";
rest = this:triml(args[1]);
vlist = {};
if (!rest)
return {0, {}};
elseif (rest[1] == "}")
return {rest[2..length(rest)], {}};
endif
while (1)
rlen = length(rest);
if (w = index("{\"", rest[1]))
result = this:({"_tolist", "_unquote"}[w])(rest[2..rlen]);
if (typeof(result[1]) == NUM)
return result;
endif
vlist = {@vlist, result[2]};
rest = result[1];
else
thing = rest[1..tlen = (min(index(rest + ",", ","), index(rest + "}", "}")) - 1)];
if (typeof(s = this:_toscalar(thing)) == STR)
return {rlen, s};
endif
vlist = {@vlist, s};
rest = rest[tlen + 1..rlen];
endif
if (!rest)
return {0, vlist};
elseif (rest[1] == "}")
return {rest[2..length(rest)], vlist};
elseif (rest[1] == ",")
rest = this:triml(rest[2..length(rest)]);
else
return {length(rest), ", or } expected"};
endif
endwhile
.
#20:44
"_unquote(string)   (auxiliary for :to_value())";
"reads string as if it were preceded by a quote, reading up to the closing quote if any, then returns the corresponding unquoted string.";
" => {0, string unquoted}  if there is no closing quote";
" => {original string beyond closing quote, string unquoted}  otherwise";
rest = args[1];
result = "";
while (m = match(rest, "\\.?%|\""))
"Find the next special character";
if (rest[pos = m[1]] == "\"")
return {rest[pos + 1..length(rest)], result + rest[1..pos - 1]};
endif
result = ((result + rest[1..pos - 1]) + rest[pos + 1..m[2]]);
rest = rest[m[2] + 1..length(rest)];
endwhile
return {0, result + rest};
.
#20:45
":_toscalar(string)  --- auxiliary for :tovalue";
" => value if string represents a number, object or error";
" => string error message otherwise";
thing = args[1];
if (!thing)
return "missing value";
elseif (match(thing, "^#?[-+]?[0-9]+ *$"))
return (thing[1] == "#") ? toobj(thing) | tonum(thing);
elseif (thing[1] == "E")
return (e = $code_utils:toerr(thing)) ? tostr("unknown error code `", thing, "'") | e;
elseif (thing[1] == "#")
return tostr("bogus objectid `", thing, "'");
else
return tostr("`", thing[1], "' unexpected");
endif
.
#20:46
":parse_command(cmd_line[,player])";
" => {verb, {dobj, dobjstr}, {prep, prepstr}, {iobj, iobjstr}, {args, argstr},";
"     dobjset, prepset, iobjset}";
"This mimics the action of the builtin parser, returning what the values of the builtin variables `verb', `dobj', `dobjstr', `prepstr', `iobj', `iobjstr', `args', and `argstr' would be if `player' had typed `cmd_line'.  ";
"`prep' is the shortened version of the preposition found.";
"";
"`dobjset' and `iobjset' are subsets of {\"any\",\"none\"} and are used to determine possible matching verbs, i.e., the matching verb must either be on `dobj' and have verb_args[1]==\"this\" or else it has verb_args[1] in `dobjset'; likewise for `iobjset' and verb_args[3]; similarly we must have verb_args[2] in `prepset'.";
c = args[1];
who = ((length(args) > 1) ? args[2] | player);
y = $string_utils:words(c);
if (y == {})
return {};
endif
vrb = y[1];
y = y[2..length(y)];
as = ((y == {}) ? "" | c[length(vrb) + 2..length(c)]);
n = 1;
while ((!(gp = $code_utils:get_prep(@y[n..length(y)]))[1]) && (n < length(y)))
n = (n + 1);
endwhile
"....";
really = player;
player = who;
loc = who.location;
if (ps = gp[1])
ds = $string_utils:from_list(y[1..n - 1], " ");
is = $string_utils:from_list(listdelete(gp, 1), " ");
io = (valid(loc) ? loc:match_object(is) | $string_utils:match_object(is, loc));
else
ds = $string_utils:from_list(y, " ");
is = "";
io = $nothing;
endif
do = (valid(loc) ? loc:match_object(ds) | $string_utils:match_object(ds, loc));
player = really;
"....";
dset = {"any", @(ds == "") ? {"none"} | {}};
"\"this\" must be handled manually.";
pset = {"any", @ps ? {$code_utils:full_prep(ps)} | {"none"}};
iset = {"any", @(is == "") ? {"none"} | {}};
return {vrb, {do, ds}, {$code_utils:short_prep(ps), ps}, {io, is}, {y, as}, {dset, pset, iset}};
.
#20:47
"$string_utils:from_value(value [, quote_strings = 0 [, list_depth = 1]])";
"Print the given value into a string.";
value = args[1];
if (length(args) < 2)
quote_strings = 0;
list_depth = 1;
else
quote_strings = args[2];
if (length(args) < 3)
list_depth = 1;
else
list_depth = args[3];
endif
endif
if (typeof(value) == LIST)
if (value)
if (list_depth)
result = ("{" + this:from_value(value[1], quote_strings, list_depth - 1));
for v in (listdelete(value, 1))
result = tostr(result, ", ", this:from_value(v, quote_strings, list_depth - 1));
endfor
return result + "}";
else
return "{...}";
endif
else
return "{}";
endif
elseif (quote_strings)
if (typeof(value) == STR)
result = "\"";
while (q = (index(value, "\"") || index(value, "\\")))
if (value[q] == "\"")
q = min(q, index(value + "\\", "\\"));
endif
result = (((result + value[1..q - 1]) + "\\") + value[q]);
value = value[q + 1..length(value)];
endwhile
return (result + value) + "\"";
elseif (typeof(value) == ERR)
return $code_utils:error_name(value);
else
return tostr(value);
endif
else
return tostr(value);
endif
.
#20:48
"$string_utils:print(value)";
"Print the given value into a string. == from_value(value,1,-1)";
value = args[1];
if (typeof(value) == LIST)
if (value)
result = ("{" + this:print(value[1]));
for val in (listdelete(value, 1))
result = tostr(result, ", ", this:print(val));
endfor
return result + "}";
else
return "{}";
endif
elseif (typeof(value) == STR)
result = "\"";
while (q = (index(value, "\"") || index(value, "\\")))
if (value[q] == "\"")
q = min(q, index(value + "\\", "\\"));
endif
result = (((result + value[1..q - 1]) + "\\") + value[q]);
value = value[q + 1..length(value)];
endwhile
return (result + value) + "\"";
elseif (typeof(value) == ERR)
return $code_utils:error_name(value);
else
return tostr(value);
endif
.
#20:49
"$string_utils:print_suspended(value)";
"Identical to $string_utils:print(value) except that we suspend where needed.";
set_task_perms(caller_perms());
value = args[1];
if (typeof(value) == LIST)
if (value)
result = ("{" + this:print_suspended(value[1]));
for val in (listdelete(value, 1))
result = tostr(result, ", ", this:print_suspended(val));
$command_utils:suspend_if_needed(0);
endfor
return result + "}";
else
return "{}";
endif
elseif (typeof(value) == STR)
result = "\"";
while (q = (index(value, "\"") || index(value, "\\")))
if (value[q] == "\"")
q = min(q, index(value + "\\", "\\"));
endif
result = tostr(result, value[1..q - 1], "\\", value[q]);
value = value[q + 1..length(value)];
$command_utils:suspend_if_needed(0);
endwhile
return (result + value) + "\"";
elseif (typeof(value) == ERR)
return $code_utils:error_name(value);
else
return tostr(value);
endif
.
#20:50
if ((len = length(args[1])) > 50)
return this:reverse(args[1][(len / 2) + 1..len]) + this:reverse(args[1][1..len / 2]);
endif
index = len;
result = "";
while (index > 0)
result = (result + args[1][index]);
index = (index - 1);
endwhile
return result;
.
#20:51
":char_list(string) => string as a list of characters.";
"   e.g., :char_list(\"abad\") => {\"a\",\"b\",\"a\",\"d\"}";
if (30 < (len = length(string = args[1])))
return {@this:char_list(string[1..len / 2]), @this:char_list(string[(len / 2) + 1..len])};
else
l = {};
for c in [1..len]
l = {@l, string[c]};
endfor
return l;
endif
.
#20:52
":regexp_quote(string)";
" => string with all of the regular expression special characters quoted with %";
string = args[1];
quoted = "";
while (m = rmatch(string, "[][$^.*+?].*"))
quoted = (("%" + string[m[1]..m[2]]) + quoted);
string = string[1..m[1] - 1];
endwhile
return string + quoted;
.
#20:53
"Takes the output from connection_name() and returns just the host string portion of it.  Assumes you are using bsd_network style connection names.";
s = args[1];
return s[rindex(s, " ") + 1..length(s)];
.
#20:54
"This is the function that should actually be called to get the host name from a connection name.  The archwizard should change _bsd so as to be calling the verb appropriate for his/her network interface.";
return this:connection_hostname_bsd(@args);
.
#20:55
"$string_utils:from_value(value [, quote_strings = 0 [, list_depth = 1]])";
"Print the given value into a string.";
set_task_perms(caller_perms());
value = args[1];
if (length(args) < 2)
quote_strings = 0;
list_depth = 1;
else
quote_strings = args[2];
if (length(args) < 3)
list_depth = 1;
else
list_depth = args[3];
endif
endif
if (typeof(value) == LIST)
if (value)
if (list_depth)
result = ("{" + this:from_value(value[1], quote_strings, list_depth - 1));
for v in (listdelete(value, 1))
$command_utils:suspend_if_needed(0);
result = tostr(result, ", ", this:from_value(v, quote_strings, list_depth - 1));
endfor
return result + "}";
else
return "{...}";
endif
else
return "{}";
endif
elseif (quote_strings)
if (typeof(value) == STR)
result = "\"";
while (q = (index(value, "\"") || index(value, "\\")))
$command_utils:suspend_if_needed(0);
if (value[q] == "\"")
q = min(q, index(value + "\\", "\\"));
endif
result = (((result + value[1..q - 1]) + "\\") + value[q]);
value = value[q + 1..length(value)];
endwhile
return (result + value) + "\"";
elseif (typeof(value) == ERR)
return $code_utils:error_name(value);
else
return tostr(value);
endif
else
return tostr(value);
endif
.
#20:56
":end_expression(string[,stop_at])";
"  assumes string starts with an expression; returns the index of the last char in expression or 0 if string appears not to be an expression.  Expression ends at any character from stop_at which occurs at top level.";
string = args[1];
stop_at = {@args, " "}[2];
gone = 0;
paren_stack = "";
inquote = 0;
search = (top_level_search = (("[][{}()\"" + strsub(stop_at, "]", "")) + "]"));
paren_search = "[][{}()\"]";
while (m = match(string, search))
char = string[m[1]];
string[1..m[2]] = "";
gone = (gone + m[2]);
if (char == "\"")
"...skip over quoted string...";
char = "\\";
while (char == "\\")
if (!(m = match(string, "%(\\.?%|\"%)")))
return 0;
endif
char = string[m[1]];
string[1..m[2]] = "";
gone = (gone + m[2]);
endwhile
elseif (index("([{", char))
"... push parenthesis...";
paren_stack[1..0] = char;
search = paren_search;
elseif (i = index(")]}", char))
if (paren_stack && ("([{"[i] == paren_stack[1]))
"... pop parenthesis...";
paren_stack[1..1] = "";
search = (paren_stack ? paren_search | top_level_search);
else
"...parenthesis mismatch...";
return 0;
endif
else
"... stop character ...";
return gone - 1;
endif
endwhile
return (!paren_stack) && (gone + length(string));
.
#20:57
":first_word(string) => {first word, rest of string} or {}";
rest = args[1];
"...trim leading blanks...";
rest[1..match(rest, "^ *")[2]] = "";
if (!rest)
return {};
endif
quote = 0;
token = "";
pattern = " +%|\\.?%|\"";
while (m = match(rest, pattern))
"... find the next occurence of a special character, either";
"... a block of spaces, a quote or a backslash escape sequence...";
char = rest[m[1]];
token = (token + rest[1..m[1] - 1]);
if (char == " ")
rest[1..m[2]] = "";
return {token, rest};
elseif (char == "\"")
"... beginning or end of quoted string...";
"... within a quoted string spaces aren't special...";
pattern = ((quote = (!quote)) ? "\\.?%|\"" | " +%|\\.?%|\"");
elseif (m[1] < m[2])
"... char has to be a backslash...";
"... include next char literally if there is one";
token = (token + rest[m[2]]);
endif
rest[1..m[2]] = "";
endwhile
return {token + rest, ""};
.
#20:58
":common(first,second) => length of longest common prefix";
first = args[1];
second = args[2];
r = min(length(first), length(second));
l = 1;
while (r >= l)
h = ((r + l) / 2);
if (first[l..h] == second[l..h])
l = (h + 1);
else
r = (h - 1);
endif
endwhile
return r;
.
#20:59
"wr_utils:title_list/title_listc(<obj-list>[, @<args>)";
"Creates an english list out of the titles of the objects in <obj-list>.  Optional <args> are passed on to $string_utils:english_list.";
"title_listc uses :titlec() for the first item.";
titles = $list_utils:map_verb(args[1], "title");
if (verb[length(verb)] == "c")
if (titles)
titles[1] = args[1][1]:titlec();
elseif (length(args) > 1)
args[2] = $string_utils:capitalize(args[2]);
else
args = listappend(args, "Nothing");
endif
endif
return $string_utils:english_list(titles, @args[2..length(args)]);
.
#20:60
"name_and_number(object [,sepr]) => \"ObjectName (#object)\"";
"Return name and number for object. Second argument is optional separator (for those who want no space, use \"\")";
what = args[1];
sepr = ((length(args) > 1) ? args[2] | " ");
name = (valid(what) ? what.name | {"<invalid>", "$nothing", "$ambiguous_match", "$failed_match"}[1 + (what in {#-1, #-2, #-3})]);
return tostr(name, sepr, "(", what, ")");
.
#20:61
":name_and_number_list(object|list-of-objects[, @english-list-args])";
"construct a list of the given objects in the form \"Munchkin (#xxx)\".  See $string_utils:english_list for the meanings of the optional english-list-args.";
nnlist = {};
for o in ((typeof(objects = args[1]) == LIST) ? objects | {objects})
nnlist = {@nnlist, this:nn(o)};
endfor
return this:english_list(nnlist, @listdelete(args, 1));
.
#20:62
"Copied from string utilities (#20):columnize by Rog (#4292) Sun Dec 20 22:59:33 1992 PST";
"columnize (items, n [, width]) - Turn a one-column list of items into an n-column list. 'width' is the last character position that may be occupied; it defaults to a standard screen width. Example: To tell the player a list of numbers in three columns, do 'player:tell_lines ($string_utils:columnize ({1, 2, 3, 4, 5, 6, 7}, 3));'.";
items = args[1];
n = args[2];
width = ((length(args) >= 3) ? args[3] | 79);
height = (((length(items) + n) - 1) / n);
items = {@items, @$list_utils:make((height * n) - length(items), "")};
colwidths = {};
for col in [1..n - 1]
colwidths = listappend(colwidths, 1 - (((width + 1) * col) / n));
endfor
result = {};
for row in [1..height]
line = tostr(items[row]);
for col in [1..n - 1]
line = tostr(this:left(line, colwidths[col]), " ", items[row + (col * height)]);
endfor
$command_utils:suspend_if_needed(0);
result = listappend(result, line[1..min(length(line), width)]);
endfor
return result;
.
#20:63
":a_or_an(<noun>) => \"a\" or \"an\"";
"To accomodate personal variation (e.g., \"an historical book\"), a player can override this by having a personal a_or_an verb.  If that verb returns 0 instead of a string, the standard algorithm is used.";
noun = args[1];
if ($object_utils:has_verb(player, "a_or_an") && ((custom_result = player:a_or_an(noun)) != 0))
return custom_result;
endif
if (noun in this.use_article_a)
return "a";
endif
if (noun in this.use_article_an)
return "an";
endif
a_or_an = "a";
if (noun != "")
if (index("aeiou", noun[1]))
a_or_an = "an";
"unicycle, unimplemented, union, united, unimpressed, unique";
if ((((noun[1] == "u") && (length(noun) > 2)) && (noun[2] == "n")) && ((index("aeiou", noun[3]) == 0) || (((noun[3] == "i") && (length(noun) > 3)) && (index("aeioubcghqwyz", noun[4]) || ((length(noun) > 4) && index("eiy", noun[5]))))))
a_or_an = "a";
endif
endif
endif
return a_or_an;
"Ported by Mickey with minor tweaks from a Moo far far away.";
"Last modified Sun Aug  1 22:53:07 1993 EDT by BabyBriar (#2).";
.
#20:64
"index_all(string,target) -- returns list of positions of target in string.";
"Usage: $string_utils:index_all(<string,pattern>)";
"       $string_utils:index_all(\"aaabacadae\",\"a\")";
if (length(args) != 2)
return E_ARGS;
elseif ((typeof(args[1]) != STR) || typeof(args[2] != STR))
return E_TYPE;
else
line = args[1];
pattern = args[2];
where = {};
place = -1;
length = length(line);
next = 0;
while ((place = index(line[next + 1..length], pattern)) != 0)
where = {@where, place + next};
next = (((place + next) + length(pattern)) - 1);
endwhile
return where;
endif
.
#20:65
"Copied from Puff (#1449):match_stringlist Tue Oct 19 08:18:13 1993 PDT";
"$string_utils:match_stringlist(string, {list of strings})";
"The list of strings should be just that, a list of strings.  The first string is matched against the list of strings.";
"If it exactly matches exactly one of them, the index of the match is returned. If it exactly matches more than one of them, $ambiguous_match is returned.";
"If there are no exact matches, then partial matches are considered, ones in which the given string is a prefix of one of the strings.";
"Again, if exactly one match is found, the index of that string is returned, and if more than one match is found, $ambiguous match is returned.";
"Finally, if there are no exact or partial matches, then $failed_match is returned.";
if (((length(args) < 2) || (args[1] == "")) || (length(args[2]) < 1))
return $nothing;
endif
subject = args[1];
stringlist = args[2];
matches = {};
"First check for exact matches.";
for i in [1..length(stringlist)]
if (subject == stringlist[i])
matches = {@matches, i};
endif
endfor
"Now return a match, or $ambiguous, or check for partial matches.";
if (length(matches) == 1)
return matches[1];
elseif (length(matches) > 1)
return $ambiguous_match;
elseif (length(matches) == 0)
"Checking for partial matches is almost identical to checking for exact matches, but we use index(list[i], target) instead of list[i] == target to see if they match.";
for i in [1..length(stringlist)]
if (index(stringlist[i], subject) == 1)
matches = {@matches, i};
endif
endfor
if (length(matches) == 1)
return matches[1];
elseif (length(matches) > 1)
return $ambiguous_match;
elseif (length(matches) == 0)
return $failed_match;
endif
endif
.
#21:0
"make_exit(spec, source, dest,[really-create-or-recycle])";
"Uses $recycler by default; supplying really-create as 0 suppresses this.";
"Returns the object number as a list if successful, 0 if not.";
set_task_perms(caller_perms());
spec = args[1];
source = args[2];
dest = args[3];
if (length(args) > 3)
recreate_enabled = args[4];
else
recreate_enabled = 1;
endif
if (recreate_enabled)
exit = $recycler:_create($exit);
else
exit = create($exit);
endif
if (typeof(exit) == ERR)
player:tell(exit);
return;
endif
$building_utils:set_names(exit, spec);
exit.source = source;
exit.dest = dest;
source_ok = source:add_exit(exit);
dest_ok = dest:add_entrance(exit);
move(exit, $nothing);
via = $string_utils:from_value(setadd(exit.aliases, exit.name), 1);
if (source_ok)
player:tell("Exit from ", source.name, " (", source, ") to ", dest.name, " (", dest, ") via ", via, " created with id ", exit, ".");
if (!dest_ok)
player:tell("However, I couldn't add ", exit, " as a legal entrance to ", dest.name, ".  You may have to get its owner, ", dest.owner.name, " to add it for you.");
endif
return {exit};
elseif (dest_ok)
player:tell("Exit to ", dest.name, " (", dest, ") via ", via, " created with id ", exit, ".  However, I couldn't add ", exit, " as a legal exit from ", source.name, ".  Get its owner, ", source.owner.name, " to add it for you.");
return {exit};
elseif (0)
"I considered using this for awhile. -- Lambda";
player:tell("Exit to ", dest.name, " (", dest, ") via ", via, " created with id ", exit, ".  However, I couldn't add ", exit, " as EITHER a legal exit from ", source.name, " OR as a legal entrance to ", dest.name, ".  Get their owners, ", source.owner.name, " and ", dest.owner.name, ", respectively, to add it for you.");
return 0;
else
if (recreate_enabled)
$recycler:_recycle(exit);
else
recycle(exit);
endif
player:tell("I couldn't add a new exit as EITHER a legal exit from ", source.name, " OR as a legal entrance to ", dest.name, ".  Get their owners, ", source.owner.name, " and ", dest.owner.name, ", respectively, to add it for you.");
return 0;
endif
.
#21:1
"$building_utils:set_names(object, spec)";
set_task_perms(caller_perms());
object = args[1];
names = this:parse_names(args[2]);
name = (names[1] || object.name);
return object:set_name(name) && object:set_aliases(names[2]);
.
#21:2
":recreate(object,newparent) -- effectively recycle and recreate the specified object as a child of parent.  Returns true if successful.";
object = args[1];
parent = args[2];
who = caller_perms();
if (!(valid(object) && valid(parent)))
return E_INVARG;
elseif (who.wizard)
"no problemo";
elseif ((who != object.owner) || ((who != parent.owner) && (!parent.f)))
return E_PERM;
endif
"Chparent any children to their grandparent instead of orphaning them horribly.  Have to do the chparent with wizperms, in case the children are owned by others, so do this before set_task_perms.";
for c in (children(object))
chparent(c, parent(object));
endfor
set_task_perms(who);
if ($object_utils:has_callable_verb(object, "recycle"))
object:recycle();
endif
chparent(object, #-1);
for p in (properties(object))
delete_property(object, p);
endfor
for v in (verbs(object))
delete_verb(object, "0");
endfor
for item in (object.contents)
move(item, #-1);
endfor
chparent(object, parent);
object.name = "";
if ($object_utils:has_verb(parent, "initialize"))
object:initialize();
endif
object.r = 0;
object.f = 0;
object.w = 0;
return 1;
.
#21:3
"transfer_ownership(object, oldowner, newowner)";
"Transfer ownership of object from oldowner to newowner.";
if (!((caller == this) || caller_perms().wizard))
return E_PERM;
endif
what = args[1];
if (valid(from = args[2]) && (typeof(from.owned_objects) == LIST))
from.owned_objects = setremove(from.owned_objects, what);
endif
if (valid(to = args[3]) && (typeof(from.owned_objects) == LIST))
to.owned_objects = setadd(to.owned_objects, what);
$wiz_utils:set_owner(what, to);
endif
.
#21:4
"$building_utils:parse_names(spec)";
"Return {name, {alias, alias, ...}} from name,alias,alias or name:alias,alias";
spec = args[1];
if (!(colon = index(spec, ":")))
aliases = $string_utils:explode(spec, ",");
name = aliases[1];
else
aliases = $string_utils:explode(spec[colon + 1..length(spec)], ",");
name = spec[1..colon - 1];
endif
return {name, $list_utils:map_arg($string_utils, "trim", aliases)};
.
#21:5
cl = {$player, $room, $exit, $note, $container, $thing};
cs = {"p", "R", "E", "N", "C", "T"};
if (is_player(OBJ = args[1]))
return "P";
endif
while (valid(OBJ))
if (i = (OBJ in cl))
return cs[i];
endif
OBJ = parent(OBJ);
endwhile
return " ";
.
#21:6
o = args[1];
if ((length(args) == 2) && args[2])
kids = 0;
for k in (children(o))
$command_utils:suspend_if_needed(0);
if (k.owner != o.owner)
kids = 2;
elseif (kids == 0)
kids = 1;
endif
endfor
"The verbs() call below might fail, but that's OK";
v = verbs(o);
if (v)
vstr = tostr("[", $string_utils:right(length(v), 3), "] ");
else
vstr = "      ";
endif
if (o.r && o.f)
r = "f";
elseif (o.r)
r = "r";
elseif (o.f)
r = "F";
else
r = " ";
endif
vstr = tostr(" kK"[kids + 1], r, $building_utils:audit_object_category(o), vstr);
else
vstr = "";
endif
if (valid(o.location))
loc = (((((o.location.owner == o.owner) ? " " | "*") + "[") + o.location.name) + "]");
elseif ($object_utils:has_property(o, "dest") && $object_utils:has_property(o, "source"))
if (typeof(o.source) != OBJ)
source = " <non-object> ";
elseif (!valid(o.source))
source = "<invalid>";
else
source = o.source.name;
if (o.source.owner != o.owner)
source = ("*" + source);
endif
endif
if (typeof(o.dest) != OBJ)
destin = " <non-object> ";
elseif (!valid(o.dest))
destin = "<invalid>";
else
destin = o.dest.name;
if (o.dest.owner != o.owner)
destin = ("*" + destin);
endif
endif
srclen = ((length(source) < 20) ? length(source) | 19);
destlen = ((length(destin) < 20) ? length(destin) | 19);
loc = (((" " + source[1..srclen]) + "->") + destin[1..destlen]);
elseif ($object_utils:isa(o, $room))
loc = "";
for x in (o.entrances)
if (((((typeof(x) == OBJ) && valid(x)) && (x.owner != o.owner)) && $object_utils:has_property(x, "dest")) && (x.dest == o))
loc = (((loc + (loc ? ", " | "")) + "<-*") + x.name);
endif
endfor
else
loc = " [Nowhere]";
endif
if (length(loc) > 41)
loc = (loc[1..37] + "..]");
endif
namelen = ((length(o.name) < 30) ? length(o.name) | 29);
return tostr(vstr, $string_utils:right(o, 6), " ", $string_utils:left(o.name[1..namelen], 30), loc);
.
#21:7
":do_audit(who, start, end, match)";
"audit who, with objects from start to end that match 'match'";
":do_prospectus(...)";
"same, but with verb counts";
who = args[1];
start = args[2];
end = args[3];
match = args[4];
player:tell(tostr("Objects owned by ", who.name, " (from #", start, " to #", end, match ? " matching " + match | "", ")", ":"));
count = 0;
if (typeof(who.owned_objects) == LIST)
for o in (who.owned_objects)
$command_utils:suspend_if_needed(0);
if ((tonum(o) >= start) && (tonum(o) <= end))
count = (count + this:do_audit_item(o, match, verb == "do_prospectus"));
endif
endfor
else
for i in [start..end]
$command_utils:suspend_if_needed(0);
count = (count + this:do_audit_item(o, match, verb == "do_prospectus"));
endfor
endif
player:tell($string_utils:left(tostr("-- ", count, " object", (count == 1) ? "." | "s."), player:linelen() - 1, "-"));
.
#21:8
o = args[1];
match = args[2];
pros = args[3];
found = (match ? 0 | 1);
names = {o.name, @o.aliases};
while (names && (!found))
if (index(names[1], match) == 1)
found = 1;
endif
names = listdelete(names, 1);
endwhile
if (found)
player:tell(this:object_audit_string(o, pros));
return 1;
endif
return 0;
.
#22:0
if ($code_utils:parse_verbref(what = args[1]))
"... hey wow, I found it!...";
return {what};
else
return {};
endif
.
#22:1
"Help facility for verbs that people have bothered to document.  If the argument is a verb specification, this retrieves the code and prints any documentation lines that might be at the beginning.  Returns true if the arg can actually be interpreted as a verb specification, whether or not it is a correct one.";
set_task_perms(caller_perms());
if (!(spec = $code_utils:parse_verbref(args[1])))
return 0;
elseif ($command_utils:object_match_failed(object = $string_utils:match_object(spec[1], player.location), spec[1]))
return 1;
elseif (!(hv = $object_utils:has_verb(object, spec[2])))
return "That object does not define that verb.";
elseif (typeof(verbdoc = $code_utils:verb_documentation(object = hv[1], spec[2])) == ERR)
return tostr(verbdoc);
elseif (typeof(info = verb_info(object, spec[2])) == ERR)
return tostr(info);
else
objverb = tostr(object.name, "(", object, "):", strsub(info[3], " ", "/"));
if (verbdoc)
return {tostr("Information about ", objverb), "----", @verbdoc};
else
return tostr("No information about ", objverb);
endif
endif
.
#22:2
set_task_perms(caller_perms());
if (!(spec = $code_utils:parse_verbref(args[1])))
return E_INVARG;
elseif ($command_utils:object_match_failed(object = $string_utils:match_object(spec[1], player.location), spec[1]))
return E_INVARG;
elseif (!(hv = $object_utils:has_verb(object, spec[2])))
return E_VERBNF;
elseif (typeof(vd = $code_utils:verb_documentation(hv[1], spec[2])) != LIST)
return vd;
else
return {tostr(";$code_utils:set_verb_documentation(", $code_utils:corify_object(hv[1]), ",", $string_utils:print(spec[2]), ",$command_utils:read_lines())"), @$command_utils:dump_lines(vd)};
endif
.
#23:0
if (!args)
l = {};
for p in (properties(#0))
if ((p[max(1, length(p) - 5)..length(p)] == "_utils") && #0.(p).description)
l = {@l, "$" + p};
endif
endfor
return {@pass(@args), @l};
elseif (ts = pass(@args))
return ts;
elseif ((what = args[1])[1] != "$")
return {};
elseif (ts = pass("$generic_" + what[2..length(what)]))
return ts;
elseif ((r = rindex(w = strsub(what[2..length(what)], "-", "_"), "_utils")) && ((r == (length(w) - 5)) && (valid(#0.(w)) && #0.(w).description)))
return {what};
else
return {};
endif
.
#23:1
topic = args[1];
if ((topic == (("$" + topic[2..length(topic) - 5]) + "utils")) && (valid(#0.(w = strsub(topic[2..length(topic)], "-", "_"))) && (uhelp = #0.(w):description())))
return {tostr("General information on $", w, ":"), "----", @uhelp};
else
return pass(@args);
endif
.
#23:2
if ((E_PROPNF != (text = pass(@args))) || ((args[1][1] != "$") || ((!((uprop = args[1][2..length(args[1])]) in properties(#0))) || (typeof(uobj = #0.(uprop)) != OBJ))))
return text;
else
udesc = uobj.description;
return {tostr(";;$", uprop, ".description = $command_utils:read_lines()"), @$command_utils:dump_lines((typeof(udesc) == LIST) ? udesc | {udesc})};
endif
.
#24:0
text = args[1];
for i in [1..length($code_utils.error_list)]
text = {@text, tostr("    ", $string_utils:left($code_utils.error_names[i], 15), $code_utils.error_list[i])};
endfor
return text;
.
#24:1
text = args[1];
for p in ($code_utils:prepositions())
text = {@text, tostr($string_utils:space(4), p)};
endfor
return text;
.
#26:0
":set_programmer(victim[,mail from])  => 1 or error.";
"Sets victim.programmer, chparents victim to $prog if necessary, and sends mail to $new_prog_log, mail is from optional second arg or caller_perms().";
whodunnit = caller_perms();
mailfrom = ((length(args) == 2) ? args[2] | whodunnit);
if (!whodunnit.wizard)
return E_PERM;
elseif (!(valid(victim = args[1]) && (is_player(victim) && $object_utils:isa(victim, $player))))
return E_INVARG;
elseif (victim.programmer)
return E_NONE;
elseif (typeof(e = (victim.programmer = 1)) == ERR)
return e;
else
oldquota = victim.ownership_quota;
if (!$object_utils:isa(victim, $prog))
if (typeof(e = chparent(victim, $prog)) == ERR)
"...this isn't really supposed to happen but it could...";
player:notify(tostr("chparent(", victim, ",", $prog, ") failed:  ", e));
player:notify("Check for common properties.");
endif
else
player:notify(tostr(victim.name, " was already a child of ", parent(victim).name, " (", parent(victim), ")"));
endif
if ($object_utils:has_property($local, "second_char_registry") && (victim in $local.second_char_registry.secondary))
"don't increment quota for 2nd chars when programmering";
victim.ownership_quota = oldquota;
else
victim.ownership_quota = (oldquota + (this.default_programmer_quota - this.default_player_quota));
endif
$mail_agent:send_message(mailfrom, {$new_prog_log, victim}, tostr("@programmer ", victim.name, " (", victim, ")"), tostr("I just gave ", victim.name, " a programmer bit."));
return 1;
endif
.
#26:1
":set_player(victim[,nochown]) => 1 or error";
"Set victim's player flag, (maybe) chown to itself, add name and aliases to $player_db.";
" E_NONE == already a player,";
" E_NACC == player_db is frozen,";
" E_RECMOVE == name is unavailable";
if (!caller_perms().wizard)
return E_PERM;
elseif (!(valid(victim = args[1]) && $object_utils:isa(victim, $player)))
return E_INVARG;
elseif (is_player(victim))
return E_NONE;
elseif ($player_db.frozen)
return E_NACC;
elseif (!$player_db:available(name = victim.name))
return E_RECMOVE;
else
set_player_flag(victim, 1);
if ($object_utils:isa(victim, $prog))
victim.programmer = 1;
else
victim.programmer = $player.programmer;
endif
if (!{@args, 0}[2])
$wiz_utils:set_owner(victim, victim);
endif
$player_db:insert(name, victim);
for a in (setremove(aliases = victim.aliases, name))
if (index(a, " "))
"..ignore ..";
elseif ($player_db:available(a) in {this, 1})
$player_db:insert(a, victim);
else
aliases = setremove(aliases, a);
endif
endfor
victim.aliases = setadd(aliases, name);
return 1;
endif
.
#26:2
":set_owner(object,newowner[,suspendok])  does object.owner=newowner, taking care of c properties as well.  This should be used anyplace one is contemplating doing object.owner=newowner, since the latter leaves ownership of c properties unchanged.  (--Rog thinks this is a server bug).";
if (!valid(object = args[1]))
return E_INVIND;
elseif (!caller_perms().wizard)
return E_PERM;
elseif (!(valid(newowner = args[2]) && is_player(newowner)))
return E_INVARG;
endif
suspendok = {@args, 0}[3];
oldowner = object.owner;
object.owner = newowner;
for pname in ($object_utils:all_properties(object))
if (suspendok && ((ticks_left() < 5000) || (seconds_left() < 2)))
suspend(0);
endif
perms = property_info(object, pname)[2];
if (index(perms, "c"))
set_property_info(object, pname, {newowner, perms});
endif
endfor
if ($object_utils:isa(oldowner, $player))
if (is_player(oldowner) && (object != oldowner))
oldowner.ownership_quota = (oldowner.ownership_quota + 1);
endif
if (typeof(oldowner.owned_objects) == LIST)
oldowner.owned_objects = setremove(oldowner.owned_objects, object);
endif
endif
if ($object_utils:isa(newowner, $player))
if (object != newowner)
newowner.ownership_quota = (newowner.ownership_quota - 1);
endif
if (typeof(newowner.owned_objects) == LIST)
newowner.owned_objects = setadd(newowner.owned_objects, object);
endif
endif
return 1;
.
#26:3
":set_property_owner(object,prop,newowner[,suspendok])  changes the ownership of object.prop to newowner.  If the property is !c, changes the ownership on all of the descendents as well.  Otherwise, we just chown the property on the object itself and give a warning if newowner!=object.owner (--Rog thinks this is a server bug that one is able to do this at all...).";
if (!caller_perms().wizard)
return E_PERM;
elseif (!(info = property_info(object = args[1], pname = args[2])))
"... handles E_PROPNF and invalid object errors...";
return info;
elseif (!is_player(newowner = args[3]))
return E_INVARG;
elseif (index(info[2], "c"))
if ({@args, 0}[4] / 2)
"...(recursive call)...";
"...child property is +c while parent is -c??...RUN AWAY!!";
return E_NONE;
else
set_property_info(object, pname, listset(info, newowner, 1));
return (newowner == object.owner) || E_NONE;
endif
else
set_property_info(object, pname, listset(info, newowner, 1));
if ((suspendok = ({@args, 0}[4] % 2)) && ((ticks_left() < 10000) || (seconds_left() < 2)))
suspend(0);
endif
suspendok = (2 + suspendok);
for c in (children(object))
this:set_property_owner(c, pname, newowner, suspendok);
endfor
return 1;
endif
.
#26:4
":unset_player(victim[,newowner])  => 1 or error";
"Reset victim's player flag, chown victim to newowner (if given), remove all of victim's names and aliases from $player_db.";
if (!caller_perms().wizard)
return E_PERM;
elseif (!valid(victim = args[1]))
return E_INVARG;
elseif (!is_player(victim))
return E_NONE;
endif
if (length(args) >= 2)
$wiz_utils:set_owner(victim, args[2]);
endif
victim.programmer = 0;
victim.wizard = 0;
set_player_flag(victim, 0);
if ($player_db.frozen)
player:tell("Warning:  player_db is in the middle of a :load().");
endif
$player_db:delete2(victim.name, victim);
for a in (victim.aliases)
$player_db:delete2(a, victim);
endfor
return 1;
.
#26:5
":set_property_flags(object,prop,flags[,suspendok])  changes the permissions on object.prop to flags.  Unlike a mere set_property_info, this changes the flags on all descendant objects as well.  We also change the ownership on the descendent properties where necessary.";
object = args[1];
pname = args[2];
flags = args[3];
suspendok = {@args, 0}[4];
perms = caller_perms();
if (!(info = property_info(object, pname)))
"... handles E_PROPNF and invalid object errors...";
return info;
elseif ($set_utils:difference($string_utils:char_list(flags), {"r", "w", "c"}))
"...not r, w, or c?...";
return E_INVARG;
elseif ((pinfo = property_info(parent(object), pname)) && (flags != pinfo[2]))
"... property doesn't actually live here...";
"... only allowed to correct so that this property matches parent...";
return E_INVARG;
elseif (!(perms.wizard || (info[1] == perms)))
"... you have to own the property...";
return E_PERM;
elseif (!(((!(c = index(flags, "c"))) == (!index(info[2], "c"))) || $perm_utils:controls(perms, object)))
"... if you're changing the c flag, you have to own the object...";
return E_PERM;
else
if (c)
set_property_info(object, pname, {object.owner, kflags = flags});
else
set_property_info(object, pname, kflags = listset(info, flags, 2));
endif
for kid in (children(object))
this:_set_property_flags(kid, pname, kflags, suspendok);
endfor
return 1;
endif
.
#26:6
"_set_property_flags(object, pname, {owner, flags} or something+\"c\", suspendok)";
"auxiliary to :set_property_flags... don't call this directly.";
if (caller != this)
return E_PERM;
endif
if (args[4] && $command_utils:running_out_of_time(0))
suspend(0);
endif
object = args[1];
if (typeof(args[3]) != LIST)
set_property_info(object, args[2], {object.owner, args[3]});
else
set_property_info(@args[1..3]);
endif
for kid in (children(object))
this:_set_property_flags(@listset(args, kid, 1));
endfor
.
#26:7
"Generate a random password of length args[1].  Alternates vowels and consonants, for maximum pronounceability.  Uses its own list of consonants which exclude F and C and K to prevent generating obscene sounding passwords.";
vowels = "aeiouy";
consonants = "bdghjlmnpqrstvwxz";
len = tonum(args[1]);
if (len)
alt = (random(2) - 1);
s = "";
for i in [1..len]
s = (s + (alt ? vowels[random(6)] | consonants[random(17)]));
alt = (!alt);
endfor
return s;
else
return E_INVARG;
endif
.
#26:8
":queued_tasks(player) => list of queued tasks for that player.";
"shouldn't the server builtin should work this way?  oh well";
set_task_perms(caller_perms());
if (typeof(e = set_task_perms(who = args[1])) == ERR)
return e;
elseif (who.wizard)
tasks = {};
for t in (queued_tasks())
if (t[5] == who)
tasks = {@tasks, t};
endif
endfor
return tasks;
else
return queued_tasks();
endif
.
#26:10
"Return 1 if args[1] is a newted player.  0 if not, or if some error.  Maybe should do better in the error case.  Feel free :-)";
if (!caller_perms().wizard)
return E_PERM;
else
"return verb_code($wiz_utils, \"newt_confunc\") == verb_code(args[1], \"confunc\")";
return verb_info(args[1], "confunc")[1].wizard && (!args[1].wizard);
endif
.
#26:11
player:notify_lines({"", $login:newt_registration_string(), ""});
set_task_perms(this);
boot_player(player);
.
#26:12
if (!caller_perms().wizard)
return E_PERM;
else
player:tell("Beginning initialize_owned:  ", ctime());
for n in [0..tonum(max_object())]
o = toobj(n);
if (valid(o))
if ($object_utils:isa(owner = o.owner, $player) && (typeof(owner.owned_objects) == LIST))
owner.owned_objects = setadd(owner.owned_objects, o);
endif
endif
$command_utils:suspend_if_needed(0);
endfor
player:tell("Done adding, beginning verification pass.");
this:verify_owned_objects();
player:tell("Finished:  ", ctime());
endif
.
#26:13
if (!caller_perms().wizard)
return E_PERM;
else
for p in (players())
if (typeof(p.owned_objects) == LIST)
for o in (p.owned_objects)
if (((typeof(o) != OBJ) || (!valid(o))) || (o.owner != p))
p.owned_objects = setremove(p.owned_objects, o);
if (((typeof(o) == OBJ) && valid(o)) && (typeof(o.owner.owned_objects) == LIST))
o.owner.owned_objects = setadd(o.owner.owned_objects, o);
endif
endif
$command_utils:suspend_if_needed(0);
endfor
endif
endfor
endif
.
#26:14
":connected_wizards() => list of currently connected wizards and players mentioned in .public_identity properties as being wizard counterparts.";
wizzes = $object_utils:leaves($wiz);
wlist = {};
for w in (wizzes)
if (w.wizard)
if (connected_seconds(w))
wlist = setadd(wlist, w);
endif
if (connected_seconds(w.public_identity))
wlist = setadd(wlist, w.public_identity);
endif
endif
endfor
return wlist;
.
#26:15
":all_wizards() => list of all wizards and players mentioned in .public_identity properties as being wizard counterparts.";
wizzes = $object_utils:leaves($wiz);
wlist = {};
for w in (wizzes)
if (w.wizard)
if (is_player(w))
wlist = setadd(wlist, w);
endif
if (is_player(w.public_identity))
wlist = setadd(wlist, w.public_identity);
endif
endif
endfor
return wlist;
.
#26:16
":rename_all_instances(object,oldname,newname)";
"Used to rename all instances of an unwanted verb (like recycle or disfunc)";
"if said verb is actually defined on the object itself";
if (caller_perms().wizard)
found = 0;
object = args[1];
objverb = args[1..2];
newname = args[3];
while (info = verb_info(@objverb))
set_verb_info(@objverb, listset(info, newname, 3));
found = 1;
endwhile
return found;
else
return E_PERM;
endif
.
#26:17
miss = args[1];
if (!(index = (miss in this.missed_help_strings)))
this.missed_help_strings = {miss, @this.missed_help_strings};
this.missed_help_counters = {{0, 0}, @this.missed_help_counters};
index = 1;
endif
which = (args[2] ? 2 | 1);
this.missed_help_counters[index][which] = (this.missed_help_counters[index][which] + 1);
.
#26:18
mhs = this.missed_help_strings;
cnt = this.missed_help_counters;
"save values first, so subsequent changes during suspends wont affect it";
thresh = (args ? args[1] | 5);
strs = {};
for i in [1..length(mhs)]
$command_utils:suspend_if_needed(0);
if ((cnt[i][1] + cnt[i][2]) > thresh)
strs = {@strs, ((($string_utils:right(tostr(cnt[i][1]), 5) + " ") + $string_utils:right(tostr(cnt[i][2]), 5)) + " ") + mhs[i]};
endif
endfor
sorted = $list_utils:sort_suspended(0, strs);
len = length(sorted);
player:tell(" miss ambig word");
for x in [1..len]
$command_utils:suspend_if_needed(0);
player:tell(sorted[(len - x) + 1]);
endfor
player:tell(" - - - - - - - - -");
.
#26:19
if (caller_perms().wizard)
pass();
this.missed_help_counters = (this.missed_help_strings = {});
endif
.
#26:20
":show_netwho_listing(tell,player_list)";
" prints a listing of the indicated players showing connect sites.";
if (!caller_perms().wizard)
return E_PERM;
endif
who = args[1];
if (!(unsorted = args[2]))
return;
endif
su = $string_utils;
alist = {};
footnotes = {};
nwidth = length("Player name");
for u in (unsorted)
$command_utils:suspend_if_needed(0);
if (u.programmer)
pref = "% ";
footnotes = setadd(footnotes, "prog");
else
pref = "  ";
endif
if (u in connected_players())
lctime = ctime(time() - connected_seconds(u));
where = connection_name(u);
else
lctime = ctime(u.last_connect_time);
where = u.last_connect_place;
endif
name = u.name;
if (length(name) > 15)
name = (name[1..13] + "..");
endif
u3 = {tostr(pref, u.name, " (", u, ")"), lctime[5..10] + lctime[20..24]};
nwidth = max(length(u3[1]), nwidth);
where = $string_utils:connection_hostname(where);
if ($login:blacklisted(where))
where = ("(*) " + where);
footnotes = setadd(footnotes, "black");
elseif ($login:graylisted(where))
where = ("(+) " + where);
footnotes = setadd(footnotes, "gray");
endif
alist = {@alist, {@u3, where}};
endfor
alist = $list_utils:sort_alist_suspended(0, alist, 3);
$command_utils:suspend_if_needed(0);
headers = {"Player name", "Last Login", "From Where"};
before = {0, nwidth + 3, (nwidth + length(ctime(0))) - 11};
tell1 = ("  " + headers[1]);
tell2 = ("  " + su:space(headers[1], "-"));
for j in [2..3]
tell1 = (su:left(tell1, before[j]) + headers[j]);
tell2 = (su:left(tell2, before[j]) + su:space(headers[j], "-"));
endfor
who:notify(tell1);
who:notify(tell2);
for a in (alist)
$command_utils:suspend_if_needed(0);
tell1 = a[1];
for j in [2..3]
tell1 = (su:left(tell1, before[j]) + a[j]);
endfor
who:notify(tell1[1..min(length(tell1), 79)]);
endfor
if (footnotes)
who:notify("");
if ("prog" in footnotes)
who:notify(" %  == programmer.");
endif
if ("black" in footnotes)
who:notify("(*) == blacklisted site.");
endif
if ("gray" in footnotes)
who:notify("(+) == graylisted site.");
endif
endif
.
#26:21
":show_netwho_from_listing(tell,site)";
"@net-who from hoststring prints all players who have connected from that host or host substring.  Substring can include *'s, e.g. @net-who from *.foo.edu.";
if (!caller_perms().wizard)
return E_PERM;
endif
tellwho = args[1];
su = $string_utils;
if (!index(where = args[2], "*"))
"Oh good... search for users from a site... the fast way.  No wild cards.";
nl = 0;
bozos = {};
sites = $site_db:find_all_keys(where);
while (sites)
s = sites;
sites = {};
for domain in (s)
for b in ($site_db:find_exact(domain))
if (typeof(b) == STR)
sites = setadd(sites, (b + ".") + domain);
else
bozos = setadd(bozos, b);
nl = max(length(tostr(b, (valid(b) && is_player(b)) ? b.name | "*** recreated ***")), nl);
endif
endfor
endfor
endwhile
if (bozos)
tellwho:notify(tostr(su:left("  Player", nl + 7), "From"));
tellwho:notify(tostr(su:left("  ------", nl + 7), "----"));
for who in (bozos)
st = su:left(tostr((valid(who) && is_player(who)) ? (who.programmer ? "% " | "  ") + who.name | "", " (", who, ")"), nl + 7);
comma = 0;
if ($object_utils:isa(who, $player) && is_player(who))
for p in ({who.email_address || "*Unregistered*", @who.all_connect_places})
if (comma && (length(p) >= (78 - length(st))))
tellwho:notify(tostr(st, ","));
st = (su:space(nl + 7) + p);
else
st = tostr(st, comma ? ", " | "", p);
endif
comma = 1;
$command_utils:suspend_if_needed(0);
endfor
else
st = (st + (valid(who) ? "*** recreated ***" | "*** recycled ***"));
endif
tellwho:notify(st);
endfor
tellwho:notify("");
tellwho:notify(tostr(length(bozos), " player", (length(bozos) == 1) ? "" | "s", " found."));
else
tellwho:notify(tostr("No sites matching `", where, "'"));
endif
else
"User typed 'from'.  Go search for users from this site.  (SLOW!)";
howmany = 0;
for who in (players())
$command_utils:suspend_if_needed(0);
matches = {};
for name in (who.all_connect_places)
if ((index(where, "*") && su:match_string(name, where)) || ((!index(where, "*")) && index(name, where)))
matches = {@matches, name};
endif
endfor
if (matches)
howmany = (howmany + 1);
tellwho:notify(tostr(who.name, " (", who, "): ", su:english_list(matches)));
endif
endfor
tellwho:notify(tostr(howmany || "No", " matches found."));
endif
.
#26:22
":check_player_request(name [,email [,connection]])";
" check if the request for player and email address is valid;";
" return empty string if it valid, or else a string saying why not.";
" The result starts with - if this is a 'send email, don't try again' situation.";
":check_reregistration(name, email, connection)";
"  name is ignored, only check the 'email' parts";
if (!caller_perms().wizard)
return E_PERM;
"accesses registration information -- wiz only";
endif
name = args[1];
if (verb == "check_reregistration")
"don't check player name";
elseif (!name)
return "A blank name isn't allowed.";
elseif (name == "<>")
return "Names with angle brackets aren't allowed.";
elseif (index(name, " "))
return "Names with spaces are not allowed. Use dashes or underscores.";
elseif (match(name, "^<.*>$"))
return tostr("Try using ", name[2..length(name)], " instead of ", name, ".");
elseif ($player_db.frozen)
return "New players cannot be created at the moment, try again later.";
elseif (!$player_db:available(name))
return ("The name '" + name) + "' is not available.";
elseif ($login:_match_player(name) != $failed_match)
return ("The name '" + name) + "' doesn't seem to be available.";
endif
if (length(args) == 1)
"no email address supplied.";
return "";
endif
address = args[2];
if ($registration_db:suspicious_address(address))
return "-There has already been a character with that or a similar email address.";
endif
if (reason = $network:invalid_email_address(address))
return reason;
endif
parsed = $network:parse_address(address);
if ($registration_db:suspicious_userid(parsed[1]))
return tostr("-Automatic registration from an account named ", parsed[1], " is not allowed.");
endif
connection = ((length(args) > 2) ? args[3] | parsed[2]);
if ((connection[max(length(connection) - 2, 1)..length(connection)] == ".uk") && (parsed[2][1..3] == "uk."))
return tostr("Addresses must be in internet form. Try ", parsed[1], "@", $string_utils:from_list($list_utils:reverse($string_utils:explode(parsed[2], ".")), "."), ".");
elseif (match(connection, "^[0-9.]+$"))
return "-The system cannot resolve the name of the system you're connected from.";
elseif ((a = $network:local_domain(connection)) != (b = $network:local_domain(parsed[2])))
return tostr("-The connection is from '", a, "' but the mail address is '", b, "'; these don't seem to be the same place.");
elseif ($login:spooflisted(parsed[2]))
return tostr("-Automatic registration is not allowed from ", parsed[2], ".");
endif
return "";
.
#26:23
"create a player named NAME with email address ADDRESS; return {object, password}.";
"assumes $wiz_utils:check_player_request() has been called and it passes.";
if (!caller_perms().wizard)
return E_PERM;
endif
name = args[1];
address = args[2];
new = create($player_class, $nothing);
new.name = name;
new.aliases = {name};
new.password = crypt(password = $wiz_utils:random_password(6));
new.last_connect_time = $maxint;
"Last disconnect time is creation time, until they login.";
new.last_disconnect_time = time();
new.ownership_quota = $wiz_utils.default_player_quota;
if (!(ERR = $wiz_utils:set_player(new)))
return player:tell("An error, ", ERR, " occurred while trying to make ", new, " a player. The database is probably inconsistent.");
endif
new.email_address = address;
$registration_db:add(new, address, @args[3..length(args)]);
move(new, $player_start);
new.programmer = $player_class.programmer;
return {new, password};
.
#26:24
":send_new_player_mail(preface, name, address, character#, password)";
"  used by $wiz:@make-player and $guest:@request";
if (!caller_perms().wizard)
return E_PERM;
endif
preface = args[1];
name = args[2];
address = args[3];
new = args[4];
password = args[5];
msg = {preface};
msg = {@msg, tostr("A character has been created, with name \"", name, "\" and password \"", password, "\".  (Passwords are case sensitive.)")};
msg = {@msg, tostr($network.moo_name, " is at ", $network.site, ", port ", $network.port, ".")};
msg = {@msg, "Read the help if you haven't used MOO before.  A tutorial available through the @tutorial command. Try paging the character HELP if you can't find what you need in the help system or tutorial."};
msg = {@msg, "A programmer's manual and various other pieces of documentation are available via ftp from ", "  parcftp.xerox.com, directory /pub/MOO"};
msg = {@msg, "Keep your password secure; do not let anyone else connect as you. Remember, you are responsible for what your character does. If you no longer want your character, do not give it to anyone else. You can change your password after you connect with the @password command."};
msg = {@msg, "After you connect, type `help manners' in order to see the policy on the code of conduct expected."};
msg2 = {};
for x in (msg)
msg2 = {@msg2, "", @$generic_editor:fill_string(x, 75)};
endfor
return $network:sendmail(address, (("Your " + $network.moo_name) + " character, ") + name, "Reply-to: " + $login.registration_address, @msg2);
.
#26:25
"do_maker_player(name,email,[comment])";
"Common code for @make-player";
"If no password is given, generates a random password for the player.";
"Email-address is stored in $registration_db and on the player object.";
if (!caller_perms().wizard)
return E_PERM;
endif
name = args[1];
email = args[2];
comments = $string_utils:from_list(args[3..length(args)], " ");
reason = $wiz_utils:check_player_request(name, email);
if (others = $registration_db:find_exact(email))
player:notify(email + " is the registered address of the following characters:");
for x in (others)
player:notify(tostr(valid(x[1]) ? x[1].name | "<recycled>", (valid(x[1]) && (!is_player(x[1]))) ? " {nonplayer}" | "", " (", x[1], ") ", (length(x) > 1) ? ("[" + tostr(@x[2..length(x)])) + "]" | ""));
endfor
if (!reason)
reason = "Already registered.";
endif
endif
if (reason)
player:notify(reason);
if (!$command_utils:yes_or_no("Create character anyway? "))
player:notify("Okay.");
return;
endif
endif
new = $wiz_utils:make_player(name, email, comments);
player:notify(tostr(name, " (", new[1], ") created with password `", new[2], "' for ", email, comments ? (" [" + comments) + "]" | ""));
$mail_agent:send_message(player, $new_player_log, tostr(name, " (", new[1], ")"), tostr(email, comments ? " " + comments | ""));
if ($network.active)
if ($command_utils:yes_or_no(("Send email to " + email) + " with password? "))
player:notify(tostr("Sending the password to ", email, "."));
if ((result = $wiz_utils:send_new_player_mail(tostr("From ", player.name, "@", $network.moo_name, ":"), name, email, new[1], new[2])) == 0)
player:notify(tostr("Mail sent successfully to ", email, "."));
else
player:tell("Cannot send mail: ", result);
endif
else
player:notify("Okay.");
endif
else
player:notify("Sorry, the network isn't active.");
endif
.
#26:26
"do_register(name, email_address [,comments])";
"change player's email address.";
if (!caller_perms().wizard)
return E_PERM;
endif
whostr = args[1];
email = args[2];
comments = $string_utils:from_list(args[3..length(args)]);
whostr = args[1];
who = $string_utils:match_player(whostr);
if ($command_utils:player_match_failed(who, whostr))
return;
endif
if (((whostr != who.name) && (!(whostr in who.aliases))) && (whostr != tostr(who)))
player:notify(tostr("Must be a full name or an object number:  ", who.name, "(", who, ")"));
return;
endif
if (reason = $network:invalid_email_address(email))
player:notify(reason);
if (!$command_utils:yes_or_no("Register anyway?"))
return player:notify("re-registration aborted.");
endif
endif
if (comments)
$registration_db:add(who, email, comments);
else
$registration_db:add(who, email);
endif
old = who.email_address;
who.email_address = email;
player:notify(tostr(who.name, " (", who, ") formerly ", old ? old | "unregistered", ", registered at ", email, ".  ", comments ? (" [" + comments) + "]" | ""));
.
#26:27
"do_new_password(who, [password])";
if (!caller_perms().wizard)
return E_PERM;
endif
whostr = args[1];
who = $string_utils:match_player(whostr);
if ($command_utils:player_match_failed(who, whostr))
return;
endif
if (((whostr != who.name) && (!(whostr in who.aliases))) && (whostr != tostr(who)))
player:notify(tostr("Must be a full name or an object number:  ", who.name, "(", who, ")"));
return;
endif
whostr = $string_utils:nn(who);
player:notify(tostr("About to change password for ", whostr, ". Old encrypted password is \"", who.password, "\""));
if ((length(args) > 1) && (password = args[2]))
password = args[2];
else
password = $wiz_utils:random_password(6);
endif
who.password = crypt(password);
player:notify(tostr(whostr, " new password is `", password, "'."));
if (!who.email_address)
player:notify(tostr(whostr, " doesn't have a registered email_address, cannot mail password; tell them some some other way."));
elseif ((who.last_connect_time == $maxint) && $command_utils:yes_or_no(tostr(who.name, " has never logged in.  Send mail with the password as though this were a new player request?")))
if ((result = $wiz_utils:send_new_player_mail(tostr("From ", player.name, "@", $network.moo_name, ":"), who.name, who.email_address, who, password)) == 0)
player:tell("Mail sent.");
else
player:tell("Trouble sending mail: ", result);
endif
elseif ($command_utils:yes_or_no(tostr("Email new password to ", whostr, "?")))
player:notify("Sending the password via email.");
if ((result = $network:sendmail(who.email_address, ("Your " + $network.moo_name) + " password", ("The password for your " + $network.moo_name) + " character:", " " + whostr, "has been changed. The new password is:", " " + password, "", "Please note that passwords are case sensitive.")) == 0)
player:tell("Mail sent.");
else
player:tell("Trouble sending mail: ", result);
endif
else
player:tell("No mail sent.");
endif
.
#27:0
return ((caller == this) || caller_perms().wizard) ? pass(@args) | E_PERM;
.
#27:1
":add(player,site)";
if (!caller_perms().wizard)
return E_PERM;
endif
who = args[1];
domain = args[2];
if (this:domain_literal(domain))
"... just enter it...";
l = this:find_exact(domain);
if (l == $failed_match)
this:insert(domain, {who});
elseif (!(who in l))
this:insert(domain, setadd(l, who));
endif
else
"...an actual domain name; add player to list for that domain...";
"...then add domain itself to list for the next larger domain; repeat...";
"...  Example:  domain == foo.bar.edu:  ";
"...            enter #who  on foo.bar.edu list";
"...            enter `foo' on bar.edu list";
"...            enter `bar' on edu list";
if (!(dot = index(domain, ".")))
dot = (length(domain) + 1);
domain = tostr(domain, ".", this.domain);
endif
prev = who;
while ($failed_match == (l = this:find_exact(domain)))
this:insert(domain, {prev});
if (dot)
prev = domain[1..dot - 1];
domain = domain[dot + 1..length(domain)];
else
return;
endif
dot = index(domain, ".");
endwhile
if (!(prev in l))
this:insert(domain, {@l, prev});
endif
return;
endif
.
#27:2
":load([start]) -- reloads site_db with the connection places of all players.";
"This routine calls suspend() if it runs out of time.";
"WIZARDLY";
"...needs to be able to read .all_connect_places";
if (!$perm_utils:controls(caller_perms(), this))
return E_PERM;
endif
plist = players();
if (!args)
this:clearall();
elseif (i = (args[1] in plist))
plist[1..i - 1] = {};
else
return E_INVARG;
endif
for p in (plist)
if (valid(p) && (is_player(p) && (!$object_utils:isa(p, $guest))))
"... player may be recycled or toaded during the suspend(),...";
"... guests login from everywhere...";
for c in (p.all_connect_places)
this:add(p, c);
if ($command_utils:running_out_of_time())
player:tell("...", p);
suspend(0);
endif
endfor
endif
endfor
.
#27:3
":domain_literal(string)";
" => true iff string is a domain literal (i.e., numeric IP address).";
if (10 <= (len = length(hnum = strsub(args[1], ".", ""))))
return tonum(hnum[1..9]) && tonum(hnum[6..len]);
else
return tonum(hnum);
endif
"SLEAZY CODE ALERT";
"... what I wanted to do was return tonum(strsub(args[1],\".\",\"\"))";
"... but on a 32-bit machine, this has a 1 in 4294967296 chance of failing";
"... (e.g., on \"42.94.967.296\", though I'll grant this particular example";
"...  entails some very strange subnetting on net 42, to say the least).";
"... So we do something that is guaranteed to work so long as internet";
"... addresses stay under 32 bits --- a while yet...";
"";
"... As soon as we're sure match() is working, this will become a one-liner:";
return match(args[1], "[0-9]+%.[0-9]+%.[0-9]+%.[0-9]+");
.
#27:4
if (caller_perms().wizard)
pass();
this:clearall();
this.domain = "localdomain";
endif
.
#28:0
"sin(x) -- given x in degrees, sin(x) will return the value of the sine";
"function at x times 10000";
x = (((args[1] + 45) % 360) - 45);
if (x < 0)
return -this:sin(-x);
elseif (x > 225)
return -this:xcos(x - 270);
elseif (x > 135)
return -this:xsin(x - 180);
elseif (x > 45)
return this:xcos(x - 90);
else
return this:xsin(x);
endif
.
#28:1
"cos(x) -- given x in degrees, cos(x) will return cosine evaluated at x";
"times 10000";
return this:sin(90 - args[1]);
.
#28:2
"tan(x) -- given x in degrees, tan(x) will calculate the tangent at x";
"times 10000";
return (this:sin(args[1]) * 10000) / this:cos(args[1]);
.
#28:3
"xsin(x) -- calculates the taylor approximation for the sine function";
x = args[1];
if ((x * x) > this.taylor)
return ((this:xsin(x / 2) * this:xcos((x + 1) / 2)) + (this:xsin((x + 1) / 2) * this:xcos(x / 2))) / 10000;
else
return (x * (17453000 - ((x * x) * 886))) / 100000;
endif
.
#28:4
"xcos(x) -- calculates the taylor approximation for the cosine function";
x = args[1];
if ((x * x) > this.taylor)
return ((this:xcos(x / 2) * this:xcos((x + 1) / 2)) - (this:xsin(x / 2) * this:xsin((x + 1) / 2))) / 10000;
else
return (1000000000 - ((x * x) * (152309 + ((4 * x) * x)))) / 100000;
endif
.
#28:5
"factorial(n) -- returns n factorial for 0 <= n (<= 12).";
if ((number = args[1]) < 0)
return E_INVARG;
endif
fact = 1;
for i in [2..number]
fact = (fact * i);
endfor
return fact;
.
#28:6
"pow(x,n) -- returns x raised to the nth power. n must be >= 0.";
if ((power = args[2]) < 0)
return E_INVARG;
endif
n = args[1];
if (power % 2)
ret = n;
else
ret = 1;
endif
while (power = (power / 2))
n = (n * n);
if (power % 2)
ret = (ret * n);
endif
endwhile
return ret;
.
#28:7
"fibonacci(n) -- calculates the fibonacci numbers to the nth term";
"and returns them in a list. n must be >= 0.";
x0 = 0;
x1 = 1;
if ((n = args[1]) < 0)
return E_INVARG;
elseif (n == 0)
return {x0};
else
x = {x0, x1};
for i in [2..n]
len = length(x);
x = {@x, x[len - 1] + x[len]};
endfor
return x;
endif
.
#28:8
"geometric(x,n) -- calculates the value of the geometric series at x to ";
"the nth term. i.e., approximates 1/(1-x) when |x| < 1. this, of course,";
"is impossible in MOO, but someone may find it useful in some way.";
"n defaults to 5. n must be >= 0.";
n = args[1];
order = ((length(args) > 1) ? args[2] | 5);
x = 1;
for i in [1..order]
x = (x + this:pow(n, i));
endfor
return x;
.
#28:9
"divmod(n,d) => {q,r} such that n = dq + r";
"  handles negative numbers correctly   0<=r<d if d>0, -d<r<=0 if d<0.";
n = args[1];
d = args[2];
r = (((n % d) + d) % d);
q = ((n - r) / d);
return {q, r};
.
#28:10
"combinations(n,r) -- returns the number of ways one can choose r";
"objects from n distinct choices.";
"C(n,r) = n!/[r!(n-r)!]";
"  overflow may occur if n>29...";
n = args[1];
r = args[2];
if (0 > (r = min(r, n - r)))
return 0;
else
c = 1;
n = (n + 1);
for i in [1..r]
c = ((c * (n - i)) / i);
endfor
return c;
endif
.
#28:11
"permutations(n,r) -- returns the number of ways possible for one to";
"order r objects given n distinct locations.";
"P(n,r) = n!/(n-r)!";
n = args[1];
r = args[2];
return this:factorial(n) / this:factorial(n - r);
.
#28:12
"simpson({a,b},{f(a),f((a+b)/2),f(b)}) -- given two endpoints, a and b,";
"and the functions value at a, (a+b)/2, and b, this will calculate";
"a numerical approximation of the integral using simpson's rule.";
"the answer is returned as {integer,fraction}";
point = args[1];
fcn = args[2];
return this:parts((point[2] - point[1]) * ((fcn[1] + (4 * fcn[2])) + fcn[3]), 6);
.
#28:13
"parts(n,q[,i]) -- returns a decomposition of n by q into integer and";
"floating point parts with i = the number of digits after the decimal.";
"i defaults to 5.";
"warning: it is quite easy to hit maxint which results in unpredictable";
"         results";
parts = {(n = args[1]) / (q = args[2]), n % q};
i = ((length(args) > 2) ? args[3] | 5);
return {parts[1], (parts[2] * this:pow(10, i)) / q};
.
#28:14
return sqrt(args[1]);
"sqrt(n) => largest integer <= square root of n.  Uses Newton's method.";
"obsolete now; left for documentation purposes.";
n = args[1];
if (n < 0)
return E_RANGE;
elseif (n)
x1 = n;
while (x1 > (x2 = ((x1 + (n / x1)) / 2)))
x1 = x2;
endwhile
return x1;
else
return 0;
endif
.
#28:15
"arctan(y/x) == arctan(x,y) => angle in degrees.";
if (length(args) < 2)
sin = args[1];
cos = 10000;
else
sin = args[2];
cos = args[1];
endif
if (sin < 0)
return -this:arctan(cos, -sin);
elseif (cos < 0)
return 180 - this:arctan(-cos, sin);
elseif (sin > cos)
return 90 - this:arctan(sin, cos);
else
tan = ((sin * 10000) / cos);
a = $list_utils:find_insert(this.tangents, tan - 1);
if ((this.tangents[a] - tan) < (tan - {0, @this.tangents}[a]))
return a;
else
return a - 1;
endif
endif
.
#28:16
"div(n,d) => q such that n = dq + r and  (0<=r<d if d>0, -d<r<=0 if d<0).";
return this:divmod(@args)[1];
.
#28:17
"A correct mod function.";
"mod(n,d) => r such that n = dq + r and (0<=r<d if d>0 or -d<r<=0 if d<0).";
n = args[1];
d = args[2];
return ((n % d) + d) % d;
.
#28:18
"returns 10000 exp (x/10000)";
"The accuracy seems to be ~0.1% for 0<x<4";
x = args[1];
if (x < 0)
z = this:(verb)(-x);
#78:tell("->", x, "  ", z);
return (100000000 + (z / 2)) / z;
elseif (x > 1000)
z = this:(verb)(x / 2);
if (z > 1073741823)
return $maxint;
"maxint for overflows";
elseif (z > 460000)
z = (((z + 5000) / 10000) * z);
elseif (z > 30000)
z = (((((z + 50) / 100) * z) + 50) / 100);
else
z = (((z * z) + 5000) / 10000);
endif
if (x % 2)
return z + ((z + 5000) / 10000);
else
return z;
endif
else
return ((10000 + x) + (((x * x) + 10000) / 20000)) + ((((x * x) * x) + 300000000) / 600000000);
endif
.
#28:19
"random(): returns a random number in the following manner:";
"random(n > 0) will return a number in the range 0 to n";
"random(n < 0) will return a number in the range n to 0";
prob = args[1];
mod = ((prob < 0) ? -1 | 1);
return (mod * random(abs(prob + mod))) - mod;
.
#28:20
"random_range(range [,mean]): returns a random number within the given";
"range from the mean. if the mean isn't given, it defaults to 0";
"e.g., random_range(10) => -10..10";
"      random_range(10,4) => -6..14";
range = args[1];
mean = ((length(args) > 1) ? args[2] | 0);
return mean + (((random(2) == 1) ? -1 | 1) * this:random(range));
.
#28:21
"is_prime(number) returns 1 if the number is prime or 0 if it isn't.";
"of course, only positive numbers are candidates for primality.";
number = args[1];
if (number == 2)
return 1;
elseif ((number < 2) || ((number % 2) == 0))
return 0;
else
choice = 3;
while (((denom = (choice * choice)) <= number) && (denom > 0))
if ((seconds_left() < 2) || (ticks_left() < 25))
suspend(0);
endif
if ((number % choice) == 0)
return 0;
endif
choice = (choice + 2);
endwhile
endif
return 1;
.
#28:22
bl1 = this:BLFromInt(args[1]);
bl2 = this:BLFromInt(args[2]);
blOut = {};
for i in [1..32]
blOut = {@blOut, bl1[i] && bl2[i]};
endfor
return this:IntFromBL(blOut);
.
#28:23
bl1 = this:BLFromInt(args[1]);
bl2 = this:BLFromInt(args[2]);
blOut = {};
for i in [1..32]
blOut = {@blOut, bl1[i] || bl2[i]};
endfor
return this:IntFromBL(blOut);
.
#28:24
bl1 = this:BLFromInt(args[1]);
bl2 = this:BLFromInt(args[2]);
blOut = {};
for i in [1..32]
blOut = {@blOut, bl1[i] != bl2[i]};
endfor
return this:IntFromBL(blOut);
.
#28:25
return -(1 + args[1]);
"";
"... here's what it used to be ...";
bl1 = this:BLFromInt(args[1]);
blOut = {};
for i in [1..32]
blOut = {@blOut, !bl1[i]};
endfor
return this:IntFromBL(blOut);
.
#28:26
x = args[1];
l = {};
firstbit = (x < 0);
if (firstbit)
x = (x + $minint);
endif
for i in [1..31]
l = {x % 2, @l};
x = (x / 2);
endfor
return {firstbit, @l};
.
#28:27
bl = args[1];
x = 0;
for l in (bl)
x = (x * 2);
x = (x + l);
endfor
return x;
.
#28:28
"gcd(num1,num2): find the greatest common divisor of the two numbers";
"using the division algorithm. the absolute values of num1 and num2 are";
"used without loss of generality.";
num1 = abs(args[1]);
num2 = abs(args[2]);
max = max(num1, num2);
min = min(num1, num2);
if (r1 = (max % min))
while (r2 = (min % r1))
min = r1;
r1 = r2;
endwhile
return r1;
else
return min;
endif
.
#28:29
"lcm(num1,num2): find the least common multiple of the two numbers.";
"we shall use the positive lcm value without loss of generality.";
"since we have gcd already, we'll just use lcm*gcd = num1*num2";
num1 = abs(args[1]);
num2 = abs(args[2]);
return (num1 * num2) / this:gcd(num1, num2);
.
#28:30
"are_rel_prime(num1,num2): returns 1 if num1 and num2 are relatively";
"prime.";
"since we have gcd, this is pretty easy.";
if (this:gcd(args[1], args[2]) == 1)
return 1;
else
return 0;
endif
.
#28:31
"Call with first arg either a number or a string, being the number";
"desired for conversion. capital letters denote values from 10-35;";
"lowercase letters from 36 to 61. Maximal base is 62.";
"You will be unable to use the extra 26 lowercases as separate unless";
"you pass a nonzero fourth argument. Passing zero or none uses the";
"default value, which is to have AAAA=aaaa.";
"The second and third arguments should be the base of the number and";
"the base you want it in, respectively.";
"Any of the arguments can be strings or nums, but high-base numbers";
"will need to be strings. This returns a string.";
"Any problems, talk to Ozymandias.";
sensitive = 0;
if (length(args) < 3)
return E_INVARG;
elseif (length(args) == 4)
sensitive = tonum(args[4]);
endif
result = 0;
thenum = tostr(args[1]);
origbase = tonum(args[2]);
newbase = tonum(args[3]);
if ((((origbase < 2) || (newbase < 2)) || (origbase > 62)) || (newbase > 62))
return E_INVARG;
endif
for which in [1..length(thenum)]
value = index(this.base_alphabet, thenum[which], sensitive);
if ((!value) || (value > origbase))
return E_INVARG;
endif
result = (((result * origbase) + value) - 1);
endfor
thestring = "";
if (result < 0)
return E_INVARG;
endif
while (result)
if ((which = ((result % newbase) + 1)) <= length(this.base_alphabet))
thestring = (this.base_alphabet[which] + thestring);
else
return E_INVARG;
endif
result = (result / newbase);
endwhile
return thestring;
.
#28:32
"exp(x[,n]) -- calculates an nth order taylor approximation for e^x.";
"n defaults to 5. Any n given must be >= 0. you need to divide the result";
"the answer will be returned as {integer part,fractional part}";
x = args[1];
n = ((length(args) > 1) ? args[2] | 5);
ex = (nfact = 1);
for i in [0..n - 1]
j = (n - i);
ex = ((ex * x) + (nfact = (nfact * j)));
endfor
return this:parts(ex, nfact);
.
#28:33
":norm(a,b,c,d...) => sqrt(a^2+b^2+c^2+...)";
m = max(max(@args), -min(@args));
logm = length(tostr(m));
if (logm <= 4)
s = 0;
for a in (args)
s = (s + (a * a));
endfor
return sqrt(s);
else
factor = tonum("1" + "0000000"[1..logm - 4]);
s = 0;
for a in (args)
a = (a / factor);
s = (s + (a * a));
endfor
return sqrt(s) * factor;
endif
.
#28:34
":sum(num, num, num ...) => Total of all arguments added together.";
total = 0;
for number in ((typeof(x = args[1]) == LIST) ? x | args)
total = (total + number);
endfor
return total;
.
#29:0
"Returns the set union of all of the lists provided as arguments.";
if (!args)
return {};
endif
set = args[1];
for l in (listdelete(args, 1))
for x in (l)
set = setadd(set, x);
endfor
endfor
return set;
.
#29:1
"Returns the set intersection of all the lists provided as arguments.";
if (!args)
return {};
endif
max = 0;
result = args[1];
for set in (listdelete(args, 1))
if (length(result) < length(set))
set1 = result;
set2 = set;
else
set1 = set;
set2 = result;
endif
for x in (set1)
if (!(x in set2))
set1 = setremove(set1, x);
endif
endfor
result = set1;
endfor
return result;
.
#29:2
"Usage:  diff(set 1, set 2, ..., set n)";
"Returns all elements of set 1 that are not in sets 2..n";
set = args[1];
for l in (listdelete(args, 1))
for x in (l)
set = setremove(set, x);
endfor
endfor
return set;
.
#29:3
"True if the first list given is a superset of all subsequent lists.";
"False otherwise.  {} is a superset of {} and nothing else; anything is";
"a superset of {}.  If only one list is given, return true.";
super = (args ? args[1] | {});
for l in (listdelete(args, 1))
for x in (l)
if (!(x in super))
return 0;
endif
endfor
endfor
return 1;
.
#29:4
"Usage:  exclusive_or(set, set, ...)";
"Return the set of all elements that are in exactly one of the input sets";
"For two sets, this is the equivalent of (A u B) - (A n B).";
if (!args)
return {};
endif
set = (so_far = args[1]);
for l in (listdelete(args, 1))
for x in (l)
if (x in so_far)
set = setremove(set, x);
else
set = setadd(set, x);
endif
endfor
so_far = {@so_far, @l};
endfor
return set;
.
#29:5
"Usage:  diff(set 1, set 2, ..., set n)";
"Returns all elements of set 1 that are not in sets 2..n";
set = args[1];
for l in (listdelete(args, 1))
for x in (l)
set = setremove(set, x);
$command_utils:suspend_if_needed(0);
endfor
endfor
return set;
.
#29:6
"True if the two lists given contain the same elements.";
"False otherwise.";
set1 = args[1];
set2 = args[2];
while (set1)
elt = set1[1];
set1 = listdelete(set1, 1);
if (elt in set2)
set2 = setremove(set2, elt);
while (elt in set2)
set2 = setremove(set2, elt);
endwhile
while (elt in set1)
set1 = setremove(set1, elt);
endwhile
else
return 0;
endif
endwhile
if (set2)
return 0;
else
return 1;
endif
.
#30:0
pass();
$prog.help = this;
.
#31:0
if (caller_perms().wizard)
pass();
this:rm_message_seq({1, 1 + this:length_all_msgs()});
this:expunge_rmm();
this.mail_forward = {player, this};
this.mail_notify = {player};
for p in ({"moderator_forward", "writers", "readers", "expire_period", "last_used_time"})
this.(p) = $mail_recipient.(p);
endfor
this.moderated = 1;
else
return E_PERM;
endif
.
#31:1
if (!this:is_writable_by(caller_perms()))
return E_PERM;
else
if (msgs = this.messages)
new = (msgs[length(msgs)][1] + 1);
else
new = 1;
endif
if (rmsgs = this.messages_going)
lbrm = rmsgs[length(rmsgs)][2];
new = max(new, lbrm[length(lbrm)][1] + 1);
endif
m = args[1];
if (index(m[4], "@programmer ") == 1)
m = {m[1], toobj(args[2]), o = toobj(m[4][index(m[4], "(") + 1..index(m[4], ")") - 1]), o.name};
endif
this.messages = {@msgs, {new, m}};
this.last_msg_date = m[1];
this.last_used_time = time();
return new;
endif
.
#31:2
":display_seq_headers(msg_seq[,cur])";
":display_seq_full(msg_seq[,cur]) => {cur}";
if (!this:ok(caller, caller_perms()))
return E_PERM;
endif
cur = {@args, 0}[2];
read_date = {@args, $maxint, $maxint}[3];
last = (ldate = 0);
player:tell("       WHEN           WHO                           BY");
for x in (msgs = this:messages_in_seq(args[1]))
msgnum = $string_utils:right(last = x[1], 4, (cur == x[1]) ? ">" | " ");
ldate = x[2][1];
if (typeof(x[2][2]) != OBJ)
hdr = this:msg_summary_line(@x[2]);
else
hdr = tostr(ctime(ldate)[5..16], "   ", $string_utils:left(tostr(x[2][4], " (", x[2][3], ")"), 30), valid(w = x[2][2]) ? w.name | "??", " (", x[2][2], ")");
endif
player:tell(msgnum, (ldate > read_date) ? ":+ " | ":  ", hdr);
$command_utils:suspend_if_needed(0);
endfor
if (verb == "display_seq_full")
return {last, ldate};
else
player:tell("----+");
endif
.
#31:3
":from_msg_seq(object or list[,mask])";
" => msg_seq of messages from any of these senders";
if (!this:ok(caller, caller_perms()))
return E_PERM;
endif
if (typeof(plist = args[1]) != LIST)
plist = {plist};
endif
i = 1;
fseq = {};
mask = {@args, {1}}[2];
for msg in (this.messages)
if ((!mask) || (i < mask[1]))
elseif ((length(mask) < 2) || (i < mask[2]))
if (msg[2][2] in plist)
fseq = $seq_utils:add(fseq, i, i);
endif
else
mask = mask[3..length(mask)];
endif
i = (i + 1);
$command_utils:suspend_if_needed(0);
endfor
return fseq || ("%f %<has> no messages from " + $string_utils:english_list($list_utils:map_arg(2, $string_utils, "pronoun_sub", "%n (%#)", plist), "no one", " or "));
.
#31:4
":to_msg_seq(object or list[,mask]) => msg_seq of messages to those people";
if (!this:ok(caller, caller_perms()))
return E_PERM;
endif
if (typeof(plist = args[1]) != LIST)
plist = {plist};
endif
i = 1;
fseq = {};
mask = {@args, {1}}[2];
for msg in (this.messages)
if ((!mask) || (i < mask[1]))
elseif ((length(mask) < 2) || (i < mask[2]))
if (msg[2][3] in plist)
fseq = $seq_utils:add(fseq, i, i);
endif
else
mask = mask[3..length(mask)];
endif
i = (i + 1);
$command_utils:suspend_if_needed(0);
endfor
return fseq || ("%f %<has> no messages about @programmer'ing " + $string_utils:english_list(plist, "no one", " or "));
.
#31:5
":%to_msg_seq/subject_msg_seq(string or list of strings[,mask])";
" => msg_seq of messages containing one of strings in the to line";
if (!this:ok(caller, caller_perms()))
return E_PERM;
endif
if (typeof(nlist = args[1]) != LIST)
nlist = {nlist};
endif
i = 1;
fseq = {};
mask = {@args, {1}}[2];
for msg in (this.messages)
if ((!mask) || (i < mask[1]))
elseif ((length(mask) < 2) || (i < mask[2]))
if (msg[2][4] in nlist)
fseq = $seq_utils:add(fseq, i, i);
endif
else
mask = mask[3..length(mask)];
endif
i = (i + 1);
$command_utils:suspend_if_needed(0);
endfor
return fseq || ("%f %<has> no messages about @programmer'ing " + $string_utils:english_list(nlist, "no one", " or "));
.
#31:6
return this.name + " doesn't understand %%from:";
.
#32:0
"WIZARDLY";
if (args)
"...check for an exact match first...";
search = args[1];
if (property_info(parent(this), search))
if (property_info(this, " " + search))
return {search};
endif
elseif (property_info(this, search))
return {search};
endif
"...search for partial matches, allowing for";
"...confusion between topics that do and don't start with @, and";
".. confusion between - and _ characters.";
props = properties(this);
topics = {};
if (search[1] == "@")
search = search[2..length(search)];
endif
search = strsub(search, "-", "_");
if (!search)
"...don't try searching for partial matches if the string is empty or @";
"...we'd get *everything*...";
return {};
endif
for prop in (props)
if (((i = index(strsub(prop, "-", "_"), search)) == 1) || ((i == 2) && index(" @", prop[1])))
topics = {@topics, (prop[1] == " ") ? prop[2..length(prop)] | prop};
endif
endfor
return topics;
else
"...return list of all topics...";
props = setremove(properties(this), "");
for p in ($object_utils:all_properties(parent(this)))
if (i = ((" " + p) in props))
props = {p, @listdelete(props, i)};
endif
endfor
return props;
endif
.
#32:1
"WIZARDLY";
topic = args[1];
dblist = {@args, {}}[2];
text = (this.(topic) || this.(" " + topic));
if (typeof(text) == LIST)
if (text && (text[1] == (("*" + (vb = strsub(text[1], "*", ""))) + "*")))
text = this:(vb)(listdelete(text, 1), dblist);
endif
endif
return text;
.
#32:2
":sort_topics(list_of_topics) -- sorts the given list of strings, assuming that they're help-system topic names";
buckets = "abcdefghijklmnopqrstuvwxyz";
keys = (names = $list_utils:make(length(buckets) + 1, {}));
for name in (setremove(args[1], ""))
key = (index(".@", name[1]) ? name[2..length(name)] + " " | name);
k = (index(buckets, key[1]) + 1);
bucket = keys[k];
i = $list_utils:find_insert(bucket, key);
keys[k] = listinsert(bucket, key, i);
names[k] = listinsert(names[k], name, i);
$command_utils:suspend_if_needed(0);
endfor
return $list_utils:append(@names);
.
#32:3
":columnize(@list_of_strings) -- prints the given list of strings in 4 columns.";
sorted = {@args, "", "", ""};
n = (length(sorted) / 4);
su = $string_utils;
index = {};
for i in [1..n]
index = {@index, tostr(su:left(sorted[i], 20), su:left(sorted[i + n], 20), su:left(sorted[i + (2 * n)], 20), sorted[i + (3 * n)])};
$command_utils:suspend_if_needed(0);
endfor
return index;
.
#32:4
"{\"*forward*\", topic, @rest}  => text for topic from this help db.";
"{\"*pass*\",    topic, @rest}  => text for topic from next help db.";
"In both cases the text of @rest is appended.  ";
"@rest may in turn begin with a *<verb>*";
text = args[1];
dblist = {@args, {}}[2];
if (verb == "forward")
first = this:get_topic(text[1], dblist);
elseif ((result = $code_utils:help_db_search(text[1], dblist)) && ((db = result[1]) != $ambiguous_match))
first = db:get_topic(result[2], dblist[(db in dblist) + 1..length(dblist)]);
else
first = {};
endif
if (2 <= (len = length(text)))
if (text[2] == (("*" + (vb = strsub(text[2], "*", ""))) + "*"))
return {@first, @this:(vb)(text[3..len], dblist)};
else
return {@first, @text[2..len]};
endif
else
return first;
endif
.
#32:5
"{\"*subst*\", @text} => text with the following substitutions:";
"  \"...%[expr]....\" => \"...\"+value of expr (assumed to be a string)+\"....\"";
"  \"%;expr\"         => @(value of expr (assumed to be a list of strings))";
newlines = {};
for old in (args[1])
new = "";
bomb = 0;
while ((prcnt = index(old, "%")) && (prcnt < length(old)))
new = (new + old[1..prcnt - 1]);
code = old[prcnt + 1];
old = old[prcnt + 2..length(old)];
if (code == "[")
prog = "";
while ((b = index(old + "]", "]")) > (p = index(old + "%", "%")))
prog = ((prog + old[1..p - 1]) + old[p + 1]);
old = old[p + 2..length(old)];
endwhile
prog = (prog + old[1..b - 1]);
old = old[b + 1..length(old)];
value = $no_one:eval_d(prog);
if (value[1])
new = tostr(new, value[2]);
else
new = tostr(new, $string_utils:print(value[2]));
bomb = 1;
endif
elseif ((code != ";") || new)
new = ((new + "%") + code);
else
value = $no_one:eval_d(old);
if (value[1] && (typeof(r = value[2]) == LIST))
newlines = {@newlines, @r[1..length(r) - 1]};
new = tostr(r[length(r)]);
else
new = tostr(new, $string_utils:print(value[2]));
bomb = 1;
endif
old = "";
endif
endwhile
if (bomb)
newlines = {@newlines, new + old, tostr("@@@ Helpfile alert:  Previous line is messed up; notify ", this.owner.wizard ? "" | tostr(this.owner.name, " (", this.owner, ") or "), "a wizard. @@@")};
else
newlines = {@newlines, new + old};
endif
endfor
return newlines;
.
#32:6
"{\"*index*\" [, title]}";
"This produces a columnated list of topics in this help db, headed by title.";
$command_utils:suspend_if_needed(0);
title = (args[1] ? args[1][1] | tostr(this.name, " (", this, ")"));
su = $string_utils;
return {"", title, su:from_list($list_utils:map_arg(su, "space", su:explode(title), "-"), " "), @this:columnize(@this:sort_topics(this:find_topics()))};
.
#32:7
pass(@args);
if ($perm_utils:controls(caller_perms(), this))
this.r = 1;
this.f = 0;
endif
.
#32:8
"{\"*verbdoc*\", \"object\", \"verbname\"}  use documentation for this verb";
set_task_perms(this.owner);
if (!valid(object = $string_utils:match_object(args[1][1], player.location)))
return E_INVARG;
elseif (!(hv = $object_utils:has_verb(object, vname = args[1][2])))
return E_VERBNF;
else
return $code_utils:verb_documentation(hv[1], vname);
endif
.
#32:9
if (typeof(text = this.(fulltopic = args[1])) == ERR)
return text;
else
return {tostr(";;", $code_utils:corify_object(this), ".(", $string_utils:print(fulltopic), ") = $command_utils:read_lines()"), @$command_utils:dump_lines(text)};
endif
.
#33:0
player:tell("Sorry, but guest characters are not allowed to change their passwords.");
.
#33:1
if (!caller_perms().wizard)
return;
endif
player = this;
this:notify(tostr("Sorry, but you've been here for ", $string_utils:from_seconds(connected_seconds(this)), " and someone else wants to be a guest now.  Feel free to come back", @$login:player_creation_enabled(player) ? {" or even create your own character if you want..."} | ($login.registration_address ? {" or send mail to ", $login.registration_address, " to obtain a character of your own."} | {"."})));
fork (0)
oldloc = this.location;
move(this, #-1);
move(this, this.home);
"..force enterfunc to be called so that the newbie gets a room description.";
if ($object_utils:isa(oldloc, $room))
oldloc:announce("In the distance you hear someone's alarm clock going off.");
if (oldloc != this.location)
oldloc:announce(this.name, " wavers and vanishes into insubstantial mist.");
else
oldloc:announce(this.name, " undergoes a wrenching personality shift.");
endif
endif
endfork
.
#33:2
this:log_disconnect();
fork (0)
if (this.location != this.home)
this:room_announce("The housekeeper arrives to remove ", this.name, ".");
move(this, this.home);
endif
for x in ({"paranoid", "lines", "responsible", "linelen", "linebuffer", "brief", "gaglist", "rooms", "pagelen", "current_message", "current_folder", "messages", "request"})
if ($object_utils:has_property($guest, x))
clear_property(this, x);
endif
endfor
this:set_description(this.default_description);
this:set_gender(this.default_gender);
for x in (this.contents)
this:eject(x);
endfor
for x in (this.features)
if (!(x in $guest.features))
this:remove_feature(x);
endif
endfor
for x in ($guest.features)
if (!(x in this.features))
this:add_feature(x);
endif
endfor
this:clear_refusals();
for x in ($object_utils:descendants($generic_editor))
if (loc = (this in x.active))
x:kill_session(loc);
endif
endfor
endfork
pass(@args);
.
#33:3
"Called by #0:connect_player when this object is about to be used as the next guest character.  Usually returns `this', but if for some reason some other guest character should be used, that player object is returned instead";
if (!caller_perms().wizard)
"...caller is not :do_login_command; doesn't matter what we return...";
return this;
elseif ($login:blacklisted($string_utils:connection_hostname(connection_name(player))))
return #-2;
elseif (!(this in connected_players()))
"...not logged in, no problemo...";
return this;
endif
longest = 900;
"...guests get 15 minutes before they can be dislodged...";
candidate = #-1;
free = {};
for g in (children($guest))
if (!is_player(g))
"...a toaded guest?...";
elseif (!(g in connected_players()))
"...yay; found an unused guest...";
free = {@free, g};
elseif ((t = connected_seconds(g)) > longest)
longest = t;
candidate = g;
endif
endfor
if (free)
candidate = free[random(length(free))];
elseif (valid(candidate))
"...someone's getting bumped...";
candidate:boot();
endif
return candidate;
.
#33:4
return;
.
#33:5
if ($login:player_creation_enabled(player))
player:tell("First @quit, then connect to the MOO again and, rather than doing `connect guest' do `create <name> <password>'");
else
player:tell($login:registration_string());
endif
.
#33:6
return pass(@args);
.
#33:7
":log(islogin,time,where) adds an entry to the connection log for this guest.";
if (caller != this)
return E_PERM;
elseif (length(this.connect_log) < this.max_connect_log)
this.connect_log = {args, @this.connect_log};
else
this.connect_log = {args, @this.connect_log[1..this.max_connect_log - 1]};
endif
.
#33:8
if (valid(caller_perms()) && (caller != this))
return E_PERM;
else
$guest_log:enter(1, time(), $string_utils:connection_hostname(connection_name(this)));
ret = pass(@args);
this:tell_lines($string_utils:pronoun_sub(this.extra_confunc_msg));
return ret;
endif
.
#33:9
if (caller != this)
return E_PERM;
else
cname = (connection_name(this) || this.last_connect_place);
$guest_log:enter(0, time(), $string_utils:connection_hostname(cname));
endif
.
#33:10
if (!valid(caller_perms()))
player:tell("Sorry, that information is not available.");
endif
.
#33:11
"Compute an encrypted hash of the guest's (last) connection, using 'crypt'. Basically, you can't tell where the guest came from, but it is unlikely that two guests will have the same hash";
"You can use guest:connection_name_hash(seed) as a string to identify whether two guests are from the same place.";
hash = tonum(caller_perms());
host = $string_utils:connection_hostname(this.last_connect_place);
for i in [1..length(host)]
hash = ((hash * 14) + index($string_utils.ascii, host[i]));
endfor
return crypt(tostr(hash), @args);
.
#33:12
if (caller_perms() != this)
return E_PERM;
else
return pass(@args);
endif
.
#33:13
return pass(@args);
.
#33:14
return pass(@args);
"only for setting permission";
.
#33:15
"Usage:  @request <name> for <email-address>";
if (player != this)
return player:tell(E_PERM);
endif
name = dobjstr;
address = iobjstr;
connection = $string_utils:connection_hostname(connection_name(player));
if (this.request)
return player:tell("Sorry, you appear to have already requested a character.");
endif
if (index(address = iobjstr, " "))
return player:notify_lines($code_utils:verb_usage());
elseif (reason = $wiz_utils:check_player_request(name, address, connection))
if (reason[1] == "-")
reason = (reason[2..length(reason)] + " Please ");
else
reason = (reason + " Please try again, or, to register another way, ");
endif
player:tell(reason, " mail to ", $login.registration_address, " with the character name you want.");
return;
endif
while (typeof(answer = $command_utils:yes_or_no(("Generally, only one character per real person is allowed. For more details, read `help multiple-characters'. Do you already have (or have you already requested) a " + $network.moo_name) + " character?")) == ERR)
endwhile
if (answer)
return player:tell("Character request processing ended.");
endif
if (!$network.active)
$mail_agent:send_message(this, $registration_db.registrar, "Player request", {"Player request from " + connection, ":", "", (("@make-player " + name) + " ") + address});
player:tell("Request for new character ", name, " email address '", address, "' accepted. Please be patient until the registrar gets around to it. If you don't get email within a week, please send regular email to ", $login.registration_address, ".");
elseif ($player_db.frozen)
player:tell("Sorry, can't create any new players right now.  Try again in a few minutes.");
else
new = $wiz_utils:make_player(name, address);
password = new[2];
new = new[1];
player:tell("Character ", name, " (", new, ") created, mailing password to ", address, "; you should get the mail very soon.");
player:tell("If you do not get it, please do NOT request another character. Send regular email to ", $login.registration_address, ", with the name of the character you requested.");
$mail_agent:send_message($new_player_log.autoregistration_player, $new_player_log, tostr(name, " (", new, ")"), {address, (" Automatically created at request of player from " + connection) + "."});
$wiz_utils:send_new_player_mail(tostr("A guest connected from ", connection, " at ", ctime(), " requested a character on ", $network.moo_name, " for email address ", address, "."), name, address, new, password);
this.request = 1;
return;
endif
.
#33:16
if (caller_perms().wizard)
this.extra_confunc_msg = "";
this.features = {};
endif
.
#33:17
"disallow guests from setting aliases on themselves";
if ($perm_utils:controls(caller_perms(), this))
return pass(@args);
else
return E_PERM;
endif
.
#34:0
return ((this.description + " There are ") + tostr(this.entries)) + " words in the online dictionary.";
.
#34:1
return (this:find_exact(args[1]) != $failed_match) || (args[1] in player.dict);
.
#34:2
source = args[1];
data = {};
ref = $code_utils:parse_propref(source);
if (ref)
"User entered a prop. Deal with it.";
thing = ref[1];
prop = ref[2];
thing = $string_utils:match_object(thing, player.location);
if (!valid(thing))
player:tell("No such object: ", ref[1]);
data = $failed_match;
elseif ((!prop) || (thing.(tostr(prop)) == E_PROPNF))
player:tell("There is no such property `", prop, "' on object ", thing, ".");
data = $failed_match;
else
data = thing.(tostr(prop));
if (typeof(data) == STR)
data = {data};
endif
$command_utils:suspend_if_needed(3);
if (typeof(data) == ERR)
player:tell("Error: ", tostr(data));
data = $failed_match;
elseif (typeof(data) != LIST)
player:tell("Spellchecker needs a string or list as input.");
data = $failed_match;
endif
endif
else
ref = $code_utils:parse_verbref(source);
if (ref)
"User entered a verb. Deal with it.";
thing = ref[1];
verb = ref[2];
thing = $string_utils:match_object(thing, player.location);
if (!valid(thing))
player:tell("No such object: ", ref[1]);
data = $failed_match;
elseif (verb_info(thing, verb) == E_VERBNF)
player:tell("There is no such verb `", verb, "' on object ", thing, ".");
data = $failed_match;
else
data = verb_code(thing, verb);
for i in [1..length(data)]
if (!index(data[i], "\""))
data[i] = "";
else
data[i] = data[i][index(data[i], "\"") + 1..length(data[i])];
data[i] = data[i][1..rindex(data[i], "\"") - 1];
foo = "";
while (index(data[i], "\""))
foo = (foo + data[i][1..index(data[i], "\"") - 1]);
foo = (foo + " ");
data[i] = data[i][index(data[i], "\"") + 1..length(data[i])];
data[i] = data[i][index(data[i], "\"") + 1..length(data[i])];
endwhile
if (foo == "")
foo = data[i];
else
foo = (foo + data[i]);
endif
data[i] = $string_utils:trim(foo);
endif
endfor
endif
else
"User entered word/phrase on command line.";
data = {argstr};
endif
endif
for i in [1..length(data)]
$command_utils:suspend_if_needed(1);
if (typeof(data[i]) != STR)
data[i] = "";
endif
data[i] = this:strip_chars(data[i], "!@#$%^&*()_+1234567890={}[]`<>?:;,./|\"~'");
endfor
return data;
.
#34:3
nastyword = args[1];
guesses = {};
"Transpose adjacent characters";
nastyword = (nastyword + " ");
for i in [1..length(nastyword) - 1]
foo = (((nastyword[1..i - 1] + nastyword[i + 1]) + nastyword[i]) + nastyword[i + 2..length(nastyword)]);
foo = $string_utils:trim(foo);
if (this:valid(foo))
guesses = listappend(guesses, foo);
endif
if ((ticks_left() < 500) || (seconds_left() < 2))
suspend(0);
endif
endfor
nastyword = $string_utils:trim(nastyword);
"Erase each character - check for an extra typoed character";
for i in [1..length(nastyword)]
foo = (nastyword[1..i - 1] + nastyword[i + 1..length(nastyword)]);
if (this:valid(foo))
guesses = listappend(guesses, foo);
endif
if ((ticks_left() < 500) || (seconds_left() < 2))
suspend(0);
endif
endfor
"Alter one character";
for i in [1..length(nastyword)]
for ii in ({"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", "'", "-"})
foo = ((nastyword[1..i - 1] + ii) + nastyword[i + 1..length(nastyword)]);
if (this:valid(foo))
guesses = listappend(guesses, foo);
endif
endfor
if ((ticks_left() < 500) || (seconds_left() < 2))
suspend(0);
endif
endfor
"insert one character";
for i in [1..length(nastyword)]
for ii in ({"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", "'", "-"})
foo = ((nastyword[1..i - 1] + ii) + nastyword[i..length(nastyword)]);
if (this:valid(foo))
guesses = listappend(guesses, foo);
endif
endfor
if ((ticks_left() < 500) || (seconds_left() < 2))
suspend(0);
endif
endfor
"Get some close matches from the database verbs themselves";
if ((foo = this:find_all(nastyword)) != ERR)
if ((foo != $failed_match) && (foo != $ambiguous_match))
if (length(foo) < 6)
for i in (foo)
guesses = listappend(guesses, i);
endfor
endif
endif
endif
"Clean up and go home";
guesses = $list_utils:remove_duplicates(guesses);
guesses = $list_utils:sort(guesses);
return guesses;
.
#34:4
subject = args[1];
stripped = args[2];
for i in [1..length(stripped)]
if ((ticks_left() < 500) || (seconds_left() < 1))
suspend(0);
endif
if (stripped[i] != "'")
subject = strsub(subject, stripped[i], " ");
else
subject = ((" " + subject) + " ");
subject = strsub(subject, " '", " ");
subject = strsub(subject, "' ", " ");
endif
endfor
return subject;
.
#34:5
if ((ticks_left() < 1000) || (seconds_left() < 3))
suspend(0);
endif
return pass(@args);
.
#34:6
"sort({x1,x3,x2},{1,3,2}) => {x1,x2,x3}";
lst = args[1];
unsorted_keys = ((use_sorted_lst = (length(args) >= 2)) ? args[2] | lst);
sorted_lst = (sorted_keys = {});
for e in (unsorted_keys)
l = $list_utils:find_insert(sorted_keys, e);
sorted_keys = listinsert(sorted_keys, e, l);
if (use_sorted_lst)
sorted_lst = listinsert(sorted_lst, lst[length(sorted_keys)], l);
endif
if ((ticks_left() < 500) || (seconds_left() < 2))
suspend(0);
endif
endfor
return sorted_lst || sorted_keys;
.
#34:7
info = this.(" " + args[1]);
prefix = (args[1] + info[1]);
r = info[3];
for i in [1..length(branches = info[2])]
for new in (this:_every_key(prefix + branches[i]))
r = setadd(r, new);
if ((ticks_left() < 500) || (seconds_left() < 2))
this:_suspend(0);
endif
endfor
endfor
return r;
.
#34:8
if (caller == this)
suspend(@args);
endif
.
#34:9
"N.B.  use :add_word/:remove_word to actually change the contents of this db";
":insert(string) -- see $generic_db:insert";
":delete(string) -- see $generic_db:delete";
":delete2(string) -- see $generic_db:delete2";
if (caller == this)
$command_utils:suspend_if_needed(0);
return pass(@args);
else
return E_PERM;
endif
.
#34:10
":add_word(string) -- adds word to the spell database";
"Returns true iff this word wasn't already there.";
cp = caller_perms();
if ((caller == this) || ((cp in this.trusted) || $perm_utils:controls(cp, this)))
result = this:insert(@args);
result || (this.entries = (this.entries + 1));
return !result;
else
return E_PERM;
endif
.
#34:11
":remove_word(string) -- removes word from the spell database";
"Returns true iff word was actually there to be removed.";
cp = caller_perms();
if ((caller == this) || ((cp in this.trusted) || $perm_utils:controls(cp, this)))
result = this:delete(@args);
result && (this.entries = (this.entries - 1));
return result;
else
return E_PERM;
endif
.
#34:12
":submit(word) -- add a word to this.submitted";
this.submitted = {@this.submitted, args[1]};
.
#34:13
"This breaks up the argument string into words, the resulting list being obtained exactly the way the command line parser obtains `args' from `argstr'.";
rest = (" " + args[1]);
rlen = length(rest);
spchars = " \\\"";
next = {1, 0, 0};
quote = (pos = 0);
toklist = {};
token = "";
while (1)
if ((ticks_left() < 500) || (seconds_left() < 2))
suspend(0);
endif
"Find the next special character";
for i in [1..3]
next[i] = (((n = (next[i] - pos)) > 0) ? n | (index(rest, spchars[i]) || (rlen + 1)));
endfor
first_special = 1;
for i in [2..3]
if (next[i] < next[first_special])
first_special = i;
endif
endfor
pos = next[first_special];
char = spchars[first_special];
"Add previous nonspecial characters to token";
token = (token + rest[1..pos - 1]);
"Deal with special character";
if ((pos > rlen) || (char == " "))
toklist = {@toklist, token};
token = "";
while ((pos < rlen) && (rest[pos + 1] == " "))
pos = (pos + 1);
endwhile
if (pos >= rlen)
return listdelete(toklist, 1);
endif
elseif ((char == "\\") && (pos < rlen))
token = (token + rest[pos = (pos + 1)]);
elseif (char == "\"")
quote = (!quote);
next[1] = (quote ? (rlen + pos) + 1 | 0);
endif
rest = rest[pos + 1..rlen];
rlen = (rlen - pos);
endwhile
.
#34:14
"$spell:purge_entire_database - a nasty verb that will zap the whole dictionary.";
"usage: eval $spell:purge_entire_database()     ";
if (!($perm_utils:controls(caller_perms(), this) || (caller == this)))
return E_PERM;
endif
if (!player.wizard)
return E_PERM;
endif
player:tell("WARNING: This will ERASE all the entries in the online dictionary! IF YOU ARE SURE YOU WISH TO DO THIS, TYPE `PURGE' NOW. Any other input with abort the command.");
input = $command_utils:read();
if (input != "purge")
player:tell("ABORTED. Database left as is.");
else
this:clearall_big(@args);
endif
.
#34:15
"returns a random word from the dictionary. maybe useful for games and things";
"that need a unique word. accepts no arguments.";
word = "";
while (word == "")
x = random(26);
y = random(26);
if (seconds_left() < 2)
suspend(0);
endif
lettera = $string_utils.alphabet[x];
letterb = $string_utils.alphabet[y];
foo = $spell:find_all(lettera + letterb);
if (foo != {})
word = foo[random(length(foo))];
endif
endwhile
return word;
.
#34:16
return this.description;
.
#34:17
if (!caller_perms().wizard)
return;
endif
$spell.trusted = {};
.
#34:18
if (!(player in this.trusted))
player:tell("Sorry, you can't do that.");
return E_PERM;
endif
this.submitted = {};
player:tell("$spell.submitted = {};");
.
#35:0
"   add(seq,start,end) => seq with range added.";
"remove(seq,start,end) => seq with range removed.";
"  both assume start<=end.";
seq = args[1];
start = args[2];
s = ((start == $minint) ? 1 | $list_utils:find_insert(seq, start - 1));
e = $list_utils:find_insert(seq, after = (args[3] + 1));
remove = (verb == "remove");
return {@seq[1..s - 1], @((s + remove) % 2) ? {start} | {}, @((e + remove) % 2) ? {after} | {}, @seq[e..length(seq)]};
.
#35:1
":contains(seq,elt) => true iff elt is in seq.";
return ($list_utils:find_insert(@args) + 1) % 2;
.
#35:2
":complement(seq) => the sequence containing all integers *not* in seq.";
seq = args[1];
if (seq && (seq[1] == $minint))
return listdelete(seq, 1);
else
return {$minint, @seq};
endif
.
#35:3
":union(seq1,seq2,...) => union of all sequences...";
":intersection(seq1,seq2,...) => intersection of all sequences...";
intersect = (verb != "union");
if ({} in args)
if (intersect)
return {};
else
args = $list_utils:setremove_all(args, {});
endif
endif
if ((alen = length(args)) <= 1)
return args ? args[1] | (intersect ? {$minint} | {});
else
if (intersect)
args = $list_utils:map_arg(this, "complement", args);
endif
lens = {length(args[1])};
for a in (listdelete(args, 1))
lens = {@lens, length(a)};
endfor
args = $list_utils:sort(args, lens);
lens = $list_utils:sort(lens);
for ll in [-length(lens)..-2]
second = args[2];
for i in [1..length(first = args[1]) / 2]
second = this:add(second, first[(2 * i) - 1], first[2 * i] - 1);
endfor
if (length(first) % 2)
s = $list_utils:find_insert(second, (start = first[length(first)]) - 1);
second = {@second[1..s - 1], @(s % 2) ? {start} | {}};
endif
i = $list_utils:find_insert(lens = lens[3..-ll], slen = length(second));
lens = listinsert(lens, slen, i);
args = listinsert(args[3..-ll], second, i);
endfor
return intersect ? this:complement(second) | second;
endif
.
#35:4
if (!(seq = args[1]))
return "empty";
endif
e = tostr((seq[1] == $minint) ? "" | seq[1]);
for i in [2..length(seq)]
e = (e + ((i % 2) ? tostr(", ", seq[i]) | ((seq[i] == (seq[i - 1] + 1)) ? "" | tostr("..", seq[i] - 1))));
endfor
return e + ((length(seq) % 2) ? ".." | "");
.
#35:5
":for([n,]seq,obj,verb,@args) => for s in (seq) obj:verb(s,@args); endfor";
if (typeof(n = args[1]) == NUM)
args = listdelete(args, 1);
seq = args[1];
else
seq = n;
n = 1;
endif
if (seq[1] == $minint)
return E_RANGE;
endif
object = args[2];
vname = args[3];
args = args[4..length(args)];
for r in [1..length(seq) / 2]
for i in [seq[(2 * r) - 1]..seq[2 * r] - 1]
if (typeof(object:(vname)(@listinsert(args, i, n))) == ERR)
return;
endif
endfor
endfor
if (length(seq) % 2)
i = seq[length(seq)];
while (1)
if (typeof(object:(vname)(@listinsert(args, i, n))) == ERR)
return;
endif
i = (i + 1);
endwhile
endif
.
#35:6
"extract(seq,array) => list of elements of array with indices in seq.";
if (alen = length(array = args[2]))
e = $list_utils:find_insert(seq = args[1], 1);
s = $list_utils:find_insert(seq, alen);
seq = {@(e % 2) ? {} | {1}, @seq[e..s - 1], @(s % 2) ? {} | {alen + 1}};
ret = {};
for i in [1..length(seq) / 2]
$command_utils:suspend_if_needed(0);
ret = {@ret, @array[seq[(2 * i) - 1]..seq[2 * i] - 1]};
endfor
return ret;
else
return {};
endif
.
#35:7
seq = args[1];
if (!seq)
return {};
else
if (length(seq) % 2)
seq = {@seq, $minint};
endif
l = {};
for i in [1..length(seq) / 2]
for j in [seq[(2 * i) - 1]..seq[2 * i] - 1]
l = {@l, j};
endfor
endfor
return l;
endif
.
#35:8
":fromlist(list) => corresponding sequence.";
return this:from_sorted_list($list_utils:sort(args[1]));
.
#35:9
":from_sorted_list(sorted_list) => corresponding sequence.";
if (!(lst = args[1]))
return {};
else
seq = {i = lst[1]};
next = (i + 1);
for i in (listdelete(lst, 1))
if (i != next)
seq = {@seq, next, i};
endif
next = (i + 1);
endfor
return (next == $minint) ? seq | {@seq, next};
endif
.
#35:10
return (seq = args[1]) ? seq[1] | E_NONE;
.
#35:11
return (seq = args[1]) ? ((len = length(seq)) % 2) ? $minint - 1 | (seq[len] - 1) | E_NONE;
.
#35:12
":size(seq) => number of elements in seq";
"  for sequences consisting of more than half of the 4294967298 available integers, this returns a negative number, which can either be interpreted as (cardinality - 4294967298) or -(size of complement sequence)";
n = 0;
for i in (seq = args[1])
n = (i - n);
endfor
return (length(seq) % 2) ? $minint - n | n;
.
#35:13
":from_string(string) => corresponding sequence or E_INVARG";
"  string should be a comma separated list of numbers and";
"  number..number ranges";
su = $string_utils;
if (!(words = su:explode(su:strip_chars(args[1], " "), ",")))
return {};
endif
parts = {};
for word in (words)
to = index(word, "..");
if ((!to) && su:is_numeric(word))
part = {tonum(word), tonum(word) + 1};
elseif (to)
if (to == 1)
start = $minint;
elseif (su:is_numeric(start = word[1..to - 1]))
start = tonum(start);
else
return E_INVARG;
endif
end = word[to + 2..length(word)];
if (!end)
part = {start};
elseif (!su:is_numeric(end))
return E_INVARG;
elseif ((end = tonum(end)) >= start)
part = {start, end + 1};
else
part = {};
endif
else
return E_INVARG;
endif
parts = {@parts, part};
endfor
return this:union(@parts);
.
#35:14
":firstn(seq,n) => first n elements of seq as a sequence.";
if ((n = args[2]) <= 0)
return {};
endif
l = length(seq = args[1]);
s = 1;
while (s <= l)
n = (n + seq[s]);
if ((s >= l) || (n <= seq[s + 1]))
return {@seq[1..s], n};
endif
n = (n - seq[s + 1]);
s = (s + 2);
endwhile
return seq;
.
#35:15
":lastn(seq,n) => last n elements of seq as a sequence.";
n = args[2];
if ((l = length(seq = args[1])) % 2)
return {$minint - n};
else
s = l;
while (s)
n = (seq[s] - n);
if (n >= seq[s - 1])
return {n, @seq[s..l]};
endif
n = (seq[s - 1] - n);
s = (s - 2);
endwhile
return seq;
endif
.
#35:16
":range(start,end) => sequence corresponding to [start..end] range";
return ((start = args[1]) <= (end = args[2])) ? {start, end + 1} | {};
.
#36:0
if (caller_perms().wizard)
pass();
delete_verb(this, "is_readable_by");
delete_verb(this, "is_usable_by");
delete_verb(this, "mail_notify");
"...remove references to ARB...";
this:rm_message_seq({1, 1 + this:length_all_msgs()});
this:expunge_rmm();
this.mail_forward = {player, this};
this.mail_notify = {player};
for p in ({"moderator_forward", "moderator_notify", "writers", "readers", "expire_period", "last_used_time"})
this.(p) = $mail_recipient.(p);
endfor
this.moderated = 1;
else
return E_PERM;
endif
.
#37:0
return $gender_utils:get_conj(args[1], this);
x = args[1];
len = length(x);
if ((len > 3) && (rindex(x, "n't") == (len - 3)))
return this:verb_sub(x[1..len - 3]) + "n't";
endif
for y in (this.conjugations)
if (x == y[1])
return y[2];
endif
endfor
for y in ({{"ches", "ch"}, {"ies", "y"}, {"sses", "ss"}, {"shes", "sh"}, {"s", ""}})
if ((len > length(y[1])) && (rindex(x, y[1]) == ((len - length(y[1])) + 1)))
return x[1..len - length(y[1])] + y[2];
endif
endfor
return x;
.
#37:1
"$you:say_action(message [,who [,thing, [,where]]]).";
"announce 'message' with pronoun substitution as if it were just ";
"  where:announce_all($string_utils:pronoun_sub(message, who, thing, where)); ";
"except that who (player), dobj, and iobj get modified messages, with the appropriate use of 'you' instead of their name.";
"who   default player";
"thing default object that called this verb";
"where default who.location";
msg = args[1];
who = ((length(args) >= 2) ? args[2] | player);
thing = ((length(args) >= 3) ? args[3] | caller);
where = ((length(args) >= 4) ? args[4] | who.location);
you = this;
if (typeof(msg) == LIST)
tell = "";
for x in (msg)
tell = (tell + ((typeof(x) == STR) ? x | x[random(length(x))]));
endfor
else
tell = msg;
endif
who:tell($string_utils:pronoun_sub(this:fixpos(tell, "%n"), you, thing, where));
if ($object_utils:has_callable_verb(where, "announce_all_but"))
where:announce_all_but({dobj, who, iobj}, $string_utils:pronoun_sub(tell, who, thing, where));
endif
if (valid(dobj) && (dobj != who))
x = dobj;
dobj = you;
x:tell($string_utils:pronoun_sub(this:fixpos(tell, "%d"), who, thing, where));
dobj = x;
endif
if (valid(iobj) && (!(iobj in {who, dobj})))
x = iobj;
iobj = you;
x:tell($string_utils:pronoun_sub(this:fixpos(tell, "%i"), who, thing, where));
iobj = x;
endif
.
#37:2
which = (args[2] + "'s");
return strsub(strsub(args[1], which, "your"), $string_utils:uppercase(which), "Your");
.
#39:0
"find(string[,n]) => datum corresponding to string with the search starting at node \" \"+string[1..n], n defaults to 0 (root node), $ambiguous_match or $failed_match";
"find_key(string[,n]) is like :find but returns the full string key rather than the associated datum.  Note that if several string keys present in the db share a common prefix, :find_key(prefix) will return $ambiguous_match, but if there is a unique datum associated with all of these strings :find(prefix) will return it rather than $ambiguous_match.";
"Assumes n<=length(string)";
rest = (search = args[1]);
sofar = {@args, 0}[2];
prefix = search[1..sofar];
rest[1..sofar] = "";
info = this.(" " + prefix);
data = ((verb == "find") ? this.data | 3);
if (i = (search in info[3]))
"...exact match for one of the strings in this node...";
return info[data][i];
elseif (index(info[1], rest) == 1)
"...ambiguous iff there's more than one object represented in this node..";
return this:_only(prefix, data);
elseif (index(rest, info[1]) != 1)
"...search string doesn't agree with common portion...";
return $failed_match;
elseif (index(info[2], search[nsofar = ((sofar + length(info[1])) + 1)]))
"...search string follows one of continuations leading to other nodes...";
return this:(verb)(search, nsofar);
else
"...search string may partially match one of the strings in this node...";
for i in [1..length(exacts = info[3])]
if (index(exacts[i], search) == 1)
return info[data][i];
endif
endfor
return $failed_match;
endif
.
#39:1
rest = (search = args[1]);
sofar = {@args, 0}[2];
prefix = search[1..sofar];
rest[1..sofar] = "";
info = this.(" " + prefix);
if (i = (search in info[3]))
return info[this.data][i];
elseif ((length(rest) <= (common = length(info[1]))) || (rest[1..common] != info[1]))
return $failed_match;
elseif (index(info[2], search[(sofar + common) + 1]))
return this:find_exact(search, (sofar + common) + 1);
else
return $failed_match;
endif
.
#39:2
":find_all(string [,n=0])";
"assumes n <= length(string)";
rest = (search = args[1]);
sofar = {@args, 0}[2];
prefix = search[1..sofar];
rest[1..sofar] = "";
info = this.(" " + prefix);
data = ((verb == "find_all") ? this.data | 3);
if (index(info[1], rest) == 1)
"...return entire subtree.";
return this:((data == 3) ? "_every_key" | "_every")(prefix);
elseif (index(rest, info[1]) != 1)
"...common portion doesn't agree.";
return {};
elseif (index(info[2], rest[1 + (common = length(info[1]))]))
"...matching strings are in a subnode.";
return this:(verb)(search, (sofar + common) + 1);
else
"...matching string is in info[3].  length(rest) > common,";
"...so there will be at most one matching string.";
for i in [1..length(info[3])]
if (index(info[3][i], search) == 1)
return {info[data][i]};
endif
endfor
return {};
endif
.
#39:3
":_only(prefix,data) => if all strings in this node have the same datum, return it, otherwise, return $ambiguous_match.";
prefix = args[1];
data = args[2];
info = this.(" " + prefix);
if (data == 3)
"... life is much simpler if there's no separate datum.";
"... if there's more than one string here, we barf.";
if (info[2] || (length(info[3]) > 1))
return $ambiguous_match;
elseif (info[3])
return info[3][1];
else
"..this can only happen with the root node of an empty db.";
return $failed_match;
endif
elseif (info[2])
what = this:_only(tostr(prefix, info[1], info[2][1]), data);
if (what == $ambiguous_match)
return what;
endif
elseif (info[data])
what = info[data][1];
info[data] = listdelete(info[data], 1);
else
"..this can only happen with the root node of an empty db.";
return $failed_match;
endif
for x in (info[data])
if (what != x)
return $ambiguous_match;
endif
endfor
for i in [2..length(info[2])]
if (what != this:_only(tostr(prefix, info[1], info[2][i]), data))
return $ambiguous_match;
endif
endfor
return what;
.
#39:4
info = this.(" " + args[1]);
prefix = (args[1] + info[1]);
r = $list_utils:remove_duplicates(info[4]);
for i in [1..length(branches = info[2])]
for new in (this:_every(prefix + branches[i]))
r = setadd(r, new);
endfor
endfor
return r;
.
#39:5
info = this.(" " + args[1]);
prefix = (args[1] + info[1]);
r = info[3];
for i in [1..length(branches = info[2])]
for new in (this:_every_key(prefix + branches[i]))
r = setadd(r, new);
endfor
endfor
return r;
.
#39:6
":insert([n,]string,datum) -- inserts <string,datum> correspondence into tree starting at node \" \"+string[1..n], n defaulting to 0 (root node).";
"Assumes length(string) >= n";
"Returns {old_datum} (or 1) if there was a <string,old_datum> correspondence there before, otherwise returns 0";
if (!($perm_utils:controls(caller_perms(), this) || (caller == this)))
return E_PERM;
endif
has_datum = (this.data > 3);
if (typeof(sofar = args[1]) == NUM)
search = args[2];
datum = (has_datum ? args[3] | 0);
else
search = sofar;
sofar = 0;
datum = (has_datum ? args[2] | 0);
endif
prefix = search[1..sofar];
info = this.(" " + prefix);
if (i = (search in info[3]))
"... exact match ...";
if (has_datum)
previous = {info[this.data][i]};
info[this.data][i] = datum;
this:set_node(prefix, @info);
return previous;
else
return 1;
endif
endif
rest = search;
rest[1..sofar] = "";
if (index(rest, info[1]) != 1)
"... find where new string disagrees with common portion...";
c = ($string_utils:common(rest, info[1]) + 1);
"... make a new node with a shorter common portion....";
this:make_node(prefix + info[1][1..c], @listset(info, info[1][c + 1..length(info[1])], 1));
this:set_node(prefix, info[1][1..c - 1], info[1][c], {search}, @has_datum ? {{datum}} | {});
return 0;
elseif (rest == info[1])
".. new string == common portion, insert...";
info[3] = {@info[3], search};
if (has_datum)
info[this.data] = {@info[this.data], datum};
endif
this:set_node(prefix, @info);
return 0;
elseif (index(info[2], search[nsofar = ((sofar + length(info[1])) + 1)]))
"... new string matches pre-existing continuation. insert in subnode....";
return this:insert(nsofar, search, datum);
else
"... new string may blow away one of the exact matches (i.e., matches one of them up to the first character beyond the common portion) in which case we need to create a new subnode....";
s = search[1..nsofar];
for m in (info[3])
if (index(m, s) == 1)
i = (m in info[3]);
"... we know m != search ...";
"... string m has been blown away.  create new node ...";
cbegin = (cafter = (length(s) + 1));
cend = $string_utils:common(search, m);
this:make_node(s, m[cbegin..cend], "", {search, m}, @has_datum ? {{datum, info[this.data][i]}} | {});
this:set_node(prefix, info[1], info[2] + s[nsofar], listdelete(info[3], i), @has_datum ? {listdelete(info[this.data], i)} | {});
return 0;
endif
endfor
"... new string hasn't blown away any of the exact matches, insert it as a new exact match...";
info[3] = {search, @info[3]};
if (has_datum)
info[this.data] = {datum, @info[this.data]};
endif
this:set_node(prefix, @info);
return 0;
endif
.
#39:7
":delete(string[,n]) deletes any <string,something> pair from the tree starting at node \" \"+string[1..n], n defaulting to 0 (root node)";
"Returns {something} if such a pair existed, otherwise returns 0";
"If that node is not the root node and ends up containing only one string and no subnodes, we kill it and return {something,string2,something2} where <string2,something2> is the remaining pair.";
if (!($perm_utils:controls(caller_perms(), this) || (caller == this)))
return E_PERM;
endif
rest = (search = args[1]);
sofar = {@args, 0}[2];
prefix = search[1..sofar];
rest[1..sofar] = "";
info = this.(" " + prefix);
if (i = (search in info[3]))
previous = {info[this.data][i]};
info[3] = listdelete(info[3], i);
if (this.data > 3)
info[this.data] = listdelete(info[this.data], i);
endif
elseif ((rest == info[1]) || ((index(rest, info[1]) != 1) || (!index(info[2], search[d = ((sofar + length(info[1])) + 1)]))))
"... hmm string isn't in here...";
return 0;
elseif ((previous = this:delete(search, d)) && (length(previous) > 1))
i = index(info[2], search[d]);
info[2][i..i] = "";
info[3] = {previous[2], @info[3]};
if (this.data > 3)
info[this.data] = {previous[3], @info[this.data]};
endif
previous = previous[1..1];
else
return previous;
endif
if ((!prefix) || ((length(info[3]) + length(info[2])) != 1))
this:set_node(prefix, @info);
return previous;
elseif (info[3])
this:kill_node(prefix);
return {@previous, info[3][1], info[this.data][1]};
else
sub = this.(" " + (p = tostr(prefix, info[1], info[2])));
this:kill_node(p);
this:set_node(prefix, @listset(sub, tostr(info[1], info[2], sub[1]), 1));
return previous;
endif
.
#39:8
":delete2(string,datum[,n]) deletes the pair <string,datum> from the tree starting at node \" \"+string[1..n], n defaulting to 0 (root node)";
"Similar to :delete except that if the entry for that string has a different associated datum, it will not be removed.  ";
":delete2(string,datum) is equivalent to ";
" ";
"  if(this:find_exact(string)==datum) ";
"    this:delete(string); ";
"  endif";
if (!($perm_utils:controls(caller_perms(), this) || (caller == this)))
return E_PERM;
endif
rest = (search = args[1]);
datum = args[2];
sofar = {@args, 0}[3];
prefix = search[1..sofar];
rest[1..sofar] = "";
info = this.(" " + prefix);
if (i = (search in info[3]))
previous = {info[this.data][i]};
if (previous[1] != datum)
return previous;
endif
info[3] = listdelete(info[3], i);
if (this.data > 3)
info[this.data] = listdelete(info[this.data], i);
endif
elseif ((rest == info[1]) || ((index(rest, info[1]) != 1) || (!index(info[2], search[d = ((sofar + length(info[1])) + 1)]))))
"... hmm string isn't in here...";
return 0;
elseif ((previous = this:delete2(search, datum, d)) && (length(previous) > 1))
i = index(info[2], search[d]);
info[2][i..i] = "";
info[3] = {previous[2], @info[3]};
if (this.data > 3)
info[this.data] = {previous[3], @info[this.data]};
endif
previous = previous[1..1];
else
return previous;
endif
if ((!prefix) || ((length(info[3]) + length(info[2])) != 1))
this:set_node(prefix, @info);
return previous;
elseif (info[3])
this:kill_node(prefix);
return {@previous, info[3][1], info[this.data][1]};
else
sub = this.(" " + (p = tostr(prefix, info[1], info[2])));
this:kill_node(p);
this:set_node(prefix, @listset(sub, tostr(info[1], info[2], sub[1]), 1));
return previous;
endif
.
#39:9
return (caller != this) ? E_PERM | (this.(" " + args[1]) = listdelete(args, 1));
.
#39:10
"WIZARDLY";
return (caller != this) ? E_PERM | add_property(this, " " + args[1], listdelete(args, 1), {$generic_db.owner, this.node_perms});
.
#39:11
"WIZARDLY";
return (caller != this) ? E_PERM | delete_property(this, " " + args[1]);
.
#39:12
"WIZARDLY";
if (!($perm_utils:controls(caller_perms(), this) || (caller == this)))
return E_PERM;
endif
if (args && ((d = args[1]) in {3, 4}))
this.data = d;
endif
for p in (properties(this))
if ((p[1] == " ") && (p != " "))
delete_property(this, p);
endif
"... there should be a better way....";
"...This is bad as it leaves the db in an inconsistent state...";
$command_utils:suspend_if_needed(0);
endfor
this:set_node("", "", "", {}, @(this.data > 3) ? {{}} | {});
.
#39:13
if (!($perm_utils:controls(caller_perms(), this) || (caller == this)))
return E_PERM;
endif
this:_kill_subtrees("", 0);
this:clearall(@args);
.
#39:14
":_kill_subtree(node,count)...wipes out all subtrees";
"...returns count + number of nodes removed...";
if (!($perm_utils:controls(caller_perms(), this) || (caller == this)))
return E_PERM;
endif
info = this.(" " + (prefix = args[1]));
count = args[2];
if ((ticks_left() < 500) || (seconds_left() < 2))
player:tell("...", count);
suspend(0);
endif
for i in [1..length(info[2])]
count = (this:_kill_subtrees(n = tostr(prefix, info[1], info[2][i]), count) + 1);
this:kill_node(n);
endfor
return count;
.
#39:15
info = this.(" " + (prefix = (args || {""})[1]));
depth = 0;
string = prefix;
if ((ticks_left() < 500) || (seconds_left() < 2))
player:tell("...", prefix);
suspend(0);
endif
for i in [1..length(info[2])]
if ((r = this:depth(tostr(prefix, info[1], info[2][i])))[1] > depth)
depth = r[1];
string = r[2];
endif
endfor
return {depth + 1, string};
.
#39:16
info = this.(" " + (prefix = args[1]));
count = (length(info[3]) + args[2]);
if ((ticks_left() < 500) || (seconds_left() < 2))
player:tell("...", count);
suspend(0);
endif
for i in [1..length(info[2])]
count = this:count_entries(tostr(prefix, info[1], info[2][i]), count);
endfor
return count;
.
#39:17
info = this.(" " + (prefix = args[1]));
count = args[2];
for s in (info[3])
count = (count + length(s));
endfor
if ((ticks_left() < 500) || (seconds_left() < 2))
player:tell("...", count);
suspend(0);
endif
for i in [1..length(info[2])]
count = this:count_chars(tostr(prefix, info[1], info[2][i]), count);
endfor
return count;
.
#39:18
"count [entries|chars] in <db>";
"  reports on the number of distinct string keys or the number of characters";
"  in all string keys in the db";
if (index("entries", dobjstr) == 1)
player:tell(this:count_entries("", 0), " strings in ", this.name, "(", this, ")");
elseif (index("chars", dobjstr) == 1)
player:tell(this:count_chars("", 0), " chars in ", this.name, "(", this, ")");
else
player:tell("Usage: ", verb, " entries|chars in <db>");
endif
.
#40:0
"eval(code)";
"Evaluate code with $no_one's permissions (so you won't damage anything).";
"If code does not begin with a semicolon, set this = caller (in the code to be evaluated) and return the value of the first `line' of code.  This means that subsequent lines will not be evaluated at all.";
"If code begins with a semicolon, set this = caller and let the code decide for itself when to return a value.  This is how to do multi-line evals.";
set_task_perms(this);
exp = args[1];
if (exp[1] != ";")
return eval(tostr("this=", caller, "; return ", exp, ";"));
else
return eval(tostr("this=", caller, ";", exp, ";"));
endif
.
#40:1
return 0;
.
#40:2
":eval_d(code)";
"exactly like :eval except that the d flag is unset";
"Evaluate code with $no_one's permissions (so you won't damage anything).";
"If code does not begin with a semicolon, set this = caller (in the code to be evaluated) and return the value of the first `line' of code.  This means that subsequent lines will not be evaluated at all.";
"If code begins with a semicolon, set this = caller and let the code decide for itself when to return a value.  This is how to do multi-line evals.";
set_task_perms(this);
exp = args[1];
if (exp[1] != ";")
return $code_utils:eval_d(tostr("this=", caller, "; return ", exp, ";"));
else
return $code_utils:eval_d(tostr("this=", caller, ";", exp, ";"));
endif
.
#40:3
"call_verb(object, verb name, args)";
"Call verb with $no_one's permissions (so you won't damage anything).";
"One could do this with $no_one:eval, but ick.";
set_task_perms(this);
return args[1]:(args[2])(@args[3]);
.
#41:0
":load() -- reloads the player_db with the names of all existing players.";
"This routine calls suspend() if it runs out of time.";
".frozen is set to 1 while the load is in progress so that other routines are warned and don't try to do any updates.  Sometimes, an update is unavoidable (e.g., player gets recycled) in which case the offending routine should set .frozen to 2, causing the load to start over at the beginning.";
if ((caller != this) && (!$perm_utils:controls(caller_perms(), this)))
return E_PERM;
endif
this:clearall();
this.frozen = 1;
for p in (players())
this:suspend_restart(p);
"... note that if a player is recycled or toaded during the suspension,...";
"... it won't be removed from the for loop iteration; thus this test:     ";
if (valid(p) && is_player(p))
if (typeof(po = this:find_exact(p.name)) == ERR)
player:tell(p.name, ":  ", po);
return;
elseif (po != p)
if (valid(po) && is_player(po))
player:tell("name `", p.name, "' for ", p, " subsumes alias for ", po.name, "(", po, ").");
endif
this:insert(p.name, p);
endif
for a in (p.aliases)
this:suspend_restart(p);
if (index(a, " "))
"don't bother";
elseif (typeof(ao = this:find_exact(a)) == ERR)
player:tell(a, ":  ", ao);
return;
elseif (!(valid(ao) && is_player(ao)))
this:insert(a, p);
elseif (ao != p)
player:tell("alias `", a, "' for ", p.name, "(", p, ") used by ", ao.name, "(", ao, ").");
endif
endfor
endif
endfor
this.frozen = 0;
.
#41:1
":check() -- checks for recycled and toaded players that managed not to get expunged from the db.";
for p in (properties($player_db))
if ((ticks_left() < 500) || (seconds_left() < 2))
player:tell("...", p);
suspend(0);
endif
if (p[1] == " ")
nlist = this.(p)[3];
olist = this.(p)[4];
for i in [1..length(nlist)]
if (valid(olist[i]) && (is_player(olist[i]) && (nlist[i] in olist[i].aliases)))
else
player:tell(".", p[2..length(p)], " <- ", nlist[i], " ", olist[i]);
endif
endfor
endif
endfor
player:tell("done.");
.
#41:2
if (caller_perms().wizard)
pass();
this.reserved = {};
this:load();
endif
.
#41:3
":available(name) => 1 if a name is available for use, or the object id of whoever is currently using it, or 0 if the name is otherwise forbidden.";
"If $player_db is not .frozen and :available returns 1, then $player:set_name will succeed.";
name = args[1];
if ((name in this.stupid_names) || (name in this.reserved))
return 0;
elseif ((((!name) || index(name, " ")) || index(name, "\\")) || index(name, "\""))
return 0;
elseif (index("*#()", name[1]))
return 0;
elseif (valid(who = this:find_exact(name)) && is_player(who))
return who;
else
return 1;
endif
.
#41:4
"used during :load to do the usual out-of-time check.";
"if someone makes a modification during the suspension (indicated by this.frozen being set to 2), we have to restart the entire load.";
if (caller != this)
return E_PERM;
elseif ($command_utils:running_out_of_time())
player:tell("...", args[1]);
suspend(0);
if (this.frozen != 1)
player:tell("...argh... restarting $player_db:load...");
fork (0)
this:load();
endfork
kill_task(task_id());
endif
endif
.
#42:0
"@perm_utils:controls(who, what)";
"Is WHO allowed to hack on WHAT?";
return (args[1] == args[2].owner) || args[1].wizard;
.
#42:1
":apply(permstring,mods) => new permstring.";
"permstring is a permissions string, mods is a concatenation of strings of the form +<letters>, !<letters>, or -<letters>, where <letters> is a string of letters as might appear in a permissions string (`+' adds the specified permissions, `-' or `!' removes them; `-' and `!' are entirely equivalent).";
perms = args[1];
mods = args[2];
if ((!mods) || (!index("!-+", mods[1])))
return mods;
endif
i = 1;
while (i <= length(mods))
if (mods[i] == "+")
while (((i = (i + 1)) <= length(mods)) && (!index("!-+", mods[i])))
if (!index(perms, mods[i]))
perms = (perms + mods[i]);
endif
endwhile
else
"mods[i] must be ! or -";
while (((i = (i + 1)) <= length(mods)) && (!index("!-+", mods[i])))
perms = strsub(perms, mods[i], "");
endwhile
endif
endwhile
return perms;
.
#42:2
stage = 1;
c = callers();
while (((stage = (stage + 1)) < length(c)) && (c[stage][1] == c[1][1]))
endwhile
return c[stage];
.
#42:3
"controls_prop(who, what, propname)";
"Is WHO allowed to hack on WHAT's PROPNAME?";
return (args[1] == property_info(args[2], args[3])[1]) || args[1].wizard;
.
#43:0
"$gender_utils:set(object,gender) --- sets the pronoun properties of object.";
"gender is a string: one of the strings in $gender_utils.genders, the list of rcognized genders.  If the gender change is successful, the (full) name of the gender (e.g., \"male\") is returned.  E_NONE is returned if gender does not match any recognized gender.  Any other error encountered (e.g., E_PERM, E_PROPNF) is likewise returned and the object's pronoun properties are left unaltered.";
set_task_perms(caller_perms());
if (this == (object = args[1]))
return E_DIV;
elseif (gnum = $string_utils:find_prefix(gender = args[2], this.genders))
gender = this.genders[gnum];
else
return E_NONE;
endif
save = {};
prons = this.pronouns;
for p in (prons)
save = {@save, e = object.(p)};
if ((typeof(e) != STR) || (typeof(e = (object.(p) = this.(p)[gnum])) == ERR))
for i in [1..length(save) - 1]
object.(prons[i]) = save[i];
endfor
return e;
endif
endfor
return gender;
.
#43:1
"$gender_utils:add(object[,perms[,owner]])";
"--- adds pronoun properties to object if they're not already there.";
"    perms default to \"rc\", owner defaults to the object owner.";
set_task_perms(caller_perms());
object = args[1];
perms = ((length(args) >= 2) ? args[2] | "rc");
owner = ((length(args) >= 3) ? args[3] | object.owner);
prons = this.pronouns;
e = 1;
for p in (prons)
if (!$object_utils:has_property(object, p))
e = add_property(object, p, "", {owner, perms});
if (typeof(e) == ERR)
player:tell("Couldn't add ", object, ".", p, ":  ", e);
return;
endif
elseif ((typeof(object.(p)) != STR) && (typeof(e = (object.(p) = "")) == ERR))
player:tell("Couldn't reset ", object, ".", p, ":  ", e);
return;
elseif (!object.(p))
e = 0;
endif
endfor
if ((!e) && (ERR == typeof(e = this:set(object, "neuter"))))
player:tell("Couldn't initialize pronouns:  ", e);
endif
.
#43:2
"get_pronoun(key,object) => pronoun corresponding to object.";
"key can be one of s,o,p,q,r,S,O,P,Q,R to refer to the pronoun properties relatively directly or it can be something of the form \"he/she\" or \"He/She\".";
"Next the object is checked for the desired pronoun property.  If that doesn't exist, we look at object.gender and infer the pronoun from the corresponding $gender_utils property.  If .gender doesn't exist or the object itself is invalid, we use the corresponding property on $player.";
key = args[1];
if (key[1] == ":")
key = key[2..length(key)];
endif
if ((length(key) == 1) && (i = index("sopqrSOPQR", key, 1)))
prop = this.pronouns[i];
else
search = "$1:he$s:she$1:he/she$2:him$2:him/her$3:his/her$4:hers$4:his/hers$5:himself$5:herself$5:himself/herself";
i = index(search, (":" + key) + "$");
if (!i)
return "";
endif
cap = (strcmp("a", key) > 0);
prop = this.pronouns[tonum(search[i - 1]) + (5 * cap)];
endif
if (!valid(object = ((length(args) >= 2) ? args[2] | player)))
return $player.(prop);
elseif (STR == typeof(p = object.(prop)))
return p;
elseif ((STR == typeof(g = object.gender)) && (i = (g in this.genders)))
return this.(prop)[i];
else
return $player.(prop);
endif
.
#43:3
"get_conj(verbspec,object) => verb conjugated according to object.";
"verbspec can be one of \"singular/plural\", \"singular\", \"singular/\", or \"/plural\", e.g., \"is/are\", \"is\", \"is/\", or \"/are\".";
"The object is checked to see whether it is singular or plural.  This is inferred from its .gender property.  If .gender doesn't exist or the object itself is invalid, we assume singular.";
spec = args[1];
i = index(spec + "/", "/");
sing = spec[1..i - 1];
if (i < length(spec))
plur = spec[i + 1..length(spec)];
else
plur = "";
endif
cap = (strcmp("a", (i == 1) ? spec[2] | spec) > 0);
if (((valid(object = ((length(args) >= 2) ? args[2] | player)) && (STR == typeof(g = object.gender))) && (i = (g in this.genders))) && this.is_plural[i])
vb = (plur || this:_verb_plural(sing, i));
else
vb = (sing || this:_verb_singular(plur, i));
endif
if (cap)
return $string_utils:capitalize(vb);
else
return vb;
endif
.
#43:4
if (typeof(st = args[1]) != STR)
return E_INVARG;
endif
len = length(st);
if ((len >= 3) && (rindex(st, "n't") == (len - 2)))
return this:_verb_plural(st[1..len - 3], args[2]) + "n't";
elseif (i = (st in {"has", "is"}))
return this.({"have", "be"}[i])[args[2]];
elseif (st == "was")
return (args[2] > 6) ? "were" | st;
elseif ((len <= 3) || (st[len] != "s"))
return st;
elseif (st[len - 1] != "e")
return st[1..len - 1];
elseif ((r = (rindex(st, "sses") || rindex(st, "zzes"))) && (r == (len - 3)))
return st[1..len - 3];
elseif (((st[len - 2] == "h") && index("cs", st[len - 3])) || index("ox", st[len - 2]))
return st[1..len - 2];
"washes => wash, belches => belch, boxes => box";
"used to have || ((st[len - 2] == \"s\") && (!index(\"aeiouy\", st[len - 3])))";
"so that <consonant>ses => <consonant>s";
"known examples: none";
"counterexample: browses => browse";
elseif (st[len - 2] == "i")
return st[1..len - 3] + "y";
else
return st[1..len - 1];
endif
.
#43:5
if (typeof(st = args[1]) != STR)
return E_INVARG;
endif
len = length(st);
if ((len >= 3) && (rindex(st, "n't") == (len - 2)))
return this:_verb_singular(st[1..len - 3], args[2]) + "n't";
elseif (i = (st in {"have", "are"}))
return this.({"have", "be"}[i])[args[2]];
elseif ((st[len] == "y") && (!index("aeiou", st[len - 1])))
return st[1..len - 1] + "ies";
elseif (index("sz", st[len]) && index("aeiou", st[len - 1]))
return (st + st[len]) + "es";
elseif (index("osx", st[len]) || ((len > 1) && (index("chsh", st[len - 1..len]) % 2)))
return st + "es";
else
return st + "s";
endif
.
#43:6
"_do(cap,object,modifiers...)";
cap = args[1];
object = args[2];
if (!(modifiers = args[3]))
if (typeof(object) != OBJ)
return tostr(object);
elseif (!valid(object))
return (cap ? "N" | "n") + "othing";
else
return cap ? object:titlec() | object:title();
endif
elseif (modifiers[1] == ".")
len = length(modifiers);
if (i = index(modifiers[2..len], "."))
i = (i + 1);
elseif (!(i = ((index(modifiers, ":") || index(modifiers, "#")) || index(modifiers, "!"))))
i = (len + 1);
endif
if (typeof(o = object.(modifiers[2..i - 1])) == ERR)
return tostr("%(", o, ")");
else
return this:_do(cap || (strcmp("a", modifiers[2]) > 0), o, modifiers[i..len]);
endif
elseif (modifiers[1] == ":")
if (typeof(object) != OBJ)
return tostr("%(", E_TYPE, ")");
elseif (p = this:get_pronoun(modifiers, object))
return p;
else
return tostr("%(", modifiers, "??)");
endif
elseif (modifiers[1] == "#")
return tostr(object);
elseif (modifiers[1] == "!")
return this:get_conj(modifiers[2..length(modifiers)], object);
else
i = ((((index(modifiers, ".") || index(modifiers, ":")) || index(modifiers, "#")) || index(modifiers, "!")) || (length(modifiers) + 1));
s = modifiers[1..i - 1];
if (j = (s in {"dobj", "iobj", "this"}))
return this:_do(cap, {dobj, iobj, callers()[2][1]}[j], modifiers[i..length(modifiers)]);
else
return tostr("%(", s, "??)");
endif
endif
.
#43:7
"Experimental pronoun substitution. The official version is on $string_utils.";
"syntax:  :pronoun_sub(text[,who])";
"experimental version that accomodates Aladdin's style...";
set_task_perms($no_one);
who = ((length(args) >= 2) ? args[2] | player);
if (typeof(args[1]) == LIST)
plines = {};
for line in (args[1])
plines = {@plines, this:pronoun_sub(line, who)};
endfor
return plines;
endif
old = tostr(args[1]);
new = "";
here = (valid(who) ? who.location | $nothing);
objspec = "nditl";
objects = {who, dobj, iobj, caller, here};
prnspec = "sopqrSOPQR";
prprops = {"ps", "po", "pp", "pq", "pr", "Ps", "Po", "Pp", "Pq", "Pr"};
oldlen = length(old);
while ((prcnt = index(old, "%")) && (prcnt < oldlen))
cp_args = {};
s = old[k = (prcnt + 1)];
if (brace = index("([{", s))
if (!(w = index(old[k + 1..oldlen], ")]}"[brace])))
return new + old;
elseif (brace == 3)
s = this:_do(0, who, old[prcnt + 2..(k = (k + w)) - 1]);
else
p = old[prcnt + 2..(k = (k + w)) - 1];
if (brace == 1)
cp_args = {who, p};
elseif (p[1] == "#")
s = ((o = index(objspec, p[2])) ? tostr(objects[o]) | (("[" + p) + "]"));
elseif (!(o = index(objspec, p[1])))
s = (("[" + p) + "]");
else
cp_args = {objects[o], p[2..w - 1], strcmp(p[1], "a") < 0};
endif
endif
elseif (o = index(objspec, s))
cp_args = {objects[o], "", strcmp(s, "a") < 0};
elseif (w = index(prnspec, s, 1))
cp_args = {who, prprops[w]};
elseif (s == "#")
s = tostr(who);
elseif (s != "%")
s = ("%" + s);
endif
new = ((new + old[1..prcnt - 1]) + ((!cp_args) ? s | ((typeof(sub = $string_utils:_cap_property(@cp_args)) != ERR) ? sub | (("%(" + tostr(sub)) + ")"))));
old = old[k + 1..oldlen];
oldlen = (oldlen - k);
endwhile
return new + old;
.
#44:0
"Given a time() or ctime()-style date, this returns the full name of the day.";
if (typeof(args[1]) == NUM)
time = ctime(args[1]);
elseif (typeof(args[1]) == STR)
time = args[1];
else
return E_TYPE;
endif
dayabbr = $string_utils:explode(time)[1];
return this.days[dayabbr in this.dayabbrs];
.
#44:1
"Given a time() or ctime()-style date, this returns the full name";
"of the month.";
if (typeof(args[1]) == NUM)
time = ctime(args[1]);
elseif (typeof(args[1]) == STR)
time = args[1];
else
return E_TYPE;
endif
monthabbr = $string_utils:explode(time)[2];
return this.months[monthabbr in this.monthabbrs];
.
#44:2
"Return a time in the form [h]h[:mm[:ss]] {a.m.|p.m.}.  Args are";
"[1]   either a time()- or a ctime()-style date, and";
"[2]   (optional) the precision desired--1 for hours, 2 for minutes,";
"        3 for seconds.  If not given, precision defaults to minutes";
if (typeof(args[1]) == NUM)
time = ctime(args[1]);
elseif (typeof(args[1]) == STR)
time = args[1];
else
return E_TYPE;
endif
if (length(args) > 1)
precision = args[2];
else
precision = 2;
endif
time = $string_utils:explode(time)[4];
hour = tonum(time[1..2]);
if (hour == 0)
time = (("12" + time[3..(precision * 3) - 1]) + " a.m.");
elseif (hour == 12)
time = (time[1..(precision * 3) - 1] + " p.m.");
elseif (hour > 12)
time = ((tostr(hour - 12) + time[3..(precision * 3) - 1]) + " p.m.");
else
time = ((tostr(hour) + time[3..(precision * 3) - 1]) + " a.m.");
endif
return time;
.
#44:3
"Given string hh:mm:ss ($string_utils:explode(ctime(time))[4]), this returns";
"the number of seconds elapsed since 00:00:00.  I can't remember why I";
"created this verb, but I'm sure it serves some useful purpose.";
return (((60 * 60) * tonum(args[1][1..2])) + (60 * tonum(args[1][4..5]))) + tonum(args[1][7..8]);
.
#44:4
r = 10000;
h = ((r * r) + (r / 2));
time = ((args == {}) ? time() | args[1]);
t = (((time + 120) % 86400) / 240);
s = ((5 * ((time - 14957676) % 31556952)) / 438291);
phi = ((s + t) + this.corr);
cs = $trig_utils:cos(s);
spss = (((($trig_utils:sin(phi) * $trig_utils:sin(s)) + h) / r) - r);
cpcs = (((($trig_utils:cos(phi) * cs) + h) / r) - r);
return (((((this.stsd * cs) - (this.ctcd * cpcs)) - (this.ct * spss)) + h) / r) - r;
.
#44:5
"Given a string such as returned by ctime(), return the corresponding time-in-seconds-since-1970 time returned by time(), or E_DIV if the format is wrong in some essential way.";
words = $string_utils:explode(args[1]);
if (length(words) == 5)
"Arrgh!  the old ctime() didn't return a time zone, yet it arbitrarily decides whether it's standard or daylight savings time.  URK!!!!!";
words = listappend(words, "PST");
endif
if ((((length(words) != 6) || (length(hms = $string_utils:explode(words[4], ":")) != 3)) || (!(month = (words[2] in this.monthabbrs)))) || (!(zone = $list_utils:assoc(words[6], this.timezones))))
return E_DIV;
endif
year = tonum(words[5]);
day = (({-1, 30, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334}[month] + tonum(words[3])) + (year * 366));
zone = zone[2];
return (((((((((((((day - ((day + 1038) / 1464)) - ((day + 672) / 1464)) - ((day + 306) / 1464)) - ((day + 109740) / 146400)) - ((day + 73140) / 146400)) - ((day + 36540) / 146400)) - 719528) * 24) + tonum(hms[1])) + zone) * 60) + tonum(hms[2])) * 60) + tonum(hms[3]);
.
#44:6
s = args[1];
if (s < 0)
return "-" + this:(verb)(-s);
endif
m = (s / 60);
s = (s % 60);
if (m)
ss = tostr((s < 10) ? ":0" | ":", s);
h = (m / 60);
m = (m % 60);
if (h)
ss = tostr((m < 10) ? ":0" | ":", m, ss);
d = (h / 24);
h = (h % 24);
return tostr(@d ? {d, (h < 10) ? ":0" | ":"} | {}, h, ss);
else
return tostr(m, ss);
endif
else
return tostr(s);
endif
.
#44:7
"english_time(time [,reference time]): returns the time as a string of";
"years, months, days, minutes and seconds using the reference time as the";
"start time and incrementing forwards. it can be given in either ctime() or";
"time() format. if a reference time is not given, it is set to time().";
"suspend(0)";
if ((_time = args[1]) < 1)
return "0 seconds";
endif
reftime = ((length(args) > 1) ? args[2] | time());
_ctime = ((typeof(reftime) == NUM) ? ctime(reftime) | reftime);
seclist = {60, 60, 24};
units = {"year", "month", "day", "hour", "minute", "second"};
timelist = {};
for unit in (seclist)
timelist = {_time % unit, @timelist};
_time = (_time / unit);
endfor
months = 0;
month = (_ctime[5..7] in $time_utils.monthabbrs);
year = tonum(_ctime[21..24]);
"the following should really be a verb/property. attribution: the ";
"algorithm used is from the eminently eminent g7.";
monthlen = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
while (_time >= (days = (monthlen[month] + (((month == 2) && ((year % 4) == 0)) && (!((year % 400) in {100, 200, 300}))))))
_time = (_time - days);
months = (months + 1);
if ((month = (month + 1)) > 12)
year = (year + 1);
month = 1;
endif
endwhile
timelist = {months / 12, months % 12, _time, @timelist};
for unit in (units)
i = (unit in units);
if (timelist[i] > 0)
units[i] = (((tostr(timelist[i]) + " ") + units[i]) + ((timelist[i] == 1) ? "" | "s"));
else
units = listdelete(units, i);
timelist = listdelete(timelist, i);
endif
endfor
"suspend(0)";
return $string_utils:english_list(units);
.
#44:8
"from_day(day_of_week,which)";
"numeric time (seconds since 1970) corresponding to midnight (PST) of the given weekday.  Use either the name of the day or a 1..7 number (1==Sunday,...)";
"  which==-1 => use most recent such day.";
"  which==+1 => use first upcoming such day.";
"  which==0  => use closest such day.";
"larger (absolute) values for which specify a certain number of weeks into the future or past.";
if (!(tonum(day = args[1]) || (day = $string_utils:find_prefix(day, this.days))))
return E_DIV;
endif
delta = {288000, 374400, 460800, 547200, 28800, 115200, 201600}[tonum(day)];
time = (time() - delta);
dir = {@args, 0}[2];
if (dir)
time = ((time / 604800) + ((dir > 0) ? dir | (dir + 1)));
else
time = ((time + 302400) / 604800);
endif
return (time * 604800) + delta;
.
#44:9
"from_month(month,which[,d])";
"numeric time (seconds since 1970) corresponding to midnight (PST) of the dth (first) day of the given month.  Use either the month name or a 1..12 number (1==January,...)";
"  which==-1 => use most recent such month.";
"  which==+1 => use first upcoming such month.";
"  which==0  => use closest such month.";
"larger (absolute) values for which specify a certain number of years into the future or past.";
if (!(tonum(month = args[1]) || (month = $string_utils:find_prefix(month, this.months))))
return E_DIV;
endif
delta = (({0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334}[month] + {@args, 1}[3]) - 1);
day = ((time() - 28800) / 86400);
day = ((day - ((day + 672) / 1461)) - delta);
dir = {@args, 0}[2];
if (dir)
day = (((day / 365) + dir) + (dir <= 0));
else
day = (((2 * day) + 365) / 730);
endif
day = ((day * 365) + delta);
day = (day + ((day + 671) / 1460));
return (day * 86400) + 28800;
.
#44:10
"Takes a time that is midnight PST and converts it to the nearest PDT midnight time if it's during that part of the year where we use PDT.";
time = args[1];
return time - (3600 * (((tonum(ctime(time)[12..13]) + 12) % 24) - 12));
.
#44:11
"Works like pronoun substitution, but substitutes time stuff.";
"Call with time_sub(string, time). returns a string.";
"time is an optional integer in time() format.  If omitted, time() is used.";
"Macros which are unknown are ignored. $Q -> the empty string.";
"Terminal $ are ignored.";
"$H -> hour #. $M -> min #. $S -> second #. 24-hour format, fixed width.";
"$h, $m, $s same x/c have not-fixed format. 00:03:24 vs. 0:3:24";
"$O/$o -> numeric hour in 12-hour format.";
"$D -> long day name. $d -> short day name.";
"$N -> long month name. $n -> short month name.";
"$Y -> long year # (e.g. '1991'). $y -> short year # (e.g. '91')";
"$Z -> the time zone    (added in by r'm later)";
"$P/$p -> AM/PM, or am/pm.";
"$T -> date number. $t -> date number with no extra whitespace etc.";
"$1 -> Month in fixed-width numeric format (01-12)   (added by dpk)";
"$2 -> Month in nonfixed numeric format (1-12)";
"$3 -> Date in fixed-width format, 0-fill";
"$$ -> $.";
"";
"This verb stolen from Ozymandias's #4835:time_subst.";
res = "";
thestr = args[1];
if (length(args) > 1)
thetime = tonum(args[2]);
else
thetime = time();
endif
if ((typeof(thestr) != STR) || (typeof(thetime) != NUM))
player:tell("Bad arguments to time_subst.");
return;
endif
itslength = length(thestr);
if (!itslength)
return "";
endif
done = 0;
cctime = ctime(thetime);
while (dollar = index(thestr, "$"))
res = (res + thestr[1..dollar - 1]);
if (dollar == length(thestr))
return res;
endif
thechar = thestr[dollar + 1];
thestr[1..dollar + 1] = "";
if (thechar == "$")
res = (res + "$");
elseif (!strcmp(thechar, "h"))
res = (res + $string_utils:trim(tostr(tonum(cctime[12..13]))));
elseif (thechar == "H")
res = (res + cctime[12..13]);
elseif (!strcmp(thechar, "m"))
res = (res + $string_utils:trim(tostr(tonum(cctime[15..16]))));
elseif (thechar == "M")
res = (res + cctime[15..16]);
elseif (!strcmp(thechar, "s"))
res = (res + $string_utils:trim(tostr(tonum(cctime[18..19]))));
elseif (thechar == "S")
res = (res + cctime[18..19]);
elseif (!strcmp(thechar, "D"))
res = (res + $time_utils:day(thetime));
elseif (thechar == "d")
res = (res + cctime[1..3]);
elseif (!strcmp(thechar, "N"))
res = (res + $time_utils:month(thetime));
elseif (thechar == "n")
res = (res + cctime[5..7]);
elseif (!strcmp(thechar, "T"))
res = (res + cctime[9..10]);
elseif (thechar == "t")
res = (res + $string_utils:trim(cctime[9..10]));
elseif (thechar == "O")
res = (res + tostr(((tonum(cctime[12..13]) + 11) % 12) + 1));
elseif (!strcmp(thechar, "p"))
res = (res + ((tonum(cctime[12..13]) >= 12) ? "pm" | "am"));
elseif (thechar == "P")
res = (res + ((tonum(cctime[12..13]) >= 12) ? "PM" | "AM"));
elseif (!strcmp(thechar, "y"))
res = (res + cctime[23..24]);
elseif (thechar == "Y")
res = (res + cctime[21..24]);
elseif (thechar == "Z")
res = (res + cctime[26..28]);
elseif (thechar == "1")
res = (res + $string_utils:right(tostr($string_utils:explode(cctime)[2] in this.monthabbrs), 2, "0"));
elseif (thechar == "2")
res = (res + tostr($string_utils:explode(cctime)[2] in this.monthabbrs));
elseif (thechar == "3")
res = (res + $string_utils:subst(cctime[9..10], {{" ", "0"}}));
endif
endwhile
return res + thestr;
.
#44:12
"Copied from Archer (#52775):mmddyy Tue Apr  6 17:04:26 1993 PDT";
"Given a time() or ctime()-style date and an optional separator, this returns the MM/DD/YY or DD/MM/YY form of the date (depending on the verb called.)  The default seperator is '/'";
if (typeof(args[1]) == NUM)
time = ctime(args[1]);
elseif (typeof(args[1]) == STR)
time = args[1];
else
return E_TYPE;
endif
date = $string_utils:explode(time);
day = tonum(date[3]);
month = (date[2] in $time_utils.monthabbrs);
year = date[5];
daystr = ((day < 10) ? "0" + tostr(day) | tostr(day));
monthstr = ((month < 10) ? "0" + tostr(month) | tostr(month));
yearstr = tostr(year)[3..4];
divstr = ((length(args) == 1) ? "/" | args[2]);
if (verb == "mmddyy")
return tostr(monthstr, divstr, daystr, divstr, yearstr);
else
return tostr(daystr, divstr, monthstr, divstr, yearstr);
endif
.
#44:13
"$time_utils:parse_english_time_interval(n1,u1,n2,u2,...)";
"or $time_utils:parse_english_time_interval(\"n1 u1[,] [and] n2[,] u2 [and] ...\")";
"There must be an even number of arguments, all of which must be strings,";
" or there must be just one argument which is the entire string to be parsed.";
"The n's are are numeric strings, and the u's are unit names.";
"The known units are in $time_utils.time_units,";
" which must be kept sorted with bigger times at the head.";
"Returns the time represented by those words.";
"For example,";
" $time_utils:parse_english_time_interval(\"30\",\"secs\",\"2\",\"minutes\",\"31\",\"seconds\") => 181";
if ((length(args) == 1) && index(args[1], " "))
return $time_utils:parse_english_time_interval(@$string_utils:words(args[1]));
endif
a = $list_utils:setremove_all(args, "and");
nargs = length(a);
if (nargs % 2)
return E_ARGS;
endif
nsec = 0;
n = 0;
for i in [1..nargs]
if ((i % 2) == 1)
if ($string_utils:is_numeric(a[i]))
n = tonum(a[i]);
elseif (a[i] in {"a", "an"})
n = 1;
elseif (a[i] in {"no"})
n = 0;
else
return E_INVARG;
endif
else
unit = a[i];
if (unit[length(unit)] == ",")
unit = unit[1..length(unit) - 1];
endif
ok = 0;
for entry in ($time_utils.time_units)
if ((!ok) && (unit in entry[2..length(entry)]))
nsec = (nsec + (entry[1] * n));
ok = 1;
endif
endfor
if (!ok)
return E_INVARG;
endif
endif
endfor
return nsec;
.
#44:14
"Copied from Ballroom Complex (#29992):from_date by Keelah! (#30246) Tue Jul 13 19:42:32 1993 PDT";
":seconds_until_date(month,day,time,which)";
"month is a string or the numeric representation of the month, day is a number, time is a string in the following format, hh:mm:ss.";
"which==-1 => use most recent such month.";
"which==+1 => use first upcoming such month.";
"which==0 => use closest such month.";
"This will return the number of seconds until the month, day and time given to it.";
"Written by Keelah, on July 5, 1993.";
month = args[1];
day = args[2];
which = args[4];
time = args[3];
converted = 0;
converted = (converted + $time_utils:from_month(month, which, day));
current = this:seconds_until_time("12:00:00");
get_seconds = this:seconds_until_time(time);
if (get_seconds < 0)
get_seconds = ((get_seconds + 39600) - current);
else
get_seconds = ((get_seconds + 39600) - current);
endif
converted = ((converted + get_seconds) - time());
return converted;
.
#44:15
"Copied from Ballroom Complex (#29992):seconds_until by Keelah! (#30246) Tue Jul 13 19:42:37 1993 PDT";
":seconds_until_time(hh:mm:ss)";
"Given the string hh:mm:ss, this returns the number of seconds until that hh:mm:ss. If the hh:mm:ss is before the current time(), the number returned is a negative, else the number is a positive.";
"Written by Keelah, on July 4, 1993.";
current = $time_utils:to_seconds(ctime()[12..19]);
time = $time_utils:to_seconds(args[1]);
return tonum(time) - tonum(current);
.
#46:0
"For changing mailing list aliases, we check to make sure that none of the aliases match existing mailing list aliases.  Aliases containing spaces are not used in addresses and so are not subject to this restriction ($mail_agent:match will not match on them, however, so they only match if used in the immediate room, e.g., with match_object() or somesuch).";
"  => E_PERM   if you don't own this";
if (!$perm_utils:controls(caller_perms(), this))
return E_PERM;
elseif (this.location != $mail_agent)
"... we don't care...";
return pass(@args);
else
for a in (aliases = args[1])
if (index(a, " "))
"... we don't care...";
elseif (rp = $mail_agent:reserved_pattern(a))
player:tell("Mailing list name \"", a, "\" uses a reserved pattern: ", rp[1]);
aliases = setremove(aliases, a);
elseif (valid(p = $mail_agent:match(a, #-1)) && ((p != this) && (a in p.aliases)))
player:tell("Mailing list name \"", a, "\" in use on ", p.name, "(", p, ")");
aliases = setremove(aliases, a);
endif
endfor
if (aliases)
return pass(aliases);
else
return 1;
endif
endif
.
#46:1
namelist = ("*" + ((names = this:mail_names()) ? $string_utils:from_list(names, ", *") | tostr(this)));
if (typeof(fwd = this:mail_forward()) != LIST)
fwd = {};
endif
if (this:is_writable_by(player))
if (player in fwd)
read = " [Writable/Subscribed]";
else
read = " [Writable]";
endif
elseif (typeof(this.readers) != LIST)
read = tostr(" [Public", (player in fwd) ? "/Subscribed]" | "]");
elseif (player in fwd)
read = " [Subscribed]";
elseif (this:is_readable_by(player))
read = " [Readable]";
else
read = "";
endif
if (this:is_usable_by($no_one))
mod = "";
elseif (this:is_usable_by(player))
mod = " [Approved]";
else
mod = " [Moderated]";
endif
player:tell(namelist, "  (", this, ")", read, mod);
d = this:description();
if (typeof(d) == STR)
d = {d};
endif
for l in (d)
if (length(l) <= 75)
ls = {l};
else
ls = $generic_editor:fill_string(l, 76);
endif
for line in (ls)
player:tell("    ", line);
endfor
endfor
.
#46:2
return $perm_utils:controls(who = args[1], this) || (who in this.writers);
.
#46:3
return (typeof(this.readers) != LIST) || (((who = args[1]) in this.readers) || (this:is_writable_by(who) || $mail_agent:sends_to(1, this, who)));
.
#46:4
who = args[1];
if (this.moderated)
return (who in this.moderated) || (this:is_writable_by(who) || who.wizard);
else
return this.guests_can_send_here || (!$object_utils:isa(who, $guest));
endif
.
#46:5
if ((args && (!this:is_usable_by(args[1]))) && (!args[1].wizard))
return this:moderator_notify(@args);
else
return this.(verb);
endif
.
#46:6
if ((args && (!this:is_usable_by(args[1]))) && (!args[1].wizard))
return this:moderator_forward(@args);
elseif (typeof(mf = this.(verb)) == STR)
return $string_utils:pronoun_sub(mf, @args);
else
return mf;
endif
.
#46:7
if (typeof(mf = this.(verb)) == STR)
return $string_utils:pronoun_sub(mf, args ? args[1] | $player);
else
return mf;
endif
.
#46:8
":add_forward(recip[,recip...]) adds new recipients to this list.  Returns a string error message or a list of results (recip => success, E_PERM => not allowed, E_INVARG => not a valid recipient, string => other kind of failure)";
if (caller == $mail_editor)
perms = player;
else
perms = caller_perms();
endif
result = {};
forward_self = ((!this.mail_forward) || (this in this.mail_forward));
for recip in (args)
if ((!valid(recip)) || ((!is_player(recip)) && (!($mail_recipient in $object_utils:ancestors(recip)))))
r = E_INVARG;
elseif ($perm_utils:controls(perms, this) || ((typeof(this.readers) != LIST) && $perm_utils:controls(perms, recip)))
this.mail_forward = setadd(this.mail_forward, recip);
r = recip;
else
r = E_PERM;
endif
result = listappend(result, r);
endfor
if ((length(this.mail_forward) > 1) && ($nothing in this.mail_forward))
this.mail_forward = setremove(this.mail_forward, $nothing);
endif
if (forward_self)
this.mail_forward = setadd(this.mail_forward, this);
endif
return result;
.
#46:9
":delete_forward(recip[,recip...]) removes recipients to this list.  Returns a list of results (E_PERM => not allowed, E_INVARG => not on list)";
if (caller == $mail_editor)
perms = player;
else
perms = caller_perms();
endif
result = {};
forward_self = ((!this.mail_forward) || (this in this.mail_forward));
for recip in (args)
if (!(recip in this.mail_forward))
r = E_INVARG;
elseif (((!valid(recip)) || $perm_utils:controls(perms, recip)) || $perm_utils:controls(perms, this))
if (recip == this)
forward_self = 0;
endif
this.mail_forward = setremove(this.mail_forward, recip);
r = recip;
else
r = E_PERM;
endif
result = listappend(result, r);
endfor
if (!(forward_self || this.mail_forward))
this.mail_forward = {$nothing};
elseif (this.mail_forward == {this})
this.mail_forward = {};
endif
return result;
.
#46:10
":add_notify(recip[,recip...]) adds new notifiees to this list.  Returns a list of results (recip => success, E_PERM => not allowed, E_INVARG => not a valid recipient)";
if (caller == $mail_editor)
perms = player;
else
perms = caller_perms();
endif
result = {};
for recip in (args)
if ((!valid(recip)) || (recip == this))
r = E_INVARG;
elseif ($perm_utils:controls(perms, this) || (this:is_readable_by(perms) && $perm_utils:controls(perms, recip)))
this.mail_notify = setadd(this.mail_notify, recip);
r = recip;
else
r = E_PERM;
endif
result = listappend(result, r);
endfor
return result;
.
#46:11
":delete_notify(recip[,recip...]) removes notifiees from this list.  Returns a list of results (E_PERM => not allowed, E_INVARG => not on list)";
if (caller == $mail_editor)
perms = player;
else
perms = caller_perms();
endif
result = {};
rmthis = 0;
for recip in (args)
if (!(recip in this.mail_notify))
r = E_INVARG;
elseif ((!valid(recip)) || ($perm_utils:controls(perms, recip) || $perm_utils:controls(perms, this)))
if (recip == this)
rmthis = 1;
endif
this.mail_notify = setremove(this.mail_notify, recip);
r = recip;
else
r = E_PERM;
endif
result = listappend(result, r);
endfor
return result;
.
#46:12
if (!this:ok_write(caller, caller_perms()))
return E_PERM;
else
this.messages = {@this.messages, {new = this:new_message_num(), args[1]}};
this.last_msg_date = args[1][1];
this.last_used_time = time();
return new;
endif
.
#46:13
":ok(caller,callerperms) => true iff caller can do read operations";
return (args[1] in {this, $mail_agent}) || (args[2].wizard || this:is_readable_by(args[2]));
.
#46:14
":ok_write(caller,callerperms) => true iff caller can do write operations";
return (args[1] in {this, $mail_agent}) || (args[2].wizard || this:is_writable_by(args[2]));
.
#46:15
":parse_message_seq(strings,cur) => msg_seq";
"";
":from_msg_seq(olist)     => msg_seq of messages from those people";
":%from_msg_seq(strings)  => msg_seq of messages with strings in the From: line";
":to_msg_seq(olist)       => msg_seq of messages to those people";
":%to_msg_seq(strings)    => msg_seq of messages with strings in the To: line";
":subject_msg_seq(target) => msg_seq of messages with target in the Subject:";
":body_msg_seq(target)    => msg_seq of messages with target in the body";
":new_message_num()    => number that the next incoming message will receive.";
":length_num_le(num)   => number of messages in folder numbered <= num";
":length_date_le(date) => number of messages in folder dated <= date";
":length_all_msgs()    => number of messages in folder";
":exists_num_eq(num)   => index of message in folder numbered == num, or 0";
"";
":display_seq_headers(msg_seq[,cur])   display message summary lines";
":display_seq_full(msg_seq[,preamble]) display entire messages";
"            => number of final message displayed";
":list_rmm() displays contents of .messages_going.";
"            => the number of messages in .messages_going.";
"";
":messages_in_seq(msg_seq) => list of messages in msg_seq on folder";
"";
"See the corresponding routines on $mail_agent for more detail.";
return this:ok(caller, caller_perms()) ? $mail_agent:(verb)(@args) | E_PERM;
.
#46:16
":length_date_le(date) => number of messages in folder dated > date";
"";
if (this:ok(caller, caller_perms()))
date = args[1];
return (this.last_msg_date <= date) ? 0 | $mail_agent:(verb)(date);
else
return E_PERM;
endif
.
#46:17
":rm_message_seq(msg_seq) removes the given sequence of from folder";
"               => string giving msg numbers removed";
"See the corresponding routine on $mail_agent.";
if (this:ok_write(caller, caller_perms()))
return $mail_agent:(verb)(@args);
elseif (this:ok(caller, caller_perms()) && (seq = this:own_messages_filter(caller_perms(), @args)))
return $mail_agent:(verb)(@listset(args, seq, 1));
else
return E_PERM;
endif
.
#46:18
":rm_message_seq(msg_seq) removes the given sequence of from folder";
"               => string giving msg numbers removed";
":list_rmm()    displays contents of .messages_going.";
"               => number of messages in .messages_going.";
":undo_rmm()    restores previously deleted messages from .messages_going.";
"               => msg_seq of restored messages";
":expunge_rmm() destroys contents of .messages_going once and for all.";
"               => number of messages in .messages_going.";
":renumber([cur])  renumbers all messages";
"               => {number of messages,new cur}.";
"";
"See the corresponding routines on $mail_agent.";
return this:ok_write(caller, caller_perms()) ? $mail_agent:(verb)(@args) | E_PERM;
.
#46:19
":own_messages_filter(who,msg_seq) => subsequence of msg_seq consisting of those messages that <who> is actually allowed to remove (on the assumption that <who> is not one of the allowed writers of this folder.";
if (!this.rmm_own_msgs)
return E_PERM;
elseif ((typeof(seq = this:from_msg_seq({args[1]}, args[2])) != LIST) || (seq != args[2]))
return {};
else
return seq;
endif
.
#46:20
"NOTE:  this routine is obsolete, use :messages_in_seq()";
":messages(num) => returns the message numbered num.";
":messages()    => returns the entire list of messages (can be SLOW).";
if (!this:ok(caller, caller_perms()))
return E_PERM;
elseif (!args)
return this:messages_in_seq({1, this:length_all_msgs() + 1});
elseif (!(n = this:exists_num_eq(args[1])))
return E_RANGE;
else
return this:messages_in_seq(n)[2];
endif
.
#46:21
if (!this:ok_write(caller, caller_perms()))
return E_PERM;
endif
date_seq = {};
for msg in (this.messages)
date_seq = {@date_seq, msg[2][1]};
endfor
msg_order = $list_utils:sort($list_utils:range(n = length(msgs = this.messages)), date_seq);
newmsgs = {};
for i in [1..n]
if ($command_utils:suspend_if_needed(0))
player:tell("...", i);
endif
newmsgs = {@newmsgs, {i, msgs[msg_order[i]][2]}};
endfor
if (length(this.messages) != n)
"...shit, new mail received,... start again...";
fork (0)
this:date_sort();
endfork
else
this.messages = newmsgs;
this.last_used_time = newmsgs[length(newmsgs)][2][1];
endif
.
#46:22
mlen = this:length_all_msgs();
this.last_msg_date = (mlen && this:messages_in_seq(mlen)[2][1]);
.
#46:23
return this.(verb);
.
#46:24
return $mail_agent:msg_summary_line(@args);
.
#46:25
for m in (this.messages)
$mail_agent:__convert_new(@m[2]);
$command_utils:suspend_if_needed(0);
endfor
.
#46:26
if (!this:ok_write(caller, caller_perms()))
return E_PERM;
endif
msgs = {};
i = 1;
for m in (oldmsgs = this.messages)
msgs = {@msgs, {m[1], $mail_agent:__convert_new(@m[2])}};
if ($command_utils:running_out_of_time())
player:notify(tostr("...", i, " ", this));
suspend(0);
if (oldmsgs != this.messages)
return 0;
endif
endif
i = (i + 1);
endfor
this.messages = msgs;
return 1;
.
#46:27
if (caller_perms().wizard)
pass();
if (!(this in {$mail_recipient, $big_mail_recipient}))
"...generic mail recipients stay in #-1...";
move(this, $mail_agent);
endif
endif
.
#46:28
if ($perm_utils:controls(caller_perms(), this))
this.mail_forward = {};
return pass(@args);
endif
.
#46:29
return this.aliases[1];
.
#46:30
names = {};
for a in (this.aliases)
if (!index(a, " "))
names = setadd(names, strsub(a, "_", "-"));
endif
endfor
return names;
.
#46:31
if (caller_perms().wizard || (caller_perms() == this.owner))
"Passed security check...";
if (this.expire_period && (n = this:length_date_le(time() - this.expire_period)))
this:rm_message_seq($seq_utils:range(1, n));
return this:expunge_rmm();
endif
else
return E_PERM;
endif
.
#46:32
if (this:is_writable_by(caller_perms()) || this:is_writable_by(caller))
pass(@args);
else
return E_PERM;
endif
.
#47:0
"resolve(name,from,seen,prevrcpts,prevnotifs) => {rcpts,notifs} or E_INVARG";
"resolve(list,from,seen,prevrcpts,prevnotifs) => {bogus,rcpts,notifs}";
"Given either an address (i.e., objectid) or a list of such, traces down all .mail_forward lists and .mail_notify to determine where a message should actually go and who should be told about it.  Both forms take previous lists of recipients/notifications and add only those addresses that weren't there before.  `seen' is the stack of addresses we are currently resolving (for detecting loops).  The first form returns E_INVARG if `name' is invalid.  The second form returns all invalid addresses in the `bogus' list but still does the appropriate search on the remaining addresses.";
recip = args[1];
from = args[2];
if (length(args) == 2)
args = {@args, {}, {}, {}};
endif
seen = args[3];
sofar = args[4..5];
if (typeof(recip) == LIST)
bogus = {};
for r in (recip)
result = this:resolve_addr(r, from, seen, @sofar);
if (result)
sofar = result;
else
bogus = setadd(bogus, r);
endif
endfor
return {bogus, @sofar};
else
fwd = (include_recip = 0);
if ((recip == $nothing) || (recip in seen))
return sofar;
elseif ((!valid(recip)) || ((!(is_player(recip) || $object_utils:isa(recip, $mail_recipient))) || (typeof(fwd = recip:mail_forward(from)) != LIST)))
"recip is a non-player non-mailing-list/folder or forwarding is screwed.";
if (typeof(fwd) == STR)
player:tell(fwd);
endif
return E_INVARG;
elseif (fwd)
if (r = (recip in fwd))
include_recip = 1;
fwd = listdelete(fwd, r);
endif
result = this:resolve_addr(fwd, recip, setadd(seen, recip), @sofar);
if (bogus = result[1])
player:tell(recip.name, "(", recip, ")'s .mail_forward list includes the following bogus entr", (length(bogus) > 1) ? "ies:  " | "y:  ", $string_utils:english_list(bogus));
endif
sofar = result[2..3];
else
include_recip = 1;
endif
if ((ticks_left() < 1000) || (seconds_left() < 2))
suspend(0);
endif
biffs = sofar[2];
for n in (this:mail_notify(recip, from))
if (valid(n))
if (i = $list_utils:iassoc_suspended(n, biffs))
biffs[i] = setadd(biffs[i], recip);
else
biffs = {{n, recip}, @biffs};
endif
endif
if ((ticks_left() < 1000) || (seconds_left() < 2))
suspend(0);
endif
endfor
return {include_recip ? setadd(sofar[1], recip) | sofar[1], biffs};
endif
.
#47:1
"sends_to(from,addr,rcpt[,seen]) ==> true iff mail sent to addr passes through rcpt.";
if ((addr = args[2]) == (rcpt = args[3]))
return 1;
elseif (!(addr in (seen = ((length(args) >= 4) ? args[4] | {}))))
seen = {@seen, addr};
for a in ((typeof(fwd = this:mail_forward(addr, @args[1] ? {} | {args[1]})) == LIST) ? fwd | {})
if (this:sends_to(addr, a, rcpt, seen))
return 1;
endif
$command_utils:suspend_if_needed(0);
endfor
endif
return 0;
.
#47:2
"send_message(from,rcpt-list,hdrs,msg) -- formats and sends a mail message.  hders is either the text of the subject line, or a {subject,{reply-to,...}} list.";
"Return E_PERM if from isn't owned by the caller.";
"Return {0, @invalid_rcpts} if rcpt-list contains any invalid addresses.  No mail is sent in this case.";
"Return {1, @actual_rcpts} if successful.";
from = args[1];
to = args[2];
hdrs = args[3];
msg = args[4];
if ($perm_utils:controls(caller_perms(), from))
text = $mail_agent:make_message(from, to, hdrs, msg);
return this:raw_send(text, to, from);
else
return E_PERM;
endif
.
#47:3
"WIZARDLY";
"raw_send(text,rcpts,sender) -- does the actual sending of a message.  Assumes that text has already been formatted correctly.  Decides who to send it to and who wants to be notified about it and does so.";
"Return {E_PERM} if the caller is not entitled to use this verb.";
"Return {0, @invalid_rcpts} if rcpts contains any invalid addresses.  No mail is sent in this case.";
"Return {1, @actual_rcpts} if successful.";
text = args[1];
rcpts = args[2];
from = args[3];
if (typeof(rcpts) != LIST)
rcpts = {rcpts};
endif
if (!(caller in {$mail_agent, $mail_editor}))
return {E_PERM};
elseif (bogus = (resolve = this:resolve_addr(rcpts, from))[1])
return {0, bogus};
else
this:touch(rcpts);
actual_rcpts = resolve[2];
biffs = resolve[3];
results = {};
for recip in (actual_rcpts)
if ((ticks_left() < 10000) || (seconds_left() < 2))
player:notify(tostr("...", recip));
suspend(1);
endif
if (typeof(e = recip:receive_message(text, from)) in {ERR, STR})
"...receive_message bombed...";
player:notify(tostr(recip, ":receive_message:  ", e));
e = 0;
elseif ((!is_player(recip)) || (!e))
"...not a player or receive_message isn't giving out the message number";
"...no need to force a notification...";
elseif (i = $list_utils:iassoc(recip, biffs))
"...player-recipient was already getting a notification...";
"...make sure notification includes a mention of him/her/itself.";
if (!(recip in listdelete(biffs[i], 1)))
biffs[i][2..1] = {recip};
endif
else
"...player-recipient wasn't originally being notified at all...";
biffs = {{recip, recip}, @biffs};
endif
results = {@results, e};
endfor
fork (0)
for b in (biffs)
if ((ticks_left() < 10000) || (seconds_left() < 2))
suspend(1);
endif
if ($object_utils:has_callable_verb(b[1], "notify_mail"))
mnums = {};
for r in (listdelete(b, 1))
mnums = {@mnums, (rn = (r in actual_rcpts)) && results[rn]};
endfor
b[1]:notify_mail(from, listdelete(b, 1), mnums);
endif
endfor
endfork
if ((len = length(actual_rcpts)) > 10)
len = 10;
endif
if (len)
this.total_recipients[len] = (this.total_recipients[len] + 1);
endif
return {1, @actual_rcpts};
endif
.
#47:4
who = args[1];
if ($object_utils:has_verb(who, verb))
return who:(verb)(@listdelete(args, 1));
else
return {};
endif
.
#47:5
"touch(name or list,seen) => does .last_used_time = time() if we haven't already touched this in the last hour";
recip = args[1];
seen = ((length(args) >= 2) ? args[2] | {});
if (typeof(recip) == LIST)
for r in (recip)
result = this:touch(r, seen);
$command_utils:suspend_if_needed(0);
endfor
else
if (((!valid(recip)) || (recip in seen)) || ((!is_player(recip)) && (!($mail_recipient in $object_utils:ancestors(recip)))))
"recip is neither a player nor a mailing list/folder";
else
if (fwd = this:mail_forward(recip))
this:touch(fwd, {@seen, recip});
endif
if (!is_player(recip))
recip.last_used_time = time();
endif
endif
endif
.
#47:6
player:tell_lines(this.description);
for c in (this.contents)
c:look_self();
endfor
.
#47:7
"Only allow mailing lists/folders in here and only if their names aren't already taken.";
what = args[1];
return ($object_utils:isa(what, $mail_recipient) && this:check_names(@what.aliases)) && (what:description() != parent(what):description());
.
#47:8
"...make sure the list has at least one usable name.";
"...make sure none of the aliases are already taken.";
ok = 0;
for a in (args)
if (index(a, " "))
elseif (rp = $mail_agent:reserved_pattern(a))
player:tell("Mailing list name \"", a, "\" uses a reserved pattern: ", rp[1]);
return 0;
elseif (valid(p = $mail_agent:match(a, #-1)) && (a in p.aliases))
player:tell("Mailing list name \"", a, "\" in use on ", p.name, "(", p, ")");
return 0;
else
ok = 1;
endif
endfor
return ok;
.
#47:9
":match(string) => mailing list object in here that matches string.";
":match(string,player) => similar but also matches against player's private mailing lists (as kept in .mail_lists).";
if (!(string = args[1]))
return $nothing;
elseif (string[1] == "*")
string = string[2..length(string)];
endif
if (valid(o = $string_utils:literal_object(string)) && ($mail_recipient in $object_utils:ancestors(o)))
return o;
elseif (rp = this:reserved_pattern(string))
return rp[2]:match_mail_recipient(string);
else
if (valid(who = {@args, player}[2]) && (typeof(use = who.mail_lists) == LIST))
use = {@this.contents, @use};
else
use = this.contents;
endif
partial = 1;
string = strsub(string, "_", "-");
for l in (use)
if (string in l.aliases)
return l;
endif
if (partial != $ambiguous_match)
for a in (l.aliases)
if ((index(a, string) == 1) && (!index(a, " ")))
if (partial)
partial = l;
elseif (partial != l)
partial = $ambiguous_match;
endif
endif
endfor
endif
endfor
return partial && $failed_match;
endif
.
#47:10
":match_recipient(string[,meobj]) => $player or $mail_recipient object that matches string.  Optional second argument (defaults to player) is returned in the case string==\"me\" and is also used to obtain a list of private $mail_recipients to match against.";
string = args[1];
if (!string)
return $nothing;
elseif ((string[1] == "*") && (string != "*"))
return this:match(@args);
elseif (string[1] == "`")
args[1][1..1] = "";
return $string_utils:match_player(@args);
elseif (valid(o = $string_utils:match_player(@args)) || (o == $ambiguous_match))
return o;
else
return this:match(@args);
endif
.
#47:11
match_result = args[1];
string = args[2];
cmd_id = ({@args, ""}[3] || "");
if (match_result == $nothing)
player:tell(cmd_id, "You must specify a valid mail recipient.");
elseif (match_result == $failed_match)
player:tell(cmd_id, "There is no mail recipient called \"", string, "\".");
elseif (match_result == $ambiguous_match)
if ((nostar = (index(string, "*") != 1)) && (lst = $player_db:find_all(string)))
player:tell(cmd_id, "\"", string, "\" could refer to ", (length(lst) > 20) ? tostr("any of ", length(lst), " players") | $string_utils:english_list($list_utils:map_arg(2, $string_utils, "pronoun_sub", "%n (%#)", lst), "no one", " or "), ".");
else
player:tell(cmd_id, "I don't know which \"", nostar ? "*" | "", string, "\" you mean.");
endif
elseif (!valid(match_result))
player:tell(cmd_id, match_result, " does not exist.");
else
return 0;
endif
return 1;
.
#47:12
":make_message(sender,recipients,subject/replyto,body)";
" => message in the form as it will get sent.";
from = args[1];
fromline = tostr(valid(from) ? from.name | "???", " (", from, ")");
if (typeof(recips = args[2]) != LIST)
recips = {recips};
endif
recips = this:name_list(@recips);
if (typeof(hdrs = args[3]) != LIST)
subj = hdrs;
replyto = (valid(from) && ((!is_player(from)) && ((!$object_utils:isa(from, $mail_recipient)) && this:name(from.owner))));
else
subj = hdrs[1];
replyto = ({@hdrs, 0}[2] && this:name_list(@hdrs[2]));
endif
body = args[4];
if (typeof(body) != LIST)
body = (body ? {body} | {});
endif
return {time(), fromline, recips, subj || " ", @replyto ? {"Reply-to: " + replyto} | {}, "", @body};
.
#47:13
what = args[1];
return tostr(strsub(strsub($object_utils:isa(what, $player) ? what.name | tostr("*", what:mail_name()), "(", ""), ")", ""), " (", what, ")");
.
#47:14
return $string_utils:english_list($list_utils:map_arg(this, "name", args), "no one");
.
#47:15
":parse_address_field(string) => list of objects";
"This is the standard routine for parsing address lists that appear in From:, To: and Reply-To: lines";
objects = {};
string = args[1];
while (e = index(string, ")"))
if ((s = rindex(string[1..e], "(#")) && (#0 != (o = toobj(string[s + 2..e - 1]))))
objects = {@objects, o};
endif
string = string[e + 1..length(string)];
endwhile
return objects;
.
#47:16
":display_seq_full(msg_seq[,preamble]) => {cur, last-read-date}";
"This is the default message display routine.";
"Prints entire messages on folder (caller) to player.  msg_seq is the handle returned by :parse_message_seq(...) and indicates which messages should be printed.  preamble, if given will precede the output of the message itself, in which case the message number will be substituted for \"%d\".  Returns the number of the final message in the sequence (which can be then used as the new current message number).";
set_task_perms(caller_perms());
preamble = {@args, ""}[2];
cur = (date = 0);
for x in (msgs = caller:messages_in_seq(args[1]))
cur = x[1];
date = x[2][1];
player:display_message(preamble ? strsub(preamble, "%d", tostr(cur)) | {}, player:msg_text(@x[2]));
if ((ticks_left() < 500) || (seconds_left() < 2))
suspend(0);
endif
endfor
return {cur, date};
.
#47:17
":display_seq_headers(msg_seq[,cur[,last_read_date]])";
"This is the default header display routine.";
"Prints a list of headers of messages on caller to player.  msg_seq is the handle returned by caller:parse_message_seq(...).  cur is the player's current message.  last_read_date is the date of the last of the already-read messages.";
set_task_perms(caller_perms());
cur = {@args, 0}[2];
last_old = {@args, $maxint, $maxint}[3];
width = (player:linelen() || 79);
for x in (msgs = caller:messages_in_seq(args[1]))
line = tostr($string_utils:right(x[1], 4, (cur == x[1]) ? ">" | " "), (x[2][1] > last_old) ? ":+ " | ":  ", caller:msg_summary_line(@x[2]));
player:tell(line[1..min(width, length(line))]);
if ((ticks_left() < 500) || (seconds_left() < 2))
suspend(0);
endif
endfor
player:tell("----+");
.
#47:18
":rm_message_seq(msg_seq)  removes the given sequence of from folder (caller)";
"...removed messages are saved in .messages_going for possible restoration.";
set_task_perms(caller_perms());
old = caller.messages;
new = (save = (nums = {}));
next = 1;
for i in [1..length(seq = args[1]) / 2]
if ((ticks_left() < 500) || (seconds_left() < 2))
player:tell("... rmm ", old[next][1] - 1);
suspend(0);
endif
start = seq[(2 * i) - 1];
new = {@new, @old[next..start - 1]};
save = {@save, {start - next, old[start..(next = seq[2 * i]) - 1]}};
nums = {@nums, old[start][1], old[next - 1][1] + 1};
endfor
new = {@new, @old[next..length(old)]};
caller.messages_going = save;
caller.messages = new;
if ($object_utils:has_callable_verb(caller, "_fix_last_msg_date"))
caller:_fix_last_msg_date();
endif
return $seq_utils:tostr(nums);
.
#47:19
":undo_rmm()  restores previously deleted messages in .messages_going to .messages.";
set_task_perms(caller_perms());
old = caller.messages;
new = (seq = {});
last = 0;
next = 1;
for s in (caller.messages_going)
new = {@new, @old[last + 1..last + s[1]], @s[2]};
last = (last + s[1]);
seq = {@seq, next + s[1], next = (length(new) + 1)};
endfor
caller.messages = {@new, @old[last + 1..length(old)]};
caller.messages_going = {};
if ($object_utils:has_callable_verb(caller, "_fix_last_msg_date"))
caller:_fix_last_msg_date();
endif
return seq;
.
#47:20
":list_rmm()    displays contents of .messages_going.";
":expunge_rmm() destroys contents of .messages_going once and for all.";
"... both return the number of messages in .messages_going.";
set_task_perms(caller_perms());
msgs = (seq = {});
for s in (caller.messages_going)
msgs = {@msgs, @s[2]};
endfor
if (verb == "expunge_rmm")
caller.messages_going = {};
else
for x in (msgs)
player:tell($string_utils:right(x[1], 4), ":  ", caller:msg_summary_line(@x[2]));
if ((ticks_left() < 500) || (seconds_left() < 2))
suspend(0);
endif
endfor
if (msgs)
player:tell("----+");
endif
endif
return length(msgs);
.
#47:21
":renumber([cur]) -- assumes caller is a $mail_recipient or a $player.";
"...renumbers caller.messages, doing a suspend() if necessary.";
"...returns {number of messages,new cur}.";
set_task_perms(caller_perms());
cur = {@args, 0}[1];
caller.messages_going = {};
"... blow away @rmm'ed messages since there's no way to tell what their new numbers should be...";
msgs = caller.messages;
if (cur)
cur = $list_utils:iassoc_sorted(cur, msgs);
endif
while (1)
"...find first out-of-sequence message...";
l = 0;
r = ((len = length(msgs)) + 1);
while ((r - 1) > l)
if (msgs[i = ((r + l) / 2)][1] > i)
r = i;
else
l = i;
endif
endwhile
"... r == first out-of-sequence, l == last in-sequence, l+1 == r ...";
if (l >= len)
return {l, cur};
endif
"...renumber as many messages as we have time for...";
chunk = {};
while (((r <= len) && (ticks_left() > 3000)) && (seconds_left() > 2))
for x in (msgs[r..min(r + 9, len)])
chunk = {@chunk, {r, x[2]}};
r = (r + 1);
endfor
endwhile
caller.messages = {@msgs[1..l], @chunk, @msgs[r..len]};
if (chunk)
player:tell("...(renumbering ", l + 1, " -- ", r - 1, ")");
suspend(0);
else
player:tell("You lose.  This message collection is just too big.");
return;
endif
"... have to be careful since new mail may be received at this point...";
msgs = caller.messages;
endwhile
.
#47:22
":msg_summary_line(@msg) => date/from/subject as a single string.";
body = (("" in {@args, ""}) + 1);
if ((body > length(args)) || (!(subject = args[body])))
subject = "(None.)";
endif
date = ctime(args[1])[5..16];
from = args[2];
if (args[4] != " ")
subject = args[4];
endif
return tostr(date, "   ", $string_utils:left(from, 20), "   ", subject);
.
#47:23
":msg_summary_line(@msg) => date/from/subject as a single string.";
blank = ("" in {@args, ""});
if ((blank < length(args)) && args[blank + 1])
if (length(args[blank + 1]) <= 28)
subject = args[blank + 1];
else
subject = (args[blank + 1][1..25] + "...");
endif
else
subject = "(None.)";
endif
if (typeof(args[1]) == NUM)
date = ctime(args[1])[5..16];
start = 2;
else
date = "?Date?";
start = 1;
endif
if ((start == 2) && (index(args[2], "From:") != 1))
from = args[2];
if (args[4] != " ")
subject = args[4];
endif
else
from = "?From?";
for line in (args[start..blank - 1])
if (index(line, "Date:") == 1)
date = $string_utils:triml(line[6..length(line)])[5..16];
elseif (index(line, "From:") == 1)
from = $string_utils:triml(line[6..length(line)]);
elseif (index(line, "Subject:") == 1)
s = $string_utils:triml(line[9..length(line)]);
if (s != "(None.)")
subject = s;
endif
endif
endfor
endif
(subject && (length(subject) > 32)) && (subject = subject[1..32]);
return tostr(date, "   ", $string_utils:left(from, 20), "   ", subject);
.
#47:24
"parse_message_seq(strings,cur[,last_old])";
"This is the default <message-sequence> parsing routine for those mail commands that refer to sequences of messages (@mail, @read,...) on a folder.";
"  caller (the folder) is assumed to be a $mail_recipient or a player.";
"  strings is the <message-sequence> portion of the arg list.";
"  cur is the number of the player's current message for this folder.";
"Returns a handle (msg_seq) that will be understood by caller:display_seq_full() or caller:display_seq_headers().";
set_task_perms(caller_perms());
if (!(nummsgs = caller:length_all_msgs()))
return "%f %<has> no messages.";
elseif (typeof(strings = args[1]) != LIST)
strings = {strings};
endif
cur = {@args, 0}[2];
last_old = {@args, 0, 0}[3];
seq = (result = {});
mode = #0;
"... changes to 0 if we start seeing message numbers, to 1 if we see masks...";
keywords = ":from:%from:to:%to:subject:body:before:after:since:until:first:last";
keyalist = {{1, "from"}, {6, "%from"}, {12, "to"}, {15, "%to"}, {19, "subject"}, {27, "body"}, {32, "before"}, {39, "after"}, {45, "since"}, {51, "until"}, {57, "first"}, {63, "last"}};
strnum = 0;
for string in (strings)
strnum = (strnum + 1);
$command_utils:suspend_if_needed(0);
if (string && ((c = index(string, ":")) && ((k = index(keywords, ":" + string[1..c - 1])) && (k == rindex(keywords, ":" + string[1..c - 1])))))
"...we have a mask to apply...";
keywd = $list_utils:assoc(k, keyalist)[2];
if (mode == #0)
seq = {1, nummsgs + 1};
endif
mode = 1;
if (k <= 27)
"...from, subject, to, body...";
pattern = string[c + 1..length(string)];
if (keywd in {"subject", "body"})
elseif (keywd[1] == "%")
pattern = $string_utils:explode(pattern, "|");
else
pattern = this:((keywd == "to") ? "_parse_to" | "_parse_from")(pattern);
if (typeof(pattern) == STR)
return pattern;
endif
endif
seq = caller:(keywd + "_msg_seq")(pattern, seq);
if (typeof(seq) == STR)
if (strnum == 1)
return seq;
else
seq = {};
endif
endif
elseif (k <= 51)
"...before, since, after, until...";
if (typeof(date = this:_parse_date(string[c + 1..length(string)])) != NUM)
return tostr("Bad date `", string, "':  ", date);
endif
s = caller:length_date_le((keywd in {"before", "since"}) ? date - 1 | (date + 86399));
if (keywd in {"before", "until"})
seq = $seq_utils:remove(seq, s + 1, nummsgs);
else
seq = $seq_utils:remove(seq, 1, s);
endif
else
"...first, last...";
if (n = tonum(string[c + 1..length(string)]))
seq = $seq_utils:(keywd + "n")(seq, n);
else
return tostr("Bad number in `", string, "'");
endif
endif
else
"...continue building the present sequence...";
if (mode)
seq && (result = $seq_utils:union(result, seq));
seq = {};
endif
mode = 0;
if (!string)
"...default case for @read and @answer: get the current message but skip to the next one if it's not there...";
if (cur)
i = min(caller:length_num_le(cur - 1) + 1, nummsgs);
seq = $seq_utils:add(seq, i, i);
else
return "%f %<has> no current message";
endif
elseif (string == "next")
if ((i = (caller:length_num_le(cur) + 1)) <= nummsgs)
seq = $seq_utils:add(seq, i, i);
else
return "%f %<has> no next message.";
endif
elseif (string == "prev")
if (i = caller:length_num_le(cur - 1))
seq = $seq_utils:add(seq, i, i);
else
return "%f %<has> no previous message.";
endif
elseif (string == "new")
s = (last_old ? caller:length_date_le(last_old) | caller:length_num_le(cur));
if (s < nummsgs)
seq = $seq_utils:add(seq, s + 1, nummsgs);
else
return "%f %<has> no new messages.";
endif
elseif (n = (tonum(string) || (((string in {"last", "$"}) && -1) || ((string == "cur") && cur))))
if (n <= 0)
seq = $seq_utils:add(seq, max(0, nummsgs + n) + 1, nummsgs);
elseif (i = caller:exists_num_eq(n))
seq = $seq_utils:add(seq, i, i);
else
return (string == "cur") ? "%f's current message has been removed." | tostr("%f %<has> no message numbered `", string, "'.");
endif
elseif (((i = index(string, "..")) > 1) || ((i = index(string, "-")) > 1))
if ((start = tonum(sst = string[1..i - 1])) > 0)
s = caller:length_num_le(start - 1);
elseif (sst in {"next", "prev", "cur"})
s = max(0, caller:length_num_le(cur - (sst != "next")) - (sst == "prev"));
elseif (sst in {"last", "$"})
s = (nummsgs - 1);
else
return {$seq_utils:union(result, seq), @strings[strnum..length(strings)]};
endif
j = ((string[i] == ".") ? i + 2 | (i + 1));
if ((end = tonum(est = string[j..length(string)])) > 0)
e = caller:length_num_le(end);
elseif (est in {"next", "prev", "cur"})
e = min(nummsgs, caller:length_num_le(cur - (est == "prev")) + (est == "next"));
elseif (est in {"last", "$"})
e = nummsgs;
else
return {$seq_utils:union(result, seq), @strings[strnum..length(strings)]};
endif
if (s < e)
seq = $seq_utils:add(seq, s + 1, e);
else
return tostr("%f %<has> no messages in range ", string, ".");
endif
elseif (string == "cur")
return "%f %<has> no current message.";
else
return {$seq_utils:union(result, seq), @strings[strnum..length(strings)]};
endif
endif
endfor
return {$seq_utils:union(result, seq)};
.
#47:25
":_parse_from(string with |'s in it) => object list";
":_parse_to(string with |'s in it) => object list";
"  for from:string and to:string items in :parse_message_seq";
if (verb == "_parse_to")
match_obj = (fail_obj = this);
match_verb = "match_recipient";
fail_verb = "match_failed";
else
match_obj = $string_utils;
match_verb = "match_player";
fail_obj = $command_utils;
fail_verb = "player_match_failed";
endif
plist = {};
for w in ($string_utils:explode(args[1], "|"))
if (fail_obj:(fail_verb)(p = match_obj:(match_verb)(w), w))
p = $string_utils:literal_object(w);
if ((p == $failed_match) || (!$command_utils:yes_or_no("Continue? ")))
return "Bad address list:  " + args[1];
endif
endif
plist = setadd(plist, p);
endfor
return plist;
.
#47:26
words = $string_utils:explode(args[1], "-");
if (length(words) == 1)
time = $time_utils:from_day(words[1], -1);
if (typeof(time) == ERR)
time = "weekday expected.";
endif
elseif ((!words) || ((length(words) > 3) || ((!tonum(words[1])) || (E_TYPE == (year = $code_utils:tonum({@words, "-1"}[3]))))))
time = "Date should be of the form `5-Jan', `5-Jan-92', `Wed',`Wednesday'";
else
day = tonum(words[1]);
time = $time_utils:dst_midnight($time_utils:from_month(words[2], -1, day));
if (length(words) == 3)
thisyear = tonum(ctime(time)[21..24]);
if (100 > year)
year = ((thisyear + 50) - (((thisyear - year) + 50) % 100));
endif
time = $time_utils:dst_midnight($time_utils:from_month(words[2], (year - thisyear) - (year <= thisyear), day));
endif
endif
return time;
.
#47:27
":new_message_num() => number that the next incoming message will receive.";
set_task_perms(caller_perms());
new = ((msgs = caller.messages) ? msgs[length(msgs)][1] + 1 | 1);
if (rmsgs = caller.messages_going)
lbrm = rmsgs[length(rmsgs)][2];
return max(new, lbrm[length(lbrm)][1] + 1);
else
return new;
endif
.
#47:28
set_task_perms(caller_perms());
return length(caller.messages);
.
#47:29
set_task_perms(caller_perms());
date = args[1];
msgs = caller.messages;
if ((r = length(caller.messages)) < 25)
for l in [1..r]
if (msgs[l][2][1] > date)
return l - 1;
endif
endfor
return r;
else
l = 1;
while (l <= r)
if (date < msgs[i = ((r + l) / 2)][2][1])
r = (i - 1);
else
l = (i + 1);
endif
endwhile
return r;
endif
.
#47:30
set_task_perms(caller_perms());
date = args[1];
msgs = caller.messages;
if ((len = length(caller.messages)) < 25)
for r in [0..len - 1]
if (msgs[len - r][2][1] <= date)
return r;
endif
endfor
return len;
else
l = 1;
r = len;
while (l <= r)
if (date < msgs[i = ((r + l) / 2)][2][1])
r = (i - 1);
else
l = (i + 1);
endif
endwhile
return len - r;
endif
.
#47:31
":length_num_le(num) => number of messages in folder numbered <= num";
set_task_perms(caller_perms());
return $list_utils:iassoc_sorted(args[1], caller.messages);
.
#47:32
":exists_num_eq(num) => index of message in folder numbered == num";
set_task_perms(caller_perms());
return (i = $list_utils:iassoc_sorted(args[1], caller.messages)) && ((caller.messages[i][1] == args[1]) && i);
.
#47:33
":from_msg_seq(object or list[,mask])";
" => msg_seq of messages from any of these senders";
set_task_perms(caller_perms());
if (typeof(plist = args[1]) != LIST)
plist = {plist};
endif
mask = {@args, {1}}[2];
i = 1;
fseq = {};
for msg in (caller.messages)
if ((!mask) || (i < mask[1]))
elseif ((length(mask) < 2) || (i < mask[2]))
fromline = msg[2][2];
if (toobj(fromline[rindex(fromline, "(") + 1..rindex(fromline, ")") - 1]) in plist)
fseq = $seq_utils:add(fseq, i, i);
endif
else
mask = mask[3..length(mask)];
endif
i = (i + 1);
$command_utils:suspend_if_needed(0);
endfor
return fseq || ("%f %<has> no messages from " + $string_utils:english_list($list_utils:map_arg(2, $string_utils, "pronoun_sub", "%n (%#)", plist), "no one", " or "));
.
#47:34
":%from_msg_seq(string or list of strings[,mask])";
" => msg_seq of messages with one of these strings in the from line";
set_task_perms(caller_perms());
if (typeof(nlist = args[1]) != LIST)
nlist = {nlist};
endif
i = 1;
fseq = {};
mask = {@args, {1}}[2];
for msg in (caller.messages)
if ((!mask) || (i < mask[1]))
elseif ((length(mask) < 2) || (i < mask[2]))
fromline = (" " + msg[2][2]);
for n in (nlist)
if (index(fromline, n))
fseq = $seq_utils:add(fseq, i, i);
endif
endfor
else
mask = mask[3..length(mask)];
endif
i = (i + 1);
$command_utils:suspend_if_needed(0);
endfor
return fseq || ("%f %<has> no messages from " + $string_utils:english_list($list_utils:map_arg($string_utils, "print", nlist), "no one", " or "));
.
#47:35
":to_msg_seq(object or list[,mask]) => msg_seq of messages to those people";
set_task_perms(caller_perms());
if (typeof(plist = args[1]) != LIST)
plist = {plist};
endif
mask = {@args, {1}}[2];
i = 1;
seq = {};
for msg in (caller.messages)
if ((!mask) || (i < mask[1]))
elseif ((length(mask) < 2) || (i < mask[2]))
toline = msg[2][3];
for r in ($mail_agent:parse_address_field(toline))
if (r in plist)
seq = $seq_utils:add(seq, i, i);
endif
endfor
else
mask = mask[3..length(mask)];
endif
i = (i + 1);
$command_utils:suspend_if_needed(0);
endfor
return seq || ("%f %<has> no messages to " + $string_utils:english_list($list_utils:map_arg(2, $string_utils, "pronoun_sub", "%n (%#)", plist), "no one", " or "));
.
#47:36
":%to_msg_seq(string or list of strings[,mask])";
" => msg_seq of messages containing one of strings in the to line";
set_task_perms(caller_perms());
if (typeof(nlist = args[1]) != LIST)
nlist = {nlist};
endif
i = 1;
seq = {};
mask = {@args, {1}}[2];
for msg in (caller.messages)
if ((!mask) || (i < mask[1]))
elseif ((length(mask) < 2) || (i < mask[2]))
toline = (" " + msg[2][3]);
for n in (nlist)
if (index(toline, n))
seq = $seq_utils:add(seq, i, i);
endif
endfor
else
mask = mask[3..length(mask)];
endif
i = (i + 1);
$command_utils:suspend_if_needed(0);
endfor
return seq || ("%f %<has> no messages to " + $string_utils:english_list($list_utils:map_arg($string_utils, "print", nlist), "no one", " or "));
.
#47:37
":subject_msg_seq(target) => msg_seq of messages with target in the Subject:";
set_task_perms(caller_perms());
target = args[1];
i = 1;
seq = {};
mask = {@args, {1}}[2];
for msg in (caller.messages)
if ((!mask) || (i < mask[1]))
elseif ((length(mask) < 2) || (i < mask[2]))
subject = msg[2][4];
if (index(subject, target))
seq = $seq_utils:add(seq, i, i);
endif
else
mask = mask[3..length(mask)];
endif
i = (i + 1);
$command_utils:suspend_if_needed(0);
endfor
return seq || (("%f %<has> no messages with subjects containing `" + target) + "'");
.
#47:38
":body_msg_seq(target[,mask]) => msg_seq of messages with target in the body";
set_task_perms(caller_perms());
target = args[1];
i = 1;
seq = {};
mask = {@args, {1}}[2];
for msg in (caller.messages)
if ((!mask) || (i < mask[1]))
elseif ({@mask, $maxint}[2] <= i)
mask = mask[3..length(mask)];
elseif ((bstart = ("" in (msg = msg[2]))) && ((l = length(msg)) > bstart))
while ((!index(msg[l], target)) && ((l = (l - 1)) > bstart))
$command_utils:suspend_if_needed(0);
endwhile
if (l > bstart)
seq = $seq_utils:add(seq, i, i);
endif
endif
i = (i + 1);
$command_utils:suspend_if_needed(0);
endfor
return seq || tostr("%f %<has> no messages containing `", target, "' in the body.");
.
#47:39
":messages_in_seq(msg_seq) => list of messages in msg_seq on folder (caller)";
set_task_perms(caller_perms());
if (typeof(msgs = args[1]) != LIST)
return caller.messages[msgs];
elseif (length(msgs) == 2)
return caller.messages[msgs[1]..msgs[2] - 1];
else
return $seq_utils:extract(msgs, caller.messages);
endif
.
#47:40
":__convert_new(@msg) => msg in new format (if it isn't already)";
"               ^ don't forget the @ here.";
"If the msg is already in the new format it passes through unchanged.";
"If the msg format is unrecognizable, warnings are printed.";
if (typeof(date = args[1]) != NUM)
date = 0;
start = 1;
else
start = 2;
if (!((colon = index(args[2], ":")) && (args[2][1..colon] in {"From:", "To:", "Subject:"})))
return args;
endif
endif
from = (to = 0);
subject = " ";
blank = ("" in {@args, ""});
newhdr = {};
for line in (args[start..blank - 1])
if (index(line, "Date:") == 1)
if (date)
player:notify("Warning: two dates?");
endif
date = $time_utils:from_ctime(line[6..length(line)]);
elseif (index(line, "From:") == 1)
if (from)
player:notify("Warning: two from-lines?");
endif
from = $string_utils:triml(line[6..length(line)]);
elseif (index(line, "To:") == 1)
if (to)
player:notify("Warning: two to-lines?");
endif
to = $string_utils:triml(line[6..length(line)]);
elseif (index(line, "Subject:") == 1)
subject = $string_utils:triml(line[9..length(line)]);
else
newhdr = {@newhdr, line};
endif
endfor
if (!from)
player:notify("Warning: no from-line.");
endif
if (!to)
player:notify("Warning: no to-line.");
endif
return {date, from, to, subject, @newhdr, @args[blank..length(args)]};
.
#47:41
":to_text(@msg) => message in text form (suitable for printing)";
return {"Date:     " + ctime(args[1]), "From:     " + args[2], "To:       " + args[3], @(args[4] == " ") ? {} | {"Subject:  " + args[4]}, @args[5..length(args)]};
.
#47:42
what = args[1];
if ($object_utils:isa(what, $mail_recipient))
return what:(verb)(@listdelete(args, 1));
else
"...it's a player:";
"...  anyone can send mail to it.";
"...  only the player itself or a wizard can read it.";
return (verb == "is_usable_by") || $perm_utils:controls(args[2], what);
endif
.
#47:43
"WIZARDLY";
"raw_send(text,rcpts,sender) -- does the actual sending of a message.  Assumes that text has already been formatted correctly.  Decides who to send it to and who wants to be notified about it and does so.";
"Return {E_PERM} if the caller is not entitled to use this verb.";
"Return {0, @invalid_rcpts} if rcpts contains any invalid addresses.  No mail is sent in this case.";
"Return {1, @actual_rcpts} if successful.";
text = args[1];
rcpts = args[2];
from = args[3];
if (typeof(rcpts) != LIST)
rcpts = {rcpts};
endif
if (!(caller in {$mail_agent, $mail_editor}))
return {E_PERM};
elseif (bogus = (resolve = this:resolve_addr(rcpts, from))[1])
return {0, bogus};
else
this:touch(rcpts);
actual_rcpts = resolve[2];
biffs = resolve[3];
results = {};
for recip in (actual_rcpts)
if ((ticks_left() < 1000) || (seconds_left() < 5))
player:notify(tostr("...", recip));
suspend(0);
endif
if (typeof(e = recip:receive_message(text, from)) in {ERR, STR})
"...receive_message bombed...";
player:notify(tostr(recip, ":receive_message:  ", e));
e = 0;
elseif ((!is_player(recip)) || (!e))
"...not a player or receive_message isn't giving out the message number";
"...no need to force a notification...";
elseif (i = $list_utils:iassoc(recip, biffs))
"...player-recipient was already getting a notification...";
"...make sure notification includes a mention of him/her/itself.";
if (!(recip in listdelete(biffs[i], 1)))
biffs[i][2..1] = {recip};
endif
else
"...player-recipient wasn't originally being notified at all...";
biffs = {{recip, recip}, @biffs};
endif
results = {@results, e};
endfor
fork (0)
for b in (biffs)
if ((ticks_left() < 1000) || (seconds_left() < 5))
suspend(0);
endif
if ($object_utils:has_callable_verb(b[1], "notify_mail"))
mnums = {};
for r in (listdelete(b, 1))
mnums = {@mnums, (rn = (r in actual_rcpts)) && results[rn]};
endfor
b[1]:notify_mail(from, listdelete(b, 1), mnums);
endif
endfor
endfork
return {1, @actual_rcpts};
endif
.
#47:44
":reserved_pattern(string)";
"  if string matches one of the reserved patterns for mailing list names, ";
"  we return that element of .reserved_patterns.";
string = args[1];
for p in (this.reserved_patterns)
if (match(string, p[1]))
return p;
endif
endfor
return 0;
.
#47:45
return valid(what = args[1]) && (($player in (ances = $object_utils:ancestors(what))) || ($mail_recipient in ances));
.
#48:0
return this:ok(who = args[1]) && tostr("a letter ", this.sending[who] ? "(in transit) " | "", "to ", this:recipient_names(who), (subject = this.subjects[who]) && tostr(" entitled \"", subject, "\""));
.
#48:1
"invoke(rcptstrings,verb[,subject]) for a @send";
"invoke(1,verb,rcpts,subject,replyto,body) if no parsing is needed";
"invoke(2,verb,msg,flags,replytos) for an @answer";
if (!(which = args[1]))
player:tell_lines({tostr("Usage:  ", args[2], " <list-of-recipients>"), tostr("        ", args[2], "                      to continue with a previous draft")});
elseif (typeof(which) == LIST)
"...@send...";
if (rcpts = this:parse_recipients({}, which))
if (replyto = player:mail_option("replyto"))
replyto = this:parse_recipients({}, replyto, ".mail_options: ");
endif
if (0 == (subject = {@args, 0}[3]))
if (player:mail_option("nosubject"))
subject = "";
else
player:tell("Subject:");
subject = $command_utils:read();
endif
endif
return {rcpts, subject, replyto, {}};
endif
elseif (which == 1)
return args[3..6];
elseif (!(to_subj = this:parse_msg_headers(msg = args[3], flags = args[4])))
else
include = {};
if ("include" in flags)
prefix = ">            ";
for line in ($mail_agent:to_text(@msg))
if (!line)
prefix = ">  ";
endif
include = {@include, @this:fill_string(">  " + line, 70, prefix)};
endfor
endif
return {@to_subj, args[5], include};
endif
return 0;
.
#48:2
if (this:ok(who = args[1]))
this.sending[who] = 0;
this.recipients[who] = args[2];
this.subjects[who] = args[3];
this.replytos[who] = (args[4] || {});
this:load(who, args[5]);
this.active[who]:tell("Composing ", this:working_on(who));
p = this.active[who];
if (p:mail_option("enter") && (!args[5]))
if (typeof(lines = $command_utils:read_lines()) == ERR)
p:tell(lines);
else
this:insert_line(p in this.active, lines, 0);
endif
endif
endif
.
#48:3
if (!dobjstr)
plyr = player;
elseif ($command_utils:player_match_result(plyr = $string_utils:match_player(dobjstr), dobjstr)[1])
return;
endif
if (typeof(msg = this:message_with_headers(plyr in this.active)) != LIST)
if (player == plyr)
player:tell(msg);
else
player:tell(plyr.name, "(", plyr, ") has not published anything here.");
endif
return;
else
player:display_message({((plyr == player) ? "Your" | tostr(plyr.name, "(", plyr, ")'s")) + " message so far:", ""}, player:msg_text(@msg));
endif
.
#48:4
return (this:readable(who = args[1]) || this:ok(who)) && $mail_agent:make_message(this.active[who], this.recipients[who], {this.subjects[who], this.replytos[who]}, this:text(who));
.
#48:5
if (!(who = this:loaded(player)))
player:tell(this:nothing_loaded_msg());
elseif (!argstr)
player:tell(this.subjects[who]);
elseif (ERR == typeof(subj = this:set_subject(who, argstr)))
player:tell(subj);
else
player:tell(subj ? ("Setting the subject line for your message to \"" + subj) + "\"." | "Deleting the subject line for your message.");
endif
.
#48:6
if (!(fuckup = this:ok(who = args[1])))
return fuckup;
else
this.subjects[who] = (subj = args[2]);
this:set_changed(who, 1);
return subj;
endif
.
#48:7
if (!(who = this:loaded(player)))
player:tell(this:nothing_loaded_msg());
elseif (!args)
player:tell("Your message is currently to ", this:recipient_names(who), ".");
else
this.recipients[who] = this:parse_recipients({}, args);
this:set_changed(who, 1);
player:tell("Your message is now to ", this:recipient_names(who), ".");
endif
.
#48:8
if (!(who = this:loaded(player)))
player:tell(this:nothing_loaded_msg());
else
this.recipients[who] = this:parse_recipients(this.recipients[who], args);
this:set_changed(who, 1);
player:tell("Your message is now to ", this:recipient_names(who), ".");
endif
.
#48:9
"parse_recipients(prev_list,list_of_strings) -- parses list of strings and adds any resulting player objects to prev_list.  Optional 3rd arg is prefixed to any mismatch error messages";
recips = args[1];
cmd_id = ({@args, ""}[3] || "");
for s in ((typeof(l = args[2]) == LIST) ? l | {l})
if (typeof(s) != STR)
if ($mail_agent:is_recipient(s))
recips = setadd(recips, s);
else
player:tell(cmd_id, s, " is not a valid mail recipient.");
endif
elseif (!$mail_agent:match_failed(md = $mail_agent:match_recipient(s), s, cmd_id))
recips = setadd(recips, md);
endif
endfor
return recips;
.
#48:10
return this:ok(who = args[1]) && $mail_agent:name_list(@this.recipients[who]);
.
#48:11
return $mail_agent:make_message(@args);
.
#48:12
"(obsolete verb... see $mail_agent:name_list)";
return $mail_agent:(verb)(@args[1]);
.
#48:13
"parse_msg_headers(msg,flags)";
"  parses msg to extract reply recipients and construct a subject line";
"  if the \"all\" flag is present, reply goes to all of the original recipients";
"  returns a list {recipients, subjectline} or 0 in case of error.";
msg = args[1];
replyall = ("all" in args[2]);
objects = $mail_agent:parse_address_field(msg[2] + (replyall ? msg[3] | ""));
for line in (msg[5..("" in {@msg, ""}) - 1])
if (rt = (index(line, "Reply-to:") == 1))
objects = $mail_agent:parse_address_field(line);
endif
endfor
recips = {};
for o in (objects)
if (o == #0)
player:tell("Sorry, but I can't parse the header of that message.");
return 0;
elseif ((!valid(o)) || (!(is_player(o) || ($mail_recipient in $object_utils:ancestors(o)))))
player:tell(o, " is no longer a valid player or maildrop; ignoring that recipient.");
elseif (o != player)
recips = setadd(recips, o);
endif
endfor
subject = msg[4];
if (subject == " ")
subject = "";
elseif (subject && (index(subject, "Re: ") != 1))
subject = ("Re: " + subject);
endif
return {recips, subject};
.
#48:14
flags = {};
for o in ({"all", "include"})
if (player:mail_option(o))
flags = {@flags, o};
endif
endfor
reply_to = (player:mail_option("replyto") || {});
flaglist = "+1#include -1#noinclude +2#all -2#sender 0#replyto ";
for a in (args)
if (i = index(a, "="))
value = a[i + 1..length(a)];
a = a[1..i - 1];
else
value = "";
endif
if ((typeof(a) != STR) || ((i = index(flaglist, "#" + a)) < 3))
player:tell("Unrecognized answer/reply option:  ", a);
return 0;
elseif (i != rindex(flaglist, "#" + a))
player:tell("Ambiguous answer/reply option:  ", a);
return 0;
elseif (j = (index("0123456789", flaglist[i - 1]) - 1))
if (value)
player:tell("Flag does not take a value:  ", a);
return 0;
endif
f = {"include", "all"}[j];
flags = ((flaglist[i - 2] == "+") ? setadd(flags, f) | setremove(flags, f));
elseif ((!value) || (value = this:parse_recipients({}, $string_utils:explode(value), "replyto flag:  ")))
reply_to = (value || {});
endif
endfor
return {flags, reply_to};
.
#48:15
if (!(who = this:loaded(player)))
player:tell(this:nothing_loaded_msg());
else
if (args)
this.replytos[who] = (rt = this:parse_recipients({}, args));
this:set_changed(who, 1);
else
rt = this.replytos[who];
endif
player:tell(rt ? ("Replies will go to " + $mail_agent:name_list(@this.replytos[who])) + "." | "Reply-to field is empty.");
endif
.
#48:16
"WIZARDLY";
if (!(who = this:loaded(player)))
player:notify(this:nothing_loaded_msg());
elseif (!(recips = this.recipients[who]))
player:notify("Umm... your message isn't addressed to anyone.");
elseif (this.sending[who])
player:notify("Again? ... relax... it'll get there eventually.");
else
msg = this:message_with_headers(who);
this.sending[who] = (old_sending = task_id());
this:set_changed(who, 0);
player:notify("Sending...");
"... this sucker can suspend BIG TIME...";
result = $mail_agent:raw_send(msg, recips, player);
"... the world changes...";
who = (player in this.active);
if (who && (this.sending[who] == old_sending))
"... same editing session; no problemo...";
previous = "";
this.sending[who] = 0;
else
"... uh oh, different session... tiptoe quietly out...";
"... Don't mess with the session.";
previous = "(prior send) ";
endif
if (!(e = result[1]))
player:notify(tostr(previous, (typeof(e) == ERR) ? e | ("Bogus recipients:  " + $string_utils:from_list(result[2]))));
player:notify(tostr(previous, "Mail not sent."));
previous || this:set_changed(who, 1);
elseif (length(result) == 1)
player:notify(tostr(previous, "Mail not actually sent to anyone."));
previous || this:set_changed(who, 1);
else
player:notify(tostr(previous, "Mail actually sent to ", $mail_agent:name_list(@listdelete(result, 1))));
if (previous)
"...don't even think about it...";
elseif (player.location == this)
if (ticks_left() < 10000)
suspend(0);
endif
this:done();
elseif (!this:changed(who))
"... player is gone, no further edits...";
this:kill_session(who);
endif
endif
endif
.
#48:17
if (dobjstr)
if (!(recips = this:parse_recipients({}, args)))
"parse_recipients has already complained about anything it doesn't like";
return;
endif
elseif (caller != player)
return E_PERM;
elseif (!(who = this:loaded(player)))
player:tell(this:nothing_loaded_msg());
return;
else
recips = this.recipients[who];
endif
resolve = $mail_agent:resolve_addr(recips, player);
if (resolve[1])
player:tell("Bogus addresses:  ", $string_utils:english_list(resolve[1]));
else
player:tell(dobjstr ? ("Mail to " + $mail_agent:name_list(@recips)) + " actually goes to " | "Your mail will actually go to ", $mail_agent:name_list(@resolve[2]));
endif
.
#48:18
player:tell_lines({"Available aliases:", ""});
for c in ((dobjstr == "all") ? $object_utils:descendants($mail_recipient) | $mail_agent.contents)
if (c:is_usable_by(player) || c:is_readable_by(player))
c:look_self();
endif
endfor
.
#48:19
player:tell("This command is obsolete.  Use @subscribe instead.  See `help @subscribe'");
return;
if (!iobjstr)
player:tell("Usage:  ", verb, " [<list-of-people/lists>] to <list>");
return;
elseif ($mail_agent:match_failed(iobj = $mail_agent:match(iobjstr), iobjstr))
return;
endif
rstrs = (dobjstr ? $string_utils:explode(dobjstr) | {"me"});
recips = this:parse_recipients({}, rstrs);
outcomes = iobj:add_forward(@recips);
if (typeof(outcomes) != LIST)
player:tell(outcomes);
return;
endif
added = {};
for r in [1..length(recips)]
if ((t = typeof(e = outcomes[r])) == OBJ)
added = setadd(added, recips[r]);
else
player:tell(verb, " ", recips[r].name, " to ", iobj.name, ":  ", e);
endif
endfor
if (added)
player:tell($string_utils:english_list($list_utils:map_arg(2, $string_utils, "pronoun_sub", "%(name) (%#)", added)), " added to ", iobj.name, " (", iobj, ")");
endif
.
#48:20
if (!iobjstr)
player:tell("Usage:  ", verb, " [<list-of-people/lists>] from <list>");
return;
elseif ($mail_agent:match_failed(iobj = $mail_agent:match(iobjstr), iobjstr))
return;
endif
rstrs = (dobjstr ? $string_utils:explode(dobjstr) | {"me"});
recips = this:parse_recipients({}, rstrs);
outcomes = iobj:delete_forward(@recips);
if (typeof(outcomes) != LIST)
player:tell(outcomes);
return;
endif
removed = {};
for r in [1..length(recips)]
if (typeof(e = outcomes[r]) == ERR)
player:tell(verb, " ", recips[r].name, " from ", iobj.name, ":  ", (e == E_INVARG) ? "Not on list." | e);
else
removed = setadd(removed, recips[r]);
endif
endfor
if (removed)
player:tell($string_utils:english_list($list_utils:map_arg(2, $string_utils, "pronoun_sub", "%(name) (%#)", removed)), " removed from ", iobj.name, " (", iobj, ")");
endif
.
#48:21
"parse_msg_headers(msg,flags)";
"  parses msg to extract reply recipients and construct a subject line";
"  if the \"all\" flag is present, reply goes to all of the original recipients";
"  returns a list {recipients, subjectline} or 0 in case of error.";
msg = args[1];
replyall = ("all" in args[2]);
recipients = $mail_agent:parse_address_field(msg[2] + (replyall ? msg[3] | ""));
subject = msg[4];
if (subject == " ")
subject = "";
endif
noreplyto = 1;
for line in (msg[1..("" in msg) || length(msg)])
if (typeof(line) != STR)
"Skip it";
elseif (index(line, "Subject:") == 1)
subject = $string_utils:triml(line[9..length(line)]);
elseif ((rt = (index(line, "Reply-to:") == 1)) || (noreplyto && ((index(line, "From:") == 1) || (replyall && (index(line, "To:") == 1)))))
if (rt)
noreplyto = 0;
recipients = {};
endif
recipients = {@recipients, @$mail_agent:parse_address_field(line)};
endif
endfor
if (subject && (index(subject, "Re: ") != 1))
subject = ("Re: " + subject);
endif
recips = {};
for o in (recipients)
if (o == #0)
player:tell("Sorry, but I can't parse the header of that message.");
return 0;
elseif ((!valid(o)) || (!(is_player(o) || ($mail_recipient in $object_utils:ancestors(o)))))
player:tell(o, " is no longer a valid player or maildrop; ignoring that recipient.");
elseif (o != player)
recips = setadd(recips, o);
endif
endfor
return {recips, subject};
.
#48:22
return this:ok(who = args[1]) && (this.sending[who] || pass(@args));
.
#48:23
"recall that this only gets called if :retain_session_on_exit returns true";
return (this:ok(who = (player in this.active)) && (!this:changed(who))) ? {"Your message is in transit."} | this.(verb);
.
#48:24
lines = {"To:       " + (toline = $mail_agent:name_list(@args[1])), "Subject:  " + $string_utils:trim(subject = args[2])};
if (args[3])
lines = {@lines, "Reply-to: " + $mail_agent:name_list(@args[3])};
endif
lines = {@lines, "", @args[4]};
return {tostr("MOOMail", subject ? ("(" + subject) + ")" | (("-to(" + toline) + ")")), lines, "@@sendmail"};
.
#49:0
if (this:changed(who = (player in this.active)))
player:tell("You are still editing ", this:working_on(who), ".  Please type ABORT or SAVE first.");
elseif (spec = this:parse_invoke(dobjstr, verb))
this:init_session(who, @spec);
endif
.
#49:1
if (!(who = this:loaded(player)))
player:tell(this:nothing_loaded_msg());
return;
endif
if (!dobjstr)
note = this.objects[who];
elseif (1 == (note = this:note_match_failed(dobjstr)))
return;
else
this.objects[who] = note;
endif
text = this:text(who);
strmode = ((length(text) <= 1) && this.strmode[who]);
if (strmode)
text = (text ? text[1] | "");
endif
if (ERR == typeof(result = this:set_note_text(note, text)))
player:tell("Text not saved to ", this:working_on(who), ":  ", result);
if ((result == E_TYPE) && (typeof(note) == OBJ))
player:tell("Do `mode list' and try saving again.");
elseif (!dobjstr)
player:tell("Use `save' with an argument to save the text elsewhere.");
endif
else
player:tell("Text written to ", this:working_on(who), strmode ? " as a single string." | ".");
this:set_changed(who, 0);
endif
.
#49:2
if (this:ok(who = args[1]))
this.strmode[who] = (strmode = (typeof(text = args[3]) == STR));
this:load(who, strmode ? text ? {text} | {} | text);
this.objects[who] = args[2];
player:tell("Now editing ", this:working_on(who), ".", strmode ? "  [string mode]" | "");
endif
.
#49:3
if (!(who = args[1]))
return "????";
endif
spec = this.objects[who];
if (typeof(spec) == LIST)
object = spec[1];
prop = spec[2];
else
object = spec;
prop = 0;
endif
return valid(object) ? tostr("\"", object.name, "\"(", object, ")", prop ? "." + prop | "") | tostr(prop ? ("." + prop) + " on " | "", "invalid object (", object, ")");
.
#49:4
":parse_invoke(string,verb)";
" string is the actual commandline string indicating what we are to edit";
" verb is the command verb that is attempting to invoke the editor";
if (!(string = args[1]))
player:tell_lines({("Usage:  " + args[2]) + " <note>   (where <note> is some note object)", ("        " + args[2]) + "          (continues editing an unsaved note)"});
elseif (1 == (note = this:note_match_failed(string)))
elseif (ERR == typeof(text = this:note_text(note)))
player:tell("Couldn't retrieve text:  ", text);
else
return {note, text};
endif
return 0;
.
#49:5
"WIZARDLY";
if ((caller != $note_editor) || (caller_perms() != $note_editor.owner))
return E_PERM;
endif
set_task_perms(player);
if (typeof(spec = args[1]) == OBJ)
text = spec:text();
else
text = spec[1].(spec[2]);
endif
if (((tt = typeof(text)) in {ERR, STR}) || ((tt == LIST) && ((!text) || (typeof(text[1]) == STR))))
return text;
else
return E_TYPE;
endif
.
#49:6
"WIZARDLY";
if ((caller != $note_editor) || (caller_perms() != $note_editor.owner))
return E_PERM;
endif
set_task_perms(player);
if (typeof(spec = args[1]) == OBJ)
return spec:set_text(args[2]);
else
return spec[1].(spec[2]) = args[2];
endif
.
#49:7
if (pp = $code_utils:parse_propref(string = args[1]))
object = pp[1];
prop = pp[2];
else
object = string;
prop = 0;
endif
if ($command_utils:object_match_failed(note = player:my_match_object(object, this:get_room(player)), object))
elseif (prop)
if (!$object_utils:has_property(note, prop))
player:tell(object, " has no \".", prop, "\" property.");
else
return {note, prop};
endif
elseif ((!$object_utils:has_callable_verb(note, "text")) || (!$object_utils:has_callable_verb(note, "set_text")))
player:tell(object, "(", note, ") doesn't look like a note.");
else
return note;
endif
return 1;
.
#49:8
pass(@args);
if ((who = this:loaded(player)) && this.strmode[who])
player:tell("Text will be stored as a single string instead of a list when possible.");
endif
.
#49:9
"mode [string|list]";
if (!(who = this:loaded(player)))
player:tell(this:nothing_loaded_msg());
return;
endif
if (index("string", dobjstr) == 1)
this.strmode[who] = (mode = 1);
player:tell("Now in string mode:");
elseif (index("list", dobjstr) == 1)
this.strmode[who] = (mode = 0);
player:tell("Now in list mode:");
elseif (dobjstr)
player:tell("Unrecognized mode:  ", dobjstr);
player:tell("Should be one of `string' or `list'");
return;
else
player:tell("Currently in ", mode = (this.strmode[who] ? "string " | "list "), "mode:");
endif
if (mode)
player:tell("  store text as a single string instead of a list when possible.");
else
player:tell("  always store text as a list of strings.");
endif
.
#49:10
what = args[1];
text = args[2];
cmd = ((typeof(text) == STR) ? "@set-note-string" | "@set-note-text");
name = ((typeof(what) == OBJ) ? what.name | tostr(what[1].name, ".", what[2]));
note = ((typeof(what) == OBJ) ? what | tostr(what[1], ".", what[2]));
return {name, text, tostr(cmd, " ", note)};
.
#50:0
if (!args)
player:tell("edit what?");
else
this:invoke(argstr, verb);
endif
.
#50:1
pas = {{}, {}};
if (!(who = this:loaded(player)))
player:tell(this:nothing_loaded_msg());
return;
elseif (!args)
object = this.objects[who];
vname = this.verbnames[who];
if (typeof(vname) == LIST)
vargs = listdelete(vname, 1);
vname = vname[1];
else
vargs = {};
endif
changeverb = 0;
elseif ((args[1] != "as") || ((length(args) < 2) || ((!(spec = $code_utils:parse_verbref(args[2]))) || ((typeof(pas = $code_utils:parse_argspec(@args[3..length(args)])) != LIST) || pas[2]))))
if (typeof(pas) != LIST)
player:tell(pas);
elseif (pas[2])
player:tell("I don't understand \"", $string_utils:from_list(pas[2], " "), "\"");
endif
player:tell("Usage: ", verb, " [as <object>:<verb>]");
return;
elseif ($command_utils:object_match_failed(object = player:my_match_object(spec[1], this:get_room(player)), spec[1]))
return;
else
vname = spec[2];
vargs = (pas[1] && {@pas[1], "none", "none"}[1..3]);
if (vargs)
vargs[2] = ($code_utils:full_prep(vargs[2]) || vargs[2]);
endif
changeverb = 1;
endif
if (vargs)
vnum = $code_utils:find_verb_named(object, vname);
while ((vnum >= 0) && (verb_args(object, tostr(vnum)) != vargs))
vnum = $code_utils:find_verb_named(object, vname, vnum + 1);
endwhile
if (vnum < 0)
player:tell("There is no ", object, ":", vname, " verb with args (", $string_utils:from_list(vargs, " "), ").");
if (!changeverb)
player:tell("Use 'compile as ...' to write your code to another verb.");
endif
return;
endif
objverbname = tostr(object, ":", vname, " (", $string_utils:from_list(vargs, " "), ")");
else
vnum = -1;
objverbname = tostr(object, ":", ($code_utils:tonum(vname) == E_TYPE) ? vname | this:verb_name(object, vname));
endif
"...";
"...perform eval_subs on verb code if necessary...";
"...";
if (player.eval_subs && player:edit_option("eval_subs"))
verbcode = {};
for x in (this:text(who))
verbcode = {@verbcode, $code_utils:substitute(x, player.eval_subs)};
endfor
else
verbcode = this:text(who);
endif
"...";
"...write it out...";
"...";
if (result = this:set_verb_code(object, (vnum >= 0) ? tostr(vnum) | vname, verbcode))
player:tell(objverbname, " not compiled because:");
for x in (result)
player:tell("  ", x);
endfor
elseif (typeof(result) == ERR)
player:tell({result, ("You do not have write permission on " + objverbname) + ".", ("The verb " + objverbname) + " does not exist (!?!)", ("The object " + tostr(object)) + " does not exist (!?!)"}[1 + (result in {E_PERM, E_VERBNF, E_INVARG})]);
if (!changeverb)
player:tell("Do 'compile as <object>:<verb>' to write your code to another verb.");
endif
changeverb = 0;
else
player:tell(objverbname, verbcode ? " successfully compiled." | " verbcode removed.");
this:set_changed(who, 0);
endif
if (changeverb)
this.objects[who] = object;
this.verbnames[who] = (vargs ? {vname, @vargs} | vname);
endif
.
#50:2
if (!(fuckup = this:ok(who = args[1])))
return fuckup;
else
object = this.objects[who];
verbname = this.verbnames[who];
if (typeof(verbname) == LIST)
return tostr(object, ":", verbname[1], " (", $string_utils:from_list(listdelete(verbname, 1), " "), ")");
else
return tostr(object, ":", this:verb_name(object, verbname), " (", this:verb_args(object, verbname), ")");
endif
endif
"return this:ok(who = args[1]) && tostr(this.objects[who]) + \":\" + this.verbnames[who];";
.
#50:3
if (this:ok(who = args[1]))
object = args[2];
vname = args[3];
this:load(who, args[4]);
this.verbnames[who] = vname;
this.objects[who] = object;
this.active[who]:tell("Now editing ", this:working_on(who), ".");
"this.active[who]:tell(\"Now editing \", object, \":\", vname, \".\");";
endif
.
#50:4
":parse_invoke(string,v)";
"  string is the commandline string to parse to obtain the obj:verb to edit";
"  v is the actual command verb used to invoke the editor";
" => {object, verbname, verb_code} or error";
vref = $string_utils:words(args[1]);
if ((!vref) || (!(spec = $code_utils:parse_verbref(vref[1]))))
player:tell("Usage: ", args[2], " object:verb");
return;
endif
if (argspec = listdelete(vref, 1))
if (typeof(pas = $code_utils:parse_argspec(@argspec)) == LIST)
if (pas[2])
player:tell("I don't understand \"", $string_utils:from_list(pas[2], " "), "\"");
return;
endif
argspec = {@pas[1], "none", "none"}[1..3];
argspec[2] = ($code_utils:full_prep(argspec[2]) || argspec[2]);
else
player:tell(pas);
return;
endif
endif
if (!$command_utils:object_match_failed(object = player:my_match_object(spec[1], this:get_room(player)), spec[1]))
vnum = $code_utils:find_verb_named(object, vname = spec[2], 0);
if (argspec)
while ((vnum >= 0) && (verb_args(object, tostr(vnum)) != argspec))
vnum = $code_utils:find_verb_named(object, vname, vnum + 1);
endwhile
if (vnum >= 0)
code = this:fetch_verb_code(object, tostr(vnum));
else
code = E_VERBNF;
endif
else
code = this:fetch_verb_code(object, tostr(vnum));
endif
if (typeof(code) == ERR)
player:tell((code != E_VERBNF) ? code | "That object does not define that verb", argspec ? " with those args." | ".");
return code;
else
return {object, argspec ? {vname, @argspec} | vname, code};
endif
endif
return 0;
.
#50:5
"WIZARDLY";
if ((caller != $verb_editor) || (caller_perms() != $verb_editor.owner))
return E_PERM;
else
set_task_perms(player);
return verb_code(args[1], args[2], 1);
endif
.
#50:6
"WIZARDLY";
if ((caller != $verb_editor) || (caller_perms() != $verb_editor.owner))
return E_PERM;
else
set_task_perms(player);
return set_verb_code(args[1], args[2], args[3]);
endif
.
#50:7
if (caller == $verb_editor)
set_task_perms(player);
endif
object = args[1];
vname = args[2];
if (typeof(vname) == LIST)
vargs = tostr(" ", vname[2], " ", $code_utils:short_prep(vname[3]), " ", vname[4]);
vname = vname[1];
else
vargs = "";
endif
code = args[3];
name = tostr(object.name, ":", vname);
"... so the next 2 lines are actually wrong, since verb_info won't";
"... necessarily retrieve the correct verb if we have more than one";
"... matching the given same name; anyway, if parse_invoke understood vname,";
"... so will @program.  I suspect these were put here because in the";
"... old scheme of things, vname was always a number.";
"vname = strsub($string_utils:explode(verb_info(object, vname)[3])[1], \"*\", \"\")";
"vargs = verb_args(object, vname)";
"";
return {name, code, tostr("@program ", object, ":", vname, vargs)};
.
#50:8
"verb_name(object, vname)";
"Find vname on object and return its full name (quoted).";
"This is useful for when we're working with verb numbers.";
if ((caller != $verb_editor) || (caller_perms() != $verb_editor.owner))
return E_PERM;
else
set_task_perms(player);
given = args[2];
if (typeof(info = verb_info(args[1], given)) == ERR)
return tostr(given, "[", info, "]");
elseif (info[3] == given)
return given;
else
return tostr(given, "/\"", info[3], "\"");
endif
endif
.
#50:9
"verb_name(object, vname)";
"Find vname on object and return its full name (quoted).";
"This is useful for when we're working with verb numbers.";
if ((caller != $verb_editor) || (caller_perms() != $verb_editor.owner))
return E_PERM;
else
set_task_perms(player);
return $string_utils:from_list(verb_args(args[1], args[2]), " ");
endif
.
#51:0
if ((caller != player) && (caller_perms() != player))
return E_PERM;
endif
if (!(who = this:loaded(player)))
player:tell(this:nothing_loaded_msg());
else
this:insert_line(who, argstr);
endif
.
#51:1
if ((caller != player) && (caller_perms() != player))
return E_PERM;
endif
if (!(who = this:loaded(player)))
player:tell(this:nothing_loaded_msg());
else
this:append_line(who, argstr);
endif
.
#51:2
if (!this:loaded(player))
player:tell(this:nothing_loaded_msg());
else
lines = $command_utils:read_lines();
if (typeof(lines) == ERR)
player:notify(tostr(lines));
return;
endif
this:insert_line(this:loaded(player), lines, 0);
endif
.
#51:3
nonum = 0;
if (verb == "view")
if (!args)
l = {};
for i in [1..length(this.active)]
if (this.readable[i])
l = {@l, this.active[i]};
endif
endfor
if (l)
player:tell("Players having readable texts in this editor:  ", $string_utils:names_of(l));
else
player:tell("No one has published anything in this editor.");
endif
return;
elseif ($command_utils:player_match_result(plyr = $string_utils:match_player(args[1]), args[1])[1])
"...no such player";
return;
elseif ((!(who = this:loaded(plyr))) || (!this:readable(who)))
player:tell(plyr.name, "(", plyr, ") has not published anything in this editor.");
return;
endif
args = listdelete(args, 1);
elseif (!(who = this:loaded(player)))
player:tell(this:nothing_loaded_msg());
return;
endif
len = length(this.texts[who]);
ins = this.inserting[who];
window = 8;
if (len < (2 * window))
default = {"1-$"};
elseif (ins <= window)
default = {tostr("1-", 2 * window)};
else
default = {tostr(window, "_-", window, "^"), tostr(2 * window, "$-$")};
endif
if (typeof(range = this:parse_range(who, default, @args)) != LIST)
player:tell(tostr(range));
elseif (range[3] && (!(nonum = ("nonum" == $string_utils:trim(range[3])))))
player:tell("Don't understand this:  ", range[3]);
elseif (nonum)
player:tell_lines(this.texts[who][range[1]..range[2]]);
else
for line in [range[1]..range[2]]
this:list_line(who, line);
if ($command_utils:running_out_of_time())
suspend(0);
if (!(who = this:loaded(player)))
player:tell("ack!  something bad happened during a suspend...");
return;
endif
endif
endfor
if ((ins > len) && (len == range[2]))
player:tell("^^^^");
endif
endif
.
#51:4
if (i = index(argstr, "\""))
text = argstr[i + 1..length(argstr)];
argstr = argstr[1..i - 1];
else
text = 0;
endif
spec = $string_utils:trim(argstr);
if (index("next", verb) == 1)
verb = "next";
spec = ("+" + (spec || "1"));
elseif (index("prev", verb) == 1)
verb = "prev";
spec = ("-" + (spec || "1"));
else
spec = (spec || ".");
endif
if (!(who = this:loaded(player)))
player:tell(this:nothing_loaded_msg());
elseif (ERR == typeof(number = this:parse_insert(who, spec)))
if (verb in {"next", "prev"})
player:tell("Argument must be a number.");
else
player:tell("You must specify an integer or `$' for the last line.");
endif
elseif ((number > (max = (length(this.texts[who]) + 1))) || (number < 1))
player:tell("That would take you out of range (to line ", number, "?).");
else
this.inserting[who] = number;
if (typeof(text) == STR)
this:insert_line(who, text);
else
if (verb != "next")
(number > 1) ? this:list_line(who, number - 1) | player:tell("____");
endif
if (verb != "prev")
(number < max) ? this:list_line(who, number) | player:tell("^^^^");
endif
endif
endif
.
#51:5
if (!(who = this:loaded(player)))
player:tell(this:nothing_loaded_msg());
elseif (typeof(range = this:parse_range(who, {"_", "1"}, @args)) != LIST)
player:tell(range);
elseif (range[3])
player:tell("Junk at end of cmd:  ", range[3]);
else
player:tell_lines((text = this.texts[who])[from = range[1]..to = range[2]]);
player:tell("---Line", (to > from) ? "s" | "", " deleted.  Insertion point is before line ", from, ".");
this.texts[who] = {@text[1..from - 1], @text[to + 1..length(text)]};
if (!this.changes[who])
this.changes[who] = 1;
this.times[who] = time();
endif
this.inserting[who] = from;
endif
.
#51:6
if (callers() && (caller != this))
return E_PERM;
endif
if (!(who = this:loaded(player)))
player:tell(this:nothing_loaded_msg());
elseif (typeof(subst = this:parse_subst(argstr && (argstr[1] + argstr), "c", "Empty search string?")) != LIST)
player:tell(tostr(subst));
elseif (typeof(start = (subst[4] ? this:parse_insert(who, subst[4]) | this.inserting[who])) == ERR)
player:tell("Starting from where?", subst[4] ? ("  (can't parse " + subst[4]) + ")" | "");
else
search = subst[2];
case = (!index(subst[3], "c", 1));
text = this.texts[who];
tlen = length(text);
while ((start <= tlen) && (!index(text[start], search, case)))
start = (start + 1);
endwhile
if (start > tlen)
player:tell("`", search, "' not found.");
else
this.inserting[who] = (start + 1);
this:list_line(who, start);
endif
endif
.
#51:7
if (callers() && (caller != this))
return E_PERM;
endif
if (!(who = this:loaded(player)))
player:tell(this:nothing_loaded_msg());
elseif (typeof(subst = this:parse_subst(argstr)) != LIST)
player:tell(tostr(subst));
elseif (typeof(range = this:parse_range(who, {"_", "1"}, @$string_utils:explode(subst[4]))) != LIST)
player:tell(range);
elseif (range[3])
player:tell("Junk at end of cmd:  ", range[3]);
else
fromstr = subst[1];
tostr = subst[2];
global = index(subst[3], "g", 1);
case = (!index(subst[3], "c", 1));
munged = {};
text = this.texts[who];
changed = {};
for line in [from = range[1]..to = range[2]]
t = (t0 = text[line]);
if (!fromstr)
t = (tostr + t);
elseif (global)
t = strsub(t, fromstr, tostr, case);
elseif (i = index(t, fromstr, case))
t = ((t[1..i - 1] + tostr) + t[i + length(fromstr)..length(t)]);
endif
if (strcmp(t0, t))
changed = {@changed, line};
endif
munged = {@munged, t};
endfor
if (!changed)
player:tell("No changes in line", (from == to) ? tostr(" ", from) | tostr("s ", from, "-", to), ".");
else
this.texts[who] = {@text[1..from - 1], @munged, @text[to + 1..length(text)]};
if (!this.changes[who])
this.changes[who] = 1;
this.times[who] = time();
endif
for line in (changed)
this:list_line(who, line);
endfor
endif
endif
.
#51:8
verb = ((is_move = (verb[1] == "m")) ? "move" | "copy");
if (!(who = this:loaded(player)))
player:tell(this:nothing_loaded_msg());
return;
endif
wargs = args;
t = (to_pos = 0);
while (t = ("to" in (wargs = wargs[t + 1..length(wargs)])))
to_pos = (to_pos + t);
endwhile
range_args = args[1..to_pos - 1];
if ((!to_pos) || (ERR == typeof(dest = this:parse_insert(who, $string_utils:from_list(wargs, " ")))))
player:tell(verb, " to where? ");
elseif ((dest < 1) || (dest > ((last = length(this.texts[who])) + 1)))
player:tell("Destination (", dest, ") out of range.");
elseif (("from" in range_args) || ("to" in range_args))
player:tell("Don't use that kind of range specification with this command.");
elseif (typeof(range = this:parse_range(who, {"_", "^"}, @args[1..to_pos - 1])) != LIST)
player:tell(range);
elseif (range[3])
player:tell("Junk before `to':  ", range[3]);
elseif ((is_move && (dest >= range[1])) && (dest <= (range[2] + 1)))
player:tell("Destination lies inside range of lines to be moved.");
else
from = range[1];
to = range[2];
ins = this.inserting[who];
text = this.texts[who];
if (!is_move)
this.texts[who] = {@text[1..dest - 1], @text[from..to], @text[dest..last]};
if (ins >= dest)
this.inserting[who] = (((ins + to) - from) + 1);
endif
else
"oh shit... it's a move";
if (dest < from)
newtext = {@text[1..dest - 1], @text[from..to], @text[dest..from - 1], @text[to + 1..last]};
if ((ins >= dest) && (ins <= to))
ins = ((ins > from) ? (ins - from) + dest | (((ins + to) - from) + 1));
endif
else
newtext = {@text[1..from - 1], @text[to + 1..dest - 1], @text[from..to], @text[dest..last]};
if ((ins > from) && (ins < dest))
ins = ((ins <= to) ? ((ins + dest) - to) - 1 | (((ins - to) + from) - 1));
endif
endif
this.texts[who] = newtext;
this.inserting[who] = ins;
endif
if (!this.changes[who])
this.changes[who] = 1;
this.times[who] = time();
endif
player:tell("Lines ", is_move ? "moved." | "copied.");
endif
.
#51:9
if (!(who = this:loaded(player)))
player:tell(this:nothing_loaded_msg());
elseif (typeof(range = this:parse_range(who, {"_-^", "_", "^"}, @args)) != LIST)
player:tell(range);
elseif (range[3])
player:tell("Junk at end of cmd:  ", range[3]);
elseif (!(result = this:join_lines(who, @range[1..2], length(verb) <= 4)))
player:tell((result == 0) ? "Need at least two lines to join." | result);
else
this:list_line(who, range[1]);
endif
.
#51:10
fill_column = 70;
if (!(who = this:loaded(player)))
player:tell(this:nothing_loaded_msg());
elseif (typeof(range = this:parse_range(who, {"_", "1"}, @args)) != LIST)
player:tell(range);
elseif (range[3] && ((range[3][1] != "@") || ((fill_column = tonum(range[3][2..length(range[3])])) < 10)))
player:tell("Usage:  fill [<range>] [@ column]   (where column >= 10).");
else
join = this:join_lines(who, @range[1..2], 1);
newlines = this:fill_string((text = this.texts[who])[from = range[1]], fill_column);
if (fill = (((nlen = length(newlines)) > 1) || (newlines[1] != text[from])))
this.texts[who] = {@text[1..from - 1], @newlines, @text[from + 1..length(text)]};
if (((insert = this.inserting[who]) > from) && (nlen > 1))
this.inserting[who] = ((insert + nlen) - 1);
endif
endif
if (fill || join)
for line in [from..(from + nlen) - 1]
this:list_line(who, line);
endfor
else
player:tell("No changes.");
endif
endif
.
#51:11
if (!(who = this:loaded(player)))
player:tell(this:nothing_loaded_msg());
return;
endif
if (typeof(e = this:set_readable(who, index("publish", verb) == 1)) == ERR)
player:tell(e);
elseif (e)
player:tell("Your text is now globally readable.");
else
player:tell("Your text is read protected.");
endif
.
#51:12
if (!(this:ok(who = (player in this.active)) && (typeof(this.texts[who]) == LIST)))
player:tell(this:nothing_loaded_msg());
else
player:tell("You are editing ", this:working_on(who), ".");
player:tell("Your insertion point is ", (this.inserting[who] > length(this.texts[who])) ? "after the last line: next line will be #" | "before line ", this.inserting[who], ".");
player:tell(this.changes[who] ? this:change_msg() | this:no_change_msg());
if (this.readable[who])
player:tell("Your text is globally readable.");
endif
endif
.
#51:13
if (!this.changes[who = (player in this.active)])
player:tell("No changes to throw away.  Editor cleared.");
else
player:tell("Throwing away session for ", this:working_on(who), ".");
endif
this:reset_session(who);
if (this.exit_on_abort)
this:done();
endif
.
#51:14
if (!(caller in {this, player}))
return E_PERM;
elseif (!valid(origin = this.original[who = (player in this.active)]))
player:tell("I don't know where you came here from.");
else
player:moveto(origin);
if (player.location == this)
player:tell("Hmmm... the place you came from doesn't want you back.");
else
if (msg = this:return_msg())
player.location:announce($string_utils:pronoun_sub(msg));
endif
return;
endif
endif
player:tell("You'll have to use 'home' or a teleporter.");
.
#51:15
"This catches subst and find commands that don't fit into the usual model, e.g., s/.../.../ without the space after the s, and find commands without the verb `find'.  Still behaves in annoying ways (e.g., loses if the search string contains multiple whitespace), but better than before.";
set_task_perms(caller_perms());
if ((c = callers()) && ((c[1][1] != this) || (length(c) > 1)))
return pass(@args);
endif
verb = args[1];
v = 1;
vmax = min(length(verb), 5);
while ((v <= vmax) && (verb[v] == "subst"[v]))
v = (v + 1);
endwhile
argstr = $code_utils:argstr(verb, args[2]);
if (((v > 1) && (v <= length(verb))) && (((vl = verb[v]) < "A") || (vl > "Z")))
argstr = ((verb[v..length(verb)] + (argstr && " ")) + argstr);
return this:subst();
elseif ("/" == verb[1])
argstr = ((verb + (argstr && " ")) + argstr);
return this:find();
else
pass(@args);
endif
.
#51:16
return this:ok(who = args[1]) && this.inserting[who];
.
#51:17
return this:ok(who = args[1]) && ((((ins = tonum(args[2])) < 1) ? E_INVARG | ((ins <= (max = (length(this.texts[who]) + 1))) || (ins = max))) && (this.inserting[who] = ins));
.
#51:18
return this:ok(who = args[1]) && this.changes[who];
.
#51:19
return this:ok(who = args[1]) && (((unchanged = (!args[2])) || (this.times[who] = time())) && (this.changes[who] = (!unchanged)));
.
#51:20
return this:ok(who = args[1]) && this.original[who];
.
#51:21
return this:ok(who = args[1]) && (((valid(origin = args[2]) && (origin != this)) || ((origin == $nothing) || E_INVARG)) && (this.original[who] = origin));
.
#51:22
return (((who = args[1]) < 1) || (who > length(this.active))) ? E_RANGE | this.readable[who];
.
#51:23
return this:ok(who = args[1]) && (this.readable[who] = (!(!args[2])));
.
#51:24
return (this:readable(who = (args[1] || (player in this.active))) || this:ok(who)) && this.texts[who];
.
#51:25
texts = args[2];
if (!(fuckup = this:ok(who = args[1])))
return fuckup;
elseif (typeof(texts) == STR)
texts = {texts};
elseif ((typeof(texts) != LIST) || (length(texts) && (typeof(texts[1]) != STR)))
return E_TYPE;
endif
this.texts[who] = texts;
this.inserting[who] = (length(texts) + 1);
this.changes[who] = 0;
this.readable[who] = 0;
this.times[who] = time();
.
#51:26
"Dummy routine.  The child editor should provide something informative";
return this:ok(who = args[1]) && (("something [in " + this.name) + "]");
.
#51:27
who = args[1];
if ((who < 1) || (who > length(this.active)))
return E_RANGE;
elseif ((length(c = callers()) < 2) ? player == this.active[who] | ((c[2][1] == this) || ($perm_utils:controls(c[2][3], this.active[who]) || (c[2][3] == $generic_editor.owner))))
return 1;
else
return E_PERM;
endif
.
#51:28
return ((who = (args[1] in this.active)) && (typeof(this.texts[who]) == LIST)) && who;
.
#51:29
if (this:ok(who = args[1]))
f = (1 + ((line = args[2]) in {(ins = this.inserting[who]) - 1, ins}));
player:tell($string_utils:right(line, 3, " _^"[f]), ":_^"[f], " ", this.texts[who][line]);
endif
.
#51:30
":insert_line([who,] line or list of lines [,quiet])";
"  inserts the given text at the insertion point.";
"  returns E_NONE if the session has no text loaded yet.";
if (typeof(who = args[1]) != NUM)
args = {player in this.active, @args};
endif
if (!(fuckup = this:ok(who = args[1])))
return fuckup;
elseif (typeof(text = this.texts[who]) != LIST)
return E_NONE;
else
if (typeof(lines = args[2]) != LIST)
lines = {lines};
endif
p = this.active[who];
quiet = ((length(args) >= 3) ? args[3] | p:edit_option("quiet_insert"));
insert = this.inserting[who];
this.texts[who] = {@text[1..insert - 1], @lines, @text[insert..length(text)]};
this.inserting[who] = (insert + length(lines));
if (lines)
if (!this.changes[who])
this.changes[who] = 1;
this.times[who] = time();
endif
if (!quiet)
if (length(lines) != 1)
p:tell("Lines ", insert, "-", (insert + length(lines)) - 1, " added.");
else
p:tell("Line ", insert, " added.");
endif
endif
else
p:tell("No lines added.");
endif
endif
.
#51:31
":append_line([who,] string)";
"  appends the given string to the line before the insertion point.";
"  returns E_NONE if the session has no text loaded yet.";
if (typeof(who = args[1]) != NUM)
args = {player in this.active, @args};
endif
if (!(fuckup = this:ok(who = args[1])))
return fuckup;
elseif ((append = (this.inserting[who] - 1)) < 1)
return this:insert_line(who, {args[2]});
elseif (typeof(text = this.texts[who]) != LIST)
return E_NONE;
else
this.texts[who][append] = (text[append] + args[2]);
if (!this.changes[who])
this.changes[who] = 1;
this.times[who] = time();
endif
p = this.active[who];
if (!p:edit_option("quiet_insert"))
p:tell("Appended to line ", append, ".");
endif
endif
.
#51:32
if (!(fuckup = this:ok(who = args[1])))
return fuckup;
elseif ((from = args[2]) >= (to = args[3]))
return 0;
else
nline = "";
for line in ((text = this.texts[who])[from..to])
if (!(english = args[4]))
nline = (nline + line);
else
len = (length(line) + 1);
while ((len = (len - 1)) && (line[len] == " "))
endwhile
if (len > 0)
nline = ((nline + line) + (index(".:", line[len]) ? "  " | " "));
endif
endif
endfor
this.texts[who] = {@text[1..from - 1], nline, @text[to + 1..length(text)]};
if ((insert = this.inserting[who]) > from)
this.inserting[who] = ((insert <= to) ? from + 1 | ((insert - to) + from));
endif
if (!this.changes[who])
this.changes[who] = 1;
this.times[who] = time();
endif
return to - from;
endif
.
#51:33
"parse_number(who,string,before)   interprets string as a line number.  In the event that string is `.', `before' tells us which line to use.  Return 0 if string is bogus.";
if (!(fuckup = this:ok(who = args[1])))
return fuckup;
endif
last = length(this.texts[who]);
ins = (this.inserting[who] - 1);
string = args[2];
after = (!args[3]);
if (!string)
return 0;
elseif ("." == string)
return ins + after;
elseif (!(i = index("_^$", string[slen = length(string)])))
return tonum(string);
else
start = {ins + 1, ins, last + 1}[i];
n = 1;
if ((slen > 1) && (!(n = tonum(string[1..slen - 1]))))
return 0;
elseif (i % 2)
return start - n;
else
return start + n;
endif
endif
.
#51:34
"parse_range(who,default,@args) => {from to rest}";
numargs = length(args);
if (!(fuckup = this:ok(who = args[1])))
return fuckup;
elseif (!(last = length(this.texts[who])))
return this:no_text_msg();
endif
default = args[2];
r = 0;
while (default && (LIST != typeof(r = this:parse_range(who, {}, default[1]))))
default = listdelete(default, 1);
endwhile
if (typeof(r) == LIST)
from = r[1];
to = r[2];
else
from = (to = 0);
endif
saw_from_to = 0;
not_done = 1;
a = 2;
while (((a = (a + 1)) <= numargs) && not_done)
if (args[a] == "from")
if ((a == numargs) || (!(from = this:parse_number(who, args[a = (a + 1)], 0))))
return "from ?";
endif
saw_from_to = 1;
elseif (args[a] == "to")
if ((a == numargs) || (!(to = this:parse_number(who, args[a = (a + 1)], 1))))
return "to ?";
endif
saw_from_to = 1;
elseif (saw_from_to)
a = (a - 1);
not_done = 0;
elseif (i = index(args[a], "-"))
from = this:parse_number(who, args[a][1..i - 1], 0);
to = this:parse_number(who, args[a][i + 1..length(args[a])], 1);
not_done = 0;
elseif (f = this:parse_number(who, args[a], 0))
from = f;
if ((a == numargs) || (!(to = this:parse_number(who, args[a + 1], 1))))
to = from;
else
a = (a + 1);
endif
not_done = 0;
else
a = (a - 1);
not_done = 0;
endif
endwhile
if (from < 1)
return tostr("from ", from, "?  (out of range)");
elseif (to > last)
return tostr("to ", to, "?  (out of range)");
elseif (from > to)
return tostr("from ", from, " to ", to, "?  (backwards range)");
else
return {from, to, $string_utils:from_list(args[a..numargs], " ")};
endif
.
#51:35
"parse_ins(who,string)  interprets string as an insertion point, i.e., a position between lines and returns the number of the following line or 0 if bogus.";
if (!(fuckup = this:ok(who = args[1])))
return fuckup;
endif
who = args[1];
last = (length(this.texts[who]) + 1);
ins = this.inserting[who];
string = args[2];
if (i = index("-+", string[1]))
rest = string[2..length(string)];
return ((n = tonum(rest)) || (rest == "0")) ? {ins - n, ins + n}[i] | E_INVARG;
else
if (!(j = (index(string, "^") || index(string, "_"))))
offset = 0;
else
offset = ((j == 1) || tonum(string[1..j - 1]));
if (!offset)
return E_INVARG;
elseif (string[j] == "^")
offset = (-offset);
endif
endif
rest = string[j + 1..length(string)];
if (i = (rest in {".", "$"}))
return offset + {ins, last}[i];
elseif (!(n = tonum(rest)))
return E_INVARG;
else
return (offset + (j && (string[j] == "^"))) + n;
endif
endif
.
#51:36
recognized_flags = ((length(args) >= 2) ? args[2] | "gc");
null_subst_msg = ((length(args) >= 3) ? args[3] | "Null substitution?");
cmd = args[1];
if (!cmd)
return "/xxx/yyy[/[g][c]] [<range>] expected..";
endif
bchar = cmd[1];
cmd = cmd[2..length(cmd)];
fromstr = cmd[1..(b2 = index(cmd + bchar, bchar, 1)) - 1];
cmd = cmd[b2 + 1..length(cmd)];
tostr = cmd[1..(b2 = index(cmd + bchar, bchar, 1)) - 1];
cmd = cmd[b2 + 1..length(cmd)];
cmdlen = length(cmd);
b2 = 0;
while (((b2 = (b2 + 1)) <= cmdlen) && index(recognized_flags, cmd[b2]))
endwhile
return ((fromstr == "") && (tostr == "")) ? null_subst_msg | {fromstr, tostr, cmd[1..b2 - 1], cmd[b2..cmdlen]};
.
#51:37
":invoke(...)";
"to find out what arguments this verb expects,";
"see this editor's parse_invoke verb.";
new = args[1];
if ((!(caller in {this, player})) && (!$perm_utils:controls(caller_perms(), player)))
"...non-editor/non-player verb trying to send someone to the editor...";
return E_PERM;
endif
if ((who = this:loaded(player)) && this:changed(who))
if (!new)
if (this:suck_in(player))
player:tell("You are working on ", this:working_on(who));
endif
return;
elseif (player.location == this)
player:tell("You are still working on ", this:working_on(who));
if (msg = this:previous_session_msg())
player:tell(msg);
endif
return;
endif
"... we're not in the editor and we're about to start something new,";
"... but there's still this pending session...";
player:tell("You were working on ", this:working_on(who));
if (!$command_utils:yes_or_no("Do you wish to delete that session?"))
if (this:suck_in(player))
player:tell("Continuing with ", this:working_on(player in this.active));
if (msg = this:previous_session_msg())
player:tell(msg);
endif
endif
return;
endif
"... note session number may have changed => don't trust `who'";
this:kill_session(player in this.active);
endif
spec = this:parse_invoke(@args);
if (typeof(spec) == LIST)
if ((player:edit_option("local") && $object_utils:has_verb(this, "local_editing_info")) && (info = this:local_editing_info(@spec)))
this:invoke_local_editor(@info);
elseif (this:suck_in(player))
this:init_session(player in this.active, @spec);
endif
endif
.
#51:38
"The correct way to move someone into the editor.";
if (((loc = (who_obj = args[1]).location) != this) && (caller == this))
this.invoke_task = task_id();
who_obj:moveto(this);
if (who_obj.location == this)
fork (0)
"...forked, just in case loc:announce is broken...";
if (valid(loc) && (msg = this:depart_msg()))
loc:announce($string_utils:pronoun_sub(msg));
endif
endfork
else
who_obj:tell("For some reason, I can't move you.   (?)");
this:exitfunc(who_obj);
endif
this.invoke_task = 0;
endif
return who_obj.location == this;
.
#51:39
"WIZARDLY";
who_obj = args[1];
from = args[2];
if ($object_utils:isa(from, $generic_editor))
"... never put an editor in .original, ...";
if (w = (who_obj in from.active))
from = from.original[w];
else
from = #-1;
endif
endif
if (caller != this)
return E_PERM;
elseif (who = ((who_obj = args[1]) in this.active))
"... edit in progress here...";
if (valid(from))
this.original[who] = from;
endif
return -1;
else
for p in ({{"active", who_obj}, {"original", valid(from) ? from | $nothing}, {"times", time()}, @this.stateprops})
this.(p[1]) = {@this.(p[1]), p[2]};
endfor
return length(this.active);
endif
.
#51:40
"WIZARDLY";
if (!(fuckup = this:ok(who = args[1])))
return fuckup;
else
for p in ({@this.stateprops, {"original"}, {"active"}, {"times"}})
this.(p[1]) = listdelete(this.(p[1]), who);
endfor
return who;
endif
.
#51:41
"WIZARDLY";
if (!(fuckup = this:ok(who = args[1])))
return fuckup;
else
for p in (this.stateprops)
this.(p[1])[who] = p[2];
endfor
this.times[who] = time();
return who;
endif
.
#51:42
"WIZARDLY";
if ((caller != this) && (!caller_perms().wizard))
return E_PERM;
else
for victim in (this.contents)
victim:tell("Sorry, ", this.name, " is going down.  Your editing session is hosed.");
victim:moveto(((who = (victim in this.active)) && valid(origin = this.original[who])) ? origin | (valid(victim.home) ? victim.home | $player_start));
endfor
for p in ({@this.stateprops, {"original"}, {"active"}, {"times"}})
this.(p[1]) = {};
endfor
return 1;
endif
.
#51:43
return is_player(who_obj = args[1]) && (who_obj.wizard || pass(@args));
.
#51:44
who_obj = args[1];
if (who_obj.wizard && (!(who_obj in this.active)))
this:accept(who_obj);
endif
pass(@args);
if (this.invoke_task == task_id())
"Means we're about to load something, so be quiet.";
this.invoke_task = 0;
elseif (who = this:loaded(who_obj))
who_obj:tell("You are working on ", this:working_on(who), ".");
elseif (msg = this:nothing_loaded_msg())
who_obj:tell(msg);
endif
.
#51:45
if (!(who = ((who_obj = args[1]) in this.active)))
elseif (this:retain_session_on_exit(who))
if (msg = this:no_littering_msg())
who_obj:tell_lines(msg);
endif
else
this:kill_session(who);
endif
pass(@args);
.
#51:46
"@flush <editor>";
"@flush <editor> at <month> <day>";
"@flush <editor> at <weekday>";
"The first form removes all sessions from the editor; the other two forms remove everything older than the given date.";
if (!$perm_utils:controls(player, this))
player:tell("Only the owner of the editor can do a ", verb, ".");
return;
endif
if (!prepstr)
player:tell("Trashing all sessions.");
this:kill_all_sessions();
elseif (prepstr != "at")
player:tell("Usage:  ", verb, " ", dobjstr, " [at [mon day|weekday]]");
else
p = (prepstr in args);
if (t = $time_utils:from_day(iobjstr, -1))
elseif (t = $time_utils:from_month(args[p + 1], -1))
if (length(args) > (p + 1))
if (!(n = tonum(args[p + 2])))
player:tell(args[p + 1], " WHAT?");
return;
endif
t = (t + ((n - 1) * 86400));
endif
else
player:tell("couldn't parse date");
return;
endif
for i in [-length(this.active)..-1]
if (this.times[-i] < t)
player:tell(this.active[-i].name, "(", this.active[-i], ") ", ctime(this.times[-i]));
this:kill_session(-i);
endif
endfor
endif
.
#51:47
if (!$perm_utils:controls(player, this))
player:tell(E_PERM);
return;
endif
if (i = index(dobjstr, "="))
default = dobjstr[i + 1..length(dobjstr)];
prop = dobjstr[1..i - 1];
if (argstr[1 + index(argstr, "=")] == "\"")
elseif (default[1] == "#")
default = toobj(default);
elseif (index("0123456789", default[1]))
default = tonum(default);
elseif (default == "{}")
default = {};
endif
else
default = 0;
prop = dobjstr;
endif
if (typeof(result = this:set_stateprops(prop, default)) == ERR)
player:tell((result == E_RANGE) ? tostr(".", prop, " needs to hold a list of the same length as .active (", length(this.active), ").") | ((result != E_NACC) ? result | (prop + " is already a property on an ancestral editor.")));
else
player:tell("Property added.");
endif
.
#51:48
if (!$perm_utils:controls(player, this))
player:tell(E_PERM);
elseif (typeof(result = this:set_stateprops(dobjstr)) == ERR)
player:tell((result != E_NACC) ? result | (dobjstr + " is already a property on an ancestral editor."));
else
player:tell("Property removed.");
endif
.
#51:49
if ($perm_utils:controls(caller_perms(), this))
pass(@args);
this:kill_all_sessions();
endif
.
#51:50
if (caller_perms().wizard)
pass();
this:kill_all_sessions();
this.help = $editor_help;
endif
.
#51:51
remove = (length(args) < 2);
if ((caller != this) && (!$perm_utils:controls(caller_perms(), this)))
return E_PERM;
elseif (!(length(args) in {1, 2}))
return E_ARGS;
elseif (typeof(prop = args[1]) != STR)
return E_TYPE;
elseif (i = $list_utils:iassoc(prop, this.stateprops))
if (!remove)
this.stateprops[i] = {prop, args[2]};
elseif ($object_utils:has_property(parent(this), prop))
return E_NACC;
else
this.stateprops = listdelete(this.stateprops, i);
endif
elseif (remove)
elseif (prop in properties(this))
if (this:_stateprop_length(prop) != length(this.active))
return E_RANGE;
endif
this.stateprops = {{prop, args[2]}, @this.stateprops};
else
return $object_utils:has_property(this, prop) ? E_NACC | E_PROPNF;
endif
return 0;
.
#51:52
is_look_self = 1;
for c in (callers())
if (is_look_self && (c[2] in {"enterfunc", "confunc"}))
return {"", "Do a 'look' to get the list of commands, or 'help' for assistance.", "", @this.description};
elseif (c[2] != "look_self")
is_look_self = 0;
endif
endfor
d = {"Commands:", ""};
col = {{}, {}};
for c in [1..2]
for cmd in (this.commands2[c])
cmd = this:commands_info(cmd);
col[c] = {cmdargs = ($string_utils:left(cmd[1] + " ", 12) + cmd[2]), @col[c]};
endfor
endfor
i1 = length(col[1]);
i2 = length(col[2]);
right = 0;
while (i1 || i2)
if (!((i1 && (length(col[1][i1]) > 35)) || (i2 && (length(col[2][i2]) > 35))))
d = {@d, $string_utils:left(i1 ? col[1][i1] | "", 40) + (i2 ? col[2][i2] | "")};
i1 && (i1 = (i1 - 1));
i2 && (i2 = (i2 - 1));
right = 0;
elseif (right && i2)
d = {@d, (length(col[2][i2]) > 35) ? $string_utils:right(col[2][i2], 75) | ($string_utils:space(40) + col[2][i2])};
i2 = (i2 - 1);
right = 0;
elseif (i1)
d = {@d, col[1][i1]};
i1 = (i1 - 1);
right = 1;
else
right = 1;
endif
endwhile
return {@d, "", "----  Do `help <cmdname>' for help with a given command.  ----", "", "  <ins> ::= $ (the end) | [^]n (above line n) | _n (below line n) | . (current)", "<range> ::= <lin> | <lin>-<lin> | from <lin> | to <lin> | from <lin> to <lin>", "  <lin> ::= n | [n]$ (n from the end) | [n]_ (n before .) | [n]^ (n after .)", "`help insert' and `help ranges' describe these in detail.", @this.description};
.
#51:53
cmd = args[1];
if (pc = $list_utils:assoc(cmd, this.commands))
return pc;
elseif (this == $generic_editor)
return {cmd, "<<<<<======= Need to add this to .commands"};
else
return parent(this):commands_info(cmd);
endif
.
#51:54
who = {@args, player}[2];
objstr = args[1];
origin = this;
while ((where = (player in origin.active)) && ($recycler:valid(origin = origin.original[where]) && (origin != this)))
if (!$object_utils:isa(origin, $generic_editor))
return origin:match_object(args[1], who);
endif
endwhile
return who:my_match_object(objstr, #-1);
.
#51:55
who = args[1];
where = {#-1, @this.original}[1 + (who in this.active)];
return strsub(this.who_location_msg, "%L", where:who_location_msg(who));
return $string_utils:pronoun_sub(this.who_location_msg, who, this, where);
.
#51:56
return this.(verb);
.
#51:57
return;
.
#51:58
"fill(string,width[,prefix])";
"tries to cut <string> into substrings of length < <width> along word boundaries.  Prefix, if supplied, will be prefixed to the 2nd..last substrings.";
if (length(args) < 2)
width = (2 + player:linelen());
prefix = "";
else
width = (args[2] + 1);
prefix = {@args, ""}[3];
endif
if (width < (3 + length(prefix)))
return E_INVARG;
endif
string = (("$" + args[1]) + " $");
len = length(string);
if (len <= width)
last = (len - 1);
next = len;
else
last = rindex(string[1..width], " ");
if (last < ((width + 1) / 2))
last = (width + index(string[width + 1..len], " "));
endif
next = last;
while (string[next = (next + 1)] == " ")
endwhile
endif
while (string[last = (last - 1)] == " ")
endwhile
ret = {string[2..last]};
width = (width - length(prefix));
minlast = ((width + 1) / 2);
while (next < len)
string = ("$" + string[next..len]);
len = ((len - next) + 2);
if (len <= width)
last = (len - 1);
next = len;
else
last = rindex(string[1..width], " ");
if (last < minlast)
last = (width + index(string[width + 1..len], " "));
endif
next = last;
while (string[next = (next + 1)] == " ")
endwhile
endif
while (string[last = (last - 1)] == " ")
endwhile
if (last > 1)
ret = {@ret, prefix + string[2..last]};
endif
endwhile
return ret;
.
#51:59
"This catches subst and find commands that don't fit into the usual model, e.g., s/.../.../ without the space after the s, and find commands without the verb `find'.  Still behaves in annoying ways (e.g., loses if the search string contains multiple whitespace), but better than before.";
if ((caller != this) && (caller_perms() != player))
return E_PERM;
endif
verb = args[1];
args = args[2];
v = 1;
vmax = min(length(verb), 5);
while ((v <= vmax) && (verb[v] == "subst"[v]))
v = (v + 1);
endwhile
argstr = $code_utils:argstr(verb, args);
if ((v > 1) && ((v <= length(verb)) && (((vl = verb[v]) < "A") || (vl > "Z"))))
argstr = ((verb[v..length(verb)] + (argstr && " ")) + argstr);
this:subst();
return 1;
elseif ("/" == verb[1])
argstr = ((verb + (argstr && " ")) + argstr);
this:find();
return 1;
else
return 0;
endif
.
#51:60
return $failed_match;
.
#51:61
":get_room([player])  => correct room to match in on invocation.";
who = {@args, player}[1];
if (who.location != this)
return who.location;
else
origin = this;
while ((where = (player in origin.active)) && (valid(origin = origin.original[where]) && (origin != this)))
if (!$object_utils:isa(origin, $generic_editor))
return origin;
endif
endwhile
return this;
endif
.
#51:62
":invoke_local_editor(name, text, upload)";
"Spits out the magic text that invokes the local editor in the player's client.";
"NAME is a good human-readable name for the local editor to use for this particular piece of text.";
"TEXT is a string or list of strings, the initial body of the text being edited.";
"UPLOAD, a string, is a MOO command that the local editor can use to save the text when the user is done editing.  The local editor is going to send that command on a line by itself, followed by the new text lines, followed by a line containing only `.'.  The UPLOAD command should therefore call $command_utils:read_lines() to get the new text as a list of strings.";
if (caller != this)
return;
endif
name = args[1];
text = args[2];
upload = args[3];
if (typeof(text) == STR)
text = {text};
endif
notify(player, tostr("#$# edit name: ", name, " upload: ", upload));
":dump_lines() takes care of the final `.' ...";
for line in ($command_utils:dump_lines(text))
notify(player, line);
endfor
.
#51:63
"+c properties on children cannot necessarily be read, so we need this silliness...";
if (caller != this)
return E_PERM;
else
return length(this.(args[1]));
endif
.
#51:64
txt = this:text(player in this.active);
if (typeof(txt) == LIST)
player:tell_lines(txt);
else
player:tell("Text unreadable:  ", txt);
endif
player:tell("--------------------------");
.
#51:65
return this:acceptable(who_obj = args[1]) && this:new_session(who_obj, who_obj.location);
.
#52:0
":match(string, object-list)";
"Return object in 'object-list' aliased to 'string'.";
"Matches on a wide variety of syntax, including:";
" \"5th axe\" -- The fifth object matching \"axe\" in the object list.";
" \"where's sai\" -- The only object contained in 'where' matching \"sai\" (possible $ambiguous_match).";
" \"where's second staff\" -- The second object contained in 'where' matching \"staff\".";
" \"my third dagger\" -- The third object in your inventory matching \"dagger\".";
"Ordinal matches are determined according to the match's position in 'object-list' or, if a possessive (such as \"where\" above) is given, then the ordinal is the nth match in that object's inventory.";
"In the matching room (#3879@LambdaMOO), the 'object-list' consists of first the player's contents, then the room's, and finally all exits leading from the room.";
string = args[1];
olist = args[2];
if (!string)
return $nothing;
elseif (string == "me")
return player;
elseif (string == "here")
return player.location;
elseif (valid(object = $string_utils:literal_object(string)))
return object;
elseif (valid(object = $string_utils:match(string, olist, "aliases")))
return object;
elseif (parsed = this:parse_ordinal_reference(string))
return this:match_nth(parsed[2], olist, parsed[1]);
elseif (parsed = this:parse_possessive_reference(string))
whostr = parsed[1];
objstr = parsed[2];
if (valid(whose = this:match(whostr, olist)))
return this:match(objstr, whose.contents);
else
return whose;
endif
else
return object;
endif
.
#52:1
":match_nth(string, objlist, n)";
"Find the nth object in 'objlist' that matches 'string'.";
what = args[1];
where = args[2];
n = args[3];
for v in (where)
z = 0;
for q in (v.aliases)
z = (z || (index(q, what) == 1));
endfor
if (z && (!(n = (n - 1))))
return v;
endif
endfor
return $failed_match;
.
#52:2
"$match_utils:match_verb(verbname, object) => Looks for a command-line style verb named <verbname> on <object> with current values of prepstr, dobjstr, dobj, iobjstr, and iobj.  If a match is made, the verb is called and 1 is returned.  Otherwise, 0 is returned.";
vrb = args[1];
what = args[2];
if (where = $object_utils:has_verb(what, vrb))
if ((vargs = verb_args(where[1], vrb)) != {"this", "none", "this"})
if (((((((vargs[2] == "any") || ((!prepstr) && (vargs[2] == "none"))) || index(("/" + vargs[2]) + "/", ("/" + prepstr) + "/")) && (((vargs[1] == "any") || ((!dobjstr) && (vargs[1] == "none"))) || ((dobj == what) && (vargs[1] == "this")))) && (((vargs[3] == "any") || ((!iobjstr) && (vargs[3] == "none"))) || ((iobj == what) && (vargs[3] == "this")))) && index(verb_info(where[1], vrb)[2], "x")) && verb_code(where[1], vrb))
set_task_perms(caller_perms());
what:(vrb)(@args[3]);
return 1;
endif
endif
endif
.
#52:3
":match_list(string, object_list) -> List of all matches.";
what = args[1];
where = args[2];
r = {};
for v in (where)
if (!(v in r))
z = 0;
for q in (v.aliases)
z = (z || (index(q, what) == 1));
endfor
if (z)
r = listappend(r, v);
endif
endif
endfor
return r;
.
#52:4
":parse_ordref(string)";
"Parses strings referring to an 'nth' object.";
"=> {NUM n, STR object} Where 'n' is the number the ordinal represents, and 'object' is the rest of the string.";
"=> 0 If the given string is not an ordinal reference.";
"  Example:";
":parse_ordref(\"second broadsword\") => {2, \"broadsword\"}";
":parse_ordref(\"second\") => 0";
"  Note that there must be more to the string than the ordinal alone.";
if (m = match(args[1], ("^" + this.ordinal_regexp) + " +%([^ ].+%)$"))
o = substitute("%1", m);
n = ((o in this.ordn) || (o in this.ordw));
return n && {n, substitute("%2", m)};
else
return 0;
endif
.
#52:5
":parse_possessive_reference(string)";
"Parses strings in a possessive format.";
"=> {STR whose, STR object}  Where 'whose' is the possessor of 'object'.";
"If the string consists only of a possessive string (ie: \"my\", or \"yduJ's\"), then 'object' will be an empty string.";
"=> 0 If the given string is not a possessive reference.";
"  Example:";
":parse_possessive_reference(\"joe's cat\") => {\"joe\", \"cat\"}";
":parse_possessive_reference(\"sis' fish\") => {\"sis\", \"fish\"}";
"  Strings are returned as a value suitable for a :match routine, thus 'my' becoming 'me'.";
":parse_possessive_reference(\"my dog\") => {\"me\", \"dog\"}";
string = args[1];
if (m = match(string, "^my *%(.+%)?"))
return {"me", substitute("%1", m)};
elseif (m = match(string, "^%([^ ]+s?%)%'s? *%(.+%)?"))
return {substitute("%1", m), substitute("%2", m)};
else
return 0;
endif
.
#53:0
object = args[1];
prop = args[2];
if (prop in $code_utils.builtin_props)
return valid(object);
else
return !(!property_info(object, prop));
endif
.
#53:1
what = args[1];
if (what.owner != caller_perms())
set_task_perms(caller_perms());
endif
props = (properties(what) || {});
while (valid(what = parent(what)))
props = {@properties(what) || {}, @props};
endwhile
return props;
.
#53:2
":has_verb(OBJ object, STR verbname)";
"Find out if an object has a verb matching the given verbname.";
"Returns {location} if so, 0 if not, where location is the object or the ancestor on which the verb is actually defined.";
object = args[1];
verbname = args[2];
while (E_VERBNF == (vi = verb_info(object, verbname)))
object = parent(object);
endwhile
return vi ? {object} | 0;
.
#53:3
"Usage:  has_callable_verb(object, verb)";
"See if an object has a verb that can be called by another verb (i.e., that has its x permission bit set).";
"Return {location}, where location is the object that defines the verb, or 0 if the object doesn't have the verb.";
object = args[1];
verbname = args[2];
while (valid(object))
if (index(verb_info(object, verbname)[2], "x") && verb_code(object, verbname))
return {object};
endif
object = parent(object);
endwhile
return 0;
.
#53:4
what = args[1];
if (what.owner != caller_perms())
set_task_perms(caller_perms());
endif
verbs = {};
while (valid(what))
verbs = {@verbs(what) || {}, @verbs};
what = parent(what);
endwhile
return verbs;
.
#53:5
":match_verb(OBJ object, STR verb)";
"Find out if an object has a given verb, and some information about it.";
"Returns {OBJ location, STR verb} if matched, 0 if not.";
"Location is the object on which it is actually defined, verb is a name";
"for the verb which can subsequently be used in verb_info (i.e., no";
"asterisks).";
verbname = strsub(args[2], "*", "");
object = args[1];
while (E_VERBNF == (info = verb_info(object, verbname)))
object = parent(object);
endwhile
return info ? {object, verbname} | 0;
.
#53:6
":isa(x,y) == valid(x) && (y==x || y in :ancestors(x))";
what = args[1];
targ = args[2];
while (valid(what))
if (what == targ)
return 1;
endif
what = parent(what);
endwhile
return 0;
.
#53:7
"Usage:  ancestors(object[, object...])";
"Return a list of all ancestors of the object(s) in args, with no duplicates.";
"If called with a single object, the result will be in order ascending up the inheritance hierarchy.  If called with multiple objects, it probably won't.";
ret = {};
for o in (args)
what = o;
while (valid(what = parent(what)))
ret = setadd(ret, what);
endwhile
endfor
return ret;
.
#53:8
what = args[1];
kids = children(what);
result = {};
for x in (kids)
result = {@result, @this:descendants(x)};
endfor
return {@kids, @result};
.
#53:9
set_task_perms(caller_perms());
what = args[1];
kids = children(what);
result = {};
for x in (kids)
result = {@result, @this:descendants_suspended(x)};
endfor
$command_utils:suspend_if_needed(0);
return {@kids, @result};
.
#53:10
r = {what = args[1]};
for k in (children(what))
r = {@r, @this:(verb)(k)};
endfor
return r;
.
#53:11
":branches(object) => list of all descendants of object which have children.";
if (kids = children(object = args[1]))
s = {object};
for k in (kids)
s = {@s, @this:branches(k)};
endfor
return s;
else
return {};
endif
.
#53:12
":branches_suspended(object) => descendants of object having children.";
"this version calls suspend(0) as needed";
set_task_perms(caller_perms());
if (kids = children(object = args[1]))
s = {object};
for k in (kids)
$command_utils:suspend_if_needed(0);
s = {@s, @this:branches_suspended(k)};
endfor
return s;
else
return {};
endif
.
#53:13
":leaves(object) => list of all childless descendents of object";
s = {};
for k in (children(args[1]))
s = {@s, @this:leaves(k)};
endfor
return s || {args[1]};
.
#53:14
":leaves_suspended(object) => list of all childless descendents of object";
"this versions calls suspend(0) as needed";
set_task_perms(caller_perms());
s = {};
for k in (children(args[1]))
$command_utils:suspend_if_needed(0);
s = {@s, @this:leaves_suspended(k)};
endfor
return s || {args[1]};
.
#53:15
"$object_utils:contains(obj1, obj2) -- does obj1 contain obj2?";
"";
"Return true iff obj2 is under obj1 in the containment hierarchy; that is, if obj1 is obj2's location, or its location's location, or ...";
loc = args[1];
what = args[2];
while (valid(what))
what = what.location;
if (what == loc)
return valid(loc);
return 1;
endif
endwhile
return 0;
.
#53:16
"all_contents(object)";
"Return a list of all objects contained (at some level) by object.";
res = {};
for y in (args[1].contents)
res = {@res, y, @$object_utils:all_contents(y)};
endfor
return res;
.
#53:17
"findable_properties(object)";
"Return a list of properties on those members of object's ancestor list that are readable or are owned by the caller (or all properties if the caller is a wizard).";
what = args[1];
props = {};
who = caller_perms();
while (what != $nothing)
if ((what.r || (who == what.owner)) || who.wizard)
props = {@properties(what), @props};
endif
what = parent(what);
endwhile
return props;
.
#53:18
"owned_properties(what[, who])";
"Return a list of all properties on WHAT owned by WHO.";
"Only wizardly verbs can specify WHO; mortal verbs can only search for properties owned by their own owners.  For more information, talk to Gary_Severn.";
what = (anc = args[1]);
who = (((c = caller_perms()).wizard && (length(args) > 1)) ? args[2] | c);
props = {};
while (anc != $nothing)
for k in (properties(anc))
if (property_info(what, k)[1] == who)
props = listappend(props, k);
endif
endfor
anc = parent(anc);
endwhile
return props;
.
#53:19
":property_conflicts(object,newparent)";
"Looks for propertyname conflicts that would keep chparent(object,newparent)";
"  from working.";
"Returns a list of elements of the form {<propname>, @<objectlist>}";
"where <objectlist> is list of descendents of object defining <propname>.";
if (!valid(object = args[1]))
return E_INVARG;
elseif (!valid(newparent = args[2]))
return (newparent == #-1) ? {} | E_INVARG;
elseif (!($perm_utils:controls(caller_perms(), object) && (newparent.f || $perm_utils:controls(caller_perms(), newparent))))
"... if you couldn't chparent anyway, you don't need to know...";
return E_PERM;
endif
"... properties existing on newparent";
"... cannot be present on object or any descendent...";
props = (conflicts = {});
for o in ({object, @$object_utils:descendents_suspended(object)})
for p in (properties(o))
if (property_info(newparent, p))
if (i = (p in props))
conflicts[i] = {@conflicts[i], o};
else
props = {@props, p};
conflicts = {@conflicts, {p, o}};
endif
endif
$command_utils:suspend_if_needed(0);
endfor
$command_utils:suspend_if_needed(0);
endfor
return conflicts;
.
#53:20
":descendants_with_property_suspended(object,property)";
" => list of descendants of object on which property is defined.";
"calls suspend(0) as needed";
object = args[1];
if ((caller == this) || (object.w || $perm_utils:controls(caller_perms(), object)))
$command_utils:suspend_if_needed(0);
if (property_info(@args))
return {object};
endif
r = {};
prop = args[2];
for c in (children(object))
r = {@r, @this:descendants_with_property_suspended(c, prop)};
endfor
return r;
else
return E_PERM;
endif
.
#53:21
"Usage:  locations(object)";
"Return a listing of the location hierarchy above object.";
ret = {};
what = args[1];
while (valid(what = what.location))
ret = {@ret, what};
endwhile
return ret;
.
#53:22
"Copied from object utilities (#3669):all_properties by Haakon (#2) Mon Dec 28 14:24:36 1992 PST";
what = args[1];
if (what.owner != caller_perms())
set_task_perms(caller_perms());
endif
props = (properties(what) || {});
while (valid(what = parent(what)))
props = {@properties(what) || {}, @props};
$command_utils:suspend_if_needed(0);
endwhile
return props;
.
#53:23
":connected(object) => true iff object is a connected player.";
"equivalent to (object in connected_players()) perhaps with less server overhead";
"use object:is_listening() if you want to allow for puppets and other non-player objects that still 'care' about what's said.";
return 1 + connected_seconds(@args);
.
#53:24
":isoneof(x,y) = x isa z, for some z in list y";
what = args[1];
targ = args[2];
while (valid(what))
if (what in targ)
return 1;
endif
what = parent(what);
endwhile
return 0;
.
#54:0
this.input_string = args[1];
this.input_length = length(args[1]);
this.input_index = 1;
.
#54:1
string = this.input_string;
len = this.input_length;
i = this.input_index;
while ((i <= len) && (string[i] == " "))
i = (i + 1);
endwhile
if (i > len)
return "";
elseif ((ch = string[i]) in {"(", ")", "!", "?"})
this.input_index = (i + 1);
return ch;
elseif (ch in {"&", "|"})
this.input_index = (i = (i + 1));
if ((i <= len) && (string[i] == ch))
this.input_index = (i + 1);
endif
return ch + ch;
else
start = i;
while ((i <= len) && (!((ch = string[i]) in {"(", ")", "!", "?", "&", "|"})))
i = (i + 1);
endwhile
this.input_index = i;
i = (i - 1);
while (string[i] == " ")
i = (i - 1);
endwhile
return this:canonicalize_spaces(string[start..i]);
endif
.
#54:2
name = args[1];
while (index(name, "  "))
name = strsub(name, "  ", " ");
endwhile
return name;
.
#54:3
this:init_scanner(args[1]);
this.player = args[2];
return this:parse_E();
"";
"Grammar for key expressions:";
"";
"    E ::= A       ";
"       |  E || A  ";
"       |  E && A  ";
"    A ::= ( E )   ";
"       |  ! A     ";
"       |  object  ";
"       |  ? object  ";
.
#54:4
exp = this:parse_A();
if (typeof(exp) != STR)
while ((token = this:scan_token()) in {"&&", "||"})
rhs = this:parse_A();
if (typeof(rhs) == STR)
return STR;
endif
exp = {token, exp, rhs};
endwhile
endif
return exp;
.
#54:5
token = this:scan_token();
if (token == "(")
exp = this:parse_E();
if ((typeof(exp) != STR) && (this:scan_token() != ")"))
return "Missing ')'";
else
return exp;
endif
elseif (token == "!")
exp = this:parse_A();
if (typeof(exp) == STR)
return exp;
else
return {"!", exp};
endif
elseif (token == "?")
next = this:scan_token();
if (next in {"(", ")", "!", "&&", "||", "?"})
return ("Missing object-name before '" + token) + "'";
elseif (next == "")
return "Missing object-name at end of key expression";
else
what = this:match_object(next);
if (typeof(what) == OBJ)
return {"?", this:match_object(next)};
else
return what;
endif
endif
elseif (token in {"&&", "||"})
return ("Missing expression before '" + token) + "'";
elseif (token == "")
return "Missing expression at end of key expression";
else
return this:match_object(token);
endif
.
#54:6
key = args[1];
who = args[2];
type = typeof(key);
if (!(type in {LIST, OBJ}))
return 1;
elseif (typeof(key) == OBJ)
return (who == key) || $object_utils:contains(who, key);
endif
op = key[1];
if (op == "!")
return !this:eval_key(key[2], who);
elseif (op == "?")
return key[2]:is_unlocked_for(who);
elseif (op == "&&")
return this:eval_key(key[2], who) && this:eval_key(key[3], who);
elseif (op == "||")
return this:eval_key(key[2], who) || this:eval_key(key[3], who);
else
return 1 / 0;
endif
.
#54:7
token = args[1];
if (token == "me")
return this.player;
elseif (token == "here")
if (valid(this.player.location))
return this.player.location;
else
return ("'here' has no meaning where " + this.player.name) + " is";
endif
else
what = this.player.location:match_object(token);
if (what == $failed_match)
return ("Can't find an object named '" + token) + "'";
elseif (what == $ambiguous_match)
return ("Multiple objects named '" + token) + "'";
else
return what;
endif
endif
.
#54:8
key = args[1];
type = typeof(key);
if (!(type in {LIST, OBJ}))
return "(None.)";
elseif (type == OBJ)
if (valid(key))
return tostr(key, "[", key.name, "]");
else
return tostr(key);
endif
else
op = key[1];
arg1 = this:unparse_key(key[2]);
if (op == "?")
return "?" + arg1;
elseif (op == "!")
if (typeof(key[2]) == LIST)
return ("!(" + arg1) + ")";
else
return "!" + arg1;
endif
elseif (op in {"&&", "||"})
other = ((op == "&&") ? "||" | "&&");
lhs = arg1;
rhs = this:unparse_key(key[3]);
if ((typeof(key[2]) == OBJ) || (key[2][1] != other))
exp = lhs;
else
exp = (("(" + lhs) + ")");
endif
exp = (((exp + " ") + op) + " ");
if ((typeof(key[3]) == OBJ) || (key[3][1] != other))
exp = (exp + rhs);
else
exp = (((exp + "(") + rhs) + ")");
endif
return exp;
else
return 1 / 0;
endif
endif
.
#54:9
set_task_perms($no_one);
key = args[1];
who = args[2];
type = typeof(key);
if (!(type in {LIST, OBJ}))
return 1;
elseif (typeof(key) == OBJ)
return (who == key) || $object_utils:contains(who, key);
endif
op = key[1];
if (op == "!")
return !this:eval_key(key[2], who);
elseif (op == "?")
return key[2]:is_unlocked_for(who);
elseif (op == "&&")
return this:eval_key(key[2], who) && this:eval_key(key[3], who);
elseif (op == "||")
return this:eval_key(key[2], who) || this:eval_key(key[3], who);
elseif (op == ".")
if ($object_utils:has_property(who, key[2]) && who.(key[2]))
return 1;
else
for thing in ($object_utils:all_contents(who))
if ($object_utils:has_property(thing, key[2]) && thing.(key[2]))
return 1;
endif
endfor
endif
return 0;
elseif (op == ":")
if ($object_utils:has_verb(who, key[2]) && who:(key[2])())
return 1;
else
for thing in ($object_utils:all_contents(who))
if ($object_utils:has_verb(thing, key[2]) && thing:(key[2])())
return 1;
endif
endfor
endif
return 0;
else
return 1 / 0;
endif
.
#54:10
token = this:scan_token();
if (token == "(")
exp = this:parse_E();
if ((typeof(exp) != STR) && (this:scan_token() != ")"))
return "Missing ')'";
else
return exp;
endif
elseif (token == "!")
exp = this:parse_A();
if (typeof(exp) == STR)
return exp;
else
return {"!", exp};
endif
elseif (token == "?")
next = this:scan_token();
if (next in {":", ".", "(", ")", "!", "&&", "||", "?"})
return ("Missing object-name before '" + token) + "'";
elseif (next == "")
return "Missing object-name at end of key expression";
else
what = this:match_object(next);
if (typeof(what) == OBJ)
return {"?", this:match_object(next)};
else
return what;
endif
endif
elseif (token in {":", "."})
next = this:scan_token();
if (next in {":", ".", "(", ")", "!", "&&", "||", "?"})
return ("Missing verb-or-property-name before '" + token) + "'";
elseif (next == "")
return "Missing verb-or-property-name at end of key expression";
elseif (typeof(next) != STR)
return "Non-string verb-or-property-name at end of key expression";
else
return {token, next};
endif
elseif (token in {"&&", "||"})
return ("Missing expression before '" + token) + "'";
elseif (token == "")
return "Missing expression at end of key expression";
else
return this:match_object(token);
endif
.
#55:0
result = this:do_burn();
player:tell(result ? this:burn_succeeded_msg() | this:burn_failed_msg());
if (msg = (result ? this:oburn_succeeded_msg() | this:oburn_failed_msg()))
player.location:announce(player.name, " ", msg);
endif
.
#55:1
return (msg = this.(verb)) ? $string_utils:pronoun_sub(msg) | "";
.
#55:2
c = callers();
while (c && c[1][3].wizard)
c = listdelete(c, 1);
endwhile
if (c)
who = c[1][3];
else
who = player;
endif
if ((this != $letter) && ($perm_utils:controls(who, this) || this:is_readable_by(who)))
fork (0)
$recycler:_recycle(this);
endfork
return 1;
else
return E_PERM;
endif
.
#56:0
":make(n[,elt]) => a list of n elements, each of which == elt. elt defaults to 0.";
if ((n = args[1]) < 0)
return E_INVARG;
endif
ret = {};
build = {elt = {@args, 0}[2]};
while (1)
if (n % 2)
ret = {@ret, @build};
endif
if (n = (n / 2))
build = {@build, @build};
else
return ret;
endif
endwhile
.
#56:1
":range([m,]n) => {m,m+1,...,n}";
if (listdelete(args, 1))
else
args = {1, @args};
endif
ret = {};
for k in [args[1]..args[2]]
ret = {@ret, k};
endfor
return ret;
.
#56:2
set_task_perms(caller_perms());
prop = args[2];
if ((len = length(objs = args[1])) > 50)
return {@this:map_prop(objs[1..len / 2], prop), @this:map_prop(objs[(len / 2) + 1..len], prop)};
endif
strs = {};
for foo in (objs)
strs = {@strs, foo.(prop)};
endfor
return strs;
.
#56:3
set_task_perms(caller_perms());
if ((len = length(objs = args[1])) > 50)
return {@this:map_verb(@listset(args, objs[1..len / 2], 1)), @this:map_verb(@listset(args, objs[(len / 2) + 1..len], 1))};
endif
vrb = args[2];
rest = args[3..length(args)];
strs = {};
for o in (objs)
strs = {@strs, o:(vrb)(@rest)};
endfor
return strs;
.
#56:4
"map_arg([n,]object,verb,@args) -- assumes the nth element of args is a list, calls object:verb(@args) with each element of the list substituted in turn, returns the list of results.  n defaults to 1.";
"map_verb_arg(o,v,{a...},a2,a3,a4,a5)={o:v(a,a2,a3,a4,a5),...}";
"map_verb_arg(4,o,v,a1,a2,a3,{a...},a5)={o:v(a1,a2,a3,a,a5),...}";
set_task_perms(caller_perms());
if (n = args[1])
object = args[2];
verb = args[3];
rest = args[4..length(args)];
else
object = n;
n = 1;
verb = args[2];
rest = args[3..length(args)];
endif
results = {};
for a in (rest[n])
results = listappend(results, object:(verb)(@listset(rest, a, n)));
endfor
return results;
.
#56:5
":map_builtin(objectlist,func) applies func to each of the objects in turn and returns the corresponding list of results.  This function is mainly here for completeness -- in the vast majority of situations, a simple for loop is better.";
set_task_perms(caller_perms());
if (!((builtin = args[2]) in {"tostr", "tonum", "toobj", "typeof", "length", "random", "ctime", "valid", "parent", "children", "properties", "verbs", "is_player", "idle_seconds", "connected_seconds"}))
return E_INVARG;
endif
objs = args[1];
if (length(objs) > 100)
return {@this:map_builtin(objs[1..l = (length(objs) / 2)], builtin), @this:map_builtin(objs[l + 1..length(objs)], builtin)};
endif
strs = {};
for foo in (objs)
strs = {@strs, eval(tostr("return ", builtin, "(", $string_utils:from_value(foo, 1, -1), ");"))[2]};
endfor
return strs;
.
#56:6
"find_insert(sortedlist,key) => index of first element in sortedlist > key";
"  sortedlist is assumed to be sorted in increasing order and the number returned is anywhere from 1 to length(sortedlist)+1, inclusive.";
lst = args[1];
key = args[2];
if ((r = length(lst)) < 25)
for l in [1..r]
if (lst[l] > key)
return l;
endif
endfor
return r + 1;
else
l = 1;
while (r >= l)
if (key < lst[i = ((r + l) / 2)])
r = (i - 1);
else
l = (i + 1);
endif
endwhile
return l;
endif
.
#56:7
"remove_duplicates(list) => list as a set, i.e., all repeated elements removed.";
out = {};
for x in (args[1])
out = setadd(out, x);
endfor
return out;
.
#56:8
"arrayset(list,value,pos1,...,posn) -- returns list modified such that";
"  list[pos1][pos2][...][posn] == value";
if (length(args) > 3)
return listset(@listset(args[1..3], this:arrayset(@listset(listdelete(args, 3), args[1][args[3]], 1)), 2));
"... Rog's entry in the Obfuscated MOO-Code Contest...";
else
return listset(@args);
endif
.
#56:9
":setremove_all(set,elt) => set with *all* occurences of elt removed";
set = args[1];
what = args[2];
while (w = (what in set))
set = listdelete(set, w);
endwhile
return set;
.
#56:10
"append({a,b,c},{d,e},{},{f,g,h},...) =>  {a,b,c,d,e,f,g,h}";
if ((n = length(args)) > 50)
return {@this:append(@args[1..n / 2]), @this:append(@args[(n / 2) + 1..n])};
endif
l = {};
for a in (args)
l = {@l, @a};
endfor
return l;
.
#56:11
"reverse(list) => reversed list";
return this:_reverse(@args[1]);
.
#56:12
":_reverse(@list) => reversed list";
if ((n = length(args)) > 50)
return {@this:_reverse(@args[(n / 2) + 1..n]), @this:_reverse(@args[1..n / 2])};
endif
l = {};
for a in (args)
l = listinsert(l, a);
endfor
return l;
.
#56:13
"compress(list) => list with consecutive repeated elements removed, e.g.,";
"compress({a,b,b,c,b,b,b,d,d,e}) => {a,b,c,b,d,e}";
if (l = args[1])
out = {last = l[1]};
for x in (listdelete(l, 1))
if (x != last)
out = listappend(out, x);
last = x;
endif
endfor
return out;
else
return l;
endif
.
#56:14
"sort(list[,keys]) => sorts keys (assumed to be all numbers or strings) and returns list with the corresponding permutation applied to it.  keys defaults to the list itself.";
"sort({x1,x3,x2},{1,3,2}) => {x1,x2,x3}";
lst = args[1];
unsorted_keys = ((use_sorted_lst = (length(args) >= 2)) ? args[2] | lst);
sorted_lst = (sorted_keys = {});
for e in (unsorted_keys)
l = this:find_insert(sorted_keys, e);
sorted_keys = listinsert(sorted_keys, e, l);
if (use_sorted_lst)
sorted_lst = listinsert(sorted_lst, lst[length(sorted_keys)], l);
endif
endfor
return sorted_lst || sorted_keys;
.
#56:15
":sort_suspended(interval,list[,keys]) => sorts keys (assumed to be all numbers or strings) and returns list with the corresponding permutation applied to it.  keys defaults to the list itself.";
"does suspend(interval) as needed.";
set_task_perms(caller_perms());
interval = args[1];
if (typeof(interval) != NUM)
return E_ARGS;
endif
lst = args[2];
unsorted_keys = ((use_sorted_lst = (length(args) >= 3)) ? args[3] | lst);
sorted_lst = (sorted_keys = {});
for e in (unsorted_keys)
l = this:find_insert(sorted_keys, e);
sorted_keys[l..l - 1] = {e};
if (use_sorted_lst)
sorted_lst[l..l - 1] = {lst[length(sorted_keys)]};
endif
$command_utils:suspend_if_needed(interval);
endfor
return sorted_lst || sorted_keys;
.
#56:16
"slice(alist[,index]) returns a list of the index-th elements of the elements of alist, e.g., ";
"    slice({{\"z\",1},{\"y\",2},{\"x\",5}},2) => {1,2,5}.";
"index defaults to 1 and may also be a nonempty list, e.g., ";
"    slice({{\"z\",1,3},{\"y\",2,4}},{2,1}) => {{1,\"z\"},{2,\"y\"}}";
slice = {};
ind = {@args, 1}[2];
if (typeof(ind) == LIST)
for elt in (args[1])
s = {elt[ind[1]]};
for i in (listdelete(ind, 1))
s = {@s, elt[i]};
endfor
slice = {@slice, s};
endfor
else
for elt in (args[1])
slice = {@slice, elt[ind]};
endfor
endif
return slice;
.
#56:17
"assoc(target,list[,index]) returns the first element of `list' whose own index-th element is target.  Index defaults to 1.";
"returns {} if no such element is found";
target = args[1];
indx = {@args, 1}[3];
for t in (args[2])
if (t[indx] == target)
"... do this test first since it's the most likely to fail; this needs -d";
if ((typeof(t) == LIST) && (length(t) >= indx))
return t;
endif
endif
endfor
return {};
.
#56:18
"iassoc(target,list[,index]) returns the index of the first element of `list' whose own index-th element is target.  Index defaults to 1.";
"returns 0 if no such element is found.";
target = args[1];
indx = {@args, 1}[3];
i = 1;
for lsti in (args[2])
if (lsti[indx] == target)
"... do this test first since it's the most likely to fail; this needs -d";
if ((typeof(lsti) == LIST) && (length(lsti) >= indx))
return i;
endif
endif
i = (i + 1);
endfor
return 0;
.
#56:19
"iassoc(target,list[,index]) returns the index of the first element of `list' whose own index-th element is target.  Index defaults to 1.";
"returns 0 if no such element is found.";
"suspends as needed.";
set_task_perms(caller_perms());
target = args[1];
indx = {@args, 1}[3];
i = 1;
for lsti in (args[2])
if (lsti[indx] == target)
"... do this test first since it's the most likely to fail; this needs -d";
if ((typeof(lsti) == LIST) && (length(lsti) >= indx))
return i;
endif
endif
i = (i + 1);
$command_utils:suspend_if_needed(1);
endfor
return 0;
.
#56:20
"assoc_prefix(target,list[,index]) returns the first element of `list' whose own index-th element has target as a prefix.  Index defaults to 1.";
target = args[1];
indx = ((length(args) >= 3) ? args[3] | 1);
for t in (args[2])
if ((typeof(t) == LIST) && ((length(t) >= indx) && (index(t[indx], target) == 1)))
return t;
endif
endfor
return {};
.
#56:21
"iassoc_prefix(target,list[,index]) returns the index of the first element of `list' whose own index-th element has target as a prefix.  Index defaults to 1.";
target = args[1];
indx = ((length(args) >= 3) ? args[3] | 1);
for i in [1..length(lst = args[2])]
if ((typeof(lsti = lst[i]) == LIST) && ((length(lsti) >= indx) && (index(lsti[indx], target) == 1)))
return i;
endif
endfor
return 0;
.
#56:22
"iassoc_sorted(target,sortedlist[,i]) => index of last element in sortedlist whose own i-th element is <= target.  i defaults to 1.";
"  sortedlist is assumed to be sorted in increasing order and the number returned is anywhere from 0 to length(sortedlist), inclusive.";
target = args[1];
indx = {@args, 1}[3];
if ((r = length(lst = args[2])) < 25)
for l in [1..r]
if (target < lst[l][indx])
return l - 1;
endif
endfor
return r;
else
l = 0;
r = (r + 1);
while ((r - 1) > l)
if (target < lst[i = ((r + l) / 2)][indx])
r = i;
else
l = i;
endif
endwhile
return l;
endif
.
#56:23
":sort_alist(alist[,n]) sorts a list of tuples by n-th (1st) element.";
if ((alist_length = length(alist = args[1])) < 25)
"use insertion sort on short lists";
return this:sort(alist, this:slice(@args));
endif
sort_on = {@args, 1}[2];
left_index = (alist_length / 2);
right_index = ((alist_length + 1) / 2);
left_sublist = this:sort_alist(alist[1..left_index], sort_on);
right_sublist = this:sort_alist(alist[left_index + 1..alist_length], sort_on);
"...";
"... merge ...";
"...";
left_key = left_sublist[left_index][sort_on];
right_key = right_sublist[right_index][sort_on];
if (left_key > right_key)
merged_list = {};
else
"... alist_length >= 25 implies right_index >= 2...";
"... move right_index downward until left_key > right_key...";
r = (right_index - 1);
while (left_key <= (right_key = right_sublist[r][sort_on]))
if (r = (r - 1))
else
return {@left_sublist, @right_sublist};
endif
endwhile
merged_list = right_sublist[r + 1..right_index];
right_index = r;
endif
while (l = (left_index - 1))
"... left_key > right_key ...";
"... move left_index downward until left_key <= right_key...";
while ((left_key = left_sublist[l][sort_on]) > right_key)
if (l = (l - 1))
else
return {@right_sublist[1..right_index], @left_sublist[1..left_index], @merged_list};
endif
endwhile
merged_list[1..0] = left_sublist[l + 1..left_index];
left_index = l;
"... left_key <= right_key ...";
if (r = (right_index - 1))
"... move right_index downward until left_key > right_key...";
while (left_key <= (right_key = right_sublist[r][sort_on]))
if (r = (r - 1))
else
return {@left_sublist[1..left_index], @right_sublist[1..right_index], @merged_list};
endif
endwhile
merged_list[1..0] = right_sublist[r + 1..right_index];
right_index = r;
else
return {@left_sublist[1..left_index], right_sublist[1], @merged_list};
endif
endwhile
return {@right_sublist[1..right_index], left_sublist[1], @merged_list};
.
#56:24
"sort_alist_suspended(interval,alist[,n]) sorts a list of tuples by n-th element.  n defaults to 1.  Calls suspend(interval) as necessary.";
set_task_perms(caller_perms());
"... so it can be killed...";
interval = args[1];
if ((alist_length = length(alist = args[2])) < 10)
"insertion sort on short lists";
$command_utils:suspend_if_needed(interval);
return this:sort(alist, this:slice(@listdelete(args, 1)));
endif
"variables specially expanded for the anal-retentive";
sort_on = {@args, 1}[3];
left_index = (alist_length / 2);
right_index = ((alist_length + 1) / 2);
left_sublist = this:sort_alist_suspended(interval, alist[1..left_index], sort_on);
right_sublist = this:sort_alist_suspended(interval, alist[left_index + 1..alist_length], sort_on);
left_element = left_sublist[left_index];
right_element = right_sublist[right_index];
merged_list = {};
while (1)
$command_utils:suspend_if_needed(interval);
if (left_element[sort_on] > right_element[sort_on])
merged_list = {left_element, @merged_list};
if (left_index = (left_index - 1))
left_element = left_sublist[left_index];
else
return {@right_sublist[1..right_index], @merged_list};
endif
else
merged_list = {right_element, @merged_list};
if (right_index = (right_index - 1))
right_element = right_sublist[right_index];
else
return {@left_sublist[1..left_index], @merged_list};
endif
endif
endwhile
.
#56:25
":randomly_permute(list) => list with its elements randomly permuted";
"  each of the length(list)! possible permutations is equally likely";
plist = {};
for i in [1..length(ulist = args[1])]
plist = listinsert(plist, ulist[i], random(i));
endfor
return plist;
.
#56:26
"$list_utils:count(item, list)";
"Returns the number of occurrences of item in list.";
if (length(args) != 2)
return E_ARGS;
elseif (typeof(xlist = args[2]) != LIST)
return E_INVARG;
endif
x = args[1];
counter = 0;
for elt in (xlist)
if (x == elt)
counter = (counter + 1);
endif
endfor
return counter;
.
#56:27
"Copied from $quinn_utils (#34283):unroll by Quinn (#19845) Mon Mar  8 09:29:03 1993 PST";
":flatten(LIST list_of_lists) => LIST of all lists in given list `flattened'";
newlist = {};
for elm in (args[1])
if (typeof(elm) == LIST)
newlist = {@newlist, @this:flatten(elm)};
else
newlist = {@newlist, elm};
endif
endfor
return newlist;
.
#56:28
"Copied from APHiD (#33119):longest Sun May  9 21:00:18 1993 PDT";
"$list_utils:longest(<list>)";
"$list_utils:shortest(<list>)";
"             - Returns the shortest or longest element in the list.  Elements may be either strings or lists.";
if (typeof(all = args[1]) != LIST)
return E_TYPE;
else
result = all[1];
for things in (all)
if ((typeof(things) != LIST) && (typeof(things) != STR))
return E_TYPE;
else
result = ((((verb == "longest") && (length(result) < length(things))) || ((verb == "shortest") && (length(result) > length(things)))) ? things | result);
endif
endfor
endif
return result;
.
#56:29
"check_nonstring_tell_lines(lines)";
if (caller_perms().wizard)
"don't let a nonwizard mess up our stats";
for line in (args[1])
if (typeof(line) != STR)
this.nonstring_tell_lines = listappend(this.nonstring_tell_lines, callers());
return;
endif
endfor
endif
.
#57:0
"Usage: object_match_failed(object, string)";
"Prints a message if string does not match object.  Generally used after object is derived from a :match_object(string).";
match_result = args[1];
string = args[2];
tell = ($perm_utils:controls(caller_perms(), player) ? "notify" | "tell");
if ((index(string, "#") == 1) && ($code_utils:toobj(string) != E_TYPE))
"...avoid the `I don't know which `#-2' you mean' message...";
if (!valid(match_result))
player:(tell)(tostr(string, " does not exist."));
endif
return !valid(match_result);
elseif (match_result == $nothing)
player:(tell)("You must give the name of some object.");
elseif (match_result == $failed_match)
player:(tell)(tostr("I see no \"", string, "\" here."));
elseif (match_result == $ambiguous_match)
player:(tell)(tostr("I don't know which \"", string, "\" you mean."));
elseif (!valid(match_result))
player:(tell)(tostr(match_result, " does not exist."));
else
return 0;
endif
return 1;
.
#57:1
":player_match_failed(result,string)";
"  is exactly like :object_match_failed(result,string)";
"  except that its messages are more suitable for player searches.";
":player_match_result(results,strings)";
"  handles a list of results, also presumably from $string_utils:match_player(strings), printing messages to player for *each* of the nonmatching strings.  It returns a list, an overall result (true if some string didn't match --- just like player_match_failed), followed by the list players that matched.";
"";
"An optional 3rd arg gives an identifying string to prefix to each of the nasty messages.";
if (valid(player))
tell = ($perm_utils:controls(caller_perms(), player) ? "notify" | "tell");
plyr = player;
else
tell = "notify";
plyr = $login;
endif
"...";
match_results = args[1];
strings = args[2];
cmdid = ({@args, ""}[3] || "");
pmf = (verb == "player_match_failed");
if (typeof(match_results) == OBJ)
match_results = {match_results};
strings = {strings};
endif
pset = {};
bombed = 0;
for i in [1..length(match_results)]
if (valid(result = match_results[i]))
pset = setadd(pset, match_results[i]);
elseif (result == $nothing)
"... player_match_result quietly skips over blank strings";
if (pmf)
plyr:(tell)("You must give the name of some player.");
bombed = 1;
endif
elseif (result == $failed_match)
plyr:(tell)(tostr(cmdid, "\"", strings[i], "\" is not the name of any player."));
bombed = 1;
elseif (result == $ambiguous_match)
lst = $player_db:find_all(strings[i]);
plyr:(tell)(tostr(cmdid, "\"", strings[i], "\" could refer to ", (length(lst) > 20) ? tostr("any of ", length(lst), " players") | $string_utils:english_list($list_utils:map_arg(2, $string_utils, "pronoun_sub", "%n (%#)", lst), "no one", " or "), "."));
bombed = 1;
else
plyr:(tell)(tostr(result, " does not exist."));
bombed = 1;
endif
endfor
return pmf ? bombed | {bombed, @pset};
.
#57:2
"$command_utils:read() -- read a line of input from the player and return it";
"Optional argument is a prompt portion to replace `a line of input' in the prompt.";
"";
"Returns E_PERM if the current task is not a command task that has never called suspend().";
if (args && (typeof(args[1]) == STR))
prompt = args[1];
else
prompt = "a line of input";
endif
c = callers();
p = c[length(c)][5];
p:notify(tostr("[Type ", prompt, " or `@abort' to abort the command.]"));
ans = read();
if (typeof(ans) == ERR)
return ans;
elseif ($string_utils:trim(ans) == "@abort")
p:notify(">> Command Aborted <<");
kill_task(task_id());
else
return ans;
endif
.
#57:3
"$command_utils:read_lines() -- read zero or more lines of input";
"";
"Returns a list of strings, the lines typed by the player.  Returns E_PERM if the current task is not a command task that has never called suspend().";
"In order that one may enter arbitrary lines, including \"@abort\" or \".\", if the first character in an input line is `.' and there is some nonwhitespace afterwords, the `.' is dropped and the rest of the line is taken verbatim, so that, e.g., \".@abort\" enters as \"@abort\" and \"..\" enters as \".\".";
c = callers();
p = c[length(c)][5];
p:notify("[Type lines of input; use `.' to end or `@abort' to abort the command.]");
ans = {};
while (1)
if (typeof(line = read()) == ERR)
return line;
elseif ((line[1..min(6, length(line))] == "@abort") && ((tail = line[7..length(line)]) == $string_utils:space(tail)))
p:notify(">> Command Aborted <<");
kill_task(task_id());
elseif ((!line) || (line[1] != "."))
ans = {@ans, line};
elseif ((tail = line[2..length(line)]) == $string_utils:space(tail))
return ans;
else
ans = {@ans, tail};
endif
endwhile
.
#57:4
":yes-or-no([prompt]) -- prompts the player for a yes or no answer and returns a true value iff the player enters a line of input that is some prefix of \"yes\"";
"";
"Returns E_NONE if the player enters a blank line, E_INVARG, if the player enters something that isn't a prefix of \"yes\" or \"no\", and E_PERM if the current task is not a command task that has never called suspend().";
c = callers();
p = c[length(c)][5];
p:notify(tostr(args ? args[1] + " " | "", "[Enter `yes' or `no']"));
ans = read(@((caller == p) || $perm_utils:controls(caller_perms(), p)) ? {p} | {});
if (typeof(ans) == ERR)
return ans;
elseif (ans = $string_utils:trim(ans))
if (ans == "@abort")
p:notify(">> Command Aborted <<");
kill_task(task_id());
endif
return (index("yes", ans) == 1) || ((index("no", ans) != 1) && E_INVARG);
else
return E_NONE;
endif
.
#57:5
"$command_utils:read_lines_escape(escapes[,help]) -- read zero or more lines of input";
"";
"Similar to :read_lines() except that help is available and one may specify other escape sequences to terminate the read.";
"  escapes should be either a string or list of strings; this specifies which inputs other from `.' or `@abort' should terminate the read (... don't use anything beginning with a `.').";
"  help should be a string or list of strings to be printed in response to the player typing `?'; the first line of the help text should be a general comment about what the input text should be used for.  Successive lines should describe the effects of the alternative escapes.";
"Returns {end,list-of-strings-input} where end is the particular line that terminated this input or 0 if input terminated normally with `.'.  Returns E_PERM if the current task is not a command task that has never called suspend().  ";
"@abort and lines beginning with `.' are treated exactly as with :read_lines()";
c = callers();
p = c[length(c)][5];
escapes = {".", "@abort", @(typeof(args[1]) == LIST) ? args[1] | {args[1]}};
p:notify(tostr("[Type lines of input; `?' for help; end with `", $string_utils:english_list(escapes, "", "' or `", "', `", ""), "'.]"));
ans = {};
escapes[1..0] = {"?"};
"... set up the help text...";
help = {@args, "You are currently in a read loop."}[2];
if (typeof(help) != LIST)
help = {help};
endif
help[2..1] = {"Type `.' on a line by itself to finish.", "Anything else with a leading period is entered with the period removed.", "Type `@abort' to abort the command completely."};
while (typeof(line = read()) != ERR)
if ((trimline = $string_utils:trimr(line)) in escapes)
if (trimline == ".")
return {0, ans};
elseif (trimline == "@abort")
p:notify(">> Command Aborted <<");
kill_task(task_id());
elseif (trimline == "?")
p:notify_lines(help);
else
return {trimline, ans};
endif
else
if (line && (line[1] == "."))
line[1..1] = "";
endif
ans = {@ans, line};
endif
endwhile
return line;
.
#57:6
"Suspend, using output_delimiters() in case a client needs to keep track";
"of the output of the current command.";
"Args are TIME, amount of time to suspend, and optional (misnamed) OUTPUT.";
"If given no OUTPUT, just do a suspend.";
"If OUTPUT is neither list nor string, suspend and return output_delimiters";
"If OUTPUT is a list, it should be in the output_delimiters() format:";
"  {PREFIX, SUFFIX}.  Use these to handle that client stuff.";
"If OUTPUT is a string, it should be SUFFIX (output_delimiters[2])";
"";
"Proper usage:";
"The first time you want to suspend, use";
"  output_delimiters = $command_utils:suspend(time, x);";
"where x is some non-zero number.";
"Following, use";
"  $command_utils:suspend(time, output_delimiters);";
"To wrap things up, use";
"  $command_utils:suspend(time, output_delimiters[2]);";
"You'll probably want time == 0 most of the time.";
"Note: Using this from verbs called by other verbs could get pretty weird.";
set_task_perms(caller_perms());
time = args[1];
output = ((length(args) == 2) && args[2]);
if (!output)
suspend(time);
else
if (typeof(output) == LIST)
PREFIX = output[1];
SUFFIX = output[2];
if (PREFIX)
player:tell(output[2]);
endif
suspend(time);
if (SUFFIX)
player:tell(output[1]);
endif
elseif (typeof(output) == STR)
if (output)
player:tell(output);
endif
else
output = output_delimiters(player);
suspend(time);
if (output != {"", ""})
player:tell(output[1]);
endif
return output;
endif
endif
.
#57:7
"Return true if we're running out of ticks or seconds.";
return (seconds_left() < 2) || (ticks_left() < 4000);
.
#57:8
"Usage:  $command_utils:suspend_if_needed(<time>[, @<announcement>])";
"See if we're running out of ticks or seconds, and if so suspend(<time>) and return true.  If more than one arg is given, print the remainder with player:tell.";
if (this:running_out_of_time())
" && valid(player)) -- taking check out for now ";
if (ann = listdelete(args, 1))
player:tell(@ann);
endif
data = {task_id(), callers()};
this:suspend_database_add(data);
set_task_perms(caller_perms());
suspend(args[1]);
this:suspend_database_remove(data);
return 1;
endif
.
#57:9
":dump_lines(text) => text `.'-quoted for :read_lines()";
"  text is assumed to be a list of strings";
"Returns a corresponding list of strings which, when read via :read_lines, ";
"produces the original list of strings (essentially, any strings beginning ";
"with a period \".\" have the period doubled).";
"The list returned includes a final \".\"";
text = args[1];
newtext = {};
i = (lasti = 0);
for line in (text)
if (line && (line[1] == "."))
newtext = {@newtext, @(i > lasti) ? text[lasti + 1..i] | {}, "." + line};
lasti = (i = (i + 1));
else
i = (i + 1);
endif
endfor
return {@newtext, @(i > lasti) ? text[lasti + 1..i] | {}, "."};
.
#57:10
":explain_syntax(here,verb,args)";
verb = args[2];
for x in ({player, args[1], @valid(dobj) ? {dobj} | {}, @valid(iobj) ? {iobj} | {}})
what = x;
while (hv = $object_utils:has_verb(what, verb))
what = hv[1];
i = 0;
while (0 <= (i = $code_utils:find_verb_named(what, verb, i)))
if (evs = $code_utils:explain_verb_syntax(x, verb, @verb_args(what, tostr(i))))
player:tell("Try this instead:  ", evs);
return 1;
endif
i = (i + 1);
endwhile
what = parent(what);
endwhile
endfor
return 0;
.
#57:11
":do_huh(verb,args)  what :huh should do by default.";
set_task_perms(cp = caller_perms());
verb = args[1];
args = args[2];
notify = ($perm_utils:controls(cp, player) ? "notify" | "tell");
if (player:my_huh(verb, args))
"... the player found something funky to do ...";
elseif (caller:here_huh(verb, args))
"... the room found something funky to do ...";
elseif (player:last_huh(verb, args))
"... player's second round found something to do ...";
elseif (dobj == $ambiguous_match)
if (iobj == $ambiguous_match)
player:(notify)(tostr("I don't understand that (\"", dobjstr, "\" and \"", iobjstr, "\" are both ambiguous names)."));
else
player:(notify)(tostr("I don't understand that (\"", dobjstr, "\" is an ambiguous name)."));
endif
elseif (iobj == $ambiguous_match)
player:(notify)(tostr("I don't understand that (\"", iobjstr, "\" is an ambiguous name)."));
else
player:(notify)("I don't understand that.");
player:my_explain_syntax(caller, verb, args) || (caller:here_explain_syntax(caller, verb, args) || this:explain_syntax(caller, verb, args));
endif
.
#57:12
if (caller == this)
this.suspend_database = setadd(this.suspend_database, args[1]);
endif
.
#57:13
if (caller == this)
this.suspend_database = setremove(this.suspend_database, args[1]);
endif
.
#57:14
if (caller_perms().wizard)
q = $list_utils:slice(queued_tasks(), 1);
newdb = {};
for x in (this.suspend_database)
if (x[1] in q)
newdb = {@newdb, x};
endif
endfor
this.suspend_database = newdb;
else
return E_PERM;
endif
.
#57:15
"task_info(task id)";
"Return info (the same info supplied by queued_tasks()) about a given task id, or E_INVARG if there's no such task queued.";
"WIZARDLY";
set_task_perms(caller_perms());
tasks = queued_tasks();
task_id = args[1];
for task in (tasks)
if (task[1] == task_id)
return task;
endif
endfor
return E_INVARG;
.
#57:16
this:suspend_database_cleanup();
who = caller_perms();
for x in (this.suspend_database)
if (who.wizard || (x[2][1][3] == who))
player:tell(x[1]);
for y in (x[2])
player:tell("   ", $string_utils:print(y));
endfor
endif
endfor
.
#57:17
if (caller_perms().wizard)
this.suspend_database = {};
endif
.
#58:0
if ((!player.wizard) || (player != this))
player:notify("Sorry.");
return;
endif
set_task_perms(player);
args = setremove(args, "to");
if ((length(args) != 2) || (!args[2]))
player:notify(tostr("Usage:  ", verb, " <object-or-property-or-verb> <owner>"));
return;
endif
what = args[1];
owner = $string_utils:match_player(args[2]);
if ($command_utils:player_match_result(owner, args[2])[1])
elseif (index(what, ".") && (spec = $code_utils:parse_propref(what)))
object = this:my_match_object(spec[1]);
if (!$command_utils:object_match_failed(object, spec[1]))
pname = spec[2];
e = $wiz_utils:set_property_owner(object, pname, owner);
if (e == E_NONE)
player:notify("+c Property owner set.  Did you really want to do that?");
else
player:notify(tostr(e && "Property owner set."));
endif
endif
elseif (spec = $code_utils:parse_verbref(what))
object = this:my_match_object(spec[1]);
if (!$command_utils:object_match_failed(object, spec[1]))
vname = spec[2];
info = verb_info(object, vname);
if (info == E_VERBNF)
player:notify("That object does not define that verb.");
elseif (typeof(info) == ERR)
player:notify(tostr(info));
else
result = set_verb_info(object, vname, listset(info, owner, 1));
if (typeof(result) == ERR)
player:notify(tostr(result));
else
player:notify("Verb owner set.");
endif
endif
endif
else
object = this:my_match_object(what);
if (!$command_utils:object_match_failed(object, what))
player:notify(tostr($wiz_utils:set_owner(object, owner) && "Object ownership changed."));
endif
endif
.
#58:1
if ((length(args) == 1) && (argstr[1] == "\""))
argstr = args[1];
endif
for person in (connected_players())
if (person != player)
person:notify(tostr(player.name, " shouts, \"", argstr, "\""));
endif
endfor
player:notify(tostr("You shout, \"", argstr, "\""));
.
#58:2
"@grant <object> to <player>";
"@grants <object> to <player>   --- same as @grant but may suspend.";
"@transfer <expression> to <player> -- like 'grant', but evalutes a possible list of objects to transfer, and modifies quota.";
"Ownership of the object changes as in @chown and :set_owner (i.e., .owner and all c properties change).  In addition all verbs and !c properties owned by the original owner change ownership as well.  Finally, for !c properties, instances on descendant objects change ownership (as in :set_property_owner).";
if ((!player.wizard) || (player != this))
player:notify("Sorry.");
return;
endif
set_task_perms(player);
if ((!iobjstr) || (!dobjstr))
return player:notify(tostr("Usage:  ", verb, " <object> to <player>"));
endif
if ($command_utils:player_match_failed(newowner = $string_utils:match_player(iobjstr), iobjstr))
"...newowner is bogus...";
return;
endif
if (verb == "@transfer")
objlist = player:eval_cmd_string(dobjstr, 0);
if (!objlist[1])
player:notify(tostr("Had trouble reading `", dobjstr, "': "));
player:notify_lines(@objlist[2]);
return;
elseif (typeof(objlist[2]) == OBJ)
objlist = objlist[2..2];
elseif (typeof(objlist[2]) != LIST)
player:notify(tostr("Value of `", dobjstr, "' is not an object or list:  ", $string_utils:print(objlist[2])));
return;
else
objlist = objlist[2];
endif
elseif ($command_utils:object_match_failed(object = this:my_match_object(dobjstr), dobjstr))
"...object is bogus...";
return;
else
objlist = {object};
endif
if ((verb == "@transfer") && (newowner.ownership_quota < length(objlist)))
player:tell("Sorry, ", $string_utils:nn(newowner), " doesn't have enough quota.");
return;
endif
suspendok = (verb != "@grant");
player:tell("Transfering ", $string_utils:print(objlist), " to ", $string_utils:nn(newowner));
for object in (objlist)
$command_utils:suspend_if_needed(0);
same = (object.owner == newowner);
for vnum in [0..length(verbs(object)) - 1]
verb = tostr(vnum);
info = verb_info(object, verb);
if (!((info[1] != object.owner) && (valid(info[1]) && is_player(info[1]))))
same = (same && (info[1] == newowner));
set_verb_info(object, verb, listset(info, newowner, 1));
endif
endfor
for prop in (properties(object))
if (suspendok && ((ticks_left() < 5000) || (seconds_left() < 2)))
suspend(0);
endif
info = property_info(object, prop);
if (!(index(info[2], "c") || (((info[1] != object.owner) && valid(info[1])) && is_player(info[1]))))
same = (same && (info[1] == newowner));
$wiz_utils:set_property_owner(object, prop, newowner, suspendok);
endif
endfor
if (suspendok)
suspend(0);
endif
$wiz_utils:set_owner(object, newowner, suspendok);
if (same)
player:notify(tostr(newowner.name, " already owns everything ", newowner.ps, " is entitled to on ", object.name, "."));
else
player:notify(tostr("Ownership changed on ", $string_utils:nn(object), ", verb, properties and descendants' properties."));
endif
endfor
.
#58:3
set_task_perms(player);
dobj = $string_utils:match_player(dobjstr);
if (dobj == $nothing)
player:notify(tostr("Usage:  ", verb, " <playername>"));
elseif ($command_utils:player_match_result(dobj, dobjstr)[1])
elseif ((dobj.description == $player.description) && (!$command_utils:yes_or_no($string_utils:pronoun_sub("@Programmer %d despite %[dpp] lack of description?"))))
player:notify(tostr("Okay, leaving ", dobj.name, " !programmer."));
return;
elseif (result = $wiz_utils:set_programmer(dobj))
player:notify(tostr(dobj.name, " is now a programmer.  ", dobj.ppc, " quota is currently ", dobj.ownership_quota, "."));
player:notify(tostr(dobj.name, " and the other wizards have been notified."));
if (msg = this:programmer_victim_msg())
dobj:notify(msg);
endif
if ($object_utils:isa(dobj.location, $room) && (msg = this:programmer_msg()))
dobj.location:announce_all_but({dobj}, msg);
endif
elseif (result == E_NONE)
player:notify(tostr(dobj.name, " (", dobj, ") is already a programmer..."));
else
player:notify(tostr(result));
endif
.
#58:4
if (!player.wizard)
player:notify("Nice try, but permission denied.");
return;
elseif (args == {})
player:notify(tostr("Continuing with this command will destroy all but the central core of the database.  If you're really sure that you want to do this, type '", verb, " ", tonum(o = create(#1)), "' now."));
recycle(o);
return;
elseif (toobj(tonum(args[1])) != max_object())
player:notify(tostr("Nice try, but you mistyped the self-destruct password.  Type '", verb, "' again to get a new password."));
return;
elseif (verb_info($wiz, verb)[1] != player)
player:notify("Sorry, but you must own this verb in order to use it.");
return;
endif
"----------------------------------------";
player:notify("Blowing away $local...");
$local = #-1;
"----------------------------------------";
player:notify("Identifying objects to be saved...");
saved = {#0, player};
saved_props = {};
for p in (properties(#0))
v = #0.(p);
if ((typeof(v) == OBJ) && valid(v))
saved = setadd(saved, v);
saved_props = {@saved_props, p};
endif
endfor
for o in (saved)
"Also save non-$ objects that are ancestors of $ objects";
"but leave out non-$ player classes";
if (!$object_utils:isa(o, $player))
p = parent(o);
while (valid(p))
saved = setadd(saved, p);
p = parent(p);
endwhile
endif
endfor
$player_class = $player;
"----------------------------------------";
player:notify("Killing all queued tasks ...");
for t in (queued_tasks())
kill_task(t[1]);
endfor
"----------------------------------------";
player:notify("Stripping you of any personal verbs and/or properties ...");
suspend(0);
for i in [1..length(verbs(player))]
delete_verb(player, "0");
endfor
for p in (properties(player))
delete_property(player, p);
endfor
chparent(player, $wiz);
for p in ($object_utils:all_properties(player))
player.(p) = $wiz.(p);
endfor
player.name = "Wizard";
player.aliases = {"Wizard"};
player.description = "";
player.key = 0;
player.ownership_quota = 100;
player.password = 0;
$gender_utils:set(player, "neuter");
"----------------------------------------";
suspend(0);
player:notify("Making you or $hacker the owner of every saved object, verb and property ...");
for i in [1..length(saved)]
if ($command_utils:running_out_of_time())
suspend(0);
player:notify(tostr("... finished ", i - 1, " out of ", length(saved), " saved objects ..."));
endif
o = saved[i];
if (valid(o.owner) && o.owner.wizard)
o.owner = player;
else
o.owner = $hacker;
endif
old_verbs = {};
for j in [0..length(verbs(o)) - 1]
if ((seconds_left() < 2) || (ticks_left() < 2000))
suspend(0);
player:notify(tostr("... finished ", i - 1, " out of ", length(saved), " saved objects ..."));
endif
vname = tostr(j);
info = verb_info(o, vname);
if (valid(info[1]) && info[1].wizard)
info = listset(info, player, 1);
else
info = listset(info, $hacker, 1);
endif
set_verb_info(o, vname, info);
if (index(info[3], "(old)"))
old_verbs = {vname, @old_verbs};
endif
endfor
for vname in (old_verbs)
delete_verb(o, vname);
endfor
for p in ($object_utils:all_properties(o))
if ((seconds_left() < 2) || (ticks_left() < 2000))
suspend(0);
player:notify(tostr("... finished ", i - 1, " out of ", length(saved), " saved objects ..."));
endif
info = property_info(o, p);
if (valid(info[1]) && info[1].wizard)
info = listset(info, player, 1);
else
info = listset(info, $hacker, 1);
endif
set_property_info(o, p, info);
endfor
endfor
"----------------------------------------";
player:notify("Removing all unsaved :recycle and :exitfunc verbs ...");
for i in [0..tonum(max_object())]
o = toobj(i);
if (i && ((i % 1000) == 0))
player:notify(tostr("... ", o));
endif
$command_utils:suspend_if_needed(0);
if (valid(o) && (!(o in saved)))
for v in ({"recycle", "exitfunc"})
while ((hv = $object_utils:has_verb(o, v)) && (hv[1] == o))
delete_verb(o, v);
endwhile
endfor
endif
endfor
"----------------------------------------";
player:notify("Recycling unsaved objects ...");
add_property(this, "mcd_pos", 0, {player, "r"});
suspend(0);
this:mcd_2(saved, saved_props);
.
#58:5
if (!player.wizard)
player:notify("Sorry.");
return;
elseif ($code_utils:task_valid($shutdown_task))
player:notify("Shutdown already in progress.");
return;
endif
if (s = match(argstr, "^in +%([0-9]+%) +"))
bounds = s[3][1];
delay = tonum(argstr[bounds[1]..bounds[2]]);
argstr = argstr[s[2] + 1..length(argstr)];
else
delay = 2;
endif
if (!$command_utils:yes_or_no(tostr("Do you really want to shut down the server in ", delay, " minutes?")))
player:notify("Aborted.");
return;
endif
announce_times = {};
if (delay > 0)
while (delay > 0)
announce_times = {@announce_times, delay * 60};
delay = (delay / 2);
endwhile
announce_times = {@announce_times, 30, 10};
$shutdown_time = (time() + announce_times[1]);
endif
$shutdown_message = tostr(player.name, " (", player, "): ", argstr);
$shutdown_task = task_id();
for i in [1..length(announce_times)]
msg = tostr("*** The server will be shut down by ", player.name, " (", player, ") in ", $time_utils:english_time(announce_times[i]), ": ", argstr, " ***");
"...use raw notify() since :notify() verb could be broken...";
for p in (connected_players())
notify(p, msg);
endfor
suspend(announce_times[i] - {@announce_times, 0}[i + 1]);
endfor
for p in (connected_players())
notify(p, tostr("*** Server shutdown by ", player.name, " (", player, "): ", argstr, " ***"));
boot_player(p);
endfor
suspend(0);
$shutdown_task = E_NONE;
set_task_perms(player);
shutdown(argstr);
.
#58:6
set_task_perms(player);
dump_database();
player:notify("Dumping...");
.
#58:7
set_task_perms(player);
if (argstr[1] != ":")
argstr = (":" + argstr);
endif
player:notify(tostr("Searching for verbs that appear to call ", argstr, " ..."));
player:notify("");
$code_utils:find_verbs_containing(argstr + "(");
.
#58:8
if (!caller_perms().wizard)
return;
elseif (!("mcd_pos" in properties(this)))
return;
endif
start = this.mcd_pos;
saved = args[1];
saved_props = args[2];
player:notify(tostr("*** Recycling from #", start, " ..."));
suspend(0);
fork (0)
this:mcd_2(saved, saved_props);
endfork
for i in [start..tonum(max_object())]
this.mcd_pos = i;
o = toobj(i);
if ($command_utils:running_out_of_time())
return;
endif
if (valid(o) && (!(o in saved)))
for x in (o.contents)
move(x, #-1);
endfor
recycle(o);
endif
endfor
delete_property(this, "mcd_pos");
"----------------------------------------";
suspend(0);
player:notify("Killing queued tasks ...");
for t in (queued_tasks())
kill_task(t[1]);
endfor
"----------------------------------------";
player:notify("Compacting object numbers ...");
alist = {};
for p in (saved_props)
$command_utils:suspend_if_needed(0);
if (pair = $list_utils:assoc(#0.(p), alist))
#0.(p) = pair[2];
elseif (#0.(p) != player)
old = #0.(p);
#0.(p) = renumber(#0.(p));
alist = {@alist, {old, #0.(p)}};
endif
endfor
for o in (saved)
if (valid(o) && (o != player))
renumber(o);
endif
endfor
reset_max_object();
"----------------------------------------";
player:notify("Performing miscellaneous cleanups ...");
for i in [0..tonum(max_object())]
$command_utils:suspend_if_needed(0);
o = toobj(i);
move(o, ((o == player) || (o == $news)) ? $player_start | #-1);
if ($object_utils:has_callable_verb(o, "init_for_core"))
o:init_for_core();
endif
endfor
player:notify("Core database extraction is complete.  Type @shutdown to save it.");
.
#58:9
"@toad[!][!] <player> [blacklist|redlist|graylist] [commentary]";
whostr = args[1];
comment = $string_utils:first_word(argstr)[2];
if (verb == "@toad!!")
listname = "redlist";
elseif (verb == "@toad!")
listname = "blacklist";
elseif ((ln = {@args, ""}[2]) && (index(listname = $login:listname(ln), ln) == 1))
"...first word of coment is one of the magic words...";
comment = $string_utils:first_word(comment)[2];
else
listname = "";
endif
if ((!player.wizard) || (player != this))
player:notify("Yeah, right... you wish.");
return;
elseif ($command_utils:player_match_failed(who = $string_utils:match_player(whostr), whostr))
return;
elseif (((whostr != who.name) && (!(whostr in who.aliases))) && (whostr != tostr(who)))
player:notify(tostr("Must be a full name or an object number:  ", who.name, "(", who, ")"));
return;
elseif (who == player)
player:notify("If you want to toad yourself, you have to do it by hand.");
return;
endif
dobj = who;
if (msg = player:toad_victim_msg())
notify(who, msg);
endif
if ($wiz_utils:rename_all_instances(who, "disfunc", "toad_disfunc"))
player:notify(tostr(who, ":disfunc renamed."));
endif
if ($wiz_utils:rename_all_instances(who, "recycle", "toad_recycle"))
player:notify(tostr(who, ":recycle renamed."));
endif
e = $wiz_utils:unset_player(who, $hacker);
player:notify(e ? tostr(who.name, "(", who, ") is now a toad.") | tostr(e));
if (e && ($object_utils:isa(who.location, $room) && (msg = player:toad_msg())))
who.location:announce_all_but({who}, msg);
endif
if (listname && (!$login:(listname + "ed")(cname = $string_utils:connection_hostname(who.last_connect_place))))
$login:(listname + "_add")(cname);
player:notify(tostr("Site ", cname, " ", listname, "ed."));
else
cname = "";
endif
$mail_agent:send_message(player, $toad_log, tostr("@toad ", who.name, " (", who, ")"), {$string_utils:from_list(who.all_connect_places, " "), @cname ? {$string_utils:capitalize(listname + "ed:  ") + cname} | {}, @comment ? {comment} | {}});
.
#58:10
"@untoad <object> [as namespec]";
"Turns object into a player.  Anything that isn't a guest is chowned to itself.";
if (!player.wizard)
player:notify("Yeah, right... you wish.");
elseif (prepstr && (prepstr != "as"))
player:notify(tostr("Usage:  ", verb, " <object> [as name,alias,alias...]"));
elseif ($command_utils:object_match_failed(dobj, dobjstr))
elseif (prepstr && (!(e = $building_utils:set_names(dobj, iobjstr))))
player:notify(tostr("Initial rename failed:  ", e));
elseif (e = $wiz_utils:set_player(dobj, g = $object_utils:isa(dobj, $guest)))
player:notify(tostr(dobj.name, "(", dobj, ") is now a ", g ? "usable guest." | "player."));
elseif (e == E_INVARG)
player:notify(tostr(dobj.name, "(", dobj, ") is not of an appropriate player class."));
player:notify("@chparent it to $player or some descendant.");
elseif (e == E_NONE)
player:notify(tostr(dobj.name, "(", dobj, ") is already a player."));
elseif (e == E_NACC)
player:notify("Wait until $player_db is finished updating...");
elseif (e == E_RECMOVE)
player:notify(tostr("The name `", dobj.name, "' is currently unavailable."));
player:notify(tostr("Try again with   ", verb, " ", dobj, " as <newname>"));
else
player:notify(tostr(e));
endif
.
#58:11
"@quota <player> is <number> [<reason>]";
"  changes a player's quota.  sends mail to the wizards.";
set_task_perms(player);
dobj = $string_utils:match_player(dobjstr);
if ($command_utils:player_match_result(dobj, dobjstr)[1])
return;
elseif (!valid(dobj))
player:notify("Set whose quota?");
return;
endif
new = tonum(qstr = iobjstr[1..(n = index(iobjstr + " ", " ")) - 1]);
reason = (iobjstr[n + 1..length(iobjstr)] || "(none)");
if (tostr(new) != qstr)
player:notify(tostr("Set ", dobj.name, "'s quota to what?"));
return;
endif
old = dobj.ownership_quota;
result = (dobj.ownership_quota = new);
if (typeof(result) == ERR)
player:notify(tostr(result));
else
player:notify(tostr(dobj.name, "'s quota set to ", new, "."));
endif
$mail_agent:send_message(player, $quota_log, tostr("@quota ", dobj.name, " (", dobj, ") ", new, " (from ", old, ")"), tostr("Reason for quota ", ((new - old) < 0) ? "decrease: " | "increase: ", reason, "."));
.
#58:12
set_task_perms(player);
"The time below is Oct. 1, 1990, roughly the birthdate of the LambdaMOO server.";
start = 654768000;
now = time();
day = ((24 * 60) * 60);
week = (7 * day);
month = (30 * day);
days_objects = (days_players = {0, 0, 0, 0, 0, 0, 0});
weeks_objects = (weeks_players = {0, 0, 0, 0});
months_objects = (months_players = {});
nonplayer_objects = (invalid_objects = 0);
always_objects = (always_players = 0);
never_objects = (never_players = 0);
numo = 0;
if (argstr)
if (((!dobjstr) && (prepstr == "with")) && (index("objects", iobjstr) == 1))
with_objects = 1;
else
player:notify(tostr("Usage:  ", verb, " [with objects]"));
return;
endif
else
with_objects = 0;
players = players();
endif
for i in [1..with_objects ? tonum(max_object()) + 1 | length(players)]
if (with_objects)
o = toobj(i - 1);
else
o = players[i];
endif
if ($command_utils:running_out_of_time())
player:notify(tostr("... ", o));
suspend(0);
endif
if (valid(o))
numo = (numo + 1);
p = (is_player(o) ? o | o.owner);
if (!valid(p))
invalid_objects = (invalid_objects + 1);
elseif (!$object_utils:isa(p, $player))
nonplayer_objects = (nonplayer_objects + 1);
else
seconds = (now - p.last_connect_time);
days = (seconds / day);
weeks = (seconds / week);
months = (seconds / month);
if (seconds < 0)
if (is_player(o))
always_players = (always_players + 1);
else
always_objects = (always_objects + 1);
endif
elseif (seconds > (now - start))
if (is_player(o))
never_players = (never_players + 1);
else
never_objects = (never_objects + 1);
endif
elseif (months > 0)
while (months > length(months_players))
months_players = {@months_players, 0};
months_objects = {@months_objects, 0};
endwhile
if (is_player(o))
months_players[months] = (months_players[months] + 1);
endif
months_objects[months] = (months_objects[months] + 1);
elseif (weeks > 0)
if (is_player(o))
weeks_players[weeks] = (weeks_players[weeks] + 1);
endif
weeks_objects[weeks] = (weeks_objects[weeks] + 1);
else
if (is_player(o))
days_players[days + 1] = (days_players[days + 1] + 1);
endif
days_objects[days + 1] = (days_objects[days + 1] + 1);
endif
endif
endif
endfor
player:notify("");
player:notify(tostr("Last connected"));
player:notify(tostr("at least this     Num.     Cumul.   Cumul. %", with_objects ? "     Num.     Cumul.   Cumul. %" | ""));
player:notify(tostr("long ago        players   players   players ", with_objects ? "   objects   objects   objects" | ""));
player:notify(tostr("---------------------------------------------", with_objects ? "--------------------------------" | ""));
su = $string_utils;
col1 = 14;
col2 = 7;
col3 = 10;
col4 = 9;
col5 = 11;
col6 = 11;
col7 = 10;
nump = length(players());
totalp = (totalo = 0);
for x in ({{days_players, days_objects, "day", 1}, {weeks_players, weeks_objects, "week", 0}, {months_players, months_objects, "month", 0}})
pcounts = x[1];
ocounts = x[2];
unit = x[3];
offset = x[4];
for i in [1..length(pcounts)]
$command_utils:suspend_if_needed(0);
j = (i - offset);
player:notify(tostr(su:left(tostr(j, " ", unit, (j == 1) ? ":" | "s:"), col1), su:right(pcounts[i], col2), su:right(totalp = (totalp + pcounts[i]), col3), su:right((totalp * 100) / nump, col4), "%", with_objects ? tostr(su:right(ocounts[i], col5), su:right(totalo = (totalo + ocounts[i]), col6), su:right((totalo * 100) / numo, col7), "%") | ""));
endfor
player:notify("");
endfor
player:notify(tostr(su:left("Never:", col1), su:right(never_players, col2), su:right(totalp = (totalp + never_players), col3), su:right((totalp * 100) / nump, col4), "%", with_objects ? tostr(su:right(never_objects, col5), su:right(totalo = (totalo + never_objects), col6), su:right((totalo * 100) / numo, col7), "%") | ""));
player:notify(tostr(su:left("Always:", col1), su:right(always_players, col2), su:right(totalp = (totalp + always_players), col3), su:right((totalp * 100) / nump, col4), "%", with_objects ? tostr(su:right(always_objects, col5), su:right(totalo = (totalo + always_objects), col6), su:right((totalo * 100) / numo, col7), "%") | ""));
with_objects && player:notify(tostr(su:left("Non-player owner:", (((col1 + col2) + col3) + col4) + 1), su:right(nonplayer_objects, col5), su:right(totalo = (totalo + nonplayer_objects), col6), su:right((totalo * 100) / numo, col7), "%"));
with_objects && player:notify(tostr(su:left("Invalid owner:", (((col1 + col2) + col3) + col4) + 1), su:right(invalid_objects, col5), su:right(totalo = (totalo + invalid_objects), col6), su:right((totalo * 100) / numo, col7), "%"));
player:notify("");
.
#58:13
"Auxiliary verb for parsing @kill soon [#-of-seconds] [player | everyone]";
"Args[1] is either # of seconds or player/everyone.";
"Args[2], if it exists, is player/everyone, and forces args[1] to have been # of seconds.";
"Return value: {# of seconds [default 60] , 1 for all, object for player.}";
set_task_perms(caller_perms());
nargs = length(args);
soon = tonum(args[1]);
if (nargs > 1)
everyone = args[2];
elseif (soon <= 0)
everyone = args[1];
else
everyone = 0;
endif
if (everyone == "everyone")
everyone = 1;
elseif (typeof(everyone) == STR)
result = $string_utils:match_player(everyone);
if ($command_utils:player_match_failed(result, everyone))
player:notify(tostr("Usage:  ", callers()[1][2], " soon [number of seconds] [\"everyone\" | player name]"));
return {-1, -1};
else
return {soon ? soon | 60, result};
endif
endif
return {soon ? soon | 60, everyone ? everyone | player};
.
#58:14
set_task_perms(player);
if (!args)
player:notify(tostr("Usage:  ", verb, " <pattern>"));
return;
endif
pattern = argstr;
regexp = (verb == "@egrepcore");
player:notify(tostr("Searching for core verbs ", regexp ? "matching the regular expression " | "containing the string ", $string_utils:print(pattern), " ..."));
player:notify("");
$code_utils:(regexp ? "find_verbs_matching" | "find_verbs_containing")(pattern, #0:core_objects());
.
#58:15
"@net-who prints all connected users and hosts.";
"@net-who player player player prints specified users and current or most recent connected host.";
"@net-who from hoststring prints all players who have connected from that host or host substring.  Substring can include *'s, e.g. @net-who from *.foo.edu.";
set_task_perms(player);
su = $string_utils;
if ((prepstr == "from") && dobjstr)
player:notify(tostr("Usage:  ", verb, " from <host string>"));
elseif (((prepstr != "from") || dobjstr) || (!iobjstr))
"Not parsing 'from' here...  Instead printing connected/recent users.";
if (!(pstrs = args))
unsorted = connected_players();
else
unsorted = listdelete($command_utils:player_match_result(su:match_player(pstrs), pstrs), 1);
endif
if (!unsorted)
return;
endif
$wiz_utils:show_netwho_listing(player, unsorted);
else
$wiz_utils:show_netwho_from_listing(player, iobjstr);
endif
.
#58:16
"Creates a player.";
"Syntax:  @make-player name email-address comments....";
"Generates a random password for the player.";
if ((!player.wizard) || callers())
return E_PERM;
endif
return $wiz_utils:do_make_player(@args);
.
#58:17
if (!player.wizard)
player:notify("Sorry.");
elseif (!$code_utils:task_valid($shutdown_task))
player:notify("No server shutdown in progress.");
$shutdown_task = E_NONE;
else
"... Reset time so that $login:check_for_shutdown shuts up...";
kill_task($shutdown_task);
$shutdown_task = E_NONE;
$shutdown_time = (time() - 1);
for p in (connected_players())
notify(p, tostr("*** Server shutdown ABORTED by ", player.name, " (", player, ")", argstr && (":  " + argstr), " ***"));
endfor
endif
.
#58:18
"This is the canonical doing-something-to-somebody message.";
"The corresponding property can either be";
"   string             msg for all occasions";
"   list of 2 strings  {we-are-there-msg,we-are-elsewhere-msg}";
m = this.(verb);
if (typeof(m) != LIST)
return $string_utils:pronoun_sub(m);
elseif ((this.location == dobj.location) || (length(m) < 2))
return $string_utils:pronoun_sub(m[1]);
else
return $string_utils:pronoun_sub(m[2]);
endif
.
#58:19
set_task_perms((caller in {this, $generic_editor, $verb_editor, $mail_editor, $note_editor}) ? this.owner | caller_perms());
return move(this, args[1]);
.
#58:20
"@newt <player> [commentary]";
"turns a player into a newt.  It can get better...";
"Installs $wiz_utils:newt_confunc on a user as :confunc.  It saves any existing :confunc the user may have as :denewt_confunc.  @denewt checks that their :confunc is the same as $wiz_utils:newt_confunc (if not it renames it to :newt_confunc and complains).  If so, it deletes it, and renames any :denewt_confunc to :confunc.";
"Sends mail to $newt_log giving .all_connect_places and commentary.";
whostr = args[1];
comment = $string_utils:first_word(argstr)[2];
if (!player.wizard)
player:notify("Yeah, right.");
elseif ($command_utils:player_match_failed(who = $string_utils:match_player(whostr), whostr))
return;
elseif (((whostr != who.name) && (!(whostr in who.aliases))) && (whostr != tostr(who)))
player:notify(tostr("Must be a full name or an object number:  ", who.name, "(", who, ")"));
return;
elseif (who == player)
player:notify("If you want to newt yourself, you have to do it by hand.");
return;
elseif ($wiz_utils:isnewt(who))
player:notify(tostr(who.name, " appears to already be a newt."));
return;
else
if ($wiz_utils:rename_all_instances(who, "confunc", "denewt_confunc"))
player:notify(tostr(who, ":confunc renamed to :denewt_confunc."));
endif
add_verb(who, {player, "x", "confunc"}, {"this", "none", "this"});
set_verb_code(who, "confunc", verb_code($wiz_utils, "newt_confunc"));
if (msg = player:newt_victim_msg())
notify(who, msg);
endif
notify(who, $login:newt_registration_string());
boot_player(who);
player:notify(tostr(who.name, " (", who, ") has been turned into a newt."));
$mail_agent:send_message(player, $newt_log, tostr("@newt ", who.name, " (", who, ")"), {$string_utils:from_list(who.all_connect_places, " "), @comment ? {comment} | {}});
if ($object_utils:isa(who.location, $room) && (msg = player:newt_msg()))
who.location:announce_all_but({who}, msg);
endif
endif
.
#58:21
"@denewt <player> [commentary]";
"Renames the player's :confunc to :newt_confunc, then checks that it is is the same as $wiz_utils:newt_confunc, if not complains.  If so, it deletes it, and renames any :denewt_confunc to :confunc.";
"Sends mail to $newt_log with commentary.";
whostr = args[1];
comment = $string_utils:first_word(argstr)[2];
if (!player.wizard)
player:notify("Yeah, right.");
elseif ($command_utils:player_match_failed(who = $string_utils:match_player(whostr), whostr))
return;
else
"Should parse email address and register user in some clever way.  Ick.";
if (!(inf = verb_info(who, "confunc")))
player:notify(tostr(who.name, " does not appear to be a newt."));
else
set_verb_info(who, "confunc", {inf[1], inf[2], "newt_confunc"});
wiz = verb_code($wiz_utils, "newt_confunc");
user = verb_code(who, "newt_confunc");
if (wiz == user)
delete_verb(who, "newt_confunc");
else
player:notify(tostr(who.name, "'s :confunc was not identical to $wiz_utils:newt_confunc.  Not automatically rmverbed.  Verify and manually @rmverb it."));
endif
if (inf = verb_info(who, "denewt_confunc"))
set_verb_info(who, "denewt_confunc", {inf[1], inf[2], "confunc"});
endif
player:notify(tostr(who.name, " (", who, ") got better."));
$mail_agent:send_message(player, $newt_log, tostr("@denewt ", who.name, " (", who, ")"), comment ? {comment} | {});
endif
endif
.
#58:22
"Registers a player.";
"Syntax:  @register name email-address [additional commentary]";
"Email-address is stored in $registration_db and on the player object.";
if (!player.wizard)
return player:tell(E_PERM);
endif
$wiz_utils:do_register(@args);
.
#58:23
"@newpassword player is [string]";
"Set's a player's password; omit string to have one randomly generated.";
"Offer to email the password.";
if (!player.wizard)
return E_PERM;
endif
$wiz_utils:do_new_password(dobjstr, iobjstr);
.
#58:24
"@log [<string>]    enters a comment in the server log.";
"If no string is given, you are prompted to enter one or more lines for an extended comment.";
set_task_perms(player);
whostr = tostr("from ", player.name, " (", player, ")");
if ((!player.wizard) || (player != caller))
player:notify("Yeah, right.");
elseif (argstr)
server_log(tostr("COMMENT: [", whostr, "]  ", argstr));
player:notify("One-line comment logged.");
elseif (lines = $command_utils:read_lines())
server_log(tostr("COMMENT: [", whostr, "]"));
for l in (lines)
server_log(l);
endfor
server_log(tostr("END_COMMENT."));
player:notify(tostr(length(lines), " lines logged as extended comment."));
endif
.
#58:25
set_task_perms(player);
n = ((dobjstr == "all") ? 0 | $code_utils:tonum(dobjstr || "20"));
if (caller != this)
player:notify("You lose.");
elseif ((n == E_TYPE) && (index("now", dobjstr) != 1))
player:notify(tostr("Usage:  ", verb, " <number>  (where <number> indicates how many entries to look at in the guest log)"));
player:notify(tostr("Usage:  ", verb, " now (to see information about currently connected guests only)"));
elseif ((!dobjstr) || (index("now", dobjstr) != 1))
$guest_log:last(n);
else
"*way* too much copied code in here from @who...  Sorry.  --yduJ";
su = $string_utils;
conn = connected_players();
unsorted = {};
for g in (children($guest))
if (g in conn)
unsorted = {@unsorted, g};
endif
endfor
if (!unsorted)
player:tell("No guests found.");
return;
endif
footnotes = {};
alist = {};
nwidth = length("Player name");
for u in (unsorted)
pref = (u.programmer ? "% " | "  ");
u.programmer && (footnotes = setadd(footnotes, "prog"));
u3 = {tostr(pref, u.name, " (", u, ")"), su:from_seconds(connected_seconds(u)), su:from_seconds(idle_seconds(u)), where = $string_utils:connection_hostname(connection_name(u))};
nwidth = max(length(u3[1]), nwidth);
if ($login:blacklisted(where))
where = ("(*) " + where);
footnotes = setadd(footnotes, "black");
elseif ($login:graylisted(where))
where = ("(+) " + where);
footnotes = setadd(footnotes, "gray");
endif
alist = {@alist, u3};
endfor
alist = $list_utils:sort_alist_suspended(0, alist, 3);
$command_utils:suspend_if_needed(0);
headers = {"Player name", "Connected", "Idle Time", "From Where"};
time_width = (length("59 minutes") + 2);
before = {0, w1 = (nwidth + 3), w2 = (w1 + time_width), w3 = (w2 + time_width)};
tell1 = ("  " + headers[1]);
tell2 = ("  " + su:space(headers[1], "-"));
for j in [2..4]
tell1 = (su:left(tell1, before[j]) + headers[j]);
tell2 = (su:left(tell2, before[j]) + su:space(headers[j], "-"));
endfor
player:notify(tell1);
player:notify(tell2);
active = 0;
for a in (alist)
$command_utils:suspend_if_needed(0);
tell1 = a[1];
for j in [2..4]
tell1 = (su:left(tell1, before[j]) + tostr(a[j]));
endfor
player:notify(tell1[1..min(length(tell1), 79)]);
endfor
if (footnotes)
player:notify("");
if ("prog" in footnotes)
player:notify(" %  == programmer.");
endif
if ("black" in footnotes)
player:notify("(*) == blacklisted site.");
endif
if ("gray" in footnotes)
player:notify("(+) == graylisted site.");
endif
endif
endif
.
#58:26
if (caller != this)
set_task_perms(valid(caller_perms()) ? caller_perms() | player);
endif
use = this.mail_identity;
if (valid(use) && (use != this))
return use:(verb)(@args);
else
return pass(@args);
endif
.
#58:27
"@[un]blacklist [<site or subnet>  [commentary]]";
"@[un]graylist  [<site or subnet>  [commentary]]";
"@[un]redlist   [<site or subnet>  [commentary]]";
"@[un]spooflist [<site of subnet>  [commentary]]";
set_task_perms(player);
if ((player != this) || (!player.wizard))
player:notify("Ummm.  no.");
return;
endif
undo = (verb[2..3] == "un");
which = $login:listname(verb[undo ? 4 | 2]);
downgrade = {"", "graylist", "blacklist"}[1 + index("br", which[1])];
if (!(fw = $string_utils:first_word(argstr)))
"... Just print the list...";
slist = {};
if (s = $login.(which)[1])
slist = {@slist, "--- Subnets ---", @s};
endif
if (s = $login.(which)[2])
slist = {@slist, "--- Domains ---", @s};
endif
player:notify_lines($string_utils:columnize(slist, 3));
return;
endif
target = fw[1];
comment = (fw[2] ? {fw[2]} | {});
if (is_literal = $site_db:domain_literal(target))
if (target[l = length(target)] == ".")
target = target[1..l - 1];
endif
fullname = ("subnet " + target);
else
if (target[1] == ".")
target[1..1] = "";
endif
fullname = (("domain `" + target) + "'");
endif
rm = {};
entrylist = $login.(which)[1 + (!is_literal)];
if ((!undo) && (target in entrylist))
player:notify(tostr(fullname, " is already ", which, "ed."));
return;
endif
entrylist = setremove(entrylist, target);
confirm = 0;
if (is_literal)
for s in (entrylist)
if ((i = index(s, target + ".")) == 1)
"... target is a prefix of s, s should probably go...";
rm = {@rm, s};
elseif (index(target + ".", s + ".") != 1)
"... s is not a prefix of target...";
elseif (undo)
player:notify(tostr("You will need to un", which, " subnet ", s, " as well."));
elseif (confirm)
player:notify(tostr("...Subnet ", s, " already ", which, "ed..."));
else
player:notify(tostr("Subnet ", s, " already ", which, "ed."));
if (!(confirm = $command_utils:yes_or_no(tostr(which, " ", target, " anyway?"))))
return;
endif
endif
endfor
else
for s in (entrylist)
if ((i = rindex(s, "." + target)) && (i == (length(s) - length(target))))
"... target is a suffix of s, s should probably go...";
rm = {@rm, s};
elseif ((!(i = rindex("." + target, "." + s))) || (i < ((length(target) - length(s)) + 1)))
"... s is not a suffix of target...";
elseif (undo)
player:notify(tostr("You will need to un", which, " domain `", s, "' as well."));
elseif (confirm)
player:notify(tostr("...Domain `", s, "' already ", which, "ed..."));
else
player:notify(tostr("Domain `", s, "' already ", which, "ed."));
if (!(confirm = $command_utils:yes_or_no(tostr(which, " ", target, " anyway?"))))
return;
endif
endif
endfor
endif
namelist = $string_utils:english_list(rm);
downgraded = {};
if (rm)
ntries = ((length(rm) == 1) ? "ntry" | "ntries");
if ($command_utils:yes_or_no(tostr("Remove e", ntries, " for ", namelist, "?")))
dg = (undo && (downgrade && $command_utils:yes_or_no(downgrade + " them?")));
for s in (rm)
$login:(which + "_remove")(s);
dg && ($login:(downgrade + "_add")(s) && (downgraded = {@downgraded, s}));
endfor
player:notify(tostr("E", ntries, " removed", @dg ? {" and ", downgrade, "ed."} | {"."}));
else
player:notify(tostr(namelist, " will continue to be ", which, "ed."));
rm = {};
endif
endif
if (downgraded)
comment[1..0] = {tostr(downgrade, "ed ", $string_utils:english_list(downgraded), ".")};
endif
if (!undo)
$login:(which + "_add")(target);
player:notify(tostr(fullname, " ", which, "ed."));
if (rm)
comment[1..0] = {tostr("Subsumes ", which, "ing for ", namelist, ".")};
endif
elseif ($login:(which + "_remove")(target))
player:notify(tostr(fullname, " un", which, "ed."));
if (downgrade && $command_utils:yes_or_no(downgrade + " it?"))
$login:(downgrade + "_add")(target) && (downgraded = {target, @downgraded});
player:notify(tostr(fullname, " ", downgrade, "ed."));
endif
if (downgraded)
comment[1..0] = {tostr(downgrade, "ed ", $string_utils:english_list(downgraded), ".")};
endif
if (rm)
comment[1..0] = {tostr("Also removed ", namelist, ".")};
endif
elseif (rm)
player:notify(tostr(fullname, " itself was never actually ", which, "ed."));
comment[1..0] = {tostr("Removed ", namelist, ".")};
else
player:notify(tostr(fullname, " was not ", which, "ed before."));
return;
endif
subject = tostr(undo ? "@un" | "@", which, " ", fullname);
$mail_agent:send_message(player, $site_log, subject, comment);
"...";
"... make sure we haven't screwed ourselves...";
uhoh = {};
for site in (player.all_connect_places)
if (index(site, target) && $login:(which + "ed")(site))
uhoh = {@uhoh, site};
endif
endfor
if (uhoh)
player:notify(tostr("WARNING:  ", $string_utils:english_list(uhoh), " are now ", which, "ed!"));
endif
.
#58:28
"Usage:  @corify <object> as <propname>";
"Adds <object> to the core, as $<propname>";
"Reminds the wizard to write an :init_for_core verb, if there isn't one already.";
if (!player.wizard)
player:tell("Sorry, the core is wizardly territory.");
endif
if (dobj == $failed_match)
dobj = player:my_match_object(dobjstr);
endif
if ($command_utils:object_match_failed(dobj, dobjstr))
return;
endif
if (!iobjstr)
player:tell("Usage:  @corify <object> as <propname>");
return;
elseif (iobjstr[1] == "$")
iobjstr = iobjstr[2..length(iobjstr)];
endif
if (typeof(e = add_property(#0, iobjstr, dobj, {player, "r"})) == ERR)
player:tell(e);
return;
endif
if (!("init_for_core" in verbs(dobj)))
player:tell(dobj:titlec(), " has no :init_for_core verb.  Strongly consider adding one before doing anything else.");
endif
.
#58:29
"Usage:  @make-guest <guestname>";
"Creates a player called <guestname>_Guest owned by $hacker and a child of $guest.";
if (!player.wizard)
player:tell("If you think this MOO needs more guests, you should contact a wizard.");
return E_PERM;
endif
if (length(args) != 1)
player:tell("Usage: ", verb, " <guest name>");
return;
endif
guestname = (args[1] + "_Guest");
guestaliases = {guestname, adj = args[1]};
if (!player.wizard)
return;
elseif ($player_db.frozen)
player:tell("Sorry, the player db is frozen, so no players can be made right now.  Please try again in a few minutes.");
return;
elseif (!$player_db:available(guestname))
player:tell("\"", guestname, "\" is not an available name.");
return;
elseif (!$player_db:available(adj))
player:Tell("\"", adj, "\" is not an available name.");
return;
else
new = create($guest, $hacker);
new:set_name(guestname);
new:set_aliases(guestaliases);
if (!(e = $wiz_utils:set_player(new, 1)))
player:Tell("Unable to make ", new.name, " (", new, ") a player.");
player:Tell(tostr(e));
else
player:Tell("Guest: ", new.name, " (", new, ") made.");
new.default_description = {"By definition, guests appear nondescript."};
new.description = new.default_description;
new.last_connect_time = $maxint;
new.last_disconnect_time = time();
new:set_gender(new.default_gender);
move(new, $player_start);
player:tell("Now don't forget to @describe ", new, " as something.");
endif
endif
.
#59:0
set_task_perms(player);
if (!player.programmer)
player:notify("You need to be a programmer to do this.");
player:notify("If you want to become a programmer, talk to a wizard.");
return;
endif
nargs = length(args);
usage = tostr("Usage:  ", verb, " <object>.<prop-name> [<init_value> [<perms> [<owner>]]]");
if ((nargs < 1) || (!(spec = $code_utils:parse_propref(args[1]))))
player:notify(usage);
return;
endif
object = player:my_match_object(spec[1]);
name = spec[2];
if ($command_utils:object_match_failed(object, spec[1]))
return;
endif
if (nargs < 2)
value = 0;
else
q = $string_utils:prefix_to_value(argstr[$string_utils:word_start(argstr)[2][1]..length(argstr)]);
if (q[1] == 0)
player:notify(tostr("Syntax error in initial value:  ", q[2]));
return;
endif
value = q[2];
args = {args[1], value, @$string_utils:words(q[1])};
nargs = length(args);
endif
perms = ((nargs < 3) ? "rc" | args[3]);
if (nargs < 4)
owner = player;
else
owner = $string_utils:match_player(args[4]);
if ($command_utils:player_match_result(owner, args[4])[1])
return;
endif
endif
if (nargs > 4)
player:notify(usage);
return;
endif
e = add_property(object, name, value, {owner, perms});
if (typeof(e) != ERR)
player:notify(tostr("Property added with value ", $string_utils:print(object.(name), 1), "."));
elseif (e != E_INVARG)
player:notify(tostr(e));
elseif ($object_utils:has_property(object, name))
player:notify(tostr("Property ", object, ".", name, " already exists."));
else
for i in [1..length(perms)]
if (!index("rcw", perms[i]))
player:notify(tostr("Unknown permission bit:  ", perms[i]));
return;
endif
endfor
"...the only other possibility...";
player:notify("Property is already defined on one or more descendents.");
player:notify(tostr("Try @check-prop ", args[1]));
endif
.
#59:1
set_task_perms(player);
if (length(args) != 2)
player:notify(tostr("Usage:  ", verb, " <object-or-property-or-verb> <permissions>"));
return;
endif
what = args[1];
perms = args[2];
if (index(what, ".") && (spec = $code_utils:parse_propref(what)))
if (valid(object = player:my_match_object(spec[1])))
pname = spec[2];
info = property_info(object, pname);
if (info == E_PROPNF)
player:notify("That object does not have that property.");
elseif (typeof(info) == ERR)
player:notify(tostr(info));
else
info[2] = (perms = $perm_utils:apply(info[2], perms));
result = set_property_info(object, pname, info);
if (result == E_INVARG)
player:notify(tostr("\"", perms, "\" is not a valid permissions string for a property."));
elseif (typeof(result) == ERR)
player:notify(tostr(result));
else
player:notify(tostr("Property permissions set to \"", perms, "\"."));
endif
endif
return;
endif
elseif (spec = $code_utils:parse_verbref(what))
if (!player.programmer)
player:notify("You need to be a programmer to do this.");
player:notify("If you want to become a programmer, talk to a wizard.");
return;
endif
if (valid(object = player:my_match_object(spec[1])))
vname = spec[2];
info = verb_info(object, vname);
if (info == E_VERBNF)
player:notify("That object does not define that verb.");
elseif (typeof(info) == ERR)
player:notify(tostr(info));
elseif (!valid(owner = info[1]))
player:notify(tostr("That verb is owned by an invalid object (", owner, "); it needs to be @chowned."));
elseif (!is_player(owner))
player:notify(tostr("That verb is owned by a non-player object (", owner.name, ", ", owner, "); it needs to be @chowned."));
else
info[2] = (perms = $perm_utils:apply(info[2], perms));
if (index(info, "w"))
player:notify("That would allow anyone to change your verb.");
elseif ((result = set_verb_info(object, vname, info)) == E_INVARG)
player:notify(tostr("\"", perms, "\" is not a valid permissions string for a verb."));
elseif (typeof(result) == ERR)
player:notify(tostr(result));
else
player:notify(tostr("Verb permissions set to \"", perms, "\"."));
endif
endif
return;
endif
elseif (valid(object = player:my_match_object(what)))
perms = $perm_utils:apply(((object.r ? "r" | "") + (object.w ? "w" | "")) + (object.f ? "f" | ""), perms);
r = (w = (f = 0));
for i in [1..length(perms)]
if (perms[i] == "r")
r = 1;
elseif (perms[i] == "w")
w = 1;
elseif (perms[i] == "f")
f = 1;
else
player:notify(tostr("\"", perms, "\" is not a valid permissions string for an object."));
return;
endif
endfor
if ((((object.r = r) == E_PERM) || ((object.w = w) == E_PERM)) || ((object.f = f) == E_PERM))
player:notify("Permission denied.");
else
player:notify(tostr("Object permissions set to \"", perms, "\"."));
endif
return;
endif
$command_utils:object_match_failed(object, what);
.
#59:2
if (player != caller)
return;
endif
set_task_perms(player);
if (!player.programmer)
player:notify("You need to be a programmer to do this.");
player:notify("If you want to become a programmer, talk to a wizard.");
return;
endif
if (!(args && (spec = $code_utils:parse_verbref(args[1]))))
player:notify(tostr(args ? ("\"" + args[1]) + "\"?  " | "", "<object>:<verb>  expected."));
elseif ($command_utils:object_match_failed(object = player:my_match_object(spec[1]), spec[1]))
"...can't find object...";
elseif ((info = verb_args(object, name = spec[2])) == E_VERBNF)
player:notify("That object does not have a verb with that name.");
elseif (typeof(info) == ERR)
player:notify(tostr(info));
elseif (typeof(pas = $code_utils:parse_argspec(@listdelete(args, 1))) != LIST)
"...arg spec is bogus...";
player:notify(tostr(pas));
elseif (!(newargs = pas[1]))
player:notify($string_utils:from_list(info, " "));
elseif (pas[2])
player:notify(tostr("\"", pas[2][1], "\" unexpected."));
else
info[2] = info[2][1..index(info[2] + "/", "/") - 1];
info = {@newargs, @info[length(newargs) + 1..length(info)]};
result = set_verb_args(object, name, info);
if (result == E_INVARG)
player:notify(tostr("\"", info[2], "\" is not a valid preposition (?)"));
elseif (typeof(result) == ERR)
player:notify(tostr(result));
else
player:notify("Verb arguments changed.");
endif
endif
.
#59:3
"A MOO-code evaluator.  Type `;CODE' or `eval CODE'.";
"Calls player:eval_cmd_string to first transform CODE in any way appropriate (e.g., prefixing .eval_env) and then do the actual evaluation.  See documentation for this:eval_cmd_string";
"If you set your .eval_time property to 1, you find out how many ticks and seconds you used.";
"If eval-d is used, the evaluation is performed as if the debug flag were unset.";
if (player != this)
player:tell("I don't understand that.");
return;
endif
set_task_perms(player);
result = player:eval_cmd_string(argstr, verb != "eval-d");
if (result[1])
player:notify(this:eval_value_to_string(result[2]));
if (player.eval_time && (!output_delimiters(player)[2]))
player:notify(tostr("[used ", result[3], " tick", (result[3] != 1) ? "s, " | ", ", result[4], " second", (result[4] != 1) ? "s" | "", ".]"));
endif
else
player:notify_lines(result[2]);
nerrors = length(result[2]);
player:notify(tostr(nerrors, " error", (nerrors == 1) ? "." | "s."));
endif
.
#59:4
set_task_perms(player);
if ((length(args) != 1) || (!(spec = $code_utils:parse_propref(args[1]))))
player:notify(tostr("Usage:  ", verb, " <object>.<property>"));
return;
endif
object = player:my_match_object(spec[1]);
pname = spec[2];
if ($command_utils:object_match_failed(object, spec[1]))
return;
endif
result = delete_property(object, pname);
if (result == E_PROPNF)
player:notify("That object does not define that property.");
elseif (typeof(result) == ERR)
player:notify(tostr(result));
else
player:notify("Property removed.");
endif
.
#59:5
set_task_perms(player);
if (!player.programmer)
player:notify("You need to be a programmer to do this.");
player:notify("If you want to become a programmer, talk to a wizard.");
return;
endif
if (!(args && (spec = $code_utils:parse_verbref(args[1]))))
player:notify(tostr("Usage:  ", verb, " <object>:<verb-name(s)> [<dobj> [<prep> [<iobj> [<permissions> [<owner>]]]]]"));
return;
elseif ($command_utils:object_match_failed(object = player:my_match_object(spec[1]), spec[1]))
return;
endif
name = spec[2];
"...Adding another verb of the same name is often a mistake...";
namelist = $string_utils:explode(name);
for n in (namelist)
if (i = index(n, "*"))
n = (n[1..i - 1] + n[i + 1..length(n)]);
endif
if ((hv = $object_utils:has_verb(object, n)) && (hv[1] == object))
player:notify(tostr("Warning:  Verb `", n, "' already defined on that object."));
endif
endfor
if (typeof(pas = $code_utils:parse_argspec(@listdelete(args, 1))) != LIST)
player:notify(tostr(pas));
return;
endif
verbargs = {@pas[1], "none", "none", "none"}[1..3];
rest = pas[2];
if (rest)
perms = rest[1];
elseif (verbargs == {"this", "none", "this"})
perms = "rxd";
else
perms = "rd";
endif
if (length(rest) < 2)
owner = player;
elseif (length(rest) > 2)
player:notify(tostr("\"", rest[3], "\" unexpected."));
return;
elseif ($command_utils:player_match_result(owner = $string_utils:match_player(rest[2]), rest[2])[1])
return;
elseif (owner == $nothing)
player:notify("Verb can't be owned by no one!");
return;
endif
x = add_verb(object, {owner, perms, name}, verbargs);
if (x == E_INVARG)
player:notify(tostr(rest ? tostr("\"", perms, "\" is not a valid set of permissions.") | tostr("\"", verbargs[2], "\" is not a valid preposition (?)")));
elseif (typeof(x) == ERR)
player:notify(tostr(x));
else
player:notify(tostr("Verb added (", length(verbs(object)) - 1, ")."));
endif
.
#59:6
set_task_perms(player);
if (!(args && (spec = $code_utils:parse_verbref(args[1]))))
player:notify(tostr("Usage:  ", verb, " <object>:<verb>"));
elseif ($command_utils:object_match_failed(object = player:my_match_object(spec[1]), spec[1]))
"...bogus object...";
elseif (typeof(argspec = $code_utils:parse_argspec(@listdelete(args, 1))) != LIST)
player:notify(tostr(argspec));
elseif (argspec[2])
player:notify($string_utils:from_list(argspec[2], " ") + "??");
elseif (length(argspec = argspec[1]) in {1, 2})
player:notify({"Missing preposition", "Missing iobj specification"}[length(argspec)]);
else
verbname = spec[2];
if (index(verbname, "*") > 1)
verbname = strsub(verbname, "*", "");
endif
if ((loc = $code_utils:tonum(verbname)) == E_TYPE)
loc = $code_utils:find_last_verb_named(object, verbname);
if (argspec)
argspec[2] = ($code_utils:full_prep(argspec[2]) || argspec[2]);
while ((loc >= 0) && (verb_args(object, tostr(loc)) != argspec))
loc = $code_utils:find_last_verb_named(object, verbname, loc);
endwhile
endif
if (loc < 0)
player:notify(tostr("That object does not define that verb", argspec ? " with those args." | "."));
return;
endif
endif
info = verb_info(object, tostr(loc));
vargs = verb_args(object, tostr(loc));
result = delete_verb(object, tostr(loc));
if (result == E_VERBNF)
player:notify("That object does not define that verb.");
elseif (typeof(result) == ERR)
player:notify(tostr(result));
elseif (info)
player:notify(tostr("Verb ", object, ":", info[3], " (", loc, ") {", $string_utils:from_list(vargs, " "), "} removed."));
else
player:notify(tostr("Unreadable verb ", object, ":", loc, " removed."));
endif
endif
.
#59:7
"@list <obj>:<verb> [<dobj> <prep> <iobj>] [with(out) parens|numbers] [ranges]";
set_task_perms(player);
pflag = 0;
nflag = 1;
argspec = {};
range = {};
spec = (args ? $code_utils:parse_verbref(args[1]) | E_INVARG);
args = (spec ? listdelete(args, 1) | E_INVARG);
while (args)
if (args[1] && ((index("without", args[1]) == 1) || (args[1] == "wo")))
"...w,wi,wit,with => 1; wo,witho,withou,without => 0...";
fval = (!index(args[1], "o"));
if (index("parentheses", args[2]) == 1)
pflag = fval;
args = args[3..length(args)];
elseif (index("numbers", args[2]) == 1)
nflag = fval;
args = args[3..length(args)];
else
player:notify(tostr(args[1], " WHAT?"));
args = E_INVARG;
endif
elseif (index("0123456789", args[1][1]) || (index(args[1], "..") == 1))
if (E_INVARG == (s = $seq_utils:from_string(args[1])))
player:notify(tostr("Garbled range:  ", args[1]));
args = E_INVARG;
else
range = $seq_utils:union(range, s);
args = listdelete(args, 1);
endif
elseif (argspec)
"... second argspec?  Not likely ...";
player:notify(tostr(args[1], " unexpected."));
args = E_INVARG;
elseif (typeof(pas = $code_utils:parse_argspec(@args)) == LIST)
argspec = pas[1];
argspec[2] = ($code_utils:full_prep(argspec[2]) || argspec[2]);
args = pas[2];
else
"... argspec is bogus ...";
player:notify(tostr(pas));
args = E_INVARG;
endif
endwhile
if (args == E_INVARG)
player:notify(tostr("Usage:  ", verb, " <object>:<verb> [<dobj> <prep> <iobj>] [with|without parentheses|numbers]"));
return;
elseif ($command_utils:object_match_failed(object = player:my_match_object(spec[1]), spec[1]))
return;
endif
what = object;
if (argspec)
vnum = $code_utils:find_verb_named(what, spec[2], 0);
while ((vnum < 0) ? valid(what = parent(what)) | (verb_args(what, vname = tostr(vnum)) != argspec))
vnum = $code_utils:find_verb_named(what, spec[2], vnum + 1);
endwhile
code = ((vnum < 0) ? E_VERBNF | verb_code(what, vname, pflag));
else
vname = spec[2];
while (valid(what) && ((code = verb_code(what, vname, pflag)) == E_VERBNF))
what = parent(what);
endwhile
endif
if (code == E_VERBNF)
player:notify(tostr("That object does not define that verb", argspec ? " with those args." | "."));
elseif (typeof(code) == ERR)
player:notify(tostr(code));
elseif (code == {})
player:notify("That verb has not been programmed.");
else
if (what != object)
player:notify(tostr("Object ", object, " does not define that verb", argspec ? " with those args" | "", ", but its ancestor ", what, " does."));
endif
lineseq = {1, length(code) + 1};
range && (lineseq = $seq_utils:intersection(range, lineseq));
if (!lineseq)
player:notify("No lines in that range.");
return;
endif
info = verb_info(what, vname);
vargs = verb_args(what, vname);
if (index(vargs[2], "/"))
vargs[2] = tostr("(", vargs[2], ")");
endif
player:notify(tostr(what, ":", $string_utils:print(info[3]), "   ", $string_utils:from_list(vargs, " ")));
for k in [1..length(lineseq) / 2]
for i in [lineseq[(2 * k) - 1]..lineseq[2 * k] - 1]
if (nflag)
player:notify(tostr(" "[1..i < 10], i, ":  ", code[i]));
else
player:notify(code[i]);
endif
$command_utils:suspend_if_needed(0);
endfor
endfor
endif
.
#59:8
set_task_perms(player);
if (!dobjstr)
tasks = queued_tasks();
elseif ($command_utils:player_match_result(dobj = $string_utils:match_player(dobjstr), dobjstr)[1])
return;
elseif (typeof(tasks = $wiz_utils:queued_tasks(dobj)) != LIST)
player:notify(tostr(verb, " ", dobj.name, "(", dobj, "):  ", tasks));
return;
endif
if (tasks)
su = $string_utils;
player:notify("Queue ID    Start Time            Owner         Verb (Line) [This]");
player:notify("--------    ----------            -----         ------------------");
now = time();
for task in (tasks)
q_id = task[1];
start = task[2];
time = ((start >= now) ? ctime(start)[5..24] | su:left((start == -1) ? "Reading input ..." | tostr(now - start, " seconds ago..."), 20));
owner = task[5];
owner_name = (valid(owner) ? owner.name | tostr("Dead ", owner));
vloc = task[6];
vname = task[7];
lineno = task[8];
this = task[9];
player:notify(tostr(su:left(tostr(q_id), 10), "  ", time, "  ", su:left(owner_name, 12), "  ", vloc, ":", vname, " (", lineno, ")", (this != vloc) ? tostr(" [", this, "]") | ""));
endfor
else
player:notify("No tasks.");
endif
.
#59:9
"Kills one or more tasks.";
"Arguments:";
"   object:verb -- kills all tasks which were started from that object and verb.";
"   all -- kills all tasks owned by invoker";
"   all player-name -- wizard variant:  kills all tasks owned by player.";
"   all everyone -- wizard variant:  really kills all tasks.";
"   Integer taskid -- kills the specifically named task.";
"   soon [integer] -- kills all tasks scheduled to run in the next [integer] seconds, which defaults to 60.";
"   %integer -- kills all tasks which end in the digits contained in integer.";
set_task_perms(player);
if (length(args) == 0)
player:notify_lines({tostr("Usage:  ", verb, " [object]:[verb]"), tostr("        ", verb, " task_id"), tostr("        ", verb, " soon [number-of-seconds]", player.wizard ? " [everyone|<player name>]" | ""), tostr("        ", verb, " all", player.wizard ? " [everyone|<player name>]" | "")});
return;
elseif (taskid = tonum(args[1]))
elseif (all = (args[1] == "all"))
everyone = 0;
realplayer = player;
if (player.wizard && (length(args) > 1))
realplayer = $string_utils:match_player(args[2]);
everyone = (args[2] == "everyone");
if ((!valid(realplayer)) && (!everyone))
$command_utils:player_match_result(realplayer, args[2]);
return;
elseif (!everyone)
set_task_perms(realplayer);
endif
endif
elseif (soon = (args[1] == "soon"))
realplayer = player;
if (length(args) > 1)
soon = tonum(args[2]);
if ((soon <= 0) && (!player.wizard))
player:notify(tostr("Usage:  ", verb, " soon [positive-number-of-seconds]"));
return;
elseif (player.wizard)
result = this:kill_aux_wizard_parse(@args[2..length(args)]);
soon = result[1];
if (result[1] < 0)
"already gave them an error message";
return;
elseif (result[2] == 1)
everyone = 1;
else
everyone = 0;
set_task_perms(result[2]);
realplayer = result[2];
endif
endif
else
soon = 60;
everyone = 0;
endif
elseif (percent = (args[1][1] == "%"))
l = length(args[1]);
digits = tonum(args[1][2..l]);
percent = tonum("1" + "0000000000"[1..l - 1]);
elseif (colon = index(argstr, ":"))
whatstr = argstr[1..colon - 1];
vrb = argstr[colon + 1..length(argstr)];
if (whatstr)
what = player:my_match_object(whatstr);
endif
else
player:notify_lines({tostr("Usage:  ", verb, " [object]:[verb]"), tostr("        ", verb, " task_id"), tostr("        ", verb, " soon [number-of-seconds]", player.wizard ? " [everyone|<player name>]" | ""), tostr("        ", verb, " all", player.wizard ? " [\"everyone\"|<player name>]" | "")});
return;
endif
"OK, parsed the line, and punted them if it was bogus.  This verb could have been a bit shorter at the expense of readability.  I think it's getting towards unreadable as is.  At this point we've set_task_perms'd, and set up an enormous number of local variables.  Evaluate them in the order we set them, and we should never get var not found.";
queued_tasks = queued_tasks();
killed = 0;
if (taskid)
returnval = kill_task(taskid);
if (typeof(returnval) == ERR)
player:notify(tostr("Invalid task ID ", taskid, "."));
else
player:notify(tostr("Killed task ", taskid, "."));
killed = 1;
endif
elseif (all)
for task in (queued_tasks)
if (everyone || (realplayer == task[5]))
kill_task(task[1]);
killed = 1;
this:_kill_task_message(task);
endif
endfor
elseif (soon)
now = time();
for task in (queued_tasks)
if (((task[2] - now) < soon) && ((!player.wizard) || (everyone || (realplayer == task[5]))))
kill_task(task[1]);
killed = 1;
this:_kill_task_message(task);
endif
endfor
elseif (percent)
for task in (queued_tasks)
if (digits == (task[1] % percent))
kill_task(task[1]);
killed = 1;
this:_kill_task_message(task);
endif
endfor
elseif ((colon || vrb) || whatstr)
for task in (queued_tasks)
if ((((((whatstr == "") || (valid(task[6]) && (index(task[6].name, whatstr) == 1))) || (valid(task[9]) && (index(task[9].name, whatstr) == 1))) || (task[9] == what)) || (task[6] == what)) && ((vrb == "") || (index(" " + strsub(task[7], "*", ""), " " + vrb) == 1)))
this:_kill_task_message(task);
kill_task(task[1]);
killed = 1;
endif
endfor
else
player:notify("Something is funny; I didn't understand your @kill command.  You shouldn't have gotten here.  Please send yduJ mail saying you got this message from @kill, and what you had typed to @kill.");
endif
if (!killed)
player:notify("No tasks killed.");
endif
.
#59:10
if (!player.programmer)
player:notify("You need to be a programmer to do this.");
player:notify("If you want to become a programmer, talk to a wizard.");
return;
endif
$verb_editor:invoke(argstr, verb);
.
#59:11
"Usage:  @copy source:verbname to target[:verbname]";
"  the target verbname, if not given, defaults to that of the source.  If the target verb doesn't already exist, a new verb is installed with the same args, names, code, and permission flags as the source.  Otherwise, the existing target's verb code is overwritten and no other changes are made.";
"This the poor man's version of multiple inheritance... the main problem is that someone may update the verb you're copying and you'd never know.";
set_task_perms(player);
if (!player.programmer)
player:notify("You need to be a programmer to do this.");
player:notify("If you want to become a programmer, talk to a wizard.");
return;
endif
if ((!(from = $code_utils:parse_verbref(dobjstr))) || (!iobjstr))
player:notify(tostr("Usage:  ", verb, " obj:verb to obj:verb"));
player:notify(tostr("        ", verb, " obj:verb to obj"));
player:notify(tostr("        ", verb, " obj:verb to :verb"));
return;
elseif ($command_utils:object_match_failed(fobj = player:my_match_object(from[1]), from[1]))
return;
elseif (iobjstr[1] == ":")
to = {fobj, iobjstr[2..length(iobjstr)]};
elseif (!(to = $code_utils:parse_verbref(iobjstr)))
iobj = player:my_match_object(iobjstr);
if ($command_utils:object_match_failed(iobj, iobjstr))
return;
endif
to = {iobj, from[2]};
elseif ($command_utils:object_match_failed(tobj = player:my_match_object(to[1]), to[1]))
return;
else
to[1] = tobj;
endif
from[1] = fobj;
to_firstname = (strsub(to[2][1..index(to[2] + " ", " ") - 1], "*", "") || "*");
if ((!(hv = $object_utils:has_verb(to[1], to_firstname))) || (hv[1] != to[1]))
if ((!(info = verb_info(@from))) || (!(vargs = verb_args(@from))))
player:notify(tostr("Retrieving ", from[1], ":", from[2], " --> ", info && vargs));
return;
endif
if (!player.wizard)
info[1] = player;
endif
if (verb == "@copy-x")
"... make sure this is an unusable copy...";
info[2] = strsub(info[2], "x", "");
vargs = {"this", "none", "this"};
endif
if (from[2] != to[2])
info[3] = to[2];
endif
if (ERR == typeof(e = add_verb(to[1], info, vargs)))
player:notify(tostr("Adding ", to[1], ":", to[2], " --> ", e));
return;
endif
endif
code = verb_code(@from);
owner = verb_info(@from)[1];
if (owner != player)
code = {tostr("\"Copied from ", from[1].name, " (", from[1], "):", from[2], (from[1] == owner) ? " " | tostr(" by ", owner.name, " (", owner, ") "), ctime(), "\";"), @code};
player:notify("Use of @copy is discouraged.  Please do not use @copy if you can use inheritance or features instead.  Use @copy carefully, and only when absolutely necessary, as it is wasteful of database space.");
endif
if (ERR == typeof(e = set_verb_code(to[1], to_firstname, code)))
player:notify(tostr("Copying ", from[1], ":", from[2], " to ", to[1], ":", to[2], " --> ", e));
else
player:notify(tostr(to[1], ":", to[2], " code set."));
endif
.
#59:12
set_task_perms(caller_perms());
task = args[1];
player:notify(tostr("Killed: ", $string_utils:right(tostr("task ", task[1]), 17), ", verb ", task[6], ":", task[7], ", line ", task[8], (task[9] != task[6]) ? ", this==" + tostr(task[9]) | ""));
.
#59:13
"This version of @program deals with multiple verbs having the same name.";
"... @program <object>:<verbname> <dobj> <prep> <iobj>  picks the right one.";
if (player != caller)
return;
endif
set_task_perms(player);
"...";
"...catch usage errors first...";
"...";
punt = "...set punt to 0 only if everything works out...";
if (!(args && (spec = $code_utils:parse_verbref(args[1]))))
player:notify(tostr("Usage: ", verb, " <object>:<verb> [<dobj> <prep> <iobj>]"));
elseif ($command_utils:object_match_failed(object = player:my_match_object(spec[1]), spec[1]))
"...bogus object...";
elseif (typeof(argspec = $code_utils:parse_argspec(@listdelete(args, 1))) != LIST)
player:notify(tostr(argspec));
elseif (argspec[2])
player:notify($string_utils:from_list(argspec[2], " ") + "??");
elseif (length(argspec = argspec[1]) in {1, 2})
player:notify({"Missing preposition", "Missing iobj specification"}[length(argspec)]);
else
punt = 0;
verbname = spec[2];
if (index(verbname, "*") > 1)
verbname = strsub(verbname, "*", "");
endif
endif
"...";
"...if we have an argspec, we'll need to reset verbname...";
"...";
if (punt)
elseif (argspec)
if (!(argspec[2] in {"none", "any"}))
argspec[2] = $code_utils:full_prep(argspec[2]);
endif
loc = $code_utils:find_verb_named(object, verbname);
while ((loc >= 0) && (verb_args(object, tostr(loc)) != argspec))
loc = $code_utils:find_verb_named(object, verbname, loc + 1);
endwhile
if (loc < 0)
punt = "...can't find it....";
player:notify("That object has no verb matching that name + args.");
else
verbname = tostr(loc);
endif
else
loc = -1;
endif
"...";
"...get verb info...";
"...";
if (punt || (!(punt = "...reset punt to TRUE...")))
elseif ((info = verb_info(object, verbname)) == E_VERBNF)
player:notify("That object does not have that verb definition.");
elseif (typeof(info) == ERR)
player:notify(tostr(info));
else
punt = 0;
aliases = info[3];
if (loc < 0)
loc = ((aliases in (verbs(object) || {})) - 1);
endif
endif
"...";
"...read the code...";
"...";
if (punt)
player:notify(tostr("Now ignoring code for ", args ? args[1] | "nothing in particular", "."));
$command_utils:read_lines();
player:notify("Verb code ignored.");
else
player:notify(tostr("Now programming ", object.name, ":", aliases, "(", (loc < 0) ? "??" | loc, ")."));
lines = $command_utils:read_lines();
if (result = set_verb_code(object, verbname, lines))
player:notify_lines(result);
player:notify(tostr(length(result), " error(s)."));
player:notify("Verb not programmed.");
elseif (typeof(result) == ERR)
player:notify(tostr(result));
player:notify("Verb not programmed.");
else
player:notify("0 errors.");
player:notify("Verb programmed.");
endif
endif
.
#59:14
"Usage: @setenv <environment string>";
"Set your .eval_env property.  Most useful when eval won't work to set it";
"because your .eval_env contains an error.";
set_task_perms(player);
if (!argstr)
player:notify(tostr("Usage:  ", verb, " <environment string>"));
return;
endif
player:notify(tostr("Current eval environment is: ", player.eval_env));
result = player:set_eval_env(argstr);
if (typeof(result) == ERR)
player:notify(tostr(result));
return;
endif
player:notify(tostr(".eval_env set to \"", player.eval_env, "\" (", player.eval_ticks, " ticks)."));
.
#59:15
set_task_perms((caller_perms() == $nothing) ? player | caller_perms());
dobj = $string_utils:match_player(dobjstr);
if (!dobjstr)
player:notify(tostr("Usage: ", verb, " <player> [from <start>] [to <end>]"));
return;
elseif ($command_utils:player_match_result(dobj, dobjstr)[1])
return;
endif
dobjwords = $string_utils:words(dobjstr);
if (args[1..length(dobjwords)] == dobjwords)
args = args[length(dobjwords) + 1..length(args)];
endif
if (!(parse_result = $code_utils:_parse_audit_args(@args)))
player:notify(tostr("Usage:  ", verb, " player [from <start>] [to <end>]"));
return;
endif
return $building_utils:do_prospectus(dobj, @parse_result);
.
#59:16
"@display <object>[.[property]]*[,[inherited_property]]*[:[verb]]*[;[inherited_verb]]*";
"null names for properties and verbs are interpreted as meaning all of them.";
opivu = {{}, {}, {}, {}, {}};
string = "";
punc = 1;
literal = 0;
for jj in [1..length(argstr)]
j = argstr[jj];
if (literal)
string = (string + j);
literal = 0;
elseif (j == "\\")
literal = 1;
elseif (y = index(".,:;", j))
opivu[punc] = {@opivu[punc], string};
punc = (1 + y);
string = "";
else
string = (string + j);
endif
endfor
opivu[punc] = {@opivu[punc], string};
objname = opivu[1][1];
it = this:my_match_object(objname);
if ($command_utils:object_match_failed(it, objname))
return;
endif
readable = ((it.owner == this) || (it.r || this.wizard));
cant = {};
if ("" in opivu[2])
if (readable)
prop = properties(it);
else
prop = {};
cant = setadd(cant, it);
endif
if (!this:display_option("thisonly"))
what = it;
while ((!prop) && valid(what = parent(what)))
if ((what.owner == this) || (what.r || this.wizard))
prop = properties(what);
else
cant = setadd(cant, what);
endif
endwhile
endif
else
prop = opivu[2];
endif
if ("" in opivu[3])
inh = {};
for what in ({it, @$object_utils:ancestors(it)})
if (((what.owner == this) || what.r) || this.wizard)
inh = {@inh, @properties(what)};
else
cant = setadd(cant, what);
endif
endfor
else
inh = opivu[3];
endif
for q in (inh)
if (q in properties(it))
prop = setadd(prop, q);
inh = setremove(inh, q);
endif
endfor
vrb = {};
if ("" in opivu[4])
if (readable)
vrbs = verbs(it);
else
vrbs = {};
cant = setadd(cant, it);
endif
what = it;
if (!this:display_option("thisonly"))
while ((!vrbs) && valid(what = parent(what)))
if ((what.owner == this) || (what.r || this.wizard))
vrbs = verbs(what);
else
cant = setadd(cant, what);
endif
endwhile
endif
for n in [0..length(vrbs) - 1]
vrb = setadd(vrb, {what, tostr(n)});
endfor
else
for w in (opivu[4])
if (y = $object_utils:has_verb(it, w))
vrb = setadd(vrb, {y[1], w});
else
this:notify(tostr("No such verb, \"", w, "\""));
endif
endfor
endif
if ("" in opivu[5])
for z in ({it, @$object_utils:ancestors(it)})
if (((this == z.owner) || z.r) || this.wizard)
for n in [0..length(verbs(z)) - 1]
vrb = setadd(vrb, {z, tostr(n)});
endfor
else
cant = setadd(cant, z);
endif
endfor
else
for w in (opivu[5])
if (typeof(y = $object_utils:has_verb(it, w)) == LIST)
vrb = setadd(vrb, {y[1], w});
else
this:notify(tostr("No such verb, \"", w, "\""));
endif
endfor
endif
if (({""} in opivu) || (opivu[2..5] == {{}, {}, {}, {}}))
this:notify(tostr(it.name, " (", it, ") [ ", it.r ? "readable " | "", it.w ? "writeable " | "", it.f ? "fertile " | "", is_player(it) ? "(player) " | "", it.programmer ? "programmer " | "", it.wizard ? "wizard " | "", "]"));
if (it.owner != (is_player(it) ? it | this))
this:notify(tostr("  Owned by ", valid(p = it.owner) ? p.name | "** extinct **", " (", p, ")."));
endif
this:notify(tostr("  Child of ", valid(p = parent(it)) ? p.name | "** none **", " (", p, ")."));
if (it.location != $nothing)
this:notify(tostr("  Location ", valid(p = it.location) ? p.name | "** unplace (tell a wizard, fast!) **", " (", p, ")."));
endif
endif
set_task_perms(this.owner);
blankargs = (this:display_option("blank_tnt") ? {"this", "none", "this"} | #-1);
for b in (vrb)
$command_utils:suspend_if_needed(0);
where = b[1];
q = b[2];
short = strsub(y = (index(q, " ") ? q[1..y - 1] | q), "*", "");
inf = verb_info(where, short);
if ((typeof(inf) == LIST) || (inf == E_PERM))
name = ((typeof(inf) == LIST) ? inf[3] | q);
name = (index(name, " ") ? ("\"" + name) + "\"" | name);
line = $string_utils:left(tostr($string_utils:right(tostr(where), 6), ":", name, " "), 32);
if (inf == E_PERM)
line = (line + "   ** unreadable **");
else
line = ($string_utils:left(tostr(line, inf[1].name, " (", inf[1], ") "), 53) + ((i = (inf[2] in {"x", "xd", "d", "rd"})) ? {" x", " xd", "  d", "r d"}[i] | inf[2]));
vargs = verb_args(where, short);
if (vargs != blankargs)
if (this:display_option("shortprep") && (!(vargs[2] in {"any", "none"})))
vargs[2] = $code_utils:short_prep(vargs[2]);
endif
line = ($string_utils:left(line + " ", 60) + $string_utils:from_list(vargs, " "));
endif
endif
this:notify(line);
elseif (inf == E_VERBNF)
this:notify(tostr(inf));
this:notify(tostr("  ** no such verb, \"", short, "\" **"));
else
this:notify("This shouldn't ever happen. @display is buggy.");
endif
endfor
all = {@prop, @inh};
max = ((length(all) < 4) ? 999 | (this:linelen() - 56));
depth = ((length(all) < 4) ? -1 | 1);
truncate_owner_names = (length(all) > 1);
for q in (all)
$command_utils:suspend_if_needed(0);
inf = property_info(it, q);
if (inf == E_PROPNF)
if (q in $code_utils.builtin_props)
this:notify(tostr($string_utils:left("," + q, 25), "Built in property            ", (length(y = $string_utils:from_value(it.(q), 1, depth)) > max) ? y[1..max] + ".." | y));
else
this:notify(tostr("  ** property not found, \"", q, "\" **"));
endif
else
pname = $string_utils:left(tostr((q in properties(it)) ? "." | (is_clear_property(it, q) ? " " | ","), q, " "), 25);
if (inf == E_PERM)
this:notify(pname + "   ** unreadable **");
else
oname = inf[1].name;
truncate_owner_names && ((length(oname) > 12) && (oname = oname[1..12]));
(inf[2][1] != "r") && (inf[2][1..0] = " ");
(inf[2][2] != "w") && (inf[2][2..1] = " ");
this:notify($string_utils:left(tostr($string_utils:left(tostr(pname, oname, " (", inf[1], ") "), 47), inf[2], " "), 54) + ((length(y = $string_utils:from_value(it.(q), 1, depth)) > max) ? y[1..max] + ".." | y));
endif
endif
endfor
if (cant)
failed = {};
for k in (cant)
failed = listappend(failed, tostr(k.name, " (", k, ")"));
endfor
this:notify($string_utils:centre(tostr(" no permission to read ", $string_utils:english_list(failed, ", ", " or ", " or "), ". "), 75, "-"));
else
this:notify($string_utils:centre(" finished ", 75, "-"));
endif
.
#59:17
set_task_perms(player);
"Let 'em @kill it.";
count = 0;
for i in [0..tonum(max_object())]
if ($command_utils:running_out_of_time())
player:notify(tostr("Counting... [", count, "/", i - 1, "]"));
suspend(0);
endif
if (valid(toobj(i)))
count = (count + 1);
endif
endfor
player:notify(tostr("There are ", count, " valid objects out of ", tonum(max_object()) + 1, " allocated object numbers."));
.
#59:18
"@gethelp [<topic>] [from <db or dblist>]";
"  Prints the raw text of topic from the appropriate help db.";
"  With no argument, gets the blank (\"\") topic from wherever it lives";
"  Text is printed as a script for changing this help topic ";
"  (somewhat like @dump...)";
if (!prepstr)
topic = argstr;
dblist = $code_utils:help_db_list();
elseif (prepstr != "from")
player:notify("Usage:  ", verb, " [<topic>] [from <db>]");
return;
elseif (!(e = $no_one:eval_d(iobjstr = argstr[$string_utils:word_start(argstr)[(prepstr in args) + 1][1]..length(argstr)])))
player:notify(tostr(e));
return;
elseif (!e[1])
player:notify_lines(e[2]);
return;
elseif (!(typeof(dblist = e[2]) in {OBJ, LIST}))
player:notify(tostr(iobjstr, " => ", dblist, " -- not an object or a list"));
return;
else
topic = dobjstr;
if (typeof(dblist) == OBJ)
dblist = {dblist};
endif
endif
search = $code_utils:help_db_search(topic, dblist);
if (!search)
player:notify("Topic not found.");
elseif (search[1] == $ambiguous_match)
player:notify(tostr("Topic `", topic, "' ambiguous:  ", $string_utils:english_list(search[2], "none", " or ")));
elseif (typeof(text = (db = search[1]):dump_topic(fulltopic = search[2])) == ERR)
"...ok...shoot me.  This is a -d verb...";
player:notify(tostr("Cannot retrieve `", fulltopic, "' on ", $code_utils:corify_object(db), ":  ", text));
else
player:notify_lines(text);
endif
.
#59:19
set_task_perms(player);
if (prepstr == "in")
pattern = dobjstr;
objlist = player:eval_cmd_string(iobjstr, 0);
if (!objlist[1])
player:notify(tostr("Had trouble reading `", iobjstr, "':  "));
player:notify_lines(@objlist[2]);
return;
elseif (typeof(objlist[2]) == OBJ)
objlist = {objlist[2..2]};
elseif (typeof(objlist[2]) != LIST)
player:notify(tostr("Value of `", iobjstr, "' is not an object or list:  ", $string_utils:print(objlist[2])));
return;
else
objlist = objlist[2..2];
endif
elseif ((prepstr == "from") && (player.wizard && (n = tonum(toobj(iobjstr)))))
pattern = dobjstr;
objlist = {n};
elseif (args && player.wizard)
pattern = argstr;
objlist = {};
else
player:notify(tostr("Usage:  ", verb, " <pattern> ", player.wizard ? "[in {<objectlist>} | from <number>]" | "in {<objectlist>}"));
return;
endif
player:notify(tostr("Searching for verbs ", @prepstr ? {prepstr, " ", iobjstr, " "} | {}, (verb == "@egrep") ? "matching the pattern " | "containing the string ", $string_utils:print(pattern), " ..."));
player:notify("");
$code_utils:((verb == "@egrep") ? "find_verbs_matching" | "find_verbs_containing")(pattern, @objlist);
.
#59:20
set_task_perms(player);
if (dobjstr == "")
player:notify(tostr("Usage:  ", verb, " <object-or-property-or-verb>"));
return;
endif
if (index(dobjstr, ".") && (spec = $code_utils:parse_propref(dobjstr)))
if (valid(object = player:my_match_object(spec[1])))
return $code_utils:show_property(object, spec[2]);
endif
elseif (spec = $code_utils:parse_verbref(dobjstr))
if (valid(object = player:my_match_object(spec[1])))
return $code_utils:show_verbdef(object, spec[2]);
endif
elseif (((dobjstr[1] == "$") && ((pname = dobjstr[2..length(dobjstr)]) in properties(#0))) && (typeof(#0.(pname)) == OBJ))
if (valid(object = #0.(pname)))
return $code_utils:show_object(object);
endif
elseif ((dobjstr[1] == "$") && (spec = $code_utils:parse_propref(dobjstr)))
return $code_utils:show_property(#0, spec[2]);
else
if (valid(object = player:my_match_object(dobjstr)))
return $code_utils:show_object(object);
endif
endif
$command_utils:object_match_failed(object, dobjstr);
.
#59:21
"@check-prop object.property";
"  checks for descendents defining the given property.";
set_task_perms(player);
if (!(spec = $code_utils:parse_propref(dobjstr)))
player:notify(tostr("Usage:  ", verb, " <object>.<prop-name>"));
elseif ($command_utils:object_match_failed(object = player:my_match_object(spec[1]), spec[1]))
"...bogus object...";
elseif (!($perm_utils:controls(player, object) || object.w))
player:notify("You can't create a property on that object anyway.");
elseif ($object_utils:has_property(object, prop = spec[2]))
player:notify("That object already has that property.");
elseif (olist = $object_utils:descendants_with_property_suspended(object, prop))
player:notify("The following descendents have this property defined:");
player:notify("  " + $string_utils:from_list(olist, " "));
else
player:notify("No property name conflicts found.");
endif
.
#59:22
"set_eval_env(string);";
"Run <string> through eval.  If it doesn't compile, return E_INVARG.  If it crashes, well, it crashes.  If it works okay, set .eval_env to it and set .eval_ticks to the amount of time it took.";
set_task_perms(caller_perms());
program = args[1];
value = $code_utils:eval_d(("ticks = ticks_left();" + program) + ";return ticks - ticks_left() - 2;");
if (!value[1])
return E_INVARG;
elseif (typeof(value[2]) == ERR)
return value[2];
endif
ok = (this.eval_env = program);
this.eval_ticks = value[2];
if (typeof(ok) == ERR)
return ok;
else
return 1;
endif
.
#59:23
"@clearproperty <obj>.<prop>";
"Set the value of <obj>.<prop> to `clear', making it appear to be the same as the property on its parent.";
set_task_perms(player);
if (!(l = $code_utils:parse_propref(dobjstr)))
player:notify(tostr("Usage:  ", verb, " <object>.<property>"));
elseif ($command_utils:object_match_failed(dobj = player:my_match_object(l[1]), l[1]))
"... bogus object...";
elseif (is_clear_property(dobj, prop = l[2]))
player:notify(tostr("Property ", dobj, ".", prop, " is already clear!"));
elseif ((result = clear_property(dobj, prop)) == E_INVARG)
player:notify(tostr("You can't clear ", dobj, ".", prop, "; none of the ancestors define that property."));
elseif (typeof(result) == ERR)
player:notify(tostr(result));
else
player:notify(tostr("Property ", dobj, ".", prop, " cleared; value is now ", $string_utils:print(dobj.(prop)), "."));
endif
.
#59:24
"Syntax: @disown <object> [from <object>]";
"This command is used to remove unwanted children of objects you control. If you control an object, and there is a child of that object you do not want, this command will chparent() the object to its grandparent.";
if (prepstr)
if (prepstr != "from")
player:notify("Usage:  ", verb, " <object> [from <object>]");
return;
elseif ($command_utils:object_match_failed(iobj = player:my_match_object(iobjstr), iobjstr))
"... from WHAT?..";
return;
elseif (valid(dobj = $string_utils:literal_object(dobjstr)))
"... literal object number...";
if (parent(dobj) != iobj)
player:notify(tostr(dobj, " is not a child of ", iobj.name, " (", iobj, ")"));
return;
endif
elseif ($command_utils:object_match_failed(dobj = $string_utils:match(dobjstr, children(iobj), "name", children(iobj), "aliases"), dobjstr))
"... can't match dobjstr against any children of iobj";
return;
endif
elseif ($command_utils:object_match_failed(dobj = player:my_match_object(dobjstr), dobjstr))
"... can't match dobjstr...";
return;
endif
victim = dobj;
parent = parent(victim);
if ($perm_utils:controls(player, victim))
"... why is he using @disown?... probably by mistake...";
player:notify(tostr(victim.name, " (", victim, ") is yours.  Use @chparent."));
elseif (!valid(parent))
player:notify(tostr(victim.name, " (", victim, ") is already an orphan."));
elseif (!$perm_utils:controls(player, parent))
player:notify(tostr(parent.name, " (", parent, "), the parent of ", victim.name, " (", victim, "), is not yours."));
elseif (!valid(grandparent = parent(parent)))
"... still not sure about this... do we care?  --Rog...";
player:notify(tostr(victim.name, " (", victim, ") has no grandparent to take custody."));
else
chparent(victim, grandparent);
player:notify(tostr(victim.name, " (", victim, ")'s parent is now ", grandparent.name, " (", grandparent, ")."));
endif
.
#59:25
":eval_cmd_string(string[,debug])";
"Evaluates the string the way this player would normally expect to see it evaluated if it were typed on the command line.  debug (defaults to 1) indicates how the debug flag should be set during the evaluation.";
" => {@eval_result, ticks, seconds}";
"where eval_result is the result of the actual eval() call.";
"";
"For the case where string is an expression, we need to prefix `return ' and append `;' to string before passing it to eval().  However this is not appropriate for statements, where it is assumed an explicit return will be provided somewhere or that the return value is irrelevant.  The code below assumes that string is an expression unless it either begins with a semicolon `;' or one of the MOO language statement keywords.";
"Next, the substitutions described by this.eval_subs, which should be a list of pairs {string, sub}, are performed on string";
"Finally, this.eval_env is prefixed to the beginning while this.eval_ticks is subtracted from the eventual tick count.  This allows string to refer to predefined variables like `here' and `me'.";
set_task_perms(caller_perms());
program = (args[1] + ";");
debug = ({@args, 1}[2] ? 33 | 0);
if (!match(program, "^ *%(;%|%(if%|fork?%|return%|while%)[^a-z0-9A-Z_]%)"))
program = ("return " + program);
endif
program = tostr(this.eval_env, ";", $code_utils:substitute(program, this.eval_subs));
ticks = (((ticks_left() - 48) - this.eval_ticks) + debug);
seconds = seconds_left();
value = (debug ? eval(program) | $code_utils:eval_d(program));
seconds = (seconds - seconds_left());
ticks = (ticks - ticks_left());
return {@value, ticks, seconds};
.
#59:26
"@dump something [with [id=...] [noprops] [noverbs] [create]]";
"This spills out all properties and verbs on an object, calling suspend at appropriate intervals.";
"   id=#nnn -- specifies an idnumber to use in place of the object's actual id (for porting to another MOO)";
"   noprops -- don't show properties.";
"   noverbs -- don't show verbs.";
"   create  -- indicates that a @create command should be generated and all of the verbs be introduced with @verb rather than @args; the default assumption is that the object already exists and you're just doing this to have a look at it.";
set_task_perms(player);
dobj = player:my_match_object(dobjstr);
if ($command_utils:object_match_failed(dobj, dobjstr))
return;
endif
if (prepstr && (prepstr != "with"))
player:notify(tostr("Usage:  ", verb, " something [with [id=...] [noprops] [noverbs] [create]]"));
return;
endif
targname = tostr(dobj);
options = {"props", "verbs"};
create = 0;
if (iobjstr)
for o in ($string_utils:explode(iobjstr))
if (index(o, "id=") == 1)
targname = o[4..length(o)];
elseif (o in {"noprops", "noverbs"})
options = setremove(options, o[3..length(o)]);
elseif (o in {"create"})
create = 1;
endif
endfor
endif
if (create)
parent = parent(dobj);
pstring = tostr(parent);
for p in (properties(#0))
if (#0.(p) == parent)
pstring = ("$" + p);
endif
endfor
player:notify(tostr("@create ", pstring, " named ", dobj.name, ":", $string_utils:from_list(dobj.aliases, ",")));
endif
for p in (("props" in options) ? properties(dobj) | {})
pquoted = $string_utils:print(p);
info = property_info(dobj, p);
value = dobj.(p);
if (create)
uvalue = ((typeof(value) == LIST) ? "{}" | 0);
player:notify(tostr("@prop ", targname, ".", pquoted, " ", uvalue || $string_utils:print_suspended(value), " ", info[2] || "\"\"", (info[1] == dobj.owner) ? "" | tostr(" ", info[1])));
if (uvalue && value)
player:notify(tostr(";;", targname, ".(", pquoted, ") = ", $string_utils:print_suspended(value)));
endif
else
if (info[2] != "rc")
player:notify(tostr("@chmod ", targname, ".", pquoted, " ", info[2]));
endif
if (info[1] != dobj.owner)
player:notify(tostr("@chown ", targname, ".", pquoted, " ", info[1]));
endif
player:notify(tostr(";;", targname, ".(", pquoted, ") = ", $string_utils:print_suspended(value)));
endif
$command_utils:suspend_if_needed(0);
endfor
for a in (("props" in options) ? $object_utils:ancestors(dobj) | {})
for p in (properties(a))
$command_utils:suspend_if_needed(1);
pquoted = $string_utils:print(p);
value = dobj.(p);
avalue = a.(p);
if (typeof(value) == ERR)
player:notify(tostr("\"", targname, ".(", pquoted, ") => ", $code_utils:error_name(value), " (", value, ")"));
elseif ((typeof(avalue) == ERR) || (value != avalue))
player:notify(tostr(";;", targname, ".(", pquoted, ") = ", $string_utils:print_suspended(value)));
endif
endfor
$command_utils:suspend_if_needed(1);
endfor
if (!("verbs" in options))
player:notify("\"***finished***");
return;
endif
player:notify("");
v = tostr(0);
while ((info = verb_info(dobj, v)) || (info == E_PERM))
if (index(info[3], "(old)") && 0)
"Thought about skipping (old) verbs...";
player:tell("Skipping ", dobj, ":\"", info[3], "\"...");
else
suspend(1);
if (typeof(info) == ERR)
player:notify(tostr("\"", dobj, ":", v, " --- ", info, "\";"));
else
if (i = index(vname = info[3], " "))
vname = vname[1..i - 1];
endif
if (vname[1] != "*")
vname = strsub(vname, "*", "");
endif
args = verb_args(dobj, v);
prep = ((args[2] in {"any", "none"}) ? args[2] | $code_utils:short_prep(args[2]));
perms = ((info[2] != ((args == {"this", "none", "this"}) ? "rxd" | "rd")) ? info[2] || "\"\"" | "");
if (create)
if (info[1] == dobj.owner)
tail = (perms ? tostr(" ", perms) | "");
else
tail = tostr(" ", perms || info[2], " ", info[1]);
endif
player:notify(tostr("@verb ", targname, ":\"", info[3], "\" ", args[1], " ", prep, " ", args[3], tail));
else
player:notify(tostr("@args ", targname, ":\"", info[3], "\" ", args[1], " ", prep, " ", args[3]));
if (info[1] != dobj.owner)
player:notify(tostr("@chown ", targname, ":", vname, " ", info[1]));
endif
if (perms)
player:notify(tostr("@chmod ", targname, ":", vname, " ", perms));
endif
endif
if (code = verb_code(dobj, v, 1, 1))
player:notify(tostr("@program ", targname, ":", vname));
for c in (code)
player:notify(c);
$command_utils:suspend_if_needed(0);
endfor
player:notify_lines({".", ""});
endif
endif
endif
if (index(tostr(" ", info[3], " "), " * "))
"... we have a * verb.  may as well forget trying to list...";
"... the rest; they're invisible.  set v to something nonstring.";
v = E_TYPE;
else
v = tostr(tonum(v) + 1);
endif
$command_utils:suspend_if_needed(0);
endwhile
player:notify("\"***finished***");
.
#59:27
"Copied from Player Class hacked with eval that does substitutions and assorted stuff (#8855):# by Geust (#24442) Sun May  9 20:19:05 1993 PDT";
"#<string>[.<property>|.parent] [exit|player|inventory] [for <code>] returns information about the object (we'll call it <thing>) named by string.  String is matched in the current room unless one of exit|player|inventory is given.";
"If neither .<property>|.parent nor <code> is specified, just return <thing>.";
"If .<property> is named, return <thing>.<property>.  .parent returns parent(<thing>).";
"If <code> is given, it is evaluated, with the value returned by the first part being substituted for %# in <code>.";
"For example, the command";
"  #JoeFeedback.parent player for tonum(%#)";
"will return 26026 (unless Joe has chparented since writing this).";
set_task_perms(player);
if (!(whatstr = verb[2..dot = (min(index(verb + ".", "."), index(verb + ":", ":")) - 1)]))
player:notify("Usage:  #string [exit|player|inventory]");
return;
elseif (!args)
what = player:my_match_object(whatstr);
elseif (index("exits", args[1]) == 1)
what = player.location:match_exit(whatstr);
elseif (index("inventory", args[1]) == 1)
what = player:match(whatstr);
elseif (index("players", args[1]) == 1)
what = $string_utils:match_player(whatstr);
if ($command_utils:player_match_failed(what, whatstr))
return;
endif
else
what = player:my_match_object(whatstr);
endif
if ((!valid(what)) && match(whatstr, "^[0-9]+$"))
what = toobj(whatstr);
endif
if ($command_utils:object_match_failed(what, whatstr))
return;
endif
while (index(verb, ".parent") == (dot + 1))
what = parent(what);
dot = (dot + 7);
endwhile
if (dot >= length(verb))
val = what;
elseif ((value = $code_utils:eval_d(tostr("return ", what, verb[dot + 1..length(verb)], ";")))[1])
val = value[2];
else
player:notify_lines(value[2]);
return;
endif
if (prepstr)
program = strsub(iobjstr + ";", "%#", $string_utils:print(val));
end = 1;
"while (\"A\" <= (l = argstr[end]) && l <= \"Z\")";
while (("A" <= (l = program[end])) && (l <= "Z"))
end = (end + 1);
endwhile
if ((program[1] == ";") || (program[1..end - 1] in {"if", "for", "fork", "return", "while"}))
program = $code_utils:substitute(program, this.eval_subs);
else
program = $code_utils:substitute("return " + program, this.eval_subs);
endif
if ((value = eval(program))[1])
player:notify(this:eval_value_to_string(value[2]));
else
player:notify_lines(value[2]);
nerrors = length(value[2]);
player:notify(tostr(nerrors, " error", (nerrors == 1) ? "." | "s."));
endif
else
player:notify(this:eval_value_to_string(val));
endif
.
#59:28
set_task_perms(caller_perms());
if (typeof(val = args[1]) == OBJ)
return tostr("=> ", val, "  ", valid(val) ? ("(" + val.name) + ")" | ((a = $list_utils:assoc(val, {{#-1, "<$nothing>"}, {#-2, "<$ambiguous_match>"}, {#-3, "<$failed_match>"}})) ? a[2] | "<invalid>"));
elseif (typeof(val) == ERR)
return tostr("=> ", $code_utils:error_name(val), "  (", val, ")");
else
return tostr("=> ", $string_utils:print(val));
endif
.
#60:0
":eval_d(code...) => {compiled?,result}";
"This works exactly like the builtin eval() except that the code is evaluated ";
"as if the d flag were unset.";
code = {"set_verb_code(this,\"1\",{\"\\\"Do not remove this verb!  This is an auxiliary verb for :eval_d().\\\";\"});", "dobj=iobj=this=#-1;", "dobjstr=iobjstr=prepstr=argstr=verb=\"\";", tostr("caller=", caller, ";"), "set_task_perms(caller_perms());", @args};
if (!caller_perms().programmer)
return E_PERM;
elseif (svc = set_verb_code(this, "1", code))
lines = {};
for line in (svc)
if ((index(line, "Line ") == 1) && (n = tonum(line[6..(colon = index(line + ":", ":")) - 1])))
lines = {@lines, tostr("Line ", n - 5, line[colon..length(line)])};
else
lines = {@lines, line};
endif
endfor
return {0, lines};
else
set_task_perms(caller_perms());
return {1, this:("1")()};
endif
.
#60:1
"Do not remove this verb!  This is an auxiliary verb for :eval_d().";
.
#60:2
":tonum(number as string) => number";
return match(s = args[1], "^ *[-+]?[0-9]+ *$") ? tonum(s) | E_TYPE;
.
#60:3
":toobj(objectid as string) => objectid";
return match(s = args[1], "^ *#[-+]?[0-9]+ *$") ? toobj(s) | E_TYPE;
.
#60:4
"toerr(n), toerr(\"E_FOO\"), toerr(\"FOO\") => E_FOO.";
if (typeof(s = args[1]) != STR)
n = (tonum(s) + 1);
if (n > length(this.error_list))
return 1;
endif
elseif (!(n = ((s in this.error_names) || (("E_" + s) in this.error_names))))
return 1;
endif
return this.error_list[n];
.
#60:5
"error_name(E_FOO) => \"E_FOO\"";
return this.error_names[tonum(args[1]) + 1];
.
#60:6
set_task_perms(caller_perms());
object = args[1];
what = {@args, {"props", "verbs"}}[2];
player:notify(tostr("Object ID:  ", object));
player:notify(tostr("Name:       ", object.name));
names = {"Parent", "Location", "Owner"};
vals = {parent(object), object.location, object.owner};
for i in [1..length(vals)]
if (!valid(vals[i]))
val = "*** NONE ***";
else
val = (((vals[i].name + " (") + tostr(vals[i])) + ")");
endif
player:notify(tostr(names[i], ":      "[1..12 - length(names[i])], val));
endfor
line = "Flags:     ";
if (is_player(object))
line = (line + " player");
endif
for flag in ({"programmer", "wizard", "r", "w", "f"})
if (object.(flag))
line = ((line + " ") + flag);
endif
endfor
player:notify(line);
if (player.programmer && ((player.wizard || (player == object.owner)) || object.r))
if (("verbs" in what) && verbs(object))
player:notify("Verb definitions:");
for v in (verbs(object))
$command_utils:suspend_if_needed(0);
player:notify(tostr("    ", v));
endfor
endif
if ("props" in what)
if (properties(object))
player:notify("Property definitions:");
for p in (properties(object))
$command_utils:suspend_if_needed(0);
player:notify(tostr("    ", p));
endfor
endif
all_props = $object_utils:all_properties(object);
if (all_props != {})
player:notify("Properties:");
for p in (all_props)
$command_utils:suspend_if_needed(0);
val = object.(p);
if (val == E_PERM)
STR = "(Permission denied.)";
else
STR = $string_utils:from_value_suspended(val, 1, -1);
endif
player:notify(tostr("    ", p, ": ", STR));
endfor
endif
endif
elseif (player.programmer)
player:notify("** Can't list properties or verbs: permission denied.");
endif
if (object.contents)
player:notify("Contents:");
for o in (object.contents)
$command_utils:suspend_if_needed(0);
player:notify(tostr("    ", o.name, " (", o, ")"));
endfor
endif
.
#60:7
set_task_perms(caller_perms());
object = args[1];
pname = args[2];
if (pname in this.builtin_props)
player:notify(tostr(object, ".", pname));
player:notify("Built-in property.");
else
info = property_info(object, pname);
if (typeof(info) == ERR)
player:notify(tostr(info));
return;
endif
owner = info[1];
perms = info[2];
player:notify(tostr(object, ".", pname));
player:notify(tostr("Owner:        ", valid(owner) ? tostr(owner.name, " (", owner, ")") | "*** NONE ***"));
player:notify(tostr("Permissions:  ", perms));
endif
player:notify(tostr("Value:        ", $string_utils:print(object.(pname))));
.
#60:8
set_task_perms(caller_perms());
object = args[1];
vname = args[2];
if (!(hv = $object_utils:has_verb(object, vname)))
player:notify("That object does not define that verb.");
return;
elseif (hv[1] != object)
player:notify(tostr("Object ", object, " does not define that verb, but its ancestor ", hv[1], " does."));
object = hv[1];
endif
info = verb_info(object, vname);
if (typeof(info) == ERR)
player:notify(tostr(info));
return;
endif
owner = info[1];
perms = info[2];
names = info[3];
arg_specs = verb_args(object, vname);
player:notify(tostr(object, ":", names));
player:notify(tostr("Owner:            ", valid(owner) ? tostr(owner.name, " (", owner, ")") | "*** NONE ***"));
player:notify(tostr("Permissions:      ", perms));
player:notify(tostr("Direct Object:    ", arg_specs[1]));
player:notify(tostr("Preposition:      ", arg_specs[2]));
player:notify(tostr("Indirect Object:  ", arg_specs[3]));
.
#60:9
if (args[4..5] == {"none", "this"})
return 0;
endif
thisobj = args[1];
verb = args[2];
adobj = args[3];
aprep = args[4];
aiobj = args[5];
prep_part = ((aprep == "any") ? "to" | this:short_prep(aprep));
".........`any' => `to' (arbitrary),... `none' => empty string...";
if ((adobj == "this") && (dobj == thisobj))
dobj_part = dobjstr;
iobj_part = (((!prep_part) || (aiobj == "none")) ? "" | ((aiobj == "this") ? dobjstr | iobjstr));
elseif ((aiobj == "this") && (iobj == thisobj))
dobj_part = ((adobj == "any") ? dobjstr | ((adobj == "this") ? iobjstr | ""));
iobj_part = iobjstr;
elseif (!("this" in args[3..5]))
dobj_part = ((adobj == "any") ? dobjstr | "");
iobj_part = ((prep_part && (aiobj == "any")) ? iobjstr | "");
else
return 0;
endif
return tostr(verb, dobj_part ? " " + dobj_part | "", prep_part ? " " + prep_part | "", iobj_part ? " " + iobj_part | "");
.
#60:10
"returns the permissions of the current verb (either the owner or the result of the most recent set_task_perms()).";
return caller_perms();
.
#60:11
"returns the object where the current verb is defined.";
return callers()[1][4];
.
#60:12
":verb_documentation([object,verbname]) => documentation at beginning of verb code, if any";
"default is the calling verb";
set_task_perms(caller_perms());
if (args)
object = args[1];
vname = args[2];
else
c = callers()[1];
object = c[4];
vname = c[2];
endif
if (typeof(code = verb_code(object, vname)) == ERR)
return tostr(code);
else
doc = {};
for line in (code)
if (match(line, "^\"%([^\\\"]%|\\.%)*\";$"))
"... now that we're sure `line' is just a string, eval() is safe...";
doc = {@doc, $no_one:eval("; return " + line)[2]};
else
return doc;
endif
endfor
return doc;
endif
.
#60:13
":set_verb_documentation(object,verbname,text)";
"  changes documentation at beginning of verb code";
"  text is either a string or a list of strings";
"  returns a non-1 value if anything bad happens...";
set_task_perms(caller_perms());
if (typeof(code = verb_code(object = args[1], vname = args[2])) == ERR)
return code;
elseif (typeof(vd = $code_utils:verb_documentation(object, vname)) == ERR)
return vd;
elseif (!(typeof(text = args[3]) in {LIST, STR}))
return E_INVARG;
else
newdoc = {};
for l in ((typeof(text) == LIST) ? text | {text})
if (typeof(l) != STR)
return E_INVARG;
endif
newdoc = {@newdoc, $string_utils:print(l) + ";"};
endfor
if ((ERR == typeof(svc = set_verb_code(object, vname, {@newdoc, @code[length(vd) + 1..length(code)]}))) || svc)
"... this shouldn't happen.  I'm not setting this code -d just yet...";
return svc;
else
return 1;
endif
endif
.
#60:14
"$code_utils:parse_propref(string)";
"Parses string as a MOO-code property reference, returning {object-string, prop-name-string} for a successful parse and false otherwise.  It always returns the right object-string to pass to, for example, this-room:match_object.";
s = args[1];
if (dot = index(s, "."))
object = s[1..dot - 1];
prop = s[dot + 1..length(s)];
if ((object == "") || (prop == ""))
return 0;
elseif (object[1] == "$")
object = #0.(object[2..length(object)]);
if (typeof(object) != OBJ)
return 0;
endif
object = tostr(object);
endif
elseif (index(s, "$") == 1)
object = "#0";
prop = s[2..length(s)];
else
return 0;
endif
return {object, prop};
.
#60:15
"$code_utils:parse_verbref(string)";
"Parses string as a MOO-code verb reference, returning {object-string, verb-name-string} for a successful parse and false otherwise.  It always returns the right object-string to pass to, for example, this-room:match_object().";
s = args[1];
if (colon = index(s, ":"))
object = s[1..colon - 1];
verbname = s[colon + 1..length(s)];
if (!(object && verbname))
return 0;
elseif (object[1] == "$")
pname = object[2..length(object)];
if ((!(pname in properties(#0))) || (typeof(object = #0.(pname)) != OBJ))
return 0;
endif
object = tostr(object);
endif
return {object, verbname};
else
return 0;
endif
.
#60:16
":parse_arg_spec(@args)";
"  attempts to parse the given sequence of args into a verb_arg specification";
"returns {verb_args,remaining_args} if successful.";
"  e.g., :parse_arg_spec(\"this\",\"in\",\"front\",\"of\",\"any\",\"foo\"..)";
"           => {{\"this\",\"in front of\",\"any\"},{\"foo\"..}}";
"returns a string error message if parsing fails.";
nargs = length(args);
if (nargs < 1)
return {{}, {}};
elseif ((ds = args[1]) == "tnt")
return {{"this", "none", "this"}, listdelete(args, 1)};
elseif (!(ds in {"this", "any", "none"}))
return tostr("\"", ds, "\" is not a valid direct object specifier.");
elseif ((nargs < 2) || (args[2] in {"none", "any"}))
verbargs = args[1..min(3, nargs)];
rest = args[4..nargs];
elseif (!(gp = $code_utils:get_prep(@args[2..nargs]))[1])
return tostr("\"", args[2], "\" is not a valid preposition.");
else
verbargs = {ds, @gp[1..min(2, nargs = length(gp))]};
rest = gp[3..nargs];
endif
if ((length(verbargs) >= 3) && (!(verbargs[3] in {"this", "any", "none"})))
return tostr("\"", verbargs[3], "\" is not a valid indirect object specifier.");
endif
return {verbargs, rest};
.
#60:17
if (server_version() != this._version)
this:_fix_preps();
endif
return this.prepositions;
.
#60:18
":short_prep(p) => shortest preposition equivalent to p";
"p may be a single word or one of the strings returned by verb_args().";
if (server_version() != this._version)
this:_fix_preps();
endif
word = args[1];
word = word[1..index(word + "/", "/") - 1];
if (p = (word in this._other_preps))
return this._short_preps[this._other_preps_n[p]];
elseif (word in this._short_preps)
return word;
else
return "";
endif
.
#60:19
if (server_version() != this._version)
this:_fix_preps();
endif
prep = args[1];
if (p = (prep in this._short_preps))
return this.prepositions[p];
elseif (p = (prep in this._other_preps))
return this.prepositions[this._other_preps_n[p]];
else
return "";
endif
.
#60:20
":get_prep(@args) extracts the prepositional phrase from the front of args, returning a list consisting of the preposition (or \"\", if none) followed by the unused args.";
":get_prep(\"in\",\"front\",\"of\",...) => {\"in front of\",...}";
":get_prep(\"inside\",...)          => {\"inside\",...}";
":get_prep(\"frabulous\",...}       => {\"\", \"frabulous\",...}";
prep = "";
allpreps = {@this._short_preps, @this._other_preps};
rest = 1;
for i in [1..length(args)]
try = ((i == 1) ? args[1] | tostr(try, " ", args[i]));
if (try in allpreps)
prep = try;
rest = (i + 1);
endif
if (!(try in this._multi_preps))
return {prep, @args[rest..length(args)]};
endif
endfor
return {prep, @args[rest..length(args)]};
.
#60:21
":_fix_preps() updates the properties on this having to do with prepositions.";
"_fix_preps should be called whenever we detect that a new server version has been installed.";
orig_args = verb_args(this, verb);
multis = (nothers = (others = (shorts = (longs = {}))));
i = 0;
while (typeof(set_verb_args(this, verb, {"this", tostr(i), "this"})) != ERR)
l = verb_args(this, verb)[2];
all = $string_utils:explode(l, "/");
s = all[1];
for p in (listdelete(all, 1))
if (length(p) <= length(s))
s = p;
endif
endfor
for p in (all)
while (j = rindex(p, " "))
multis = {p = p[1..j - 1], @multis};
endwhile
endfor
longs = {@longs, l};
shorts = {@shorts, s};
others = {@others, @setremove(all, s)};
nothers = {@nothers, @$list_utils:make(length(all) - 1, length(shorts))};
i = (i + 1);
endwhile
set_verb_args(this, verb, orig_args);
this.prepositions = longs;
this._short_preps = shorts;
this._other_preps = others;
this._other_preps_n = nothers;
this._multi_preps = multis;
this._version = server_version();
return;
.
#60:22
":find_verb_named(object,name[,n])";
"  returns the *number* of the first verb on object matching the given name.";
"  optional argument n, if given, starts the search with verb n,";
"  causing the first n verbs (0..n-1) to be ignored.";
"  -1 is returned if no verb is found.";
"  This routine does not find inherited verbs.";
object = args[1];
name = args[2];
for i in [{@args, 0}[3]..length(verbs(object)) - 1]
verbinfo = verb_info(object, tostr(i));
if (this:verbname_match(verbinfo[3], name))
return i;
endif
endfor
return -1;
.
#60:23
":find_verb_named(object,name[,n])";
"  returns the *number* of the last verb on object matching the given name.";
"  optional argument n, if given, starts the search with verb n-1,";
"  causing verbs (n..length(verbs(object))) to be ignored.";
"  -1 is returned if no verb is found.";
"  This routine does not find inherited verbs.";
object = args[1];
name = args[2];
last = {@args, -1}[3];
if (last < 0)
last = length(verbs(object));
endif
for i in [1..last]
verbinfo = verb_info(object, tostr(last - i));
if (this:verbname_match(verbinfo[3], name))
return last - i;
endif
endfor
return -1;
.
#60:24
":find_callable_verb_named(object,name[,n])";
"  returns the *number* of the first verb on object that matches the given";
"  name and has the x flag set.";
"  optional argument n, if given, starts the search with verb n,";
"  causing the first n verbs (0..n-1) to be ignored.";
"  -1 is returned if no verb is found.";
"  This routine does not find inherited verbs.";
object = args[1];
name = args[2];
for i in [{@args, 0}[3]..length(verbs(object)) - 1]
verbinfo = verb_info(object, tostr(i));
if (index(verbinfo[2], "x") && this:verbname_match(verbinfo[3], name))
return i;
endif
endfor
return -1;
.
#60:25
":verbname_match(fullverbname,name) => TRUE iff `name' is a valid name for a verb with the given `fullname'";
verblist = ((" " + args[1]) + " ");
if (index(verblist, (" " + (name = args[2])) + " ") && (!match(name, "[ *]")))
"Note that if name has a * or a space in it, then it can only match one of the * verbnames";
return 1;
else
namelen = length(name);
while (m = match(verblist, "[^ *]*%(%*%)[^ ]*"))
vlast = m[2];
if ((namelen >= (m[3][1][1] - m[1])) && ((!(v = strsub(verblist[m[1]..vlast], "*", ""))) || (index(v, (verblist[vlast] == "*") ? name[1..min(namelen, length(v))] | name) == 1)))
return 1;
endif
verblist = verblist[vlast + 1..length(verblist)];
endwhile
endif
return 0;
.
#60:26
"$code_utils:find_verbs_containing(pattern[,object|object-list])";
"";
"Print (to player) the name and owner of every verb in the database whose code contains PATTERN as a substring.  Optional second argument limits the search to the specified object or objects.";
"";
"Because it searches the entire database, this function may suspend the task several times before returning.";
"";
set_task_perms(caller_perms());
"... puts the task in a player's own job queue and prevents someone from learning about verbs that are otherwise unreadable to him/her.";
pattern = args[1];
where = {@args, 0}[2];
count = 0;
if (typeof(where) == NUM)
for i in [where..tonum(max_object())]
if (valid(o = toobj(i)))
count = (count + this:_find_verbs_containing(pattern, o));
endif
if ($command_utils:running_out_of_time())
player:notify(tostr("...", o));
suspend(0);
endif
endfor
elseif (typeof(where) == LIST)
for o in (where)
count = (count + this:_find_verbs_containing(pattern, o));
endfor
else
"...typeof(where) == OBJ...";
count = this:_find_verbs_containing(pattern, where);
endif
player:notify("");
player:notify(tostr("Total: ", count, " verbs."));
.
#60:27
":_find_verbs_containing(pattern,object)";
"number of verbs in object with code having a line containing pattern";
"prints verbname and offending line to player";
set_task_perms(caller_perms());
pattern = args[1];
count = 0;
verbs = verbs(o = args[2]);
if (typeof(verbs) == ERR)
player:notify(tostr("verbs(", o, ") => ", verbs));
return 0;
endif
for vnum in [0..length(verbs) - 1]
if (l = this:_grep_verb_code(pattern, o, vname = tostr(vnum)))
owner = verb_info(o, vname)[1];
player:notify(tostr(o, ":", verbs[vnum + 1], " [", valid(owner) ? owner.name | "Recycled Player", " (", owner, ")]:  ", l));
count = (count + 1);
endif
if ($command_utils:running_out_of_time())
player:notify(tostr("...", o));
suspend(0);
endif
endfor
return count;
.
#60:28
"$code_utils:find_verbs_matching(pattern[,object|object-list])";
"";
"Print (to player) the name and owner of every verb in the database whose code has a substring matches the regular expression PATTERN.  Optional second argument limits the search to the specified object or objects.";
"";
"Because it searches the entire database, this function may suspend the task several times before returning.";
"";
set_task_perms(caller_perms());
"... puts the task in a player's own job queue and prevents someone from learning about verbs that are otherwise unreadable to him/her.";
pattern = args[1];
where = {@args, 0}[2];
count = 0;
if (typeof(where) == NUM)
for i in [where..tonum(max_object())]
if (valid(o = toobj(i)))
count = (count + this:_find_verbs_matching(pattern, o));
endif
if ($command_utils:running_out_of_time())
player:notify(tostr("...", o));
suspend(0);
endif
endfor
elseif (typeof(where) == LIST)
for o in (where)
count = (count + this:_find_verbs_matching(pattern, o));
endfor
else
count = this:_find_verbs_matching(pattern, args[2]);
endif
player:notify("");
player:notify(tostr("Total: ", count, " verbs."));
.
#60:29
":_find_verbs_matching(regexp,object)";
"number of verbs in object with code having a line matching regexp";
"prints verbname and offending line to player";
set_task_perms(caller_perms());
pattern = args[1];
count = 0;
verbs = verbs(o = args[2]);
if (typeof(verbs) == ERR)
player:notify(tostr("verbs(", o, ")  => ", verbs));
return 0;
endif
for vnum in [0..length(verbs) - 1]
if (l = this:_egrep_verb_code(pattern, o, vname = tostr(vnum)))
owner = verb_info(o, vname)[1];
player:notify(tostr(o, ":", verbs[vnum + 1], " [", valid(owner) ? owner.name | "Recycled Player", " (", owner, ")]:  ", l));
count = (count + 1);
endif
if ($command_utils:running_out_of_time())
player:notify(tostr("...", o));
suspend(0);
endif
endfor
return count;
.
#60:30
":_grep_verb_code(pattern,object,verbname) => line number or 0";
"  returns line number on which pattern occurs in code for object:verbname";
set_task_perms(caller_perms());
pattern = args[1];
for line in (vc = verb_code(@listdelete(args, 1)))
if (index(line, pattern))
return line;
endif
endfor
return 0;
.
#60:31
":_egrep_verb_code(regexp,object,verbname) => 0 or line number";
"  returns line number of first line matching regexp in object:verbname code";
set_task_perms(caller_perms());
pattern = args[1];
for line in (vc = verb_code(@listdelete(args, 1)))
if (match(line, pattern))
return line;
endif
endfor
return 0;
.
#60:32
"Parse [from <start>] [to <end>] [for <name>].";
"Takes a series of strings, most likely @args with dobjstr removed.";
"Returns a list {NUM start, NUM end, STR name}, or {} if there is an error.";
fail = (length(args) % 2);
start = 0;
end = tonum(max_object());
match = "";
while (args && (!fail))
prep = args[1];
if (prep == "from")
if ((start = player.location:match_object(args[2])) >= #0)
start = tonum(start);
else
start = tonum(args[2]);
endif
elseif (prep == "to")
if ((end = player.location:match_object(args[2])) >= #0)
end = tonum(end);
else
end = tonum(args[2]);
endif
elseif (prep == "for")
match = args[2];
else
fail = 1;
endif
args = args[3..length(args)];
endwhile
return fail ? {} | {start, end, match};
.
#60:33
olist = {player, @$object_utils:ancestors(player)};
if (valid(player.location))
olist = {@olist, player.location, @$object_utils:ancestors(player.location)};
endif
dbs = {};
for o in (olist)
h = o.help;
if (typeof(h) == OBJ)
h = {h};
endif
for db in (h)
if ((typeof(db) == OBJ) && (valid(db) && (!(db in dbs))))
dbs = {@dbs, db};
endif
endfor
endfor
return {@dbs, $help};
.
#60:34
":help_db_search(string,dblist)";
"  searches each of the help db's in dblist for a topic matching string.";
"  Returns  {db,topic}  or  {$ambiguous_match,{topic...}}  or {}";
what = args[1];
dblist = args[2];
topics = {};
help = 1;
for db in (dblist)
if ({what} == (ts = db:find_topics(what)))
return {db, ts[1]};
elseif (ts && (typeof(ts) == LIST))
if (help)
help = db;
endif
for t in (ts)
topics = setadd(topics, t);
endfor
endif
endfor
if (length(topics) > 1)
return {$ambiguous_match, topics};
elseif (topics)
return {help, topics[1]};
else
return {};
endif
.
#60:35
":corify_object(object)  => string representing object";
"  usually just returns tostr(object), but in the case of objects that have";
"  corresponding #0 properties, return the appropriate $-string.";
object = args[1];
for p in (properties(#0))
if (#0.(p) == object)
return "$" + p;
endif
endfor
return tostr(object);
.
#60:36
"$code_utils:substitute(string,subs) => new line";
"Subs are a list of lists, {{\"target\",\"sub\"},{...}...}";
"Substitutes targets for subs in a delimited string fashion, avoiding substituting anything inside quotes, e.g. player:tell(\"don't sub here!\")";
s = args[1];
subs = args[2];
lets = "abcdefghijklmnopqrstuvwxyz0123456789";
for x in (subs)
len = length(sub = x[1]);
delimited = (index(lets, sub[1]) && index(lets, sub[len]));
prefix = "";
while (i = index(s, sub))
prefix = (prefix + s[1..i - 1]);
if ((((prefix == "") || ((!delimited) || (!index(lets, prefix[length(prefix)])))) && ((!delimited) || (((i + len) > length(s)) || (!index(lets, s[i + len]))))) && (!this:inside_quotes(prefix)))
prefix = (prefix + x[2]);
else
prefix = (prefix + s[i..(i + len) - 1]);
endif
s = s[i + len..length(s)];
endwhile
s = (prefix + s);
endfor
return s;
.
#60:37
"See if the end of the string passed as args[1] ends 'inside' a doublequote.  Used by $code_utils:substitute.";
string = args[1];
quoted = 0;
for i in [1..length(string)]
if ((string[i] == "\"") && ((!quoted) || (string[i - 1] != "\\")))
quoted = (!quoted);
endif
endfor
return quoted;
.
#60:38
"verb_or_property(<obj>, <name> [, @<args>])";
"Looks for a callable verb or property named <name> on <obj>.";
"If <obj> has a callable verb named <name> then return <obj>:(<name>)(@<args>).";
"If <obj> has a property named <name> then return <obj>.(<name>).";
"Otherwise return E_PROPNF.";
"N.B.: a verb returning E_VERBNF will act like an undefined verb.";
set_task_perms(caller_perms());
return ((val = args[1]:(args[2])(@args[3..length(args)])) == E_VERBNF) ? args[1].(args[2]) | val;
.
#60:39
"task_valid(NUM id)";
"Return true iff there is currently a valid task with the given id.";
set_task_perms($no_one);
id = args[1];
return (id == task_id()) || (E_PERM == kill_task(id));
.
#60:40
if (a = $list_utils:assoc(args[1], queued_tasks()))
return a[5];
else
return E_INVARG;
endif
.
#60:41
":argstr(verb,args[,argstr]) => what argstr should have been.  ";
"Recall that the command line is parsed into a sequence of words; `verb' is";
"assigned the first word, `args' is assigned the remaining words, and argstr";
"is assigned a substring of the command line, which *should* be the one";
"starting first nonblank character after the verb, but is instead (because";
"the parser is BROKEN!) the one starting with the first nonblank character";
"after the first space in the line, which is not necessarily after the verb.";
"Clearly, if the verb contains spaces --- which can happen if you use";
"backslashes and quotes --- this loses, and argstr will then erroneously";
"have extra junk at the beginning.  This verb, given verb, args, and the";
"actual argstr, returns what argstr should have been.";
verb = args[1];
argstr = {@args, argstr}[3];
n = length(args = args[2]);
if (!index(verb, " "))
return argstr;
elseif (!args)
return "";
endif
"space in verb => two possible cases:";
"(1) first space was not in a quoted string.";
"    first word of argstr == rest of verb unless verb ended on this space.";
if ((nqargs = $string_utils:words(argstr)) == args)
return argstr;
elseif (((nqn = length(nqargs)) == (n + 1)) && (nqargs[2..nqn] == args))
return argstr[$string_utils:word_start(argstr)[2][1]..length(argstr)];
else
"(2) first space was in a quoted string.";
"    argstr starts with rest of string";
qs = $string_utils:word_start("\"" + argstr);
return argstr[qs[(length(qs) - length(args)) + 1][1] - 1..length(argstr)];
endif
.
#60:42
":verbname_match(fullverbname,name) => TRUE iff `name' is a valid name for a verb with the given `fullname'";
verblist = ((" " + args[1]) + " ");
if (index(verblist, (" " + (name = args[2])) + " ") && (!(index(name, "*") || index(name, " "))))
"Note that if name has a * or a space in it, then it can only match one of the * verbnames";
return 1;
else
namelen = length(name);
while (star = index(verblist, "*"))
vstart = (rindex(verblist[1..star], " ") + 1);
vlast = ((vstart + index(verblist[vstart..length(verblist)], " ")) - 2);
if ((namelen >= (star - vstart)) && ((!(v = strsub(verblist[vstart..vlast], "*", ""))) || (index(v, (verblist[vlast] == "*") ? name[1..min(namelen, length(v))] | name) == 1)))
return 1;
endif
verblist = verblist[vlast + 1..length(verblist)];
endwhile
endif
return 0;
.
#60:43
":show_who_listing(players[,more_players])";
" prints a listing of the indicated players.";
" For players in the first list, idle/connected times are shown if the player is logged in, otherwise the last_disconnect_time is shown.  For players in the second list, last_disconnect_time is shown, no matter whether the player is logged in.";
idles = (itimes = (offs = (otimes = {})));
for p in (args[2])
if (!valid(p))
caller:notify(tostr(p, " <invalid>"));
elseif (typeof(t = p.last_disconnect_time) == NUM)
if (!(p in offs))
offs = {@offs, p};
otimes = {@otimes, {-t, -t, p}};
endif
elseif (is_player(p))
caller:notify(tostr(p.name, " (", p, ") ", (t == E_PROPNF) ? "is not a $player." | "has a garbled .last_disconnect_time."));
else
caller:notify(tostr(p.name, " (", p, ") is not a player."));
endif
endfor
for p in (args[1])
if (p in offs)
elseif (!valid(p))
caller:notify(tostr(p, " <invalid>"));
elseif (typeof(i = idle_seconds(p)) != ERR)
if (!(p in idles))
idles = {@idles, p};
itimes = {@itimes, {i, connected_seconds(p), p}};
endif
elseif (typeof(t = p.last_disconnect_time) == NUM)
offs = {@offs, p};
otimes = {@otimes, {-t, -t, p}};
elseif (is_player(p))
caller:notify(tostr(p.name, " (", p, ") not logged in.", (t == E_PROPNF) ? "  Not a $player." | "  Garbled .last_disconnect_time."));
else
caller:notify(tostr(p.name, " (", p, ") is not a player."));
endif
endfor
if (!(idles || offs))
return 0;
endif
idles = $list_utils:sort_alist(itimes);
offs = $list_utils:sort_alist(otimes);
"...";
"... calculate widths...";
"...";
headers = {"Player name", @idles ? {"Connected", "Idle time"} | {"Last disconnect time", ""}, "Location"};
total_width = (caller:linelen() || 79);
max_name = (total_width / 4);
name_width = length(headers[1]);
names = (locations = {});
for lst in ({@idles, @offs})
$command_utils:suspend_if_needed(0);
p = lst[3];
namestr = tostr(p.name[1..min(max_name, length(p.name))], " (", p, ")");
name_width = max(length(namestr), name_width);
names = {@names, namestr};
if (typeof(wlm = p.location:who_location_msg(p)) != STR)
wlm = (valid(p.location) ? p.location.name | tostr("** Nowhere ** (", p.location, ")"));
endif
locations = {@locations, wlm};
endfor
time_width = (3 + (offs ? 12 | length("59 minutes")));
before = {0, w1 = (3 + name_width), w2 = (w1 + time_width), w2 + time_width};
"...";
"...print headers...";
"...";
su = $string_utils;
tell1 = headers[1];
tell2 = su:space(tell1, "-");
for j in [2..4]
tell1 = (su:left(tell1, before[j]) + headers[j]);
tell2 = (su:left(tell2, before[j]) + su:space(headers[j], "-"));
endfor
caller:notify(tell1[1..min(length(tell1), total_width)]);
caller:notify(tell2[1..min(length(tell2), total_width)]);
"...";
"...print lines...";
"...";
active = 0;
for i in [1..total = ((ilen = length(idles)) + length(offs))]
if (i <= ilen)
lst = idles[i];
if (lst[1] < (5 * 60))
active = (active + 1);
endif
l = {names[i], su:from_seconds(lst[2]), su:from_seconds(lst[1]), locations[i]};
else
lct = offs[i - ilen][3].last_connect_time;
ldt = offs[i - ilen][3].last_disconnect_time;
ctime = (caller:ctime(ldt) || ctime(ldt));
l = {names[i], (lct <= time()) ? ctime | "Never", "", locations[i]};
if ((i == (ilen + 1)) && idles)
caller:notify(su:space(before[2]) + "------- Disconnected -------");
endif
endif
tell1 = l[1];
for j in [2..4]
tell1 = (su:left(tell1, before[j]) + l[j]);
endfor
caller:notify(tell1[1..min(length(tell1), total_width)]);
if ($command_utils:running_out_of_time())
now = time();
suspend(0);
if ((time() - now) > 10)
caller:notify(tostr("Plus ", total - i, " other players (", total, " total; out of time and lag is high)."));
return;
endif
endif
endfor
"...";
"...epilogue...";
"...";
caller:notify("");
if (total == 1)
active_str = (", who has" + ((active == 1) ? "" | " not"));
else
if (active == total)
active_str = ((active == 2) ? "s, both" | "s, all");
elseif (active == 0)
active_str = "s, none";
else
active_str = tostr("s, ", active);
endif
active_str = tostr(active_str, " of whom ha", (active == 1) ? "s" | "ve");
endif
caller:notify(tostr("Total: ", total, " player", active_str, " been active recently."));
return total;
.
#60:44
":_egrep_verb_code(regexp,object,verbname) => list of lines number";
"  returns list of all lines matching regexp in object:verbname code";
set_task_perms(caller_perms());
pattern = args[1];
lines = {};
for line in (vc = verb_code(@args[2..3], 1, 0))
if (match(line, pattern))
lines = {@lines, line};
endif
endfor
return lines;
.
#60:45
":_grep_verb_code_all(pattern,object,verbname) => list of lines";
"  returns list of lines on which pattern occurs in code for object:verbname";
set_task_perms(caller_perms());
pattern = args[1];
lines = {};
for line in (vc = verb_code(@args[2..3]))
if (index(line, pattern))
lines = {@lines, line};
endif
endfor
return lines;
.
#60:47
":verb_usage([object,verbname]) => usage string at beginning of verb code, if any";
"default is the calling verb";
set_task_perms(caller_perms());
if (args)
object = args[1];
vname = args[2];
else
c = callers()[1];
object = c[4];
vname = c[2];
endif
if (typeof(code = verb_code(object, vname)) == ERR)
return code;
else
doc = {};
for line in (code)
if (match(line, "^\"%([^\\\"]%|\\.%)*\";$"))
"... now that we're sure `line' is just a string, eval() is safe...";
e = $no_one:eval(line)[2];
if (subs = match(e, "^%(Usage: +%)%([^ ]+%)%(.*$%)"))
"Server is broken, hence the next three lines:";
if (subs[3][3][1] > subs[3][3][2])
subs[3][3] = {0, -1};
endif
indent = (("^%(" + $string_utils:space(length(substitute("%1", subs)))) + " *%)%([^ ]+%)%(.*$%)");
docverb = substitute("%2", subs);
if (match(vname, "^[0-9]+$"))
vname = docverb;
endif
doc = {@doc, (substitute("%1", subs) + vname) + substitute("%3", subs)};
elseif (subs = match(e, indent))
if (substitute("%2", subs) == docverb)
doc = {@doc, (substitute("%1", subs) + vname) + substitute("%3", subs)};
else
doc = {@doc, e};
endif
elseif (indent)
return doc;
endif
else
return doc;
endif
endfor
return doc;
endif
.
#61:0
return $player.ownership_quota;
.
#61:1
return $prog.ownership_quota;
.
#61:2
text = pass(@args);
if ((text != E_PROPNF) || (!valid(object = $string_utils:match_object(what = args[1], player.location))))
return text;
elseif (ohelp = ((object = $string_utils:match_object(what, player.location)):help_msg() || object.help_msg))
"...geez. life is simple if we set -d...";
return {tostr(object.name, " (", object, "):"), "----", @(typeof(ohelp) == LIST) ? ohelp | {ohelp}};
else
about = $object_utils:has_verb(object, "about");
return {tostr("Sorry, but no help is available on ", object.name, " (", object, ")."), tostr("Try `@examine ", what, "'", @about ? {" or `about ", what, "'"} | {}, ".")};
endif
.
#61:3
topiclist = pass(@args);
if (topiclist || (!args))
return topiclist;
elseif (valid(o = $string_utils:match_object(what = args[1], player.location)))
return {what};
else
return {};
endif
.
#61:4
text = {};
for db in ($code_utils:help_db_list())
if ($object_utils:has_callable_verb(db, "index"))
text = {@text, @db:index({tostr(db.name, " (", db, ")")})};
endif
endfor
return text;
.
#61:5
hdr = "Available Help Indices";
text = {"", hdr, $string_utils:space(hdr, "-")};
for db in ($code_utils:help_db_list())
if ($object_utils:isa(db, $generic_help))
for p in (properties(db))
if ((h = db.(p)) && ("*index*" in h))
text = {@text, tostr($string_utils:left(p, 14), " -- ", h[2] || db.name, " (", db, ")")};
endif
endfor
endif
endfor
for p in (properties(this))
if (this.(p) && (this.(p)[1] == "*full_index*"))
return {@text, "", tostr($string_utils:left(p, 14), " -- ", "EVERYTHING")};
endif
endfor
return text;
.
#61:6
wizzes = {#2, @$list_utils:randomly_permute(setremove($object_utils:leaves($wiz), #2))};
numwiz = length(wizzes);
hlist = {"ArchWizard:", "Wizard" + ((numwiz == 2) ? ":" | "s:"), @$list_utils:make(max(0, numwiz - 2), "")};
slist = {};
su = $string_utils;
for i in [1..numwiz]
wiz = wizzes[i];
slist = {@slist, tostr(su:left(hlist[i], 13), su:left(wiz.name, 16), (wpi = wiz.public_identity.name) ? (" (a.k.a. " + wpi) + ")" | "")};
endfor
return slist;
.
#61:7
if (((text = pass(@args)) != E_PROPNF) || ((!valid(object = $string_utils:match_object(what = args[1], player.location))) || (!$object_utils:has_property(object, "help_msg"))))
return text;
else
return {tostr(";;", $code_utils:corify_object(object), ".help_msg = $command_utils:read_lines()"), @$command_utils:dump_lines((typeof(text = object.help_msg) == LIST) ? text | {text})};
endif
.
#62:0
"Return a toad (child of #1, owned by $hacker) from this.contents.  Move it to #-1.  Recreate as a child of args[1], or of #1 if no args are given.  Chown to caller_perms() or args[2] if present.";
what = (args ? args[1] | #1);
who = ((length(args) == 2) ? args[2] | caller_perms());
if (!(caller_perms().wizard || (who == caller_perms())))
return E_PERM;
elseif (!(valid(what) && is_player(who)))
return E_INVARG;
elseif ((((who != what.owner) && (!what.f)) && (!who.wizard)) && (!caller_perms().wizard))
return E_PERM;
endif
for potential in (this.contents)
if (((potential.owner == $hacker) && (parent(potential) == $garbage)) && (!children(potential)))
return this:setup_toad(potential, who, what);
endif
endfor
return E_NONE;
.
#62:1
"Take the object in args[1], and turn it into a child of #1 owned by $hacker.";
item = args[1];
if (!$perm_utils:controls(caller_perms(), item))
$error:raise(E_PERM);
endif
this:addhist(caller_perms(), item);
if (is_player(item))
$wiz_utils:unset_player(item);
endif
"...recreate can fail (:recycle can crash)...";
this:add_orphan(item);
$building_utils:recreate(item, $garbage);
this:remove_orphan(item);
"...";
$wiz_utils:set_owner(item, $hacker);
item.name = tostr("Recyclable ", item);
move(item, this);
.
#62:2
e = set_task_perms(caller_perms());
if (typeof(e) == ERR)
return e;
else
val = this:_recreate(@args);
return (val == E_NONE) ? create(@args) | val;
endif
.
#62:3
if (caller == this)
h = this.history;
if ((len = length(h)) > this.nhist)
h = h[len - this.nhist..len];
endif
this.history = {@h, args};
endif
.
#62:4
if ($perm_utils:controls(valid(caller_perms()) ? caller_perms() | player, this))
for x in (this.history)
pname = (valid(x[1]) ? x[1].name | "A recycled player");
oname = (valid(x[2]) ? x[2].name | "recycled");
player:notify(tostr(pname, " (", x[1], ") recycled ", x[2], " (now ", oname, ")"));
endfor
else
player:notify("Sorry.");
endif
.
#62:5
dobj = (valid(dobj) ? dobj | $string_utils:match_object(dobjstr, player.location));
if (!valid(dobj))
dobj = ((n = tonum(dobjstr)) ? toobj(n) | #-1);
endif
if (!valid(dobj))
player:tell("Couldn't parse ", dobjstr, " as a valid object number.");
elseif (!(dobj in this.contents))
player:tell("Couldn't find ", dobj, " in ", this.name, ".");
else
if (typeof(emsg = this:setup_toad(dobj, player, #1)) != ERR)
dobj:moveto(player);
dobj.aliases = {dobj.name = ("Object " + tostr(dobj))};
player:tell("You now have ", dobj, " ready for @recreation.");
if (this.announce_removal_msg)
player.location:announce($string_utils:pronoun_sub(this.announce_removal_msg));
endif
else
player:tell(emsg);
endif
endif
.
#62:6
"this:setup_toad(objnum,new_owner,parent)";
"Called by :_create and :request.";
if (caller != this)
return E_PERM;
endif
potential = args[1];
who = args[2];
what = args[3];
if (who.ownership_quota <= 0)
return E_QUOTA;
else
$wiz_utils:set_owner(potential, who);
move(potential, #-1);
set_task_perms({@callers(), {#-1, "", player}}[2][3]);
"... if :initialize crashes...";
this:add_orphan(potential);
$building_utils:recreate(potential, what);
this:remove_orphan(potential);
"... if we don't get this far, the object stays on the orphan list...";
"... orphan list should be checked periodically...";
return potential;
endif
.
#62:7
if (caller == this)
this.orphans = setadd(this.orphans, args[1]);
endif
.
#62:8
if (caller == this)
this.orphans = setremove(this.orphans, args[1]);
endif
.
#62:9
"Usage:  valid(object)";
"True if object is valid and not $garbage.";
return valid(args[1]) && (parent(args[1]) != $garbage);
.
#62:10
this.orphans = {};
this.history = {};
pass();
.
#63:0
return ("Garbage object " + tostr(this)) + ".";
.
#63:1
player:tell(this:description());
.
#63:2
return tostr("Recyclable ", this);
.
#63:3
return;
.
#64:0
if (i = (args[1] in {"noinclude", "sender"}))
return {{{"include", "all"}[i], !args[2]}};
else
return {args};
endif
.
#64:1
"... we'll take anything...";
raw = args[2];
if (raw == 1)
"...+@mail => @mailo=new";
return {args[1], "new"};
else
return args[1..2];
endif
.
#64:2
oname = args[1];
raw = args[2];
if (typeof(raw) == LIST)
if (length(raw) > 1)
return "Too many arguments.";
endif
raw = raw[1];
elseif (typeof(raw) == NUM)
return {oname, raw && ((oname == "manymsgs") ? 20 | 1)};
endif
if ((value = $code_utils:tonum(raw)) == E_TYPE)
return tostr("`", raw, "'?  Number expected.");
endif
return {oname, value};
.
#64:3
oname = args[1];
raw = args[2];
if (typeof(raw) == STR)
raw = $string_utils:explode(raw, ",");
elseif (typeof(raw) == NUM)
return raw ? "You need to give one or more recipients." | {oname, 0};
endif
value = $mail_editor:parse_recipients({}, raw);
if (value)
return {oname, value};
else
return "No valid recipients in list.";
endif
.
#64:4
value = this:get(@args);
if (value)
return {tostr(value), {tostr("Query when asking for ", value, " or more messages.")}};
else
return {0, {"Willing to be spammed with arbitrarily many messages/headers"}};
endif
.
#64:5
value = this:get(@args);
if (value)
return {value, {"Sticky folders:  mail commands default to whatever", "mail collection the previous successful command looked at."}};
else
return {0, {"Teflon folders:  mail commands always default to `on me'."}};
endif
.
#64:6
if (value = this:get(@args))
return {"", {tostr("Default message sequence for @mail:  ", (typeof(value) == STR) ? value | $string_utils:from_list(value, " "))}};
else
return {0, {"Default message sequence for @mail:  last:15"}};
endif
.
#64:7
if (value = this:get(@args))
return {"", {tostr("Default Reply-to:  ", $mail_agent:name_list(@value))}};
else
return {0, {"No default Reply-to: field"}};
endif
.
#64:8
if (o = ((name = args[2]) in {"sender", "noinclude"}))
args[2] = {"all", "include"}[o];
return {@pass(@args), tostr("(", name, " is a synonym for -", args[2], ")")};
else
return pass(@args);
endif
.
#64:9
"... must be object, list of objects, or false...";
value = args[1];
if (typeof(value) == OBJ)
return {{value}};
elseif (!this:istype(value, {{OBJ}}))
return $string_utils:capitalize("Object or list of objects expected.");
else
return {value};
endif
.
#64:10
if (value = this:get(@args))
return {value, {"Have MOO-mail automatically forwarded to me at", "my registered email-address."}};
else
return {value, {"Receive MOO-mail here on the MOO."}};
endif
"Last modified Tue Jun  1 02:10:08 1993 EDT by Edison@OpalMOO (#200).";
.
#64:11
":check_netmail(value) => Makes sure the email-address is one that can actually be used by $network:sendmail().";
"The actual value sent is not checked since it can only be a boolean flag.  The player's .email_address property is what is checked.";
"Possible situations where the address would be unusable are when the address is invalid or we can't connect to the site to send mail.";
"Returns a string error message if unusable or {value} otherwise.";
if (caller != this)
return E_PERM;
endif
if (args[1] && (reason = $network:email_will_fail(player.email_address)))
return tostr("Invalid registered .email_address: ", reason);
endif
return args;
.
#67:0
":get(options,name) => returns the value of the option specified by name";
"i.e., if {name,value} is present in options, return value";
"      if name is present, return 1";
"      otherwise return 0";
if ((name = args[2]) in (options = args[1]))
return 1;
elseif (a = $list_utils:assoc(name, options))
return a[2];
else
return 0;
endif
.
#67:1
":set(optionlist,oname,value) => revised optionlist or string error message.";
"oname must be the full name of an option in .names or .extras.";
"Note that values must not be of type ERR.  ";
"FALSE (0, blank string, or empty list) is always a legal value.";
"If a verb :check_foo is defined on this, it will be used to typecheck any";
"non-false or object-type value supplied as a new value for option `foo'.";
"";
"   :check_foo(value) => string error message or {value to use}";
"";
"If instead there is a property .check_foo, that will give either the expected ";
"type or a list of allowed types.";
"Otherwise, the option is taken to be a boolean flag and all non-false, ";
"non-object values map to 1.";
"";
options = args[1];
if (!(((oname = args[2]) in this.names) || (oname in this.extras)))
return "Unknown option:  " + oname;
elseif (typeof(value = args[3]) == ERR)
"... no option should have an error value...";
return "Error value";
elseif ((!value) && (typeof(value) != OBJ))
"... always accept FALSE (0, blankstring, emptylist)...";
elseif ($object_utils:has_callable_verb(this, check = ("check_" + oname)))
"... a :check_foo verb exists; use it to typecheck the value...";
if (typeof(c = this:(check)(value)) == STR)
return c;
endif
value = c[1];
elseif ($object_utils:has_property(this, tprop = ("type_" + oname)))
"... a .type_foo property exists...";
"... property value should be a type or list of types...";
if (!this:istype(value, t = this.(tprop)))
return $string_utils:capitalize(this:desc_type(t) + " value expected.");
endif
elseif ($object_utils:has_property(this, cprop = ("choices_" + oname)))
"... a .choices_foo property exists...";
"... property value should be a list of {value,docstring} pairs...";
if (!$list_utils:assoc(value, c = this.(cprop)))
return tostr("Allowed values: ", $string_utils:english_list($list_utils:slice(c, 1), "(??)", " or "));
endif
else
"... value is considered to be boolean...";
if (!value)
"... must be an object.  oops.";
return tostr("Non-object value expected.");
endif
value = 1;
endif
"... We now have oname and a value.  However, if oname is one of the extras,";
"... then we need to call :actual to see what it really means.";
if (oname in this.names)
nvlist = {{oname, value}};
elseif ((typeof(nvlist = this:actual(oname, value)) != LIST) || (!nvlist))
return nvlist || "Not implemented.";
endif
"... :actual returns a list of pairs...";
for nv in (nvlist)
oname = nv[1];
value = nv[2];
if (i = ((oname in options) || $list_utils:iassoc(oname, options)))
if ((!value) && (typeof(value) != OBJ))
"value == 0, blank string, empty list";
options[i..i] = {};
elseif (value == 1)
options[i] = oname;
else
options[i] = {oname, value};
endif
elseif (value || (typeof(value) == OBJ))
options[1..0] = {(value == 1) ? oname | {oname, value}};
endif
endfor
return options;
.
#67:2
":parse(args[,...]) => {oname [,value]} or string error message";
"additional arguments are fed straight through to :parse_* routines.";
" <option> <value>     => {option, value}";
" <option>=<value>     => {option, value}";
" <option> is <value>  => {option, value}";
" +<option>            => {option, 1}";
" -<option>            => {option, 0}";
" !<option>            => {option, 0}";
" <option>             => {option}";
if (!(words = args[1]))
return "";
endif
option = words[1];
words[1..1] = {};
if (flag = (option && index("-+!", option[1])))
option[1..1] = "";
endif
if (i = index(option, "="))
rawval = option[i + 1..length(option)];
option = option[1..i - 1];
if (i == 1)
"... =bar ...";
return "Blank option name?";
elseif (flag)
"... +foo=bar";
return "Don't give a value if you use +, -, or !";
elseif (words)
"... foo=bar junk";
return $string_utils:from_list(words, " ") + "??";
endif
elseif (!option)
return "Blank option name?";
elseif (flag)
if (words)
"... +foo junk";
return "Don't give a value if you use +, -, or !";
endif
rawval = ((flag - 1) % 2);
else
words && ((words[1] == "is") && (words[1..1] = {}));
rawval = words;
endif
"... do we know about this option?...";
if (!(oname = this:_name(strsub(option, "-", "_"))))
return tostr((oname == $failed_match) ? "Unknown" | "Ambiguous", " option:  ", option);
endif
"... determine new value...";
if (!rawval)
"... `@option foo is' or `@option foo=' ...";
return (rawval == {}) ? {oname} | {oname, 0};
elseif ($object_utils:has_callable_verb(this, pverb = ("parse_" + oname)))
return this:(pverb)(oname, rawval, args[2..length(args)]);
elseif ($object_utils:has_property(this, cprop = ("choices_" + oname)))
return this:parsechoice(oname, rawval, this.(cprop));
elseif (rawval in {0, "0", {"0"}})
return {oname, 0};
elseif (rawval in {1, "1", {"1"}})
return {oname, 1};
else
return tostr("Option is a flag, use `+", option, "' or `-", option, "' (or `!", option, "')");
endif
.
#67:3
":_name(string) => full option name corresponding to string ";
"               => $failed_match or $ambiguous_match as appropriate.";
if (((string = args[1]) in this.names) || (string in this.extras))
return string;
endif
char = (namestr = this._namelist)[1];
if (!(i = index(namestr, char + string)))
return $failed_match;
elseif (i != rindex(namestr, char + string))
return $ambiguous_match;
else
j = index(namestr[i + 1..length(namestr)], char);
return namestr[i + 1..(i + j) - 1];
endif
.
#67:4
":add_name(name[,isextra]) adds name to the list of options recognized.";
"name must be a nonempty string and must not contain spaces, -, +, !, or =.";
"isextra true means that name isn't an actual option (recognized by :get) but merely a name that the option setting command should recognize to set a particular combination of options.  Actual options go in .names; others go in .extras";
name = args[1];
isextra = {@args, 0}[2];
if (!$perm_utils:controls(caller_perms(), this))
return E_PERM;
elseif ((!name) || match(name, "[-!+= ]"))
"...name is blank or contains a forbidden character";
return E_INVARG;
elseif (name in this.names)
"...name is already in option list";
if (isextra)
this.names = setremove(this.names, name);
this.extras = setadd(this.extras, name);
return 1;
else
return 0;
endif
elseif (name in this.extras)
if (isextra)
return 0;
else
this.names = setadd(this.names, name);
this.extras = setremove(this.extras, name);
return 1;
endif
else
char = this._namelist[1];
if (isextra)
this.extras = setadd(this.extras, name);
else
this.names = setadd(this.names, name);
endif
if (!index(this._namelist, (char + name) + char))
this._namelist = tostr(this._namelist, name, char);
endif
return 1;
endif
.
#67:5
":remove_name(name) removes name from the list of options recognized.";
if (!$perm_utils:controls(caller_perms(), this))
return E_PERM;
elseif (!(((name = args[1]) in this.names) || (name in this.extras)))
"...hmm... already gone...";
return 0;
else
char = this._namelist[1];
this._namelist = strsub(this._namelist, (char + name) + char, char);
this.names = setremove(this.names, name);
this.extras = setremove(this.extras, name);
return 1;
endif
.
#67:6
":show(options,name or list of names)";
" => text describing current value of option and what it means";
name = args[2];
if (typeof(name) == LIST)
text = {};
for n in (name)
text = {@text, @this:show(@listset(args, n, 2))};
endfor
return text;
elseif (!((name in this.names) || (name in this.extras)))
return {"Unknown option:  " + name};
elseif ($object_utils:has_callable_verb(this, sverb = ("show_" + name)))
r = this:(sverb)(@args);
value = r[1];
desc = r[2];
elseif ($object_utils:has_property(this, sverb) && ((value = this:get(args[1], name)) in {0, 1}))
desc = this.(sverb)[value + 1];
if (typeof(desc) == STR)
desc = {desc};
endif
elseif ($object_utils:has_property(this, cprop = ("choices_" + name)))
if (!(value = this:get(args[1], name)))
desc = this.(cprop)[1][2];
elseif (!(a = $list_utils:assoc(value, this.(cprop))))
return {(name + " has unexpected value ") + $string_utils:print(value)};
else
desc = a[2];
endif
elseif (name in this.extras)
return {name + " not documented (complain)"};
else
value = this:get(args[1], name);
desc = {"not documented (complain)"};
if (typeof(value) in {LIST, STR})
desc[1..0] = $string_utils:print(value);
value = "";
endif
endif
if (value in {0, 1})
which = ("-+"[value + 1] + name);
elseif ((typeof(value) in {OBJ, STR, NUM}) && (value != ""))
which = tostr(" ", name, "=", value);
else
which = (" " + name);
endif
show = {$string_utils:left(which, this.namewidth) + desc[1]};
for i in [2..length(desc)]
show = {@show, $string_utils:space(this.namewidth) + desc[i]};
endfor
return show;
.
#67:7
":actual(<name>,<value>) => list of {<name>,<value>} pairs or string errormsg";
" corresponding to what setting option <name> to <value> actually means";
" e.g., :actual(\"unfoo\",1) => {{\"foo\",0}}";
" e.g., :actual(\"g7mode\",1) => {{\"splat\",37},{\"baz\",#3}}";
return "Not implemented.";
.
#67:8
":istype(value,types) => whether value is one of the given types";
if ((vtype = typeof(value = args[1])) in (types = args[2]))
return 1;
elseif (vtype != LIST)
return 0;
else
for t in (types)
if ((typeof(t) == LIST) && this:islistof(value, t))
return 1;
endif
endfor
endif
return 0;
.
#67:9
":islistof(value,types) => whether value (a list) has each element being one of the given types";
types = args[2];
for v in (value = args[1])
if (!this:istype(v, types))
return 0;
endif
endfor
return 1;
.
#67:10
":desc_type(types) => string description of types";
nlist = {};
for t in (types = args[1])
if (typeof(t) == LIST)
if (length(t) > 1)
nlist = {@nlist, tostr("(", this:desc_type(t), ")-list")};
else
nlist = {@nlist, tostr(this:desc_type(t), "-list")};
endif
elseif (t in {NUM, OBJ, STR, LIST})
nlist = {@nlist, {"number", "object", "string", "?", "list"}[t + 1]};
else
return "Bad type list";
endif
endfor
return $string_utils:english_list(nlist, "nothing", " or ");
.
#67:11
":parsechoice(oname,rawval,assoclist)";
which = {};
oname = args[1];
rawval = args[2];
choices = $list_utils:slice(args[3], 1);
errmsg = tostr("Allowed values for this flag: ", $string_utils:english_list(choices, "(??)", " or "));
if (typeof(rawval) == LIST)
if (length(rawval) > 1)
return errmsg;
endif
rawval = rawval[1];
elseif (typeof(rawval) != STR)
return errmsg;
endif
for c in (choices)
if (index(c, rawval) == 1)
which = {@which, c};
endif
endfor
if (!which)
return errmsg;
elseif (length(which) > 1)
return tostr(rawval, " is ambiguous.");
else
return {oname, which[1]};
endif
.
#68:0
if (i = (args[1] in {"numbers"}))
return {{{"nonumbers"}[i], !args[2]}};
else
return {args};
endif
.
#68:1
if (o = ((name = args[2]) in {"numbers"}))
args[2] = {"nonumbers"}[o];
return {@pass(@args), tostr("(", name, " is a synonym for -", args[2], ")")};
else
return pass(@args);
endif
.
#69:0
this:(this.names[tonum(args[1]) + 1])();
.
#69:1
"... hmmm... don't know how to raise E_NONE...";
return E_NONE;
.
#69:2
"...raise E_TYPE ...";
1[2];
.
#69:3
"...raise E_DIV ...";
1 / 0;
.
#69:4
"...raise E_PERM ...";
this.owner.password;
.
#69:5
"...raise E_PROPNF ...";
this.a;
.
#69:6
"...raise E_VERBNF ...";
this:a();
.
#69:7
"...raise E_VARNF ...";
a;
.
#69:8
"...raise E_INVIND ...";
#-1.a;
.
#69:9
move(this, this);
.
#69:10
"...raise E_MAXREC ...";
this:(verb)();
.
#69:11
"...raise E_RANGE ...";
{}[1];
.
#69:12
"...raise E_ARGS ...";
tonum();
.
#69:13
"...raise E_NACC ...";
move($hacker, this);
.
#69:14
"...raise E_INVARG ...";
parent(#-1);
.
#69:15
set_task_perms($no_one);
"...raise E_QUOTA ...";
create($thing);
.
#69:16
return 0;
.
#69:17
return this.names[tonum(args[1]) + 1];
.
#70:0
if (caller_perms().wizard)
pass();
"this:rm_message_seq({1, 1 + this:length_all_msgs()})";
"this:expunge_rmm()";
for p in (properties(this))
$command_utils:suspend_if_needed(0);
if (p && (p[1] == " "))
delete_property(this, p);
endif
endfor
this.messages = (this.messages_going = {});
this.mail_forward = {player, this};
this.mail_notify = {player};
for p in ({"moderator_forward", "moderator_notify", "writers", "readers", "expire_period", "last_used_time"})
this.(p) = $mail_recipient.(p);
endfor
this.moderated = 1;
else
return E_PERM;
endif
.
#71:0
player:tell_lines(this:description());
player:tell($string_utils:pronoun_sub("%S %<is> moving around from room to room, cleaning up.", this));
.
#71:1
"$housekeeper:cleanup([insist]) => clean up player's objects. Argument is 'up' or 'up!' for manually requested cleanups (notify player differently)";
if (caller_perms() != this)
return E_PERM;
endif
for object in (this.clean)
x = (object in this.clean);
if (this.requestors[x] == player)
if (result = this:replace(object, @args))
player:tell(result, ".");
endif
endif
$command_utils:suspend_if_needed(0);
endfor
player:tell("The housekeeper has finished cleaning up your objects.");
.
#71:2
"replace the object given to its proper spot (if there is one).";
object = args[1];
insist = ((length(args) > 1) && args[2]);
notify(this, tostr("cleaning ", object, " task ", task_id(), " insist ", insist));
i = (object in this.clean);
if (!i)
return tostr(object, " is not on the ", this.name, "'s cleanup list");
endif
place = this.destination[i];
if (!(($recycler:valid(object) && ($recycler:valid(place) || (place == #-1))) && (!(object.location in this.recycle_bins))))
"object no longer valid (recycled or something), remove it.";
this.clean = listdelete(this.clean, i);
this.requestors = listdelete(this.requestors, i);
this.destination = listdelete(this.destination, i);
return tostr(object) + " is no longer valid, removed from cleaning list";
endif
oldloc = (loc = object.location);
if (object.location == place)
"already in its place";
return "";
endif
requestor = this.requestors[i];
if (insist != "up!")
for thing in (object.contents)
if (thing:is_listening())
return ((("Not returning " + object.name) + " because ") + thing.name) + " is inside";
endif
$command_utils:suspend_if_needed(0);
endfor
if (valid(loc) && (loc != $limbo))
if (loc:is_listening())
return ((("Not returning " + object.name) + " because ") + loc.name) + " is holding it";
endif
for y in (loc:contents())
if ((y != object) && y:is_listening())
return (((("Not returning " + object.name) + " because ") + y.name) + " is in ") + loc.name;
endif
$command_utils:suspend_if_needed(0);
endfor
endif
endif
if (valid(place) && (!place:acceptable(object)))
return (place.name + " won't accept ") + object.name;
endif
requestor:tell("As you requested, the housekeeper tidies ", $string_utils:nn(object), " from ", $string_utils:nn(loc), " to ", $string_utils:nn(place), ".");
if ($object_utils:has_verb(loc, "announce_all_but"))
loc:announce_all_but({requestor, object}, "At ", requestor.name, "'s request, the ", this.name, " sneaks in, picks up ", object.name, " and hurries off to put ", ($object_utils:has_property(object, "po") && (typeof(object.po) == STR)) ? object.po | "it", " away.");
endif
this:moveit(object, place, requestor);
if ((loc = object.location) == oldloc)
return (object.name + " wouldn't go; ") + ((!place:acceptable(object)) ? (" perhaps " + $string_utils:nn(place)) + " won't let it in" | ((" perhaps " + $string_utils:nn(loc)) + " won't let go of it"));
endif
object:tell("The housekeeper puts you away.");
if ($object_utils:isa(loc, $room))
loc:announce_all_but({object}, "At ", requestor.name, "'s request, the housekeeper sneaks in, deposits ", object:title(), " and leaves.");
else
loc:tell("You notice the housekeeper sneak in, give you ", object:title(), " and leave.");
endif
return "";
.
#71:3
if (args)
if (!valid(who = args[1]))
return;
endif
player:tell(who.name, "'s personal cleanup list:");
else
who = 0;
player:tell("Housekeeper's complete cleanup list:");
endif
player:tell("------------------------------------------------------------------");
printed_anything = 0;
objs = this.clean;
reqs = this.requestors;
dest = this.destination;
for i in [1..length(objs)]
$command_utils:suspend_if_needed(2);
req = reqs[i];
ob = objs[i];
place = dest[i];
if (((who == 0) || (req == who)) || (ob.owner == who))
if (!valid(ob))
player:tell($string_utils:left(tostr(ob), 7), $string_utils:left("** recycled **", 50), "(", req.name, ")");
else
player:tell($string_utils:left(tostr(ob), 7), $string_utils:left(ob.name, 26), "=>", $string_utils:left(tostr(place), 7), place.name || "nowhere", " (", req.name, ")");
endif
printed_anything = 1;
endif
endfor
if (!printed_anything)
player:tell("** The housekeeper has nothing in the cleanup list.");
endif
player:tell("------------------------------------------------------------------");
.
#71:4
if (!$perm_utils:controls(caller_perms(), this))
return E_PERM;
endif
what = args[1];
if ((what < #1) || (!valid(what)))
return "invalid object";
endif
who = ((length(args) > 1) ? args[2] | player);
where = ((length(args) > 2) ? args[3] | what.location);
if ($object_utils:isa(who, $guest))
return tostr("Guests can't use the ", this.name, ".");
endif
if (!is_player(who))
return tostr("Non-players can't use the ", this.name, ".");
endif
if (!valid(where))
return tostr("The ", this.name, "doesn't know how to find ", where, " in order to put away ", what.name, ".");
endif
if (is_player(what))
return ("The " + this.name) + " doesn't do players, except to cart them home when they fall asleep.";
endif
for x in (this.eschews)
if ($object_utils:isa(what, x[1]))
ok = 0;
for y in [3..length(x)]
if ($object_utils:isa(what, x[y]))
ok = 1;
endif
endfor
if (!ok)
return tostr("The ", this.name, " doesn't do ", x[2], "!");
endif
endif
endfor
if ($object_utils:has_callable_verb(where, "litterp") ? where:litterp(what) | ((where in this.public_places) && (!(what in where.residents))))
return tostr("The ", this.name, " won't litter ", where.name, "!");
endif
if (i = (what in this.clean))
if ((!this:controls(i, who)) && valid(this.destination[i]))
return tostr(this.requestors[i].name, " already asked that ", what.name, " be kept at ", this.destination[i].name, "!");
endif
this.requestors[i] = who;
this.destination[i] = where;
else
this.clean = {what, @this.clean};
this.requestors = {who, @this.requestors};
this.destination = {where, @this.destination};
endif
return tostr("The ", this.name, " will keep ", what.name, " (", what, ") at ", valid(where) ? ((where.name + " (") + tostr(where)) + ")" | where, ".");
.
#71:5
if (!$perm_utils:controls(caller_perms(), this))
return E_PERM;
endif
what = args[1];
who = ((length(args) > 1) ? args[2] | player);
if (i = (what in this.clean))
if (!this:controls(i, who))
return tostr("You may remove an object from ", this.name, " list only if you own the object, the place it is kept, or if you placed the original cleaning order.");
endif
this.clean = listdelete(this.clean, i);
this.destination = listdelete(this.destination, i);
this.requestors = listdelete(this.requestors, i);
return tostr(what.name, " (", what, ") removed from cleanup list.");
else
return tostr(what.name, " not in cleanup list.");
endif
.
#71:6
"does player control entry I?";
i = args[1];
who = args[2];
if ((who in {this.owner, @this.owners}) || who.wizard)
return "Yessir.";
endif
i = args[1];
cleanable = this.clean[i];
if (this.requestors[i] == who)
return "you asked for the previous result, you can change this one.";
elseif (((who == cleanable.owner) || (!valid(dest = this.destination[i]))) || (who == dest.owner))
return "you own the object or the place where it is being cleaned to, or the destination is no longer valid.";
else
return "";
endif
.
#71:7
"start the housekeeper cleaning continuously. Kill any previous continuous";
"task. Not meant to be called interactively.";
if (!$perm_utils:controls(caller_perms(), this))
return E_PERM;
endif
if (this.task)
taskn = this.task;
this.task = 0;
kill_task(taskn);
endif
fork taskn (0)
while (1)
for x in (this.clean)
fork (0)
this:replace(x);
endfork
suspend(this.testing ? 2 | this:time());
endfor
suspend(5);
this:litterbug();
endwhile
endfork
this.task = taskn;
.
#71:8
for room in (this.public_places)
for thingy in (room.contents)
suspend(10);
litter = 0;
if (((thingy.location == room) && this:is_litter(thingy)) && (!this:is_watching(thingy, #-1)))
"if it is litter and no-one is watching";
fork (0)
this:send_home(thingy);
endfork
suspend(0);
endif
endfor
endfor
.
#71:9
return valid(thing = args[1]) && thing:is_listening();
.
#71:10
if (caller != this)
return E_PERM;
endif
litter = args[1];
littering = litter.location;
this:ejectit(litter, littering);
home = litter.location;
if ($object_utils:isa(home, $room))
home:announce_all("The ", this.name, " sneaks in, deposits ", litter:title(), " and leaves.");
else
home:tell("You notice the ", this.name, " sneak in, give you ", litter:title(), " and leave.");
endif
if ($object_utils:has_callable_verb(littering, "announce_all_but"))
littering:announce_all_but({litter}, "The ", this.name, " sneaks in, picks up ", litter:title(), " and rushes off to put it away.");
endif
.
#71:11
"Wizardly verb to move object with requestor's permission";
if (caller != this)
return E_PERM;
else
set_task_perms(player = args[3]);
return args[1]:moveto(args[2]);
endif
.
#71:12
"this:ejectit(object,room): Eject args[1] from args[2].  Callable only by housekeeper's quarters verbs.";
if (caller == this)
args[2]:eject(args[1]);
endif
.
#71:13
what = args[1];
if (!(where = (what in this.clean)))
return 0;
else
return {this.destination[where], this.requestors[where]};
endif
.
#71:14
thingy = args[1];
for x in (this.litter)
if ($object_utils:isa(thingy, x[1]) && (!$object_utils:isa(thingy, x[2])))
return 1;
endif
endfor
return 0;
.
#71:15
if (caller_perms().wizard)
this.password = "Impossible password to type";
this.litter = {};
this.public_places = {};
this.requestors = {};
this.destination = {};
this.clean = {};
this.eschews = {};
this.recycle_bins = {};
this.cleaning = #-1;
this.task = 0;
this.owners = {#2};
pass(@args);
endif
.
#71:16
count = 0;
for i in (this.requestors)
if (i == player)
count = (count + 1);
endif
$command_utils:suspend_if_needed(1);
endfor
player:tell("Number of items in cleanup list: ", tostr(length(this.clean)));
player:tell("Number of items you requested to be tidied: ", tostr(count));
player:tell("Number of requestors: ", tostr(length($list_utils:remove_duplicates(this.requestors))));
player:tell("Time to complete one cleaning circuit: ", $time_utils:english_time(length(this.clean) * this:time()));
.
#71:17
"return a string status if the hosuekeeper is cleaning this object";
cleanable = args[1];
info = this:is_object_cleaned(cleanable);
if (info == 0)
return tostr(cleanable.name, " is not cleaned by the ", this.name, ".");
else
return tostr(cleanable.name, " is kept tidy at ", info[1].name, " (", info[1], ") at ", info[2].name, "'s request.");
endif
.
#71:18
"Returns the amount of time to suspend between objects while continuous cleaning.";
"Currently set to try to complete cleaning circuit in one hour, but not exceed one object every 20 seconds.";
return max(20, 3600 / length(this.clean));
.
#71:19
return caller == this;
.
#72:0
"Given an email address, return {userid, site}.";
"Valid addresses are of the form `userid[@site]'.";
"At least for now, if [@site] is left out, site will be returned as blank.";
"Should be a default address site, or something, somewhere.";
address = args[1];
return (at = index(address, "@")) ? {address[1..at - 1], address[at + 1..length(address)]} | {address, ""};
.
#72:1
"given a site, try to figure out what the `local' domain is.";
"if site has a @ or a % in it, give up and return E_INVARG.";
"blank site is returned as is; try this:local_domain(this.localhost) for the answer you probably want.";
site = args[1];
if (index(site, "@") || index(site, "%"))
return E_INVARG;
elseif (match(site, "^[0-9.]+$"))
return E_INVARG;
elseif (!site)
return "";
elseif (!(dot = rindex(site, ".")))
dot = rindex(site = this.site, ".");
endif
if ((!dot) || (!(dot = rindex(site[1..dot - 1], "."))))
return site;
else
domain = site[dot + 1..length(site)];
site = site[1..dot - 1];
while (site && (domain in this.large_domains))
if (dot = rindex(site, "."))
domain = tostr(site[dot + 1..length(site)], ".", domain);
site = site[1..dot - 1];
else
return tostr(site, ".", domain);
endif
endwhile
return domain;
endif
.
#72:2
":open(address, port, [connect-connection-to])";
"Open a network connection to address/port.  If the connect-connection-to is passed, then the connection will be connected to that object when $login gets ahold of it.  If not, then the connection is just ignored by $login, i.e. not bothered by it with $welcome_message etc.";
"The object specified by connect-connection-to has to be a player (though it need not be a $player).";
"Returns the (initial) connection or an error, as in open_network_connection";
if (!this:trust(caller_perms()))
return E_PERM;
endif
address = args[1];
port = args[2];
if (length(args) < 3)
connect_to = $nothing;
elseif ((typeof(connect_to = args[3]) == OBJ) && (valid(connect_to) && is_player(connect_to)))
else
return E_INVARG;
endif
if (typeof(connection = open_network_connection(address, port)) != ERR)
this.open_connections = {@this.open_connections, connection};
if (valid(connect_to))
this.connect_connections_to = {@this.connect_connections_to, {connection, connect_to}};
endif
endif
return connection;
.
#72:3
if (!this:trust(caller_perms()))
return E_PERM;
endif
con = args[1];
boot_player(con);
this.ignore = setremove(this.ignore, con);
$network.open_connections = setremove($network.open_connections, con);
if (i = $list_utils:iassoc(con, $network.connect_connections_to))
$network.connect_connections_to = listdelete($network.connect_connections_to, i);
endif
return 1;
.
#72:4
"sendmail(to, subject, line1, line2, ...)";
"  sends mail to internet address 'to', with given subject.";
"  It fills in various fields, such as date, from (from player), etc.";
"  the rest of the arguments are remaining lines of the message, and may begin with additional header fields.";
"  (must match RFC822 specification).";
"Requires $network.trust to call (no anonymous mail from MOO).";
"Returns 0 if successful, or else error condition or string saying why not.";
if (!this:trust(caller_perms()))
return E_PERM;
endif
mooname = this.MOO_name;
mooinfo = tostr(mooname, " (", this.site, " ", this.port, ")");
if (reason = this:invalid_email_address(to = args[1]))
return reason;
endif
return this:raw_sendmail(to, "Date: " + ctime(), "From: " + this:return_address_for(player), "To: " + to, "Subject: " + args[2], "X-Mail-Agent: " + mooinfo, @args[3..length(args)]);
.
#72:5
return (who = args[1]).wizard || (who in this.trusts);
.
#72:6
if (caller_perms().wizard)
pass(@args);
this.active = 0;
this.reply_address = "moomailreplyto@yourhost";
this.site = "yoursite";
this.postmaster = "postmastername@yourhost";
this.MOO_name = "YourMOO";
this.maildrop = "localhost";
this.port = 7777;
this.large_domains = {};
this.trusts = {};
this.open_connections = (this.connect_connections_to = (this.ignore = {}));
endif
.
#72:7
"rawsendmail(to, @lines)";
"sends mail without processing. Returns 0 if successful, or else reason why not.";
if (!caller_perms().wizard)
return E_PERM;
endif
if (!this.active)
return "Networking is disabled.";
endif
debugging = this.debugging;
address = args[1];
body = listdelete(args, 1);
data = {"HELO " + this.site, ("MAIL FROM:<" + this.postmaster) + ">", ("RCPT TO:<" + address) + ">", "DATA"};
blank = 0;
for x in (body)
$command_utils:suspend_if_needed(0);
if (!(blank || match(x, "[a-z0-9-]*: ")))
if (x)
data = {@data, ""};
endif
blank = 1;
endif
data = {@data, (x == ".") ? "." + x | x};
endfor
data = {@data, ".", "QUIT", ""};
suspend(0);
target = $network:open(this.maildrop, 25);
if (typeof(target) == ERR)
return tostr("Cannot open connection to maildrop ", this.maildrop, ": ", target);
endif
fork (0)
for line in (data)
$command_utils:suspend_if_needed(0);
if (debugging)
notify(this.owner, "SEND:" + line);
endif
notify(target, line);
endfor
endfork
expect = {"2", "2", "2", "2", "3", "2"};
while (expect && (typeof(line = read(target)) != ERR))
if (line)
if (debugging)
notify(this.owner, "GET: " + line);
endif
if (!index("23", line[1]))
$network:close(target);
return line;
"error return";
else
if (line[1] != expect[1])
expect = {@expect, "2", "2", "2", "2", "2"};
else
expect = listdelete(expect, 1);
endif
endif
endif
endwhile
$network:close(target);
return 0;
.
#72:8
"invalid_email_address(email) -- check to see if email looks like a valid email address. Return reason why not.";
address = args[1];
if (!address)
return "no email address supplied";
endif
if (!(at = rindex(address, "@")))
return ("'" + address) + "' contains no @";
endif
name = address[1..at - 1];
host = address[at + 1..length(address)];
if (!match(host, $network.valid_host_regexp))
return tostr("'", host, "' doesn't look like a valid internet host");
endif
if (!match(name, $network.valid_email_regexp))
return tostr("'", name, "' doesn't look like a valid user name for internet mail");
endif
return "";
.
#72:9
return match(args[1], this.valid_host_regexp) ? "" | tostr("'", args[1], "' doesn't look like a valid internet host name");
.
#72:10
":email_will_fail(email-address[, display?]) => Makes sure the email-address is one that can actually be used by $network:sendmail().";
reason = this:invalid_email_address(args[1]);
if (reason && {@args, 0}[2])
player:tell("Invalid email address: ", reason);
endif
return reason;
"following is code from OpalMOO, not used here";
"Possible situations where the address would be unusable are when the address is invalid or we can't connect to the site to send mail.";
"If <display> is true, error messages are displayed to the player and 1 is returned when address is unuable.  If <display> is false and address is unusable, the error message is returned.  If the address is usable, 0 is always returned.";
if (!this:approved_for_network(caller_perms()))
return E_PERM;
endif
if (!this:valid_email_address(email = args[1]))
msg = tostr("Your email address (", email, ") is not a usable account.");
elseif ((result = this:verify_email_address(email)) == E_INVARG)
msg = tostr("Unable to connect to ", this:parse_address(email)[2], ".");
elseif (typeof(result) == STR)
msg = tostr("The site ", (parse = this:parse_address(email))[2], " does not recognize ", parse[1], " as a valid account.");
else
return 0;
endif
if ({@args, 0}[2])
player:tell(msg);
return 1;
else
return msg;
endif
"Last modified Tue Jun 15 00:19:01 1993 EDT by Ranma (#200).";
.
#72:11
"useful only for players who own objects that they connect with o_n_c";
if (((this:trust(caller_perms()) && valid(x = args[1])) && (x.owner = caller_perms())) && (x.owner != x))
return read(x);
else
return E_PERM;
endif
.
#72:12
":is_open(object)";
"return true if the object is somehow connected, false otherwise.";
return typeof(idle_seconds(@args)) == NUM;
"Relies on test in idle_seconds, and the fact that the verb is !d";
.
#72:13
"Peer at an incoming connection.  Decide if it should be connected to something, return that object. Called only by #0:do_login_command";
if (caller != #0)
return;
endif
what = args[1];
if (what in this.open_connections)
if (ct = $list_utils:iassoc(what, this.connect_connections_to))
this.connect_connections_to = setremove(this.connect_connections_to, ct);
return ct[2];
elseif (what in this.ignore)
this:close(what);
return -1;
else
this.ignore = setadd(this.ignore, what);
return 1;
endif
else
return 0;
endif
.
#72:14
":return_address_for(player) => string of 'return address'. Currently inbound mail doesn't work, so this is a bogus address.";
who = args[1];
return tostr("(", who.name, ") ", tonum(who), "@", this.moo_name, ".moo.mud.org");
.
#73:0
":_make(...) => new node with value {...}";
if (!(caller in {this._mgr, this}))
return E_PERM;
endif
prop = this:_genprop();
add_property(this, prop, args, {$generic_biglist_home.owner, ""});
return prop;
.
#73:1
":_kill(node) destroys the given node.";
if (!(caller in {this, this._mgr}))
return E_PERM;
endif
delete_property(this, args[1]);
.
#73:2
return (caller == this._mgr) ? this.(args[1]) | E_PERM;
.
#73:3
return (caller == this._mgr) ? this.(args[1]) = listdelete(args, 1) | E_PERM;
.
#73:4
gp = this._genprop;
ngp = "";
for i in [1..length(gp)]
if (gp[i] != "z")
ngp = ((ngp + "bcdefghijklmnopqrstuvwxyz"[strcmp(gp[i], "`")]) + gp[i + 1..length(gp)]);
return " " + (this._genprop = ngp);
endif
ngp = (ngp + "a");
endfor
return " " + (this._genprop = (ngp + "a"));
.
#73:5
"this is a dummy. You have to decide what your leaves are going to look like and then write this verb accordingly.  It should, given a leaf/list-element, return the corresponding key value.  So for an ordinary alist, where all of the leaves are of the form {key,datum}, you want:";
return args[1][1];
.
#74:0
all_help = this.help_msg;
if (typeof(all_help) == STR)
all_help = {all_help};
endif
helpless = {};
for vrb in (this.feature_verbs)
if (loc = $object_utils:has_verb(this, vrb))
loc = loc[1];
help = $code_utils:verb_documentation(loc, vrb);
if (help)
all_help = {@all_help, "", tostr(loc, ":", verb_info(loc, vrb)[3]), @help};
else
helpless = {@helpless, vrb};
endif
endif
endfor
if (helpless)
all_help = {@all_help, "", ("No help found on " + $string_utils:english_list(helpless, "nothing", " or ")) + "."};
endif
return {@all_help, "----"};
.
#74:1
"Definition from #1";
desc = this:description();
if (desc)
player:tell_lines(desc);
else
player:tell("You see nothing special.");
endif
player:tell("Please type \"help ", this, "\" for more information.");
.
#74:2
"Proper usage for the Generic Feature Object:";
"";
"First of all, the Generic Feature Object is constructed with the idea";
"that its children will be @moved to #24300, which is kind of a warehouse";
"for feature objects.  If there's enough interest, I'll try to make the";
"stuff that works with that in mind optional.";
"";
"Make a short description.  This is so I can continue to have looking at";
"#24300 give the descriptions of each of the objects in its .contents.";
"The :look_msg automatically includes a pointer to `help <this object>',";
"so you don't have to.";
"";
"Put a list of the commands you want people to use in";
"<this object>.feature_verbs.  (You need to use the :set_feature_verbs";
"verb to do this.)";
"";
"When someone types `help <this object>', they will be told the comment";
"strings from each of the verbs named in .feature_verbs.";
.
#74:3
return this in args[1].features;
.
#74:4
if ($perm_utils:controls(caller_perms(), this) || (caller == this))
return this.feature_ok = args[1];
else
return E_PERM;
endif
.
#74:5
"Can't see `get' unless it's in the room; can't see `drop' unless it's in the player.  Should possibly go on $thing.";
"Should use :contents, but I'm in a hurry.";
hidden = pass(@args);
if (this.location != args[1])
hidden = setadd(hidden, {$thing, verb_info($thing, "drop")[3], {"this", "none", "none"}});
hidden = setadd(hidden, {$thing, verb_info($thing, "give")[3], {"this", "at/to", "any"}});
endif
if (this.location != args[1].location)
hidden = setadd(hidden, {$thing, verb_info($thing, "get")[3], {"this", "none", "none"}});
endif
return hidden;
.
#74:6
if ($perm_utils:controls(caller_perms(), this) || (caller == this))
return this.feature_verbs = args[1];
else
return E_PERM;
endif
.
#74:7
if ((caller == this) || $perm_utils:controls(caller_perms(), this))
pass(@args);
this.feature_verbs = {};
else
return E_PERM;
endif
.
#75:0
"Usage:  get_now(site, port, message)";
"Returns a list of strings, or an error if we couldn't connect.";
host = args[1];
port = args[2];
if (!this:trusted(caller_perms()))
return E_PERM;
elseif ((!match(host, $network.valid_host_regexp)) && (!match(host, "[0-9]+%.[0-9]+%.[0-9]+%.[0-9]+")))
"allow either welformed internet hosts or explicit IP addresses.";
return E_INVARG;
elseif (((port != 70) && (port != 80)) && (port < 100))
"disallow connections to low number ports; necessary?";
return E_INVARG;
endif
opentime = time();
con = $network:open(args[1], args[2]);
opentime = (time() - opentime);
if (typeof(con) == ERR)
return con;
endif
notify(con, args[3]);
results = {};
count = this.limit;
"perhaps this isn't necessary, but if a gopher source is slowly spewing things, perhaps we don't want to hang forever -- perhaps this should just fork a process to close the connection instead?";
now = time();
timeout = 30;
end = "^%.$";
if ((length(args) == 4) && (args[4][1] == "2"))
end = "^[2-9]";
endif
while ((((typeof(string = read(con)) == STR) && (!match(string, end))) && ((count = (count - 1)) > 0)) && ((now + timeout) > (now = time())))
if (string && (string[1] == "."))
string = string[2..length(string)];
endif
results = {@results, string};
endwhile
$network:close(con);
if (opentime > 0)
"This is to keep repeated calls to $network:open to 'slow responding hosts' from totally spamming.";
suspend(0);
endif
return results;
.
#75:1
"parse gopher result line:";
"return {host, port, tag, label}";
"host/port/tag are what you send to the gopher server to get that line";
"label is <type>/human readable entry";
string = args[1];
tab = index(string, "	");
label = string[1..tab - 1];
string = string[tab + 1..length(string)];
tab = index(string, "	");
tag = string[1..tab - 1];
string = string[tab + 1..length(string)];
tab = index(string, "	");
host = string[1..tab - 1];
string = string[tab + 1..length(string)];
tab = index(string, "	");
port = tonum(tab ? string[1..tab - 1] | string);
return {host, port, tag, label};
"ignore extra material after port, if any";
.
#75:2
"$gopher:show_text(who, start, end, ..node..)";
"like who:notify_lines($gopher:get(..node..)[start..end]), but pipelined";
if (!caller_perms().wizard)
return E_PERM;
endif
who = args[1];
start = args[2];
end = args[3];
args = args[4..length(args)];
con = $network:open(args[1], args[2]);
if (typeof(con) == ERR)
player:tell("Sorry, can't get this information now.");
return;
endif
notify(con, args[3]);
read(con);
"initial blank line";
line = 0;
sent = 0;
end = (end || this.limit);
while (((string = read(con)) != ".") && (typeof(string) == STR))
line = (line + 1);
if ((line >= start) && ((!end) || (line <= end)))
sent = (sent + 1);
if (valid(who))
if (string && (string[1] == "."))
string = string[2..length(string)];
endif
who:notify(string);
else
notify(who, string);
endif
endif
endwhile
$network:close(con);
return sent;
.
#75:3
type = args[1];
if (type == "1")
return "menu";
elseif (type == "?")
return "menu?";
elseif (type == "0")
return "text";
elseif (type == "7")
return "search";
elseif (type == "9")
return "binary";
elseif (type == "2")
return "phone directory";
elseif (type == "4")
return "binhex";
elseif (type == "8")
return "telnet";
elseif (type == "I")
return "image";
elseif (type == " ")
"not actually gopher protocol: used by 'goto'";
return "";
else
return "unknown";
endif
"not done, need to fill out";
.
#75:4
"return a 'nice' string showing the information in a gopher node";
if (typeof(parse = args[1]) == STR)
parse = this:parse(parse);
endif
if (parse[1] == "!")
return {"[remembered set]", "", ""};
endif
if (length(parse) > 3)
label = parse[4];
if (label)
type = $gopher:type(label[1]);
label = label[2..length(label)];
if (type == "menu")
elseif (type == "search")
label = ((("<" + parse[3][rindex(parse[3], "	") + 1..length(parse[3])]) + "> ") + label);
else
label = ((type + ": ") + label);
endif
else
label = "(top)";
endif
else
label = (parse[3] + " (top)");
endif
port = "";
if (parse[2] != 70)
port = tostr(" ", parse[2]);
endif
return {tostr("[", parse[1], port, "]"), label, parse[3]};
.
#75:5
"Usage: get(site, port, selection)";
"returns a list of strings, or an error if it couldn't connect. Results are cached.";
request = args[1..3];
while ((index = (request in this.cache_requests)) && (this.cache_times[index] > time()))
if (typeof(result = this.cache_values[index]) != NUM)
return result;
endif
if ($code_utils:task_valid(result))
"spin, let other process getting same data win, or timeout";
suspend(1);
else
"well, other process crashed, or terminated, or whatever.";
this.cache_times[index] = 0;
endif
endwhile
if (!this:trusted(caller_perms()))
return E_PERM;
endif
while (this.cache_times && (this.cache_times[1] < time()))
$command_utils:suspend_if_needed(0);
this.cache_times = listdelete(this.cache_times, 1);
this.cache_values = listdelete(this.cache_values, 1);
this.cache_requests = listdelete(this.cache_requests, 1);
"caution: don't want to suspend between test and removal";
endwhile
$command_utils:suspend_if_needed(0);
this:cache_entry(@request);
value = this:get_now(@args);
$command_utils:suspend_if_needed(0);
index = this:cache_entry(@request);
this.cache_times[index] = (time() + ((typeof(value) == ERR) ? 120 | 1800));
this.cache_values[index] = value;
return value;
.
#75:6
if (!this:trusted(caller_perms()))
return E_PERM;
endif
if (!args)
this.cache_values = (this.cache_times = (this.cache_requests = {}));
elseif (index = (args[1..3] in this.cache_requests))
this.cache_requests = listdelete(this.cache_requests, index);
this.cache_times = listdelete(this.cache_times, index);
this.cache_values = listdelete(this.cache_values, index);
endif
.
#75:7
"unparse(host, port, tag, label) => string";
host = args[1];
port = args[2];
tag = args[3];
label = args[4];
if (tab = index(tag, "	"))
"remove search terms from search nodes";
tag = tag[1..tab - 1];
endif
return tostr(label, "	", tag, "	", host, "	", port);
.
#75:8
"return an explanation for a 'false' $gopher:get result";
value = args[1];
if (value == E_INVARG)
return "That gopher server is not reachable or is not responding.";
elseif (value == E_QUOTA)
return "Gopher connections cannot be made at this time because of system resource limitations!";
elseif (typeof(value) == ERR)
return tostr("The gopher request results in an error: ", value);
else
return "The gopher request has no results.";
endif
.
#75:9
"default -- gopher trusts everybody";
return 1;
.
#75:10
"_textp(parsed node)";
"Return true iff the parsed info points to a text node.";
return index("02", args[1][4][1]);
.
#75:11
"_mail_text(parsed node)";
"Return the text to be mailed out for the given node.";
where = args[1];
if (this:_textp(where))
return $gopher:get(@where);
else
text = {};
for x in ($gopher:get(@where))
parse = $gopher:parse(x);
sel = parse[4];
text = {@text, "Type=" + sel[1], "Name=" + sel[2..length(sel)], "Path=" + parse[3], "Host=" + parse[1], "Port=" + tostr(parse[2]), "#"};
endfor
return text;
endif
.
#75:12
if (caller_perms().wizard)
this:clear_cache();
pass(@args);
endif
.
#75:13
"Just for debugging -- shows what's in the gopher cache";
req = this.cache_requests;
tim = this.cache_times;
val = this.cache_values;
"save values in case cache changes while printing";
player:tell("size -- expires -- host (port) ------ selector ------------");
for i in [1..length(req)]
re = req[i];
host = $string_utils:left(re[1] + ((re[2] == 70) ? "" | tostr(" (", re[2], ")")), 24);
expires = $string_utils:right($time_utils:dhms(tim[i] - time()), 8);
va = val[i];
if (typeof(va) == LIST)
va = length(va);
elseif (typeof(va) == ERR)
va = $error:name(va);
else
va = tostr(va);
endif
selector = re[3];
if (length(selector) > 40)
selector = ("..." + selector[length(selector) - 37..length(selector)]);
endif
player:tell($string_utils:right(va, 8), expires, " ", host, selector);
endfor
player:tell("--- end cache display -------------------------------------");
.
#75:14
"Usage: get_cache(site, port, selection)";
"return current cache";
request = args[1..3];
if (index = (request in this.cache_requests))
if (this.cache_times[index] > now)
return this.cache_values[index];
endif
endif
return 0;
.
#75:15
if (index = (args in this.cache_requests))
return index;
else
this.cache_times = {@this.cache_times, time() + 240};
this.cache_values = {@this.cache_values, task_id()};
this.cache_requests = {@this.cache_requests, args};
return length(this.cache_requests);
endif
.
#75:16
return this:description();
.
#76:0
":open()";
"open a network connection to the NNTP server specified by this.host and this.port.";
if (caller != this)
return E_PERM;
endif
connexion = $network:open(this.host, this.port);
if (typeof(connexion) == ERR)
this:log_error("open", connexion);
return connexion;
endif
"the server should always open with a `200 ...' message.";
"this snarfs that message, so's it doesn't end up in an article";
line = this:read_line(connexion);
if ((!line) || (line[1] != "2"))
this:log_error("init", line);
return E_INVARG;
endif
return connexion;
.
#76:1
":article(connection,article)";
":head(connection,article)";
":body(connection,article)";
if (caller != this)
return E_PERM;
endif
"fetch an article, given a connection and an aritcle ID in one of two forms:";
"either `usenet.group.name article-number', or `<message-id>'";
conn = args[1];
if (typeof(article = this:check_id(args[2])) == ERR)
return E_INVARG;
endif
if (cachecheck = this:check_cache(article, verb))
return cachecheck;
endif
if (typeof(article) == LIST)
this:send_line(conn, "GROUP " + article[1]);
line = this:read_line(conn);
if (line[1] != "2")
this:log_error("group", line);
return E_INVARG;
endif
this:send_line(conn, (verb + " ") + article[2]);
line = this:read_line(conn);
if (line[1] != "2")
this:log_error(verb, line);
return E_INVARG;
endif
text = this:nntp_read(conn);
if (typeof(text) == LIST)
this:insert_cache(article, verb, text);
endif
return text;
else
this:send_line(conn, (verb + " ") + article);
line = this:read_line(conn);
if (line[1] != "2")
this:log_error(verb, line);
return E_INVARG;
endif
text = this:nntp_read(conn);
if (typeof(text) == LIST)
this:insert_cache(article, verb, text);
endif
return text;
endif
.
#76:2
"checks to see if the argument (a string) is a valid article indentifier";
"Article identifiers are one of the following forms:";
"   <message-id>             -- with brackets";
"   groupname n              -- where groupname is like alt.pea.pickers and n is an artcle number";
"   groupname:n              -- similar";
"for the first form, the message ID is returned as a string";
"For the other forms, it returns a list {groupname, n}, where groupname is the string and n is the number";
if (match(args[1], "^<.*>$"))
"match a single message ID";
return args[1];
elseif (matched = match(args[1], "%([a-zA-Z0-9_-+.]%)+[: ]%([0-9]+%)"))
"Match groupname:n";
return {args[1][1..matched[3][1][2]], args[1][matched[3][2][1]..matched[3][2][2]]};
else
return E_INVARG;
endif
.
#76:3
"read an NNTP body, body being defined as something that ends with a period on a blank line. expects a connection to read from.";
if (caller != this)
return E_PERM;
endif
server = args[1];
article = {};
count = this.line_limit;
now = time();
while (((typeof(line = this:read_line(server)) != ERR) && ((count = (count - 1)) > 0)) && ((now + this.timeout) > (now = time())))
if (line && (line[1] == "."))
if (line == ".")
return article;
endif
article = {@article, line[2..length(line)]};
else
article = {@article, line};
endif
endwhile
if (count == 0)
while ((line = this:read_line(server)) != ".")
endwhile
return {@article, "<<Article exceeds maximum length.  Truncated.>>"};
elseif (typeof(line) == ERR)
return line;
else
"the connection is losing. throw it away.";
this:close(server);
return E_INVARG;
endif
.
#76:4
if (caller_perms().wizard)
this.host = "";
this.port = 119;
this:flush_cache();
this.error_log = {};
this.debug = 0;
this.connections = {};
this.in_use = {};
this.connect_max = 0;
this.last_groups_update = 100000000;
this.newsgroups = {};
this.cache_limit = 10;
this.line_limit = 2000;
this.timeout = 30;
this.distributions = {};
this.expiry = 432000;
if (this.expire_task)
$code_utils:task_valid(this.expire_task) && kill_task(this.expire_task);
this.expire_task = 0;
endif
this.expire_delay = 172800;
pass(@args);
endif
.
#76:5
"quit from the NNTP server and close the passed connection.";
if (caller != this)
return E_PERM;
endif
"Use release_connection instead";
this:send_line(args[1], "QUIT");
$network:close(args[1]);
this.in_use = setremove(this.in_use, args[1]);
.
#76:6
":Fetch_article(article_id)";
":fetch_body(article_id)";
":fetch_head(article_id)";
"This function fetches the article referred to by article-id from an NNTP server.";
"The article-id may be any of the forms accepted by check_id";
"When fetching headers or complete articles, it will often be useful to pass the header of the article to :fixup_headers(), which will attempt to join multiline headers into single lines";
if (typeof(connection = this:get_connection()) != ERR)
text = this:(verb[index(verb, "_") + 1..length(verb)])(connection, args[1]);
this:release_connection(connection);
return text;
else
return connection;
endif
.
#76:7
"Update the groups list stored on the NNTP object.  This list is used in determining which groups are valid for registration, and should be run regularly.";
"This command may take some time to execute.";
if (!$perm_utils:controls(player, this))
return E_PERM;
endif
connection = this:get_connection();
if (typeof(connection) != ERR)
notify(connection, "NEWGROUPS " + $time_utils:time_sub(this.timeformat, this.last_groups_update));
line = read(connection);
if (line[1] != "2")
this:log_error("update", line);
return E_TYPE;
endif
groups = this:nntp_read(connection);
this:release_connection(connection);
if (typeof(groups) == LIST)
for froup in (groups)
$command_utils:suspend_if_needed(0);
this.newsgroups = {@this.newsgroups, $string_utils:explode(froup)[1]};
endfor
player:tell(("Newsgroup update procedure added " + tostr(length(groups))) + " newsgroup(s)");
this.last_groups_update = time();
else
player:tell("An error occurred updating the list of newsgroups.");
this:log_error("update-read", groups);
return groups;
endif
endif
.
#76:8
"#33339:fixup_headers({header-text})";
"This function takes the header of an nntp article (as a list of strings) and joins multiline headers into single lines.  It does no cleanup on the result, so there may be extra spaces in the output, which is a list of strings.";
"this may break if the first line isn't really a header.";
result = {};
for line in (args[1])
if (index(line, ":") && index($string_utils.alphabet, $string_utils:lowercase(line[1])))
"hokey, but technically it's the most accurate check we're allowed.";
result = {@result, line};
else
result[length(result)] = (result[length(result)] + line);
endif
endfor
return result;
.
#76:9
"$NNTP maintains a list of open, available connections.";
"This verb returns a connection from that list, and removes the connection from the list of actives, adding it to a list of in-use connections.";
"The maximum number of connections is maintained by this.connect_max.";
"If this.connect_max is 0, there is no limit to the number of connections.";
"If no connections are available, return E_RANGE.";
if (caller != this)
return E_PERM;
endif
if (this.connections)
"A connection is available...";
connect = this.connections[1];
this.connections = setremove(this.connections, connect);
if (!$network:is_connected(connect))
"The connection is defunct.  scrap it and get a new one.";
connect = this:open();
endif
else
"No connection is available.  If there's space for it (or we're";
"not enforcing limits,) create a new connection and add it to";
"this.in_use.";
if ((!this.connect_max) || (length(this.in_use) < this.connect_max))
connect = this:open();
else
"Whoops. can't get a connection.";
return E_RANGE;
endif
endif
if (typeof(connect) != ERR)
"just in case the connection failed.";
this.in_use = {@this.in_use, connect};
endif
return connect;
.
#76:10
"#33339:release_connection(connection)";
"Release_connection frees a connection obtained with get_connection().";
"It is assumed that any connection requested will eventually be released.";
if (caller != this)
return E_PERM;
endif
if (args[1] in this.in_use)
this.in_use = setremove(this.in_use, args[1]);
endif
this.connections = {args[1], @this.connections};
.
#76:11
":post(newsgroup(s), subject, lines, distributions)";
"Post an article to news.";
"Newsgroup(s) should either be a string or a list of strings.";
"Subject should be a string.";
"Lines should be a list of strings.";
"Distributions should either be a string or a list of strings containing valid distributions.";
"returns 0 if successful, otherwise error or error string";
if (!this:posting_ok(caller_perms()))
return E_PERM;
endif
if (typeof(args[1]) == LIST)
newsgroups = $string_utils:from_list(args[1], ", ");
else
newsgroups = args[1];
endif
subject = args[2];
body = {};
for line in (args[3])
body = {@body, (line[1] == ".") ? "." + line | line};
endfor
if (length(args) == 4)
if (typeof(args[4]) == LIST)
distribution = $string_utils:from_list(args[4], ", ");
else
distribution = args[4];
endif
else
distribution = "";
endif
from = $network:return_address_for(player);
reply_to = from;
path = (($network.moo_name + "!") + player.name);
organization = tostr($network.moo_name, ", ", $network.site, " ", $network.port);
date = ctime();
"-----";
"Begin conversations with the server:";
player:tell("Connecting to the NNTP server at ", this.host);
if (typeof(connect = this:get_connection()) == ERR)
player:tell("Failed to connect: ", connect);
return connect;
endif
player:tell("Initiating POST");
this:send_line(connect, "POST");
line = this:read_line(connect);
if (line[1..3] == "440")
this:release_connection(connect);
player:tell("Posting to this site refused: ", line);
return E_PERM;
endif
player:tell("Sending post...");
"send headers";
this:send_line(connect, "Path: " + path);
this:send_line(connect, "From: " + from);
this:send_line(connect, "Reply-to: " + reply_to);
this:send_line(connect, "Newsgroups: " + newsgroups);
player:tell("Newsgroups: " + newsgroups);
if (distribution)
this:send_line(connect, "Distribution: " + distribution);
endif
this:send_line(connect, "Subject: " + subject);
this:send_line(connect, "Date: " + date);
this:send_line(connect, "Organization: " + organization);
this:send_line(connect, "");
for line in (body)
this:send_line(connect, line);
endfor
this:send_line(connect, ".");
line = this:read_line(connect);
this:release_connection(connect);
if (line[1] == "4")
this:log_error(verb, line);
return E_INVARG;
endif
player:tell("NNTP Posting complete.");
return 0;
.
#76:12
return this.posting_allowed && (args[1].wizard || (args[1] in this.posting_ok));
.
#76:13
"cache maintenance for NNTP.";
"return an item if it's in the cache, {} otherwise.";
"args[1] should be an article reference, args[2] one of head, body,";
"or article.";
if (tmp = ({args[1], args[2]} in this.cache_requests))
if (tmp != 1)
"got a hit. move it to the front of the cache.";
this:reorder_cache(tmp);
endif
return this.cache_values[1];
elseif ((args[2] != "article") && (tmp = ({args[1], "article"} in this.cache_requests)))
if (tmp != 1)
this:reorder_cache(tmp);
endif
break = ("" in this.cache_values[1]);
if (args[2] == "head")
return this.cache_values[1][1..break - 1];
else
return this.cache_values[1][break + 1..length(this.cache_values[1])];
endif
else
return {};
endif
.
#76:14
"Cache maintenance for NNTP.";
"on a hit, we move the item to the head of the cache, so future";
"lookups go faster.  hi jay.";
this.cache_values = {this.cache_values[args[1]], @setremove(this.cache_values, this.cache_values[args[1]])};
this.cache_requests = {this.cache_requests[args[1]], @setremove(this.cache_requests, this.cache_requests[args[1]])};
this.cache_times = {time(), @setremove(this.cache_times, this.cache_times[args[1]])};
.
#76:15
if (caller != this)
return E_PERM;
endif
"Cache maintenance for NNTP";
"Inserts an article into the cache, timestamping it.";
"args[1] should be an article identifier, args[2] should be one of";
"head, body, or article, args[3] should be the text.";
if ((length(this.cache_requests) == this.cache_limit) && (!this:expire_cache()))
"if the cache is full and we can't expire anything, pull off the";
"last (presumably LRU) item.";
this.cache_requests = {{args[1], args[2]}, @this.cache_requests[1..length(this.cache_requests) - 1]};
this.cache_values = {args[3], @this.cache_values[1..length(this.cache_values) - 1]};
this.cache_times = {time(), @this.cache_times[1..length(this.cache_times) - 1]};
else
this.cache_requests = {{args[1], args[2]}, @this.cache_requests[1..length(this.cache_requests)]};
this.cache_values = {args[3], @this.cache_values[1..length(this.cache_values)]};
this.cache_times = {time(), @this.cache_times[1..length(this.cache_times)]};
endif
.
#76:16
if (this.debug && (caller == this))
this.error_log = {@this.error_log, {ctime(), @args}};
endif
.
#76:17
if ((!caller) == this)
return E_PERM;
endif
this.cache_values = (this.cache_times = (this.cache_requests = {}));
.
#76:18
"called by the expiry task to remove dusty items from the cache.";
"returns the number of items it removed.";
if (caller != this)
return E_PERM;
endif
expiry = (time() - this.expiry);
removed = 0;
for item in (this.cache_times)
if (expiry > item)
ind = (item in this.cache_times);
this.cache_values = setremove(this.cache_values, this.cache_values[ind]);
this.cache_requests = setremove(this.cache_requests, this.cache_requests[ind]);
this.cache_times = setremove(this.cache_times, this.cache_times[ind]);
removed = (removed + 1);
endif
endfor
return removed;
.
#76:19
"Either expire NNTP's caches now, or start or kill the expiration task.";
if (!$perm_utils:controls(player, this))
return E_PERM;
endif
if (length(verb) == 7)
player:tell(("Expiry procedure removed " + tostr(this:expire_cache())) + " item(s) from the NNTP cache.");
elseif (index(verb, "task"))
if (this.expire_task)
player:tell("Expire task seems to be already running.");
else
fork task (0)
this:expire_task();
endfork
this.expire_task = task;
endif
else
if (!this.expire_task)
player:tell("Expire task seems not to be running.");
else
kill_task(this.expire_task);
this.expire_task = 0;
endif
endif
.
#76:20
if (caller != this)
return E_PERM;
endif
if (this.cache_values)
this:expire_cache();
endif
fork task (this.expire_delay)
this:expire_task();
endfork
this.expire_task = task;
.
#76:21
":Fetch_newnews(newsgroups, last-read)";
"Return a list of message-IDs posted to newsgroups since last-read.";
"newsgroups is either a string containing a single newsgroup, or a list of strings.  last-read is a time.";
if (typeof(connection = this:get_connection()) != ERR)
text = this:(verb[index(verb, "_") + 1..length(verb)])(connection, @args);
this:release_connection(connection);
return text;
else
return connection;
endif
.
#76:22
if (caller != this)
return E_PERM;
endif
"Fetch a list of new message IDs from a newsgroup, given a connection, a set of newsgroups, and a last-this:read_line time.";
conn = args[1];
if (typeof(args[2]) == LIST)
groups = $string_utils:from_list(args[2], ",");
else
groups = args[2];
endif
last_read = args[3];
this:send_line(conn, (((verb + " ") + groups) + " ") + $time_utils:time_sub(this.timeformat, last_read));
line = this:read_line(conn);
if (line[1] != "2")
this:log_error("newnews", line);
return E_INVARG;
endif
return this:nntp_read(conn);
.
#76:23
if (caller != this)
return E_PERM;
endif
value = read(@args);
return value;
.
#76:24
if (caller != this)
return E_PERM;
endif
notify(@args);
.
#76:25
":fetch_xhdr(header, messages)";
"return a list of headers associated with the article identifier(s) passed.  header is a valid header line, such as 'subject'.  'message' should either be a message-id or a list of article identifiers.";
"Note that since may NNTP servers do not properly implement the XHDR command (especially those running on a certain proprietary VAX operating system which Shall Remain Nameless,) this command may be disabled.";
if (!this.xhdr_enabled)
return E_PERM;
endif
if (typeof(connection = this:get_connection()) != ERR)
if (typeof(args[2]) != LIST)
args[1] = {args[1]};
endif
text = this:(verb[index(verb, "_") + 1..length(verb)])(connection, @args);
this:release_connection(connection);
return text;
else
return connection;
endif
.
#76:26
":xhdr(connection,header,articles)";
if (caller != this)
return E_PERM;
endif
conn = args[1];
header = args[2];
text = {};
for item in (args[3])
if (typeof(article = this:check_id(item)) == ERR)
return E_INVARG;
endif
if (typeof(article) == LIST)
this:send_line(conn, "GROUP " + article[1]);
line = this:read_line(conn);
if (line[1] != "2")
this:log_error("group", line);
return E_INVARG;
endif
this:send_line(conn, (((verb + " ") + header) + " ") + article[2]);
line = this:read_line(conn);
if (line[1] != "2")
this:log_error(verb, line);
return E_INVARG;
endif
result = this:nntp_read(conn);
"bit of weirdness here.  for no particular reason, the XHDR command prefixes the header line with its message-id or article number.";
text = {@text, @result[length(article[2]) + 2..length(result[1])]};
else
this:send_line(conn, (((verb + " ") + header) + " ") + article);
line = this:read_line(conn);
if (line[1] != "2")
this:log_error(verb, line);
return E_INVARG;
endif
result = this:nntp_read(conn);
"bit of weirdness here.  for no particular reason, the XHDR command prefixes the header line with its message-id or article number.";
text = {@text, result[1][length(article) + 2..length(result[1])]};
endif
endfor
return text;
.
#77:0
"set_gender(newgender) attempts to change this.gender to newgender";
"  => E_PERM   if you don't own this or aren't its parent";
"  => Other return values as from $gender_utils:set.";
if (!($perm_utils:controls(caller_perms(), this) || (this == caller)))
return E_PERM;
else
result = $gender_utils:set(this, args[1]);
this.gender = ((typeof(result) == STR) ? result | args[1]);
return result;
endif
.
#77:1
if (player.wizard || (player == this.owner))
player:tell(this:set_gender(iobjstr) ? "Gender and pronouns set." | "Gender set.");
else
player:tell("Permission denied.");
endif
.
0 clocks
0 queued tasks
0 suspended tasks