Grammalecte  Hex Artifact Content

Artifact c786a97f157ed8a5976e7ef447aa1bdbae7d8c194c3a6985b08e8e7d55c6137c:


0000: 2f 2f 2f 2f 20 49 42 44 41 57 47 0a 2f 2a 6a 73  //// IBDAWG./*js
0010: 6c 69 6e 74 20 65 73 76 65 72 73 69 6f 6e 3a 20  lint esversion: 
0020: 36 2a 2f 0a 2f 2a 67 6c 6f 62 61 6c 20 63 6f 6e  6*/./*global con
0030: 73 6f 6c 65 2c 72 65 71 75 69 72 65 2c 65 78 70  sole,require,exp
0040: 6f 72 74 73 2a 2f 0a 0a 22 75 73 65 20 73 74 72  orts*/.."use str
0050: 69 63 74 22 3b 0a 0a 0a 69 66 20 28 74 79 70 65  ict";...if (type
0060: 6f 66 28 72 65 71 75 69 72 65 29 20 21 3d 3d 20  of(require) !== 
0070: 27 75 6e 64 65 66 69 6e 65 64 27 29 20 7b 0a 20  'undefined') {. 
0080: 20 20 20 76 61 72 20 73 74 72 5f 74 72 61 6e 73     var str_trans
0090: 66 6f 72 6d 20 3d 20 72 65 71 75 69 72 65 28 22  form = require("
00a0: 72 65 73 6f 75 72 63 65 3a 2f 2f 67 72 61 6d 6d  resource://gramm
00b0: 61 6c 65 63 74 65 2f 67 72 61 70 68 73 70 65 6c  alecte/graphspel
00c0: 6c 2f 73 74 72 5f 74 72 61 6e 73 66 6f 72 6d 2e  l/str_transform.
00d0: 6a 73 22 29 3b 0a 20 20 20 20 76 61 72 20 68 65  js");.    var he
00e0: 6c 70 65 72 73 20 3d 20 72 65 71 75 69 72 65 28  lpers = require(
00f0: 22 72 65 73 6f 75 72 63 65 3a 2f 2f 67 72 61 6d  "resource://gram
0100: 6d 61 6c 65 63 74 65 2f 67 72 61 70 68 73 70 65  malecte/graphspe
0110: 6c 6c 2f 68 65 6c 70 65 72 73 2e 6a 73 22 29 3b  ll/helpers.js");
0120: 0a 20 20 20 20 76 61 72 20 63 68 61 72 5f 70 6c  .    var char_pl
0130: 61 79 65 72 20 3d 20 72 65 71 75 69 72 65 28 22  ayer = require("
0140: 72 65 73 6f 75 72 63 65 3a 2f 2f 67 72 61 6d 6d  resource://gramm
0150: 61 6c 65 63 74 65 2f 67 72 61 70 68 73 70 65 6c  alecte/graphspel
0160: 6c 2f 63 68 61 72 5f 70 6c 61 79 65 72 2e 6a 73  l/char_player.js
0170: 22 29 3b 0a 7d 0a 0a 0a 2f 2f 20 44 6f 6e e2 80  ");.}...// Don..
0180: 99 74 20 72 65 6d 6f 76 65 20 3c 73 74 72 69 6e  .t remove <strin
0190: 67 3e 2e 20 4e 65 63 65 73 73 61 72 79 20 69 6e  g>. Necessary in
01a0: 20 54 42 2e 0a 24 7b 73 74 72 69 6e 67 7d 0a 24   TB..${string}.$
01b0: 7b 6d 61 70 7d 0a 24 7b 73 65 74 7d 0a 0a 0a 63  {map}.${set}...c
01c0: 6c 61 73 73 20 53 75 67 67 52 65 73 75 6c 74 20  lass SuggResult 
01d0: 7b 0a 20 20 20 20 2f 2f 20 53 74 72 75 63 74 75  {.    // Structu
01e0: 72 65 20 66 6f 72 20 73 74 6f 72 69 6e 67 2c 20  re for storing, 
01f0: 63 6c 61 73 73 69 66 79 69 6e 67 20 61 6e 64 20  classifying and 
0200: 66 69 6c 74 65 72 69 6e 67 20 73 75 67 67 65 73  filtering sugges
0210: 74 69 6f 6e 73 0a 0a 20 20 20 20 63 6f 6e 73 74  tions..    const
0220: 72 75 63 74 6f 72 20 28 73 57 6f 72 64 2c 20 6e  ructor (sWord, n
0230: 44 69 73 74 4c 69 6d 69 74 3d 2d 31 29 20 7b 0a  DistLimit=-1) {.
0240: 20 20 20 20 20 20 20 20 74 68 69 73 2e 73 57 6f          this.sWo
0250: 72 64 20 3d 20 73 57 6f 72 64 3b 0a 20 20 20 20  rd = sWord;.    
0260: 20 20 20 20 74 68 69 73 2e 73 53 69 6d 70 6c 69      this.sSimpli
0270: 66 69 65 64 57 6f 72 64 20 3d 20 63 68 61 72 5f  fiedWord = char_
0280: 70 6c 61 79 65 72 2e 73 69 6d 70 6c 69 66 79 57  player.simplifyW
0290: 6f 72 64 28 73 57 6f 72 64 29 3b 0a 20 20 20 20  ord(sWord);.    
02a0: 20 20 20 20 74 68 69 73 2e 6e 44 69 73 74 4c 69      this.nDistLi
02b0: 6d 69 74 20 3d 20 28 6e 44 69 73 74 4c 69 6d 69  mit = (nDistLimi
02c0: 74 20 3e 3d 20 30 29 20 3f 20 6e 44 69 73 74 4c  t >= 0) ? nDistL
02d0: 69 6d 69 74 20 3a 20 20 4d 61 74 68 2e 66 6c 6f  imit :  Math.flo
02e0: 6f 72 28 73 57 6f 72 64 2e 6c 65 6e 67 74 68 20  or(sWord.length 
02f0: 2f 20 33 29 20 2b 20 31 3b 0a 20 20 20 20 20 20  / 3) + 1;.      
0300: 20 20 74 68 69 73 2e 6e 4d 69 6e 44 69 73 74 20    this.nMinDist 
0310: 3d 20 31 30 30 30 3b 0a 20 20 20 20 20 20 20 20  = 1000;.        
0320: 74 68 69 73 2e 61 53 75 67 67 20 3d 20 6e 65 77  this.aSugg = new
0330: 20 53 65 74 28 29 3b 0a 20 20 20 20 20 20 20 20   Set();.        
0340: 74 68 69 73 2e 64 53 75 67 67 20 3d 20 6e 65 77  this.dSugg = new
0350: 20 4d 61 70 28 5b 20 5b 30 2c 20 5b 5d 5d 2c 20   Map([ [0, []], 
0360: 20 5b 31 2c 20 5b 5d 5d 2c 20 20 5b 32 2c 20 5b   [1, []],  [2, [
0370: 5d 5d 20 5d 29 3b 0a 20 20 20 20 20 20 20 20 74  ]] ]);.        t
0380: 68 69 73 2e 61 41 6c 6c 53 75 67 67 20 3d 20 6e  his.aAllSugg = n
0390: 65 77 20 53 65 74 28 29 3b 20 20 20 20 20 20 2f  ew Set();      /
03a0: 2f 20 61 6c 6c 20 66 6f 75 6e 64 20 77 6f 72 64  / all found word
03b0: 73 20 65 76 65 6e 20 74 68 6f 73 65 20 72 65 66  s even those ref
03c0: 75 73 65 64 0a 20 20 20 20 7d 0a 0a 20 20 20 20  used.    }..    
03d0: 61 64 64 53 75 67 67 20 28 73 53 75 67 67 2c 20  addSugg (sSugg, 
03e0: 6e 44 65 65 70 3d 30 29 20 7b 0a 20 20 20 20 20  nDeep=0) {.     
03f0: 20 20 20 2f 2f 20 61 64 64 20 61 20 73 75 67 67     // add a sugg
0400: 65 73 74 69 6f 6e 0a 20 20 20 20 20 20 20 20 69  estion.        i
0410: 66 20 28 74 68 69 73 2e 61 41 6c 6c 53 75 67 67  f (this.aAllSugg
0420: 2e 68 61 73 28 73 53 75 67 67 29 29 20 7b 0a 20  .has(sSugg)) {. 
0430: 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
0440: 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  n;.        }.   
0450: 20 20 20 20 20 74 68 69 73 2e 61 41 6c 6c 53 75       this.aAllSu
0460: 67 67 2e 61 64 64 28 73 53 75 67 67 29 3b 0a 20  gg.add(sSugg);. 
0470: 20 20 20 20 20 20 20 69 66 20 28 21 74 68 69 73         if (!this
0480: 2e 61 53 75 67 67 2e 68 61 73 28 73 53 75 67 67  .aSugg.has(sSugg
0490: 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  )) {.           
04a0: 20 6c 65 74 20 6e 44 69 73 74 20 3d 20 73 74 72   let nDist = str
04b0: 5f 74 72 61 6e 73 66 6f 72 6d 2e 64 69 73 74 61  _transform.dista
04c0: 6e 63 65 44 61 6d 65 72 61 75 4c 65 76 65 6e 73  nceDamerauLevens
04d0: 68 74 65 69 6e 28 74 68 69 73 2e 73 53 69 6d 70  htein(this.sSimp
04e0: 6c 69 66 69 65 64 57 6f 72 64 2c 20 63 68 61 72  lifiedWord, char
04f0: 5f 70 6c 61 79 65 72 2e 73 69 6d 70 6c 69 66 79  _player.simplify
0500: 57 6f 72 64 28 73 53 75 67 67 29 29 3b 0a 20 20  Word(sSugg));.  
0510: 20 20 20 20 20 20 20 20 20 20 69 66 20 28 6e 44            if (nD
0520: 69 73 74 20 3c 3d 20 74 68 69 73 2e 6e 44 69 73  ist <= this.nDis
0530: 74 4c 69 6d 69 74 29 20 7b 0a 20 20 20 20 20 20  tLimit) {.      
0540: 20 20 20 20 20 20 20 20 20 20 69 66 20 28 21 74            if (!t
0550: 68 69 73 2e 64 53 75 67 67 2e 68 61 73 28 6e 44  his.dSugg.has(nD
0560: 69 73 74 29 29 20 7b 0a 20 20 20 20 20 20 20 20  ist)) {.        
0570: 20 20 20 20 20 20 20 20 20 20 20 20 74 68 69 73              this
0580: 2e 64 53 75 67 67 2e 73 65 74 28 6e 44 69 73 74  .dSugg.set(nDist
0590: 2c 20 5b 5d 29 3b 0a 20 20 20 20 20 20 20 20 20  , []);.         
05a0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
05b0: 20 20 20 20 20 20 20 20 20 74 68 69 73 2e 64 53           this.dS
05c0: 75 67 67 2e 67 65 74 28 6e 44 69 73 74 29 2e 70  ugg.get(nDist).p
05d0: 75 73 68 28 73 53 75 67 67 29 3b 0a 20 20 20 20  ush(sSugg);.    
05e0: 20 20 20 20 20 20 20 20 20 20 20 20 74 68 69 73              this
05f0: 2e 61 53 75 67 67 2e 61 64 64 28 73 53 75 67 67  .aSugg.add(sSugg
0600: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
0610: 20 20 20 69 66 20 28 6e 44 69 73 74 20 3c 20 74     if (nDist < t
0620: 68 69 73 2e 6e 4d 69 6e 44 69 73 74 29 20 7b 0a  his.nMinDist) {.
0630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0640: 20 20 20 20 74 68 69 73 2e 6e 4d 69 6e 44 69 73      this.nMinDis
0650: 74 20 3d 20 6e 44 69 73 74 3b 0a 20 20 20 20 20  t = nDist;.     
0660: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
0670: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68 69               thi
0680: 73 2e 6e 44 69 73 74 4c 69 6d 69 74 20 3d 20 4d  s.nDistLimit = M
0690: 61 74 68 2e 6d 69 6e 28 74 68 69 73 2e 6e 44 69  ath.min(this.nDi
06a0: 73 74 4c 69 6d 69 74 2c 20 74 68 69 73 2e 6e 4d  stLimit, this.nM
06b0: 69 6e 44 69 73 74 2b 31 29 3b 0a 20 20 20 20 20  inDist+1);.     
06c0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
06d0: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 67 65   }.    }..    ge
06e0: 74 53 75 67 67 65 73 74 69 6f 6e 73 20 28 6e 53  tSuggestions (nS
06f0: 75 67 67 4c 69 6d 69 74 3d 31 30 2c 20 6e 44 69  uggLimit=10, nDi
0700: 73 74 4c 69 6d 69 74 3d 2d 31 29 20 7b 0a 20 20  stLimit=-1) {.  
0710: 20 20 20 20 20 20 2f 2f 20 72 65 74 75 72 6e 20        // return 
0720: 61 20 6c 69 73 74 20 6f 66 20 73 75 67 67 65 73  a list of sugges
0730: 74 69 6f 6e 73 0a 20 20 20 20 20 20 20 20 6c 65  tions.        le
0740: 74 20 6c 52 65 73 20 3d 20 5b 5d 3b 0a 20 20 20  t lRes = [];.   
0750: 20 20 20 20 20 69 66 20 28 74 68 69 73 2e 64 53       if (this.dS
0760: 75 67 67 2e 67 65 74 28 30 29 2e 6c 65 6e 67 74  ugg.get(0).lengt
0770: 68 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  h) {.           
0780: 20 2f 2f 20 77 65 20 73 6f 72 74 20 74 68 65 20   // we sort the 
0790: 62 65 74 74 65 72 20 72 65 73 75 6c 74 73 20 77  better results w
07a0: 69 74 68 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  ith the original
07b0: 20 77 6f 72 64 0a 20 20 20 20 20 20 20 20 20 20   word.          
07c0: 20 20 6c 65 74 20 64 44 69 73 74 54 65 6d 70 20    let dDistTemp 
07d0: 3d 20 6e 65 77 20 4d 61 70 28 29 3b 0a 20 20 20  = new Map();.   
07e0: 20 20 20 20 20 20 20 20 20 6c 52 65 73 2e 66 6f           lRes.fo
07f0: 72 45 61 63 68 28 28 73 53 75 67 67 29 20 3d 3e  rEach((sSugg) =>
0800: 20 7b 20 64 44 69 73 74 54 65 6d 70 2e 73 65 74   { dDistTemp.set
0810: 28 73 53 75 67 67 2c 20 73 74 72 5f 74 72 61 6e  (sSugg, str_tran
0820: 73 66 6f 72 6d 2e 64 69 73 74 61 6e 63 65 44 61  sform.distanceDa
0830: 6d 65 72 61 75 4c 65 76 65 6e 73 68 74 65 69 6e  merauLevenshtein
0840: 28 74 68 69 73 2e 73 57 6f 72 64 2c 20 73 53 75  (this.sWord, sSu
0850: 67 67 29 29 3b 20 7d 29 3b 0a 20 20 20 20 20 20  gg)); });.      
0860: 20 20 20 20 20 20 6c 52 65 73 20 3d 20 6c 52 65        lRes = lRe
0870: 73 2e 73 6f 72 74 28 28 73 41 2c 20 73 42 29 20  s.sort((sA, sB) 
0880: 3d 3e 20 7b 20 72 65 74 75 72 6e 20 64 44 69 73  => { return dDis
0890: 74 54 65 6d 70 2e 67 65 74 28 73 41 29 20 2d 20  tTemp.get(sA) - 
08a0: 64 44 69 73 74 54 65 6d 70 2e 67 65 74 28 73 42  dDistTemp.get(sB
08b0: 29 3b 20 7d 29 3b 0a 20 20 20 20 20 20 20 20 20  ); });.         
08c0: 20 20 20 64 44 69 73 74 54 65 6d 70 2e 63 6c 65     dDistTemp.cle
08d0: 61 72 28 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ar();.        }.
08e0: 20 20 20 20 20 20 20 20 66 6f 72 20 28 6c 65 74          for (let
08f0: 20 5b 6e 44 69 73 74 2c 20 6c 53 75 67 67 5d 20   [nDist, lSugg] 
0900: 6f 66 20 74 68 69 73 2e 64 53 75 67 67 2e 65 6e  of this.dSugg.en
0910: 74 72 69 65 73 28 29 29 20 7b 0a 20 20 20 20 20  tries()) {.     
0920: 20 20 20 20 20 20 20 69 66 20 28 6e 44 69 73 74         if (nDist
0930: 20 3e 20 74 68 69 73 2e 6e 44 69 73 74 4c 69 6d   > this.nDistLim
0940: 69 74 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  it) {.          
0950: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
0960: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
0970: 20 20 20 20 20 20 20 6c 52 65 73 2e 70 75 73 68         lRes.push
0980: 28 2e 2e 2e 6c 53 75 67 67 29 3b 0a 20 20 20 20  (...lSugg);.    
0990: 20 20 20 20 20 20 20 20 69 66 20 28 6c 52 65 73          if (lRes
09a0: 2e 6c 65 6e 67 74 68 20 3e 20 6e 53 75 67 67 4c  .length > nSuggL
09b0: 69 6d 69 74 29 20 7b 0a 20 20 20 20 20 20 20 20  imit) {.        
09c0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
09d0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
09e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6c       }.        l
09f0: 52 65 73 20 3d 20 63 68 61 72 5f 70 6c 61 79 65  Res = char_playe
0a00: 72 2e 66 69 6c 74 65 72 53 75 67 67 28 6c 52 65  r.filterSugg(lRe
0a10: 73 29 3b 0a 20 20 20 20 20 20 20 20 69 66 20 28  s);.        if (
0a20: 74 68 69 73 2e 73 57 6f 72 64 2e 67 6c 5f 69 73  this.sWord.gl_is
0a30: 55 70 70 65 72 43 61 73 65 28 29 29 20 7b 0a 20  UpperCase()) {. 
0a40: 20 20 20 20 20 20 20 20 20 20 20 6c 52 65 73 20             lRes 
0a50: 3d 20 6c 52 65 73 2e 6d 61 70 28 28 73 53 75 67  = lRes.map((sSug
0a60: 67 29 20 3d 3e 20 7b 20 72 65 74 75 72 6e 20 73  g) => { return s
0a70: 53 75 67 67 2e 74 6f 55 70 70 65 72 43 61 73 65  Sugg.toUpperCase
0a80: 28 29 3b 20 7d 29 3b 0a 20 20 20 20 20 20 20 20  (); });.        
0a90: 7d 0a 20 20 20 20 20 20 20 20 65 6c 73 65 20 69  }.        else i
0aa0: 66 20 28 74 68 69 73 2e 73 57 6f 72 64 2e 73 6c  f (this.sWord.sl
0ab0: 69 63 65 28 30 2c 31 29 2e 67 6c 5f 69 73 55 70  ice(0,1).gl_isUp
0ac0: 70 65 72 43 61 73 65 28 29 29 20 7b 0a 20 20 20  perCase()) {.   
0ad0: 20 20 20 20 20 20 20 20 20 6c 52 65 73 20 3d 20           lRes = 
0ae0: 6c 52 65 73 2e 6d 61 70 28 28 73 53 75 67 67 29  lRes.map((sSugg)
0af0: 20 3d 3e 20 7b 20 72 65 74 75 72 6e 20 73 53 75   => { return sSu
0b00: 67 67 2e 73 6c 69 63 65 28 30 2c 31 29 2e 74 6f  gg.slice(0,1).to
0b10: 55 70 70 65 72 43 61 73 65 28 29 20 2b 20 73 53  UpperCase() + sS
0b20: 75 67 67 2e 73 6c 69 63 65 28 31 29 3b 20 7d 29  ugg.slice(1); })
0b30: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
0b40: 20 20 20 20 72 65 74 75 72 6e 20 6c 52 65 73 2e      return lRes.
0b50: 73 6c 69 63 65 28 30 2c 20 6e 53 75 67 67 4c 69  slice(0, nSuggLi
0b60: 6d 69 74 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  mit);.    }..   
0b70: 20 72 65 73 65 74 20 28 29 20 7b 0a 20 20 20 20   reset () {.    
0b80: 20 20 20 20 74 68 69 73 2e 61 53 75 67 67 2e 63      this.aSugg.c
0b90: 6c 65 61 72 28 29 3b 0a 20 20 20 20 20 20 20 20  lear();.        
0ba0: 74 68 69 73 2e 64 53 75 67 67 2e 63 6c 65 61 72  this.dSugg.clear
0bb0: 28 29 3b 0a 20 20 20 20 7d 0a 7d 0a 0a 0a 63 6c  ();.    }.}...cl
0bc0: 61 73 73 20 49 42 44 41 57 47 20 7b 0a 20 20 20  ass IBDAWG {.   
0bd0: 20 2f 2f 20 49 4e 44 45 58 41 42 4c 45 20 42 49   // INDEXABLE BI
0be0: 4e 41 52 59 20 44 49 52 45 43 54 20 41 43 59 43  NARY DIRECT ACYC
0bf0: 4c 49 43 20 57 4f 52 44 20 47 52 41 50 48 0a 0a  LIC WORD GRAPH..
0c00: 20 20 20 20 63 6f 6e 73 74 72 75 63 74 6f 72 20      constructor 
0c10: 28 70 61 72 61 6d 31 2c 20 73 50 61 74 68 3d 22  (param1, sPath="
0c20: 22 29 20 7b 0a 20 20 20 20 20 20 20 20 2f 2f 20  ") {.        // 
0c30: 70 61 72 61 6d 31 20 63 61 6e 20 62 65 20 61 20  param1 can be a 
0c40: 66 69 6c 65 6e 61 6d 65 20 6f 72 20 61 20 6f 62  filename or a ob
0c50: 6a 65 63 74 20 77 69 74 68 20 61 6c 6c 20 74 68  ject with all th
0c60: 65 20 6e 65 63 65 73 73 61 72 79 20 64 61 74 61  e necessary data
0c70: 2e 0a 20 20 20 20 20 20 20 20 74 72 79 20 7b 0a  ..        try {.
0c80: 20 20 20 20 20 20 20 20 20 20 20 20 6c 65 74 20              let 
0c90: 6f 44 61 74 61 20 3d 20 6e 75 6c 6c 3b 0a 20 20  oData = null;.  
0ca0: 20 20 20 20 20 20 20 20 20 20 69 66 20 28 74 79            if (ty
0cb0: 70 65 6f 66 28 70 61 72 61 6d 31 29 20 3d 3d 20  peof(param1) == 
0cc0: 22 73 74 72 69 6e 67 22 29 20 7b 0a 20 20 20 20  "string") {.    
0cd0: 20 20 20 20 20 20 20 20 20 20 20 20 6c 65 74 20              let 
0ce0: 73 55 52 4c 20 3d 20 28 73 50 61 74 68 20 21 3d  sURL = (sPath !=
0cf0: 3d 20 22 22 29 20 3f 20 73 50 61 74 68 20 2b 20  = "") ? sPath + 
0d00: 22 2f 22 20 2b 20 70 61 72 61 6d 31 20 3a 20 22  "/" + param1 : "
0d10: 72 65 73 6f 75 72 63 65 3a 2f 2f 67 72 61 6d 6d  resource://gramm
0d20: 61 6c 65 63 74 65 2f 67 72 61 70 68 73 70 65 6c  alecte/graphspel
0d30: 6c 2f 5f 64 69 63 74 69 6f 6e 61 72 69 65 73 2f  l/_dictionaries/
0d40: 22 2b 70 61 72 61 6d 31 3b 0a 20 20 20 20 20 20  "+param1;.      
0d50: 20 20 20 20 20 20 20 20 20 20 6f 44 61 74 61 20            oData 
0d60: 3d 20 4a 53 4f 4e 2e 70 61 72 73 65 28 68 65 6c  = JSON.parse(hel
0d70: 70 65 72 73 2e 6c 6f 61 64 46 69 6c 65 28 73 55  pers.loadFile(sU
0d80: 52 4c 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  RL));.          
0d90: 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
0da0: 20 20 20 20 20 20 20 20 20 20 20 6f 44 61 74 61             oData
0db0: 20 3d 20 70 61 72 61 6d 31 3b 0a 20 20 20 20 20   = param1;.     
0dc0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
0dd0: 20 20 20 20 20 4f 62 6a 65 63 74 2e 61 73 73 69       Object.assi
0de0: 67 6e 28 74 68 69 73 2c 20 6f 44 61 74 61 29 3b  gn(this, oData);
0df0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
0e00: 20 20 20 63 61 74 63 68 20 28 65 29 20 7b 0a 20     catch (e) {. 
0e10: 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 6f             conso
0e20: 6c 65 2e 65 72 72 6f 72 28 65 29 3b 0a 20 20 20  le.error(e);.   
0e30: 20 20 20 20 20 20 20 20 20 63 6f 6e 73 6f 6c 65           console
0e40: 2e 6c 6f 67 28 22 70 61 74 68 3a 20 22 20 2b 20  .log("path: " + 
0e50: 73 50 61 74 68 29 3b 0a 20 20 20 20 20 20 20 20  sPath);.        
0e60: 20 20 20 20 63 6f 6e 73 6f 6c 65 2e 6c 6f 67 28      console.log(
0e70: 22 64 69 63 3a 22 20 2b 20 70 61 72 61 6d 31 2e  "dic:" + param1.
0e80: 73 6c 69 63 65 28 30 2c 20 31 30 30 30 29 29 3b  slice(0, 1000));
0e90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 68 72  .            thr
0ea0: 6f 77 20 45 72 72 6f 72 28 22 23 20 45 72 72 6f  ow Error("# Erro
0eb0: 72 2e 20 46 69 6c 65 20 6e 6f 74 20 66 6f 75 6e  r. File not foun
0ec0: 64 20 6f 72 20 6e 6f 74 20 6c 6f 61 64 61 62 6c  d or not loadabl
0ed0: 65 2e 5c 6e 22 20 2b 20 65 2e 6d 65 73 73 61 67  e.\n" + e.messag
0ee0: 65 20 2b 20 22 5c 6e 22 29 3b 0a 20 20 20 20 20  e + "\n");.     
0ef0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a 0a     }.        /*.
0f00: 20 20 20 20 20 20 20 20 20 20 20 20 50 72 6f 70              Prop
0f10: 65 72 74 69 65 73 3a 0a 20 20 20 20 20 20 20 20  erties:.        
0f20: 20 20 20 20 73 4e 61 6d 65 2c 20 6e 43 6f 6d 70      sName, nComp
0f30: 72 65 73 73 69 6f 6e 4d 65 74 68 6f 64 2c 20 73  ressionMethod, s
0f40: 48 65 61 64 65 72 2c 20 6c 41 72 63 56 61 6c 2c  Header, lArcVal,
0f50: 20 6e 41 72 63 56 61 6c 2c 20 73 42 79 44 69 63   nArcVal, sByDic
0f60: 2c 20 73 4c 61 6e 67 2c 20 6e 43 68 61 72 2c 20  , sLang, nChar, 
0f70: 6e 42 79 74 65 73 41 72 63 2c 20 6e 42 79 74 65  nBytesArc, nByte
0f80: 73 4e 6f 64 65 41 64 64 72 65 73 73 2c 0a 20 20  sNodeAddress,.  
0f90: 20 20 20 20 20 20 20 20 20 20 6e 45 6e 74 72 79            nEntry
0fa0: 2c 20 6e 4e 6f 64 65 2c 20 6e 41 72 63 2c 20 6e  , nNode, nArc, n
0fb0: 41 66 66 2c 20 63 53 74 65 6d 6d 69 6e 67 2c 20  Aff, cStemming, 
0fc0: 6e 54 61 67 2c 20 64 43 68 61 72 2c 20 6e 42 79  nTag, dChar, nBy
0fd0: 74 65 73 4f 66 66 73 65 74 2c 0a 20 20 20 20 20  tesOffset,.     
0fe0: 20 20 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 2f     */..        /
0ff0: 2a 0a 20 20 20 20 20 20 20 20 20 20 20 20 42 75  *.            Bu
1000: 67 20 77 6f 72 6b 61 72 6f 75 6e 64 2e 0a 20 20  g workaround..  
1010: 20 20 20 20 20 20 20 20 20 20 4d 6f 7a 69 6c 6c            Mozill
1020: 61 e2 80 99 73 20 4a 53 20 70 61 72 73 65 72 20  a...s JS parser 
1030: 73 75 63 6b 73 2e 20 43 61 6e e2 80 99 74 20 72  sucks. Can...t r
1040: 65 61 64 20 66 69 6c 65 20 62 69 67 67 65 72 20  ead file bigger 
1050: 74 68 61 6e 20 34 20 4d 62 21 0a 20 20 20 20 20  than 4 Mb!.     
1060: 20 20 20 20 20 20 20 53 6f 20 77 65 20 63 6f 6e         So we con
1070: 76 65 72 74 20 68 75 67 65 20 68 65 78 61 64 65  vert huge hexade
1080: 63 69 6d 61 6c 20 73 74 72 69 6e 67 20 74 6f 20  cimal string to 
1090: 6c 69 73 74 20 6f 66 20 6e 75 6d 62 65 72 73 e2  list of numbers.
10a0: 80 a6 0a 20 20 20 20 20 20 20 20 20 20 20 20 68  ...            h
10b0: 74 74 70 73 3a 2f 2f 67 69 74 68 75 62 2e 63 6f  ttps://github.co
10c0: 6d 2f 6d 6f 7a 69 6c 6c 61 2f 61 64 64 6f 6e 73  m/mozilla/addons
10d0: 2d 6c 69 6e 74 65 72 2f 69 73 73 75 65 73 2f 31  -linter/issues/1
10e0: 33 36 31 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  361.        */. 
10f0: 20 20 20 20 20 20 20 6c 65 74 20 6c 54 65 6d 70         let lTemp
1100: 20 3d 20 5b 5d 3b 0a 20 20 20 20 20 20 20 20 66   = [];.        f
1110: 6f 72 20 28 6c 65 74 20 69 20 3d 20 30 3b 20 20  or (let i = 0;  
1120: 69 20 3c 20 74 68 69 73 2e 73 42 79 44 69 63 2e  i < this.sByDic.
1130: 6c 65 6e 67 74 68 3b 20 20 69 2b 3d 32 29 20 7b  length;  i+=2) {
1140: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 54 65  .            lTe
1150: 6d 70 2e 70 75 73 68 28 70 61 72 73 65 49 6e 74  mp.push(parseInt
1160: 28 74 68 69 73 2e 73 42 79 44 69 63 2e 73 6c 69  (this.sByDic.sli
1170: 63 65 28 69 2c 20 69 2b 32 29 2c 20 31 36 29 29  ce(i, i+2), 16))
1180: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1190: 20 20 20 20 74 68 69 73 2e 62 79 44 69 63 20 3d      this.byDic =
11a0: 20 6c 54 65 6d 70 3b 0a 20 20 20 20 20 20 20 20   lTemp;.        
11b0: 2f 2f 74 68 69 73 2e 62 79 44 69 63 20 3d 20 6e  //this.byDic = n
11c0: 65 77 20 55 69 6e 74 38 41 72 72 61 79 28 6c 54  ew Uint8Array(lT
11d0: 65 6d 70 29 3b 20 20 2f 2f 20 6e 6f 74 20 71 75  emp);  // not qu
11e0: 69 63 6b 65 72 2c 20 65 76 65 6e 20 73 6c 6f 77  icker, even slow
11f0: 65 72 0a 20 20 20 20 20 20 20 20 2f 2a 20 65 6e  er.        /* en
1200: 64 20 6f 66 20 62 75 67 20 77 6f 72 6b 61 72 6f  d of bug workaro
1210: 75 6e 64 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20  und */..        
1220: 69 66 20 28 21 28 74 68 69 73 2e 73 48 65 61 64  if (!(this.sHead
1230: 65 72 2e 73 74 61 72 74 73 57 69 74 68 28 22 2f  er.startsWith("/
1240: 67 72 61 6d 6d 61 6c 65 63 74 65 2d 66 73 61 2f  grammalecte-fsa/
1250: 22 29 20 7c 7c 20 74 68 69 73 2e 73 48 65 61 64  ") || this.sHead
1260: 65 72 2e 73 74 61 72 74 73 57 69 74 68 28 22 2f  er.startsWith("/
1270: 70 79 66 73 61 2f 22 29 29 29 20 7b 0a 20 20 20  pyfsa/"))) {.   
1280: 20 20 20 20 20 20 20 20 20 74 68 72 6f 77 20 54           throw T
1290: 79 70 65 45 72 72 6f 72 28 22 23 20 45 72 72 6f  ypeError("# Erro
12a0: 72 2e 20 4e 6f 74 20 61 20 67 72 61 6d 6d 61 6c  r. Not a grammal
12b0: 65 63 74 65 2d 66 73 61 20 62 69 6e 61 72 79 20  ecte-fsa binary 
12c0: 64 69 63 74 69 6f 6e 61 72 79 2e 20 48 65 61 64  dictionary. Head
12d0: 65 72 3a 20 22 20 2b 20 74 68 69 73 2e 73 48 65  er: " + this.sHe
12e0: 61 64 65 72 29 3b 0a 20 20 20 20 20 20 20 20 7d  ader);.        }
12f0: 0a 20 20 20 20 20 20 20 20 69 66 20 28 21 28 74  .        if (!(t
1300: 68 69 73 2e 6e 43 6f 6d 70 72 65 73 73 69 6f 6e  his.nCompression
1310: 4d 65 74 68 6f 64 20 3d 3d 20 31 20 7c 7c 20 74  Method == 1 || t
1320: 68 69 73 2e 6e 43 6f 6d 70 72 65 73 73 69 6f 6e  his.nCompression
1330: 4d 65 74 68 6f 64 20 3d 3d 20 32 20 7c 7c 20 74  Method == 2 || t
1340: 68 69 73 2e 6e 43 6f 6d 70 72 65 73 73 69 6f 6e  his.nCompression
1350: 4d 65 74 68 6f 64 20 3d 3d 20 33 29 29 20 7b 0a  Method == 3)) {.
1360: 20 20 20 20 20 20 20 20 20 20 20 20 74 68 72 6f              thro
1370: 77 20 52 61 6e 67 65 45 72 72 6f 72 28 22 23 20  w RangeError("# 
1380: 45 72 72 6f 72 2e 20 55 6e 6b 6e 6f 77 6e 20 64  Error. Unknown d
1390: 69 63 74 69 6f 6e 61 72 79 20 63 6f 6d 70 72 65  ictionary compre
13a0: 73 73 69 6f 6e 20 6d 65 74 68 6f 64 3a 20 22 20  ssion method: " 
13b0: 2b 20 74 68 69 73 2e 6e 43 6f 6d 70 72 65 73 73  + this.nCompress
13c0: 69 6f 6e 4d 65 74 68 6f 64 29 3b 0a 20 20 20 20  ionMethod);.    
13d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2f      }.        //
13e0: 20 3c 64 43 68 61 72 3e 20 74 6f 20 67 65 74 20   <dChar> to get 
13f0: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 61 6e 20  the value of an 
1400: 61 72 63 2c 20 3c 64 43 68 61 72 56 61 6c 3e 20  arc, <dCharVal> 
1410: 74 6f 20 67 65 74 20 74 68 65 20 63 68 61 72 20  to get the char 
1420: 6f 66 20 61 6e 20 61 72 63 20 77 69 74 68 20 69  of an arc with i
1430: 74 73 20 76 61 6c 75 65 0a 20 20 20 20 20 20 20  ts value.       
1440: 20 74 68 69 73 2e 64 43 68 61 72 20 3d 20 68 65   this.dChar = he
1450: 6c 70 65 72 73 2e 6f 62 6a 65 63 74 54 6f 4d 61  lpers.objectToMa
1460: 70 28 74 68 69 73 2e 64 43 68 61 72 29 3b 0a 20  p(this.dChar);. 
1470: 20 20 20 20 20 20 20 74 68 69 73 2e 64 43 68 61         this.dCha
1480: 72 56 61 6c 20 3d 20 74 68 69 73 2e 64 43 68 61  rVal = this.dCha
1490: 72 2e 67 6c 5f 72 65 76 65 72 73 65 28 29 3b 0a  r.gl_reverse();.
14a0: 20 20 20 20 20 20 20 20 74 68 69 73 2e 61 32 67          this.a2g
14b0: 72 61 6d 73 20 3d 20 6e 65 77 20 53 65 74 28 74  rams = new Set(t
14c0: 68 69 73 2e 6c 32 67 72 61 6d 73 29 3b 0a 0a 20  his.l2grams);.. 
14d0: 20 20 20 20 20 20 20 69 66 20 28 74 68 69 73 2e         if (this.
14e0: 63 53 74 65 6d 6d 69 6e 67 20 3d 3d 20 22 53 22  cStemming == "S"
14f0: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
1500: 74 68 69 73 2e 66 75 6e 63 53 74 65 6d 6d 69 6e  this.funcStemmin
1510: 67 20 3d 20 73 74 72 5f 74 72 61 6e 73 66 6f 72  g = str_transfor
1520: 6d 2e 63 68 61 6e 67 65 57 6f 72 64 57 69 74 68  m.changeWordWith
1530: 53 75 66 66 69 78 43 6f 64 65 3b 0a 20 20 20 20  SuffixCode;.    
1540: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 74      } else if (t
1550: 68 69 73 2e 63 53 74 65 6d 6d 69 6e 67 20 3d 3d  his.cStemming ==
1560: 20 22 41 22 29 20 7b 0a 20 20 20 20 20 20 20 20   "A") {.        
1570: 20 20 20 20 74 68 69 73 2e 66 75 6e 63 53 74 65      this.funcSte
1580: 6d 6d 69 6e 67 20 3d 20 73 74 72 5f 74 72 61 6e  mming = str_tran
1590: 73 66 6f 72 6d 2e 63 68 61 6e 67 65 57 6f 72 64  sform.changeWord
15a0: 57 69 74 68 41 66 66 69 78 43 6f 64 65 3b 0a 20  WithAffixCode;. 
15b0: 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a         } else {.
15c0: 20 20 20 20 20 20 20 20 20 20 20 20 74 68 69 73              this
15d0: 2e 66 75 6e 63 53 74 65 6d 6d 69 6e 67 20 3d 20  .funcStemming = 
15e0: 73 74 72 5f 74 72 61 6e 73 66 6f 72 6d 2e 6e 6f  str_transform.no
15f0: 53 74 65 6d 6d 69 6e 67 3b 0a 20 20 20 20 20 20  Stemming;.      
1600: 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 74 68 69    }..        thi
1610: 73 2e 5f 61 72 63 4d 61 73 6b 20 3d 20 28 32 20  s._arcMask = (2 
1620: 2a 2a 20 28 28 74 68 69 73 2e 6e 42 79 74 65 73  ** ((this.nBytes
1630: 41 72 63 20 2a 20 38 29 20 2d 20 33 29 29 20 2d  Arc * 8) - 3)) -
1640: 20 31 3b 0a 20 20 20 20 20 20 20 20 74 68 69 73   1;.        this
1650: 2e 5f 66 69 6e 61 6c 4e 6f 64 65 4d 61 73 6b 20  ._finalNodeMask 
1660: 3d 20 31 20 3c 3c 20 28 28 74 68 69 73 2e 6e 42  = 1 << ((this.nB
1670: 79 74 65 73 41 72 63 20 2a 20 38 29 20 2d 20 31  ytesArc * 8) - 1
1680: 29 3b 0a 20 20 20 20 20 20 20 20 74 68 69 73 2e  );.        this.
1690: 5f 6c 61 73 74 41 72 63 4d 61 73 6b 20 3d 20 31  _lastArcMask = 1
16a0: 20 3c 3c 20 28 28 74 68 69 73 2e 6e 42 79 74 65   << ((this.nByte
16b0: 73 41 72 63 20 2a 20 38 29 20 2d 20 32 29 3b 0a  sArc * 8) - 2);.
16c0: 0a 0a 20 20 20 20 20 20 20 20 2f 2f 20 43 6f 6e  ..        // Con
16d0: 66 69 67 75 72 69 6e 67 20 44 41 57 47 20 66 75  figuring DAWG fu
16e0: 6e 63 74 69 6f 6e 73 20 61 63 63 6f 72 64 69 6e  nctions accordin
16f0: 67 20 74 6f 20 6e 43 6f 6d 70 72 65 73 73 69 6f  g to nCompressio
1700: 6e 4d 65 74 68 6f 64 0a 20 20 20 20 20 20 20 20  nMethod.        
1710: 73 77 69 74 63 68 20 28 74 68 69 73 2e 6e 43 6f  switch (this.nCo
1720: 6d 70 72 65 73 73 69 6f 6e 4d 65 74 68 6f 64 29  mpressionMethod)
1730: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63   {.            c
1740: 61 73 65 20 31 3a 0a 20 20 20 20 20 20 20 20 20  ase 1:.         
1750: 20 20 20 20 20 20 20 74 68 69 73 2e 6d 6f 72 70         this.morp
1760: 68 20 3d 20 74 68 69 73 2e 5f 6d 6f 72 70 68 31  h = this._morph1
1770: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1780: 20 20 74 68 69 73 2e 73 74 65 6d 20 3d 20 74 68    this.stem = th
1790: 69 73 2e 5f 73 74 65 6d 31 3b 0a 20 20 20 20 20  is._stem1;.     
17a0: 20 20 20 20 20 20 20 20 20 20 20 74 68 69 73 2e             this.
17b0: 5f 6c 6f 6f 6b 75 70 41 72 63 4e 6f 64 65 20 3d  _lookupArcNode =
17c0: 20 74 68 69 73 2e 5f 6c 6f 6f 6b 75 70 41 72 63   this._lookupArc
17d0: 4e 6f 64 65 31 3b 0a 20 20 20 20 20 20 20 20 20  Node1;.         
17e0: 20 20 20 20 20 20 20 74 68 69 73 2e 5f 67 65 74         this._get
17f0: 41 72 63 73 20 3d 20 74 68 69 73 2e 5f 67 65 74  Arcs = this._get
1800: 41 72 63 73 31 3b 0a 20 20 20 20 20 20 20 20 20  Arcs1;.         
1810: 20 20 20 20 20 20 20 74 68 69 73 2e 5f 77 72 69         this._wri
1820: 74 65 4e 6f 64 65 73 20 3d 20 74 68 69 73 2e 5f  teNodes = this._
1830: 77 72 69 74 65 4e 6f 64 65 73 31 3b 0a 20 20 20  writeNodes1;.   
1840: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
1850: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
1860: 63 61 73 65 20 32 3a 0a 20 20 20 20 20 20 20 20  case 2:.        
1870: 20 20 20 20 20 20 20 20 74 68 69 73 2e 6d 6f 72          this.mor
1880: 70 68 20 3d 20 74 68 69 73 2e 5f 6d 6f 72 70 68  ph = this._morph
1890: 32 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  2;.             
18a0: 20 20 20 74 68 69 73 2e 73 74 65 6d 20 3d 20 74     this.stem = t
18b0: 68 69 73 2e 5f 73 74 65 6d 32 3b 0a 20 20 20 20  his._stem2;.    
18c0: 20 20 20 20 20 20 20 20 20 20 20 20 74 68 69 73              this
18d0: 2e 5f 6c 6f 6f 6b 75 70 41 72 63 4e 6f 64 65 20  ._lookupArcNode 
18e0: 3d 20 74 68 69 73 2e 5f 6c 6f 6f 6b 75 70 41 72  = this._lookupAr
18f0: 63 4e 6f 64 65 32 3b 0a 20 20 20 20 20 20 20 20  cNode2;.        
1900: 20 20 20 20 20 20 20 20 74 68 69 73 2e 5f 67 65          this._ge
1910: 74 41 72 63 73 20 3d 20 74 68 69 73 2e 5f 67 65  tArcs = this._ge
1920: 74 41 72 63 73 32 3b 0a 20 20 20 20 20 20 20 20  tArcs2;.        
1930: 20 20 20 20 20 20 20 20 74 68 69 73 2e 5f 77 72          this._wr
1940: 69 74 65 4e 6f 64 65 73 20 3d 20 74 68 69 73 2e  iteNodes = this.
1950: 5f 77 72 69 74 65 4e 6f 64 65 73 32 3b 0a 20 20  _writeNodes2;.  
1960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
1970: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  eak;.           
1980: 20 63 61 73 65 20 33 3a 0a 20 20 20 20 20 20 20   case 3:.       
1990: 20 20 20 20 20 20 20 20 20 74 68 69 73 2e 6d 6f           this.mo
19a0: 72 70 68 20 3d 20 74 68 69 73 2e 5f 6d 6f 72 70  rph = this._morp
19b0: 68 33 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  h3;.            
19c0: 20 20 20 20 74 68 69 73 2e 73 74 65 6d 20 3d 20      this.stem = 
19d0: 74 68 69 73 2e 5f 73 74 65 6d 33 3b 0a 20 20 20  this._stem3;.   
19e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68 69               thi
19f0: 73 2e 5f 6c 6f 6f 6b 75 70 41 72 63 4e 6f 64 65  s._lookupArcNode
1a00: 20 3d 20 74 68 69 73 2e 5f 6c 6f 6f 6b 75 70 41   = this._lookupA
1a10: 72 63 4e 6f 64 65 33 3b 0a 20 20 20 20 20 20 20  rcNode3;.       
1a20: 20 20 20 20 20 20 20 20 20 74 68 69 73 2e 5f 67           this._g
1a30: 65 74 41 72 63 73 20 3d 20 74 68 69 73 2e 5f 67  etArcs = this._g
1a40: 65 74 41 72 63 73 33 3b 0a 20 20 20 20 20 20 20  etArcs3;.       
1a50: 20 20 20 20 20 20 20 20 20 74 68 69 73 2e 5f 77           this._w
1a60: 72 69 74 65 4e 6f 64 65 73 20 3d 20 74 68 69 73  riteNodes = this
1a70: 2e 5f 77 72 69 74 65 4e 6f 64 65 73 33 3b 0a 20  ._writeNodes3;. 
1a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
1a90: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
1aa0: 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20    default:.     
1ab0: 20 20 20 20 20 20 20 20 20 20 20 74 68 72 6f 77             throw
1ac0: 20 56 61 6c 75 65 45 72 72 6f 72 28 22 23 20 45   ValueError("# E
1ad0: 72 72 6f 72 3a 20 75 6e 6b 6e 6f 77 6e 20 63 6f  rror: unknown co
1ae0: 64 65 3a 20 22 20 2b 20 74 68 69 73 2e 6e 43 6f  de: " + this.nCo
1af0: 6d 70 72 65 73 73 69 6f 6e 4d 65 74 68 6f 64 29  mpressionMethod)
1b00: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1b10: 20 20 20 20 2f 2f 63 6f 6e 73 6f 6c 65 2e 6c 6f      //console.lo
1b20: 67 28 74 68 69 73 2e 67 65 74 49 6e 66 6f 28 29  g(this.getInfo()
1b30: 29 3b 0a 20 20 20 20 20 20 20 20 74 68 69 73 2e  );.        this.
1b40: 62 41 63 72 6f 6e 79 6d 56 61 6c 69 64 20 3d 20  bAcronymValid = 
1b50: 66 61 6c 73 65 3b 0a 20 20 20 20 20 20 20 20 74  false;.        t
1b60: 68 69 73 2e 62 4e 75 6d 41 74 4c 61 73 74 56 61  his.bNumAtLastVa
1b70: 6c 69 64 20 3d 20 66 61 6c 73 65 3b 0a 20 20 20  lid = false;.   
1b80: 20 7d 0a 0a 20 20 20 20 67 65 74 49 6e 66 6f 20   }..    getInfo 
1b90: 28 29 20 7b 0a 20 20 20 20 20 20 20 20 72 65 74  () {.        ret
1ba0: 75 72 6e 20 20 60 20 20 4c 61 6e 67 75 61 67 65  urn  `  Language
1bb0: 3a 20 24 7b 74 68 69 73 2e 73 4c 61 6e 67 4e 61  : ${this.sLangNa
1bc0: 6d 65 7d 20 20 20 4c 61 6e 67 20 63 6f 64 65 3a  me}   Lang code:
1bd0: 20 24 7b 74 68 69 73 2e 73 4c 61 6e 67 43 6f 64   ${this.sLangCod
1be0: 65 7d 20 20 20 44 69 63 74 69 6f 6e 61 72 79 20  e}   Dictionary 
1bf0: 6e 61 6d 65 3a 20 24 7b 74 68 69 73 2e 73 44 69  name: ${this.sDi
1c00: 63 4e 61 6d 65 7d 5c 6e 60 20 2b 0a 20 20 20 20  cName}\n` +.    
1c10: 20 20 20 20 20 20 20 20 20 20 20 20 60 20 20 43              `  C
1c20: 6f 6d 70 72 65 73 73 69 6f 6e 20 6d 65 74 68 6f  ompression metho
1c30: 64 3a 20 24 7b 74 68 69 73 2e 6e 43 6f 6d 70 72  d: ${this.nCompr
1c40: 65 73 73 69 6f 6e 4d 65 74 68 6f 64 7d 20 20 20  essionMethod}   
1c50: 44 61 74 65 3a 20 24 7b 74 68 69 73 2e 73 44 61  Date: ${this.sDa
1c60: 74 65 7d 20 20 20 53 74 65 6d 6d 69 6e 67 3a 20  te}   Stemming: 
1c70: 24 7b 74 68 69 73 2e 63 53 74 65 6d 6d 69 6e 67  ${this.cStemming
1c80: 7d 46 58 5c 6e 60 20 2b 0a 20 20 20 20 20 20 20  }FX\n` +.       
1c90: 20 20 20 20 20 20 20 20 20 60 20 20 41 72 63 73           `  Arcs
1ca0: 20 76 61 6c 75 65 73 3a 20 20 24 7b 74 68 69 73   values:  ${this
1cb0: 2e 6e 41 72 63 56 61 6c 7d 20 3d 20 24 7b 74 68  .nArcVal} = ${th
1cc0: 69 73 2e 6e 43 68 61 72 7d 20 63 68 61 72 61 63  is.nChar} charac
1cd0: 74 65 72 73 2c 20 20 24 7b 74 68 69 73 2e 6e 41  ters,  ${this.nA
1ce0: 66 66 7d 20 61 66 66 69 78 65 73 2c 20 20 24 7b  ff} affixes,  ${
1cf0: 74 68 69 73 2e 6e 54 61 67 7d 20 74 61 67 73 5c  this.nTag} tags\
1d00: 6e 60 20 2b 0a 20 20 20 20 20 20 20 20 20 20 20  n` +.           
1d10: 20 20 20 20 20 60 20 20 44 69 63 74 69 6f 6e 61       `  Dictiona
1d20: 72 79 3a 20 24 7b 74 68 69 73 2e 6e 45 6e 74 72  ry: ${this.nEntr
1d30: 79 7d 20 65 6e 74 72 69 65 73 2c 20 20 20 20 24  y} entries,    $
1d40: 7b 74 68 69 73 2e 6e 4e 6f 64 65 7d 20 6e 6f 64  {this.nNode} nod
1d50: 65 73 2c 20 20 20 24 7b 74 68 69 73 2e 6e 41 72  es,   ${this.nAr
1d60: 63 7d 20 61 72 63 73 5c 6e 60 20 2b 0a 20 20 20  c} arcs\n` +.   
1d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 60 20 20               `  
1d80: 41 64 64 72 65 73 73 20 73 69 7a 65 3a 20 24 7b  Address size: ${
1d90: 74 68 69 73 2e 6e 42 79 74 65 73 4e 6f 64 65 41  this.nBytesNodeA
1da0: 64 64 72 65 73 73 7d 20 62 79 74 65 73 2c 20 20  ddress} bytes,  
1db0: 41 72 63 20 73 69 7a 65 3a 20 24 7b 74 68 69 73  Arc size: ${this
1dc0: 2e 6e 42 79 74 65 73 41 72 63 7d 20 62 79 74 65  .nBytesArc} byte
1dd0: 73 5c 6e 60 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  s\n`;.    }..   
1de0: 20 67 65 74 4a 53 4f 4e 20 28 29 20 7b 0a 20 20   getJSON () {.  
1df0: 20 20 20 20 20 20 6c 65 74 20 6f 4a 53 4f 4e 20        let oJSON 
1e00: 3d 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  = {.            
1e10: 22 73 48 65 61 64 65 72 22 3a 20 22 2f 67 72 61  "sHeader": "/gra
1e20: 6d 6d 61 6c 65 63 74 65 2d 66 73 61 2f 22 2c 0a  mmalecte-fsa/",.
1e30: 20 20 20 20 20 20 20 20 20 20 20 20 22 73 4c 61              "sLa
1e40: 6e 67 43 6f 64 65 22 3a 20 74 68 69 73 2e 73 4c  ngCode": this.sL
1e50: 61 6e 67 43 6f 64 65 2c 0a 20 20 20 20 20 20 20  angCode,.       
1e60: 20 20 20 20 20 22 73 4c 61 6e 67 4e 61 6d 65 22       "sLangName"
1e70: 3a 20 74 68 69 73 2e 73 4c 61 6e 67 4e 61 6d 65  : this.sLangName
1e80: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 73  ,.            "s
1e90: 44 69 63 4e 61 6d 65 22 3a 20 74 68 69 73 2e 73  DicName": this.s
1ea0: 44 69 63 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20  DicName,.       
1eb0: 20 20 20 20 20 22 73 46 69 6c 65 4e 61 6d 65 22       "sFileName"
1ec0: 3a 20 74 68 69 73 2e 73 46 69 6c 65 4e 61 6d 65  : this.sFileName
1ed0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 73  ,.            "s
1ee0: 44 61 74 65 22 3a 20 74 68 69 73 2e 73 44 61 74  Date": this.sDat
1ef0: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  e,.            "
1f00: 6e 45 6e 74 72 79 22 3a 20 74 68 69 73 2e 6e 45  nEntry": this.nE
1f10: 6e 74 72 79 2c 0a 20 20 20 20 20 20 20 20 20 20  ntry,.          
1f20: 20 20 22 6e 43 68 61 72 22 3a 20 74 68 69 73 2e    "nChar": this.
1f30: 6e 43 68 61 72 2c 0a 20 20 20 20 20 20 20 20 20  nChar,.         
1f40: 20 20 20 22 6e 41 66 66 22 3a 20 74 68 69 73 2e     "nAff": this.
1f50: 6e 41 66 66 2c 0a 20 20 20 20 20 20 20 20 20 20  nAff,.          
1f60: 20 20 22 6e 54 61 67 22 3a 20 74 68 69 73 2e 6e    "nTag": this.n
1f70: 54 61 67 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Tag,.           
1f80: 20 22 63 53 74 65 6d 6d 69 6e 67 22 3a 20 74 68   "cStemming": th
1f90: 69 73 2e 63 53 74 65 6d 6d 69 6e 67 2c 0a 20 20  is.cStemming,.  
1fa0: 20 20 20 20 20 20 20 20 20 20 22 64 43 68 61 72            "dChar
1fb0: 22 3a 20 68 65 6c 70 65 72 73 2e 6d 61 70 54 6f  ": helpers.mapTo
1fc0: 4f 62 6a 65 63 74 28 74 68 69 73 2e 64 43 68 61  Object(this.dCha
1fd0: 72 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  r),.            
1fe0: 22 6e 4e 6f 64 65 22 3a 20 74 68 69 73 2e 6e 4e  "nNode": this.nN
1ff0: 6f 64 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ode,.           
2000: 20 22 6e 41 72 63 22 3a 20 74 68 69 73 2e 6e 41   "nArc": this.nA
2010: 72 63 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  rc,.            
2020: 22 6c 41 72 63 56 61 6c 22 3a 20 74 68 69 73 2e  "lArcVal": this.
2030: 6c 41 72 63 56 61 6c 2c 0a 20 20 20 20 20 20 20  lArcVal,.       
2040: 20 20 20 20 20 22 6e 41 72 63 56 61 6c 22 3a 20       "nArcVal": 
2050: 74 68 69 73 2e 6e 41 72 63 56 61 6c 2c 0a 20 20  this.nArcVal,.  
2060: 20 20 20 20 20 20 20 20 20 20 22 6e 43 6f 6d 70            "nComp
2070: 72 65 73 73 69 6f 6e 4d 65 74 68 6f 64 22 3a 20  ressionMethod": 
2080: 74 68 69 73 2e 6e 43 6f 6d 70 72 65 73 73 69 6f  this.nCompressio
2090: 6e 4d 65 74 68 6f 64 2c 0a 20 20 20 20 20 20 20  nMethod,.       
20a0: 20 20 20 20 20 22 6e 42 79 74 65 73 41 72 63 22       "nBytesArc"
20b0: 3a 20 74 68 69 73 2e 6e 42 79 74 65 73 41 72 63  : this.nBytesArc
20c0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 6e  ,.            "n
20d0: 42 79 74 65 73 4e 6f 64 65 41 64 64 72 65 73 73  BytesNodeAddress
20e0: 22 3a 20 74 68 69 73 2e 6e 42 79 74 65 73 4e 6f  ": this.nBytesNo
20f0: 64 65 41 64 64 72 65 73 73 2c 0a 20 20 20 20 20  deAddress,.     
2100: 20 20 20 20 20 20 20 22 6e 42 79 74 65 73 4f 66         "nBytesOf
2110: 66 73 65 74 22 3a 20 74 68 69 73 2e 6e 42 79 74  fset": this.nByt
2120: 65 73 4f 66 66 73 65 74 2c 0a 20 20 20 20 20 20  esOffset,.      
2130: 20 20 20 20 20 20 22 73 42 79 44 69 63 22 3a 20        "sByDic": 
2140: 74 68 69 73 2e 73 42 79 44 69 63 2c 20 20 2f 2f  this.sByDic,  //
2150: 20 62 69 6e 61 72 79 20 77 6f 72 64 20 67 72 61   binary word gra
2160: 70 68 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  ph.            "
2170: 6c 32 67 72 61 6d 73 22 3a 20 74 68 69 73 2e 6c  l2grams": this.l
2180: 32 67 72 61 6d 73 0a 20 20 20 20 20 20 20 20 7d  2grams.        }
2190: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
21a0: 20 6f 4a 53 4f 4e 3b 0a 20 20 20 20 7d 0a 0a 20   oJSON;.    }.. 
21b0: 20 20 20 69 73 56 61 6c 69 64 54 6f 6b 65 6e 20     isValidToken 
21c0: 28 73 54 6f 6b 65 6e 29 20 7b 0a 20 20 20 20 20  (sToken) {.     
21d0: 20 20 20 2f 2f 20 63 68 65 63 6b 73 20 69 66 20     // checks if 
21e0: 73 54 6f 6b 65 6e 20 69 73 20 76 61 6c 69 64 20  sToken is valid 
21f0: 28 69 66 20 74 68 65 72 65 20 69 73 20 68 79 70  (if there is hyp
2200: 68 65 6e 73 20 69 6e 20 73 54 6f 6b 65 6e 2c 20  hens in sToken, 
2210: 73 54 6f 6b 65 6e 20 69 73 20 73 70 6c 69 74 2c  sToken is split,
2220: 20 65 61 63 68 20 70 61 72 74 20 69 73 20 63 68   each part is ch
2230: 65 63 6b 65 64 29 0a 20 20 20 20 20 20 20 20 73  ecked).        s
2240: 54 6f 6b 65 6e 20 3d 20 63 68 61 72 5f 70 6c 61  Token = char_pla
2250: 79 65 72 2e 73 70 65 6c 6c 69 6e 67 4e 6f 72 6d  yer.spellingNorm
2260: 61 6c 69 7a 61 74 69 6f 6e 28 73 54 6f 6b 65 6e  alization(sToken
2270: 29 0a 20 20 20 20 20 20 20 20 69 66 20 28 74 68  ).        if (th
2280: 69 73 2e 69 73 56 61 6c 69 64 28 73 54 6f 6b 65  is.isValid(sToke
2290: 6e 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  n)) {.          
22a0: 20 20 72 65 74 75 72 6e 20 74 72 75 65 3b 0a 20    return true;. 
22b0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
22c0: 20 69 66 20 28 73 54 6f 6b 65 6e 2e 69 6e 63 6c   if (sToken.incl
22d0: 75 64 65 73 28 22 2d 22 29 29 20 7b 0a 20 20 20  udes("-")) {.   
22e0: 20 20 20 20 20 20 20 20 20 69 66 20 28 73 54 6f           if (sTo
22f0: 6b 65 6e 2e 67 6c 5f 63 6f 75 6e 74 28 22 2d 22  ken.gl_count("-"
2300: 29 20 3e 20 34 29 20 7b 0a 20 20 20 20 20 20 20  ) > 4) {.       
2310: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
2320: 74 72 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  true;.          
2330: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
2340: 72 65 74 75 72 6e 20 73 54 6f 6b 65 6e 2e 73 70  return sToken.sp
2350: 6c 69 74 28 22 2d 22 29 2e 65 76 65 72 79 28 73  lit("-").every(s
2360: 57 6f 72 64 20 20 3d 3e 20 20 74 68 69 73 2e 69  Word  =>  this.i
2370: 73 56 61 6c 69 64 28 73 57 6f 72 64 29 29 3b 0a  sValid(sWord));.
2380: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2390: 20 20 69 66 20 28 73 54 6f 6b 65 6e 2e 69 6e 63    if (sToken.inc
23a0: 6c 75 64 65 73 28 22 2e 22 29 20 7c 7c 20 73 54  ludes(".") || sT
23b0: 6f 6b 65 6e 2e 69 6e 63 6c 75 64 65 73 28 22 c2  oken.includes(".
23c0: b7 22 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20  .")) {.         
23d0: 20 20 20 72 65 74 75 72 6e 20 74 72 75 65 3b 0a     return true;.
23e0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
23f0: 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65 3b 0a    return false;.
2400: 20 20 20 20 7d 0a 0a 20 20 20 20 69 73 56 61 6c      }..    isVal
2410: 69 64 20 28 73 57 6f 72 64 29 20 7b 0a 20 20 20  id (sWord) {.   
2420: 20 20 20 20 20 2f 2f 20 63 68 65 63 6b 73 20 69       // checks i
2430: 66 20 73 57 6f 72 64 20 69 73 20 76 61 6c 69 64  f sWord is valid
2440: 20 28 64 69 66 66 65 72 65 6e 74 20 63 61 73 69   (different casi
2450: 6e 67 20 74 65 73 74 65 64 20 69 66 20 74 68 65  ng tested if the
2460: 20 66 69 72 73 74 20 6c 65 74 74 65 72 20 69 73   first letter is
2470: 20 61 20 63 61 70 69 74 61 6c 29 0a 20 20 20 20   a capital).    
2480: 20 20 20 20 69 66 20 28 21 73 57 6f 72 64 29 20      if (!sWord) 
2490: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  {.            re
24a0: 74 75 72 6e 20 6e 75 6c 6c 3b 0a 20 20 20 20 20  turn null;.     
24b0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 20     }.        if 
24c0: 28 73 57 6f 72 64 2e 69 6e 63 6c 75 64 65 73 28  (sWord.includes(
24d0: 22 27 22 29 29 20 7b 20 2f 2f 20 75 67 6c 79 20  "'")) { // ugly 
24e0: 68 61 63 6b 0a 20 20 20 20 20 20 20 20 20 20 20  hack.           
24f0: 20 73 57 6f 72 64 20 3d 20 73 57 6f 72 64 2e 72   sWord = sWord.r
2500: 65 70 6c 61 63 65 28 22 27 22 2c 20 22 e2 80 99  eplace("'", "...
2510: 22 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ");.        }.  
2520: 20 20 20 20 20 20 69 66 20 28 74 68 69 73 2e 6c        if (this.l
2530: 6f 6f 6b 75 70 28 73 57 6f 72 64 29 29 20 7b 0a  ookup(sWord)) {.
2540: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
2550: 72 6e 20 74 72 75 65 3b 0a 20 20 20 20 20 20 20  rn true;.       
2560: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 20 28 73   }.        if (s
2570: 57 6f 72 64 2e 63 68 61 72 41 74 28 30 29 2e 67  Word.charAt(0).g
2580: 6c 5f 69 73 55 70 70 65 72 43 61 73 65 28 29 29  l_isUpperCase())
2590: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69   {.            i
25a0: 66 20 28 73 57 6f 72 64 2e 6c 65 6e 67 74 68 20  f (sWord.length 
25b0: 3e 20 31 29 20 7b 0a 20 20 20 20 20 20 20 20 20  > 1) {.         
25c0: 20 20 20 20 20 20 20 69 66 20 28 73 57 6f 72 64         if (sWord
25d0: 2e 67 6c 5f 69 73 54 69 74 6c 65 28 29 29 20 7b  .gl_isTitle()) {
25e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
25f0: 20 20 20 20 20 72 65 74 75 72 6e 20 21 21 74 68       return !!th
2600: 69 73 2e 6c 6f 6f 6b 75 70 28 73 57 6f 72 64 2e  is.lookup(sWord.
2610: 74 6f 4c 6f 77 65 72 43 61 73 65 28 29 29 3b 0a  toLowerCase());.
2620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2630: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
2640: 20 20 69 66 20 28 73 57 6f 72 64 2e 67 6c 5f 69    if (sWord.gl_i
2650: 73 55 70 70 65 72 43 61 73 65 28 29 29 20 7b 0a  sUpperCase()) {.
2660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2670: 20 20 20 20 69 66 20 28 74 68 69 73 2e 62 41 63      if (this.bAc
2680: 72 6f 6e 79 6d 56 61 6c 69 64 29 20 7b 0a 20 20  ronymValid) {.  
2690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26a0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 72 75        return tru
26b0: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e;.             
26c0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
26d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74               ret
26e0: 75 72 6e 20 21 21 28 74 68 69 73 2e 6c 6f 6f 6b  urn !!(this.look
26f0: 75 70 28 73 57 6f 72 64 2e 74 6f 4c 6f 77 65 72  up(sWord.toLower
2700: 43 61 73 65 28 29 29 20 7c 7c 20 74 68 69 73 2e  Case()) || this.
2710: 6c 6f 6f 6b 75 70 28 73 57 6f 72 64 2e 67 6c 5f  lookup(sWord.gl_
2720: 74 6f 43 61 70 69 74 61 6c 69 7a 65 28 29 29 29  toCapitalize()))
2730: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2740: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
2750: 20 20 20 20 72 65 74 75 72 6e 20 21 21 74 68 69      return !!thi
2760: 73 2e 6c 6f 6f 6b 75 70 28 73 57 6f 72 64 2e 73  s.lookup(sWord.s
2770: 6c 69 63 65 28 30 2c 20 31 29 2e 74 6f 4c 6f 77  lice(0, 1).toLow
2780: 65 72 43 61 73 65 28 29 20 2b 20 73 57 6f 72 64  erCase() + sWord
2790: 2e 73 6c 69 63 65 28 31 29 29 3b 0a 20 20 20 20  .slice(1));.    
27a0: 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
27b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
27c0: 20 72 65 74 75 72 6e 20 21 21 74 68 69 73 2e 6c   return !!this.l
27d0: 6f 6f 6b 75 70 28 73 57 6f 72 64 2e 74 6f 4c 6f  ookup(sWord.toLo
27e0: 77 65 72 43 61 73 65 28 29 29 3b 0a 20 20 20 20  werCase());.    
27f0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2800: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 20 28    }.        if (
2810: 73 57 6f 72 64 2e 73 6c 69 63 65 28 30 2c 31 29  sWord.slice(0,1)
2820: 2e 67 6c 5f 69 73 44 69 67 69 74 28 29 29 20 7b  .gl_isDigit()) {
2830: 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
2840: 75 72 6e 20 74 72 75 65 3b 0a 20 20 20 20 20 20  urn true;.      
2850: 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 74 75    }.        retu
2860: 72 6e 20 66 61 6c 73 65 3b 0a 20 20 20 20 7d 0a  rn false;.    }.
2870: 0a 20 20 20 20 5f 63 6f 6e 76 42 79 74 65 73 54  .    _convBytesT
2880: 6f 49 6e 74 65 67 65 72 20 28 61 42 79 74 65 73  oInteger (aBytes
2890: 29 20 7b 0a 20 20 20 20 20 20 20 20 2f 2f 20 42  ) {.        // B
28a0: 79 74 65 20 6f 72 64 65 72 20 3d 20 42 69 67 20  yte order = Big 
28b0: 45 6e 64 69 61 6e 20 28 62 69 67 67 65 72 20 66  Endian (bigger f
28c0: 69 72 73 74 29 0a 20 20 20 20 20 20 20 20 6c 65  irst).        le
28d0: 74 20 6e 56 61 6c 20 3d 20 30 3b 0a 20 20 20 20  t nVal = 0;.    
28e0: 20 20 20 20 6c 65 74 20 6e 57 65 69 67 68 74 20      let nWeight 
28f0: 3d 20 28 61 42 79 74 65 73 2e 6c 65 6e 67 74 68  = (aBytes.length
2900: 20 2d 20 31 29 20 2a 20 38 3b 0a 20 20 20 20 20   - 1) * 8;.     
2910: 20 20 20 66 6f 72 20 28 6c 65 74 20 6e 20 6f 66     for (let n of
2920: 20 61 42 79 74 65 73 29 20 7b 0a 20 20 20 20 20   aBytes) {.     
2930: 20 20 20 20 20 20 20 6e 56 61 6c 20 2b 3d 20 6e         nVal += n
2940: 20 3c 3c 20 6e 57 65 69 67 68 74 3b 0a 20 20 20   << nWeight;.   
2950: 20 20 20 20 20 20 20 20 20 6e 57 65 69 67 68 74           nWeight
2960: 20 3d 20 6e 57 65 69 67 68 74 20 2d 20 38 3b 0a   = nWeight - 8;.
2970: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2980: 20 20 72 65 74 75 72 6e 20 6e 56 61 6c 3b 0a 20    return nVal;. 
2990: 20 20 20 7d 0a 0a 20 20 20 20 6c 6f 6f 6b 75 70     }..    lookup
29a0: 20 28 73 57 6f 72 64 29 20 7b 0a 20 20 20 20 20   (sWord) {.     
29b0: 20 20 20 2f 2f 20 72 65 74 75 72 6e 73 20 74 72     // returns tr
29c0: 75 65 20 69 66 20 73 57 6f 72 64 20 69 6e 20 64  ue if sWord in d
29d0: 69 63 74 69 6f 6e 61 72 79 20 28 73 74 72 69 63  ictionary (stric
29e0: 74 20 76 65 72 69 66 69 63 61 74 69 6f 6e 29 0a  t verification).
29f0: 20 20 20 20 20 20 20 20 6c 65 74 20 69 41 64 64          let iAdd
2a00: 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 66  r = 0;.        f
2a10: 6f 72 20 28 6c 65 74 20 63 20 6f 66 20 73 57 6f  or (let c of sWo
2a20: 72 64 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  rd) {.          
2a30: 20 20 69 66 20 28 21 74 68 69 73 2e 64 43 68 61    if (!this.dCha
2a40: 72 2e 68 61 73 28 63 29 29 20 7b 0a 20 20 20 20  r.has(c)) {.    
2a50: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
2a60: 72 6e 20 66 61 6c 73 65 3b 0a 20 20 20 20 20 20  rn false;.      
2a70: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2a80: 20 20 20 20 69 41 64 64 72 20 3d 20 74 68 69 73      iAddr = this
2a90: 2e 5f 6c 6f 6f 6b 75 70 41 72 63 4e 6f 64 65 28  ._lookupArcNode(
2aa0: 74 68 69 73 2e 64 43 68 61 72 2e 67 65 74 28 63  this.dChar.get(c
2ab0: 29 2c 20 69 41 64 64 72 29 3b 0a 20 20 20 20 20  ), iAddr);.     
2ac0: 20 20 20 20 20 20 20 69 66 20 28 69 41 64 64 72         if (iAddr
2ad0: 20 3d 3d 3d 20 6e 75 6c 6c 29 20 7b 0a 20 20 20   === null) {.   
2ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74               ret
2af0: 75 72 6e 20 66 61 6c 73 65 3b 0a 20 20 20 20 20  urn false;.     
2b00: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2b10: 20 7d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72   }.        retur
2b20: 6e 20 42 6f 6f 6c 65 61 6e 28 74 68 69 73 2e 5f  n Boolean(this._
2b30: 63 6f 6e 76 42 79 74 65 73 54 6f 49 6e 74 65 67  convBytesToInteg
2b40: 65 72 28 74 68 69 73 2e 62 79 44 69 63 2e 73 6c  er(this.byDic.sl
2b50: 69 63 65 28 69 41 64 64 72 2c 20 69 41 64 64 72  ice(iAddr, iAddr
2b60: 2b 74 68 69 73 2e 6e 42 79 74 65 73 41 72 63 29  +this.nBytesArc)
2b70: 29 20 26 20 74 68 69 73 2e 5f 66 69 6e 61 6c 4e  ) & this._finalN
2b80: 6f 64 65 4d 61 73 6b 29 3b 0a 20 20 20 20 7d 0a  odeMask);.    }.
2b90: 0a 20 20 20 20 67 65 74 4d 6f 72 70 68 20 28 73  .    getMorph (s
2ba0: 57 6f 72 64 29 20 7b 0a 20 20 20 20 20 20 20 20  Word) {.        
2bb0: 2f 2f 20 72 65 74 72 69 65 76 65 73 20 6d 6f 72  // retrieves mor
2bc0: 70 68 6f 6c 6f 67 69 65 73 20 6c 69 73 74 2c 20  phologies list, 
2bd0: 64 69 66 66 65 72 65 6e 74 20 63 61 73 69 6e 67  different casing
2be0: 20 61 6c 6c 6f 77 65 64 0a 20 20 20 20 20 20 20   allowed.       
2bf0: 20 73 57 6f 72 64 20 3d 20 63 68 61 72 5f 70 6c   sWord = char_pl
2c00: 61 79 65 72 2e 73 70 65 6c 6c 69 6e 67 4e 6f 72  ayer.spellingNor
2c10: 6d 61 6c 69 7a 61 74 69 6f 6e 28 73 57 6f 72 64  malization(sWord
2c20: 29 0a 20 20 20 20 20 20 20 20 6c 65 74 20 6c 20  ).        let l 
2c30: 3d 20 74 68 69 73 2e 6d 6f 72 70 68 28 73 57 6f  = this.morph(sWo
2c40: 72 64 29 3b 0a 20 20 20 20 20 20 20 20 69 66 20  rd);.        if 
2c50: 28 73 57 6f 72 64 5b 30 5d 2e 67 6c 5f 69 73 55  (sWord[0].gl_isU
2c60: 70 70 65 72 43 61 73 65 28 29 29 20 7b 0a 20 20  pperCase()) {.  
2c70: 20 20 20 20 20 20 20 20 20 20 6c 2e 70 75 73 68            l.push
2c80: 28 2e 2e 2e 74 68 69 73 2e 6d 6f 72 70 68 28 73  (...this.morph(s
2c90: 57 6f 72 64 2e 74 6f 4c 6f 77 65 72 43 61 73 65  Word.toLowerCase
2ca0: 28 29 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ()));.          
2cb0: 20 20 69 66 20 28 73 57 6f 72 64 2e 67 6c 5f 69    if (sWord.gl_i
2cc0: 73 55 70 70 65 72 43 61 73 65 28 29 20 26 26 20  sUpperCase() && 
2cd0: 73 57 6f 72 64 2e 6c 65 6e 67 74 68 20 3e 20 31  sWord.length > 1
2ce0: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
2cf0: 20 20 20 20 6c 2e 70 75 73 68 28 2e 2e 2e 74 68      l.push(...th
2d00: 69 73 2e 6d 6f 72 70 68 28 73 57 6f 72 64 2e 67  is.morph(sWord.g
2d10: 6c 5f 74 6f 43 61 70 69 74 61 6c 69 7a 65 28 29  l_toCapitalize()
2d20: 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ));.            
2d30: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
2d40: 20 20 20 20 72 65 74 75 72 6e 20 6c 3b 0a 20 20      return l;.  
2d50: 20 20 7d 0a 0a 20 20 20 20 73 75 67 67 65 73 74    }..    suggest
2d60: 20 28 73 57 6f 72 64 2c 20 6e 53 75 67 67 4c 69   (sWord, nSuggLi
2d70: 6d 69 74 3d 31 30 29 20 7b 0a 20 20 20 20 20 20  mit=10) {.      
2d80: 20 20 2f 2f 20 72 65 74 75 72 6e 73 20 61 20 61    // returns a a
2d90: 72 72 61 79 20 6f 66 20 73 75 67 67 65 73 74 69  rray of suggesti
2da0: 6f 6e 73 20 66 6f 72 20 3c 73 57 6f 72 64 3e 0a  ons for <sWord>.
2db0: 20 20 20 20 20 20 20 20 73 57 6f 72 64 20 3d 20          sWord = 
2dc0: 63 68 61 72 5f 70 6c 61 79 65 72 2e 73 70 65 6c  char_player.spel
2dd0: 6c 69 6e 67 4e 6f 72 6d 61 6c 69 7a 61 74 69 6f  lingNormalizatio
2de0: 6e 28 73 57 6f 72 64 29 0a 20 20 20 20 20 20 20  n(sWord).       
2df0: 20 6c 65 74 20 73 50 66 78 20 3d 20 22 22 3b 0a   let sPfx = "";.
2e00: 20 20 20 20 20 20 20 20 6c 65 74 20 73 53 66 78          let sSfx
2e10: 20 3d 20 22 22 3b 0a 20 20 20 20 20 20 20 20 5b   = "";.        [
2e20: 73 50 66 78 2c 20 73 57 6f 72 64 2c 20 73 53 66  sPfx, sWord, sSf
2e30: 78 5d 20 3d 20 63 68 61 72 5f 70 6c 61 79 65 72  x] = char_player
2e40: 2e 63 75 74 28 73 57 6f 72 64 29 3b 0a 20 20 20  .cut(sWord);.   
2e50: 20 20 20 20 20 6c 65 74 20 6e 4d 61 78 53 77 69       let nMaxSwi
2e60: 74 63 68 20 3d 20 4d 61 74 68 2e 6d 61 78 28 4d  tch = Math.max(M
2e70: 61 74 68 2e 66 6c 6f 6f 72 28 73 57 6f 72 64 2e  ath.floor(sWord.
2e80: 6c 65 6e 67 74 68 20 2f 20 33 29 2c 20 31 29 3b  length / 3), 1);
2e90: 0a 20 20 20 20 20 20 20 20 6c 65 74 20 6e 4d 61  .        let nMa
2ea0: 78 44 65 6c 20 3d 20 4d 61 74 68 2e 66 6c 6f 6f  xDel = Math.floo
2eb0: 72 28 73 57 6f 72 64 2e 6c 65 6e 67 74 68 20 2f  r(sWord.length /
2ec0: 20 35 29 3b 0a 20 20 20 20 20 20 20 20 6c 65 74   5);.        let
2ed0: 20 6e 4d 61 78 48 61 72 64 52 65 70 6c 20 3d 20   nMaxHardRepl = 
2ee0: 4d 61 74 68 2e 6d 61 78 28 4d 61 74 68 2e 66 6c  Math.max(Math.fl
2ef0: 6f 6f 72 28 28 73 57 6f 72 64 2e 6c 65 6e 67 74  oor((sWord.lengt
2f00: 68 20 2d 20 35 29 20 2f 20 34 29 2c 20 31 29 3b  h - 5) / 4), 1);
2f10: 0a 20 20 20 20 20 20 20 20 6c 65 74 20 6e 4d 61  .        let nMa
2f20: 78 4a 75 6d 70 20 3d 20 4d 61 74 68 2e 6d 61 78  xJump = Math.max
2f30: 28 4d 61 74 68 2e 66 6c 6f 6f 72 28 73 57 6f 72  (Math.floor(sWor
2f40: 64 2e 6c 65 6e 67 74 68 20 2f 20 34 29 2c 20 31  d.length / 4), 1
2f50: 29 3b 0a 20 20 20 20 20 20 20 20 6c 65 74 20 6f  );.        let o
2f60: 53 75 67 67 52 65 73 75 6c 74 20 3d 20 6e 65 77  SuggResult = new
2f70: 20 53 75 67 67 52 65 73 75 6c 74 28 73 57 6f 72   SuggResult(sWor
2f80: 64 29 3b 0a 20 20 20 20 20 20 20 20 74 68 69 73  d);.        this
2f90: 2e 5f 73 75 67 67 65 73 74 28 6f 53 75 67 67 52  ._suggest(oSuggR
2fa0: 65 73 75 6c 74 2c 20 73 57 6f 72 64 2c 20 6e 4d  esult, sWord, nM
2fb0: 61 78 53 77 69 74 63 68 2c 20 6e 4d 61 78 44 65  axSwitch, nMaxDe
2fc0: 6c 2c 20 6e 4d 61 78 48 61 72 64 52 65 70 6c 2c  l, nMaxHardRepl,
2fd0: 20 6e 4d 61 78 4a 75 6d 70 29 3b 0a 20 20 20 20   nMaxJump);.    
2fe0: 20 20 20 20 6c 65 74 20 61 53 75 67 67 20 3d 20      let aSugg = 
2ff0: 6f 53 75 67 67 52 65 73 75 6c 74 2e 67 65 74 53  oSuggResult.getS
3000: 75 67 67 65 73 74 69 6f 6e 73 28 6e 53 75 67 67  uggestions(nSugg
3010: 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 20 20  Limit);.        
3020: 69 66 20 28 73 53 66 78 20 7c 7c 20 73 50 66 78  if (sSfx || sPfx
3030: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
3040: 2f 2f 20 77 65 20 61 64 64 20 77 68 61 74 20 77  // we add what w
3050: 65 20 72 65 6d 6f 76 65 64 0a 20 20 20 20 20 20  e removed.      
3060: 20 20 20 20 20 20 72 65 74 75 72 6e 20 61 53 75        return aSu
3070: 67 67 2e 6d 61 70 28 20 28 73 53 75 67 67 29 20  gg.map( (sSugg) 
3080: 3d 3e 20 7b 20 72 65 74 75 72 6e 20 73 50 66 78  => { return sPfx
3090: 20 2b 20 73 53 75 67 67 20 2b 20 73 53 66 78 20   + sSugg + sSfx 
30a0: 7d 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  } );.        }. 
30b0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 61 53         return aS
30c0: 75 67 67 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ugg;.    }..    
30d0: 5f 73 75 67 67 65 73 74 20 28 6f 53 75 67 67 52  _suggest (oSuggR
30e0: 65 73 75 6c 74 2c 20 73 52 65 6d 61 69 6e 2c 20  esult, sRemain, 
30f0: 6e 4d 61 78 53 77 69 74 63 68 3d 30 2c 20 6e 4d  nMaxSwitch=0, nM
3100: 61 78 44 65 6c 3d 30 2c 20 6e 4d 61 78 48 61 72  axDel=0, nMaxHar
3110: 64 52 65 70 6c 3d 30 2c 20 6e 4d 61 78 4a 75 6d  dRepl=0, nMaxJum
3120: 70 3d 30 2c 20 6e 44 69 73 74 3d 30 2c 20 6e 44  p=0, nDist=0, nD
3130: 65 65 70 3d 30 2c 20 69 41 64 64 72 3d 30 2c 20  eep=0, iAddr=0, 
3140: 73 4e 65 77 57 6f 72 64 3d 22 22 2c 20 62 41 76  sNewWord="", bAv
3150: 6f 69 64 4c 6f 6f 70 3d 66 61 6c 73 65 29 20 7b  oidLoop=false) {
3160: 0a 20 20 20 20 20 20 20 20 2f 2f 20 72 65 74 75  .        // retu
3170: 72 6e 73 20 61 20 73 65 74 20 6f 66 20 73 75 67  rns a set of sug
3180: 67 65 73 74 69 6f 6e 73 0a 20 20 20 20 20 20 20  gestions.       
3190: 20 2f 2f 20 72 65 63 75 72 73 69 76 65 20 66 75   // recursive fu
31a0: 6e 63 74 69 6f 6e 0a 20 20 20 20 20 20 20 20 69  nction.        i
31b0: 66 20 28 73 52 65 6d 61 69 6e 20 3d 3d 20 22 22  f (sRemain == ""
31c0: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
31d0: 69 66 20 28 74 68 69 73 2e 5f 63 6f 6e 76 42 79  if (this._convBy
31e0: 74 65 73 54 6f 49 6e 74 65 67 65 72 28 74 68 69  tesToInteger(thi
31f0: 73 2e 62 79 44 69 63 2e 73 6c 69 63 65 28 69 41  s.byDic.slice(iA
3200: 64 64 72 2c 20 69 41 64 64 72 2b 74 68 69 73 2e  ddr, iAddr+this.
3210: 6e 42 79 74 65 73 41 72 63 29 29 20 26 20 74 68  nBytesArc)) & th
3220: 69 73 2e 5f 66 69 6e 61 6c 4e 6f 64 65 4d 61 73  is._finalNodeMas
3230: 6b 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  k) {.           
3240: 20 20 20 20 20 6f 53 75 67 67 52 65 73 75 6c 74       oSuggResult
3250: 2e 61 64 64 53 75 67 67 28 73 4e 65 77 57 6f 72  .addSugg(sNewWor
3260: 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  d);.            
3270: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f  }.            fo
3280: 72 20 28 6c 65 74 20 73 54 61 69 6c 20 6f 66 20  r (let sTail of 
3290: 74 68 69 73 2e 5f 67 65 74 54 61 69 6c 73 28 69  this._getTails(i
32a0: 41 64 64 72 29 29 20 7b 0a 20 20 20 20 20 20 20  Addr)) {.       
32b0: 20 20 20 20 20 20 20 20 20 6f 53 75 67 67 52 65           oSuggRe
32c0: 73 75 6c 74 2e 61 64 64 53 75 67 67 28 73 4e 65  sult.addSugg(sNe
32d0: 77 57 6f 72 64 2b 73 54 61 69 6c 29 3b 0a 20 20  wWord+sTail);.  
32e0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
32f0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a          return;.
3300: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
3310: 20 20 69 66 20 28 6e 44 69 73 74 20 3e 20 6f 53    if (nDist > oS
3320: 75 67 67 52 65 73 75 6c 74 2e 6e 44 69 73 74 4c  uggResult.nDistL
3330: 69 6d 69 74 29 20 7b 0a 20 20 20 20 20 20 20 20  imit) {.        
3340: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
3350: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 6c      }..        l
3360: 65 74 20 63 43 75 72 72 65 6e 74 20 3d 20 73 52  et cCurrent = sR
3370: 65 6d 61 69 6e 2e 73 6c 69 63 65 28 30 2c 20 31  emain.slice(0, 1
3380: 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 20 28  );.        for (
3390: 6c 65 74 20 5b 63 43 68 61 72 2c 20 6a 41 64 64  let [cChar, jAdd
33a0: 72 5d 20 6f 66 20 74 68 69 73 2e 5f 67 65 74 43  r] of this._getC
33b0: 68 61 72 41 72 63 73 28 69 41 64 64 72 29 29 20  harArcs(iAddr)) 
33c0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  {.            if
33d0: 20 28 63 68 61 72 5f 70 6c 61 79 65 72 2e 64 31   (char_player.d1
33e0: 74 6f 31 2e 67 6c 5f 67 65 74 28 63 43 75 72 72  to1.gl_get(cCurr
33f0: 65 6e 74 2c 20 63 43 75 72 72 65 6e 74 29 2e 69  ent, cCurrent).i
3400: 6e 64 65 78 4f 66 28 63 43 68 61 72 29 20 21 3d  ndexOf(cChar) !=
3410: 20 2d 31 29 20 7b 0a 20 20 20 20 20 20 20 20 20   -1) {.         
3420: 20 20 20 20 20 20 20 74 68 69 73 2e 5f 73 75 67         this._sug
3430: 67 65 73 74 28 6f 53 75 67 67 52 65 73 75 6c 74  gest(oSuggResult
3440: 2c 20 73 52 65 6d 61 69 6e 2e 73 6c 69 63 65 28  , sRemain.slice(
3450: 31 29 2c 20 6e 4d 61 78 53 77 69 74 63 68 2c 20  1), nMaxSwitch, 
3460: 6e 4d 61 78 44 65 6c 2c 20 6e 4d 61 78 48 61 72  nMaxDel, nMaxHar
3470: 64 52 65 70 6c 2c 20 6e 4d 61 78 4a 75 6d 70 2c  dRepl, nMaxJump,
3480: 20 6e 44 69 73 74 2c 20 6e 44 65 65 70 2b 31 2c   nDist, nDeep+1,
3490: 20 6a 41 64 64 72 2c 20 73 4e 65 77 57 6f 72 64   jAddr, sNewWord
34a0: 2b 63 43 68 61 72 29 3b 0a 20 20 20 20 20 20 20  +cChar);.       
34b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
34c0: 20 20 20 65 6c 73 65 20 69 66 20 28 21 62 41 76     else if (!bAv
34d0: 6f 69 64 4c 6f 6f 70 29 20 7b 0a 20 20 20 20 20  oidLoop) {.     
34e0: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 6e             if (n
34f0: 4d 61 78 48 61 72 64 52 65 70 6c 20 20 26 26 20  MaxHardRepl  && 
3500: 20 74 68 69 73 2e 69 73 4e 67 72 61 6d 73 4f 4b   this.isNgramsOK
3510: 28 63 43 68 61 72 2b 73 52 65 6d 61 69 6e 2e 73  (cChar+sRemain.s
3520: 6c 69 63 65 28 31 2c 32 29 29 29 20 7b 0a 20 20  lice(1,2))) {.  
3530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3540: 20 20 74 68 69 73 2e 5f 73 75 67 67 65 73 74 28    this._suggest(
3550: 6f 53 75 67 67 52 65 73 75 6c 74 2c 20 73 52 65  oSuggResult, sRe
3560: 6d 61 69 6e 2e 73 6c 69 63 65 28 31 29 2c 20 6e  main.slice(1), n
3570: 4d 61 78 53 77 69 74 63 68 2c 20 6e 4d 61 78 44  MaxSwitch, nMaxD
3580: 65 6c 2c 20 6e 4d 61 78 48 61 72 64 52 65 70 6c  el, nMaxHardRepl
3590: 2d 31 2c 20 6e 4d 61 78 4a 75 6d 70 2c 20 6e 44  -1, nMaxJump, nD
35a0: 69 73 74 2b 31 2c 20 6e 44 65 65 70 2b 31 2c 20  ist+1, nDeep+1, 
35b0: 6a 41 64 64 72 2c 20 73 4e 65 77 57 6f 72 64 2b  jAddr, sNewWord+
35c0: 63 43 68 61 72 2c 20 74 72 75 65 29 3b 0a 20 20  cChar, true);.  
35d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
35e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35f0: 69 66 20 28 6e 4d 61 78 4a 75 6d 70 29 20 7b 0a  if (nMaxJump) {.
3600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3610: 20 20 20 20 74 68 69 73 2e 5f 73 75 67 67 65 73      this._sugges
3620: 74 28 6f 53 75 67 67 52 65 73 75 6c 74 2c 20 73  t(oSuggResult, s
3630: 52 65 6d 61 69 6e 2c 20 6e 4d 61 78 53 77 69 74  Remain, nMaxSwit
3640: 63 68 2c 20 6e 4d 61 78 44 65 6c 2c 20 6e 4d 61  ch, nMaxDel, nMa
3650: 78 48 61 72 64 52 65 70 6c 2c 20 6e 4d 61 78 4a  xHardRepl, nMaxJ
3660: 75 6d 70 2d 31 2c 20 6e 44 69 73 74 2b 31 2c 20  ump-1, nDist+1, 
3670: 6e 44 65 65 70 2b 31 2c 20 6a 41 64 64 72 2c 20  nDeep+1, jAddr, 
3680: 73 4e 65 77 57 6f 72 64 2b 63 43 68 61 72 2c 20  sNewWord+cChar, 
3690: 74 72 75 65 29 3b 0a 20 20 20 20 20 20 20 20 20  true);.         
36a0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
36b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
36c0: 0a 20 20 20 20 20 20 20 20 69 66 20 28 21 62 41  .        if (!bA
36d0: 76 6f 69 64 4c 6f 6f 70 29 20 7b 20 2f 2f 20 61  voidLoop) { // a
36e0: 76 6f 69 64 20 69 6e 66 69 6e 69 74 65 20 6c 6f  void infinite lo
36f0: 6f 70 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  op.            i
3700: 66 20 28 73 52 65 6d 61 69 6e 2e 6c 65 6e 67 74  f (sRemain.lengt
3710: 68 20 3e 20 31 29 20 7b 0a 20 20 20 20 20 20 20  h > 1) {.       
3720: 20 20 20 20 20 20 20 20 20 69 66 20 28 63 43 75           if (cCu
3730: 72 72 65 6e 74 20 3d 3d 20 73 52 65 6d 61 69 6e  rrent == sRemain
3740: 2e 73 6c 69 63 65 28 31 2c 20 32 29 29 20 7b 0a  .slice(1, 2)) {.
3750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3760: 20 20 20 20 2f 2f 20 73 61 6d 65 20 63 68 61 72      // same char
3770: 2c 20 77 65 20 72 65 6d 6f 76 65 20 31 20 63 68  , we remove 1 ch
3780: 61 72 20 77 69 74 68 6f 75 74 20 61 64 64 69 6e  ar without addin
3790: 67 20 31 20 74 6f 20 3c 73 4e 65 77 57 6f 72 64  g 1 to <sNewWord
37a0: 3e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  >.              
37b0: 20 20 20 20 20 20 74 68 69 73 2e 5f 73 75 67 67        this._sugg
37c0: 65 73 74 28 6f 53 75 67 67 52 65 73 75 6c 74 2c  est(oSuggResult,
37d0: 20 73 52 65 6d 61 69 6e 2e 73 6c 69 63 65 28 31   sRemain.slice(1
37e0: 29 2c 20 6e 4d 61 78 53 77 69 74 63 68 2c 20 6e  ), nMaxSwitch, n
37f0: 4d 61 78 44 65 6c 2c 20 6e 4d 61 78 48 61 72 64  MaxDel, nMaxHard
3800: 52 65 70 6c 2c 20 6e 4d 61 78 4a 75 6d 70 2c 20  Repl, nMaxJump, 
3810: 6e 44 69 73 74 2c 20 6e 44 65 65 70 2b 31 2c 20  nDist, nDeep+1, 
3820: 69 41 64 64 72 2c 20 73 4e 65 77 57 6f 72 64 29  iAddr, sNewWord)
3830: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
3840: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
3850: 20 20 20 20 65 6c 73 65 20 7b 0a 20 20 20 20 20      else {.     
3860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3870: 2f 20 73 77 69 74 63 68 69 6e 67 20 63 68 61 72  / switching char
3880: 73 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s.              
3890: 20 20 20 20 20 20 69 66 20 28 6e 4d 61 78 53 77        if (nMaxSw
38a0: 69 74 63 68 20 3e 20 30 20 20 26 26 20 20 74 68  itch > 0  &&  th
38b0: 69 73 2e 69 73 4e 67 72 61 6d 73 4f 4b 28 73 4e  is.isNgramsOK(sN
38c0: 65 77 57 6f 72 64 2e 73 6c 69 63 65 28 2d 31 29  ewWord.slice(-1)
38d0: 2b 73 52 65 6d 61 69 6e 2e 73 6c 69 63 65 28 31  +sRemain.slice(1
38e0: 2c 32 29 29 20 20 26 26 20 20 74 68 69 73 2e 69  ,2))  &&  this.i
38f0: 73 4e 67 72 61 6d 73 4f 4b 28 73 52 65 6d 61 69  sNgramsOK(sRemai
3900: 6e 2e 73 6c 69 63 65 28 31 2c 32 29 2b 73 52 65  n.slice(1,2)+sRe
3910: 6d 61 69 6e 2e 73 6c 69 63 65 28 30 2c 31 29 29  main.slice(0,1))
3920: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
3930: 20 20 20 20 20 20 20 20 20 20 20 20 74 68 69 73              this
3940: 2e 5f 73 75 67 67 65 73 74 28 6f 53 75 67 67 52  ._suggest(oSuggR
3950: 65 73 75 6c 74 2c 20 73 52 65 6d 61 69 6e 2e 73  esult, sRemain.s
3960: 6c 69 63 65 28 31 2c 20 32 29 2b 73 52 65 6d 61  lice(1, 2)+sRema
3970: 69 6e 2e 73 6c 69 63 65 28 30 2c 20 31 29 2b 73  in.slice(0, 1)+s
3980: 52 65 6d 61 69 6e 2e 73 6c 69 63 65 28 32 29 2c  Remain.slice(2),
3990: 20 6e 4d 61 78 53 77 69 74 63 68 2d 31 2c 20 6e   nMaxSwitch-1, n
39a0: 4d 61 78 44 65 6c 2c 20 6e 4d 61 78 48 61 72 64  MaxDel, nMaxHard
39b0: 52 65 70 6c 2c 20 6e 4d 61 78 4a 75 6d 70 2c 20  Repl, nMaxJump, 
39c0: 6e 44 69 73 74 2b 31 2c 20 6e 44 65 65 70 2b 31  nDist+1, nDeep+1
39d0: 2c 20 69 41 64 64 72 2c 20 73 4e 65 77 57 6f 72  , iAddr, sNewWor
39e0: 64 2c 20 74 72 75 65 29 3b 0a 20 20 20 20 20 20  d, true);.      
39f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
3a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3a10: 20 20 20 20 2f 2f 20 64 65 6c 65 74 65 20 63 68      // delete ch
3a20: 61 72 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ar.             
3a30: 20 20 20 20 20 20 20 69 66 20 28 6e 4d 61 78 44         if (nMaxD
3a40: 65 6c 20 3e 20 30 20 20 26 26 20 20 74 68 69 73  el > 0  &&  this
3a50: 2e 69 73 4e 67 72 61 6d 73 4f 4b 28 73 4e 65 77  .isNgramsOK(sNew
3a60: 57 6f 72 64 2e 73 6c 69 63 65 28 2d 31 29 2b 73  Word.slice(-1)+s
3a70: 52 65 6d 61 69 6e 2e 73 6c 69 63 65 28 31 2c 32  Remain.slice(1,2
3a80: 29 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  ))) {.          
3a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68                th
3aa0: 69 73 2e 5f 73 75 67 67 65 73 74 28 6f 53 75 67  is._suggest(oSug
3ab0: 67 52 65 73 75 6c 74 2c 20 73 52 65 6d 61 69 6e  gResult, sRemain
3ac0: 2e 73 6c 69 63 65 28 31 29 2c 20 6e 4d 61 78 53  .slice(1), nMaxS
3ad0: 77 69 74 63 68 2c 20 6e 4d 61 78 44 65 6c 2d 31  witch, nMaxDel-1
3ae0: 2c 20 6e 4d 61 78 48 61 72 64 52 65 70 6c 2c 20  , nMaxHardRepl, 
3af0: 6e 4d 61 78 4a 75 6d 70 2c 20 6e 44 69 73 74 2b  nMaxJump, nDist+
3b00: 31 2c 20 6e 44 65 65 70 2b 31 2c 20 69 41 64 64  1, nDeep+1, iAdd
3b10: 72 2c 20 73 4e 65 77 57 6f 72 64 2c 20 74 72 75  r, sNewWord, tru
3b20: 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
3b30: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
3b40: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
3b50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 50              // P
3b60: 68 6f 6e 65 74 69 63 20 72 65 70 6c 61 63 65 6d  honetic replacem
3b70: 65 6e 74 73 0a 20 20 20 20 20 20 20 20 20 20 20  ents.           
3b80: 20 20 20 20 20 66 6f 72 20 28 6c 65 74 20 73 52       for (let sR
3b90: 65 70 6c 20 6f 66 20 63 68 61 72 5f 70 6c 61 79  epl of char_play
3ba0: 65 72 2e 67 65 74 31 74 6f 58 52 65 70 6c 61 63  er.get1toXReplac
3bb0: 65 6d 65 6e 74 28 73 4e 65 77 57 6f 72 64 2e 73  ement(sNewWord.s
3bc0: 6c 69 63 65 28 2d 31 29 2c 20 63 43 75 72 72 65  lice(-1), cCurre
3bd0: 6e 74 2c 20 73 52 65 6d 61 69 6e 2e 73 6c 69 63  nt, sRemain.slic
3be0: 65 28 31 2c 32 29 29 29 20 7b 0a 20 20 20 20 20  e(1,2))) {.     
3bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
3c00: 68 69 73 2e 5f 73 75 67 67 65 73 74 28 6f 53 75  his._suggest(oSu
3c10: 67 67 52 65 73 75 6c 74 2c 20 73 52 65 70 6c 20  ggResult, sRepl 
3c20: 2b 20 73 52 65 6d 61 69 6e 2e 73 6c 69 63 65 28  + sRemain.slice(
3c30: 31 29 2c 20 6e 4d 61 78 53 77 69 74 63 68 2c 20  1), nMaxSwitch, 
3c40: 6e 4d 61 78 44 65 6c 2c 20 6e 4d 61 78 48 61 72  nMaxDel, nMaxHar
3c50: 64 52 65 70 6c 2c 20 6e 4d 61 78 4a 75 6d 70 2c  dRepl, nMaxJump,
3c60: 20 6e 44 69 73 74 2c 20 6e 44 65 65 70 2b 31 2c   nDist, nDeep+1,
3c70: 20 69 41 64 64 72 2c 20 73 4e 65 77 57 6f 72 64   iAddr, sNewWord
3c80: 2c 20 74 72 75 65 29 3b 0a 20 20 20 20 20 20 20  , true);.       
3c90: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
3ca0: 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 20 28             for (
3cb0: 6c 65 74 20 73 52 65 70 6c 20 6f 66 20 63 68 61  let sRepl of cha
3cc0: 72 5f 70 6c 61 79 65 72 2e 64 32 74 6f 58 2e 67  r_player.d2toX.g
3cd0: 6c 5f 67 65 74 28 73 52 65 6d 61 69 6e 2e 73 6c  l_get(sRemain.sl
3ce0: 69 63 65 28 30 2c 20 32 29 2c 20 5b 5d 29 29 20  ice(0, 2), [])) 
3cf0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
3d00: 20 20 20 20 20 20 74 68 69 73 2e 5f 73 75 67 67        this._sugg
3d10: 65 73 74 28 6f 53 75 67 67 52 65 73 75 6c 74 2c  est(oSuggResult,
3d20: 20 73 52 65 70 6c 20 2b 20 73 52 65 6d 61 69 6e   sRepl + sRemain
3d30: 2e 73 6c 69 63 65 28 32 29 2c 20 6e 4d 61 78 53  .slice(2), nMaxS
3d40: 77 69 74 63 68 2c 20 6e 4d 61 78 44 65 6c 2c 20  witch, nMaxDel, 
3d50: 6e 4d 61 78 48 61 72 64 52 65 70 6c 2c 20 6e 4d  nMaxHardRepl, nM
3d60: 61 78 4a 75 6d 70 2c 20 6e 44 69 73 74 2c 20 6e  axJump, nDist, n
3d70: 44 65 65 70 2b 31 2c 20 69 41 64 64 72 2c 20 73  Deep+1, iAddr, s
3d80: 4e 65 77 57 6f 72 64 2c 20 74 72 75 65 29 3b 0a  NewWord, true);.
3d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3da0: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  }.            }.
3db0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 65              // e
3dc0: 6e 64 20 6f 66 20 77 6f 72 64 0a 20 20 20 20 20  nd of word.     
3dd0: 20 20 20 20 20 20 20 69 66 20 28 73 52 65 6d 61         if (sRema
3de0: 69 6e 2e 6c 65 6e 67 74 68 20 3d 3d 20 32 29 20  in.length == 2) 
3df0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
3e00: 20 20 66 6f 72 20 28 6c 65 74 20 73 52 65 70 6c    for (let sRepl
3e10: 20 6f 66 20 63 68 61 72 5f 70 6c 61 79 65 72 2e   of char_player.
3e20: 64 46 69 6e 61 6c 32 2e 67 6c 5f 67 65 74 28 73  dFinal2.gl_get(s
3e30: 52 65 6d 61 69 6e 2c 20 5b 5d 29 29 20 7b 0a 20  Remain, [])) {. 
3e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3e50: 20 20 20 74 68 69 73 2e 5f 73 75 67 67 65 73 74     this._suggest
3e60: 28 6f 53 75 67 67 52 65 73 75 6c 74 2c 20 73 52  (oSuggResult, sR
3e70: 65 70 6c 2c 20 6e 4d 61 78 53 77 69 74 63 68 2c  epl, nMaxSwitch,
3e80: 20 6e 4d 61 78 44 65 6c 2c 20 6e 4d 61 78 48 61   nMaxDel, nMaxHa
3e90: 72 64 52 65 70 6c 2c 20 6e 4d 61 78 4a 75 6d 70  rdRepl, nMaxJump
3ea0: 2c 20 6e 44 69 73 74 2c 20 6e 44 65 65 70 2b 31  , nDist, nDeep+1
3eb0: 2c 20 69 41 64 64 72 2c 20 73 4e 65 77 57 6f 72  , iAddr, sNewWor
3ec0: 64 2c 20 74 72 75 65 29 3b 0a 20 20 20 20 20 20  d, true);.      
3ed0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
3ee0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
3ef0: 20 20 20 20 20 20 65 6c 73 65 20 69 66 20 28 73        else if (s
3f00: 52 65 6d 61 69 6e 2e 6c 65 6e 67 74 68 20 3d 3d  Remain.length ==
3f10: 20 31 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20   1) {.          
3f20: 20 20 20 20 20 20 74 68 69 73 2e 5f 73 75 67 67        this._sugg
3f30: 65 73 74 28 6f 53 75 67 67 52 65 73 75 6c 74 2c  est(oSuggResult,
3f40: 20 22 22 2c 20 6e 4d 61 78 53 77 69 74 63 68 2c   "", nMaxSwitch,
3f50: 20 6e 4d 61 78 44 65 6c 2c 20 6e 4d 61 78 48 61   nMaxDel, nMaxHa
3f60: 72 64 52 65 70 6c 2c 20 6e 4d 61 78 4a 75 6d 70  rdRepl, nMaxJump
3f70: 2c 20 6e 44 69 73 74 2c 20 6e 44 65 65 70 2b 31  , nDist, nDeep+1
3f80: 2c 20 69 41 64 64 72 2c 20 73 4e 65 77 57 6f 72  , iAddr, sNewWor
3f90: 64 2c 20 74 72 75 65 29 3b 20 2f 2f 20 72 65 6d  d, true); // rem
3fa0: 6f 76 65 20 6c 61 73 74 20 63 68 61 72 20 61 6e  ove last char an
3fb0: 64 20 67 6f 20 6f 6e 0a 20 20 20 20 20 20 20 20  d go on.        
3fc0: 20 20 20 20 20 20 20 20 66 6f 72 20 28 6c 65 74          for (let
3fd0: 20 73 52 65 70 6c 20 6f 66 20 63 68 61 72 5f 70   sRepl of char_p
3fe0: 6c 61 79 65 72 2e 64 46 69 6e 61 6c 31 2e 67 6c  layer.dFinal1.gl
3ff0: 5f 67 65 74 28 73 52 65 6d 61 69 6e 2c 20 5b 5d  _get(sRemain, []
4000: 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  )) {.           
4010: 20 20 20 20 20 20 20 20 20 74 68 69 73 2e 5f 73           this._s
4020: 75 67 67 65 73 74 28 6f 53 75 67 67 52 65 73 75  uggest(oSuggResu
4030: 6c 74 2c 20 73 52 65 70 6c 2c 20 6e 4d 61 78 53  lt, sRepl, nMaxS
4040: 77 69 74 63 68 2c 20 6e 4d 61 78 44 65 6c 2c 20  witch, nMaxDel, 
4050: 6e 4d 61 78 48 61 72 64 52 65 70 6c 2c 20 6e 4d  nMaxHardRepl, nM
4060: 61 78 4a 75 6d 70 2c 20 6e 44 69 73 74 2c 20 6e  axJump, nDist, n
4070: 44 65 65 70 2b 31 2c 20 69 41 64 64 72 2c 20 73  Deep+1, iAddr, s
4080: 4e 65 77 57 6f 72 64 2c 20 74 72 75 65 29 3b 0a  NewWord, true);.
4090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
40a0: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  }.            }.
40b0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a          }.    }.
40c0: 0a 20 20 20 20 69 73 4e 67 72 61 6d 73 4f 4b 20  .    isNgramsOK 
40d0: 28 73 43 68 61 72 73 29 20 7b 0a 20 20 20 20 20  (sChars) {.     
40e0: 20 20 20 69 66 20 28 73 43 68 61 72 73 2e 6c 65     if (sChars.le
40f0: 6e 67 74 68 20 21 3d 20 32 29 20 7b 0a 20 20 20  ngth != 2) {.   
4100: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
4110: 74 72 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  true;.        }.
4120: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74          return t
4130: 68 69 73 2e 61 32 67 72 61 6d 73 2e 68 61 73 28  his.a2grams.has(
4140: 73 43 68 61 72 73 29 3b 0a 20 20 20 20 7d 0a 0a  sChars);.    }..
4150: 20 20 20 20 2a 20 5f 67 65 74 43 68 61 72 41 72      * _getCharAr
4160: 63 73 20 28 69 41 64 64 72 29 20 7b 0a 20 20 20  cs (iAddr) {.   
4170: 20 20 20 20 20 2f 2f 20 67 65 6e 65 72 61 74 6f       // generato
4180: 72 3a 20 79 69 65 6c 64 20 61 6c 6c 20 63 68 61  r: yield all cha
4190: 72 73 20 61 6e 64 20 61 64 64 72 65 73 73 65 73  rs and addresses
41a0: 20 66 72 6f 6d 20 6e 6f 64 65 20 61 74 20 61 64   from node at ad
41b0: 64 72 65 73 73 20 3c 69 41 64 64 72 3e 0a 20 20  dress <iAddr>.  
41c0: 20 20 20 20 20 20 66 6f 72 20 28 6c 65 74 20 5b        for (let [
41d0: 6e 56 61 6c 2c 20 6a 41 64 64 72 5d 20 6f 66 20  nVal, jAddr] of 
41e0: 74 68 69 73 2e 5f 67 65 74 41 72 63 73 28 69 41  this._getArcs(iA
41f0: 64 64 72 29 29 20 7b 0a 20 20 20 20 20 20 20 20  ddr)) {.        
4200: 20 20 20 20 69 66 20 28 6e 56 61 6c 20 3c 3d 20      if (nVal <= 
4210: 74 68 69 73 2e 6e 43 68 61 72 29 20 7b 0a 20 20  this.nChar) {.  
4220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 79 69                yi
4230: 65 6c 64 20 5b 74 68 69 73 2e 64 43 68 61 72 56  eld [this.dCharV
4240: 61 6c 2e 67 65 74 28 6e 56 61 6c 29 2c 20 6a 41  al.get(nVal), jA
4250: 64 64 72 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  ddr];.          
4260: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
4270: 20 20 7d 0a 0a 20 20 20 20 2a 20 5f 67 65 74 53    }..    * _getS
4280: 69 6d 69 6c 61 72 43 68 61 72 41 72 63 73 20 28  imilarCharArcs (
4290: 63 43 68 61 72 2c 20 69 41 64 64 72 29 20 7b 0a  cChar, iAddr) {.
42a0: 20 20 20 20 20 20 20 20 2f 2f 20 67 65 6e 65 72          // gener
42b0: 61 74 6f 72 3a 20 79 69 65 6c 64 20 73 69 6d 69  ator: yield simi
42c0: 6c 61 72 20 63 68 61 72 20 6f 66 20 3c 63 43 68  lar char of <cCh
42d0: 61 72 3e 20 61 6e 64 20 61 64 64 72 65 73 73 20  ar> and address 
42e0: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
42f0: 20 6e 6f 64 65 0a 20 20 20 20 20 20 20 20 66 6f   node.        fo
4300: 72 20 28 6c 65 74 20 63 20 6f 66 20 63 68 61 72  r (let c of char
4310: 5f 70 6c 61 79 65 72 2e 64 31 74 6f 31 2e 67 6c  _player.d1to1.gl
4320: 5f 67 65 74 28 63 43 68 61 72 2c 20 5b 63 43 68  _get(cChar, [cCh
4330: 61 72 5d 29 29 20 7b 0a 20 20 20 20 20 20 20 20  ar])) {.        
4340: 20 20 20 20 69 66 20 28 74 68 69 73 2e 64 43 68      if (this.dCh
4350: 61 72 2e 68 61 73 28 63 29 29 20 7b 0a 20 20 20  ar.has(c)) {.   
4360: 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 65 74               let
4370: 20 6a 41 64 64 72 20 3d 20 74 68 69 73 2e 5f 6c   jAddr = this._l
4380: 6f 6f 6b 75 70 41 72 63 4e 6f 64 65 28 74 68 69  ookupArcNode(thi
4390: 73 2e 64 43 68 61 72 2e 67 65 74 28 63 29 2c 20  s.dChar.get(c), 
43a0: 69 41 64 64 72 29 3b 0a 20 20 20 20 20 20 20 20  iAddr);.        
43b0: 20 20 20 20 20 20 20 20 69 66 20 28 6a 41 64 64          if (jAdd
43c0: 72 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  r) {.           
43d0: 20 20 20 20 20 20 20 20 20 79 69 65 6c 64 20 5b           yield [
43e0: 63 2c 20 6a 41 64 64 72 5d 3b 0a 20 20 20 20 20  c, jAddr];.     
43f0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
4400: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
4410: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
4420: 5f 67 65 74 54 61 69 6c 73 20 28 69 41 64 64 72  _getTails (iAddr
4430: 2c 20 73 54 61 69 6c 3d 22 22 2c 20 6e 3d 32 29  , sTail="", n=2)
4440: 20 7b 0a 20 20 20 20 20 20 20 20 2f 2f 20 72 65   {.        // re
4450: 74 75 72 6e 20 61 20 6c 69 73 74 20 6f 66 20 73  turn a list of s
4460: 75 66 66 69 78 65 73 20 65 6e 64 69 6e 67 20 61  uffixes ending a
4470: 74 20 61 20 64 69 73 74 61 6e 63 65 20 6f 66 20  t a distance of 
4480: 3c 6e 3e 20 66 72 6f 6d 20 3c 69 41 64 64 72 3e  <n> from <iAddr>
4490: 0a 20 20 20 20 20 20 20 20 6c 65 74 20 61 54 61  .        let aTa
44a0: 69 6c 73 20 3d 20 6e 65 77 20 53 65 74 28 29 3b  ils = new Set();
44b0: 0a 20 20 20 20 20 20 20 20 66 6f 72 20 28 6c 65  .        for (le
44c0: 74 20 5b 6e 56 61 6c 2c 20 6a 41 64 64 72 5d 20  t [nVal, jAddr] 
44d0: 6f 66 20 74 68 69 73 2e 5f 67 65 74 41 72 63 73  of this._getArcs
44e0: 28 69 41 64 64 72 29 29 20 7b 0a 20 20 20 20 20  (iAddr)) {.     
44f0: 20 20 20 20 20 20 20 69 66 20 28 6e 56 61 6c 20         if (nVal 
4500: 3c 3d 20 74 68 69 73 2e 6e 43 68 61 72 29 20 7b  <= this.nChar) {
4510: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
4520: 20 69 66 20 28 74 68 69 73 2e 5f 63 6f 6e 76 42   if (this._convB
4530: 79 74 65 73 54 6f 49 6e 74 65 67 65 72 28 74 68  ytesToInteger(th
4540: 69 73 2e 62 79 44 69 63 2e 73 6c 69 63 65 28 6a  is.byDic.slice(j
4550: 41 64 64 72 2c 20 6a 41 64 64 72 2b 74 68 69 73  Addr, jAddr+this
4560: 2e 6e 42 79 74 65 73 41 72 63 29 29 20 26 20 74  .nBytesArc)) & t
4570: 68 69 73 2e 5f 66 69 6e 61 6c 4e 6f 64 65 4d 61  his._finalNodeMa
4580: 73 6b 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  sk) {.          
4590: 20 20 20 20 20 20 20 20 20 20 61 54 61 69 6c 73            aTails
45a0: 2e 61 64 64 28 73 54 61 69 6c 20 2b 20 74 68 69  .add(sTail + thi
45b0: 73 2e 64 43 68 61 72 56 61 6c 2e 67 65 74 28 6e  s.dCharVal.get(n
45c0: 56 61 6c 29 29 3b 0a 20 20 20 20 20 20 20 20 20  Val));.         
45d0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
45e0: 20 20 20 20 20 20 20 20 20 69 66 20 28 6e 20 26           if (n &
45f0: 26 20 61 54 61 69 6c 73 2e 73 69 7a 65 20 3d 3d  & aTails.size ==
4600: 20 30 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20   0) {.          
4610: 20 20 20 20 20 20 20 20 20 20 61 54 61 69 6c 73            aTails
4620: 2e 67 6c 5f 75 70 64 61 74 65 28 74 68 69 73 2e  .gl_update(this.
4630: 5f 67 65 74 54 61 69 6c 73 28 6a 41 64 64 72 2c  _getTails(jAddr,
4640: 20 73 54 61 69 6c 2b 74 68 69 73 2e 64 43 68 61   sTail+this.dCha
4650: 72 56 61 6c 2e 67 65 74 28 6e 56 61 6c 29 2c 20  rVal.get(nVal), 
4660: 6e 2d 31 29 29 3b 0a 20 20 20 20 20 20 20 20 20  n-1));.         
4670: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
4680: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
4690: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
46a0: 61 54 61 69 6c 73 3b 0a 20 20 20 20 7d 0a 0a 20  aTails;.    }.. 
46b0: 20 20 20 2f 2f 20 6d 6f 72 70 68 20 28 73 57 6f     // morph (sWo
46c0: 72 64 29 20 7b 0a 20 20 20 20 2f 2f 20 20 20 20  rd) {.    //    
46d0: 20 69 73 20 64 65 66 69 6e 65 64 20 69 6e 20 63   is defined in c
46e0: 6f 6e 73 74 72 75 63 74 6f 72 0a 20 20 20 20 2f  onstructor.    /
46f0: 2f 20 7d 0a 20 20 20 20 67 65 74 53 69 6d 69 6c  / }.    getSimil
4700: 61 72 45 6e 74 72 69 65 73 20 28 73 57 6f 72 64  arEntries (sWord
4710: 2c 20 6e 53 75 67 67 4c 69 6d 69 74 3d 31 30 29  , nSuggLimit=10)
4720: 20 7b 0a 20 20 20 20 20 20 20 20 2f 2f 20 72 65   {.        // re
4730: 74 75 72 6e 20 61 20 6c 69 73 74 20 6f 66 20 74  turn a list of t
4740: 75 70 6c 65 73 20 28 73 69 6d 69 6c 61 72 20 77  uples (similar w
4750: 6f 72 64 2c 20 73 74 65 6d 2c 20 6d 6f 72 70 68  ord, stem, morph
4760: 6f 6c 6f 67 79 29 0a 20 20 20 20 20 20 20 20 69  ology).        i
4770: 66 20 28 73 57 6f 72 64 20 3d 3d 20 22 22 29 20  f (sWord == "") 
4780: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  {.            re
4790: 74 75 72 6e 20 5b 5d 3b 0a 20 20 20 20 20 20 20  turn [];.       
47a0: 20 7d 0a 20 20 20 20 20 20 20 20 6c 65 74 20 6c   }.        let l
47b0: 52 65 73 75 6c 74 20 3d 20 5b 5d 3b 0a 20 20 20  Result = [];.   
47c0: 20 20 20 20 20 66 6f 72 20 28 6c 65 74 20 73 53       for (let sS
47d0: 69 6d 69 6c 61 72 20 6f 66 20 74 68 69 73 2e 73  imilar of this.s
47e0: 75 67 67 65 73 74 28 73 57 6f 72 64 2c 20 6e 53  uggest(sWord, nS
47f0: 75 67 67 4c 69 6d 69 74 29 29 20 7b 0a 20 20 20  uggLimit)) {.   
4800: 20 20 20 20 20 20 20 20 20 66 6f 72 20 28 6c 65           for (le
4810: 74 20 73 4d 6f 72 70 68 20 6f 66 20 74 68 69 73  t sMorph of this
4820: 2e 67 65 74 4d 6f 72 70 68 28 73 53 69 6d 69 6c  .getMorph(sSimil
4830: 61 72 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20  ar)) {.         
4840: 20 20 20 20 20 20 20 6c 65 74 20 6e 43 75 74 20         let nCut 
4850: 3d 20 73 4d 6f 72 70 68 2e 69 6e 64 65 78 4f 66  = sMorph.indexOf
4860: 28 22 20 22 29 3b 0a 20 20 20 20 20 20 20 20 20  (" ");.         
4870: 20 20 20 20 20 20 20 6c 52 65 73 75 6c 74 2e 70         lResult.p
4880: 75 73 68 28 20 5b 73 53 69 6d 69 6c 61 72 2c 20  ush( [sSimilar, 
4890: 73 4d 6f 72 70 68 2e 73 6c 69 63 65 28 31 2c 20  sMorph.slice(1, 
48a0: 6e 43 75 74 29 2c 20 73 4d 6f 72 70 68 2e 73 6c  nCut), sMorph.sl
48b0: 69 63 65 28 6e 43 75 74 2b 31 29 5d 20 29 3b 0a  ice(nCut+1)] );.
48c0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
48d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
48e0: 72 65 74 75 72 6e 20 6c 52 65 73 75 6c 74 3b 0a  return lResult;.
48f0: 20 20 20 20 7d 0a 0a 20 20 20 20 2a 20 73 65 6c      }..    * sel
4900: 65 63 74 20 28 73 46 6c 65 78 50 61 74 74 65 72  ect (sFlexPatter
4910: 6e 3d 22 22 2c 20 73 54 61 67 73 50 61 74 74 65  n="", sTagsPatte
4920: 72 6e 3d 22 22 29 20 7b 0a 20 20 20 20 20 20 20  rn="") {.       
4930: 20 2f 2f 20 67 65 6e 65 72 61 74 6f 72 3a 20 72   // generator: r
4940: 65 74 75 72 6e 73 20 61 6c 6c 20 65 6e 74 72 69  eturns all entri
4950: 65 73 20 77 68 69 63 68 20 66 6c 65 78 69 6f 6e  es which flexion
4960: 20 66 69 74 73 20 3c 73 46 6c 65 78 50 61 74 74   fits <sFlexPatt
4970: 65 72 6e 3e 20 61 6e 64 20 6d 6f 72 70 68 6f 6c  ern> and morphol
4980: 6f 67 79 20 66 69 74 73 20 3c 73 54 61 67 73 50  ogy fits <sTagsP
4990: 61 74 74 65 72 6e 3e 0a 20 20 20 20 20 20 20 20  attern>.        
49a0: 6c 65 74 20 7a 46 6c 65 78 50 61 74 74 65 72 6e  let zFlexPattern
49b0: 20 3d 20 6e 75 6c 6c 3b 0a 20 20 20 20 20 20 20   = null;.       
49c0: 20 6c 65 74 20 7a 54 61 67 73 50 61 74 74 65 72   let zTagsPatter
49d0: 6e 20 3d 20 6e 75 6c 6c 3b 0a 20 20 20 20 20 20  n = null;.      
49e0: 20 20 74 72 79 20 7b 0a 20 20 20 20 20 20 20 20    try {.        
49f0: 20 20 20 20 7a 46 6c 65 78 50 61 74 74 65 72 6e      zFlexPattern
4a00: 20 3d 20 28 73 46 6c 65 78 50 61 74 74 65 72 6e   = (sFlexPattern
4a10: 20 21 3d 3d 20 22 22 29 20 3f 20 6e 65 77 20 52   !== "") ? new R
4a20: 65 67 45 78 70 28 73 46 6c 65 78 50 61 74 74 65  egExp(sFlexPatte
4a30: 72 6e 29 20 3a 20 6e 75 6c 6c 3b 0a 20 20 20 20  rn) : null;.    
4a40: 20 20 20 20 20 20 20 20 7a 54 61 67 73 50 61 74          zTagsPat
4a50: 74 65 72 6e 20 3d 20 28 73 54 61 67 73 50 61 74  tern = (sTagsPat
4a60: 74 65 72 6e 20 21 3d 3d 20 22 22 29 20 3f 20 6e  tern !== "") ? n
4a70: 65 77 20 52 65 67 45 78 70 28 73 54 61 67 73 50  ew RegExp(sTagsP
4a80: 61 74 74 65 72 6e 29 20 3a 20 6e 75 6c 6c 3b 0a  attern) : null;.
4a90: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
4aa0: 20 20 63 61 74 63 68 20 28 65 29 20 7b 0a 20 20    catch (e) {.  
4ab0: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 6f 6c            consol
4ac0: 65 2e 6c 6f 67 28 22 45 72 72 6f 72 20 69 6e 20  e.log("Error in 
4ad0: 72 65 67 65 78 20 70 61 74 74 65 72 6e 22 29 3b  regex pattern");
4ae0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e  .            con
4af0: 73 6f 6c 65 2e 6c 6f 67 28 65 2e 6d 65 73 73 61  sole.log(e.messa
4b00: 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ge);.        }. 
4b10: 20 20 20 20 20 20 20 79 69 65 6c 64 2a 20 74 68         yield* th
4b20: 69 73 2e 5f 73 65 6c 65 63 74 31 28 7a 46 6c 65  is._select1(zFle
4b30: 78 50 61 74 74 65 72 6e 2c 20 7a 54 61 67 73 50  xPattern, zTagsP
4b40: 61 74 74 65 72 6e 2c 20 30 2c 20 22 22 29 3b 0a  attern, 0, "");.
4b50: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2f 20 56 45      }..    // VE
4b60: 52 53 49 4f 4e 20 31 0a 0a 20 20 20 20 2a 20 5f  RSION 1..    * _
4b70: 73 65 6c 65 63 74 31 20 28 7a 46 6c 65 78 50 61  select1 (zFlexPa
4b80: 74 74 65 72 6e 2c 20 7a 54 61 67 73 50 61 74 74  ttern, zTagsPatt
4b90: 65 72 6e 2c 20 69 41 64 64 72 2c 20 73 57 6f 72  ern, iAddr, sWor
4ba0: 64 29 20 7b 0a 20 20 20 20 20 20 20 20 2f 2f 20  d) {.        // 
4bb0: 72 65 63 75 72 73 69 76 65 20 67 65 6e 65 72 61  recursive genera
4bc0: 74 6f 72 0a 20 20 20 20 20 20 20 20 66 6f 72 20  tor.        for 
4bd0: 28 6c 65 74 20 5b 6e 56 61 6c 2c 20 6a 41 64 64  (let [nVal, jAdd
4be0: 72 5d 20 6f 66 20 74 68 69 73 2e 5f 67 65 74 41  r] of this._getA
4bf0: 72 63 73 31 28 69 41 64 64 72 29 29 20 7b 0a 20  rcs1(iAddr)) {. 
4c00: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 6e             if (n
4c10: 56 61 6c 20 3c 3d 20 74 68 69 73 2e 6e 43 68 61  Val <= this.nCha
4c20: 72 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  r) {.           
4c30: 20 20 20 20 20 2f 2f 20 73 69 6d 70 6c 65 20 63       // simple c
4c40: 68 61 72 61 63 74 65 72 0a 20 20 20 20 20 20 20  haracter.       
4c50: 20 20 20 20 20 20 20 20 20 79 69 65 6c 64 2a 20           yield* 
4c60: 74 68 69 73 2e 5f 73 65 6c 65 63 74 31 28 7a 46  this._select1(zF
4c70: 6c 65 78 50 61 74 74 65 72 6e 2c 20 7a 54 61 67  lexPattern, zTag
4c80: 73 50 61 74 74 65 72 6e 2c 20 6a 41 64 64 72 2c  sPattern, jAddr,
4c90: 20 73 57 6f 72 64 20 2b 20 74 68 69 73 2e 6c 41   sWord + this.lA
4ca0: 72 63 56 61 6c 5b 6e 56 61 6c 5d 29 3b 0a 20 20  rcVal[nVal]);.  
4cb0: 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65            } else
4cc0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
4cd0: 20 20 20 69 66 20 28 21 7a 46 6c 65 78 50 61 74     if (!zFlexPat
4ce0: 74 65 72 6e 20 7c 7c 20 7a 46 6c 65 78 50 61 74  tern || zFlexPat
4cf0: 74 65 72 6e 2e 74 65 73 74 28 73 57 6f 72 64 29  tern.test(sWord)
4d00: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
4d10: 20 20 20 20 20 20 20 20 6c 65 74 20 73 53 74 65          let sSte
4d20: 6d 20 3d 20 74 68 69 73 2e 66 75 6e 63 53 74 65  m = this.funcSte
4d30: 6d 6d 69 6e 67 28 73 57 6f 72 64 2c 20 74 68 69  mming(sWord, thi
4d40: 73 2e 6c 41 72 63 56 61 6c 5b 6e 56 61 6c 5d 29  s.lArcVal[nVal])
4d50: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
4d60: 20 20 20 20 20 20 66 6f 72 20 28 6c 65 74 20 5b        for (let [
4d70: 6e 4d 6f 72 70 68 56 61 6c 2c 20 5f 5d 20 6f 66  nMorphVal, _] of
4d80: 20 74 68 69 73 2e 5f 67 65 74 41 72 63 73 31 28   this._getArcs1(
4d90: 6a 41 64 64 72 29 29 20 7b 0a 20 20 20 20 20 20  jAddr)) {.      
4da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4db0: 20 20 69 66 20 28 21 7a 54 61 67 73 50 61 74 74    if (!zTagsPatt
4dc0: 65 72 6e 20 7c 7c 20 7a 54 61 67 73 50 61 74 74  ern || zTagsPatt
4dd0: 65 72 6e 2e 74 65 73 74 28 74 68 69 73 2e 6c 41  ern.test(this.lA
4de0: 72 63 56 61 6c 5b 6e 4d 6f 72 70 68 56 61 6c 5d  rcVal[nMorphVal]
4df0: 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  )) {.           
4e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e10: 20 79 69 65 6c 64 20 5b 73 57 6f 72 64 2c 20 73   yield [sWord, s
4e20: 53 74 65 6d 2c 20 74 68 69 73 2e 6c 41 72 63 56  Stem, this.lArcV
4e30: 61 6c 5b 6e 4d 6f 72 70 68 56 61 6c 5d 5d 3b 0a  al[nMorphVal]];.
4e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e50: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
4e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
4e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e80: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  }.            }.
4e90: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a          }.    }.
4ea0: 0a 20 20 20 20 5f 6d 6f 72 70 68 31 20 28 73 57  .    _morph1 (sW
4eb0: 6f 72 64 29 20 7b 0a 20 20 20 20 20 20 20 20 2f  ord) {.        /
4ec0: 2f 20 72 65 74 75 72 6e 73 20 6d 6f 72 70 68 6f  / returns morpho
4ed0: 6c 6f 67 69 65 73 20 6f 66 20 73 57 6f 72 64 0a  logies of sWord.
4ee0: 20 20 20 20 20 20 20 20 6c 65 74 20 69 41 64 64          let iAdd
4ef0: 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 66  r = 0;.        f
4f00: 6f 72 20 28 6c 65 74 20 63 20 6f 66 20 73 57 6f  or (let c of sWo
4f10: 72 64 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  rd) {.          
4f20: 20 20 69 66 20 28 21 74 68 69 73 2e 64 43 68 61    if (!this.dCha
4f30: 72 2e 68 61 73 28 63 29 29 20 7b 0a 20 20 20 20  r.has(c)) {.    
4f40: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
4f50: 72 6e 20 5b 5d 3b 0a 20 20 20 20 20 20 20 20 20  rn [];.         
4f60: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
4f70: 20 69 41 64 64 72 20 3d 20 74 68 69 73 2e 5f 6c   iAddr = this._l
4f80: 6f 6f 6b 75 70 41 72 63 4e 6f 64 65 28 74 68 69  ookupArcNode(thi
4f90: 73 2e 64 43 68 61 72 2e 67 65 74 28 63 29 2c 20  s.dChar.get(c), 
4fa0: 69 41 64 64 72 29 3b 0a 20 20 20 20 20 20 20 20  iAddr);.        
4fb0: 20 20 20 20 69 66 20 28 69 41 64 64 72 20 3d 3d      if (iAddr ==
4fc0: 3d 20 6e 75 6c 6c 29 20 7b 0a 20 20 20 20 20 20  = null) {.      
4fd0: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
4fe0: 20 5b 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20   [];.           
4ff0: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
5000: 20 20 20 20 20 69 66 20 28 74 68 69 73 2e 5f 63       if (this._c
5010: 6f 6e 76 42 79 74 65 73 54 6f 49 6e 74 65 67 65  onvBytesToIntege
5020: 72 28 74 68 69 73 2e 62 79 44 69 63 2e 73 6c 69  r(this.byDic.sli
5030: 63 65 28 69 41 64 64 72 2c 20 69 41 64 64 72 2b  ce(iAddr, iAddr+
5040: 74 68 69 73 2e 6e 42 79 74 65 73 41 72 63 29 29  this.nBytesArc))
5050: 20 26 20 74 68 69 73 2e 5f 66 69 6e 61 6c 4e 6f   & this._finalNo
5060: 64 65 4d 61 73 6b 29 20 7b 0a 20 20 20 20 20 20  deMask) {.      
5070: 20 20 20 20 20 20 6c 65 74 20 6c 20 3d 20 5b 5d        let l = []
5080: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 65  ;.            le
5090: 74 20 6e 52 61 77 41 72 63 20 3d 20 30 3b 0a 20  t nRawArc = 0;. 
50a0: 20 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65             while
50b0: 20 28 21 28 6e 52 61 77 41 72 63 20 26 20 74 68   (!(nRawArc & th
50c0: 69 73 2e 5f 6c 61 73 74 41 72 63 4d 61 73 6b 29  is._lastArcMask)
50d0: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
50e0: 20 20 20 20 6c 65 74 20 69 45 6e 64 41 72 63 41      let iEndArcA
50f0: 64 64 72 20 3d 20 69 41 64 64 72 20 2b 20 74 68  ddr = iAddr + th
5100: 69 73 2e 6e 42 79 74 65 73 41 72 63 3b 0a 20 20  is.nBytesArc;.  
5110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 52                nR
5120: 61 77 41 72 63 20 3d 20 74 68 69 73 2e 5f 63 6f  awArc = this._co
5130: 6e 76 42 79 74 65 73 54 6f 49 6e 74 65 67 65 72  nvBytesToInteger
5140: 28 74 68 69 73 2e 62 79 44 69 63 2e 73 6c 69 63  (this.byDic.slic
5150: 65 28 69 41 64 64 72 2c 20 69 45 6e 64 41 72 63  e(iAddr, iEndArc
5160: 41 64 64 72 29 29 3b 0a 20 20 20 20 20 20 20 20  Addr));.        
5170: 20 20 20 20 20 20 20 20 6c 65 74 20 6e 41 72 63          let nArc
5180: 20 3d 20 6e 52 61 77 41 72 63 20 26 20 74 68 69   = nRawArc & thi
5190: 73 2e 5f 61 72 63 4d 61 73 6b 3b 0a 20 20 20 20  s._arcMask;.    
51a0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28              if (
51b0: 6e 41 72 63 20 3e 20 74 68 69 73 2e 6e 43 68 61  nArc > this.nCha
51c0: 72 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  r) {.           
51d0: 20 20 20 20 20 20 20 20 20 2f 2f 20 54 68 69 73           // This
51e0: 20 76 61 6c 75 65 20 69 73 20 6e 6f 74 20 61 20   value is not a 
51f0: 63 68 61 72 2c 20 74 68 69 73 20 69 73 20 61 20  char, this is a 
5200: 73 74 65 6d 6d 69 6e 67 20 63 6f 64 65 0a 20 20  stemming code.  
5210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5220: 20 20 6c 65 74 20 73 53 74 65 6d 20 3d 20 22 3e    let sStem = ">
5230: 22 20 2b 20 74 68 69 73 2e 66 75 6e 63 53 74 65  " + this.funcSte
5240: 6d 6d 69 6e 67 28 73 57 6f 72 64 2c 20 74 68 69  mming(sWord, thi
5250: 73 2e 6c 41 72 63 56 61 6c 5b 6e 41 72 63 5d 29  s.lArcVal[nArc])
5260: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
5270: 20 20 20 20 20 20 2f 2f 20 4e 6f 77 20 2c 20 77        // Now , w
5280: 65 20 67 6f 20 74 6f 20 74 68 65 20 6e 65 78 74  e go to the next
5290: 20 6e 6f 64 65 20 61 6e 64 20 72 65 74 72 69 65   node and retrie
52a0: 76 65 20 61 6c 6c 20 66 6f 6c 6c 6f 77 69 6e 67  ve all following
52b0: 20 61 72 63 73 20 76 61 6c 75 65 73 2c 20 61 6c   arcs values, al
52c0: 6c 20 6f 66 20 74 68 65 6d 20 61 72 65 20 74 61  l of them are ta
52d0: 67 73 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  gs.             
52e0: 20 20 20 20 20 20 20 6c 65 74 20 69 41 64 64 72         let iAddr
52f0: 32 20 3d 20 74 68 69 73 2e 5f 63 6f 6e 76 42 79  2 = this._convBy
5300: 74 65 73 54 6f 49 6e 74 65 67 65 72 28 74 68 69  tesToInteger(thi
5310: 73 2e 62 79 44 69 63 2e 73 6c 69 63 65 28 69 45  s.byDic.slice(iE
5320: 6e 64 41 72 63 41 64 64 72 2c 20 69 45 6e 64 41  ndArcAddr, iEndA
5330: 72 63 41 64 64 72 2b 74 68 69 73 2e 6e 42 79 74  rcAddr+this.nByt
5340: 65 73 4e 6f 64 65 41 64 64 72 65 73 73 29 29 3b  esNodeAddress));
5350: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
5360: 20 20 20 20 20 6c 65 74 20 6e 52 61 77 41 72 63       let nRawArc
5370: 32 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  2 = 0;.         
5380: 20 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65             while
5390: 20 28 21 28 6e 52 61 77 41 72 63 32 20 26 20 74   (!(nRawArc2 & t
53a0: 68 69 73 2e 5f 6c 61 73 74 41 72 63 4d 61 73 6b  his._lastArcMask
53b0: 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  )) {.           
53c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 65 74               let
53d0: 20 69 45 6e 64 41 72 63 41 64 64 72 32 20 3d 20   iEndArcAddr2 = 
53e0: 69 41 64 64 72 32 20 2b 20 74 68 69 73 2e 6e 42  iAddr2 + this.nB
53f0: 79 74 65 73 41 72 63 3b 0a 20 20 20 20 20 20 20  ytesArc;.       
5400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5410: 20 6e 52 61 77 41 72 63 32 20 3d 20 74 68 69 73   nRawArc2 = this
5420: 2e 5f 63 6f 6e 76 42 79 74 65 73 54 6f 49 6e 74  ._convBytesToInt
5430: 65 67 65 72 28 74 68 69 73 2e 62 79 44 69 63 2e  eger(this.byDic.
5440: 73 6c 69 63 65 28 69 41 64 64 72 32 2c 20 69 45  slice(iAddr2, iE
5450: 6e 64 41 72 63 41 64 64 72 32 29 29 3b 0a 20 20  ndArcAddr2));.  
5460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5470: 20 20 20 20 20 20 6c 2e 70 75 73 68 28 73 53 74        l.push(sSt
5480: 65 6d 20 2b 20 22 2f 22 20 2b 20 74 68 69 73 2e  em + "/" + this.
5490: 6c 41 72 63 56 61 6c 5b 6e 52 61 77 41 72 63 32  lArcVal[nRawArc2
54a0: 20 26 20 74 68 69 73 2e 5f 61 72 63 4d 61 73 6b   & this._arcMask
54b0: 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ]);.            
54c0: 20 20 20 20 20 20 20 20 20 20 20 20 69 41 64 64              iAdd
54d0: 72 32 20 3d 20 69 45 6e 64 41 72 63 41 64 64 72  r2 = iEndArcAddr
54e0: 32 2b 74 68 69 73 2e 6e 42 79 74 65 73 4e 6f 64  2+this.nBytesNod
54f0: 65 41 64 64 72 65 73 73 3b 0a 20 20 20 20 20 20  eAddress;.      
5500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
5510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5520: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
5530: 20 20 69 41 64 64 72 20 3d 20 69 45 6e 64 41 72    iAddr = iEndAr
5540: 63 41 64 64 72 20 2b 20 74 68 69 73 2e 6e 42 79  cAddr + this.nBy
5550: 74 65 73 4e 6f 64 65 41 64 64 72 65 73 73 3b 0a  tesNodeAddress;.
5560: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
5570: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
5580: 20 6c 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   l;.        }.  
5590: 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 5d 3b        return [];
55a0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 5f 73 74 65  .    }..    _ste
55b0: 6d 31 20 28 73 57 6f 72 64 29 20 7b 0a 20 20 20  m1 (sWord) {.   
55c0: 20 20 20 20 20 2f 2f 20 72 65 74 75 72 6e 73 20       // returns 
55d0: 73 74 65 6d 73 20 6c 69 73 74 20 6f 66 20 73 57  stems list of sW
55e0: 6f 72 64 0a 20 20 20 20 20 20 20 20 6c 65 74 20  ord.        let 
55f0: 69 41 64 64 72 20 3d 20 30 3b 0a 20 20 20 20 20  iAddr = 0;.     
5600: 20 20 20 66 6f 72 20 28 6c 65 74 20 63 20 6f 66     for (let c of
5610: 20 73 57 6f 72 64 29 20 7b 0a 20 20 20 20 20 20   sWord) {.      
5620: 20 20 20 20 20 20 69 66 20 28 21 74 68 69 73 2e        if (!this.
5630: 64 43 68 61 72 2e 68 61 73 28 63 29 29 20 7b 0a  dChar.has(c)) {.
5640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5650: 72 65 74 75 72 6e 20 5b 5d 3b 0a 20 20 20 20 20  return [];.     
5660: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
5670: 20 20 20 20 20 69 41 64 64 72 20 3d 20 74 68 69       iAddr = thi
5680: 73 2e 5f 6c 6f 6f 6b 75 70 41 72 63 4e 6f 64 65  s._lookupArcNode
5690: 28 74 68 69 73 2e 64 43 68 61 72 2e 67 65 74 28  (this.dChar.get(
56a0: 63 29 2c 20 69 41 64 64 72 29 3b 0a 20 20 20 20  c), iAddr);.    
56b0: 20 20 20 20 20 20 20 20 69 66 20 28 69 41 64 64          if (iAdd
56c0: 72 20 3d 3d 3d 20 6e 75 6c 6c 29 20 7b 0a 20 20  r === null) {.  
56d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
56e0: 74 75 72 6e 20 5b 5d 3b 0a 20 20 20 20 20 20 20  turn [];.       
56f0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
5700: 0a 20 20 20 20 20 20 20 20 69 66 20 28 74 68 69  .        if (thi
5710: 73 2e 5f 63 6f 6e 76 42 79 74 65 73 54 6f 49 6e  s._convBytesToIn
5720: 74 65 67 65 72 28 74 68 69 73 2e 62 79 44 69 63  teger(this.byDic
5730: 2e 73 6c 69 63 65 28 69 41 64 64 72 2c 20 69 41  .slice(iAddr, iA
5740: 64 64 72 2b 74 68 69 73 2e 6e 42 79 74 65 73 41  ddr+this.nBytesA
5750: 72 63 29 29 20 26 20 74 68 69 73 2e 5f 66 69 6e  rc)) & this._fin
5760: 61 6c 4e 6f 64 65 4d 61 73 6b 29 20 7b 0a 20 20  alNodeMask) {.  
5770: 20 20 20 20 20 20 20 20 20 20 6c 65 74 20 6c 20            let l 
5780: 3d 20 5b 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  = [];.          
5790: 20 20 6c 65 74 20 6e 52 61 77 41 72 63 20 3d 20    let nRawArc = 
57a0: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 77  0;.            w
57b0: 68 69 6c 65 20 28 21 28 6e 52 61 77 41 72 63 20  hile (!(nRawArc 
57c0: 26 20 74 68 69 73 2e 5f 6c 61 73 74 41 72 63 4d  & this._lastArcM
57d0: 61 73 6b 29 29 20 7b 0a 20 20 20 20 20 20 20 20  ask)) {.        
57e0: 20 20 20 20 20 20 20 20 6c 65 74 20 69 45 6e 64          let iEnd
57f0: 41 72 63 41 64 64 72 20 3d 20 69 41 64 64 72 20  ArcAddr = iAddr 
5800: 2b 20 74 68 69 73 2e 6e 42 79 74 65 73 41 72 63  + this.nBytesArc
5810: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
5820: 20 20 6e 52 61 77 41 72 63 20 3d 20 74 68 69 73    nRawArc = this
5830: 2e 5f 63 6f 6e 76 42 79 74 65 73 54 6f 49 6e 74  ._convBytesToInt
5840: 65 67 65 72 28 74 68 69 73 2e 62 79 44 69 63 2e  eger(this.byDic.
5850: 73 6c 69 63 65 28 69 41 64 64 72 2c 20 69 45 6e  slice(iAddr, iEn
5860: 64 41 72 63 41 64 64 72 29 29 3b 0a 20 20 20 20  dArcAddr));.    
5870: 20 20 20 20 20 20 20 20 20 20 20 20 6c 65 74 20              let 
5880: 6e 41 72 63 20 3d 20 6e 52 61 77 41 72 63 20 26  nArc = nRawArc &
5890: 20 74 68 69 73 2e 5f 61 72 63 4d 61 73 6b 3b 0a   this._arcMask;.
58a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
58b0: 69 66 20 28 6e 41 72 63 20 3e 20 74 68 69 73 2e  if (nArc > this.
58c0: 6e 43 68 61 72 29 20 7b 0a 20 20 20 20 20 20 20  nChar) {.       
58d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20               // 
58e0: 54 68 69 73 20 76 61 6c 75 65 20 69 73 20 6e 6f  This value is no
58f0: 74 20 61 20 63 68 61 72 2c 20 74 68 69 73 20 69  t a char, this i
5900: 73 20 61 20 73 74 65 6d 6d 69 6e 67 20 63 6f 64  s a stemming cod
5910: 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e.              
5920: 20 20 20 20 20 20 6c 2e 70 75 73 68 28 74 68 69        l.push(thi
5930: 73 2e 66 75 6e 63 53 74 65 6d 6d 69 6e 67 28 73  s.funcStemming(s
5940: 57 6f 72 64 2c 20 74 68 69 73 2e 6c 41 72 63 56  Word, this.lArcV
5950: 61 6c 5b 6e 41 72 63 5d 29 29 3b 0a 20 20 20 20  al[nArc]));.    
5960: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
5970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 41                iA
5980: 64 64 72 20 3d 20 69 45 6e 64 41 72 63 41 64 64  ddr = iEndArcAdd
5990: 72 20 2b 20 74 68 69 73 2e 6e 42 79 74 65 73 4e  r + this.nBytesN
59a0: 6f 64 65 41 64 64 72 65 73 73 3b 0a 20 20 20 20  odeAddress;.    
59b0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
59c0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 6c 3b 0a        return l;.
59d0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
59e0: 20 20 72 65 74 75 72 6e 20 5b 5d 3b 0a 20 20 20    return [];.   
59f0: 20 7d 0a 0a 20 20 20 20 5f 6c 6f 6f 6b 75 70 41   }..    _lookupA
5a00: 72 63 4e 6f 64 65 31 20 28 6e 56 61 6c 2c 20 69  rcNode1 (nVal, i
5a10: 41 64 64 72 29 20 7b 0a 20 20 20 20 20 20 20 20  Addr) {.        
5a20: 2f 2f 20 6c 6f 6f 6b 73 20 69 66 20 6e 56 61 6c  // looks if nVal
5a30: 20 69 73 20 61 6e 20 61 72 63 20 61 74 20 74 68   is an arc at th
5a40: 65 20 6e 6f 64 65 20 61 74 20 69 41 64 64 72 2c  e node at iAddr,
5a50: 20 69 66 20 79 65 73 2c 20 72 65 74 75 72 6e 73   if yes, returns
5a60: 20 61 64 64 72 65 73 73 20 6f 66 20 6e 65 78 74   address of next
5a70: 20 6e 6f 64 65 20 65 6c 73 65 20 4e 6f 6e 65 0a   node else None.
5a80: 20 20 20 20 20 20 20 20 77 68 69 6c 65 20 28 74          while (t
5a90: 72 75 65 29 20 7b 0a 20 20 20 20 20 20 20 20 20  rue) {.         
5aa0: 20 20 20 6c 65 74 20 69 45 6e 64 41 72 63 41 64     let iEndArcAd
5ab0: 64 72 20 3d 20 69 41 64 64 72 2b 74 68 69 73 2e  dr = iAddr+this.
5ac0: 6e 42 79 74 65 73 41 72 63 3b 0a 20 20 20 20 20  nBytesArc;.     
5ad0: 20 20 20 20 20 20 20 6c 65 74 20 6e 52 61 77 41         let nRawA
5ae0: 72 63 20 3d 20 74 68 69 73 2e 5f 63 6f 6e 76 42  rc = this._convB
5af0: 79 74 65 73 54 6f 49 6e 74 65 67 65 72 28 74 68  ytesToInteger(th
5b00: 69 73 2e 62 79 44 69 63 2e 73 6c 69 63 65 28 69  is.byDic.slice(i
5b10: 41 64 64 72 2c 20 69 45 6e 64 41 72 63 41 64 64  Addr, iEndArcAdd
5b20: 72 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  r));.           
5b30: 20 69 66 20 28 6e 56 61 6c 20 3d 3d 20 28 6e 52   if (nVal == (nR
5b40: 61 77 41 72 63 20 26 20 74 68 69 73 2e 5f 61 72  awArc & this._ar
5b50: 63 4d 61 73 6b 29 29 20 7b 0a 20 20 20 20 20 20  cMask)) {.      
5b60: 20 20 20 20 20 20 20 20 20 20 2f 2f 20 74 68 65            // the
5b70: 20 76 61 6c 75 65 20 77 65 20 61 72 65 20 6c 6f   value we are lo
5b80: 6f 6b 69 6e 67 20 66 6f 72 0a 20 20 20 20 20 20  oking for.      
5b90: 20 20 20 20 20 20 20 20 20 20 2f 2f 20 77 65 20            // we 
5ba0: 72 65 74 75 72 6e 20 74 68 65 20 61 64 64 72 65  return the addre
5bb0: 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74 20 6e  ss of the next n
5bc0: 6f 64 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  ode.            
5bd0: 20 20 20 20 72 65 74 75 72 6e 20 74 68 69 73 2e      return this.
5be0: 5f 63 6f 6e 76 42 79 74 65 73 54 6f 49 6e 74 65  _convBytesToInte
5bf0: 67 65 72 28 74 68 69 73 2e 62 79 44 69 63 2e 73  ger(this.byDic.s
5c00: 6c 69 63 65 28 69 45 6e 64 41 72 63 41 64 64 72  lice(iEndArcAddr
5c10: 2c 20 69 45 6e 64 41 72 63 41 64 64 72 2b 74 68  , iEndArcAddr+th
5c20: 69 73 2e 6e 42 79 74 65 73 4e 6f 64 65 41 64 64  is.nBytesNodeAdd
5c30: 72 65 73 73 29 29 3b 0a 20 20 20 20 20 20 20 20  ress));.        
5c40: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
5c50: 20 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20    else {.       
5c60: 20 20 20 20 20 20 20 20 20 2f 2f 20 76 61 6c 75           // valu
5c70: 65 20 6e 6f 74 20 66 6f 75 6e 64 0a 20 20 20 20  e not found.    
5c80: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28              if (
5c90: 6e 52 61 77 41 72 63 20 26 20 74 68 69 73 2e 5f  nRawArc & this._
5ca0: 6c 61 73 74 41 72 63 4d 61 73 6b 29 20 7b 0a 20  lastArcMask) {. 
5cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5cc0: 20 20 20 72 65 74 75 72 6e 20 6e 75 6c 6c 3b 0a     return null;.
5cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ce0: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
5cf0: 20 20 69 41 64 64 72 20 3d 20 69 45 6e 64 41 72    iAddr = iEndAr
5d00: 63 41 64 64 72 20 2b 20 74 68 69 73 2e 6e 42 79  cAddr + this.nBy
5d10: 74 65 73 4e 6f 64 65 41 64 64 72 65 73 73 3b 0a  tesNodeAddress;.
5d20: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
5d30: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
5d40: 20 20 20 2a 20 5f 67 65 74 41 72 63 73 31 20 28     * _getArcs1 (
5d50: 69 41 64 64 72 29 20 7b 0a 20 20 20 20 20 20 20  iAddr) {.       
5d60: 20 22 67 65 6e 65 72 61 74 6f 72 3a 20 72 65 74   "generator: ret
5d70: 75 72 6e 20 61 6c 6c 20 61 72 63 73 20 61 74 20  urn all arcs at 
5d80: 3c 69 41 64 64 72 3e 20 61 73 20 74 75 70 6c 65  <iAddr> as tuple
5d90: 73 20 6f 66 20 28 6e 56 61 6c 2c 20 69 41 64 64  s of (nVal, iAdd
5da0: 72 29 22 0a 20 20 20 20 20 20 20 20 77 68 69 6c  r)".        whil
5db0: 65 20 28 74 72 75 65 29 20 7b 0a 20 20 20 20 20  e (true) {.     
5dc0: 20 20 20 20 20 20 20 6c 65 74 20 69 45 6e 64 41         let iEndA
5dd0: 72 63 41 64 64 72 20 3d 20 69 41 64 64 72 2b 74  rcAddr = iAddr+t
5de0: 68 69 73 2e 6e 42 79 74 65 73 41 72 63 3b 0a 20  his.nBytesArc;. 
5df0: 20 20 20 20 20 20 20 20 20 20 20 6c 65 74 20 6e             let n
5e00: 52 61 77 41 72 63 20 3d 20 74 68 69 73 2e 5f 63  RawArc = this._c
5e10: 6f 6e 76 42 79 74 65 73 54 6f 49 6e 74 65 67 65  onvBytesToIntege
5e20: 72 28 74 68 69 73 2e 62 79 44 69 63 2e 73 6c 69  r(this.byDic.sli
5e30: 63 65 28 69 41 64 64 72 2c 20 69 45 6e 64 41 72  ce(iAddr, iEndAr
5e40: 63 41 64 64 72 29 29 3b 0a 20 20 20 20 20 20 20  cAddr));.       
5e50: 20 20 20 20 20 79 69 65 6c 64 20 5b 6e 52 61 77       yield [nRaw
5e60: 41 72 63 20 26 20 74 68 69 73 2e 5f 61 72 63 4d  Arc & this._arcM
5e70: 61 73 6b 2c 20 74 68 69 73 2e 5f 63 6f 6e 76 42  ask, this._convB
5e80: 79 74 65 73 54 6f 49 6e 74 65 67 65 72 28 74 68  ytesToInteger(th
5e90: 69 73 2e 62 79 44 69 63 2e 73 6c 69 63 65 28 69  is.byDic.slice(i
5ea0: 45 6e 64 41 72 63 41 64 64 72 2c 20 69 45 6e 64  EndArcAddr, iEnd
5eb0: 41 72 63 41 64 64 72 2b 74 68 69 73 2e 6e 42 79  ArcAddr+this.nBy
5ec0: 74 65 73 4e 6f 64 65 41 64 64 72 65 73 73 29 29  tesNodeAddress))
5ed0: 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ];.            i
5ee0: 66 20 28 6e 52 61 77 41 72 63 20 26 20 74 68 69  f (nRawArc & thi
5ef0: 73 2e 5f 6c 61 73 74 41 72 63 4d 61 73 6b 29 20  s._lastArcMask) 
5f00: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
5f10: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
5f20: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
5f30: 20 20 20 69 41 64 64 72 20 3d 20 69 45 6e 64 41     iAddr = iEndA
5f40: 72 63 41 64 64 72 2b 74 68 69 73 2e 6e 42 79 74  rcAddr+this.nByt
5f50: 65 73 4e 6f 64 65 41 64 64 72 65 73 73 3b 0a 20  esNodeAddress;. 
5f60: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a         }.    }..
5f70: 20 20 20 20 2f 2f 20 56 45 52 53 49 4f 4e 20 32      // VERSION 2
5f80: 0a 20 20 20 20 5f 6d 6f 72 70 68 32 20 28 73 57  .    _morph2 (sW
5f90: 6f 72 64 29 20 7b 0a 20 20 20 20 20 20 20 20 2f  ord) {.        /
5fa0: 2f 20 74 6f 20 64 6f 0a 20 20 20 20 7d 0a 0a 20  / to do.    }.. 
5fb0: 20 20 20 5f 73 74 65 6d 32 20 28 73 57 6f 72 64     _stem2 (sWord
5fc0: 29 20 7b 0a 20 20 20 20 20 20 20 20 2f 2f 20 74  ) {.        // t
5fd0: 6f 20 64 6f 0a 20 20 20 20 7d 0a 0a 20 20 20 20  o do.    }..    
5fe0: 5f 6c 6f 6f 6b 75 70 41 72 63 4e 6f 64 65 32 20  _lookupArcNode2 
5ff0: 28 6e 56 61 6c 2c 20 69 41 64 64 72 29 20 7b 0a  (nVal, iAddr) {.
6000: 20 20 20 20 20 20 20 20 2f 2f 20 74 6f 20 64 6f          // to do
6010: 0a 20 20 20 20 7d 0a 0a 0a 20 20 20 20 2f 2f 20  .    }...    // 
6020: 56 45 52 53 49 4f 4e 20 33 0a 20 20 20 20 5f 6d  VERSION 3.    _m
6030: 6f 72 70 68 33 20 28 73 57 6f 72 64 29 20 7b 0a  orph3 (sWord) {.
6040: 20 20 20 20 20 20 20 20 2f 2f 20 74 6f 20 64 6f          // to do
6050: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 5f 73 74 65  .    }..    _ste
6060: 6d 33 20 28 73 57 6f 72 64 29 20 7b 0a 20 20 20  m3 (sWord) {.   
6070: 20 20 20 20 20 2f 2f 20 74 6f 20 64 6f 0a 20 20       // to do.  
6080: 20 20 7d 0a 0a 20 20 20 20 5f 6c 6f 6f 6b 75 70    }..    _lookup
6090: 41 72 63 4e 6f 64 65 33 20 28 6e 56 61 6c 2c 20  ArcNode3 (nVal, 
60a0: 69 41 64 64 72 29 20 7b 0a 20 20 20 20 20 20 20  iAddr) {.       
60b0: 20 2f 2f 20 74 6f 20 64 6f 0a 20 20 20 20 7d 0a   // to do.    }.
60c0: 7d 0a 0a 0a 69 66 20 28 74 79 70 65 6f 66 28 65  }...if (typeof(e
60d0: 78 70 6f 72 74 73 29 20 21 3d 3d 20 27 75 6e 64  xports) !== 'und
60e0: 65 66 69 6e 65 64 27 29 20 7b 0a 20 20 20 20 65  efined') {.    e
60f0: 78 70 6f 72 74 73 2e 49 42 44 41 57 47 20 3d 20  xports.IBDAWG = 
6100: 49 42 44 41 57 47 3b 0a 7d 0a                    IBDAWG;.}.