js-confuser 2.0.0-alpha.2 → 2.0.0-alpha.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (91) hide show
  1. package/.prettierrc +4 -0
  2. package/CHANGELOG.md +42 -8
  3. package/Migration.md +23 -8
  4. package/README.md +2 -2
  5. package/dist/constants.js +11 -2
  6. package/dist/index.js +49 -6
  7. package/dist/obfuscator.js +121 -10
  8. package/dist/order.js +0 -1
  9. package/dist/probability.js +1 -96
  10. package/dist/templates/getGlobalTemplate.js +4 -1
  11. package/dist/templates/integrityTemplate.js +1 -1
  12. package/dist/templates/stringCompressionTemplate.js +3 -3
  13. package/dist/templates/tamperProtectionTemplates.js +1 -1
  14. package/dist/templates/template.js +17 -12
  15. package/dist/transforms/controlFlowFlattening.js +112 -83
  16. package/dist/transforms/deadCode.js +21 -22
  17. package/dist/transforms/dispatcher.js +62 -37
  18. package/dist/transforms/extraction/duplicateLiteralsRemoval.js +5 -0
  19. package/dist/transforms/extraction/objectExtraction.js +1 -2
  20. package/dist/transforms/finalizer.js +1 -1
  21. package/dist/transforms/flatten.js +2 -19
  22. package/dist/transforms/identifier/globalConcealing.js +3 -4
  23. package/dist/transforms/identifier/movedDeclarations.js +12 -5
  24. package/dist/transforms/identifier/renameVariables.js +40 -6
  25. package/dist/transforms/lock/integrity.js +9 -1
  26. package/dist/transforms/lock/lock.js +16 -9
  27. package/dist/transforms/minify.js +64 -27
  28. package/dist/transforms/opaquePredicates.js +6 -7
  29. package/dist/transforms/pack.js +32 -5
  30. package/dist/transforms/plugin.js +20 -39
  31. package/dist/transforms/preparation.js +25 -36
  32. package/dist/transforms/renameLabels.js +1 -2
  33. package/dist/transforms/rgf.js +36 -16
  34. package/dist/transforms/shuffle.js +10 -11
  35. package/dist/transforms/string/stringCompression.js +14 -10
  36. package/dist/transforms/string/stringConcealing.js +7 -5
  37. package/dist/transforms/string/stringEncoding.js +4 -2
  38. package/dist/transforms/string/stringSplitting.js +4 -2
  39. package/dist/transforms/variableMasking.js +3 -2
  40. package/dist/utils/NameGen.js +5 -2
  41. package/dist/utils/PredicateGen.js +62 -0
  42. package/dist/utils/ast-utils.js +24 -9
  43. package/dist/utils/random-utils.js +10 -0
  44. package/dist/validateOptions.js +2 -2
  45. package/index.d.ts +16 -2
  46. package/package.json +2 -2
  47. package/src/constants.ts +15 -5
  48. package/src/index.ts +15 -5
  49. package/src/obfuscationResult.ts +7 -1
  50. package/src/obfuscator.ts +152 -12
  51. package/src/options.ts +26 -8
  52. package/src/order.ts +0 -2
  53. package/src/templates/getGlobalTemplate.ts +5 -1
  54. package/src/templates/integrityTemplate.ts +14 -19
  55. package/src/templates/stringCompressionTemplate.ts +4 -28
  56. package/src/templates/tamperProtectionTemplates.ts +7 -3
  57. package/src/templates/template.ts +5 -3
  58. package/src/transforms/controlFlowFlattening.ts +139 -83
  59. package/src/transforms/deadCode.ts +27 -30
  60. package/src/transforms/dispatcher.ts +24 -5
  61. package/src/transforms/extraction/duplicateLiteralsRemoval.ts +10 -1
  62. package/src/transforms/extraction/objectExtraction.ts +1 -2
  63. package/src/transforms/finalizer.ts +1 -1
  64. package/src/transforms/flatten.ts +3 -22
  65. package/src/transforms/identifier/globalConcealing.ts +26 -17
  66. package/src/transforms/identifier/movedDeclarations.ts +18 -6
  67. package/src/transforms/identifier/renameVariables.ts +48 -6
  68. package/src/transforms/lock/integrity.ts +11 -1
  69. package/src/transforms/lock/lock.ts +26 -10
  70. package/src/transforms/minify.ts +85 -38
  71. package/src/transforms/opaquePredicates.ts +6 -9
  72. package/src/transforms/pack.ts +41 -5
  73. package/src/transforms/plugin.ts +47 -69
  74. package/src/transforms/preparation.ts +33 -46
  75. package/src/transforms/renameLabels.ts +1 -2
  76. package/src/transforms/rgf.ts +52 -23
  77. package/src/transforms/shuffle.ts +28 -26
  78. package/src/transforms/string/encoding.ts +1 -1
  79. package/src/transforms/string/stringCompression.ts +22 -13
  80. package/src/transforms/string/stringConcealing.ts +13 -7
  81. package/src/transforms/string/stringEncoding.ts +6 -2
  82. package/src/transforms/string/stringSplitting.ts +9 -4
  83. package/src/transforms/variableMasking.ts +2 -2
  84. package/src/utils/NameGen.ts +13 -3
  85. package/src/utils/PredicateGen.ts +61 -0
  86. package/src/utils/ast-utils.ts +16 -9
  87. package/src/utils/random-utils.ts +14 -0
  88. package/src/validateOptions.ts +7 -4
  89. package/src/probability.ts +0 -110
  90. package/src/transforms/functionOutlining.ts +0 -225
  91. package/src/utils/ControlObject.ts +0 -141
@@ -3,8 +3,8 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.StringCompressionTemplate = exports.PakoInflateMin = void 0;
6
+ exports.StringCompressionTemplate = exports.StringCompressionLibraryMinified = void 0;
7
7
  var _template = _interopRequireDefault(require("./template"));
