Hex Artifact Content
Not logged in

Artifact 0e6f16197e1543a87bc064689dcb153a58471d3a:


0000: 5c 20 6e 65 74 32 6f 20 63 6f 6d 6d 61 6e 64 20  \ net2o command 
0010: 6c 69 6e 65 20 69 6e 74 65 72 66 61 63 65 0a 0a  line interface..
0020: 5c 20 43 6f 70 79 72 69 67 68 74 20 28 43 29 20  \ Copyright (C) 
0030: 32 30 31 35 2d 32 30 31 39 20 20 20 42 65 72 6e  2015-2019   Bern
0040: 64 20 50 61 79 73 61 6e 0a 0a 5c 20 54 68 69 73  d Paysan..\ This
0050: 20 70 72 6f 67 72 61 6d 20 69 73 20 66 72 65 65   program is free
0060: 20 73 6f 66 74 77 61 72 65 3a 20 79 6f 75 20 63   software: you c
0070: 61 6e 20 72 65 64 69 73 74 72 69 62 75 74 65 20  an redistribute 
0080: 69 74 20 61 6e 64 2f 6f 72 20 6d 6f 64 69 66 79  it and/or modify
0090: 0a 5c 20 69 74 20 75 6e 64 65 72 20 74 68 65 20  .\ it under the 
00a0: 74 65 72 6d 73 20 6f 66 20 74 68 65 20 47 4e 55  terms of the GNU
00b0: 20 41 66 66 65 72 6f 20 47 65 6e 65 72 61 6c 20   Affero General 
00c0: 50 75 62 6c 69 63 20 4c 69 63 65 6e 73 65 20 61  Public License a
00d0: 73 20 70 75 62 6c 69 73 68 65 64 20 62 79 0a 5c  s published by.\
00e0: 20 74 68 65 20 46 72 65 65 20 53 6f 66 74 77 61   the Free Softwa
00f0: 72 65 20 46 6f 75 6e 64 61 74 69 6f 6e 2c 20 65  re Foundation, e
0100: 69 74 68 65 72 20 76 65 72 73 69 6f 6e 20 33 20  ither version 3 
0110: 6f 66 20 74 68 65 20 4c 69 63 65 6e 73 65 2c 20  of the License, 
0120: 6f 72 0a 5c 20 28 61 74 20 79 6f 75 72 20 6f 70  or.\ (at your op
0130: 74 69 6f 6e 29 20 61 6e 79 20 6c 61 74 65 72 20  tion) any later 
0140: 76 65 72 73 69 6f 6e 2e 0a 0a 5c 20 54 68 69 73  version...\ This
0150: 20 70 72 6f 67 72 61 6d 20 69 73 20 64 69 73 74   program is dist
0160: 72 69 62 75 74 65 64 20 69 6e 20 74 68 65 20 68  ributed in the h
0170: 6f 70 65 20 74 68 61 74 20 69 74 20 77 69 6c 6c  ope that it will
0180: 20 62 65 20 75 73 65 66 75 6c 2c 0a 5c 20 62 75   be useful,.\ bu
0190: 74 20 57 49 54 48 4f 55 54 20 41 4e 59 20 57 41  t WITHOUT ANY WA
01a0: 52 52 41 4e 54 59 3b 20 77 69 74 68 6f 75 74 20  RRANTY; without 
01b0: 65 76 65 6e 20 74 68 65 20 69 6d 70 6c 69 65 64  even the implied
01c0: 20 77 61 72 72 61 6e 74 79 20 6f 66 0a 5c 20 4d   warranty of.\ M
01d0: 45 52 43 48 41 4e 54 41 42 49 4c 49 54 59 20 6f  ERCHANTABILITY o
01e0: 72 20 46 49 54 4e 45 53 53 20 46 4f 52 20 41 20  r FITNESS FOR A 
01f0: 50 41 52 54 49 43 55 4c 41 52 20 50 55 52 50 4f  PARTICULAR PURPO
0200: 53 45 2e 20 20 53 65 65 20 74 68 65 0a 5c 20 47  SE.  See the.\ G
0210: 4e 55 20 41 66 66 65 72 6f 20 47 65 6e 65 72 61  NU Affero Genera
0220: 6c 20 50 75 62 6c 69 63 20 4c 69 63 65 6e 73 65  l Public License
0230: 20 66 6f 72 20 6d 6f 72 65 20 64 65 74 61 69 6c   for more detail
0240: 73 2e 0a 0a 5c 20 59 6f 75 20 73 68 6f 75 6c 64  s...\ You should
0250: 20 68 61 76 65 20 72 65 63 65 69 76 65 64 20 61   have received a
0260: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 47 4e 55   copy of the GNU
0270: 20 41 66 66 65 72 6f 20 47 65 6e 65 72 61 6c 20   Affero General 
0280: 50 75 62 6c 69 63 20 4c 69 63 65 6e 73 65 0a 5c  Public License.\
0290: 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 69 73   along with this
02a0: 20 70 72 6f 67 72 61 6d 2e 20 20 49 66 20 6e 6f   program.  If no
02b0: 74 2c 20 73 65 65 20 3c 68 74 74 70 3a 2f 2f 77  t, see <http://w
02c0: 77 77 2e 67 6e 75 2e 6f 72 67 2f 6c 69 63 65 6e  ww.gnu.org/licen
02d0: 73 65 73 2f 3e 2e 0a 0a 72 65 71 75 69 72 65 20  ses/>...require 
02e0: 6e 65 74 32 6f 2e 66 73 0a 0a 56 61 72 69 61 62  net2o.fs..Variab
02f0: 6c 65 20 6b 65 79 2d 72 65 61 64 69 6e 0a 0a 3a  le key-readin..:
0300: 20 6f 75 74 2d 6e 69 63 6b 73 20 28 20 2d 2d 20   out-nicks ( -- 
0310: 29 0a 20 20 20 20 5b 3a 20 6e 69 63 6b 2d 6b 65  ).    [: nick-ke
0320: 79 20 3f 64 75 70 2d 49 46 20 20 6f 75 74 2d 6b  y ?dup-IF  out-k
0330: 65 79 20 20 54 48 45 4e 20 3b 5d 20 40 61 72 67  ey  THEN ;] @arg
0340: 2d 6c 6f 6f 70 20 3b 0a 0a 3a 20 71 72 2d 6d 65  -loop ;..: qr-me
0350: 20 28 20 2d 2d 20 29 20 70 6b 40 20 71 72 3a 6f   ( -- ) pk@ qr:o
0360: 77 6e 6b 65 79 23 20 2e 6b 65 79 71 72 20 3b 0a  wnkey# .keyqr ;.
0370: 3a 20 71 72 2d 6e 69 63 6b 73 20 28 20 2d 2d 20  : qr-nicks ( -- 
0380: 29 0a 20 20 20 20 5b 3a 20 6e 69 63 6b 2d 6b 65  ).    [: nick-ke
0390: 79 20 3f 64 75 70 2d 49 46 20 20 3e 6f 20 6b 65  y ?dup-IF  >o ke
03a0: 2d 70 6b 20 24 40 0a 09 20 20 20 20 71 72 3a 6f  -pk $@..    qr:o
03b0: 77 6e 6b 65 79 23 20 71 72 3a 6b 65 79 23 20 6b  wnkey# qr:key# k
03c0: 65 2d 73 6b 20 73 65 63 40 20 6e 69 70 20 73 65  e-sk sec@ nip se
03d0: 6c 65 63 74 20 6f 3e 0a 09 20 20 20 20 2e 6b 65  lect o>..    .ke
03e0: 79 71 72 20 20 54 48 45 4e 20 3b 5d 20 40 61 72  yqr  THEN ;] @ar
03f0: 67 2d 6c 6f 6f 70 20 3b 0a 0a 3a 20 61 72 67 73  g-loop ;..: args
0400: 3e 6b 65 79 6c 69 73 74 20 28 20 2d 2d 20 29 0a  >keylist ( -- ).
0410: 20 20 20 20 5b 3a 20 6e 69 63 6b 2d 6b 65 79 20      [: nick-key 
0420: 3f 64 75 70 2d 49 46 20 20 3e 6f 20 6b 65 2d 70  ?dup-IF  >o ke-p
0430: 6b 20 24 40 20 6f 3e 20 6b 65 79 73 69 7a 65 20  k $@ o> keysize 
0440: 75 6d 69 6e 20 6b 65 79 2d 6c 69 73 74 20 24 2b  umin key-list $+
0450: 5b 5d 21 20 20 54 48 45 4e 20 3b 5d 0a 20 20 20  []!  THEN ;].   
0460: 20 40 61 72 67 2d 6c 6f 6f 70 20 3b 0a 0a 24 32   @arg-loop ;..$2
0470: 30 20 76 61 6c 75 65 20 68 61 73 68 2d 73 69 7a  0 value hash-siz
0480: 65 23 0a 0a 3a 20 68 61 73 68 2d 66 69 6c 65 20  e#..: hash-file 
0490: 28 20 61 64 64 72 20 75 20 2d 2d 20 68 61 73 68  ( addr u -- hash
04a0: 20 75 27 20 29 0a 20 20 20 20 63 3a 30 6b 65 79   u' ).    c:0key
04b0: 20 73 6c 75 72 70 2d 66 69 6c 65 20 32 64 75 70   slurp-file 2dup
04c0: 20 63 3a 68 61 73 68 20 64 72 6f 70 20 66 72 65   c:hash drop fre
04d0: 65 20 74 68 72 6f 77 20 70 61 64 20 63 3a 6b 65  e throw pad c:ke
04e0: 79 3e 0a 20 20 20 20 70 61 64 20 68 61 73 68 2d  y>.    pad hash-
04f0: 73 69 7a 65 23 20 3b 0a 0a 3a 20 68 61 73 68 2d  size# ;..: hash-
0500: 66 69 6c 65 2d 62 6c 6f 63 6b 73 20 28 20 61 64  file-blocks ( ad
0510: 64 72 20 75 20 2d 2d 20 29 0a 20 20 20 20 73 6c  dr u -- ).    sl
0520: 75 72 70 2d 66 69 6c 65 20 6f 76 65 72 20 7b 20  urp-file over { 
0530: 73 74 61 72 74 20 7d 20 62 6f 75 6e 64 73 20 3f  start } bounds ?
0540: 44 4f 0a 09 63 3a 30 6b 65 79 20 49 20 64 75 70  DO..c:0key I dup
0550: 20 24 34 30 30 20 2b 20 49 27 20 75 6d 69 6e 20   $400 + I' umin 
0560: 6f 76 65 72 20 2d 20 63 3a 68 61 73 68 0a 09 70  over - c:hash..p
0570: 61 64 20 63 3a 6b 65 79 3e 0a 09 49 20 73 74 61  ad c:key>..I sta
0580: 72 74 20 2d 20 24 34 30 30 20 2f 20 68 65 78 2e  rt - $400 / hex.
0590: 20 70 61 64 20 68 61 73 68 2d 73 69 7a 65 23 20   pad hash-size# 
05a0: 2e 38 35 69 6e 66 6f 20 63 72 0a 20 20 20 20 24  .85info cr.    $
05b0: 34 30 30 20 2b 4c 4f 4f 50 0a 20 20 20 20 73 74  400 +LOOP.    st
05c0: 61 72 74 20 66 72 65 65 20 74 68 72 6f 77 20 3b  art free throw ;
05d0: 0a 0a 3a 20 64 6f 2d 6b 65 79 69 6e 20 28 20 61  ..: do-keyin ( a
05e0: 64 64 72 20 75 20 2d 2d 20 29 0a 20 20 20 20 6b  ddr u -- ).    k
05f0: 65 79 2d 72 65 61 64 69 6e 20 24 73 6c 75 72 70  ey-readin $slurp
0600: 2d 66 69 6c 65 20 20 36 34 23 2d 31 20 6b 65 79  -file  64#-1 key
0610: 2d 72 65 61 64 2d 6f 66 66 73 65 74 20 36 34 21  -read-offset 64!
0620: 0a 20 20 20 20 6b 65 79 2d 72 65 61 64 69 6e 20  .    key-readin 
0630: 24 40 20 64 6f 2d 6b 65 79 20 3b 0a 0a 3a 20 6b  $@ do-key ;..: k
0640: 65 79 73 3e 73 65 61 72 63 68 20 28 20 2d 2d 20  eys>search ( -- 
0650: 29 0a 20 20 20 20 73 65 61 72 63 68 2d 6b 65 79  ).    search-key
0660: 5b 5d 20 24 5b 5d 6f 66 66 20 5b 3a 20 64 75 70  [] $[]off [: dup
0670: 20 35 20 6d 6f 64 20 49 46 0a 09 20 20 20 20 2e   5 mod IF..    .
0680: 22 20 6b 65 79 73 20 69 6e 20 6d 75 6c 74 69 70  " keys in multip
0690: 6c 65 73 20 6f 66 20 35 20 62 61 73 65 38 35 20  les of 5 base85 
06a0: 63 68 61 72 61 63 74 65 72 73 2c 20 70 6c 65 61  characters, plea
06b0: 73 65 2c 20 69 67 6e 6f 72 69 6e 67 20 27 22 0a  se, ignoring '".
06c0: 09 20 20 20 20 74 79 70 65 20 2e 22 20 27 22 20  .    type ." '" 
06d0: 63 72 0a 09 45 4c 53 45 20 20 62 61 73 65 38 35  cr..ELSE  base85
06e0: 3e 24 20 73 65 61 72 63 68 2d 6b 65 79 5b 5d 20  >$ search-key[] 
06f0: 24 2b 5b 5d 21 20 20 54 48 45 4e 20 3b 5d 20 61  $+[]!  THEN ;] a
0700: 72 67 2d 6c 6f 6f 70 20 3b 0a 0a 3a 20 6e 69 63  rg-loop ;..: nic
0710: 6b 73 3e 73 65 61 72 63 68 20 28 20 2d 2d 20 29  ks>search ( -- )
0720: 0a 20 20 20 20 73 65 61 72 63 68 2d 6b 65 79 5b  .    search-key[
0730: 5d 20 24 5b 5d 6f 66 66 0a 20 20 20 20 5b 3a 20  ] $[]off.    [: 
0740: 6e 69 63 6b 3e 70 6b 20 64 75 70 20 30 3d 20 21  nick>pk dup 0= !
0750: 21 6e 6f 2d 6e 69 63 6b 21 21 20 73 65 61 72 63  !no-nick!! searc
0760: 68 2d 6b 65 79 5b 5d 20 24 2b 5b 5d 21 20 3b 5d  h-key[] $+[]! ;]
0770: 20 40 61 72 67 2d 6c 6f 6f 70 20 3b 0a 0a 3a 20   @arg-loop ;..: 
0780: 68 61 6e 64 6c 65 2d 63 68 61 74 20 28 20 2d 2d  handle-chat ( --
0790: 20 29 0a 20 20 20 20 63 68 61 74 2d 63 6f 6e 6e   ).    chat-conn
07a0: 65 63 74 73 20 3f 77 61 69 74 2d 63 68 61 74 20  ects ?wait-chat 
07b0: 64 6f 2d 63 68 61 74 20 3b 0a 0a 5c 20 63 6f 6d  do-chat ;..\ com
07c0: 6d 61 6e 64 73 20 66 6f 72 20 74 68 65 20 63 6f  mands for the co
07d0: 6d 6d 61 6e 64 20 6c 69 6e 65 20 75 73 65 72 20  mmand line user 
07e0: 69 6e 74 65 72 66 61 63 65 0a 0a 56 61 72 69 61  interface..Varia
07f0: 62 6c 65 20 6f 6c 64 2d 72 65 63 73 0a 56 61 72  ble old-recs.Var
0800: 69 61 62 6c 65 20 6f 6c 64 2d 6f 72 64 65 72 0a  iable old-order.
0810: 0a 3a 20 73 65 74 2d 6e 65 74 32 6f 2d 63 6d 64  .: set-net2o-cmd
0820: 73 20 28 20 2d 2d 20 29 0a 20 20 20 20 67 65 74  s ( -- ).    get
0830: 2d 72 65 63 6f 67 6e 69 7a 65 72 73 20 6f 6c 64  -recognizers old
0840: 2d 72 65 63 73 20 73 65 74 2d 73 74 61 63 6b 0a  -recs set-stack.
0850: 20 20 20 20 67 65 74 2d 6f 72 64 65 72 20 6f 6c      get-order ol
0860: 64 2d 6f 72 64 65 72 20 73 65 74 2d 73 74 61 63  d-order set-stac
0870: 6b 0a 20 20 20 20 5b 27 5d 20 6e 32 6f 20 3e 62  k.    ['] n2o >b
0880: 6f 64 79 20 31 20 73 65 74 2d 6f 72 64 65 72 0a  ody 1 set-order.
0890: 20 20 20 20 5b 27 5d 20 72 65 63 2d 77 6f 72 64      ['] rec-word
08a0: 20 31 20 73 65 74 2d 72 65 63 6f 67 6e 69 7a 65   1 set-recognize
08b0: 72 73 20 3b 0a 3a 20 72 65 73 65 74 2d 6e 65 74  rs ;.: reset-net
08c0: 32 6f 2d 63 6d 64 73 20 28 20 2d 2d 20 29 0a 20  2o-cmds ( -- ). 
08d0: 20 20 20 6f 6c 64 2d 72 65 63 73 20 67 65 74 2d     old-recs get-
08e0: 73 74 61 63 6b 20 3f 64 75 70 2d 49 46 20 20 73  stack ?dup-IF  s
08f0: 65 74 2d 72 65 63 6f 67 6e 69 7a 65 72 73 20 20  et-recognizers  
0900: 54 48 45 4e 0a 20 20 20 20 6f 6c 64 2d 6f 72 64  THEN.    old-ord
0910: 65 72 20 67 65 74 2d 73 74 61 63 6b 20 3f 64 75  er get-stack ?du
0920: 70 2d 49 46 20 20 73 65 74 2d 6f 72 64 65 72 20  p-IF  set-order 
0930: 64 65 66 69 6e 69 74 69 6f 6e 73 20 20 54 48 45  definitions  THE
0940: 4e 20 3b 0a 0a 3a 20 64 6f 2d 6e 65 74 32 6f 2d  N ;..: do-net2o-
0950: 63 6d 64 73 20 28 20 78 74 20 2d 2d 20 29 0a 20  cmds ( xt -- ). 
0960: 20 20 20 73 65 74 2d 6e 65 74 32 6f 2d 63 6d 64     set-net2o-cmd
0970: 73 20 63 61 74 63 68 20 72 65 73 65 74 2d 6e 65  s catch reset-ne
0980: 74 32 6f 2d 63 6d 64 73 20 74 68 72 6f 77 20 3b  t2o-cmds throw ;
0990: 0a 0a 3a 20 28 6e 32 6f 2d 71 75 69 74 29 20 28  ..: (n2o-quit) (
09a0: 20 2d 2d 20 29 0a 20 20 20 20 5c 20 65 78 69 74   -- ).    \ exit
09b0: 73 20 6f 6e 6c 79 20 74 68 72 6f 75 67 68 20 54  s only through T
09c0: 48 52 4f 57 20 65 74 63 2e 0a 20 20 20 20 42 45  HROW etc..    BE
09d0: 47 49 4e 0a 09 2e 73 74 61 74 75 73 20 63 72 20  GIN...status cr 
09e0: 72 65 66 69 6c 6c 20 20 57 48 49 4c 45 0a 09 20  refill  WHILE.. 
09f0: 20 20 20 69 6e 74 65 72 70 72 65 74 20 70 72 6f     interpret pro
0a00: 6d 70 74 0a 20 20 20 20 52 45 50 45 41 54 20 20  mpt.    REPEAT  
0a10: 2d 35 36 20 74 68 72 6f 77 20 3b 0a 0a 3a 20 6e  -56 throw ;..: n
0a20: 32 6f 2d 71 75 69 74 20 28 20 2d 2d 20 29 0a 20  2o-quit ( -- ). 
0a30: 20 20 20 63 6c 65 61 72 2d 74 69 62 73 74 61 63     clear-tibstac
0a40: 6b 0a 20 20 20 20 42 45 47 49 4e 0a 09 5b 63 6f  k.    BEGIN..[co
0a50: 6d 70 69 6c 65 5d 20 5b 20 20 5b 27 5d 20 28 6e  mpile] [  ['] (n
0a60: 32 6f 2d 71 75 69 74 29 20 63 61 74 63 68 20 64  2o-quit) catch d
0a70: 75 70 20 23 2d 35 36 20 3c 3e 20 61 6e 64 20 64  up #-56 <> and d
0a80: 75 70 0a 20 20 20 20 57 48 49 4c 45 0a 09 20 20  up.    WHILE..  
0a90: 20 20 3c 23 20 5c 20 72 65 73 65 74 20 68 6f 6c    <# \ reset hol
0aa0: 64 20 61 72 65 61 2c 20 6f 72 20 77 65 20 6d 61  d area, or we ma
0ab0: 79 20 67 65 74 20 61 6e 6f 74 68 65 72 20 65 72  y get another er
0ac0: 72 6f 72 0a 09 20 20 20 20 44 6f 45 72 72 6f 72  ror..    DoError
0ad0: 0a 09 20 20 20 20 5c 20 73 74 61 63 6b 20 64 65  ..    \ stack de
0ae0: 70 74 68 73 20 6d 61 79 20 62 65 20 61 72 62 69  pths may be arbi
0af0: 74 72 61 72 79 20 73 74 69 6c 6c 20 28 6f 72 20  trary still (or 
0b00: 61 67 61 69 6e 29 2c 20 73 6f 20 63 6c 65 61 72  again), so clear
0b10: 20 74 68 65 6d 0a 09 20 20 20 20 63 6c 65 61 72   them..    clear
0b20: 73 74 61 63 6b 73 0a 09 20 20 20 20 63 6c 65 61  stacks..    clea
0b30: 72 2d 74 69 62 73 74 61 63 6b 0a 20 20 20 20 52  r-tibstack.    R
0b40: 45 50 45 41 54 0a 20 20 20 20 64 72 6f 70 20 63  EPEAT.    drop c
0b50: 6c 65 61 72 2d 74 69 62 73 74 61 63 6b 20 23 2d  lear-tibstack #-
0b60: 35 36 20 74 68 72 6f 77 20 3b 0a 0a 3a 20 6e 32  56 throw ;..: n2
0b70: 6f 2d 63 6d 64 73 20 28 20 2d 2d 20 29 0a 20 20  o-cmds ( -- ).  
0b80: 20 20 69 6e 69 74 2d 63 6c 69 65 6e 74 20 77 6f    init-client wo
0b90: 72 64 2d 61 72 67 73 20 5b 27 5d 20 6e 32 6f 2d  rd-args ['] n2o-
0ba0: 71 75 69 74 20 5b 27 5d 20 64 6f 2d 6e 65 74 32  quit ['] do-net2
0bb0: 6f 2d 63 6d 64 73 20 63 61 74 63 68 0a 20 20 20  o-cmds catch.   
0bc0: 20 64 75 70 20 23 2d 35 36 20 3d 20 73 77 61 70   dup #-56 = swap
0bd0: 20 23 2d 32 38 20 3d 20 6f 72 20 49 46 20 20 64   #-28 = or IF  d
0be0: 72 6f 70 20 73 75 62 6d 65 20 62 79 65 20 20 45  rop subme bye  E
0bf0: 4c 53 45 20 20 74 68 72 6f 77 20 20 54 48 45 4e  LSE  throw  THEN
0c00: 20 3b 0a 0a 3a 20 2e 75 73 61 67 65 20 28 20 61   ;..: .usage ( a
0c10: 64 64 72 20 75 20 2d 2d 20 61 64 64 72 20 75 20  ddr u -- addr u 
0c20: 29 0a 20 20 20 20 73 6f 75 72 63 65 20 37 20 2f  ).    source 7 /
0c30: 73 74 72 69 6e 67 20 74 79 70 65 20 63 72 20 3b  string type cr ;
0c40: 0a 0a 3a 20 3f 63 72 20 28 20 2d 2d 20 29 20 73  ..: ?cr ( -- ) s
0c50: 63 72 69 70 74 3f 20 30 3d 20 49 46 20 20 63 72  cript? 0= IF  cr
0c60: 20 20 54 48 45 4e 20 3b 0a 0a 73 63 6f 70 65 7b    THEN ;..scope{
0c70: 20 6e 32 6f 0a 0a 3a 20 68 65 6c 70 20 28 20 2d   n2o..: help ( -
0c80: 2d 20 29 0a 20 20 20 20 5c 55 20 68 65 6c 70 20  - ).    \U help 
0c90: 5b 63 6d 64 31 20 2e 2e 20 63 6d 64 6e 5d 0a 20  [cmd1 .. cmdn]. 
0ca0: 20 20 20 5c 47 20 68 65 6c 70 3a 20 70 72 69 6e     \G help: prin
0cb0: 74 20 63 6f 6d 6d 61 6e 64 73 20 6f 72 20 64 65  t commands or de
0cc0: 74 61 69 6c 73 20 61 62 6f 75 74 20 73 70 65 63  tails about spec
0cd0: 69 66 69 65 64 20 63 6f 6d 6d 61 6e 64 0a 20 20  ified command.  
0ce0: 20 20 3f 63 72 20 3f 6e 65 78 74 61 72 67 20 49    ?cr ?nextarg I
0cf0: 46 0a 09 42 45 47 49 4e 0a 09 20 20 20 20 32 64  F..BEGIN..    2d
0d00: 75 70 20 6f 76 65 72 20 63 40 20 27 2d 27 20 3d  up over c@ '-' =
0d10: 20 49 46 0a 09 09 2e 22 20 3d 3d 3d 20 4f 70 74   IF...." === Opt
0d20: 69 6f 6e 73 20 3d 3d 3d 22 20 63 72 0a 09 09 5b  ions ===" cr...[
0d30: 3a 20 2e 22 20 20 20 20 20 5c 4f 20 22 20 74 79  : ."     \O " ty
0d40: 70 65 20 3b 5d 0a 09 20 20 20 20 45 4c 53 45 0a  pe ;]..    ELSE.
0d50: 09 09 2e 22 20 3d 3d 3d 20 43 6f 6d 6d 61 6e 64  ..." === Command
0d60: 73 20 3d 3d 3d 22 20 63 72 0a 09 09 5b 3a 20 2e  s ===" cr...[: .
0d70: 22 20 20 20 20 20 5c 55 20 22 20 74 79 70 65 20  "     \U " type 
0d80: 3b 5d 0a 09 20 20 20 20 54 48 45 4e 20 20 24 74  ;]..    THEN  $t
0d90: 6d 70 20 5b 27 5d 20 2e 75 73 61 67 65 20 73 65  mp ['] .usage se
0da0: 61 72 63 68 2d 68 65 6c 70 0a 09 20 20 20 20 2e  arch-help..    .
0db0: 22 20 3d 3d 3d 20 44 65 74 61 69 6c 73 20 3d 3d  " === Details ==
0dc0: 3d 22 20 63 72 0a 09 20 20 20 20 5b 3a 20 2e 22  =" cr..    [: ."
0dd0: 20 20 20 20 20 5c 47 20 22 20 74 79 70 65 20 27       \G " type '
0de0: 3a 27 20 65 6d 69 74 20 3b 5d 20 24 74 6d 70 20  :' emit ;] $tmp 
0df0: 5b 27 5d 20 2e 63 6d 64 20 73 65 61 72 63 68 2d  ['] .cmd search-
0e00: 68 65 6c 70 0a 09 3f 6e 65 78 74 61 72 67 20 30  help..?nextarg 0
0e10: 3d 20 55 4e 54 49 4c 0a 20 20 20 20 45 4c 53 45  = UNTIL.    ELSE
0e20: 0a 09 2e 22 20 3d 3d 3d 20 4f 70 74 69 6f 6e 73  ..." === Options
0e30: 20 28 70 72 65 63 65 65 64 20 63 6f 6d 6d 61 6e   (preceed comman
0e40: 64 73 29 20 3d 3d 3d 22 20 63 72 0a 09 73 22 20  ds) ===" cr..s" 
0e50: 20 20 20 20 5c 4f 20 22 20 5b 27 5d 20 2e 75 73      \O " ['] .us
0e60: 61 67 65 20 73 65 61 72 63 68 2d 68 65 6c 70 0a  age search-help.
0e70: 09 2e 22 20 3d 3d 3d 20 43 6f 6d 6d 61 6e 64 73  .." === Commands
0e80: 20 3d 3d 3d 22 20 63 72 0a 09 73 22 20 20 20 20   ===" cr..s"    
0e90: 20 5c 55 20 22 20 5b 27 5d 20 2e 75 73 61 67 65   \U " ['] .usage
0ea0: 20 73 65 61 72 63 68 2d 68 65 6c 70 0a 20 20 20   search-help.   
0eb0: 20 54 48 45 4e 20 3b 0a 0a 7d 73 63 6f 70 65 0a   THEN ;..}scope.
0ec0: 0a 3a 20 6e 65 78 74 2d 63 6d 64 20 28 20 2d 2d  .: next-cmd ( --
0ed0: 20 29 0a 20 20 20 20 3f 6e 65 78 74 61 72 67 20   ).    ?nextarg 
0ee0: 30 3d 20 49 46 20 20 6e 32 6f 3a 68 65 6c 70 20  0= IF  n2o:help 
0ef0: 20 45 58 49 54 20 20 54 48 45 4e 0a 20 20 20 20   EXIT  THEN.    
0f00: 32 64 75 70 20 5b 27 5d 20 6e 32 6f 20 3e 62 6f  2dup ['] n2o >bo
0f10: 64 79 20 73 65 61 72 63 68 2d 77 6f 72 64 6c 69  dy search-wordli
0f20: 73 74 0a 20 20 20 20 49 46 20 20 6e 69 70 20 6e  st.    IF  nip n
0f30: 69 70 20 65 78 65 63 75 74 65 20 20 45 4c 53 45  ip execute  ELSE
0f40: 0a 09 5b 3a 20 3c 65 72 72 3e 20 2e 22 20 6e 32  ..[: <err> ." n2
0f50: 6f 20 63 6f 6d 6d 61 6e 64 20 6e 6f 74 20 66 6f  o command not fo
0f60: 75 6e 64 3a 20 22 20 6d 61 72 6b 2d 73 74 61 72  und: " mark-star
0f70: 74 20 74 79 70 65 20 6d 61 72 6b 2d 65 6e 64 0a  t type mark-end.
0f80: 09 20 20 20 20 3c 64 65 66 61 75 6c 74 3e 20 63  .    <default> c
0f90: 72 20 3b 5d 20 64 6f 2d 64 65 62 75 67 0a 09 5b  r ;] do-debug..[
0fa0: 27 5d 20 32 64 72 6f 70 20 61 72 67 2d 6c 6f 6f  '] 2drop arg-loo
0fb0: 70 20 6e 32 6f 3a 68 65 6c 70 0a 20 20 20 20 54  p n2o:help.    T
0fc0: 48 45 4e 20 3b 0a 0a 44 65 66 65 72 20 72 75 6e  HEN ;..Defer run
0fd0: 2d 67 75 69 0a 3a 6e 6f 6e 61 6d 65 20 2e 22 20  -gui.:noname ." 
0fe0: 67 75 69 20 6e 6f 74 20 69 6d 70 6c 65 6d 65 6e  gui not implemen
0ff0: 74 65 64 22 20 63 72 20 3b 20 69 73 20 72 75 6e  ted" cr ; is run
1000: 2d 67 75 69 0a 44 65 66 65 72 20 72 75 6e 2d 73  -gui.Defer run-s
1010: 63 61 6e 2d 71 72 0a 3a 6e 6f 6e 61 6d 65 20 2e  can-qr.:noname .
1020: 22 20 73 63 61 6e 2d 71 75 72 20 6e 6f 74 20 69  " scan-qur not i
1030: 6d 70 6c 65 6d 65 6e 74 65 64 22 20 63 72 20 3b  mplemented" cr ;
1040: 20 69 73 20 72 75 6e 2d 73 63 61 6e 2d 71 72 0a   is run-scan-qr.
1050: 0a 24 56 61 72 69 61 62 6c 65 20 67 75 69 2e 66  .$Variable gui.f
1060: 73 24 0a 22 67 75 69 2e 66 73 22 20 6f 70 65 6e  s$."gui.fs" open
1070: 2d 66 70 61 74 68 2d 66 69 6c 65 20 30 3d 20 5b  -fpath-file 0= [
1080: 49 46 5d 20 72 6f 74 20 63 6c 6f 73 65 2d 66 69  IF] rot close-fi
1090: 6c 65 20 74 68 72 6f 77 20 67 75 69 2e 66 73 24  le throw gui.fs$
10a0: 20 24 21 20 5b 54 48 45 4e 5d 0a 24 56 61 72 69   $! [THEN].$Vari
10b0: 61 62 6c 65 20 71 72 73 63 61 6e 2e 66 73 24 0a  able qrscan.fs$.
10c0: 22 71 72 73 63 61 6e 2e 66 73 22 20 6f 70 65 6e  "qrscan.fs" open
10d0: 2d 66 70 61 74 68 2d 66 69 6c 65 20 30 3d 20 5b  -fpath-file 0= [
10e0: 49 46 5d 20 72 6f 74 20 63 6c 6f 73 65 2d 66 69  IF] rot close-fi
10f0: 6c 65 20 74 68 72 6f 77 20 71 72 73 63 61 6e 2e  le throw qrscan.
1100: 66 73 24 20 24 21 20 5b 54 48 45 4e 5d 0a 24 56  fs$ $! [THEN].$V
1110: 61 72 69 61 62 6c 65 20 70 61 72 73 65 72 2e 66  ariable parser.f
1120: 73 24 0a 22 6a 73 6f 6e 2f 70 61 72 73 65 72 2e  s$."json/parser.
1130: 66 73 22 20 6f 70 65 6e 2d 66 70 61 74 68 2d 66  fs" open-fpath-f
1140: 69 6c 65 20 30 3d 20 5b 49 46 5d 20 72 6f 74 20  ile 0= [IF] rot 
1150: 63 6c 6f 73 65 2d 66 69 6c 65 20 74 68 72 6f 77  close-file throw
1160: 20 70 61 72 73 65 72 2e 66 73 24 20 24 21 20 5b   parser.fs$ $! [
1170: 54 48 45 4e 5d 0a 0a 73 63 6f 70 65 3a 20 69 6d  THEN]..scope: im
1180: 70 6f 72 74 65 72 0a 3a 20 67 2b 20 70 61 72 73  porter.: g+ pars
1190: 65 72 2e 66 73 24 20 24 40 20 72 65 71 75 69 72  er.fs$ $@ requir
11a0: 65 64 0a 20 20 20 20 3f 6e 65 78 74 61 72 67 20  ed.    ?nextarg 
11b0: 30 3d 20 49 46 20 20 22 2e 22 20 20 54 48 45 4e  0= IF  "."  THEN
11c0: 20 20 22 67 2b 2d 69 6d 70 6f 72 74 22 20 65 76    "g+-import" ev
11d0: 61 6c 75 61 74 65 20 3b 0a 7d 73 63 6f 70 65 0a  aluate ;.}scope.
11e0: 0a 73 63 6f 70 65 7b 20 6e 32 6f 0a 0a 3a 20 6b  .scope{ n2o..: k
11f0: 65 79 69 6e 20 28 20 2d 2d 20 29 0a 20 20 20 20  eyin ( -- ).    
1200: 5c 55 20 6b 65 79 69 6e 7c 69 6e 6b 65 79 20 66  \U keyin|inkey f
1210: 69 6c 65 31 20 2e 2e 20 66 69 6c 65 6e 0a 20 20  ile1 .. filen.  
1220: 20 20 5c 47 20 6b 65 79 69 6e 3a 20 72 65 61 64    \G keyin: read
1230: 20 61 20 2e 6e 32 6f 20 6b 65 79 20 66 69 6c 65   a .n2o key file
1240: 20 69 6e 0a 20 20 20 20 3f 67 65 74 2d 6d 65 20   in.    ?get-me 
1250: 20 6b 65 79 3e 64 65 66 61 75 6c 74 0a 20 20 20   key>default.   
1260: 20 42 45 47 49 4e 20 20 3f 6e 65 78 74 61 72 67   BEGIN  ?nextarg
1270: 20 57 48 49 4c 45 0a 09 20 20 20 20 69 6d 70 6f   WHILE..    impo
1280: 72 74 23 6d 61 6e 75 61 6c 20 69 6d 70 6f 72 74  rt#manual import
1290: 2d 74 79 70 65 20 21 20 20 64 6f 2d 6b 65 79 69  -type !  do-keyi
12a0: 6e 20 20 6c 61 73 74 2d 6b 65 79 20 2e 3f 70 65  n  last-key .?pe
12b0: 72 6d 0a 20 20 20 20 52 45 50 45 41 54 20 20 73  rm.    REPEAT  s
12c0: 61 76 65 2d 70 75 62 6b 65 79 73 20 3b 0a 3a 20  ave-pubkeys ;.: 
12d0: 6b 65 79 6f 75 74 20 28 20 2d 2d 20 29 0a 20 20  keyout ( -- ).  
12e0: 20 20 5c 55 20 6b 65 79 6f 75 74 7c 6f 75 74 6b    \U keyout|outk
12f0: 65 79 20 5b 40 75 73 65 72 31 20 2e 2e 20 40 75  ey [@user1 .. @u
1300: 73 65 72 6e 5d 0a 20 20 20 20 5c 47 20 6b 65 79  sern].    \G key
1310: 6f 75 74 3a 20 6f 75 74 70 75 74 20 70 75 62 6b  out: output pubk
1320: 65 79 20 6f 66 20 79 6f 75 72 20 69 64 65 6e 74  ey of your ident
1330: 69 74 79 0a 20 20 20 20 5c 47 20 6b 65 79 6f 75  ity.    \G keyou
1340: 74 3a 20 6f 70 74 69 6f 6e 61 6c 3a 20 6f 75 74  t: optional: out
1350: 70 75 74 20 70 75 62 6b 65 79 73 20 6f 66 20 6f  put pubkeys of o
1360: 74 68 65 72 20 75 73 65 72 73 0a 20 20 20 20 3f  ther users.    ?
1370: 67 65 74 2d 6d 65 20 3f 70 65 65 6b 61 72 67 20  get-me ?peekarg 
1380: 49 46 20 20 32 64 72 6f 70 20 6f 75 74 2d 6e 69  IF  2drop out-ni
1390: 63 6b 73 20 20 45 4c 53 45 20 20 6f 75 74 2d 6d  cks  ELSE  out-m
13a0: 65 20 20 54 48 45 4e 20 3b 0a 3a 20 6b 65 79 67  e  THEN ;.: keyg
13b0: 65 6e 20 28 20 2d 2d 20 29 0a 20 20 20 20 5c 55  en ( -- ).    \U
13c0: 20 6b 65 79 67 65 6e 7c 67 65 6e 6b 65 79 20 6e   keygen|genkey n
13d0: 69 63 6b 0a 20 20 20 20 5c 47 20 6b 65 79 67 65  ick.    \G keyge
13e0: 6e 3a 20 67 65 6e 65 72 61 74 65 20 61 20 6e 65  n: generate a ne
13f0: 77 20 6b 65 79 70 61 69 72 0a 20 20 20 20 67 65  w keypair.    ge
1400: 6e 2d 6b 65 79 73 2d 64 69 72 20 3f 6e 65 78 74  n-keys-dir ?next
1410: 61 72 67 20 30 3d 20 49 46 20 20 67 65 74 2d 6e  arg 0= IF  get-n
1420: 69 63 6b 20 20 54 48 45 4e 0a 20 20 20 20 6e 65  ick  THEN.    ne
1430: 77 2d 6b 65 79 20 3f 63 72 20 2e 6b 65 79 73 20  w-key ?cr .keys 
1440: 3f 72 73 6b 20 3b 0a 3a 20 6b 65 79 6c 69 73 74  ?rsk ;.: keylist
1450: 20 28 20 2d 2d 20 29 0a 20 20 20 20 5c 55 20 6b   ( -- ).    \U k
1460: 65 79 6c 69 73 74 7c 6c 69 73 74 6b 65 79 0a 20  eylist|listkey. 
1470: 20 20 20 5c 47 20 6b 65 79 6c 69 73 74 3a 20 6c     \G keylist: l
1480: 69 73 74 20 61 6c 6c 20 6b 6e 6f 77 6e 20 6b 65  ist all known ke
1490: 79 73 0a 20 20 20 20 3f 67 65 74 2d 6d 65 20 3f  ys.    ?get-me ?
14a0: 63 72 20 6c 69 73 74 2d 6b 65 79 73 20 2e 22 20  cr list-keys ." 
14b0: 3d 3d 3d 20 67 72 6f 75 70 73 20 3d 3d 3d 22 20  === groups ===" 
14c0: 63 72 20 2e 67 72 6f 75 70 73 20 3b 0a 0a 3a 20  cr .groups ;..: 
14d0: 6b 65 79 71 72 20 28 20 2d 2d 20 29 0a 20 20 20  keyqr ( -- ).   
14e0: 20 5c 55 20 6b 65 79 71 72 7c 71 72 6b 65 79 20   \U keyqr|qrkey 
14f0: 5b 40 75 73 65 72 31 20 2e 2e 20 40 75 73 65 72  [@user1 .. @user
1500: 6e 5d 0a 20 20 20 20 5c 47 20 6b 65 79 71 72 3a  n].    \G keyqr:
1510: 20 70 72 69 6e 74 20 71 72 20 6f 66 20 6f 77 6e   print qr of own
1520: 20 6b 65 79 20 28 64 65 66 61 75 6c 74 29 20 6f   key (default) o
1530: 72 20 73 65 6c 65 63 74 65 64 20 75 73 65 72 27  r selected user'
1540: 73 20 71 72 0a 20 20 20 20 3f 67 65 74 2d 6d 65  s qr.    ?get-me
1550: 20 69 6e 69 74 2d 63 6c 69 65 6e 74 20 61 6e 6e   init-client ann
1560: 6f 75 6e 63 65 2d 6d 65 0a 20 20 20 20 3f 70 65  ounce-me.    ?pe
1570: 65 6b 61 72 67 20 49 46 20 20 32 64 72 6f 70 20  ekarg IF  2drop 
1580: 71 72 2d 6e 69 63 6b 73 20 20 45 4c 53 45 20 20  qr-nicks  ELSE  
1590: 71 72 2d 6d 65 20 20 54 48 45 4e 20 3b 0a 0a 3a  qr-me  THEN ;..:
15a0: 20 6b 65 79 73 63 61 6e 20 28 20 2d 2d 20 29 0a   keyscan ( -- ).
15b0: 20 20 20 20 5c 55 20 6b 65 79 73 63 61 6e 7c 73      \U keyscan|s
15c0: 63 61 6e 6b 65 79 7c 73 63 61 6e 71 72 7c 71 72  cankey|scanqr|qr
15d0: 73 63 61 6e 0a 20 20 20 20 5c 47 20 6b 65 79 73  scan.    \G keys
15e0: 63 61 6e 3a 20 73 63 61 6e 20 61 20 6b 65 79 20  can: scan a key 
15f0: 69 6e 20 63 6f 6c 6f 72 20 51 52 20 66 6f 72 6d  in color QR form
1600: 0a 20 20 20 20 3f 2e 6e 65 74 32 6f 2d 63 6f 6e  .    ?.net2o-con
1610: 66 69 67 0a 20 20 20 20 72 65 73 65 74 2d 6e 65  fig.    reset-ne
1620: 74 32 6f 2d 63 6d 64 73 0a 20 20 20 20 71 72 73  t2o-cmds.    qrs
1630: 63 61 6e 2e 66 73 24 20 24 40 20 64 75 70 20 49  can.fs$ $@ dup I
1640: 46 20 20 72 65 71 75 69 72 65 64 20 20 45 4c 53  F  required  ELS
1650: 45 20 20 6e 6f 2d 66 69 6c 65 23 20 74 68 72 6f  E  no-file# thro
1660: 77 20 20 54 48 45 4e 20 20 72 75 6e 2d 73 63 61  w  THEN  run-sca
1670: 6e 2d 71 72 20 3b 0a 0a 3a 20 6b 65 79 73 65 61  n-qr ;..: keysea
1680: 72 63 68 20 28 20 2d 2d 20 29 0a 20 20 20 20 5c  rch ( -- ).    \
1690: 55 20 6b 65 79 73 65 61 72 63 68 7c 73 65 61 72  U keysearch|sear
16a0: 63 68 6b 65 79 20 38 35 73 74 72 69 6e 67 31 20  chkey 85string1 
16b0: 2e 2e 20 38 35 73 74 72 69 6e 67 6e 0a 20 20 20  .. 85stringn.   
16c0: 20 5c 47 20 6b 65 79 73 65 61 72 63 68 3a 20 73   \G keysearch: s
16d0: 65 61 72 63 68 20 66 6f 72 20 6b 65 79 73 20 70  earch for keys p
16e0: 72 65 66 69 78 65 64 20 77 69 74 68 20 62 61 73  refixed with bas
16f0: 65 38 35 20 73 74 72 69 6e 67 73 2c 0a 20 20 20  e85 strings,.   
1700: 20 5c 47 20 6b 65 79 73 65 61 72 63 68 3a 20 61   \G keysearch: a
1710: 6e 64 20 69 6d 70 6f 72 74 20 74 68 65 6d 20 69  nd import them i
1720: 6e 74 6f 20 74 68 65 20 6b 65 79 20 63 68 61 69  nto the key chai
1730: 6e 0a 20 20 20 20 3f 67 65 74 2d 6d 65 20 69 6e  n.    ?get-me in
1740: 69 74 2d 63 6c 69 65 6e 74 0a 20 20 20 20 6b 65  it-client.    ke
1750: 79 73 3e 73 65 61 72 63 68 20 73 65 61 72 63 68  ys>search search
1760: 2d 6b 65 79 73 20 69 6e 73 65 72 74 2d 6b 65 79  -keys insert-key
1770: 73 20 73 61 76 65 2d 70 75 62 6b 65 79 73 0a 20  s save-pubkeys. 
1780: 20 20 20 3f 63 72 20 6b 65 79 6c 69 73 74 20 3b     ?cr keylist ;
1790: 0a 0a 3a 20 70 65 72 6d 20 28 20 2d 2d 20 29 0a  ..: perm ( -- ).
17a0: 20 20 20 20 5c 55 20 70 65 72 6d 20 40 75 73 65      \U perm @use
17b0: 72 31 20 2e 2e 20 40 75 73 65 72 6e 20 70 65 72  r1 .. @usern per
17c0: 6d 69 73 73 69 6f 6e 73 20 2e 2e 0a 20 20 20 20  missions ...    
17d0: 5c 47 20 70 65 72 6d 3a 20 43 68 61 6e 67 65 20  \G perm: Change 
17e0: 6f 72 20 73 65 74 20 70 65 72 6d 69 73 73 69 6f  or set permissio
17f0: 6e 73 2e 20 70 65 72 6d 69 73 73 69 6f 6e 20 73  ns. permission s
1800: 74 61 72 74 73 20 77 69 74 68 0a 20 20 20 20 5c  tarts with.    \
1810: 47 20 70 65 72 6d 3a 20 2b 20 66 6f 72 20 61 64  G perm: + for ad
1820: 64 69 6e 67 20 70 65 72 6d 69 73 73 69 6f 6e 73  ding permissions
1830: 0a 20 20 20 20 5c 47 20 70 65 72 6d 3a 20 2d 20  .    \G perm: - 
1840: 66 6f 72 20 74 61 6b 69 6e 67 20 61 77 61 79 20  for taking away 
1850: 70 65 72 6d 69 73 73 69 6f 6e 73 0a 20 20 20 20  permissions.    
1860: 5c 47 20 70 65 72 6d 3a 20 3d 20 73 65 74 73 20  \G perm: = sets 
1870: 64 65 66 61 75 6c 74 73 2c 20 61 64 64 20 6f 72  defaults, add or
1880: 20 73 75 62 74 72 61 63 74 20 70 65 72 6d 69 73   subtract permis
1890: 73 69 6f 6e 73 20 61 66 74 65 72 77 61 72 64 73  sions afterwards
18a0: 0a 20 20 20 20 5c 47 20 70 65 72 6d 3a 20 6e 6f  .    \G perm: no
18b0: 20 70 72 65 66 69 78 20 66 6f 72 20 73 65 74 74   prefix for sett
18c0: 69 6e 67 20 70 65 72 6d 69 73 73 69 6f 6e 73 20  ing permissions 
18d0: 65 78 61 63 74 6c 79 0a 20 20 20 20 5c 47 20 70  exactly.    \G p
18e0: 65 72 6d 3a 20 63 20 6f 6e 6e 65 63 74 20 20 2d  erm: c onnect  -
18f0: 20 61 6c 6c 6f 77 73 20 63 6f 6e 6e 65 63 74 69   allows connecti
1900: 6f 6e 73 0a 20 20 20 20 5c 47 20 70 65 72 6d 3a  ons.    \G perm:
1910: 20 62 20 6c 6f 63 6b 65 64 20 20 2d 20 64 65 6e   b locked  - den
1920: 69 65 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 0a  ies connections.
1930: 20 20 20 20 5c 47 20 70 65 72 6d 3a 20 64 20 68      \G perm: d h
1940: 74 20 20 20 20 20 20 2d 20 44 48 54 20 72 65 61  t      - DHT rea
1950: 64 2f 77 72 69 74 65 20 61 63 63 65 73 73 0a 20  d/write access. 
1960: 20 20 20 5c 47 20 70 65 72 6d 3a 20 6d 20 73 67     \G perm: m sg
1970: 20 20 20 20 20 20 2d 20 63 61 6e 20 73 65 6e 64        - can send
1980: 20 6d 65 73 73 61 67 65 73 0a 20 20 20 20 5c 47   messages.    \G
1990: 20 70 65 72 6d 3a 20 72 20 65 61 64 20 20 20 20   perm: r ead    
19a0: 20 2d 20 61 6c 6c 6f 77 20 74 6f 20 72 65 61 64   - allow to read
19b0: 20 66 69 6c 65 73 0a 20 20 20 20 5c 47 20 70 65   files.    \G pe
19c0: 72 6d 3a 20 77 20 72 69 74 65 20 20 20 20 2d 20  rm: w rite    - 
19d0: 61 6c 6c 6f 77 20 74 6f 20 77 72 69 74 65 20 66  allow to write f
19e0: 69 6c 65 73 0a 20 20 20 20 5c 47 20 70 65 72 6d  iles.    \G perm
19f0: 3a 20 6e 20 61 6d 65 20 20 20 20 20 2d 20 61 6c  : n ame     - al
1a00: 6c 6f 77 20 74 6f 20 61 63 63 65 73 73 20 66 69  low to access fi
1a10: 6c 65 20 62 79 20 6e 61 6d 65 0a 20 20 20 20 5c  le by name.    \
1a20: 47 20 70 65 72 6d 3a 20 68 20 61 73 68 20 20 20  G perm: h ash   
1a30: 20 20 2d 20 61 6c 6c 6f 77 20 74 6f 20 61 63 63    - allow to acc
1a40: 65 73 73 20 66 69 6c 65 20 62 79 20 68 61 73 68  ess file by hash
1a50: 0a 20 20 20 20 5c 47 20 70 65 72 6d 3a 20 73 20  .    \G perm: s 
1a60: 6f 63 6b 65 74 20 20 20 2d 20 61 6c 6c 6f 77 20  ocket   - allow 
1a70: 74 6f 20 61 63 63 65 73 73 20 73 6f 63 6b 65 74  to access socket
1a80: 73 20 28 56 50 4e 29 0a 20 20 20 20 5c 47 20 70  s (VPN).    \G p
1a90: 65 72 6d 3a 20 74 20 65 72 6d 69 6e 61 6c 20 2d  erm: t erminal -
1aa0: 20 61 6c 6c 6f 77 20 74 6f 20 61 63 63 65 73 73   allow to access
1ab0: 20 74 65 72 6d 69 6e 61 6c 0a 20 20 20 20 5c 47   terminal.    \G
1ac0: 20 70 65 72 6d 3a 20 76 20 74 65 72 6d 73 65 72   perm: v termser
1ad0: 56 65 72 20 2d 20 61 6c 6c 6f 77 20 74 6f 20 61  Ver - allow to a
1ae0: 63 63 65 73 73 20 74 65 72 6d 73 65 72 76 65 72  ccess termserver
1af0: 0a 20 20 20 20 5c 47 20 70 65 72 6d 3a 20 79 20  .    \G perm: y 
1b00: 73 59 6e 63 20 20 20 20 2d 20 61 6c 6c 6f 77 20  sYnc    - allow 
1b10: 74 6f 20 73 79 6e 63 0a 20 20 20 20 5c 47 20 70  to sync.    \G p
1b20: 65 72 6d 3a 20 69 20 6e 64 69 72 65 63 74 20 2d  erm: i ndirect -
1b30: 20 64 65 6e 79 20 64 69 72 65 63 74 20 63 6f 6e   deny direct con
1b40: 6e 65 63 74 69 6f 6e 0a 20 20 20 20 3f 67 65 74  nection.    ?get
1b50: 2d 6d 65 0a 20 20 20 20 42 45 47 49 4e 20 20 63  -me.    BEGIN  c
1b60: 68 61 74 2d 6b 65 79 73 20 24 5b 5d 6f 66 66 20  hat-keys $[]off 
1b70: 20 40 6e 69 63 6b 73 3e 63 68 61 74 20 3f 6e 65   @nicks>chat ?ne
1b80: 78 74 61 72 67 20 57 48 49 4c 45 20 20 3e 70 65  xtarg WHILE  >pe
1b90: 72 6d 0a 09 20 20 20 20 63 68 61 74 2d 6b 65 79  rm..    chat-key
1ba0: 73 20 5b 3a 20 6b 65 79 7c 20 6b 65 79 2d 65 78  s [: key| key-ex
1bb0: 69 73 74 3f 20 3f 64 75 70 2d 49 46 20 2e 61 70  ist? ?dup-IF .ap
1bc0: 70 6c 79 2d 70 65 72 6d 69 73 73 69 6f 6e 20 54  ply-permission T
1bd0: 48 45 4e 20 3b 5d 0a 09 20 20 20 20 24 5b 5d 6d  HEN ;]..    $[]m
1be0: 61 70 20 32 64 72 6f 70 20 20 52 45 50 45 41 54  ap 2drop  REPEAT
1bf0: 0a 20 20 20 20 73 61 76 65 2d 6b 65 79 73 20 3b  .    save-keys ;
1c00: 0a 0a 3a 20 67 72 6f 75 70 20 28 20 2d 2d 20 29  ..: group ( -- )
1c10: 0a 20 20 20 20 5c 55 20 67 72 6f 75 70 20 40 75  .    \U group @u
1c20: 73 65 72 31 20 2e 2e 20 40 75 73 65 72 6e 20 5b  ser1 .. @usern [
1c30: 2b 2d 5d 67 72 6f 75 70 31 20 2e 2e 20 5b 2b 2d  +-]group1 .. [+-
1c40: 5d 67 72 6f 75 70 6e 20 2e 2e 0a 20 20 20 20 5c  ]groupn ...    \
1c50: 47 20 67 72 6f 75 70 3a 20 53 65 74 2c 20 61 64  G group: Set, ad
1c60: 64 20 6f 72 20 72 65 6d 6f 76 65 20 61 20 67 72  d or remove a gr
1c70: 6f 75 70 20 66 72 6f 6d 20 61 20 73 65 74 20 6f  oup from a set o
1c80: 66 20 75 73 65 72 73 0a 20 20 20 20 3f 67 65 74  f users.    ?get
1c90: 2d 6d 65 0a 20 20 20 20 42 45 47 49 4e 20 20 63  -me.    BEGIN  c
1ca0: 68 61 74 2d 6b 65 79 73 20 24 5b 5d 6f 66 66 20  hat-keys $[]off 
1cb0: 20 40 6e 69 63 6b 73 3e 63 68 61 74 0a 09 42 45   @nicks>chat..BE
1cc0: 47 49 4e 20 20 3f 6e 65 78 74 61 72 67 20 20 57  GIN  ?nextarg  W
1cd0: 48 49 4c 45 20 20 6f 76 65 72 20 63 40 20 27 40  HILE  over c@ '@
1ce0: 27 20 3c 3e 20 20 57 48 49 4c 45 0a 09 09 20 20  ' <>  WHILE...  
1cf0: 20 20 63 68 61 74 2d 6b 65 79 73 20 5b 3a 20 6b    chat-keys [: k
1d00: 65 79 7c 20 6b 65 79 2d 65 78 69 73 74 3f 20 3f  ey| key-exist? ?
1d10: 64 75 70 2d 49 46 0a 09 09 09 20 20 3e 6f 20 32  dup-IF....  >o 2
1d20: 64 75 70 20 61 70 70 6c 79 2d 67 72 6f 75 70 20  dup apply-group 
1d30: 6f 3e 20 20 54 48 45 4e 20 3b 5d 0a 09 09 20 20  o>  THEN ;]...  
1d40: 20 20 24 5b 5d 6d 61 70 20 32 64 72 6f 70 20 20    $[]map 2drop  
1d50: 52 45 50 45 41 54 20 20 32 64 72 6f 70 20 20 54  REPEAT  2drop  T
1d60: 48 45 4e 0a 20 20 20 20 3f 6e 65 78 74 61 72 67  HEN.    ?nextarg
1d70: 20 30 3d 20 55 4e 54 49 4c 0a 20 20 20 20 73 61   0= UNTIL.    sa
1d80: 76 65 2d 6b 65 79 73 20 3b 0a 0a 3a 20 63 68 67  ve-keys ;..: chg
1d90: 72 6f 75 70 20 28 20 2d 2d 20 29 0a 20 20 20 20  roup ( -- ).    
1da0: 5c 55 20 63 68 67 72 6f 75 70 20 67 72 6f 75 70  \U chgroup group
1db0: 20 70 65 72 6d 69 73 73 69 6f 6e 73 0a 20 20 20   permissions.   
1dc0: 20 5c 47 20 63 68 67 72 6f 75 70 3a 20 41 64 64   \G chgroup: Add
1dd0: 20 6f 72 20 63 68 61 6e 67 65 20 61 20 67 72 6f   or change a gro
1de0: 75 70 0a 20 20 20 20 3f 6e 65 78 74 61 72 67 20  up.    ?nextarg 
1df0: 49 46 20 20 32 64 75 70 20 3e 67 72 6f 75 70 2d  IF  2dup >group-
1e00: 69 64 20 20 64 75 70 20 30 3c 20 49 46 20 20 64  id  dup 0< IF  d
1e10: 72 6f 70 0a 09 20 20 20 20 5b 3a 20 23 30 2e 20  rop..    [: #0. 
1e20: 7b 20 64 5e 20 73 6c 6f 74 20 7d 20 73 6c 6f 74  { d^ slot } slot
1e30: 20 32 20 63 65 6c 6c 73 20 74 79 70 65 20 74 79   2 cells type ty
1e40: 70 65 20 3b 5d 20 24 74 6d 70 20 67 72 6f 75 70  pe ;] $tmp group
1e50: 73 5b 5d 20 24 2b 5b 5d 21 0a 09 20 20 20 20 67  s[] $+[]!..    g
1e60: 72 6f 75 70 73 5b 5d 20 24 5b 5d 23 20 31 2d 20  roups[] $[]# 1- 
1e70: 3e 72 20 20 45 4c 53 45 20 20 3e 72 20 32 64 72  >r  ELSE  >r 2dr
1e80: 6f 70 20 20 54 48 45 4e 0a 09 3f 6e 65 78 74 61  op  THEN..?nexta
1e90: 72 67 20 49 46 0a 09 20 20 20 20 3e 70 65 72 6d  rg IF..    >perm
1ea0: 20 72 40 20 67 72 6f 75 70 73 5b 5d 20 24 5b 5d   r@ groups[] $[]
1eb0: 40 20 64 72 6f 70 20 32 21 0a 09 20 20 20 20 77  @ drop 2!..    w
1ec0: 72 69 74 65 2d 67 72 6f 75 70 73 20 2e 67 72 6f  rite-groups .gro
1ed0: 75 70 73 0a 09 54 48 45 4e 20 20 72 64 72 6f 70  ups..THEN  rdrop
1ee0: 0a 20 20 20 20 54 48 45 4e 20 3b 0a 0a 3a 20 6d  .    THEN ;..: m
1ef0: 76 67 72 6f 75 70 20 28 20 2d 2d 20 29 0a 20 20  vgroup ( -- ).  
1f00: 20 20 5c 55 20 6d 76 67 72 6f 75 70 20 6f 6c 64    \U mvgroup old
1f10: 6e 61 6d 65 31 20 6e 65 77 6e 61 6d 65 31 20 2e  name1 newname1 .
1f20: 2e 20 6f 6c 64 6e 61 6d 65 6e 20 6e 65 77 6e 61  . oldnamen newna
1f30: 6d 65 6e 0a 20 20 20 20 5c 47 20 6d 76 67 72 6f  men.    \G mvgro
1f40: 75 70 3a 20 43 68 61 6e 67 65 20 67 72 6f 75 70  up: Change group
1f50: 27 73 20 6e 61 6d 65 0a 20 20 20 20 42 45 47 49  's name.    BEGI
1f60: 4e 20 20 3f 6e 65 78 74 61 72 67 20 20 57 48 49  N  ?nextarg  WHI
1f70: 4c 45 0a 09 20 20 20 20 3e 67 72 6f 75 70 2d 69  LE..    >group-i
1f80: 64 20 64 75 70 20 30 3c 20 21 21 6e 6f 2d 67 72  d dup 0< !!no-gr
1f90: 6f 75 70 21 21 20 3e 72 20 3f 6e 65 78 74 61 72  oup!! >r ?nextar
1fa0: 67 20 20 57 48 49 4c 45 0a 09 09 32 20 63 65 6c  g  WHILE...2 cel
1fb0: 6c 73 20 72 40 20 67 72 6f 75 70 73 5b 5d 20 24  ls r@ groups[] $
1fc0: 5b 5d 20 24 21 6c 65 6e 0a 09 09 72 3e 20 67 72  [] $!len...r> gr
1fd0: 6f 75 70 73 5b 5d 20 24 5b 5d 2b 21 20 20 52 45  oups[] $[]+!  RE
1fe0: 50 45 41 54 20 20 72 64 72 6f 70 20 20 54 48 45  PEAT  rdrop  THE
1ff0: 4e 0a 20 20 20 20 77 72 69 74 65 2d 67 72 6f 75  N.    write-grou
2000: 70 73 20 2e 67 72 6f 75 70 73 20 3b 0a 0a 3a 20  ps .groups ;..: 
2010: 70 61 73 73 77 64 20 28 20 2d 2d 20 29 0a 20 20  passwd ( -- ).  
2020: 20 20 5c 55 20 70 61 73 73 77 64 20 5b 70 77 2d    \U passwd [pw-
2030: 6c 65 76 65 6c 5d 0a 20 20 20 20 5c 47 20 70 61  level].    \G pa
2040: 73 73 77 64 3a 20 43 68 61 6e 67 65 20 74 68 65  sswd: Change the
2050: 20 70 61 73 73 77 6f 72 64 20 66 6f 72 20 74 68   password for th
2060: 65 20 73 65 6c 65 63 74 65 64 20 73 65 63 72 65  e selected secre
2070: 74 20 6b 65 79 0a 20 20 20 20 3f 67 65 74 2d 6d  t key.    ?get-m
2080: 65 20 2b 6e 65 77 70 68 72 61 73 65 20 6b 65 79  e +newphrase key
2090: 3e 64 65 66 61 75 6c 74 0a 20 20 20 20 70 6b 40  >default.    pk@
20a0: 20 6b 65 79 7c 20 6b 65 79 2d 65 78 69 73 74 3f   key| key-exist?
20b0: 20 3f 64 75 70 2d 49 46 20 20 3e 6f 20 3e 73 74   ?dup-IF  >o >st
20c0: 6f 72 65 6b 65 79 20 40 20 6b 65 2d 73 74 6f 72  orekey @ ke-stor
20d0: 65 6b 65 79 20 21 0a 09 3f 6e 65 78 74 61 72 67  ekey !..?nextarg
20e0: 20 49 46 20 20 3e 6e 75 6d 62 65 72 20 64 72 6f   IF  >number dro
20f0: 70 20 30 20 6d 61 78 20 63 6f 6e 66 69 67 3a 70  p 0 max config:p
2100: 77 2d 6d 61 78 6c 65 76 65 6c 23 20 40 20 6d 69  w-maxlevel# @ mi
2110: 6e 20 20 6b 65 2d 70 77 6c 65 76 65 6c 20 21 20  n  ke-pwlevel ! 
2120: 20 54 48 45 4e 20 20 6f 3e 0a 09 73 61 76 65 2d   THEN  o>..save-
2130: 6b 65 79 73 0a 20 20 20 20 54 48 45 4e 20 3b 0a  keys.    THEN ;.
2140: 0a 3a 20 6e 69 63 6b 20 28 20 2d 2d 20 29 0a 20  .: nick ( -- ). 
2150: 20 20 20 5c 55 20 6e 69 63 6b 20 6e 65 77 6e 69     \U nick newni
2160: 63 6b 0a 20 20 20 20 5c 47 20 6e 69 63 6b 3a 20  ck.    \G nick: 
2170: 43 68 61 6e 67 65 20 79 6f 75 72 20 6e 69 63 6b  Change your nick
2180: 20 74 6f 20 3c 6e 65 77 6e 69 63 6b 3e 0a 20 20   to <newnick>.  
2190: 20 20 3f 67 65 74 2d 6d 65 20 3f 6e 65 78 74 61    ?get-me ?nexta
21a0: 72 67 20 49 46 20 20 70 6b 40 20 6b 65 79 7c 20  rg IF  pk@ key| 
21b0: 6b 65 79 2d 65 78 69 73 74 3f 20 3f 64 75 70 2d  key-exist? ?dup-
21c0: 49 46 0a 09 20 20 20 20 3e 6f 20 6b 65 2d 6e 69  IF..    >o ke-ni
21d0: 63 6b 20 24 21 20 6b 65 79 2d 73 69 67 6e 20 6f  ck $! key-sign o
21e0: 3e 20 73 61 76 65 2d 6b 65 79 73 20 6b 65 79 6c  > save-keys keyl
21f0: 69 73 74 0a 09 45 4c 53 45 20 20 32 64 72 6f 70  ist..ELSE  2drop
2200: 20 20 54 48 45 4e 20 20 54 48 45 4e 20 3b 0a 0a    THEN  THEN ;..
2210: 3a 20 70 65 74 20 28 20 2d 2d 20 29 0a 20 20 20  : pet ( -- ).   
2220: 20 5c 55 20 70 65 74 20 6e 69 63 6b 31 7c 70 65   \U pet nick1|pe
2230: 74 31 20 70 65 74 6e 65 77 31 20 2e 2e 20 6e 69  t1 petnew1 .. ni
2240: 63 6b 6e 7c 70 65 74 6e 20 70 65 74 6e 65 77 6e  ckn|petn petnewn
2250: 0a 20 20 20 20 5c 47 20 70 65 74 3a 20 41 64 64  .    \G pet: Add
2260: 20 61 20 6e 65 77 20 70 65 74 6e 61 6d 65 20 74   a new petname t
2270: 6f 20 65 78 69 73 74 69 6e 67 20 3c 6e 69 63 6b  o existing <nick
2280: 3e 20 6f 72 20 3c 70 65 74 3e 0a 20 20 20 20 3f  > or <pet>.    ?
2290: 67 65 74 2d 6d 65 0a 20 20 20 20 5b 3a 20 6e 69  get-me.    [: ni
22a0: 63 6b 2d 6b 65 79 20 64 75 70 20 30 3d 20 49 46  ck-key dup 0= IF
22b0: 20 20 64 72 6f 70 20 45 58 49 54 20 20 54 48 45    drop EXIT  THE
22c0: 4e 0a 20 20 20 20 20 20 3e 6f 20 3f 6e 65 78 74  N.      >o ?next
22d0: 61 72 67 20 49 46 20 20 6b 65 2d 70 65 74 73 5b  arg IF  ke-pets[
22e0: 5d 20 24 2b 5b 5d 21 20 70 65 74 21 20 20 54 48  ] $+[]! pet!  TH
22f0: 45 4e 20 20 6f 3e 20 3b 5d 20 61 72 67 2d 6c 6f  EN  o> ;] arg-lo
2300: 6f 70 0a 20 20 20 20 73 61 76 65 2d 6b 65 79 73  op.    save-keys
2310: 20 6b 65 79 6c 69 73 74 20 3b 0a 0a 3a 20 70 65   keylist ;..: pe
2320: 74 2d 20 28 20 2d 2d 20 29 0a 20 20 20 20 5c 55  t- ( -- ).    \U
2330: 20 70 65 74 2d 20 70 65 74 31 20 2e 2e 20 70 65   pet- pet1 .. pe
2340: 74 6e 0a 20 20 20 20 5c 47 20 70 65 74 2d 3a 20  tn.    \G pet-: 
2350: 72 65 6d 6f 76 65 20 70 65 74 20 6e 61 6d 65 0a  remove pet name.
2360: 20 20 20 20 3f 67 65 74 2d 6d 65 0a 20 20 20 20      ?get-me.    
2370: 5b 3a 20 32 64 75 70 20 6e 69 63 6b 2d 6b 65 79  [: 2dup nick-key
2380: 20 64 75 70 20 30 3d 20 49 46 20 20 64 72 6f 70   dup 0= IF  drop
2390: 20 32 64 72 6f 70 20 20 45 58 49 54 20 20 54 48   2drop  EXIT  TH
23a0: 45 4e 0a 20 20 20 20 20 20 3e 6f 20 6b 65 2d 70  EN.      >o ke-p
23b0: 65 74 73 5b 5d 20 5b 3a 20 32 6f 76 65 72 20 73  ets[] [: 2over s
23c0: 74 72 3d 20 30 3d 20 3b 5d 20 24 5b 5d 66 69 6c  tr= 0= ;] $[]fil
23d0: 74 65 72 20 32 64 72 6f 70 20 6f 20 6f 3e 0a 20  ter 2drop o o>. 
23e0: 20 20 20 20 20 6c 61 73 74 23 20 63 65 6c 6c 2b       last# cell+
23f0: 20 64 65 6c 24 63 65 6c 6c 0a 20 20 20 20 20 20   del$cell.      
2400: 6c 61 73 74 23 20 63 65 6c 6c 2b 20 24 40 6c 65  last# cell+ $@le
2410: 6e 20 30 3d 20 49 46 20 20 6c 61 73 74 23 20 62  n 0= IF  last# b
2420: 75 63 6b 65 74 2d 6f 66 66 20 20 54 48 45 4e 20  ucket-off  THEN 
2430: 3b 5d 20 61 72 67 2d 6c 6f 6f 70 0a 20 20 20 20  ;] arg-loop.    
2440: 73 61 76 65 2d 6b 65 79 73 20 3f 63 72 20 6b 65  save-keys ?cr ke
2450: 79 6c 69 73 74 20 3b 0a 0a 73 79 6e 6f 6e 79 6d  ylist ;..synonym
2460: 20 69 6e 6b 65 79 20 6b 65 79 69 6e 0a 73 79 6e   inkey keyin.syn
2470: 6f 6e 79 6d 20 6f 75 74 6b 65 79 20 6b 65 79 6f  onym outkey keyo
2480: 75 74 0a 73 79 6e 6f 6e 79 6d 20 67 65 6e 6b 65  ut.synonym genke
2490: 79 20 6b 65 79 67 65 6e 0a 73 79 6e 6f 6e 79 6d  y keygen.synonym
24a0: 20 6c 69 73 74 6b 65 79 20 6b 65 79 6c 69 73 74   listkey keylist
24b0: 0a 73 79 6e 6f 6e 79 6d 20 71 72 6b 65 79 20 6b  .synonym qrkey k
24c0: 65 79 71 72 0a 73 79 6e 6f 6e 79 6d 20 73 65 61  eyqr.synonym sea
24d0: 72 63 68 6b 65 79 20 6b 65 79 73 65 61 72 63 68  rchkey keysearch
24e0: 0a 73 79 6e 6f 6e 79 6d 20 73 63 61 6e 6b 65 79  .synonym scankey
24f0: 20 6b 65 79 73 63 61 6e 0a 73 79 6e 6f 6e 79 6d   keyscan.synonym
2500: 20 71 72 73 63 61 6e 20 6b 65 79 73 63 61 6e 0a   qrscan keyscan.
2510: 73 79 6e 6f 6e 79 6d 20 73 63 61 6e 71 72 20 6b  synonym scanqr k
2520: 65 79 73 63 61 6e 0a 0a 5c 20 65 6e 63 72 79 70  eyscan..\ encryp
2530: 74 69 6f 6e 20 73 75 62 63 6f 6d 6d 61 6e 64 73  tion subcommands
2540: 0a 0a 3a 20 2d 74 68 72 65 65 66 69 73 68 20 28  ..: -threefish (
2550: 20 2d 2d 20 29 0a 20 20 20 20 5c 4f 20 2d 74 68   -- ).    \O -th
2560: 72 65 65 66 69 73 68 0a 20 20 20 20 5c 47 20 2d  reefish.    \G -
2570: 74 68 72 65 65 66 69 73 68 3a 20 75 73 65 20 74  threefish: use t
2580: 68 72 65 65 66 69 73 68 20 65 6e 63 72 79 70 74  hreefish encrypt
2590: 69 6f 6e 20 66 6f 72 20 76 61 75 6c 74 73 0a 20  ion for vaults. 
25a0: 20 20 20 65 6e 63 2d 74 68 72 65 65 66 69 73 68     enc-threefish
25b0: 20 6e 65 78 74 2d 63 6d 64 20 3b 0a 3a 20 2d 6b   next-cmd ;.: -k
25c0: 65 63 63 61 6b 20 28 20 2d 2d 20 29 0a 20 20 20  eccak ( -- ).   
25d0: 20 5c 4f 20 2d 6b 65 63 63 61 6b 0a 20 20 20 20   \O -keccak.    
25e0: 5c 47 20 2d 6b 65 63 63 61 6b 3a 20 75 73 65 20  \G -keccak: use 
25f0: 6b 65 63 63 61 6b 20 65 6e 63 72 79 70 74 69 6f  keccak encryptio
2600: 6e 20 66 6f 72 20 76 61 75 6c 74 73 0a 20 20 20  n for vaults.   
2610: 20 65 6e 63 2d 6b 65 63 63 61 6b 20 6e 65 78 74   enc-keccak next
2620: 2d 63 6d 64 20 3b 0a 0a 3a 20 65 6e 63 20 28 20  -cmd ;..: enc ( 
2630: 2d 2d 20 29 0a 20 20 20 20 5c 55 20 65 6e 63 20  -- ).    \U enc 
2640: 40 75 73 65 72 31 20 2e 2e 20 40 75 73 65 72 6e  @user1 .. @usern
2650: 20 66 69 6c 65 31 20 2e 2e 20 66 69 6c 65 6e 0a   file1 .. filen.
2660: 20 20 20 20 5c 47 20 65 6e 63 3a 20 65 6e 63 72      \G enc: encr
2670: 79 70 74 20 66 69 6c 65 73 20 66 6f 72 20 74 68  ypt files for th
2680: 65 20 6c 69 73 74 65 64 20 75 73 65 72 73 0a 20  e listed users. 
2690: 20 20 20 3f 67 65 74 2d 6d 65 20 61 72 67 73 3e     ?get-me args>
26a0: 6b 65 79 6c 69 73 74 0a 20 20 20 20 5b 3a 20 6b  keylist.    [: k
26b0: 65 79 2d 6c 69 73 74 20 65 6e 63 72 79 70 74 2d  ey-list encrypt-
26c0: 66 69 6c 65 20 3b 5d 20 61 72 67 2d 6c 6f 6f 70  file ;] arg-loop
26d0: 20 3b 0a 3a 20 64 65 63 20 28 20 2d 2d 20 29 0a   ;.: dec ( -- ).
26e0: 20 20 20 20 5c 55 20 64 65 63 20 66 69 6c 65 31      \U dec file1
26f0: 20 2e 2e 20 66 69 6c 65 6e 0a 20 20 20 20 5c 47   .. filen.    \G
2700: 20 64 65 63 3a 20 64 65 63 72 79 70 74 20 66 69   dec: decrypt fi
2710: 6c 65 73 0a 20 20 20 20 3f 67 65 74 2d 6d 65 20  les.    ?get-me 
2720: 5b 3a 20 64 65 63 72 79 70 74 2d 66 69 6c 65 20  [: decrypt-file 
2730: 3b 5d 20 61 72 67 2d 6c 6f 6f 70 20 3b 0a 3a 20  ;] arg-loop ;.: 
2740: 63 61 74 20 28 20 2d 2d 20 29 0a 20 20 20 20 5c  cat ( -- ).    \
2750: 55 20 63 61 74 20 66 69 6c 65 31 20 2e 2e 20 66  U cat file1 .. f
2760: 69 6c 65 6e 0a 20 20 20 20 5c 47 20 63 61 74 3a  ilen.    \G cat:
2770: 20 63 61 74 20 65 6e 63 72 79 70 74 65 64 20 66   cat encrypted f
2780: 69 6c 65 73 20 74 6f 20 73 74 64 6f 75 74 0a 20  iles to stdout. 
2790: 20 20 20 3f 63 72 20 76 61 75 6c 74 3e 6f 75 74     ?cr vault>out
27a0: 20 64 65 63 20 76 61 75 6c 74 3e 66 69 6c 65 20   dec vault>file 
27b0: 3b 0a 0a 5c 20 68 61 73 68 2b 73 69 67 6e 61 74  ;..\ hash+signat
27c0: 75 72 65 0a 0a 30 20 77 61 72 6e 69 6e 67 73 20  ure..0 warnings 
27d0: 21 40 20 5c 20 74 68 65 73 65 20 6f 70 74 69 6f  !@ \ these optio
27e0: 6e 73 20 6c 6f 6f 6b 20 6c 69 6b 65 20 6e 75 6d  ns look like num
27f0: 62 65 72 73 2c 20 64 6f 6e 27 74 20 77 61 72 6e  bers, don't warn
2800: 0a 3a 20 2d 32 35 36 20 28 20 2d 2d 20 29 0a 20  .: -256 ( -- ). 
2810: 20 20 20 5c 4f 20 2d 32 35 36 0a 20 20 20 20 5c     \O -256.    \
2820: 47 20 2d 32 35 36 3a 20 73 65 74 20 68 61 73 68  G -256: set hash
2830: 20 6f 75 74 70 75 74 20 74 6f 20 32 35 36 20 62   output to 256 b
2840: 69 74 73 20 28 64 65 66 61 75 6c 74 29 0a 20 20  its (default).  
2850: 20 20 24 32 30 20 74 6f 20 68 61 73 68 2d 73 69    $20 to hash-si
2860: 7a 65 23 20 6e 65 78 74 2d 63 6d 64 20 3b 0a 0a  ze# next-cmd ;..
2870: 3a 20 2d 35 31 32 20 28 20 2d 2d 20 29 0a 20 20  : -512 ( -- ).  
2880: 20 20 5c 4f 20 2d 35 31 32 0a 20 20 20 20 5c 47    \O -512.    \G
2890: 20 2d 35 31 32 3a 20 73 65 74 20 68 61 73 68 20   -512: set hash 
28a0: 6f 75 74 70 75 74 20 74 6f 20 35 31 32 20 62 69  output to 512 bi
28b0: 74 73 0a 20 20 20 20 24 34 30 20 74 6f 20 68 61  ts.    $40 to ha
28c0: 73 68 2d 73 69 7a 65 23 20 6e 65 78 74 2d 63 6d  sh-size# next-cm
28d0: 64 20 3b 0a 77 61 72 6e 69 6e 67 73 20 21 0a 0a  d ;.warnings !..
28e0: 3a 20 68 61 73 68 20 28 20 2d 2d 20 29 0a 20 20  : hash ( -- ).  
28f0: 20 20 5c 55 20 68 61 73 68 20 66 69 6c 65 31 20    \U hash file1 
2900: 2e 2e 20 66 69 6c 65 6e 0a 20 20 20 20 5c 47 20  .. filen.    \G 
2910: 68 61 73 68 3a 20 68 61 73 68 20 74 68 65 20 66  hash: hash the f
2920: 69 6c 65 73 20 61 6e 64 20 70 72 69 6e 74 20 69  iles and print i
2930: 74 20 62 61 73 65 38 35 0a 20 20 20 20 5c 47 20  t base85.    \G 
2940: 68 61 73 68 3a 20 75 73 65 20 2d 32 35 36 20 6f  hash: use -256 o
2950: 72 20 2d 35 31 32 20 74 6f 20 73 65 6c 65 63 74  r -512 to select
2960: 20 68 61 73 68 20 73 69 7a 65 0a 20 20 20 20 5c   hash size.    \
2970: 47 20 68 61 73 68 3a 20 75 73 65 20 2d 74 68 72  G hash: use -thr
2980: 65 65 66 69 73 68 20 6f 72 20 2d 6b 65 63 63 61  eefish or -kecca
2990: 6b 20 74 6f 20 73 65 6c 65 63 74 20 68 61 73 68  k to select hash
29a0: 20 61 6c 67 6f 72 69 74 68 6d 0a 20 20 20 20 3f   algorithm.    ?
29b0: 63 72 20 65 6e 63 2d 6d 6f 64 65 20 40 20 38 20  cr enc-mode @ 8 
29c0: 72 73 68 69 66 74 20 24 46 46 20 61 6e 64 20 3e  rshift $FF and >
29d0: 63 72 79 70 74 0a 20 20 20 20 5b 3a 20 32 64 75  crypt.    [: 2du
29e0: 70 20 68 61 73 68 2d 66 69 6c 65 20 2e 38 35 69  p hash-file .85i
29f0: 6e 66 6f 20 73 70 61 63 65 20 74 79 70 65 20 63  nfo space type c
2a00: 72 20 3b 5d 20 61 72 67 2d 6c 6f 6f 70 20 30 20  r ;] arg-loop 0 
2a10: 3e 63 72 79 70 74 20 3b 0a 0a 3a 20 68 61 73 68  >crypt ;..: hash
2a20: 2d 62 6c 6f 63 6b 73 20 28 20 2d 2d 20 29 0a 20  -blocks ( -- ). 
2a30: 20 20 20 5c 55 20 68 61 73 68 2d 62 6c 6f 63 6b     \U hash-block
2a40: 73 20 66 69 6c 65 31 20 2e 2e 20 66 69 6c 65 6e  s file1 .. filen
2a50: 0a 20 20 20 20 5c 47 20 68 61 73 68 3a 20 68 61  .    \G hash: ha
2a60: 73 68 20 74 68 65 20 66 69 6c 65 73 20 69 6e 20  sh the files in 
2a70: 62 6c 6f 63 6b 73 20 6f 66 20 31 6b 20 61 6e 64  blocks of 1k and
2a80: 20 70 72 69 6e 74 20 69 74 20 62 61 73 65 38 35   print it base85
2a90: 0a 20 20 20 20 5c 47 20 68 61 73 68 3a 20 75 73  .    \G hash: us
2aa0: 65 20 2d 32 35 36 20 6f 72 20 2d 35 31 32 20 74  e -256 or -512 t
2ab0: 6f 20 73 65 6c 65 63 74 20 68 61 73 68 20 73 69  o select hash si
2ac0: 7a 65 0a 20 20 20 20 5c 47 20 68 61 73 68 3a 20  ze.    \G hash: 
2ad0: 75 73 65 20 2d 74 68 72 65 65 66 69 73 68 20 6f  use -threefish o
2ae0: 72 20 2d 6b 65 63 63 61 6b 20 74 6f 20 73 65 6c  r -keccak to sel
2af0: 65 63 74 20 68 61 73 68 20 61 6c 67 6f 72 69 74  ect hash algorit
2b00: 68 6d 0a 20 20 20 20 3f 63 72 20 65 6e 63 2d 6d  hm.    ?cr enc-m
2b10: 6f 64 65 20 40 20 38 20 72 73 68 69 66 74 20 24  ode @ 8 rshift $
2b20: 46 46 20 61 6e 64 20 3e 63 72 79 70 74 0a 20 20  FF and >crypt.  
2b30: 20 20 5b 3a 20 32 64 75 70 20 74 79 70 65 20 2e    [: 2dup type .
2b40: 22 20 3a 22 20 63 72 20 68 61 73 68 2d 66 69 6c  " :" cr hash-fil
2b50: 65 2d 62 6c 6f 63 6b 73 20 3b 5d 20 61 72 67 2d  e-blocks ;] arg-
2b60: 6c 6f 6f 70 20 30 20 3e 63 72 79 70 74 20 3b 0a  loop 0 >crypt ;.
2b70: 0a 3a 20 62 64 69 66 66 32 20 28 20 2d 2d 20 29  .: bdiff2 ( -- )
2b80: 0a 20 20 20 20 5c 55 20 62 64 69 66 66 32 20 66  .    \U bdiff2 f
2b90: 69 6c 65 31 20 66 69 6c 65 32 20 2e 2e 20 66 69  ile1 file2 .. fi
2ba0: 6c 65 6e 31 20 66 69 6c 65 6e 32 0a 20 20 20 20  len1 filen2.    
2bb0: 5c 47 20 62 64 69 66 66 32 3a 20 64 69 66 66 73  \G bdiff2: diffs
2bc0: 20 74 77 6f 20 66 69 6c 65 73 20 62 69 6e 61 72   two files binar
2bd0: 79 20 61 6e 64 20 64 69 73 70 6c 61 79 73 20 61  y and displays a
2be0: 20 6e 75 6d 65 72 69 63 20 73 75 6d 6d 61 72 79   numeric summary
2bf0: 0a 20 20 20 20 5c 47 20 62 64 69 66 66 32 3a 20  .    \G bdiff2: 
2c00: 6f 66 20 68 6f 77 20 74 68 65 79 20 64 69 66 66  of how they diff
2c10: 65 72 0a 20 20 20 20 42 45 47 49 4e 20 20 3f 6e  er.    BEGIN  ?n
2c20: 65 78 74 61 72 67 20 20 57 48 49 4c 45 20 20 3f  extarg  WHILE  ?
2c30: 6e 65 78 74 61 72 67 20 20 49 46 0a 09 09 32 6f  nextarg  IF...2o
2c40: 76 65 72 20 74 79 70 65 20 2e 22 20 2e 2e 22 20  ver type ." .." 
2c50: 32 64 75 70 20 74 79 70 65 20 2e 22 20 3a 20 22  2dup type ." : "
2c60: 0a 09 09 62 64 65 6c 74 61 20 32 64 72 6f 70 20  ...bdelta 2drop 
2c70: 62 66 69 6c 65 31 24 20 62 64 65 6c 74 61 24 20  bfile1$ bdelta$ 
2c80: 63 6f 6c 6f 72 2d 62 70 61 74 63 68 23 20 63 72  color-bpatch# cr
2c90: 0a 09 20 20 20 20 45 4c 53 45 20 20 32 64 72 6f  ..    ELSE  2dro
2ca0: 70 20 20 54 48 45 4e 0a 20 20 20 20 52 45 50 45  p  THEN.    REPE
2cb0: 41 54 20 3b 0a 0a 3a 20 64 69 66 66 32 20 28 20  AT ;..: diff2 ( 
2cc0: 2d 2d 20 29 0a 20 20 20 20 5c 55 20 64 69 66 66  -- ).    \U diff
2cd0: 32 20 66 69 6c 65 31 20 66 69 6c 65 32 20 2e 2e  2 file1 file2 ..
2ce0: 20 66 69 6c 65 6e 31 20 66 69 6c 65 6e 32 0a 20   filen1 filen2. 
2cf0: 20 20 20 5c 47 20 64 69 66 66 32 3a 20 64 69 66     \G diff2: dif
2d00: 66 73 20 74 77 6f 20 74 65 78 74 20 66 69 6c 65  fs two text file
2d10: 73 20 61 6e 64 20 64 69 73 70 6c 61 79 73 20 61  s and displays a
2d20: 20 6e 75 6d 65 72 69 63 20 73 75 6d 6d 61 72 79   numeric summary
2d30: 0a 20 20 20 20 5c 47 20 64 69 66 66 32 3a 20 6f  .    \G diff2: o
2d40: 66 20 68 6f 77 20 74 68 65 79 20 64 69 66 66 65  f how they diffe
2d50: 72 0a 20 20 20 20 42 45 47 49 4e 20 20 3f 6e 65  r.    BEGIN  ?ne
2d60: 78 74 61 72 67 20 20 57 48 49 4c 45 20 20 3f 6e  xtarg  WHILE  ?n
2d70: 65 78 74 61 72 67 20 20 49 46 0a 09 09 2e 22 20  extarg  IF...." 
2d80: 2d 2d 2d 20 22 20 32 6f 76 65 72 20 74 79 70 65  --- " 2over type
2d90: 20 63 72 20 2e 22 20 2b 2b 2b 20 22 20 32 64 75   cr ." +++ " 2du
2da0: 70 20 74 79 70 65 20 2e 22 20 3a 22 20 63 72 0a  p type ." :" cr.
2db0: 09 09 62 64 65 6c 74 61 20 32 64 72 6f 70 20 62  ..bdelta 2drop b
2dc0: 66 69 6c 65 31 24 20 62 64 65 6c 74 61 24 20 63  file1$ bdelta$ c
2dd0: 6f 6c 6f 72 2d 62 70 61 74 63 68 24 32 20 63 72  olor-bpatch$2 cr
2de0: 0a 09 20 20 20 20 45 4c 53 45 20 20 32 64 72 6f  ..    ELSE  2dro
2df0: 70 20 20 54 48 45 4e 0a 20 20 20 20 52 45 50 45  p  THEN.    REPE
2e00: 41 54 20 3b 0a 0a 3a 20 73 69 67 6e 20 28 20 2d  AT ;..: sign ( -
2e10: 2d 20 29 0a 20 20 20 20 5c 55 20 73 69 67 6e 20  - ).    \U sign 
2e20: 66 69 6c 65 31 20 2e 2e 20 66 69 6c 65 6e 0a 20  file1 .. filen. 
2e30: 20 20 20 5c 47 20 73 69 67 6e 3a 20 63 72 65 61     \G sign: crea
2e40: 74 65 20 64 65 74 61 63 68 65 64 20 2e 73 32 6f  te detached .s2o
2e50: 20 73 69 67 6e 61 74 75 72 65 73 20 66 6f 72 20   signatures for 
2e60: 61 6c 6c 20 66 69 6c 65 73 0a 20 20 20 20 3f 67  all files.    ?g
2e70: 65 74 2d 6d 65 20 6e 6f 77 3e 6e 65 76 65 72 0a  et-me now>never.
2e80: 20 20 20 20 5b 3a 20 32 64 75 70 20 68 61 73 68      [: 2dup hash
2e90: 2d 66 69 6c 65 20 32 64 72 6f 70 0a 20 20 20 20  -file 2drop.    
2ea0: 20 20 5b 3a 20 74 79 70 65 20 2e 22 20 2e 73 32    [: type ." .s2
2eb0: 6f 22 20 3b 5d 20 24 74 6d 70 20 77 2f 6f 20 63  o" ;] $tmp w/o c
2ec0: 72 65 61 74 65 2d 66 69 6c 65 20 74 68 72 6f 77  reate-file throw
2ed0: 20 3e 72 0a 20 20 20 20 20 20 5b 3a 20 2e 70 6b   >r.      [: .pk
2ee0: 20 2e 73 69 67 20 3b 5d 20 24 74 6d 70 20 72 40   .sig ;] $tmp r@
2ef0: 20 77 72 69 74 65 2d 66 69 6c 65 20 72 3e 20 63   write-file r> c
2f00: 6c 6f 73 65 2d 66 69 6c 65 20 74 68 72 6f 77 20  lose-file throw 
2f10: 74 68 72 6f 77 20 3b 5d 0a 20 20 20 20 61 72 67  throw ;].    arg
2f20: 2d 6c 6f 6f 70 20 3b 0a 0a 3a 20 76 65 72 69 66  -loop ;..: verif
2f30: 79 20 28 20 2d 2d 20 29 0a 20 20 20 20 5c 55 20  y ( -- ).    \U 
2f40: 76 65 72 69 66 79 20 66 69 6c 65 31 20 2e 2e 20  verify file1 .. 
2f50: 66 69 6c 65 6e 0a 20 20 20 20 5c 47 20 76 65 72  filen.    \G ver
2f60: 69 66 79 3a 20 63 68 65 63 6b 20 69 6e 74 65 67  ify: check integ
2f70: 72 69 74 79 20 6f 66 20 66 69 6c 65 73 20 76 73  rity of files vs
2f80: 2e 20 64 65 74 61 63 68 65 64 20 73 69 67 6e 61  . detached signa
2f90: 74 75 72 65 0a 20 20 20 20 3f 67 65 74 2d 6d 65  ture.    ?get-me
2fa0: 20 3f 63 72 0a 20 20 20 20 5b 3a 20 32 64 75 70   ?cr.    [: 2dup
2fb0: 20 68 61 73 68 2d 66 69 6c 65 20 32 64 72 6f 70   hash-file 2drop
2fc0: 20 32 64 75 70 20 74 79 70 65 0a 20 20 20 20 20   2dup type.     
2fd0: 20 5b 3a 20 74 79 70 65 20 2e 22 20 2e 73 32 6f   [: type ." .s2o
2fe0: 22 20 3b 5d 20 24 74 6d 70 20 73 6c 75 72 70 2d  " ;] $tmp slurp-
2ff0: 66 69 6c 65 0a 20 20 20 20 20 20 6f 76 65 72 20  file.      over 
3000: 64 61 74 65 2d 73 69 67 3f 20 64 75 70 20 3e 72  date-sig? dup >r
3010: 20 20 65 72 72 6f 72 2d 63 6f 6c 6f 72 20 69 6e    error-color in
3020: 66 6f 2d 63 6f 6c 6f 72 20 72 3e 20 73 65 6c 65  fo-color r> sele
3030: 63 74 20 20 61 74 74 72 21 20 2e 63 68 65 63 6b  ct  attr! .check
3040: 0a 20 20 20 20 20 20 73 70 61 63 65 20 6f 76 65  .      space ove
3050: 72 20 6b 65 79 73 69 7a 65 20 2e 6b 65 79 2d 69  r keysize .key-i
3060: 64 20 3c 64 65 66 61 75 6c 74 3e 0a 20 20 20 20  d <default>.    
3070: 20 20 64 72 6f 70 20 66 72 65 65 20 74 68 72 6f    drop free thro
3080: 77 20 63 72 20 3b 5d 0a 20 20 20 20 61 72 67 2d  w cr ;].    arg-
3090: 6c 6f 6f 70 20 3b 0a 0a 5c 20 73 65 6c 65 63 74  loop ;..\ select
30a0: 20 63 6f 6e 66 69 67 20 66 69 6c 65 0a 0a 3a 20   config file..: 
30b0: 2d 63 6f 6e 66 69 67 20 28 20 2d 2d 20 29 0a 20  -config ( -- ). 
30c0: 20 20 20 5c 4f 20 2d 63 6f 6e 66 69 67 20 3c 66     \O -config <f
30d0: 69 6c 65 6e 61 6d 65 3e 0a 20 20 20 20 5c 47 20  ilename>.    \G 
30e0: 2d 63 6f 6e 66 69 67 3a 20 53 65 74 20 66 69 6c  -config: Set fil
30f0: 65 6e 61 6d 65 20 66 6f 72 20 63 6f 6e 66 69 67  ename for config
3100: 20 66 69 6c 65 0a 20 20 20 20 3f 6e 65 78 74 61   file.    ?nexta
3110: 72 67 20 30 3d 20 3f 45 58 49 54 20 20 63 6f 6e  rg 0= ?EXIT  con
3120: 66 69 67 2d 66 69 6c 65 24 20 24 21 20 6e 65 78  fig-file$ $! nex
3130: 74 2d 63 6d 64 20 3b 0a 0a 3a 20 2d 63 6f 6e 66  t-cmd ;..: -conf
3140: 20 28 20 2d 2d 20 29 0a 20 20 20 20 5c 4f 20 2d   ( -- ).    \O -
3150: 63 6f 6e 66 20 3c 76 61 6c 75 65 3e 3d 3c 74 68  conf <value>=<th
3160: 69 6e 67 3e 0a 20 20 20 20 5c 47 20 2d 63 6f 6e  ing>.    \G -con
3170: 66 3a 20 53 65 74 20 61 20 63 6f 6e 66 69 67 20  f: Set a config 
3180: 76 61 6c 75 65 0a 20 20 20 20 3f 2e 6e 65 74 32  value.    ?.net2
3190: 6f 2d 63 6f 6e 66 69 67 20 5c 20 72 65 61 64 20  o-config \ read 
31a0: 63 6f 6e 66 69 67 20 69 66 20 6e 65 63 65 73 73  config if necess
31b0: 61 72 79 0a 20 20 20 20 3f 6e 65 78 74 61 72 67  ary.    ?nextarg
31c0: 20 30 3d 20 3f 45 58 49 54 20 5b 27 5d 20 63 6f   0= ?EXIT ['] co
31d0: 6e 66 69 67 2d 6c 69 6e 65 20 65 78 65 63 75 74  nfig-line execut
31e0: 65 2d 70 61 72 73 69 6e 67 20 6e 65 78 74 2d 63  e-parsing next-c
31f0: 6d 64 20 3b 0a 0a 5c 20 73 65 72 76 65 72 20 6d  md ;..\ server m
3200: 6f 64 65 0a 0a 3a 20 2d 6c 61 78 20 28 20 2d 2d  ode..: -lax ( --
3210: 20 29 0a 20 20 20 20 5c 4f 20 2d 6c 61 78 0a 20   ).    \O -lax. 
3220: 20 20 20 5c 47 20 2d 6c 61 78 3a 20 6f 70 65 6e     \G -lax: open
3230: 20 66 6f 72 20 61 6c 6c 20 6b 65 79 73 0a 20 20   for all keys.  
3240: 20 20 70 65 72 6d 25 64 65 66 61 75 6c 74 20 74    perm%default t
3250: 6f 20 70 65 72 6d 25 75 6e 6b 6e 6f 77 6e 20 20  o perm%unknown  
3260: 6e 65 78 74 2d 63 6d 64 20 3b 0a 0a 3a 20 73 65  next-cmd ;..: se
3270: 72 76 65 72 20 28 20 2d 2d 20 29 0a 20 20 20 20  rver ( -- ).    
3280: 5c 55 20 73 65 72 76 65 72 0a 20 20 20 20 3f 67  \U server.    ?g
3290: 65 74 2d 6d 65 20 69 6e 69 74 2d 73 65 72 76 65  et-me init-serve
32a0: 72 20 61 6e 6e 6f 75 6e 63 65 2d 6d 65 20 73 65  r announce-me se
32b0: 72 76 65 72 2d 6c 6f 6f 70 2d 63 61 74 63 68 20  rver-loop-catch 
32c0: 3b 0a 0a 3a 20 72 6f 6f 74 73 65 72 76 65 72 20  ;..: rootserver 
32d0: 28 20 2d 2d 20 29 0a 20 20 20 20 5c 55 20 72 6f  ( -- ).    \U ro
32e0: 6f 74 73 65 72 76 65 72 0a 20 20 20 20 70 65 72  otserver.    per
32f0: 6d 25 64 65 66 61 75 6c 74 20 74 6f 20 70 65 72  m%default to per
3300: 6d 25 75 6e 6b 6e 6f 77 6e 0a 20 20 20 20 5c 20  m%unknown.    \ 
3310: 77 65 6c 6c 20 6b 6e 6f 77 6e 20 30 6b 65 79 20  well known 0key 
3320: 6f 66 20 61 20 64 68 74 20 72 6f 6f 74 2c 20 21  of a dht root, !
3330: 21 46 49 58 4d 45 21 21 20 74 6f 20 61 6c 6c 6f  !FIXME!! to allo
3340: 77 20 63 68 61 6e 67 69 6e 67 20 74 68 61 74 0a  w changing that.
3350: 20 20 20 20 38 35 22 20 34 6d 7a 75 4c 68 75 7b      85" 4mzuLhu{
3360: 37 50 2a 38 68 6b 51 6c 4b 25 24 68 37 44 4a 43  7P*8hkQlK%$h7DJC
3370: 25 58 7d 24 64 7a 45 72 75 36 42 7b 42 64 6c 58  %X}$dzEru6B{BdlX
3380: 22 20 6d 79 2d 30 6b 65 79 20 73 65 63 21 0a 20  " my-0key sec!. 
3390: 20 20 20 6e 65 65 64 2d 62 65 61 63 6f 6e 23 20     need-beacon# 
33a0: 6f 66 66 20 5c 20 61 73 20 44 48 54 20 72 6f 6f  off \ as DHT roo
33b0: 74 20 73 65 72 76 65 72 2c 20 77 65 20 64 6f 6e  t server, we don
33c0: 27 74 20 6e 65 65 64 20 62 65 61 63 6f 6e 20 68  't need beacon h
33d0: 61 73 68 65 73 0a 20 20 20 20 3f 67 65 74 2d 6d  ashes.    ?get-m
33e0: 65 20 69 6e 69 74 2d 73 65 72 76 65 72 20 61 64  e init-server ad
33f0: 64 6d 65 2d 6f 77 6e 64 68 74 20 73 65 72 76 65  dme-owndht serve
3400: 72 2d 6c 6f 6f 70 2d 63 61 74 63 68 20 3b 0a 0a  r-loop-catch ;..
3410: 5c 20 64 68 74 20 63 6f 6d 6d 61 6e 64 73 0a 0a  \ dht commands..
3420: 3a 20 61 6e 6e 6f 75 6e 63 65 20 28 20 2d 2d 20  : announce ( -- 
3430: 29 0a 20 20 20 20 5c 55 20 61 6e 6e 6f 75 6e 63  ).    \U announc
3440: 65 0a 20 20 20 20 5c 47 20 61 6e 6e 6f 75 6e 63  e.    \G announc
3450: 65 3a 20 4f 6e 6c 79 20 61 6e 6e 6f 75 6e 63 65  e: Only announce
3460: 20 49 44 0a 20 20 20 20 3f 67 65 74 2d 6d 65 20   ID.    ?get-me 
3470: 69 6e 69 74 2d 63 6c 69 65 6e 74 20 61 6e 6e 6f  init-client anno
3480: 75 6e 63 65 2d 6d 65 20 3b 0a 0a 3a 20 6c 6f 6f  unce-me ;..: loo
3490: 6b 75 70 20 28 20 2d 2d 20 29 0a 20 20 20 20 5c  kup ( -- ).    \
34a0: 55 20 6c 6f 6f 6b 75 70 0a 20 20 20 20 5c 47 20  U lookup.    \G 
34b0: 6c 6f 6f 6b 75 70 3a 20 71 75 65 72 79 20 44 48  lookup: query DH
34c0: 54 20 66 6f 72 20 61 64 64 72 65 73 73 65 73 0a  T for addresses.
34d0: 20 20 20 20 3f 67 65 74 2d 6d 65 20 3f 63 72 20      ?get-me ?cr 
34e0: 69 6e 69 74 2d 63 6c 69 65 6e 74 20 6e 69 63 6b  init-client nick
34f0: 73 3e 73 65 61 72 63 68 20 73 65 61 72 63 68 2d  s>search search-
3500: 61 64 64 72 73 0a 20 20 20 20 73 65 61 72 63 68  addrs.    search
3510: 2d 6b 65 79 5b 5d 20 5b 3a 20 32 64 75 70 20 2e  -key[] [: 2dup .
3520: 73 69 6d 70 6c 65 2d 69 64 20 2e 22 20 3a 22 20  simple-id ." :" 
3530: 63 72 0a 20 20 20 20 20 20 3e 64 23 69 64 20 3e  cr.      >d#id >
3540: 6f 20 64 68 74 2d 68 6f 73 74 20 5b 3a 20 2e 68  o dht-host [: .h
3550: 6f 73 74 20 63 72 20 3b 5d 20 24 5b 5d 6d 61 70  ost cr ;] $[]map
3560: 20 6f 3e 20 3b 5d 20 24 5b 5d 6d 61 70 20 3b 0a   o> ;] $[]map ;.
3570: 0a 3a 20 70 69 6e 67 20 28 20 2d 2d 20 29 0a 20  .: ping ( -- ). 
3580: 20 20 20 5c 55 20 70 69 6e 67 0a 20 20 20 20 5c     \U ping.    \
3590: 47 20 70 69 6e 67 3a 20 71 75 65 72 79 20 44 48  G ping: query DH
35a0: 54 20 61 6e 64 20 73 65 6e 64 20 61 20 70 69 6e  T and send a pin
35b0: 67 20 74 6f 20 74 68 65 20 6f 62 73 65 72 76 65  g to the observe
35c0: 64 20 61 64 64 72 65 73 73 65 73 0a 20 20 20 20  d addresses.    
35d0: 5c 47 20 70 69 6e 67 3a 20 69 73 20 6e 6f 74 20  \G ping: is not 
35e0: 72 65 61 64 79 20 79 65 74 0a 20 20 20 20 3f 67  ready yet.    ?g
35f0: 65 74 2d 6d 65 20 69 6e 69 74 2d 63 6c 69 65 6e  et-me init-clien
3600: 74 20 6e 69 63 6b 73 3e 73 65 61 72 63 68 20 73  t nicks>search s
3610: 65 61 72 63 68 2d 61 64 64 72 73 20 70 69 6e 67  earch-addrs ping
3620: 73 5b 5d 20 24 5b 5d 6f 66 66 0a 20 20 20 20 73  s[] $[]off.    s
3630: 65 61 72 63 68 2d 6b 65 79 5b 5d 20 5b 3a 20 3e  earch-key[] [: >
3640: 64 23 69 64 20 3e 6f 20 64 68 74 2d 68 6f 73 74  d#id >o dht-host
3650: 20 5b 3a 20 70 69 6e 67 73 5b 5d 20 24 2b 5b 5d   [: pings[] $+[]
3660: 21 20 3b 5d 20 24 5b 5d 6d 61 70 20 6f 3e 20 3b  ! ;] $[]map o> ;
3670: 5d 20 24 5b 5d 6d 61 70 0a 20 20 20 20 70 69 6e  ] $[]map.    pin
3680: 67 73 5b 5d 20 5b 3a 20 73 65 6e 64 2d 70 69 6e  gs[] [: send-pin
3690: 67 20 3b 5d 20 24 5b 5d 6d 61 70 20 20 72 65 63  g ;] $[]map  rec
36a0: 65 69 76 65 2d 70 69 6e 67 73 20 3b 0a 0a 5c 20  eive-pings ;..\ 
36b0: 63 68 61 74 20 6d 6f 64 65 0a 0a 3a 20 2d 72 6f  chat mode..: -ro
36c0: 6f 74 20 28 20 2d 2d 20 29 0a 20 20 20 20 5c 4f  ot ( -- ).    \O
36d0: 20 2d 72 6f 6f 74 20 3c 61 64 64 72 65 73 73 5b   -root <address[
36e0: 3a 70 6f 72 74 5d 3e 0a 20 20 20 20 3f 6e 65 78  :port]>.    ?nex
36f0: 74 61 72 67 20 30 3d 20 3f 45 58 49 54 20 27 3a  targ 0= ?EXIT ':
3700: 27 20 24 73 70 6c 69 74 20 64 75 70 20 49 46 20  ' $split dup IF 
3710: 20 73 3e 6e 75 6d 62 65 72 20 64 72 6f 70 20 74   s>number drop t
3720: 6f 20 6e 65 74 32 6f 2d 70 6f 72 74 0a 20 20 20  o net2o-port.   
3730: 20 45 4c 53 45 20 20 32 64 72 6f 70 20 20 54 48   ELSE  2drop  TH
3740: 45 4e 20 20 6e 65 74 32 6f 2d 68 6f 73 74 20 24  EN  net2o-host $
3750: 21 20 20 64 68 74 72 6f 6f 74 2d 6f 66 66 0a 20  !  dhtroot-off. 
3760: 20 20 20 6e 65 78 74 2d 63 6d 64 20 3b 0a 0a 3a     next-cmd ;..:
3770: 20 2d 72 6f 6f 74 6e 69 63 6b 20 28 20 2d 2d 20   -rootnick ( -- 
3780: 29 0a 20 20 20 20 5c 4f 20 2d 72 6f 6f 74 6e 69  ).    \O -rootni
3790: 63 6b 20 3c 6e 69 63 6b 3e 0a 20 20 20 20 3f 6e  ck <nick>.    ?n
37a0: 65 78 74 61 72 67 20 30 3d 20 3f 45 58 49 54 20  extarg 0= ?EXIT 
37b0: 20 64 68 74 6e 69 63 6b 20 24 21 20 20 64 68 74   dhtnick $!  dht
37c0: 72 6f 6f 74 2d 6f 66 66 20 20 6e 65 78 74 2d 63  root-off  next-c
37d0: 6d 64 20 3b 0a 0a 3a 20 2d 70 6f 72 74 20 28 20  md ;..: -port ( 
37e0: 2d 2d 20 29 0a 20 20 20 20 5c 4f 20 2d 70 6f 72  -- ).    \O -por
37f0: 74 20 3c 70 6f 72 74 23 3e 0a 20 20 20 20 5c 47  t <port#>.    \G
3800: 20 2d 70 6f 72 74 3a 20 73 65 74 73 20 70 6f 72   -port: sets por
3810: 74 20 74 6f 20 61 20 66 69 78 65 64 20 6e 75 6d  t to a fixed num
3820: 62 65 72 20 66 6f 72 20 72 65 61 63 68 61 62 69  ber for reachabi
3830: 6c 69 74 79 20 66 72 6f 6d 20 6f 75 74 73 69 64  lity from outsid
3840: 65 2c 0a 20 20 20 20 5c 47 20 2d 70 6f 72 74 3a  e,.    \G -port:
3850: 20 61 6c 6c 6f 77 73 20 74 6f 20 64 65 66 69 6e   allows to defin
3860: 65 20 70 6f 72 74 20 66 6f 72 77 61 72 64 69 6e  e port forwardin
3870: 67 20 72 75 6c 65 73 20 69 6e 20 74 68 65 20 66  g rules in the f
3880: 69 72 65 77 61 6c 6c 0a 20 20 20 20 5c 47 20 2d  irewall.    \G -
3890: 70 6f 72 74 3a 20 6f 6e 6c 79 20 66 6f 72 20 63  port: only for c
38a0: 6c 69 65 6e 74 3b 20 73 65 72 76 65 72 2d 73 69  lient; server-si
38b0: 64 65 20 70 6f 72 74 20 69 73 20 64 69 66 66 65  de port is diffe
38c0: 72 65 6e 74 0a 20 20 20 20 3f 6e 65 78 74 61 72  rent.    ?nextar
38d0: 67 20 30 3d 20 3f 45 58 49 54 20 20 73 3e 6e 75  g 0= ?EXIT  s>nu
38e0: 6d 62 65 72 20 64 72 6f 70 20 63 6f 6e 66 69 67  mber drop config
38f0: 3a 70 6f 72 74 23 20 21 0a 20 20 20 20 6e 65 78  :port# !.    nex
3900: 74 2d 63 6d 64 20 3b 0a 0a 3a 20 2d 6f 74 72 20  t-cmd ;..: -otr 
3910: 28 20 2d 2d 2d 20 29 0a 20 20 20 20 5c 4f 20 2d  ( --- ).    \O -
3920: 6f 74 72 0a 20 20 20 20 5c 47 20 2d 6f 74 72 3a  otr.    \G -otr:
3930: 20 54 75 72 6e 20 6f 66 66 2d 74 68 65 2d 72 65   Turn off-the-re
3940: 63 6f 72 64 73 20 6d 6f 64 65 20 6f 6e 2c 20 73  cords mode on, s
3950: 6f 20 63 68 61 74 73 20 61 72 65 20 6e 6f 74 20  o chats are not 
3960: 6c 6f 67 67 65 64 0a 20 20 20 20 6f 74 72 2d 6d  logged.    otr-m
3970: 6f 64 65 20 6f 6e 20 6e 65 78 74 2d 63 6d 64 20  ode on next-cmd 
3980: 3b 0a 0a 3a 20 63 68 61 74 20 28 20 2d 2d 20 29  ;..: chat ( -- )
3990: 0a 20 20 20 20 5c 55 20 63 68 61 74 20 40 75 73  .    \U chat @us
39a0: 65 72 31 7c 67 72 6f 75 70 31 40 75 73 65 72 31  er1|group1@user1
39b0: 7c 67 72 6f 75 70 31 20 2e 2e 2e 20 40 75 73 65  |group1 ... @use
39c0: 72 6e 7c 67 72 6f 75 70 6e 40 75 73 65 72 6e 7c  rn|groupn@usern|
39d0: 67 72 6f 75 70 6e 0a 20 20 20 20 5c 47 20 63 68  groupn.    \G ch
39e0: 61 74 3a 20 40 75 73 65 72 3a 20 20 20 20 20 20  at: @user:      
39f0: 74 6f 20 63 68 61 74 20 70 72 69 76 61 74 65 6c  to chat privatel
3a00: 79 20 77 69 74 68 20 61 20 75 73 65 72 0a 20 20  y with a user.  
3a10: 20 20 5c 47 20 63 68 61 74 3a 20 67 72 6f 75 70    \G chat: group
3a20: 40 75 73 65 72 3a 20 74 6f 20 63 68 61 74 20 77  @user: to chat w
3a30: 69 74 68 20 74 68 65 20 63 68 61 74 67 72 6f 75  ith the chatgrou
3a40: 70 20 6d 61 6e 61 67 65 64 20 62 79 20 75 73 65  p managed by use
3a50: 72 0a 20 20 20 20 5c 47 20 63 68 61 74 3a 20 67  r.    \G chat: g
3a60: 72 6f 75 70 3a 20 20 20 20 20 20 74 6f 20 73 74  roup:      to st
3a70: 61 72 74 20 61 20 67 72 6f 75 70 20 63 68 61 74  art a group chat
3a80: 20 28 70 65 65 72 73 20 6d 61 79 20 63 6f 6e 6e   (peers may conn
3a90: 65 63 74 29 0a 20 20 20 20 5c 47 20 63 68 61 74  ect).    \G chat
3aa0: 3a 20 63 68 61 74 20 77 69 74 68 20 61 6e 20 75  : chat with an u
3ab0: 73 65 72 2c 20 61 20 67 72 6f 75 70 20 6d 61 6e  ser, a group man
3ac0: 61 67 65 64 20 62 79 20 61 6e 20 75 73 65 72 2c  aged by an user,
3ad0: 20 6f 72 20 73 74 61 72 74 0a 20 20 20 20 5c 47   or start.    \G
3ae0: 20 63 68 61 74 3a 20 79 6f 75 72 20 6f 77 6e 20   chat: your own 
3af0: 67 72 6f 75 70 0a 20 20 20 20 61 6e 6e 6f 75 6e  group.    announ
3b00: 63 65 20 6e 69 63 6b 73 3e 63 68 61 74 20 68 61  ce nicks>chat ha
3b10: 6e 64 6c 65 2d 63 68 61 74 20 3b 0a 0a 3a 20 63  ndle-chat ;..: c
3b20: 68 61 74 6c 6f 67 20 28 20 2d 2d 20 29 0a 20 20  hatlog ( -- ).  
3b30: 20 20 5c 55 20 63 68 61 74 6c 6f 67 20 40 75 73    \U chatlog @us
3b40: 65 72 31 7c 67 72 6f 75 70 31 20 2e 2e 20 40 75  er1|group1 .. @u
3b50: 73 65 72 6e 7c 67 72 6f 75 70 6e 20 0a 20 20 20  sern|groupn .   
3b60: 20 5c 47 20 63 68 61 74 6c 6f 67 3a 20 64 75 6d   \G chatlog: dum
3b70: 70 20 63 68 61 74 20 6c 6f 67 0a 20 20 20 20 3f  p chat log.    ?
3b80: 67 65 74 2d 6d 65 20 3f 63 72 20 69 6e 69 74 2d  get-me ?cr init-
3b90: 63 6c 69 65 6e 74 0a 20 20 20 20 42 45 47 49 4e  client.    BEGIN
3ba0: 20 20 3f 6e 65 78 74 61 72 67 20 20 57 48 49 4c    ?nextarg  WHIL
3bb0: 45 20 20 2e 22 20 3d 3d 3d 3d 3d 3d 20 43 68 61  E  ." ====== Cha
3bc0: 74 20 6c 6f 67 20 66 6f 72 20 22 20 32 64 75 70  t log for " 2dup
3bd0: 20 74 79 70 65 0a 09 20 20 20 20 6f 76 65 72 20   type..    over 
3be0: 63 40 20 27 40 27 20 3d 20 49 46 20 20 31 20 2f  c@ '@' = IF  1 /
3bf0: 73 74 72 69 6e 67 20 6e 69 63 6b 3e 70 6b 20 6b  string nick>pk k
3c00: 65 79 7c 20 2e 22 20 20 6b 65 79 3a 20 22 20 32  ey| ."  key: " 2
3c10: 64 75 70 20 38 35 74 79 70 65 20 20 54 48 45 4e  dup 85type  THEN
3c20: 0a 09 20 20 20 20 2e 22 20 20 3d 3d 3d 3d 3d 3d  ..    ."  ======
3c30: 22 20 63 72 20 6d 73 67 2d 67 72 6f 75 70 24 20  " cr msg-group$ 
3c40: 24 21 0a 09 20 20 20 20 6d 73 67 2d 67 72 6f 75  $!..    msg-grou
3c50: 70 24 20 24 40 20 5b 20 2d 31 20 31 20 72 73 68  p$ $@ [ -1 1 rsh
3c60: 69 66 74 20 63 65 6c 6c 2f 20 5d 6c 20 6c 6f 61  ift cell/ ]l loa
3c70: 64 2d 6d 73 67 6e 20 52 45 50 45 41 54 20 3b 0a  d-msgn REPEAT ;.
3c80: 0a 3a 20 63 68 61 74 67 72 6f 75 70 20 28 20 2d  .: chatgroup ( -
3c90: 2d 20 29 0a 20 20 20 20 5c 55 20 63 68 61 74 67  - ).    \U chatg
3ca0: 72 6f 75 70 20 6e 61 6d 65 20 5b 69 64 5d 20 40  roup name [id] @
3cb0: 75 73 65 72 31 20 2e 2e 20 40 75 73 65 72 6e 20  user1 .. @usern 
3cc0: 5b 61 64 6d 69 6e 20 3c 73 6b 3e 5d 20 5b 2b 70  [admin <sk>] [+p
3cd0: 65 72 6d 5d 0a 20 20 20 20 5c 47 20 63 68 61 74  erm].    \G chat
3ce0: 67 72 6f 75 70 3a 20 64 65 66 69 6e 65 20 61 20  group: define a 
3cf0: 63 68 61 74 20 67 72 6f 75 70 0a 20 20 20 20 3f  chat group.    ?
3d00: 67 65 74 2d 6d 65 20 3f 6e 65 78 74 61 72 67 20  get-me ?nextarg 
3d10: 30 3d 20 3f 45 58 49 54 0a 20 20 20 20 5b 3a 20  0= ?EXIT.    [: 
3d20: 6d 61 6b 65 2d 67 72 6f 75 70 0a 09 3f 70 65 65  make-group..?pee
3d30: 6b 61 72 67 20 30 3d 20 3f 45 58 49 54 0a 09 6f  karg 0= ?EXIT..o
3d40: 76 65 72 20 63 40 20 27 40 27 20 3c 3e 20 49 46  ver c@ '@' <> IF
3d50: 20 20 32 64 72 6f 70 20 3f 6e 65 78 74 61 72 67    2drop ?nextarg
3d60: 20 64 72 6f 70 0a 09 20 20 20 20 32 64 75 70 20   drop..    2dup 
3d70: 73 22 20 3d 22 20 73 74 72 3d 20 49 46 20 20 32  s" =" str= IF  2
3d80: 64 72 6f 70 0a 09 20 20 20 20 45 4c 53 45 20 20  drop..    ELSE  
3d90: 62 61 73 65 38 35 3e 24 20 74 6f 20 67 72 6f 75  base85>$ to grou
3da0: 70 73 3a 69 64 24 20 20 54 48 45 4e 0a 09 45 4c  ps:id$  THEN..EL
3db0: 53 45 20 20 67 65 6e 2d 61 64 6d 69 6e 2d 6b 65  SE  gen-admin-ke
3dc0: 79 0a 09 54 48 45 4e 0a 09 42 45 47 49 4e 20 20  y..THEN..BEGIN  
3dd0: 3f 40 6e 65 78 74 61 72 67 20 20 57 48 49 4c 45  ?@nextarg  WHILE
3de0: 20 20 6e 69 63 6b 3e 70 6b 20 6b 65 79 7c 20 67    nick>pk key| g
3df0: 72 6f 75 70 73 3a 6d 65 6d 62 65 72 5b 5d 20 24  roups:member[] $
3e00: 2b 5b 5d 21 20 20 52 45 50 45 41 54 0a 09 3f 70  +[]!  REPEAT..?p
3e10: 65 65 6b 61 72 67 20 30 3d 20 3f 45 58 49 54 0a  eekarg 0= ?EXIT.
3e20: 09 73 22 20 61 64 6d 69 6e 22 20 73 74 72 3d 20  .s" admin" str= 
3e30: 49 46 20 20 3f 6e 65 78 74 61 72 67 20 64 72 6f  IF  ?nextarg dro
3e40: 70 20 32 64 72 6f 70 0a 09 20 20 20 20 3f 6e 65  p 2drop..    ?ne
3e50: 78 74 61 72 67 20 20 49 46 0a 09 09 62 61 73 65  xtarg  IF...base
3e60: 38 35 3e 24 20 67 72 6f 75 70 73 3a 61 64 6d 69  85>$ groups:admi
3e70: 6e 20 73 65 63 21 20 61 64 6d 69 6e 3e 70 6b 0a  n sec! admin>pk.
3e80: 09 20 20 20 20 54 48 45 4e 0a 09 54 48 45 4e 0a  .    THEN..THEN.
3e90: 09 3f 70 65 65 6b 61 72 67 20 30 3d 20 3f 45 58  .?peekarg 0= ?EX
3ea0: 49 54 0a 09 6f 76 65 72 20 63 40 20 27 2b 27 20  IT..over c@ '+' 
3eb0: 3d 20 49 46 20 20 32 64 72 6f 70 20 3f 6e 65 78  = IF  2drop ?nex
3ec0: 74 61 72 67 20 64 72 6f 70 0a 09 20 20 20 20 73  targ drop..    s
3ed0: 3e 75 6e 75 6d 62 65 72 3f 20 64 72 6f 70 20 64  >unumber? drop d
3ee0: 3e 36 34 20 74 6f 20 67 72 6f 75 70 73 3a 70 65  >64 to groups:pe
3ef0: 72 6d 73 23 0a 09 54 48 45 4e 20 3b 5d 20 65 78  rms#..THEN ;] ex
3f00: 65 63 75 74 65 0a 20 20 20 20 73 61 76 65 2d 63  ecute.    save-c
3f10: 68 61 74 67 72 6f 75 70 73 20 2e 63 68 61 74 67  hatgroups .chatg
3f20: 72 6f 75 70 73 20 3b 0a 0a 3a 20 63 68 61 74 67  roups ;..: chatg
3f30: 72 6f 75 70 73 20 28 20 2d 2d 20 29 0a 20 20 20  roups ( -- ).   
3f40: 20 5c 55 20 63 68 61 74 67 72 6f 75 70 73 0a 20   \U chatgroups. 
3f50: 20 20 20 5c 47 20 63 68 61 74 67 72 6f 75 70 73     \G chatgroups
3f60: 3a 20 6c 69 73 74 20 63 68 61 74 67 72 6f 75 70  : list chatgroup
3f70: 73 0a 20 20 20 20 3f 67 65 74 2d 6d 65 20 2e 63  s.    ?get-me .c
3f80: 68 61 74 67 72 6f 75 70 73 20 3b 0a 0a 3a 20 63  hatgroups ;..: c
3f90: 68 61 74 67 72 6f 75 70 2d 20 28 20 2d 2d 20 29  hatgroup- ( -- )
3fa0: 0a 20 20 20 20 5c 55 20 63 68 61 74 67 72 6f 75  .    \U chatgrou
3fb0: 70 2d 20 67 72 6f 75 70 31 20 2e 2e 20 67 72 6f  p- group1 .. gro
3fc0: 75 70 6e 0a 20 20 20 20 3f 67 65 74 2d 6d 65 20  upn.    ?get-me 
3fd0: 5b 3a 20 67 72 6f 75 70 23 20 23 66 72 65 65 20  [: group# #free 
3fe0: 3b 5d 20 61 72 67 2d 6c 6f 6f 70 0a 20 20 20 20  ;] arg-loop.    
3ff0: 73 61 76 65 2d 63 68 61 74 67 72 6f 75 70 73 20  save-chatgroups 
4000: 2e 63 68 61 74 67 72 6f 75 70 73 20 3b 0a 0a 3a  .chatgroups ;..:
4010: 20 69 6e 76 69 74 65 20 28 20 2d 2d 20 29 0a 20   invite ( -- ). 
4020: 20 20 20 5c 55 20 69 6e 76 69 74 65 20 40 75 73     \U invite @us
4030: 65 72 20 5b 22 49 6e 76 69 74 61 74 69 6f 6e 20  er ["Invitation 
4040: 74 65 78 74 22 5d 0a 20 20 20 20 5c 47 20 69 6e  text"].    \G in
4050: 76 69 74 65 3a 20 73 65 6e 64 20 6f 72 20 61 63  vite: send or ac
4060: 63 65 70 74 20 61 6e 20 69 6e 76 69 74 61 74 69  cept an invitati
4070: 6f 6e 20 74 6f 20 61 6e 6f 74 68 65 72 20 75 73  on to another us
4080: 65 72 0a 20 20 20 20 61 6e 6e 6f 75 6e 63 65 20  er.    announce 
4090: 40 6e 69 63 6b 73 3e 63 68 61 74 0a 20 20 20 20  @nicks>chat.    
40a0: 3f 6e 65 78 74 61 72 67 20 49 46 20 20 63 6f 6e  ?nextarg IF  con
40b0: 66 69 67 3a 69 6e 76 69 74 65 24 20 24 21 20 20  fig:invite$ $!  
40c0: 54 48 45 4e 0a 20 20 20 20 63 68 61 74 2d 6b 65  THEN.    chat-ke
40d0: 79 73 20 5b 3a 20 6e 65 74 32 6f 3a 70 6b 6c 6f  ys [: net2o:pklo
40e0: 6f 6b 75 70 20 73 65 6e 64 2d 69 6e 76 69 74 61  okup send-invita
40f0: 74 69 6f 6e 20 3b 5d 20 24 5b 5d 6d 61 70 0a 20  tion ;] $[]map. 
4100: 20 20 20 2e 22 20 69 6e 76 69 74 61 74 69 6f 6e     ." invitation
4110: 22 20 63 68 61 74 2d 6b 65 79 73 20 24 5b 5d 23  " chat-keys $[]#
4120: 20 31 20 3e 20 49 46 20 2e 22 20 73 22 20 54 48   1 > IF ." s" TH
4130: 45 4e 20 20 2e 22 20 20 73 65 6e 64 22 20 66 6f  EN  ."  send" fo
4140: 72 74 68 3a 63 72 20 3b 20 0a 0a 5c 20 73 63 72  rth:cr ; ..\ scr
4150: 69 70 74 20 6d 6f 64 65 0a 0a 3a 20 63 6d 64 20  ipt mode..: cmd 
4160: 28 20 2d 2d 20 29 0a 20 20 20 20 5c 55 20 63 6d  ( -- ).    \U cm
4170: 64 0a 20 20 20 20 5c 47 20 63 6d 64 3a 20 4f 66  d.    \G cmd: Of
4180: 66 65 72 20 61 20 6e 65 74 32 6f 20 63 6f 6d 6d  fer a net2o comm
4190: 61 6e 64 20 6c 69 6e 65 20 66 6f 72 20 63 6c 69  and line for cli
41a0: 65 6e 74 20 73 74 75 66 66 0a 20 20 20 20 67 65  ent stuff.    ge
41b0: 74 2d 6d 65 20 2e 22 20 6e 65 74 32 6f 20 69 6e  t-me ." net2o in
41c0: 74 65 72 61 63 74 69 76 65 20 73 68 65 6c 6c 2c  teractive shell,
41d0: 20 74 79 70 65 20 27 62 79 65 27 20 74 6f 20 71   type 'bye' to q
41e0: 75 69 74 22 0a 20 20 20 20 30 20 74 6f 20 73 63  uit".    0 to sc
41f0: 72 69 70 74 3f 20 6e 32 6f 2d 63 6d 64 73 20 3b  ript? n2o-cmds ;
4200: 0a 0a 3a 20 73 63 72 69 70 74 20 28 20 2d 2d 20  ..: script ( -- 
4210: 29 0a 20 20 20 20 5c 55 20 73 63 72 69 70 74 20  ).    \U script 
4220: 66 69 6c 65 0a 20 20 20 20 5c 47 20 73 63 72 69  file.    \G scri
4230: 70 74 3a 20 72 65 61 64 20 61 20 66 69 6c 65 20  pt: read a file 
4240: 69 6e 20 73 63 72 69 70 74 20 6d 6f 64 65 0a 20  in script mode. 
4250: 20 20 20 3f 6e 65 78 74 61 72 67 20 30 3d 20 49     ?nextarg 0= I
4260: 46 20 20 68 65 6c 70 20 20 45 58 49 54 20 20 54  F  help  EXIT  T
4270: 48 45 4e 0a 20 20 20 20 67 65 74 2d 6d 65 20 69  HEN.    get-me i
4280: 6e 69 74 2d 63 6c 69 65 6e 74 20 77 6f 72 64 2d  nit-client word-
4290: 61 72 67 73 20 5b 27 5d 20 69 6e 63 6c 75 64 65  args ['] include
42a0: 64 20 64 6f 2d 6e 65 74 32 6f 2d 63 6d 64 73 20  d do-net2o-cmds 
42b0: 3b 0a 0a 3a 20 73 68 20 28 20 2d 2d 20 29 0a 20  ;..: sh ( -- ). 
42c0: 20 20 20 5c 55 20 73 68 20 63 6d 64 0a 20 20 20     \U sh cmd.   
42d0: 20 5c 47 20 73 68 3a 20 65 76 61 6c 75 61 74 65   \G sh: evaluate
42e0: 20 72 65 73 74 20 6f 66 20 63 6f 6d 6d 61 6e 64   rest of command
42f0: 20 61 73 20 73 68 65 6c 6c 20 63 6f 6d 6d 61 6e   as shell comman
4300: 64 0a 20 20 20 20 73 6f 75 72 63 65 20 3e 69 6e  d.    source >in
4310: 20 40 20 2f 73 74 72 69 6e 67 20 73 79 73 74 65   @ /string syste
4320: 6d 20 20 73 6f 75 72 63 65 20 6e 69 70 20 3e 69  m  source nip >i
4330: 6e 20 21 20 3b 0a 0a 3a 20 64 65 62 75 67 20 28  n ! ;..: debug (
4340: 20 2d 2d 20 29 0a 20 20 20 20 5c 55 20 64 65 62   -- ).    \U deb
4350: 75 67 20 5b 2b 7c 2d 3c 73 77 69 74 63 68 3e 5d  ug [+|-<switch>]
4360: 0a 20 20 20 20 5c 47 20 64 65 62 75 67 3a 20 73  .    \G debug: s
4370: 65 74 20 6f 72 20 63 6c 65 61 72 20 64 65 62 75  et or clear debu
4380: 67 67 69 6e 67 20 73 77 69 74 63 68 65 73 0a 20  gging switches. 
4390: 20 20 20 61 6c 73 6f 20 66 6f 72 74 68 0a 20 20     also forth.  
43a0: 20 20 42 45 47 49 4e 20 20 3f 70 65 65 6b 61 72    BEGIN  ?peekar
43b0: 67 20 20 57 48 49 4c 45 20 20 2b 2d 3f 20 20 57  g  WHILE  +-?  W
43c0: 48 49 4c 45 20 20 3f 6e 65 78 74 61 72 67 20 64  HILE  ?nextarg d
43d0: 72 6f 70 20 73 65 74 2d 64 65 62 75 67 20 20 52  rop set-debug  R
43e0: 45 50 45 41 54 20 20 54 48 45 4e 0a 20 20 20 20  EPEAT  THEN.    
43f0: 70 72 65 76 69 6f 75 73 20 3b 0a 0a 3a 20 73 65  previous ;..: se
4400: 65 20 28 20 2d 2d 20 29 0a 20 20 20 20 5c 55 20  e ( -- ).    \U 
4410: 73 65 65 20 5b 3a 3a 73 63 6f 70 65 31 5d 20 66  see [::scope1] f
4420: 69 6c 65 31 20 2e 2e 20 5b 3a 3a 73 63 6f 70 65  ile1 .. [::scope
4430: 6e 5d 20 66 69 6c 65 6e 0a 20 20 20 20 5c 47 20  n] filen.    \G 
4440: 73 65 65 3a 20 64 65 63 6f 6d 69 6c 65 20 61 20  see: decomile a 
4450: 66 69 6c 65 2c 20 73 63 6f 70 65 73 20 61 72 65  file, scopes are
4460: 20 61 20 67 6c 6f 62 61 6c 20 73 74 61 74 65 3b   a global state;
4470: 0a 20 20 20 20 5c 47 20 73 65 65 3a 20 64 65 66  .    \G see: def
4480: 61 75 6c 74 20 73 63 6f 70 65 20 69 73 20 64 65  ault scope is de
4490: 74 65 72 6d 69 6e 65 64 20 62 79 20 66 69 6c 65  termined by file
44a0: 20 65 78 74 65 6e 73 69 6f 6e 2c 0a 20 20 20 20   extension,.    
44b0: 5c 47 20 73 65 65 3a 20 73 65 74 75 70 20 73 63  \G see: setup sc
44c0: 6f 70 65 20 69 66 20 6e 6f 74 20 64 65 66 69 6e  ope if not defin
44d0: 65 64 0a 20 20 20 20 73 65 74 75 70 2d 74 61 62  ed.    setup-tab
44e0: 6c 65 20 40 20 73 65 65 3a 74 61 62 6c 65 20 21  le @ see:table !
44f0: 0a 20 20 20 20 5b 3a 20 32 64 75 70 20 73 22 20  .    [: 2dup s" 
4500: 3a 3a 22 20 73 74 72 69 6e 67 2d 70 72 65 66 69  ::" string-prefi
4510: 78 3f 20 49 46 0a 09 20 20 20 20 32 20 2f 73 74  x? IF..    2 /st
4520: 72 69 6e 67 20 5b 3a 20 74 79 70 65 20 2e 22 20  ring [: type ." 
4530: 2d 74 61 62 6c 65 22 20 3b 5d 20 24 74 6d 70 20  -table" ;] $tmp 
4540: 66 69 6e 64 2d 6e 61 6d 65 0a 09 20 20 20 20 6e  find-name..    n
4550: 61 6d 65 3e 69 6e 74 20 65 78 65 63 75 74 65 20  ame>int execute 
4560: 40 20 73 65 65 3a 74 61 62 6c 65 20 21 0a 09 45  @ see:table !..E
4570: 4c 53 45 0a 09 20 20 20 20 73 65 65 3a 74 61 62  LSE..    see:tab
4580: 6c 65 20 40 20 3e 72 0a 09 20 20 20 20 2e 22 20  le @ >r..    ." 
4590: 3d 3d 3d 3d 3d 20 22 20 32 64 75 70 20 66 6f 72  ===== " 2dup for
45a0: 74 68 3a 74 79 70 65 20 2e 22 20 20 3d 3d 3d 3d  th:type ."  ====
45b0: 3d 22 20 66 6f 72 74 68 3a 63 72 0a 09 20 20 20  =" forth:cr..   
45c0: 20 32 64 75 70 20 73 75 66 66 69 78 3e 74 61 62   2dup suffix>tab
45d0: 6c 65 20 73 65 65 3a 74 61 62 6c 65 20 21 0a 09  le see:table !..
45e0: 20 20 20 20 7b 20 7c 20 77 5e 20 63 6f 6e 74 65      { | w^ conte
45f0: 6e 74 20 7d 20 63 6f 6e 74 65 6e 74 20 24 73 6c  nt } content $sl
4600: 75 72 70 2d 66 69 6c 65 0a 09 20 20 20 20 63 6f  urp-file..    co
4610: 6e 74 65 6e 74 20 24 40 20 6e 65 74 32 6f 3a 28  ntent $@ net2o:(
4620: 73 65 65 29 20 66 6f 72 74 68 3a 63 72 0a 09 20  see) forth:cr.. 
4630: 20 20 20 63 6f 6e 74 65 6e 74 20 24 66 72 65 65     content $free
4640: 20 20 72 3e 20 73 65 65 3a 74 61 62 6c 65 20 21    r> see:table !
4650: 0a 09 54 48 45 4e 0a 20 20 20 20 3b 5d 20 61 72  ..THEN.    ;] ar
4660: 67 2d 6c 6f 6f 70 20 3b 0a 0a 5c 20 66 69 6c 65  g-loop ;..\ file
4670: 20 63 6f 70 79 0a 0a 3a 20 67 65 74 20 28 20 2d   copy..: get ( -
4680: 2d 20 29 0a 20 20 20 20 5c 55 20 67 65 74 20 40  - ).    \U get @
4690: 75 73 65 72 20 66 69 6c 65 31 20 2e 2e 20 66 69  user file1 .. fi
46a0: 6c 65 6e 0a 20 20 20 20 5c 47 20 67 65 74 3a 20  len.    \G get: 
46b0: 67 65 74 20 66 69 6c 65 73 20 69 6e 74 6f 20 63  get files into c
46c0: 75 72 72 65 6e 74 20 64 69 72 65 63 74 6f 72 79  urrent directory
46d0: 0a 20 20 20 20 3f 67 65 74 2d 6d 65 20 69 6e 69  .    ?get-me ini
46e0: 74 2d 63 6c 69 65 6e 74 0a 20 20 20 20 3f 40 6e  t-client.    ?@n
46f0: 65 78 74 61 72 67 20 49 46 0a 09 64 76 63 73 2d  extarg IF..dvcs-
4700: 62 75 66 73 23 20 6e 69 63 6b 2d 63 6f 6e 6e 65  bufs# nick-conne
4710: 63 74 20 5b 3a 20 2e 22 20 63 6f 6e 6e 65 63 74  ct [: ." connect
4720: 65 64 22 20 63 72 20 3b 5d 20 64 6f 2d 64 65 62  ed" cr ;] do-deb
4730: 75 67 20 21 74 69 6d 65 0a 09 2b 72 65 73 65 6e  ug !time..+resen
4740: 64 20 2b 66 6c 6f 77 2d 63 6f 6e 74 72 6f 6c 0a  d +flow-control.
4750: 09 6e 65 74 32 6f 2d 63 6f 64 65 20 65 78 70 65  .net2o-code expe
4760: 63 74 2b 73 6c 75 72 70 0a 09 24 31 30 20 62 6c  ct+slurp..$10 bl
4770: 6f 63 6b 73 69 7a 65 21 20 24 41 20 62 6c 6f 63  ocksize! $A bloc
4780: 6b 61 6c 69 67 6e 21 0a 09 42 45 47 49 4e 0a 09  kalign!..BEGIN..
4790: 20 20 20 20 24 31 30 20 5b 3a 20 32 64 75 70 20      $10 [: 2dup 
47a0: 62 61 73 65 6e 61 6d 65 20 6e 65 74 32 6f 3a 63  basename net2o:c
47b0: 6f 70 79 20 3b 5d 20 61 72 67 2d 6c 6f 6f 70 23  opy ;] arg-loop#
47c0: 0a 09 20 20 20 20 65 6e 64 2d 63 6f 64 65 7c 20  ..    end-code| 
47d0: 6e 65 74 32 6f 3a 63 6c 6f 73 65 2d 61 6c 6c 20  net2o:close-all 
47e0: 2d 6d 61 70 2d 72 65 73 65 6e 64 0a 09 20 20 20  -map-resend..   
47f0: 20 3f 70 65 65 6b 61 72 67 20 20 57 48 49 4c 45   ?peekarg  WHILE
4800: 20 20 32 64 72 6f 70 0a 09 09 2b 72 65 73 65 6e    2drop...+resen
4810: 64 20 2b 66 6c 6f 77 2d 63 6f 6e 74 72 6f 6c 0a  d +flow-control.
4820: 09 09 6e 65 74 32 6f 2d 63 6f 64 65 20 65 78 70  ..net2o-code exp
4830: 65 63 74 2b 73 6c 75 72 70 20 20 63 6c 6f 73 65  ect+slurp  close
4840: 2d 61 6c 6c 20 20 61 63 6b 20 72 65 77 69 6e 64  -all  ack rewind
4850: 20 65 6e 64 2d 77 69 74 68 0a 09 09 5b 20 70 72   end-with...[ pr
4860: 65 76 69 6f 75 73 20 5d 0a 09 52 45 50 45 41 54  evious ]..REPEAT
4870: 20 20 34 20 74 6f 20 6d 61 78 2d 74 69 6d 65 6f    4 to max-timeo
4880: 75 74 73 20 64 69 73 63 6f 6e 6e 65 63 74 2d 6d  uts disconnect-m
4890: 65 0a 20 20 20 20 54 48 45 4e 20 3b 0a 0a 3a 20  e.    THEN ;..: 
48a0: 67 65 74 23 20 28 20 2d 2d 20 29 0a 20 20 20 20  get# ( -- ).    
48b0: 5c 55 20 67 65 74 23 20 40 75 73 65 72 20 68 61  \U get# @user ha
48c0: 73 68 31 20 2e 2e 20 68 61 73 68 6e 0a 20 20 20  sh1 .. hashn.   
48d0: 20 5c 47 20 67 65 74 23 3a 20 67 65 74 20 66 69   \G get#: get fi
48e0: 6c 65 73 20 62 79 20 68 61 73 68 20 69 6e 74 6f  les by hash into
48f0: 20 68 61 73 68 20 64 69 72 65 63 74 6f 72 79 0a   hash directory.
4900: 20 20 20 20 3f 67 65 74 2d 6d 65 20 69 6e 69 74      ?get-me init
4910: 2d 63 6c 69 65 6e 74 0a 20 20 20 20 3f 40 6e 65  -client.    ?@ne
4920: 78 74 61 72 67 20 49 46 0a 09 64 76 63 73 2d 62  xtarg IF..dvcs-b
4930: 75 66 73 23 20 6e 69 63 6b 2d 63 6f 6e 6e 65 63  ufs# nick-connec
4940: 74 20 5b 3a 20 2e 22 20 63 6f 6e 6e 65 63 74 65  t [: ." connecte
4950: 64 22 20 63 72 20 3b 5d 20 64 6f 2d 64 65 62 75  d" cr ;] do-debu
4960: 67 20 21 74 69 6d 65 0a 09 2b 72 65 73 65 6e 64  g !time..+resend
4970: 20 2b 66 6c 6f 77 2d 63 6f 6e 74 72 6f 6c 0a 09   +flow-control..
4980: 6e 65 74 32 6f 2d 63 6f 64 65 20 65 78 70 65 63  net2o-code expec
4990: 74 2b 73 6c 75 72 70 0a 09 24 31 30 20 62 6c 6f  t+slurp..$10 blo
49a0: 63 6b 73 69 7a 65 21 20 24 41 20 62 6c 6f 63 6b  cksize! $A block
49b0: 61 6c 69 67 6e 21 0a 09 42 45 47 49 4e 0a 09 20  align!..BEGIN.. 
49c0: 20 20 20 24 31 30 20 5b 3a 20 62 61 73 65 38 35     $10 [: base85
49d0: 3e 24 20 6e 65 74 32 6f 3a 63 6f 70 79 23 20 3b  >$ net2o:copy# ;
49e0: 5d 20 61 72 67 2d 6c 6f 6f 70 23 0a 09 20 20 20  ] arg-loop#..   
49f0: 20 65 6e 64 2d 63 6f 64 65 7c 20 6e 65 74 32 6f   end-code| net2o
4a00: 3a 63 6c 6f 73 65 2d 61 6c 6c 20 2d 6d 61 70 2d  :close-all -map-
4a10: 72 65 73 65 6e 64 0a 09 20 20 20 20 3f 70 65 65  resend..    ?pee
4a20: 6b 61 72 67 20 20 57 48 49 4c 45 20 20 32 64 72  karg  WHILE  2dr
4a30: 6f 70 0a 09 09 2b 72 65 73 65 6e 64 20 2b 66 6c  op...+resend +fl
4a40: 6f 77 2d 63 6f 6e 74 72 6f 6c 0a 09 09 6e 65 74  ow-control...net
4a50: 32 6f 2d 63 6f 64 65 20 65 78 70 65 63 74 2b 73  2o-code expect+s
4a60: 6c 75 72 70 20 20 63 6c 6f 73 65 2d 61 6c 6c 20  lurp  close-all 
4a70: 20 61 63 6b 20 72 65 77 69 6e 64 20 65 6e 64 2d   ack rewind end-
4a80: 77 69 74 68 0a 09 09 5b 20 70 72 65 76 69 6f 75  with...[ previou
4a90: 73 20 5d 0a 09 52 45 50 45 41 54 20 20 64 69 73  s ]..REPEAT  dis
4aa0: 63 6f 6e 6e 65 63 74 2d 6d 65 0a 20 20 20 20 54  connect-me.    T
4ab0: 48 45 4e 20 3b 0a 0a 5c 20 64 76 63 73 20 63 6f  HEN ;..\ dvcs co
4ac0: 6d 6d 61 6e 64 73 0a 0a 3a 20 69 6e 69 74 20 28  mmands..: init (
4ad0: 20 2d 2d 20 29 0a 20 20 20 20 5c 55 20 69 6e 69   -- ).    \U ini
4ae0: 74 20 5b 62 72 61 6e 63 68 6e 61 6d 65 23 5d 5b  t [branchname#][
4af0: 6e 61 6d 65 5d 5b 40 6f 77 6e 65 72 5d 0a 20 20  name][@owner].  
4b00: 20 20 5c 47 20 69 6e 69 74 3a 20 53 65 74 75 70    \G init: Setup
4b10: 20 61 20 64 76 63 73 20 70 72 6f 6a 65 63 74 20   a dvcs project 
4b20: 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 66  in the current f
4b30: 6f 6c 64 65 72 0a 20 20 20 20 5c 47 20 69 6e 69  older.    \G ini
4b40: 74 3a 20 54 68 65 20 64 65 66 61 75 6c 74 20 62  t: The default b
4b50: 72 61 6e 63 68 20 6e 61 6d 65 20 69 73 20 22 6d  ranch name is "m
4b60: 61 73 74 65 72 22 0a 20 20 20 20 5c 47 20 69 6e  aster".    \G in
4b70: 69 74 3a 20 54 68 65 20 64 65 66 61 75 6c 74 20  it: The default 
4b80: 70 72 6f 6a 65 63 74 20 6e 61 6d 65 20 69 73 20  project name is 
4b90: 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 69 74  the directory it
4ba0: 20 72 65 73 69 64 65 73 20 69 6e 0a 20 20 20 20   resides in.    
4bb0: 3f 67 65 74 2d 6d 65 0a 20 20 20 20 3f 6e 65 78  ?get-me.    ?nex
4bc0: 74 61 72 67 20 30 3d 20 49 46 20 20 70 61 64 20  targ 0= IF  pad 
4bd0: 70 61 74 68 2d 6d 61 78 23 20 67 65 74 2d 64 69  path-max# get-di
4be0: 72 20 62 61 73 65 6e 61 6d 65 20 20 54 48 45 4e  r basename  THEN
4bf0: 0a 20 20 20 20 64 76 63 73 2d 69 6e 69 74 20 3b  .    dvcs-init ;
4c00: 0a 0a 3a 20 61 64 64 20 28 20 2d 2d 20 29 0a 20  ..: add ( -- ). 
4c10: 20 20 20 5c 55 20 61 64 64 20 66 69 6c 65 31 20     \U add file1 
4c20: 2e 2e 20 66 69 6c 65 6e 0a 20 20 20 20 5c 47 20  .. filen.    \G 
4c30: 61 64 64 3a 20 61 64 64 20 66 69 6c 65 73 20 74  add: add files t
4c40: 6f 20 74 68 65 20 64 76 63 73 20 70 72 6f 6a 65  o the dvcs proje
4c50: 63 74 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e  ct in the curren
4c60: 74 20 66 6f 6c 64 65 72 0a 20 20 20 20 64 76 63  t folder.    dvc
4c70: 73 3a 6e 65 77 2d 64 76 63 73 20 3e 6f 20 66 69  s:new-dvcs >o fi
4c80: 6c 65 73 3e 64 76 63 73 0a 20 20 20 20 5b 27 5d  les>dvcs.    [']
4c90: 20 64 76 63 73 2d 61 64 64 20 61 72 67 2d 6c 6f   dvcs-add arg-lo
4ca0: 6f 70 20 20 64 76 63 73 3a 64 69 73 70 6f 73 65  op  dvcs:dispose
4cb0: 2d 64 76 63 73 20 6f 3e 20 3b 0a 0a 3a 20 72 65  -dvcs o> ;..: re
4cc0: 66 20 28 20 2d 2d 20 29 0a 20 20 20 20 5c 55 20  f ( -- ).    \U 
4cd0: 72 65 66 20 66 69 6c 65 31 20 2e 2e 20 66 69 6c  ref file1 .. fil
4ce0: 65 6e 0a 20 20 20 20 5c 47 20 72 65 66 3a 20 61  en.    \G ref: a
4cf0: 64 64 20 66 69 6c 65 73 20 74 6f 20 74 68 65 20  dd files to the 
4d00: 64 76 63 73 20 70 72 6f 6a 65 63 74 20 69 6e 20  dvcs project in 
4d10: 74 68 65 20 63 75 72 72 65 6e 74 20 66 6f 6c 64  the current fold
4d20: 65 72 0a 20 20 20 20 5c 47 20 72 65 66 3a 20 61  er.    \G ref: a
4d30: 73 20 72 65 66 65 72 65 6e 63 65 73 0a 20 20 20  s references.   
4d40: 20 64 76 63 73 3a 6e 65 77 2d 64 76 63 73 20 3e   dvcs:new-dvcs >
4d50: 6f 20 66 69 6c 65 73 3e 64 76 63 73 0a 20 20 20  o files>dvcs.   
4d60: 20 5b 27 5d 20 64 76 63 73 2d 72 65 66 20 61 72   ['] dvcs-ref ar
4d70: 67 2d 6c 6f 6f 70 20 20 64 76 63 73 3a 64 69 73  g-loop  dvcs:dis
4d80: 70 6f 73 65 2d 64 76 63 73 20 6f 3e 20 3b 0a 0a  pose-dvcs o> ;..
4d90: 3a 20 63 69 20 28 20 2d 2d 20 29 0a 20 20 20 20  : ci ( -- ).    
4da0: 5c 55 20 63 69 20 22 6d 65 73 73 61 67 65 22 0a  \U ci "message".
4db0: 20 20 20 20 5c 47 20 63 69 3a 20 63 68 65 63 6b      \G ci: check
4dc0: 20 61 64 64 65 64 20 61 6e 64 20 6d 6f 64 69 66   added and modif
4dd0: 69 65 64 20 66 69 6c 65 73 20 69 6e 74 6f 20 74  ied files into t
4de0: 68 65 20 64 76 63 73 20 70 72 6f 6a 65 63 74 0a  he dvcs project.
4df0: 20 20 20 20 3f 67 65 74 2d 6d 65 20 63 69 2d 61      ?get-me ci-a
4e00: 72 67 73 20 64 76 63 73 2d 63 69 20 3b 0a 0a 3a  rgs dvcs-ci ;..:
4e10: 20 63 6f 20 28 20 2d 2d 20 29 0a 20 20 20 20 5c   co ( -- ).    \
4e20: 55 20 63 6f 20 72 65 76 69 73 69 6f 6e 7c 40 62  U co revision|@b
4e30: 72 61 6e 63 68 7c 72 65 76 69 73 69 6f 6e 40 62  ranch|revision@b
4e40: 72 61 6e 63 68 0a 20 20 20 20 5c 47 20 63 6f 3a  ranch.    \G co:
4e50: 20 63 68 65 63 6b 20 6f 75 74 20 61 20 73 70 65   check out a spe
4e60: 63 69 66 69 63 20 72 65 76 69 73 69 6f 6e 0a 20  cific revision. 
4e70: 20 20 20 3f 67 65 74 2d 6d 65 20 3f 6e 65 78 74     ?get-me ?next
4e80: 61 72 67 20 49 46 20 20 64 76 63 73 2d 63 6f 20  arg IF  dvcs-co 
4e90: 20 54 48 45 4e 0a 3b 0a 0a 3a 20 66 65 74 63 68   THEN.;..: fetch
4ea0: 20 28 20 2d 2d 20 29 0a 20 20 20 20 5c 55 20 66   ( -- ).    \U f
4eb0: 65 74 63 68 20 70 72 6f 6a 65 63 74 31 40 75 73  etch project1@us
4ec0: 65 72 31 0a 20 20 20 20 5c 47 20 66 65 74 63 68  er1.    \G fetch
4ed0: 3a 20 67 65 74 20 74 68 65 20 75 70 64 61 74 65  : get the update
4ee0: 73 20 66 72 6f 6d 20 6f 74 68 65 72 20 75 73 65  s from other use
4ef0: 72 73 20 28 6c 61 74 65 72 20 70 6f 73 73 69 62  rs (later possib
4f00: 6c 65 20 6d 75 6c 74 69 70 6c 65 29 0a 20 20 20  le multiple).   
4f10: 20 5c 47 20 66 65 74 63 68 3a 20 53 69 6d 69 6c   \G fetch: Simil
4f20: 61 72 20 73 79 6e 74 61 78 20 61 73 20 66 6f 72  ar syntax as for
4f30: 20 63 68 61 74 73 0a 20 20 20 20 3f 67 65 74 2d   chats.    ?get-
4f40: 6d 65 20 69 6e 69 74 2d 63 6c 69 65 6e 74 20 6e  me init-client n
4f50: 69 63 6b 73 3e 63 68 61 74 20 68 61 6e 64 6c 65  icks>chat handle
4f60: 2d 66 65 74 63 68 20 3b 0a 0a 3a 20 75 70 20 28  -fetch ;..: up (
4f70: 20 2d 2d 20 29 0a 20 20 20 20 5c 55 20 75 70 0a   -- ).    \U up.
4f80: 20 20 20 20 5c 47 20 75 70 3a 20 63 68 65 63 6b      \G up: check
4f90: 20 6f 75 74 20 6c 61 73 74 20 72 65 76 69 73 69   out last revisi
4fa0: 6f 6e 20 6f 66 20 63 75 72 72 65 6e 74 20 62 72  on of current br
4fb0: 61 6e 63 68 0a 20 20 20 20 3f 67 65 74 2d 6d 65  anch.    ?get-me
4fc0: 20 64 76 63 73 2d 75 70 20 3b 0a 0a 3a 20 70 75   dvcs-up ;..: pu
4fd0: 6c 6c 20 28 20 2d 2d 20 29 0a 20 20 20 20 5c 55  ll ( -- ).    \U
4fe0: 20 70 75 6c 6c 20 70 72 6f 6a 65 63 74 31 40 75   pull project1@u
4ff0: 73 65 72 31 0a 20 20 20 20 5c 47 20 70 75 6c 6c  ser1.    \G pull
5000: 3a 20 67 65 74 20 74 68 65 20 75 70 64 61 74 65  : get the update
5010: 73 20 66 72 6f 6d 20 6f 74 68 65 72 20 75 73 65  s from other use
5020: 72 73 20 28 70 6f 73 73 69 62 6c 65 20 6d 75 6c  rs (possible mul
5030: 74 69 70 6c 65 29 0a 20 20 20 20 5c 47 20 70 75  tiple).    \G pu
5040: 6c 6c 3a 20 61 6e 64 20 63 68 65 63 6b 6f 75 74  ll: and checkout
5050: 20 74 68 65 20 6c 61 73 74 20 72 65 76 69 73 69   the last revisi
5060: 6f 6e 20 28 66 65 74 63 68 2b 75 70 29 2e 0a 20  on (fetch+up).. 
5070: 20 20 20 5c 47 20 70 75 6c 6c 3a 20 53 69 6d 69     \G pull: Simi
5080: 6c 61 72 20 73 79 6e 74 61 78 20 61 73 20 66 6f  lar syntax as fo
5090: 72 20 63 68 61 74 73 0a 20 20 20 20 3f 67 65 74  r chats.    ?get
50a0: 2d 6d 65 20 69 6e 69 74 2d 63 6c 69 65 6e 74 20  -me init-client 
50b0: 6e 69 63 6b 73 3e 63 68 61 74 20 68 61 6e 64 6c  nicks>chat handl
50c0: 65 2d 66 65 74 63 68 20 64 76 63 73 2d 75 70 20  e-fetch dvcs-up 
50d0: 3b 0a 0a 3a 20 63 6c 6f 6e 65 20 28 20 2d 2d 20  ;..: clone ( -- 
50e0: 29 0a 20 20 20 20 5c 55 20 63 6c 6f 6e 65 20 70  ).    \U clone p
50f0: 72 6f 6a 65 63 74 31 40 75 73 65 72 31 0a 20 20  roject1@user1.  
5100: 20 20 5c 47 20 63 72 65 61 74 65 20 64 69 63 74    \G create dict
5110: 69 6f 6e 61 72 79 2c 20 69 6e 69 74 20 72 65 70  ionary, init rep
5120: 6f 73 69 74 6f 72 79 20 61 6e 64 20 70 75 6c 6c  ository and pull
5130: 20 70 72 6f 6a 65 63 74 0a 20 20 20 20 3f 67 65   project.    ?ge
5140: 74 2d 6d 65 20 69 6e 69 74 2d 63 6c 69 65 6e 74  t-me init-client
5150: 20 6e 69 63 6b 73 3e 63 68 61 74 20 68 61 6e 64   nicks>chat hand
5160: 6c 65 2d 63 6c 6f 6e 65 20 3b 0a 0a 3a 20 72 65  le-clone ;..: re
5170: 76 65 72 74 20 28 20 2d 2d 20 29 0a 20 20 20 20  vert ( -- ).    
5180: 5c 55 20 72 65 76 65 72 74 0a 20 20 20 20 5c 47  \U revert.    \G
5190: 20 72 65 76 65 72 74 3a 20 72 65 76 65 72 74 20   revert: revert 
51a0: 63 68 61 6e 67 65 73 0a 20 20 20 20 3f 67 65 74  changes.    ?get
51b0: 2d 6d 65 20 64 76 63 73 2d 72 65 76 65 72 74 20  -me dvcs-revert 
51c0: 3b 0a 0a 3a 20 66 6f 72 6b 20 28 20 2d 2d 20 29  ;..: fork ( -- )
51d0: 0a 20 20 20 20 5c 55 20 66 6f 72 6b 20 62 72 61  .    \U fork bra
51e0: 6e 63 68 0a 20 20 20 20 5c 47 20 66 6f 72 6b 3a  nch.    \G fork:
51f0: 20 63 72 65 61 74 65 20 61 20 62 72 61 6e 63 68   create a branch
5200: 2c 20 6e 6f 74 20 79 65 74 20 69 6d 70 6c 65 6d  , not yet implem
5210: 65 6e 74 65 64 0a 20 20 20 20 21 21 46 49 58 4d  ented.    !!FIXM
5220: 45 21 21 0a 3b 0a 0a 3a 20 73 6e 61 70 20 28 20  E!!.;..: snap ( 
5230: 2d 2d 20 29 0a 20 20 20 20 5c 55 20 73 6e 61 70  -- ).    \U snap
5240: 0a 20 20 20 20 5c 47 20 73 6e 61 70 3a 20 63 72  .    \G snap: cr
5250: 65 61 74 65 20 61 20 73 6e 61 70 73 68 6f 74 20  eate a snapshot 
5260: 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  of the current r
5270: 65 76 69 73 69 6f 6e 0a 20 20 20 20 63 69 2d 61  evision.    ci-a
5280: 72 67 73 20 64 76 63 73 2d 73 6e 61 70 20 3b 0a  rgs dvcs-snap ;.
5290: 0a 3a 20 64 69 66 66 20 28 20 2d 2d 20 29 0a 20  .: diff ( -- ). 
52a0: 20 20 20 5c 55 20 64 69 66 66 0a 20 20 20 20 5c     \U diff.    \
52b0: 47 20 64 69 66 66 3a 20 64 69 66 66 20 62 65 74  G diff: diff bet
52c0: 77 65 65 6e 20 6c 61 73 74 20 63 68 65 63 6b 69  ween last checki
52d0: 6e 20 73 74 61 74 65 20 61 6e 64 20 63 75 72 72  n state and curr
52e0: 65 6e 74 20 73 74 61 74 65 0a 20 20 20 20 3f 67  ent state.    ?g
52f0: 65 74 2d 6d 65 20 3f 63 72 20 64 76 63 73 2d 64  et-me ?cr dvcs-d
5300: 69 66 66 20 3b 0a 0a 3a 20 6c 6f 67 20 28 20 2d  iff ;..: log ( -
5310: 2d 20 29 0a 20 20 20 20 5c 55 20 6c 6f 67 0a 20  - ).    \U log. 
5320: 20 20 20 5c 47 20 6c 6f 67 3a 20 70 72 69 6e 74     \G log: print
5330: 20 6f 75 74 20 6c 6f 67 20 6f 66 20 63 75 72 72   out log of curr
5340: 65 6e 74 20 62 72 61 6e 63 68 0a 20 20 20 20 3f  ent branch.    ?
5350: 67 65 74 2d 6d 65 20 3f 63 72 20 2e 64 76 63 73  get-me ?cr .dvcs
5360: 2d 6c 6f 67 20 3b 0a 0a 5c 20 6d 61 6e 61 67 65  -log ;..\ manage
5370: 20 79 6f 75 72 20 68 61 73 68 20 6f 62 6a 65 63   your hash objec
5380: 74 73 20 64 69 72 65 63 74 6c 79 20 28 6e 6f 20  ts directly (no 
5390: 6c 69 73 74 20 61 76 61 69 6c 61 62 6c 65 29 0a  list available).
53a0: 0a 3a 20 61 64 64 23 20 28 20 2d 2d 20 29 0a 20  .: add# ( -- ). 
53b0: 20 20 20 5c 55 20 61 64 64 23 20 66 69 6c 65 31     \U add# file1
53c0: 20 2e 2e 20 66 69 6c 65 6e 0a 20 20 20 20 5c 47   .. filen.    \G
53d0: 20 61 64 64 23 3a 20 61 64 64 20 66 69 6c 65 73   add#: add files
53e0: 20 74 6f 20 68 61 73 68 20 73 74 6f 72 61 67 65   to hash storage
53f0: 0a 20 20 20 20 3f 67 65 74 2d 6d 65 20 5b 27 5d  .    ?get-me [']
5400: 20 68 61 73 68 2d 61 64 64 20 61 72 67 2d 6c 6f   hash-add arg-lo
5410: 6f 70 20 3b 0a 0a 3a 20 6f 75 74 23 20 28 20 2d  op ;..: out# ( -
5420: 2d 20 29 0a 20 20 20 20 5c 55 20 6f 75 74 23 20  - ).    \U out# 
5430: 68 61 73 68 31 20 2e 2e 20 68 61 73 68 6e 0a 20  hash1 .. hashn. 
5440: 20 20 20 5c 47 20 6f 75 74 23 3a 20 67 65 74 20     \G out#: get 
5450: 66 69 6c 65 73 20 6f 75 74 20 6f 66 20 68 61 73  files out of has
5460: 68 20 73 74 6f 72 61 67 65 20 69 6e 20 63 6c 65  h storage in cle
5470: 61 72 0a 20 20 20 20 3f 67 65 74 2d 6d 65 20 5b  ar.    ?get-me [
5480: 27 5d 20 68 61 73 68 2d 6f 75 74 20 61 72 67 2d  '] hash-out arg-
5490: 6c 6f 6f 70 20 3b 0a 0a 5c 20 6f 74 68 65 72 73  loop ;..\ others
54a0: 0a 0a 3a 20 62 79 65 20 28 20 2d 2d 20 29 0a 20  ..: bye ( -- ). 
54b0: 20 20 20 5c 55 20 62 79 65 0a 20 20 20 20 5c 47     \U bye.    \G
54c0: 20 62 79 65 3a 20 71 75 69 74 20 63 6f 6d 6d 61   bye: quit comma
54d0: 6e 64 20 6d 6f 64 65 20 61 6e 64 20 74 65 72 6d  nd mode and term
54e0: 69 6e 61 74 65 20 70 72 6f 67 72 61 6d 0a 20 20  inate program.  
54f0: 20 20 73 75 62 6d 65 20 64 68 74 2d 64 69 73 63    subme dht-disc
5500: 6f 6e 6e 65 63 74 20 62 79 65 20 3b 0a 0a 3a 20  onnect bye ;..: 
5510: 2d 62 77 20 28 20 2d 2d 20 29 0a 20 20 20 20 5c  -bw ( -- ).    \
5520: 4f 20 2d 62 77 0a 20 20 20 20 5c 47 20 2d 62 77  O -bw.    \G -bw
5530: 3a 20 64 69 73 61 62 6c 65 20 63 6f 6c 6f 72 20  : disable color 
5540: 63 6f 64 65 73 0a 20 20 20 20 5b 27 5d 20 64 72  codes.    ['] dr
5550: 6f 70 20 69 73 20 61 74 74 72 21 20 20 6e 65 78  op is attr!  nex
5560: 74 2d 63 6d 64 20 3b 0a 0a 3a 20 2d 79 65 73 20  t-cmd ;..: -yes 
5570: 28 20 2d 2d 20 29 0a 20 20 20 20 5c 4f 20 2d 79  ( -- ).    \O -y
5580: 65 73 0a 20 20 20 20 5c 47 20 2d 79 65 73 3a 20  es.    \G -yes: 
5590: 73 61 79 20 79 65 73 20 74 6f 20 65 76 65 72 79  say yes to every
55a0: 20 71 75 65 73 74 69 6f 6e 0a 20 20 20 20 74 72   question.    tr
55b0: 75 65 20 74 6f 20 3f 79 65 73 20 20 6e 65 78 74  ue to ?yes  next
55c0: 2d 63 6d 64 20 3b 0a 0a 3a 20 2d 62 61 63 6b 74  -cmd ;..: -backt
55d0: 72 61 63 65 20 28 20 2d 2d 20 29 0a 20 20 20 20  race ( -- ).    
55e0: 5c 4f 20 2d 62 61 63 6b 74 72 61 63 65 0a 20 20  \O -backtrace.  
55f0: 20 20 5c 47 20 2d 62 61 63 6b 74 72 61 63 65 3a    \G -backtrace:
5600: 20 50 72 6f 76 69 64 65 20 66 75 6c 6c 20 65 72   Provide full er
5610: 72 6f 72 20 72 65 70 6f 72 74 69 6e 67 20 3b 0a  ror reporting ;.
5620: 20 20 20 20 5b 20 77 68 61 74 27 73 20 44 6f 45      [ what's DoE
5630: 72 72 6f 72 20 5d 6c 20 69 73 20 44 6f 45 72 72  rror ]l is DoErr
5640: 6f 72 20 6e 65 78 74 2d 63 6d 64 20 3b 0a 0a 27  or next-cmd ;..'
5650: 20 2f 63 68 61 74 3a 2f 76 65 72 73 69 6f 6e 20   /chat:/version 
5660: 61 6c 69 61 73 20 76 65 72 73 69 6f 6e 0a 20 20  alias version.  
5670: 20 20 5c 55 20 76 65 72 73 69 6f 6e 0a 20 20 20    \U version.   
5680: 20 5c 47 20 76 65 72 73 69 6f 6e 3a 20 70 72 69   \G version: pri
5690: 6e 74 20 76 65 72 73 69 6f 6e 20 73 74 72 69 6e  nt version strin
56a0: 67 0a 0a 3a 20 72 6e 67 20 28 20 2d 2d 20 29 0a  g..: rng ( -- ).
56b0: 20 20 20 20 5c 55 20 72 6e 67 0a 20 20 20 20 5c      \U rng.    \
56c0: 47 20 72 6e 67 3a 20 63 68 65 63 6b 20 72 6e 67  G rng: check rng
56d0: 20 61 6e 64 20 67 69 76 65 20 61 20 33 32 20 62   and give a 32 b
56e0: 79 74 65 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65  yte random value
56f0: 0a 20 20 20 20 3f 63 68 65 63 6b 2d 72 6e 67 20  .    ?check-rng 
5700: 24 32 30 20 72 6e 67 24 20 38 35 74 79 70 65 20  $20 rng$ 85type 
5710: 63 72 0a 20 20 20 20 63 68 65 63 6b 2d 6f 6c 64  cr.    check-old
5720: 24 20 24 40 20 5b 27 5d 20 2e 72 6e 67 73 74 61  $ $@ ['] .rngsta
5730: 74 20 73 74 64 65 72 72 20 6f 75 74 66 69 6c 65  t stderr outfile
5740: 2d 65 78 65 63 75 74 65 20 20 63 68 65 63 6b 2d  -execute  check-
5750: 6f 6c 64 24 20 24 66 72 65 65 20 3b 0a 0a 3a 20  old$ $free ;..: 
5760: 69 6d 70 6f 72 74 20 28 20 2d 2d 20 29 0a 20 20  import ( -- ).  
5770: 20 20 5c 55 20 69 6d 70 6f 72 74 20 67 2b 7c 2e    \U import g+|.
5780: 2e 2e 20 5b 64 69 72 65 63 74 6f 72 79 5d 0a 20  .. [directory]. 
5790: 20 20 20 3f 6e 65 78 74 61 72 67 20 49 46 0a 09     ?nextarg IF..
57a0: 5b 27 5d 20 69 6d 70 6f 72 74 65 72 20 3e 62 6f  ['] importer >bo
57b0: 64 79 20 66 69 6e 64 2d 6e 61 6d 65 2d 69 6e 20  dy find-name-in 
57c0: 3f 64 75 70 2d 49 46 0a 09 20 20 20 20 6e 61 6d  ?dup-IF..    nam
57d0: 65 3e 69 6e 74 20 65 78 65 63 75 74 65 20 20 45  e>int execute  E
57e0: 58 49 54 20 20 54 48 45 4e 20 20 54 48 45 4e 0a  XIT  THEN  THEN.
57f0: 20 20 20 20 2e 22 20 75 6e 6b 6e 6f 77 6e 20 69      ." unknown i
5800: 6d 70 6f 72 74 22 20 3b 0a 0a 3a 20 67 75 69 20  mport" ;..: gui 
5810: 28 20 2d 2d 20 29 0a 20 20 20 20 5c 55 20 67 75  ( -- ).    \U gu
5820: 69 0a 20 20 20 20 5c 47 20 67 75 69 3a 20 73 74  i.    \G gui: st
5830: 61 72 74 20 6e 65 74 32 6f 27 73 20 67 72 61 70  art net2o's grap
5840: 68 69 63 61 6c 20 75 73 65 72 20 69 6e 74 65 72  hical user inter
5850: 66 61 63 65 0a 20 20 20 20 3f 2e 6e 65 74 32 6f  face.    ?.net2o
5860: 2d 63 6f 6e 66 69 67 0a 20 20 20 20 72 65 73 65  -config.    rese
5870: 74 2d 6e 65 74 32 6f 2d 63 6d 64 73 0a 20 20 20  t-net2o-cmds.   
5880: 20 67 75 69 2e 66 73 24 20 24 40 20 64 75 70 20   gui.fs$ $@ dup 
5890: 49 46 20 20 72 65 71 75 69 72 65 64 20 20 45 4c  IF  required  EL
58a0: 53 45 20 20 6e 6f 2d 66 69 6c 65 23 20 74 68 72  SE  no-file# thr
58b0: 6f 77 20 20 54 48 45 4e 20 20 72 75 6e 2d 67 75  ow  THEN  run-gu
58c0: 69 20 3b 0a 7d 73 63 6f 70 65 0a 0a 5c 20 75 73  i ;.}scope..\ us
58d0: 65 20 61 20 64 69 66 66 65 72 65 6e 74 20 68 69  e a different hi
58e0: 73 74 6f 72 79 20 66 69 6c 65 20 66 6f 72 20 6e  story file for n
58f0: 65 74 32 6f 0a 0a 3a 20 6e 32 6f 2d 68 69 73 74  et2o..: n2o-hist
5900: 6f 72 79 20 28 20 2d 2d 20 29 0a 20 20 20 20 68  ory ( -- ).    h
5910: 69 73 74 6f 72 79 20 3f 64 75 70 2d 49 46 20 20  istory ?dup-IF  
5920: 63 6c 6f 73 65 2d 66 69 6c 65 20 74 68 72 6f 77  close-file throw
5930: 20 20 54 48 45 4e 0a 20 20 20 20 22 68 69 73 74    THEN.    "hist
5940: 6f 72 79 22 20 2e 6e 65 74 32 6f 2f 20 67 65 74  ory" .net2o/ get
5950: 2d 68 69 73 74 6f 72 79 20 3b 0a 0a 6e 32 6f 2d  -history ;..n2o-
5960: 68 69 73 74 6f 72 79 0a 0a 5c 20 75 73 65 72 20  history..\ user 
5970: 66 72 69 65 6e 64 6c 79 2c 20 62 75 74 20 77 61  friendly, but wa
5980: 79 20 6c 65 73 73 20 69 6e 66 6f 72 6d 61 74 69  y less informati
5990: 76 65 20 64 6f 65 72 72 6f 72 0a 0a 3a 20 3f 73  ve doerror..: ?s
59a0: 65 74 2d 64 65 62 75 67 20 28 20 2d 2d 20 29 0a  et-debug ( -- ).
59b0: 20 20 20 20 64 65 62 75 67 67 69 6e 67 2d 6d 65      debugging-me
59c0: 74 68 6f 64 20 30 3d 20 49 46 0a 09 5b 3a 20 5b  thod 0= IF..[: [
59d0: 3a 20 3c 65 72 72 3e 20 2e 65 72 72 6f 72 2d 73  : <err> .error-s
59e0: 74 72 69 6e 67 20 3c 64 65 66 61 75 6c 74 3e 20  tring <default> 
59f0: 63 72 20 3b 5d 20 64 6f 2d 64 65 62 75 67 20 3b  cr ;] do-debug ;
5a00: 5d 20 69 73 20 44 6f 45 72 72 6f 72 0a 20 20 20  ] is DoError.   
5a10: 20 45 4c 53 45 0a 09 5b 20 77 68 61 74 27 73 20   ELSE..[ what's 
5a20: 44 6f 45 72 72 6f 72 20 5d 4c 20 69 73 20 44 6f  DoError ]L is Do
5a30: 45 72 72 6f 72 0a 20 20 20 20 54 48 45 4e 20 3b  Error.    THEN ;
5a40: 0a 3f 73 65 74 2d 64 65 62 75 67 0a 0a 3a 6e 6f  .?set-debug..:no
5a50: 6e 61 6d 65 20 64 65 66 65 72 73 20 27 63 6f 6c  name defers 'col
5a60: 64 20 3f 73 65 74 2d 64 65 62 75 67 20 6e 32 6f  d ?set-debug n2o
5a70: 2d 68 69 73 74 6f 72 79 20 3b 20 69 73 20 27 63  -history ; is 'c
5a80: 6f 6c 64 0a 0a 5c 20 61 6c 6c 6f 77 20 69 73 73  old..\ allow iss
5a90: 75 69 6e 67 20 63 6f 6d 6d 61 6e 64 73 20 64 75  uing commands du
5aa0: 72 69 6e 67 20 63 68 61 74 0a 0a 73 63 6f 70 65  ring chat..scope
5ab0: 7b 20 2f 63 68 61 74 0a 0a 3a 20 2f 6e 32 6f 20  { /chat..: /n2o 
5ac0: 5b 3a 20 77 6f 72 64 2d 61 72 67 73 20 5b 27 5d  [: word-args [']
5ad0: 20 65 76 61 6c 75 61 74 65 20 64 6f 2d 6e 65 74   evaluate do-net
5ae0: 32 6f 2d 63 6d 64 73 20 3b 5d 20 63 61 74 63 68  2o-cmds ;] catch
5af0: 0a 20 20 20 20 3f 64 75 70 2d 49 46 20 20 3c 65  .    ?dup-IF  <e
5b00: 72 72 3e 20 2e 22 20 65 72 72 6f 72 3a 20 22 20  rr> ." error: " 
5b10: 65 72 72 6f 72 24 20 74 79 70 65 20 63 72 20 3c  error$ type cr <
5b20: 64 65 66 61 75 6c 74 3e 20 20 54 48 45 4e 20 3b  default>  THEN ;
5b30: 0a 0a 7d 73 63 6f 70 65 0a 0a 3a 20 73 74 61 72  ..}scope..: star
5b40: 74 2d 6e 32 6f 20 28 20 2d 2d 20 29 0a 20 20 20  t-n2o ( -- ).   
5b50: 20 5b 49 46 44 45 46 5d 20 63 6f 76 2b 20 6c 6f   [IFDEF] cov+ lo
5b60: 61 64 2d 63 6f 76 20 5b 54 48 45 4e 5d 0a 20 20  ad-cov [THEN].  
5b70: 20 20 63 6d 64 2d 61 72 67 73 20 2b 2b 64 65 62    cmd-args ++deb
5b80: 75 67 20 25 64 72 6f 70 72 61 74 65 20 25 64 72  ug %droprate %dr
5b90: 6f 70 72 61 74 65 20 5c 20 72 65 61 64 20 69 6e  oprate \ read in
5ba0: 20 61 6c 6c 20 64 65 62 75 67 67 69 6e 67 20 73   all debugging s
5bb0: 74 75 66 66 0a 20 20 20 20 70 72 6f 66 69 6c 65  tuff.    profile
5bc0: 28 20 69 6e 69 74 2d 74 69 6d 65 72 20 29 0a 20  ( init-timer ). 
5bd0: 20 20 20 61 72 67 63 20 40 20 31 20 3e 20 49 46     argc @ 1 > IF
5be0: 20 6e 65 78 74 2d 63 6d 64 20 45 4c 53 45 20 6e   next-cmd ELSE n
5bf0: 32 6f 3a 68 65 6c 70 20 54 48 45 4e 0a 20 20 20  2o:help THEN.   
5c00: 20 5b 49 46 44 45 46 5d 20 63 6f 76 2b 20 73 61   [IFDEF] cov+ sa
5c10: 76 65 2d 63 6f 76 20 61 6e 6e 6f 74 61 74 65 2d  ve-cov annotate-
5c20: 63 6f 76 20 63 6f 76 25 20 5b 54 48 45 4e 5d 0a  cov cov% [THEN].
5c30: 20 20 20 20 70 72 6f 66 69 6c 65 28 20 2e 74 69      profile( .ti
5c40: 6d 65 73 20 29 0a 20 20 20 20 6e 32 6f 3a 62 79  mes ).    n2o:by
5c50: 65 20 3b 0a 0a 27 20 73 74 61 72 74 2d 6e 32 6f  e ;..' start-n2o
5c60: 20 69 73 20 70 72 6f 63 65 73 73 2d 61 72 67 73   is process-args
5c70: 0a 0a                                            ..