Hex Artifact Content
Not logged in

Artifact c330dd97be2caa84ff6aa9b2d70b2a915d638896:


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