8
8
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { "default": e }; }
9
- var StringCompressionTemplate = exports.StringCompressionTemplate = new _template["default"]("\nvar {stringFn};\n\n(function (){\n {GetGlobalTemplate}\n\n var __globalObject = {getGlobalFnName}() || {};\n\n // Direct invocation of atob() is not allowed in some environments\n var _atob = (s) => __globalObject[\"atob\"](s);\n var _Uint8Array = __globalObject[\"Uint8Array\"];\n\n function convertBase64ToArrayBuffer(base64) {\n var binaryString = _atob(base64); // Decode Base64\n var len = binaryString.length;\n var uint8Array = new _Uint8Array(len);\n\n // Convert binary string back into Uint8Array\n for (var i = 0; i < len; i++) {\n uint8Array[i] = binaryString[\"charCodeAt\"](i);\n }\n return uint8Array;\n }\n\n var compressedBuffer = convertBase64ToArrayBuffer({stringValue});\n var utf8String = {pakoName}[\"inflate\"](compressedBuffer, { to: 'string' });\n var stringArray = utf8String[\"split\"]({stringDelimiter});\n\n {stringFn} = function(index){\n return stringArray[index];\n }\n})();\n");
10
- var PakoInflateMin = exports.PakoInflateMin = " \nvar {pako} = {};\n\n/*! pako 2.1.0 https://github.com/nodeca/pako @license (MIT AND Zlib) */\n!function(e,t){ t({pako}) }(this,(function(e){\"use strict\";var t=function(e,t,i,n){for(var a=65535&e|0,r=e>>>16&65535|0,o=0;0!==i;){i-=o=i>2e3?2e3:i;do{r=r+(a=a+t[n++]|0)|0}while(--o);a%=65521,r%=65521}return a|r<<16|0},i=new Uint32Array(function(){for(var e,t=[],i=0;i<256;i++){e=i;for(var n=0;n<8;n++)e=1&e?3988292384^e>>>1:e>>>1;t[i]=e}return t}()),n=function(e,t,n,a){var r=i,o=a+n;e^=-1;for(var s=a;s<o;s++)e=e>>>8^r[255&(e^t[s])];return-1^e},a=16209,r=function(e,t){var i,n,r,o,s,l,f,d,h,c,u,w,b,m,k,_,v,g,p,y,x,E,R,A,Z=e.state;i=e.next_in,R=e.input,n=i+(e.avail_in-5),r=e.next_out,A=e.output,o=r-(t-e.avail_out),s=r+(e.avail_out-257),l=Z.dmax,f=Z.wsize,d=Z.whave,h=Z.wnext,c=Z.window,u=Z.hold,w=Z.bits,b=Z.lencode,m=Z.distcode,k=(1<<Z.lenbits)-1,_=(1<<Z.distbits)-1;e:do{w<15&&(u+=R[i++]<<w,w+=8,u+=R[i++]<<w,w+=8),v=b[u&k];t:for(;;){if(u>>>=g=v>>>24,w-=g,0===(g=v>>>16&255))A[r++]=65535&v;else{if(!(16&g)){if(0==(64&g)){v=b[(65535&v)+(u&(1<<g)-1)];continue t}if(32&g){Z.mode=16191;break e}e.msg=\"invalid literal/length code\",Z.mode=a;break e}p=65535&v,(g&=15)&&(w<g&&(u+=R[i++]<<w,w+=8),p+=u&(1<<g)-1,u>>>=g,w-=g),w<15&&(u+=R[i++]<<w,w+=8,u+=R[i++]<<w,w+=8),v=m[u&_];i:for(;;){if(u>>>=g=v>>>24,w-=g,!(16&(g=v>>>16&255))){if(0==(64&g)){v=m[(65535&v)+(u&(1<<g)-1)];continue i}e.msg=\"invalid distance code\",Z.mode=a;break e}if(y=65535&v,w<(g&=15)&&(u+=R[i++]<<w,(w+=8)<g&&(u+=R[i++]<<w,w+=8)),(y+=u&(1<<g)-1)>l){e.msg=\"invalid distance too far back\",Z.mode=a;break e}if(u>>>=g,w-=g,y>(g=r-o)){if((g=y-g)>d&&Z.sane){e.msg=\"invalid distance too far back\",Z.mode=a;break e}if(x=0,E=c,0===h){if(x+=f-g,g<p){p-=g;do{A[r++]=c[x++]}while(--g);x=r-y,E=A}}else if(h<g){if(x+=f+h-g,(g-=h)<p){p-=g;do{A[r++]=c[x++]}while(--g);if(x=0,h<p){p-=g=h;do{A[r++]=c[x++]}while(--g);x=r-y,E=A}}}else if(x+=h-g,g<p){p-=g;do{A[r++]=c[x++]}while(--g);x=r-y,E=A}for(;p>2;)A[r++]=E[x++],A[r++]=E[x++],A[r++]=E[x++],p-=3;p&&(A[r++]=E[x++],p>1&&(A[r++]=E[x++]))}else{x=r-y;do{A[r++]=A[x++],A[r++]=A[x++],A[r++]=A[x++],p-=3}while(p>2);p&&(A[r++]=A[x++],p>1&&(A[r++]=A[x++]))}break}}break}}while(i<n&&r<s);i-=p=w>>3,u&=(1<<(w-=p<<3))-1,e.next_in=i,e.next_out=r,e.avail_in=i<n?n-i+5:5-(i-n),e.avail_out=r<s?s-r+257:257-(r-s),Z.hold=u,Z.bits=w},o=15,s=new Uint16Array([3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258,0,0]),l=new Uint8Array([16,16,16,16,16,16,16,16,17,17,17,17,18,18,18,18,19,19,19,19,20,20,20,20,21,21,21,21,16,72,78]),f=new Uint16Array([1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577,0,0]),d=new Uint8Array([16,16,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23,24,24,25,25,26,26,27,27,28,28,29,29,64,64]),h=function(e,t,i,n,a,r,h,c){var u,w,b,m,k,_,v,g,p,y=c.bits,x=0,E=0,R=0,A=0,Z=0,S=0,T=0,O=0,U=0,D=0,I=null,B=new Uint16Array(16),N=new Uint16Array(16),C=null;for(x=0;x<=o;x++)B[x]=0;for(E=0;E<n;E++)B[t[i+E]]++;for(Z=y,A=o;A>=1&&0===B[A];A--);if(Z>A&&(Z=A),0===A)return a[r++]=20971520,a[r++]=20971520,c.bits=1,0;for(R=1;R<A&&0===B[R];R++);for(Z<R&&(Z=R),O=1,x=1;x<=o;x++)if(O<<=1,(O-=B[x])<0)return-1;if(O>0&&(0===e||1!==A))return-1;for(N[1]=0,x=1;x<o;x++)N[x+1]=N[x]+B[x];for(E=0;E<n;E++)0!==t[i+E]&&(h[N[t[i+E]]++]=E);if(0===e?(I=C=h,_=20):1===e?(I=s,C=l,_=257):(I=f,C=d,_=0),D=0,E=0,x=R,k=r,S=Z,T=0,b=-1,m=(U=1<<Z)-1,1===e&&U>852||2===e&&U>592)return 1;for(;;){v=x-T,h[E]+1<_?(g=0,p=h[E]):h[E]>=_?(g=C[h[E]-_],p=I[h[E]-_]):(g=96,p=0),u=1<<x-T,R=w=1<<S;do{a[k+(D>>T)+(w-=u)]=v<<24|g<<16|p|0}while(0!==w);for(u=1<<x-1;D&u;)u>>=1;if(0!==u?(D&=u-1,D+=u):D=0,E++,0==--B[x]){if(x===A)break;x=t[i+h[E]]}if(x>Z&&(D&m)!==b){for(0===T&&(T=Z),k+=R,O=1<<(S=x-T);S+T<A&&!((O-=B[S+T])<=0);)S++,O<<=1;if(U+=1<<S,1===e&&U>852||2===e&&U>592)return 1;a[b=D&m]=Z<<24|S<<16|k-r|0}}return 0!==D&&(a[k+D]=x-T<<24|64<<16|0),c.bits=Z,0},c={Z_NO_FLUSH:0,Z_PARTIAL_FLUSH:1,Z_SYNC_FLUSH:2,Z_FULL_FLUSH:3,Z_FINISH:4,Z_BLOCK:5,Z_TREES:6,Z_OK:0,Z_STREAM_END:1,Z_NEED_DICT:2,Z_ERRNO:-1,Z_STREAM_ERROR:-2,Z_DATA_ERROR:-3,Z_MEM_ERROR:-4,Z_BUF_ERROR:-5,Z_NO_COMPRESSION:0,Z_BEST_SPEED:1,Z_BEST_COMPRESSION:9,Z_DEFAULT_COMPRESSION:-1,Z_FILTERED:1,Z_HUFFMAN_ONLY:2,Z_RLE:3,Z_FIXED:4,Z_DEFAULT_STRATEGY:0,Z_BINARY:0,Z_TEXT:1,Z_UNKNOWN:2,Z_DEFLATED:8},u=c.Z_FINISH,w=c.Z_BLOCK,b=c.Z_TREES,m=c.Z_OK,k=c.Z_STREAM_END,_=c.Z_NEED_DICT,v=c.Z_STREAM_ERROR,g=c.Z_DATA_ERROR,p=c.Z_MEM_ERROR,y=c.Z_BUF_ERROR,x=c.Z_DEFLATED,E=16180,R=16190,A=16191,Z=16192,S=16194,T=16199,O=16200,U=16206,D=16209,I=function(e){return(e>>>24&255)+(e>>>8&65280)+((65280&e)<<8)+((255&e)<<24)};function B(){this.strm=null,this.mode=0,this.last=!1,this.wrap=0,this.havedict=!1,this.flags=0,this.dmax=0,this.check=0,this.total=0,this.head=null,this.wbits=0,this.wsize=0,this.whave=0,this.wnext=0,this.window=null,this.hold=0,this.bits=0,this.length=0,this.offset=0,this.extra=0,this.lencode=null,this.distcode=null,this.lenbits=0,this.distbits=0,this.ncode=0,this.nlen=0,this.ndist=0,this.have=0,this.next=null,this.lens=new Uint16Array(320),this.work=new Uint16Array(288),this.lendyn=null,this.distdyn=null,this.sane=0,this.back=0,this.was=0}var N,C,z=function(e){if(!e)return 1;var t=e.state;return!t||t.strm!==e||t.mode<E||t.mode>16211?1:0},F=function(e){if(z(e))return v;var t=e.state;return e.total_in=e.total_out=t.total=0,e.msg=\"\",t.wrap&&(e.adler=1&t.wrap),t.mode=E,t.last=0,t.havedict=0,t.flags=-1,t.dmax=32768,t.head=null,t.hold=0,t.bits=0,t.lencode=t.lendyn=new Int32Array(852),t.distcode=t.distdyn=new Int32Array(592),t.sane=1,t.back=-1,m},L=function(e){if(z(e))return v;var t=e.state;return t.wsize=0,t.whave=0,t.wnext=0,F(e)},M=function(e,t){var i;if(z(e))return v;var n=e.state;return t<0?(i=0,t=-t):(i=5+(t>>4),t<48&&(t&=15)),t&&(t<8||t>15)?v:(null!==n.window&&n.wbits!==t&&(n.window=null),n.wrap=i,n.wbits=t,L(e))},H=function(e,t){if(!e)return v;var i=new B;e.state=i,i.strm=e,i.window=null,i.mode=E;var n=M(e,t);return n!==m&&(e.state=null),n},j=!0,K=function(e){if(j){N=new Int32Array(512),C=new Int32Array(32);for(var t=0;t<144;)e.lens[t++]=8;for(;t<256;)e.lens[t++]=9;for(;t<280;)e.lens[t++]=7;for(;t<288;)e.lens[t++]=8;for(h(1,e.lens,0,288,N,0,e.work,{bits:9}),t=0;t<32;)e.lens[t++]=5;h(2,e.lens,0,32,C,0,e.work,{bits:5}),j=!1}e.lencode=N,e.lenbits=9,e.distcode=C,e.distbits=5},P=function(e,t,i,n){var a,r=e.state;return null===r.window&&(r.wsize=1<<r.wbits,r.wnext=0,r.whave=0,r.window=new Uint8Array(r.wsize)),n>=r.wsize?(r.window.set(t.subarray(i-r.wsize,i),0),r.wnext=0,r.whave=r.wsize):((a=r.wsize-r.wnext)>n&&(a=n),r.window.set(t.subarray(i-n,i-n+a),r.wnext),(n-=a)?(r.window.set(t.subarray(i-n,i),0),r.wnext=n,r.whave=r.wsize):(r.wnext+=a,r.wnext===r.wsize&&(r.wnext=0),r.whave<r.wsize&&(r.whave+=a))),0},Y={inflateReset:L,inflateReset2:M,inflateResetKeep:F,inflateInit:function(e){return H(e,15)},inflateInit2:H,inflate:function(e,i){var a,o,s,l,f,d,c,B,N,C,F,L,M,H,j,Y,G,X,W,q,J,Q,V,$,ee=0,te=new Uint8Array(4),ie=new Uint8Array([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]);if(z(e)||!e.output||!e.input&&0!==e.avail_in)return v;(a=e.state).mode===A&&(a.mode=Z),f=e.next_out,s=e.output,c=e.avail_out,l=e.next_in,o=e.input,d=e.avail_in,B=a.hold,N=a.bits,C=d,F=c,Q=m;e:for(;;)switch(a.mode){case E:if(0===a.wrap){a.mode=Z;break}for(;N<16;){if(0===d)break e;d--,B+=o[l++]<<N,N+=8}if(2&a.wrap&&35615===B){0===a.wbits&&(a.wbits=15),a.check=0,te[0]=255&B,te[1]=B>>>8&255,a.check=n(a.check,te,2,0),B=0,N=0,a.mode=16181;break}if(a.head&&(a.head.done=!1),!(1&a.wrap)||(((255&B)<<8)+(B>>8))%31){e.msg=\"incorrect header check\",a.mode=D;break}if((15&B)!==x){e.msg=\"unknown compression method\",a.mode=D;break}if(N-=4,J=8+(15&(B>>>=4)),0===a.wbits&&(a.wbits=J),J>15||J>a.wbits){e.msg=\"invalid window size\",a.mode=D;break}a.dmax=1<<a.wbits,a.flags=0,e.adler=a.check=1,a.mode=512&B?16189:A,B=0,N=0;break;case 16181:for(;N<16;){if(0===d)break e;d--,B+=o[l++]<<N,N+=8}if(a.flags=B,(255&a.flags)!==x){e.msg=\"unknown compression method\",a.mode=D;break}if(57344&a.flags){e.msg=\"unknown header flags set\",a.mode=D;break}a.head&&(a.head.text=B>>8&1),512&a.flags&&4&a.wrap&&(te[0]=255&B,te[1]=B>>>8&255,a.check=n(a.check,te,2,0)),B=0,N=0,a.mode=16182;case 16182:for(;N<32;){if(0===d)break e;d--,B+=o[l++]<<N,N+=8}a.head&&(a.head.time=B),512&a.flags&&4&a.wrap&&(te[0]=255&B,te[1]=B>>>8&255,te[2]=B>>>16&255,te[3]=B>>>24&255,a.check=n(a.check,te,4,0)),B=0,N=0,a.mode=16183;case 16183:for(;N<16;){if(0===d)break e;d--,B+=o[l++]<<N,N+=8}a.head&&(a.head.xflags=255&B,a.head.os=B>>8),512&a.flags&&4&a.wrap&&(te[0]=255&B,te[1]=B>>>8&255,a.check=n(a.check,te,2,0)),B=0,N=0,a.mode=16184;case 16184:if(1024&a.flags){for(;N<16;){if(0===d)break e;d--,B+=o[l++]<<N,N+=8}a.length=B,a.head&&(a.head.extra_len=B),512&a.flags&&4&a.wrap&&(te[0]=255&B,te[1]=B>>>8&255,a.check=n(a.check,te,2,0)),B=0,N=0}else a.head&&(a.head.extra=null);a.mode=16185;case 16185:if(1024&a.flags&&((L=a.length)>d&&(L=d),L&&(a.head&&(J=a.head.extra_len-a.length,a.head.extra||(a.head.extra=new Uint8Array(a.head.extra_len)),a.head.extra.set(o.subarray(l,l+L),J)),512&a.flags&&4&a.wrap&&(a.check=n(a.check,o,L,l)),d-=L,l+=L,a.length-=L),a.length))break e;a.length=0,a.mode=16186;case 16186:if(2048&a.flags){if(0===d)break e;L=0;do{J=o[l+L++],a.head&&J&&a.length<65536&&(a.head.name+=String.fromCharCode(J))}while(J&&L<d);if(512&a.flags&&4&a.wrap&&(a.check=n(a.check,o,L,l)),d-=L,l+=L,J)break e}else a.head&&(a.head.name=null);a.length=0,a.mode=16187;case 16187:if(4096&a.flags){if(0===d)break e;L=0;do{J=o[l+L++],a.head&&J&&a.length<65536&&(a.head.comment+=String.fromCharCode(J))}while(J&&L<d);if(512&a.flags&&4&a.wrap&&(a.check=n(a.check,o,L,l)),d-=L,l+=L,J)break e}else a.head&&(a.head.comment=null);a.mode=16188;case 16188:if(512&a.flags){for(;N<16;){if(0===d)break e;d--,B+=o[l++]<<N,N+=8}if(4&a.wrap&&B!==(65535&a.check)){e.msg=\"header crc mismatch\",a.mode=D;break}B=0,N=0}a.head&&(a.head.hcrc=a.flags>>9&1,a.head.done=!0),e.adler=a.check=0,a.mode=A;break;case 16189:for(;N<32;){if(0===d)break e;d--,B+=o[l++]<<N,N+=8}e.adler=a.check=I(B),B=0,N=0,a.mode=R;case R:if(0===a.havedict)return e.next_out=f,e.avail_out=c,e.next_in=l,e.avail_in=d,a.hold=B,a.bits=N,_;e.adler=a.check=1,a.mode=A;case A:if(i===w||i===b)break e;case Z:if(a.last){B>>>=7&N,N-=7&N,a.mode=U;break}for(;N<3;){if(0===d)break e;d--,B+=o[l++]<<N,N+=8}switch(a.last=1&B,N-=1,3&(B>>>=1)){case 0:a.mode=16193;break;case 1:if(K(a),a.mode=T,i===b){B>>>=2,N-=2;break e}break;case 2:a.mode=16196;break;case 3:e.msg=\"invalid block type\",a.mode=D}B>>>=2,N-=2;break;case 16193:for(B>>>=7&N,N-=7&N;N<32;){if(0===d)break e;d--,B+=o[l++]<<N,N+=8}if((65535&B)!=(B>>>16^65535)){e.msg=\"invalid stored block lengths\",a.mode=D;break}if(a.length=65535&B,B=0,N=0,a.mode=S,i===b)break e;case S:a.mode=16195;case 16195:if(L=a.length){if(L>d&&(L=d),L>c&&(L=c),0===L)break e;s.set(o.subarray(l,l+L),f),d-=L,l+=L,c-=L,f+=L,a.length-=L;break}a.mode=A;break;case 16196:for(;N<14;){if(0===d)break e;d--,B+=o[l++]<<N,N+=8}if(a.nlen=257+(31&B),B>>>=5,N-=5,a.ndist=1+(31&B),B>>>=5,N-=5,a.ncode=4+(15&B),B>>>=4,N-=4,a.nlen>286||a.ndist>30){e.msg=\"too many length or distance symbols\",a.mode=D;break}a.have=0,a.mode=16197;case 16197:for(;a.have<a.ncode;){for(;N<3;){if(0===d)break e;d--,B+=o[l++]<<N,N+=8}a.lens[ie[a.have++]]=7&B,B>>>=3,N-=3}for(;a.have<19;)a.lens[ie[a.have++]]=0;if(a.lencode=a.lendyn,a.lenbits=7,V={bits:a.lenbits},Q=h(0,a.lens,0,19,a.lencode,0,a.work,V),a.lenbits=V.bits,Q){e.msg=\"invalid code lengths set\",a.mode=D;break}a.have=0,a.mode=16198;case 16198:for(;a.have<a.nlen+a.ndist;){for(;Y=(ee=a.lencode[B&(1<<a.lenbits)-1])>>>16&255,G=65535&ee,!((j=ee>>>24)<=N);){if(0===d)break e;d--,B+=o[l++]<<N,N+=8}if(G<16)B>>>=j,N-=j,a.lens[a.have++]=G;else{if(16===G){for($=j+2;N<$;){if(0===d)break e;d--,B+=o[l++]<<N,N+=8}if(B>>>=j,N-=j,0===a.have){e.msg=\"invalid bit length repeat\",a.mode=D;break}J=a.lens[a.have-1],L=3+(3&B),B>>>=2,N-=2}else if(17===G){for($=j+3;N<$;){if(0===d)break e;d--,B+=o[l++]<<N,N+=8}N-=j,J=0,L=3+(7&(B>>>=j)),B>>>=3,N-=3}else{for($=j+7;N<$;){if(0===d)break e;d--,B+=o[l++]<<N,N+=8}N-=j,J=0,L=11+(127&(B>>>=j)),B>>>=7,N-=7}if(a.have+L>a.nlen+a.ndist){e.msg=\"invalid bit length repeat\",a.mode=D;break}for(;L--;)a.lens[a.have++]=J}}if(a.mode===D)break;if(0===a.lens[256]){e.msg=\"invalid code -- missing end-of-block\",a.mode=D;break}if(a.lenbits=9,V={bits:a.lenbits},Q=h(1,a.lens,0,a.nlen,a.lencode,0,a.work,V),a.lenbits=V.bits,Q){e.msg=\"invalid literal/lengths set\",a.mode=D;break}if(a.distbits=6,a.distcode=a.distdyn,V={bits:a.distbits},Q=h(2,a.lens,a.nlen,a.ndist,a.distcode,0,a.work,V),a.distbits=V.bits,Q){e.msg=\"invalid distances set\",a.mode=D;break}if(a.mode=T,i===b)break e;case T:a.mode=O;case O:if(d>=6&&c>=258){e.next_out=f,e.avail_out=c,e.next_in=l,e.avail_in=d,a.hold=B,a.bits=N,r(e,F),f=e.next_out,s=e.output,c=e.avail_out,l=e.next_in,o=e.input,d=e.avail_in,B=a.hold,N=a.bits,a.mode===A&&(a.back=-1);break}for(a.back=0;Y=(ee=a.lencode[B&(1<<a.lenbits)-1])>>>16&255,G=65535&ee,!((j=ee>>>24)<=N);){if(0===d)break e;d--,B+=o[l++]<<N,N+=8}if(Y&&0==(240&Y)){for(X=j,W=Y,q=G;Y=(ee=a.lencode[q+((B&(1<<X+W)-1)>>X)])>>>16&255,G=65535&ee,!(X+(j=ee>>>24)<=N);){if(0===d)break e;d--,B+=o[l++]<<N,N+=8}B>>>=X,N-=X,a.back+=X}if(B>>>=j,N-=j,a.back+=j,a.length=G,0===Y){a.mode=16205;break}if(32&Y){a.back=-1,a.mode=A;break}if(64&Y){e.msg=\"invalid literal/length code\",a.mode=D;break}a.extra=15&Y,a.mode=16201;case 16201:if(a.extra){for($=a.extra;N<$;){if(0===d)break e;d--,B+=o[l++]<<N,N+=8}a.length+=B&(1<<a.extra)-1,B>>>=a.extra,N-=a.extra,a.back+=a.extra}a.was=a.length,a.mode=16202;case 16202:for(;Y=(ee=a.distcode[B&(1<<a.distbits)-1])>>>16&255,G=65535&ee,!((j=ee>>>24)<=N);){if(0===d)break e;d--,B+=o[l++]<<N,N+=8}if(0==(240&Y)){for(X=j,W=Y,q=G;Y=(ee=a.distcode[q+((B&(1<<X+W)-1)>>X)])>>>16&255,G=65535&ee,!(X+(j=ee>>>24)<=N);){if(0===d)break e;d--,B+=o[l++]<<N,N+=8}B>>>=X,N-=X,a.back+=X}if(B>>>=j,N-=j,a.back+=j,64&Y){e.msg=\"invalid distance code\",a.mode=D;break}a.offset=G,a.extra=15&Y,a.mode=16203;case 16203:if(a.extra){for($=a.extra;N<$;){if(0===d)break e;d--,B+=o[l++]<<N,N+=8}a.offset+=B&(1<<a.extra)-1,B>>>=a.extra,N-=a.extra,a.back+=a.extra}if(a.offset>a.dmax){e.msg=\"invalid distance too far back\",a.mode=D;break}a.mode=16204;case 16204:if(0===c)break e;if(L=F-c,a.offset>L){if((L=a.offset-L)>a.whave&&a.sane){e.msg=\"invalid distance too far back\",a.mode=D;break}L>a.wnext?(L-=a.wnext,M=a.wsize-L):M=a.wnext-L,L>a.length&&(L=a.length),H=a.window}else H=s,M=f-a.offset,L=a.length;L>c&&(L=c),c-=L,a.length-=L;do{s[f++]=H[M++]}while(--L);0===a.length&&(a.mode=O);break;case 16205:if(0===c)break e;s[f++]=a.length,c--,a.mode=O;break;case U:if(a.wrap){for(;N<32;){if(0===d)break e;d--,B|=o[l++]<<N,N+=8}if(F-=c,e.total_out+=F,a.total+=F,4&a.wrap&&F&&(e.adler=a.check=a.flags?n(a.check,s,F,f-F):t(a.check,s,F,f-F)),F=c,4&a.wrap&&(a.flags?B:I(B))!==a.check){e.msg=\"incorrect data check\",a.mode=D;break}B=0,N=0}a.mode=16207;case 16207:if(a.wrap&&a.flags){for(;N<32;){if(0===d)break e;d--,B+=o[l++]<<N,N+=8}if(4&a.wrap&&B!==(4294967295&a.total)){e.msg=\"incorrect length check\",a.mode=D;break}B=0,N=0}a.mode=16208;case 16208:Q=k;break e;case D:Q=g;break e;case 16210:return p;default:return v}return e.next_out=f,e.avail_out=c,e.next_in=l,e.avail_in=d,a.hold=B,a.bits=N,(a.wsize||F!==e.avail_out&&a.mode<D&&(a.mode<U||i!==u))&&P(e,e.output,e.next_out,F-e.avail_out),C-=e.avail_in,F-=e.avail_out,e.total_in+=C,e.total_out+=F,a.total+=F,4&a.wrap&&F&&(e.adler=a.check=a.flags?n(a.check,s,F,e.next_out-F):t(a.check,s,F,e.next_out-F)),e.data_type=a.bits+(a.last?64:0)+(a.mode===A?128:0)+(a.mode===T||a.mode===S?256:0),(0===C&&0===F||i===u)&&Q===m&&(Q=y),Q},inflateEnd:function(e){if(z(e))return v;var t=e.state;return t.window&&(t.window=null),e.state=null,m},inflateGetHeader:function(e,t){if(z(e))return v;var i=e.state;return 0==(2&i.wrap)?v:(i.head=t,t.done=!1,m)},inflateSetDictionary:function(e,i){var n,a=i.length;return z(e)||0!==(n=e.state).wrap&&n.mode!==R?v:n.mode===R&&t(1,i,a,0)!==n.check?g:P(e,i,a,a)?(n.mode=16210,p):(n.havedict=1,m)},inflateInfo:\"pako inflate (from Nodeca project)\"};function G(e){return G=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e},G(e)}var X=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},W=function(e){for(var t=Array.prototype.slice.call(arguments,1);t.length;){var i=t.shift();if(i){if(\"object\"!==G(i))throw new TypeError(i+\"must be non-object\");for(var n in i)X(i,n)&&(e[n]=i[n])}}return e},q=function(e){for(var t=0,i=0,n=e.length;i<n;i++)t+=e[i].length;for(var a=new Uint8Array(t),r=0,o=0,s=e.length;r<s;r++){var l=e[r];a.set(l,o),o+=l.length}return a},J=!0;try{String.fromCharCode.apply(null,new Uint8Array(1))}catch(e){J=!1}for(var Q=new Uint8Array(256),V=0;V<256;V++)Q[V]=V>=252?6:V>=248?5:V>=240?4:V>=224?3:V>=192?2:1;Q[254]=Q[254]=1;var $=function(e){if(\"function\"==typeof TextEncoder&&TextEncoder.prototype.encode)return(new TextEncoder).encode(e);var t,i,n,a,r,o=e.length,s=0;for(a=0;a<o;a++)55296==(64512&(i=e.charCodeAt(a)))&&a+1<o&&56320==(64512&(n=e.charCodeAt(a+1)))&&(i=65536+(i-55296<<10)+(n-56320),a++),s+=i<128?1:i<2048?2:i<65536?3:4;for(t=new Uint8Array(s),r=0,a=0;r<s;a++)55296==(64512&(i=e.charCodeAt(a)))&&a+1<o&&56320==(64512&(n=e.charCodeAt(a+1)))&&(i=65536+(i-55296<<10)+(n-56320),a++),i<128?t[r++]=i:i<2048?(t[r++]=192|i>>>6,t[r++]=128|63&i):i<65536?(t[r++]=224|i>>>12,t[r++]=128|i>>>6&63,t[r++]=128|63&i):(t[r++]=240|i>>>18,t[r++]=128|i>>>12&63,t[r++]=128|i>>>6&63,t[r++]=128|63&i);return t},ee=function(e,t){var i,n,a=t||e.length;if(\"function\"==typeof TextDecoder&&TextDecoder.prototype.decode)return(new TextDecoder).decode(e.subarray(0,t));var r=new Array(2*a);for(n=0,i=0;i<a;){var o=e[i++];if(o<128)r[n++]=o;else{var s=Q[o];if(s>4)r[n++]=65533,i+=s-1;else{for(o&=2===s?31:3===s?15:7;s>1&&i<a;)o=o<<6|63&e[i++],s--;s>1?r[n++]=65533:o<65536?r[n++]=o:(o-=65536,r[n++]=55296|o>>10&1023,r[n++]=56320|1023&o)}}}return function(e,t){if(t<65534&&e.subarray&&J)return String.fromCharCode.apply(null,e.length===t?e:e.subarray(0,t));for(var i=\"\",n=0;n<t;n++)i+=String.fromCharCode(e[n]);return i}(r,n)},te=function(e,t){(t=t||e.length)>e.length&&(t=e.length);for(var i=t-1;i>=0&&128==(192&e[i]);)i--;return i<0||0===i?t:i+Q[e[i]]>t?i:t},ie={2:\"need dictionary\",1:\"stream end\",0:\"\",\"-1\":\"file error\",\"-2\":\"stream error\",\"-3\":\"data error\",\"-4\":\"insufficient memory\",\"-5\":\"buffer error\",\"-6\":\"incompatible version\"};var ne=function(){this.input=null,this.next_in=0,this.avail_in=0,this.total_in=0,this.output=null,this.next_out=0,this.avail_out=0,this.total_out=0,this.msg=\"\",this.state=null,this.data_type=2,this.adler=0};var ae=function(){this.text=0,this.time=0,this.xflags=0,this.os=0,this.extra=null,this.extra_len=0,this.name=\"\",this.comment=\"\",this.hcrc=0,this.done=!1},re=Object.prototype.toString,oe=c.Z_NO_FLUSH,se=c.Z_FINISH,le=c.Z_OK,fe=c.Z_STREAM_END,de=c.Z_NEED_DICT,he=c.Z_STREAM_ERROR,ce=c.Z_DATA_ERROR,ue=c.Z_MEM_ERROR;function we(e){this.options=W({chunkSize:65536,windowBits:15,to:\"\"},e||{});var t=this.options;t.raw&&t.windowBits>=0&&t.windowBits<16&&(t.windowBits=-t.windowBits,0===t.windowBits&&(t.windowBits=-15)),!(t.windowBits>=0&&t.windowBits<16)||e&&e.windowBits||(t.windowBits+=32),t.windowBits>15&&t.windowBits<48&&0==(15&t.windowBits)&&(t.windowBits|=15),this.err=0,this.msg=\"\",this.ended=!1,this.chunks=[],this.strm=new ne,this.strm.avail_out=0;var i=Y.inflateInit2(this.strm,t.windowBits);if(i!==le)throw new Error(ie[i]);if(this.header=new ae,Y.inflateGetHeader(this.strm,this.header),t.dictionary&&(\"string\"==typeof t.dictionary?t.dictionary=$(t.dictionary):\"[object ArrayBuffer]\"===re.call(t.dictionary)&&(t.dictionary=new Uint8Array(t.dictionary)),t.raw&&(i=Y.inflateSetDictionary(this.strm,t.dictionary))!==le))throw new Error(ie[i])}function be(e,t){var i=new we(t);if(i.push(e),i.err)throw i.msg||ie[i.err];return i.result}we.prototype.push=function(e,t){var i,n,a,r=this.strm,o=this.options.chunkSize,s=this.options.dictionary;if(this.ended)return!1;for(n=t===~~t?t:!0===t?se:oe,\"[object ArrayBuffer]\"===re.call(e)?r.input=new Uint8Array(e):r.input=e,r.next_in=0,r.avail_in=r.input.length;;){for(0===r.avail_out&&(r.output=new Uint8Array(o),r.next_out=0,r.avail_out=o),(i=Y.inflate(r,n))===de&&s&&((i=Y.inflateSetDictionary(r,s))===le?i=Y.inflate(r,n):i===ce&&(i=de));r.avail_in>0&&i===fe&&r.state.wrap>0&&0!==e[r.next_in];)Y.inflateReset(r),i=Y.inflate(r,n);switch(i){case he:case ce:case de:case ue:return this.onEnd(i),this.ended=!0,!1}if(a=r.avail_out,r.next_out&&(0===r.avail_out||i===fe))if(\"string\"===this.options.to){var l=te(r.output,r.next_out),f=r.next_out-l,d=ee(r.output,l);r.next_out=f,r.avail_out=o-f,f&&r.output.set(r.output.subarray(l,l+f),0),this.onData(d)}else this.onData(r.output.length===r.next_out?r.output:r.output.subarray(0,r.next_out));if(i!==le||0!==a){if(i===fe)return i=Y.inflateEnd(this.strm),this.onEnd(i),this.ended=!0,!0;if(0===r.avail_in)break}}return!0},we.prototype.onData=function(e){this.chunks.push(e)},we.prototype.onEnd=function(e){e===le&&(\"string\"===this.options.to?this.result=this.chunks.join(\"\"):this.result=q(this.chunks)),this.chunks=[],this.err=e,this.msg=this.strm.msg};var me=we,ke=be,_e=function(e,t){return(t=t||{}).raw=!0,be(e,t)},ve=be,ge=c,pe={Inflate:me,inflate:ke,inflateRaw:_e,ungzip:ve,constants:ge};e.Inflate=me,e.constants=ge,e.default=pe,e.inflate=ke,e.inflateRaw=_e,e.ungzip=ve,Object.defineProperty(e,\"__esModule\",{value:!0})}));\n ";
9
+ var StringCompressionTemplate = exports.StringCompressionTemplate = new _template["default"]("\nvar {stringFn};\n\n(function (){\n var compressedString = {stringValue};\n var utf8String = {StringCompressionLibrary}[\"decompressFromUTF16\"](compressedString);\n var stringArray = utf8String[\"split\"]({stringDelimiter});\n\n {stringFn} = function(index){\n return stringArray[index];\n }\n})();\n");
10
+ var StringCompressionLibraryMinified = exports.StringCompressionLibraryMinified = " \nvar {StringCompressionLibrary}=function(){var r=String.fromCharCode,o=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\",n=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+-$\",e={};function t(r,o){if(!e[r]){e[r]={};for(var n=0;n<r.length;n++)e[r][r.charAt(n)]=n}return e[r][o]}var i={compressToBase64:function(r){if(null==r)return\"\";var n=i._compress(r,6,function(r){return o.charAt(r)});switch(n.length%4){default:case 0:return n;case 1:return n+\"===\";case 2:return n+\"==\";case 3:return n+\"=\"}},decompressFromBase64:function(r){return null==r?\"\":\"\"==r?null:i._decompress(r.length,32,function(n){return t(o,r.charAt(n))})},compressToUTF16:function(o){return null==o?\"\":i._compress(o,15,function(o){return r(o+32)})+\" \"},decompressFromUTF16:function(r){return null==r?\"\":\"\"==r?null:i._decompress(r.length,16384,function(o){return r.charCodeAt(o)-32})},compressToUint8Array:function(r){for(var o=i.compress(r),n=new Uint8Array(2*o.length),e=0,t=o.length;e<t;e++){var s=o.charCodeAt(e);n[2*e]=s>>>8,n[2*e+1]=s%256}return n},decompressFromUint8Array:function(o){if(null==o)return i.decompress(o);for(var n=new Array(o.length/2),e=0,t=n.length;e<t;e++)n[e]=256*o[2*e]+o[2*e+1];var s=[];return n.forEach(function(o){s.push(r(o))}),i.decompress(s.join(\"\"))},compressToEncodedURIComponent:function(r){return null==r?\"\":i._compress(r,6,function(r){return n.charAt(r)})},decompressFromEncodedURIComponent:function(r){return null==r?\"\":\"\"==r?null:(r=r.replace(/ /g,\"+\"),i._decompress(r.length,32,function(o){return t(n,r.charAt(o))}))},compress:function(o){return i._compress(o,16,function(o){return r(o)})},_compress:function(r,o,n){if(null==r)return\"\";var e,t,i,s={},u={},a=\"\",p=\"\",c=\"\",l=2,f=3,h=2,d=[],m=0,v=0;for(i=0;i<r.length;i+=1)if(a=r.charAt(i),Object.prototype.hasOwnProperty.call(s,a)||(s[a]=f++,u[a]=!0),p=c+a,Object.prototype.hasOwnProperty.call(s,p))c=p;else{if(Object.prototype.hasOwnProperty.call(u,c)){if(c.charCodeAt(0)<256){for(e=0;e<h;e++)m<<=1,v==o-1?(v=0,d.push(n(m)),m=0):v++;for(t=c.charCodeAt(0),e=0;e<8;e++)m=m<<1|1&t,v==o-1?(v=0,d.push(n(m)),m=0):v++,t>>=1}else{for(t=1,e=0;e<h;e++)m=m<<1|t,v==o-1?(v=0,d.push(n(m)),m=0):v++,t=0;for(t=c.charCodeAt(0),e=0;e<16;e++)m=m<<1|1&t,v==o-1?(v=0,d.push(n(m)),m=0):v++,t>>=1}0==--l&&(l=Math.pow(2,h),h++),delete u[c]}else for(t=s[c],e=0;e<h;e++)m=m<<1|1&t,v==o-1?(v=0,d.push(n(m)),m=0):v++,t>>=1;0==--l&&(l=Math.pow(2,h),h++),s[p]=f++,c=String(a)}if(\"\"!==c){if(Object.prototype.hasOwnProperty.call(u,c)){if(c.charCodeAt(0)<256){for(e=0;e<h;e++)m<<=1,v==o-1?(v=0,d.push(n(m)),m=0):v++;for(t=c.charCodeAt(0),e=0;e<8;e++)m=m<<1|1&t,v==o-1?(v=0,d.push(n(m)),m=0):v++,t>>=1}else{for(t=1,e=0;e<h;e++)m=m<<1|t,v==o-1?(v=0,d.push(n(m)),m=0):v++,t=0;for(t=c.charCodeAt(0),e=0;e<16;e++)m=m<<1|1&t,v==o-1?(v=0,d.push(n(m)),m=0):v++,t>>=1}0==--l&&(l=Math.pow(2,h),h++),delete u[c]}else for(t=s[c],e=0;e<h;e++)m=m<<1|1&t,v==o-1?(v=0,d.push(n(m)),m=0):v++,t>>=1;0==--l&&(l=Math.pow(2,h),h++)}for(t=2,e=0;e<h;e++)m=m<<1|1&t,v==o-1?(v=0,d.push(n(m)),m=0):v++,t>>=1;for(;;){if(m<<=1,v==o-1){d.push(n(m));break}v++}return d.join(\"\")},decompress:function(r){return null==r?\"\":\"\"==r?null:i._decompress(r.length,32768,function(o){return r.charCodeAt(o)})},_decompress:function(o,n,e){var t,i,s,u,a,p,c,l=[],f=4,h=4,d=3,m=\"\",v=[],g={val:e(0),position:n,index:1};for(t=0;t<3;t+=1)l[t]=t;for(s=0,a=Math.pow(2,2),p=1;p!=a;)u=g.val&g.position,g.position>>=1,0==g.position&&(g.position=n,g.val=e(g.index++)),s|=(u>0?1:0)*p,p<<=1;switch(s){case 0:for(s=0,a=Math.pow(2,8),p=1;p!=a;)u=g.val&g.position,g.position>>=1,0==g.position&&(g.position=n,g.val=e(g.index++)),s|=(u>0?1:0)*p,p<<=1;c=r(s);break;case 1:for(s=0,a=Math.pow(2,16),p=1;p!=a;)u=g.val&g.position,g.position>>=1,0==g.position&&(g.position=n,g.val=e(g.index++)),s|=(u>0?1:0)*p,p<<=1;c=r(s);break;case 2:return\"\"}for(l[3]=c,i=c,v.push(c);;){if(g.index>o)return\"\";for(s=0,a=Math.pow(2,d),p=1;p!=a;)u=g.val&g.position,g.position>>=1,0==g.position&&(g.position=n,g.val=e(g.index++)),s|=(u>0?1:0)*p,p<<=1;switch(c=s){case 0:for(s=0,a=Math.pow(2,8),p=1;p!=a;)u=g.val&g.position,g.position>>=1,0==g.position&&(g.position=n,g.val=e(g.index++)),s|=(u>0?1:0)*p,p<<=1;l[h++]=r(s),c=h-1,f--;break;case 1:for(s=0,a=Math.pow(2,16),p=1;p!=a;)u=g.val&g.position,g.position>>=1,0==g.position&&(g.position=n,g.val=e(g.index++)),s|=(u>0?1:0)*p,p<<=1;l[h++]=r(s),c=h-1,f--;break;case 2:return v.join(\"\")}if(0==f&&(f=Math.pow(2,d),d++),l[c])m=l[c];else{if(c!==h)return null;m=i+i.charAt(0)}v.push(m),l[h++]=i+m.charAt(0),i=m,0==--f&&(f=Math.pow(2,d),d++)}}};return i}();\"function\"==typeof define&&define.amd?define(function(){return {StringCompressionLibrary}}):\"undefined\"!=typeof module&&null!=module?module.exports={StringCompressionLibrary}:\"undefined\"!=typeof angular&&null!=angular&&angular.module(\"LZString\",[]).factory(\"LZString\",function(){return {StringCompressionLibrary}});";
@@ -17,5 +17,5 @@ var createEvalIntegrityTemplate = exports.createEvalIntegrityTemplate = function
17
17
  countermeasures: pluginInstance.globalState.lock.createCountermeasuresCode()
