Grammalecte  Hex Artifact Content

Artifact b32ed20eaa30f96a3855f47724c9ab99cfa326032e5d5e50c31a6d225bc876c1:


0000: 2f 2f 20 4a 61 76 61 53 63 72 69 70 74 0a 0a 2f  // JavaScript../
0010: 2f 20 46 53 41 20 44 49 43 54 49 4f 4e 41 52 59  / FSA DICTIONARY
0020: 20 42 55 49 4c 44 45 52 0a 2f 2f 0a 2f 2f 20 62   BUILDER.//.// b
0030: 79 20 4f 6c 69 76 69 65 72 20 52 2e 0a 2f 2f 20  y Olivier R..// 
0040: 4c 69 63 65 6e 73 65 3a 20 4d 50 4c 20 32 0a 2f  License: MPL 2./
0050: 2f 0a 2f 2f 20 54 68 69 73 20 74 6f 6f 6c 20 65  /.// This tool e
0060: 6e 63 6f 64 65 73 20 6c 65 78 69 63 6f 6e 20 69  ncodes lexicon i
0070: 6e 74 6f 20 61 6e 20 69 6e 64 65 78 61 62 6c 65  nto an indexable
0080: 20 62 69 6e 61 72 79 20 64 69 63 74 69 6f 6e 61   binary dictiona
0090: 72 79 20 0a 2f 2f 20 49 6e 70 75 74 20 66 69 6c  ry .// Input fil
00a0: 65 73 20 4d 55 53 54 20 62 65 20 65 6e 63 6f 64  es MUST be encod
00b0: 65 64 20 69 6e 20 55 54 46 2d 38 2e 0a 0a 22 75  ed in UTF-8..."u
00c0: 73 65 20 73 74 72 69 63 74 22 3b 0a 0a 0a 69 66  se strict";...if
00d0: 20 28 74 79 70 65 6f 66 28 72 65 71 75 69 72 65   (typeof(require
00e0: 29 20 21 3d 3d 20 27 75 6e 64 65 66 69 6e 65 64  ) !== 'undefined
00f0: 27 29 20 7b 0a 20 20 20 20 76 61 72 20 73 74 72  ') {.    var str
0100: 5f 74 72 61 6e 73 66 6f 72 6d 20 3d 20 72 65 71  _transform = req
0110: 75 69 72 65 28 22 72 65 73 6f 75 72 63 65 3a 2f  uire("resource:/
0120: 2f 67 72 61 6d 6d 61 6c 65 63 74 65 2f 67 72 61  /grammalecte/gra
0130: 70 68 73 70 65 6c 6c 2f 73 74 72 5f 74 72 61 6e  phspell/str_tran
0140: 73 66 6f 72 6d 2e 6a 73 22 29 3b 0a 7d 0a 0a 0a  sform.js");.}...
0150: 24 7b 6d 61 70 7d 0a 0a 0a 63 6c 61 73 73 20 44  ${map}...class D
0160: 41 57 47 20 7b 0a 20 20 20 20 2f 2a 20 20 44 49  AWG {.    /*  DI
0170: 52 45 43 54 20 41 43 59 43 4c 49 43 20 57 4f 52  RECT ACYCLIC WOR
0180: 44 20 47 52 41 50 48 0a 20 20 20 20 20 20 20 20  D GRAPH.        
0190: 54 68 69 73 20 63 6f 64 65 20 69 73 20 69 6e 73  This code is ins
01a0: 70 69 72 65 64 20 66 72 6f 6d 20 53 74 65 76 65  pired from Steve
01b0: 20 48 61 6e 6f 76 e2 80 99 73 20 44 41 57 47 2c   Hanov...s DAWG,
01c0: 20 32 30 31 31 2e 20 28 68 74 74 70 3a 2f 2f 73   2011. (http://s
01d0: 74 65 76 65 68 61 6e 6f 76 2e 63 61 2f 62 6c 6f  tevehanov.ca/blo
01e0: 67 2f 69 6e 64 65 78 2e 70 68 70 3f 69 64 3d 31  g/index.php?id=1
01f0: 31 35 29 0a 20 20 20 20 20 20 20 20 57 65 20 73  15).        We s
0200: 74 6f 72 65 20 73 75 66 66 69 78 2f 61 66 66 69  tore suffix/affi
0210: 78 20 63 6f 64 65 73 20 61 6e 64 20 74 61 67 73  x codes and tags
0220: 20 77 69 74 68 69 6e 20 74 68 65 20 67 72 61 70   within the grap
0230: 68 20 61 66 74 65 72 20 74 68 65 20 e2 80 9c 72  h after the ...r
0240: 65 61 6c e2 80 9d 20 77 6f 72 64 2e 0a 20 20 20  eal... word..   
0250: 20 20 20 20 20 41 20 77 6f 72 64 20 69 73 20 61       A word is a
0260: 20 6c 69 73 74 20 6f 66 20 6e 75 6d 62 65 72 73   list of numbers
0270: 20 5b 20 63 31 2c 20 63 32 2c 20 63 33 20 2e 20   [ c1, c2, c3 . 
0280: 2e 20 2e 20 63 4e 2c 20 69 41 66 66 69 78 2c 20  . . cN, iAffix, 
0290: 69 54 61 67 73 5d 0a 20 20 20 20 20 20 20 20 45  iTags].        E
02a0: 61 63 68 20 61 72 63 20 69 73 20 61 6e 20 69 6e  ach arc is an in
02b0: 64 65 78 20 69 6e 20 74 68 69 73 2e 6c 41 72 63  dex in this.lArc
02c0: 56 61 6c 2c 20 77 68 65 72 65 20 61 72 65 20 73  Val, where are s
02d0: 74 6f 72 65 64 20 63 68 61 72 61 63 74 65 72 73  tored characters
02e0: 2c 20 73 75 66 66 69 78 2f 61 66 66 69 78 20 63  , suffix/affix c
02f0: 6f 64 65 73 20 66 6f 72 20 73 74 65 6d 6d 69 6e  odes for stemmin
0300: 67 20 61 6e 64 20 74 61 67 73 2e 0a 20 20 20 20  g and tags..    
0310: 20 20 20 20 49 6d 70 6f 72 74 61 6e 74 3a 20 41      Important: A
0320: 73 20 75 73 75 61 6c 2c 20 74 68 65 20 6c 61 73  s usual, the las
0330: 74 20 6e 6f 64 65 20 28 61 66 74 65 72 20 e2 80  t node (after ..
0340: 98 69 54 61 67 73 e2 80 99 29 20 69 73 20 74 61  .iTags...) is ta
0350: 67 67 65 64 20 66 69 6e 61 6c 2c 20 41 4e 44 20  gged final, AND 
0360: 74 68 65 20 6e 6f 64 65 20 61 66 74 65 72 20 e2  the node after .
0370: 80 98 63 4e e2 80 99 20 69 73 20 41 4c 53 4f 20  ..cN... is ALSO 
0380: 74 61 67 67 65 64 20 66 69 6e 61 6c 2e 0a 20 20  tagged final..  
0390: 20 20 2a 2f 0a 0a 20 20 20 20 63 6f 6e 73 74 72    */..    constr
03a0: 75 63 74 6f 72 20 28 6c 45 6e 74 72 79 53 72 63  uctor (lEntrySrc
03b0: 2c 20 73 4c 61 6e 67 4e 61 6d 65 2c 20 63 53 74  , sLangName, cSt
03c0: 65 6d 6d 69 6e 67 2c 20 78 50 72 6f 67 72 65 73  emming, xProgres
03d0: 73 42 61 72 4e 6f 64 65 3d 6e 75 6c 6c 29 20 7b  sBarNode=null) {
03e0: 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 6f 6c 65  .        console
03f0: 2e 6c 6f 67 28 22 3d 3d 3d 3d 3d 20 44 69 72 65  .log("===== Dire
0400: 63 74 20 41 63 79 63 6c 69 63 20 57 6f 72 64 20  ct Acyclic Word 
0410: 47 72 61 70 68 20 2d 20 4d 69 6e 69 6d 61 6c 20  Graph - Minimal 
0420: 41 63 79 63 6c 69 63 20 46 69 6e 69 74 65 20 53  Acyclic Finite S
0430: 74 61 74 65 20 41 75 74 6f 6d 61 74 6f 6e 20 3d  tate Automaton =
0440: 3d 3d 3d 3d 22 29 3b 0a 20 20 20 20 20 20 20 20  ====");.        
0450: 6c 65 74 20 66 75 6e 63 53 74 65 6d 6d 69 6e 67  let funcStemming
0460: 47 65 6e 20 3d 20 6e 75 6c 6c 3b 0a 20 20 20 20  Gen = null;.    
0470: 20 20 20 20 73 77 69 74 63 68 20 28 63 53 74 65      switch (cSte
0480: 6d 6d 69 6e 67 2e 74 6f 55 70 70 65 72 43 61 73  mming.toUpperCas
0490: 65 28 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20  e()) {.         
04a0: 20 20 20 63 61 73 65 20 22 41 22 3a 0a 20 20 20     case "A":.   
04b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 66 75 6e               fun
04c0: 63 53 74 65 6d 6d 69 6e 67 47 65 6e 20 3d 20 73  cStemmingGen = s
04d0: 74 72 5f 74 72 61 6e 73 66 6f 72 6d 2e 64 65 66  tr_transform.def
04e0: 69 6e 65 41 66 66 69 78 43 6f 64 65 3b 20 62 72  ineAffixCode; br
04f0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  eak;.           
0500: 20 63 61 73 65 20 22 53 22 3a 0a 20 20 20 20 20   case "S":.     
0510: 20 20 20 20 20 20 20 20 20 20 20 66 75 6e 63 53             funcS
0520: 74 65 6d 6d 69 6e 67 47 65 6e 20 3d 20 73 74 72  temmingGen = str
0530: 5f 74 72 61 6e 73 66 6f 72 6d 2e 64 65 66 69 6e  _transform.defin
0540: 65 53 75 66 66 69 78 43 6f 64 65 3b 20 62 72 65  eSuffixCode; bre
0550: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
0560: 63 61 73 65 20 22 4e 22 3a 0a 20 20 20 20 20 20  case "N":.      
0570: 20 20 20 20 20 20 20 20 20 20 66 75 6e 63 53 74            funcSt
0580: 65 6d 6d 69 6e 67 47 65 6e 20 3d 20 73 74 72 5f  emmingGen = str_
0590: 74 72 61 6e 73 66 6f 72 6d 2e 6e 6f 53 74 65 6d  transform.noStem
05a0: 6d 69 6e 67 3b 20 62 72 65 61 6b 3b 0a 20 20 20  ming; break;.   
05b0: 20 20 20 20 20 20 20 20 20 64 65 66 61 75 6c 74           default
05c0: 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :.              
05d0: 20 20 74 68 72 6f 77 20 22 45 72 72 6f 72 2e 20    throw "Error. 
05e0: 55 6e 6b 6e 6f 77 6e 20 73 74 65 6d 6d 69 6e 67  Unknown stemming
05f0: 20 63 6f 64 65 3a 20 22 20 2b 20 63 53 74 65 6d   code: " + cStem
0600: 6d 69 6e 67 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ming;.        }.
0610: 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20          .       
0620: 20 6c 65 74 20 6c 45 6e 74 72 79 20 3d 20 5b 5d   let lEntry = []
0630: 3b 0a 20 20 20 20 20 20 20 20 6c 65 74 20 6c 43  ;.        let lC
0640: 68 61 72 20 3d 20 5b 27 27 5d 2c 20 20 64 43 68  har = [''],  dCh
0650: 61 72 20 3d 20 6e 65 77 20 4d 61 70 28 29 2c 20  ar = new Map(), 
0660: 20 6e 43 68 61 72 20 3d 20 31 2c 20 20 64 43 68   nChar = 1,  dCh
0670: 61 72 4f 63 63 75 72 20 3d 20 6e 65 77 20 4d 61  arOccur = new Ma
0680: 70 28 29 3b 0a 20 20 20 20 20 20 20 20 6c 65 74  p();.        let
0690: 20 6c 41 66 66 20 20 3d 20 5b 5d 2c 20 20 20 20   lAff  = [],    
06a0: 64 41 66 66 20 20 3d 20 6e 65 77 20 4d 61 70 28  dAff  = new Map(
06b0: 29 2c 20 20 6e 41 66 66 20 20 3d 20 30 2c 20 20  ),  nAff  = 0,  
06c0: 64 41 66 66 4f 63 63 75 72 20 3d 20 6e 65 77 20  dAffOccur = new 
06d0: 4d 61 70 28 29 3b 0a 20 20 20 20 20 20 20 20 6c  Map();.        l
06e0: 65 74 20 6c 54 61 67 20 20 3d 20 5b 5d 2c 20 20  et lTag  = [],  
06f0: 20 20 64 54 61 67 20 20 3d 20 6e 65 77 20 4d 61    dTag  = new Ma
0700: 70 28 29 2c 20 20 6e 54 61 67 20 20 3d 20 30 2c  p(),  nTag  = 0,
0710: 20 20 64 54 61 67 4f 63 63 75 72 20 3d 20 6e 65    dTagOccur = ne
0720: 77 20 4d 61 70 28 29 3b 0a 20 20 20 20 20 20 20  w Map();.       
0730: 20 6c 65 74 20 6e 45 72 72 20 3d 20 30 3b 0a 20   let nErr = 0;. 
0740: 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20         .        
0750: 2f 2f 20 72 65 61 64 20 6c 65 78 69 63 6f 6e 0a  // read lexicon.
0760: 20 20 20 20 20 20 20 20 66 6f 72 20 28 6c 65 74          for (let
0770: 20 5b 73 46 6c 65 78 2c 20 73 53 74 65 6d 2c 20   [sFlex, sStem, 
0780: 73 54 61 67 5d 20 6f 66 20 6c 45 6e 74 72 79 53  sTag] of lEntryS
0790: 72 63 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  rc) {.          
07a0: 20 20 61 64 64 57 6f 72 64 54 6f 43 68 61 72 44    addWordToCharD
07b0: 69 63 74 28 73 46 6c 65 78 29 3b 0a 20 20 20 20  ict(sFlex);.    
07c0: 20 20 20 20 20 20 20 20 2f 2f 20 63 68 61 72 73          // chars
07d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72  .            for
07e0: 20 28 6c 65 74 20 63 20 6f 66 20 73 46 6c 65 78   (let c of sFlex
07f0: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
0800: 20 20 20 20 69 66 20 28 21 64 43 68 61 72 2e 67      if (!dChar.g
0810: 65 74 28 63 29 29 20 7b 0a 20 20 20 20 20 20 20  et(c)) {.       
0820: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 43 68               dCh
0830: 61 72 2e 73 65 74 28 63 2c 20 6e 43 68 61 72 29  ar.set(c, nChar)
0840: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
0850: 20 20 20 20 20 20 6c 43 68 61 72 2e 70 75 73 68        lChar.push
0860: 28 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  (c);.           
0870: 20 20 20 20 20 20 20 20 20 6e 43 68 61 72 20 2b           nChar +
0880: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 1;.           
0890: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
08a0: 20 20 20 20 20 20 20 64 43 68 61 72 4f 63 63 75         dCharOccu
08b0: 72 2e 73 65 74 28 63 2c 20 64 43 68 61 72 4f 63  r.set(c, dCharOc
08c0: 63 75 72 2e 67 6c 5f 67 65 74 28 63 2c 20 30 29  cur.gl_get(c, 0)
08d0: 20 2b 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20   + 1);.         
08e0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
08f0: 20 2f 2f 20 61 66 66 69 78 65 73 20 74 6f 20 66   // affixes to f
0900: 69 6e 64 20 73 74 65 6d 20 66 72 6f 6d 20 66 6c  ind stem from fl
0910: 65 78 69 6f 6e 0a 20 20 20 20 20 20 20 20 20 20  exion.          
0920: 20 20 73 41 66 66 20 3d 20 66 75 6e 63 53 74 65    sAff = funcSte
0930: 6d 6d 69 6e 67 47 65 6e 28 73 46 6c 65 78 2c 20  mmingGen(sFlex, 
0940: 73 53 74 65 6d 29 3b 0a 20 20 20 20 20 20 20 20  sStem);.        
0950: 20 20 20 20 69 66 20 28 21 64 41 66 66 2e 67 65      if (!dAff.ge
0960: 74 28 73 41 66 66 29 29 20 7b 0a 20 20 20 20 20  t(sAff)) {.     
0970: 20 20 20 20 20 20 20 20 20 20 20 64 41 66 66 2e             dAff.
0980: 73 65 74 28 73 41 66 66 2c 20 6e 41 66 66 29 3b  set(sAff, nAff);
0990: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
09a0: 20 6c 41 66 66 2e 70 75 73 68 28 73 41 66 66 29   lAff.push(sAff)
09b0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
09c0: 20 20 6e 41 66 66 20 2b 3d 20 31 3b 0a 20 20 20    nAff += 1;.   
09d0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
09e0: 20 20 20 20 20 20 20 64 41 66 66 4f 63 63 75 72         dAffOccur
09f0: 2e 73 65 74 28 73 41 66 66 2c 20 64 43 68 61 72  .set(sAff, dChar
0a00: 4f 63 63 75 72 2e 67 6c 5f 67 65 74 28 73 41 66  Occur.gl_get(sAf
0a10: 66 2c 20 30 29 20 2b 20 31 29 3b 0a 20 20 20 20  f, 0) + 1);.    
0a20: 20 20 20 20 20 20 20 20 2f 2f 20 74 61 67 73 0a          // tags.
0a30: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28              if (
0a40: 21 64 54 61 67 2e 67 65 74 28 73 54 61 67 29 29  !dTag.get(sTag))
0a50: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
0a60: 20 20 20 64 54 61 67 2e 73 65 74 28 73 54 61 67     dTag.set(sTag
0a70: 2c 20 6e 54 61 67 29 3b 0a 20 20 20 20 20 20 20  , nTag);.       
0a80: 20 20 20 20 20 20 20 20 20 6c 54 61 67 2e 70 75           lTag.pu
0a90: 73 68 28 73 54 61 67 29 3b 0a 20 20 20 20 20 20  sh(sTag);.      
0aa0: 20 20 20 20 20 20 20 20 20 20 6e 54 61 67 20 2b            nTag +
0ab0: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 1;.           
0ac0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 64   }.            d
0ad0: 54 61 67 4f 63 63 75 72 2e 73 65 74 28 73 54 61  TagOccur.set(sTa
0ae0: 67 2c 20 64 54 61 67 4f 63 63 75 72 2e 67 6c 5f  g, dTagOccur.gl_
0af0: 67 65 74 28 73 54 61 67 2c 20 30 29 20 2b 20 31  get(sTag, 0) + 1
0b00: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c  );.            l
0b10: 45 6e 74 72 79 2e 70 75 73 68 28 5b 73 46 6c 65  Entry.push([sFle
0b20: 78 2c 20 64 41 66 66 2e 67 65 74 28 73 41 66 66  x, dAff.get(sAff
0b30: 29 2c 20 64 54 61 67 2e 67 65 74 28 73 54 61 67  ), dTag.get(sTag
0b40: 29 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  )]);.        }. 
0b50: 20 20 20 20 20 20 20 69 66 20 28 6c 45 6e 74 72         if (lEntr
0b60: 79 2e 6c 65 6e 67 74 68 20 3d 3d 20 30 29 20 7b  y.length == 0) {
0b70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 68 72  .            thr
0b80: 6f 77 20 22 45 72 72 6f 72 2e 20 45 6d 70 74 79  ow "Error. Empty
0b90: 20 6c 65 78 69 63 6f 6e 22 3b 0a 20 20 20 20 20   lexicon";.     
0ba0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 0a 20 20     }.        .  
0bb0: 20 20 20 20 20 20 2f 2f 20 50 72 65 70 61 72 69        // Prepari
0bc0: 6e 67 20 44 41 57 47 0a 20 20 20 20 20 20 20 20  ng DAWG.        
0bd0: 63 6f 6e 73 6f 6c 65 2e 6c 6f 67 28 22 20 3e 20  console.log(" > 
0be0: 50 72 65 70 61 72 69 6e 67 20 6c 69 73 74 20 6f  Preparing list o
0bf0: 66 20 77 6f 72 64 73 22 29 3b 0a 20 20 20 20 20  f words");.     
0c00: 20 20 20 6c 65 74 20 6c 56 61 6c 20 3d 20 6c 43     let lVal = lC
0c10: 68 61 72 2e 63 6f 6e 63 61 74 28 6c 41 66 66 29  har.concat(lAff)
0c20: 2e 63 6f 6e 63 61 74 28 6c 54 61 67 29 3b 0a 20  .concat(lTag);. 
0c30: 20 20 20 20 20 20 20 6c 65 74 20 6c 57 6f 72 64         let lWord
0c40: 20 3d 20 5b 5d 3b 0a 20 20 20 20 20 20 20 20 66   = [];.        f
0c50: 6f 72 20 28 6c 65 74 20 5b 73 46 6c 65 78 2c 20  or (let [sFlex, 
0c60: 69 41 66 66 2c 20 69 54 61 67 5d 20 6f 66 20 6c  iAff, iTag] of l
0c70: 45 6e 74 72 79 29 20 7b 0a 20 20 20 20 20 20 20  Entry) {.       
0c80: 20 20 20 20 20 6c 65 74 20 6c 54 65 6d 70 20 3d       let lTemp =
0c90: 20 5b 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20   [];.           
0ca0: 20 66 6f 72 20 28 6c 65 74 20 63 20 6f 66 20 73   for (let c of s
0cb0: 46 6c 65 78 29 20 7b 0a 20 20 20 20 20 20 20 20  Flex) {.        
0cc0: 20 20 20 20 20 20 20 20 6c 54 65 6d 70 2e 70 75          lTemp.pu
0cd0: 73 68 28 64 43 68 61 72 2e 67 65 74 28 63 29 29  sh(dChar.get(c))
0ce0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
0cf0: 20 20 20 20 20 20 20 20 20 20 20 20 6c 54 65 6d              lTem
0d00: 70 2e 70 75 73 68 28 69 41 66 66 2b 6e 43 68 61  p.push(iAff+nCha
0d10: 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  r);.            
0d20: 6c 54 65 6d 70 2e 70 75 73 68 28 69 54 61 67 2b  lTemp.push(iTag+
0d30: 6e 43 68 61 72 2b 6e 41 66 66 29 0a 20 20 20 20  nChar+nAff).    
0d40: 20 20 20 20 20 20 20 20 6c 57 6f 72 64 2e 70 75          lWord.pu
0d50: 73 68 28 6c 54 65 6d 70 29 3b 0a 20 20 20 20 20  sh(lTemp);.     
0d60: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6c 45 6e     }.        lEn
0d70: 74 72 79 2e 6c 65 6e 67 74 68 20 3d 20 30 3b 20  try.length = 0; 
0d80: 2f 2f 20 63 6c 65 61 72 20 74 68 65 20 61 72 72  // clear the arr
0d90: 61 79 0a 20 20 20 20 20 20 20 20 0a 20 20 20 20  ay.        .    
0da0: 20 20 20 20 2f 2f 20 44 69 63 74 69 6f 6e 61 72      // Dictionar
0db0: 79 20 6f 66 20 61 72 63 20 76 61 6c 75 65 73 20  y of arc values 
0dc0: 6f 63 63 75 72 72 65 6e 63 79 2c 20 74 6f 20 73  occurrency, to s
0dd0: 6f 72 74 20 61 72 63 73 20 6f 66 20 65 61 63 68  ort arcs of each
0de0: 20 6e 6f 64 65 0a 20 20 20 20 20 20 20 20 6c 65   node.        le
0df0: 74 20 6c 4b 65 79 56 61 6c 20 3d 20 5b 5d 3b 0a  t lKeyVal = [];.
0e00: 20 20 20 20 20 20 20 20 66 6f 72 20 28 6c 65 74          for (let
0e10: 20 63 20 6f 66 20 64 43 68 61 72 2e 6b 65 79 73   c of dChar.keys
0e20: 28 29 29 20 7b 20 6c 4b 65 79 56 61 6c 2e 70 75  ()) { lKeyVal.pu
0e30: 73 68 28 5b 64 43 68 61 72 5b 63 5d 2c 20 64 43  sh([dChar[c], dC
0e40: 68 61 72 4f 63 63 75 72 5b 63 5d 5d 29 3b 20 7d  harOccur[c]]); }
0e50: 0a 20 20 20 20 20 20 20 20 66 6f 72 20 28 6c 65  .        for (le
0e60: 74 20 73 41 66 66 20 6f 66 20 64 41 66 66 2e 6b  t sAff of dAff.k
0e70: 65 79 73 28 29 29 20 7b 20 6c 4b 65 79 56 61 6c  eys()) { lKeyVal
0e80: 2e 70 75 73 68 28 5b 64 41 66 66 5b 73 41 66 66  .push([dAff[sAff
0e90: 5d 2b 6e 43 68 61 72 2c 20 64 41 66 66 4f 63 63  ]+nChar, dAffOcc
0ea0: 75 72 5b 73 41 66 66 5d 5d 29 3b 20 7d 0a 20 20  ur[sAff]]); }.  
0eb0: 20 20 20 20 20 20 66 6f 72 20 28 6c 65 74 20 73        for (let s
0ec0: 54 61 67 20 69 6e 20 64 54 61 67 2e 6b 65 79 73  Tag in dTag.keys
0ed0: 28 29 29 20 7b 20 6c 4b 65 79 56 61 6c 2e 70 75  ()) { lKeyVal.pu
0ee0: 73 68 28 5b 64 54 61 67 5b 73 54 61 67 5d 2b 6e  sh([dTag[sTag]+n
0ef0: 43 68 61 72 2b 6e 41 66 66 2c 20 64 54 61 67 4f  Char+nAff, dTagO
0f00: 63 63 75 72 5b 73 54 61 67 5d 5d 29 3b 20 7d 0a  ccur[sTag]]); }.
0f10: 20 20 20 20 20 20 20 20 64 56 61 6c 4f 63 63 75          dValOccu
0f20: 72 20 3d 20 6e 65 77 20 4d 61 70 28 6c 4b 65 79  r = new Map(lKey
0f30: 56 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 6c 4b  Val);.        lK
0f40: 65 79 56 61 6c 2e 6c 65 6e 67 74 68 20 3d 20 30  eyVal.length = 0
0f50: 3b 20 2f 2f 20 63 6c 65 61 72 20 74 68 65 20 61  ; // clear the a
0f60: 72 72 61 79 0a 0a 20 20 20 20 20 20 20 20 2f 2f  rray..        //
0f70: 77 69 74 68 20 6f 70 65 6e 28 73 70 66 53 72 63  with open(spfSrc
0f80: 5b 3a 2d 38 5d 2b 22 2e 76 61 6c 75 65 73 66 72  [:-8]+".valuesfr
0f90: 65 71 2e 74 78 74 22 2c 20 27 77 27 2c 20 65 6e  eq.txt", 'w', en
0fa0: 63 6f 64 69 6e 67 3d 27 75 74 66 2d 38 27 29 20  coding='utf-8') 
0fb0: 61 73 20 68 46 72 65 71 44 73 74 3a 20 20 23 20  as hFreqDst:  # 
0fc0: 44 45 42 55 47 0a 20 20 20 20 20 20 20 20 2f 2f  DEBUG.        //
0fd0: 20 20 20 20 66 6f 72 20 69 4b 65 79 2c 20 6e 4f      for iKey, nO
0fe0: 63 63 20 69 6e 20 73 6f 72 74 65 64 28 64 56 61  cc in sorted(dVa
0ff0: 6c 4f 63 63 75 72 2e 65 6e 74 72 69 65 73 28 29  lOccur.entries()
1000: 2c 20 6b 65 79 3d 6c 61 6d 62 64 61 20 74 3a 20  , key=lambda t: 
1010: 74 5b 31 5d 2c 20 72 65 76 65 72 73 65 3d 54 72  t[1], reverse=Tr
1020: 75 65 29 3a 0a 20 20 20 20 20 20 20 20 2f 2f 20  ue):.        // 
1030: 20 20 20 20 20 20 20 68 46 72 65 71 44 73 74 2e         hFreqDst.
1040: 77 72 69 74 65 28 22 7b 7d 3a 20 7b 7d 5c 6e 22  write("{}: {}\n"
1050: 2e 66 6f 72 6d 61 74 28 6c 56 61 6c 5b 69 4b 65  .format(lVal[iKe
1060: 79 5d 2c 20 6e 4f 63 63 29 29 0a 20 20 20 20 20  y], nOcc)).     
1070: 20 20 20 2f 2f 20 20 20 20 68 46 72 65 71 44 73     //    hFreqDs
1080: 74 2e 63 6c 6f 73 65 28 29 0a 20 20 20 20 20 20  t.close().      
1090: 20 20 0a 20 20 20 20 20 20 20 20 74 68 69 73 2e    .        this.
10a0: 73 4c 61 6e 67 20 3d 20 73 4c 61 6e 67 4e 61 6d  sLang = sLangNam
10b0: 65 3b 0a 20 20 20 20 20 20 20 20 74 68 69 73 2e  e;.        this.
10c0: 6e 45 6e 74 72 79 20 3d 20 6c 57 6f 72 64 2e 6c  nEntry = lWord.l
10d0: 65 6e 67 74 68 3b 0a 20 20 20 20 20 20 20 20 74  ength;.        t
10e0: 68 69 73 2e 61 50 72 65 76 69 6f 75 73 45 6e 74  his.aPreviousEnt
10f0: 72 79 20 3d 20 5b 5d 3b 0a 20 20 20 20 20 20 20  ry = [];.       
1100: 20 6f 4e 6f 64 65 43 6f 75 6e 74 65 72 2e 72 65   oNodeCounter.re
1110: 73 65 74 28 29 3b 0a 20 20 20 20 20 20 20 20 74  set();.        t
1120: 68 69 73 2e 6f 52 6f 6f 74 20 3d 20 6e 65 77 20  his.oRoot = new 
1130: 44 61 77 67 4e 6f 64 65 28 29 3b 0a 20 20 20 20  DawgNode();.    
1140: 20 20 20 20 74 68 69 73 2e 6c 55 6e 63 68 65 63      this.lUnchec
1150: 6b 65 64 4e 6f 64 65 73 20 3d 20 5b 5d 3b 20 20  kedNodes = [];  
1160: 20 20 20 20 20 20 20 20 2f 2f 20 6c 69 73 74 20          // list 
1170: 6f 66 20 6e 6f 64 65 73 20 74 68 61 74 20 68 61  of nodes that ha
1180: 76 65 20 6e 6f 74 20 62 65 65 6e 20 63 68 65 63  ve not been chec
1190: 6b 65 64 20 66 6f 72 20 64 75 70 6c 69 63 61 74  ked for duplicat
11a0: 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20 74 68 69  ion..        thi
11b0: 73 2e 64 4d 69 6e 69 6d 69 7a 65 64 4e 6f 64 65  s.dMinimizedNode
11c0: 73 20 3d 20 6e 65 77 20 4d 61 70 28 29 3b 20 20  s = new Map();  
11d0: 20 2f 2f 20 6c 69 73 74 20 6f 66 20 75 6e 69 71   // list of uniq
11e0: 75 65 20 6e 6f 64 65 73 20 74 68 61 74 20 68 61  ue nodes that ha
11f0: 76 65 20 62 65 65 6e 20 63 68 65 63 6b 65 64 20  ve been checked 
1200: 66 6f 72 20 64 75 70 6c 69 63 61 74 69 6f 6e 2e  for duplication.
1210: 0a 20 20 20 20 20 20 20 20 74 68 69 73 2e 6c 53  .        this.lS
1220: 6f 72 74 65 64 4e 6f 64 65 73 20 3d 20 5b 5d 3b  ortedNodes = [];
1230: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20               // 
1240: 76 65 72 73 69 6f 6e 20 32 20 61 6e 64 20 33 0a  version 2 and 3.
1250: 20 20 20 20 20 20 20 20 74 68 69 73 2e 6e 4e 6f          this.nNo
1260: 64 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  de = 0;.        
1270: 74 68 69 73 2e 6e 41 72 63 20 3d 20 30 3b 0a 20  this.nArc = 0;. 
1280: 20 20 20 20 20 20 20 74 68 69 73 2e 64 43 68 61         this.dCha
1290: 72 20 3d 20 64 43 68 61 72 3b 0a 20 20 20 20 20  r = dChar;.     
12a0: 20 20 20 74 68 69 73 2e 6e 43 68 61 72 20 3d 20     this.nChar = 
12b0: 64 43 68 61 72 2e 6c 65 6e 67 74 68 3b 0a 20 20  dChar.length;.  
12c0: 20 20 20 20 20 20 74 68 69 73 2e 6e 41 66 66 20        this.nAff 
12d0: 3d 20 6e 41 66 66 3b 0a 20 20 20 20 20 20 20 20  = nAff;.        
12e0: 74 68 69 73 2e 6c 41 72 63 56 61 6c 20 3d 20 6c  this.lArcVal = l
12f0: 56 61 6c 3b 0a 20 20 20 20 20 20 20 20 74 68 69  Val;.        thi
1300: 73 2e 6e 41 72 63 56 61 6c 20 3d 20 6c 56 61 6c  s.nArcVal = lVal
1310: 2e 6c 65 6e 67 74 68 3b 0a 20 20 20 20 20 20 20  .length;.       
1320: 20 74 68 69 73 2e 6e 54 61 67 20 3d 20 74 68 69   this.nTag = thi
1330: 73 2e 6e 41 72 63 56 61 6c 20 2d 20 74 68 69 73  s.nArcVal - this
1340: 2e 6e 43 68 61 72 20 2d 20 6e 41 66 66 3b 0a 20  .nChar - nAff;. 
1350: 20 20 20 20 20 20 20 74 68 69 73 2e 63 53 74 65         this.cSte
1360: 6d 6d 69 6e 67 20 3d 20 63 53 74 65 6d 6d 69 6e  mming = cStemmin
1370: 67 3b 0a 20 20 20 20 20 20 20 20 69 66 20 28 63  g;.        if (c
1380: 53 74 65 6d 6d 69 6e 67 20 3d 3d 20 22 41 22 29  Stemming == "A")
1390: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74   {.            t
13a0: 68 69 73 2e 66 75 6e 63 53 74 65 6d 6d 69 6e 67  his.funcStemming
13b0: 20 3d 20 73 74 72 5f 74 72 61 6e 73 66 6f 72 6d   = str_transform
13c0: 2e 63 68 61 6e 67 65 57 6f 72 64 57 69 74 68 41  .changeWordWithA
13d0: 66 66 69 78 43 6f 64 65 3b 0a 20 20 20 20 20 20  ffixCode;.      
13e0: 20 20 7d 20 65 6c 73 65 20 69 66 20 28 63 53 74    } else if (cSt
13f0: 65 6d 6d 69 6e 67 20 3d 3d 20 22 53 22 29 20 7b  emming == "S") {
1400: 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 68 69  .            thi
1410: 73 2e 66 75 6e 63 53 74 65 6d 6d 69 6e 67 20 3d  s.funcStemming =
1420: 20 73 74 72 5f 74 72 61 6e 73 66 6f 72 6d 2e 63   str_transform.c
1430: 68 61 6e 67 65 57 6f 72 64 57 69 74 68 53 75 66  hangeWordWithSuf
1440: 66 69 78 43 6f 64 65 3b 0a 20 20 20 20 20 20 20  fixCode;.       
1450: 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
1460: 20 20 20 20 20 20 74 68 69 73 2e 66 75 6e 63 53        this.funcS
1470: 74 65 6d 6d 69 6e 67 20 3d 20 73 74 72 5f 74 72  temming = str_tr
1480: 61 6e 73 66 6f 72 6d 2e 6e 6f 53 74 65 6d 6d 69  ansform.noStemmi
1490: 6e 67 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ng;.        }.  
14a0: 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 2f        .        /
14b0: 2f 20 62 75 69 6c 64 0a 20 20 20 20 20 20 20 20  / build.        
14c0: 6c 57 6f 72 64 2e 73 6f 72 74 28 29 3b 0a 20 20  lWord.sort();.  
14d0: 20 20 20 20 20 20 69 66 20 28 78 50 72 6f 67 72        if (xProgr
14e0: 65 73 73 42 61 72 4e 6f 64 65 29 20 7b 0a 20 20  essBarNode) {.  
14f0: 20 20 20 20 20 20 20 20 20 20 78 50 72 6f 67 72            xProgr
1500: 65 73 73 42 61 72 4e 6f 64 65 2e 76 61 6c 75 65  essBarNode.value
1510: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
1520: 20 20 78 50 72 6f 67 72 65 73 73 42 61 72 4e 6f    xProgressBarNo
1530: 64 65 2e 6d 61 78 20 3d 20 6c 57 6f 72 64 2e 6c  de.max = lWord.l
1540: 65 6e 67 74 68 3b 0a 20 20 20 20 20 20 20 20 7d  ength;.        }
1550: 0a 20 20 20 20 20 20 20 20 6c 65 74 20 69 20 3d  .        let i =
1560: 20 30 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 20   0;.        for 
1570: 28 6c 65 74 20 61 45 6e 74 72 79 20 6f 66 20 6c  (let aEntry of l
1580: 57 6f 72 64 29 20 7b 0a 20 20 20 20 20 20 20 20  Word) {.        
1590: 20 20 20 20 74 68 69 73 2e 69 6e 73 65 72 74 28      this.insert(
15a0: 61 45 6e 74 72 79 29 3b 0a 20 20 20 20 20 20 20  aEntry);.       
15b0: 20 20 20 20 20 69 66 20 28 78 50 72 6f 67 72 65       if (xProgre
15c0: 73 73 42 61 72 4e 6f 64 65 29 20 7b 0a 20 20 20  ssBarNode) {.   
15d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 78 50 72               xPr
15e0: 6f 67 72 65 73 73 42 61 72 4e 6f 64 65 2e 76 61  ogressBarNode.va
15f0: 6c 75 65 20 3d 20 69 3b 0a 20 20 20 20 20 20 20  lue = i;.       
1600: 20 20 20 20 20 20 20 20 20 69 20 2b 3d 20 31 3b           i += 1;
1610: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
1620: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1630: 20 74 68 69 73 2e 66 69 6e 69 73 68 28 29 3b 0a   this.finish();.
1640: 20 20 20 20 20 20 20 20 74 68 69 73 2e 63 6f 75          this.cou
1650: 6e 74 4e 6f 64 65 73 28 29 3b 0a 20 20 20 20 20  ntNodes();.     
1660: 20 20 20 74 68 69 73 2e 63 6f 75 6e 74 41 72 63     this.countArc
1670: 73 28 29 3b 0a 20 20 20 20 20 20 20 20 74 68 69  s();.        thi
1680: 73 2e 73 6f 72 74 4e 6f 64 65 73 28 29 3b 0a 20  s.sortNodes();. 
1690: 20 20 20 20 20 20 20 74 68 69 73 2e 73 6f 72 74         this.sort
16a0: 4e 6f 64 65 41 72 63 73 28 64 56 61 6c 4f 63 63  NodeArcs(dValOcc
16b0: 75 72 29 3b 0a 20 20 20 20 20 20 20 20 74 68 69  ur);.        thi
16c0: 73 2e 64 69 73 70 6c 61 79 49 6e 66 6f 28 29 3b  s.displayInfo();
16d0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2f 20 42  .    }..    // B
16e0: 55 49 4c 44 20 44 41 57 47 0a 20 20 20 20 69 6e  UILD DAWG.    in
16f0: 73 65 72 74 20 28 61 45 6e 74 72 79 29 20 7b 0a  sert (aEntry) {.
1700: 20 20 20 20 20 20 20 20 69 66 20 28 61 45 6e 74          if (aEnt
1710: 72 79 20 3c 20 74 68 69 73 2e 61 50 72 65 76 69  ry < this.aPrevi
1720: 6f 75 73 45 6e 74 72 79 29 20 7b 0a 20 20 20 20  ousEntry) {.    
1730: 20 20 20 20 20 20 20 20 74 68 72 6f 77 20 22 45          throw "E
1740: 72 72 6f 72 3a 20 57 6f 72 64 73 20 6d 75 73 74  rror: Words must
1750: 20 62 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20   be inserted in 
1760: 61 6c 70 68 61 62 65 74 69 63 61 6c 20 6f 72 64  alphabetical ord
1770: 65 72 2e 22 3b 0a 20 20 20 20 20 20 20 20 7d 0a  er.";.        }.
1780: 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20          .       
1790: 20 2f 2f 20 66 69 6e 64 20 63 6f 6d 6d 6f 6e 20   // find common 
17a0: 70 72 65 66 69 78 20 62 65 74 77 65 65 6e 20 77  prefix between w
17b0: 6f 72 64 20 61 6e 64 20 70 72 65 76 69 6f 75 73  ord and previous
17c0: 20 77 6f 72 64 0a 20 20 20 20 20 20 20 20 6c 65   word.        le
17d0: 74 20 6e 43 6f 6d 6d 6f 6e 50 72 65 66 69 78 20  t nCommonPrefix 
17e0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  = 0;.        for
17f0: 20 28 6c 65 74 20 69 20 3d 20 30 3b 20 20 69 20   (let i = 0;  i 
1800: 3c 20 4d 61 74 68 2e 6d 69 6e 28 61 45 6e 74 72  < Math.min(aEntr
1810: 79 2e 6c 65 6e 67 74 68 2c 20 74 68 69 73 2e 61  y.length, this.a
1820: 50 72 65 76 69 6f 75 73 45 6e 74 72 79 2e 6c 65  PreviousEntry.le
1830: 6e 67 74 68 29 3b 20 20 69 2b 2b 29 20 7b 0a 20  ngth);  i++) {. 
1840: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 61             if (a
1850: 45 6e 74 72 79 5b 69 5d 20 21 3d 20 74 68 69 73  Entry[i] != this
1860: 2e 61 50 72 65 76 69 6f 75 73 45 6e 74 72 79 5b  .aPreviousEntry[
1870: 69 5d 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  i]) {.          
1880: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1890: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
18a0: 20 20 20 20 20 20 20 6e 43 6f 6d 6d 6f 6e 50 72         nCommonPr
18b0: 65 66 69 78 20 2b 3d 20 31 3b 0a 20 20 20 20 20  efix += 1;.     
18c0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2f 20     }.        // 
18d0: 43 68 65 63 6b 20 74 68 65 20 6c 55 6e 63 68 65  Check the lUnche
18e0: 63 6b 65 64 4e 6f 64 65 73 20 66 6f 72 20 72 65  ckedNodes for re
18f0: 64 75 6e 64 61 6e 74 20 6e 6f 64 65 73 2c 20 70  dundant nodes, p
1900: 72 6f 63 65 65 64 69 6e 67 20 66 72 6f 6d 20 6c  roceeding from l
1910: 61 73 74 0a 20 20 20 20 20 20 20 20 2f 2f 20 6f  ast.        // o
1920: 6e 65 20 64 6f 77 6e 20 74 6f 20 74 68 65 20 63  ne down to the c
1930: 6f 6d 6d 6f 6e 20 70 72 65 66 69 78 20 73 69 7a  ommon prefix siz
1940: 65 2e 20 54 68 65 6e 20 74 72 75 6e 63 61 74 65  e. Then truncate
1950: 20 74 68 65 20 6c 69 73 74 20 61 74 20 74 68 61   the list at tha
1960: 74 20 70 6f 69 6e 74 2e 0a 20 20 20 20 20 20 20  t point..       
1970: 20 74 68 69 73 2e 5f 6d 69 6e 69 6d 69 7a 65 28   this._minimize(
1980: 6e 43 6f 6d 6d 6f 6e 50 72 65 66 69 78 29 3b 0a  nCommonPrefix);.
1990: 0a 20 20 20 20 20 20 20 20 2f 2f 20 61 64 64 20  .        // add 
19a0: 74 68 65 20 73 75 66 66 69 78 2c 20 73 74 61 72  the suffix, star
19b0: 74 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 63 6f  ting from the co
19c0: 72 72 65 63 74 20 6e 6f 64 65 20 6d 69 64 2d 77  rrect node mid-w
19d0: 61 79 20 74 68 72 6f 75 67 68 20 74 68 65 20 67  ay through the g
19e0: 72 61 70 68 0a 20 20 20 20 20 20 20 20 6c 65 74  raph.        let
19f0: 20 6f 4e 6f 64 65 20 3d 20 28 74 68 69 73 2e 6c   oNode = (this.l
1a00: 55 6e 63 68 65 63 6b 65 64 4e 6f 64 65 73 2e 6c  UncheckedNodes.l
1a10: 65 6e 67 74 68 20 3d 3d 20 30 29 20 3f 20 74 68  ength == 0) ? th
1a20: 69 73 2e 6f 52 6f 6f 74 20 3a 20 74 68 69 73 2e  is.oRoot : this.
1a30: 6c 55 6e 63 68 65 63 6b 65 64 4e 6f 64 65 73 5b  lUncheckedNodes[
1a40: 74 68 69 73 2e 6c 55 6e 63 68 65 63 6b 65 64 4e  this.lUncheckedN
1a50: 6f 64 65 73 2e 6c 65 6e 67 74 68 2d 31 5d 5b 32  odes.length-1][2
1a60: 5d 3b 0a 20 20 20 20 20 20 20 20 6c 65 74 20 69  ];.        let i
1a70: 43 68 61 72 20 3d 20 6e 43 6f 6d 6d 6f 6e 50 72  Char = nCommonPr
1a80: 65 66 69 78 3b 0a 20 20 20 20 20 20 20 20 66 6f  efix;.        fo
1a90: 72 20 28 6c 65 74 20 63 20 6f 66 20 61 45 6e 74  r (let c of aEnt
1aa0: 72 79 2e 73 6c 69 63 65 28 6e 43 6f 6d 6d 6f 6e  ry.slice(nCommon
1ab0: 50 72 65 66 69 78 29 29 20 7b 0a 20 20 20 20 20  Prefix)) {.     
1ac0: 20 20 20 20 20 20 20 6c 65 74 20 6f 4e 65 78 74         let oNext
1ad0: 4e 6f 64 65 20 3d 20 6e 65 77 20 44 61 77 67 4e  Node = new DawgN
1ae0: 6f 64 65 28 29 3b 0a 20 20 20 20 20 20 20 20 20  ode();.         
1af0: 20 20 20 6f 4e 6f 64 65 2e 61 72 63 73 2e 73 65     oNode.arcs.se
1b00: 74 28 63 2c 20 6f 4e 65 78 74 4e 6f 64 65 29 3b  t(c, oNextNode);
1b10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 68 69  .            thi
1b20: 73 2e 6c 55 6e 63 68 65 63 6b 65 64 4e 6f 64 65  s.lUncheckedNode
1b30: 73 2e 70 75 73 68 28 5b 6f 4e 6f 64 65 2c 20 63  s.push([oNode, c
1b40: 2c 20 6f 4e 65 78 74 4e 6f 64 65 5d 29 3b 0a 20  , oNextNode]);. 
1b50: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 69             if (i
1b60: 43 68 61 72 20 3d 3d 20 28 61 45 6e 74 72 79 2e  Char == (aEntry.
1b70: 6c 65 6e 67 74 68 20 2d 20 32 29 29 20 7b 0a 20  length - 2)) {. 
1b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
1b90: 4e 6f 64 65 2e 66 69 6e 61 6c 20 3d 20 74 72 75  Node.final = tru
1ba0: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  e;.            }
1bb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 43 68  .            iCh
1bc0: 61 72 20 2b 3d 20 31 3b 0a 20 20 20 20 20 20 20  ar += 1;.       
1bd0: 20 20 20 20 20 6f 4e 6f 64 65 20 3d 20 6f 4e 65       oNode = oNe
1be0: 78 74 4e 6f 64 65 3b 0a 20 20 20 20 20 20 20 20  xtNode;.        
1bf0: 7d 0a 20 20 20 20 20 20 20 20 6f 4e 6f 64 65 2e  }.        oNode.
1c00: 66 69 6e 61 6c 20 3d 20 74 72 75 65 3b 0a 20 20  final = true;.  
1c10: 20 20 20 20 20 20 74 68 69 73 2e 61 50 72 65 76        this.aPrev
1c20: 69 6f 75 73 45 6e 74 72 79 20 3d 20 61 45 6e 74  iousEntry = aEnt
1c30: 72 79 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66  ry;.    }..    f
1c40: 69 6e 69 73 68 20 28 29 20 7b 0a 20 20 20 20 20  inish () {.     
1c50: 20 20 20 2f 2f 20 6d 69 6e 69 6d 69 7a 65 20 75     // minimize u
1c60: 6e 63 68 65 63 6b 65 64 20 6e 6f 64 65 73 0a 20  nchecked nodes. 
1c70: 20 20 20 20 20 20 20 74 68 69 73 2e 5f 6d 69 6e         this._min
1c80: 69 6d 69 7a 65 28 30 29 3b 0a 20 20 20 20 7d 0a  imize(0);.    }.
1c90: 0a 20 20 20 20 5f 6d 69 6e 69 6d 69 7a 65 20 28  .    _minimize (
1ca0: 6e 44 6f 77 6e 54 6f 29 20 7b 0a 20 20 20 20 20  nDownTo) {.     
1cb0: 20 20 20 2f 2f 20 70 72 6f 63 65 65 64 20 66 72     // proceed fr
1cc0: 6f 6d 20 74 68 65 20 6c 65 61 66 20 75 70 20 74  om the leaf up t
1cd0: 6f 20 61 20 63 65 72 74 61 69 6e 20 70 6f 69 6e  o a certain poin
1ce0: 74 0a 20 20 20 20 20 20 20 20 66 6f 72 20 28 6c  t.        for (l
1cf0: 65 74 20 69 20 3d 20 74 68 69 73 2e 6c 55 6e 63  et i = this.lUnc
1d00: 68 65 63 6b 65 64 4e 6f 64 65 73 2e 6c 65 6e 67  heckedNodes.leng
1d10: 74 68 2d 31 3b 20 20 69 20 3c 20 6e 44 6f 77 6e  th-1;  i < nDown
1d20: 54 6f 2d 31 3b 20 20 69 2d 2d 29 20 7b 0a 20 20  To-1;  i--) {.  
1d30: 20 20 20 20 20 20 20 20 20 20 6c 65 74 20 5b 6f            let [o
1d40: 4e 6f 64 65 2c 20 63 68 61 72 2c 20 6f 43 68 69  Node, char, oChi
1d50: 6c 64 4e 6f 64 65 5d 20 3d 20 74 68 69 73 2e 6c  ldNode] = this.l
1d60: 55 6e 63 68 65 63 6b 65 64 4e 6f 64 65 73 5b 69  UncheckedNodes[i
1d70: 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ];.            i
1d80: 66 20 28 74 68 69 73 2e 64 4d 69 6e 69 6d 69 7a  f (this.dMinimiz
1d90: 65 64 4e 6f 64 65 73 2e 68 61 73 28 6f 43 68 69  edNodes.has(oChi
1da0: 6c 64 4e 6f 64 65 2e 5f 5f 68 61 73 68 5f 5f 28  ldNode.__hash__(
1db0: 29 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  ))) {.          
1dc0: 20 20 20 20 20 20 2f 2f 20 72 65 70 6c 61 63 65        // replace
1dd0: 20 74 68 65 20 63 68 69 6c 64 20 77 69 74 68 20   the child with 
1de0: 74 68 65 20 70 72 65 76 69 6f 75 73 6c 79 20 65  the previously e
1df0: 6e 63 6f 75 6e 74 65 72 65 64 20 6f 6e 65 0a 20  ncountered one. 
1e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
1e10: 4e 6f 64 65 2e 61 72 63 73 2e 73 65 74 28 63 68  Node.arcs.set(ch
1e20: 61 72 2c 20 74 68 69 73 2e 64 4d 69 6e 69 6d 69  ar, this.dMinimi
1e30: 7a 65 64 4e 6f 64 65 73 2e 67 65 74 28 6f 43 68  zedNodes.get(oCh
1e40: 69 6c 64 4e 6f 64 65 2e 5f 5f 68 61 73 68 5f 5f  ildNode.__hash__
1e50: 28 29 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ()));.          
1e60: 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
1e70: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 61 64             // ad
1e80: 64 20 74 68 65 20 73 74 61 74 65 20 74 6f 20 74  d the state to t
1e90: 68 65 20 6d 69 6e 69 6d 69 7a 65 64 20 6e 6f 64  he minimized nod
1ea0: 65 73 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  es..            
1eb0: 20 20 20 20 74 68 69 73 2e 64 4d 69 6e 69 6d 69      this.dMinimi
1ec0: 7a 65 64 4e 6f 64 65 73 2e 73 65 74 28 6f 43 68  zedNodes.set(oCh
1ed0: 69 6c 64 4e 6f 64 65 2e 5f 5f 68 61 73 68 5f 5f  ildNode.__hash__
1ee0: 28 29 2c 20 6f 43 68 69 6c 64 4e 6f 64 65 29 3b  (), oChildNode);
1ef0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
1f00: 20 20 20 20 20 20 20 20 20 20 20 74 68 69 73 2e             this.
1f10: 6c 55 6e 63 68 65 63 6b 65 64 4e 6f 64 65 73 2e  lUncheckedNodes.
1f20: 70 6f 70 28 29 3b 0a 20 20 20 20 20 20 20 20 7d  pop();.        }
1f30: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 6f 75 6e  .    }..    coun
1f40: 74 4e 6f 64 65 73 20 28 29 20 7b 0a 20 20 20 20  tNodes () {.    
1f50: 20 20 20 20 74 68 69 73 2e 6e 4e 6f 64 65 20 3d      this.nNode =
1f60: 20 74 68 69 73 2e 64 4d 69 6e 69 6d 69 7a 65 64   this.dMinimized
1f70: 4e 6f 64 65 73 2e 73 69 7a 65 3b 0a 20 20 20 20  Nodes.size;.    
1f80: 7d 0a 0a 20 20 20 20 63 6f 75 6e 74 41 72 63 73  }..    countArcs
1f90: 20 28 29 20 7b 0a 20 20 20 20 20 20 20 20 74 68   () {.        th
1fa0: 69 73 2e 6e 41 72 63 20 3d 20 30 3b 0a 20 20 20  is.nArc = 0;.   
1fb0: 20 20 20 20 20 66 6f 72 20 28 6c 65 74 20 6f 4e       for (let oN
1fc0: 6f 64 65 20 6f 66 20 74 68 69 73 2e 64 4d 69 6e  ode of this.dMin
1fd0: 69 6d 69 7a 65 64 4e 6f 64 65 73 29 20 7b 0a 20  imizedNodes) {. 
1fe0: 20 20 20 20 20 20 20 20 20 20 20 74 68 69 73 2e             this.
1ff0: 6e 41 72 63 20 2b 3d 20 6f 4e 6f 64 65 2e 61 72  nArc += oNode.ar
2000: 63 73 2e 73 69 7a 65 3b 0a 20 20 20 20 20 20 20  cs.size;.       
2010: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 0a 20 20   }.    }.    .  
2020: 20 20 73 6f 72 74 4e 6f 64 65 41 72 63 73 20 28    sortNodeArcs (
2030: 64 56 61 6c 4f 63 63 75 72 29 20 7b 0a 20 20 20  dValOccur) {.   
2040: 20 20 20 20 20 63 6f 6e 73 6f 6c 65 2e 6c 6f 67       console.log
2050: 28 22 20 3e 20 53 6f 72 74 20 6e 6f 64 65 20 61  (" > Sort node a
2060: 72 63 73 22 29 3b 0a 20 20 20 20 20 20 20 20 74  rcs");.        t
2070: 68 69 73 2e 6f 52 6f 6f 74 2e 73 6f 72 74 41 72  his.oRoot.sortAr
2080: 63 73 28 64 56 61 6c 4f 63 63 75 72 29 3b 0a 20  cs(dValOccur);. 
2090: 20 20 20 20 20 20 20 66 6f 72 20 28 6c 65 74 20         for (let 
20a0: 6f 4e 6f 64 65 20 6f 66 20 74 68 69 73 2e 64 4d  oNode of this.dM
20b0: 69 6e 69 6d 69 7a 65 64 4e 6f 64 65 73 29 20 7b  inimizedNodes) {
20c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f 4e 6f  .            oNo
20d0: 64 65 2e 73 6f 72 74 41 72 63 73 28 64 56 61 6c  de.sortArcs(dVal
20e0: 4f 63 63 75 72 29 3b 0a 20 20 20 20 20 20 20 20  Occur);.        
20f0: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 6f 72  }.    }..    sor
2100: 74 4e 6f 64 65 73 20 28 29 20 7b 0a 20 20 20 20  tNodes () {.    
2110: 20 20 20 20 63 6f 6e 73 6f 6c 65 2e 6c 6f 67 28      console.log(
2120: 22 20 3e 20 53 6f 72 74 20 6e 6f 64 65 73 22 29  " > Sort nodes")
2130: 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 20 28 6c  ;.        for (l
2140: 65 74 20 6f 4e 6f 64 65 20 6f 66 20 74 68 69 73  et oNode of this
2150: 2e 6f 52 6f 6f 74 2e 61 72 63 73 2e 76 61 6c 75  .oRoot.arcs.valu
2160: 65 73 28 29 29 20 7b 0a 20 20 20 20 20 20 20 20  es()) {.        
2170: 20 20 20 20 74 68 69 73 2e 5f 70 61 72 73 65 4e      this._parseN
2180: 6f 64 65 73 28 6f 4e 6f 64 65 29 3b 0a 20 20 20  odes(oNode);.   
2190: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
21a0: 20 0a 20 20 20 20 5f 70 61 72 73 65 4e 6f 64 65   .    _parseNode
21b0: 73 20 28 6f 4e 6f 64 65 29 20 7b 0a 20 20 20 20  s (oNode) {.    
21c0: 20 20 20 20 2f 2f 20 57 61 72 6e 69 6e 67 3a 20      // Warning: 
21d0: 72 65 63 75 72 73 69 76 65 20 6d 65 74 68 6f 64  recursive method
21e0: 0a 20 20 20 20 20 20 20 20 69 66 20 28 6f 4e 6f  .        if (oNo
21f0: 64 65 2e 70 6f 73 20 3e 20 30 29 20 7b 0a 20 20  de.pos > 0) {.  
2200: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
2210: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2220: 20 20 20 20 6f 4e 6f 64 65 2e 73 65 74 50 6f 73      oNode.setPos
2230: 28 29 3b 0a 20 20 20 20 20 20 20 20 74 68 69 73  ();.        this
2240: 2e 6c 53 6f 72 74 65 64 4e 6f 64 65 73 2e 61 70  .lSortedNodes.ap
2250: 70 65 6e 64 28 6f 4e 6f 64 65 29 3b 0a 20 20 20  pend(oNode);.   
2260: 20 20 20 20 20 66 6f 72 20 28 6c 65 74 20 6f 4e       for (let oN
2270: 65 78 74 4e 6f 64 65 20 6f 66 20 6f 4e 6f 64 65  extNode of oNode
2280: 2e 61 72 63 73 2e 76 61 6c 75 65 73 28 29 29 20  .arcs.values()) 
2290: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 74  {.             t
22a0: 68 69 73 2e 5f 70 61 72 73 65 4e 6f 64 65 73 28  his._parseNodes(
22b0: 6f 4e 65 78 74 4e 6f 64 65 29 3b 0a 20 20 20 20  oNextNode);.    
22c0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
22d0: 20 20 20 20 0a 20 20 20 20 6c 6f 6f 6b 75 70 20      .    lookup 
22e0: 28 73 57 6f 72 64 29 20 7b 0a 20 20 20 20 20 20  (sWord) {.      
22f0: 20 20 6c 65 74 20 6f 4e 6f 64 65 20 3d 20 74 68    let oNode = th
2300: 69 73 2e 6f 52 6f 6f 74 3b 0a 20 20 20 20 20 20  is.oRoot;.      
2310: 20 20 66 6f 72 20 28 6c 65 74 20 63 20 6f 66 20    for (let c of 
2320: 73 57 6f 72 64 29 20 7b 0a 20 20 20 20 20 20 20  sWord) {.       
2330: 20 20 20 20 20 69 66 20 28 21 6f 4e 6f 64 65 2e       if (!oNode.
2340: 61 72 63 73 2e 68 61 73 28 74 68 69 73 2e 64 43  arcs.has(this.dC
2350: 68 61 72 2e 67 6c 5f 67 65 74 28 63 2c 20 27 27  har.gl_get(c, ''
2360: 29 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  ))) {.          
2370: 20 20 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c        return fal
2380: 73 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se;.            
2390: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f 4e  }.            oN
23a0: 6f 64 65 20 3d 20 6f 4e 6f 64 65 2e 61 72 63 73  ode = oNode.arcs
23b0: 2e 67 65 74 28 74 68 69 73 2e 64 43 68 61 72 2e  .get(this.dChar.
23c0: 67 65 74 28 63 29 29 3b 0a 20 20 20 20 20 20 20  get(c));.       
23d0: 20 7d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72   }.        retur
23e0: 6e 20 6f 4e 6f 64 65 2e 66 69 6e 61 6c 3b 0a 20  n oNode.final;. 
23f0: 20 20 20 7d 0a 0a 20 20 20 20 6d 6f 72 70 68 20     }..    morph 
2400: 28 73 57 6f 72 64 29 20 7b 0a 20 20 20 20 20 20  (sWord) {.      
2410: 20 20 6c 65 74 20 6f 4e 6f 64 65 20 3d 20 74 68    let oNode = th
2420: 69 73 2e 6f 52 6f 6f 74 3b 0a 20 20 20 20 20 20  is.oRoot;.      
2430: 20 20 66 6f 72 20 28 6c 65 74 20 63 20 69 6e 20    for (let c in 
2440: 73 57 6f 72 64 29 20 7b 0a 20 20 20 20 20 20 20  sWord) {.       
2450: 20 20 20 20 20 69 66 20 28 21 6f 4e 6f 64 65 2e       if (!oNode.
2460: 61 72 63 73 2e 68 61 73 28 74 68 69 73 2e 64 43  arcs.has(this.dC
2470: 68 61 72 2e 67 65 74 28 63 2c 20 27 27 29 29 29  har.get(c, '')))
2480: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
2490: 20 20 20 72 65 74 75 72 6e 20 27 27 3b 0a 20 20     return '';.  
24a0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
24b0: 20 20 20 20 20 20 20 20 6f 4e 6f 64 65 20 3d 20          oNode = 
24c0: 6f 4e 6f 64 65 2e 61 72 63 73 2e 67 65 74 28 74  oNode.arcs.get(t
24d0: 68 69 73 2e 64 43 68 61 72 2e 67 65 74 28 63 29  his.dChar.get(c)
24e0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
24f0: 20 20 20 20 20 69 66 20 28 6f 4e 6f 64 65 2e 66       if (oNode.f
2500: 69 6e 61 6c 29 20 7b 0a 20 20 20 20 20 20 20 20  inal) {.        
2510: 20 20 20 20 6c 65 74 20 73 20 3d 20 22 2a 20 22      let s = "* "
2520: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f  ;.            fo
2530: 72 20 28 6c 65 74 20 61 72 63 20 6f 66 20 6f 4e  r (let arc of oN
2540: 6f 64 65 2e 61 72 63 73 2e 6b 65 79 73 28 29 29  ode.arcs.keys())
2550: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
2560: 20 20 20 69 66 20 28 61 72 63 20 3e 3d 20 74 68     if (arc >= th
2570: 69 73 2e 6e 43 68 61 72 29 20 7b 0a 20 20 20 20  is.nChar) {.    
2580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2590: 73 20 2b 3d 20 22 20 5b 22 20 2b 20 74 68 69 73  s += " [" + this
25a0: 2e 66 75 6e 63 53 74 65 6d 6d 69 6e 67 28 73 57  .funcStemming(sW
25b0: 6f 72 64 2c 20 74 68 69 73 2e 6c 41 72 63 56 61  ord, this.lArcVa
25c0: 6c 5b 61 72 63 5d 29 3b 0a 20 20 20 20 20 20 20  l[arc]);.       
25d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 65 74               let
25e0: 20 6f 4e 6f 64 65 32 20 3d 20 6f 4e 6f 64 65 2e   oNode2 = oNode.
25f0: 61 72 63 73 5b 61 72 63 5d 0a 20 20 20 20 20 20  arcs[arc].      
2600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f                fo
2610: 72 20 28 6c 65 74 20 61 72 63 32 20 6f 66 20 6f  r (let arc2 of o
2620: 4e 6f 64 65 32 2e 61 72 63 73 2e 6b 65 79 73 28  Node2.arcs.keys(
2630: 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  )) {.           
2640: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 20 2b               s +
2650: 3d 20 22 20 2f 20 22 20 2b 20 74 68 69 73 2e 6c  = " / " + this.l
2660: 41 72 63 56 61 6c 5b 61 72 63 32 5d 3b 0a 20 20  ArcVal[arc2];.  
2670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2680: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
2690: 20 20 20 20 20 20 20 20 73 20 2b 3d 20 22 5d 22          s += "]"
26a0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
26b0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
26c0: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  }.            re
26d0: 74 75 72 6e 20 73 3b 0a 20 20 20 20 20 20 20 20  turn s;.        
26e0: 7d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  }.        return
26f0: 20 27 27 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   '';.    }..    
2700: 64 69 73 70 6c 61 79 49 6e 66 6f 20 28 29 20 7b  displayInfo () {
2710: 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 6f 6c 65  .        console
2720: 2e 6c 6f 67 28 22 45 6e 74 72 69 65 73 3a 20 22  .log("Entries: "
2730: 20 2b 20 74 68 69 73 2e 6e 45 6e 74 72 79 29 3b   + this.nEntry);
2740: 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 6f 6c 65  .        console
2750: 2e 6c 6f 67 28 22 43 68 61 72 61 63 74 65 72 73  .log("Characters
2760: 3a 20 22 20 2b 20 74 68 69 73 2e 6e 43 68 61 72  : " + this.nChar
2770: 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 6f  );.        conso
2780: 6c 65 2e 6c 6f 67 28 22 41 66 66 69 78 65 73 3a  le.log("Affixes:
2790: 20 22 20 2b 20 74 68 69 73 2e 6e 41 66 66 29 3b   " + this.nAff);
27a0: 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 6f 6c 65  .        console
27b0: 2e 6c 6f 67 28 22 54 61 67 73 3a 20 22 20 2b 20  .log("Tags: " + 
27c0: 74 68 69 73 2e 6e 54 61 67 29 3b 0a 20 20 20 20  this.nTag);.    
27d0: 20 20 20 20 63 6f 6e 73 6f 6c 65 2e 6c 6f 67 28      console.log(
27e0: 22 41 72 63 20 76 61 6c 75 65 73 3a 20 22 20 2b  "Arc values: " +
27f0: 20 74 68 69 73 2e 6e 41 72 63 56 61 6c 29 3b 0a   this.nArcVal);.
2800: 20 20 20 20 20 20 20 20 63 6f 6e 73 6f 6c 65 2e          console.
2810: 6c 6f 67 28 22 4e 6f 64 65 73 3a 20 22 20 2b 20  log("Nodes: " + 
2820: 74 68 69 73 2e 6e 4e 6f 64 65 29 3b 0a 20 20 20  this.nNode);.   
2830: 20 20 20 20 20 63 6f 6e 73 6f 6c 65 2e 6c 6f 67       console.log
2840: 28 22 41 72 63 73 3a 20 22 20 2b 20 74 68 69 73  ("Arcs: " + this
2850: 2e 6e 41 72 63 29 3b 0a 20 20 20 20 20 20 20 20  .nArc);.        
2860: 63 6f 6e 73 6f 6c 65 2e 6c 6f 67 28 22 53 74 65  console.log("Ste
2870: 6d 6d 69 6e 67 3a 20 22 20 2b 20 74 68 69 73 2e  mming: " + this.
2880: 63 53 74 65 6d 6d 69 6e 67 20 2b 20 22 46 58 22  cStemming + "FX"
2890: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 67 65  );.    }..    ge
28a0: 74 41 72 63 53 74 61 74 73 20 28 29 20 7b 0a 20  tArcStats () {. 
28b0: 20 20 20 20 20 20 20 6c 65 74 20 64 20 3d 20 6e         let d = n
28c0: 65 77 20 4d 61 70 28 29 3b 0a 20 20 20 20 20 20  ew Map();.      
28d0: 20 20 66 6f 72 20 28 6c 65 74 20 6f 4e 6f 64 65    for (let oNode
28e0: 20 6f 66 20 74 68 69 73 2e 64 4d 69 6e 69 6d 69   of this.dMinimi
28f0: 7a 65 64 4e 6f 64 65 73 2e 76 61 6c 75 65 73 28  zedNodes.values(
2900: 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  )) {.           
2910: 20 6c 65 74 20 6e 20 3d 20 6f 4e 6f 64 65 2e 61   let n = oNode.a
2920: 72 63 73 2e 73 69 7a 65 3b 0a 20 20 20 20 20 20  rcs.size;.      
2930: 20 20 20 20 20 20 64 2e 73 65 74 28 6e 2c 20 64        d.set(n, d
2940: 2e 67 6c 5f 67 65 74 28 6e 2c 20 30 29 20 2b 20  .gl_get(n, 0) + 
2950: 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  1);.        }.  
2960: 20 20 20 20 20 20 6c 65 74 20 73 20 3d 20 22 20        let s = " 
2970: 2a 20 4e 6f 64 65 73 3a 5c 6e 22 3b 0a 20 20 20  * Nodes:\n";.   
2980: 20 20 20 20 20 66 6f 72 20 28 6c 65 74 20 5b 6e       for (let [n
2990: 4b 65 79 2c 20 6e 56 61 6c 5d 20 6f 66 20 64 2e  Key, nVal] of d.
29a0: 65 6e 74 72 69 65 73 28 29 29 20 7b 0a 20 20 20  entries()) {.   
29b0: 20 20 20 20 20 20 20 20 20 73 20 3d 20 73 20 2b           s = s +
29c0: 20 22 20 22 20 2b 20 6e 56 61 6c 20 2b 20 22 20   " " + nVal + " 
29d0: 6e 6f 64 65 73 20 68 61 76 65 20 22 20 2b 20 6e  nodes have " + n
29e0: 4b 65 79 20 2b 20 22 20 61 72 63 73 5c 6e 22 3b  Key + " arcs\n";
29f0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2a00: 20 20 20 72 65 74 75 72 6e 20 73 3b 0a 20 20 20     return s;.   
2a10: 20 7d 0a 0a 20 20 20 20 77 72 69 74 65 49 6e 66   }..    writeInf
2a20: 6f 20 28 29 20 7b 0a 20 20 20 20 20 20 20 20 63  o () {.        c
2a30: 6f 6e 73 6f 6c 65 2e 6c 6f 67 28 74 68 69 73 2e  onsole.log(this.
2a40: 67 65 74 41 72 63 53 74 61 74 73 28 29 29 3b 0a  getArcStats());.
2a50: 20 20 20 20 20 20 20 20 63 6f 6e 73 6f 6c 65 2e          console.
2a60: 6c 6f 67 28 22 5c 6e 20 2a 20 56 61 6c 75 65 73  log("\n * Values
2a70: 3a 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 6c  :\n");.        l
2a80: 65 74 20 69 20 3d 20 30 3b 0a 20 20 20 20 20 20  et i = 0;.      
2a90: 20 20 66 6f 72 20 28 6c 65 74 20 73 20 6f 66 20    for (let s of 
2aa0: 74 68 69 73 2e 6c 41 72 63 56 61 6c 29 20 7b 0a  this.lArcVal) {.
2ab0: 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73              cons
2ac0: 6f 6c 65 2e 6c 6f 67 28 69 20 2b 20 22 3a 20 22  ole.log(i + ": "
2ad0: 20 2b 20 73 29 3b 0a 20 20 20 20 20 20 20 20 7d   + s);.        }
2ae0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2f 20 42  .    }..    // B
2af0: 49 4e 41 52 59 20 43 4f 4e 56 45 52 53 49 4f 4e  INARY CONVERSION
2b00: 0a 20 20 20 20 63 72 65 61 74 65 42 69 6e 61 72  .    createBinar
2b10: 79 20 28 73 50 61 74 68 46 69 6c 65 2c 20 6e 4d  y (sPathFile, nM
2b20: 65 74 68 6f 64 29 20 7b 0a 20 20 20 20 20 20 20  ethod) {.       
2b30: 20 63 6f 6e 73 6f 6c 65 2e 6c 6f 67 28 22 57 72   console.log("Wr
2b40: 69 74 65 20 44 41 57 47 20 61 73 20 61 6e 20 69  ite DAWG as an i
2b50: 6e 64 65 78 61 62 6c 65 20 62 69 6e 61 72 79 20  ndexable binary 
2b60: 64 69 63 74 69 6f 6e 61 72 79 20 5b 6d 65 74 68  dictionary [meth
2b70: 6f 64 3a 20 22 2b 6e 4d 65 74 68 6f 64 2b 22 5d  od: "+nMethod+"]
2b80: 22 29 3b 0a 20 20 20 20 20 20 20 20 69 66 20 28  ");.        if (
2b90: 6e 4d 65 74 68 6f 64 20 3d 3d 20 31 29 20 7b 0a  nMethod == 1) {.
2ba0: 20 20 20 20 20 20 20 20 20 20 20 20 74 68 69 73              this
2bb0: 2e 6e 42 79 74 65 73 41 72 63 20 3d 20 4d 61 74  .nBytesArc = Mat
2bc0: 68 2e 66 6c 6f 6f 72 28 20 28 74 68 69 73 2e 6e  h.floor( (this.n
2bd0: 41 72 63 56 61 6c 2e 74 6f 53 74 72 69 6e 67 28  ArcVal.toString(
2be0: 32 29 2e 6c 65 6e 67 74 68 28 29 20 2b 20 32 29  2).length() + 2)
2bf0: 20 2f 20 38 20 29 20 2b 20 31 3b 20 20 20 20 20   / 8 ) + 1;     
2c00: 2f 2f 20 57 65 20 61 64 64 20 32 20 62 69 74 73  // We add 2 bits
2c10: 2e 20 53 65 65 20 44 61 77 67 4e 6f 64 65 2e 63  . See DawgNode.c
2c20: 6f 6e 76 54 6f 42 79 74 65 73 31 28 29 0a 20 20  onvToBytes1().  
2c30: 20 20 20 20 20 20 20 20 20 20 74 68 69 73 2e 5f            this._
2c40: 63 61 6c 63 4e 75 6d 42 79 74 65 73 4e 6f 64 65  calcNumBytesNode
2c50: 41 64 64 72 65 73 73 28 29 0a 20 20 20 20 20 20  Address().      
2c60: 20 20 20 20 20 20 74 68 69 73 2e 5f 63 61 6c 63        this._calc
2c70: 4e 6f 64 65 73 41 64 64 72 65 73 73 31 28 29 0a  NodesAddress1().
2c80: 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
2c90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e  .            con
2ca0: 73 6f 6c 65 2e 6c 6f 67 28 22 45 72 72 6f 72 3a  sole.log("Error:
2cb0: 20 75 6e 6b 6e 6f 77 6e 20 63 6f 6d 70 72 65 73   unknown compres
2cc0: 73 69 6f 6e 20 6d 65 74 68 6f 64 22 29 3b 0a 20  sion method");. 
2cd0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2ce0: 20 63 6f 6e 73 6f 6c 65 2e 6c 6f 67 28 22 41 72   console.log("Ar
2cf0: 63 20 76 61 6c 75 65 73 20 28 63 68 61 72 73 2c  c values (chars,
2d00: 20 61 66 66 69 78 65 73 20 61 6e 64 20 74 61 67   affixes and tag
2d10: 73 29 3a 20 22 20 2b 20 74 68 69 73 2e 6e 41 72  s): " + this.nAr
2d20: 63 56 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 63  cVal);.        c
2d30: 6f 6e 73 6f 6c 65 2e 6c 6f 67 28 22 41 72 63 20  onsole.log("Arc 
2d40: 73 69 7a 65 3a 20 22 2b 74 68 69 73 2e 6e 42 79  size: "+this.nBy
2d50: 74 65 73 41 72 63 2b 22 20 62 79 74 65 73 2c 20  tesArc+" bytes, 
2d60: 41 64 64 72 65 73 73 20 73 69 7a 65 3a 20 22 2b  Address size: "+
2d70: 74 68 69 73 2e 6e 42 79 74 65 73 4e 6f 64 65 41  this.nBytesNodeA
2d80: 64 64 72 65 73 73 2b 22 20 62 79 74 65 73 22 29  ddress+" bytes")
2d90: 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 6f 6c  ;.        consol
2da0: 65 2e 6c 6f 67 28 22 2d 3e 20 22 20 2b 20 74 68  e.log("-> " + th
2db0: 69 73 2e 6e 42 79 74 65 73 41 72 63 2b 74 68 69  is.nBytesArc+thi
2dc0: 73 2e 6e 42 79 74 65 73 4e 6f 64 65 41 64 64 72  s.nBytesNodeAddr
2dd0: 65 73 73 20 2b 20 22 20 2a 20 22 20 2b 20 74 68  ess + " * " + th
2de0: 69 73 2e 6e 41 72 63 20 2b 20 22 20 3d 20 22 20  is.nArc + " = " 
2df0: 2b 20 28 74 68 69 73 2e 6e 42 79 74 65 73 41 72  + (this.nBytesAr
2e00: 63 2b 74 68 69 73 2e 6e 42 79 74 65 73 4e 6f 64  c+this.nBytesNod
2e10: 65 41 64 64 72 65 73 73 29 2a 74 68 69 73 2e 6e  eAddress)*this.n
2e20: 41 72 63 20 2b 20 22 20 62 79 74 65 73 22 29 3b  Arc + " bytes");
2e30: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2e40: 74 68 69 73 2e 5f 63 72 65 61 74 65 4a 53 4f 4e  this._createJSON
2e50: 28 6e 4d 65 74 68 6f 64 29 3b 0a 20 20 20 20 7d  (nMethod);.    }
2e60: 0a 0a 20 20 20 20 5f 63 61 6c 63 4e 75 6d 42 79  ..    _calcNumBy
2e70: 74 65 73 4e 6f 64 65 41 64 64 72 65 73 73 20 28  tesNodeAddress (
2e80: 29 20 7b 0a 20 20 20 20 20 20 20 20 2f 2f 20 68  ) {.        // h
2e90: 6f 77 20 6d 61 6e 79 20 62 79 74 65 73 20 6e 65  ow many bytes ne
2ea0: 65 64 65 64 20 74 6f 20 73 74 6f 72 65 20 61 6c  eded to store al
2eb0: 6c 20 6e 6f 64 65 73 2f 61 72 63 73 20 69 6e 20  l nodes/arcs in 
2ec0: 74 68 65 20 62 69 6e 61 72 79 20 64 69 63 74 69  the binary dicti
2ed0: 6f 6e 61 72 79 0a 20 20 20 20 20 20 20 20 74 68  onary.        th
2ee0: 69 73 2e 6e 42 79 74 65 73 4e 6f 64 65 41 64 64  is.nBytesNodeAdd
2ef0: 72 65 73 73 20 3d 20 31 3b 0a 20 20 20 20 20 20  ress = 1;.      
2f00: 20 20 77 68 69 6c 65 20 28 28 28 74 68 69 73 2e    while (((this.
2f10: 6e 42 79 74 65 73 41 72 63 20 2b 20 74 68 69 73  nBytesArc + this
2f20: 2e 6e 42 79 74 65 73 4e 6f 64 65 41 64 64 72 65  .nBytesNodeAddre
2f30: 73 73 29 20 2a 20 74 68 69 73 2e 6e 41 72 63 29  ss) * this.nArc)
2f40: 20 3e 20 28 32 20 2a 2a 20 28 74 68 69 73 2e 6e   > (2 ** (this.n
2f50: 42 79 74 65 73 4e 6f 64 65 41 64 64 72 65 73 73  BytesNodeAddress
2f60: 20 2a 20 38 29 29 29 20 7b 0a 20 20 20 20 20 20   * 8))) {.      
2f70: 20 20 20 20 20 20 74 68 69 73 2e 6e 42 79 74 65        this.nByte
2f80: 73 4e 6f 64 65 41 64 64 72 65 73 73 20 2b 3d 20  sNodeAddress += 
2f90: 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
2fa0: 20 7d 0a 0a 20 20 20 20 5f 63 61 6c 63 4e 6f 64   }..    _calcNod
2fb0: 65 73 41 64 64 72 65 73 73 31 20 28 29 20 7b 0a  esAddress1 () {.
2fc0: 20 20 20 20 20 20 20 20 6c 65 74 20 6e 42 79 74          let nByt
2fd0: 65 73 4e 6f 64 65 20 3d 20 74 68 69 73 2e 6e 42  esNode = this.nB
2fe0: 79 74 65 73 41 72 63 20 2b 20 74 68 69 73 2e 6e  ytesArc + this.n
2ff0: 42 79 74 65 73 4e 6f 64 65 41 64 64 72 65 73 73  BytesNodeAddress
3000: 3b 0a 20 20 20 20 20 20 20 20 6c 65 74 20 69 41  ;.        let iA
3010: 64 64 72 20 3d 20 74 68 69 73 2e 6f 52 6f 6f 74  ddr = this.oRoot
3020: 2e 61 72 63 73 2e 73 69 7a 65 20 2a 20 6e 42 79  .arcs.size * nBy
3030: 74 65 73 4e 6f 64 65 3b 0a 20 20 20 20 20 20 20  tesNode;.       
3040: 20 66 6f 72 20 28 6c 65 74 20 6f 4e 6f 64 65 20   for (let oNode 
3050: 6f 66 20 74 68 69 73 2e 64 4d 69 6e 69 6d 69 7a  of this.dMinimiz
3060: 65 64 4e 6f 64 65 73 2e 76 61 6c 75 65 73 28 29  edNodes.values()
3070: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
3080: 6f 4e 6f 64 65 2e 61 64 64 72 20 3d 20 69 41 64  oNode.addr = iAd
3090: 64 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  dr;.            
30a0: 69 41 64 64 72 20 2b 3d 20 4d 61 74 68 2e 6d 61  iAddr += Math.ma
30b0: 78 28 6f 4e 6f 64 65 2e 61 72 63 73 2e 73 69 7a  x(oNode.arcs.siz
30c0: 65 2c 20 31 29 20 2a 20 6e 42 79 74 65 73 4e 6f  e, 1) * nBytesNo
30d0: 64 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  de;.        }.  
30e0: 20 20 7d 0a 0a 20 20 20 20 5f 63 72 65 61 74 65    }..    _create
30f0: 4a 53 4f 4e 20 28 6e 4d 65 74 68 6f 64 29 20 7b  JSON (nMethod) {
3100: 0a 20 20 20 20 20 20 20 20 2f 2a 0a 20 20 20 20  .        /*.    
3110: 20 20 20 20 20 20 20 20 46 6f 72 6d 61 74 20 6f          Format o
3120: 66 20 74 68 65 20 62 69 6e 61 72 79 20 69 6e 64  f the binary ind
3130: 65 78 61 62 6c 65 20 64 69 63 74 69 6f 6e 61 72  exable dictionar
3140: 79 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 45  y:.            E
3150: 61 63 68 20 73 65 63 74 69 6f 6e 20 69 73 20 73  ach section is s
3160: 65 70 61 72 61 74 65 64 20 77 69 74 68 20 34 20  eparated with 4 
3170: 62 79 74 65 73 20 6f 66 20 5c 30 0a 20 20 20 20  bytes of \0.    
3180: 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20          .       
3190: 20 20 20 20 20 2d 20 53 65 63 74 69 6f 6e 20 48       - Section H
31a0: 65 61 64 65 72 3a 0a 20 20 20 20 20 20 20 20 20  eader:.         
31b0: 20 20 20 20 20 20 20 2f 70 79 66 73 61 2f 5b 76         /pyfsa/[v
31c0: 65 72 73 69 6f 6e 5d 0a 20 20 20 20 20 20 20 20  ersion].        
31d0: 20 20 20 20 20 20 20 20 20 20 20 20 2a 20 76 65              * ve
31e0: 72 73 69 6f 6e 20 69 73 20 61 6e 20 41 53 43 49  rsion is an ASCI
31f0: 49 20 73 74 72 69 6e 67 0a 20 20 20 20 20 20 20  I string.       
3200: 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 20 20       .          
3210: 20 20 2d 20 53 65 63 74 69 6f 6e 20 49 6e 66 6f    - Section Info
3220: 72 6d 61 74 69 6f 6e 73 3a 0a 20 20 20 20 20 20  rmations:.      
3230: 20 20 20 20 20 20 20 20 20 20 2f 5b 74 61 67 5f            /[tag_
3240: 6c 61 6e 67 5d 0a 20 20 20 20 20 20 20 20 20 20  lang].          
3250: 20 20 20 20 20 20 2f 5b 6e 75 6d 62 65 72 20 6f        /[number o
3260: 66 20 63 68 61 72 73 5d 0a 20 20 20 20 20 20 20  f chars].       
3270: 20 20 20 20 20 20 20 20 20 2f 5b 6e 75 6d 62 65           /[numbe
3280: 72 20 6f 66 20 62 79 74 65 73 20 66 6f 72 20 65  r of bytes for e
3290: 61 63 68 20 61 72 63 5d 0a 20 20 20 20 20 20 20  ach arc].       
32a0: 20 20 20 20 20 20 20 20 20 2f 5b 6e 75 6d 62 65           /[numbe
32b0: 72 20 6f 66 20 62 79 74 65 73 20 66 6f 72 20 65  r of bytes for e
32c0: 61 63 68 20 61 64 64 72 65 73 73 20 6e 6f 64 65  ach address node
32d0: 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ].              
32e0: 20 20 2f 5b 6e 75 6d 62 65 72 20 6f 66 20 65 6e    /[number of en
32f0: 74 72 69 65 73 5d 0a 20 20 20 20 20 20 20 20 20  tries].         
3300: 20 20 20 20 20 20 20 2f 5b 6e 75 6d 62 65 72 20         /[number 
3310: 6f 66 20 6e 6f 64 65 73 5d 0a 20 20 20 20 20 20  of nodes].      
3320: 20 20 20 20 20 20 20 20 20 20 2f 5b 6e 75 6d 62            /[numb
3330: 65 72 20 6f 66 20 61 72 63 73 5d 0a 20 20 20 20  er of arcs].    
3340: 20 20 20 20 20 20 20 20 20 20 20 20 2f 5b 6e 75              /[nu
3350: 6d 62 65 72 20 6f 66 20 61 66 66 69 78 65 73 5d  mber of affixes]
3360: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3370: 20 20 20 20 20 2a 20 65 61 63 68 20 66 69 65 6c       * each fiel
3380: 64 20 69 73 20 61 20 41 53 43 49 49 20 73 74 72  d is a ASCII str
3390: 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20 20 20  ing.            
33a0: 20 20 20 20 2f 5b 73 74 65 6d 6d 69 6e 67 20 63      /[stemming c
33b0: 6f 64 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20  ode].           
33c0: 20 20 20 20 20 20 20 20 20 2a 20 22 53 22 20 6d           * "S" m
33d0: 65 61 6e 73 20 73 74 65 6d 73 20 61 72 65 20 67  eans stems are g
33e0: 65 6e 65 72 61 74 65 64 20 62 79 20 2f 73 75 66  enerated by /suf
33f0: 66 69 78 5f 63 6f 64 65 2f 2c 20 22 41 22 20 6d  fix_code/, "A" m
3400: 65 61 6e 73 20 74 68 65 79 20 61 72 65 20 67 65  eans they are ge
3410: 6e 65 72 61 74 65 64 20 62 79 20 2f 61 66 66 69  nerated by /affi
3420: 78 5f 63 6f 64 65 2f 0a 20 20 20 20 20 20 20 20  x_code/.        
3430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 65                Se
3440: 65 20 64 65 66 69 6e 65 53 75 66 66 69 78 43 6f  e defineSuffixCo
3450: 64 65 28 29 20 61 6e 64 20 64 65 66 69 6e 65 41  de() and defineA
3460: 66 66 69 78 43 6f 64 65 28 29 20 66 6f 72 20 64  ffixCode() for d
3470: 65 74 61 69 6c 73 2e 0a 20 20 20 20 20 20 20 20  etails..        
3480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 4e                "N
3490: 22 20 6d 65 61 6e 73 20 6e 6f 20 73 74 65 6d 6d  " means no stemm
34a0: 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20 20 20  ing.            
34b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 2d 20 53  .            - S
34c0: 65 63 74 69 6f 6e 20 56 61 6c 75 65 73 3a 0a 20  ection Values:. 
34d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34e0: 20 20 20 2a 20 61 20 6c 69 73 74 20 6f 66 20 73     * a list of s
34f0: 74 72 69 6e 67 73 20 65 6e 63 6f 64 65 64 20 69  trings encoded i
3500: 6e 20 62 69 6e 61 72 79 20 66 72 6f 6d 20 75 74  n binary from ut
3510: 66 2d 38 2c 20 65 61 63 68 20 76 61 6c 75 65 20  f-8, each value 
3520: 73 65 70 61 72 61 74 65 64 20 77 69 74 68 20 61  separated with a
3530: 20 74 61 62 75 6c 61 74 69 6f 6e 0a 20 20 20 20   tabulation.    
3540: 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20          .       
3550: 20 20 20 20 20 2d 20 53 65 63 74 69 6f 6e 20 57       - Section W
3560: 6f 72 64 20 47 72 61 70 68 20 28 6e 6f 64 65 73  ord Graph (nodes
3570: 20 2f 20 61 72 63 73 29 0a 20 20 20 20 20 20 20   / arcs).       
3580: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 20 41               * A
3590: 20 6c 69 73 74 20 6f 66 20 6e 6f 64 65 73 20 77   list of nodes w
35a0: 68 69 63 68 20 61 72 65 20 61 20 6c 69 73 74 20  hich are a list 
35b0: 6f 66 20 61 72 63 73 20 77 69 74 68 20 61 6e 20  of arcs with an 
35c0: 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e  address of the n
35d0: 65 78 74 20 6e 6f 64 65 2e 0a 20 20 20 20 20 20  ext node..      
35e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35f0: 53 65 65 20 44 61 77 67 4e 6f 64 65 2e 63 6f 6e  See DawgNode.con
3600: 76 54 6f 42 79 74 65 73 28 29 20 66 6f 72 20 64  vToBytes() for d
3610: 65 74 61 69 6c 73 2e 0a 20 20 20 20 20 20 20 20  etails..        
3620: 2a 2f 0a 0a 0a 20 20 20 20 20 20 20 20 20 20 20  */...           
3630: 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 0a 0a               ...
3640: 20 20 20 20 20 20 20 20 2f 2f 20 44 41 57 47 3a          // DAWG:
3650: 20 6e 6f 64 65 73 20 2f 20 61 72 63 73 0a 20 20   nodes / arcs.  
3660: 20 20 20 20 20 20 6c 65 74 20 73 42 79 44 69 63        let sByDic
3670: 20 3d 20 22 22 3b 0a 20 20 20 20 20 20 20 20 69   = "";.        i
3680: 66 20 28 6e 4d 65 74 68 6f 64 20 3d 3d 20 31 29  f (nMethod == 1)
3690: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73   {.            s
36a0: 42 79 44 69 63 20 3d 20 74 68 69 73 2e 6f 52 6f  ByDic = this.oRo
36b0: 6f 74 2e 63 6f 6e 76 54 6f 42 79 74 65 73 31 28  ot.convToBytes1(
36c0: 74 68 69 73 2e 6e 42 79 74 65 73 41 72 63 2c 20  this.nBytesArc, 
36d0: 74 68 69 73 2e 6e 42 79 74 65 73 4e 6f 64 65 41  this.nBytesNodeA
36e0: 64 64 72 65 73 73 29 3b 0a 20 20 20 20 20 20 20  ddress);.       
36f0: 20 20 20 20 20 66 6f 72 20 28 6c 65 74 20 6f 4e       for (let oN
3700: 6f 64 65 20 6f 66 20 74 68 69 73 2e 64 4d 69 6e  ode of this.dMin
3710: 69 6d 69 7a 65 64 4e 6f 64 65 73 2e 76 61 6c 75  imizedNodes.valu
3720: 65 73 28 29 29 20 7b 0a 20 20 20 20 20 20 20 20  es()) {.        
3730: 20 20 20 20 20 20 20 20 73 42 79 44 69 63 20 2b          sByDic +
3740: 3d 20 6f 4e 6f 64 65 2e 63 6f 6e 76 54 6f 42 79  = oNode.convToBy
3750: 74 65 73 31 28 74 68 69 73 2e 6e 42 79 74 65 73  tes1(this.nBytes
3760: 41 72 63 2c 20 74 68 69 73 2e 6e 42 79 74 65 73  Arc, this.nBytes
3770: 4e 6f 64 65 41 64 64 72 65 73 73 29 3b 0a 20 20  NodeAddress);.  
3780: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
3790: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 6c      }..        l
37a0: 65 74 20 6f 4a 53 4f 4e 20 3d 20 7b 0a 20 20 20  et oJSON = {.   
37b0: 20 20 20 20 20 20 20 20 20 22 73 4e 61 6d 65 22           "sName"
37c0: 3a 20 74 68 69 73 2e 73 4e 61 6d 65 2c 0a 20 20  : this.sName,.  
37d0: 20 20 20 20 20 20 20 20 20 20 22 6e 56 65 72 73            "nVers
37e0: 69 6f 6e 22 3a 20 74 68 69 73 2e 6e 4d 65 74 68  ion": this.nMeth
37f0: 6f 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  od,.            
3800: 22 73 48 65 61 64 65 72 22 3a 20 74 68 69 73 2e  "sHeader": this.
3810: 73 48 65 61 64 65 72 2c 0a 20 20 20 20 20 20 20  sHeader,.       
3820: 20 20 20 20 20 22 6c 41 72 63 56 61 6c 22 3a 20       "lArcVal": 
3830: 74 68 69 73 2e 6c 41 72 63 56 61 6c 2c 0a 20 20  this.lArcVal,.  
3840: 20 20 20 20 20 20 20 20 20 20 22 6e 41 72 63 56            "nArcV
3850: 61 6c 22 3a 20 74 68 69 73 2e 6e 41 72 63 56 61  al": this.nArcVa
3860: 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  l,.            "
3870: 62 79 44 69 63 22 3a 20 6f 43 6f 6e 76 2e 74 6f  byDic": oConv.to
3880: 48 65 78 61 64 65 63 69 6d 61 6c 53 74 72 69 6e  HexadecimalStrin
3890: 67 28 73 42 79 44 69 63 29 2c 0a 20 20 20 20 20  g(sByDic),.     
38a0: 20 20 20 20 20 20 20 22 73 4c 61 6e 67 22 3a 20         "sLang": 
38b0: 74 68 69 73 2e 73 4c 61 6e 67 2c 0a 20 20 20 20  this.sLang,.    
38c0: 20 20 20 20 20 20 20 20 22 6e 43 68 61 72 22 3a          "nChar":
38d0: 20 74 68 69 73 2e 6e 43 68 61 72 2c 0a 20 20 20   this.nChar,.   
38e0: 20 20 20 20 20 20 20 20 20 22 6e 42 79 74 65 73           "nBytes
38f0: 41 72 63 22 3a 20 74 68 69 73 2e 6e 42 79 74 65  Arc": this.nByte
3900: 73 41 72 63 2c 0a 20 20 20 20 20 20 20 20 20 20  sArc,.          
3910: 20 20 22 6e 42 79 74 65 73 4e 6f 64 65 41 64 64    "nBytesNodeAdd
3920: 72 65 73 73 22 3a 20 74 68 69 73 2e 6e 42 79 74  ress": this.nByt
3930: 65 73 4e 6f 64 65 41 64 64 72 65 73 73 2c 0a 20  esNodeAddress,. 
3940: 20 20 20 20 20 20 20 20 20 20 20 22 6e 45 6e 74             "nEnt
3950: 72 69 65 73 22 3a 20 74 68 69 73 2e 6e 45 6e 74  ries": this.nEnt
3960: 72 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ry,.            
3970: 22 6e 4e 6f 64 65 22 3a 20 74 68 69 73 2e 6e 4e  "nNode": this.nN
3980: 6f 64 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ode,.           
3990: 20 22 6e 41 72 63 22 3a 20 74 68 69 73 2e 6e 41   "nArc": this.nA
39a0: 72 63 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  rc,.            
39b0: 22 6e 41 66 66 22 3a 20 74 68 69 73 2e 6e 41 66  "nAff": this.nAf
39c0: 66 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  f,.            "
39d0: 63 53 74 65 6d 6d 69 6e 67 22 3a 20 74 68 69 73  cStemming": this
39e0: 2e 63 53 74 65 6d 6d 69 6e 67 2c 0a 20 20 20 20  .cStemming,.    
39f0: 20 20 20 20 20 20 20 20 22 6e 54 61 67 22 3a 20          "nTag": 
3a00: 74 68 69 73 2e 6e 54 61 67 2c 0a 20 20 20 20 20  this.nTag,.     
3a10: 20 20 20 20 20 20 20 22 64 43 68 61 72 22 3a 20         "dChar": 
3a20: 74 68 69 73 2e 64 43 68 61 72 2c 0a 20 20 20 20  this.dChar,.    
3a30: 20 20 20 20 20 20 20 20 22 5f 61 72 63 4d 61 73          "_arcMas
3a40: 6b 22 3a 20 74 68 69 73 2e 5f 61 72 63 4d 61 73  k": this._arcMas
3a50: 6b 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  k,.            "
3a60: 5f 66 69 6e 61 6c 4e 6f 64 65 4d 61 73 6b 22 3a  _finalNodeMask":
3a70: 20 74 68 69 73 2e 5f 66 69 6e 61 6c 4e 6f 64 65   this._finalNode
3a80: 4d 61 73 6b 2c 0a 20 20 20 20 20 20 20 20 20 20  Mask,.          
3a90: 20 20 22 5f 6c 61 73 74 41 72 63 4d 61 73 6b 22    "_lastArcMask"
3aa0: 3a 20 74 68 69 73 2e 5f 6c 61 73 74 41 72 63 4d  : this._lastArcM
3ab0: 61 73 6b 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ask,.           
3ac0: 20 22 5f 61 64 64 72 42 69 74 4d 61 73 6b 22 3a   "_addrBitMask":
3ad0: 20 74 68 69 73 2e 5f 61 64 64 72 42 69 74 4d 61   this._addrBitMa
3ae0: 73 6b 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  sk,.            
3af0: 22 6e 42 79 74 65 73 4f 66 66 73 65 74 22 3a 20  "nBytesOffset": 
3b00: 74 68 69 73 2e 6e 42 79 74 65 73 4f 66 66 73 65  this.nBytesOffse
3b10: 74 0a 20 20 20 20 20 20 20 20 7d 3b 0a 20 20 20  t.        };.   
3b20: 20 7d 0a 7d 0a 0a 0a 63 6f 6e 73 74 20 6f 4e 6f   }.}...const oNo
3b30: 64 65 43 6f 75 6e 74 65 72 20 3d 20 7b 0a 20 20  deCounter = {.  
3b40: 20 20 6e 4e 65 78 74 49 64 3a 20 30 2c 0a 0a 20    nNextId: 0,.. 
3b50: 20 20 20 67 65 74 49 64 3a 20 66 75 6e 63 74 69     getId: functi
3b60: 6f 6e 20 28 29 20 7b 0a 20 20 20 20 20 20 20 20  on () {.        
3b70: 74 68 69 73 2e 6e 4e 65 78 74 49 64 20 2b 3d 20  this.nNextId += 
3b80: 31 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  1;.        retur
3b90: 6e 20 74 68 69 73 2e 6e 4e 65 78 74 49 64 2d 31  n this.nNextId-1
3ba0: 3b 0a 20 20 20 20 7d 2c 0a 0a 20 20 20 20 72 65  ;.    },..    re
3bb0: 73 65 74 3a 20 66 75 6e 63 74 69 6f 6e 20 28 29  set: function ()
3bc0: 20 7b 0a 20 20 20 20 20 20 20 20 74 68 69 73 2e   {.        this.
3bd0: 6e 4e 65 78 74 49 64 20 3d 20 30 3b 0a 20 20 20  nNextId = 0;.   
3be0: 20 7d 0a 7d 0a 0a 0a 63 6c 61 73 73 20 44 61 77   }.}...class Daw
3bf0: 67 4e 6f 64 65 20 7b 0a 0a 20 20 20 20 63 6f 6e  gNode {..    con
3c00: 73 74 72 75 63 74 6f 72 20 28 29 20 7b 0a 20 20  structor () {.  
3c10: 20 20 20 20 20 20 74 68 69 73 2e 69 20 3d 20 6f        this.i = o
3c20: 4e 6f 64 65 43 6f 75 6e 74 65 72 2e 67 65 74 49  NodeCounter.getI
3c30: 64 28 29 3b 0a 20 20 20 20 20 20 20 20 74 68 69  d();.        thi
3c40: 73 2e 66 69 6e 61 6c 20 3d 20 66 61 6c 73 65 3b  s.final = false;
3c50: 0a 20 20 20 20 20 20 20 20 74 68 69 73 2e 61 72  .        this.ar
3c60: 63 73 20 3d 20 6e 65 77 20 4d 61 70 28 29 3b 20  cs = new Map(); 
3c70: 20 2f 2f 20 6b 65 79 3a 20 61 72 63 20 76 61 6c   // key: arc val
3c80: 75 65 3b 20 76 61 6c 75 65 3a 20 61 20 6e 6f 64  ue; value: a nod
3c90: 65 0a 20 20 20 20 20 20 20 20 74 68 69 73 2e 61  e.        this.a
3ca0: 64 64 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ddr = 0;        
3cb0: 20 20 2f 2f 20 61 64 64 72 65 73 73 20 69 6e 20    // address in 
3cc0: 74 68 65 20 62 69 6e 61 72 79 20 64 69 63 74 69  the binary dicti
3cd0: 6f 6e 61 72 79 0a 20 20 20 20 20 20 20 20 74 68  onary.        th
3ce0: 69 73 2e 70 6f 73 20 3d 20 30 3b 20 20 20 20 20  is.pos = 0;     
3cf0: 20 20 20 20 20 20 2f 2f 20 70 6f 73 69 74 69 6f        // positio
3d00: 6e 20 69 6e 20 74 68 65 20 62 69 6e 61 72 79 20  n in the binary 
3d10: 64 69 63 74 69 6f 6e 61 72 79 20 28 76 65 72 73  dictionary (vers
3d20: 69 6f 6e 20 32 29 0a 20 20 20 20 20 20 20 20 74  ion 2).        t
3d30: 68 69 73 2e 73 69 7a 65 20 3d 20 30 3b 20 20 20  his.size = 0;   
3d40: 20 20 20 20 20 20 20 2f 2f 20 73 69 7a 65 20 6f         // size o
3d50: 66 20 6e 6f 64 65 20 69 6e 20 62 79 74 65 73 20  f node in bytes 
3d60: 28 76 65 72 73 69 6f 6e 20 33 29 0a 20 20 20 20  (version 3).    
3d70: 7d 0a 0a 20 20 20 20 5f 5f 73 74 72 5f 5f 20 28  }..    __str__ (
3d80: 29 20 7b 0a 20 20 20 20 20 20 20 20 2f 2f 20 43  ) {.        // C
3d90: 61 75 74 69 6f 6e 21 20 74 68 69 73 20 66 75 6e  aution! this fun
3da0: 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 66 6f  ction is used fo
3db0: 72 20 68 61 73 68 69 6e 67 20 61 6e 64 20 63 6f  r hashing and co
3dc0: 6d 70 61 72 69 73 6f 6e 21 0a 20 20 20 20 20 20  mparison!.      
3dd0: 20 20 6c 65 74 20 6c 20 3d 20 5b 5d 3b 0a 20 20    let l = [];.  
3de0: 20 20 20 20 20 20 69 66 20 28 74 68 69 73 2e 66        if (this.f
3df0: 69 6e 61 6c 29 20 7b 0a 20 20 20 20 20 20 20 20  inal) {.        
3e00: 20 20 20 20 6c 2e 70 75 73 68 28 22 31 22 29 3b      l.push("1");
3e10: 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20  .        } else 
3e20: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 2e  {.            l.
3e30: 70 75 73 68 28 22 30 22 29 3b 0a 20 20 20 20 20  push("0");.     
3e40: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66 6f 72     }.        for
3e50: 20 28 6c 65 74 20 5b 6b 65 79 2c 20 6e 6f 64 65   (let [key, node
3e60: 5d 20 6f 66 20 74 68 69 73 2e 61 72 63 73 2e 65  ] of this.arcs.e
3e70: 6e 74 72 69 65 73 28 29 29 20 7b 0a 20 20 20 20  ntries()) {.    
3e80: 20 20 20 20 20 20 20 20 6c 2e 70 75 73 68 28 6b          l.push(k
3e90: 65 79 2e 74 6f 53 74 72 69 6e 67 28 29 29 3b 0a  ey.toString());.
3ea0: 20 20 20 20 20 20 20 20 20 20 20 20 6c 2e 70 75              l.pu
3eb0: 73 68 28 6e 6f 64 65 2e 69 2e 74 6f 53 74 72 69  sh(node.i.toStri
3ec0: 6e 67 28 29 29 3b 0a 20 20 20 20 20 20 20 20 7d  ng());.        }
3ed0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
3ee0: 6c 2e 6a 6f 69 6e 28 22 5f 22 29 3b 0a 20 20 20  l.join("_");.   
3ef0: 20 7d 0a 0a 20 20 20 20 5f 5f 68 61 73 68 5f 5f   }..    __hash__
3f00: 20 28 29 20 7b 0a 20 20 20 20 20 20 20 20 2f 2f   () {.        //
3f10: 20 55 73 65 64 20 61 73 20 61 20 6b 65 79 20 69   Used as a key i
3f20: 6e 20 61 20 70 79 74 68 6f 6e 20 64 69 63 74 69  n a python dicti
3f30: 6f 6e 61 72 79 2e 0a 20 20 20 20 20 20 20 20 72  onary..        r
3f40: 65 74 75 72 6e 20 74 68 69 73 2e 5f 5f 73 74 72  eturn this.__str
3f50: 5f 5f 28 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  __();.    }..   
3f60: 20 5f 5f 65 71 5f 5f 20 28 6f 74 68 65 72 29 20   __eq__ (other) 
3f70: 7b 0a 20 20 20 20 20 20 20 20 2f 2f 20 55 73 65  {.        // Use
3f80: 64 20 61 73 20 61 20 6b 65 79 20 69 6e 20 61 20  d as a key in a 
3f90: 70 79 74 68 6f 6e 20 64 69 63 74 69 6f 6e 61 72  python dictionar
3fa0: 79 2e 0a 20 20 20 20 20 20 20 20 2f 2f 20 4e 6f  y..        // No
3fb0: 64 65 73 20 61 72 65 20 65 71 75 69 76 61 6c 65  des are equivale
3fc0: 6e 74 20 69 66 20 74 68 65 79 20 68 61 76 65 20  nt if they have 
3fd0: 69 64 65 6e 74 69 63 61 6c 20 61 72 63 73 2c 20  identical arcs, 
3fe0: 61 6e 64 20 65 61 63 68 20 69 64 65 6e 74 69 63  and each identic
3ff0: 61 6c 20 61 72 63 20 6c 65 61 64 73 20 74 6f 20  al arc leads to 
4000: 69 64 65 6e 74 69 63 61 6c 20 73 74 61 74 65 73  identical states
4010: 2e 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
4020: 20 74 68 69 73 2e 5f 5f 73 74 72 5f 5f 28 29 20   this.__str__() 
4030: 3d 3d 20 6f 74 68 65 72 2e 5f 5f 73 74 72 5f 5f  == other.__str__
4040: 28 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73  ();.    }..    s
4050: 6f 72 74 41 72 63 73 20 28 64 56 61 6c 4f 63 63  ortArcs (dValOcc
4060: 75 72 29 20 7b 0a 20 20 20 20 20 20 20 20 6c 65  ur) {.        le
4070: 74 20 6c 54 65 6d 70 20 3d 20 74 68 69 73 2e 61  t lTemp = this.a
4080: 72 63 73 2e 65 6e 74 72 69 65 73 28 29 3b 0a 20  rcs.entries();. 
4090: 20 20 20 20 20 20 20 6c 54 65 6d 70 2e 73 6f 72         lTemp.sor
40a0: 74 28 66 75 6e 63 74 69 6f 6e 20 28 61 2c 20 62  t(function (a, b
40b0: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
40c0: 69 66 20 28 64 56 61 6c 4f 63 63 75 72 2e 67 65  if (dValOccur.ge
40d0: 74 28 61 5b 30 5d 2c 20 30 29 20 3e 20 64 56 61  t(a[0], 0) > dVa
40e0: 6c 4f 63 63 75 72 2e 67 65 74 28 62 5b 30 5d 2c  lOccur.get(b[0],
40f0: 20 30 29 29 0a 20 20 20 20 20 20 20 20 20 20 20   0)).           
4100: 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a       return -1;.
4110: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28              if (
4120: 64 56 61 6c 4f 63 63 75 72 2e 67 65 74 28 61 5b  dValOccur.get(a[
4130: 30 5d 2c 20 30 29 20 3c 20 64 56 61 6c 4f 63 63  0], 0) < dValOcc
4140: 75 72 2e 67 65 74 28 62 5b 30 5d 2c 20 30 29 29  ur.get(b[0], 0))
4150: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
4160: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
4170: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b         return 0;
4180: 0a 20 20 20 20 20 20 20 20 7d 29 3b 0a 20 20 20  .        });.   
4190: 20 20 20 20 20 74 68 69 73 2e 61 72 63 73 20 3d       this.arcs =
41a0: 20 6e 65 77 20 4d 61 70 28 6c 54 65 6d 70 29 3b   new Map(lTemp);
41b0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2f 20 56  .    }..    // V
41c0: 45 52 53 49 4f 4e 20 31 20 3d 3d 3d 3d 3d 3d 3d  ERSION 1 =======
41d0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
41e0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
41f0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
4200: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
4210: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
4220: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 20  ==============. 
4230: 20 20 20 63 6f 6e 76 54 6f 42 79 74 65 73 31 20     convToBytes1 
4240: 28 6e 42 79 74 65 73 41 72 63 2c 20 6e 42 79 74  (nBytesArc, nByt
4250: 65 73 4e 6f 64 65 41 64 64 72 65 73 73 29 20 7b  esNodeAddress) {
4260: 0a 20 20 20 20 20 20 20 20 2f 2a 0a 20 20 20 20  .        /*.    
4270: 20 20 20 20 20 20 20 20 4e 6f 64 65 20 73 63 68          Node sch
4280: 65 6d 65 3a 0a 20 20 20 20 20 20 20 20 20 20 20  eme:.           
4290: 20 2d 20 41 72 63 20 6c 65 6e 67 74 68 20 69 73   - Arc length is
42a0: 20 64 65 66 69 6e 65 64 20 62 79 20 6e 42 79 74   defined by nByt
42b0: 65 73 41 72 63 0a 20 20 20 20 20 20 20 20 20 20  esArc.          
42c0: 20 20 2d 20 41 64 64 72 65 73 73 20 6c 65 6e 67    - Address leng
42d0: 74 68 20 69 73 20 64 65 66 69 6e 65 64 20 62 79  th is defined by
42e0: 20 6e 42 79 74 65 73 4e 6f 64 65 41 64 64 72 65   nBytesNodeAddre
42f0: 73 73 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ss.             
4300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 20                . 
4320: 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20             |    
4330: 20 20 20 20 20 20 20 20 20 20 20 20 41 72 63 20              Arc 
4340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
4350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4360: 20 20 20 20 20 20 20 20 20 41 64 64 72 65 73 73           Address
4370: 20 6f 66 20 6e 65 78 74 20 6e 6f 64 65 20 20 20   of next node   
4380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4390: 20 20 20 20 20 20 20 7c 0a 20 20 20 20 20 20 20         |.       
43a0: 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20       |          
43b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
43c0: 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20           |      
43d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
43e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
43f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4410: 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   |.             
4420: 2f 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /---------------
4430: 5c 20 2f 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  \ /-------------
4440: 2d 2d 5c 20 2f 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  --\ /-----------
4450: 2d 2d 2d 2d 5c 20 2f 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----\ /---------
4460: 2d 2d 2d 2d 2d 2d 5c 20 2f 2d 2d 2d 2d 2d 2d 2d  ------\ /-------
4470: 2d 2d 2d 2d 2d 2d 2d 2d 5c 20 2f 2d 2d 2d 2d 2d  --------\ /-----
4480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 5c 0a 20 20 20 20  ----------\.    
4490: 20 20 20 20 20 20 20 20 20 7c 20 7c 20 7c 20 7c           | | | |
44a0: 20 7c 20 7c 20 7c 20 7c 20 7c 20 7c 20 7c 20 7c   | | | | | | | |
44b0: 20 7c 20 7c 20 7c 20 7c 20 7c 20 7c 20 7c 20 7c   | | | | | | | |
44c0: 20 7c 20 7c 20 7c 20 7c 20 7c 20 7c 20 7c 20 7c   | | | | | | | |
44d0: 20 7c 20 7c 20 7c 20 7c 20 7c 20 7c 20 7c 20 7c   | | | | | | | |
44e0: 20 7c 20 7c 20 7c 20 7c 20 7c 20 7c 20 7c 20 7c   | | | | | | | |
44f0: 20 7c 20 7c 20 7c 20 7c 20 7c 20 7c 20 7c 20 7c   | | | | | | | |
4500: 20 7c 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20   | |.           
4510: 20 20 5c 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    \-------------
4520: 2d 2d 2f 20 5c 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  --/ \-----------
4530: 2d 2d 2d 2d 2f 20 5c 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----/ \---------
4540: 2d 2d 2d 2d 2d 2d 2f 20 5c 2d 2d 2d 2d 2d 2d 2d  ------/ \-------
4550: 2d 2d 2d 2d 2d 2d 2d 2d 2f 20 5c 2d 2d 2d 2d 2d  --------/ \-----
4560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2f 20 5c 2d 2d 2d  ----------/ \---
4570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2f 0a 20 20  ------------/.  
4580: 20 20 20 20 20 20 20 20 20 20 20 5b 2e 2e 2e 5d             [...]
4590: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2d  .             /-
45a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 5c 20  --------------\ 
45b0: 2f 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /---------------
45c0: 5c 20 2f 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  \ /-------------
45d0: 2d 2d 5c 20 2f 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  --\ /-----------
45e0: 2d 2d 2d 2d 5c 20 2f 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----\ /---------
45f0: 2d 2d 2d 2d 2d 2d 5c 20 2f 2d 2d 2d 2d 2d 2d 2d  ------\ /-------
4600: 2d 2d 2d 2d 2d 2d 2d 2d 5c 0a 20 20 20 20 20 20  --------\.      
4610: 20 20 20 20 20 20 20 7c 20 7c 20 7c 20 7c 20 7c         | | | | |
4620: 20 7c 20 7c 20 7c 20 7c 20 7c 20 7c 20 7c 20 7c   | | | | | | | |
4630: 20 7c 20 7c 20 7c 20 7c 20 7c 20 7c 20 7c 20 7c   | | | | | | | |
4640: 20 7c 20 7c 20 7c 20 7c 20 7c 20 7c 20 7c 20 7c   | | | | | | | |
4650: 20 7c 20 7c 20 7c 20 7c 20 7c 20 7c 20 7c 20 7c   | | | | | | | |
4660: 20 7c 20 7c 20 7c 20 7c 20 7c 20 7c 20 7c 20 7c   | | | | | | | |
4670: 20 7c 20 7c 20 7c 20 7c 20 7c 20 7c 20 7c 20 7c   | | | | | | | |
4680: 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   |.             
4690: 5c 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  \---------------
46a0: 2f 20 5c 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  / \-------------
46b0: 2d 2d 2f 20 5c 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  --/ \-----------
46c0: 2d 2d 2d 2d 2f 20 5c 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----/ \---------
46d0: 2d 2d 2d 2d 2d 2d 2f 20 5c 2d 2d 2d 2d 2d 2d 2d  ------/ \-------
46e0: 2d 2d 2d 2d 2d 2d 2d 2d 2f 20 5c 2d 2d 2d 2d 2d  --------/ \-----
46f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2f 0a 20 20 20 20  ----------/.    
4700: 20 20 20 20 20 20 20 20 20 20 5e 20 5e 0a 20 20            ^ ^.  
4710: 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 7c 0a              | |.
4720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
4730: 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  |.              
4740: 7c 20 20 5c 5f 5f 5f 20 69 66 20 31 2c 20 6c 61  |  \___ if 1, la
4750: 73 74 20 61 72 63 20 6f 66 20 74 68 69 73 20 6e  st arc of this n
4760: 6f 64 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  ode.            
4770: 20 20 20 5c 5f 5f 5f 5f 5f 20 69 66 20 31 2c 20     \_____ if 1, 
4780: 74 68 69 73 20 6e 6f 64 65 20 69 73 20 66 69 6e  this node is fin
4790: 61 6c 20 28 6f 6e 6c 79 20 6f 6e 20 74 68 65 20  al (only on the 
47a0: 66 69 72 73 74 20 61 72 63 29 0a 20 20 20 20 20  first arc).     
47b0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 6c 65     */.        le
47c0: 74 20 6e 41 72 63 20 3d 20 74 68 69 73 2e 61 72  t nArc = this.ar
47d0: 63 73 2e 73 69 7a 65 3b 0a 20 20 20 20 20 20 20  cs.size;.       
47e0: 20 6c 65 74 20 6e 46 69 6e 61 6c 4e 6f 64 65 4d   let nFinalNodeM
47f0: 61 73 6b 20 3d 20 31 20 3c 3c 20 28 28 6e 42 79  ask = 1 << ((nBy
4800: 74 65 73 41 72 63 2a 38 29 2d 31 29 3b 0a 20 20  tesArc*8)-1);.  
4810: 20 20 20 20 20 20 6c 65 74 20 6e 46 69 6e 61 6c        let nFinal
4820: 41 72 63 4d 61 73 6b 20 3d 20 31 20 3c 3c 20 28  ArcMask = 1 << (
4830: 28 6e 42 79 74 65 73 41 72 63 2a 38 29 2d 32 29  (nBytesArc*8)-2)
4840: 3b 0a 20 20 20 20 20 20 20 20 69 66 20 28 74 68  ;.        if (th
4850: 69 73 2e 61 72 63 73 2e 73 69 7a 65 20 3d 3d 20  is.arcs.size == 
4860: 30 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0) {.           
4870: 20 6c 65 74 20 76 61 6c 20 3d 20 6e 46 69 6e 61   let val = nFina
4880: 6c 4e 6f 64 65 4d 61 73 6b 20 7c 20 6e 46 69 6e  lNodeMask | nFin
4890: 61 6c 41 72 63 4d 61 73 6b 3b 0a 20 20 20 20 20  alArcMask;.     
48a0: 20 20 20 20 20 20 20 6c 65 74 20 62 79 20 3d 20         let by = 
48b0: 6f 43 6f 6e 76 2e 74 6f 48 65 78 53 74 72 69 6e  oConv.toHexStrin
48c0: 67 28 76 61 6c 2c 20 6e 42 79 74 65 73 41 72 63  g(val, nBytesArc
48d0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  );.            b
48e0: 79 20 2b 3d 20 6f 43 6f 6e 76 2e 74 6f 48 65 78  y += oConv.toHex
48f0: 53 74 72 69 6e 67 28 30 2c 20 6e 42 79 74 65 73  String(0, nBytes
4900: 4e 6f 64 65 41 64 64 72 65 73 73 29 3b 0a 20 20  NodeAddress);.  
4910: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
4920: 20 62 79 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   by;.        }. 
4930: 20 20 20 20 20 20 20 6c 65 74 20 62 79 20 3d 20         let by = 
4940: 5b 5d 3b 0a 20 20 20 20 20 20 20 20 6c 65 74 20  [];.        let 
4950: 69 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 66  i = 1;.        f
4960: 6f 72 20 28 6c 65 74 20 61 72 63 20 6f 66 20 74  or (let arc of t
4970: 68 69 73 2e 61 72 63 73 2e 6b 65 79 73 28 29 29  his.arcs.keys())
4980: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c   {.            l
4990: 65 74 20 76 61 6c 20 3d 20 61 72 63 3b 0a 20 20  et val = arc;.  
49a0: 20 20 20 20 20 20 20 20 20 20 69 66 20 28 69 20            if (i 
49b0: 3d 3d 20 31 20 26 26 20 74 68 69 73 2e 66 69 6e  == 1 && this.fin
49c0: 61 6c 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  al) {.          
49d0: 20 20 20 20 20 20 76 61 6c 20 3d 20 76 61 6c 20        val = val 
49e0: 7c 20 6e 46 69 6e 61 6c 4e 6f 64 65 4d 61 73 6b  | nFinalNodeMask
49f0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
4a00: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28              if (
4a10: 69 20 3d 3d 20 6e 41 72 63 29 20 7b 0a 20 20 20  i == nArc) {.   
4a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 76 61 6c               val
4a30: 20 3d 20 76 61 6c 20 7c 20 6e 46 69 6e 61 6c 41   = val | nFinalA
4a40: 72 63 4d 61 73 6b 3b 0a 20 20 20 20 20 20 20 20  rcMask;.        
4a50: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
4a60: 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20    i++;.         
4a70: 20 20 20 62 79 20 2b 3d 20 6f 43 6f 6e 76 2e 74     by += oConv.t
4a80: 6f 48 65 78 53 74 72 69 6e 67 28 76 61 6c 2c 20  oHexString(val, 
4a90: 6e 42 79 74 65 73 41 72 63 29 3b 0a 20 20 20 20  nBytesArc);.    
4aa0: 20 20 20 20 20 20 20 20 62 79 20 2b 3d 20 6f 43          by += oC
4ab0: 6f 6e 76 2e 74 6f 48 65 78 53 74 72 69 6e 67 28  onv.toHexString(
4ac0: 74 68 69 73 2e 61 72 63 73 2e 67 65 74 28 61 72  this.arcs.get(ar
4ad0: 63 29 2e 61 64 64 72 2c 20 6e 42 79 74 65 73 4e  c).addr, nBytesN
4ae0: 6f 64 65 41 64 64 72 65 73 73 29 3b 0a 20 20 20  odeAddress);.   
4af0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
4b00: 65 74 75 72 6e 20 62 79 3b 0a 20 20 20 20 7d 0a  eturn by;.    }.
4b10: 7d 0a 0a 0a 63 6f 6e 73 74 20 6f 43 6f 6e 76 20  }...const oConv 
4b20: 3d 20 7b 0a 20 20 20 20 74 6f 48 65 78 53 74 72  = {.    toHexStr
4b30: 69 6e 67 3a 20 66 75 6e 63 74 69 6f 6e 20 28 6e  ing: function (n
4b40: 56 61 6c 2c 20 6e 42 79 74 65 29 20 7b 0a 20 20  Val, nByte) {.  
4b50: 20 20 20 20 20 20 2f 2f 20 6e 56 61 6c 3a 20 76        // nVal: v
4b60: 61 6c 75 65 20 74 6f 20 63 6f 6e 76 65 72 74 2c  alue to convert,
4b70: 20 6e 42 79 74 65 3a 20 6e 75 6d 62 65 72 20 6f   nByte: number o
4b80: 66 20 62 79 74 65 73 0a 20 20 20 20 20 20 20 20  f bytes.        
4b90: 6c 65 74 20 73 48 65 78 56 61 6c 20 3d 20 6e 56  let sHexVal = nV
4ba0: 61 6c 2e 74 6f 53 74 72 69 6e 67 28 31 36 29 3b  al.toString(16);
4bb0: 20 2f 2f 20 63 6f 6e 76 65 72 73 69 6f 6e 20 74   // conversion t
4bc0: 6f 20 68 65 78 61 64 65 63 69 6d 61 6c 20 73 74  o hexadecimal st
4bd0: 72 69 6e 67 0a 20 20 20 20 20 20 20 20 69 66 20  ring.        if 
4be0: 28 73 48 65 78 56 61 6c 2e 6c 65 6e 67 74 68 20  (sHexVal.length 
4bf0: 3c 20 28 6e 42 79 74 65 2a 32 29 29 20 7b 0a 20  < (nByte*2)) {. 
4c00: 20 20 20 20 20 20 20 20 20 20 20 73 48 65 78 56             sHexV
4c10: 61 6c 20 3d 20 22 30 22 2e 72 65 70 65 61 74 28  al = "0".repeat(
4c20: 28 6e 42 79 74 65 2a 32 29 20 2d 20 73 48 65 78  (nByte*2) - sHex
4c30: 56 61 6c 2e 6c 65 6e 67 74 68 29 20 2b 20 73 48  Val.length) + sH
4c40: 65 78 56 61 6c 3b 0a 20 20 20 20 20 20 20 20 7d  exVal;.        }
4c50: 20 65 6c 73 65 20 69 66 20 28 73 48 65 78 56 61   else if (sHexVa
4c60: 6c 2e 6c 65 6e 67 74 68 20 3d 3d 20 28 6e 42 79  l.length == (nBy
4c70: 74 65 2a 32 29 29 20 7b 0a 20 20 20 20 20 20 20  te*2)) {.       
4c80: 20 20 20 20 20 72 65 74 75 72 6e 20 73 48 65 78       return sHex
4c90: 56 61 6c 0a 20 20 20 20 20 20 20 20 7d 20 65 6c  Val.        } el
4ca0: 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  se {.           
4cb0: 20 74 68 72 6f 77 20 22 43 6f 6e 76 65 72 73 69   throw "Conversi
4cc0: 6f 6e 20 74 6f 20 62 79 74 65 20 73 74 72 69 6e  on to byte strin
4cd0: 67 3a 20 76 61 6c 75 65 20 62 69 67 67 65 72 20  g: value bigger 
4ce0: 74 68 61 6e 20 61 6c 6c 6f 77 65 64 2e 22 3b 0a  than allowed.";.
4cf0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a          }.    }.
4d00: 7d 0a 0a 0a 2f 2f 20 41 6e 6f 74 68 65 72 20 61  }...// Another a
4d10: 74 74 65 6d 70 74 20 74 6f 20 73 6f 72 74 20 6e  ttempt to sort n
4d20: 6f 64 65 20 61 72 63 73 0a 0a 63 6f 6e 73 74 20  ode arcs..const 
4d30: 5f 64 43 68 61 72 4f 72 64 65 72 20 3d 20 6e 65  _dCharOrder = ne
4d40: 77 20 4d 61 70 28 5b 20 5b 22 22 2c 20 6e 65 77  w Map([ ["", new
4d50: 20 4d 61 70 28 29 5d 20 5d 29 3b 0a 2f 2f 20 6b   Map()] ]);.// k
4d60: 65 79 3a 20 70 72 65 76 69 6f 75 73 20 63 68 61  ey: previous cha
4d70: 72 2c 20 76 61 6c 75 65 3a 20 64 69 63 74 69 6f  r, value: dictio
4d80: 6e 61 72 79 20 6f 66 20 63 68 61 72 73 20 7b 63  nary of chars {c
4d90: 3a 20 6e 56 61 6c 75 65 7d 0a 0a 0a 66 75 6e 63  : nValue}...func
4da0: 74 69 6f 6e 20 61 64 64 57 6f 72 64 54 6f 43 68  tion addWordToCh
4db0: 61 72 44 69 63 74 20 28 73 57 6f 72 64 29 20 7b  arDict (sWord) {
4dc0: 0a 20 20 20 20 6c 65 74 20 63 50 72 65 76 69 6f  .    let cPrevio
4dd0: 75 73 20 3d 20 22 22 3b 0a 20 20 20 20 66 6f 72  us = "";.    for
4de0: 20 28 6c 65 74 20 63 43 68 61 72 20 6f 66 20 73   (let cChar of s
4df0: 57 6f 72 64 29 20 7b 0a 20 20 20 20 20 20 20 20  Word) {.        
4e00: 69 66 20 28 21 5f 64 43 68 61 72 4f 72 64 65 72  if (!_dCharOrder
4e10: 2e 67 65 74 28 63 50 72 65 76 69 6f 75 73 29 29  .get(cPrevious))
4e20: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 5f   {.            _
4e30: 64 43 68 61 72 4f 72 64 65 72 2e 73 65 74 28 63  dCharOrder.set(c
4e40: 50 72 65 76 69 6f 75 73 2c 20 6e 65 77 20 4d 61  Previous, new Ma
4e50: 70 28 29 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  p());.        }.
4e60: 20 20 20 20 20 20 20 20 5f 64 43 68 61 72 4f 72          _dCharOr
4e70: 64 65 72 2e 67 65 74 28 63 50 72 65 76 69 6f 75  der.get(cPreviou
4e80: 73 29 2e 73 65 74 28 63 43 68 61 72 2c 20 5f 64  s).set(cChar, _d
4e90: 43 68 61 72 4f 72 64 65 72 2e 67 65 74 28 63 50  CharOrder.get(cP
4ea0: 72 65 76 69 6f 75 73 29 2e 67 6c 5f 67 65 74 28  revious).gl_get(
4eb0: 63 43 68 61 72 2c 20 30 29 20 2b 20 31 29 3b 0a  cChar, 0) + 1);.
4ec0: 20 20 20 20 20 20 20 20 63 50 72 65 76 69 6f 75          cPreviou
4ed0: 73 20 3d 20 63 43 68 61 72 3b 0a 20 20 20 20 7d  s = cChar;.    }
4ee0: 0a 7d 0a 0a 66 75 6e 63 74 69 6f 6e 20 67 65 74  .}..function get
4ef0: 43 68 61 72 4f 72 64 65 72 41 66 74 65 72 43 68  CharOrderAfterCh
4f00: 61 72 20 28 63 43 68 61 72 29 20 7b 0a 20 20 20  ar (cChar) {.   
4f10: 20 72 65 74 75 72 6e 20 5f 64 43 68 61 72 4f 72   return _dCharOr
4f20: 64 65 72 2e 67 6c 5f 67 65 74 28 63 43 68 61 72  der.gl_get(cChar
4f30: 2c 20 6e 75 6c 6c 29 3b 0a 7d 0a 0a 66 75 6e 63  , null);.}..func
4f40: 74 69 6f 6e 20 64 69 73 70 6c 61 79 43 68 61 72  tion displayChar
4f50: 4f 72 64 65 72 20 28 29 20 7b 0a 20 20 20 20 66  Order () {.    f
4f60: 6f 72 20 28 6c 65 74 20 5b 6b 65 79 2c 20 76 61  or (let [key, va
4f70: 6c 75 65 5d 20 6f 66 20 5f 64 43 68 61 72 4f 72  lue] of _dCharOr
4f80: 64 65 72 2e 65 6e 74 72 69 65 73 28 29 29 20 7b  der.entries()) {
4f90: 0a 20 20 20 20 20 20 20 20 6c 65 74 20 73 20 3d  .        let s =
4fa0: 20 22 5b 22 20 2b 20 6b 65 79 20 2b 20 22 5d 3a   "[" + key + "]:
4fb0: 20 22 3b 0a 20 20 20 20 20 20 20 20 6c 65 74 20   ";.        let 
4fc0: 6c 54 65 6d 70 20 3d 20 76 61 6c 75 65 2e 65 6e  lTemp = value.en
4fd0: 74 72 69 65 73 28 29 3b 0a 20 20 20 20 20 20 20  tries();.       
4fe0: 20 6c 54 65 6d 70 2e 73 6f 72 74 28 66 75 6e 63   lTemp.sort(func
4ff0: 74 69 6f 6e 20 28 61 2c 20 62 29 20 7b 0a 20 20  tion (a, b) {.  
5000: 20 20 20 20 20 20 20 20 20 20 69 66 20 28 61 5b            if (a[
5010: 31 5d 20 3e 20 62 5b 31 5d 29 0a 20 20 20 20 20  1] > b[1]).     
5020: 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
5030: 6e 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20  n -1;.          
5040: 20 20 69 66 20 28 61 5b 31 5d 20 3c 20 62 5b 31    if (a[1] < b[1
5050: 5d 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ]).             
5060: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
5070: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
5080: 30 3b 0a 20 20 20 20 20 20 20 20 7d 29 3b 0a 20  0;.        });. 
5090: 20 20 20 20 20 20 20 66 6f 72 20 28 6c 65 74 20         for (let 
50a0: 5b 63 2c 20 6e 5d 20 6f 66 20 6c 54 65 6d 70 29  [c, n] of lTemp)
50b0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73   {.            s
50c0: 20 2b 3d 20 63 2b 22 3a 22 2b 6e 2b 22 2c 20 22   += c+":"+n+", "
50d0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
50e0: 20 20 20 20 63 6f 6e 73 6f 6c 65 2e 6c 6f 67 28      console.log(
50f0: 73 29 3b 0a 20 20 20 20 7d 0a 7d 0a              s);.    }.}.