const L = require("./lambda-calculus.js");
const base = require("fs").readFileSync("./base.lam", "utf8");

var term = `
${base}

@U #f
  /f f

@Y #f
  /#x /f /x x #x /f /x x

@F.id
  #x x

@F.flip #f #a #b
  //f b a

@F.K #a #b
  b

@C.suc #n #s #z
  /s //n s z

@C.add #a #b #s #z
  //a s //b s z

@C.mul #a #b #s #z
  //a /b s z

@C.exp #a #b
  /b a

@C.mod #a #b
  ///b #c #d /c #e //d #f #g /f //e f g e #c /c #d #e e #c //a ///b #d #e #f /d #g //e g f #d d #d #e /e d ///b #d #e d #d d #d d

@C.P #n //C.exp 2 n

@C.expMod #a #b #m
  //C.mod //C.exp a b m

@C.0
  #s #z z

@C.1
  /C.suc C.0

@C.2
  /C.suc C.1

@C.3
  /C.suc C.2

@C.4
  /C.suc C.3

@C.5
  /C.suc C.4

@C.6
  /C.suc C.5

@C.7
  /C.suc C.6

@C.8
  /C.suc C.7

@C.9
  /C.suc C.8

@C.16
  //C.mul C.8 C.2

@C.32
  //C.mul C.16 C.2

@C.64
  //C.mul C.32 C.2

@C.128
  //C.mul C.64 C.2

@C.256
  //C.mul C.128 C.2

@C.512
  //C.mul C.256 C.2

@C.29 #s #z /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s z
@C.569 #s #z /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s /s z

@C.P0 C.1
@C.P1 //C.mul C.P0 C.2
@C.P2 //C.mul C.P1 C.2
@C.P3 //C.mul C.P2 C.2
@C.P4 //C.mul C.P3 C.2
@C.P5 //C.mul C.P4 C.2
@C.P6 //C.mul C.P5 C.2
@C.P7 //C.mul C.P6 C.2
@C.P8 //C.mul C.P7 C.2
@C.P9 //C.mul C.P8 C.2
@C.P10 //C.mul C.P9 C.2
@C.P11 //C.mul C.P10 C.2
@C.P12 //C.mul C.P11 C.2
@C.P13 //C.mul C.P12 C.2
@C.P14 //C.mul C.P13 C.2
@C.P15 //C.mul C.P14 C.2
@C.P16 //C.mul C.P15 C.2
@C.P17 //C.mul C.P16 C.2
@C.P18 //C.mul C.P17 C.2
@C.P19 //C.mul C.P18 C.2
@C.P20 //C.mul C.P19 C.2
@C.P21 //C.mul C.P20 C.2
@C.P22 //C.mul C.P21 C.2
@C.P23 //C.mul C.P22 C.2
@C.P24 //C.mul C.P23 C.2
@C.P25 //C.mul C.P24 C.2
@C.P26 //C.mul C.P25 C.2
@C.P27 //C.mul C.P26 C.2
@C.P28 //C.mul C.P27 C.2
@C.P29 //C.mul C.P28 C.2
@C.P30 //C.mul C.P29 C.2
@C.P31 //C.mul C.P30 C.2
@C.P32 //C.mul C.P31 C.2
@C.P33 //C.mul C.P32 C.2
@C.P34 //C.mul C.P33 C.2
@C.P35 //C.mul C.P34 C.2
@C.P36 //C.mul C.P35 C.2
@C.P37 //C.mul C.P36 C.2
@C.P38 //C.mul C.P37 C.2
@C.P39 //C.mul C.P38 C.2
@C.P40 //C.mul C.P39 C.2
@C.P41 //C.mul C.P40 C.2
@C.P42 //C.mul C.P41 C.2
@C.P43 //C.mul C.P42 C.2
@C.P44 //C.mul C.P43 C.2
@C.P45 //C.mul C.P44 C.2
@C.P46 //C.mul C.P45 C.2
@C.P47 //C.mul C.P46 C.2
@C.P48 //C.mul C.P47 C.2
@C.P49 //C.mul C.P48 C.2
@C.P50 //C.mul C.P49 C.2
@C.P51 //C.mul C.P50 C.2
@C.P52 //C.mul C.P51 C.2
@C.P53 //C.mul C.P52 C.2
@C.P54 //C.mul C.P53 C.2
@C.P55 //C.mul C.P54 C.2
@C.P56 //C.mul C.P55 C.2
@C.P57 //C.mul C.P56 C.2
@C.P58 //C.mul C.P57 C.2
@C.P59 //C.mul C.P58 C.2
@C.P60 //C.mul C.P59 C.2
@C.P61 //C.mul C.P60 C.2
@C.P62 //C.mul C.P61 C.2
@C.P63 //C.mul C.P62 C.2
@C.rnd32.a
  //C.add C.P0
  //C.add C.0
  //C.add C.P2
  //C.add C.0
  //C.add C.P4
  //C.add C.P5
  //C.add C.P6
  //C.add C.0
  //C.add C.0
  //C.add C.0
  //C.add C.0
  //C.add C.0
  //C.add C.0
  //C.add C.0
  //C.add C.P14
  //C.add C.0
  //C.add C.P16
  //C.add C.0
  //C.add C.0
  //C.add C.0
  //C.add C.P20
  //C.add C.0
  //C.add C.P22
  //C.add C.0
  //C.add C.0
  //C.add C.0
  //C.add C.0
  //C.add C.0
  //C.add C.P28
  //C.add C.P29
  //C.add C.P30
  //C.add C.P31
  C.0
@C.rnd32.b
  //C.add C.P0
  //C.add C.0
  //C.add C.0
  //C.add C.0
  //C.add C.0
  //C.add C.0
  //C.add C.0
  //C.add C.0
  //C.add C.0
  //C.add C.P9
  //C.add C.0
  //C.add C.P11
  //C.add C.P12
  //C.add C.P13
  //C.add C.0
  //C.add C.0
  //C.add C.0
  //C.add C.P17
  //C.add C.P18
  //C.add C.0
  //C.add C.0
  //C.add C.P21
  //C.add C.P22
  //C.add C.P23
  //C.add C.0
  //C.add C.0
  //C.add C.0
  //C.add C.P27
  //C.add C.P28
  //C.add C.0
  //C.add C.P30
  //C.add C.P31
  C.0
@C.rnd16.a
  //C.add C.P0
  //C.add C.0
  //C.add C.P2
  //C.add C.0
  //C.add C.P4
  //C.add C.P5
  //C.add C.P6
  //C.add C.0
  //C.add C.0
  //C.add C.0
  //C.add C.0
  //C.add C.0
  //C.add C.0
  //C.add C.0
  //C.add C.P14
  //C.add C.0
  C.0
@C.rnd16.b
  //C.add C.P0
  //C.add C.0
  //C.add C.0
  //C.add C.0
  //C.add C.0
  //C.add C.0
  //C.add C.0
  //C.add C.0
  //C.add C.0
  //C.add C.P9
  //C.add C.0
  //C.add C.P11
  //C.add C.P12
  //C.add C.P13
  //C.add C.0
  //C.add C.0
  C.0

@C.double
  /C.mul C.2

@L.nil #con #nil
  nil

@L.con #x #xs #con #nil
  //con x xs

@P.new #a #b
  #new //new a b

@P.fst #p
  /p #a #b a

@P.snd #p
  /p #a #b b

@T.new #a #b #c
  #new ///new a b c

@T.fst #t
  /t #a #b #c a

@T.snd #t
  /t #a #b #c b

@T.trd #t
  /t #a #b #c c

@B.suc /Y #r #x #a #b
  //x b #x /a /r x

@B.0 /Y #r #a #b
  /a r

@B.O #bs #o #i
  /o bs

@B.I #bs #o #i
  /i bs

@B.peek #n #x
  ///n
    #t /t #x //x
      #x #r #t //t x #a #b #c ///r a b /a c
      #x #r #t //t x #a #b #c ///r a b /b c
    #t //t x #a #b #c c
    #x #r r

@B.add /Y #R #xxs #yys
  ///xxs
    #xs #t //t F.id  xs
    #xs #t //t B.suc xs
    #f #xs ///yys
      #ys #t //t F.id  ys
      #ys #t //t B.suc ys
      #g #ys /f /g /B.O //R xs ys

@B.mul #xxs
  / #f /Y #R #yys
    ///yys
      #ys #R    /B.O /R ys
      #ys #R /f /B.O /R ys
      R
    /B.add xxs

@B.fromC #c
  //c B.suc B.0

@B.1
  /B.suc B.0

@B.2
  /B.suc B.1

@B.3
  /B.suc B.2

@B.4
  /B.suc B.3

@B.5
  /B.suc B.4

@B.6
  /B.suc B.5

@B.7
  /B.suc B.6

@B.8
  /B.suc B.7

@B.9
  /B.suc B.8

@B.27
  /B.I /B.I /B.I /B.O /B.I B.0

@B.137
  /B.I /B.O /B.O /B.I /B.O /B.O /B.O /B.I B.0

@B.rnd8.a
  /B.I /B.O /B.I /B.O /B.I /B.I /B.I /B.O B.0

@B.rnd8.b
  /B.I /B.O /B.O /B.O /B.O /B.O /B.O /B.O B.0

@B.rnd32.a
  /B.I /B.O /B.I /B.O /B.I /B.I /B.I /B.O
  /B.O /B.O /B.O /B.O /B.O /B.O /B.I /B.O
  /B.I /B.O /B.O /B.O /B.I /B.O /B.I /B.O
  /B.O /B.O /B.O /B.O /B.I /B.I /B.I /B.I
  /B.I /B.I /B.O /B.I /B.O /B.I /B.I /B.O
  /B.O /B.I /B.I /B.I /B.O /B.I /B.O /B.I
  /B.O /B.O /B.O /B.O /B.I /B.I /B.I /B.O
  /B.O /B.I /B.I /B.I /B.I /B.O /B.O /B.O
  B.0

@B.rnd32.b
  /B.I /B.O /B.O /B.O /B.O /B.O /B.O /B.O
  /B.O /B.I /B.O /B.I /B.I /B.I /B.O /B.O
  /B.O /B.I /B.I /B.O /B.O /B.I /B.I /B.I
  /B.O /B.O /B.O /B.I /B.I /B.O /B.I /B.I
  /B.I /B.O /B.I /B.I /B.I /B.I /B.O /B.O
  /B.O /B.O /B.O /B.I /B.I /B.O /B.I /B.O
  /B.O /B.I /B.I /B.O /B.I /B.I /B.O /B.O
  /B.O /B.I /B.O /B.I /B.I /B.O /B.I /B.I
  B.0

@B.rnd256.a
  /B.O /B.I /B.O /B.O /B.O /B.I /B.O /B.O
  /B.I /B.I /B.O /B.O /B.I /B.I /B.O /B.I
  /B.O /B.O /B.O /B.I /B.O /B.O /B.O /B.O
  /B.I /B.O /B.I /B.I /B.I /B.I /B.I /B.O
  /B.O /B.O /B.I /B.O /B.I /B.O /B.O /B.I
  /B.O /B.O /B.I /B.O /B.I /B.O /B.O /B.I
  /B.O /B.I /B.I /B.I /B.I /B.O /B.O /B.I
  /B.O /B.O /B.I /B.I /B.O /B.O /B.I /B.I
  /B.O /B.O /B.O /B.O /B.I /B.O /B.O /B.O
  /B.O /B.O /B.I /B.O /B.O /B.I /B.I /B.O
  /B.O /B.O /B.O /B.O /B.I /B.O /B.O /B.O
  /B.I /B.O /B.I /B.O /B.I /B.O /B.I /B.I
  /B.O /B.O /B.I /B.O /B.I /B.I /B.O /B.I
  /B.I /B.I /B.O /B.I /B.I /B.O /B.O /B.I
  /B.O /B.O /B.I /B.O /B.I /B.I /B.O /B.I
  /B.O /B.O /B.I /B.O /B.O /B.I /B.I /B.I
  /B.O /B.I /B.O /B.O /B.O /B.I /B.I /B.O
  /B.O /B.O /B.O /B.O /B.I /B.I /B.I /B.O
  /B.I /B.I /B.I /B.I /B.O /B.I /B.O /B.O
  /B.O /B.I /B.I /B.I /B.I /B.I /B.O /B.I
  /B.O /B.I /B.O /B.I /B.I /B.O /B.O /B.O
  /B.O /B.O /B.O /B.I /B.I /B.O /B.I /B.O
  /B.O /B.I /B.O /B.I /B.O /B.O /B.O /B.I
  /B.O /B.O /B.O /B.I /B.I /B.O /B.O /B.O
  /B.I /B.I /B.O /B.I /B.I /B.O /B.I /B.O
  /B.I /B.O /B.O /B.O /B.O /B.O /B.I /B.O
  /B.I /B.O /B.I /B.O /B.I /B.O /B.I /B.O
  /B.I /B.O /B.O /B.I /B.O /B.O /B.I /B.I
  /B.I /B.O /B.I /B.O /B.I /B.O /B.I /B.O
  /B.O /B.O /B.I /B.O /B.I /B.I /B.I /B.I
  /B.I /B.O /B.O /B.I /B.O /B.O /B.O /B.O
  /B.O /B.I /B.I /B.I /B.I /B.I /B.I /B.I
  B.0

@B.rnd256.b
  /B.O /B.I /B.O /B.O /B.O /B.I /B.I /B.I
  /B.I /B.I /B.I /B.O /B.O /B.O /B.O /B.O
  /B.I /B.O /B.O /B.O /B.O /B.I /B.O /B.O
  /B.I /B.I /B.I /B.O /B.I /B.I /B.O /B.O
  /B.I /B.O /B.I /B.O /B.O /B.O /B.O /B.O
  /B.I /B.O /B.O /B.I /B.I /B.O /B.I /B.O
  /B.O /B.I /B.O /B.O /B.I /B.O /B.I /B.I
  /B.I /B.I /B.O /B.I /B.O /B.I /B.O /B.O
  /B.I /B.I /B.O /B.O /B.I /B.I /B.O /B.O
  /B.I /B.I /B.O /B.O /B.O /B.I /B.I /B.O
  /B.O /B.I /B.O /B.O /B.I /B.I /B.O /B.O
  /B.I /B.I /B.I /B.I /B.I /B.O /B.I /B.O
  /B.I /B.I /B.I /B.I /B.I /B.O /B.I /B.O
  /B.I /B.O /B.I /B.O /B.O /B.I /B.I /B.O
  /B.I /B.O /B.O /B.I /B.I /B.O /B.O /B.O
  /B.O /B.O /B.O /B.O /B.O /B.O /B.O /B.I
  /B.I /B.O /B.O /B.I /B.O /B.O /B.O /B.I
  /B.O /B.O /B.I /B.O /B.I /B.O /B.I /B.I
  /B.O /B.O /B.I /B.I /B.O /B.I /B.I /B.O
  /B.I /B.O /B.I /B.I /B.O /B.O /B.O /B.I
  /B.O /B.O /B.I /B.O /B.O /B.O /B.O /B.I
  /B.I /B.O /B.I /B.O /B.O /B.I /B.I /B.I
  /B.O /B.I /B.I /B.O /B.I /B.O /B.O /B.I
  /B.I /B.I /B.O /B.O /B.I /B.I /B.O /B.O
  /B.I /B.I /B.I /B.I /B.O /B.O /B.O /B.O
  /B.O /B.O /B.O /B.O /B.O /B.I /B.I /B.I
  /B.O /B.I /B.I /B.I /B.O /B.I /B.O /B.I
  /B.I /B.I /B.O /B.O /B.O /B.O /B.I /B.I
  /B.I /B.O /B.O /B.O /B.O /B.I /B.O /B.O
  /B.O /B.O /B.O /B.O /B.I /B.O /B.I /B.I
  /B.O /B.O /B.I /B.O /B.I /B.O /B.I /B.I
  /B.O /B.O /B.I /B.O /B.I /B.O /B.O /B.I
  B.0

@B.toC #size #xxs
  /T.trd
    //size
      #t /t #xxs
        //xxs
          #xs #add #ret ///T.new xs /C.double add             ret
          #xs #add #ret ///T.new xs /C.double add //C.add add ret
      ///T.new xxs C.1 C.0

@B.slowAdd #xxs #yys
  ////B.toC C.32 xxs B.suc yys

@B.suk /Y #r #x #a #b
  //x b #x /a /r x

@T.0 /Y #R #o #i #z
  /o R

@T.O #ts #o #i #z
  /o ts

@T.I #ts #o #i #z
  /i ts

@T.Z #ts #o #i #z
  /z ts

@T.peek #n #x
  ///n
    #t /t #x ///x
      #x #r #t //t x #a #b #c #d ////r a b c /a d
      #x #r #t //t x #a #b #c #d ////r a b c /b d
      #x #r #t //t x #a #b #c #d ////r a b c /c d
    #t //t x #a #b #c #d d
    #x #r r

@B.add /Y #R #xxs #yys
  ///xxs
    #xs #t //t F.id xs
    #xs #t //t F.id xs
    #f #xs ///yys
      #ys #t //t F.id  ys
      #ys #t //t F.id ys
      #g #ys /f /g /B.O //R xs ys

@B.xor /Y #R #xxs #yys
  ///xxs
    #xs #yys //yys
      #ys /B.O //R xs ys
      #ys /B.I //R xs ys
    #xs #yys //yys
      #ys /B.I //R xs ys
      #ys /B.O //R xs ys
    yys

@B.xor /Y #R #xxs #yys
  ///xxs
    #xs #yys //yys
      #ys /B.O //R xs ys
      #ys /B.I //R xs ys
    #xs #yys //yys
      #ys /B.I //R xs ys
      #ys /B.O //R xs ys
    yys

@B.eq #n
  //n
    #p #xxs ///xxs 
      #xs #p #yys //yys
        #ys //p xs ys
        #ys #o #i o
      #xs #p #yys //yys
        #ys #o #i o
        #ys //p xs ys
      p
    #xxs #yys #o #i i

@BX.O #bs #o #i #e /o bs
@BX.I #bs #o #i #e /i bs
@BX.E     #o #i #e e
@BX.32.0 /BX.O /BX.O /BX.O /BX.O /BX.O /BX.O /BX.O /BX.O /BX.O /BX.O /BX.O /BX.O /BX.O /BX.O /BX.O /BX.O /BX.O /BX.O /BX.O /BX.O /BX.O /BX.O /BX.O /BX.O /BX.O /BX.O /BX.O /BX.O /BX.O /BX.O /BX.O /BX.O BX.E

@BB.O #bs #o #i #e /o ///bs o i e
@BB.I #bs #o #i #e /i ///bs o i e
@BB.E     #o #i #e e
@BB.32.0 #o #i #e /o /o /o /o /o /o /o /o /o /o /o /o /o /o /o /o /o /o /o /o /o /o /o /o /o /o /o /o /o /o /o /o e
@BB.32.rnd0 #o #i #e /i /o /i /i /i /o /i /o /i /o /o /i /i /o /o /o /i /o /i /i /i /i /o /i /o /o /i /o /i /i /o /i e
@BB.32.rnd1 #o #i #e /o /i /i /o /o /o /i /o /o /i /o /o /o /i /o /o /o /i /o /i /o /i /i /o /i /i /o /o /i /o /i /o e
@BB.xor #xxs #yys #o #i #e
  ////xxs
    #t /t #yys //yys
      #ys #r #t //t ys /o r
      #ys #r #t //t ys /i r
    #t /t #yys //yys
      #ys #r #t //t ys /i r
      #ys #r #t //t ys /o r
    #t //t ///yys B.O B.I B.0 e
    #ys #r r
@BX.suk /Y #r #xxs #o #i #e
  ///xxs
    i
    #xs /o /r xs
    e

@B.funs /Y #R #f #a
  ///a
    f
    /R f
    /R #x /f /f x

@X.n #n /n B.suc
@X.a #f #g #x /f /g x
@X.g #n /n B.0
@X.print32 #n //B.peek C.32 /X.g n
@X.0   /X.n C.0
@X.1   /X.n C.1
@X.2   /X.n C.2
@X.4   /X.n C.4
@X.8   /X.n C.8
@X.16  /X.n C.16
@X.32  /X.n C.32 
@X.64  /X.n C.64 
@X.128 /X.n C.128
@X.256 /X.n C.256
@X.rnd32.a
  //X.a /X.n C.P0
  //X.a /X.n X.0
  //X.a /X.n C.P2
  //X.a /X.n X.0
  //X.a /X.n C.P4
  //X.a /X.n C.P5
  //X.a /X.n C.P6
  //X.a /X.n X.0
  //X.a /X.n X.0
  //X.a /X.n X.0
  //X.a /X.n X.0
  //X.a /X.n X.0
  //X.a /X.n X.0
  //X.a /X.n X.0
  //X.a /X.n C.P14
  //X.a /X.n X.0
  //X.a /X.n C.P16
  //X.a /X.n X.0
  //X.a /X.n X.0
  //X.a /X.n X.0
  //X.a /X.n C.P20
  //X.a /X.n X.0
  //X.a /X.n C.P22
  //X.a /X.n X.0
  //X.a /X.n X.0
  //X.a /X.n X.0
  //X.a /X.n X.0
  //X.a /X.n X.0
  //X.a /X.n C.P28
  //X.a /X.n C.P29
  //X.a /X.n C.P30
  //X.a /X.n C.P31
  X.0
@X.rnd32.b
  //X.a /X.n C.P0
  //X.a /X.n X.0
  //X.a /X.n X.0
  //X.a /X.n X.0
  //X.a /X.n X.0
  //X.a /X.n X.0
  //X.a /X.n X.0
  //X.a /X.n X.0
  //X.a /X.n X.0
  //X.a /X.n C.P9
  //X.a /X.n X.0
  //X.a /X.n C.P11
  //X.a /X.n C.P12
  //X.a /X.n C.P13
  //X.a /X.n X.0
  //X.a /X.n X.0
  //X.a /X.n X.0
  //X.a /X.n C.P17
  //X.a /X.n C.P18
  //X.a /X.n X.0
  //X.a /X.n X.0
  //X.a /X.n C.P21
  //X.a /X.n C.P22
  //X.a /X.n C.P23
  //X.a /X.n X.0
  //X.a /X.n X.0
  //X.a /X.n X.0
  //X.a /X.n C.P27
  //X.a /X.n C.P28
  //X.a /X.n X.0
  //X.a /X.n C.P30
  //X.a /X.n C.P31
  X.0

@C.printBits
  #n #c //B.peek n //c B.suc B.0

@IL.tail #il
  /il #h #t t

@IL.head #il
  /il #h #t h

@IL.nth #n #il
  /IL.head //n IL.tail il

@IL.take #n
  //n
    #p #il /il #h #t #con #nil //con h /p t
    #il #con #nil nil
    

@C.group #gen #mod
  @go #f /Y #R #n
    #con //con /f n /R /C.suc n
  //go
    #n ///C.expMod gen n mod
    0

@C.g17
  //C.group 3 17

@ROT17
  #t #a0 #a1 #a2 #a3 #a4 #a5 #a6 #a7 #a8 #a9 #a10 #a11 #a12 #a13 #a14 #a15 #a16
  /////////////////t a16 a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15
    

@C.g17b
  @go /Y #R #t
    #con //con t /R #x /t /t /t x
  /go ROT17

@B.resetEq #n #xxs #yys
  /////n
    #p #xxs ///xxs 
      #xs #p #yys //yys
        #ys #self ///p xs ys #f /self #x /B.O /f x
        #ys #self //self #x x /B.I ys
      #xs #p #yys //yys
        #ys #self //self #x x /B.O ys
        #ys #self ///p xs ys #f /self #x /B.I /f x
      p
    #xxs #yys #self B.0
    xxs
    yys
    #f #x /f x

@B.sucMod #k #m #n
  ///B.resetEq k m /B.suc n

@B.sucMod011 #yys
  //yys
    #ys //ys
      #ys //ys
        #ys /B.I /B.O /B.O ys
        #ys /B.I /B.O /B.I ys
      #ys //ys
        #ys /B.O /B.O /B.O ys
        #ys /B.O /B.O /B.O ys
    #ys //ys
      #ys //ys
        #ys /B.O /B.I /B.O ys
        #ys /B.O /B.O /B.O ys
      #ys //ys
        #ys /B.O /B.O /B.I ys
        #ys /B.O /B.O /B.O ys

@N3
  #f #x //f #c //c f x
  #f #x //f #c //c f x
  #f #x //f #c //c f x
  #f #x x

@Np #n
  //n
    #f #p p
    #f #x x

@Nf #n #s #z
  //n
    #cont #pred /s /cont pred
    z

@Z.O #z #o #i //o #c //c o i z
@Z.I #z #o #i //i #c //c o i z
@Z.0 /Y #r /Z.O r
@Z.peek #n #x
  ///n
    #t /t #x //x
      #_ #x #r #t //t x #a #b #c ///r a b /a c
      #_ #x #r #t //t x #a #b #c ///r a b /b c
    #t //t x #a #b #c c
    #x #r r
@Z.rnd32.a
  /Z.I /Z.O /Z.I /Z.O /Z.I /Z.I /Z.I /Z.O
  /Z.O /Z.O /Z.O /Z.O /Z.O /Z.O /Z.I /Z.O
  /Z.I /Z.O /Z.O /Z.O /Z.I /Z.O /Z.I /Z.O
  /Z.O /Z.O /Z.O /Z.O /Z.I /Z.I /Z.I /Z.I
  /Z.I /Z.I /Z.O /Z.I /Z.O /Z.I /Z.I /Z.O
  /Z.O /Z.I /Z.I /Z.I /Z.O /Z.I /Z.O /Z.I
  /Z.O /Z.O /Z.O /Z.O /Z.I /Z.I /Z.I /Z.O
  /Z.O /Z.I /Z.I /Z.I /Z.I /Z.O /Z.O /Z.O
  Z.0
@Z.rnd32.b
  /Z.I /Z.O /Z.O /Z.O /Z.O /Z.O /Z.O /Z.O
  /Z.O /Z.I /Z.O /Z.I /Z.I /Z.I /Z.O /Z.O
  /Z.O /Z.I /Z.I /Z.O /Z.O /Z.I /Z.I /Z.I
  /Z.O /Z.O /Z.O /Z.I /Z.I /Z.O /Z.I /Z.I
  /Z.I /Z.O /Z.I /Z.I /Z.I /Z.I /Z.O /Z.O
  /Z.O /Z.O /Z.O /Z.I /Z.I /Z.O /Z.I /Z.O
  /Z.O /Z.I /Z.I /Z.O /Z.I /Z.I /Z.O /Z.O
  /Z.O /Z.I /Z.O /Z.I /Z.I /Z.O /Z.I /Z.I
  Z.0

@Z.suc #z
  //z
    #fold Z.I
    #fold #z /Z.O /fold z

@Z.add #xxs
  //xxs
    #fxs #xs #yys //yys
      #fys #ys /Z.O //fxs xs ys
      #fys #ys /Z.I //fxs xs ys
    #fxs #xs #yys //yys
      #fys #ys /Z.I //fxs xs ys
      #fys #ys /Z.suc /Z.I //fxs xs ys

//Z.peek 32 //Z.add Z.rnd32.a Z.rnd32.b
//B.peek 32 //B.add B.rnd32.a B.rnd32.b

`;

//B.peek 256 ///C.P 12 f B.0
//101

//IL.take 15 C.g17

// 3 ^ 15 = 6 (mod 17)
// 3 ^ ?  = 6


//C.128 suk BX.32.0

//@BB.xor2 #xxs #yys #o #i #e
  //////xxs
    //#xs #cont /cont xs
    //#xs #cont /cont xs
    //#cont e
    /////yys
      //#ys #cont /o /cont ys
      //#ys #cont /i /cont ys
      //#cont 


console.log(L.reduce(term, 1));