18
18
  });
19
19
  }
20
- return new _template["default"]("\n function {EvalIntegrityName}(a = true){\n return a;\n }\n ");
20
+ return new _template["default"]("\n function {EvalIntegrityName}(".concat(_constants.placeholderVariablePrefix, "_flag = true){\n return ").concat(_constants.placeholderVariablePrefix, "_flag;\n }\n "));
21
21
  };
@@ -29,7 +29,7 @@ var Template = exports["default"] = /*#__PURE__*/function () {
29
29
  function Template() {
30
30
  _classCallCheck(this, Template);
31
31
  _defineProperty(this, "astIdentifierPrefix", "__t_" + (0, _randomUtils.getRandomString)(6));
32
- _defineProperty(this, "symbols", []);
32
+ _defineProperty(this, "symbols", new Set());
33
33
  for (var _len = arguments.length, templates = new Array(_len), _key = 0; _key < _len; _key++) {
34
34
  templates[_key] = arguments[_key];
35
35
  }
@@ -41,8 +41,13 @@ var Template = exports["default"] = /*#__PURE__*/function () {
41
41
  return _createClass(Template, [{
42
42
  key: "addSymbols",
43
43
  value: function addSymbols() {
44
- var _this$symbols;
45
- (_this$symbols = this.symbols).push.apply(_this$symbols, arguments);
44
+ var _this = this;
45
+ for (var _len2 = arguments.length, symbols = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
46
+ symbols[_key2] = arguments[_key2];
47
+ }
48
+ symbols.forEach(function (symbol) {
49
+ _this.symbols.add(symbol);
50
+ });
46
51
  return this;
47
52
  }
48
53
  }, {
@@ -54,19 +59,19 @@ var Template = exports["default"] = /*#__PURE__*/function () {
54
59
  }, {
55
60
  key: "findRequiredVariables",
56
61
  value: function findRequiredVariables() {
57
- var _this = this;
62
+ var _this2 = this;
58
63
  var matches = this.templates[0].match(/{[$A-Za-z0-9_]+}/g);
59
64
  if (matches !== null) {
60
65
  matches.forEach(function (variable) {
61
66
  var name = variable.slice(1, -1);
62
- _this.requiredVariables.add(name);
67
+ _this2.requiredVariables.add(name);
63
68
  });
64
69
  }
65
70
  }
66
71
  }, {
67
72
  key: "interpolateTemplate",
68
73
  value: function interpolateTemplate(variables) {
69
- var _this2 = this;
74
+ var _this3 = this;
70
75
  var allVariables = _objectSpread(_objectSpread({}, this.defaultVariables), variables);
71
76
  var _iterator = _createForOfIteratorHelper(this.requiredVariables),
72
77
  _step;
@@ -88,9 +93,9 @@ var Template = exports["default"] = /*#__PURE__*/function () {
88
93
  Object.keys(allVariables).forEach(function (name) {
89
94
  var bracketName = "{".concat(name.replace("$", "\\$"), "}");
90
95
  var value = allVariables[name];
91
- if (_this2.isASTVariable(value)) {
92
- var astIdentifierName = _this2.astIdentifierPrefix + name;
93
- _this2.astVariableMappings.set(name, astIdentifierName);
96
+ if (_this3.isASTVariable(value)) {
97
+ var astIdentifierName = _this3.astIdentifierPrefix + name;
98
+ _this3.astVariableMappings.set(name, astIdentifierName);
94
99
  value = astIdentifierName;
95
100
  }
96
101
  var reg = new RegExp(bracketName, "g");
@@ -159,7 +164,7 @@ var Template = exports["default"] = /*#__PURE__*/function () {
159
164
  }, {
160
165
  key: "file",
161
166
  value: function file() {
162
- var _this3 = this;
167
+ var _this4 = this;
163
168
  var variables = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
164
169
  var _this$interpolateTemp = this.interpolateTemplate(variables),
165
170
  output = _this$interpolateTemp.output;
@@ -173,9 +178,9 @@ var Template = exports["default"] = /*#__PURE__*/function () {
173
178
  throw new Error(output + "\n" + "Template failed to parse: " + e.message);
174
179
  }
175
180
  this.interpolateAST(file, variables);
176
- if (this.symbols.length > 0) {
181
+ if (this.symbols.size > 0) {
177
182
  file.program.body.forEach(function (node) {
178
- var _iterator2 = _createForOfIteratorHelper(_this3.symbols),
183
+ var _iterator2 = _createForOfIteratorHelper(_this4.symbols),
179
184
  _step2;
180
185
  try {
181
186
  for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
@@ -6,7 +6,6 @@ Object.defineProperty(exports, "__esModule", {
6
6
  exports["default"] = void 0;
7
7
  var _traverse = _interopRequireWildcard(require("@babel/traverse"));
8
8
  var _order = require("../order");
9
- var _probability = require("../probability");
10
9
  var _astUtils = require("../utils/ast-utils");
11
10
  var t = _interopRequireWildcard(require("@babel/types"));
12
11
  var _node = require("../utils/node");
@@ -37,6 +36,9 @@ function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r),
37
36
  function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
38
37
  function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }
39
38
  function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
39
+ // Function deemed unsafe for CFF
40
+ var CFF_UNSAFE = Symbol("CFF_UNSAFE");
41
+
40
42
  /**
41
43
  * Breaks functions into DAGs (Directed Acyclic Graphs)
42
44
  *
@@ -80,6 +82,10 @@ var _default = exports["default"] = function _default(_ref) {
80
82
  // Amount of blocks changed by Control Flow Flattening
81
83
  var cffCounter = 0;
82
84
  var functionsModified = new Set();
85
+ function flagFunctionToAvoid(path, reason) {
86
+ var fnOrProgram = (0, _astUtils.getParentFunctionOrProgram)(path);
87
+ fnOrProgram.node[CFF_UNSAFE] = reason;
88
+ }
83
89
  return {
84
90
  post: function post() {
85
91
  functionsModified.forEach(function (node) {
@@ -87,6 +93,26 @@ var _default = exports["default"] = function _default(_ref) {
87
93
  });
88
94
  },
89
95
  visitor: {
96
+ // Unsafe detection
97
+ ThisExpression: function ThisExpression(path) {
98
+ flagFunctionToAvoid(path, "this");
99
+ },
100
+ VariableDeclaration: function VariableDeclaration(path) {
101
+ if (path.node.declarations.length !== 1) {
102
+ path.getAncestry().forEach(function (p) {
103
+ p.node[CFF_UNSAFE] = "multipleDeclarations";
104
+ });
105
+ }
106
+ },
107
+ Identifier: function Identifier(path) {
108
+ if (path.node.name === _constants.variableFunctionName || path.node.name === "arguments") {
109
+ flagFunctionToAvoid(path, "arguments");
110
+ }
111
+ },
112
+ "Super|MetaProperty|AwaitExpression|YieldExpression": function SuperMetaPropertyAwaitExpressionYieldExpression(path) {
113
+ flagFunctionToAvoid(path, "functionSpecific");
114
+ },
115
+ // Main CFF transformation
90
116
  "Program|Function": {
91
117
  exit: function exit(_path) {
92
118
  var programOrFunctionPath = _path;
@@ -95,6 +121,9 @@ var _default = exports["default"] = function _default(_ref) {
95
121
  if (programOrFunctionPath.find(function (p) {
96
122
  return p.isForStatement() || p.isWhile();
97
123
  })) return;
124
+
125
+ // Exclude 'CFF_UNSAFE' functions
126
+ if (programOrFunctionPath.node[CFF_UNSAFE]) return;
98
127
  var programPath = _path.isProgram() ? _path : null;
99
128
  var functionPath = _path.isFunction() ? _path : null;
100
129
  var blockPath;
@@ -116,35 +145,20 @@ var _default = exports["default"] = function _default(_ref) {
116
145
  if (blockPath.node.body.length < 3) return;
117
146
 
118
147
  // Check user's threshold setting
119
- if (!(0, _probability.computeProbabilityMap)(me.options.controlFlowFlattening)) {
148
+ if (!me.computeProbabilityMap(me.options.controlFlowFlattening)) {
120
149
  return;
121
150
  }
122
-
123
- // Avoid unsafe functions
124
- if (functionPath && functionPath.node[_constants.UNSAFE]) return;
151
+ if (functionPath) {
152
+ // Avoid unsafe functions
153
+ if (functionPath.node[_constants.UNSAFE]) return;
154
+ if (functionPath.node.async || functionPath.node.generator) return;
155
+ }
125
156
  programOrFunctionPath.scope.crawl();
126
157
  var blockFnParent = (0, _astUtils.getParentFunctionOrProgram)(blockPath);
127
158
  var hasIllegalNode = false;
128
159
  var bindingNames = new Set();
129
160
  blockPath.traverse({
130
- "Super|MetaProperty|AwaitExpression|YieldExpression": function SuperMetaPropertyAwaitExpressionYieldExpression(path) {
131
- if ((0, _astUtils.getParentFunctionOrProgram)(path).node === blockFnParent.node) {
132
- hasIllegalNode = true;
133
- path.stop();
134
- }
135
- },
136
- VariableDeclaration: function VariableDeclaration(path) {
137
- if (path.node.declarations.length !== 1) {
138
- hasIllegalNode = true;
139
- path.stop();
140
- }
141
- },
142
161
  Identifier: function Identifier(path) {
143
- if (path.node.name === _constants.variableFunctionName || path.node.name === "arguments") {
144
- hasIllegalNode = true;
145
- path.stop();
146
- return;
147
- }
148
162
  if (!path.isBindingIdentifier()) return;
149
163
  var binding = path.scope.getBinding(path.node.name);
150
164
  if (!binding) return;
@@ -271,7 +285,7 @@ var _default = exports["default"] = function _default(_ref) {
271
285
  }, {
272
286
  key: "getInitializingObjectExpression",
273
287
  value: function getInitializingObjectExpression() {
274
- return isDebug ? new _template["default"]("\n ({\n identity: \"".concat(this.propertyName, "\"\n })\n ")).expression() : new _template["default"]("Object[\"create\"](null)").expression();
288
+ return isDebug ? new _template["default"]("\n ({\n identity: \"".concat(this.propertyName, "\"\n })\n ")).expression() : new _template["default"]("({})").expression();
275
289
  }
276
290
  }, {
277
291
  key: "getMemberExpression",
@@ -302,6 +316,13 @@ var _default = exports["default"] = function _default(_ref) {
302
316
  for (var key in propertyMap) {
303
317
  properties.push(t.objectProperty(t.stringLiteral(key), propertyMap[key], true));
304
318
  }
319
+ if (this === mainScope) {
320
+ // Reset With logic
321
+ properties.push(t.objectProperty(t.stringLiteral(resetWithProperty), new _template["default"]("\n (function(newStateValues, alwaysUndefined){\n {withMemberExpression} = alwaysUndefined;\n {arrayPattern} = newStateValues\n })\n ").expression({
322
+ withMemberExpression: (0, _node.deepClone)(withMemberExpression),
323
+ arrayPattern: t.arrayPattern((0, _node.deepClone)(stateVars))
324
+ }), true));
325
+ }
305
326
  return t.objectExpression(properties);
306
327
  }
307
328
  }, {
@@ -538,7 +559,7 @@ var _default = exports["default"] = function _default(_ref) {
538
559
  if (statement.isFunctionDeclaration()) {
539
560
  var fnName = statement.node.id.name;
540
561
  var isIllegal = false;
541
- if (!flattenFunctionDeclarations || statement.node.async || statement.node.generator || statement.node[_constants.UNSAFE]) {
562
+ if (!flattenFunctionDeclarations || statement.node.async || statement.node.generator || statement.node[_constants.UNSAFE] || statement.node[CFF_UNSAFE] || (0, _astUtils.isStrictMode)(statement)) {
542
563
  isIllegal = true;
543
564
  }
544
565
  var oldBasicBlock = currentBasicBlock;
@@ -674,13 +695,6 @@ var _default = exports["default"] = function _default(_ref) {
674
695
  nextBlockPath: defaultBlockPath
675
696
  });
676
697
  basicBlocks.get(endLabel).allowWithDiscriminant = false;
677
-
678
- // Add with / reset with logic
679
- basicBlocks.get(startLabel).body.unshift(new _template["default"]("\n {resetWithMemberExpression} = function(newStateValues){\n {withMemberExpression} = undefined;\n {arrayPattern} = newStateValues\n }\n ").single({
680
- arrayPattern: t.arrayPattern((0, _node.deepClone)(stateVars)),
681
- resetWithMemberExpression: (0, _node.deepClone)(resetWithMemberExpression),
682
- withMemberExpression: (0, _node.deepClone)(withMemberExpression)
683
- }));
684
698
  if (!isDebug && addDeadCode) {
685
699
  // DEAD CODE 1/3: Add fake chunks that are never reached
686
700
  var fakeChunkCount = (0, _randomUtils.getRandomInteger)(1, 5);
@@ -768,7 +782,7 @@ var _default = exports["default"] = function _default(_ref) {
768
782
  var _iterator2 = _createForOfIteratorHelper(basicBlocks.values()),
769
783
  _step2;
770
784
  try {
771
- var _loop5 = function _loop5() {
785
+ var _loop4 = function _loop4() {
772
786
  var basicBlock = _step2.value;
773
787
  var currentStateValues = basicBlock.stateValues;
774
788
  // Wrap the statement in a Babel path to allow traversal
@@ -826,7 +840,7 @@ var _default = exports["default"] = function _default(_ref) {
826
840
  if (path.node[_constants.NO_RENAME] === cffIndex) return;
827
841
  var identifierName = path.node.name;
828
842
  if (identifierName === gotoFunctionName) return;
829
- var binding = basicBlock.scope.getBinding(identifierName);
843
+ var binding = path.scope.getBinding(identifierName);
830
844
  if (!binding) {
831
845
  return;
832
846
  }
@@ -855,6 +869,12 @@ var _default = exports["default"] = function _default(_ref) {
855
869
  me.skip(memberExpression);
856
870
  path.replaceWith(memberExpression);
857
871
  path.skip();
872
+
873
+ // Preserve proper 'this' context when directly calling functions
874
+ // X.Y.Z() -> (1, X.Y.Z)()
875
+ if (path.parentPath.isCallExpression() && path.key === "callee") {
876
+ path.replaceWith(t.sequenceExpression([t.numericLiteral(1), path.node]));
877
+ }
858
878
  }
859
879
  },
860
880
  // Top-level returns set additional flag to indicate that the function has returned
@@ -890,18 +910,17 @@ var _default = exports["default"] = function _default(_ref) {
890
910
  needsIndividualAssignments = false;
891
911
  }
892
912
  if (needsIndividualAssignments) {
893
- for (var _i7 = 0; _i7 < stateVars.length; _i7++) {
894
- var oldValue = currentStateValues[_i7];
895
- var newValue = newStateValues[_i7];
913
+ for (var _i8 = 0; _i8 < stateVars.length; _i8++) {
914
+ var oldValue = currentStateValues[_i8];
915
+ var newValue = newStateValues[_i8];
896
916
 
897
917
  // console.log(oldValue, newValue);
898
918
  if (oldValue === newValue) continue; // No diff needed if the value doesn't change
899
919
 
900
- var leftValue = jumpBlock.withDiscriminant ? jumpBlock.withDiscriminant.getMemberExpression(stateVars[_i7].name) : (0, _node.deepClone)(stateVars[_i7]);
901
- var assignment = t.assignmentExpression("=", leftValue, (0, _node.numericLiteral)(newValue));
920
+ var assignment = t.assignmentExpression("=", (0, _node.deepClone)(stateVars[_i8]), (0, _node.numericLiteral)(newValue));
902
921
  if (!isDebug && addRelativeAssignments) {
903
922
  // Use diffs to create confusing code
904
- assignment = t.assignmentExpression("+=", (0, _node.deepClone)(stateVars[_i7]), (0, _node.numericLiteral)(newValue - oldValue));
923
+ assignment = t.assignmentExpression("+=", (0, _node.deepClone)(stateVars[_i8]), (0, _node.numericLiteral)(newValue - oldValue));
905
924
  }
906
925
  assignments.push(assignment);
907
926
  }
@@ -922,7 +941,7 @@ var _default = exports["default"] = function _default(_ref) {
922
941
  basicBlock.thisPath.traverse(visitor);
923
942
  };
924
943
  for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
925
- _loop5();
944
+ _loop4();
926
945
  }
927
946
 
928
947
  /**
@@ -940,32 +959,39 @@ var _default = exports["default"] = function _default(_ref) {
940
959
  }
941
960
  var mainScope = basicBlocks.get(startLabel).scopeManager;
942
961
  var predicateNumbers = new Map();
943
- var predicateNumberCount = isDebug || !addPredicateTests ? 0 : (0, _randomUtils.getRandomInteger)(2, 5);
944
- var _loop3 = function _loop3() {
945
- var name = mainScope.getNewName(me.getPlaceholder("predicate_" + _i2));
946
- var number = (0, _randomUtils.getRandomInteger)(-250, 250);
947
- predicateNumbers.set(name, number);
948
- var createAssignment = function createAssignment(value) {
949
- return new _template["default"]("\n {memberExpression} = {number}\n ").single({
950
- memberExpression: mainScope.getMemberExpression(name),
951
- number: (0, _node.numericLiteral)(number)
952
- });
953
- };
954
- basicBlocks.get(startLabel).body.unshift(createAssignment(number));
955
-
956
- // Add random assignments to impossible blocks
957
- fakeAssignmentCount = (0, _randomUtils.getRandomInteger)(0, 3);
958
- for (var _i8 = 0; _i8 < fakeAssignmentCount; _i8++) {
959
- impossibleBlock = (0, _randomUtils.choice)(getImpossibleBasicBlocks());
960
- if (impossibleBlock) {
961
- impossibleBlock.body.unshift(createAssignment((0, _randomUtils.getRandomInteger)(-250, 250)));
962
- }
963
- }
964
- },
965
- fakeAssignmentCount,
966
- impossibleBlock;
962
+ var predicateNumberCount = isDebug || !addPredicateTests ? 0 : (0, _randomUtils.getRandomInteger)(1, 4);
967
963
  for (var _i2 = 0; _i2 < predicateNumberCount; _i2++) {
968
- _loop3();
964
+ var name = mainScope.getNewName(me.getPlaceholder("predicate_" + _i2));
965
+ var number = (0, _randomUtils.getRandomInteger)(-250, 250);
966
+ predicateNumbers.set(name, number);
967
+ }
968
+ var predicateSymbol = Symbol("predicate");
969
+ var createAssignment = function createAssignment(values) {
970
+ var exprStmt = new _template["default"]("\n ({predicateVariables} = {values})\n ").single({
971
+ predicateVariables: t.arrayPattern(Array.from(predicateNumbers.keys()).map(function (name) {
972
+ return mainScope.getMemberExpression(name);
973
+ })),
974
+ values: t.arrayExpression(values.map(function (value) {
975
+ return (0, _node.numericLiteral)(value);
976
+ }))
977
+ });
978
+ exprStmt[predicateSymbol] = true;
979
+ return exprStmt;
980
+ };
981
+ basicBlocks.get(startLabel).body.unshift(createAssignment(Array.from(predicateNumbers.values())));
982
+
983
+ // Add random assignments to impossible blocks
984
+ var fakeAssignmentCount = (0, _randomUtils.getRandomInteger)(1, 3);
985
+ for (var _i3 = 0; _i3 < fakeAssignmentCount; _i3++) {
986
+ var impossibleBlock = (0, _randomUtils.choice)(getImpossibleBasicBlocks());
987
+ if (impossibleBlock) {
988
+ var _impossibleBlock$body;
989
+ if ((_impossibleBlock$body = impossibleBlock.body[0]) !== null && _impossibleBlock$body !== void 0 && _impossibleBlock$body[predicateSymbol]) continue;
990
+ var fakeValues = new Array(predicateNumberCount).fill(0).map(function () {
991
+ return (0, _randomUtils.getRandomInteger)(-250, 250);
992
+ });
993
+ impossibleBlock.body.unshift(createAssignment(fakeValues));
994
+ }
969
995
  }
970
996
 
971
997
  // Add scope initializations: scope["_0"] = {identity: "_0"}
@@ -989,8 +1015,8 @@ var _default = exports["default"] = function _default(_ref) {
989
1015
  if (!isDebug && addFakeTests) {
990
1016
  (0, _randomUtils.shuffle)(blocks);
991
1017
  }
992
- var _loop4 = function _loop4() {
993
- var block = _blocks[_i3];
1018
+ var _loop3 = function _loop3() {
1019
+ var block = _blocks[_i4];
994
1020
  if (block.label === endLabel) {
995
1021
  // ok(block.body.length === 0);
996
1022
  return 1; // continue
@@ -1002,8 +1028,8 @@ var _default = exports["default"] = function _default(_ref) {
1002
1028
  if (!isDebug && addPredicateTests && block.label !== startLabel && (0, _randomUtils.chance)(50)) {
1003
1029
  var predicateName = (0, _randomUtils.choice)(Array.from(predicateNumbers.keys()));
1004
1030
  if (predicateName) {
1005
- var number = predicateNumbers.get(predicateName);
1006
- var diff = block.totalState - number;
1031
+ var _number = predicateNumbers.get(predicateName);
1032
+ var diff = block.totalState - _number;
1007
1033
  test = t.binaryExpression("+", mainScope.getMemberExpression(predicateName), (0, _node.numericLiteral)(diff));
1008
1034
  }
1009
1035
  }
@@ -1055,20 +1081,20 @@ var _default = exports["default"] = function _default(_ref) {
1055
1081
  if (!isDebug && addFakeTests && (0, _randomUtils.chance)(50)) {
1056
1082
  // Add fake tests
1057
1083
  var fakeTestCount = (0, _randomUtils.getRandomInteger)(1, 3);
1058
- for (var _i4 = 0; _i4 < fakeTestCount; _i4++) {
1084
+ for (var _i5 = 0; _i5 < fakeTestCount; _i5++) {
1059
1085
  tests.push((0, _node.numericLiteral)(stateIntGen.generate()));
1060
1086
  }
1061
1087
  (0, _randomUtils.shuffle)(tests);
1062
1088
  }
1063
1089
  var lastTest = tests.pop();
1064
- for (var _i5 = 0, _tests = tests; _i5 < _tests.length; _i5++) {
1065
- var _test = _tests[_i5];
1090
+ for (var _i6 = 0, _tests = tests; _i6 < _tests.length; _i6++) {
1091
+ var _test = _tests[_i6];
1066
1092
  switchCases.push(t.switchCase(_test, []));
1067
1093
  }
1068
1094
  switchCases.push(t.switchCase(lastTest, block.thisPath.node.body));
1069
1095
  };
1070
- for (var _i3 = 0, _blocks = blocks; _i3 < _blocks.length; _i3++) {
1071
- if (_loop4()) continue;
1096
+ for (var _i4 = 0, _blocks = blocks; _i4 < _blocks.length; _i4++) {
1097
+ if (_loop3()) continue;
1072
1098
  }
1073
1099
  if (!isDebug && addFakeTests) {
1074
1100
  // A random test can be 'default'
@@ -1087,7 +1113,7 @@ var _default = exports["default"] = function _default(_ref) {
1087
1113
  var switchStatement = t.labeledStatement(t.identifier(switchLabel), t.switchStatement(discriminant, switchCases));
1088
1114
  var startStateValues = basicBlocks.get(startLabel).stateValues;
1089
1115
  var endTotalState = basicBlocks.get(endLabel).totalState;
1090
- var whileStatement = t.whileStatement(t.binaryExpression("!==", (0, _node.deepClone)(discriminant), (0, _node.numericLiteral)(endTotalState)), t.blockStatement([t.withStatement(new _template["default"]("{withDiscriminant} || Object[\"create\"](null)").expression({
1116
+ var whileStatement = t.whileStatement(t.binaryExpression("!==", (0, _node.deepClone)(discriminant), (0, _node.numericLiteral)(endTotalState)), t.blockStatement([t.withStatement(new _template["default"]("{withDiscriminant} || {}").expression({
1091
1117
  withDiscriminant: (0, _node.deepClone)(withMemberExpression)
1092
1118
  }), t.blockStatement([switchStatement]))]));
1093
1119
  var parameters = [].concat(_toConsumableArray(stateVars), [argVar, scopeVar]).map(function (id) {
@@ -1096,8 +1122,8 @@ var _default = exports["default"] = function _default(_ref) {
1096
1122
  var parametersNames = parameters.map(function (id) {
1097
1123
  return id.name;
1098
1124
  });
1099
- for (var _i6 = 0, _functionExpressions = functionExpressions; _i6 < _functionExpressions.length; _i6++) {
1100
- var _functionExpressions$ = _slicedToArray(_functionExpressions[_i6], 4),
1125
+ for (var _i7 = 0, _functionExpressions = functionExpressions; _i7 < _functionExpressions.length; _i7++) {
1126
+ var _functionExpressions$ = _slicedToArray(_functionExpressions[_i7], 4),
1101
1127
  originalFnName = _functionExpressions$[0],
1102
1128
  fnLabel = _functionExpressions$[1],
1103
1129
  basicBlock = _functionExpressions$[2],
@@ -1135,16 +1161,22 @@ var _default = exports["default"] = function _default(_ref) {
1135
1161
  callExpression: t.callExpression((0, _node.deepClone)(mainFnName), argumentsNodes)
1136
1162
  }));
1137
1163
  }
1164
+ var startProgramObjectExpression = basicBlocks.get(startLabel).scopeManager.getObjectExpression(startLabel);
1165
+ var mainParameters = parameters;
1166
+ var scopeParameter = mainParameters.pop();
1167
+ mainParameters.push(t.assignmentPattern(scopeParameter, startProgramObjectExpression));
1138
1168
  var mainFnDeclaration = t.functionDeclaration((0, _node.deepClone)(mainFnName), parameters, t.blockStatement([whileStatement]));
1139
1169
  mainFnDeclaration[_constants.PREDICTABLE] = true;
1140
1170
  var startProgramExpression = t.callExpression((0, _node.deepClone)(mainFnName), [].concat(_toConsumableArray(startStateValues.map(function (stateValue) {
1141
1171
  return (0, _node.numericLiteral)(stateValue);
1142
- })), [t.identifier("undefined"), basicBlocks.get(startLabel).scopeManager.getObjectExpression(startLabel)]));
1172
+ })), [t.identifier("undefined")]));
1143
1173
  var _resultVar = withIdentifier("result");
1144
- var allowReturns = blockPath.find(function (p) {
1174
+ var isTopLevel = blockPath.isProgram();
1175
+ var allowReturns = !isTopLevel && blockPath.find(function (p) {
1145
1176
  return p.isFunction();
1146
1177
  });
1147
- var startProgramStatements = new _template["default"]("\n ".concat(allowReturns ? "var {didReturnVar};" : "", "\n var {resultVar} = {startProgramExpression};\n ").concat(allowReturns ? "\n if({didReturnVar}){\n return {resultVar};\n }" : "", "\n ")).compile({
1178
+ var startPrefix = allowReturns ? "var {resultVar} = " : "";
1179
+ var startProgramStatements = new _template["default"]("\n ".concat(allowReturns ? "var {didReturnVar};" : "", "\n ").concat(startPrefix, "{startProgramExpression};\n ").concat(allowReturns ? "\n if({didReturnVar}){\n return {resultVar};\n }" : "", "\n ")).compile({
1148
1180
  startProgramExpression: startProgramExpression,
1149
1181
  didReturnVar: function didReturnVar() {
1150
1182
  return (0, _node.deepClone)(_didReturnVar);
@@ -1159,9 +1191,6 @@ var _default = exports["default"] = function _default(_ref) {
1159
1191
  // Reset all bindings here
1160
1192
  blockPath.scope.bindings = Object.create(null);
1161
1193
 
1162
- // Bindings changed - breaking control objects
1163
- delete blockPath.node[_constants.CONTROL_OBJECTS];
1164
-
1165
1194
  // Register new declarations
1166
1195
  var _iterator5 = _createForOfIteratorHelper(blockPath.get("body")),
1167
1196
  _step5;