diff --git a/dist/calx.esm.js b/dist/calx.esm.js new file mode 100644 index 0000000..cbea56d --- /dev/null +++ b/dist/calx.esm.js @@ -0,0 +1,2 @@ +var t={2:(t,e,n)=>{var r=n(2199),o=n(4664),i=n(5950);t.exports=function(t){return r(t,i,o)}},79:(t,e,n)=>{var r=n(3702),o=n(80),i=n(4739),a=n(8655),s=n(1175);function u(t){var e=-1,n=null==t?0:t.length;for(this.clear();++e{var r=n(6025),o=Array.prototype.splice;t.exports=function(t){var e=this.__data__,n=r(e,t);return!(n<0||(n==e.length-1?e.pop():o.call(e,n,1),--this.size,0))}},104:(t,e,n)=>{var r=n(3661);function o(t,e){if("function"!=typeof t||null!=e&&"function"!=typeof e)throw new TypeError("Expected a function");var n=function(){var r=arguments,o=e?e.apply(this,r):r[0],i=n.cache;if(i.has(o))return i.get(o);var a=t.apply(this,r);return n.cache=i.set(o,a)||i,a};return n.cache=new(o.Cache||r),n}o.Cache=r,t.exports=o},109:function(t,e,n){var r,o=this&&this.__extends||(r=function(t,e){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n])},r(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function n(){this.constructor=t}r(t,e),t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)}),i=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0}),e.EarlyExitException=e.NotAllInputParsedException=e.NoViableAltException=e.MismatchedTokenException=e.isRecognitionException=void 0;var a=i(n(9859)),s="MismatchedTokenException",u="NoViableAltException",c="EarlyExitException",l="NotAllInputParsedException",f=[s,u,c,l];Object.freeze(f),e.isRecognitionException=function(t){return(0,a.default)(f,t.name)};var h=function(t){function e(e,n){var r=this.constructor,o=t.call(this,e)||this;return o.token=n,o.resyncedTokens=[],Object.setPrototypeOf(o,r.prototype),Error.captureStackTrace&&Error.captureStackTrace(o,o.constructor),o}return o(e,t),e}(Error),p=function(t){function e(e,n,r){var o=t.call(this,e,n)||this;return o.previousToken=r,o.name=s,o}return o(e,t),e}(h);e.MismatchedTokenException=p;var d=function(t){function e(e,n,r){var o=t.call(this,e,n)||this;return o.previousToken=r,o.name=u,o}return o(e,t),e}(h);e.NoViableAltException=d;var m=function(t){function e(e,n){var r=t.call(this,e,n)||this;return r.name=l,r}return o(e,t),e}(h);e.NotAllInputParsedException=m;var g=function(t){function e(e,n,r){var o=t.call(this,e,n)||this;return o.previousToken=r,o.name=c,o}return o(e,t),e}(h);e.EarlyExitException=g},127:function(t,e,n){var r=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0}),e.Lexer=e.LexerDefinitionErrorType=void 0;var o,i=n(5063),a=r(n(3950)),s=r(n(2193)),u=r(n(6449)),c=r(n(8090)),l=r(n(8081)),f=r(n(5378)),h=r(n(9754)),p=r(n(5950)),d=r(n(2216)),m=r(n(3488)),g=r(n(6139)),v=r(n(860)),y=r(n(2629)),E=n(8927),T=n(3087),A=n(433),_=n(393);(o=e.LexerDefinitionErrorType||(e.LexerDefinitionErrorType={}))[o.MISSING_PATTERN=0]="MISSING_PATTERN",o[o.INVALID_PATTERN=1]="INVALID_PATTERN",o[o.EOI_ANCHOR_FOUND=2]="EOI_ANCHOR_FOUND",o[o.UNSUPPORTED_FLAGS_FOUND=3]="UNSUPPORTED_FLAGS_FOUND",o[o.DUPLICATE_PATTERNS_FOUND=4]="DUPLICATE_PATTERNS_FOUND",o[o.INVALID_GROUP_TYPE_FOUND=5]="INVALID_GROUP_TYPE_FOUND",o[o.PUSH_MODE_DOES_NOT_EXIST=6]="PUSH_MODE_DOES_NOT_EXIST",o[o.MULTI_MODE_LEXER_WITHOUT_DEFAULT_MODE=7]="MULTI_MODE_LEXER_WITHOUT_DEFAULT_MODE",o[o.MULTI_MODE_LEXER_WITHOUT_MODES_PROPERTY=8]="MULTI_MODE_LEXER_WITHOUT_MODES_PROPERTY",o[o.MULTI_MODE_LEXER_DEFAULT_MODE_VALUE_DOES_NOT_EXIST=9]="MULTI_MODE_LEXER_DEFAULT_MODE_VALUE_DOES_NOT_EXIST",o[o.LEXER_DEFINITION_CANNOT_CONTAIN_UNDEFINED=10]="LEXER_DEFINITION_CANNOT_CONTAIN_UNDEFINED",o[o.SOI_ANCHOR_FOUND=11]="SOI_ANCHOR_FOUND",o[o.EMPTY_MATCH_PATTERN=12]="EMPTY_MATCH_PATTERN",o[o.NO_LINE_BREAKS_FLAGS=13]="NO_LINE_BREAKS_FLAGS",o[o.UNREACHABLE_PATTERN=14]="UNREACHABLE_PATTERN",o[o.IDENTIFY_TERMINATOR=15]="IDENTIFY_TERMINATOR",o[o.CUSTOM_LINE_BREAK=16]="CUSTOM_LINE_BREAK",o[o.MULTI_MODE_LEXER_LONGER_ALT_NOT_IN_CURRENT_MODE=17]="MULTI_MODE_LEXER_LONGER_ALT_NOT_IN_CURRENT_MODE";var N={deferDefinitionErrorsHandling:!1,positionTracking:"full",lineTerminatorsPattern:/\n|\r\n?/g,lineTerminatorCharacters:["\n","\r"],ensureOptimizations:!1,safeMode:!1,errorMessageProvider:A.defaultLexerErrorProvider,traceInitPerf:!1,skipValidations:!1,recoveryEnabled:!0};Object.freeze(N);var R=function(){function t(t,e){void 0===e&&(e=N);var n=this;if(this.lexerDefinition=t,this.lexerDefinitionErrors=[],this.lexerDefinitionWarning=[],this.patternIdxToConfig={},this.charCodeToPatternIdxToConfig={},this.modes=[],this.emptyGroups={},this.trackStartLines=!0,this.trackEndLines=!0,this.hasCustom=!1,this.canModeBeOptimized={},this.TRACE_INIT=function(t,e){if(!0===n.traceInitPerf){n.traceInitIndent++;var r=new Array(n.traceInitIndent+1).join("\t");n.traceInitIndent"));var o=(0,E.timer)(e),i=o.time,a=o.value,s=i>10?console.warn:console.log;return n.traceInitIndent time: ").concat(i,"ms")),n.traceInitIndent--,a}return e()},"boolean"==typeof e)throw Error("The second argument to the Lexer constructor is now an ILexerConfig Object.\na boolean 2nd argument is no longer supported");this.config=(0,g.default)({},N,e);var r=this.config.traceInitPerf;!0===r?(this.traceInitMaxIdent=1/0,this.traceInitPerf=!0):"number"==typeof r&&(this.traceInitMaxIdent=r,this.traceInitPerf=!0),this.traceInitIndent=-1,this.TRACE_INIT("Lexer Constructor",function(){var r,o=!0;n.TRACE_INIT("Lexer Config handling",function(){if(n.config.lineTerminatorsPattern===N.lineTerminatorsPattern)n.config.lineTerminatorsPattern=i.LineTerminatorOptimizedTester;else if(n.config.lineTerminatorCharacters===N.lineTerminatorCharacters)throw Error("Error: Missing property on the Lexer config.\n\tFor details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#MISSING_LINE_TERM_CHARS");if(e.safeMode&&e.ensureOptimizations)throw Error('"safeMode" and "ensureOptimizations" flags are mutually exclusive.');n.trackStartLines=/full|onlyStart/i.test(n.config.positionTracking),n.trackEndLines=/full/i.test(n.config.positionTracking),(0,u.default)(t)?r={modes:{defaultMode:(0,y.default)(t)},defaultMode:i.DEFAULT_MODE}:(o=!1,r=(0,y.default)(t))}),!1===n.config.skipValidations&&(n.TRACE_INIT("performRuntimeChecks",function(){n.lexerDefinitionErrors=n.lexerDefinitionErrors.concat((0,i.performRuntimeChecks)(r,n.trackStartLines,n.config.lineTerminatorCharacters))}),n.TRACE_INIT("performWarningRuntimeChecks",function(){n.lexerDefinitionWarning=n.lexerDefinitionWarning.concat((0,i.performWarningRuntimeChecks)(r,n.trackStartLines,n.config.lineTerminatorCharacters))})),r.modes=r.modes?r.modes:{},(0,h.default)(r.modes,function(t,e){r.modes[e]=(0,l.default)(t,function(t){return(0,d.default)(t)})});var c=(0,p.default)(r.modes);if((0,h.default)(r.modes,function(t,r){n.TRACE_INIT("Mode: <".concat(r,"> processing"),function(){var o;n.modes.push(r),!1===n.config.skipValidations&&n.TRACE_INIT("validatePatterns",function(){n.lexerDefinitionErrors=n.lexerDefinitionErrors.concat((0,i.validatePatterns)(t,c))}),(0,s.default)(n.lexerDefinitionErrors)&&((0,T.augmentTokenTypes)(t),n.TRACE_INIT("analyzeTokenTypes",function(){o=(0,i.analyzeTokenTypes)(t,{lineTerminatorCharacters:n.config.lineTerminatorCharacters,positionTracking:e.positionTracking,ensureOptimizations:e.ensureOptimizations,safeMode:e.safeMode,tracer:n.TRACE_INIT})}),n.patternIdxToConfig[r]=o.patternIdxToConfig,n.charCodeToPatternIdxToConfig[r]=o.charCodeToPatternIdxToConfig,n.emptyGroups=(0,g.default)({},n.emptyGroups,o.emptyGroups),n.hasCustom=o.hasCustom||n.hasCustom,n.canModeBeOptimized[r]=o.canBeOptimized)})}),n.defaultMode=r.defaultMode,!(0,s.default)(n.lexerDefinitionErrors)&&!n.config.deferDefinitionErrorsHandling){var A=(0,f.default)(n.lexerDefinitionErrors,function(t){return t.message}).join("-----------------------\n");throw new Error("Errors detected in definition of Lexer:\n"+A)}(0,h.default)(n.lexerDefinitionWarning,function(t){(0,E.PRINT_WARNING)(t.message)}),n.TRACE_INIT("Choosing sub-methods implementations",function(){if(i.SUPPORT_STICKY?(n.chopInput=m.default,n.match=n.matchWithTest):(n.updateLastIndex=a.default,n.match=n.matchWithExec),o&&(n.handleModes=a.default),!1===n.trackStartLines&&(n.computeNewColumn=m.default),!1===n.trackEndLines&&(n.updateTokenEndLineColumnLocation=a.default),/full/i.test(n.config.positionTracking))n.createTokenInstance=n.createFullToken;else if(/onlyStart/i.test(n.config.positionTracking))n.createTokenInstance=n.createStartOnlyToken;else{if(!/onlyOffset/i.test(n.config.positionTracking))throw Error('Invalid config option: "'.concat(n.config.positionTracking,'"'));n.createTokenInstance=n.createOffsetOnlyToken}n.hasCustom?(n.addToken=n.addTokenUsingPush,n.handlePayload=n.handlePayloadWithCustom):(n.addToken=n.addTokenUsingMemberAccess,n.handlePayload=n.handlePayloadNoCustom)}),n.TRACE_INIT("Failed Optimization Warnings",function(){var t=(0,v.default)(n.canModeBeOptimized,function(t,e,n){return!1===e&&t.push(n),t},[]);if(e.ensureOptimizations&&!(0,s.default)(t))throw Error("Lexer Modes: < ".concat(t.join(", ")," > cannot be optimized.\n")+'\t Disable the "ensureOptimizations" lexer config flag to silently ignore this and run the lexer in an un-optimized mode.\n\t Or inspect the console log for details on how to resolve these issues.')}),n.TRACE_INIT("clearRegExpParserCache",function(){(0,_.clearRegExpParserCache)()}),n.TRACE_INIT("toFastProperties",function(){(0,E.toFastProperties)(n)})})}return t.prototype.tokenize=function(t,e){if(void 0===e&&(e=this.defaultMode),!(0,s.default)(this.lexerDefinitionErrors)){var n=(0,f.default)(this.lexerDefinitionErrors,function(t){return t.message}).join("-----------------------\n");throw new Error("Unable to Tokenize because Errors detected in definition of Lexer:\n"+n)}return this.tokenizeInternal(t,e)},t.prototype.tokenizeInternal=function(t,e){var n,r,o,a,s,u,l,f,h,p,d,m,g,v,y,E,T=this,A=t,_=A.length,N=0,R=0,O=this.hasCustom?0:Math.floor(t.length/10),I=new Array(O),S=[],b=this.trackStartLines?1:void 0,x=this.trackStartLines?1:void 0,C=(0,i.cloneEmptyGroups)(this.emptyGroups),M=this.trackStartLines,L=this.config.lineTerminatorsPattern,P=0,w=[],D=[],k=[],F=[];function U(){return w}function j(t){var e=(0,i.charCodeToOptimizedIndex)(t),n=D[e];return void 0===n?F:n}Object.freeze(F);var V,B=function(t){if(1===k.length&&void 0===t.tokenType.PUSH_MODE){var e=T.config.errorMessageProvider.buildUnableToPopLexerModeMessage(t);S.push({offset:t.startOffset,line:t.startLine,column:t.startColumn,length:t.image.length,message:e})}else{k.pop();var n=(0,c.default)(k);w=T.patternIdxToConfig[n],D=T.charCodeToPatternIdxToConfig[n],P=w.length;var r=T.canModeBeOptimized[n]&&!1===T.config.safeMode;E=D&&r?j:U}};function G(t){k.push(t),D=this.charCodeToPatternIdxToConfig[t],w=this.patternIdxToConfig[t],P=w.length,P=w.length;var e=this.canModeBeOptimized[t]&&!1===this.config.safeMode;E=D&&e?j:U}G.call(this,e);for(var W=this.config.recoveryEnabled;N<_;){u=null;var z=A.charCodeAt(N),q=E(z),Y=q.length;for(n=0;nu.length){u=a,l=f,V=X;break}}}break}}if(null!==u){if(h=u.length,void 0!==(p=V.group)&&(d=V.tokenTypeIdx,m=this.createTokenInstance(u,N,d,V.tokenType,b,x,h),this.handlePayload(m,l),!1===p?R=this.addToken(I,R,m):C[p].push(m)),t=this.chopInput(t,h),N+=h,x=this.computeNewColumn(x,h),!0===M&&!0===V.canLineTerminator){var Z=0,Q=void 0,J=void 0;L.lastIndex=0;do{!0===(Q=L.test(u))&&(J=L.lastIndex-1,Z++)}while(!0===Q);0!==Z&&(b+=Z,x=h-J,this.updateTokenEndLineColumnLocation(m,p,J,Z,b,x,h))}this.handleModes(V,B,G,m)}else{for(var tt=N,et=b,nt=x,rt=!1===W;!1===rt&&N<_;)for(t=this.chopInput(t,1),N++,r=0;r{t.exports=function(t){var e=[];if(null!=t)for(var n in Object(t))e.push(n);return e}},270:(t,e,n)=>{var r=n(7068),o=n(346);t.exports=function t(e,n,i,a,s){return e===n||(null==e||null==n||!o(e)&&!o(n)?e!=e&&n!=n:r(e,n,i,a,t,s))}},289:(t,e,n)=>{var r=n(2651);t.exports=function(t){return r(this,t).get(t)}},294:t=>{t.exports=function(t){return"number"==typeof t&&t>-1&&t%1==0&&t<=9007199254740991}},317:t=>{t.exports=function(t){var e=-1,n=Array(t.size);return t.forEach(function(t,r){n[++e]=[r,t]}),n}},346:t=>{t.exports=function(t){return null!=t&&"object"==typeof t}},361:t=>{var e=/^(?:0|[1-9]\d*)$/;t.exports=function(t,n){var r=typeof t;return!!(n=null==n?9007199254740991:n)&&("number"==r||"symbol"!=r&&e.test(t))&&t>-1&&t%1==0&&t{t.exports=function(t,e){return null==t?void 0:t[e]}},393:(t,e,n)=>{Object.defineProperty(e,"__esModule",{value:!0}),e.clearRegExpParserCache=e.getRegExpAst=void 0;var r=n(2475),o={},i=new r.RegExpParser;e.getRegExpAst=function(t){var e=t.toString();if(o.hasOwnProperty(e))return o[e];var n=i.pattern(e);return o[e]=n,n},e.clearRegExpParserCache=function(){o={}}},426:t=>{var e=Object.prototype.hasOwnProperty;t.exports=function(t,n){return null!=t&&e.call(t,n)}},433:(t,e)=>{Object.defineProperty(e,"__esModule",{value:!0}),e.defaultLexerErrorProvider=void 0,e.defaultLexerErrorProvider={buildUnableToPopLexerModeMessage:function(t){return"Unable to pop Lexer Mode after encountering Token ->".concat(t.image,"<- The Mode Stack is empty")},buildUnexpectedCharactersMessage:function(t,e,n,r,o){return"unexpected character: ->".concat(t.charAt(e),"<- at offset: ").concat(e,",")+" skipped ".concat(n," characters.")}}},500:function(t,e,n){var r,o=this&&this.__extends||(r=function(t,e){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n])},r(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function n(){this.constructor=t}r(t,e),t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)}),i=this&&this.__assign||function(){return i=Object.assign||function(t){for(var e,n=1,r=arguments.length;n1});return(0,d.default)((0,E.default)(i),function(n){var r=(0,s.default)(n),o=e.buildDuplicateFoundError(t,n),i=(0,R.getProductionDslName)(r),a={message:o,type:N.ParserDefinitionErrorType.DUPLICATE_PRODUCTIONS,ruleName:t.name,dslName:i,occurrence:r.idx},u=P(r);return u&&(a.parameter=u),a})}(t,n)}),i=function(t,e,n){var r=[],o=(0,d.default)(e,function(t){return t.name});return(0,m.default)(t,function(t){var e=t.name;if((0,T.default)(o,e)){var i=n.buildNamespaceConflictError(t);r.push({message:i,type:N.ParserDefinitionErrorType.CONFLICT_TOKENS_RULES_NAMESPACE,ruleName:e})}}),r}(t,e,n),a=(0,A.default)(t,function(t){return j(t,n)}),u=(0,A.default)(t,function(e){return D(e,t,r,n)});return o.concat(i,a,u)},e.identifyProductionForDuplicates=L;var w=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.allProductions=[],e}return o(e,t),e.prototype.visitNonTerminal=function(t){this.allProductions.push(t)},e.prototype.visitOption=function(t){this.allProductions.push(t)},e.prototype.visitRepetitionWithSeparator=function(t){this.allProductions.push(t)},e.prototype.visitRepetitionMandatory=function(t){this.allProductions.push(t)},e.prototype.visitRepetitionMandatoryWithSeparator=function(t){this.allProductions.push(t)},e.prototype.visitRepetition=function(t){this.allProductions.push(t)},e.prototype.visitAlternation=function(t){this.allProductions.push(t)},e.prototype.visitTerminal=function(t){this.allProductions.push(t)},e}(b.GAstVisitor);function D(t,e,n,r){var o=[];if((0,v.default)(e,function(e,n){return n.name===t.name?e+1:e},0)>1){var i=r.buildDuplicateRuleNameError({topLevelRule:t,grammarName:n});o.push({message:i,type:N.ParserDefinitionErrorType.DUPLICATE_RULE_NAME,ruleName:t.name})}return o}function k(t){var e=[];if((0,u.default)(t))return e;var n=(0,s.default)(t);if(n instanceof S.NonTerminal)e.push(n.referencedRule);else if(n instanceof S.Alternative||n instanceof S.Option||n instanceof S.RepetitionMandatory||n instanceof S.RepetitionMandatoryWithSeparator||n instanceof S.RepetitionWithSeparator||n instanceof S.Repetition)e=e.concat(k(n.definition));else if(n instanceof S.Alternation)e=(0,l.default)((0,d.default)(n.definition,function(t){return k(t.definition)}));else if(!(n instanceof S.Terminal))throw Error("non exhaustive match");var r=(0,R.isOptionalProd)(n),o=t.length>1;if(r&&o){var i=(0,c.default)(t);return e.concat(k(i))}return e}e.OccurrenceValidationCollector=w,e.validateRuleDoesNotAlreadyExist=D,e.validateRuleIsOverridden=function(t,e,n){var r,o=[];return(0,T.default)(e,t)||(r="Invalid rule override, rule: ->".concat(t,"<- cannot be overridden in the grammar: ->").concat(n,"<-")+"as it is not defined in any of the super grammars ",o.push({message:r,type:N.ParserDefinitionErrorType.INVALID_RULE_OVERRIDE,ruleName:t})),o},e.validateNoLeftRecursion=function t(e,n,r,o){void 0===o&&(o=[]);var i=[],a=k(n.definition);if((0,u.default)(a))return[];var s=e.name;(0,T.default)(a,e)&&i.push({message:r.buildLeftRecursionError({topLevelRule:e,leftRecursionPath:o}),type:N.ParserDefinitionErrorType.LEFT_RECURSION,ruleName:s});var c=(0,p.default)(a,o.concat([e])),l=(0,A.default)(c,function(n){var i=(0,_.default)(o);return i.push(n),t(e,n,r,i)});return i.concat(l)},e.getFirstNoneTerminal=k;var F=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.alternations=[],e}return o(e,t),e.prototype.visitAlternation=function(t){this.alternations.push(t)},e}(b.GAstVisitor);e.validateEmptyOrAlternative=function(t,e){var n=new F;t.accept(n);var r=n.alternations;return(0,A.default)(r,function(n){var r=(0,x.default)(n.definition);return(0,A.default)(r,function(r,o){var i=(0,I.nextPossibleTokensAfter)([r],[],M.tokenStructuredMatcher,1);return(0,u.default)(i)?[{message:e.buildEmptyAlternationError({topLevelRule:t,alternation:n,emptyChoiceIdx:o}),type:N.ParserDefinitionErrorType.NONE_LAST_EMPTY_ALT,ruleName:t.name,occurrence:n.idx,alternative:o+1}]:[]})})},e.validateAmbiguousAlternationAlternatives=function(t,e,n){var r=new F;t.accept(r);var o=r.alternations;return o=(0,h.default)(o,function(t){return!0===t.ignoreAmbiguities}),(0,A.default)(o,function(r){var o=r.idx,i=r.maxLookahead||e,a=(0,O.getLookaheadPathsForOr)(o,t,i,r),s=function(t,e,n,r){var o=[],i=(0,v.default)(t,function(n,r,i){return!0===e.definition[i].ignoreAmbiguities||(0,m.default)(r,function(r){var a=[i];(0,m.default)(t,function(t,n){i!==n&&(0,O.containsPath)(t,r)&&!0!==e.definition[n].ignoreAmbiguities&&a.push(n)}),a.length>1&&!(0,O.containsPath)(o,r)&&(o.push(r),n.push({alts:a,path:r}))}),n},[]);return(0,d.default)(i,function(t){var o=(0,d.default)(t.alts,function(t){return t+1});return{message:r.buildAlternationAmbiguityError({topLevelRule:n,alternation:e,ambiguityIndices:o,prefixPath:t.path}),type:N.ParserDefinitionErrorType.AMBIGUOUS_ALTS,ruleName:n.name,occurrence:e.idx,alternatives:t.alts}})}(a,r,t,n),u=V(a,r,t,n);return s.concat(u)})};var U=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.allProductions=[],e}return o(e,t),e.prototype.visitRepetitionWithSeparator=function(t){this.allProductions.push(t)},e.prototype.visitRepetitionMandatory=function(t){this.allProductions.push(t)},e.prototype.visitRepetitionMandatoryWithSeparator=function(t){this.allProductions.push(t)},e.prototype.visitRepetition=function(t){this.allProductions.push(t)},e}(b.GAstVisitor);function j(t,e){var n=new F;t.accept(n);var r=n.alternations;return(0,A.default)(r,function(n){return n.definition.length>255?[{message:e.buildTooManyAlternativesError({topLevelRule:t,alternation:n}),type:N.ParserDefinitionErrorType.TOO_MANY_ALTS,ruleName:t.name,occurrence:n.idx}]:[]})}function V(t,e,n,r){var o=(0,v.default)(t,function(t,e,n){var r=(0,d.default)(e,function(t){return{idx:n,path:t}});return t.concat(r)},[]);return(0,C.default)((0,A.default)(o,function(t){if(!0===e.definition[t.idx].ignoreAmbiguities)return[];var i=t.idx,a=t.path,s=(0,f.default)(o,function(t){return!0!==e.definition[t.idx].ignoreAmbiguities&&t.idx{var r=n(4932);t.exports=function(t,e){return r(e,function(e){return t[e]})}},583:(t,e,n)=>{var r=n(7237),o=n(7255),i=n(8586),a=n(7797);t.exports=function(t){return i(t)?r(a(t)):o(t)}},626:function(t,e,n){var r=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0}),e.ContentAssist=void 0;var o=n(4471),i=r(n(6170)),a=r(n(2216)),s=function(){function t(){}return t.prototype.initContentAssist=function(){},t.prototype.computeContentAssist=function(t,e){var n=this.gastProductionsCache[t];if((0,a.default)(n))throw Error("Rule ->".concat(t,"<- does not exist in this grammar."));return(0,o.nextPossibleTokensAfter)([n],e,this.tokenMatcher,this.maxLookahead)},t.prototype.getNextPossibleTokenTypes=function(t){var e=(0,i.default)(t.ruleStack),n=this.getGAstProductions()[e];return new o.NextAfterTokenWalker(n,t).startWalking()},t}();e.ContentAssist=s},631:(t,e,n)=>{var r=n(8077),o=n(9326);t.exports=function(t,e){return null!=t&&o(t,e,r)}},641:(t,e,n)=>{var r=n(6649),o=n(5950);t.exports=function(t,e){return t&&r(t,e,o)}},659:(t,e,n)=>{var r=n(1873),o=Object.prototype,i=o.hasOwnProperty,a=o.toString,s=r?r.toStringTag:void 0;t.exports=function(t){var e=i.call(t,s),n=t[s];try{t[s]=void 0;var r=!0}catch(t){}var o=a.call(t);return r&&(e?t[s]=n:delete t[s]),o}},689:(t,e,n)=>{var r=n(2),o=Object.prototype.hasOwnProperty;t.exports=function(t,e,n,i,a,s){var u=1&n,c=r(t),l=c.length;if(l!=r(e).length&&!u)return!1;for(var f=l;f--;){var h=c[f];if(!(u?h in e:o.call(e,h)))return!1}var p=s.get(t),d=s.get(e);if(p&&d)return p==e&&d==t;var m=!0;s.set(t,e),s.set(e,t);for(var g=u;++f{var r=n(8096),o=n(2428),i=n(6449),a=n(3656),s=n(361),u=n(7167),c=Object.prototype.hasOwnProperty;t.exports=function(t,e){var n=i(t),l=!n&&o(t),f=!n&&!l&&a(t),h=!n&&!l&&!f&&u(t),p=n||l||f||h,d=p?r(t.length,String):[],m=d.length;for(var g in t)!e&&!c.call(t,g)||p&&("length"==g||f&&("offset"==g||"parent"==g)||h&&("buffer"==g||"byteLength"==g||"byteOffset"==g)||s(g,m))||d.push(g);return d}},756:(t,e,n)=>{var r=n(3805);t.exports=function(t){return t==t&&!r(t)}},776:(t,e,n)=>{var r=n(756),o=n(5950);t.exports=function(t){for(var e=o(t),n=e.length;n--;){var i=e[n],a=t[i];e[n]=[i,a,r(a)]}return e}},860:(t,e,n)=>{var r=n(882),o=n(909),i=n(5389),a=n(5558),s=n(6449);t.exports=function(t,e,n){var u=s(t)?r:a,c=arguments.length<3;return u(t,i(e,4),n,c,o)}},870:function(t,e,n){var r=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0}),e.defaultGrammarValidatorErrorProvider=e.defaultGrammarResolverErrorProvider=e.defaultParserErrorProvider=void 0;var o=n(9399),i=r(n(6170)),a=r(n(5378)),s=r(n(860)),u=n(3387),c=n(3387);e.defaultParserErrorProvider={buildMismatchTokenMessage:function(t){var e=t.expected,n=t.actual,r=(t.previous,t.ruleName,(0,o.hasTokenLabel)(e)?"--\x3e ".concat((0,o.tokenLabel)(e)," <--"):"token of type --\x3e ".concat(e.name," <--"));return"Expecting ".concat(r," but found --\x3e '").concat(n.image,"' <--")},buildNotAllInputParsedMessage:function(t){var e=t.firstRedundant;return t.ruleName,"Redundant input, expecting EOF but found: "+e.image},buildNoViableAltMessage:function(t){var e=t.expectedPathsPerAlt,n=t.actual,r=(t.previous,t.customUserDescription),u=(t.ruleName,"Expecting: "),c="\nbut found: '"+(0,i.default)(n).image+"'";if(r)return u+r+c;var l=(0,s.default)(e,function(t,e){return t.concat(e)},[]),f=(0,a.default)(l,function(t){return"[".concat((0,a.default)(t,function(t){return(0,o.tokenLabel)(t)}).join(", "),"]")}),h=(0,a.default)(f,function(t,e){return" ".concat(e+1,". ").concat(t)});return u+"one of these possible Token sequences:\n".concat(h.join("\n"))+c},buildEarlyExitMessage:function(t){var e=t.expectedIterationPaths,n=t.actual,r=t.customUserDescription,s=(t.ruleName,"Expecting: "),u="\nbut found: '"+(0,i.default)(n).image+"'";if(r)return s+r+u;var c=(0,a.default)(e,function(t){return"[".concat((0,a.default)(t,function(t){return(0,o.tokenLabel)(t)}).join(","),"]")});return s+"expecting at least one iteration which starts with one of these possible Token sequences::\n "+"<".concat(c.join(" ,"),">")+u}},Object.freeze(e.defaultParserErrorProvider),e.defaultGrammarResolverErrorProvider={buildRuleNotFoundError:function(t,e){return"Invalid grammar, reference to a rule which is not defined: ->"+e.nonTerminalName+"<-\ninside top level rule: ->"+t.name+"<-"}},e.defaultGrammarValidatorErrorProvider={buildDuplicateFoundError:function(t,e){var n,r=t.name,o=(0,i.default)(e),a=o.idx,s=(0,c.getProductionDslName)(o),l=(n=o)instanceof u.Terminal?n.terminalType.name:n instanceof u.NonTerminal?n.nonTerminalName:"",f=a>0,h="->".concat(s).concat(f?a:"","<- ").concat(l?"with argument: ->".concat(l,"<-"):"","\n appears more than once (").concat(e.length," times) in the top level rule: ->").concat(r,"<-. \n For further details see: https://chevrotain.io/docs/FAQ.html#NUMERICAL_SUFFIXES \n ");return(h=h.replace(/[ \t]+/g," ")).replace(/\s\s+/g,"\n")},buildNamespaceConflictError:function(t){return"Namespace conflict found in grammar.\n"+"The grammar has both a Terminal(Token) and a Non-Terminal(Rule) named: <".concat(t.name,">.\n")+"To resolve this make sure each Terminal and Non-Terminal names are unique\nThis is easy to accomplish by using the convention that Terminal names start with an uppercase letter\nand Non-Terminal names start with a lower case letter."},buildAlternationPrefixAmbiguityError:function(t){var e=(0,a.default)(t.prefixPath,function(t){return(0,o.tokenLabel)(t)}).join(", "),n=0===t.alternation.idx?"":t.alternation.idx;return"Ambiguous alternatives: <".concat(t.ambiguityIndices.join(" ,"),"> due to common lookahead prefix\n")+"in inside <").concat(t.topLevelRule.name,"> Rule,\n")+"<".concat(e,"> may appears as a prefix path in all these alternatives.\n")+"See: https://chevrotain.io/docs/guide/resolving_grammar_errors.html#COMMON_PREFIX\nFor Further details."},buildAlternationAmbiguityError:function(t){var e=(0,a.default)(t.prefixPath,function(t){return(0,o.tokenLabel)(t)}).join(", "),n=0===t.alternation.idx?"":t.alternation.idx;return"Ambiguous Alternatives Detected: <".concat(t.ambiguityIndices.join(" ,"),"> in ")+" inside <".concat(t.topLevelRule.name,"> Rule,\n")+"<".concat(e,"> may appears as a prefix path in all these alternatives.\n")+"See: https://chevrotain.io/docs/guide/resolving_grammar_errors.html#AMBIGUOUS_ALTERNATIVES\nFor Further details."},buildEmptyRepetitionError:function(t){var e=(0,c.getProductionDslName)(t.repetition);return 0!==t.repetition.idx&&(e+=t.repetition.idx),"The repetition <".concat(e,"> within Rule <").concat(t.topLevelRule.name,"> can never consume any tokens.\n")+"This could lead to an infinite loop."},buildTokenNameError:function(t){return"deprecated"},buildEmptyAlternationError:function(t){return"Ambiguous empty alternative: <".concat(t.emptyChoiceIdx+1,">")+" in inside <").concat(t.topLevelRule.name,"> Rule.\n")+"Only the last alternative may be an empty alternative."},buildTooManyAlternativesError:function(t){return"An Alternation cannot have more than 256 alternatives:\n"+" inside <").concat(t.topLevelRule.name,"> Rule.\n has ").concat(t.alternation.definition.length+1," alternatives.")},buildLeftRecursionError:function(t){var e=t.topLevelRule.name,n=(0,a.default)(t.leftRecursionPath,function(t){return t.name}),r="".concat(e," --\x3e ").concat(n.concat([e]).join(" --\x3e "));return"Left Recursion found in grammar.\n"+"rule: <".concat(e,"> can be invoked from itself (directly or indirectly)\n")+"without consuming any Tokens. The grammar path that causes this is: \n ".concat(r,"\n")+" To fix this refactor your grammar to remove the left recursion.\nsee: https://en.wikipedia.org/wiki/LL_parser#Left_factoring."},buildInvalidRuleNameError:function(t){return"deprecated"},buildDuplicateRuleNameError:function(t){var e;return e=t.topLevelRule instanceof u.Rule?t.topLevelRule.name:t.topLevelRule,"Duplicate definition, rule: ->".concat(e,"<- is already defined in the grammar: ->").concat(t.grammarName,"<-")}}},882:t=>{t.exports=function(t,e,n,r){var o=-1,i=null==t?0:t.length;for(r&&i&&(n=t[++o]);++o{var r=n(641),o=n(8329)(r);t.exports=o},912:t=>{t.exports=function(t){return t&&t.length?t[0]:void 0}},916:(t,e,n)=>{var r=n(909);t.exports=function(t,e){var n;return r(t,function(t,r,o){return!(n=e(t,r,o))}),!!n}},935:(t,e,n)=>{Object.defineProperty(e,"__esModule",{value:!0}),e.LexerAdapter=void 0;var r=n(6312),o=function(){function t(){}return t.prototype.initLexerAdapter=function(){this.tokVector=[],this.tokVectorLength=0,this.currIdx=-1},Object.defineProperty(t.prototype,"input",{get:function(){return this.tokVector},set:function(t){if(!0!==this.selfAnalysisDone)throw Error("Missing invocation at the end of the Parser's constructor.");this.reset(),this.tokVector=t,this.tokVectorLength=t.length},enumerable:!1,configurable:!0}),t.prototype.SKIP_TOKEN=function(){return this.currIdx<=this.tokVector.length-2?(this.consumeToken(),this.LA(1)):r.END_OF_FILE},t.prototype.LA=function(t){var e=this.currIdx+t;return e<0||this.tokVectorLength<=e?r.END_OF_FILE:this.tokVector[e]},t.prototype.consumeToken=function(){this.currIdx++},t.prototype.exportLexerState=function(){return this.currIdx},t.prototype.importLexerState=function(t){this.currIdx=t},t.prototype.resetLexerState=function(){this.currIdx=-1},t.prototype.moveToTerminatedState=function(){this.currIdx=this.tokVector.length-1},t.prototype.getLexerPosition=function(){return this.exportLexerState()},t}();e.LexerAdapter=o},938:t=>{t.exports=function(t){var e=this.__data__,n=e.delete(t);return this.size=e.size,n}},945:(t,e,n)=>{var r=n(79),o=n(8223),i=n(3661);t.exports=function(t,e){var n=this.__data__;if(n instanceof r){var a=n.__data__;if(!o||a.length<199)return a.push([t,e]),this.size=++n.size,this;n=this.__data__=new i(a)}return n.set(t,e),this.size=n.size,this}},999:(t,e,n)=>{var r=n(9302),o=n(6800);t.exports=function(t){return r(function(e,n){var r=-1,i=n.length,a=i>1?n[i-1]:void 0,s=i>2?n[2]:void 0;for(a=t.length>3&&"function"==typeof a?(i--,a):void 0,s&&o(n[0],n[1],s)&&(a=i<3?void 0:a,i=1),e=Object(e);++r{t.exports=function(t,e,n){switch(n.length){case 0:return t.call(e);case 1:return t.call(e,n[0]);case 2:return t.call(e,n[0],n[1]);case 3:return t.call(e,n[0],n[1],n[2])}return t.apply(e,n)}},1042:(t,e,n)=>{var r=n(6110)(Object,"create");t.exports=r},1074:t=>{t.exports=function(t){return t.split("")}},1086:(t,e,n)=>{var r=n(4932),o=n(5389),i=n(7420),a=n(3349);t.exports=function(t,e){if(null==t)return{};var n=r(a(t),function(t){return[t]});return e=o(e),i(t,n,function(t,n){return e(t,n[0])})}},1120:function(t,e,n){var r=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0}),e.RecognizerApi=void 0;var o=r(n(5880)),i=r(n(9859)),a=n(109),s=n(6312),u=n(870),c=n(500),l=n(3387),f=function(){function t(){}return t.prototype.ACTION=function(t){return t.call(this)},t.prototype.consume=function(t,e,n){return this.consumeInternal(e,t,n)},t.prototype.subrule=function(t,e,n){return this.subruleInternal(e,t,n)},t.prototype.option=function(t,e){return this.optionInternal(e,t)},t.prototype.or=function(t,e){return this.orInternal(e,t)},t.prototype.many=function(t,e){return this.manyInternal(t,e)},t.prototype.atLeastOne=function(t,e){return this.atLeastOneInternal(t,e)},t.prototype.CONSUME=function(t,e){return this.consumeInternal(t,0,e)},t.prototype.CONSUME1=function(t,e){return this.consumeInternal(t,1,e)},t.prototype.CONSUME2=function(t,e){return this.consumeInternal(t,2,e)},t.prototype.CONSUME3=function(t,e){return this.consumeInternal(t,3,e)},t.prototype.CONSUME4=function(t,e){return this.consumeInternal(t,4,e)},t.prototype.CONSUME5=function(t,e){return this.consumeInternal(t,5,e)},t.prototype.CONSUME6=function(t,e){return this.consumeInternal(t,6,e)},t.prototype.CONSUME7=function(t,e){return this.consumeInternal(t,7,e)},t.prototype.CONSUME8=function(t,e){return this.consumeInternal(t,8,e)},t.prototype.CONSUME9=function(t,e){return this.consumeInternal(t,9,e)},t.prototype.SUBRULE=function(t,e){return this.subruleInternal(t,0,e)},t.prototype.SUBRULE1=function(t,e){return this.subruleInternal(t,1,e)},t.prototype.SUBRULE2=function(t,e){return this.subruleInternal(t,2,e)},t.prototype.SUBRULE3=function(t,e){return this.subruleInternal(t,3,e)},t.prototype.SUBRULE4=function(t,e){return this.subruleInternal(t,4,e)},t.prototype.SUBRULE5=function(t,e){return this.subruleInternal(t,5,e)},t.prototype.SUBRULE6=function(t,e){return this.subruleInternal(t,6,e)},t.prototype.SUBRULE7=function(t,e){return this.subruleInternal(t,7,e)},t.prototype.SUBRULE8=function(t,e){return this.subruleInternal(t,8,e)},t.prototype.SUBRULE9=function(t,e){return this.subruleInternal(t,9,e)},t.prototype.OPTION=function(t){return this.optionInternal(t,0)},t.prototype.OPTION1=function(t){return this.optionInternal(t,1)},t.prototype.OPTION2=function(t){return this.optionInternal(t,2)},t.prototype.OPTION3=function(t){return this.optionInternal(t,3)},t.prototype.OPTION4=function(t){return this.optionInternal(t,4)},t.prototype.OPTION5=function(t){return this.optionInternal(t,5)},t.prototype.OPTION6=function(t){return this.optionInternal(t,6)},t.prototype.OPTION7=function(t){return this.optionInternal(t,7)},t.prototype.OPTION8=function(t){return this.optionInternal(t,8)},t.prototype.OPTION9=function(t){return this.optionInternal(t,9)},t.prototype.OR=function(t){return this.orInternal(t,0)},t.prototype.OR1=function(t){return this.orInternal(t,1)},t.prototype.OR2=function(t){return this.orInternal(t,2)},t.prototype.OR3=function(t){return this.orInternal(t,3)},t.prototype.OR4=function(t){return this.orInternal(t,4)},t.prototype.OR5=function(t){return this.orInternal(t,5)},t.prototype.OR6=function(t){return this.orInternal(t,6)},t.prototype.OR7=function(t){return this.orInternal(t,7)},t.prototype.OR8=function(t){return this.orInternal(t,8)},t.prototype.OR9=function(t){return this.orInternal(t,9)},t.prototype.MANY=function(t){this.manyInternal(0,t)},t.prototype.MANY1=function(t){this.manyInternal(1,t)},t.prototype.MANY2=function(t){this.manyInternal(2,t)},t.prototype.MANY3=function(t){this.manyInternal(3,t)},t.prototype.MANY4=function(t){this.manyInternal(4,t)},t.prototype.MANY5=function(t){this.manyInternal(5,t)},t.prototype.MANY6=function(t){this.manyInternal(6,t)},t.prototype.MANY7=function(t){this.manyInternal(7,t)},t.prototype.MANY8=function(t){this.manyInternal(8,t)},t.prototype.MANY9=function(t){this.manyInternal(9,t)},t.prototype.MANY_SEP=function(t){this.manySepFirstInternal(0,t)},t.prototype.MANY_SEP1=function(t){this.manySepFirstInternal(1,t)},t.prototype.MANY_SEP2=function(t){this.manySepFirstInternal(2,t)},t.prototype.MANY_SEP3=function(t){this.manySepFirstInternal(3,t)},t.prototype.MANY_SEP4=function(t){this.manySepFirstInternal(4,t)},t.prototype.MANY_SEP5=function(t){this.manySepFirstInternal(5,t)},t.prototype.MANY_SEP6=function(t){this.manySepFirstInternal(6,t)},t.prototype.MANY_SEP7=function(t){this.manySepFirstInternal(7,t)},t.prototype.MANY_SEP8=function(t){this.manySepFirstInternal(8,t)},t.prototype.MANY_SEP9=function(t){this.manySepFirstInternal(9,t)},t.prototype.AT_LEAST_ONE=function(t){this.atLeastOneInternal(0,t)},t.prototype.AT_LEAST_ONE1=function(t){return this.atLeastOneInternal(1,t)},t.prototype.AT_LEAST_ONE2=function(t){this.atLeastOneInternal(2,t)},t.prototype.AT_LEAST_ONE3=function(t){this.atLeastOneInternal(3,t)},t.prototype.AT_LEAST_ONE4=function(t){this.atLeastOneInternal(4,t)},t.prototype.AT_LEAST_ONE5=function(t){this.atLeastOneInternal(5,t)},t.prototype.AT_LEAST_ONE6=function(t){this.atLeastOneInternal(6,t)},t.prototype.AT_LEAST_ONE7=function(t){this.atLeastOneInternal(7,t)},t.prototype.AT_LEAST_ONE8=function(t){this.atLeastOneInternal(8,t)},t.prototype.AT_LEAST_ONE9=function(t){this.atLeastOneInternal(9,t)},t.prototype.AT_LEAST_ONE_SEP=function(t){this.atLeastOneSepFirstInternal(0,t)},t.prototype.AT_LEAST_ONE_SEP1=function(t){this.atLeastOneSepFirstInternal(1,t)},t.prototype.AT_LEAST_ONE_SEP2=function(t){this.atLeastOneSepFirstInternal(2,t)},t.prototype.AT_LEAST_ONE_SEP3=function(t){this.atLeastOneSepFirstInternal(3,t)},t.prototype.AT_LEAST_ONE_SEP4=function(t){this.atLeastOneSepFirstInternal(4,t)},t.prototype.AT_LEAST_ONE_SEP5=function(t){this.atLeastOneSepFirstInternal(5,t)},t.prototype.AT_LEAST_ONE_SEP6=function(t){this.atLeastOneSepFirstInternal(6,t)},t.prototype.AT_LEAST_ONE_SEP7=function(t){this.atLeastOneSepFirstInternal(7,t)},t.prototype.AT_LEAST_ONE_SEP8=function(t){this.atLeastOneSepFirstInternal(8,t)},t.prototype.AT_LEAST_ONE_SEP9=function(t){this.atLeastOneSepFirstInternal(9,t)},t.prototype.RULE=function(t,e,n){if(void 0===n&&(n=s.DEFAULT_RULE_CONFIG),(0,i.default)(this.definedRulesNames,t)){var r={message:u.defaultGrammarValidatorErrorProvider.buildDuplicateRuleNameError({topLevelRule:t,grammarName:this.className}),type:s.ParserDefinitionErrorType.DUPLICATE_RULE_NAME,ruleName:t};this.definitionErrors.push(r)}this.definedRulesNames.push(t);var o=this.defineRule(t,e,n);return this[t]=o,o},t.prototype.OVERRIDE_RULE=function(t,e,n){void 0===n&&(n=s.DEFAULT_RULE_CONFIG);var r=(0,c.validateRuleIsOverridden)(t,this.definedRulesNames,this.className);this.definitionErrors=this.definitionErrors.concat(r);var o=this.defineRule(t,e,n);return this[t]=o,o},t.prototype.BACKTRACK=function(t,e){return function(){this.isBackTrackingStack.push(1);var n=this.saveRecogState();try{return t.apply(this,e),!0}catch(t){if((0,a.isRecognitionException)(t))return!1;throw t}finally{this.reloadRecogState(n),this.isBackTrackingStack.pop()}}},t.prototype.getGAstProductions=function(){return this.gastProductionsCache},t.prototype.getSerializedGastProductions=function(){return(0,l.serializeGrammar)((0,o.default)(this.gastProductionsCache))},t}();e.RecognizerApi=f},1175:(t,e,n)=>{var r=n(6025);t.exports=function(t,e){var n=this.__data__,o=r(n,t);return o<0?(++this.size,n.push([t,e])):n[o][1]=e,this}},1380:t=>{t.exports=function(t){return this.__data__.set(t,"__lodash_hash_undefined__"),this}},1419:(t,e,n)=>{e.iX=e.jT=e.IL=e.Ro=e.C_=e.Ug=e._3=e.BK=e.jO=e.Pp=e.Cy=e.$P=e.Y2=e.c$=e.wL=e.EF=e.ak=e.PW=e.X2=e.xd=e.Vv=e.lC=e.DN=e.my=e.T6=e.jk=e.vb=e.G=e.Sk=e.LT=e.fx=e.Ey=e._J=e.JG=e.mT=e.D2=e.jr=e.cA=e.xv=void 0;var r=n(4927);Object.defineProperty(e,"xv",{enumerable:!0,get:function(){return r.VERSION}});var o=n(6312);Object.defineProperty(e,"cA",{enumerable:!0,get:function(){return o.CstParser}}),Object.defineProperty(e,"jr",{enumerable:!0,get:function(){return o.EmbeddedActionsParser}}),Object.defineProperty(e,"D2",{enumerable:!0,get:function(){return o.ParserDefinitionErrorType}}),Object.defineProperty(e,"mT",{enumerable:!0,get:function(){return o.EMPTY_ALT}});var i=n(127);Object.defineProperty(e,"JG",{enumerable:!0,get:function(){return i.Lexer}}),Object.defineProperty(e,"_J",{enumerable:!0,get:function(){return i.LexerDefinitionErrorType}});var a=n(9399);Object.defineProperty(e,"Ey",{enumerable:!0,get:function(){return a.createToken}}),Object.defineProperty(e,"fx",{enumerable:!0,get:function(){return a.createTokenInstance}}),Object.defineProperty(e,"LT",{enumerable:!0,get:function(){return a.EOF}}),Object.defineProperty(e,"Sk",{enumerable:!0,get:function(){return a.tokenLabel}}),Object.defineProperty(e,"G",{enumerable:!0,get:function(){return a.tokenMatcher}}),Object.defineProperty(e,"vb",{enumerable:!0,get:function(){return a.tokenName}});var s=n(8737);Object.defineProperty(e,"jk",{enumerable:!0,get:function(){return s.getLookaheadPaths}});var u=n(5679);Object.defineProperty(e,"T6",{enumerable:!0,get:function(){return u.LLkLookaheadStrategy}});var c=n(870);Object.defineProperty(e,"my",{enumerable:!0,get:function(){return c.defaultParserErrorProvider}});var l=n(109);Object.defineProperty(e,"DN",{enumerable:!0,get:function(){return l.EarlyExitException}}),Object.defineProperty(e,"lC",{enumerable:!0,get:function(){return l.isRecognitionException}}),Object.defineProperty(e,"Vv",{enumerable:!0,get:function(){return l.MismatchedTokenException}}),Object.defineProperty(e,"xd",{enumerable:!0,get:function(){return l.NotAllInputParsedException}}),Object.defineProperty(e,"X2",{enumerable:!0,get:function(){return l.NoViableAltException}});var f=n(433);Object.defineProperty(e,"PW",{enumerable:!0,get:function(){return f.defaultLexerErrorProvider}});var h=n(3387);Object.defineProperty(e,"ak",{enumerable:!0,get:function(){return h.Alternation}}),Object.defineProperty(e,"EF",{enumerable:!0,get:function(){return h.Alternative}}),Object.defineProperty(e,"wL",{enumerable:!0,get:function(){return h.NonTerminal}}),Object.defineProperty(e,"c$",{enumerable:!0,get:function(){return h.Option}}),Object.defineProperty(e,"Y2",{enumerable:!0,get:function(){return h.Repetition}}),Object.defineProperty(e,"$P",{enumerable:!0,get:function(){return h.RepetitionMandatory}}),Object.defineProperty(e,"Cy",{enumerable:!0,get:function(){return h.RepetitionMandatoryWithSeparator}}),Object.defineProperty(e,"Pp",{enumerable:!0,get:function(){return h.RepetitionWithSeparator}}),Object.defineProperty(e,"jO",{enumerable:!0,get:function(){return h.Rule}}),Object.defineProperty(e,"BK",{enumerable:!0,get:function(){return h.Terminal}});var p=n(3387);Object.defineProperty(e,"_3",{enumerable:!0,get:function(){return p.serializeGrammar}}),Object.defineProperty(e,"Ug",{enumerable:!0,get:function(){return p.serializeProduction}}),Object.defineProperty(e,"C_",{enumerable:!0,get:function(){return p.GAstVisitor}});var d=n(3271);Object.defineProperty(e,"Ro",{enumerable:!0,get:function(){return d.generateCstDts}}),e.IL=function(){console.warn("The clearCache function was 'soft' removed from the Chevrotain API.\n\t It performs no action other than printing this message.\n\t Please avoid using it as it will be completely removed in the future")};var m=n(5994);Object.defineProperty(e,"jT",{enumerable:!0,get:function(){return m.createSyntaxDiagramsCode}});e.iX=function(){throw new Error("The Parser class has been deprecated, use CstParser or EmbeddedActionsParser instead.\t\nSee: https://chevrotain.io/docs/changes/BREAKING_CHANGES.html#_7-0-0")}},1420:(t,e,n)=>{var r=n(79);t.exports=function(){this.__data__=new r,this.size=0}},1437:(t,e,n)=>{var r=n(2552),o=n(346);t.exports=function(t){return o(t)&&"[object RegExp]"==r(t)}},1448:(t,e,n)=>{var r=n(426),o=n(9326);t.exports=function(t,e){return null!=t&&o(t,e,r)}},1459:t=>{t.exports=function(t){return this.__data__.has(t)}},1489:(t,e,n)=>{var r=n(7400);t.exports=function(t){var e=r(t),n=e%1;return e==e?n?e-n:e:0}},1549:(t,e,n)=>{var r=n(2032),o=n(3862),i=n(6721),a=n(2749),s=n(5749);function u(t){var e=-1,n=null==t?0:t.length;for(this.clear();++e{Object.defineProperty(e,"__esModule",{value:!0}),e.timer=void 0,e.timer=function(t){var e=(new Date).getTime(),n=t();return{time:(new Date).getTime()-e,value:n}}},1585:(t,e,n)=>{var r=n(6131),o=n(1489),i=Math.max;t.exports=function(t,e,n){var a=null==t?0:t.length;if(!a)return-1;var s=null==n?0:o(n);return s<0&&(s=i(a+s,0)),r(t,e,s)}},1769:(t,e,n)=>{var r=n(6449),o=n(8586),i=n(1802),a=n(3222);t.exports=function(t,e){return r(t)?t:o(t,e)?[t]:i(a(t))}},1791:(t,e,n)=>{var r=n(6547),o=n(3360);t.exports=function(t,e,n,i){var a=!n;n||(n={});for(var s=-1,u=e.length;++s{var r=n(7217),o=n(270);t.exports=function(t,e,n,i){var a=n.length,s=a,u=!i;if(null==t)return!s;for(t=Object(t);a--;){var c=n[a];if(u&&c[2]?c[1]!==t[c[0]]:!(c[0]in t))return!1}for(;++a{var e=/\s/;t.exports=function(t){for(var n=t.length;n--&&e.test(t.charAt(n)););return n}},1802:(t,e,n)=>{var r=n(2224),o=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,i=/\\(\\)?/g,a=r(function(t){var e=[];return 46===t.charCodeAt(0)&&e.push(""),t.replace(o,function(t,n,r,o){e.push(r?o.replace(i,"$1"):n||t)}),e});t.exports=a},1811:t=>{var e=Date.now;t.exports=function(t){var n=0,r=0;return function(){var o=e(),i=16-(o-r);if(r=o,i>0){if(++n>=800)return arguments[0]}else n=0;return t.apply(void 0,arguments)}}},1873:(t,e,n)=>{var r=n(9325).Symbol;t.exports=r},1882:(t,e,n)=>{var r=n(2552),o=n(3805);t.exports=function(t){if(!o(t))return!1;var e=r(t);return"[object Function]"==e||"[object GeneratorFunction]"==e||"[object AsyncFunction]"==e||"[object Proxy]"==e}},1887:(t,e,n)=>{var r;n.d(e,{X:()=>r}),function(t){t.VALUE_CHANGED="value.changed",t.FORMULA_CHANGED="fomula.changed",t.FORMULA_CALCULATED="formula.calculated",t.CALCULATED="calculated",t.ELEMENT_MOUNTED="element.mounted"}(r||(r={}))},1961:(t,e,n)=>{var r=n(9653);t.exports=function(t,e){var n=e?r(t.buffer):t.buffer;return new t.constructor(n,t.byteOffset,t.length)}},1986:(t,e,n)=>{var r=n(1873),o=n(7828),i=n(5288),a=n(5911),s=n(317),u=n(4247),c=r?r.prototype:void 0,l=c?c.valueOf:void 0;t.exports=function(t,e,n,r,c,f,h){switch(n){case"[object DataView]":if(t.byteLength!=e.byteLength||t.byteOffset!=e.byteOffset)return!1;t=t.buffer,e=e.buffer;case"[object ArrayBuffer]":return!(t.byteLength!=e.byteLength||!f(new o(t),new o(e)));case"[object Boolean]":case"[object Date]":case"[object Number]":return i(+t,+e);case"[object Error]":return t.name==e.name&&t.message==e.message;case"[object RegExp]":case"[object String]":return t==e+"";case"[object Map]":var p=s;case"[object Set]":var d=1&r;if(p||(p=u),t.size!=e.size&&!d)return!1;var m=h.get(t);if(m)return m==e;r|=2,h.set(t,e);var g=a(p(t),p(e),r,c,f,h);return h.delete(t),g;case"[object Symbol]":if(l)return l.call(t)==l.call(e)}return!1}},2e3:(t,e,n)=>{var r=n(3945),o=n(2429),i=n(5389),a=n(6449);t.exports=function(t,e){return function(n,s){var u=a(n)?r:o,c=e?e():{};return u(n,t,i(s,2),c)}}},2006:(t,e,n)=>{var r=n(5389),o=n(4894),i=n(5950);t.exports=function(t){return function(e,n,a){var s=Object(e);if(!o(e)){var u=r(n,3);e=i(e),n=function(t){return u(s[t],t,s)}}var c=t(e,n,a);return c>-1?s[u?e[c]:c]:void 0}}},2013:(t,e,n)=>{var r=n(3360),o=n(2e3),i=Object.prototype.hasOwnProperty,a=o(function(t,e,n){i.call(t,n)?t[n].push(e):r(t,n,[e])});t.exports=a},2032:(t,e,n)=>{var r=n(1042);t.exports=function(){this.__data__=r?r(null):{},this.size=0}},2054:t=>{var e="\\ud800-\\udfff",n="["+e+"]",r="[\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]",o="\\ud83c[\\udffb-\\udfff]",i="[^"+e+"]",a="(?:\\ud83c[\\udde6-\\uddff]){2}",s="[\\ud800-\\udbff][\\udc00-\\udfff]",u="(?:"+r+"|"+o+")?",c="[\\ufe0e\\ufe0f]?",l=c+u+"(?:\\u200d(?:"+[i,a,s].join("|")+")"+c+u+")*",f="(?:"+[i+r+"?",r,a,s,n].join("|")+")",h=RegExp(o+"(?="+o+")|"+f+l,"g");t.exports=function(t){return t.match(h)||[]}},2056:function(t,e,n){var r,o=this&&this.__extends||(r=function(t,e){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n])},r(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function n(){this.constructor=t}r(t,e),t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)}),i=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0}),e.collectMethods=e.LooksAhead=void 0;var a=i(n(9754)),s=i(n(1448)),u=n(6312),c=n(7045),l=n(3387),f=n(3387),h=n(5679),p=function(){function t(){}return t.prototype.initLooksAhead=function(t){this.dynamicTokensEnabled=(0,s.default)(t,"dynamicTokensEnabled")?t.dynamicTokensEnabled:u.DEFAULT_PARSER_CONFIG.dynamicTokensEnabled,this.maxLookahead=(0,s.default)(t,"maxLookahead")?t.maxLookahead:u.DEFAULT_PARSER_CONFIG.maxLookahead,this.lookaheadStrategy=(0,s.default)(t,"lookaheadStrategy")?t.lookaheadStrategy:new h.LLkLookaheadStrategy({maxLookahead:this.maxLookahead}),this.lookAheadFuncsCache=new Map},t.prototype.preComputeLookaheadFunctions=function(t){var e=this;(0,a.default)(t,function(t){e.TRACE_INIT("".concat(t.name," Rule Lookahead"),function(){var n=g(t),r=n.alternation,o=n.repetition,i=n.option,s=n.repetitionMandatory,u=n.repetitionMandatoryWithSeparator,l=n.repetitionWithSeparator;(0,a.default)(r,function(n){var r=0===n.idx?"":n.idx;e.TRACE_INIT("".concat((0,f.getProductionDslName)(n)).concat(r),function(){var r=e.lookaheadStrategy.buildLookaheadForAlternation({prodOccurrence:n.idx,rule:t,maxLookahead:n.maxLookahead||e.maxLookahead,hasPredicates:n.hasPredicates,dynamicTokensEnabled:e.dynamicTokensEnabled}),o=(0,c.getKeyForAutomaticLookahead)(e.fullRuleNameToShort[t.name],c.OR_IDX,n.idx);e.setLaFuncCache(o,r)})}),(0,a.default)(o,function(n){e.computeLookaheadFunc(t,n.idx,c.MANY_IDX,"Repetition",n.maxLookahead,(0,f.getProductionDslName)(n))}),(0,a.default)(i,function(n){e.computeLookaheadFunc(t,n.idx,c.OPTION_IDX,"Option",n.maxLookahead,(0,f.getProductionDslName)(n))}),(0,a.default)(s,function(n){e.computeLookaheadFunc(t,n.idx,c.AT_LEAST_ONE_IDX,"RepetitionMandatory",n.maxLookahead,(0,f.getProductionDslName)(n))}),(0,a.default)(u,function(n){e.computeLookaheadFunc(t,n.idx,c.AT_LEAST_ONE_SEP_IDX,"RepetitionMandatoryWithSeparator",n.maxLookahead,(0,f.getProductionDslName)(n))}),(0,a.default)(l,function(n){e.computeLookaheadFunc(t,n.idx,c.MANY_SEP_IDX,"RepetitionWithSeparator",n.maxLookahead,(0,f.getProductionDslName)(n))})})})},t.prototype.computeLookaheadFunc=function(t,e,n,r,o,i){var a=this;this.TRACE_INIT("".concat(i).concat(0===e?"":e),function(){var i=a.lookaheadStrategy.buildLookaheadForOptional({prodOccurrence:e,rule:t,maxLookahead:o||a.maxLookahead,dynamicTokensEnabled:a.dynamicTokensEnabled,prodType:r}),s=(0,c.getKeyForAutomaticLookahead)(a.fullRuleNameToShort[t.name],n,e);a.setLaFuncCache(s,i)})},t.prototype.getKeyForAutomaticLookahead=function(t,e){var n=this.getLastExplicitRuleShortName();return(0,c.getKeyForAutomaticLookahead)(n,t,e)},t.prototype.getLaFuncFromCache=function(t){return this.lookAheadFuncsCache.get(t)},t.prototype.setLaFuncCache=function(t,e){this.lookAheadFuncsCache.set(t,e)},t}();e.LooksAhead=p;var d=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.dslMethods={option:[],alternation:[],repetition:[],repetitionWithSeparator:[],repetitionMandatory:[],repetitionMandatoryWithSeparator:[]},e}return o(e,t),e.prototype.reset=function(){this.dslMethods={option:[],alternation:[],repetition:[],repetitionWithSeparator:[],repetitionMandatory:[],repetitionMandatoryWithSeparator:[]}},e.prototype.visitOption=function(t){this.dslMethods.option.push(t)},e.prototype.visitRepetitionWithSeparator=function(t){this.dslMethods.repetitionWithSeparator.push(t)},e.prototype.visitRepetitionMandatory=function(t){this.dslMethods.repetitionMandatory.push(t)},e.prototype.visitRepetitionMandatoryWithSeparator=function(t){this.dslMethods.repetitionMandatoryWithSeparator.push(t)},e.prototype.visitRepetition=function(t){this.dslMethods.repetition.push(t)},e.prototype.visitAlternation=function(t){this.dslMethods.alternation.push(t)},e}(l.GAstVisitor),m=new d;function g(t){m.reset(),t.accept(m);var e=m.dslMethods;return m.reset(),e}e.collectMethods=g},2112:function(t,e,n){var r=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0}),e.PerformanceTracer=void 0;var o=r(n(1448)),i=n(8927),a=n(6312),s=function(){function t(){}return t.prototype.initPerformanceTracer=function(t){if((0,o.default)(t,"traceInitPerf")){var e=t.traceInitPerf,n="number"==typeof e;this.traceInitMaxIdent=n?e:1/0,this.traceInitPerf=n?e>0:e}else this.traceInitMaxIdent=0,this.traceInitPerf=a.DEFAULT_PARSER_CONFIG.traceInitPerf;this.traceInitIndent=-1},t.prototype.TRACE_INIT=function(t,e){if(!0===this.traceInitPerf){this.traceInitIndent++;var n=new Array(this.traceInitIndent+1).join("\t");this.traceInitIndent"));var r=(0,i.timer)(e),o=r.time,a=r.value,s=o>10?console.warn:console.log;return this.traceInitIndent time: ").concat(o,"ms")),this.traceInitIndent--,a}return e()},t}();e.PerformanceTracer=s},2193:(t,e,n)=>{var r=n(8984),o=n(5861),i=n(2428),a=n(6449),s=n(4894),u=n(3656),c=n(5527),l=n(7167),f=Object.prototype.hasOwnProperty;t.exports=function(t){if(null==t)return!0;if(s(t)&&(a(t)||"string"==typeof t||"function"==typeof t.splice||u(t)||l(t)||i(t)))return!t.length;var e=o(t);if("[object Map]"==e||"[object Set]"==e)return!t.size;if(c(t))return!r(t).length;for(var n in t)if(f.call(t,n))return!1;return!0}},2195:function(t,e,n){var r=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0}),e.firstForTerminal=e.firstForBranching=e.firstForSequence=e.first=void 0;var o=r(n(5970)),i=r(n(3375)),a=r(n(5378)),s=n(3387),u=n(3387);function c(t){if(t instanceof s.NonTerminal)return c(t.referencedRule);if(t instanceof s.Terminal)return h(t);if((0,u.isSequenceProd)(t))return l(t);if((0,u.isBranchingProd)(t))return f(t);throw Error("non exhaustive match")}function l(t){for(var e,n=[],r=t.definition,o=0,a=r.length>o,s=!0;a&&s;)e=r[o],s=(0,u.isOptionalProd)(e),n=n.concat(c(e)),o+=1,a=r.length>o;return(0,i.default)(n)}function f(t){var e=(0,a.default)(t.definition,function(t){return c(t)});return(0,i.default)((0,o.default)(e))}function h(t){return[t.terminalType]}e.first=c,e.firstForSequence=l,e.firstForBranching=f,e.firstForTerminal=h},2199:(t,e,n)=>{var r=n(4528),o=n(6449);t.exports=function(t,e,n){var i=e(t);return o(t)?i:r(i,n(t))}},2216:t=>{t.exports=function(t){return void 0===t}},2224:(t,e,n)=>{var r=n(104);t.exports=function(t){var e=r(t,function(t){return 500===n.size&&n.clear(),t}),n=e.cache;return e}},2271:(t,e,n)=>{var r=n(1791),o=n(4664);t.exports=function(t,e){return r(t,o(t),e)}},2308:(t,e)=>{Object.defineProperty(e,"__esModule",{value:!0}),e.PRINT_WARNING=e.PRINT_ERROR=void 0,e.PRINT_ERROR=function(t){console&&console.error&&console.error("Error: ".concat(t))},e.PRINT_WARNING=function(t){console&&console.warn&&console.warn("Warning: ".concat(t))}},2423:function(t,e,n){var r=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0}),e.GastRecorder=void 0;var o=r(n(8090)),i=r(n(6449)),a=r(n(2426)),s=r(n(9754)),u=r(n(1882)),c=r(n(1448)),l=n(3387),f=n(127),h=n(3087),p=n(9399),d=n(6312),m=n(7045),g={description:"This Object indicates the Parser is during Recording Phase"};Object.freeze(g);var v=!0,y=Math.pow(2,m.BITS_FOR_OCCURRENCE_IDX)-1,E=(0,p.createToken)({name:"RECORDING_PHASE_TOKEN",pattern:f.Lexer.NA});(0,h.augmentTokenTypes)([E]);var T=(0,p.createTokenInstance)(E,"This IToken indicates the Parser is in Recording Phase\n\tSee: https://chevrotain.io/docs/guide/internals.html#grammar-recording for details",-1,-1,-1,-1,-1,-1);Object.freeze(T);var A={name:"This CSTNode indicates the Parser is in Recording Phase\n\tSee: https://chevrotain.io/docs/guide/internals.html#grammar-recording for details",children:{}},_=function(){function t(){}return t.prototype.initGastRecorder=function(t){this.recordingProdStack=[],this.RECORDING_PHASE=!1},t.prototype.enableRecording=function(){var t=this;this.RECORDING_PHASE=!0,this.TRACE_INIT("Enable Recording",function(){for(var e=function(e){var n=e>0?e:"";t["CONSUME".concat(n)]=function(t,n){return this.consumeInternalRecord(t,e,n)},t["SUBRULE".concat(n)]=function(t,n){return this.subruleInternalRecord(t,e,n)},t["OPTION".concat(n)]=function(t){return this.optionInternalRecord(t,e)},t["OR".concat(n)]=function(t){return this.orInternalRecord(t,e)},t["MANY".concat(n)]=function(t){this.manyInternalRecord(e,t)},t["MANY_SEP".concat(n)]=function(t){this.manySepFirstInternalRecord(e,t)},t["AT_LEAST_ONE".concat(n)]=function(t){this.atLeastOneInternalRecord(e,t)},t["AT_LEAST_ONE_SEP".concat(n)]=function(t){this.atLeastOneSepFirstInternalRecord(e,t)}},n=0;n<10;n++)e(n);t.consume=function(t,e,n){return this.consumeInternalRecord(e,t,n)},t.subrule=function(t,e,n){return this.subruleInternalRecord(e,t,n)},t.option=function(t,e){return this.optionInternalRecord(e,t)},t.or=function(t,e){return this.orInternalRecord(e,t)},t.many=function(t,e){this.manyInternalRecord(t,e)},t.atLeastOne=function(t,e){this.atLeastOneInternalRecord(t,e)},t.ACTION=t.ACTION_RECORD,t.BACKTRACK=t.BACKTRACK_RECORD,t.LA=t.LA_RECORD})},t.prototype.disableRecording=function(){var t=this;this.RECORDING_PHASE=!1,this.TRACE_INIT("Deleting Recording methods",function(){for(var e=t,n=0;n<10;n++){var r=n>0?n:"";delete e["CONSUME".concat(r)],delete e["SUBRULE".concat(r)],delete e["OPTION".concat(r)],delete e["OR".concat(r)],delete e["MANY".concat(r)],delete e["MANY_SEP".concat(r)],delete e["AT_LEAST_ONE".concat(r)],delete e["AT_LEAST_ONE_SEP".concat(r)]}delete e.consume,delete e.subrule,delete e.option,delete e.or,delete e.many,delete e.atLeastOne,delete e.ACTION,delete e.BACKTRACK,delete e.LA})},t.prototype.ACTION_RECORD=function(t){},t.prototype.BACKTRACK_RECORD=function(t,e){return function(){return!0}},t.prototype.LA_RECORD=function(t){return d.END_OF_FILE},t.prototype.topLevelRuleRecord=function(t,e){try{var n=new l.Rule({definition:[],name:t});return n.name=t,this.recordingProdStack.push(n),e.call(this),this.recordingProdStack.pop(),n}catch(t){if(!0!==t.KNOWN_RECORDER_ERROR)try{t.message=t.message+'\n\t This error was thrown during the "grammar recording phase" For more info see:\n\thttps://chevrotain.io/docs/guide/internals.html#grammar-recording'}catch(e){throw t}throw t}},t.prototype.optionInternalRecord=function(t,e){return N.call(this,l.Option,t,e)},t.prototype.atLeastOneInternalRecord=function(t,e){N.call(this,l.RepetitionMandatory,e,t)},t.prototype.atLeastOneSepFirstInternalRecord=function(t,e){N.call(this,l.RepetitionMandatoryWithSeparator,e,t,v)},t.prototype.manyInternalRecord=function(t,e){N.call(this,l.Repetition,e,t)},t.prototype.manySepFirstInternalRecord=function(t,e){N.call(this,l.RepetitionWithSeparator,e,t,v)},t.prototype.orInternalRecord=function(t,e){return R.call(this,t,e)},t.prototype.subruleInternalRecord=function(t,e,n){if(I(e),!t||!1===(0,c.default)(t,"ruleName")){var r=new Error(" argument is invalid")+" expecting a Parser method reference but got: <".concat(JSON.stringify(t),">")+"\n inside top level rule: <".concat(this.recordingProdStack[0].name,">"));throw r.KNOWN_RECORDER_ERROR=!0,r}var i=(0,o.default)(this.recordingProdStack),a=t.ruleName,s=new l.NonTerminal({idx:e,nonTerminalName:a,label:null==n?void 0:n.LABEL,referencedRule:void 0});return i.definition.push(s),this.outputCst?A:g},t.prototype.consumeInternalRecord=function(t,e,n){if(I(e),!(0,h.hasShortKeyProperty)(t)){var r=new Error(" argument is invalid")+" expecting a TokenType reference but got: <".concat(JSON.stringify(t),">")+"\n inside top level rule: <".concat(this.recordingProdStack[0].name,">"));throw r.KNOWN_RECORDER_ERROR=!0,r}var i=(0,o.default)(this.recordingProdStack),a=new l.Terminal({idx:e,terminalType:t,label:null==n?void 0:n.LABEL});return i.definition.push(a),T},t}();function N(t,e,n,r){void 0===r&&(r=!1),I(n);var i=(0,o.default)(this.recordingProdStack),a=(0,u.default)(e)?e:e.DEF,s=new t({definition:[],idx:n});return r&&(s.separator=e.SEP),(0,c.default)(e,"MAX_LOOKAHEAD")&&(s.maxLookahead=e.MAX_LOOKAHEAD),this.recordingProdStack.push(s),a.call(this),i.definition.push(s),this.recordingProdStack.pop(),g}function R(t,e){var n=this;I(e);var r=(0,o.default)(this.recordingProdStack),f=!1===(0,i.default)(t),h=!1===f?t:t.DEF,p=new l.Alternation({definition:[],idx:e,ignoreAmbiguities:f&&!0===t.IGNORE_AMBIGUITIES});(0,c.default)(t,"MAX_LOOKAHEAD")&&(p.maxLookahead=t.MAX_LOOKAHEAD);var d=(0,a.default)(h,function(t){return(0,u.default)(t.GATE)});return p.hasPredicates=d,r.definition.push(p),(0,s.default)(h,function(t){var e=new l.Alternative({definition:[]});p.definition.push(e),(0,c.default)(t,"IGNORE_AMBIGUITIES")?e.ignoreAmbiguities=t.IGNORE_AMBIGUITIES:(0,c.default)(t,"GATE")&&(e.ignoreAmbiguities=!0),n.recordingProdStack.push(e),t.ALT.call(n),n.recordingProdStack.pop()}),g}function O(t){return 0===t?"":"".concat(t)}function I(t){if(t<0||t>y){var e=new Error("Invalid DSL Method idx value: <".concat(t,">\n\t")+"Idx value must be a none negative value smaller than ".concat(y+1));throw e.KNOWN_RECORDER_ERROR=!0,e}}e.GastRecorder=_},2426:(t,e,n)=>{var r=n(4248),o=n(5389),i=n(916),a=n(6449),s=n(6800);t.exports=function(t,e,n){var u=a(t)?r:i;return n&&s(t,e,n)&&(e=void 0),u(t,o(e,3))}},2428:(t,e,n)=>{var r=n(7534),o=n(346),i=Object.prototype,a=i.hasOwnProperty,s=i.propertyIsEnumerable,u=r(function(){return arguments}())?r:function(t){return o(t)&&a.call(t,"callee")&&!s.call(t,"callee")};t.exports=u},2429:(t,e,n)=>{var r=n(909);t.exports=function(t,e,n,o){return r(t,function(t,r,i){e(o,t,n(t),i)}),o}},2475:function(t,e){var n,r;"undefined"!=typeof self&&self,void 0===(r="function"==typeof(n=function(){function t(){}t.prototype.saveState=function(){return{idx:this.idx,input:this.input,groupIdx:this.groupIdx}},t.prototype.restoreState=function(t){this.idx=t.idx,this.input=t.input,this.groupIdx=t.groupIdx},t.prototype.pattern=function(t){this.idx=0,this.input=t,this.groupIdx=0,this.consumeChar("/");var e=this.disjunction();this.consumeChar("/");for(var n={type:"Flags",loc:{begin:this.idx,end:t.length},global:!1,ignoreCase:!1,multiLine:!1,unicode:!1,sticky:!1};this.isRegExpFlag();)switch(this.popChar()){case"g":s(n,"global");break;case"i":s(n,"ignoreCase");break;case"m":s(n,"multiLine");break;case"u":s(n,"unicode");break;case"y":s(n,"sticky")}if(this.idx!==this.input.length)throw Error("Redundant input: "+this.input.substring(this.idx));return{type:"Pattern",flags:n,value:e,loc:this.loc(0)}},t.prototype.disjunction=function(){var t=[],e=this.idx;for(t.push(this.alternative());"|"===this.peekChar();)this.consumeChar("|"),t.push(this.alternative());return{type:"Disjunction",value:t,loc:this.loc(e)}},t.prototype.alternative=function(){for(var t=[],e=this.idx;this.isTerm();)t.push(this.term());return{type:"Alternative",value:t,loc:this.loc(e)}},t.prototype.term=function(){return this.isAssertion()?this.assertion():this.atom()},t.prototype.assertion=function(){var t=this.idx;switch(this.popChar()){case"^":return{type:"StartAnchor",loc:this.loc(t)};case"$":return{type:"EndAnchor",loc:this.loc(t)};case"\\":switch(this.popChar()){case"b":return{type:"WordBoundary",loc:this.loc(t)};case"B":return{type:"NonWordBoundary",loc:this.loc(t)}}throw Error("Invalid Assertion Escape");case"(":var e;switch(this.consumeChar("?"),this.popChar()){case"=":e="Lookahead";break;case"!":e="NegativeLookahead"}u(e);var n=this.disjunction();return this.consumeChar(")"),{type:e,value:n,loc:this.loc(t)}}!function(){throw Error("Internal Error - Should never get here!")}()},t.prototype.quantifier=function(t){var e,n=this.idx;switch(this.popChar()){case"*":e={atLeast:0,atMost:1/0};break;case"+":e={atLeast:1,atMost:1/0};break;case"?":e={atLeast:0,atMost:1};break;case"{":var r=this.integerIncludingZero();switch(this.popChar()){case"}":e={atLeast:r,atMost:r};break;case",":e=this.isDigit()?{atLeast:r,atMost:this.integerIncludingZero()}:{atLeast:r,atMost:1/0},this.consumeChar("}")}if(!0===t&&void 0===e)return;u(e)}if(!0!==t||void 0!==e)return u(e),"?"===this.peekChar(0)?(this.consumeChar("?"),e.greedy=!1):e.greedy=!0,e.type="Quantifier",e.loc=this.loc(n),e},t.prototype.atom=function(){var t,e=this.idx;switch(this.peekChar()){case".":t=this.dotAll();break;case"\\":t=this.atomEscape();break;case"[":t=this.characterClass();break;case"(":t=this.group()}return void 0===t&&this.isPatternCharacter()&&(t=this.patternCharacter()),u(t),t.loc=this.loc(e),this.isQuantifier()&&(t.quantifier=this.quantifier()),t},t.prototype.dotAll=function(){return this.consumeChar("."),{type:"Set",complement:!0,value:[i("\n"),i("\r"),i("\u2028"),i("\u2029")]}},t.prototype.atomEscape=function(){switch(this.consumeChar("\\"),this.peekChar()){case"1":case"2":case"3":case"4":case"5":case"6":case"7":case"8":case"9":return this.decimalEscapeAtom();case"d":case"D":case"s":case"S":case"w":case"W":return this.characterClassEscape();case"f":case"n":case"r":case"t":case"v":return this.controlEscapeAtom();case"c":return this.controlLetterEscapeAtom();case"0":return this.nulCharacterAtom();case"x":return this.hexEscapeSequenceAtom();case"u":return this.regExpUnicodeEscapeSequenceAtom();default:return this.identityEscapeAtom()}},t.prototype.decimalEscapeAtom=function(){return{type:"GroupBackReference",value:this.positiveInteger()}},t.prototype.characterClassEscape=function(){var t,e=!1;switch(this.popChar()){case"d":t=c;break;case"D":t=c,e=!0;break;case"s":t=f;break;case"S":t=f,e=!0;break;case"w":t=l;break;case"W":t=l,e=!0}return u(t),{type:"Set",value:t,complement:e}},t.prototype.controlEscapeAtom=function(){var t;switch(this.popChar()){case"f":t=i("\f");break;case"n":t=i("\n");break;case"r":t=i("\r");break;case"t":t=i("\t");break;case"v":t=i("\v")}return u(t),{type:"Character",value:t}},t.prototype.controlLetterEscapeAtom=function(){this.consumeChar("c");var t=this.popChar();if(!1===/[a-zA-Z]/.test(t))throw Error("Invalid ");return{type:"Character",value:t.toUpperCase().charCodeAt(0)-64}},t.prototype.nulCharacterAtom=function(){return this.consumeChar("0"),{type:"Character",value:i("\0")}},t.prototype.hexEscapeSequenceAtom=function(){return this.consumeChar("x"),this.parseHexDigits(2)},t.prototype.regExpUnicodeEscapeSequenceAtom=function(){return this.consumeChar("u"),this.parseHexDigits(4)},t.prototype.identityEscapeAtom=function(){return{type:"Character",value:i(this.popChar())}},t.prototype.classPatternCharacterAtom=function(){switch(this.peekChar()){case"\n":case"\r":case"\u2028":case"\u2029":case"\\":case"]":throw Error("TBD");default:return{type:"Character",value:i(this.popChar())}}},t.prototype.characterClass=function(){var t=[],e=!1;for(this.consumeChar("["),"^"===this.peekChar(0)&&(this.consumeChar("^"),e=!0);this.isClassAtom();){var n=this.classAtom();if("Character"===n.type&&this.isRangeDash()){this.consumeChar("-");var r=this.classAtom();if("Character"===r.type){if(r.value=this.input.length)throw Error("Unexpected end of input");this.idx++},t.prototype.loc=function(t){return{begin:t,end:this.idx}};var e,n=/[0-9a-fA-F]/,r=/[0-9]/,o=/[1-9]/;function i(t){return t.charCodeAt(0)}function a(t,e){void 0!==t.length?t.forEach(function(t){e.push(t)}):e.push(t)}function s(t,e){if(!0===t[e])throw"duplicate flag "+e;t[e]=!0}function u(t){if(void 0===t)throw Error("Internal Error - Should never get here!")}var c=[];for(e=i("0");e<=i("9");e++)c.push(e);var l=[i("_")].concat(c);for(e=i("a");e<=i("z");e++)l.push(e);for(e=i("A");e<=i("Z");e++)l.push(e);var f=[i(" "),i("\f"),i("\n"),i("\r"),i("\t"),i("\v"),i("\t"),i(" "),i(" "),i(" "),i(" "),i(" "),i(" "),i(" "),i(" "),i(" "),i(" "),i(" "),i(" "),i(" "),i("\u2028"),i("\u2029"),i(" "),i(" "),i(" "),i("\ufeff")];function h(){}return h.prototype.visitChildren=function(t){for(var e in t){var n=t[e];t.hasOwnProperty(e)&&(void 0!==n.type?this.visit(n):Array.isArray(n)&&n.forEach(function(t){this.visit(t)},this))}},h.prototype.visit=function(t){switch(t.type){case"Pattern":this.visitPattern(t);break;case"Flags":this.visitFlags(t);break;case"Disjunction":this.visitDisjunction(t);break;case"Alternative":this.visitAlternative(t);break;case"StartAnchor":this.visitStartAnchor(t);break;case"EndAnchor":this.visitEndAnchor(t);break;case"WordBoundary":this.visitWordBoundary(t);break;case"NonWordBoundary":this.visitNonWordBoundary(t);break;case"Lookahead":this.visitLookahead(t);break;case"NegativeLookahead":this.visitNegativeLookahead(t);break;case"Character":this.visitCharacter(t);break;case"Set":this.visitSet(t);break;case"Group":this.visitGroup(t);break;case"GroupBackReference":this.visitGroupBackReference(t);break;case"Quantifier":this.visitQuantifier(t)}this.visitChildren(t)},h.prototype.visitPattern=function(t){},h.prototype.visitFlags=function(t){},h.prototype.visitDisjunction=function(t){},h.prototype.visitAlternative=function(t){},h.prototype.visitStartAnchor=function(t){},h.prototype.visitEndAnchor=function(t){},h.prototype.visitWordBoundary=function(t){},h.prototype.visitNonWordBoundary=function(t){},h.prototype.visitLookahead=function(t){},h.prototype.visitNegativeLookahead=function(t){},h.prototype.visitCharacter=function(t){},h.prototype.visitSet=function(t){},h.prototype.visitGroup=function(t){},h.prototype.visitGroupBackReference=function(t){},h.prototype.visitQuantifier=function(t){},{RegExpParser:t,BaseRegExpVisitor:h,VERSION:"0.5.0"}})?n.apply(e,[]):n)||(t.exports=r)},2507:(t,e,n)=>{var r=n(8754),o=n(9698),i=n(3912),a=n(3222);t.exports=function(t){return function(e){e=a(e);var n=o(e)?i(e):void 0,s=n?n[0]:e.charAt(0),u=n?r(n,1).join(""):e.slice(1);return s[t]()+u}}},2523:t=>{t.exports=function(t,e,n,r){for(var o=t.length,i=n+(r?1:-1);r?i--:++i{var r=n(1873),o=n(659),i=n(9350),a=r?r.toStringTag:void 0;t.exports=function(t){return null==t?void 0===t?"[object Undefined]":"[object Null]":a&&a in Object(t)?o(t):i(t)}},2629:(t,e,n)=>{var r=n(9999);t.exports=function(t){return r(t,4)}},2651:(t,e,n)=>{var r=n(4218);t.exports=function(t,e){var n=t.__data__;return r(e)?n["string"==typeof e?"string":"hash"]:n.map}},2749:(t,e,n)=>{var r=n(1042),o=Object.prototype.hasOwnProperty;t.exports=function(t){var e=this.__data__;return r?void 0!==e[t]:o.call(e,t)}},2804:(t,e,n)=>{var r=n(6110)(n(9325),"Promise");t.exports=r},2865:(t,e,n)=>{var r=n(9570),o=n(1811)(r);t.exports=o},2903:(t,e,n)=>{var r=n(3805),o=n(5527),i=n(181),a=Object.prototype.hasOwnProperty;t.exports=function(t){if(!r(t))return i(t);var e=o(t),n=[];for(var s in t)("constructor"!=s||!e&&a.call(t,s))&&n.push(s);return n}},2949:(t,e,n)=>{var r=n(2651);t.exports=function(t,e){var n=r(this,t),o=n.size;return n.set(t,e),this.size+=n.size==o?0:1,this}},3007:t=>{t.exports=function(t,e){var n=-1,r=t.length;for(e||(e=Array(r));++n{var r=n(1549),o=n(79),i=n(8223);t.exports=function(){this.size=0,this.__data__={hash:new r,map:new(i||o),string:new r}}},3087:function(t,e,n){var r=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0}),e.isTokenType=e.hasExtendingTokensTypesMapProperty=e.hasExtendingTokensTypesProperty=e.hasCategoriesProperty=e.hasShortKeyProperty=e.singleAssignCategoriesToksMap=e.assignCategoriesMapProp=e.assignCategoriesTokensProp=e.assignTokenDefaultProps=e.expandCategories=e.augmentTokenTypes=e.tokenIdxToClass=e.tokenShortNameIdx=e.tokenStructuredMatcherNoCategories=e.tokenStructuredMatcher=void 0;var o=r(n(2193)),i=r(n(3673)),a=r(n(6449)),s=r(n(5970)),u=r(n(6245)),c=r(n(5378)),l=r(n(9754)),f=r(n(1448)),h=r(n(9859)),p=r(n(2629));function d(t){for(var e=(0,p.default)(t),n=t,r=!0;r;){n=(0,i.default)((0,s.default)((0,c.default)(n,function(t){return t.CATEGORIES})));var a=(0,u.default)(n,e);e=e.concat(a),(0,o.default)(a)?r=!1:n=a}return e}function m(t){(0,l.default)(t,function(t){E(t)||(e.tokenIdxToClass[e.tokenShortNameIdx]=t,t.tokenTypeIdx=e.tokenShortNameIdx++),T(t)&&!(0,a.default)(t.CATEGORIES)&&(t.CATEGORIES=[t.CATEGORIES]),T(t)||(t.CATEGORIES=[]),A(t)||(t.categoryMatches=[]),_(t)||(t.categoryMatchesMap={})})}function g(t){(0,l.default)(t,function(t){t.categoryMatches=[],(0,l.default)(t.categoryMatchesMap,function(n,r){t.categoryMatches.push(e.tokenIdxToClass[r].tokenTypeIdx)})})}function v(t){(0,l.default)(t,function(t){y([],t)})}function y(t,e){(0,l.default)(t,function(t){e.categoryMatchesMap[t.tokenTypeIdx]=!0}),(0,l.default)(e.CATEGORIES,function(n){var r=t.concat(e);(0,h.default)(r,n)||y(r,n)})}function E(t){return(0,f.default)(t,"tokenTypeIdx")}function T(t){return(0,f.default)(t,"CATEGORIES")}function A(t){return(0,f.default)(t,"categoryMatches")}function _(t){return(0,f.default)(t,"categoryMatchesMap")}e.tokenStructuredMatcher=function(t,e){var n=t.tokenTypeIdx;return n===e.tokenTypeIdx||!0===e.isParent&&!0===e.categoryMatchesMap[n]},e.tokenStructuredMatcherNoCategories=function(t,e){return t.tokenTypeIdx===e.tokenTypeIdx},e.tokenShortNameIdx=1,e.tokenIdxToClass={},e.augmentTokenTypes=function(t){var e=d(t);m(e),v(e),g(e),(0,l.default)(e,function(t){t.isParent=t.categoryMatches.length>0})},e.expandCategories=d,e.assignTokenDefaultProps=m,e.assignCategoriesTokensProp=g,e.assignCategoriesMapProp=v,e.singleAssignCategoriesToksMap=y,e.hasShortKeyProperty=E,e.hasCategoriesProperty=T,e.hasExtendingTokensTypesProperty=A,e.hasExtendingTokensTypesMapProperty=_,e.isTokenType=function(t){return(0,f.default)(t,"tokenTypeIdx")}},3120:(t,e,n)=>{var r=n(4528),o=n(5891);t.exports=function t(e,n,i,a,s){var u=-1,c=e.length;for(i||(i=o),s||(s=[]);++u0&&i(l)?n>1?t(l,n-1,i,a,s):r(s,l):a||(s[s.length]=l)}return s}},3131:function(t,e,n){var r=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0}),e.RestWalker=void 0;var o=r(n(3739)),i=r(n(9754)),a=n(3387),s=function(){function t(){}return t.prototype.walk=function(t,e){var n=this;void 0===e&&(e=[]),(0,i.default)(t.definition,function(r,i){var s=(0,o.default)(t.definition,i+1);if(r instanceof a.NonTerminal)n.walkProdRef(r,s,e);else if(r instanceof a.Terminal)n.walkTerminal(r,s,e);else if(r instanceof a.Alternative)n.walkFlat(r,s,e);else if(r instanceof a.Option)n.walkOption(r,s,e);else if(r instanceof a.RepetitionMandatory)n.walkAtLeastOne(r,s,e);else if(r instanceof a.RepetitionMandatoryWithSeparator)n.walkAtLeastOneSep(r,s,e);else if(r instanceof a.RepetitionWithSeparator)n.walkManySep(r,s,e);else if(r instanceof a.Repetition)n.walkMany(r,s,e);else{if(!(r instanceof a.Alternation))throw Error("non exhaustive match");n.walkOr(r,s,e)}})},t.prototype.walkTerminal=function(t,e,n){},t.prototype.walkProdRef=function(t,e,n){},t.prototype.walkFlat=function(t,e,n){var r=e.concat(n);this.walk(t,r)},t.prototype.walkOption=function(t,e,n){var r=e.concat(n);this.walk(t,r)},t.prototype.walkAtLeastOne=function(t,e,n){var r=[new a.Option({definition:t.definition})].concat(e,n);this.walk(t,r)},t.prototype.walkAtLeastOneSep=function(t,e,n){var r=u(t,e,n);this.walk(t,r)},t.prototype.walkMany=function(t,e,n){var r=[new a.Option({definition:t.definition})].concat(e,n);this.walk(t,r)},t.prototype.walkManySep=function(t,e,n){var r=u(t,e,n);this.walk(t,r)},t.prototype.walkOr=function(t,e,n){var r=this,o=e.concat(n);(0,i.default)(t.definition,function(t){var e=new a.Alternative({definition:[t]});r.walk(e,o)})},t}();function u(t,e,n){return[new a.Option({definition:[new a.Terminal({terminalType:t.separator})].concat(t.definition)})].concat(e,n)}e.RestWalker=s},3170:(t,e,n)=>{var r=n(6547),o=n(1769),i=n(361),a=n(3805),s=n(7797);t.exports=function(t,e,n,u){if(!a(t))return t;for(var c=-1,l=(e=o(e,t)).length,f=l-1,h=t;null!=h&&++c{var e=/\w*$/;t.exports=function(t){var n=new t.constructor(t.source,e.exec(t));return n.lastIndex=t.lastIndex,n}},3221:t=>{t.exports=function(t){return function(e,n,r){for(var o=-1,i=Object(e),a=r(e),s=a.length;s--;){var u=a[t?s:++o];if(!1===n(i[u],u,i))break}return e}}},3222:(t,e,n)=>{var r=n(7556);t.exports=function(t){return null==t?"":r(t)}},3243:(t,e,n)=>{var r=n(6110),o=function(){try{var t=r(Object,"defineProperty");return t({},"",{}),t}catch(t){}}();t.exports=o},3271:function(t,e,n){var r=this&&this.__assign||function(){return r=Object.assign||function(t){for(var e,n=1,r=arguments.length;n{t=n.nmd(t);var r=n(9325),o=e&&!e.nodeType&&e,i=o&&t&&!t.nodeType&&t,a=i&&i.exports===o?r.Buffer:void 0,s=a?a.allocUnsafe:void 0;t.exports=function(t,e){if(e)return t.slice();var n=t.length,r=s?s(n):new t.constructor(n);return t.copy(r),r}},3345:t=>{t.exports=function(){return[]}},3349:(t,e,n)=>{var r=n(2199),o=n(6375),i=n(7241);t.exports=function(t){return r(t,i,o)}},3360:(t,e,n)=>{var r=n(3243);t.exports=function(t,e,n){"__proto__"==e&&r?r(t,e,{configurable:!0,enumerable:!0,value:n,writable:!0}):t[e]=n}},3375:(t,e,n)=>{var r=n(5765);t.exports=function(t){return t&&t.length?r(t):[]}},3387:(t,e,n)=>{Object.defineProperty(e,"__esModule",{value:!0}),e.isSequenceProd=e.isBranchingProd=e.isOptionalProd=e.getProductionDslName=e.GAstVisitor=e.serializeProduction=e.serializeGrammar=e.Alternative=e.Alternation=e.RepetitionWithSeparator=e.RepetitionMandatoryWithSeparator=e.RepetitionMandatory=e.Repetition=e.Option=e.NonTerminal=e.Terminal=e.Rule=void 0;var r=n(8538);Object.defineProperty(e,"Rule",{enumerable:!0,get:function(){return r.Rule}}),Object.defineProperty(e,"Terminal",{enumerable:!0,get:function(){return r.Terminal}}),Object.defineProperty(e,"NonTerminal",{enumerable:!0,get:function(){return r.NonTerminal}}),Object.defineProperty(e,"Option",{enumerable:!0,get:function(){return r.Option}}),Object.defineProperty(e,"Repetition",{enumerable:!0,get:function(){return r.Repetition}}),Object.defineProperty(e,"RepetitionMandatory",{enumerable:!0,get:function(){return r.RepetitionMandatory}}),Object.defineProperty(e,"RepetitionMandatoryWithSeparator",{enumerable:!0,get:function(){return r.RepetitionMandatoryWithSeparator}}),Object.defineProperty(e,"RepetitionWithSeparator",{enumerable:!0,get:function(){return r.RepetitionWithSeparator}}),Object.defineProperty(e,"Alternation",{enumerable:!0,get:function(){return r.Alternation}}),Object.defineProperty(e,"Alternative",{enumerable:!0,get:function(){return r.Alternative}}),Object.defineProperty(e,"serializeGrammar",{enumerable:!0,get:function(){return r.serializeGrammar}}),Object.defineProperty(e,"serializeProduction",{enumerable:!0,get:function(){return r.serializeProduction}});var o=n(4105);Object.defineProperty(e,"GAstVisitor",{enumerable:!0,get:function(){return o.GAstVisitor}});var i=n(3598);Object.defineProperty(e,"getProductionDslName",{enumerable:!0,get:function(){return i.getProductionDslName}}),Object.defineProperty(e,"isOptionalProd",{enumerable:!0,get:function(){return i.isOptionalProd}}),Object.defineProperty(e,"isBranchingProd",{enumerable:!0,get:function(){return i.isBranchingProd}}),Object.defineProperty(e,"isSequenceProd",{enumerable:!0,get:function(){return i.isSequenceProd}})},3475:(t,e,n)=>{n.r(e),n.d(e,{Calx:()=>il,DateUtil:()=>at});var r={};n.r(r),n.d(r,{arrayMerge:()=>Et,getCellsInRange:()=>ht,initial:()=>vt,isValidBinary:()=>pt,numToStr:()=>lt,objectToArray:()=>At,rangeToTable:()=>Nt,repeat:()=>mt,rest:()=>yt,strRepeat:()=>dt,strToNum:()=>ft,toArray:()=>Tt,translateFormula:()=>Ot,transposeTable:()=>Rt,trimEmptyCell:()=>_t,unique:()=>gt,updateMovedReferences:()=>It});var o={};n.r(o),n.d(o,{ABS:()=>Yr,ACCRINT:()=>wu,ACCRINTM:()=>Du,ACOS:()=>Kr,ACOSH:()=>Hr,ACOT:()=>Xr,ACOTH:()=>$r,ADD:()=>si,AGGREGATE:()=>Zr,AMORDEGRC:()=>ku,AMORLINC:()=>Fu,AND:()=>Dc,ARABIC:()=>Qr,ARGS2ARRAY:()=>Kc,ASC:()=>xi,ASIN:()=>Jr,ASINH:()=>to,ATAN:()=>eo,ATAN2:()=>no,ATANH:()=>ro,AVEDEV:()=>In,AVERAGE:()=>Sn,AVERAGEA:()=>bn,AVERAGEIF:()=>xn,AVERAGEIFS:()=>Cn,BAHTTEXT:()=>Ci,BASE:()=>oo,BESSELI:()=>pa,BESSELJ:()=>da,BESSELK:()=>ma,BESSELY:()=>ga,BETA:()=>Mn,BETADIST:()=>fs,BETAINV:()=>hs,BIN2DEC:()=>va,BIN2HEX:()=>ya,BIN2OCT:()=>Ea,BINOM:()=>Ln,BINOMDIST:()=>ps,BITAND:()=>Ta,BITLSHIFT:()=>Aa,BITOR:()=>_a,BITRSHIFT:()=>Na,BITXOR:()=>Ra,CEILING:()=>io,CEILINGMATH:()=>ds,CEILINGPRECISE:()=>ms,CELL:()=>Ye,CHAR:()=>Mi,CHIDIST:()=>gs,CHIDISTRT:()=>vs,CHIINV:()=>ys,CHIINVRT:()=>Es,CHISQ:()=>Pn,CHITEST:()=>Ts,CHOOSE:()=>dn,CLEAN:()=>Li,CODE:()=>Pi,COLUMN:()=>mn,COLUMNS:()=>gn,COMBIN:()=>ao,COMBINA:()=>so,COMPLEX:()=>Oa,CONCAT:()=>Di,CONCATENATE:()=>wi,CONFIDENCE:()=>wn,CONVERT:()=>Ia,CORREL:()=>Dn,COS:()=>uo,COSH:()=>co,COT:()=>lo,COTH:()=>fo,COUNT:()=>kn,COUNTA:()=>Fn,COUNTBLANK:()=>jn,COUNTIF:()=>Vn,COUNTIFS:()=>Bn,COUNTIN:()=>Un,COUNTUNIQUE:()=>Gn,COUPDAYBS:()=>Uu,COUPDAYS:()=>ju,COUPDAYSNC:()=>Vu,COUPNCD:()=>Bu,COUPNUM:()=>Gu,COUPPCD:()=>Wu,COVAR:()=>As,COVARIANCE:()=>Wn,COVARIANCEP:()=>_s,COVARIANCES:()=>Ns,CRITBINOM:()=>Rs,CSC:()=>ho,CSCH:()=>po,CUMIPMT:()=>zu,CUMPRINC:()=>qu,DATE:()=>ue,DATEDIF:()=>ce,DATEVALUE:()=>le,DAVERAGE:()=>Tu,DAY:()=>fe,DAYS:()=>pe,DAYS360:()=>de,DB:()=>Yu,DBCS:()=>ki,DCOUNT:()=>Au,DCOUNTA:()=>_u,DDB:()=>Ku,DEC2BIN:()=>Sa,DEC2HEX:()=>ba,DEC2OCT:()=>xa,DECIMAL:()=>mo,DEGREES:()=>go,DELTA:()=>Ca,DEVSQ:()=>zn,DGET:()=>Nu,DISC:()=>Hu,DIVIDE:()=>ci,DMAX:()=>Ru,DMIN:()=>Ou,DOLLAR:()=>Fi,DOLLARDE:()=>Xu,DOLLARFR:()=>$u,DPRODUCT:()=>Iu,DSTDEV:()=>Su,DSTDEVP:()=>bu,DSUM:()=>xu,DURATION:()=>Zu,DVAR:()=>Cu,DVARP:()=>Mu,E:()=>jo,EDATE:()=>me,EFFECT:()=>Qu,EOMONTH:()=>ge,EQ:()=>mi,ERF:()=>Ma,ERFC:()=>La,ERFCPRECISE:()=>Os,ERFPRECISE:()=>Is,ERROR:()=>Ke,EVEN:()=>vo,EXACT:()=>Ui,EXP:()=>yo,EXPON:()=>qn,EXPONDIST:()=>Ss,F:()=>Yn,FACT:()=>To,FACTDOUBLE:()=>Ao,FALSE:()=>kc,FDIST:()=>bs,FDISTRT:()=>xs,FIND:()=>ji,FINDFIELD:()=>yu,FINV:()=>Cs,FINVRT:()=>Ms,FISHER:()=>Kn,FISHERINV:()=>Hn,FIXED:()=>Vi,FLATTEN:()=>Yc,FLOOR:()=>_o,FLOORMATH:()=>Ls,FLOORPRECISE:()=>Ps,FORECAST:()=>Xn,FREQUENCY:()=>$n,FTEST:()=>ws,FV:()=>Ju,FVSCHEDULE:()=>tc,GAMMA:()=>Zn,GAMMADIST:()=>Ds,GAMMAINV:()=>ks,GAMMALN:()=>Qn,GAMMALNPRECISE:()=>Fs,GAUSS:()=>Jn,GCD:()=>No,GEOMEAN:()=>tr,GESTEP:()=>Pa,GROWTH:()=>er,GT:()=>fi,GTE:()=>hi,HARMEAN:()=>nr,HEX2BIN:()=>wa,HEX2DEC:()=>Da,HEX2OCT:()=>ka,HLOOKUP:()=>vn,HOUR:()=>ve,HTML2TEXT:()=>Bi,HYPGEOM:()=>rr,HYPGEOMDIST:()=>Us,IF:()=>Fc,IFERROR:()=>jc,IFNA:()=>Vc,IFS:()=>Uc,IMABS:()=>Fa,IMAGINARY:()=>Ua,IMARGUMENT:()=>ja,IMCONJUGATE:()=>Va,IMCOS:()=>Ba,IMCOSH:()=>Ga,IMCOT:()=>Wa,IMCSC:()=>rs,IMCSCH:()=>os,IMDIV:()=>za,IMEXP:()=>qa,IMLN:()=>Ya,IMLOG10:()=>Ka,IMLOG2:()=>Ha,IMPOWER:()=>Xa,IMPRODUCT:()=>$a,IMREAL:()=>Za,IMSEC:()=>Qa,IMSECH:()=>Ja,IMSIN:()=>ts,IMSINH:()=>es,IMSQRT:()=>ns,IMSUB:()=>is,IMSUM:()=>as,IMTAN:()=>ss,INDEX:()=>yn,INFO:()=>He,INT:()=>Ro,INTERCEPT:()=>or,INTERVAL:()=>ye,INTRATE:()=>ec,IPMT:()=>nc,IRR:()=>rc,ISBINARY:()=>$e,ISBLANK:()=>Xe,ISERR:()=>Ze,ISERROR:()=>Qe,ISEVEN:()=>Je,ISFORMULA:()=>tn,ISLOGICAL:()=>en,ISNA:()=>nn,ISNONTEXT:()=>rn,ISNUMBER:()=>on,ISO:()=>Oo,ISODD:()=>an,ISOWEEKNUM:()=>Ee,ISPMT:()=>oc,ISREF:()=>sn,ISTEXT:()=>un,JOIN:()=>Xc,KURT:()=>ir,LARGE:()=>ar,LCM:()=>Io,LEFT:()=>Gi,LEN:()=>Wi,LINEST:()=>sr,LN:()=>So,LN10:()=>bo,LN2:()=>xo,LOG:()=>Lo,LOG10:()=>Po,LOG10E:()=>Co,LOG2E:()=>Mo,LOGEST:()=>ur,LOGINV:()=>js,LOGNORM:()=>cr,LOGNORMDIST:()=>Vs,LOGNORMINV:()=>Bs,LOOKUP:()=>En,LOWER:()=>zi,LT:()=>pi,LTE:()=>di,MATCH:()=>Tn,MAX:()=>lr,MAXA:()=>fr,MDURATION:()=>ic,MEDIAN:()=>hr,MID:()=>qi,MIN:()=>pr,MINA:()=>dr,MINUS:()=>ui,MINUTE:()=>Te,MIRR:()=>ac,MOD:()=>wo,MODE:()=>mr,MODEMULT:()=>Gs,MODESNGL:()=>Ws,MONTH:()=>Ae,MROUND:()=>Do,MULTINOMIAL:()=>ko,MULTIPLY:()=>li,N:()=>cn,NA:()=>ln,NE:()=>gi,NEGBINOM:()=>gr,NEGBINOMDIST:()=>zs,NETWORKDAYS:()=>_e,NETWORKDAYSINTL:()=>qs,NOMINAL:()=>sc,NORM:()=>vr,NORMDIST:()=>Ys,NORMINV:()=>Ks,NORMSDIST:()=>Hs,NORMSINV:()=>Xs,NOT:()=>Bc,NOW:()=>Ne,NPER:()=>uc,NPV:()=>cc,NUMBERS:()=>$c,NUMBERVALUE:()=>Yi,OCT2BIN:()=>us,OCT2DEC:()=>cs,OCT2HEX:()=>ls,ODD:()=>Fo,ODDFPRICE:()=>lc,ODDFYIELD:()=>fc,ODDLPRICE:()=>hc,ODDLYIELD:()=>pc,OR:()=>Gc,PDURATION:()=>dc,PEARSON:()=>yr,PERCENTILE:()=>Er,PERCENTILEEXC:()=>$s,PERCENTILEINC:()=>Zs,PERCENTRANK:()=>Tr,PERCENTRANKEXC:()=>Qs,PERCENTRANKINC:()=>Js,PERMUT:()=>Ar,PERMUTATIONA:()=>_r,PHI:()=>Nr,PI:()=>Uo,PMT:()=>mc,POISSON:()=>Rr,POISSONDIST:()=>tu,POW:()=>vi,POWER:()=>Vo,PPMT:()=>gc,PRICE:()=>vc,PRICEDISC:()=>yc,PRICEMAT:()=>Ec,PROB:()=>Or,PRODUCT:()=>Bo,PRONETIC:()=>Ki,PROPER:()=>Hi,PV:()=>Tc,QUARTILE:()=>Ir,QUARTILEEXC:()=>eu,QUARTILEINC:()=>nu,QUOTIENT:()=>Go,RADIANS:()=>Wo,RAND:()=>zo,RANDBETWEEN:()=>qo,RANK:()=>Sr,RANKAVG:()=>ru,RANKEQ:()=>ou,RATE:()=>Ac,RECEIVED:()=>_c,REFERENCE:()=>Hc,REGEXEXTRACT:()=>Xi,REGEXMATCH:()=>$i,REGEXREPLACE:()=>Zi,REPLACE:()=>Qi,REPT:()=>Ji,RIGHT:()=>ta,ROMAN:()=>Yo,ROUND:()=>Ko,ROUNDDOWN:()=>Ho,ROUNDUP:()=>Xo,ROW:()=>br,ROWS:()=>An,RRI:()=>Nc,RSQ:()=>xr,SEARCH:()=>ea,SEC:()=>$o,SECH:()=>Zo,SECOND:()=>Re,SERIESSUM:()=>Qo,SHEET:()=>fn,SHEETS:()=>hn,SIGN:()=>Jo,SIN:()=>ti,SINH:()=>ei,SKEW:()=>Cr,SKEWP:()=>iu,SLN:()=>Rc,SLOPE:()=>Mr,SMALL:()=>Lr,SPLIT:()=>na,SQRT:()=>ni,SQRT1_2:()=>oi,SQRT2:()=>ii,SQRTPI:()=>ri,STANDARDIZE:()=>Pr,STDEV:()=>wr,STDEVA:()=>Dr,STDEVP:()=>au,STDEVPA:()=>kr,STDEVS:()=>su,STEYX:()=>Fr,SUBSTITUTE:()=>ra,SUBTOTAL:()=>ai,SUM:()=>yi,SUMIF:()=>Ei,SUMIFS:()=>Ti,SUMPRODUCT:()=>Ai,SUMSQ:()=>_i,SUMX2MY2:()=>Ni,SUMX2PY2:()=>Ri,SUMXMY2:()=>Oi,SWITCH:()=>qc,SYD:()=>Oc,T:()=>oa,TAN:()=>Ii,TANH:()=>Si,TBILLEQ:()=>Ic,TBILLPRICE:()=>Sc,TBILLYIELD:()=>bc,TDIST:()=>uu,TDISTRT:()=>cu,TEXT:()=>ia,TEXTJOIN:()=>aa,TIME:()=>Oe,TIMEVALUE:()=>Ie,TINV:()=>lu,TODAY:()=>Se,TRANSPOSE:()=>_n,TREND:()=>jr,TRIM:()=>sa,TRIMMEAN:()=>Vr,TRUE:()=>Wc,TRUNC:()=>bi,TTEST:()=>fu,TYPE:()=>pn,UNICHAR:()=>ua,UNICODE:()=>ca,UNIQUE:()=>Nn,UPPER:()=>la,VALUE:()=>fa,VAR:()=>Br,VARA:()=>Gr,VARP:()=>hu,VARPA:()=>Wr,VARS:()=>pu,VDB:()=>xc,VLOOKUP:()=>Rn,WEEKDAY:()=>be,WEEKNUM:()=>xe,WEIBULL:()=>zr,WEIBULLDIST:()=>du,WORKDAY:()=>Ce,WORKDAYINTL:()=>mu,XIRR:()=>Cc,XNPV:()=>Mc,XOR:()=>zc,YEAR:()=>Me,YEARFRAC:()=>we,YIELD:()=>Lc,YIELDDISC:()=>Pc,YIELDMAT:()=>wc,Z:()=>qr,ZTEST:()=>gu});var i=n(1419);i.ak,i.EF;const a=i.cA,s=(i.mT,i.LT,i.DN,i.jr,i.C_,i.T6,i.JG),u=(i._J,i.Vv,i.X2,i.wL,i.xd,i.c$,i.iX,i.D2,i.Y2,i.$P,i.Cy,i.Pp,i.jO,i.BK,i.xv,i.IL,i.jT,i.Ey),c=(i.fx,i.PW,i.my,i.Ro,i.jk,i.lC,i._3,i.Ug,i.Sk,i.G,i.vb,u({name:"Plus",pattern:/\+/})),l=u({name:"Minus",pattern:/-/}),f=u({name:"Mult",pattern:/\*/}),h=u({name:"Div",pattern:/\//}),p=u({name:"LParen",pattern:/\(/}),d=u({name:"RParen",pattern:/\)/}),m=u({name:"Comma",pattern:/,/}),g=u({name:"RowRange",pattern:/\$?\d+:\$?\d+/}),v=u({name:"NumberLiteral",pattern:/\d+(\.\d+)?/,longer_alt:g}),y=u({name:"Variable",pattern:/[A-Za-z_][A-Za-z0-9_]*/}),E=u({name:"SheetName",pattern:/[A-Za-z_][A-Za-z0-9_-]*!/}),T=u({name:"CellRange",pattern:/\$?[A-Za-z]+\$?\d+:\$?[A-Za-z]+\$?\d+/}),A=u({name:"CellRef",pattern:/\$?[A-Za-z]+\$?\d+/}),_=u({name:"StringLiteral",pattern:/(["'])(?:(?!\1).)*\1/}),N=u({name:"Concat",pattern:/&/}),R=u({name:"FunctionName",pattern:/[A-Za-z]+(?=\()/i,longer_alt:A}),O=u({name:"WhiteSpace",pattern:/\s+/,group:s.SKIPPED}),I=u({name:"GreaterThan",pattern:/>/}),S=u({name:"LessThan",pattern:/=/}),x=u({name:"LessThanEqual",pattern:/<=/}),C=u({name:"Equal",pattern:/=/}),M=u({name:"NotEqual",pattern:/<>/}),L=u({name:"IfFunction",pattern:/IF(?=\()/i,longer_alt:y}),P=u({name:"TrueKeyword",pattern:/TRUE/i,longer_alt:y}),w=u({name:"FalseKeyword",pattern:/FALSE/i,longer_alt:y}),D=u({name:"NullKeyword",pattern:/NULL/i,longer_alt:y}),k=u({name:"ArrayRowSep",pattern:/;/}),F=u({name:"RangeIntersect",pattern:/ +/}),U=u({name:"ErrorConstant",pattern:/#(DIV\/0!|N\/A|NAME\?|NULL!|NUM!|REF!|VALUE!|#SPILL!)/}),j=u({name:"IfErrorFunction",pattern:/IFERROR(?=\()/i,longer_alt:y}),V=u({name:"IfsFunction",pattern:/IFS(?=\()/i,longer_alt:y}),B=u({name:"SwitchFunction",pattern:/SWITCH(?=\()/i,longer_alt:y}),G=u({name:"LCurly",pattern:/{/}),W=u({name:"RCurly",pattern:/}/}),z=u({name:"ColumnRange",pattern:/\$?[A-Za-z]+:\$?[A-Za-z]+/}),q=u({name:"Power",pattern:/\*\*|\^/}),Y=[O,b,x,M,I,S,C,c,l,N,q,f,h,p,d,G,W,m,k,E,z,g,T,A,F,v,_,U,L,j,V,B,P,w,D,R,y],K={Plus:c,Minus:l,Mult:f,Div:h,LParen:p,RParen:d,Comma:m,RowRange:g,NumberLiteral:v,Variable:y,SheetName:E,CellRange:T,CellRef:A,StringLiteral:_,Concat:N,FunctionName:R,WhiteSpace:O,GreaterThan:I,LessThan:S,GreaterThanEqual:b,LessThanEqual:x,Equal:C,NotEqual:M,IfFunction:L,TrueKeyword:P,FalseKeyword:w,NullKeyword:D,ArrayRowSep:k,RangeIntersect:F,ErrorConstant:U,IfErrorFunction:j,IfsFunction:V,SwitchFunction:B,LCurly:G,RCurly:W,ColumnRange:z,Power:q},H=new s(Y);class X extends a{constructor(){super(Y),this.cache={comparisonExpression:!1,atomicExpression:!1};const t=this;t.RULE("expression",()=>{t.OR([{ALT:()=>t.SUBRULE(t.arrayFormula)},{ALT:()=>t.SUBRULE(t.comparisonExpression)}])}),t.RULE("arrayFormula",()=>{t.CONSUME(K.LCurly),t.OPTION(()=>{t.CONSUME(K.Equal)}),t.SUBRULE(t.expression),t.MANY(()=>{t.OR([{ALT:()=>t.CONSUME(K.Comma)},{ALT:()=>t.CONSUME(K.ArrayRowSep)}]),t.SUBRULE2(t.expression)}),t.CONSUME(K.RCurly)}),t.RULE("comparisonExpression",()=>{t.SUBRULE(t.additionExpression,{LABEL:"lhs"}),t.OPTION(()=>{t.cache.comparisonExpression||t.OR([{ALT:()=>t.CONSUME(K.GreaterThan)},{ALT:()=>t.CONSUME(K.LessThan)},{ALT:()=>t.CONSUME(K.GreaterThanEqual)},{ALT:()=>t.CONSUME(K.LessThanEqual)},{ALT:()=>t.CONSUME(K.Equal)},{ALT:()=>t.CONSUME(K.NotEqual)}]),t.SUBRULE2(t.additionExpression,{LABEL:"rhs"})})}),t.RULE("additionExpression",()=>{t.SUBRULE(t.concatenationExpression,{LABEL:"lhs"}),t.MANY(()=>{t.OR([{ALT:()=>t.CONSUME(K.Plus)},{ALT:()=>t.CONSUME(K.Minus)}]),t.SUBRULE2(t.concatenationExpression,{LABEL:"rhs"})})}),t.RULE("concatenationExpression",()=>{t.SUBRULE(t.multiplicationExpression,{LABEL:"lhs"}),t.MANY(()=>{t.CONSUME(K.Concat),t.SUBRULE2(t.multiplicationExpression,{LABEL:"rhs"})})}),t.RULE("multiplicationExpression",()=>{t.SUBRULE(t.exponentiationExpression,{LABEL:"lhs"}),t.MANY(()=>{t.OR([{ALT:()=>t.CONSUME(K.Mult)},{ALT:()=>t.CONSUME(K.Div)}]),t.SUBRULE2(t.exponentiationExpression,{LABEL:"rhs"})})}),t.RULE("exponentiationExpression",()=>{t.SUBRULE(t.unaryExpression,{LABEL:"lhs"}),t.MANY(()=>{t.CONSUME(K.Power),t.SUBRULE2(t.unaryExpression,{LABEL:"rhs"})})}),t.RULE("unaryExpression",()=>{t.OR([{ALT:()=>{t.CONSUME(K.Minus),t.SUBRULE(t.unaryExpression)}},{ALT:()=>t.SUBRULE(t.atomicExpression)}])}),t.RULE("atomicExpression",()=>{t.cache.atomicExpression||t.OR([{ALT:()=>t.CONSUME(K.NumberLiteral)},{ALT:()=>t.CONSUME(K.StringLiteral)},{ALT:()=>t.CONSUME(K.TrueKeyword)},{ALT:()=>t.CONSUME(K.FalseKeyword)},{ALT:()=>t.CONSUME(K.NullKeyword)},{ALT:()=>{t.OPTION(()=>{t.CONSUME(K.SheetName)}),t.OR1([{ALT:()=>t.CONSUME(K.Variable)},{ALT:()=>t.CONSUME(K.CellRef)},{ALT:()=>t.CONSUME(K.CellRange)},{ALT:()=>t.CONSUME(K.RowRange)},{ALT:()=>t.CONSUME(K.ColumnRange)}])}},{ALT:()=>t.SUBRULE(t.ifFunctionCall)},{ALT:()=>t.SUBRULE(t.functionCall)},{ALT:()=>t.CONSUME(K.ErrorConstant)},{ALT:()=>t.SUBRULE(t.ifErrorFunctionCall)},{ALT:()=>t.SUBRULE(t.ifsFunctionCall)},{ALT:()=>t.SUBRULE(t.switchFunctionCall)},{ALT:()=>{t.CONSUME(K.LParen),t.SUBRULE(t.expression),t.CONSUME(K.RParen)}}])}),t.RULE("ifFunctionCall",()=>{t.CONSUME(K.IfFunction),t.CONSUME(K.LParen),t.SUBRULE(t.expression,{LABEL:"condition"}),t.CONSUME1(K.Comma),t.SUBRULE2(t.expression,{LABEL:"whenTrue"}),t.OPTION(()=>{t.CONSUME2(K.Comma),t.SUBRULE3(t.expression,{LABEL:"whenFalse"})}),t.CONSUME(K.RParen)}),t.RULE("ifErrorFunctionCall",()=>{t.CONSUME(K.IfErrorFunction),t.CONSUME(K.LParen),t.SUBRULE(t.expression,{LABEL:"value"}),t.CONSUME1(K.Comma),t.SUBRULE2(t.expression,{LABEL:"valueIfError"}),t.CONSUME(K.RParen)}),t.RULE("ifsFunctionCall",()=>{t.CONSUME(K.IfsFunction),t.CONSUME(K.LParen),t.AT_LEAST_ONE(()=>{t.SUBRULE(t.expression,{LABEL:"condition"}),t.CONSUME1(K.Comma),t.SUBRULE2(t.expression,{LABEL:"value"}),t.OPTION(()=>t.CONSUME2(K.Comma))}),t.CONSUME(K.RParen)}),t.RULE("switchFunctionCall",()=>{t.CONSUME(K.SwitchFunction),t.CONSUME(K.LParen),t.SUBRULE(t.expression,{LABEL:"expression"}),t.CONSUME1(K.Comma),t.AT_LEAST_ONE(()=>{t.SUBRULE2(t.expression,{LABEL:"value"}),t.CONSUME2(K.Comma),t.SUBRULE3(t.expression,{LABEL:"result"}),t.OPTION(()=>t.CONSUME3(K.Comma))}),t.OPTION2(()=>{t.SUBRULE4(t.expression,{LABEL:"default"})}),t.CONSUME(K.RParen)}),t.RULE("functionCall",()=>{t.CONSUME(K.FunctionName),t.CONSUME(K.LParen),t.OPTION(()=>{t.SUBRULE(t.expression),t.MANY(()=>{t.CONSUME(K.Comma),t.SUBRULE2(t.expression)})}),t.CONSUME(K.RParen)}),t.RULE("arrayExpression",()=>{t.CONSUME(K.LParen),t.SUBRULE(t.arrayRow),t.MANY(()=>{t.CONSUME(K.ArrayRowSep),t.SUBRULE2(t.arrayRow)}),t.CONSUME(K.RParen)}),t.RULE("arrayRow",()=>{t.SUBRULE(t.expression),t.MANY(()=>{t.CONSUME(K.Comma),t.SUBRULE2(t.expression)})}),this.performSelfAnalysis()}parse(t){console.log("Parsing input:",t);const e=H.tokenize(t);if(console.log("Lexer result:",e.tokens),e.errors.length>0)throw console.error(e.errors),new Error("Lexer errors detected");this.input=e.tokens;const n=this.expression();if(this.errors.length>0)throw console.error(this.errors),new Error("Parsing errors detected");return n}}var $;!function(t){t.DIV_BY_ZERO="#DIV/0!",t.INVALID_NAME="#NAME?",t.INVALID_REF="#REF!",t.INVALID_VAL="#VALUE!",t.INVALID_NUM="#NUM!",t.NA="#N/A!",t.NULL="#NULL!",t.SPILL="#SPILL!",t.ERROR="#ERROR!"}($||($={}));class Z{constructor(t,e,n){this.values=t,this.rows=e,this.cols=n}getValue(t,e){if(t>=0&&t=0&&e[t]),t.length,1)}static fromHorizontalArray(t){return new Z([t],1,t.length)}static from2DArray(t){const e=t.length,n=e>0?Math.max(...t.map(t=>t.length)):0,r=t.map(t=>{const e=[...t];for(;e.length0?this.visit(t.arrayFormula[0]):this.visit(t.comparisonExpression[0])}arrayFormula(t){if(t.ArrayRowSep&&t.ArrayRowSep.length>0){const e=[];t.Comma&&t.Comma.forEach(t=>{e.push({offset:t.startOffset,type:"comma"})}),t.ArrayRowSep&&t.ArrayRowSep.forEach(t=>{e.push({offset:t.startOffset,type:"semicolon"})}),e.sort((t,e)=>t.offset-e.offset);const n=[];let r=[];for(let o=0;o0&&n.push(r),Z.from2DArray(n)}const e=t.expression.map(t=>this.visit(t));if(1===e.length){const t=e[0];return t instanceof Z?t:Array.isArray(t)?Z.fromHorizontalArray(t):Z.fromSingleValue(t)}return Z.fromHorizontalArray(e)}comparisonExpression(t){const e=this.visit(t.lhs[0]);if(!t.rhs||0===t.rhs.length)return e;const n=this.visit(t.rhs[0]);return t.GreaterThan?e>n:t.LessThan?e=n:t.LessThanEqual?e<=n:t.Equal?e===n:t.NotEqual?e!==n:e}additionExpression(t){let e=this.visit(t.lhs[0]);if(t.rhs&&t.rhs.length>0){const n=[];t.Plus&&t.Plus.forEach(t=>{n.push({type:"plus",offset:t.startOffset})}),t.Minus&&t.Minus.forEach(t=>{n.push({type:"minus",offset:t.startOffset})}),n.sort((t,e)=>t.offset-e.offset);for(let r=0;rt+e):"minus"===i.type&&(e=this.arrayOperation(e,o,(t,e)=>t-e))}}return e}arrayOperation(t,e,n){if(this.isError(t))return t;if(this.isError(e))return e;if(!Array.isArray(t)&&!Array.isArray(e))return n(t,e);const r=Array.isArray(t)?t:[t],o=Array.isArray(e)?e:[e],i=Math.max(r.length,o.length),a=[];for(let t=0;t0)for(let n=0;n0){const n=[];t.Mult&&t.Mult.forEach(t=>{n.push({type:"mult",offset:t.startOffset})}),t.Div&&t.Div.forEach(t=>{n.push({type:"div",offset:t.startOffset})}),n.sort((t,e)=>t.offset-e.offset);for(let r=0;rt*e):"div"===i.type&&(e=this.arrayOperation(e,o,(t,e)=>0===e?"#DIV/0!":t/e))}}return e}exponentiationExpression(t){let e=this.visit(t.lhs[0]);if(t.rhs&&t.rhs.length>0)for(let n=0;nMath.pow(t,e))}return e}unaryExpression(t){return t.Minus?-this.visit(t.unaryExpression[0]):this.visit(t.atomicExpression[0])}atomicExpression(t){if(t.NumberLiteral)return Number(t.NumberLiteral[0].image);if(t.StringLiteral){const e=t.StringLiteral[0].image;return e.substring(1,e.length-1)}if(t.TrueKeyword)return!0;if(t.FalseKeyword)return!1;if(t.NullKeyword)return null;if(t.ErrorConstant)return t.ErrorConstant[0].image;if(t.Variable||t.CellRef||t.CellRange||t.RowRange||t.ColumnRange){let e,n="";if(t.SheetName&&t.SheetName.length>0&&(n=t.SheetName[0].image,n=n.substring(0,n.length-1)),t.Variable&&t.Variable.length>0)return e=t.Variable[0].image,this.resolveVariable(e,n);if(t.CellRef&&t.CellRef.length>0)return e=t.CellRef[0].image,this.resolveCellReference(e,n);if(t.CellRange&&t.CellRange.length>0)return e=t.CellRange[0].image,this.resolveCellRange(e,n);if(t.RowRange&&t.RowRange.length>0)return e=t.RowRange[0].image,this.resolveRowRange(e,n);if(t.ColumnRange&&t.ColumnRange.length>0)return e=t.ColumnRange[0].image,this.resolveColumnRange(e,n)}return t.ifFunctionCall?this.visit(t.ifFunctionCall[0]):t.functionCall?this.visit(t.functionCall[0]):t.ifErrorFunctionCall?this.visit(t.ifErrorFunctionCall[0]):t.ifsFunctionCall?this.visit(t.ifsFunctionCall[0]):t.switchFunctionCall?this.visit(t.switchFunctionCall[0]):t.LParen?this.visit(t.expression[0]):(console.warn("Unhandled atomic expression:",t),null)}ifFunctionCall(t){const e=this.visit(t.condition[0]);return this.isTruthy(e)?this.visit(t.whenTrue[0]):!!(t.whenFalse&&t.whenFalse.length>0)&&this.visit(t.whenFalse[0])}functionCall(t){const e=t.FunctionName[0].image.toUpperCase(),n=[];if(t.expression)for(const e of t.expression)n.push(this.visit(e));if(this.context&&"function"==typeof this.context.callFunction)try{let t=this.context.callFunction(e,n);if(t instanceof Date){const e=new Date(1899,11,30).getTime(),n=864e5;t=Math.floor((t.getTime()-e)/n)}return t}catch(t){console.warn(`Function ${e} not found in callFunction, trying getFunction`)}if(this.context&&"function"==typeof this.context.getFunction){const t=this.context.getFunction(e);if("function"==typeof t)try{let e=t(...n);if(e instanceof Date){const t=new Date(1899,11,30).getTime(),n=864e5;e=Math.floor((e.getTime()-t)/n)}return e}catch(t){return console.error(`Error executing function ${e}:`,t),"#ERROR!"}}return this.executeBuiltInFunction(e,n)}ifErrorFunctionCall(t){try{const e=this.visit(t.value[0]);return this.isErrorValue(e)?this.visit(t.valueIfError[0]):e}catch(e){return this.visit(t.valueIfError[0])}}ifsFunctionCall(t){const e=t.condition,n=t.value;for(let t=0;t0?this.visit(t.default[0]):"#N/A"}arrayExpression(t){const e=[];if(e.push(this.visit(t.arrayRow[0])),t.arrayRow.length>1)for(let n=1;n1)for(let n=1;nArray.isArray(e)?t+this.flattenAndSum(e):isNaN(e)?t:t+Number(e),0);case"AVERAGE":let t=0;return e.forEach(e=>{if(Array.isArray(e)){const r=this.flattenArray(e);t+=r.reduce((t,e)=>t+(isNaN(e)?0:Number(e)),0),n+=r.filter(t=>!isNaN(t)).length}else isNaN(e)||(t+=Number(e),n++)}),n>0?t/n:"#DIV/0!";case"MAX":let r=-1/0;return e.forEach(t=>{if(Array.isArray(t)){const e=this.flattenArray(t),n=Math.max(...e.filter(t=>!isNaN(t)).map(Number));n>r&&(r=n)}else!isNaN(t)&&Number(t)>r&&(r=Number(t))}),r===-1/0?0:r;case"MIN":let o=1/0;return e.forEach(t=>{if(Array.isArray(t)){const e=this.flattenArray(t),n=Math.min(...e.filter(t=>!isNaN(t)).map(Number));n{if(Array.isArray(t)){const e=this.flattenArray(t);n+=e.filter(t=>!isNaN(t)).length}else isNaN(t)||n++}),n;case"CONCATENATE":return e.reduce((t,e)=>t+String(e),"");case"AND":return e.every(t=>this.isTruthy(t));case"OR":return e.some(t=>this.isTruthy(t));default:return"#NAME?"}}flattenAndSum(t){return Array.isArray(t)?t.reduce((t,e)=>Array.isArray(e)?t+this.flattenAndSum(e):t+(isNaN(e)?0:Number(e)),0):isNaN(t)?0:Number(t)}flattenArray(t){return t.reduce((t,e)=>Array.isArray(e)?t.concat(this.flattenArray(e)):t.concat(e),[])}parseInput(t){const e=t.startsWith("=")?t.substring(1):t,n=H.tokenize(e);Q.input=n.tokens;const r=Q.expression();if(Q.errors.length>0)throw console.error("Parser errors:",JSON.stringify(Q.errors,null,2)),Error("Parsing errors detected");return this.visit(r)}parseCst(t){return this.visit(t)}parse(t){try{return this.parseInput(t)}catch(e){return console.error("Parsing error for input:",t),console.error("Error details:",e),e instanceof Error&&console.error("Stack trace:",e.stack),$.ERROR}}}class tt{constructor(t,e){this.sheet=t,this._cells=[],this._address=e,this.parseAddress(e),this.loadCells()}parseAddress(t){const e=t=>t.replace(/\$/g,"");if(t.includes(":")){const[n,r]=t.split(":");this._startAddress=e(n.trim()),this._endAddress=e(r.trim())}else this._startAddress=e(t.trim()),this._endAddress=e(t.trim())}loadCells(){if(this.isSingleCell()){const t=this.sheet.getCellDirect(this._startAddress);this._cells=[t]}else this._cells=this.expandRange()}expandRange(){var t,e,n,r;const o=[],i=(null===(t=this._startAddress.match(/[A-Z]+/))||void 0===t?void 0:t[0])||"A",a=parseInt((null===(e=this._startAddress.match(/\d+/))||void 0===e?void 0:e[0])||"1"),s=(null===(n=this._endAddress.match(/[A-Z]+/))||void 0===n?void 0:n[0])||"A",u=parseInt((null===(r=this._endAddress.match(/\d+/))||void 0===r?void 0:r[0])||"1"),c=this.colToNum(i),l=this.colToNum(s),f=Math.min(a,u),h=Math.max(a,u),p=Math.min(c,l),d=Math.max(c,l);for(let t=f;t<=h;t++)for(let e=p;e<=d;e++){const n=this.numToCol(e)+t;o.push(this.sheet.getCellDirect(n))}return o}isSingleCell(){return this._startAddress===this._endAddress}get address(){return this._address}get cells(){return this._cells}get cell(){return this._cells[0]}get value(){var t,e;return this.isSingleCell()?null!==(e=null===(t=this._cells[0])||void 0===t?void 0:t.value)&&void 0!==e?e:null:this.getValues()}set value(t){this.isSingleCell()?this._cells[0].value=t:Array.isArray(t)?this.setValuesFromArray(t):this._cells.forEach(e=>e.value=t)}get formula(){return this.isSingleCell()?this._cells[0].formula:null}set formula(t){this.isSingleCell()?this._cells[0].formula=t:this._cells.forEach(e=>e.formula=t)}getValues(){var t,e,n,r;const o=(null===(t=this._startAddress.match(/[A-Z]+/))||void 0===t?void 0:t[0])||"A",i=parseInt((null===(e=this._startAddress.match(/\d+/))||void 0===e?void 0:e[0])||"1"),a=(null===(n=this._endAddress.match(/[A-Z]+/))||void 0===n?void 0:n[0])||"A",s=parseInt((null===(r=this._endAddress.match(/\d+/))||void 0===r?void 0:r[0])||"1"),u=this.colToNum(o),c=this.colToNum(a),l=[];let f=0;for(let t=i;t<=s;t++){const t=[];for(let e=u;e<=c;e++)t.push(this._cells[f++].value);l.push(t)}return l}setValues(t){let e=0;for(let n=0;nt.value)}calculate(){this._cells.forEach(t=>{t.formula&&t.calculate()})}get count(){return this._cells.length}get rows(){var t,e;const n=parseInt((null===(t=this._startAddress.match(/\d+/))||void 0===t?void 0:t[0])||"1");return parseInt((null===(e=this._endAddress.match(/\d+/))||void 0===e?void 0:e[0])||"1")-n+1}get columns(){var t,e;const n=(null===(t=this._startAddress.match(/[A-Z]+/))||void 0===t?void 0:t[0])||"A",r=(null===(e=this._endAddress.match(/[A-Z]+/))||void 0===e?void 0:e[0])||"A";return this.colToNum(r)-this.colToNum(n)+1}each(t){this._cells.forEach((e,n)=>t(e,n))}map(t){return this._cells.map((e,n)=>t(e,n))}filter(t){return this._cells.filter((e,n)=>t(e,n))}find(t){return this._cells.find((e,n)=>t(e,n))}getCellAt(t){return this._cells[t]}getCellAtPosition(t,e){const n=t*this.columns+e;return this._cells[n]}colToNum(t){let e=0;for(let n=0;n0;){const n=(t-1)%26;e=String.fromCharCode(65+n)+e,t=Math.floor((t-1)/26)}return e}getRange(t){return new tt(this.sheet,t)}clear(){this._cells.forEach(t=>{t.value=null,t.formula=""})}toString(){return this.isSingleCell()?`Range(${this._address})`:`Range(${this._address}) [${this.rows}x${this.columns}]`}}var et,nt,rt=n(5592);!function(t){t.CALCULATION_STARTED="calculation.started",t.CALCULATION_PAUSED="calculation.paused",t.CALCULATION_RESUMED="calculation.resumed",t.CALCULATION_FINISHED="calculation.finished",t.CELL_ADDED="cell.added",t.CELL_REMOVED="cell.removed",t.CELL_CREATED="CELL_CREATED",t.ELEMENT_ATTACHED="element.attached",t.ELEMENT_DETACHED="element.detached"}(et||(et={})),function(t){t.CALCULATION_STARTED="calculation.started",t.CALCULATION_PAUSED="calculation.paused",t.CALCULATION_RESUMED="calculation.resumed",t.CALCULATION_FINISHED="calculation.finished",t.CALCULATION_IDLE="calculation.idle"}(nt||(nt={}));var ot,it=n(1887);!function(t){t.TEXT="text",t.NUMBER="number",t.DATE="date",t.TIME="time",t.DATETIME="datetime",t.BOOLEAN="boolean",t.ERROR="error"}(ot||(ot={}));class at{static serialToDate(t){if("number"!=typeof t||isNaN(t))throw new Error("Invalid serial date: must be a number");const e=new Date(1899,11,30,0,0,0,0),n=t*at.MS_PER_DAY;return new Date(e.getTime()+n)}static dateToSerial(t){if(!(t instanceof Date)||isNaN(t.getTime()))throw new Error("Invalid date: must be a valid Date object");const e=new Date(1899,11,30,0,0,0,0),n=t.getTime()-e.getTime();return Math.floor(n/at.MS_PER_DAY)}static isValidSerialDate(t){return"number"==typeof t&&!isNaN(t)&&t>=-36522&&t<=2958465}static fromComponents(t,e,n){const r=new Date(t,e-1,n);return at.dateToSerial(r)}static toComponents(t){const e=at.serialToDate(t);return{year:e.getFullYear(),month:e.getMonth()+1,day:e.getDate(),weekday:e.getDay(),hours:e.getHours(),minutes:e.getMinutes(),seconds:e.getSeconds()}}static toISOString(t){return at.serialToDate(t).toISOString().split("T")[0]}static fromISOString(t){const e=new Date(t);if(isNaN(e.getTime()))throw new Error(`Invalid ISO date string: ${t}`);return at.dateToSerial(e)}static today(){const t=new Date;return t.setHours(0,0,0,0),at.dateToSerial(t)}static now(){return at.dateToSerial(new Date)}}at.EXCEL_EPOCH=new Date(1899,11,30).getTime(),at.MS_PER_DAY=864e5;class st{constructor(t,e,n=ot.NUMBER){this.sheet=e,this._type=n,this._rules={address:/^\$?[A-Z]+\$?[0-9]+$/},this.precedents={},this.dependents={},this.remotePrecedents={},this.remoteDependents={},this.dynamicPrecedents={},this._dirty=!1,this._calculated=!1,this._hasRemotePrecedents=!1,this._hasRemoteDependents=!1,this._hasDynamicPrecedents=!1,this._isArrayAnchor=!1,this.address=t,this.init()}init(){}mount(t){this.el=t,this.sheet.dispatcher.dispatch(it.X.ELEMENT_MOUNTED,{cell:this.address,el:t})}isError(){return Object.values($).includes(this.value)}isEmpty(){const t=this.formula?this._computed:this._value;return null==t||""===t}calculate(){if(!this._formula)return this._calculated=!0,this._dirty=!1,this._value;try{const t=this.sheet.eval(this._formula);if(t instanceof Z)return this.handleArrayResult(t);const e=this._computed!==t;return this._computed=t,this._calculated=!0,this._dirty=!1,this.sheet.dispatcher.dispatch(it.X.CALCULATED,{cell:this.address,value:this._computed}),e&&(this._markDependentsAsDirty(),this.sheet.autoCalculate&&this._recalculateDependents()),this._computed}catch(t){return console.error(`Error calculating cell ${this.address}:`,t),this._computed=$.ERROR,this._calculated=!0,this._dirty=!1,this._computed}}handleArrayResult(t){return this._isArrayAnchor=!0,this._arrayResult=t,t.isSingleValue()?(this._computed=t.getSingleValue(),this._calculated=!0,this._dirty=!1,this._computed):this.checkSpillRange(t)?(this.spillArray(t),this._computed=t.getValue(0,0),this._calculated=!0,this._dirty=!1,this._computed):(this._computed=$.SPILL,this._calculated=!0,this._dirty=!1,this._computed)}checkSpillRange(t){const{row:e,col:n}=this.getCellCoordinates(this.address);for(let r=0;r0;){const t=(r-1)%26;n=String.fromCharCode(65+t)+n,r=Math.floor((r-1)/26)}return n+t}isArrayAnchor(){return this._isArrayAnchor}getSpillRange(){return this._spillRange}setFormat(t){this.format=t}getFormat(){return this.format}setFormatter(t){this.formatter=t}getFormattedValue(){var t;return this.formatter?this.formatter.format(this.value):(null===(t=this.value)||void 0===t?void 0:t.toString())||""}isCalculated(){return this._calculated}isDirty(){return this._dirty}markAsDirty(){this._dirty=!0}isNumeric(){return!isNaN(this.value-parseFloat(this.value))}get address(){return this._address}set address(t){if(!t.match(this._rules.address))throw new Error("Cell address should follow spreadsheet like address rule");this._address=t}get type(){return this._type}set type(t){this._type=t}get formula(){return this._formula}set formula(t){const e=this._formula;this._formula=t,this.updateDynamicPrecedents(t),this.sheet.dispatcher.dispatch(it.X.FORMULA_CHANGED,{cell:this.address,oldFormula:e,newFormula:t});const n=this.getPrecedents();if(n)for(const t in n){const e=n[t];e&&e.removeDependent(this)}this.precedents={},this.markAsDirty(),this.sheet.workbook&&t&&this.rebuildDependencies()}rebuildDependencies(){if(!this._formula)return;const t=new(n(8377).B);t.setWorkbook(this.sheet.workbook);const{localDeps:e,remoteDeps:r}=t.getFormulaDependencies(this._formula),o={};for(const t in e){const e=this.sheet.getCellDirect(t);e&&(o[t]=e,e.addDependent(this))}this.setPrecedents(o);for(const e in r)try{const{sheetName:n,cellAddress:r}=t.parseRemoteReference(e),o=this.sheet.workbook.getSheet(n);if(o){const t=o.getCellDirect(r);t&&(t.addRemoteDependent(this),this.addRemotePrecedent(t))}}catch(t){}}get value(){let t=this.formula?this._computed:this._value;if("string"==typeof t&&Object.values($).includes(t))return t;switch(this._type){case ot.NUMBER:if(null==t||""===t)return 0;if("number"==typeof t)return t;const e=parseFloat(t);return isNaN(e)?t:e;case ot.BOOLEAN:return!!t;case ot.DATE:case ot.DATETIME:case ot.TIME:return t;case ot.ERROR:return $[t];default:return t}}set value(t){if("string"==typeof t&&this._type!==ot.TEXT){const e=t.trim();if(""!==e){const n=parseFloat(e);isNaN(n)||String(n)!==e||(t=n)}}if(this._type===ot.BOOLEAN&&"string"==typeof t){const e=t.trim().toUpperCase();"TRUE"===e?t=!0:"FALSE"===e&&(t=!1)}if(this._type===ot.DATE||this._type===ot.DATETIME)if("string"==typeof t&&""!==t.trim())try{const e=t.match(/^(\d{4})-(\d{2})-(\d{2})/);if(e){const n=parseInt(e[1],10),r=parseInt(e[2],10)-1,o=parseInt(e[3],10),i=new Date(n,r,o);t=at.dateToSerial(i)}else{const e=new Date(t);isNaN(e.getTime())||(t=at.dateToSerial(e))}}catch(t){}else t instanceof Date&&(t=at.dateToSerial(t));this._value=t,this._formula="",this.sheet.dispatcher.dispatch(it.X.VALUE_CHANGED,{cell:this.address,value:t}),this._markDependentsAsDirty(),this.sheet.invalidateDynamicDependents(this.address),this.sheet.autoCalculate&&(this._recalculateDependents(),this.sheet.recalculateDirtyCells())}_markDependentsAsDirty(){const t=this.getDependents();for(const e in t){const n=t[e];n.markAsDirty(),n._markDependentsAsDirty()}}_recalculateDependents(){const t=this.getDependents();for(const e in t){const n=t[e];n.calculate(),n._recalculateDependents()}}getStringValue(){return this.value.toString()}getNumericValue(){return isNaN(parseFloat(this.value))?0:parseFloat(this.value)}getDateValue(){if(this._type!==ot.DATE&&this._type!==ot.DATETIME&&this._type!==ot.TIME)return null;const t=this.value;if(t instanceof Date)return t;if("number"==typeof t&&at.isValidSerialDate(t))return at.serialToDate(t);if("string"==typeof t){const e=new Date(t);if(!isNaN(e.getTime()))return e}return null}getSerialDateValue(){if(this._type!==ot.DATE&&this._type!==ot.DATETIME&&this._type!==ot.TIME)return null;const t=this.value;if("number"==typeof t&&at.isValidSerialDate(t))return t;if(t instanceof Date)return at.dateToSerial(t);if("string"==typeof t)try{return at.fromISOString(t)}catch(t){return null}return null}setDateValue(t){if(!(t instanceof Date)||isNaN(t.getTime()))throw new Error("Invalid date: must be a valid Date object");this._type=ot.DATE,this.value=at.dateToSerial(t)}setSerialDateValue(t){if(!at.isValidSerialDate(t))throw new Error("Invalid serial date: must be a valid number");this._type=ot.DATE,this.value=t}getFormattedDate(){const t=this.getSerialDateValue();return null===t?null:at.toISOString(t)}isDate(){return this._type===ot.DATE||this._type===ot.DATETIME||this._type===ot.TIME}getPrecedents(){return this._hasDynamicPrecedents?null:this.precedents}setPrecedents(t){this.precedents=t}addPrecedent(t){this.precedents[t.address]=t}getDependents(){return Object.assign(Object.assign({},this.dependents),this.remoteDependents)}setDependents(t){this.dependents=t}addDependent(t){this.dependents[t.address]=t}removeDependent(t){delete this.dependents[t.address]}addRemoteDependent(t){const e=t.sheet.name+"!"+t.address;this.remoteDependents[e]=t,this._hasRemoteDependents=!0}addRemotePrecedent(t){const e=t.sheet.name+"!"+t.address;this.remotePrecedents[e]=t}updateDynamicPrecedents(t){if(!t)return this.dynamicPrecedents={},void(this._hasDynamicPrecedents=!1);const e=[],n=[],r=/\b([A-Z]+)\s*:\s*([A-Z]+)\b/g;let o;for(;null!==(o=r.exec(t));)e.push(o[0]);const i=/\b(\d+)\s*:\s*(\d+)\b/g;for(;null!==(o=i.exec(t));){const e=t[o.index-1];e&&/[A-Z]/i.test(e)||n.push(o[0])}this.dynamicPrecedents={},e.length>0&&(this.dynamicPrecedents.columnRanges=e),n.length>0&&(this.dynamicPrecedents.rowRanges=n),this._hasDynamicPrecedents=e.length>0||n.length>0}hasDynamicPrecedents(){return this._hasDynamicPrecedents}dependsOnColumn(t){if(!this._hasDynamicPrecedents||!this.dynamicPrecedents.columnRanges)return!1;const e=this.columnToNumber(t);return this.dynamicPrecedents.columnRanges.some(t=>{const[n,r]=t.split(":").map(t=>this.columnToNumber(t.trim()));return e>=n&&e<=r})}dependsOnRow(t){return!(!this._hasDynamicPrecedents||!this.dynamicPrecedents.rowRanges)&&this.dynamicPrecedents.rowRanges.some(e=>{const[n,r]=e.split(":").map(t=>parseInt(t.trim()));return t>=n&&t<=r})}columnToNumber(t){let e=0;for(let n=0;n=0;)e=String.fromCharCode(t%26+97)+e,t=Math.floor(t/26)-1;return e.toUpperCase()}function ft(t){const e=t.toUpperCase().split(""),n="ABCDEFGHIJKLMNOPQRSTUVWXYZ".split("");let r,o,i=0;for(r=0,o=e.length-1;r0;)1&e&&(n+=t),e>>=1,t+=t;return n}function mt(t,e,n){if(null==t)return"";if(e=~~e,null==n)return dt(String(t),e);for(var r=[];e>0;r[--e]=t);return r.join(n)}function gt(t){return t.reduce(function(t,e){return t.indexOf(e)<0&&t.push(e),t},[])}function vt(t,e,n){return Array.prototype.slice.call(t,0,Math.max(0,t.length-(null==e||n?1:e)))}function yt(t,e,n){return Array.prototype.slice.call(t,null==e||n?1:e)}function Et(t){let e=[];for(let n=0;n{const s=ft(o.toUpperCase()),u=parseInt(a),c="$"===i?u:u+e;return`${r}${lt("$"===r?s:s+n)}${i}${c}`}),"="+r}function It(t,e,n,r,o,i,a,s,u){if(!t.startsWith("="))return t;const c=ft(e),l=ft(r),f=ft(i),h=ft(s),p=Math.min(n,o),d=Math.max(n,o),m=Math.min(c,l),g=Math.max(c,l),v=Math.min(a,u),y=Math.max(a,u),E=Math.min(f,h),T=Math.max(f,h);let A=t.substring(1);return A=A.replace(/(?{const c=ft(n.toUpperCase()),l=parseInt(o),f=ft(a.toUpperCase()),h=parseInt(u),A=Math.min(c,f),_=Math.max(c,f),N=Math.min(l,h),R=Math.max(l,h);if(A===m&&_===g&&N===p&&R===d){const t=lt(E),n=lt(T);return`${e}${t}${r}${v}:${i}${n}${s}${y}`}return t}),A=A.replace(/(?{const i=ft(n.toUpperCase()),a=parseInt(o);if(i>=m&&i<=g&&a>=p&&a<=d){const t=v+(a-p);return`${e}${lt(E+(i-m))}${r}${t}`}return t}),"="+A}class St{constructor(t,e,n=new rt.Q){this._states={calculation:nt.CALCULATION_IDLE},this._variables={},this._autoCalculate=!0,this.workbook=t,this.name=e,this.dispatcher=n,this._id=this._generateId(),this._cells=new ut(this,this.dispatcher)}_generateId(){return"xxxx-xxxx-xxx-xxxx".replace(/[x]/g,t=>Math.floor(16*Math.random()).toString(16))}get autoCalculate(){return this._autoCalculate}set autoCalculate(t){this._autoCalculate=t}recalculateDirtyCells(){const t=this._autoCalculate;this._autoCalculate=!1,this._cells.each(t=>{t.isDirty()&&t.calculate()}),this._autoCalculate=t}set element(t){t.setAttribute("data-calx-id",this.id),this._el=t,this.dispatcher.dispatch(et.ELEMENT_ATTACHED,{sheet:this,el:t})}get element(){return this._el}get id(){return this._id}get cells(){return this._cells.all()}listen(t,e){this.dispatcher.listen(t,e)}calculate(t={withoutEvent:!1}){if(t.withoutEvent&&this.dispatcher.pauseListener(),this._depTree){const t=this._depTree.topologicalSort();for(const e of t)if(e)for(const t of e)!t.isDirty()&&t.isCalculated()||t.calculate();this._cells.each(t=>{!t.hasDynamicPrecedents()||!t.isDirty()&&t.isCalculated()||t.calculate()})}else for(const t in this.cells)this.cells[t].calculate();this.dispatcher.resumeListener()}requestCalculate(t){const e=this.getCell(t);if(e){e.markAsDirty(),e.calculate();const t=e.getDependents();for(const e in t)t[e].markAsDirty()}}getRange(t){return new tt(this,t)}getCellDirect(t){return this._cells.get(t)}getCell(t){return this._cells.get(t)}getCellValue(t){return this.getRange(t).value}createCell(t,e){const n=this._cells.create(t,e||{});return this.invalidateDynamicDependents(t),n}eval(t){return this.workbook.setActiveSheet(this),this.workbook.parser.parse(t)}buildDependencyTree(){const t=new ct.B;t.setWorkbook(this.workbook),this._depTree=t.build(this._cells)}invalidateDynamicDependents(t){const e=t.match(/^([A-Z]+)(\d+)$/);if(!e)return;const n=e[1],r=parseInt(e[2]);this._cells.each(t=>{t.hasDynamicPrecedents()&&(t.dependsOnColumn(n)||t.dependsOnRow(r))&&t.markAsDirty()})}getVariable(t){return void 0!==this._variables[t]?this._variables[t]:"#NAME?"}setVariable(t,e){this._variables[t]=e}getCellRangeValues(t,e){const n=t.match(/[A-Z]+/),r=t.match(/\d+/),o=e.match(/[A-Z]+/),i=e.match(/\d+/);if(!(n&&r&&o&&i))throw new Error(`Invalid cell range: ${t}:${e}`);const a=n[0],s=parseInt(r[0]),u=o[0],c=parseInt(i[0]),l=[],f=t=>{let e=0;for(let n=0;n{let e="";for(;t>0;){const n=(t-1)%26;e=String.fromCharCode(65+n)+e,t=Math.floor((t-1)/26)}return e},p=f(a),d=f(u);for(let t=s;t<=c;t++)for(let e=p;e<=d;e++){const n=h(e)+t,r=this._cells.get(n);l.push(r?r.value:null)}return l}getRowRangeValues(t){const e=t.replace(/\$/g,"").split(":"),n=parseInt(e[0]),r=parseInt(e[1]),o=[],i=this._cells.all();for(const t in i){const e=t.match(/(\d+)$/);if(e){const a=parseInt(e[1]);a>=n&&a<=r&&o.push(i[t].value)}}return o}getColumnRangeValues(t){const e=t.replace(/\$/g,"").split(":"),[n,r]=e,o=t=>{let e=0;for(let n=0;n=i&&n<=a&&s.push(u[t].value)}}return s}loadArray(t,e){if(!Array.isArray(t)||0===t.length)throw new Error("Data must be a non-empty 2D array");const n=e.match(/^([A-Z]+)(\d+)$/i);if(!n)throw new Error(`Invalid anchor address: ${e}`);const r=n[1].toUpperCase(),o=parseInt(n[2]),i=ft(r),a=o-1,s=i-1;for(let e=0;e{if(this._cells.has(t)){const e=this._cells.get(t);x.push({address:t,value:e.value,formula:e.formula})}}),b.forEach(t=>{if(this._cells.has(t)){const e=this._cells.get(t);this._cells.remove(e)}}),x.forEach(t=>{var e,n;const r=t.address,o=(null===(e=r.match(/[A-Z]+/))||void 0===e?void 0:e[0])||"A",i=parseInt((null===(n=r.match(/\d+/))||void 0===n?void 0:n[0])||"1"),a=ft(o),s=i+I,u=`${lt(a+S)}${s}`;if(this._cells.has(u)){const t=this._cells.get(u);this._cells.remove(t)}let c=t.formula;c&&(c=Ot(c,I,S)),c?this.createCell(u,{formula:c}):this.createCell(u,{value:t.value})}),this._cells.each(t=>{if(!(t.address>=lt(_)+v&&t.address<=lt(N)+R)&&t.formula){const e=It(t.formula,f,h,p,d,g,v,O,R);e!==t.formula&&(t.formula=e)}}),this.buildDependencyTree()}copyRange(t,e){var n,r,o,i,a,s;const u=t.includes(":")?t.split(":"):[t,t],c=u[0].trim().replace(/\$/g,""),l=u[1].trim().replace(/\$/g,""),f=(null===(n=c.match(/[A-Z]+/))||void 0===n?void 0:n[0])||"A",h=parseInt((null===(r=c.match(/\d+/))||void 0===r?void 0:r[0])||"1"),p=(null===(o=l.match(/[A-Z]+/))||void 0===o||o[0],parseInt((null===(i=l.match(/\d+/))||void 0===i?void 0:i[0])||h.toString()),e.replace(/\$/g,"")),d=(null===(a=p.match(/[A-Z]+/))||void 0===a?void 0:a[0])||"A",m=parseInt((null===(s=p.match(/\d+/))||void 0===s?void 0:s[0])||"1"),g=ft(f),v=ft(d),y=m-h,E=v-g,T=ht(c===l?`${c}:${l}`:t),A=[];T.forEach(t=>{var e,n;if(this._cells.has(t)){const r=this._cells.get(t),o=(null===(e=t.match(/[A-Z]+/))||void 0===e?void 0:e[0])||"A",i=parseInt((null===(n=t.match(/\d+/))||void 0===n?void 0:n[0])||"1"),a=ft(o),s=i+y,u=`${lt(a+E)}${s}`;A.push({srcAddr:t,dstAddr:u,value:r.value,formula:r.formula})}}),A.forEach(t=>{if(this._cells.has(t.dstAddr)){const e=this._cells.get(t.dstAddr);this._cells.remove(e)}let e=t.formula;e&&(e=Ot(e,y,E)),e?this.createCell(t.dstAddr,{formula:e}):this.createCell(t.dstAddr,{value:t.value})}),this.buildDependencyTree()}}var bt=n(4809),xt=n(6572);const Ct=new Error("#NULL!"),Mt=new Error("#DIV/0!"),Lt=new Error("#VALUE!"),Pt=new Error("#REF!"),wt=new Error("#NAME?"),Dt=new Error("#NUM!"),kt=new Error("#N/A"),Ft=new Error("#ERROR!"),Ut=new Error("#GETTING_DATA");function jt(t){return t&&t.reduce?t.reduce((t,e)=>{const n=Array.isArray(t),r=Array.isArray(e);return n&&r?t.concat(e):n?(t.push(e),t):r?[t].concat(e):[t,e]}):[t]}function Vt(t){if(!t)return!1;for(let e=0;e{e.push(t)}),e}function Wt(){return Bt.apply(null,arguments).filter(t=>"number"==typeof t)}function zt(t){const e=1e14;return Math.round(t*e)/e}function qt(t){if("boolean"==typeof t)return t;if(t instanceof Error)return t;if("number"==typeof t)return 0!==t;if("string"==typeof t){const e=t.toUpperCase();if("TRUE"===e)return!0;if("FALSE"===e)return!1}return t instanceof Date&&!isNaN(t)||Lt}function Yt(t){return t instanceof Error?t:null==t||""===t?0:("boolean"==typeof t&&(t=+t),isNaN(t)?Lt:parseFloat(t))}function Kt(t){return t instanceof Error?t:null==t?"":t.toString()}function Ht(t){let e,n;if(!t||0===(e=t.length))return Lt;for(;e--;){if(t[e]instanceof Error)return t[e];if(n=Yt(t[e]),n instanceof Error)return n;t[e]=n}return t}function Xt(t){if(!isNaN(t)){if(t instanceof Date)return new Date(t);const e=parseFloat(t);return e<0||e>=2958466?Dt:function(t){t<60&&(t+=1);const e=Math.floor(t-25569),n=new Date(86400*e*1e3),r=t-Math.floor(t)+1e-7;let o=Math.floor(86400*r);const i=o%60;o-=i;const a=Math.floor(o/3600),s=Math.floor(o/60)%60;let u=n.getUTCDate(),c=n.getUTCMonth();return t>=60&&t<61&&(u=29,c=1),new Date(n.getUTCFullYear(),c,u,a,s,i)}(e)}return"string"!=typeof t||(t=/(\d{4})-(\d\d?)-(\d\d?)$/.test(t)?new Date(t+"T00:00:00.000"):new Date(t),isNaN(t))?Lt:t}function $t(t){let e,n=t.length;for(;n--;){if(e=Xt(t[n]),e===Lt)return e;t[n]=e}return t}function Zt(){for(let t=0;to||s===o&&u0?e+"Y":"",n=n>0?n+"M":"",r=r>0?r+"D":"",o=o>0?o+"H":"",i=i>0?i+"M":"",a=a>0?a+"S":"","P"+e+n+r+"T"+o+i+a}function Ee(t){if((t=Xt(t))instanceof Error)return t;(t=he(t)).setDate(t.getDate()+4-(t.getDay()||7));const e=new Date(t.getFullYear(),0,1);return Math.ceil(((t-e)/864e5+1)/7)}function Te(t){return(t=Xt(t))instanceof Error?t:t.getMinutes()}function Ae(t){return(t=Xt(t))instanceof Error?t:t.getMonth()+1}function _e(t,e,n){return _e.INTL(t,e,1,n)}function Ne(){return new Date}function Re(t){return(t=Xt(t))instanceof Error?t:t.getSeconds()}function Oe(t,e,n){return Jt(t=Yt(t),e=Yt(e),n=Yt(n))?Lt:t<0||e<0||n<0?Dt:(3600*t+60*e+n)/86400}function Ie(t){return(t=Xt(t))instanceof Error?t:(3600*t.getHours()+60*t.getMinutes()+t.getSeconds())/86400}function Se(){return he(new Date)}function be(t,e){if((t=Xt(t))instanceof Error)return t;void 0===e&&(e=1);const n=t.getDay();return ae[e][n]}function xe(t,e){if((t=Xt(t))instanceof Error)return t;if(void 0===e&&(e=1),21===e)return Ee(t);const n=ie[e];let r=new Date(t.getFullYear(),0,1);const o=r.getDay(){const n=t.getFullYear(),r=new Date(n,2,1);if(Le(n)&&t=r)return!0;const o=e.getFullYear(),i=new Date(o,2,1);return Le(o)&&e>=i&&ts||o===s&&r>=a))return(i===u&&Le(i)||n(t,e)||1===s&&29===a)&&(c=366),Pe(t,e)/c;const l=u-i+1,f=(new Date(u+1,0,1)-new Date(i,0,1))/1e3/60/60/24/l;return Pe(t,e)/f}case 2:return Pe(t,e)/360;case 3:return Pe(t,e)/365;case 4:return(a+30*s+360*u-(r+30*o+360*i))/360}}function De(t){const e=t>-22038912e5?2:1;return Math.ceil((t-oe)/864e5)+e}_e.INTL=(t,e,n,r)=>{if((t=Xt(t))instanceof Error)return t;if((e=Xt(e))instanceof Error)return e;let o=!1;const i=[],a=[1,2,3,4,5,6,0],s=new RegExp("^[0|1]{7}$");if(void 0===n)n=se[1];else if("string"==typeof n&&s.test(n)){o=!0,n=n.split("");for(let t=0;t0?l.getUTCDay():l.getDay();let e=o?i.includes(t):t===n[0]||t===n[1];for(let t=0;t{if((t=Xt(t))instanceof Error)return t;if((e=Yt(e))instanceof Error)return e;if(e<0)return Dt;if(!((n=void 0===n?se[1]:se[n])instanceof Array))return Lt;void 0===r?r=[]:r instanceof Array||(r=[r]);for(let t=0;t",">=","<","<=","=","<>"],Ue="operator",je="literal",Ve=[Ue,je],Be=Ue,Ge=je;function We(t,e){if(-1===Ve.indexOf(e))throw new Error("Unsupported token type: "+e);return{value:t,type:e}}function ze(t){return function(t){let e="";const n=[];for(let r=0;r=0?n.push(We(o,Be)):e+=o}return e.length>0&&n.push(We(function(t){return"string"!=typeof t||/^\d+(\.\d+)?$/.test(t)&&(t=-1===t.indexOf(".")?parseInt(t,10):parseFloat(t)),t}(e),Ge)),n.length>0&&n[0].type!==Be&&n.unshift(We(ke,Be)),n}(function(t){const e=t.length,n=[];let r=0,o="",i="";for(;r":case"<":case"=":i+=e,o.length>0&&(n.push(o),o="");break;default:i.length>0&&(n.push(i),i=""),o+=e}r++}return o.length>0&&n.push(o),i.length>0&&n.push(i),n}(t))}const qe=function(t){const e=[];let n;for(let r=0;r":n=t[0]>t[1];break;case">=":n=t[0]>=t[1];break;case"<":n=t[0]":n=t[0]!=t[1]}return n}(e,n)};function Ye(){throw new Error("CELL is not implemented")}const Ke={};function He(){throw new Error("INFO is not implemented")}function Xe(t){return null===t}function $e(t){return/^[01]{1,10}$/.test(t)}function Ze(t){return[Lt,Pt,Mt,Dt,wt,Ct].indexOf(t)>=0||"number"==typeof t&&(isNaN(t)||!isFinite(t))}function Qe(t){return Ze(t)||t===kt}function Je(t){return!(1&Math.floor(Math.abs(t)))}function tn(){throw new Error("ISFORMULA is not implemented")}function en(t){return!0===t||!1===t}function nn(t){return t===kt}function rn(t){return"string"!=typeof t}function on(t){return"number"==typeof t&&!isNaN(t)&&isFinite(t)}function an(t){return!!(1&Math.floor(Math.abs(t)))}function sn(){throw new Error("ISREF is not implemented")}function un(t){return"string"==typeof t}function cn(t){return on(t)?t:t instanceof Date?t.getTime():!0===t?1:!1===t?0:Qe(t)?t:0}function ln(){return kt}function fn(){throw new Error("SHEET is not implemented")}function hn(){throw new Error("SHEETS is not implemented")}function pn(t){return on(t)?1:un(t)?2:en(t)?4:Qe(t)?16:Array.isArray(t)?64:void 0}function dn(){if(arguments.length<2)return kt;const t=arguments[0];return t<1||t>254||arguments.lengtho.map(t=>t[e])):Lt,n,r);var o}function yn(t,e,n){const r=Zt(t,e,n);if(r)return r;if(!Array.isArray(t))return Lt;const o=t.length>0&&!Array.isArray(t[0]);return o&&!n?(n=e,e=1):(n=n||1,e=e||1),n<0||e<0?Lt:o&&1===e&&n<=t.length?t[n-1]:e<=t.length&&n<=t[e-1].length?t[e-1][n-1]:Pt}function En(t,e,n){e=Bt(e),n=n?Bt(n):e;const r="number"==typeof t;let o=kt;for(let i=0;it)return o}return o}function Tn(t,e,n){if(!t||!e)return kt;if(2===arguments.length&&(n=1),!((e=Bt(e))instanceof Array))return kt;if(-1!==n&&0!==n&&1!==n)return kt;let r,o;for(let i=0;io&&(r=i+1,o=e[i]):(r=i+1,o=e[i]))}else if(0===n){if("string"==typeof t&&"string"==typeof e[i]){const n=t.toLowerCase().replace(/\?/g,".").replace(/\*/g,".*").replace(/~/g,"\\");if(new RegExp("^"+n+"$").test(e[i].toLowerCase()))return i+1}else if(e[i]===t)return i+1}else if(-1===n){if(e[i]===t)return i+1;e[i]>t&&(o?e[i]t&&(a=!0)}return o}Ke.TYPE=t=>{switch(t){case Ct:return 1;case Mt:return 2;case Lt:return 3;case Pt:return 4;case wt:return 5;case Dt:return 6;case kt:return 7;case Ut:return 8}return kt};const On=2.5066282746310002;function In(){const t=Bt(arguments).filter(Qt);if(0===t.length)return Dt;const e=Ht(t);return e instanceof Error?e:xt.sum(xt(e).subtract(xt.mean(e)).abs()[0])/e.length}function Sn(){const t=Bt(arguments).filter(Qt);if(0===t.length)return Mt;const e=Zt.apply(void 0,t);if(e)return e;const n=Wt(t),r=n.length;let o,i=0,a=0;for(let t=0;t(r=void 0===r?0:r,o=void 0===o?1:o,Jt(t=Yt(t),e=Yt(e),n=Yt(n),r=Yt(r),o=Yt(o))?Lt:xt.beta.inv(t,e,n)*(o-r)+r)},Ln={DIST:(t,e,n,r)=>Jt(t=Yt(t),e=Yt(e),n=Yt(n),r=Yt(r))?Lt:r?xt.binomial.cdf(t,e,n):xt.binomial.pdf(t,e,n)};Ln.DIST.RANGE=(t,e,n,r)=>{if(r=void 0===r?n:r,Jt(t=Yt(t),e=Yt(e),n=Yt(n),r=Yt(r)))return Lt;let o=0;for(let i=n;i<=r;i++)o+=ao(t,i)*Math.pow(e,i)*Math.pow(1-e,t-i);return o},Ln.INV=(t,e,n)=>{if(Jt(t=Yt(t),e=Yt(e),n=Yt(n)))return Lt;let r=0;for(;r<=t;){if(xt.binomial.cdf(r,t,e)>=n)return r;r++}};const Pn={DIST:(t,e,n)=>Jt(t=Yt(t),e=Yt(e))?Lt:n?xt.chisquare.cdf(t,e):xt.chisquare.pdf(t,e)};Pn.DIST.RT=(t,e)=>!t|!e?kt:t<1||e>Math.pow(10,10)?Dt:"number"!=typeof t||"number"!=typeof e?Lt:1-xt.chisquare.cdf(t,e),Pn.INV=(t,e)=>Jt(t=Yt(t),e=Yt(e))?Lt:xt.chisquare.inv(t,e),Pn.INV.RT=(t,e)=>!t|!e?kt:t<0||t>1||e<1||e>Math.pow(10,10)?Dt:"number"!=typeof t||"number"!=typeof e?Lt:xt.chisquare.inv(1-t,e),Pn.TEST=function(t,e){if(2!==arguments.length)return kt;if(!(t instanceof Array&&e instanceof Array))return Lt;if(t.length!==e.length)return Lt;if(t[0]&&e[0]&&t[0].length!==e[0].length)return Lt;const n=t.length;let r,o,i;for(o=0;o=2;)n=n*t/r,r-=2;let o=n,i=e;for(;o>1e-10*n;)i+=2,o=o*t/i,n+=o;return 1-n}(u,s))/1e6};const wn={};function Dn(t,e){return Jt(t=Ht(Bt(t)),e=Ht(Bt(e)))?Lt:xt.corrcoeff(t,e)}function kn(){return Wt(Bt(arguments)).length}function Fn(){const t=Bt(arguments);return t.length-jn(t)}function Un(t,e){let n=0;t=Bt(t);for(let r=0;rJt(t=Yt(t),e=Yt(e),n=Yt(n))?Lt:xt.normalci(1,t,e,n)[1]-1,wn.T=(t,e,n)=>Jt(t=Yt(t),e=Yt(e),n=Yt(n))?Lt:xt.tci(1,t,e,n)[1]-1;const Wn={};function zn(){const t=Ht(Bt(arguments));if(t instanceof Error)return t;const e=xt.mean(t);let n=0;for(let r=0;r{if(Jt(t=Ht(Bt(t)),e=Ht(Bt(e))))return Lt;const n=xt.mean(t),r=xt.mean(e);let o=0;const i=t.length;for(let a=0;aJt(t=Ht(Bt(t)),e=Ht(Bt(e)))?Lt:xt.covariance(t,e);const qn={DIST:(t,e,n)=>Jt(t=Yt(t),e=Yt(e))?Lt:n?xt.exponential.cdf(t,e):xt.exponential.pdf(t,e)},Yn={};function Kn(t){return(t=Yt(t))instanceof Error?t:Math.log((1+t)/(1-t))/2}function Hn(t){if((t=Yt(t))instanceof Error)return t;const e=Math.exp(2*t);return(e-1)/(e+1)}function Xn(t,e,n){if(Jt(t=Yt(t),e=Ht(Bt(e)),n=Ht(Bt(n))))return Lt;const r=xt.mean(n),o=xt.mean(e),i=n.length;let a=0,s=0;for(let t=0;te[i-1]&&t[a]<=e[i]&&(o[i]+=1):i===r&&t[a]>e[r-1]&&(o[r]+=1)}return o}function Zn(t){return(t=Yt(t))instanceof Error?t:0===t||parseInt(t,10)===t&&t<0?Dt:xt.gammafn(t)}function Qn(t){return(t=Yt(t))instanceof Error?t:xt.gammaln(t)}function Jn(t){return(t=Yt(t))instanceof Error?t:xt.normal.cdf(t,0,1)-.5}function tr(){const t=Ht(Bt(arguments));return t instanceof Error?t:xt.geomean(t)}function er(t,e,n,r){if((t=Ht(t))instanceof Error)return t;let o;if(void 0===e)for(e=[],o=1;o<=t.length;o++)e.push(o);if(void 0===n)for(n=[],o=1;o<=t.length;o++)n.push(o);if(Jt(e=Ht(e),n=Ht(n)))return Lt;void 0===r&&(r=!0);const i=t.length;let a,s,u=0,c=0,l=0,f=0;for(o=0;oJt(t=Yt(t),e=Yt(e),n=Yt(n))?Lt:r?xt.centralF.cdf(t,e,n):xt.centralF.pdf(t,e,n),Yn.DIST.RT=function(t,e,n){return 3!==arguments.length?kt:t<0||e<1||n<1?Dt:"number"!=typeof t||"number"!=typeof e||"number"!=typeof n?Lt:1-xt.centralF.cdf(t,e,n)},Yn.INV=(t,e,n)=>Jt(t=Yt(t),e=Yt(e),n=Yt(n))?Lt:t<=0||t>1?Dt:xt.centralF.inv(t,e,n),Yn.INV.RT=function(t,e,n){return 3!==arguments.length?kt:t<0||t>1||e<1||e>Math.pow(10,10)||n<1||n>Math.pow(10,10)?Dt:"number"!=typeof t||"number"!=typeof e||"number"!=typeof n?Lt:xt.centralF.inv(1-t,e,n)},Yn.TEST=(t,e)=>{if(!t||!e)return kt;if(!(t instanceof Array&&e instanceof Array))return kt;if(t.length<2||e.length<2)return Mt;const n=(t,e)=>{let n=0;for(let r=0;r1||e<=0||n<=0?Dt:"number"!=typeof t||"number"!=typeof e||"number"!=typeof n?Lt:xt.gamma.inv(t,e,n)},Qn.PRECISE=function(t){return 1!==arguments.length?kt:t<=0?Dt:"number"!=typeof t?Lt:xt.gammaln(t)};const rr={};function or(t,e){return Jt(t=Ht(t),e=Ht(e))?Lt:t.length!==e.length?kt:Xn(0,t,e)}function ir(){const t=Ht(Bt(arguments));if(t instanceof Error)return t;const e=xt.mean(t),n=t.length;let r=0;for(let o=0;oe-t)[e-1]}function sr(t,e){if(Jt(t=Ht(Bt(t)),e=Ht(Bt(e))))return Lt;const n=xt.mean(t),r=xt.mean(e),o=e.length;let i=0,a=0;for(let s=0;s{if(Jt(t=Yt(t),e=Yt(e),n=Yt(n),r=Yt(r)))return Lt;function i(t,e,n,r){return ao(n,t)*ao(r-n,e-t)/ao(r,e)}return o?function(t,e,n,r){let o=0;for(let a=0;a<=t;a++)o+=i(a,e,n,r);return o}(t,e,n,r):i(t,e,n,r)};const cr={};function lr(){const t=Bt(arguments),e=Zt.apply(void 0,t);if(e)return e;const n=Wt(t);return 0===n.length?0:Math.max.apply(Math,n)}function fr(){const t=Bt(arguments),e=Zt.apply(void 0,t);if(e)return e;let n=ee(t);return n=n.map(t=>null==t?0:t),0===n.length?0:Math.max.apply(Math,n)}function hr(){const t=Bt(arguments),e=Zt.apply(void 0,t);if(e)return e;const n=ee(t);let r=xt.median(n);return isNaN(r)&&(r=Dt),r}function pr(){const t=Bt(arguments),e=Zt.apply(void 0,t);if(e)return e;const n=Wt(t);return 0===n.length?0:Math.min.apply(Math,n)}function dr(){const t=Bt(arguments),e=Zt.apply(void 0,t);if(e)return e;let n=ee(t);return n=n.map(t=>null==t?0:t),0===n.length?0:Math.min.apply(Math,n)}cr.DIST=(t,e,n,r)=>Jt(t=Yt(t),e=Yt(e),n=Yt(n))?Lt:r?xt.lognormal.cdf(t,e,n):xt.lognormal.pdf(t,e,n),cr.INV=(t,e,n)=>Jt(t=Yt(t),e=Yt(e),n=Yt(n))?Lt:xt.lognormal.inv(t,e,n);const mr={MULT:function(){const t=Ht(Bt(arguments));if(t instanceof Error)return t;const e=t.length,n={};let r,o=[],i=0;for(let a=0;ai&&(i=n[r],o=[]),n[r]===i&&(o[o.length]=r);return o},SNGL:function(){const t=Ht(Bt(arguments));return t instanceof Error?t:mr.MULT(t).sort((t,e)=>t-e)[0]}},gr={DIST:(t,e,n,r)=>Jt(t=Yt(t),e=Yt(e),n=Yt(n))?Lt:r?xt.negbin.cdf(t,e,n):xt.negbin.pdf(t,e,n)},vr={};function yr(t,e){if(Jt(e=Ht(Bt(e)),t=Ht(Bt(t))))return Lt;const n=xt.mean(t),r=xt.mean(e),o=t.length;let i=0,a=0,s=0;for(let u=0;uJt(t=Yt(t),e=Yt(e),n=Yt(n))?Lt:n<=0?Dt:r?xt.normal.cdf(t,e,n):xt.normal.pdf(t,e,n),vr.INV=(t,e,n)=>Jt(t=Yt(t),e=Yt(e),n=Yt(n))?Lt:xt.normal.inv(t,e,n),vr.S={},vr.S.DIST=(t,e)=>(t=Yt(t))instanceof Error?Lt:e?xt.normal.cdf(t,0,1):xt.normal.pdf(t,0,1),vr.S.INV=t=>(t=Yt(t))instanceof Error?Lt:xt.normal.inv(t,0,1);const Er={EXC:(t,e)=>{if(Jt(t=Ht(Bt(t)),e=Yt(e)))return Lt;const n=(t=t.sort((t,e)=>t-e)).length;if(e<1/(n+1)||e>1-1/(n+1))return Dt;const r=e*(n+1)-1,o=Math.floor(r);return zt(r===o?t[r]:t[o]+(r-o)*(t[o+1]-t[o]))},INC:(t,e)=>{if(Jt(t=Ht(Bt(t)),e=Yt(e)))return Lt;const n=e*((t=t.sort((t,e)=>t-e)).length-1),r=Math.floor(n);return zt(n===r?t[n]:t[r]+(n-r)*(t[r+1]-t[r]))}},Tr={};function Ar(t,e){return Jt(t=Yt(t),e=Yt(e))?Lt:To(t)/To(t-e)}function _r(t,e){return Jt(t=Yt(t),e=Yt(e))?Lt:Math.pow(t,e)}function Nr(t){return(t=Yt(t))instanceof Error?Lt:Math.exp(-.5*t*t)/On}Tr.EXC=(t,e,n)=>{if(n=void 0===n?3:n,Jt(t=Ht(Bt(t)),e=Yt(e),n=Yt(n)))return Lt;t=t.sort((t,e)=>t-e);const r=Nn.apply(null,t),o=t.length,i=r.length,a=Math.pow(10,n);let s=0,u=!1,c=0;for(;!u&&c=r[c]&&(e{if(n=void 0===n?3:n,Jt(t=Ht(Bt(t)),e=Yt(e),n=Yt(n)))return Lt;t=t.sort((t,e)=>t-e);const r=Nn.apply(null,t),o=t.length,i=r.length,a=Math.pow(10,n);let s=0,u=!1,c=0;for(;!u&&c=r[c]&&(e=0?e[t.indexOf(n)]:0;const o=t.sort((t,e)=>t-e),i=o.length;let a=0;for(let s=0;s=n&&o[s]<=r&&(a+=e[t.indexOf(o[s])]);return a}Rr.DIST=(t,e,n)=>Jt(t=Yt(t),e=Yt(e))?Lt:n?xt.poisson.cdf(t,e):xt.poisson.pdf(t,e);const Ir={EXC:(t,e)=>{if(Jt(t=Ht(Bt(t)),e=Yt(e)))return Lt;switch(e){case 1:return Er.EXC(t,.25);case 2:return Er.EXC(t,.5);case 3:return Er.EXC(t,.75);default:return Dt}},INC:(t,e)=>{if(Jt(t=Ht(Bt(t)),e=Yt(e)))return Lt;switch(e){case 1:return Er.INC(t,.25);case 2:return Er.INC(t,.5);case 3:return Er.INC(t,.75);default:return Dt}}},Sr={};function br(t,e){return 2!==arguments.length?kt:e<0?Dt:t instanceof Array&&"number"==typeof e?0!==t.length?xt.row(t,e):void 0:Lt}function xr(t,e){return Jt(t=Ht(Bt(t)),e=Ht(Bt(e)))?Lt:Math.pow(yr(t,e),2)}function Cr(){const t=Ht(Bt(arguments));if(t instanceof Error)return t;const e=xt.mean(t),n=t.length;let r=0;for(let o=0;ot-e)[e-1]}function Pr(t,e,n){return Jt(t=Yt(t),e=Yt(e),n=Yt(n))?Lt:(t-e)/n}Sr.AVG=(t,e,n)=>{if(Jt(t=Yt(t),e=Ht(Bt(e))))return Lt;const r=(n=n||!1)?(t,e)=>t-e:(t,e)=>e-t,o=(e=(e=Bt(e)).sort(r)).length;let i=0;for(let n=0;n1?(2*e.indexOf(t)+i+1)/2:e.indexOf(t)+1},Sr.EQ=(t,e,n)=>{if(Jt(t=Yt(t),e=Ht(Bt(e))))return Lt;const r=(n=n||!1)?(t,e)=>t-e:(t,e)=>e-t;return(e=e.sort(r)).indexOf(t)+1},Cr.P=function(){const t=Ht(Bt(arguments));if(t instanceof Error)return t;const e=xt.mean(t),n=t.length;let r=0,o=0;for(let i=0;i{a.push(o*t+i)}),a}function Vr(t,e){if(Jt(t=Ht(Bt(t)),e=Yt(e)))return Lt;const n=_o(t.length*e,2)/2;return xt.mean((o=(o=n)||1,(r=ne(t.sort((t,e)=>t-e),n))&&"function"==typeof r.slice?r.slice(0,r.length-o):r));var r,o}Ur.DIST=(t,e,n)=>1!==n&&2!==n?Dt:1===n?Ur.DIST.RT(t,e):Ur.DIST["2T"](t,e),Ur.DIST["2T"]=function(t,e){return 2!==arguments.length?kt:t<0||e<1?Dt:"number"!=typeof t||"number"!=typeof e?Lt:2*(1-xt.studentt.cdf(t,e))},Ur.DIST.RT=function(t,e){return 2!==arguments.length?kt:t<0||e<1?Dt:"number"!=typeof t||"number"!=typeof e?Lt:1-xt.studentt.cdf(t,e)},Ur.INV=(t,e)=>Jt(t=Yt(t),e=Yt(e))?Lt:xt.studentt.inv(t,e),Ur.INV["2T"]=(t,e)=>(t=Yt(t),e=Yt(e),t<=0||t>1||e<1?Dt:Jt(t,e)?Lt:Math.abs(xt.studentt.inv(t/2,e))),Ur.TEST=(t,e)=>{if(Jt(t=Ht(Bt(t)),e=Ht(Bt(e))))return Lt;const n=xt.mean(t),r=xt.mean(e);let o,i=0,a=0;for(o=0;oJt(t=Yt(t),e=Yt(e),n=Yt(n))?Lt:r?1-Math.exp(-Math.pow(t/n,e)):Math.pow(t,e-1)*Math.exp(-Math.pow(t/n,e))*e/Math.pow(n,e)},qr={};function Yr(t){return(t=Yt(t))instanceof Error?t:Math.abs(t)}function Kr(t){if((t=Yt(t))instanceof Error)return t;let e=Math.acos(t);return isNaN(e)&&(e=Dt),e}function Hr(t){if((t=Yt(t))instanceof Error)return t;let e=Math.log(t+Math.sqrt(t*t-1));return isNaN(e)&&(e=Dt),e}function Xr(t){return(t=Yt(t))instanceof Error?t:Math.atan(1/t)}function $r(t){if((t=Yt(t))instanceof Error)return t;let e=.5*Math.log((t+1)/(t-1));return isNaN(e)&&(e=Dt),e}function Zr(t,e,n,r){if(Jt(t=Yt(t),Yt(t)))return Lt;switch(t){case 1:return Sn(n);case 2:return kn(n);case 3:return Fn(n);case 4:return lr(n);case 5:return pr(n);case 6:return Bo(n);case 7:return wr.S(n);case 8:return wr.P(n);case 9:return yi(n);case 10:return Br.S(n);case 11:return Br.P(n);case 12:return hr(n);case 13:return mr.SNGL(n);case 14:return ar(n,r);case 15:return Lr(n,r);case 16:return Er.INC(n,r);case 17:return Ir.INC(n,r);case 18:return Er.EXC(n,r);case 19:return Ir.EXC(n,r)}}function Qr(t){if(null==t)return 0;if(t instanceof Error)return t;if(!/^M*(?:D?C{0,3}|C[MD])(?:L?X{0,3}|X[CL])(?:V?I{0,3}|I[XV])$/.test(t))return Lt;let e=0;return t.replace(/[MDLV]|C[MD]?|X[CL]?|I[XV]?/g,t=>{e+={M:1e3,CM:900,D:500,CD:400,C:100,XC:90,L:50,XL:40,X:10,IX:9,V:5,IV:4,I:1}[t]}),e}function Jr(t){if((t=Yt(t))instanceof Error)return t;let e=Math.asin(t);return isNaN(e)&&(e=Dt),e}function to(t){return(t=Yt(t))instanceof Error?t:Math.log(t+Math.sqrt(t*t+1))}function eo(t){return(t=Yt(t))instanceof Error?t:Math.atan(t)}function no(t,e){return Zt(t=Yt(t),e=Yt(e))||Math.atan2(t,e)}function ro(t){if((t=Yt(t))instanceof Error)return t;let e=Math.log((1+t)/(1-t))/2;return isNaN(e)&&(e=Dt),e}function oo(t,e,n){const r=Zt(t=Yt(t),e=Yt(e),n=Yt(n));if(r)return r;if(0===e)return Dt;const o=t.toString(e);return new Array(Math.max(n+1-o.length,0)).join("0")+o}function io(t,e,n){const r=Zt(t=Yt(t),e=Yt(e),n=Yt(n));if(r)return r;if(0===e)return 0;e=Math.abs(e);const o=-Math.floor(Math.log(e)/Math.log(10));return t>=0?Ko(Math.ceil(t/e)*e,o):0===n?-Ko(Math.floor(Math.abs(t)/e)*e,o):-Ko(Math.ceil(Math.abs(t)/e)*e,o)}function ao(t,e){return Zt(t=Yt(t),e=Yt(e))||(t1?Ft:(t=Yt(t))instanceof Error?t:t=Math.exp(t)}qr.TEST=(t,e,n)=>{if(Jt(t=Ht(Bt(t)),e=Yt(e)))return Lt;n=n||wr.S(t);const r=t.length;return 1-vr.S.DIST((Sn(t)-e)/(n/Math.sqrt(r)),!0)},io.MATH=io,io.PRECISE=io;const Eo=[];function To(t){if((t=Yt(t))instanceof Error)return t;const e=Math.floor(t);return 0===e||1===e?1:(Eo[e]>0||(Eo[e]=To(e-1)*e),Eo[e])}function Ao(t){if((t=Yt(t))instanceof Error)return t;const e=Math.floor(t);return e<=0?1:e*Ao(e-2)}function _o(t,e){const n=Zt(t=Yt(t),e=Yt(e));if(n)return n;if(0===e)return 0;if(!(t>=0&&e>0||t<=0&&e<0))return Dt;e=Math.abs(e);const r=-Math.floor(Math.log(e)/Math.log(10));return t>=0?Ko(Math.floor(t/e)*e,r):-Ko(Math.ceil(Math.abs(t)/e),r)}function No(){const t=Ht(Bt(arguments));if(t instanceof Error)return t;const e=t.length,n=t[0];let r=n<0?-n:n;for(let n=1;no?r%=o:o%=r;r+=o}return r}function Ro(t){return(t=Yt(t))instanceof Error?t:Math.floor(t)}_o.MATH=(t,e,n)=>{if(e instanceof Error)return e;e=void 0===e?0:e;const r=Zt(t=Yt(t),e=Yt(e),n=Yt(n));if(r)return r;if(0===e)return 0;e=e?Math.abs(e):1;const o=-Math.floor(Math.log(e)/Math.log(10));return t>=0?Ko(Math.floor(t/e)*e,o):0===n||void 0===n?-Ko(Math.ceil(Math.abs(t)/e)*e,o):-Ko(Math.floor(Math.abs(t)/e)*e,o)},_o.PRECISE=_o.MATH;const Oo={CEILING:io};function Io(){const t=Ht(Bt(arguments));if(t instanceof Error)return t;for(var e,n,r,o,i=1;void 0!==(r=t.pop());){if(0===r)return 0;for(;r>1;){if(r%2){for(e=3,n=Math.floor(Math.sqrt(r));e<=n&&r%e;e+=2);o=e<=n?e:r}else o=2;for(r/=o,i*=o,e=t.length;e;t[--e]%o===0&&1===(t[e]/=o)&&t.splice(e,1));}}return i}function So(t){return(t=Yt(t))instanceof Error?t:0===t?Dt:Math.log(t)}function bo(){return Math.log(10)}function xo(){return Math.log(2)}function Co(){return Math.LOG10E}function Mo(){return Math.LOG2E}function Lo(t,e){return Zt(t=Yt(t),e=Yt(e))||(0===t||0===e?Dt:Math.log(t)/Math.log(e))}function Po(t){return(t=Yt(t))instanceof Error?t:0===t?Dt:Math.log(t)/Math.log(10)}function wo(t,e){const n=Zt(t=Yt(t),e=Yt(e));if(n)return n;if(0===e)return Mt;let r=Math.abs(t%e);return r=t<0?e-r:r,e>0?r:-r}function Do(t,e){return Zt(t=Yt(t),e=Yt(e))||(t*e===0?0:t*e<0?Dt:Math.round(t/e)*e)}function ko(){const t=Ht(Bt(arguments));if(t instanceof Error)return t;let e=0,n=1;for(let r=0;r=0?e:-e}function Uo(){return Math.PI}function jo(){return Math.E}function Vo(t,e){const n=Zt(t=Yt(t),e=Yt(e));if(n)return n;if(0===t&&0===e)return Dt;const r=Math.pow(t,e);return isNaN(r)?Dt:r}function Bo(){const t=Bt(arguments).filter(t=>null!=t);if(0===t.length)return 0;const e=Ht(t);if(e instanceof Error)return e;let n=1;for(let t=0;t0?1:-1)*Math.floor(Math.abs(t)*Math.pow(10,e))/Math.pow(10,e)}function Xo(t,e){const n=Zt(t=Yt(t),e=Yt(e));return n||(t>0?1:-1)*Math.ceil(Math.abs(t)*Math.pow(10,e))/Math.pow(10,e)}function $o(t){return(t=Yt(t))instanceof Error?t:1/Math.cos(t)}function Zo(t){return(t=Yt(t))instanceof Error?t:2/(Math.exp(t)+Math.exp(-t))}function Qo(t,e,n,r){if(Jt(t=Yt(t),e=Yt(e),n=Yt(n),r=Ht(r)))return Lt;let o=r[0]*Math.pow(t,e);for(let i=1;ie}function hi(t,e){if(2!==arguments.length)return kt;te(t,e)?(t=Kt(t),e=Kt(e)):(t=Yt(t),e=Yt(e));return Zt(t,e)||t>=e}function pi(t,e){if(2!==arguments.length)return kt;te(t,e)?(t=Kt(t),e=Kt(e)):(t=Yt(t),e=Yt(e));return Zt(t,e)||t{if(t instanceof Error)return!1;if(e instanceof Error)t=e;else if("number"==typeof e)t+=e;else if("string"==typeof e){const n=parseFloat(e);!isNaN(n)&&(t+=n)}else if(Array.isArray(e)){const n=yi.apply(null,e);n instanceof Error?t=n:t+=n}}),t}function Ei(t,e,n){if(t=Bt(t),n=n?Bt(n):t,t instanceof Error)return t;if(null==e||e instanceof Error)return 0;let r=0;const o="*"===e,i=o?null:ze(e+"");for(let e=0;e0?1:-1)*Math.floor(Math.abs(t)*Math.pow(10,e))/Math.pow(10,e)}function xi(){throw new Error("ASC is not implemented")}function Ci(){throw new Error("BAHTTEXT is not implemented")}function Mi(t){return 0===(t=Yt(t))?Lt:t instanceof Error?t:String.fromCharCode(t)}function Li(t){return Jt(t)?t:(t=t||"").replace(/[\0-\x1F]/g,"")}function Pi(t){if(Jt(t))return t;let e=(t=t||"").charCodeAt(0);return isNaN(e)&&(e=Lt),e}function wi(){const t=Bt(arguments),e=Zt.apply(void 0,t);if(e)return e;let n=0;for(;(n=t.indexOf(!0))>-1;)t[n]="TRUE";let r=0;for(;(r=t.indexOf(!1))>-1;)t[r]="FALSE";return t.join("")}const Di=wi;function ki(){throw new Error("DBCS is not implemented")}function Fi(t,e=2){if(t=Yt(t),isNaN(t))return Lt;const n={style:"currency",currency:"USD",minimumFractionDigits:e>=0?e:0,maximumFractionDigits:e>=0?e:0},r=(t=Ko(t,e)).toLocaleString("en-US",n);return t<0?"$("+r.slice(2)+")":r}function Ui(t,e){if(2!==arguments.length)return kt;return Zt(t,e)||(t=Kt(t))===Kt(e)}function ji(t,e,n){if(arguments.length<2)return kt;t=Kt(t),n=void 0===n?0:n;const r=(e=Kt(e)).indexOf(t,n-1);return-1===r?Lt:r+1}function Vi(t,e=2,n=!1){if(t=Yt(t),isNaN(t))return Lt;if(e=Yt(e),isNaN(e))return Lt;if(e<0){const n=Math.pow(10,-e);t=Math.round(t/n)*n}else t=t.toFixed(e);if(n)t=t.toString().replace(/,/g,"");else{const e=t.toString().split(".");e[0]=e[0].replace(/\B(?=(\d{3})+$)/g,","),t=e.join(".")}return t}function Bi(t){if(Jt(t))return t;let e="";return t&&(t instanceof Array?t.forEach(t=>{""!==e&&(e+="\n"),e+=t.replace(/<(?:.|\n)*?>/gm,"")}):e=t.replace(/<(?:.|\n)*?>/gm,"")),e}function Gi(t,e){return Zt(t,e)||(t=Kt(t),(e=Yt(e=void 0===e?1:e))instanceof Error||"string"!=typeof t?Lt:t.substring(0,e))}function Wi(t){return 0===arguments.length?Ft:t instanceof Error?t:Array.isArray(t)?Lt:Kt(t).length}function zi(t){return 1!==arguments.length?Lt:Jt(t=Kt(t))?t:t.toLowerCase()}function qi(t,e,n){if(null==e)return Lt;if(Jt(e=Yt(e),n=Yt(n))||"string"!=typeof t)return n;const r=e-1,o=r+n;return t.substring(r,o)}function Yi(t,e,n){return"number"==typeof(t=Qt(t)?t:"")?t:"string"!=typeof t?kt:(e=void 0===e?".":e,n=void 0===n?",":n,Number(t.replace(e,".").replace(n,"")))}function Ki(){throw new Error("PRONETIC is not implemented")}function Hi(t){return Jt(t)?t:isNaN(t)&&"number"==typeof t?Lt:(t=Kt(t)).replace(/\w\S*/g,t=>t.charAt(0).toUpperCase()+t.substr(1).toLowerCase())}function Xi(t,e){if(arguments.length<2)return kt;const n=t.match(new RegExp(e));return n?n[n.length>1?n.length-1:0]:null}function $i(t,e,n){if(arguments.length<2)return kt;const r=t.match(new RegExp(e));return n?r:!!r}function Zi(t,e,n){return arguments.length<3?kt:t.replace(new RegExp(e),n)}function Qi(t,e,n,r){return Jt(e=Yt(e),n=Yt(n))||"string"!=typeof t||"string"!=typeof r?Lt:t.substr(0,e-1)+r+t.substr(e-1+n)}function Ji(t,e){return Zt(t,e)||(t=Kt(t),(e=Yt(e))instanceof Error?e:new Array(e+1).join(t))}function ta(t,e){return Zt(t,e)||(t=Kt(t),(e=Yt(e=void 0===e?1:e))instanceof Error?e:t.substring(t.length-e))}function ea(t,e,n){let r;return"string"!=typeof t||"string"!=typeof e?Lt:(n=void 0===n?0:n,r=e.toLowerCase().indexOf(t.toLowerCase(),n-1)+1,0===r?Lt:r)}function na(t,e){return t.split(e)}function ra(t,e,n,r){if(arguments.length<3)return kt;if(t&&e){if(void 0===r)return t.split(e).join(n);{if(r=Math.floor(Number(r)),Number.isNaN(r)||r<=0)return Lt;let o=0,i=0;for(;o>-1&&t.indexOf(e,o)>-1;)if(o=t.indexOf(e,o+1),i++,o>-1&&i===r)return t.substring(0,o)+n+t.substring(o+e.length);return t}}return t}function oa(t){return t instanceof Error||"string"==typeof t?t:""}function ia(t,e){if(void 0===t||void 0===e)return kt;const n=e.startsWith("$")?"$":"",r=e.endsWith("%");return r&&(t*=100),t=(t=Vi(t,(e=e.replace(/%/g,"").replace(/\$/g,"")).split(".")[1].match(/0/g).length,!e.includes(","))).startsWith("-")?"-"+n+(t=t.replace("-","")):n+t,r&&(t+="%"),t}function aa(t,e,...n){if("boolean"!=typeof e&&(e=qt(e)),arguments.length<3)return kt;t=null!=t?t:"";let r=Bt(n),o=e?r.filter(t=>t):r;if(Array.isArray(t)){t=Bt(t);let e=o.map(t=>[t]),n=0;for(let r=0;r=r.length?Ji("0",e-r.length)+r:Dt}function Ea(t,e){if(!ha(t))return Dt;const n=t.toString();if(10===n.length&&"1"===n.substring(0,1))return(1073741312+parseInt(n.substring(1),2)).toString(8);const r=parseInt(t,2).toString(8);return void 0===e?r:isNaN(e)?Lt:e<0?Dt:(e=Math.floor(e))>=r.length?Ji("0",e-r.length)+r:Dt}function Ta(t,e){return Jt(t=Yt(t),e=Yt(e))?Lt:t<0||e<0||Math.floor(t)!==t||Math.floor(e)!==e||t>0xffffffffffff||e>0xffffffffffff?Dt:t&e}function Aa(t,e){return Jt(t=Yt(t),e=Yt(e))?Lt:t<0||Math.floor(t)!==t||t>0xffffffffffff||Math.abs(e)>53?Dt:e>=0?t<>-e}function _a(t,e){return Jt(t=Yt(t),e=Yt(e))?Lt:t<0||e<0||Math.floor(t)!==t||Math.floor(e)!==e||t>0xffffffffffff||e>0xffffffffffff?Dt:t|e}function Na(t,e){return Jt(t=Yt(t),e=Yt(e))?Lt:t<0||Math.floor(t)!==t||t>0xffffffffffff||Math.abs(e)>53?Dt:e>=0?t>>e:t<<-e}function Ra(t,e){return Jt(t=Yt(t),e=Yt(e))?Lt:t<0||e<0||Math.floor(t)!==t||Math.floor(e)!==e||t>0xffffffffffff||e>0xffffffffffff?Dt:t^e}function Oa(t,e,n){if(Jt(t=Yt(t),e=Yt(e)))return t;if("i"!==(n=void 0===n?"i":n)&&"j"!==n)return Lt;if(0===t&&0===e)return 0;if(0===t)return 1===e?n:e.toString()+n;if(0===e)return t.toString();{const r=e>0?"+":"";return t.toString()+r+(1===e?n:e.toString()+n)}}function Ia(t,e,n){if((t=Yt(t))instanceof Error)return t;const r=[["a.u. of action","?",null,"action",!1,!1,105457168181818e-48],["a.u. of charge","e",null,"electric_charge",!1,!1,160217653141414e-33],["a.u. of energy","Eh",null,"energy",!1,!1,435974417757576e-32],["a.u. of length","a?",null,"length",!1,!1,529177210818182e-25],["a.u. of mass","m?",null,"mass",!1,!1,910938261616162e-45],["a.u. of time","?/Eh",null,"time",!1,!1,241888432650516e-31],["admiralty knot","admkn",null,"speed",!1,!0,.514773333],["ampere","A",null,"electric_current",!0,!1,1],["ampere per meter","A/m",null,"magnetic_field_intensity",!0,!1,1],["ångström","Å",["ang"],"length",!1,!0,1e-10],["are","ar",null,"area",!1,!0,100],["astronomical unit","ua",null,"length",!1,!1,149597870691667e-25],["bar","bar",null,"pressure",!1,!1,1e5],["barn","b",null,"area",!1,!1,1e-28],["becquerel","Bq",null,"radioactivity",!0,!1,1],["bit","bit",["b"],"information",!1,!0,1],["btu","BTU",["btu"],"energy",!1,!0,1055.05585262],["byte","byte",null,"information",!1,!0,8],["candela","cd",null,"luminous_intensity",!0,!1,1],["candela per square metre","cd/m?",null,"luminance",!0,!1,1],["coulomb","C",null,"electric_charge",!0,!1,1],["cubic ångström","ang3",["ang^3"],"volume",!1,!0,1e-30],["cubic foot","ft3",["ft^3"],"volume",!1,!0,.028316846592],["cubic inch","in3",["in^3"],"volume",!1,!0,16387064e-12],["cubic light-year","ly3",["ly^3"],"volume",!1,!0,846786664623715e-61],["cubic metre","m?",null,"volume",!0,!0,1],["cubic mile","mi3",["mi^3"],"volume",!1,!0,4168181825.44058],["cubic nautical mile","Nmi3",["Nmi^3"],"volume",!1,!0,6352182208],["cubic Pica","Pica3",["Picapt3","Pica^3","Picapt^3"],"volume",!1,!0,7.58660370370369e-8],["cubic yard","yd3",["yd^3"],"volume",!1,!0,.764554857984],["cup","cup",null,"volume",!1,!0,.0002365882365],["dalton","Da",["u"],"mass",!1,!1,166053886282828e-41],["day","d",["day"],"time",!1,!0,86400],["degree","°",null,"angle",!1,!1,.0174532925199433],["degrees Rankine","Rank",null,"temperature",!1,!0,.555555555555556],["dyne","dyn",["dy"],"force",!1,!0,1e-5],["electronvolt","eV",["ev"],"energy",!1,!0,1.60217656514141],["ell","ell",null,"length",!1,!0,1.143],["erg","erg",["e"],"energy",!1,!0,1e-7],["farad","F",null,"electric_capacitance",!0,!1,1],["fluid ounce","oz",null,"volume",!1,!0,295735295625e-16],["foot","ft",null,"length",!1,!0,.3048],["foot-pound","flb",null,"energy",!1,!0,1.3558179483314],["gal","Gal",null,"acceleration",!1,!1,.01],["gallon","gal",null,"volume",!1,!0,.003785411784],["gauss","G",["ga"],"magnetic_flux_density",!1,!0,1],["grain","grain",null,"mass",!1,!0,647989e-10],["gram","g",null,"mass",!1,!0,.001],["gray","Gy",null,"absorbed_dose",!0,!1,1],["gross registered ton","GRT",["regton"],"volume",!1,!0,2.8316846592],["hectare","ha",null,"area",!1,!0,1e4],["henry","H",null,"inductance",!0,!1,1],["hertz","Hz",null,"frequency",!0,!1,1],["horsepower","HP",["h"],"power",!1,!0,745.69987158227],["horsepower-hour","HPh",["hh","hph"],"energy",!1,!0,2684519.538],["hour","h",["hr"],"time",!1,!0,3600],["imperial gallon (U.K.)","uk_gal",null,"volume",!1,!0,.00454609],["imperial hundredweight","lcwt",["uk_cwt","hweight"],"mass",!1,!0,50.802345],["imperial quart (U.K)","uk_qt",null,"volume",!1,!0,.0011365225],["imperial ton","brton",["uk_ton","LTON"],"mass",!1,!0,1016.046909],["inch","in",null,"length",!1,!0,.0254],["international acre","uk_acre",null,"area",!1,!0,4046.8564224],["IT calorie","cal",null,"energy",!1,!0,4.1868],["joule","J",null,"energy",!0,!0,1],["katal","kat",null,"catalytic_activity",!0,!1,1],["kelvin","K",["kel"],"temperature",!0,!0,1],["kilogram","kg",null,"mass",!0,!0,1],["knot","kn",null,"speed",!1,!0,.514444444444444],["light-year","ly",null,"length",!1,!0,9460730472580800],["litre","L",["l","lt"],"volume",!1,!0,.001],["lumen","lm",null,"luminous_flux",!0,!1,1],["lux","lx",null,"illuminance",!0,!1,1],["maxwell","Mx",null,"magnetic_flux",!1,!1,1e-18],["measurement ton","MTON",null,"volume",!1,!0,1.13267386368],["meter per hour","m/h",["m/hr"],"speed",!1,!0,.00027777777777778],["meter per second","m/s",["m/sec"],"speed",!0,!0,1],["meter per second squared","m?s??",null,"acceleration",!0,!1,1],["parsec","pc",["parsec"],"length",!1,!0,0x6da012f958ee1c],["meter squared per second","m?/s",null,"kinematic_viscosity",!0,!1,1],["metre","m",null,"length",!0,!0,1],["miles per hour","mph",null,"speed",!1,!0,.44704],["millimetre of mercury","mmHg",null,"pressure",!1,!1,133.322],["minute","?",null,"angle",!1,!1,.000290888208665722],["minute","min",["mn"],"time",!1,!0,60],["modern teaspoon","tspm",null,"volume",!1,!0,5e-6],["mole","mol",null,"amount_of_substance",!0,!1,1],["morgen","Morgen",null,"area",!1,!0,2500],["n.u. of action","?",null,"action",!1,!1,105457168181818e-48],["n.u. of mass","m?",null,"mass",!1,!1,910938261616162e-45],["n.u. of speed","c?",null,"speed",!1,!1,299792458],["n.u. of time","?/(me?c??)",null,"time",!1,!1,128808866778687e-35],["nautical mile","M",["Nmi"],"length",!1,!0,1852],["newton","N",null,"force",!0,!0,1],["œrsted","Oe ",null,"magnetic_field_intensity",!1,!1,79.5774715459477],["ohm","Ω",null,"electric_resistance",!0,!1,1],["ounce mass","ozm",null,"mass",!1,!0,.028349523125],["pascal","Pa",null,"pressure",!0,!1,1],["pascal second","Pa?s",null,"dynamic_viscosity",!0,!1,1],["pferdestärke","PS",null,"power",!1,!0,735.49875],["phot","ph",null,"illuminance",!1,!1,1e-4],["pica (1/6 inch)","pica",null,"length",!1,!0,.00035277777777778],["pica (1/72 inch)","Pica",["Picapt"],"length",!1,!0,.00423333333333333],["poise","P",null,"dynamic_viscosity",!1,!1,.1],["pond","pond",null,"force",!1,!0,.00980665],["pound force","lbf",null,"force",!1,!0,4.4482216152605],["pound mass","lbm",null,"mass",!1,!0,.45359237],["quart","qt",null,"volume",!1,!0,.000946352946],["radian","rad",null,"angle",!0,!1,1],["second","?",null,"angle",!1,!1,484813681109536e-20],["second","s",["sec"],"time",!0,!0,1],["short hundredweight","cwt",["shweight"],"mass",!1,!0,45.359237],["siemens","S",null,"electrical_conductance",!0,!1,1],["sievert","Sv",null,"equivalent_dose",!0,!1,1],["slug","sg",null,"mass",!1,!0,14.59390294],["square ångström","ang2",["ang^2"],"area",!1,!0,1e-20],["square foot","ft2",["ft^2"],"area",!1,!0,.09290304],["square inch","in2",["in^2"],"area",!1,!0,64516e-8],["square light-year","ly2",["ly^2"],"area",!1,!0,895054210748189e17],["square meter","m?",null,"area",!0,!0,1],["square mile","mi2",["mi^2"],"area",!1,!0,2589988.110336],["square nautical mile","Nmi2",["Nmi^2"],"area",!1,!0,3429904],["square Pica","Pica2",["Picapt2","Pica^2","Picapt^2"],"area",!1,!0,1792111111111e-17],["square yard","yd2",["yd^2"],"area",!1,!0,.83612736],["statute mile","mi",null,"length",!1,!0,1609.344],["steradian","sr",null,"solid_angle",!0,!1,1],["stilb","sb",null,"luminance",!1,!1,1e-4],["stokes","St",null,"kinematic_viscosity",!1,!1,1e-4],["stone","stone",null,"mass",!1,!0,6.35029318],["tablespoon","tbs",null,"volume",!1,!0,147868e-10],["teaspoon","tsp",null,"volume",!1,!0,492892e-11],["tesla","T",null,"magnetic_flux_density",!0,!0,1],["thermodynamic calorie","c",null,"energy",!1,!0,4.184],["ton","ton",null,"mass",!1,!0,907.18474],["tonne","t",null,"mass",!1,!1,1e3],["U.K. pint","uk_pt",null,"volume",!1,!0,.00056826125],["U.S. bushel","bushel",null,"volume",!1,!0,.03523907],["U.S. oil barrel","barrel",null,"volume",!1,!0,.158987295],["U.S. pint","pt",["us_pt"],"volume",!1,!0,.000473176473],["U.S. survey mile","survey_mi",null,"length",!1,!0,1609.347219],["U.S. survey/statute acre","us_acre",null,"area",!1,!0,4046.87261],["volt","V",null,"voltage",!0,!1,1],["watt","W",null,"power",!0,!0,1],["watt-hour","Wh",["wh"],"energy",!1,!0,3600],["weber","Wb",null,"magnetic_flux",!0,!1,1],["yard","yd",null,"length",!1,!0,.9144],["year","yr",null,"time",!1,!0,31557600]],o={Yi:["yobi",80,12089258196146292e8,"Yi","yotta"],Zi:["zebi",70,11805916207174113e5,"Zi","zetta"],Ei:["exbi",60,0x1000000000000000,"Ei","exa"],Pi:["pebi",50,0x4000000000000,"Pi","peta"],Ti:["tebi",40,1099511627776,"Ti","tera"],Gi:["gibi",30,1073741824,"Gi","giga"],Mi:["mebi",20,1048576,"Mi","mega"],ki:["kibi",10,1024,"ki","kilo"]},i={Y:["yotta",1e24,"Y"],Z:["zetta",1e21,"Z"],E:["exa",1e18,"E"],P:["peta",1e15,"P"],T:["tera",1e12,"T"],G:["giga",1e9,"G"],M:["mega",1e6,"M"],k:["kilo",1e3,"k"],h:["hecto",100,"h"],e:["dekao",10,"e"],d:["deci",.1,"d"],c:["centi",.01,"c"],m:["milli",.001,"m"],u:["micro",1e-6,"u"],n:["nano",1e-9,"n"],p:["pico",1e-12,"p"],f:["femto",1e-15,"f"],a:["atto",1e-18,"a"],z:["zepto",1e-21,"z"],y:["yocto",1e-24,"y"]};let a,s=null,u=null,c=e,l=n,f=1,h=1;for(let t=0;t=0)&&(s=r[t]),(r[t][1]===l||a.indexOf(l)>=0)&&(u=r[t]);if(null===s){const t=o[e.substring(0,2)];let n=i[e.substring(0,1)];"da"===e.substring(0,2)&&(n=["dekao",10,"da"]),t?(f=t[2],c=e.substring(2)):n&&(f=n[1],c=e.substring(n[2].length));for(let t=0;t=0)&&(s=r[t])}if(null===u){const t=o[n.substring(0,2)];let e=i[n.substring(0,1)];"da"===n.substring(0,2)&&(e=["dekao",10,"da"]),t?(h=t[2],l=n.substring(2)):e&&(h=e[1],l=n.substring(e[2].length));for(let t=0;t=0)&&(u=r[t])}return null===s||null===u||s[3]!==u[3]?kt:t*s[6]*f/(u[6]*h)}function Sa(t,e){if((t=Yt(t))instanceof Error)return t;if(!/^-?[0-9]{1,3}$/.test(t)||t<-512||t>511)return Dt;if(t<0)return"1"+Ji("0",9-(512+t).toString(2).length)+(512+t).toString(2);const n=parseInt(t,10).toString(2);return void 0===e?n:isNaN(e)?Lt:e<0?Dt:(e=Math.floor(e))>=n.length?Ji("0",e-n.length)+n:Dt}function ba(t,e){if((t=Yt(t))instanceof Error)return t;if(!/^-?[0-9]{1,12}$/.test(t)||t<-549755813888||t>549755813887)return Dt;if(t<0)return(1099511627776+t).toString(16);const n=parseInt(t,10).toString(16);return void 0===e?n:isNaN(e)?Lt:e<0?Dt:(e=Math.floor(e))>=n.length?Ji("0",e-n.length)+n:Dt}function xa(t,e){if((t=Yt(t))instanceof Error)return t;if(!/^-?[0-9]{1,9}$/.test(t)||t<-536870912||t>536870911)return Dt;if(t<0)return(1073741824+t).toString(8);const n=parseInt(t,10).toString(8);return void 0===e?n:isNaN(e)?Lt:e<0?Dt:(e=Math.floor(e))>=n.length?Ji("0",e-n.length)+n:Dt}function Ca(t,e){return e=void 0===e?0:e,Jt(t=Yt(t),e=Yt(e))?Lt:t===e?1:0}function Ma(t,e){return e=void 0===e?0:e,Jt(t=Yt(t),e=Yt(e))?Lt:xt.erf(t)}function La(t){return isNaN(t)?Lt:xt.erfc(t)}function Pa(t,e){return Jt(e=e||0,t=Yt(t))?t:t>=e?1:0}function wa(t,e){if(!/^[0-9A-Fa-f]{1,10}$/.test(t))return Dt;const n=!(10!==t.length||"f"!==t.substring(0,1).toLowerCase()),r=n?parseInt(t,16)-1099511627776:parseInt(t,16);if(r<-512||r>511)return Dt;if(n)return"1"+Ji("0",9-(512+r).toString(2).length)+(512+r).toString(2);const o=r.toString(2);return void 0===e?o:isNaN(e)?Lt:e<0?Dt:(e=Math.floor(e))>=o.length?Ji("0",e-o.length)+o:Dt}function Da(t){if(!/^[0-9A-Fa-f]{1,10}$/.test(t))return Dt;const e=parseInt(t,16);return e>=549755813888?e-1099511627776:e}function ka(t,e){if(!/^[0-9A-Fa-f]{1,10}$/.test(t))return Dt;const n=parseInt(t,16);if(n>536870911&&n<0xffe0000000)return Dt;if(n>=0xffe0000000)return(n-0xffc0000000).toString(8);const r=n.toString(8);return void 0===e?r:isNaN(e)?Lt:e<0?Dt:(e=Math.floor(e))>=r.length?Ji("0",e-r.length)+r:Dt}function Fa(t){const e=Za(t),n=Ua(t);return Jt(e,n)?Lt:Math.sqrt(Math.pow(e,2)+Math.pow(n,2))}function Ua(t){if(void 0===t||!0===t||!1===t)return Lt;if(0===t||"0"===t)return 0;if(["i","j"].indexOf(t)>=0)return 1;let e=(t=(t+="").replace("+i","+1i").replace("-i","-1i").replace("+j","+1j").replace("-j","-1j")).indexOf("+"),n=t.indexOf("-");0===e&&(e=t.indexOf("+",1)),0===n&&(n=t.indexOf("-",1));const r=t.substring(t.length-1,t.length),o="i"===r||"j"===r;return e>=0||n>=0?o?e>=0?isNaN(t.substring(0,e))||isNaN(t.substring(e+1,t.length-1))?Dt:Number(t.substring(e+1,t.length-1)):isNaN(t.substring(0,n))||isNaN(t.substring(n+1,t.length-1))?Dt:-Number(t.substring(n+1,t.length-1)):Dt:o?isNaN(t.substring(0,t.length-1))?Dt:t.substring(0,t.length-1):isNaN(t)?Dt:0}function ja(t){const e=Za(t),n=Ua(t);return Jt(e,n)?Lt:0===e&&0===n?Mt:0===e&&n>0?Math.PI/2:0===e&&n<0?-Math.PI/2:0===n&&e>0?0:0===n&&e<0?-Math.PI:e>0?Math.atan(n/e):e<0&&n>=0?Math.atan(n/e)+Math.PI:Math.atan(n/e)-Math.PI}function Va(t){const e=Za(t),n=Ua(t);if(Jt(e,n))return Lt;let r=t.substring(t.length-1);return r="i"===r||"j"===r?r:"i",0!==n?Oa(e,-n,r):t}function Ba(t){const e=Za(t),n=Ua(t);if(Jt(e,n))return Lt;let r=t.substring(t.length-1);return r="i"===r||"j"===r?r:"i",Oa(Math.cos(e)*(Math.exp(n)+Math.exp(-n))/2,-Math.sin(e)*(Math.exp(n)-Math.exp(-n))/2,r)}function Ga(t){const e=Za(t),n=Ua(t);if(Jt(e,n))return Lt;let r=t.substring(t.length-1);return r="i"===r||"j"===r?r:"i",Oa(Math.cos(n)*(Math.exp(e)+Math.exp(-e))/2,Math.sin(n)*(Math.exp(e)-Math.exp(-e))/2,r)}function Wa(t){return Jt(Za(t),Ua(t))?Lt:za(Ba(t),ts(t))}function za(t,e){const n=Za(t),r=Ua(t),o=Za(e),i=Ua(e);if(Jt(n,r,o,i))return Lt;const a=t.substring(t.length-1),s=e.substring(e.length-1);let u="i";if(("j"===a||"j"===s)&&(u="j"),0===o&&0===i)return Dt;const c=o*o+i*i;return Oa((n*o+r*i)/c,(r*o-n*i)/c,u)}function qa(t){const e=Za(t),n=Ua(t);if(Jt(e,n))return Lt;let r=t.substring(t.length-1);r="i"===r||"j"===r?r:"i";const o=Math.exp(e);return Oa(o*Math.cos(n),o*Math.sin(n),r)}function Ya(t){const e=Za(t),n=Ua(t);if(Jt(e,n))return Lt;let r=t.substring(t.length-1);return r="i"===r||"j"===r?r:"i",Oa(Math.log(Math.sqrt(e*e+n*n)),Math.atan(n/e),r)}function Ka(t){const e=Za(t),n=Ua(t);if(Jt(e,n))return Lt;let r=t.substring(t.length-1);return r="i"===r||"j"===r?r:"i",Oa(Math.log(Math.sqrt(e*e+n*n))/Math.log(10),Math.atan(n/e)/Math.log(10),r)}function Ha(t){const e=Za(t),n=Ua(t);if(Jt(e,n))return Lt;let r=t.substring(t.length-1);return r="i"===r||"j"===r?r:"i",Oa(Math.log(Math.sqrt(e*e+n*n))/Math.log(2),Math.atan(n/e)/Math.log(2),r)}function Xa(t,e){if(Jt(e=Yt(e),Za(t),Ua(t)))return Lt;let n=t.substring(t.length-1);n="i"===n||"j"===n?n:"i";const r=Math.pow(Fa(t),e),o=ja(t);return Oa(r*Math.cos(e*o),r*Math.sin(e*o),n)}function $a(){let t=arguments[0];if(!arguments.length)return Lt;for(let e=1;e=0)return 0;let e=(t+="").indexOf("+"),n=t.indexOf("-");0===e&&(e=t.indexOf("+",1)),0===n&&(n=t.indexOf("-",1));const r=t.substring(t.length-1,t.length),o="i"===r||"j"===r;return e>=0||n>=0?o?e>=0?isNaN(t.substring(0,e))||isNaN(t.substring(e+1,t.length-1))?Dt:Number(t.substring(0,e)):isNaN(t.substring(0,n))||isNaN(t.substring(n+1,t.length-1))?Dt:Number(t.substring(0,n)):Dt:o?isNaN(t.substring(0,t.length-1))?Dt:0:isNaN(t)?Dt:t}function Qa(t){return!0===t||!1===t||Jt(Za(t),Ua(t))?Lt:za("1",Ba(t))}function Ja(t){return Jt(Za(t),Ua(t))?Lt:za("1",Ga(t))}function ts(t){const e=Za(t),n=Ua(t);if(Jt(e,n))return Lt;let r=t.substring(t.length-1);return r="i"===r||"j"===r?r:"i",Oa(Math.sin(e)*(Math.exp(n)+Math.exp(-n))/2,Math.cos(e)*(Math.exp(n)-Math.exp(-n))/2,r)}function es(t){const e=Za(t),n=Ua(t);if(Jt(e,n))return Lt;let r=t.substring(t.length-1);return r="i"===r||"j"===r?r:"i",Oa(Math.cos(n)*(Math.exp(e)-Math.exp(-e))/2,Math.sin(n)*(Math.exp(e)+Math.exp(-e))/2,r)}function ns(t){if(Jt(Za(t),Ua(t)))return Lt;let e=t.substring(t.length-1);e="i"===e||"j"===e?e:"i";const n=Math.sqrt(Fa(t)),r=ja(t);return Oa(n*Math.cos(r/2),n*Math.sin(r/2),e)}function rs(t){return!0===t||!1===t?Lt:Jt(Za(t),Ua(t))?Dt:za("1",ts(t))}function os(t){return!0===t||!1===t?Lt:Jt(Za(t),Ua(t))?Dt:za("1",es(t))}function is(t,e){const n=Za(t),r=Ua(t),o=Za(e),i=Ua(e);if(Jt(n,r,o,i))return Lt;const a=t.substring(t.length-1),s=e.substring(e.length-1);let u="i";return("j"===a||"j"===s)&&(u="j"),Oa(n-o,r-i,u)}function as(){if(!arguments.length)return Lt;const t=Bt(arguments);let e=t[0];for(let n=1;n511)return Dt;if(n)return"1"+Ji("0",9-(512+r).toString(2).length)+(512+r).toString(2);const o=r.toString(2);return void 0===e?o:isNaN(e)?Lt:e<0?Dt:(e=Math.floor(e))>=o.length?Ji("0",e-o.length)+o:Dt}function cs(t){if(!/^[0-7]{1,10}$/.test(t))return Dt;const e=parseInt(t,8);return e>=536870912?e-1073741824:e}function ls(t,e){if(!/^[0-7]{1,10}$/.test(t))return Dt;const n=parseInt(t,8);if(n>=536870912)return"ff"+(n+3221225472).toString(16);const r=n.toString(16);return void 0===e?r:isNaN(e)?Lt:e<0?Dt:(e=Math.floor(e))>=r.length?Ji("0",e-r.length)+r:Dt}Ma.PRECISE=()=>{throw new Error("ERF.PRECISE is not implemented")},La.PRECISE=()=>{throw new Error("ERFC.PRECISE is not implemented")};const fs=Mn.DIST,hs=Mn.INV,ps=Ln.DIST,ds=io.MATH,ms=io.PRECISE,gs=Pn.DIST,vs=Pn.DIST.RT,ys=Pn.INV,Es=Pn.INV.RT,Ts=Pn.TEST,As=Wn.P,_s=Wn.P,Ns=Wn.S,Rs=Ln.INV,Os=La.PRECISE,Is=Ma.PRECISE,Ss=qn.DIST,bs=Yn.DIST,xs=Yn.DIST.RT,Cs=Yn.INV,Ms=Yn.INV.RT,Ls=_o.MATH,Ps=_o.PRECISE,ws=Yn.TEST,Ds=Zn.DIST,ks=Zn.INV,Fs=Qn.PRECISE,Us=rr.DIST,js=cr.INV,Vs=cr.DIST,Bs=cr.INV,Gs=mr.MULT,Ws=mr.SNGL,zs=gr.DIST,qs=_e.INTL,Ys=vr.DIST,Ks=vr.INV,Hs=vr.S.DIST,Xs=vr.S.INV,$s=Er.EXC,Zs=Er.INC,Qs=Tr.EXC,Js=Tr.INC,tu=Rr.DIST,eu=Ir.EXC,nu=Ir.INC,ru=Sr.AVG,ou=Sr.EQ,iu=Cr.P,au=wr.P,su=wr.S,uu=Ur.DIST,cu=Ur.DIST.RT,lu=Ur.INV,fu=Ur.TEST,hu=Br.P,pu=Br.S,du=zr.DIST,mu=Ce.INTL,gu=qr.TEST;function vu(t){const e=[];return re(t,t=>{t&&e.push(t)}),e}function yu(t,e){let n=null;return re(t,(t,r)=>{if(t[0]===e)return n=r,!1}),null==n?Lt:n}function Eu(t,e){const n={};for(let e=1;er&&(r=e[t].length);for(let o=1;o{i+=o[t]}),0===r.length?Mt:i/r.length}function Au(t,e,n){if(isNaN(e)&&"string"!=typeof e)return Lt;const r=Eu(t,n);let o=[];if("string"==typeof e){const n=yu(t,e);o=ne(t[n])}else o=ne(t[e]);const i=[];return re(r,t=>{i.push(o[t])}),kn(i)}function _u(t,e,n){if(isNaN(e)&&"string"!=typeof e)return Lt;const r=Eu(t,n);let o=[];if("string"==typeof e){const n=yu(t,e);o=ne(t[n])}else o=ne(t[e]);const i=[];return re(r,t=>{i.push(o[t])}),Fn(i)}function Nu(t,e,n){if(isNaN(e)&&"string"!=typeof e)return Lt;const r=Eu(t,n);let o=[];return o=ne("string"==typeof e?t[yu(t,e)]:t[e]),0===r.length?Lt:r.length>1?Dt:o[r[0]]}function Ru(t,e,n){if(isNaN(e)&&"string"!=typeof e)return Lt;const r=Eu(t,n);let o=[];if("string"==typeof e){const n=yu(t,e);o=ne(t[n])}else o=ne(t[e]);let i=o[r[0]];return re(r,t=>{i{i>o[t]&&(i=o[t])}),i}function Iu(t,e,n){if(isNaN(e)&&"string"!=typeof e)return Lt;const r=Eu(t,n);let o=[];if("string"==typeof e){const n=yu(t,e);o=ne(t[n])}else o=ne(t[e]);let i=[];re(r,t=>{i.push(o[t])}),i=vu(i);let a=1;return re(i,t=>{a*=t}),a}function Su(t,e,n){if(isNaN(e)&&"string"!=typeof e)return Lt;const r=Eu(t,n);let o=[];if("string"==typeof e){const n=yu(t,e);o=ne(t[n])}else o=ne(t[e]);let i=[];return re(r,t=>{i.push(o[t])}),i=vu(i),wr.S(i)}function bu(t,e,n){if(isNaN(e)&&"string"!=typeof e)return Lt;const r=Eu(t,n);let o=[];if("string"==typeof e){const n=yu(t,e);o=ne(t[n])}else o=ne(t[e]);let i=[];return re(r,t=>{i.push(o[t])}),i=vu(i),wr.P(i)}function xu(t,e,n){if(isNaN(e)&&"string"!=typeof e)return Lt;const r=Eu(t,n);let o=[];if("string"==typeof e){const n=yu(t,e);o=ne(t[n])}else o=ne(t[e]);const i=[];return re(r,t=>{i.push(o[t])}),yi(i)}function Cu(t,e,n){if(isNaN(e)&&"string"!=typeof e)return Lt;const r=Eu(t,n);let o=[];if("string"==typeof e){const n=yu(t,e);o=ne(t[n])}else o=ne(t[e]);const i=[];return re(r,t=>{i.push(o[t])}),Br.S(i)}function Mu(t,e,n){if(isNaN(e)&&"string"!=typeof e)return Lt;const r=Eu(t,n);let o=[];if("string"==typeof e){const n=yu(t,e);o=ne(t[n])}else o=ne(t[e]);const i=[];return re(r,t=>{i.push(o[t])}),Br.P(i)}function Lu(t){return t&&t.getTime&&!isNaN(t.getTime())}function Pu(t){return t instanceof Date?t:new Date(t)}function wu(t,e,n,r,o,i,a){return t=Pu(t),e=Pu(e),n=Pu(n),Lu(t)&&Lu(e)&&Lu(n)?r<=0||o<=0||-1===[1,2,4].indexOf(i)||-1===[0,1,2,3,4].indexOf(a)||n<=t?Dt:(o=o||0)*r*we(t,n,a=a||0):Lt}function Du(){throw new Error("ACCRINTM is not implemented")}function ku(){throw new Error("AMORDEGRC is not implemented")}function Fu(){throw new Error("AMORLINC is not implemented")}function Uu(){throw new Error("COUPDAYBS is not implemented")}function ju(){throw new Error("COUPDAYS is not implemented")}function Vu(){throw new Error("COUPDAYSNC is not implemented")}function Bu(){throw new Error("COUPNCD is not implemented")}function Gu(){throw new Error("COUPNUM is not implemented")}function Wu(){throw new Error("COUPPCD is not implemented")}function zu(t,e,n,r,o,i){if(Jt(t=Yt(t),e=Yt(e),n=Yt(n)))return Lt;if(t<=0||e<=0||n<=0)return Dt;if(r<1||o<1||r>o)return Dt;if(0!==i&&1!==i)return Dt;const a=mc(t,e,n,0,i);let s=0;1===r&&(0===i&&(s=-n),r++);for(let e=r;e<=o;e++)s+=1===i?Ju(t,e-2,a,n,1)-a:Ju(t,e-1,a,n,0);return s*=t,s}function qu(t,e,n,r,o,i){if(Jt(t=Yt(t),e=Yt(e),n=Yt(n)))return Lt;if(t<=0||e<=0||n<=0)return Dt;if(r<1||o<1||r>o)return Dt;if(0!==i&&1!==i)return Dt;const a=mc(t,e,n,0,i);let s=0;1===r&&(s=0===i?a+n*t:a,r++);for(let e=r;e<=o;e++)s+=i>0?a-(Ju(t,e-2,a,n,1)-a)*t:a-Ju(t,e-1,a,n,0)*t;return s}function Yu(t,e,n,r,o){if(o=void 0===o?12:o,Jt(t=Yt(t),e=Yt(e),n=Yt(n),r=Yt(r),o=Yt(o)))return Lt;if(t<0||e<0||n<0||r<0)return Dt;if(-1===[1,2,3,4,5,6,7,8,9,10,11,12].indexOf(o))return Dt;if(r>n)return Dt;if(e>=t)return 0;const i=(1-Math.pow(e/t,1/n)).toFixed(3),a=t*i*o/12;let s=a,u=0;const c=r===n?n-1:r;for(let e=2;e<=c;e++)u=(t-s)*i,s+=u;return 1===r?a:r===n?(t-s)*i:u}function Ku(t,e,n,r,o){if(o=void 0===o?2:o,Jt(t=Yt(t),e=Yt(e),n=Yt(n),r=Yt(r),o=Yt(o)))return Lt;if(t<0||e<0||n<0||r<0||o<=0)return Dt;if(r>n)return Dt;if(e>=t)return 0;let i=0,a=0;for(let s=1;s<=r;s++)a=Math.min(o/n*(t-i),t-e-i),i+=a;return a}function Hu(){throw new Error("DISC is not implemented")}function Xu(t,e){if(Jt(t=Yt(t),e=Yt(e)))return Lt;if(e<0)return Dt;if(e>=0&&e<1)return Mt;e=parseInt(e,10);let n=parseInt(t,10);n+=t%1*Math.pow(10,Math.ceil(Math.log(e)/Math.LN10))/e;const r=Math.pow(10,Math.ceil(Math.log(e)/Math.LN2)+1);return n=Math.round(n*r)/r,n}function $u(t,e){if(Jt(t=Yt(t),e=Yt(e)))return Lt;if(e<0)return Dt;if(e>=0&&e<1)return Mt;e=parseInt(e,10);let n=parseInt(t,10);return n+=t%1*Math.pow(10,-Math.ceil(Math.log(e)/Math.LN10))*e,n}function Zu(){throw new Error("DURATION is not implemented")}function Qu(t,e){return Jt(t=Yt(t),e=Yt(e))?Lt:t<=0||e<1?Dt:(e=parseInt(e,10),Math.pow(1+t/e,e)-1)}function Ju(t,e,n,r,o){if(r=r||0,o=o||0,Jt(t=Yt(t),e=Yt(e),n=Yt(n),r=Yt(r),o=Yt(o)))return Lt;let i;if(0===t)i=r+n*e;else{const a=Math.pow(1+t,e);i=1===o?r*a+n*(1+t)*(a-1)/t:r*a+n*(a-1)/t}return-i}function tc(t,e){if(Jt(t=Yt(t),e=Ht(Bt(e))))return Lt;const n=e.length;let r=t;for(let t=0;t{const r=n+1;let o=t[0];for(let n=1;n{const r=n+1;let o=0;for(let n=1;n0&&(i=!0),t[e]<0&&(a=!0);if(!i||!a)return Dt;let s,u,c,l=e=void 0===e?.1:e,f=!0;do{c=n(t,o,l),s=l-c/r(t,o,l),u=Math.abs(s-l),l=s,f=u>1e-10&&Math.abs(c)>1e-10}while(f);return l}function oc(t,e,n,r){return Jt(t=Yt(t),e=Yt(e),n=Yt(n),r=Yt(r))?Lt:r*t*(e/n-1)}function ic(){throw new Error("MDURATION is not implemented")}function ac(t,e,n){if(Jt(t=Ht(Bt(t)),e=Yt(e),n=Yt(n)))return Lt;const r=t.length,o=[],i=[];for(let e=0;en?Dt:(t-e)*(n-(r=parseInt(r,10))+1)*2/(n*(n+1))}function Ic(t,e,n){return Jt(t=Xt(t),e=Xt(e),n=Yt(n))?Lt:n<=0||t>e||e-t>31536e6?Dt:365*n/(360-n*de(t,e,!1))}function Sc(t,e,n){return Jt(t=Xt(t),e=Xt(e),n=Yt(n))?Lt:n<=0||t>e||e-t>31536e6?Dt:100*(1-n*de(t,e,!1)/360)}function bc(t,e,n){return Jt(t=Xt(t),e=Xt(e),n=Yt(n))?Lt:n<=0||t>e||e-t>31536e6?Dt:360*(100-n)/(n*de(t,e,!1))}function xc(){throw new Error("VDB is not implemented")}function Cc(t,e,n){if(Jt(t=Ht(Bt(t)),e=$t(Bt(e)),n=Yt(n)))return Lt;const r=(t,e,n)=>{const r=n+1;let o=t[0];for(let n=1;n{const r=n+1;let o=0;for(let n=1;n0&&(i=!0),t[e]<0&&(a=!0);if(!i||!a)return Dt;let s,u,c,l=n=n||.1,f=!0;do{c=r(t,e,l),s=l-c/o(t,e,l),u=Math.abs(s-l),l=s,f=u>1e-10&&Math.abs(c)>1e-10}while(f);return l}function Mc(t,e,n){if(Jt(t=Yt(t),e=Ht(Bt(e)),n=$t(Bt(n))))return Lt;let r=0;for(let o=0;o=2)||e)&&(e=0),null==(n=3===arguments.length&&n)&&(n=0),t?e:n)}function Uc(){for(let t=0;t0){const e=arguments[0],n=arguments.length-1,r=Math.floor(n/2);let o=!1;const i=n%2!=0,a=n%2==0?null:arguments[arguments.length-1];if(r)for(let n=0;n"number"==typeof t)}class Zc{constructor(t){this.context=t}getFunction(t){const e=t.toUpperCase();try{const{Calx:t}=n(3475);if(t.formulae&&t.formulae[e])return t.formulae[e]}catch(t){}if("SEQUENCE"===e)return this.sequenceFunction.bind(this);if("SORT"===e)return this.sortFunction.bind(this);if("FILTER"===e)return this.filterFunction.bind(this);if("UNIQUE"===e)return this.uniqueFunction.bind(this);let r=o[e];return r&&"object"==typeof r&&!Array.isArray(r)&&("function"==typeof r.S?r=r.S:"function"==typeof r.P&&(r=r.P)),"function"==typeof r?r:void 0}sequenceFunction(t,e=1,n=1,r=1){const o=[];let i=n;for(let n=0;nt[0]):o}sortFunction(t,e=1,n=1,r=!1){let o;o=Array.isArray(t)?Array.isArray(t[0])?t:t.map(t=>[t]):[[t]];const i=o.map(t=>[...t]);if(!r){const t=e-1;i.sort((e,r)=>{const o=e[t],i=r[t];return null==o&&null==i?0:null==o?1===n?1:-1:null==i||oi?1===n?1:-1:0})}return Array.isArray(t[0])?i:i.map(t=>t[0])}filterFunction(t,e,n="#N/A"){let r,o;r=Array.isArray(t)?Array.isArray(t[0])?t:t.map(t=>[t]):[[t]],o=Array.isArray(e)?Array.isArray(e[0])?e.map(t=>t[0]):e:[e];const i=r.filter((t,e)=>{const n=o[e];return!1!==n&&0!==n&&null!=n});return 0===i.length?n:Array.isArray(t[0])?i:i.map(t=>t[0])}uniqueFunction(t,e=!1,n=!1){let r,o=!1;Array.isArray(t)?Array.isArray(t[0])?r=t:(r=t.map(t=>[t]),o=!0):(r=[[t]],o=!0);const i=[],a=new Map;for(const t of r){const e=JSON.stringify(t),n=a.get(e)||0;a.set(e,n+1),0===n&&i.push(t)}if(n){const t=i.filter(t=>{const e=JSON.stringify(t);return 1===a.get(e)});return 0===t.length?"#N/A":o?t.map(t=>t[0]):t}return o?i.map(t=>t[0]):i}callFunction(t,e){const n=this.getFunction(t);if(!n)throw new Error(`Function ${t} not found`);try{let r=n(...e.map(t=>this.convertArg(t)));if(r instanceof Date){const t=new Date(1899,11,30).getTime(),e=864e5;r=Math.floor((r.getTime()-t)/e)}return Array.isArray(r)&&this.isDynamicArrayFunction(t)?r.length>0&&Array.isArray(r[0])?Z.from2DArray(r):Z.fromVerticalArray(r):r&&"object"==typeof r&&r.error?"#ERROR!":r}catch(e){return console.error(`Error calling function ${t}:`,e),"#ERROR!"}}isDynamicArrayFunction(t){return["SEQUENCE","SORT","UNIQUE","FILTER","RANDARRAY","SORTBY","XLOOKUP","XMATCH"].includes(t.toUpperCase())}convertArg(t){if(null==t)return t;if(Array.isArray(t))return t.map(t=>this.convertArg(t));if(t&&"object"==typeof t&&"function"==typeof t.toArray){const e=t.toArray();return 1===e.length?e[0]:e}return t&&"object"==typeof t&&"value"in t?t.value:t}getAvailableFunctions(){return Object.keys(o).filter(t=>"function"==typeof o[t])}hasFunction(t){return void 0!==this.getFunction(t)}}class Qc{constructor(t){this.sheets={},Object.assign(this,t),this._formulaJSWrapper=new Zc(this)}setActiveSheet(t){this.activeSheet=t}setWorkbook(t){this.workbook=t}addSheet(t){this.sheets[t.id]=t}callFunction(t,e){return this._formulaJSWrapper?this._formulaJSWrapper.callFunction(t,e):"#NAME?"}getFunction(t){if(this._formulaJSWrapper)return this._formulaJSWrapper.getFunction(t)}getVariable(t,e){const n=e?this.sheets[e]:this.activeSheet;return n?n.getVariable(t):"#NAME?"}getCellValue(t,e){let n=this.activeSheet;return e&&(n=this.sheets[e]||Object.values(this.sheets).find(t=>t.name===e)),n?n.getCellValue(t):"#REF!"}getCellRange(t,e){const n=e?this.sheets[e]:this.activeSheet;if(n){const[e,r]=t.split(":");return n.getCellRangeValues(e,r)}return[]}getRowRange(t,e){const n=e?this.sheets[e]:this.activeSheet;return n?n.getRowRangeValues(t):[]}getColumnRange(t,e){const n=e?this.sheets[e]:this.activeSheet;return n?n.getColumnRangeValues(t):[]}getNamedRange(t){return this.workbook?this.workbook.nameManager.resolve(t):"#NAME?"}}class Jc{constructor(){this._nameRegistry={}}setContext(t){this._workbook=t}define(t,e,n,r){return!!this.isValidName(t)&&(this._nameRegistry[t]={name:t,reference:e,sheetName:n,comment:r},!0)}isValidName(t){return!!/^[a-zA-Z_]/.test(t)&&(!!/^[a-zA-Z_][a-zA-Z0-9_\.]*$/.test(t)&&(!/^[A-Z]+[0-9]+$/.test(t)&&!["TRUE","FALSE","NULL"].includes(t.toUpperCase())))}getReference(t){const e=this._nameRegistry[t];return null==e?void 0:e.reference}resolve(t){const e=this._nameRegistry[t];if(!e)return"#NAME?";let n=this._workbook.getActiveSheet();if(!n){const t=this._workbook.getSheets(),e=Object.keys(t);e.length>0&&(n=t[e[0]])}n&&this._workbook.setActiveSheet(n);const r=e.reference.startsWith("=")?e.reference:`=${e.reference}`;return this._workbook.parser.parse(r)}has(t){return t in this._nameRegistry}getAll(){return Object.values(this._nameRegistry)}get(t){return this._nameRegistry[t]}remove(t){return t in this._nameRegistry&&(delete this._nameRegistry[t],!0)}clear(){this._nameRegistry={}}}const tl={equal:(t,e)=>"string"==typeof t?t.toLowerCase()==(""+e).toLowerCase():t==e,notEqual:(t,e)=>"string"==typeof t?t.toLowerCase()!=(""+e).toLowerCase():t!=e,lessThan:(t,e)=>tt>e,lessEqualThan:(t,e)=>t<=e,greaterEqualThan:(t,e)=>t>=e};function el(t){const e=new J;return e.setContext(t),e}const nl={currency:{format:t=>null==t||isNaN(t)?"":"$"+Number(t).toFixed(2).replace(/\B(?=(\d{3})+(?!\d))/g,","),parse:t=>{const e=String(t).replace(/[$,\s]/g,""),n=parseFloat(e);return isNaN(n)?null:n}},percent:{format:t=>null==t||isNaN(t)?"":(100*Number(t)).toFixed(2)+"%",parse:t=>{const e=String(t).trim(),n=e.includes("%"),r=e.replace(/[%\s]/g,""),o=parseFloat(r);return isNaN(o)?null:n?o/100:o}},number:{format:t=>null==t||isNaN(t)?"":Number(t).toFixed(2),parse:t=>{const e=parseFloat(String(t));return isNaN(e)?null:e}},integer:{format:t=>null==t||isNaN(t)?"":Math.round(Number(t)).toString(),parse:t=>{const e=parseFloat(String(t));return isNaN(e)?null:Math.round(e)}},text:{format:t=>null!=t?String(t):"",parse:t=>t}},rl={negative:(t,e)=>t<0?{color:"red"}:{color:""},positive:(t,e)=>t>0?{color:"green"}:{color:""},zero:(t,e)=>0===t?{color:"gray"}:{color:""}};class ol{constructor(t,e,n){this._autoCalculate=!0,this._elements=new Set,this._eventListeners=new Map,this._formatters={},this._styleFormatters={},this._sheets={},this._parser=t,this._dispatcher=n,this._nameManager=e,this._nameManager.setContext(this)}get parser(){return this._parser}get dispatcher(){return this._dispatcher}get nameManager(){return this._nameManager}get autoCalculate(){return this._autoCalculate}set autoCalculate(t){this._autoCalculate=t;for(const e in this._sheets)this._sheets[e].autoCalculate=t}setActiveSheet(t){if(this._parser){const e=this._parser.getContext();e&&(e.activeSheet=t,e.setActiveSheet(t))}}getActiveSheet(){var t;return null===(t=this._parser.yy)||void 0===t?void 0:t.activeSheet}isValidCellAddress(t){return t.match(/^[A-Z]+\d+$/)}calculate(){this._deps||this.build();for(const t in this._sheets)this._sheets[t].calculate()}build(){this._depsBuilder=new ct.B;for(const t in this._sheets)this._sheets[t].buildDependencyTree()}hydrateObj(t){for(const e in t)if("object"==typeof t[e])this.hydrateObj(t[e]);else if("string"==typeof t[e]&&t[e].startsWith("#")){const[n,r]=t[e].split("!");n in this._sheets&&(t[e]=this._sheets[n].getCell(r).value)}}attachElement(t){this._elements.add(t)}detachElement(t){this._elements.delete(t),this._removeElementListeners(t)}_addElementListener(t,e,n,r){this._eventListeners.has(t)||this._eventListeners.set(t,[]),this._eventListeners.get(t).push({event:e,handler:n,element:r})}_removeElementListeners(t){const e=this._eventListeners.get(t);e&&(e.forEach(({event:t,handler:e,element:n})=>{n.removeEventListener(t,e)}),this._eventListeners.delete(t))}registerFormatter(t,e){this._formatters[t]=e}registerStyleFormatter(t,e){this._styleFormatters[t]=e}getFormatter(t){return this._formatters[t]||nl[t]}getStyleFormatter(t){return this._styleFormatters[t]||rl[t]}static registerGlobalFormatter(t,e){nl[t]=e}static registerGlobalStyleFormatter(t,e){rl[t]=e}static getGlobalFormatter(t){return nl[t]}destroy(){this._elements.forEach(t=>{this._removeElementListeners(t)}),this._elements.clear(),this._eventListeners.clear();for(const t in this._sheets)delete this._sheets[t];this._parser&&this._parser.yy&&(this._parser.yy.sheets={})}createSheet(t,e){if(!t)throw new Error("Sheet should have a name");if(this._sheets[t])throw new Error(`Sheet with the name "${t}" is already exists`);const n=new St(this,t);return n.autoCalculate=this._autoCalculate,e&&(n.element=e),this._sheets[t]=n,this._parser&&this._parser.yy&&(this._parser.yy.sheets[t]=n),n}getSheets(){return this._sheets}getSheet(t){if(t in this._sheets)return this._sheets[t];throw Error(`Sheet not found with name ${t}`)}loadData(t){var e;for(const n in t.sheets){const r=this.createSheet(n,null===(e=t.sheets[n])||void 0===e?void 0:e.element);for(const e in t.sheets[n].cells){const o=t.sheets[n].cells[e];r.createCell(e,o)}}}exportJSON(){const t={sheets:{}};for(const e in this._sheets){const n=this._sheets[e],r=n.cells;t.sheets[e]={element:n.element,cells:{},variables:{}};for(const n in r){const o=r[n],i={};o.formula?i.formula=o.formula:void 0!==o.value&&(i.value=o.value),o.type&&(i.type=o.type),(i.formula||void 0!==i.value)&&(t.sheets[e].cells[n]=i)}}return t}static createFromData(t){const e=new Qc({sheets:{},utility:r,comparator:tl}),n=el(e),o=new rt.Q,i=new Jc,a=new ol(n,i,o);return e.workbook=a,a.loadData(t),a}static createFromElement(t,e){const n=new Qc({sheets:{},utility:r,comparator:tl}),o=el(n),i=new rt.Q,a=new Jc,s=new ol(o,a,i);let u;if(n.workbook=s,s._autoCalculate=!1!==(null==e?void 0:e.autoCalculate),u="undefined"!=typeof NodeList&&t instanceof NodeList?Array.from(t):Array.isArray(t)?t:[t],e&&e.variables){const t=e.variables;Object.keys(t).forEach(e=>{const n=t[e];s.nameManager.define(e,n)})}const c=void 0!==(null==e?void 0:e.sheets);return e&&c&&s.loadData(e),u.forEach((t,n)=>{s.attachElement(t);const r=t.id||t.getAttribute("data-sheet")||`Sheet${n+1}`;if(e&&!c){const n=e,o={};if(Object.keys(n).forEach(t=>{"autoCalculate"!==t&&"variables"!==t&&"sheets"!==t&&(o[t]=n[t])}),Object.keys(o).length>0){const e={sheets:{[r]:{element:t,cells:o,variables:{}}}};s.loadData(e)}}let o;try{o=s.getSheet(r)}catch(e){o=s.createSheet(r,t)}s._processDataAttributes(t,o),s._setupEventListeners(t,o)}),s.build(),s.calculate(),u.forEach(t=>{const e=t.id||t.getAttribute("data-sheet")||"Sheet1";try{const n=s.getSheet(e);n&&s._updateAllCells(t,n)}catch(t){}}),s}_processDataAttributes(t,e){let n=1;t.querySelectorAll("[data-formula]:not([data-cell]").forEach(t=>{const e=`CALX${n}`;t.setAttribute("data-cell",e),n++}),t.querySelectorAll("[data-cell]").forEach(t=>{var n;const r=t.getAttribute("data-cell");if(!r)return;const o=t.getAttribute("data-var");o&&this.nameManager.define(o,r);const i=t.getAttribute("data-formula"),a=t.getAttribute("data-format"),s=t.getAttribute("data-type"),u=t.tagName.toLowerCase();let c=null;"input"===u||"textarea"===u||"select"===u?(c=t.getAttribute("value"),c||(c=t.value||t.defaultValue||"")):c=(null===(n=t.textContent)||void 0===n?void 0:n.trim())||"";const l=e.getCell(r);if(s){const t={number:ot.NUMBER,text:ot.TEXT,boolean:ot.BOOLEAN,date:ot.DATE};l.type=t[s.toLowerCase()]||s}if(c&&a){const t=this.getFormatter(a);t&&t.parse&&(c=t.parse(c))}i?l.formula=i:null!==c&&""!==c&&void 0===l.value&&(l.value=c),a&&l.setFormat(a)})}_setupEventListeners(t,e){const n=t=>{const n=t.target,r=n.getAttribute("data-format"),o=n.getAttribute("data-cell");if(r&&o){const t=e.getCellDirect(o);if(t){const e=t.value;n.value=null!=e?String(e):""}}},r=t=>{const n=t.target,r=n.getAttribute("data-format"),o=n.getAttribute("data-cell");if(r&&o){const t=e.getCellDirect(o);if(t){const e=this.getFormatter(r);if(e){const r=e.format(t.value);n.value=r}}}},o=n=>{const r=n.target,o=r.getAttribute("data-format"),i=r.getAttribute("data-cell");if(o&&i){const n=e.getCellDirect(i);if(n){const i=r.value,a=this.getFormatter(o);if(a&&a.parse){const o=r.readOnly||r.readonly,s=!!r.getAttribute("data-formula");if(!o&&!s){const r=a.parse(i);null!==r&&r!==n.value&&(n.value=r,this._autoCalculate&&(this.calculate(),this._updateAllCells(t,e)))}}}}},i=n=>{const r=n.target,o=r.getAttribute("data-format"),i=r.getAttribute("data-cell");if(!o&&i){const n=e.getCellDirect(i);if(n&&!n.formula){const o=r.value;n.value=o,this._autoCalculate&&(this.calculate(),this._updateAllCells(t,e))}}};t.querySelectorAll("[data-cell]").forEach(e=>{const a=e.tagName.toLowerCase();"input"!==a&&"textarea"!==a&&"select"!==a||(e.getAttribute("data-format")?(e.addEventListener("focus",n),e.addEventListener("blur",r),e.addEventListener("change",o),this._addElementListener(t,"focus",n,e),this._addElementListener(t,"blur",r,e),this._addElementListener(t,"change",o,e)):(e.addEventListener("input",i),e.addEventListener("change",i),this._addElementListener(t,"input",i,e),this._addElementListener(t,"change",i,e)))})}_updateAllCells(t,e){t.querySelectorAll("[data-cell]").forEach(t=>{const n=t.getAttribute("data-cell");if(!n)return;const r=e.getCellDirect(n);if(!r)return;const o=r.value,i=t.tagName.toLowerCase(),a="undefined"!=typeof globalThis&&globalThis.document;if(a&&a.activeElement===t)return;const s=t.getAttribute("data-format"),u=r.getFormat();let c;if(s){const t=this.getFormatter(s);c=t?t.format(o):null!=o?String(o):""}else if(u){const t=this.getFormatter(u);c=t?t.format(o):null!=o?String(o):""}else c=null!=o?String(o):"";"input"===i||"textarea"===i||"select"===i?t.value!==c&&(t.value=c):t.textContent=c,this._applyStyleFormatter(o,t)})}_applyStyleFormatter(t,e){const n=e.getAttribute("data-style-if");if(n){const r=this.getStyleFormatter(n);if(r){const n=r(t,e);if(n&&"object"==typeof n)for(const t in n)e.style[t]=n[t]}}}}class il{static setFormula(t,e){il.formulae[t]=e}static setFormulae(t){il.formulae=Object.assign(Object.assign({},il.formulae),t)}static createWorkbook(){return il.createWorkbookFromData({sheets:{}})}static createWorkbookFromData(t){return ol.createFromData(t)}static createWorkbookFromElement(t,e){return ol.createFromElement(t,e)}static createParser(){return new X}static createInterpreter(){return new J}static exportJSON(t){return t.exportJSON()}}il.formulae={}},3488:t=>{t.exports=function(t){return t}},3598:function(t,e,n){var r=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0}),e.getProductionDslName=e.isBranchingProd=e.isOptionalProd=e.isSequenceProd=void 0;var o=r(n(2426)),i=r(n(9747)),a=r(n(9859)),s=n(8538);e.isSequenceProd=function(t){return t instanceof s.Alternative||t instanceof s.Option||t instanceof s.Repetition||t instanceof s.RepetitionMandatory||t instanceof s.RepetitionMandatoryWithSeparator||t instanceof s.RepetitionWithSeparator||t instanceof s.Terminal||t instanceof s.Rule},e.isOptionalProd=function t(e,n){return void 0===n&&(n=[]),!!(e instanceof s.Option||e instanceof s.Repetition||e instanceof s.RepetitionWithSeparator)||(e instanceof s.Alternation?(0,o.default)(e.definition,function(e){return t(e,n)}):!(e instanceof s.NonTerminal&&(0,a.default)(n,e))&&e instanceof s.AbstractProduction&&(e instanceof s.NonTerminal&&n.push(e),(0,i.default)(e.definition,function(e){return t(e,n)})))},e.isBranchingProd=function(t){return t instanceof s.Alternation},e.getProductionDslName=function(t){if(t instanceof s.NonTerminal)return"SUBRULE";if(t instanceof s.Option)return"OPTION";if(t instanceof s.Alternation)return"OR";if(t instanceof s.RepetitionMandatory)return"AT_LEAST_ONE";if(t instanceof s.RepetitionMandatoryWithSeparator)return"AT_LEAST_ONE_SEP";if(t instanceof s.RepetitionWithSeparator)return"MANY_SEP";if(t instanceof s.Repetition)return"MANY";if(t instanceof s.Terminal)return"CONSUME";throw Error("non exhaustive match")}},3605:t=>{t.exports=function(t){return this.__data__.get(t)}},3650:(t,e,n)=>{var r=n(4335)(Object.keys,Object);t.exports=r},3656:(t,e,n)=>{t=n.nmd(t);var r=n(9325),o=n(9935),i=e&&!e.nodeType&&e,a=i&&t&&!t.nodeType&&t,s=a&&a.exports===i?r.Buffer:void 0,u=(s?s.isBuffer:void 0)||o;t.exports=u},3661:(t,e,n)=>{var r=n(3040),o=n(7670),i=n(289),a=n(4509),s=n(2949);function u(t){var e=-1,n=null==t?0:t.length;for(this.clear();++e{var r=n(1799),o=n(776),i=n(7197);t.exports=function(t){var e=o(t);return 1==e.length&&e[0][2]?i(e[0][0],e[0][1]):function(n){return n===t||r(n,t,e)}}},3673:t=>{t.exports=function(t){for(var e=-1,n=null==t?0:t.length,r=0,o=[];++e{var r=n(4894),o=n(346);t.exports=function(t){return o(t)&&r(t)}},3702:t=>{t.exports=function(){this.__data__=[],this.size=0}},3729:t=>{t.exports=function(t,e){for(var n=-1,r=null==t?0:t.length;++n{var r=n(1873),o=r?r.prototype:void 0,i=o?o.valueOf:void 0;t.exports=function(t){return i?Object(i.call(t)):{}}},3739:(t,e,n)=>{var r=n(5160),o=n(1489);t.exports=function(t,e,n){var i=null==t?0:t.length;return i?(e=n||void 0===e?1:o(e),r(t,e<0?0:e,i)):[]}},3777:(t,e,n)=>{var r=n(909);t.exports=function(t,e){var n=!0;return r(t,function(t,r,o){return n=!!e(t,r,o)}),n}},3805:t=>{t.exports=function(t){var e=typeof t;return null!=t&&("object"==e||"function"==e)}},3838:(t,e,n)=>{var r=n(1791),o=n(7241);t.exports=function(t,e){return t&&r(e,o(e),t)}},3862:t=>{t.exports=function(t){var e=this.has(t)&&delete this.__data__[t];return this.size-=e?1:0,e}},3912:(t,e,n)=>{var r=n(1074),o=n(9698),i=n(2054);t.exports=function(t){return o(t)?i(t):r(t)}},3915:(t,e,n)=>{var r=n(8859),o=n(5325),i=n(9905),a=n(4932),s=n(7301),u=n(9219);t.exports=function(t,e,n,c){var l=-1,f=o,h=!0,p=t.length,d=[],m=e.length;if(!p)return d;n&&(e=a(e,s(n))),c?(f=i,h=!1):e.length>=200&&(f=u,h=!1,e=new r(e));t:for(;++l{t.exports=function(t,e,n,r){for(var o=-1,i=null==t?0:t.length;++o{t.exports=function(){}},4066:(t,e,n)=>{var r=n(3488);t.exports=function(t){return"function"==typeof t?t:r}},4105:(t,e,n)=>{Object.defineProperty(e,"__esModule",{value:!0}),e.GAstVisitor=void 0;var r=n(8538),o=function(){function t(){}return t.prototype.visit=function(t){var e=t;switch(e.constructor){case r.NonTerminal:return this.visitNonTerminal(e);case r.Alternative:return this.visitAlternative(e);case r.Option:return this.visitOption(e);case r.RepetitionMandatory:return this.visitRepetitionMandatory(e);case r.RepetitionMandatoryWithSeparator:return this.visitRepetitionMandatoryWithSeparator(e);case r.RepetitionWithSeparator:return this.visitRepetitionWithSeparator(e);case r.Repetition:return this.visitRepetition(e);case r.Alternation:return this.visitAlternation(e);case r.Terminal:return this.visitTerminal(e);case r.Rule:return this.visitRule(e);default:throw Error("non exhaustive match")}},t.prototype.visitNonTerminal=function(t){},t.prototype.visitAlternative=function(t){},t.prototype.visitOption=function(t){},t.prototype.visitRepetition=function(t){},t.prototype.visitRepetitionMandatory=function(t){},t.prototype.visitRepetitionMandatoryWithSeparator=function(t){},t.prototype.visitRepetitionWithSeparator=function(t){},t.prototype.visitAlternation=function(t){},t.prototype.visitTerminal=function(t){},t.prototype.visitRule=function(t){},t}();e.GAstVisitor=o},4128:(t,e,n)=>{var r=n(1800),o=/^\s+/;t.exports=function(t){return t?t.slice(0,r(t)+1).replace(o,""):t}},4218:t=>{t.exports=function(t){var e=typeof t;return"string"==e||"number"==e||"symbol"==e||"boolean"==e?"__proto__"!==t:null===t}},4247:t=>{t.exports=function(t){var e=-1,n=Array(t.size);return t.forEach(function(t){n[++e]=t}),n}},4248:t=>{t.exports=function(t,e){for(var n=-1,r=null==t?0:t.length;++n{t.exports=function(t,e){return function(n){return t(e(n))}}},4394:(t,e,n)=>{var r=n(2552),o=n(346);t.exports=function(t){return"symbol"==typeof t||o(t)&&"[object Symbol]"==r(t)}},4471:function(t,e,n){var r,o=this&&this.__extends||(r=function(t,e){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n])},r(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function n(){this.constructor=t}r(t,e),t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)}),i=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0}),e.nextPossibleTokensAfter=e.possiblePathsFrom=e.NextTerminalAfterAtLeastOneSepWalker=e.NextTerminalAfterAtLeastOneWalker=e.NextTerminalAfterManySepWalker=e.NextTerminalAfterManyWalker=e.AbstractNextTerminalAfterProductionWalker=e.NextAfterTokenWalker=e.AbstractNextPossibleTokensWalker=void 0;var a=n(3131),s=i(n(6170)),u=i(n(2193)),c=i(n(7537)),l=i(n(3739)),f=i(n(8090)),h=i(n(9754)),p=i(n(2629)),d=n(2195),m=n(3387),g=function(t){function e(e,n){var r=t.call(this)||this;return r.topProd=e,r.path=n,r.possibleTokTypes=[],r.nextProductionName="",r.nextProductionOccurrence=0,r.found=!1,r.isAtEndOfPath=!1,r}return o(e,t),e.prototype.startWalking=function(){if(this.found=!1,this.path.ruleStack[0]!==this.topProd.name)throw Error("The path does not start with the walker's top Rule!");return this.ruleStack=(0,p.default)(this.path.ruleStack).reverse(),this.occurrenceStack=(0,p.default)(this.path.occurrenceStack).reverse(),this.ruleStack.pop(),this.occurrenceStack.pop(),this.updateExpectedNext(),this.walk(this.topProd),this.possibleTokTypes},e.prototype.walk=function(e,n){void 0===n&&(n=[]),this.found||t.prototype.walk.call(this,e,n)},e.prototype.walkProdRef=function(t,e,n){if(t.referencedRule.name===this.nextProductionName&&t.idx===this.nextProductionOccurrence){var r=e.concat(n);this.updateExpectedNext(),this.walk(t.referencedRule,r)}},e.prototype.updateExpectedNext=function(){(0,u.default)(this.ruleStack)?(this.nextProductionName="",this.nextProductionOccurrence=0,this.isAtEndOfPath=!0):(this.nextProductionName=this.ruleStack.pop(),this.nextProductionOccurrence=this.occurrenceStack.pop())},e}(a.RestWalker);e.AbstractNextPossibleTokensWalker=g;var v=function(t){function e(e,n){var r=t.call(this,e,n)||this;return r.path=n,r.nextTerminalName="",r.nextTerminalOccurrence=0,r.nextTerminalName=r.path.lastTok.name,r.nextTerminalOccurrence=r.path.lastTokOccurrence,r}return o(e,t),e.prototype.walkTerminal=function(t,e,n){if(this.isAtEndOfPath&&t.terminalType.name===this.nextTerminalName&&t.idx===this.nextTerminalOccurrence&&!this.found){var r=e.concat(n),o=new m.Alternative({definition:r});this.possibleTokTypes=(0,d.first)(o),this.found=!0}},e}(g);e.NextAfterTokenWalker=v;var y=function(t){function e(e,n){var r=t.call(this)||this;return r.topRule=e,r.occurrence=n,r.result={token:void 0,occurrence:void 0,isEndOfRule:void 0},r}return o(e,t),e.prototype.startWalking=function(){return this.walk(this.topRule),this.result},e}(a.RestWalker);e.AbstractNextTerminalAfterProductionWalker=y;var E=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.prototype.walkMany=function(e,n,r){if(e.idx===this.occurrence){var o=(0,s.default)(n.concat(r));this.result.isEndOfRule=void 0===o,o instanceof m.Terminal&&(this.result.token=o.terminalType,this.result.occurrence=o.idx)}else t.prototype.walkMany.call(this,e,n,r)},e}(y);e.NextTerminalAfterManyWalker=E;var T=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.prototype.walkManySep=function(e,n,r){if(e.idx===this.occurrence){var o=(0,s.default)(n.concat(r));this.result.isEndOfRule=void 0===o,o instanceof m.Terminal&&(this.result.token=o.terminalType,this.result.occurrence=o.idx)}else t.prototype.walkManySep.call(this,e,n,r)},e}(y);e.NextTerminalAfterManySepWalker=T;var A=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.prototype.walkAtLeastOne=function(e,n,r){if(e.idx===this.occurrence){var o=(0,s.default)(n.concat(r));this.result.isEndOfRule=void 0===o,o instanceof m.Terminal&&(this.result.token=o.terminalType,this.result.occurrence=o.idx)}else t.prototype.walkAtLeastOne.call(this,e,n,r)},e}(y);e.NextTerminalAfterAtLeastOneWalker=A;var _=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.prototype.walkAtLeastOneSep=function(e,n,r){if(e.idx===this.occurrence){var o=(0,s.default)(n.concat(r));this.result.isEndOfRule=void 0===o,o instanceof m.Terminal&&(this.result.token=o.terminalType,this.result.occurrence=o.idx)}else t.prototype.walkAtLeastOneSep.call(this,e,n,r)},e}(y);function N(t,e,n,r){var o=(0,p.default)(n);o.push(t.name);var i=(0,p.default)(r);return i.push(1),{idx:e,def:t.definition,ruleStack:o,occurrenceStack:i}}e.NextTerminalAfterAtLeastOneSepWalker=_,e.possiblePathsFrom=function t(e,n,r){void 0===r&&(r=[]),r=(0,p.default)(r);var o=[],i=0;function a(a){var s=t(a.concat((0,l.default)(e,i+1)),n,r);return o.concat(s)}for(;r.length=0;w--){var D={idx:T,def:R.definition[w].definition.concat((0,l.default)(E)),ruleStack:A,occurrenceStack:_};v.push(D),v.push(a)}else if(R instanceof m.Alternative)v.push({idx:T,def:R.definition.concat((0,l.default)(E)),ruleStack:A,occurrenceStack:_});else{if(!(R instanceof m.Rule))throw Error("non exhaustive match");v.push(N(R,T,A,_))}}}else s&&(0,f.default)(v).idx<=d&&v.pop()}return g}},4509:(t,e,n)=>{var r=n(2651);t.exports=function(t){return r(this,t).has(t)}},4517:(t,e,n)=>{var r=n(6545),o=n(3950),i=n(4247),a=r&&1/i(new r([,-0]))[1]==1/0?function(t){return new r(t)}:o;t.exports=a},4528:t=>{t.exports=function(t,e){for(var n=-1,r=e.length,o=t.length;++n{Object.defineProperty(e,"__esModule",{value:!0}),e.defineNameProp=void 0,e.defineNameProp=function(t,e){Object.defineProperty(t,"name",{enumerable:!1,configurable:!0,writable:!1,value:e})}},4664:(t,e,n)=>{var r=n(9770),o=n(3345),i=Object.prototype.propertyIsEnumerable,a=Object.getOwnPropertySymbols,s=a?function(t){return null==t?[]:(t=Object(t),r(a(t),function(e){return i.call(t,e)}))}:o;t.exports=s},4684:(t,e,n)=>{var r=n(9302),o=n(5288),i=n(6800),a=n(7241),s=Object.prototype,u=s.hasOwnProperty,c=r(function(t,e){t=Object(t);var n=-1,r=e.length,c=r>2?e[2]:void 0;for(c&&i(e[0],e[1],c)&&(r=1);++n{var r=n(2523),o=n(5389),i=n(1489),a=Math.max;t.exports=function(t,e,n){var s=null==t?0:t.length;if(!s)return-1;var u=null==n?0:i(n);return u<0&&(u=a(s+u,0)),r(t,o(e,3),u)}},4733:(t,e,n)=>{var r=n(1791),o=n(5950);t.exports=function(t,e){return t&&r(e,o(e),t)}},4739:(t,e,n)=>{var r=n(6025);t.exports=function(t){var e=this.__data__,n=r(e,t);return n<0?void 0:e[n][1]}},4809:(t,e)=>{var n;n=function(t){t.version="1.0.2";var e=Math;function n(t,e){for(var n=0,r=0;no)i=r(n,o,u(n),p(n),-1);else{for(var a=!1,s=0,c=0,l=1,f=0,h=2/n,d=2*e.floor((o+e.floor(e.sqrt(40*o)))/2);d>0;d--)f=d*h*l-s,s=l,l=f,e.abs(l)>1e10&&(l*=1e-10,s*=1e-10,i*=1e-10,c*=1e-10),a&&(c+=l),a=!a,d==o&&(i=s);i/=c=2*c-l}return i}}(),E=(i=.636619772,a=[-2957821389,7062834065,-512359803.6,10879881.29,-86327.92757,228.4622733].reverse(),s=[40076544269,745249964.8,7189466.438,47447.2647,226.1030244,1].reverse(),u=[1,-.001098628627,2734510407e-14,-2073370639e-15,2.093887211e-7].reverse(),c=[-.01562499995,.0001430488765,-6911147651e-15,7.621095161e-7,-9.34945152e-8].reverse(),l=[-4900604943e3,127527439e4,-51534381390,734926455.1,-4237922.726,8511.937935].reverse(),f=[249958057e5,424441966400,3733650367,22459040.02,102042.605,354.9632885,1].reverse(),h=[1,.00183105,-3516396496e-14,2457520174e-15,-2.40337019e-7].reverse(),p=[.04687499995,-.0002002690873,8449199096e-15,-8.8228987e-7,1.05787412e-7].reverse(),o(function(t){var r=0,o=0,l=0,f=t*t,h=t-.785398164;return t<8?r=(o=n(a,f))/(l=n(s,f))+i*y(t,0)*e.log(t):(o=n(u,f=64/f),l=n(c,f),r=e.sqrt(i/t)*(e.sin(h)*o+e.cos(h)*l*8/t)),r},function(t){var r=0,o=0,a=0,s=t*t,u=t-2.356194491;return t<8?r=(o=t*n(l,s))/(a=n(f,s))+i*(y(t,1)*e.log(t)-1/t):(o=n(h,s=64/s),a=n(p,s),r=e.sqrt(i/t)*(e.sin(u)*o+e.cos(u)*a*8/t)),r},0,1,-1)),T=(d=[1,3.5156229,3.0899424,1.2067492,.2659732,.0360768,.0045813].reverse(),m=[.39894228,.01328592,.00225319,-.00157565,.00916281,-.02057706,.02635537,-.01647633,.00392377].reverse(),g=[.5,.87890594,.51498869,.15084934,.02658733,.00301532,32411e-8].reverse(),v=[.39894228,-.03988024,-.00362018,.00163801,-.01031555,.02282967,-.02895312,.01787654,-.00420059].reverse(),function t(r,o){if(0===(o=Math.round(o)))return function(t){return t<=3.75?n(d,t*t/14.0625):e.exp(e.abs(t))/e.sqrt(e.abs(t))*n(m,3.75/e.abs(t))}(r);if(1===o)return function(t){return t<3.75?t*n(g,t*t/14.0625):(t<0?-1:1)*e.exp(e.abs(t))/e.sqrt(e.abs(t))*n(v,3.75/e.abs(t))}(r);if(o<0)return NaN;if(0===e.abs(r))return 0;if(r==1/0)return 1/0;var i,a=0,s=2/e.abs(r),u=0,c=1,l=0;for(i=2*e.round((o+e.round(e.sqrt(40*o)))/2);i>0;i--)l=i*s*c+u,u=c,c=l,e.abs(c)>1e10&&(c*=1e-10,u*=1e-10,a*=1e-10),i==o&&(a=u);return a*=t(r,0)/c,r<0&&o%2?-a:a}),A=function(){var t=[-.57721566,.4227842,.23069756,.0348859,.00262698,1075e-7,74e-7].reverse(),r=[1.25331414,-.07832358,.02189568,-.01062446,.00587872,-.0025154,53208e-8].reverse(),i=[1,.15443144,-.67278579,-.18156897,-.01919402,-.00110404,-4686e-8].reverse(),a=[1.25331414,.23498619,-.0365562,.01504268,-.00780353,.00325614,-68245e-8].reverse();return o(function(o){return o<=2?-e.log(o/2)*T(o,0)+n(t,o*o/4):e.exp(-o)/e.sqrt(o)*n(r,2/o)},function(t){return t<=2?e.log(t/2)*T(t,1)+1/t*n(i,t*t/4):e.exp(-t)/e.sqrt(t)*n(a,2/t)},0,2,1)}();t.besselj=y,t.bessely=E,t.besseli=T,t.besselk=A},"undefined"==typeof DO_NOT_EXPORT_BESSEL?n(e):n({})},4840:(t,e,n)=>{var r="object"==typeof n.g&&n.g&&n.g.Object===Object&&n.g;t.exports=r},4894:(t,e,n)=>{var r=n(1882),o=n(294);t.exports=function(t){return null!=t&&o(t.length)&&!r(t)}},4901:(t,e,n)=>{var r=n(2552),o=n(294),i=n(346),a={};a["[object Float32Array]"]=a["[object Float64Array]"]=a["[object Int8Array]"]=a["[object Int16Array]"]=a["[object Int32Array]"]=a["[object Uint8Array]"]=a["[object Uint8ClampedArray]"]=a["[object Uint16Array]"]=a["[object Uint32Array]"]=!0,a["[object Arguments]"]=a["[object Array]"]=a["[object ArrayBuffer]"]=a["[object Boolean]"]=a["[object DataView]"]=a["[object Date]"]=a["[object Error]"]=a["[object Function]"]=a["[object Map]"]=a["[object Number]"]=a["[object Object]"]=a["[object RegExp]"]=a["[object Set]"]=a["[object String]"]=a["[object WeakMap]"]=!1,t.exports=function(t){return i(t)&&o(t.length)&&!!a[r(t)]}},4927:(t,e)=>{Object.defineProperty(e,"__esModule",{value:!0}),e.VERSION=void 0,e.VERSION="10.5.0"},4932:t=>{t.exports=function(t,e){for(var n=-1,r=null==t?0:t.length,o=Array(r);++n{Object.defineProperty(e,"__esModule",{value:!0}),e.IN=void 0,e.IN="_~IN~_"},5015:(t,e,n)=>{var r=n(2552),o=n(6449),i=n(346);t.exports=function(t){return"string"==typeof t||!o(t)&&i(t)&&"[object String]"==r(t)}},5063:function(t,e,n){var r,o=this&&this.__extends||(r=function(t,e){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n])},r(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function n(){this.constructor=t}r(t,e),t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)}),i=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0}),e.charCodeToOptimizedIndex=e.minOptimizationVal=e.buildLineBreakIssueMessage=e.LineTerminatorOptimizedTester=e.isShortPattern=e.isCustomPattern=e.cloneEmptyGroups=e.performWarningRuntimeChecks=e.performRuntimeChecks=e.addStickyFlag=e.addStartOfInput=e.findUnreachablePatterns=e.findModesThatDoNotExist=e.findInvalidGroupType=e.findDuplicatePatterns=e.findUnsupportedFlags=e.findStartOfInputAnchor=e.findEmptyMatchRegExps=e.findEndOfInputAnchor=e.findInvalidPatterns=e.findMissingPatterns=e.validatePatterns=e.analyzeTokenTypes=e.enableSticky=e.disableSticky=e.SUPPORT_STICKY=e.MODES=e.DEFAULT_MODE=void 0;var a=n(2475),s=n(127),u=i(n(6170)),c=i(n(2193)),l=i(n(3673)),f=i(n(6449)),h=i(n(5880)),p=i(n(5970)),d=i(n(8081)),m=i(n(6245)),g=i(n(1585)),v=i(n(5378)),y=i(n(9754)),E=i(n(5015)),T=i(n(1882)),A=i(n(2216)),_=i(n(7309)),N=i(n(1448)),R=i(n(5950)),O=i(n(9607)),I=i(n(7612)),S=i(n(4684)),b=i(n(860)),x=i(n(9859)),C=n(8927),M=n(6195),L=n(393),P="PATTERN";function w(t){var e=(0,I.default)(t,function(t){return!(0,N.default)(t,P)});return{errors:(0,v.default)(e,function(t){return{message:"Token Type: ->"+t.name+"<- missing static 'PATTERN' property",type:s.LexerDefinitionErrorType.MISSING_PATTERN,tokenTypes:[t]}}),valid:(0,m.default)(t,e)}}function D(t){var e=(0,I.default)(t,function(t){var e=t[P];return!((0,O.default)(e)||(0,T.default)(e)||(0,N.default)(e,"exec")||(0,E.default)(e))});return{errors:(0,v.default)(e,function(t){return{message:"Token Type: ->"+t.name+"<- static 'PATTERN' can only be a RegExp, a Function matching the {CustomPatternMatcherFunc} type or an Object matching the {ICustomPattern} interface.",type:s.LexerDefinitionErrorType.INVALID_PATTERN,tokenTypes:[t]}}),valid:(0,m.default)(t,e)}}e.DEFAULT_MODE="defaultMode",e.MODES="modes",e.SUPPORT_STICKY="boolean"==typeof new RegExp("(?:)").sticky,e.disableSticky=function(){e.SUPPORT_STICKY=!1},e.enableSticky=function(){e.SUPPORT_STICKY=!0},e.analyzeTokenTypes=function(t,n){var r,o=(n=(0,S.default)(n,{useSticky:e.SUPPORT_STICKY,debug:!1,safeMode:!1,positionTracking:"full",lineTerminatorCharacters:["\r","\n"],tracer:function(t,e){return e()}})).tracer;o("initCharCodeToOptimizedIndexMap",function(){!function(){if((0,c.default)(tt)){tt=new Array(65536);for(var t=0;t<65536;t++)tt[t]=t>255?255+~~(t/255):t}}()}),o("Reject Lexer.NA",function(){r=(0,d.default)(t,function(t){return t[P]===s.Lexer.NA})});var i,a,u,l,h,p,m,_,R,I,L,w=!1;o("Transform Patterns",function(){w=!1,i=(0,v.default)(r,function(t){var e=t[P];if((0,O.default)(e)){var r=e.source;return 1!==r.length||"^"===r||"$"===r||"."===r||e.ignoreCase?2!==r.length||"\\"!==r[0]||(0,x.default)(["d","D","s","S","t","r","n","t","0","c","b","B","f","v","w","W"],r[1])?n.useSticky?K(e):Y(e):r[1]:r}if((0,T.default)(e))return w=!0,{exec:e};if("object"==typeof e)return w=!0,e;if("string"==typeof e){if(1===e.length)return e;var o=e.replace(/[\\^$.*+?()[\]{}|]/g,"\\$&"),i=new RegExp(o);return n.useSticky?K(i):Y(i)}throw Error("non exhaustive match")})}),o("misc mapping",function(){a=(0,v.default)(r,function(t){return t.tokenTypeIdx}),u=(0,v.default)(r,function(t){var e=t.GROUP;if(e!==s.Lexer.SKIPPED){if((0,E.default)(e))return e;if((0,A.default)(e))return!1;throw Error("non exhaustive match")}}),l=(0,v.default)(r,function(t){var e=t.LONGER_ALT;if(e)return(0,f.default)(e)?(0,v.default)(e,function(t){return(0,g.default)(r,t)}):[(0,g.default)(r,e)]}),h=(0,v.default)(r,function(t){return t.PUSH_MODE}),p=(0,v.default)(r,function(t){return(0,N.default)(t,"POP_MODE")})}),o("Line Terminator Handling",function(){var t=Q(n.lineTerminatorCharacters);m=(0,v.default)(r,function(t){return!1}),"onlyOffset"!==n.positionTracking&&(m=(0,v.default)(r,function(e){return(0,N.default)(e,"LINE_BREAKS")?!!e.LINE_BREAKS:!1===$(e,t)&&(0,M.canMatchCharCode)(t,e.PATTERN)}))}),o("Misc Mapping #2",function(){_=(0,v.default)(r,H),R=(0,v.default)(i,X),I=(0,b.default)(r,function(t,e){var n=e.GROUP;return(0,E.default)(n)&&n!==s.Lexer.SKIPPED&&(t[n]=[]),t},{}),L=(0,v.default)(i,function(t,e){return{pattern:i[e],longerAlt:l[e],canLineTerminator:m[e],isCustom:_[e],short:R[e],group:u[e],push:h[e],pop:p[e],tokenTypeIdx:a[e],tokenType:r[e]}})});var D=!0,k=[];return n.safeMode||o("First Char Optimization",function(){k=(0,b.default)(r,function(t,e,r){if("string"==typeof e.PATTERN){var o=et(e.PATTERN.charCodeAt(0));J(t,o,L[r])}else if((0,f.default)(e.START_CHARS_HINT)){var i;(0,y.default)(e.START_CHARS_HINT,function(e){var n=et("string"==typeof e?e.charCodeAt(0):e);i!==n&&(i=n,J(t,n,L[r]))})}else if((0,O.default)(e.PATTERN))if(e.PATTERN.unicode)D=!1,n.ensureOptimizations&&(0,C.PRINT_ERROR)("".concat(M.failedOptimizationPrefixMsg)+"\tUnable to analyze < ".concat(e.PATTERN.toString()," > pattern.\n")+"\tThe regexp unicode flag is not currently supported by the regexp-to-ast library.\n\tThis will disable the lexer's first char optimizations.\n\tFor details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#UNICODE_OPTIMIZE");else{var a=(0,M.getOptimizedStartCodesIndices)(e.PATTERN,n.ensureOptimizations);(0,c.default)(a)&&(D=!1),(0,y.default)(a,function(e){J(t,e,L[r])})}else n.ensureOptimizations&&(0,C.PRINT_ERROR)("".concat(M.failedOptimizationPrefixMsg)+"\tTokenType: <".concat(e.name,"> is using a custom token pattern without providing parameter.\n")+"\tThis will disable the lexer's first char optimizations.\n\tFor details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#CUSTOM_OPTIMIZE"),D=!1;return t},[])}),{emptyGroups:I,patternIdxToConfig:L,charCodeToPatternIdxToConfig:k,hasCustom:w,canBeOptimized:D}},e.validatePatterns=function(t,e){var n=[],r=w(t);n=n.concat(r.errors);var o=D(r.valid),i=o.valid;return(n=(n=(n=(n=n.concat(o.errors)).concat(function(t){var e=[],n=(0,I.default)(t,function(t){return(0,O.default)(t[P])});return e=(e=(e=(e=(e=e.concat(F(n))).concat(V(n))).concat(B(n))).concat(G(n))).concat(U(n))}(i))).concat(W(i))).concat(z(i,e))).concat(q(i))},e.findMissingPatterns=w,e.findInvalidPatterns=D;var k=/[^\\][$]/;function F(t){var e=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.found=!1,e}return o(e,t),e.prototype.visitEndAnchor=function(t){this.found=!0},e}(a.BaseRegExpVisitor),n=(0,I.default)(t,function(t){var n=t.PATTERN;try{var r=(0,L.getRegExpAst)(n),o=new e;return o.visit(r),o.found}catch(t){return k.test(n.source)}});return(0,v.default)(n,function(t){return{message:"Unexpected RegExp Anchor Error:\n\tToken Type: ->"+t.name+"<- static 'PATTERN' cannot contain end of input anchor '$'\n\tSee chevrotain.io/docs/guide/resolving_lexer_errors.html#ANCHORS\tfor details.",type:s.LexerDefinitionErrorType.EOI_ANCHOR_FOUND,tokenTypes:[t]}})}function U(t){var e=(0,I.default)(t,function(t){return t.PATTERN.test("")});return(0,v.default)(e,function(t){return{message:"Token Type: ->"+t.name+"<- static 'PATTERN' must not match an empty string",type:s.LexerDefinitionErrorType.EMPTY_MATCH_PATTERN,tokenTypes:[t]}})}e.findEndOfInputAnchor=F,e.findEmptyMatchRegExps=U;var j=/[^\\[][\^]|^\^/;function V(t){var e=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.found=!1,e}return o(e,t),e.prototype.visitStartAnchor=function(t){this.found=!0},e}(a.BaseRegExpVisitor),n=(0,I.default)(t,function(t){var n=t.PATTERN;try{var r=(0,L.getRegExpAst)(n),o=new e;return o.visit(r),o.found}catch(t){return j.test(n.source)}});return(0,v.default)(n,function(t){return{message:"Unexpected RegExp Anchor Error:\n\tToken Type: ->"+t.name+"<- static 'PATTERN' cannot contain start of input anchor '^'\n\tSee https://chevrotain.io/docs/guide/resolving_lexer_errors.html#ANCHORS\tfor details.",type:s.LexerDefinitionErrorType.SOI_ANCHOR_FOUND,tokenTypes:[t]}})}function B(t){var e=(0,I.default)(t,function(t){var e=t[P];return e instanceof RegExp&&(e.multiline||e.global)});return(0,v.default)(e,function(t){return{message:"Token Type: ->"+t.name+"<- static 'PATTERN' may NOT contain global('g') or multiline('m')",type:s.LexerDefinitionErrorType.UNSUPPORTED_FLAGS_FOUND,tokenTypes:[t]}})}function G(t){var e=[],n=(0,v.default)(t,function(n){return(0,b.default)(t,function(t,r){return n.PATTERN.source!==r.PATTERN.source||(0,x.default)(e,r)||r.PATTERN===s.Lexer.NA||(e.push(r),t.push(r)),t},[])});n=(0,l.default)(n);var r=(0,I.default)(n,function(t){return t.length>1});return(0,v.default)(r,function(t){var e=(0,v.default)(t,function(t){return t.name}),n=(0,u.default)(t).PATTERN;return{message:"The same RegExp pattern ->".concat(n,"<-")+"has been used in all of the following Token Types: ".concat(e.join(", ")," <-"),type:s.LexerDefinitionErrorType.DUPLICATE_PATTERNS_FOUND,tokenTypes:t}})}function W(t){var e=(0,I.default)(t,function(t){if(!(0,N.default)(t,"GROUP"))return!1;var e=t.GROUP;return e!==s.Lexer.SKIPPED&&e!==s.Lexer.NA&&!(0,E.default)(e)});return(0,v.default)(e,function(t){return{message:"Token Type: ->"+t.name+"<- static 'GROUP' can only be Lexer.SKIPPED/Lexer.NA/A String",type:s.LexerDefinitionErrorType.INVALID_GROUP_TYPE_FOUND,tokenTypes:[t]}})}function z(t,e){var n=(0,I.default)(t,function(t){return void 0!==t.PUSH_MODE&&!(0,x.default)(e,t.PUSH_MODE)});return(0,v.default)(n,function(t){return{message:"Token Type: ->".concat(t.name,"<- static 'PUSH_MODE' value cannot refer to a Lexer Mode ->").concat(t.PUSH_MODE,"<-")+"which does not exist",type:s.LexerDefinitionErrorType.PUSH_MODE_DOES_NOT_EXIST,tokenTypes:[t]}})}function q(t){var e=[],n=(0,b.default)(t,function(t,e,n){var r,o,i=e.PATTERN;return i===s.Lexer.NA||((0,E.default)(i)?t.push({str:i,idx:n,tokenType:e}):(0,O.default)(i)&&(r=i,o=[".","\\","[","]","|","^","$","(",")","?","*","+","{"],void 0===(0,_.default)(o,function(t){return-1!==r.source.indexOf(t)}))&&t.push({str:i.source,idx:n,tokenType:e})),t},[]);return(0,y.default)(t,function(t,r){(0,y.default)(n,function(n){var o=n.str,i=n.idx,a=n.tokenType;if(r".concat(t.name,"<-")+"in the lexer's definition.\nSee https://chevrotain.io/docs/guide/resolving_lexer_errors.html#UNREACHABLE";e.push({message:u,type:s.LexerDefinitionErrorType.UNREACHABLE_PATTERN,tokenTypes:[t,a]})}})}),e}function Y(t){var e=t.ignoreCase?"i":"";return new RegExp("^(?:".concat(t.source,")"),e)}function K(t){var e=t.ignoreCase?"iy":"y";return new RegExp("".concat(t.source),e)}function H(t){var e=t.PATTERN;if((0,O.default)(e))return!1;if((0,T.default)(e))return!0;if((0,N.default)(e,"exec"))return!0;if((0,E.default)(e))return!1;throw Error("non exhaustive match")}function X(t){return!(!(0,E.default)(t)||1!==t.length)&&t.charCodeAt(0)}function $(t,e){if((0,N.default)(t,"LINE_BREAKS"))return!1;if((0,O.default)(t.PATTERN)){try{(0,M.canMatchCharCode)(e,t.PATTERN)}catch(t){return{issue:s.LexerDefinitionErrorType.IDENTIFY_TERMINATOR,errMsg:t.message}}return!1}if((0,E.default)(t.PATTERN))return!1;if(H(t))return{issue:s.LexerDefinitionErrorType.CUSTOM_LINE_BREAK};throw Error("non exhaustive match")}function Z(t,e){if(e.issue===s.LexerDefinitionErrorType.IDENTIFY_TERMINATOR)return"Warning: unable to identify line terminator usage in pattern.\n"+"\tThe problem is in the <".concat(t.name,"> Token Type\n")+"\t Root cause: ".concat(e.errMsg,".\n")+"\tFor details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#IDENTIFY_TERMINATOR";if(e.issue===s.LexerDefinitionErrorType.CUSTOM_LINE_BREAK)return"Warning: A Custom Token Pattern should specify the option.\n"+"\tThe problem is in the <".concat(t.name,"> Token Type\n")+"\tFor details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#CUSTOM_LINE_BREAK";throw Error("non exhaustive match")}function Q(t){return(0,v.default)(t,function(t){return(0,E.default)(t)?t.charCodeAt(0):t})}function J(t,e,n){void 0===t[e]?t[e]=[n]:t[e].push(n)}e.findStartOfInputAnchor=V,e.findUnsupportedFlags=B,e.findDuplicatePatterns=G,e.findInvalidGroupType=W,e.findModesThatDoNotExist=z,e.findUnreachablePatterns=q,e.addStartOfInput=Y,e.addStickyFlag=K,e.performRuntimeChecks=function(t,n,r){var o=[];return(0,N.default)(t,e.DEFAULT_MODE)||o.push({message:"A MultiMode Lexer cannot be initialized without a <"+e.DEFAULT_MODE+"> property in its definition\n",type:s.LexerDefinitionErrorType.MULTI_MODE_LEXER_WITHOUT_DEFAULT_MODE}),(0,N.default)(t,e.MODES)||o.push({message:"A MultiMode Lexer cannot be initialized without a <"+e.MODES+"> property in its definition\n",type:s.LexerDefinitionErrorType.MULTI_MODE_LEXER_WITHOUT_MODES_PROPERTY}),(0,N.default)(t,e.MODES)&&(0,N.default)(t,e.DEFAULT_MODE)&&!(0,N.default)(t.modes,t.defaultMode)&&o.push({message:"A MultiMode Lexer cannot be initialized with a ".concat(e.DEFAULT_MODE,": <").concat(t.defaultMode,">")+"which does not exist\n",type:s.LexerDefinitionErrorType.MULTI_MODE_LEXER_DEFAULT_MODE_VALUE_DOES_NOT_EXIST}),(0,N.default)(t,e.MODES)&&(0,y.default)(t.modes,function(t,e){(0,y.default)(t,function(n,r){if((0,A.default)(n))o.push({message:"A Lexer cannot be initialized using an undefined Token Type. Mode:"+"<".concat(e,"> at index: <").concat(r,">\n"),type:s.LexerDefinitionErrorType.LEXER_DEFINITION_CANNOT_CONTAIN_UNDEFINED});else if((0,N.default)(n,"LONGER_ALT")){var i=(0,f.default)(n.LONGER_ALT)?n.LONGER_ALT:[n.LONGER_ALT];(0,y.default)(i,function(r){(0,A.default)(r)||(0,x.default)(t,r)||o.push({message:"A MultiMode Lexer cannot be initialized with a longer_alt <".concat(r.name,"> on token <").concat(n.name,"> outside of mode <").concat(e,">\n"),type:s.LexerDefinitionErrorType.MULTI_MODE_LEXER_LONGER_ALT_NOT_IN_CURRENT_MODE})})}})}),o},e.performWarningRuntimeChecks=function(t,e,n){var r=[],o=!1,i=(0,l.default)((0,p.default)((0,h.default)(t.modes))),a=(0,d.default)(i,function(t){return t[P]===s.Lexer.NA}),u=Q(n);return e&&(0,y.default)(a,function(t){var e=$(t,u);if(!1!==e){var n={message:Z(t,e),type:e.issue,tokenType:t};r.push(n)}else(0,N.default)(t,"LINE_BREAKS")?!0===t.LINE_BREAKS&&(o=!0):(0,M.canMatchCharCode)(u,t.PATTERN)&&(o=!0)}),e&&!o&&r.push({message:"Warning: No LINE_BREAKS Found.\n\tThis Lexer has been defined to track line and column information,\n\tBut none of the Token Types can be identified as matching a line terminator.\n\tSee https://chevrotain.io/docs/guide/resolving_lexer_errors.html#LINE_BREAKS \n\tfor details.",type:s.LexerDefinitionErrorType.NO_LINE_BREAKS_FLAGS}),r},e.cloneEmptyGroups=function(t){var e={},n=(0,R.default)(t);return(0,y.default)(n,function(n){var r=t[n];if(!(0,f.default)(r))throw Error("non exhaustive match");e[n]=[]}),e},e.isCustomPattern=H,e.isShortPattern=X,e.LineTerminatorOptimizedTester={test:function(t){for(var e=t.length,n=this.lastIndex;n{var r=n(1882),o=n(7296),i=n(3805),a=n(7473),s=/^\[object .+?Constructor\]$/,u=Function.prototype,c=Object.prototype,l=u.toString,f=c.hasOwnProperty,h=RegExp("^"+l.call(f).replace(/[\\^$.*+?()[\]{}|]/g,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");t.exports=function(t){return!(!i(t)||o(t))&&(r(t)?h:s).test(a(t))}},5128:(t,e,n)=>{var r=n(909),o=n(4894);t.exports=function(t,e){var n=-1,i=o(t)?Array(t.length):[];return r(t,function(t,r,o){i[++n]=e(t,r,o)}),i}},5160:t=>{t.exports=function(t,e,n){var r=-1,o=t.length;e<0&&(e=-e>o?0:o+e),(n=n>o?o:n)<0&&(n+=o),o=e>n?0:n-e>>>0,e>>>=0;for(var i=Array(o);++r{t.exports=function(t,e){return t===e||t!=t&&e!=e}},5325:(t,e,n)=>{var r=n(6131);t.exports=function(t,e){return!(null==t||!t.length)&&r(t,e,0)>-1}},5378:(t,e,n)=>{var r=n(4932),o=n(5389),i=n(5128),a=n(6449);t.exports=function(t,e){return(a(t)?r:i)(t,o(e,3))}},5389:(t,e,n)=>{var r=n(3663),o=n(7978),i=n(3488),a=n(6449),s=n(583);t.exports=function(t){return"function"==typeof t?t:null==t?i:"object"==typeof t?a(t)?o(t[0],t[1]):r(t):s(t)}},5463:t=>{t.exports=function(t){return t!=t}},5481:(t,e,n)=>{var r=n(9325)["__core-js_shared__"];t.exports=r},5527:t=>{var e=Object.prototype;t.exports=function(t){var n=t&&t.constructor;return t===("function"==typeof n&&n.prototype||e)}},5529:(t,e,n)=>{var r=n(9344),o=n(8879),i=n(5527);t.exports=function(t){return"function"!=typeof t.constructor||i(t)?{}:r(o(t))}},5558:t=>{t.exports=function(t,e,n,r,o){return o(t,function(t,o,i){n=r?(r=!1,t):e(n,t,o,i)}),n}},5580:(t,e,n)=>{var r=n(6110)(n(9325),"DataView");t.exports=r},5592:(t,e,n)=>{n.d(e,{Q:()=>r});class r{constructor(){this._listeners={},this._isEventPaused=!1}listen(t,e){void 0===this._listeners&&(this._listeners={});var n=this._listeners;void 0===n[t]&&(n[t]=[]),-1===n[t].indexOf(e)&&n[t].push(e)}addListener(t,e){this.listen(t,e)}hasListener(t,e){return void 0!==this._listeners&&void 0!==this._listeners[t]&&-1!==this._listeners[t].indexOf(e)}removeListener(t,e){if(void 0!==this._listeners){var n=this._listeners[t];if(void 0!==n){var r=n.indexOf(e);-1!==r&&n.splice(r,1)}}}dispatch(t,e={}){if(!this._isEventPaused&&void 0!==this._listeners&&void 0!==(n=this._listeners[t])){e.target=this;for(var n,r=0,o=(n=n.slice(0)).length;r{var r=n(1042);t.exports=function(t,e){var n=this.__data__;return this.size+=this.has(t)?0:1,n[t]=r&&void 0===e?"__lodash_hash_undefined__":e,this}},5765:(t,e,n)=>{var r=n(8859),o=n(5325),i=n(9905),a=n(9219),s=n(4517),u=n(4247);t.exports=function(t,e,n){var c=-1,l=o,f=t.length,h=!0,p=[],d=p;if(n)h=!1,l=i;else if(f>=200){var m=e?null:s(t);if(m)return u(m);h=!1,l=a,d=new r}else d=e?[]:p;t:for(;++c{var r=n(2507)("toUpperCase");t.exports=r},5861:(t,e,n)=>{var r=n(5580),o=n(8223),i=n(2804),a=n(6545),s=n(8303),u=n(2552),c=n(7473),l="[object Map]",f="[object Promise]",h="[object Set]",p="[object WeakMap]",d="[object DataView]",m=c(r),g=c(o),v=c(i),y=c(a),E=c(s),T=u;(r&&T(new r(new ArrayBuffer(1)))!=d||o&&T(new o)!=l||i&&T(i.resolve())!=f||a&&T(new a)!=h||s&&T(new s)!=p)&&(T=function(t){var e=u(t),n="[object Object]"==e?t.constructor:void 0,r=n?c(n):"";if(r)switch(r){case m:return d;case g:return l;case v:return f;case y:return h;case E:return p}return e}),t.exports=T},5880:(t,e,n)=>{var r=n(514),o=n(5950);t.exports=function(t){return null==t?[]:r(t,o(t))}},5891:(t,e,n)=>{var r=n(1873),o=n(2428),i=n(6449),a=r?r.isConcatSpreadable:void 0;t.exports=function(t){return i(t)||o(t)||!!(a&&t&&t[a])}},5911:(t,e,n)=>{var r=n(8859),o=n(4248),i=n(9219);t.exports=function(t,e,n,a,s,u){var c=1&n,l=t.length,f=e.length;if(l!=f&&!(c&&f>l))return!1;var h=u.get(t),p=u.get(e);if(h&&p)return h==e&&p==t;var d=-1,m=!0,g=2&n?new r:void 0;for(u.set(t,e),u.set(e,t);++d{var r=n(695),o=n(8984),i=n(4894);t.exports=function(t){return i(t)?r(t):o(t)}},5970:(t,e,n)=>{var r=n(3120);t.exports=function(t){return null!=t&&t.length?r(t,1):[]}},5994:(t,e,n)=>{Object.defineProperty(e,"__esModule",{value:!0}),e.createSyntaxDiagramsCode=void 0;var r=n(4927);e.createSyntaxDiagramsCode=function(t,e){var n=void 0===e?{}:e,o=n.resourceBase,i=void 0===o?"https://unpkg.com/chevrotain@".concat(r.VERSION,"/diagrams/"):o,a=n.css,s=void 0===a?"https://unpkg.com/chevrotain@".concat(r.VERSION,"/diagrams/diagrams.css"):a;return'\n\x3c!-- This is a generated file --\x3e\n\n\n\n\n'+"\n\n")+"\n\\n\\n\\n\\n\");\n var diagramsDiv = \"\\n
\\n\";\n var serializedGrammar = \"\\n\\n\");\n var initLogic = \"\\n\\n\";\n return (header + cssHtml + scripts + diagramsDiv + serializedGrammar + initLogic);\n}\nexports.createSyntaxDiagramsCode = createSyntaxDiagramsCode;\n//# sourceMappingURL=render_public.js.map","var freeGlobal = require('./_freeGlobal');\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Detect free variable `process` from Node.js. */\nvar freeProcess = moduleExports && freeGlobal.process;\n\n/** Used to access faster Node.js helpers. */\nvar nodeUtil = (function() {\n try {\n // Use `util.types` for Node.js 10+.\n var types = freeModule && freeModule.require && freeModule.require('util').types;\n\n if (types) {\n return types;\n }\n\n // Legacy `process.binding('util')` for Node.js < 10.\n return freeProcess && freeProcess.binding && freeProcess.binding('util');\n } catch (e) {}\n}());\n\nmodule.exports = nodeUtil;\n","var eq = require('./eq');\n\n/**\n * Gets the index at which the `key` is found in `array` of key-value pairs.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} key The key to search for.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction assocIndexOf(array, key) {\n var length = array.length;\n while (length--) {\n if (eq(array[length][0], key)) {\n return length;\n }\n }\n return -1;\n}\n\nmodule.exports = assocIndexOf;\n","var getTag = require('./_getTag'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar setTag = '[object Set]';\n\n/**\n * The base implementation of `_.isSet` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a set, else `false`.\n */\nfunction baseIsSet(value) {\n return isObjectLike(value) && getTag(value) == setTag;\n}\n\nmodule.exports = baseIsSet;\n","\"use strict\";\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.buildModel = void 0;\nvar gast_1 = require(\"@chevrotain/gast\");\nvar map_1 = __importDefault(require(\"lodash/map\"));\nvar flatten_1 = __importDefault(require(\"lodash/flatten\"));\nvar values_1 = __importDefault(require(\"lodash/values\"));\nvar some_1 = __importDefault(require(\"lodash/some\"));\nvar groupBy_1 = __importDefault(require(\"lodash/groupBy\"));\nvar assign_1 = __importDefault(require(\"lodash/assign\"));\nfunction buildModel(productions) {\n var generator = new CstNodeDefinitionGenerator();\n var allRules = (0, values_1.default)(productions);\n return (0, map_1.default)(allRules, function (rule) { return generator.visitRule(rule); });\n}\nexports.buildModel = buildModel;\nvar CstNodeDefinitionGenerator = /** @class */ (function (_super) {\n __extends(CstNodeDefinitionGenerator, _super);\n function CstNodeDefinitionGenerator() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n CstNodeDefinitionGenerator.prototype.visitRule = function (node) {\n var rawElements = this.visitEach(node.definition);\n var grouped = (0, groupBy_1.default)(rawElements, function (el) { return el.propertyName; });\n var properties = (0, map_1.default)(grouped, function (group, propertyName) {\n var allNullable = !(0, some_1.default)(group, function (el) { return !el.canBeNull; });\n // In an alternation with a label a property name can have\n // multiple types.\n var propertyType = group[0].type;\n if (group.length > 1) {\n propertyType = (0, map_1.default)(group, function (g) { return g.type; });\n }\n return {\n name: propertyName,\n type: propertyType,\n optional: allNullable\n };\n });\n return {\n name: node.name,\n properties: properties\n };\n };\n CstNodeDefinitionGenerator.prototype.visitAlternative = function (node) {\n return this.visitEachAndOverrideWith(node.definition, { canBeNull: true });\n };\n CstNodeDefinitionGenerator.prototype.visitOption = function (node) {\n return this.visitEachAndOverrideWith(node.definition, { canBeNull: true });\n };\n CstNodeDefinitionGenerator.prototype.visitRepetition = function (node) {\n return this.visitEachAndOverrideWith(node.definition, { canBeNull: true });\n };\n CstNodeDefinitionGenerator.prototype.visitRepetitionMandatory = function (node) {\n return this.visitEach(node.definition);\n };\n CstNodeDefinitionGenerator.prototype.visitRepetitionMandatoryWithSeparator = function (node) {\n return this.visitEach(node.definition).concat({\n propertyName: node.separator.name,\n canBeNull: true,\n type: getType(node.separator)\n });\n };\n CstNodeDefinitionGenerator.prototype.visitRepetitionWithSeparator = function (node) {\n return this.visitEachAndOverrideWith(node.definition, {\n canBeNull: true\n }).concat({\n propertyName: node.separator.name,\n canBeNull: true,\n type: getType(node.separator)\n });\n };\n CstNodeDefinitionGenerator.prototype.visitAlternation = function (node) {\n return this.visitEachAndOverrideWith(node.definition, { canBeNull: true });\n };\n CstNodeDefinitionGenerator.prototype.visitTerminal = function (node) {\n return [\n {\n propertyName: node.label || node.terminalType.name,\n canBeNull: false,\n type: getType(node)\n }\n ];\n };\n CstNodeDefinitionGenerator.prototype.visitNonTerminal = function (node) {\n return [\n {\n propertyName: node.label || node.nonTerminalName,\n canBeNull: false,\n type: getType(node)\n }\n ];\n };\n CstNodeDefinitionGenerator.prototype.visitEachAndOverrideWith = function (definition, override) {\n return (0, map_1.default)(this.visitEach(definition), function (definition) { return (0, assign_1.default)({}, definition, override); });\n };\n CstNodeDefinitionGenerator.prototype.visitEach = function (definition) {\n var _this = this;\n return (0, flatten_1.default)((0, map_1.default)(definition, function (definition) { return _this.visit(definition); }));\n };\n return CstNodeDefinitionGenerator;\n}(gast_1.GAstVisitor));\nfunction getType(production) {\n if (production instanceof gast_1.NonTerminal) {\n return {\n kind: \"rule\",\n name: production.referencedRule.name\n };\n }\n return { kind: \"token\" };\n}\n//# sourceMappingURL=model.js.map","/** Error message constants. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/**\n * Creates a function that negates the result of the predicate `func`. The\n * `func` predicate is invoked with the `this` binding and arguments of the\n * created function.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Function\n * @param {Function} predicate The predicate to negate.\n * @returns {Function} Returns the new negated function.\n * @example\n *\n * function isEven(n) {\n * return n % 2 == 0;\n * }\n *\n * _.filter([1, 2, 3, 4, 5, 6], _.negate(isEven));\n * // => [1, 3, 5]\n */\nfunction negate(predicate) {\n if (typeof predicate != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n return function() {\n var args = arguments;\n switch (args.length) {\n case 0: return !predicate.call(this);\n case 1: return !predicate.call(this, args[0]);\n case 2: return !predicate.call(this, args[0], args[1]);\n case 3: return !predicate.call(this, args[0], args[1], args[2]);\n }\n return !predicate.apply(this, args);\n };\n}\n\nmodule.exports = negate;\n","var baseIsNative = require('./_baseIsNative'),\n getValue = require('./_getValue');\n\n/**\n * Gets the native function at `key` of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the method to get.\n * @returns {*} Returns the function if it's native, else `undefined`.\n */\nfunction getNative(object, key) {\n var value = getValue(object, key);\n return baseIsNative(value) ? value : undefined;\n}\n\nmodule.exports = getNative;\n","var baseFindIndex = require('./_baseFindIndex'),\n baseIsNaN = require('./_baseIsNaN'),\n strictIndexOf = require('./_strictIndexOf');\n\n/**\n * The base implementation of `_.indexOf` without `fromIndex` bounds checks.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @param {number} fromIndex The index to search from.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction baseIndexOf(array, value, fromIndex) {\n return value === value\n ? strictIndexOf(array, value, fromIndex)\n : baseFindIndex(array, baseIsNaN, fromIndex);\n}\n\nmodule.exports = baseIndexOf;\n","var assignValue = require('./_assignValue'),\n copyObject = require('./_copyObject'),\n createAssigner = require('./_createAssigner'),\n isArrayLike = require('./isArrayLike'),\n isPrototype = require('./_isPrototype'),\n keys = require('./keys');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Assigns own enumerable string keyed properties of source objects to the\n * destination object. Source objects are applied from left to right.\n * Subsequent sources overwrite property assignments of previous sources.\n *\n * **Note:** This method mutates `object` and is loosely based on\n * [`Object.assign`](https://mdn.io/Object/assign).\n *\n * @static\n * @memberOf _\n * @since 0.10.0\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} [sources] The source objects.\n * @returns {Object} Returns `object`.\n * @see _.assignIn\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * }\n *\n * function Bar() {\n * this.c = 3;\n * }\n *\n * Foo.prototype.b = 2;\n * Bar.prototype.d = 4;\n *\n * _.assign({ 'a': 0 }, new Foo, new Bar);\n * // => { 'a': 1, 'c': 3 }\n */\nvar assign = createAssigner(function(object, source) {\n if (isPrototype(source) || isArrayLike(source)) {\n copyObject(source, keys(source), object);\n return;\n }\n for (var key in source) {\n if (hasOwnProperty.call(source, key)) {\n assignValue(object, key, source[key]);\n }\n }\n});\n\nmodule.exports = assign;\n","var cloneArrayBuffer = require('./_cloneArrayBuffer');\n\n/**\n * Creates a clone of `dataView`.\n *\n * @private\n * @param {Object} dataView The data view to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the cloned data view.\n */\nfunction cloneDataView(dataView, isDeep) {\n var buffer = isDeep ? cloneArrayBuffer(dataView.buffer) : dataView.buffer;\n return new dataView.constructor(buffer, dataView.byteOffset, dataView.byteLength);\n}\n\nmodule.exports = cloneDataView;\n","module.exports = require('./head');\n","\"use strict\";\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.buildInProdFollowPrefix = exports.buildBetweenProdsFollowPrefix = exports.computeAllProdsFollows = exports.ResyncFollowsWalker = void 0;\nvar rest_1 = require(\"./rest\");\nvar first_1 = require(\"./first\");\nvar forEach_1 = __importDefault(require(\"lodash/forEach\"));\nvar assign_1 = __importDefault(require(\"lodash/assign\"));\nvar constants_1 = require(\"../constants\");\nvar gast_1 = require(\"@chevrotain/gast\");\n// This ResyncFollowsWalker computes all of the follows required for RESYNC\n// (skipping reference production).\nvar ResyncFollowsWalker = /** @class */ (function (_super) {\n __extends(ResyncFollowsWalker, _super);\n function ResyncFollowsWalker(topProd) {\n var _this = _super.call(this) || this;\n _this.topProd = topProd;\n _this.follows = {};\n return _this;\n }\n ResyncFollowsWalker.prototype.startWalking = function () {\n this.walk(this.topProd);\n return this.follows;\n };\n ResyncFollowsWalker.prototype.walkTerminal = function (terminal, currRest, prevRest) {\n // do nothing! just like in the public sector after 13:00\n };\n ResyncFollowsWalker.prototype.walkProdRef = function (refProd, currRest, prevRest) {\n var followName = buildBetweenProdsFollowPrefix(refProd.referencedRule, refProd.idx) +\n this.topProd.name;\n var fullRest = currRest.concat(prevRest);\n var restProd = new gast_1.Alternative({ definition: fullRest });\n var t_in_topProd_follows = (0, first_1.first)(restProd);\n this.follows[followName] = t_in_topProd_follows;\n };\n return ResyncFollowsWalker;\n}(rest_1.RestWalker));\nexports.ResyncFollowsWalker = ResyncFollowsWalker;\nfunction computeAllProdsFollows(topProductions) {\n var reSyncFollows = {};\n (0, forEach_1.default)(topProductions, function (topProd) {\n var currRefsFollow = new ResyncFollowsWalker(topProd).startWalking();\n (0, assign_1.default)(reSyncFollows, currRefsFollow);\n });\n return reSyncFollows;\n}\nexports.computeAllProdsFollows = computeAllProdsFollows;\nfunction buildBetweenProdsFollowPrefix(inner, occurenceInParent) {\n return inner.name + occurenceInParent + constants_1.IN;\n}\nexports.buildBetweenProdsFollowPrefix = buildBetweenProdsFollowPrefix;\nfunction buildInProdFollowPrefix(terminal) {\n var terminalName = terminal.terminalType.name;\n return terminalName + terminal.idx + constants_1.IN;\n}\nexports.buildInProdFollowPrefix = buildInProdFollowPrefix;\n//# sourceMappingURL=follow.js.map","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Initializes an array clone.\n *\n * @private\n * @param {Array} array The array to clone.\n * @returns {Array} Returns the initialized clone.\n */\nfunction initCloneArray(array) {\n var length = array.length,\n result = new array.constructor(length);\n\n // Add properties assigned by `RegExp#exec`.\n if (length && typeof array[0] == 'string' && hasOwnProperty.call(array, 'index')) {\n result.index = array.index;\n result.input = array.input;\n }\n return result;\n}\n\nmodule.exports = initCloneArray;\n","\"use strict\";\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.canMatchCharCode = exports.firstCharOptimizedIndices = exports.getOptimizedStartCodesIndices = exports.failedOptimizationPrefixMsg = void 0;\nvar regexp_to_ast_1 = require(\"regexp-to-ast\");\nvar isArray_1 = __importDefault(require(\"lodash/isArray\"));\nvar every_1 = __importDefault(require(\"lodash/every\"));\nvar forEach_1 = __importDefault(require(\"lodash/forEach\"));\nvar find_1 = __importDefault(require(\"lodash/find\"));\nvar values_1 = __importDefault(require(\"lodash/values\"));\nvar includes_1 = __importDefault(require(\"lodash/includes\"));\nvar utils_1 = require(\"@chevrotain/utils\");\nvar reg_exp_parser_1 = require(\"./reg_exp_parser\");\nvar lexer_1 = require(\"./lexer\");\nvar complementErrorMessage = \"Complement Sets are not supported for first char optimization\";\nexports.failedOptimizationPrefixMsg = 'Unable to use \"first char\" lexer optimizations:\\n';\nfunction getOptimizedStartCodesIndices(regExp, ensureOptimizations) {\n if (ensureOptimizations === void 0) { ensureOptimizations = false; }\n try {\n var ast = (0, reg_exp_parser_1.getRegExpAst)(regExp);\n var firstChars = firstCharOptimizedIndices(ast.value, {}, ast.flags.ignoreCase);\n return firstChars;\n }\n catch (e) {\n /* istanbul ignore next */\n // Testing this relies on the regexp-to-ast library having a bug... */\n // TODO: only the else branch needs to be ignored, try to fix with newer prettier / tsc\n if (e.message === complementErrorMessage) {\n if (ensureOptimizations) {\n (0, utils_1.PRINT_WARNING)(\"\".concat(exports.failedOptimizationPrefixMsg) +\n \"\\tUnable to optimize: < \".concat(regExp.toString(), \" >\\n\") +\n \"\\tComplement Sets cannot be automatically optimized.\\n\" +\n \"\\tThis will disable the lexer's first char optimizations.\\n\" +\n \"\\tSee: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#COMPLEMENT for details.\");\n }\n }\n else {\n var msgSuffix = \"\";\n if (ensureOptimizations) {\n msgSuffix =\n \"\\n\\tThis will disable the lexer's first char optimizations.\\n\" +\n \"\\tSee: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#REGEXP_PARSING for details.\";\n }\n (0, utils_1.PRINT_ERROR)(\"\".concat(exports.failedOptimizationPrefixMsg, \"\\n\") +\n \"\\tFailed parsing: < \".concat(regExp.toString(), \" >\\n\") +\n \"\\tUsing the regexp-to-ast library version: \".concat(regexp_to_ast_1.VERSION, \"\\n\") +\n \"\\tPlease open an issue at: https://github.com/bd82/regexp-to-ast/issues\" +\n msgSuffix);\n }\n }\n return [];\n}\nexports.getOptimizedStartCodesIndices = getOptimizedStartCodesIndices;\nfunction firstCharOptimizedIndices(ast, result, ignoreCase) {\n switch (ast.type) {\n case \"Disjunction\":\n for (var i = 0; i < ast.value.length; i++) {\n firstCharOptimizedIndices(ast.value[i], result, ignoreCase);\n }\n break;\n case \"Alternative\":\n var terms = ast.value;\n for (var i = 0; i < terms.length; i++) {\n var term = terms[i];\n // skip terms that cannot effect the first char results\n switch (term.type) {\n case \"EndAnchor\":\n // A group back reference cannot affect potential starting char.\n // because if a back reference is the first production than automatically\n // the group being referenced has had to come BEFORE so its codes have already been added\n case \"GroupBackReference\":\n // assertions do not affect potential starting codes\n case \"Lookahead\":\n case \"NegativeLookahead\":\n case \"StartAnchor\":\n case \"WordBoundary\":\n case \"NonWordBoundary\":\n continue;\n }\n var atom = term;\n switch (atom.type) {\n case \"Character\":\n addOptimizedIdxToResult(atom.value, result, ignoreCase);\n break;\n case \"Set\":\n if (atom.complement === true) {\n throw Error(complementErrorMessage);\n }\n (0, forEach_1.default)(atom.value, function (code) {\n if (typeof code === \"number\") {\n addOptimizedIdxToResult(code, result, ignoreCase);\n }\n else {\n // range\n var range = code;\n // cannot optimize when ignoreCase is\n if (ignoreCase === true) {\n for (var rangeCode = range.from; rangeCode <= range.to; rangeCode++) {\n addOptimizedIdxToResult(rangeCode, result, ignoreCase);\n }\n }\n // Optimization (2 orders of magnitude less work for very large ranges)\n else {\n // handle unoptimized values\n for (var rangeCode = range.from; rangeCode <= range.to && rangeCode < lexer_1.minOptimizationVal; rangeCode++) {\n addOptimizedIdxToResult(rangeCode, result, ignoreCase);\n }\n // Less common charCode where we optimize for faster init time, by using larger \"buckets\"\n if (range.to >= lexer_1.minOptimizationVal) {\n var minUnOptVal = range.from >= lexer_1.minOptimizationVal\n ? range.from\n : lexer_1.minOptimizationVal;\n var maxUnOptVal = range.to;\n var minOptIdx = (0, lexer_1.charCodeToOptimizedIndex)(minUnOptVal);\n var maxOptIdx = (0, lexer_1.charCodeToOptimizedIndex)(maxUnOptVal);\n for (var currOptIdx = minOptIdx; currOptIdx <= maxOptIdx; currOptIdx++) {\n result[currOptIdx] = currOptIdx;\n }\n }\n }\n }\n });\n break;\n case \"Group\":\n firstCharOptimizedIndices(atom.value, result, ignoreCase);\n break;\n /* istanbul ignore next */\n default:\n throw Error(\"Non Exhaustive Match\");\n }\n // reached a mandatory production, no more **start** codes can be found on this alternative\n var isOptionalQuantifier = atom.quantifier !== undefined && atom.quantifier.atLeast === 0;\n if (\n // A group may be optional due to empty contents /(?:)/\n // or if everything inside it is optional /((a)?)/\n (atom.type === \"Group\" && isWholeOptional(atom) === false) ||\n // If this term is not a group it may only be optional if it has an optional quantifier\n (atom.type !== \"Group\" && isOptionalQuantifier === false)) {\n break;\n }\n }\n break;\n /* istanbul ignore next */\n default:\n throw Error(\"non exhaustive match!\");\n }\n // console.log(Object.keys(result).length)\n return (0, values_1.default)(result);\n}\nexports.firstCharOptimizedIndices = firstCharOptimizedIndices;\nfunction addOptimizedIdxToResult(code, result, ignoreCase) {\n var optimizedCharIdx = (0, lexer_1.charCodeToOptimizedIndex)(code);\n result[optimizedCharIdx] = optimizedCharIdx;\n if (ignoreCase === true) {\n handleIgnoreCase(code, result);\n }\n}\nfunction handleIgnoreCase(code, result) {\n var char = String.fromCharCode(code);\n var upperChar = char.toUpperCase();\n /* istanbul ignore else */\n if (upperChar !== char) {\n var optimizedCharIdx = (0, lexer_1.charCodeToOptimizedIndex)(upperChar.charCodeAt(0));\n result[optimizedCharIdx] = optimizedCharIdx;\n }\n else {\n var lowerChar = char.toLowerCase();\n if (lowerChar !== char) {\n var optimizedCharIdx = (0, lexer_1.charCodeToOptimizedIndex)(lowerChar.charCodeAt(0));\n result[optimizedCharIdx] = optimizedCharIdx;\n }\n }\n}\nfunction findCode(setNode, targetCharCodes) {\n return (0, find_1.default)(setNode.value, function (codeOrRange) {\n if (typeof codeOrRange === \"number\") {\n return (0, includes_1.default)(targetCharCodes, codeOrRange);\n }\n else {\n // range\n var range_1 = codeOrRange;\n return ((0, find_1.default)(targetCharCodes, function (targetCode) { return range_1.from <= targetCode && targetCode <= range_1.to; }) !== undefined);\n }\n });\n}\nfunction isWholeOptional(ast) {\n var quantifier = ast.quantifier;\n if (quantifier && quantifier.atLeast === 0) {\n return true;\n }\n if (!ast.value) {\n return false;\n }\n return (0, isArray_1.default)(ast.value)\n ? (0, every_1.default)(ast.value, isWholeOptional)\n : isWholeOptional(ast.value);\n}\nvar CharCodeFinder = /** @class */ (function (_super) {\n __extends(CharCodeFinder, _super);\n function CharCodeFinder(targetCharCodes) {\n var _this = _super.call(this) || this;\n _this.targetCharCodes = targetCharCodes;\n _this.found = false;\n return _this;\n }\n CharCodeFinder.prototype.visitChildren = function (node) {\n // No need to keep looking...\n if (this.found === true) {\n return;\n }\n // switch lookaheads as they do not actually consume any characters thus\n // finding a charCode at lookahead context does not mean that regexp can actually contain it in a match.\n switch (node.type) {\n case \"Lookahead\":\n this.visitLookahead(node);\n return;\n case \"NegativeLookahead\":\n this.visitNegativeLookahead(node);\n return;\n }\n _super.prototype.visitChildren.call(this, node);\n };\n CharCodeFinder.prototype.visitCharacter = function (node) {\n if ((0, includes_1.default)(this.targetCharCodes, node.value)) {\n this.found = true;\n }\n };\n CharCodeFinder.prototype.visitSet = function (node) {\n if (node.complement) {\n if (findCode(node, this.targetCharCodes) === undefined) {\n this.found = true;\n }\n }\n else {\n if (findCode(node, this.targetCharCodes) !== undefined) {\n this.found = true;\n }\n }\n };\n return CharCodeFinder;\n}(regexp_to_ast_1.BaseRegExpVisitor));\nfunction canMatchCharCode(charCodes, pattern) {\n if (pattern instanceof RegExp) {\n var ast = (0, reg_exp_parser_1.getRegExpAst)(pattern);\n var charCodeFinder = new CharCodeFinder(charCodes);\n charCodeFinder.visit(ast);\n return charCodeFinder.found;\n }\n else {\n return ((0, find_1.default)(pattern, function (char) {\n return (0, includes_1.default)(charCodes, char.charCodeAt(0));\n }) !== undefined);\n }\n}\nexports.canMatchCharCode = canMatchCharCode;\n//# sourceMappingURL=reg_exp.js.map","var baseDifference = require('./_baseDifference'),\n baseFlatten = require('./_baseFlatten'),\n baseRest = require('./_baseRest'),\n isArrayLikeObject = require('./isArrayLikeObject');\n\n/**\n * Creates an array of `array` values not included in the other given arrays\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons. The order and references of result values are\n * determined by the first array.\n *\n * **Note:** Unlike `_.pullAll`, this method returns a new array.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {...Array} [values] The values to exclude.\n * @returns {Array} Returns the new array of filtered values.\n * @see _.without, _.xor\n * @example\n *\n * _.difference([2, 1], [2, 3]);\n * // => [1]\n */\nvar difference = baseRest(function(array, values) {\n return isArrayLikeObject(array)\n ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true))\n : [];\n});\n\nmodule.exports = difference;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.toFastProperties = void 0;\n// based on: https://github.com/petkaantonov/bluebird/blob/b97c0d2d487e8c5076e8bd897e0dcd4622d31846/src/util.js#L201-L216\nfunction toFastProperties(toBecomeFast) {\n function FakeConstructor() { }\n // If our object is used as a constructor it would receive\n FakeConstructor.prototype = toBecomeFast;\n var fakeInstance = new FakeConstructor();\n function fakeAccess() {\n return typeof fakeInstance.bar;\n }\n // help V8 understand this is a \"real\" prototype by actually using\n // the fake instance.\n fakeAccess();\n fakeAccess();\n // Always true condition to suppress the Firefox warning of unreachable\n // code after a return statement.\n if (1)\n return toBecomeFast;\n // Eval prevents optimization of this method (even though this is dead code)\n /* istanbul ignore next */\n // tslint:disable-next-line\n eval(toBecomeFast);\n}\nexports.toFastProperties = toFastProperties;\n//# sourceMappingURL=to-fast-properties.js.map","\"use strict\";\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.EmbeddedActionsParser = exports.CstParser = exports.Parser = exports.EMPTY_ALT = exports.ParserDefinitionErrorType = exports.DEFAULT_RULE_CONFIG = exports.DEFAULT_PARSER_CONFIG = exports.END_OF_FILE = void 0;\nvar isEmpty_1 = __importDefault(require(\"lodash/isEmpty\"));\nvar map_1 = __importDefault(require(\"lodash/map\"));\nvar forEach_1 = __importDefault(require(\"lodash/forEach\"));\nvar values_1 = __importDefault(require(\"lodash/values\"));\nvar has_1 = __importDefault(require(\"lodash/has\"));\nvar clone_1 = __importDefault(require(\"lodash/clone\"));\nvar utils_1 = require(\"@chevrotain/utils\");\nvar follow_1 = require(\"../grammar/follow\");\nvar tokens_public_1 = require(\"../../scan/tokens_public\");\nvar errors_public_1 = require(\"../errors_public\");\nvar gast_resolver_public_1 = require(\"../grammar/gast/gast_resolver_public\");\nvar recoverable_1 = require(\"./traits/recoverable\");\nvar looksahead_1 = require(\"./traits/looksahead\");\nvar tree_builder_1 = require(\"./traits/tree_builder\");\nvar lexer_adapter_1 = require(\"./traits/lexer_adapter\");\nvar recognizer_api_1 = require(\"./traits/recognizer_api\");\nvar recognizer_engine_1 = require(\"./traits/recognizer_engine\");\nvar error_handler_1 = require(\"./traits/error_handler\");\nvar context_assist_1 = require(\"./traits/context_assist\");\nvar gast_recorder_1 = require(\"./traits/gast_recorder\");\nvar perf_tracer_1 = require(\"./traits/perf_tracer\");\nvar apply_mixins_1 = require(\"./utils/apply_mixins\");\nvar checks_1 = require(\"../grammar/checks\");\nexports.END_OF_FILE = (0, tokens_public_1.createTokenInstance)(tokens_public_1.EOF, \"\", NaN, NaN, NaN, NaN, NaN, NaN);\nObject.freeze(exports.END_OF_FILE);\nexports.DEFAULT_PARSER_CONFIG = Object.freeze({\n recoveryEnabled: false,\n maxLookahead: 3,\n dynamicTokensEnabled: false,\n outputCst: true,\n errorMessageProvider: errors_public_1.defaultParserErrorProvider,\n nodeLocationTracking: \"none\",\n traceInitPerf: false,\n skipValidations: false\n});\nexports.DEFAULT_RULE_CONFIG = Object.freeze({\n recoveryValueFunc: function () { return undefined; },\n resyncEnabled: true\n});\nvar ParserDefinitionErrorType;\n(function (ParserDefinitionErrorType) {\n ParserDefinitionErrorType[ParserDefinitionErrorType[\"INVALID_RULE_NAME\"] = 0] = \"INVALID_RULE_NAME\";\n ParserDefinitionErrorType[ParserDefinitionErrorType[\"DUPLICATE_RULE_NAME\"] = 1] = \"DUPLICATE_RULE_NAME\";\n ParserDefinitionErrorType[ParserDefinitionErrorType[\"INVALID_RULE_OVERRIDE\"] = 2] = \"INVALID_RULE_OVERRIDE\";\n ParserDefinitionErrorType[ParserDefinitionErrorType[\"DUPLICATE_PRODUCTIONS\"] = 3] = \"DUPLICATE_PRODUCTIONS\";\n ParserDefinitionErrorType[ParserDefinitionErrorType[\"UNRESOLVED_SUBRULE_REF\"] = 4] = \"UNRESOLVED_SUBRULE_REF\";\n ParserDefinitionErrorType[ParserDefinitionErrorType[\"LEFT_RECURSION\"] = 5] = \"LEFT_RECURSION\";\n ParserDefinitionErrorType[ParserDefinitionErrorType[\"NONE_LAST_EMPTY_ALT\"] = 6] = \"NONE_LAST_EMPTY_ALT\";\n ParserDefinitionErrorType[ParserDefinitionErrorType[\"AMBIGUOUS_ALTS\"] = 7] = \"AMBIGUOUS_ALTS\";\n ParserDefinitionErrorType[ParserDefinitionErrorType[\"CONFLICT_TOKENS_RULES_NAMESPACE\"] = 8] = \"CONFLICT_TOKENS_RULES_NAMESPACE\";\n ParserDefinitionErrorType[ParserDefinitionErrorType[\"INVALID_TOKEN_NAME\"] = 9] = \"INVALID_TOKEN_NAME\";\n ParserDefinitionErrorType[ParserDefinitionErrorType[\"NO_NON_EMPTY_LOOKAHEAD\"] = 10] = \"NO_NON_EMPTY_LOOKAHEAD\";\n ParserDefinitionErrorType[ParserDefinitionErrorType[\"AMBIGUOUS_PREFIX_ALTS\"] = 11] = \"AMBIGUOUS_PREFIX_ALTS\";\n ParserDefinitionErrorType[ParserDefinitionErrorType[\"TOO_MANY_ALTS\"] = 12] = \"TOO_MANY_ALTS\";\n ParserDefinitionErrorType[ParserDefinitionErrorType[\"CUSTOM_LOOKAHEAD_VALIDATION\"] = 13] = \"CUSTOM_LOOKAHEAD_VALIDATION\";\n})(ParserDefinitionErrorType = exports.ParserDefinitionErrorType || (exports.ParserDefinitionErrorType = {}));\nfunction EMPTY_ALT(value) {\n if (value === void 0) { value = undefined; }\n return function () {\n return value;\n };\n}\nexports.EMPTY_ALT = EMPTY_ALT;\nvar Parser = /** @class */ (function () {\n function Parser(tokenVocabulary, config) {\n this.definitionErrors = [];\n this.selfAnalysisDone = false;\n var that = this;\n that.initErrorHandler(config);\n that.initLexerAdapter();\n that.initLooksAhead(config);\n that.initRecognizerEngine(tokenVocabulary, config);\n that.initRecoverable(config);\n that.initTreeBuilder(config);\n that.initContentAssist();\n that.initGastRecorder(config);\n that.initPerformanceTracer(config);\n if ((0, has_1.default)(config, \"ignoredIssues\")) {\n throw new Error(\"The IParserConfig property has been deprecated.\\n\\t\" +\n \"Please use the flag on the relevant DSL method instead.\\n\\t\" +\n \"See: https://chevrotain.io/docs/guide/resolving_grammar_errors.html#IGNORING_AMBIGUITIES\\n\\t\" +\n \"For further details.\");\n }\n this.skipValidations = (0, has_1.default)(config, \"skipValidations\")\n ? config.skipValidations // casting assumes the end user passing the correct type\n : exports.DEFAULT_PARSER_CONFIG.skipValidations;\n }\n /**\n * @deprecated use the **instance** method with the same name instead\n */\n Parser.performSelfAnalysis = function (parserInstance) {\n throw Error(\"The **static** `performSelfAnalysis` method has been deprecated.\" +\n \"\\t\\nUse the **instance** method with the same name instead.\");\n };\n Parser.prototype.performSelfAnalysis = function () {\n var _this = this;\n this.TRACE_INIT(\"performSelfAnalysis\", function () {\n var defErrorsMsgs;\n _this.selfAnalysisDone = true;\n var className = _this.className;\n _this.TRACE_INIT(\"toFastProps\", function () {\n // Without this voodoo magic the parser would be x3-x4 slower\n // It seems it is better to invoke `toFastProperties` **before**\n // Any manipulations of the `this` object done during the recording phase.\n (0, utils_1.toFastProperties)(_this);\n });\n _this.TRACE_INIT(\"Grammar Recording\", function () {\n try {\n _this.enableRecording();\n // Building the GAST\n (0, forEach_1.default)(_this.definedRulesNames, function (currRuleName) {\n var wrappedRule = _this[currRuleName];\n var originalGrammarAction = wrappedRule[\"originalGrammarAction\"];\n var recordedRuleGast;\n _this.TRACE_INIT(\"\".concat(currRuleName, \" Rule\"), function () {\n recordedRuleGast = _this.topLevelRuleRecord(currRuleName, originalGrammarAction);\n });\n _this.gastProductionsCache[currRuleName] = recordedRuleGast;\n });\n }\n finally {\n _this.disableRecording();\n }\n });\n var resolverErrors = [];\n _this.TRACE_INIT(\"Grammar Resolving\", function () {\n resolverErrors = (0, gast_resolver_public_1.resolveGrammar)({\n rules: (0, values_1.default)(_this.gastProductionsCache)\n });\n _this.definitionErrors = _this.definitionErrors.concat(resolverErrors);\n });\n _this.TRACE_INIT(\"Grammar Validations\", function () {\n // only perform additional grammar validations IFF no resolving errors have occurred.\n // as unresolved grammar may lead to unhandled runtime exceptions in the follow up validations.\n if ((0, isEmpty_1.default)(resolverErrors) && _this.skipValidations === false) {\n var validationErrors = (0, gast_resolver_public_1.validateGrammar)({\n rules: (0, values_1.default)(_this.gastProductionsCache),\n tokenTypes: (0, values_1.default)(_this.tokensMap),\n errMsgProvider: errors_public_1.defaultGrammarValidatorErrorProvider,\n grammarName: className\n });\n var lookaheadValidationErrors = (0, checks_1.validateLookahead)({\n lookaheadStrategy: _this.lookaheadStrategy,\n rules: (0, values_1.default)(_this.gastProductionsCache),\n tokenTypes: (0, values_1.default)(_this.tokensMap),\n grammarName: className\n });\n _this.definitionErrors = _this.definitionErrors.concat(validationErrors, lookaheadValidationErrors);\n }\n });\n // this analysis may fail if the grammar is not perfectly valid\n if ((0, isEmpty_1.default)(_this.definitionErrors)) {\n // The results of these computations are not needed unless error recovery is enabled.\n if (_this.recoveryEnabled) {\n _this.TRACE_INIT(\"computeAllProdsFollows\", function () {\n var allFollows = (0, follow_1.computeAllProdsFollows)((0, values_1.default)(_this.gastProductionsCache));\n _this.resyncFollows = allFollows;\n });\n }\n _this.TRACE_INIT(\"ComputeLookaheadFunctions\", function () {\n var _a, _b;\n (_b = (_a = _this.lookaheadStrategy).initialize) === null || _b === void 0 ? void 0 : _b.call(_a, {\n rules: (0, values_1.default)(_this.gastProductionsCache)\n });\n _this.preComputeLookaheadFunctions((0, values_1.default)(_this.gastProductionsCache));\n });\n }\n if (!Parser.DEFER_DEFINITION_ERRORS_HANDLING &&\n !(0, isEmpty_1.default)(_this.definitionErrors)) {\n defErrorsMsgs = (0, map_1.default)(_this.definitionErrors, function (defError) { return defError.message; });\n throw new Error(\"Parser Definition Errors detected:\\n \".concat(defErrorsMsgs.join(\"\\n-------------------------------\\n\")));\n }\n });\n };\n // Set this flag to true if you don't want the Parser to throw error when problems in it's definition are detected.\n // (normally during the parser's constructor).\n // This is a design time flag, it will not affect the runtime error handling of the parser, just design time errors,\n // for example: duplicate rule names, referencing an unresolved subrule, ect...\n // This flag should not be enabled during normal usage, it is used in special situations, for example when\n // needing to display the parser definition errors in some GUI(online playground).\n Parser.DEFER_DEFINITION_ERRORS_HANDLING = false;\n return Parser;\n}());\nexports.Parser = Parser;\n(0, apply_mixins_1.applyMixins)(Parser, [\n recoverable_1.Recoverable,\n looksahead_1.LooksAhead,\n tree_builder_1.TreeBuilder,\n lexer_adapter_1.LexerAdapter,\n recognizer_engine_1.RecognizerEngine,\n recognizer_api_1.RecognizerApi,\n error_handler_1.ErrorHandler,\n context_assist_1.ContentAssist,\n gast_recorder_1.GastRecorder,\n perf_tracer_1.PerformanceTracer\n]);\nvar CstParser = /** @class */ (function (_super) {\n __extends(CstParser, _super);\n function CstParser(tokenVocabulary, config) {\n if (config === void 0) { config = exports.DEFAULT_PARSER_CONFIG; }\n var configClone = (0, clone_1.default)(config);\n configClone.outputCst = true;\n return _super.call(this, tokenVocabulary, configClone) || this;\n }\n return CstParser;\n}(Parser));\nexports.CstParser = CstParser;\nvar EmbeddedActionsParser = /** @class */ (function (_super) {\n __extends(EmbeddedActionsParser, _super);\n function EmbeddedActionsParser(tokenVocabulary, config) {\n if (config === void 0) { config = exports.DEFAULT_PARSER_CONFIG; }\n var configClone = (0, clone_1.default)(config);\n configClone.outputCst = false;\n return _super.call(this, tokenVocabulary, configClone) || this;\n }\n return EmbeddedActionsParser;\n}(Parser));\nexports.EmbeddedActionsParser = EmbeddedActionsParser;\n//# sourceMappingURL=parser.js.map","var arrayPush = require('./_arrayPush'),\n getPrototype = require('./_getPrototype'),\n getSymbols = require('./_getSymbols'),\n stubArray = require('./stubArray');\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeGetSymbols = Object.getOwnPropertySymbols;\n\n/**\n * Creates an array of the own and inherited enumerable symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of symbols.\n */\nvar getSymbolsIn = !nativeGetSymbols ? stubArray : function(object) {\n var result = [];\n while (object) {\n arrayPush(result, getSymbols(object));\n object = getPrototype(object);\n }\n return result;\n};\n\nmodule.exports = getSymbolsIn;\n","\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.genDts = void 0;\nvar flatten_1 = __importDefault(require(\"lodash/flatten\"));\nvar isArray_1 = __importDefault(require(\"lodash/isArray\"));\nvar map_1 = __importDefault(require(\"lodash/map\"));\nvar reduce_1 = __importDefault(require(\"lodash/reduce\"));\nvar uniq_1 = __importDefault(require(\"lodash/uniq\"));\nvar upperFirst_1 = __importDefault(require(\"lodash/upperFirst\"));\nfunction genDts(model, options) {\n var contentParts = [];\n contentParts = contentParts.concat(\"import type { CstNode, ICstVisitor, IToken } from \\\"chevrotain\\\";\");\n contentParts = contentParts.concat((0, flatten_1.default)((0, map_1.default)(model, function (node) { return genCstNodeTypes(node); })));\n if (options.includeVisitorInterface) {\n contentParts = contentParts.concat(genVisitor(options.visitorInterfaceName, model));\n }\n return contentParts.join(\"\\n\\n\") + \"\\n\";\n}\nexports.genDts = genDts;\nfunction genCstNodeTypes(node) {\n var nodeCstInterface = genNodeInterface(node);\n var nodeChildrenInterface = genNodeChildrenType(node);\n return [nodeCstInterface, nodeChildrenInterface];\n}\nfunction genNodeInterface(node) {\n var nodeInterfaceName = getNodeInterfaceName(node.name);\n var childrenTypeName = getNodeChildrenTypeName(node.name);\n return \"export interface \".concat(nodeInterfaceName, \" extends CstNode {\\n name: \\\"\").concat(node.name, \"\\\";\\n children: \").concat(childrenTypeName, \";\\n}\");\n}\nfunction genNodeChildrenType(node) {\n var typeName = getNodeChildrenTypeName(node.name);\n return \"export type \".concat(typeName, \" = {\\n \").concat((0, map_1.default)(node.properties, function (property) { return genChildProperty(property); }).join(\"\\n \"), \"\\n};\");\n}\nfunction genChildProperty(prop) {\n var typeName = buildTypeString(prop.type);\n return \"\".concat(prop.name).concat(prop.optional ? \"?\" : \"\", \": \").concat(typeName, \"[];\");\n}\nfunction genVisitor(name, nodes) {\n return \"export interface \".concat(name, \" extends ICstVisitor {\\n \").concat((0, map_1.default)(nodes, function (node) { return genVisitorFunction(node); }).join(\"\\n \"), \"\\n}\");\n}\nfunction genVisitorFunction(node) {\n var childrenTypeName = getNodeChildrenTypeName(node.name);\n return \"\".concat(node.name, \"(children: \").concat(childrenTypeName, \", param?: IN): OUT;\");\n}\nfunction buildTypeString(type) {\n if ((0, isArray_1.default)(type)) {\n var typeNames = (0, uniq_1.default)((0, map_1.default)(type, function (t) { return getTypeString(t); }));\n var typeString = (0, reduce_1.default)(typeNames, function (sum, t) { return sum + \" | \" + t; });\n return \"(\" + typeString + \")\";\n }\n else {\n return getTypeString(type);\n }\n}\nfunction getTypeString(type) {\n if (type.kind === \"token\") {\n return \"IToken\";\n }\n return getNodeInterfaceName(type.name);\n}\nfunction getNodeInterfaceName(ruleName) {\n return (0, upperFirst_1.default)(ruleName) + \"CstNode\";\n}\nfunction getNodeChildrenTypeName(ruleName) {\n return (0, upperFirst_1.default)(ruleName) + \"CstChildren\";\n}\n//# sourceMappingURL=generate.js.map","/**\n * Checks if `value` is classified as an `Array` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(document.body.children);\n * // => false\n *\n * _.isArray('abc');\n * // => false\n *\n * _.isArray(_.noop);\n * // => false\n */\nvar isArray = Array.isArray;\n\nmodule.exports = isArray;\n","var getNative = require('./_getNative'),\n root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar Set = getNative(root, 'Set');\n\nmodule.exports = Set;\n","var baseAssignValue = require('./_baseAssignValue'),\n eq = require('./eq');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Assigns `value` to `key` of `object` if the existing value is not equivalent\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\nfunction assignValue(object, key, value) {\n var objValue = object[key];\n if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) ||\n (value === undefined && !(key in object))) {\n baseAssignValue(object, key, value);\n }\n}\n\nmodule.exports = assignValue;\n","(function (window, factory) {\n if (typeof exports === 'object') {\n module.exports = factory();\n } else if (typeof define === 'function' && define.amd) {\n define(factory);\n } else {\n window.jStat = factory();\n }\n})(this, function () {\nvar jStat = (function(Math, undefined) {\n\n// For quick reference.\nvar concat = Array.prototype.concat;\nvar slice = Array.prototype.slice;\nvar toString = Object.prototype.toString;\n\n// Calculate correction for IEEE error\n// TODO: This calculation can be improved.\nfunction calcRdx(n, m) {\n var val = n > m ? n : m;\n return Math.pow(10,\n 17 - ~~(Math.log(((val > 0) ? val : -val)) * Math.LOG10E));\n}\n\n\nvar isArray = Array.isArray || function isArray(arg) {\n return toString.call(arg) === '[object Array]';\n};\n\n\nfunction isFunction(arg) {\n return toString.call(arg) === '[object Function]';\n}\n\n\nfunction isNumber(num) {\n return (typeof num === 'number') ? num - num === 0 : false;\n}\n\n\n// Converts the jStat matrix to vector.\nfunction toVector(arr) {\n return concat.apply([], arr);\n}\n\n\n// The one and only jStat constructor.\nfunction jStat() {\n return new jStat._init(arguments);\n}\n\n\n// TODO: Remove after all references in src files have been removed.\njStat.fn = jStat.prototype;\n\n\n// By separating the initializer from the constructor it's easier to handle\n// always returning a new instance whether \"new\" was used or not.\njStat._init = function _init(args) {\n // If first argument is an array, must be vector or matrix.\n if (isArray(args[0])) {\n // Check if matrix.\n if (isArray(args[0][0])) {\n // See if a mapping function was also passed.\n if (isFunction(args[1]))\n args[0] = jStat.map(args[0], args[1]);\n // Iterate over each is faster than this.push.apply(this, args[0].\n for (var i = 0; i < args[0].length; i++)\n this[i] = args[0][i];\n this.length = args[0].length;\n\n // Otherwise must be a vector.\n } else {\n this[0] = isFunction(args[1]) ? jStat.map(args[0], args[1]) : args[0];\n this.length = 1;\n }\n\n // If first argument is number, assume creation of sequence.\n } else if (isNumber(args[0])) {\n this[0] = jStat.seq.apply(null, args);\n this.length = 1;\n\n // Handle case when jStat object is passed to jStat.\n } else if (args[0] instanceof jStat) {\n // Duplicate the object and pass it back.\n return jStat(args[0].toArray());\n\n // Unexpected argument value, return empty jStat object.\n // TODO: This is strange behavior. Shouldn't this throw or some such to let\n // the user know they had bad arguments?\n } else {\n this[0] = [];\n this.length = 1;\n }\n\n return this;\n};\njStat._init.prototype = jStat.prototype;\njStat._init.constructor = jStat;\n\n\n// Utility functions.\n// TODO: for internal use only?\njStat.utils = {\n calcRdx: calcRdx,\n isArray: isArray,\n isFunction: isFunction,\n isNumber: isNumber,\n toVector: toVector\n};\n\n\njStat._random_fn = Math.random;\njStat.setRandom = function setRandom(fn) {\n if (typeof fn !== 'function')\n throw new TypeError('fn is not a function');\n jStat._random_fn = fn;\n};\n\n\n// Easily extend the jStat object.\n// TODO: is this seriously necessary?\njStat.extend = function extend(obj) {\n var i, j;\n\n if (arguments.length === 1) {\n for (j in obj)\n jStat[j] = obj[j];\n return this;\n }\n\n for (i = 1; i < arguments.length; i++) {\n for (j in arguments[i])\n obj[j] = arguments[i][j];\n }\n\n return obj;\n};\n\n\n// Returns the number of rows in the matrix.\njStat.rows = function rows(arr) {\n return arr.length || 1;\n};\n\n\n// Returns the number of columns in the matrix.\njStat.cols = function cols(arr) {\n return arr[0].length || 1;\n};\n\n\n// Returns the dimensions of the object { rows: i, cols: j }\njStat.dimensions = function dimensions(arr) {\n return {\n rows: jStat.rows(arr),\n cols: jStat.cols(arr)\n };\n};\n\n\n// Returns a specified row as a vector or return a sub matrix by pick some rows\njStat.row = function row(arr, index) {\n if (isArray(index)) {\n return index.map(function(i) {\n return jStat.row(arr, i);\n })\n }\n return arr[index];\n};\n\n\n// return row as array\n// rowa([[1,2],[3,4]],0) -> [1,2]\njStat.rowa = function rowa(arr, i) {\n return jStat.row(arr, i);\n};\n\n\n// Returns the specified column as a vector or return a sub matrix by pick some\n// columns\njStat.col = function col(arr, index) {\n if (isArray(index)) {\n var submat = jStat.arange(arr.length).map(function() {\n return new Array(index.length);\n });\n index.forEach(function(ind, i){\n jStat.arange(arr.length).forEach(function(j) {\n submat[j][i] = arr[j][ind];\n });\n });\n return submat;\n }\n var column = new Array(arr.length);\n for (var i = 0; i < arr.length; i++)\n column[i] = [arr[i][index]];\n return column;\n};\n\n\n// return column as array\n// cola([[1,2],[3,4]],0) -> [1,3]\njStat.cola = function cola(arr, i) {\n return jStat.col(arr, i).map(function(a){ return a[0] });\n};\n\n\n// Returns the diagonal of the matrix\njStat.diag = function diag(arr) {\n var nrow = jStat.rows(arr);\n var res = new Array(nrow);\n for (var row = 0; row < nrow; row++)\n res[row] = [arr[row][row]];\n return res;\n};\n\n\n// Returns the anti-diagonal of the matrix\njStat.antidiag = function antidiag(arr) {\n var nrow = jStat.rows(arr) - 1;\n var res = new Array(nrow);\n for (var i = 0; nrow >= 0; nrow--, i++)\n res[i] = [arr[i][nrow]];\n return res;\n};\n\n// Transpose a matrix or array.\njStat.transpose = function transpose(arr) {\n var obj = [];\n var objArr, rows, cols, j, i;\n\n // Make sure arr is in matrix format.\n if (!isArray(arr[0]))\n arr = [arr];\n\n rows = arr.length;\n cols = arr[0].length;\n\n for (i = 0; i < cols; i++) {\n objArr = new Array(rows);\n for (j = 0; j < rows; j++)\n objArr[j] = arr[j][i];\n obj.push(objArr);\n }\n\n // If obj is vector, return only single array.\n return obj.length === 1 ? obj[0] : obj;\n};\n\n\n// Map a function to an array or array of arrays.\n// \"toAlter\" is an internal variable.\njStat.map = function map(arr, func, toAlter) {\n var row, nrow, ncol, res, col;\n\n if (!isArray(arr[0]))\n arr = [arr];\n\n nrow = arr.length;\n ncol = arr[0].length;\n res = toAlter ? arr : new Array(nrow);\n\n for (row = 0; row < nrow; row++) {\n // if the row doesn't exist, create it\n if (!res[row])\n res[row] = new Array(ncol);\n for (col = 0; col < ncol; col++)\n res[row][col] = func(arr[row][col], row, col);\n }\n\n return res.length === 1 ? res[0] : res;\n};\n\n\n// Cumulatively combine the elements of an array or array of arrays using a function.\njStat.cumreduce = function cumreduce(arr, func, toAlter) {\n var row, nrow, ncol, res, col;\n\n if (!isArray(arr[0]))\n arr = [arr];\n\n nrow = arr.length;\n ncol = arr[0].length;\n res = toAlter ? arr : new Array(nrow);\n\n for (row = 0; row < nrow; row++) {\n // if the row doesn't exist, create it\n if (!res[row])\n res[row] = new Array(ncol);\n if (ncol > 0)\n res[row][0] = arr[row][0];\n for (col = 1; col < ncol; col++)\n res[row][col] = func(res[row][col-1], arr[row][col]);\n }\n return res.length === 1 ? res[0] : res;\n};\n\n\n// Destructively alter an array.\njStat.alter = function alter(arr, func) {\n return jStat.map(arr, func, true);\n};\n\n\n// Generate a rows x cols matrix according to the supplied function.\njStat.create = function create(rows, cols, func) {\n var res = new Array(rows);\n var i, j;\n\n if (isFunction(cols)) {\n func = cols;\n cols = rows;\n }\n\n for (i = 0; i < rows; i++) {\n res[i] = new Array(cols);\n for (j = 0; j < cols; j++)\n res[i][j] = func(i, j);\n }\n\n return res;\n};\n\n\nfunction retZero() { return 0; }\n\n\n// Generate a rows x cols matrix of zeros.\njStat.zeros = function zeros(rows, cols) {\n if (!isNumber(cols))\n cols = rows;\n return jStat.create(rows, cols, retZero);\n};\n\n\nfunction retOne() { return 1; }\n\n\n// Generate a rows x cols matrix of ones.\njStat.ones = function ones(rows, cols) {\n if (!isNumber(cols))\n cols = rows;\n return jStat.create(rows, cols, retOne);\n};\n\n\n// Generate a rows x cols matrix of uniformly random numbers.\njStat.rand = function rand(rows, cols) {\n if (!isNumber(cols))\n cols = rows;\n return jStat.create(rows, cols, jStat._random_fn);\n};\n\n\nfunction retIdent(i, j) { return i === j ? 1 : 0; }\n\n\n// Generate an identity matrix of size row x cols.\njStat.identity = function identity(rows, cols) {\n if (!isNumber(cols))\n cols = rows;\n return jStat.create(rows, cols, retIdent);\n};\n\n\n// Tests whether a matrix is symmetric\njStat.symmetric = function symmetric(arr) {\n var size = arr.length;\n var row, col;\n\n if (arr.length !== arr[0].length)\n return false;\n\n for (row = 0; row < size; row++) {\n for (col = 0; col < size; col++)\n if (arr[col][row] !== arr[row][col])\n return false;\n }\n\n return true;\n};\n\n\n// Set all values to zero.\njStat.clear = function clear(arr) {\n return jStat.alter(arr, retZero);\n};\n\n\n// Generate sequence.\njStat.seq = function seq(min, max, length, func) {\n if (!isFunction(func))\n func = false;\n\n var arr = [];\n var hival = calcRdx(min, max);\n var step = (max * hival - min * hival) / ((length - 1) * hival);\n var current = min;\n var cnt;\n\n // Current is assigned using a technique to compensate for IEEE error.\n // TODO: Needs better implementation.\n for (cnt = 0;\n current <= max && cnt < length;\n cnt++, current = (min * hival + step * hival * cnt) / hival) {\n arr.push((func ? func(current, cnt) : current));\n }\n\n return arr;\n};\n\n\n// arange(5) -> [0,1,2,3,4]\n// arange(1,5) -> [1,2,3,4]\n// arange(5,1,-1) -> [5,4,3,2]\njStat.arange = function arange(start, end, step) {\n var rl = [];\n var i;\n step = step || 1;\n if (end === undefined) {\n end = start;\n start = 0;\n }\n if (start === end || step === 0) {\n return [];\n }\n if (start < end && step < 0) {\n return [];\n }\n if (start > end && step > 0) {\n return [];\n }\n if (step > 0) {\n for (i = start; i < end; i += step) {\n rl.push(i);\n }\n } else {\n for (i = start; i > end; i += step) {\n rl.push(i);\n }\n }\n return rl;\n};\n\n\n// A=[[1,2,3],[4,5,6],[7,8,9]]\n// slice(A,{row:{end:2},col:{start:1}}) -> [[2,3],[5,6]]\n// slice(A,1,{start:1}) -> [5,6]\n// as numpy code A[:2,1:]\njStat.slice = (function(){\n function _slice(list, start, end, step) {\n // note it's not equal to range.map mode it's a bug\n var i;\n var rl = [];\n var length = list.length;\n if (start === undefined && end === undefined && step === undefined) {\n return jStat.copy(list);\n }\n\n start = start || 0;\n end = end || list.length;\n start = start >= 0 ? start : length + start;\n end = end >= 0 ? end : length + end;\n step = step || 1;\n if (start === end || step === 0) {\n return [];\n }\n if (start < end && step < 0) {\n return [];\n }\n if (start > end && step > 0) {\n return [];\n }\n if (step > 0) {\n for (i = start; i < end; i += step) {\n rl.push(list[i]);\n }\n } else {\n for (i = start; i > end;i += step) {\n rl.push(list[i]);\n }\n }\n return rl;\n }\n\n function slice(list, rcSlice) {\n var colSlice, rowSlice;\n rcSlice = rcSlice || {};\n if (isNumber(rcSlice.row)) {\n if (isNumber(rcSlice.col))\n return list[rcSlice.row][rcSlice.col];\n var row = jStat.rowa(list, rcSlice.row);\n colSlice = rcSlice.col || {};\n return _slice(row, colSlice.start, colSlice.end, colSlice.step);\n }\n\n if (isNumber(rcSlice.col)) {\n var col = jStat.cola(list, rcSlice.col);\n rowSlice = rcSlice.row || {};\n return _slice(col, rowSlice.start, rowSlice.end, rowSlice.step);\n }\n\n rowSlice = rcSlice.row || {};\n colSlice = rcSlice.col || {};\n var rows = _slice(list, rowSlice.start, rowSlice.end, rowSlice.step);\n return rows.map(function(row) {\n return _slice(row, colSlice.start, colSlice.end, colSlice.step);\n });\n }\n\n return slice;\n}());\n\n\n// A=[[1,2,3],[4,5,6],[7,8,9]]\n// sliceAssign(A,{row:{start:1},col:{start:1}},[[0,0],[0,0]])\n// A=[[1,2,3],[4,0,0],[7,0,0]]\njStat.sliceAssign = function sliceAssign(A, rcSlice, B) {\n var nl, ml;\n if (isNumber(rcSlice.row)) {\n if (isNumber(rcSlice.col))\n return A[rcSlice.row][rcSlice.col] = B;\n rcSlice.col = rcSlice.col || {};\n rcSlice.col.start = rcSlice.col.start || 0;\n rcSlice.col.end = rcSlice.col.end || A[0].length;\n rcSlice.col.step = rcSlice.col.step || 1;\n nl = jStat.arange(rcSlice.col.start,\n Math.min(A.length, rcSlice.col.end),\n rcSlice.col.step);\n var m = rcSlice.row;\n nl.forEach(function(n, i) {\n A[m][n] = B[i];\n });\n return A;\n }\n\n if (isNumber(rcSlice.col)) {\n rcSlice.row = rcSlice.row || {};\n rcSlice.row.start = rcSlice.row.start || 0;\n rcSlice.row.end = rcSlice.row.end || A.length;\n rcSlice.row.step = rcSlice.row.step || 1;\n ml = jStat.arange(rcSlice.row.start,\n Math.min(A[0].length, rcSlice.row.end),\n rcSlice.row.step);\n var n = rcSlice.col;\n ml.forEach(function(m, j) {\n A[m][n] = B[j];\n });\n return A;\n }\n\n if (B[0].length === undefined) {\n B = [B];\n }\n rcSlice.row.start = rcSlice.row.start || 0;\n rcSlice.row.end = rcSlice.row.end || A.length;\n rcSlice.row.step = rcSlice.row.step || 1;\n rcSlice.col.start = rcSlice.col.start || 0;\n rcSlice.col.end = rcSlice.col.end || A[0].length;\n rcSlice.col.step = rcSlice.col.step || 1;\n ml = jStat.arange(rcSlice.row.start,\n Math.min(A.length, rcSlice.row.end),\n rcSlice.row.step);\n nl = jStat.arange(rcSlice.col.start,\n Math.min(A[0].length, rcSlice.col.end),\n rcSlice.col.step);\n ml.forEach(function(m, i) {\n nl.forEach(function(n, j) {\n A[m][n] = B[i][j];\n });\n });\n return A;\n};\n\n\n// [1,2,3] ->\n// [[1,0,0],[0,2,0],[0,0,3]]\njStat.diagonal = function diagonal(diagArray) {\n var mat = jStat.zeros(diagArray.length, diagArray.length);\n diagArray.forEach(function(t, i) {\n mat[i][i] = t;\n });\n return mat;\n};\n\n\n// return copy of A\njStat.copy = function copy(A) {\n return A.map(function(row) {\n if (isNumber(row))\n return row;\n return row.map(function(t) {\n return t;\n });\n });\n};\n\n\n// TODO: Go over this entire implementation. Seems a tragic waste of resources\n// doing all this work. Instead, and while ugly, use new Function() to generate\n// a custom function for each static method.\n\n// Quick reference.\nvar jProto = jStat.prototype;\n\n// Default length.\njProto.length = 0;\n\n// For internal use only.\n// TODO: Check if they're actually used, and if they are then rename them\n// to _*\njProto.push = Array.prototype.push;\njProto.sort = Array.prototype.sort;\njProto.splice = Array.prototype.splice;\njProto.slice = Array.prototype.slice;\n\n\n// Return a clean array.\njProto.toArray = function toArray() {\n return this.length > 1 ? slice.call(this) : slice.call(this)[0];\n};\n\n\n// Map a function to a matrix or vector.\njProto.map = function map(func, toAlter) {\n return jStat(jStat.map(this, func, toAlter));\n};\n\n\n// Cumulatively combine the elements of a matrix or vector using a function.\njProto.cumreduce = function cumreduce(func, toAlter) {\n return jStat(jStat.cumreduce(this, func, toAlter));\n};\n\n\n// Destructively alter an array.\njProto.alter = function alter(func) {\n jStat.alter(this, func);\n return this;\n};\n\n\n// Extend prototype with methods that have no argument.\n(function(funcs) {\n for (var i = 0; i < funcs.length; i++) (function(passfunc) {\n jProto[passfunc] = function(func) {\n var self = this,\n results;\n // Check for callback.\n if (func) {\n setTimeout(function() {\n func.call(self, jProto[passfunc].call(self));\n });\n return this;\n }\n results = jStat[passfunc](this);\n return isArray(results) ? jStat(results) : results;\n };\n })(funcs[i]);\n})('transpose clear symmetric rows cols dimensions diag antidiag'.split(' '));\n\n\n// Extend prototype with methods that have one argument.\n(function(funcs) {\n for (var i = 0; i < funcs.length; i++) (function(passfunc) {\n jProto[passfunc] = function(index, func) {\n var self = this;\n // check for callback\n if (func) {\n setTimeout(function() {\n func.call(self, jProto[passfunc].call(self, index));\n });\n return this;\n }\n return jStat(jStat[passfunc](this, index));\n };\n })(funcs[i]);\n})('row col'.split(' '));\n\n\n// Extend prototype with simple shortcut methods.\n(function(funcs) {\n for (var i = 0; i < funcs.length; i++) (function(passfunc) {\n jProto[passfunc] = function() {\n return jStat(jStat[passfunc].apply(null, arguments));\n };\n })(funcs[i]);\n})('create zeros ones rand identity'.split(' '));\n\n\n// Exposing jStat.\nreturn jStat;\n\n}(Math));\n(function(jStat, Math) {\n\nvar isFunction = jStat.utils.isFunction;\n\n// Ascending functions for sort\nfunction ascNum(a, b) { return a - b; }\n\nfunction clip(arg, min, max) {\n return Math.max(min, Math.min(arg, max));\n}\n\n\n// sum of an array\njStat.sum = function sum(arr) {\n var sum = 0;\n var i = arr.length;\n while (--i >= 0)\n sum += arr[i];\n return sum;\n};\n\n\n// sum squared\njStat.sumsqrd = function sumsqrd(arr) {\n var sum = 0;\n var i = arr.length;\n while (--i >= 0)\n sum += arr[i] * arr[i];\n return sum;\n};\n\n\n// sum of squared errors of prediction (SSE)\njStat.sumsqerr = function sumsqerr(arr) {\n var mean = jStat.mean(arr);\n var sum = 0;\n var i = arr.length;\n var tmp;\n while (--i >= 0) {\n tmp = arr[i] - mean;\n sum += tmp * tmp;\n }\n return sum;\n};\n\n// sum of an array in each row\njStat.sumrow = function sumrow(arr) {\n var sum = 0;\n var i = arr.length;\n while (--i >= 0)\n sum += arr[i];\n return sum;\n};\n\n// product of an array\njStat.product = function product(arr) {\n var prod = 1;\n var i = arr.length;\n while (--i >= 0)\n prod *= arr[i];\n return prod;\n};\n\n\n// minimum value of an array\njStat.min = function min(arr) {\n var low = arr[0];\n var i = 0;\n while (++i < arr.length)\n if (arr[i] < low)\n low = arr[i];\n return low;\n};\n\n\n// maximum value of an array\njStat.max = function max(arr) {\n var high = arr[0];\n var i = 0;\n while (++i < arr.length)\n if (arr[i] > high)\n high = arr[i];\n return high;\n};\n\n\n// unique values of an array\njStat.unique = function unique(arr) {\n var hash = {}, _arr = [];\n for(var i = 0; i < arr.length; i++) {\n if (!hash[arr[i]]) {\n hash[arr[i]] = true;\n _arr.push(arr[i]);\n }\n }\n return _arr;\n};\n\n\n// mean value of an array\njStat.mean = function mean(arr) {\n return jStat.sum(arr) / arr.length;\n};\n\n\n// mean squared error (MSE)\njStat.meansqerr = function meansqerr(arr) {\n return jStat.sumsqerr(arr) / arr.length;\n};\n\n\n// geometric mean of an array\njStat.geomean = function geomean(arr) {\n var logs = arr.map(Math.log)\n var meanOfLogs = jStat.mean(logs)\n return Math.exp(meanOfLogs)\n};\n\n\n// median of an array\njStat.median = function median(arr) {\n var arrlen = arr.length;\n var _arr = arr.slice().sort(ascNum);\n // check if array is even or odd, then return the appropriate\n return !(arrlen & 1)\n ? (_arr[(arrlen / 2) - 1 ] + _arr[(arrlen / 2)]) / 2\n : _arr[(arrlen / 2) | 0 ];\n};\n\n\n// cumulative sum of an array\njStat.cumsum = function cumsum(arr) {\n return jStat.cumreduce(arr, function (a, b) { return a + b; });\n};\n\n\n// cumulative product of an array\njStat.cumprod = function cumprod(arr) {\n return jStat.cumreduce(arr, function (a, b) { return a * b; });\n};\n\n\n// successive differences of a sequence\njStat.diff = function diff(arr) {\n var diffs = [];\n var arrLen = arr.length;\n var i;\n for (i = 1; i < arrLen; i++)\n diffs.push(arr[i] - arr[i - 1]);\n return diffs;\n};\n\n\n// ranks of an array\njStat.rank = function (arr) {\n var i;\n var distinctNumbers = [];\n var numberCounts = {};\n for (i = 0; i < arr.length; i++) {\n var number = arr[i];\n if (numberCounts[number]) {\n numberCounts[number]++;\n } else {\n numberCounts[number] = 1;\n distinctNumbers.push(number);\n }\n }\n\n var sortedDistinctNumbers = distinctNumbers.sort(ascNum);\n var numberRanks = {};\n var currentRank = 1;\n for (i = 0; i < sortedDistinctNumbers.length; i++) {\n var number = sortedDistinctNumbers[i];\n var count = numberCounts[number];\n var first = currentRank;\n var last = currentRank + count - 1;\n var rank = (first + last) / 2;\n numberRanks[number] = rank;\n currentRank += count;\n }\n\n return arr.map(function (number) {\n return numberRanks[number];\n });\n};\n\n\n// mode of an array\n// if there are multiple modes of an array, return all of them\n// is this the appropriate way of handling it?\njStat.mode = function mode(arr) {\n var arrLen = arr.length;\n var _arr = arr.slice().sort(ascNum);\n var count = 1;\n var maxCount = 0;\n var numMaxCount = 0;\n var mode_arr = [];\n var i;\n\n for (i = 0; i < arrLen; i++) {\n if (_arr[i] === _arr[i + 1]) {\n count++;\n } else {\n if (count > maxCount) {\n mode_arr = [_arr[i]];\n maxCount = count;\n numMaxCount = 0;\n }\n // are there multiple max counts\n else if (count === maxCount) {\n mode_arr.push(_arr[i]);\n numMaxCount++;\n }\n // resetting count for new value in array\n count = 1;\n }\n }\n\n return numMaxCount === 0 ? mode_arr[0] : mode_arr;\n};\n\n\n// range of an array\njStat.range = function range(arr) {\n return jStat.max(arr) - jStat.min(arr);\n};\n\n// variance of an array\n// flag = true indicates sample instead of population\njStat.variance = function variance(arr, flag) {\n return jStat.sumsqerr(arr) / (arr.length - (flag ? 1 : 0));\n};\n\n// pooled variance of an array of arrays\njStat.pooledvariance = function pooledvariance(arr) {\n var sumsqerr = arr.reduce(function (a, samples) {return a + jStat.sumsqerr(samples);}, 0);\n var count = arr.reduce(function (a, samples) {return a + samples.length;}, 0);\n return sumsqerr / (count - arr.length);\n};\n\n// deviation of an array\njStat.deviation = function (arr) {\n var mean = jStat.mean(arr);\n var arrlen = arr.length;\n var dev = new Array(arrlen);\n for (var i = 0; i < arrlen; i++) {\n dev[i] = arr[i] - mean;\n }\n return dev;\n};\n\n// standard deviation of an array\n// flag = true indicates sample instead of population\njStat.stdev = function stdev(arr, flag) {\n return Math.sqrt(jStat.variance(arr, flag));\n};\n\n// pooled standard deviation of an array of arrays\njStat.pooledstdev = function pooledstdev(arr) {\n return Math.sqrt(jStat.pooledvariance(arr));\n};\n\n// mean deviation (mean absolute deviation) of an array\njStat.meandev = function meandev(arr) {\n var mean = jStat.mean(arr);\n var a = [];\n for (var i = arr.length - 1; i >= 0; i--) {\n a.push(Math.abs(arr[i] - mean));\n }\n return jStat.mean(a);\n};\n\n\n// median deviation (median absolute deviation) of an array\njStat.meddev = function meddev(arr) {\n var median = jStat.median(arr);\n var a = [];\n for (var i = arr.length - 1; i >= 0; i--) {\n a.push(Math.abs(arr[i] - median));\n }\n return jStat.median(a);\n};\n\n\n// coefficient of variation\njStat.coeffvar = function coeffvar(arr) {\n return jStat.stdev(arr) / jStat.mean(arr);\n};\n\n\n// quartiles of an array\njStat.quartiles = function quartiles(arr) {\n var arrlen = arr.length;\n var _arr = arr.slice().sort(ascNum);\n return [\n _arr[ Math.round((arrlen) / 4) - 1 ],\n _arr[ Math.round((arrlen) / 2) - 1 ],\n _arr[ Math.round((arrlen) * 3 / 4) - 1 ]\n ];\n};\n\n\n// Arbitary quantiles of an array. Direct port of the scipy.stats\n// implementation by Pierre GF Gerard-Marchant.\njStat.quantiles = function quantiles(arr, quantilesArray, alphap, betap) {\n var sortedArray = arr.slice().sort(ascNum);\n var quantileVals = [quantilesArray.length];\n var n = arr.length;\n var i, p, m, aleph, k, gamma;\n\n if (typeof alphap === 'undefined')\n alphap = 3 / 8;\n if (typeof betap === 'undefined')\n betap = 3 / 8;\n\n for (i = 0; i < quantilesArray.length; i++) {\n p = quantilesArray[i];\n m = alphap + p * (1 - alphap - betap);\n aleph = n * p + m;\n k = Math.floor(clip(aleph, 1, n - 1));\n gamma = clip(aleph - k, 0, 1);\n quantileVals[i] = (1 - gamma) * sortedArray[k - 1] + gamma * sortedArray[k];\n }\n\n return quantileVals;\n};\n\n// Return the k-th percentile of values in a range, where k is in the range 0..1, inclusive.\n// Passing true for the exclusive parameter excludes both endpoints of the range.\njStat.percentile = function percentile(arr, k, exclusive) {\n var _arr = arr.slice().sort(ascNum);\n var realIndex = k * (_arr.length + (exclusive ? 1 : -1)) + (exclusive ? 0 : 1);\n var index = parseInt(realIndex);\n var frac = realIndex - index;\n if (index + 1 < _arr.length) {\n return _arr[index - 1] + frac * (_arr[index] - _arr[index - 1]);\n } else {\n return _arr[index - 1];\n }\n}\n\n// The percentile rank of score in a given array. Returns the percentage\n// of all values in the input array that are less than (kind='strict') or\n// less or equal than (kind='weak') score. Default is weak.\njStat.percentileOfScore = function percentileOfScore(arr, score, kind) {\n var counter = 0;\n var len = arr.length;\n var strict = false;\n var value, i;\n\n if (kind === 'strict')\n strict = true;\n\n for (i = 0; i < len; i++) {\n value = arr[i];\n if ((strict && value < score) ||\n (!strict && value <= score)) {\n counter++;\n }\n }\n\n return counter / len;\n};\n\n\n// Histogram (bin count) data\njStat.histogram = function histogram(arr, binCnt) {\n binCnt = binCnt || 4;\n var first = jStat.min(arr);\n var binWidth = (jStat.max(arr) - first) / binCnt;\n var len = arr.length;\n var bins = [];\n var i;\n\n for (i = 0; i < binCnt; i++)\n bins[i] = 0;\n for (i = 0; i < len; i++)\n bins[Math.min(Math.floor(((arr[i] - first) / binWidth)), binCnt - 1)] += 1;\n\n return bins;\n};\n\n\n// covariance of two arrays\njStat.covariance = function covariance(arr1, arr2) {\n var u = jStat.mean(arr1);\n var v = jStat.mean(arr2);\n var arr1Len = arr1.length;\n var sq_dev = new Array(arr1Len);\n var i;\n\n for (i = 0; i < arr1Len; i++)\n sq_dev[i] = (arr1[i] - u) * (arr2[i] - v);\n\n return jStat.sum(sq_dev) / (arr1Len - 1);\n};\n\n\n// (pearson's) population correlation coefficient, rho\njStat.corrcoeff = function corrcoeff(arr1, arr2) {\n return jStat.covariance(arr1, arr2) /\n jStat.stdev(arr1, 1) /\n jStat.stdev(arr2, 1);\n};\n\n // (spearman's) rank correlation coefficient, sp\njStat.spearmancoeff = function (arr1, arr2) {\n arr1 = jStat.rank(arr1);\n arr2 = jStat.rank(arr2);\n //return pearson's correlation of the ranks:\n return jStat.corrcoeff(arr1, arr2);\n}\n\n\n// statistical standardized moments (general form of skew/kurt)\njStat.stanMoment = function stanMoment(arr, n) {\n var mu = jStat.mean(arr);\n var sigma = jStat.stdev(arr);\n var len = arr.length;\n var skewSum = 0;\n\n for (var i = 0; i < len; i++)\n skewSum += Math.pow((arr[i] - mu) / sigma, n);\n\n return skewSum / arr.length;\n};\n\n// (pearson's) moment coefficient of skewness\njStat.skewness = function skewness(arr) {\n return jStat.stanMoment(arr, 3);\n};\n\n// (pearson's) (excess) kurtosis\njStat.kurtosis = function kurtosis(arr) {\n return jStat.stanMoment(arr, 4) - 3;\n};\n\n\nvar jProto = jStat.prototype;\n\n\n// Extend jProto with method for calculating cumulative sums and products.\n// This differs from the similar extension below as cumsum and cumprod should\n// not be run again in the case fullbool === true.\n// If a matrix is passed, automatically assume operation should be done on the\n// columns.\n(function(funcs) {\n for (var i = 0; i < funcs.length; i++) (function(passfunc) {\n // If a matrix is passed, automatically assume operation should be done on\n // the columns.\n jProto[passfunc] = function(fullbool, func) {\n var arr = [];\n var i = 0;\n var tmpthis = this;\n // Assignment reassignation depending on how parameters were passed in.\n if (isFunction(fullbool)) {\n func = fullbool;\n fullbool = false;\n }\n // Check if a callback was passed with the function.\n if (func) {\n setTimeout(function() {\n func.call(tmpthis, jProto[passfunc].call(tmpthis, fullbool));\n });\n return this;\n }\n // Check if matrix and run calculations.\n if (this.length > 1) {\n tmpthis = fullbool === true ? this : this.transpose();\n for (; i < tmpthis.length; i++)\n arr[i] = jStat[passfunc](tmpthis[i]);\n return arr;\n }\n // Pass fullbool if only vector, not a matrix. for variance and stdev.\n return jStat[passfunc](this[0], fullbool);\n };\n })(funcs[i]);\n})(('cumsum cumprod').split(' '));\n\n\n// Extend jProto with methods which don't require arguments and work on columns.\n(function(funcs) {\n for (var i = 0; i < funcs.length; i++) (function(passfunc) {\n // If a matrix is passed, automatically assume operation should be done on\n // the columns.\n jProto[passfunc] = function(fullbool, func) {\n var arr = [];\n var i = 0;\n var tmpthis = this;\n // Assignment reassignation depending on how parameters were passed in.\n if (isFunction(fullbool)) {\n func = fullbool;\n fullbool = false;\n }\n // Check if a callback was passed with the function.\n if (func) {\n setTimeout(function() {\n func.call(tmpthis, jProto[passfunc].call(tmpthis, fullbool));\n });\n return this;\n }\n // Check if matrix and run calculations.\n if (this.length > 1) {\n if (passfunc !== 'sumrow')\n tmpthis = fullbool === true ? this : this.transpose();\n for (; i < tmpthis.length; i++)\n arr[i] = jStat[passfunc](tmpthis[i]);\n return fullbool === true\n ? jStat[passfunc](jStat.utils.toVector(arr))\n : arr;\n }\n // Pass fullbool if only vector, not a matrix. for variance and stdev.\n return jStat[passfunc](this[0], fullbool);\n };\n })(funcs[i]);\n})(('sum sumsqrd sumsqerr sumrow product min max unique mean meansqerr ' +\n 'geomean median diff rank mode range variance deviation stdev meandev ' +\n 'meddev coeffvar quartiles histogram skewness kurtosis').split(' '));\n\n\n// Extend jProto with functions that take arguments. Operations on matrices are\n// done on columns.\n(function(funcs) {\n for (var i = 0; i < funcs.length; i++) (function(passfunc) {\n jProto[passfunc] = function() {\n var arr = [];\n var i = 0;\n var tmpthis = this;\n var args = Array.prototype.slice.call(arguments);\n var callbackFunction;\n\n // If the last argument is a function, we assume it's a callback; we\n // strip the callback out and call the function again.\n if (isFunction(args[args.length - 1])) {\n callbackFunction = args[args.length - 1];\n var argsToPass = args.slice(0, args.length - 1);\n\n setTimeout(function() {\n callbackFunction.call(tmpthis,\n jProto[passfunc].apply(tmpthis, argsToPass));\n });\n return this;\n\n // Otherwise we curry the function args and call normally.\n } else {\n callbackFunction = undefined;\n var curriedFunction = function curriedFunction(vector) {\n return jStat[passfunc].apply(tmpthis, [vector].concat(args));\n }\n }\n\n // If this is a matrix, run column-by-column.\n if (this.length > 1) {\n tmpthis = tmpthis.transpose();\n for (; i < tmpthis.length; i++)\n arr[i] = curriedFunction(tmpthis[i]);\n return arr;\n }\n\n // Otherwise run on the vector.\n return curriedFunction(this[0]);\n };\n })(funcs[i]);\n})('quantiles percentileOfScore'.split(' '));\n\n}(jStat, Math));\n// Special functions //\n(function(jStat, Math) {\n\n// Log-gamma function\njStat.gammaln = function gammaln(x) {\n var j = 0;\n var cof = [\n 76.18009172947146, -86.50532032941677, 24.01409824083091,\n -1.231739572450155, 0.1208650973866179e-2, -0.5395239384953e-5\n ];\n var ser = 1.000000000190015;\n var xx, y, tmp;\n tmp = (y = xx = x) + 5.5;\n tmp -= (xx + 0.5) * Math.log(tmp);\n for (; j < 6; j++)\n ser += cof[j] / ++y;\n return Math.log(2.5066282746310005 * ser / xx) - tmp;\n};\n\n/*\n * log-gamma function to support poisson distribution sampling. The\n * algorithm comes from SPECFUN by Shanjie Zhang and Jianming Jin and their\n * book \"Computation of Special Functions\", 1996, John Wiley & Sons, Inc.\n */\njStat.loggam = function loggam(x) {\n var x0, x2, xp, gl, gl0;\n var k, n;\n\n var a = [8.333333333333333e-02, -2.777777777777778e-03,\n 7.936507936507937e-04, -5.952380952380952e-04,\n 8.417508417508418e-04, -1.917526917526918e-03,\n 6.410256410256410e-03, -2.955065359477124e-02,\n 1.796443723688307e-01, -1.39243221690590e+00];\n x0 = x;\n n = 0;\n if ((x == 1.0) || (x == 2.0)) {\n return 0.0;\n }\n if (x <= 7.0) {\n n = Math.floor(7 - x);\n x0 = x + n;\n }\n x2 = 1.0 / (x0 * x0);\n xp = 2 * Math.PI;\n gl0 = a[9];\n for (k = 8; k >= 0; k--) {\n gl0 *= x2;\n gl0 += a[k];\n }\n gl = gl0 / x0 + 0.5 * Math.log(xp) + (x0 - 0.5) * Math.log(x0) - x0;\n if (x <= 7.0) {\n for (k = 1; k <= n; k++) {\n gl -= Math.log(x0 - 1.0);\n x0 -= 1.0;\n }\n }\n return gl;\n}\n\n// gamma of x\njStat.gammafn = function gammafn(x) {\n var p = [-1.716185138865495, 24.76565080557592, -379.80425647094563,\n 629.3311553128184, 866.9662027904133, -31451.272968848367,\n -36144.413418691176, 66456.14382024054\n ];\n var q = [-30.8402300119739, 315.35062697960416, -1015.1563674902192,\n -3107.771671572311, 22538.118420980151, 4755.8462775278811,\n -134659.9598649693, -115132.2596755535];\n var fact = false;\n var n = 0;\n var xden = 0;\n var xnum = 0;\n var y = x;\n var i, z, yi, res;\n if (x > 171.6243769536076) {\n return Infinity;\n }\n if (y <= 0) {\n res = y % 1 + 3.6e-16;\n if (res) {\n fact = (!(y & 1) ? 1 : -1) * Math.PI / Math.sin(Math.PI * res);\n y = 1 - y;\n } else {\n return Infinity;\n }\n }\n yi = y;\n if (y < 1) {\n z = y++;\n } else {\n z = (y -= n = (y | 0) - 1) - 1;\n }\n for (i = 0; i < 8; ++i) {\n xnum = (xnum + p[i]) * z;\n xden = xden * z + q[i];\n }\n res = xnum / xden + 1;\n if (yi < y) {\n res /= yi;\n } else if (yi > y) {\n for (i = 0; i < n; ++i) {\n res *= y;\n y++;\n }\n }\n if (fact) {\n res = fact / res;\n }\n return res;\n};\n\n\n// lower incomplete gamma function, which is usually typeset with a\n// lower-case greek gamma as the function symbol\njStat.gammap = function gammap(a, x) {\n return jStat.lowRegGamma(a, x) * jStat.gammafn(a);\n};\n\n\n// The lower regularized incomplete gamma function, usually written P(a,x)\njStat.lowRegGamma = function lowRegGamma(a, x) {\n var aln = jStat.gammaln(a);\n var ap = a;\n var sum = 1 / a;\n var del = sum;\n var b = x + 1 - a;\n var c = 1 / 1.0e-30;\n var d = 1 / b;\n var h = d;\n var i = 1;\n // calculate maximum number of itterations required for a\n var ITMAX = -~(Math.log((a >= 1) ? a : 1 / a) * 8.5 + a * 0.4 + 17);\n var an;\n\n if (x < 0 || a <= 0) {\n return NaN;\n } else if (x < a + 1) {\n for (; i <= ITMAX; i++) {\n sum += del *= x / ++ap;\n }\n return (sum * Math.exp(-x + a * Math.log(x) - (aln)));\n }\n\n for (; i <= ITMAX; i++) {\n an = -i * (i - a);\n b += 2;\n d = an * d + b;\n c = b + an / c;\n d = 1 / d;\n h *= d * c;\n }\n\n return (1 - h * Math.exp(-x + a * Math.log(x) - (aln)));\n};\n\n// natural log factorial of n\njStat.factorialln = function factorialln(n) {\n return n < 0 ? NaN : jStat.gammaln(n + 1);\n};\n\n// factorial of n\njStat.factorial = function factorial(n) {\n return n < 0 ? NaN : jStat.gammafn(n + 1);\n};\n\n// combinations of n, m\njStat.combination = function combination(n, m) {\n // make sure n or m don't exceed the upper limit of usable values\n return (n > 170 || m > 170)\n ? Math.exp(jStat.combinationln(n, m))\n : (jStat.factorial(n) / jStat.factorial(m)) / jStat.factorial(n - m);\n};\n\n\njStat.combinationln = function combinationln(n, m){\n return jStat.factorialln(n) - jStat.factorialln(m) - jStat.factorialln(n - m);\n};\n\n\n// permutations of n, m\njStat.permutation = function permutation(n, m) {\n return jStat.factorial(n) / jStat.factorial(n - m);\n};\n\n\n// beta function\njStat.betafn = function betafn(x, y) {\n // ensure arguments are positive\n if (x <= 0 || y <= 0)\n return undefined;\n // make sure x + y doesn't exceed the upper limit of usable values\n return (x + y > 170)\n ? Math.exp(jStat.betaln(x, y))\n : jStat.gammafn(x) * jStat.gammafn(y) / jStat.gammafn(x + y);\n};\n\n\n// natural logarithm of beta function\njStat.betaln = function betaln(x, y) {\n return jStat.gammaln(x) + jStat.gammaln(y) - jStat.gammaln(x + y);\n};\n\n\n// Evaluates the continued fraction for incomplete beta function by modified\n// Lentz's method.\njStat.betacf = function betacf(x, a, b) {\n var fpmin = 1e-30;\n var m = 1;\n var qab = a + b;\n var qap = a + 1;\n var qam = a - 1;\n var c = 1;\n var d = 1 - qab * x / qap;\n var m2, aa, del, h;\n\n // These q's will be used in factors that occur in the coefficients\n if (Math.abs(d) < fpmin)\n d = fpmin;\n d = 1 / d;\n h = d;\n\n for (; m <= 100; m++) {\n m2 = 2 * m;\n aa = m * (b - m) * x / ((qam + m2) * (a + m2));\n // One step (the even one) of the recurrence\n d = 1 + aa * d;\n if (Math.abs(d) < fpmin)\n d = fpmin;\n c = 1 + aa / c;\n if (Math.abs(c) < fpmin)\n c = fpmin;\n d = 1 / d;\n h *= d * c;\n aa = -(a + m) * (qab + m) * x / ((a + m2) * (qap + m2));\n // Next step of the recurrence (the odd one)\n d = 1 + aa * d;\n if (Math.abs(d) < fpmin)\n d = fpmin;\n c = 1 + aa / c;\n if (Math.abs(c) < fpmin)\n c = fpmin;\n d = 1 / d;\n del = d * c;\n h *= del;\n if (Math.abs(del - 1.0) < 3e-7)\n break;\n }\n\n return h;\n};\n\n\n// Returns the inverse of the lower regularized inomplete gamma function\njStat.gammapinv = function gammapinv(p, a) {\n var j = 0;\n var a1 = a - 1;\n var EPS = 1e-8;\n var gln = jStat.gammaln(a);\n var x, err, t, u, pp, lna1, afac;\n\n if (p >= 1)\n return Math.max(100, a + 100 * Math.sqrt(a));\n if (p <= 0)\n return 0;\n if (a > 1) {\n lna1 = Math.log(a1);\n afac = Math.exp(a1 * (lna1 - 1) - gln);\n pp = (p < 0.5) ? p : 1 - p;\n t = Math.sqrt(-2 * Math.log(pp));\n x = (2.30753 + t * 0.27061) / (1 + t * (0.99229 + t * 0.04481)) - t;\n if (p < 0.5)\n x = -x;\n x = Math.max(1e-3,\n a * Math.pow(1 - 1 / (9 * a) - x / (3 * Math.sqrt(a)), 3));\n } else {\n t = 1 - a * (0.253 + a * 0.12);\n if (p < t)\n x = Math.pow(p / t, 1 / a);\n else\n x = 1 - Math.log(1 - (p - t) / (1 - t));\n }\n\n for(; j < 12; j++) {\n if (x <= 0)\n return 0;\n err = jStat.lowRegGamma(a, x) - p;\n if (a > 1)\n t = afac * Math.exp(-(x - a1) + a1 * (Math.log(x) - lna1));\n else\n t = Math.exp(-x + a1 * Math.log(x) - gln);\n u = err / t;\n x -= (t = u / (1 - 0.5 * Math.min(1, u * ((a - 1) / x - 1))));\n if (x <= 0)\n x = 0.5 * (x + t);\n if (Math.abs(t) < EPS * x)\n break;\n }\n\n return x;\n};\n\n\n// Returns the error function erf(x)\njStat.erf = function erf(x) {\n var cof = [-1.3026537197817094, 6.4196979235649026e-1, 1.9476473204185836e-2,\n -9.561514786808631e-3, -9.46595344482036e-4, 3.66839497852761e-4,\n 4.2523324806907e-5, -2.0278578112534e-5, -1.624290004647e-6,\n 1.303655835580e-6, 1.5626441722e-8, -8.5238095915e-8,\n 6.529054439e-9, 5.059343495e-9, -9.91364156e-10,\n -2.27365122e-10, 9.6467911e-11, 2.394038e-12,\n -6.886027e-12, 8.94487e-13, 3.13092e-13,\n -1.12708e-13, 3.81e-16, 7.106e-15,\n -1.523e-15, -9.4e-17, 1.21e-16,\n -2.8e-17];\n var j = cof.length - 1;\n var isneg = false;\n var d = 0;\n var dd = 0;\n var t, ty, tmp, res;\n\n if (x < 0) {\n x = -x;\n isneg = true;\n }\n\n t = 2 / (2 + x);\n ty = 4 * t - 2;\n\n for(; j > 0; j--) {\n tmp = d;\n d = ty * d - dd + cof[j];\n dd = tmp;\n }\n\n res = t * Math.exp(-x * x + 0.5 * (cof[0] + ty * d) - dd);\n return isneg ? res - 1 : 1 - res;\n};\n\n\n// Returns the complmentary error function erfc(x)\njStat.erfc = function erfc(x) {\n return 1 - jStat.erf(x);\n};\n\n\n// Returns the inverse of the complementary error function\njStat.erfcinv = function erfcinv(p) {\n var j = 0;\n var x, err, t, pp;\n if (p >= 2)\n return -100;\n if (p <= 0)\n return 100;\n pp = (p < 1) ? p : 2 - p;\n t = Math.sqrt(-2 * Math.log(pp / 2));\n x = -0.70711 * ((2.30753 + t * 0.27061) /\n (1 + t * (0.99229 + t * 0.04481)) - t);\n for (; j < 2; j++) {\n err = jStat.erfc(x) - pp;\n x += err / (1.12837916709551257 * Math.exp(-x * x) - x * err);\n }\n return (p < 1) ? x : -x;\n};\n\n\n// Returns the inverse of the incomplete beta function\njStat.ibetainv = function ibetainv(p, a, b) {\n var EPS = 1e-8;\n var a1 = a - 1;\n var b1 = b - 1;\n var j = 0;\n var lna, lnb, pp, t, u, err, x, al, h, w, afac;\n if (p <= 0)\n return 0;\n if (p >= 1)\n return 1;\n if (a >= 1 && b >= 1) {\n pp = (p < 0.5) ? p : 1 - p;\n t = Math.sqrt(-2 * Math.log(pp));\n x = (2.30753 + t * 0.27061) / (1 + t* (0.99229 + t * 0.04481)) - t;\n if (p < 0.5)\n x = -x;\n al = (x * x - 3) / 6;\n h = 2 / (1 / (2 * a - 1) + 1 / (2 * b - 1));\n w = (x * Math.sqrt(al + h) / h) - (1 / (2 * b - 1) - 1 / (2 * a - 1)) *\n (al + 5 / 6 - 2 / (3 * h));\n x = a / (a + b * Math.exp(2 * w));\n } else {\n lna = Math.log(a / (a + b));\n lnb = Math.log(b / (a + b));\n t = Math.exp(a * lna) / a;\n u = Math.exp(b * lnb) / b;\n w = t + u;\n if (p < t / w)\n x = Math.pow(a * w * p, 1 / a);\n else\n x = 1 - Math.pow(b * w * (1 - p), 1 / b);\n }\n afac = -jStat.gammaln(a) - jStat.gammaln(b) + jStat.gammaln(a + b);\n for(; j < 10; j++) {\n if (x === 0 || x === 1)\n return x;\n err = jStat.ibeta(x, a, b) - p;\n t = Math.exp(a1 * Math.log(x) + b1 * Math.log(1 - x) + afac);\n u = err / t;\n x -= (t = u / (1 - 0.5 * Math.min(1, u * (a1 / x - b1 / (1 - x)))));\n if (x <= 0)\n x = 0.5 * (x + t);\n if (x >= 1)\n x = 0.5 * (x + t + 1);\n if (Math.abs(t) < EPS * x && j > 0)\n break;\n }\n return x;\n};\n\n\n// Returns the incomplete beta function I_x(a,b)\njStat.ibeta = function ibeta(x, a, b) {\n // Factors in front of the continued fraction.\n var bt = (x === 0 || x === 1) ? 0 :\n Math.exp(jStat.gammaln(a + b) - jStat.gammaln(a) -\n jStat.gammaln(b) + a * Math.log(x) + b *\n Math.log(1 - x));\n if (x < 0 || x > 1)\n return false;\n if (x < (a + 1) / (a + b + 2))\n // Use continued fraction directly.\n return bt * jStat.betacf(x, a, b) / a;\n // else use continued fraction after making the symmetry transformation.\n return 1 - bt * jStat.betacf(1 - x, b, a) / b;\n};\n\n\n// Returns a normal deviate (mu=0, sigma=1).\n// If n and m are specified it returns a object of normal deviates.\njStat.randn = function randn(n, m) {\n var u, v, x, y, q;\n if (!m)\n m = n;\n if (n)\n return jStat.create(n, m, function() { return jStat.randn(); });\n do {\n u = jStat._random_fn();\n v = 1.7156 * (jStat._random_fn() - 0.5);\n x = u - 0.449871;\n y = Math.abs(v) + 0.386595;\n q = x * x + y * (0.19600 * y - 0.25472 * x);\n } while (q > 0.27597 && (q > 0.27846 || v * v > -4 * Math.log(u) * u * u));\n return v / u;\n};\n\n\n// Returns a gamma deviate by the method of Marsaglia and Tsang.\njStat.randg = function randg(shape, n, m) {\n var oalph = shape;\n var a1, a2, u, v, x, mat;\n if (!m)\n m = n;\n if (!shape)\n shape = 1;\n if (n) {\n mat = jStat.zeros(n,m);\n mat.alter(function() { return jStat.randg(shape); });\n return mat;\n }\n if (shape < 1)\n shape += 1;\n a1 = shape - 1 / 3;\n a2 = 1 / Math.sqrt(9 * a1);\n do {\n do {\n x = jStat.randn();\n v = 1 + a2 * x;\n } while(v <= 0);\n v = v * v * v;\n u = jStat._random_fn();\n } while(u > 1 - 0.331 * Math.pow(x, 4) &&\n Math.log(u) > 0.5 * x*x + a1 * (1 - v + Math.log(v)));\n // alpha > 1\n if (shape == oalph)\n return a1 * v;\n // alpha < 1\n do {\n u = jStat._random_fn();\n } while(u === 0);\n return Math.pow(u, 1 / oalph) * a1 * v;\n};\n\n\n// making use of static methods on the instance\n(function(funcs) {\n for (var i = 0; i < funcs.length; i++) (function(passfunc) {\n jStat.fn[passfunc] = function() {\n return jStat(\n jStat.map(this, function(value) { return jStat[passfunc](value); }));\n }\n })(funcs[i]);\n})('gammaln gammafn factorial factorialln'.split(' '));\n\n\n(function(funcs) {\n for (var i = 0; i < funcs.length; i++) (function(passfunc) {\n jStat.fn[passfunc] = function() {\n return jStat(jStat[passfunc].apply(null, arguments));\n };\n })(funcs[i]);\n})('randn'.split(' '));\n\n}(jStat, Math));\n(function(jStat, Math) {\n\n// generate all distribution instance methods\n(function(list) {\n for (var i = 0; i < list.length; i++) (function(func) {\n // distribution instance method\n jStat[func] = function f(a, b, c) {\n if (!(this instanceof f))\n return new f(a, b, c);\n this._a = a;\n this._b = b;\n this._c = c;\n return this;\n };\n // distribution method to be used on a jStat instance\n jStat.fn[func] = function(a, b, c) {\n var newthis = jStat[func](a, b, c);\n newthis.data = this;\n return newthis;\n };\n // sample instance method\n jStat[func].prototype.sample = function(arr) {\n var a = this._a;\n var b = this._b;\n var c = this._c;\n if (arr)\n return jStat.alter(arr, function() {\n return jStat[func].sample(a, b, c);\n });\n else\n return jStat[func].sample(a, b, c);\n };\n // generate the pdf, cdf and inv instance methods\n (function(vals) {\n for (var i = 0; i < vals.length; i++) (function(fnfunc) {\n jStat[func].prototype[fnfunc] = function(x) {\n var a = this._a;\n var b = this._b;\n var c = this._c;\n if (!x && x !== 0)\n x = this.data;\n if (typeof x !== 'number') {\n return jStat.fn.map.call(x, function(x) {\n return jStat[func][fnfunc](x, a, b, c);\n });\n }\n return jStat[func][fnfunc](x, a, b, c);\n };\n })(vals[i]);\n })('pdf cdf inv'.split(' '));\n // generate the mean, median, mode and variance instance methods\n (function(vals) {\n for (var i = 0; i < vals.length; i++) (function(fnfunc) {\n jStat[func].prototype[fnfunc] = function() {\n return jStat[func][fnfunc](this._a, this._b, this._c);\n };\n })(vals[i]);\n })('mean median mode variance'.split(' '));\n })(list[i]);\n})((\n 'beta centralF cauchy chisquare exponential gamma invgamma kumaraswamy ' +\n 'laplace lognormal noncentralt normal pareto studentt weibull uniform ' +\n 'binomial negbin hypgeom poisson triangular tukey arcsine'\n).split(' '));\n\n\n\n// extend beta function with static methods\njStat.extend(jStat.beta, {\n pdf: function pdf(x, alpha, beta) {\n // PDF is zero outside the support\n if (x > 1 || x < 0)\n return 0;\n // PDF is one for the uniform case\n if (alpha == 1 && beta == 1)\n return 1;\n\n if (alpha < 512 && beta < 512) {\n return (Math.pow(x, alpha - 1) * Math.pow(1 - x, beta - 1)) /\n jStat.betafn(alpha, beta);\n } else {\n return Math.exp((alpha - 1) * Math.log(x) +\n (beta - 1) * Math.log(1 - x) -\n jStat.betaln(alpha, beta));\n }\n },\n\n cdf: function cdf(x, alpha, beta) {\n return (x > 1 || x < 0) ? (x > 1) * 1 : jStat.ibeta(x, alpha, beta);\n },\n\n inv: function inv(x, alpha, beta) {\n return jStat.ibetainv(x, alpha, beta);\n },\n\n mean: function mean(alpha, beta) {\n return alpha / (alpha + beta);\n },\n\n median: function median(alpha, beta) {\n return jStat.ibetainv(0.5, alpha, beta);\n },\n\n mode: function mode(alpha, beta) {\n return (alpha - 1 ) / ( alpha + beta - 2);\n },\n\n // return a random sample\n sample: function sample(alpha, beta) {\n var u = jStat.randg(alpha);\n return u / (u + jStat.randg(beta));\n },\n\n variance: function variance(alpha, beta) {\n return (alpha * beta) / (Math.pow(alpha + beta, 2) * (alpha + beta + 1));\n }\n});\n\n// extend F function with static methods\njStat.extend(jStat.centralF, {\n // This implementation of the pdf function avoids float overflow\n // See the way that R calculates this value:\n // https://svn.r-project.org/R/trunk/src/nmath/df.c\n pdf: function pdf(x, df1, df2) {\n var p, q, f;\n\n if (x < 0)\n return 0;\n\n if (df1 <= 2) {\n if (x === 0 && df1 < 2) {\n return Infinity;\n }\n if (x === 0 && df1 === 2) {\n return 1;\n }\n return (1 / jStat.betafn(df1 / 2, df2 / 2)) *\n Math.pow(df1 / df2, df1 / 2) *\n Math.pow(x, (df1/2) - 1) *\n Math.pow((1 + (df1 / df2) * x), -(df1 + df2) / 2);\n }\n\n p = (df1 * x) / (df2 + x * df1);\n q = df2 / (df2 + x * df1);\n f = df1 * q / 2.0;\n return f * jStat.binomial.pdf((df1 - 2) / 2, (df1 + df2 - 2) / 2, p);\n },\n\n cdf: function cdf(x, df1, df2) {\n if (x < 0)\n return 0;\n return jStat.ibeta((df1 * x) / (df1 * x + df2), df1 / 2, df2 / 2);\n },\n\n inv: function inv(x, df1, df2) {\n return df2 / (df1 * (1 / jStat.ibetainv(x, df1 / 2, df2 / 2) - 1));\n },\n\n mean: function mean(df1, df2) {\n return (df2 > 2) ? df2 / (df2 - 2) : undefined;\n },\n\n mode: function mode(df1, df2) {\n return (df1 > 2) ? (df2 * (df1 - 2)) / (df1 * (df2 + 2)) : undefined;\n },\n\n // return a random sample\n sample: function sample(df1, df2) {\n var x1 = jStat.randg(df1 / 2) * 2;\n var x2 = jStat.randg(df2 / 2) * 2;\n return (x1 / df1) / (x2 / df2);\n },\n\n variance: function variance(df1, df2) {\n if (df2 <= 4)\n return undefined;\n return 2 * df2 * df2 * (df1 + df2 - 2) /\n (df1 * (df2 - 2) * (df2 - 2) * (df2 - 4));\n }\n});\n\n\n// extend cauchy function with static methods\njStat.extend(jStat.cauchy, {\n pdf: function pdf(x, local, scale) {\n if (scale < 0) { return 0; }\n\n return (scale / (Math.pow(x - local, 2) + Math.pow(scale, 2))) / Math.PI;\n },\n\n cdf: function cdf(x, local, scale) {\n return Math.atan((x - local) / scale) / Math.PI + 0.5;\n },\n\n inv: function(p, local, scale) {\n return local + scale * Math.tan(Math.PI * (p - 0.5));\n },\n\n median: function median(local/*, scale*/) {\n return local;\n },\n\n mode: function mode(local/*, scale*/) {\n return local;\n },\n\n sample: function sample(local, scale) {\n return jStat.randn() *\n Math.sqrt(1 / (2 * jStat.randg(0.5))) * scale + local;\n }\n});\n\n\n\n// extend chisquare function with static methods\njStat.extend(jStat.chisquare, {\n pdf: function pdf(x, dof) {\n if (x < 0)\n return 0;\n return (x === 0 && dof === 2) ? 0.5 :\n Math.exp((dof / 2 - 1) * Math.log(x) - x / 2 - (dof / 2) *\n Math.log(2) - jStat.gammaln(dof / 2));\n },\n\n cdf: function cdf(x, dof) {\n if (x < 0)\n return 0;\n return jStat.lowRegGamma(dof / 2, x / 2);\n },\n\n inv: function(p, dof) {\n return 2 * jStat.gammapinv(p, 0.5 * dof);\n },\n\n mean : function(dof) {\n return dof;\n },\n\n // TODO: this is an approximation (is there a better way?)\n median: function median(dof) {\n return dof * Math.pow(1 - (2 / (9 * dof)), 3);\n },\n\n mode: function mode(dof) {\n return (dof - 2 > 0) ? dof - 2 : 0;\n },\n\n sample: function sample(dof) {\n return jStat.randg(dof / 2) * 2;\n },\n\n variance: function variance(dof) {\n return 2 * dof;\n }\n});\n\n\n\n// extend exponential function with static methods\njStat.extend(jStat.exponential, {\n pdf: function pdf(x, rate) {\n return x < 0 ? 0 : rate * Math.exp(-rate * x);\n },\n\n cdf: function cdf(x, rate) {\n return x < 0 ? 0 : 1 - Math.exp(-rate * x);\n },\n\n inv: function(p, rate) {\n return -Math.log(1 - p) / rate;\n },\n\n mean : function(rate) {\n return 1 / rate;\n },\n\n median: function (rate) {\n return (1 / rate) * Math.log(2);\n },\n\n mode: function mode(/*rate*/) {\n return 0;\n },\n\n sample: function sample(rate) {\n return -1 / rate * Math.log(jStat._random_fn());\n },\n\n variance : function(rate) {\n return Math.pow(rate, -2);\n }\n});\n\n\n\n// extend gamma function with static methods\njStat.extend(jStat.gamma, {\n pdf: function pdf(x, shape, scale) {\n if (x < 0)\n return 0;\n return (x === 0 && shape === 1) ? 1 / scale :\n Math.exp((shape - 1) * Math.log(x) - x / scale -\n jStat.gammaln(shape) - shape * Math.log(scale));\n },\n\n cdf: function cdf(x, shape, scale) {\n if (x < 0)\n return 0;\n return jStat.lowRegGamma(shape, x / scale);\n },\n\n inv: function(p, shape, scale) {\n return jStat.gammapinv(p, shape) * scale;\n },\n\n mean : function(shape, scale) {\n return shape * scale;\n },\n\n mode: function mode(shape, scale) {\n if(shape > 1) return (shape - 1) * scale;\n return undefined;\n },\n\n sample: function sample(shape, scale) {\n return jStat.randg(shape) * scale;\n },\n\n variance: function variance(shape, scale) {\n return shape * scale * scale;\n }\n});\n\n// extend inverse gamma function with static methods\njStat.extend(jStat.invgamma, {\n pdf: function pdf(x, shape, scale) {\n if (x <= 0)\n return 0;\n return Math.exp(-(shape + 1) * Math.log(x) - scale / x -\n jStat.gammaln(shape) + shape * Math.log(scale));\n },\n\n cdf: function cdf(x, shape, scale) {\n if (x <= 0)\n return 0;\n return 1 - jStat.lowRegGamma(shape, scale / x);\n },\n\n inv: function(p, shape, scale) {\n return scale / jStat.gammapinv(1 - p, shape);\n },\n\n mean : function(shape, scale) {\n return (shape > 1) ? scale / (shape - 1) : undefined;\n },\n\n mode: function mode(shape, scale) {\n return scale / (shape + 1);\n },\n\n sample: function sample(shape, scale) {\n return scale / jStat.randg(shape);\n },\n\n variance: function variance(shape, scale) {\n if (shape <= 2)\n return undefined;\n return scale * scale / ((shape - 1) * (shape - 1) * (shape - 2));\n }\n});\n\n\n// extend kumaraswamy function with static methods\njStat.extend(jStat.kumaraswamy, {\n pdf: function pdf(x, alpha, beta) {\n if (x === 0 && alpha === 1)\n return beta;\n else if (x === 1 && beta === 1)\n return alpha;\n return Math.exp(Math.log(alpha) + Math.log(beta) + (alpha - 1) *\n Math.log(x) + (beta - 1) *\n Math.log(1 - Math.pow(x, alpha)));\n },\n\n cdf: function cdf(x, alpha, beta) {\n if (x < 0)\n return 0;\n else if (x > 1)\n return 1;\n return (1 - Math.pow(1 - Math.pow(x, alpha), beta));\n },\n\n inv: function inv(p, alpha, beta) {\n return Math.pow(1 - Math.pow(1 - p, 1 / beta), 1 / alpha);\n },\n\n mean : function(alpha, beta) {\n return (beta * jStat.gammafn(1 + 1 / alpha) *\n jStat.gammafn(beta)) / (jStat.gammafn(1 + 1 / alpha + beta));\n },\n\n median: function median(alpha, beta) {\n return Math.pow(1 - Math.pow(2, -1 / beta), 1 / alpha);\n },\n\n mode: function mode(alpha, beta) {\n if (!(alpha >= 1 && beta >= 1 && (alpha !== 1 && beta !== 1)))\n return undefined;\n return Math.pow((alpha - 1) / (alpha * beta - 1), 1 / alpha);\n },\n\n variance: function variance(/*alpha, beta*/) {\n throw new Error('variance not yet implemented');\n // TODO: complete this\n }\n});\n\n\n\n// extend lognormal function with static methods\njStat.extend(jStat.lognormal, {\n pdf: function pdf(x, mu, sigma) {\n if (x <= 0)\n return 0;\n return Math.exp(-Math.log(x) - 0.5 * Math.log(2 * Math.PI) -\n Math.log(sigma) - Math.pow(Math.log(x) - mu, 2) /\n (2 * sigma * sigma));\n },\n\n cdf: function cdf(x, mu, sigma) {\n if (x < 0)\n return 0;\n return 0.5 +\n (0.5 * jStat.erf((Math.log(x) - mu) / Math.sqrt(2 * sigma * sigma)));\n },\n\n inv: function(p, mu, sigma) {\n return Math.exp(-1.41421356237309505 * sigma * jStat.erfcinv(2 * p) + mu);\n },\n\n mean: function mean(mu, sigma) {\n return Math.exp(mu + sigma * sigma / 2);\n },\n\n median: function median(mu/*, sigma*/) {\n return Math.exp(mu);\n },\n\n mode: function mode(mu, sigma) {\n return Math.exp(mu - sigma * sigma);\n },\n\n sample: function sample(mu, sigma) {\n return Math.exp(jStat.randn() * sigma + mu);\n },\n\n variance: function variance(mu, sigma) {\n return (Math.exp(sigma * sigma) - 1) * Math.exp(2 * mu + sigma * sigma);\n }\n});\n\n\n\n// extend noncentralt function with static methods\njStat.extend(jStat.noncentralt, {\n pdf: function pdf(x, dof, ncp) {\n var tol = 1e-14;\n if (Math.abs(ncp) < tol) // ncp approx 0; use student-t\n return jStat.studentt.pdf(x, dof)\n\n if (Math.abs(x) < tol) { // different formula for x == 0\n return Math.exp(jStat.gammaln((dof + 1) / 2) - ncp * ncp / 2 -\n 0.5 * Math.log(Math.PI * dof) - jStat.gammaln(dof / 2));\n }\n\n // formula for x != 0\n return dof / x *\n (jStat.noncentralt.cdf(x * Math.sqrt(1 + 2 / dof), dof+2, ncp) -\n jStat.noncentralt.cdf(x, dof, ncp));\n },\n\n cdf: function cdf(x, dof, ncp) {\n var tol = 1e-14;\n var min_iterations = 200;\n\n if (Math.abs(ncp) < tol) // ncp approx 0; use student-t\n return jStat.studentt.cdf(x, dof);\n\n // turn negative x into positive and flip result afterwards\n var flip = false;\n if (x < 0) {\n flip = true;\n ncp = -ncp;\n }\n\n var prob = jStat.normal.cdf(-ncp, 0, 1);\n var value = tol + 1;\n // use value at last two steps to determine convergence\n var lastvalue = value;\n var y = x * x / (x * x + dof);\n var j = 0;\n var p = Math.exp(-ncp * ncp / 2);\n var q = Math.exp(-ncp * ncp / 2 - 0.5 * Math.log(2) -\n jStat.gammaln(3 / 2)) * ncp;\n while (j < min_iterations || lastvalue > tol || value > tol) {\n lastvalue = value;\n if (j > 0) {\n p *= (ncp * ncp) / (2 * j);\n q *= (ncp * ncp) / (2 * (j + 1 / 2));\n }\n value = p * jStat.beta.cdf(y, j + 0.5, dof / 2) +\n q * jStat.beta.cdf(y, j+1, dof/2);\n prob += 0.5 * value;\n j++;\n }\n\n return flip ? (1 - prob) : prob;\n }\n});\n\n\n// extend normal function with static methods\njStat.extend(jStat.normal, {\n pdf: function pdf(x, mean, std) {\n return Math.exp(-0.5 * Math.log(2 * Math.PI) -\n Math.log(std) - Math.pow(x - mean, 2) / (2 * std * std));\n },\n\n cdf: function cdf(x, mean, std) {\n return 0.5 * (1 + jStat.erf((x - mean) / Math.sqrt(2 * std * std)));\n },\n\n inv: function(p, mean, std) {\n return -1.41421356237309505 * std * jStat.erfcinv(2 * p) + mean;\n },\n\n mean : function(mean/*, std*/) {\n return mean;\n },\n\n median: function median(mean/*, std*/) {\n return mean;\n },\n\n mode: function (mean/*, std*/) {\n return mean;\n },\n\n sample: function sample(mean, std) {\n return jStat.randn() * std + mean;\n },\n\n variance : function(mean, std) {\n return std * std;\n }\n});\n\n\n\n// extend pareto function with static methods\njStat.extend(jStat.pareto, {\n pdf: function pdf(x, scale, shape) {\n if (x < scale)\n return 0;\n return (shape * Math.pow(scale, shape)) / Math.pow(x, shape + 1);\n },\n\n cdf: function cdf(x, scale, shape) {\n if (x < scale)\n return 0;\n return 1 - Math.pow(scale / x, shape);\n },\n\n inv: function inv(p, scale, shape) {\n return scale / Math.pow(1 - p, 1 / shape);\n },\n\n mean: function mean(scale, shape) {\n if (shape <= 1)\n return undefined;\n return (shape * Math.pow(scale, shape)) / (shape - 1);\n },\n\n median: function median(scale, shape) {\n return scale * (shape * Math.SQRT2);\n },\n\n mode: function mode(scale/*, shape*/) {\n return scale;\n },\n\n variance : function(scale, shape) {\n if (shape <= 2)\n return undefined;\n return (scale*scale * shape) / (Math.pow(shape - 1, 2) * (shape - 2));\n }\n});\n\n\n\n// extend studentt function with static methods\njStat.extend(jStat.studentt, {\n pdf: function pdf(x, dof) {\n dof = dof > 1e100 ? 1e100 : dof;\n return (1/(Math.sqrt(dof) * jStat.betafn(0.5, dof/2))) *\n Math.pow(1 + ((x * x) / dof), -((dof + 1) / 2));\n },\n\n cdf: function cdf(x, dof) {\n var dof2 = dof / 2;\n return jStat.ibeta((x + Math.sqrt(x * x + dof)) /\n (2 * Math.sqrt(x * x + dof)), dof2, dof2);\n },\n\n inv: function(p, dof) {\n var x = jStat.ibetainv(2 * Math.min(p, 1 - p), 0.5 * dof, 0.5);\n x = Math.sqrt(dof * (1 - x) / x);\n return (p > 0.5) ? x : -x;\n },\n\n mean: function mean(dof) {\n return (dof > 1) ? 0 : undefined;\n },\n\n median: function median(/*dof*/) {\n return 0;\n },\n\n mode: function mode(/*dof*/) {\n return 0;\n },\n\n sample: function sample(dof) {\n return jStat.randn() * Math.sqrt(dof / (2 * jStat.randg(dof / 2)));\n },\n\n variance: function variance(dof) {\n return (dof > 2) ? dof / (dof - 2) : (dof > 1) ? Infinity : undefined;\n }\n});\n\n\n\n// extend weibull function with static methods\njStat.extend(jStat.weibull, {\n pdf: function pdf(x, scale, shape) {\n if (x < 0 || scale < 0 || shape < 0)\n return 0;\n return (shape / scale) * Math.pow((x / scale), (shape - 1)) *\n Math.exp(-(Math.pow((x / scale), shape)));\n },\n\n cdf: function cdf(x, scale, shape) {\n return x < 0 ? 0 : 1 - Math.exp(-Math.pow((x / scale), shape));\n },\n\n inv: function(p, scale, shape) {\n return scale * Math.pow(-Math.log(1 - p), 1 / shape);\n },\n\n mean : function(scale, shape) {\n return scale * jStat.gammafn(1 + 1 / shape);\n },\n\n median: function median(scale, shape) {\n return scale * Math.pow(Math.log(2), 1 / shape);\n },\n\n mode: function mode(scale, shape) {\n if (shape <= 1)\n return 0;\n return scale * Math.pow((shape - 1) / shape, 1 / shape);\n },\n\n sample: function sample(scale, shape) {\n return scale * Math.pow(-Math.log(jStat._random_fn()), 1 / shape);\n },\n\n variance: function variance(scale, shape) {\n return scale * scale * jStat.gammafn(1 + 2 / shape) -\n Math.pow(jStat.weibull.mean(scale, shape), 2);\n }\n});\n\n\n\n// extend uniform function with static methods\njStat.extend(jStat.uniform, {\n pdf: function pdf(x, a, b) {\n return (x < a || x > b) ? 0 : 1 / (b - a);\n },\n\n cdf: function cdf(x, a, b) {\n if (x < a)\n return 0;\n else if (x < b)\n return (x - a) / (b - a);\n return 1;\n },\n\n inv: function(p, a, b) {\n return a + (p * (b - a));\n },\n\n mean: function mean(a, b) {\n return 0.5 * (a + b);\n },\n\n median: function median(a, b) {\n return jStat.mean(a, b);\n },\n\n mode: function mode(/*a, b*/) {\n throw new Error('mode is not yet implemented');\n },\n\n sample: function sample(a, b) {\n return (a / 2 + b / 2) + (b / 2 - a / 2) * (2 * jStat._random_fn() - 1);\n },\n\n variance: function variance(a, b) {\n return Math.pow(b - a, 2) / 12;\n }\n});\n\n\n// Got this from http://www.math.ucla.edu/~tom/distributions/binomial.html\nfunction betinc(x, a, b, eps) {\n var a0 = 0;\n var b0 = 1;\n var a1 = 1;\n var b1 = 1;\n var m9 = 0;\n var a2 = 0;\n var c9;\n\n while (Math.abs((a1 - a2) / a1) > eps) {\n a2 = a1;\n c9 = -(a + m9) * (a + b + m9) * x / (a + 2 * m9) / (a + 2 * m9 + 1);\n a0 = a1 + c9 * a0;\n b0 = b1 + c9 * b0;\n m9 = m9 + 1;\n c9 = m9 * (b - m9) * x / (a + 2 * m9 - 1) / (a + 2 * m9);\n a1 = a0 + c9 * a1;\n b1 = b0 + c9 * b1;\n a0 = a0 / b1;\n b0 = b0 / b1;\n a1 = a1 / b1;\n b1 = 1;\n }\n\n return a1 / a;\n}\n\n\n// extend uniform function with static methods\njStat.extend(jStat.binomial, {\n pdf: function pdf(k, n, p) {\n return (p === 0 || p === 1) ?\n ((n * p) === k ? 1 : 0) :\n jStat.combination(n, k) * Math.pow(p, k) * Math.pow(1 - p, n - k);\n },\n\n cdf: function cdf(x, n, p) {\n var betacdf;\n var eps = 1e-10;\n\n if (x < 0)\n return 0;\n if (x >= n)\n return 1;\n if (p < 0 || p > 1 || n <= 0)\n return NaN;\n\n x = Math.floor(x);\n var z = p;\n var a = x + 1;\n var b = n - x;\n var s = a + b;\n var bt = Math.exp(jStat.gammaln(s) - jStat.gammaln(b) -\n jStat.gammaln(a) + a * Math.log(z) + b * Math.log(1 - z));\n\n if (z < (a + 1) / (s + 2))\n betacdf = bt * betinc(z, a, b, eps);\n else\n betacdf = 1 - bt * betinc(1 - z, b, a, eps);\n\n return Math.round((1 - betacdf) * (1 / eps)) / (1 / eps);\n }\n});\n\n\n\n// extend uniform function with static methods\njStat.extend(jStat.negbin, {\n pdf: function pdf(k, r, p) {\n if (k !== k >>> 0)\n return false;\n if (k < 0)\n return 0;\n return jStat.combination(k + r - 1, r - 1) *\n Math.pow(1 - p, k) * Math.pow(p, r);\n },\n\n cdf: function cdf(x, r, p) {\n var sum = 0,\n k = 0;\n if (x < 0) return 0;\n for (; k <= x; k++) {\n sum += jStat.negbin.pdf(k, r, p);\n }\n return sum;\n }\n});\n\n\n\n// extend uniform function with static methods\njStat.extend(jStat.hypgeom, {\n pdf: function pdf(k, N, m, n) {\n // Hypergeometric PDF.\n\n // A simplification of the CDF algorithm below.\n\n // k = number of successes drawn\n // N = population size\n // m = number of successes in population\n // n = number of items drawn from population\n\n if(k !== k | 0) {\n return false;\n } else if(k < 0 || k < m - (N - n)) {\n // It's impossible to have this few successes drawn.\n return 0;\n } else if(k > n || k > m) {\n // It's impossible to have this many successes drawn.\n return 0;\n } else if (m * 2 > N) {\n // More than half the population is successes.\n\n if(n * 2 > N) {\n // More than half the population is sampled.\n\n return jStat.hypgeom.pdf(N - m - n + k, N, N - m, N - n)\n } else {\n // Half or less of the population is sampled.\n\n return jStat.hypgeom.pdf(n - k, N, N - m, n);\n }\n\n } else if(n * 2 > N) {\n // Half or less is successes.\n\n return jStat.hypgeom.pdf(m - k, N, m, N - n);\n\n } else if(m < n) {\n // We want to have the number of things sampled to be less than the\n // successes available. So swap the definitions of successful and sampled.\n return jStat.hypgeom.pdf(k, N, n, m);\n } else {\n // If we get here, half or less of the population was sampled, half or\n // less of it was successes, and we had fewer sampled things than\n // successes. Now we can do this complicated iterative algorithm in an\n // efficient way.\n\n // The basic premise of the algorithm is that we partially normalize our\n // intermediate product to keep it in a numerically good region, and then\n // finish the normalization at the end.\n\n // This variable holds the scaled probability of the current number of\n // successes.\n var scaledPDF = 1;\n\n // This keeps track of how much we have normalized.\n var samplesDone = 0;\n\n for(var i = 0; i < k; i++) {\n // For every possible number of successes up to that observed...\n\n while(scaledPDF > 1 && samplesDone < n) {\n // Intermediate result is growing too big. Apply some of the\n // normalization to shrink everything.\n\n scaledPDF *= 1 - (m / (N - samplesDone));\n\n // Say we've normalized by this sample already.\n samplesDone++;\n }\n\n // Work out the partially-normalized hypergeometric PDF for the next\n // number of successes\n scaledPDF *= (n - i) * (m - i) / ((i + 1) * (N - m - n + i + 1));\n }\n\n for(; samplesDone < n; samplesDone++) {\n // Apply all the rest of the normalization\n scaledPDF *= 1 - (m / (N - samplesDone));\n }\n\n // Bound answer sanely before returning.\n return Math.min(1, Math.max(0, scaledPDF));\n }\n },\n\n cdf: function cdf(x, N, m, n) {\n // Hypergeometric CDF.\n\n // This algorithm is due to Prof. Thomas S. Ferguson, ,\n // and comes from his hypergeometric test calculator at\n // .\n\n // x = number of successes drawn\n // N = population size\n // m = number of successes in population\n // n = number of items drawn from population\n\n if(x < 0 || x < m - (N - n)) {\n // It's impossible to have this few successes drawn or fewer.\n return 0;\n } else if(x >= n || x >= m) {\n // We will always have this many successes or fewer.\n return 1;\n } else if (m * 2 > N) {\n // More than half the population is successes.\n\n if(n * 2 > N) {\n // More than half the population is sampled.\n\n return jStat.hypgeom.cdf(N - m - n + x, N, N - m, N - n)\n } else {\n // Half or less of the population is sampled.\n\n return 1 - jStat.hypgeom.cdf(n - x - 1, N, N - m, n);\n }\n\n } else if(n * 2 > N) {\n // Half or less is successes.\n\n return 1 - jStat.hypgeom.cdf(m - x - 1, N, m, N - n);\n\n } else if(m < n) {\n // We want to have the number of things sampled to be less than the\n // successes available. So swap the definitions of successful and sampled.\n return jStat.hypgeom.cdf(x, N, n, m);\n } else {\n // If we get here, half or less of the population was sampled, half or\n // less of it was successes, and we had fewer sampled things than\n // successes. Now we can do this complicated iterative algorithm in an\n // efficient way.\n\n // The basic premise of the algorithm is that we partially normalize our\n // intermediate sum to keep it in a numerically good region, and then\n // finish the normalization at the end.\n\n // Holds the intermediate, scaled total CDF.\n var scaledCDF = 1;\n\n // This variable holds the scaled probability of the current number of\n // successes.\n var scaledPDF = 1;\n\n // This keeps track of how much we have normalized.\n var samplesDone = 0;\n\n for(var i = 0; i < x; i++) {\n // For every possible number of successes up to that observed...\n\n while(scaledCDF > 1 && samplesDone < n) {\n // Intermediate result is growing too big. Apply some of the\n // normalization to shrink everything.\n\n var factor = 1 - (m / (N - samplesDone));\n\n scaledPDF *= factor;\n scaledCDF *= factor;\n\n // Say we've normalized by this sample already.\n samplesDone++;\n }\n\n // Work out the partially-normalized hypergeometric PDF for the next\n // number of successes\n scaledPDF *= (n - i) * (m - i) / ((i + 1) * (N - m - n + i + 1));\n\n // Add to the CDF answer.\n scaledCDF += scaledPDF;\n }\n\n for(; samplesDone < n; samplesDone++) {\n // Apply all the rest of the normalization\n scaledCDF *= 1 - (m / (N - samplesDone));\n }\n\n // Bound answer sanely before returning.\n return Math.min(1, Math.max(0, scaledCDF));\n }\n }\n});\n\n\n\n// extend uniform function with static methods\njStat.extend(jStat.poisson, {\n pdf: function pdf(k, l) {\n if (l < 0 || (k % 1) !== 0 || k < 0) {\n return 0;\n }\n\n return Math.pow(l, k) * Math.exp(-l) / jStat.factorial(k);\n },\n\n cdf: function cdf(x, l) {\n var sumarr = [],\n k = 0;\n if (x < 0) return 0;\n for (; k <= x; k++) {\n sumarr.push(jStat.poisson.pdf(k, l));\n }\n return jStat.sum(sumarr);\n },\n\n mean : function(l) {\n return l;\n },\n\n variance : function(l) {\n return l;\n },\n\n sampleSmall: function sampleSmall(l) {\n var p = 1, k = 0, L = Math.exp(-l);\n do {\n k++;\n p *= jStat._random_fn();\n } while (p > L);\n return k - 1;\n },\n\n sampleLarge: function sampleLarge(l) {\n var lam = l;\n var k;\n var U, V, slam, loglam, a, b, invalpha, vr, us;\n\n slam = Math.sqrt(lam);\n loglam = Math.log(lam);\n b = 0.931 + 2.53 * slam;\n a = -0.059 + 0.02483 * b;\n invalpha = 1.1239 + 1.1328 / (b - 3.4);\n vr = 0.9277 - 3.6224 / (b - 2);\n\n while (1) {\n U = Math.random() - 0.5;\n V = Math.random();\n us = 0.5 - Math.abs(U);\n k = Math.floor((2 * a / us + b) * U + lam + 0.43);\n if ((us >= 0.07) && (V <= vr)) {\n return k;\n }\n if ((k < 0) || ((us < 0.013) && (V > us))) {\n continue;\n }\n /* log(V) == log(0.0) ok here */\n /* if U==0.0 so that us==0.0, log is ok since always returns */\n if ((Math.log(V) + Math.log(invalpha) - Math.log(a / (us * us) + b)) <= (-lam + k * loglam - jStat.loggam(k + 1))) {\n return k;\n }\n }\n },\n\n sample: function sample(l) {\n if (l < 10)\n return this.sampleSmall(l);\n else\n return this.sampleLarge(l);\n }\n});\n\n// extend triangular function with static methods\njStat.extend(jStat.triangular, {\n pdf: function pdf(x, a, b, c) {\n if (b <= a || c < a || c > b) {\n return NaN;\n } else {\n if (x < a || x > b) {\n return 0;\n } else if (x < c) {\n return (2 * (x - a)) / ((b - a) * (c - a));\n } else if (x === c) {\n return (2 / (b - a));\n } else { // x > c\n return (2 * (b - x)) / ((b - a) * (b - c));\n }\n }\n },\n\n cdf: function cdf(x, a, b, c) {\n if (b <= a || c < a || c > b)\n return NaN;\n if (x <= a)\n return 0;\n else if (x >= b)\n return 1;\n if (x <= c)\n return Math.pow(x - a, 2) / ((b - a) * (c - a));\n else // x > c\n return 1 - Math.pow(b - x, 2) / ((b - a) * (b - c));\n },\n\n inv: function inv(p, a, b, c) {\n if (b <= a || c < a || c > b) {\n return NaN;\n } else {\n if (p <= ((c - a) / (b - a))) {\n return a + (b - a) * Math.sqrt(p * ((c - a) / (b - a)));\n } else { // p > ((c - a) / (b - a))\n return a + (b - a) * (1 - Math.sqrt((1 - p) * (1 - ((c - a) / (b - a)))));\n }\n }\n },\n\n mean: function mean(a, b, c) {\n return (a + b + c) / 3;\n },\n\n median: function median(a, b, c) {\n if (c <= (a + b) / 2) {\n return b - Math.sqrt((b - a) * (b - c)) / Math.sqrt(2);\n } else if (c > (a + b) / 2) {\n return a + Math.sqrt((b - a) * (c - a)) / Math.sqrt(2);\n }\n },\n\n mode: function mode(a, b, c) {\n return c;\n },\n\n sample: function sample(a, b, c) {\n var u = jStat._random_fn();\n if (u < ((c - a) / (b - a)))\n return a + Math.sqrt(u * (b - a) * (c - a))\n return b - Math.sqrt((1 - u) * (b - a) * (b - c));\n },\n\n variance: function variance(a, b, c) {\n return (a * a + b * b + c * c - a * b - a * c - b * c) / 18;\n }\n});\n\n\n// extend arcsine function with static methods\njStat.extend(jStat.arcsine, {\n pdf: function pdf(x, a, b) {\n if (b <= a) return NaN;\n\n return (x <= a || x >= b) ? 0 :\n (2 / Math.PI) *\n Math.pow(Math.pow(b - a, 2) -\n Math.pow(2 * x - a - b, 2), -0.5);\n },\n\n cdf: function cdf(x, a, b) {\n if (x < a)\n return 0;\n else if (x < b)\n return (2 / Math.PI) * Math.asin(Math.sqrt((x - a)/(b - a)));\n return 1;\n },\n\n inv: function(p, a, b) {\n return a + (0.5 - 0.5 * Math.cos(Math.PI * p)) * (b - a);\n },\n\n mean: function mean(a, b) {\n if (b <= a) return NaN;\n return (a + b) / 2;\n },\n\n median: function median(a, b) {\n if (b <= a) return NaN;\n return (a + b) / 2;\n },\n\n mode: function mode(/*a, b*/) {\n throw new Error('mode is not yet implemented');\n },\n\n sample: function sample(a, b) {\n return ((a + b) / 2) + ((b - a) / 2) *\n Math.sin(2 * Math.PI * jStat.uniform.sample(0, 1));\n },\n\n variance: function variance(a, b) {\n if (b <= a) return NaN;\n return Math.pow(b - a, 2) / 8;\n }\n});\n\n\nfunction laplaceSign(x) { return x / Math.abs(x); }\n\njStat.extend(jStat.laplace, {\n pdf: function pdf(x, mu, b) {\n return (b <= 0) ? 0 : (Math.exp(-Math.abs(x - mu) / b)) / (2 * b);\n },\n\n cdf: function cdf(x, mu, b) {\n if (b <= 0) { return 0; }\n\n if(x < mu) {\n return 0.5 * Math.exp((x - mu) / b);\n } else {\n return 1 - 0.5 * Math.exp(- (x - mu) / b);\n }\n },\n\n mean: function(mu/*, b*/) {\n return mu;\n },\n\n median: function(mu/*, b*/) {\n return mu;\n },\n\n mode: function(mu/*, b*/) {\n return mu;\n },\n\n variance: function(mu, b) {\n return 2 * b * b;\n },\n\n sample: function sample(mu, b) {\n var u = jStat._random_fn() - 0.5;\n\n return mu - (b * laplaceSign(u) * Math.log(1 - (2 * Math.abs(u))));\n }\n});\n\nfunction tukeyWprob(w, rr, cc) {\n var nleg = 12;\n var ihalf = 6;\n\n var C1 = -30;\n var C2 = -50;\n var C3 = 60;\n var bb = 8;\n var wlar = 3;\n var wincr1 = 2;\n var wincr2 = 3;\n var xleg = [\n 0.981560634246719250690549090149,\n 0.904117256370474856678465866119,\n 0.769902674194304687036893833213,\n 0.587317954286617447296702418941,\n 0.367831498998180193752691536644,\n 0.125233408511468915472441369464\n ];\n var aleg = [\n 0.047175336386511827194615961485,\n 0.106939325995318430960254718194,\n 0.160078328543346226334652529543,\n 0.203167426723065921749064455810,\n 0.233492536538354808760849898925,\n 0.249147045813402785000562436043\n ];\n\n var qsqz = w * 0.5;\n\n // if w >= 16 then the integral lower bound (occurs for c=20)\n // is 0.99999999999995 so return a value of 1.\n\n if (qsqz >= bb)\n return 1.0;\n\n // find (f(w/2) - 1) ^ cc\n // (first term in integral of hartley's form).\n\n var pr_w = 2 * jStat.normal.cdf(qsqz, 0, 1, 1, 0) - 1; // erf(qsqz / M_SQRT2)\n // if pr_w ^ cc < 2e-22 then set pr_w = 0\n if (pr_w >= Math.exp(C2 / cc))\n pr_w = Math.pow(pr_w, cc);\n else\n pr_w = 0.0;\n\n // if w is large then the second component of the\n // integral is small, so fewer intervals are needed.\n\n var wincr;\n if (w > wlar)\n wincr = wincr1;\n else\n wincr = wincr2;\n\n // find the integral of second term of hartley's form\n // for the integral of the range for equal-length\n // intervals using legendre quadrature. limits of\n // integration are from (w/2, 8). two or three\n // equal-length intervals are used.\n\n // blb and bub are lower and upper limits of integration.\n\n var blb = qsqz;\n var binc = (bb - qsqz) / wincr;\n var bub = blb + binc;\n var einsum = 0.0;\n\n // integrate over each interval\n\n var cc1 = cc - 1.0;\n for (var wi = 1; wi <= wincr; wi++) {\n var elsum = 0.0;\n var a = 0.5 * (bub + blb);\n\n // legendre quadrature with order = nleg\n\n var b = 0.5 * (bub - blb);\n\n for (var jj = 1; jj <= nleg; jj++) {\n var j, xx;\n if (ihalf < jj) {\n j = (nleg - jj) + 1;\n xx = xleg[j-1];\n } else {\n j = jj;\n xx = -xleg[j-1];\n }\n var c = b * xx;\n var ac = a + c;\n\n // if exp(-qexpo/2) < 9e-14,\n // then doesn't contribute to integral\n\n var qexpo = ac * ac;\n if (qexpo > C3)\n break;\n\n var pplus = 2 * jStat.normal.cdf(ac, 0, 1, 1, 0);\n var pminus= 2 * jStat.normal.cdf(ac, w, 1, 1, 0);\n\n // if rinsum ^ (cc-1) < 9e-14,\n // then doesn't contribute to integral\n\n var rinsum = (pplus * 0.5) - (pminus * 0.5);\n if (rinsum >= Math.exp(C1 / cc1)) {\n rinsum = (aleg[j-1] * Math.exp(-(0.5 * qexpo))) * Math.pow(rinsum, cc1);\n elsum += rinsum;\n }\n }\n elsum *= (((2.0 * b) * cc) / Math.sqrt(2 * Math.PI));\n einsum += elsum;\n blb = bub;\n bub += binc;\n }\n\n // if pr_w ^ rr < 9e-14, then return 0\n pr_w += einsum;\n if (pr_w <= Math.exp(C1 / rr))\n return 0;\n\n pr_w = Math.pow(pr_w, rr);\n if (pr_w >= 1) // 1 was iMax was eps\n return 1;\n return pr_w;\n}\n\nfunction tukeyQinv(p, c, v) {\n var p0 = 0.322232421088;\n var q0 = 0.993484626060e-01;\n var p1 = -1.0;\n var q1 = 0.588581570495;\n var p2 = -0.342242088547;\n var q2 = 0.531103462366;\n var p3 = -0.204231210125;\n var q3 = 0.103537752850;\n var p4 = -0.453642210148e-04;\n var q4 = 0.38560700634e-02;\n var c1 = 0.8832;\n var c2 = 0.2368;\n var c3 = 1.214;\n var c4 = 1.208;\n var c5 = 1.4142;\n var vmax = 120.0;\n\n var ps = 0.5 - 0.5 * p;\n var yi = Math.sqrt(Math.log(1.0 / (ps * ps)));\n var t = yi + (((( yi * p4 + p3) * yi + p2) * yi + p1) * yi + p0)\n / (((( yi * q4 + q3) * yi + q2) * yi + q1) * yi + q0);\n if (v < vmax) t += (t * t * t + t) / v / 4.0;\n var q = c1 - c2 * t;\n if (v < vmax) q += -c3 / v + c4 * t / v;\n return t * (q * Math.log(c - 1.0) + c5);\n}\n\njStat.extend(jStat.tukey, {\n cdf: function cdf(q, nmeans, df) {\n // Identical implementation as the R ptukey() function as of commit 68947\n var rr = 1;\n var cc = nmeans;\n\n var nlegq = 16;\n var ihalfq = 8;\n\n var eps1 = -30.0;\n var eps2 = 1.0e-14;\n var dhaf = 100.0;\n var dquar = 800.0;\n var deigh = 5000.0;\n var dlarg = 25000.0;\n var ulen1 = 1.0;\n var ulen2 = 0.5;\n var ulen3 = 0.25;\n var ulen4 = 0.125;\n var xlegq = [\n 0.989400934991649932596154173450,\n 0.944575023073232576077988415535,\n 0.865631202387831743880467897712,\n 0.755404408355003033895101194847,\n 0.617876244402643748446671764049,\n 0.458016777657227386342419442984,\n 0.281603550779258913230460501460,\n 0.950125098376374401853193354250e-1\n ];\n var alegq = [\n 0.271524594117540948517805724560e-1,\n 0.622535239386478928628438369944e-1,\n 0.951585116824927848099251076022e-1,\n 0.124628971255533872052476282192,\n 0.149595988816576732081501730547,\n 0.169156519395002538189312079030,\n 0.182603415044923588866763667969,\n 0.189450610455068496285396723208\n ];\n\n if (q <= 0)\n return 0;\n\n // df must be > 1\n // there must be at least two values\n\n if (df < 2 || rr < 1 || cc < 2) return NaN;\n\n if (!Number.isFinite(q))\n return 1;\n\n if (df > dlarg)\n return tukeyWprob(q, rr, cc);\n\n // calculate leading constant\n\n var f2 = df * 0.5;\n var f2lf = ((f2 * Math.log(df)) - (df * Math.log(2))) - jStat.gammaln(f2);\n var f21 = f2 - 1.0;\n\n // integral is divided into unit, half-unit, quarter-unit, or\n // eighth-unit length intervals depending on the value of the\n // degrees of freedom.\n\n var ff4 = df * 0.25;\n var ulen;\n if (df <= dhaf) ulen = ulen1;\n else if (df <= dquar) ulen = ulen2;\n else if (df <= deigh) ulen = ulen3;\n else ulen = ulen4;\n\n f2lf += Math.log(ulen);\n\n // integrate over each subinterval\n\n var ans = 0.0;\n\n for (var i = 1; i <= 50; i++) {\n var otsum = 0.0;\n\n // legendre quadrature with order = nlegq\n // nodes (stored in xlegq) are symmetric around zero.\n\n var twa1 = (2 * i - 1) * ulen;\n\n for (var jj = 1; jj <= nlegq; jj++) {\n var j, t1;\n if (ihalfq < jj) {\n j = jj - ihalfq - 1;\n t1 = (f2lf + (f21 * Math.log(twa1 + (xlegq[j] * ulen))))\n - (((xlegq[j] * ulen) + twa1) * ff4);\n } else {\n j = jj - 1;\n t1 = (f2lf + (f21 * Math.log(twa1 - (xlegq[j] * ulen))))\n + (((xlegq[j] * ulen) - twa1) * ff4);\n }\n\n // if exp(t1) < 9e-14, then doesn't contribute to integral\n var qsqz;\n if (t1 >= eps1) {\n if (ihalfq < jj) {\n qsqz = q * Math.sqrt(((xlegq[j] * ulen) + twa1) * 0.5);\n } else {\n qsqz = q * Math.sqrt(((-(xlegq[j] * ulen)) + twa1) * 0.5);\n }\n\n // call wprob to find integral of range portion\n\n var wprb = tukeyWprob(qsqz, rr, cc);\n var rotsum = (wprb * alegq[j]) * Math.exp(t1);\n otsum += rotsum;\n }\n // end legendre integral for interval i\n // L200:\n }\n\n // if integral for interval i < 1e-14, then stop.\n // However, in order to avoid small area under left tail,\n // at least 1 / ulen intervals are calculated.\n if (i * ulen >= 1.0 && otsum <= eps2)\n break;\n\n // end of interval i\n // L330:\n\n ans += otsum;\n }\n\n if (otsum > eps2) { // not converged\n throw new Error('tukey.cdf failed to converge');\n }\n if (ans > 1)\n ans = 1;\n return ans;\n },\n\n inv: function(p, nmeans, df) {\n // Identical implementation as the R qtukey() function as of commit 68947\n var rr = 1;\n var cc = nmeans;\n\n var eps = 0.0001;\n var maxiter = 50;\n\n // df must be > 1 ; there must be at least two values\n if (df < 2 || rr < 1 || cc < 2) return NaN;\n\n if (p < 0 || p > 1) return NaN;\n if (p === 0) return 0;\n if (p === 1) return Infinity;\n\n // Initial value\n\n var x0 = tukeyQinv(p, cc, df);\n\n // Find prob(value < x0)\n\n var valx0 = jStat.tukey.cdf(x0, nmeans, df) - p;\n\n // Find the second iterate and prob(value < x1).\n // If the first iterate has probability value\n // exceeding p then second iterate is 1 less than\n // first iterate; otherwise it is 1 greater.\n\n var x1;\n if (valx0 > 0.0)\n x1 = Math.max(0.0, x0 - 1.0);\n else\n x1 = x0 + 1.0;\n var valx1 = jStat.tukey.cdf(x1, nmeans, df) - p;\n\n // Find new iterate\n\n var ans;\n for(var iter = 1; iter < maxiter; iter++) {\n ans = x1 - ((valx1 * (x1 - x0)) / (valx1 - valx0));\n valx0 = valx1;\n\n // New iterate must be >= 0\n\n x0 = x1;\n if (ans < 0.0) {\n ans = 0.0;\n valx1 = -p;\n }\n // Find prob(value < new iterate)\n\n valx1 = jStat.tukey.cdf(ans, nmeans, df) - p;\n x1 = ans;\n\n // If the difference between two successive\n // iterates is less than eps, stop\n\n var xabs = Math.abs(x1 - x0);\n if (xabs < eps)\n return ans;\n }\n\n throw new Error('tukey.inv failed to converge');\n }\n});\n\n}(jStat, Math));\n/* Provides functions for the solution of linear system of equations, integration, extrapolation,\n * interpolation, eigenvalue problems, differential equations and PCA analysis. */\n\n(function(jStat, Math) {\n\nvar push = Array.prototype.push;\nvar isArray = jStat.utils.isArray;\n\nfunction isUsable(arg) {\n return isArray(arg) || arg instanceof jStat;\n}\n\njStat.extend({\n\n // add a vector/matrix to a vector/matrix or scalar\n add: function add(arr, arg) {\n // check if arg is a vector or scalar\n if (isUsable(arg)) {\n if (!isUsable(arg[0])) arg = [ arg ];\n return jStat.map(arr, function(value, row, col) {\n return value + arg[row][col];\n });\n }\n return jStat.map(arr, function(value) { return value + arg; });\n },\n\n // subtract a vector or scalar from the vector\n subtract: function subtract(arr, arg) {\n // check if arg is a vector or scalar\n if (isUsable(arg)) {\n if (!isUsable(arg[0])) arg = [ arg ];\n return jStat.map(arr, function(value, row, col) {\n return value - arg[row][col] || 0;\n });\n }\n return jStat.map(arr, function(value) { return value - arg; });\n },\n\n // matrix division\n divide: function divide(arr, arg) {\n if (isUsable(arg)) {\n if (!isUsable(arg[0])) arg = [ arg ];\n return jStat.multiply(arr, jStat.inv(arg));\n }\n return jStat.map(arr, function(value) { return value / arg; });\n },\n\n // matrix multiplication\n multiply: function multiply(arr, arg) {\n var row, col, nrescols, sum, nrow, ncol, res, rescols;\n // eg: arr = 2 arg = 3 -> 6 for res[0][0] statement closure\n if (arr.length === undefined && arg.length === undefined) {\n return arr * arg;\n }\n nrow = arr.length,\n ncol = arr[0].length,\n res = jStat.zeros(nrow, nrescols = (isUsable(arg)) ? arg[0].length : ncol),\n rescols = 0;\n if (isUsable(arg)) {\n for (; rescols < nrescols; rescols++) {\n for (row = 0; row < nrow; row++) {\n sum = 0;\n for (col = 0; col < ncol; col++)\n sum += arr[row][col] * arg[col][rescols];\n res[row][rescols] = sum;\n }\n }\n return (nrow === 1 && rescols === 1) ? res[0][0] : res;\n }\n return jStat.map(arr, function(value) { return value * arg; });\n },\n\n // outer([1,2,3],[4,5,6])\n // ===\n // [[1],[2],[3]] times [[4,5,6]]\n // ->\n // [[4,5,6],[8,10,12],[12,15,18]]\n outer:function outer(A, B) {\n return jStat.multiply(A.map(function(t){ return [t] }), [B]);\n },\n\n\n // Returns the dot product of two matricies\n dot: function dot(arr, arg) {\n if (!isUsable(arr[0])) arr = [ arr ];\n if (!isUsable(arg[0])) arg = [ arg ];\n // convert column to row vector\n var left = (arr[0].length === 1 && arr.length !== 1) ? jStat.transpose(arr) : arr,\n right = (arg[0].length === 1 && arg.length !== 1) ? jStat.transpose(arg) : arg,\n res = [],\n row = 0,\n nrow = left.length,\n ncol = left[0].length,\n sum, col;\n for (; row < nrow; row++) {\n res[row] = [];\n sum = 0;\n for (col = 0; col < ncol; col++)\n sum += left[row][col] * right[row][col];\n res[row] = sum;\n }\n return (res.length === 1) ? res[0] : res;\n },\n\n // raise every element by a scalar\n pow: function pow(arr, arg) {\n return jStat.map(arr, function(value) { return Math.pow(value, arg); });\n },\n\n // exponentiate every element\n exp: function exp(arr) {\n return jStat.map(arr, function(value) { return Math.exp(value); });\n },\n\n // generate the natural log of every element\n log: function exp(arr) {\n return jStat.map(arr, function(value) { return Math.log(value); });\n },\n\n // generate the absolute values of the vector\n abs: function abs(arr) {\n return jStat.map(arr, function(value) { return Math.abs(value); });\n },\n\n // computes the p-norm of the vector\n // In the case that a matrix is passed, uses the first row as the vector\n norm: function norm(arr, p) {\n var nnorm = 0,\n i = 0;\n // check the p-value of the norm, and set for most common case\n if (isNaN(p)) p = 2;\n // check if multi-dimensional array, and make vector correction\n if (isUsable(arr[0])) arr = arr[0];\n // vector norm\n for (; i < arr.length; i++) {\n nnorm += Math.pow(Math.abs(arr[i]), p);\n }\n return Math.pow(nnorm, 1 / p);\n },\n\n // computes the angle between two vectors in rads\n // In case a matrix is passed, this uses the first row as the vector\n angle: function angle(arr, arg) {\n return Math.acos(jStat.dot(arr, arg) / (jStat.norm(arr) * jStat.norm(arg)));\n },\n\n // augment one matrix by another\n // Note: this function returns a matrix, not a jStat object\n aug: function aug(a, b) {\n var newarr = [];\n var i;\n for (i = 0; i < a.length; i++) {\n newarr.push(a[i].slice());\n }\n for (i = 0; i < newarr.length; i++) {\n push.apply(newarr[i], b[i]);\n }\n return newarr;\n },\n\n // The inv() function calculates the inverse of a matrix\n // Create the inverse by augmenting the matrix by the identity matrix of the\n // appropriate size, and then use G-J elimination on the augmented matrix.\n inv: function inv(a) {\n var rows = a.length;\n var cols = a[0].length;\n var b = jStat.identity(rows, cols);\n var c = jStat.gauss_jordan(a, b);\n var result = [];\n var i = 0;\n var j;\n\n //We need to copy the inverse portion to a new matrix to rid G-J artifacts\n for (; i < rows; i++) {\n result[i] = [];\n for (j = cols; j < c[0].length; j++)\n result[i][j - cols] = c[i][j];\n }\n return result;\n },\n\n // calculate the determinant of a matrix\n det: function det(a) {\n if (a.length === 2) {\n return a[0][0] * a[1][1] - a[0][1] * a[1][0];\n }\n\n var determinant = 0;\n for (var i = 0; i < a.length; i++) {\n // build a sub matrix without column `i`\n var submatrix = [];\n for (var row = 1; row < a.length; row++) {\n submatrix[row - 1] = [];\n for (var col = 0; col < a.length; col++) {\n if (col < i) {\n submatrix[row - 1][col] = a[row][col];\n } else if (col > i) {\n submatrix[row - 1][col - 1] = a[row][col];\n }\n }\n }\n\n // alternate between + and - between determinants\n var sign = i % 2 ? -1 : 1;\n determinant += det(submatrix) * a[0][i] * sign;\n }\n\n return determinant\n },\n\n gauss_elimination: function gauss_elimination(a, b) {\n var i = 0,\n j = 0,\n n = a.length,\n m = a[0].length,\n factor = 1,\n sum = 0,\n x = [],\n maug, pivot, temp, k;\n a = jStat.aug(a, b);\n maug = a[0].length;\n for(i = 0; i < n; i++) {\n pivot = a[i][i];\n j = i;\n for (k = i + 1; k < m; k++) {\n if (pivot < Math.abs(a[k][i])) {\n pivot = a[k][i];\n j = k;\n }\n }\n if (j != i) {\n for(k = 0; k < maug; k++) {\n temp = a[i][k];\n a[i][k] = a[j][k];\n a[j][k] = temp;\n }\n }\n for (j = i + 1; j < n; j++) {\n factor = a[j][i] / a[i][i];\n for(k = i; k < maug; k++) {\n a[j][k] = a[j][k] - factor * a[i][k];\n }\n }\n }\n for (i = n - 1; i >= 0; i--) {\n sum = 0;\n for (j = i + 1; j<= n - 1; j++) {\n sum = sum + x[j] * a[i][j];\n }\n x[i] =(a[i][maug - 1] - sum) / a[i][i];\n }\n return x;\n },\n\n gauss_jordan: function gauss_jordan(a, b) {\n var m = jStat.aug(a, b);\n var h = m.length;\n var w = m[0].length;\n var c = 0;\n var x, y, y2;\n // find max pivot\n for (y = 0; y < h; y++) {\n var maxrow = y;\n for (y2 = y+1; y2 < h; y2++) {\n if (Math.abs(m[y2][y]) > Math.abs(m[maxrow][y]))\n maxrow = y2;\n }\n var tmp = m[y];\n m[y] = m[maxrow];\n m[maxrow] = tmp\n for (y2 = y+1; y2 < h; y2++) {\n c = m[y2][y] / m[y][y];\n for (x = y; x < w; x++) {\n m[y2][x] -= m[y][x] * c;\n }\n }\n }\n // backsubstitute\n for (y = h-1; y >= 0; y--) {\n c = m[y][y];\n for (y2 = 0; y2 < y; y2++) {\n for (x = w-1; x > y-1; x--) {\n m[y2][x] -= m[y][x] * m[y2][y] / c;\n }\n }\n m[y][y] /= c;\n for (x = h; x < w; x++) {\n m[y][x] /= c;\n }\n }\n return m;\n },\n\n // solve equation\n // Ax=b\n // A is upper triangular matrix\n // A=[[1,2,3],[0,4,5],[0,6,7]]\n // b=[1,2,3]\n // triaUpSolve(A,b) // -> [2.666,0.1666,1.666]\n // if you use matrix style\n // A=[[1,2,3],[0,4,5],[0,6,7]]\n // b=[[1],[2],[3]]\n // will return [[2.666],[0.1666],[1.666]]\n triaUpSolve: function triaUpSolve(A, b) {\n var size = A[0].length;\n var x = jStat.zeros(1, size)[0];\n var parts;\n var matrix_mode = false;\n\n if (b[0].length != undefined) {\n b = b.map(function(i){ return i[0] });\n matrix_mode = true;\n }\n\n jStat.arange(size - 1, -1, -1).forEach(function(i) {\n parts = jStat.arange(i + 1, size).map(function(j) {\n return x[j] * A[i][j];\n });\n x[i] = (b[i] - jStat.sum(parts)) / A[i][i];\n });\n\n if (matrix_mode)\n return x.map(function(i){ return [i] });\n return x;\n },\n\n triaLowSolve: function triaLowSolve(A, b) {\n // like to triaUpSolve but A is lower triangular matrix\n var size = A[0].length;\n var x = jStat.zeros(1, size)[0];\n var parts;\n\n var matrix_mode=false;\n if (b[0].length != undefined) {\n b = b.map(function(i){ return i[0] });\n matrix_mode = true;\n }\n\n jStat.arange(size).forEach(function(i) {\n parts = jStat.arange(i).map(function(j) {\n return A[i][j] * x[j];\n });\n x[i] = (b[i] - jStat.sum(parts)) / A[i][i];\n })\n\n if (matrix_mode)\n return x.map(function(i){ return [i] });\n return x;\n },\n\n\n // A -> [L,U]\n // A=LU\n // L is lower triangular matrix\n // U is upper triangular matrix\n lu: function lu(A) {\n var size = A.length;\n //var L=jStat.diagonal(jStat.ones(1,size)[0]);\n var L = jStat.identity(size);\n var R = jStat.zeros(A.length, A[0].length);\n var parts;\n jStat.arange(size).forEach(function(t) {\n R[0][t] = A[0][t];\n });\n jStat.arange(1, size).forEach(function(l) {\n jStat.arange(l).forEach(function(i) {\n parts = jStat.arange(i).map(function(jj) {\n return L[l][jj] * R[jj][i];\n });\n L[l][i] = (A[l][i] - jStat.sum(parts)) / R[i][i];\n });\n jStat.arange(l, size).forEach(function(j) {\n parts = jStat.arange(l).map(function(jj) {\n return L[l][jj] * R[jj][j];\n });\n R[l][j] = A[parts.length][j] - jStat.sum(parts);\n });\n });\n return [L, R];\n },\n\n // A -> T\n // A=TT'\n // T is lower triangular matrix\n cholesky: function cholesky(A) {\n var size = A.length;\n var T = jStat.zeros(A.length, A[0].length);\n var parts;\n jStat.arange(size).forEach(function(i) {\n parts = jStat.arange(i).map(function(t) {\n return Math.pow(T[i][t],2);\n });\n T[i][i] = Math.sqrt(A[i][i] - jStat.sum(parts));\n jStat.arange(i + 1, size).forEach(function(j) {\n parts = jStat.arange(i).map(function(t) {\n return T[i][t] * T[j][t];\n });\n T[j][i] = (A[i][j] - jStat.sum(parts)) / T[i][i];\n });\n });\n return T;\n },\n\n\n gauss_jacobi: function gauss_jacobi(a, b, x, r) {\n var i = 0;\n var j = 0;\n var n = a.length;\n var l = [];\n var u = [];\n var d = [];\n var xv, c, h, xk;\n for (; i < n; i++) {\n l[i] = [];\n u[i] = [];\n d[i] = [];\n for (j = 0; j < n; j++) {\n if (i > j) {\n l[i][j] = a[i][j];\n u[i][j] = d[i][j] = 0;\n } else if (i < j) {\n u[i][j] = a[i][j];\n l[i][j] = d[i][j] = 0;\n } else {\n d[i][j] = a[i][j];\n l[i][j] = u[i][j] = 0;\n }\n }\n }\n h = jStat.multiply(jStat.multiply(jStat.inv(d), jStat.add(l, u)), -1);\n c = jStat.multiply(jStat.inv(d), b);\n xv = x;\n xk = jStat.add(jStat.multiply(h, x), c);\n i = 2;\n while (Math.abs(jStat.norm(jStat.subtract(xk,xv))) > r) {\n xv = xk;\n xk = jStat.add(jStat.multiply(h, xv), c);\n i++;\n }\n return xk;\n },\n\n gauss_seidel: function gauss_seidel(a, b, x, r) {\n var i = 0;\n var n = a.length;\n var l = [];\n var u = [];\n var d = [];\n var j, xv, c, h, xk;\n for (; i < n; i++) {\n l[i] = [];\n u[i] = [];\n d[i] = [];\n for (j = 0; j < n; j++) {\n if (i > j) {\n l[i][j] = a[i][j];\n u[i][j] = d[i][j] = 0;\n } else if (i < j) {\n u[i][j] = a[i][j];\n l[i][j] = d[i][j] = 0;\n } else {\n d[i][j] = a[i][j];\n l[i][j] = u[i][j] = 0;\n }\n }\n }\n h = jStat.multiply(jStat.multiply(jStat.inv(jStat.add(d, l)), u), -1);\n c = jStat.multiply(jStat.inv(jStat.add(d, l)), b);\n xv = x;\n xk = jStat.add(jStat.multiply(h, x), c);\n i = 2;\n while (Math.abs(jStat.norm(jStat.subtract(xk, xv))) > r) {\n xv = xk;\n xk = jStat.add(jStat.multiply(h, xv), c);\n i = i + 1;\n }\n return xk;\n },\n\n SOR: function SOR(a, b, x, r, w) {\n var i = 0;\n var n = a.length;\n var l = [];\n var u = [];\n var d = [];\n var j, xv, c, h, xk;\n for (; i < n; i++) {\n l[i] = [];\n u[i] = [];\n d[i] = [];\n for (j = 0; j < n; j++) {\n if (i > j) {\n l[i][j] = a[i][j];\n u[i][j] = d[i][j] = 0;\n } else if (i < j) {\n u[i][j] = a[i][j];\n l[i][j] = d[i][j] = 0;\n } else {\n d[i][j] = a[i][j];\n l[i][j] = u[i][j] = 0;\n }\n }\n }\n h = jStat.multiply(jStat.inv(jStat.add(d, jStat.multiply(l, w))),\n jStat.subtract(jStat.multiply(d, 1 - w),\n jStat.multiply(u, w)));\n c = jStat.multiply(jStat.multiply(jStat.inv(jStat.add(d,\n jStat.multiply(l, w))), b), w);\n xv = x;\n xk = jStat.add(jStat.multiply(h, x), c);\n i = 2;\n while (Math.abs(jStat.norm(jStat.subtract(xk, xv))) > r) {\n xv = xk;\n xk = jStat.add(jStat.multiply(h, xv), c);\n i++;\n }\n return xk;\n },\n\n householder: function householder(a) {\n var m = a.length;\n var n = a[0].length;\n var i = 0;\n var w = [];\n var p = [];\n var alpha, r, k, j, factor;\n for (; i < m - 1; i++) {\n alpha = 0;\n for (j = i + 1; j < n; j++)\n alpha += (a[j][i] * a[j][i]);\n factor = (a[i + 1][i] > 0) ? -1 : 1;\n alpha = factor * Math.sqrt(alpha);\n r = Math.sqrt((((alpha * alpha) - a[i + 1][i] * alpha) / 2));\n w = jStat.zeros(m, 1);\n w[i + 1][0] = (a[i + 1][i] - alpha) / (2 * r);\n for (k = i + 2; k < m; k++) w[k][0] = a[k][i] / (2 * r);\n p = jStat.subtract(jStat.identity(m, n),\n jStat.multiply(jStat.multiply(w, jStat.transpose(w)), 2));\n a = jStat.multiply(p, jStat.multiply(a, p));\n }\n return a;\n },\n\n // A -> [Q,R]\n // Q is orthogonal matrix\n // R is upper triangular\n QR: (function() {\n // x -> Q\n // find a orthogonal matrix Q st.\n // Qx=y\n // y is [||x||,0,0,...]\n\n // quick ref\n var sum = jStat.sum;\n var range = jStat.arange;\n\n function qr2(x) {\n // quick impletation\n // https://www.stat.wisc.edu/~larget/math496/qr.html\n\n var n = x.length;\n var p = x[0].length;\n\n var r = jStat.zeros(p, p);\n x = jStat.copy(x);\n\n var i,j,k;\n for(j = 0; j < p; j++){\n r[j][j] = Math.sqrt(sum(range(n).map(function(i){\n return x[i][j] * x[i][j];\n })));\n for(i = 0; i < n; i++){\n x[i][j] = x[i][j] / r[j][j];\n }\n for(k = j+1; k < p; k++){\n r[j][k] = sum(range(n).map(function(i){\n return x[i][j] * x[i][k];\n }));\n for(i = 0; i < n; i++){\n x[i][k] = x[i][k] - x[i][j]*r[j][k];\n }\n }\n }\n return [x, r];\n }\n\n return qr2;\n }()),\n\n lstsq: (function() {\n // solve least squard problem for Ax=b as QR decomposition way if b is\n // [[b1],[b2],[b3]] form will return [[x1],[x2],[x3]] array form solution\n // else b is [b1,b2,b3] form will return [x1,x2,x3] array form solution\n function R_I(A) {\n A = jStat.copy(A);\n var size = A.length;\n var I = jStat.identity(size);\n jStat.arange(size - 1, -1, -1).forEach(function(i) {\n jStat.sliceAssign(\n I, { row: i }, jStat.divide(jStat.slice(I, { row: i }), A[i][i]));\n jStat.sliceAssign(\n A, { row: i }, jStat.divide(jStat.slice(A, { row: i }), A[i][i]));\n jStat.arange(i).forEach(function(j) {\n var c = jStat.multiply(A[j][i], -1);\n var Aj = jStat.slice(A, { row: j });\n var cAi = jStat.multiply(jStat.slice(A, { row: i }), c);\n jStat.sliceAssign(A, { row: j }, jStat.add(Aj, cAi));\n var Ij = jStat.slice(I, { row: j });\n var cIi = jStat.multiply(jStat.slice(I, { row: i }), c);\n jStat.sliceAssign(I, { row: j }, jStat.add(Ij, cIi));\n })\n });\n return I;\n }\n\n function qr_solve(A, b){\n var array_mode = false;\n if (b[0].length === undefined) {\n // [c1,c2,c3] mode\n b = b.map(function(x){ return [x] });\n array_mode = true;\n }\n var QR = jStat.QR(A);\n var Q = QR[0];\n var R = QR[1];\n var attrs = A[0].length;\n var Q1 = jStat.slice(Q,{col:{end:attrs}});\n var R1 = jStat.slice(R,{row:{end:attrs}});\n var RI = R_I(R1);\n var Q2 = jStat.transpose(Q1);\n\n if(Q2[0].length === undefined){\n Q2 = [Q2]; // The confusing jStat.multifly implementation threat nature process again.\n }\n\n var x = jStat.multiply(jStat.multiply(RI, Q2), b);\n\n if(x.length === undefined){\n x = [[x]]; // The confusing jStat.multifly implementation threat nature process again.\n }\n\n\n if (array_mode)\n return x.map(function(i){ return i[0] });\n return x;\n }\n\n return qr_solve;\n }()),\n\n jacobi: function jacobi(a) {\n var condition = 1;\n var n = a.length;\n var e = jStat.identity(n, n);\n var ev = [];\n var b, i, j, p, q, maxim, theta, s;\n // condition === 1 only if tolerance is not reached\n while (condition === 1) {\n maxim = a[0][1];\n p = 0;\n q = 1;\n for (i = 0; i < n; i++) {\n for (j = 0; j < n; j++) {\n if (i != j) {\n if (maxim < Math.abs(a[i][j])) {\n maxim = Math.abs(a[i][j]);\n p = i;\n q = j;\n }\n }\n }\n }\n if (a[p][p] === a[q][q])\n theta = (a[p][q] > 0) ? Math.PI / 4 : -Math.PI / 4;\n else\n theta = Math.atan(2 * a[p][q] / (a[p][p] - a[q][q])) / 2;\n s = jStat.identity(n, n);\n s[p][p] = Math.cos(theta);\n s[p][q] = -Math.sin(theta);\n s[q][p] = Math.sin(theta);\n s[q][q] = Math.cos(theta);\n // eigen vector matrix\n e = jStat.multiply(e, s);\n b = jStat.multiply(jStat.multiply(jStat.inv(s), a), s);\n a = b;\n condition = 0;\n for (i = 1; i < n; i++) {\n for (j = 1; j < n; j++) {\n if (i != j && Math.abs(a[i][j]) > 0.001) {\n condition = 1;\n }\n }\n }\n }\n for (i = 0; i < n; i++) ev.push(a[i][i]);\n //returns both the eigenvalue and eigenmatrix\n return [e, ev];\n },\n\n rungekutta: function rungekutta(f, h, p, t_j, u_j, order) {\n var k1, k2, u_j1, k3, k4;\n if (order === 2) {\n while (t_j <= p) {\n k1 = h * f(t_j, u_j);\n k2 = h * f(t_j + h, u_j + k1);\n u_j1 = u_j + (k1 + k2) / 2;\n u_j = u_j1;\n t_j = t_j + h;\n }\n }\n if (order === 4) {\n while (t_j <= p) {\n k1 = h * f(t_j, u_j);\n k2 = h * f(t_j + h / 2, u_j + k1 / 2);\n k3 = h * f(t_j + h / 2, u_j + k2 / 2);\n k4 = h * f(t_j +h, u_j + k3);\n u_j1 = u_j + (k1 + 2 * k2 + 2 * k3 + k4) / 6;\n u_j = u_j1;\n t_j = t_j + h;\n }\n }\n return u_j;\n },\n\n romberg: function romberg(f, a, b, order) {\n var i = 0;\n var h = (b - a) / 2;\n var x = [];\n var h1 = [];\n var g = [];\n var m, a1, j, k, I;\n while (i < order / 2) {\n I = f(a);\n for (j = a, k = 0; j <= b; j = j + h, k++) x[k] = j;\n m = x.length;\n for (j = 1; j < m - 1; j++) {\n I += (((j % 2) !== 0) ? 4 : 2) * f(x[j]);\n }\n I = (h / 3) * (I + f(b));\n g[i] = I;\n h /= 2;\n i++;\n }\n a1 = g.length;\n m = 1;\n while (a1 !== 1) {\n for (j = 0; j < a1 - 1; j++)\n h1[j] = ((Math.pow(4, m)) * g[j + 1] - g[j]) / (Math.pow(4, m) - 1);\n a1 = h1.length;\n g = h1;\n h1 = [];\n m++;\n }\n return g;\n },\n\n richardson: function richardson(X, f, x, h) {\n function pos(X, x) {\n var i = 0;\n var n = X.length;\n var p;\n for (; i < n; i++)\n if (X[i] === x) p = i;\n return p;\n }\n var h_min = Math.abs(x - X[pos(X, x) + 1]);\n var i = 0;\n var g = [];\n var h1 = [];\n var y1, y2, m, a, j;\n while (h >= h_min) {\n y1 = pos(X, x + h);\n y2 = pos(X, x);\n g[i] = (f[y1] - 2 * f[y2] + f[2 * y2 - y1]) / (h * h);\n h /= 2;\n i++;\n }\n a = g.length;\n m = 1;\n while (a != 1) {\n for (j = 0; j < a - 1; j++)\n h1[j] = ((Math.pow(4, m)) * g[j + 1] - g[j]) / (Math.pow(4, m) - 1);\n a = h1.length;\n g = h1;\n h1 = [];\n m++;\n }\n return g;\n },\n\n simpson: function simpson(f, a, b, n) {\n var h = (b - a) / n;\n var I = f(a);\n var x = [];\n var j = a;\n var k = 0;\n var i = 1;\n var m;\n for (; j <= b; j = j + h, k++)\n x[k] = j;\n m = x.length;\n for (; i < m - 1; i++) {\n I += ((i % 2 !== 0) ? 4 : 2) * f(x[i]);\n }\n return (h / 3) * (I + f(b));\n },\n\n hermite: function hermite(X, F, dF, value) {\n var n = X.length;\n var p = 0;\n var i = 0;\n var l = [];\n var dl = [];\n var A = [];\n var B = [];\n var j;\n for (; i < n; i++) {\n l[i] = 1;\n for (j = 0; j < n; j++) {\n if (i != j) l[i] *= (value - X[j]) / (X[i] - X[j]);\n }\n dl[i] = 0;\n for (j = 0; j < n; j++) {\n if (i != j) dl[i] += 1 / (X [i] - X[j]);\n }\n A[i] = (1 - 2 * (value - X[i]) * dl[i]) * (l[i] * l[i]);\n B[i] = (value - X[i]) * (l[i] * l[i]);\n p += (A[i] * F[i] + B[i] * dF[i]);\n }\n return p;\n },\n\n lagrange: function lagrange(X, F, value) {\n var p = 0;\n var i = 0;\n var j, l;\n var n = X.length;\n for (; i < n; i++) {\n l = F[i];\n for (j = 0; j < n; j++) {\n // calculating the lagrange polynomial L_i\n if (i != j) l *= (value - X[j]) / (X[i] - X[j]);\n }\n // adding the lagrange polynomials found above\n p += l;\n }\n return p;\n },\n\n cubic_spline: function cubic_spline(X, F, value) {\n var n = X.length;\n var i = 0, j;\n var A = [];\n var B = [];\n var alpha = [];\n var c = [];\n var h = [];\n var b = [];\n var d = [];\n for (; i < n - 1; i++)\n h[i] = X[i + 1] - X[i];\n alpha[0] = 0;\n for (i = 1; i < n - 1; i++) {\n alpha[i] = (3 / h[i]) * (F[i + 1] - F[i]) -\n (3 / h[i-1]) * (F[i] - F[i-1]);\n }\n for (i = 1; i < n - 1; i++) {\n A[i] = [];\n B[i] = [];\n A[i][i-1] = h[i-1];\n A[i][i] = 2 * (h[i - 1] + h[i]);\n A[i][i+1] = h[i];\n B[i][0] = alpha[i];\n }\n c = jStat.multiply(jStat.inv(A), B);\n for (j = 0; j < n - 1; j++) {\n b[j] = (F[j + 1] - F[j]) / h[j] - h[j] * (c[j + 1][0] + 2 * c[j][0]) / 3;\n d[j] = (c[j + 1][0] - c[j][0]) / (3 * h[j]);\n }\n for (j = 0; j < n; j++) {\n if (X[j] > value) break;\n }\n j -= 1;\n return F[j] + (value - X[j]) * b[j] + jStat.sq(value-X[j]) *\n c[j] + (value - X[j]) * jStat.sq(value - X[j]) * d[j];\n },\n\n gauss_quadrature: function gauss_quadrature() {\n throw new Error('gauss_quadrature not yet implemented');\n },\n\n PCA: function PCA(X) {\n var m = X.length;\n var n = X[0].length;\n var i = 0;\n var j, temp1;\n var u = [];\n var D = [];\n var result = [];\n var temp2 = [];\n var Y = [];\n var Bt = [];\n var B = [];\n var C = [];\n var V = [];\n var Vt = [];\n for (i = 0; i < m; i++) {\n u[i] = jStat.sum(X[i]) / n;\n }\n for (i = 0; i < n; i++) {\n B[i] = [];\n for(j = 0; j < m; j++) {\n B[i][j] = X[j][i] - u[j];\n }\n }\n B = jStat.transpose(B);\n for (i = 0; i < m; i++) {\n C[i] = [];\n for (j = 0; j < m; j++) {\n C[i][j] = (jStat.dot([B[i]], [B[j]])) / (n - 1);\n }\n }\n result = jStat.jacobi(C);\n V = result[0];\n D = result[1];\n Vt = jStat.transpose(V);\n for (i = 0; i < D.length; i++) {\n for (j = i; j < D.length; j++) {\n if(D[i] < D[j]) {\n temp1 = D[i];\n D[i] = D[j];\n D[j] = temp1;\n temp2 = Vt[i];\n Vt[i] = Vt[j];\n Vt[j] = temp2;\n }\n }\n }\n Bt = jStat.transpose(B);\n for (i = 0; i < m; i++) {\n Y[i] = [];\n for (j = 0; j < Bt.length; j++) {\n Y[i][j] = jStat.dot([Vt[i]], [Bt[j]]);\n }\n }\n return [X, D, Vt, Y];\n }\n});\n\n// extend jStat.fn with methods that require one argument\n(function(funcs) {\n for (var i = 0; i < funcs.length; i++) (function(passfunc) {\n jStat.fn[passfunc] = function(arg, func) {\n var tmpthis = this;\n // check for callback\n if (func) {\n setTimeout(function() {\n func.call(tmpthis, jStat.fn[passfunc].call(tmpthis, arg));\n }, 15);\n return this;\n }\n if (typeof jStat[passfunc](this, arg) === 'number')\n return jStat[passfunc](this, arg);\n else\n return jStat(jStat[passfunc](this, arg));\n };\n }(funcs[i]));\n}('add divide multiply subtract dot pow exp log abs norm angle'.split(' ')));\n\n}(jStat, Math));\n(function(jStat, Math) {\n\nvar slice = [].slice;\nvar isNumber = jStat.utils.isNumber;\nvar isArray = jStat.utils.isArray;\n\n// flag==true denotes use of sample standard deviation\n// Z Statistics\njStat.extend({\n // 2 different parameter lists:\n // (value, mean, sd)\n // (value, array, flag)\n zscore: function zscore() {\n var args = slice.call(arguments);\n if (isNumber(args[1])) {\n return (args[0] - args[1]) / args[2];\n }\n return (args[0] - jStat.mean(args[1])) / jStat.stdev(args[1], args[2]);\n },\n\n // 3 different paramter lists:\n // (value, mean, sd, sides)\n // (zscore, sides)\n // (value, array, sides, flag)\n ztest: function ztest() {\n var args = slice.call(arguments);\n var z;\n if (isArray(args[1])) {\n // (value, array, sides, flag)\n z = jStat.zscore(args[0],args[1],args[3]);\n return (args[2] === 1) ?\n (jStat.normal.cdf(-Math.abs(z), 0, 1)) :\n (jStat.normal.cdf(-Math.abs(z), 0, 1)*2);\n } else {\n if (args.length > 2) {\n // (value, mean, sd, sides)\n z = jStat.zscore(args[0],args[1],args[2]);\n return (args[3] === 1) ?\n (jStat.normal.cdf(-Math.abs(z),0,1)) :\n (jStat.normal.cdf(-Math.abs(z),0,1)* 2);\n } else {\n // (zscore, sides)\n z = args[0];\n return (args[1] === 1) ?\n (jStat.normal.cdf(-Math.abs(z),0,1)) :\n (jStat.normal.cdf(-Math.abs(z),0,1)*2);\n }\n }\n }\n});\n\njStat.extend(jStat.fn, {\n zscore: function zscore(value, flag) {\n return (value - this.mean()) / this.stdev(flag);\n },\n\n ztest: function ztest(value, sides, flag) {\n var zscore = Math.abs(this.zscore(value, flag));\n return (sides === 1) ?\n (jStat.normal.cdf(-zscore, 0, 1)) :\n (jStat.normal.cdf(-zscore, 0, 1) * 2);\n }\n});\n\n// T Statistics\njStat.extend({\n // 2 parameter lists\n // (value, mean, sd, n)\n // (value, array)\n tscore: function tscore() {\n var args = slice.call(arguments);\n return (args.length === 4) ?\n ((args[0] - args[1]) / (args[2] / Math.sqrt(args[3]))) :\n ((args[0] - jStat.mean(args[1])) /\n (jStat.stdev(args[1], true) / Math.sqrt(args[1].length)));\n },\n\n // 3 different paramter lists:\n // (value, mean, sd, n, sides)\n // (tscore, n, sides)\n // (value, array, sides)\n ttest: function ttest() {\n var args = slice.call(arguments);\n var tscore;\n if (args.length === 5) {\n tscore = Math.abs(jStat.tscore(args[0], args[1], args[2], args[3]));\n return (args[4] === 1) ?\n (jStat.studentt.cdf(-tscore, args[3]-1)) :\n (jStat.studentt.cdf(-tscore, args[3]-1)*2);\n }\n if (isNumber(args[1])) {\n tscore = Math.abs(args[0])\n return (args[2] == 1) ?\n (jStat.studentt.cdf(-tscore, args[1]-1)) :\n (jStat.studentt.cdf(-tscore, args[1]-1) * 2);\n }\n tscore = Math.abs(jStat.tscore(args[0], args[1]))\n return (args[2] == 1) ?\n (jStat.studentt.cdf(-tscore, args[1].length-1)) :\n (jStat.studentt.cdf(-tscore, args[1].length-1) * 2);\n }\n});\n\njStat.extend(jStat.fn, {\n tscore: function tscore(value) {\n return (value - this.mean()) / (this.stdev(true) / Math.sqrt(this.cols()));\n },\n\n ttest: function ttest(value, sides) {\n return (sides === 1) ?\n (1 - jStat.studentt.cdf(Math.abs(this.tscore(value)), this.cols()-1)) :\n (jStat.studentt.cdf(-Math.abs(this.tscore(value)), this.cols()-1)*2);\n }\n});\n\n// F Statistics\njStat.extend({\n // Paramter list is as follows:\n // (array1, array2, array3, ...)\n // or it is an array of arrays\n // array of arrays conversion\n anovafscore: function anovafscore() {\n var args = slice.call(arguments),\n expVar, sample, sampMean, sampSampMean, tmpargs, unexpVar, i, j;\n if (args.length === 1) {\n tmpargs = new Array(args[0].length);\n for (i = 0; i < args[0].length; i++) {\n tmpargs[i] = args[0][i];\n }\n args = tmpargs;\n }\n // Builds sample array\n sample = new Array();\n for (i = 0; i < args.length; i++) {\n sample = sample.concat(args[i]);\n }\n sampMean = jStat.mean(sample);\n // Computes the explained variance\n expVar = 0;\n for (i = 0; i < args.length; i++) {\n expVar = expVar + args[i].length * Math.pow(jStat.mean(args[i]) - sampMean, 2);\n }\n expVar /= (args.length - 1);\n // Computes unexplained variance\n unexpVar = 0;\n for (i = 0; i < args.length; i++) {\n sampSampMean = jStat.mean(args[i]);\n for (j = 0; j < args[i].length; j++) {\n unexpVar += Math.pow(args[i][j] - sampSampMean, 2);\n }\n }\n unexpVar /= (sample.length - args.length);\n return expVar / unexpVar;\n },\n\n // 2 different paramter setups\n // (array1, array2, array3, ...)\n // (anovafscore, df1, df2)\n anovaftest: function anovaftest() {\n var args = slice.call(arguments),\n df1, df2, n, i;\n if (isNumber(args[0])) {\n return 1 - jStat.centralF.cdf(args[0], args[1], args[2]);\n }\n var anovafscore = jStat.anovafscore(args);\n df1 = args.length - 1;\n n = 0;\n for (i = 0; i < args.length; i++) {\n n = n + args[i].length;\n }\n df2 = n - df1 - 1;\n return 1 - jStat.centralF.cdf(anovafscore, df1, df2);\n },\n\n ftest: function ftest(fscore, df1, df2) {\n return 1 - jStat.centralF.cdf(fscore, df1, df2);\n }\n});\n\njStat.extend(jStat.fn, {\n anovafscore: function anovafscore() {\n return jStat.anovafscore(this.toArray());\n },\n\n anovaftes: function anovaftes() {\n var n = 0;\n var i;\n for (i = 0; i < this.length; i++) {\n n = n + this[i].length;\n }\n return jStat.ftest(this.anovafscore(), this.length - 1, n - this.length);\n }\n});\n\n// Tukey's range test\njStat.extend({\n // 2 parameter lists\n // (mean1, mean2, n1, n2, sd)\n // (array1, array2, sd)\n qscore: function qscore() {\n var args = slice.call(arguments);\n var mean1, mean2, n1, n2, sd;\n if (isNumber(args[0])) {\n mean1 = args[0];\n mean2 = args[1];\n n1 = args[2];\n n2 = args[3];\n sd = args[4];\n } else {\n mean1 = jStat.mean(args[0]);\n mean2 = jStat.mean(args[1]);\n n1 = args[0].length;\n n2 = args[1].length;\n sd = args[2];\n }\n return Math.abs(mean1 - mean2) / (sd * Math.sqrt((1 / n1 + 1 / n2) / 2));\n },\n\n // 3 different parameter lists:\n // (qscore, n, k)\n // (mean1, mean2, n1, n2, sd, n, k)\n // (array1, array2, sd, n, k)\n qtest: function qtest() {\n var args = slice.call(arguments);\n\n var qscore;\n if (args.length === 3) {\n qscore = args[0];\n args = args.slice(1);\n } else if (args.length === 7) {\n qscore = jStat.qscore(args[0], args[1], args[2], args[3], args[4]);\n args = args.slice(5);\n } else {\n qscore = jStat.qscore(args[0], args[1], args[2]);\n args = args.slice(3);\n }\n\n var n = args[0];\n var k = args[1];\n\n return 1 - jStat.tukey.cdf(qscore, k, n - k);\n },\n\n tukeyhsd: function tukeyhsd(arrays) {\n var sd = jStat.pooledstdev(arrays);\n var means = arrays.map(function (arr) {return jStat.mean(arr);});\n var n = arrays.reduce(function (n, arr) {return n + arr.length;}, 0);\n\n var results = [];\n for (var i = 0; i < arrays.length; ++i) {\n for (var j = i + 1; j < arrays.length; ++j) {\n var p = jStat.qtest(means[i], means[j], arrays[i].length, arrays[j].length, sd, n, arrays.length);\n results.push([[i, j], p]);\n }\n }\n\n return results;\n }\n});\n\n// Error Bounds\njStat.extend({\n // 2 different parameter setups\n // (value, alpha, sd, n)\n // (value, alpha, array)\n normalci: function normalci() {\n var args = slice.call(arguments),\n ans = new Array(2),\n change;\n if (args.length === 4) {\n change = Math.abs(jStat.normal.inv(args[1] / 2, 0, 1) *\n args[2] / Math.sqrt(args[3]));\n } else {\n change = Math.abs(jStat.normal.inv(args[1] / 2, 0, 1) *\n jStat.stdev(args[2]) / Math.sqrt(args[2].length));\n }\n ans[0] = args[0] - change;\n ans[1] = args[0] + change;\n return ans;\n },\n\n // 2 different parameter setups\n // (value, alpha, sd, n)\n // (value, alpha, array)\n tci: function tci() {\n var args = slice.call(arguments),\n ans = new Array(2),\n change;\n if (args.length === 4) {\n change = Math.abs(jStat.studentt.inv(args[1] / 2, args[3] - 1) *\n args[2] / Math.sqrt(args[3]));\n } else {\n change = Math.abs(jStat.studentt.inv(args[1] / 2, args[2].length - 1) *\n jStat.stdev(args[2], true) / Math.sqrt(args[2].length));\n }\n ans[0] = args[0] - change;\n ans[1] = args[0] + change;\n return ans;\n },\n\n significant: function significant(pvalue, alpha) {\n return pvalue < alpha;\n }\n});\n\njStat.extend(jStat.fn, {\n normalci: function normalci(value, alpha) {\n return jStat.normalci(value, alpha, this.toArray());\n },\n\n tci: function tci(value, alpha) {\n return jStat.tci(value, alpha, this.toArray());\n }\n});\n\n// internal method for calculating the z-score for a difference of proportions test\nfunction differenceOfProportions(p1, n1, p2, n2) {\n if (p1 > 1 || p2 > 1 || p1 <= 0 || p2 <= 0) {\n throw new Error(\"Proportions should be greater than 0 and less than 1\")\n }\n var pooled = (p1 * n1 + p2 * n2) / (n1 + n2);\n var se = Math.sqrt(pooled * (1 - pooled) * ((1/n1) + (1/n2)));\n return (p1 - p2) / se;\n}\n\n// Difference of Proportions\njStat.extend(jStat.fn, {\n oneSidedDifferenceOfProportions: function oneSidedDifferenceOfProportions(p1, n1, p2, n2) {\n var z = differenceOfProportions(p1, n1, p2, n2);\n return jStat.ztest(z, 1);\n },\n\n twoSidedDifferenceOfProportions: function twoSidedDifferenceOfProportions(p1, n1, p2, n2) {\n var z = differenceOfProportions(p1, n1, p2, n2);\n return jStat.ztest(z, 2);\n }\n});\n\n}(jStat, Math));\njStat.models = (function(){\n function sub_regress(exog) {\n var var_count = exog[0].length;\n var modelList = jStat.arange(var_count).map(function(endog_index) {\n var exog_index =\n jStat.arange(var_count).filter(function(i){return i!==endog_index});\n return ols(jStat.col(exog, endog_index).map(function(x){ return x[0] }),\n jStat.col(exog, exog_index))\n });\n return modelList;\n }\n\n // do OLS model regress\n // exog have include const columns ,it will not generate it .In fact, exog is\n // \"design matrix\" look at\n //https://en.wikipedia.org/wiki/Design_matrix\n function ols(endog, exog) {\n var nobs = endog.length;\n var df_model = exog[0].length - 1;\n var df_resid = nobs-df_model - 1;\n var coef = jStat.lstsq(exog, endog);\n var predict =\n jStat.multiply(exog, coef.map(function(x) { return [x] }))\n .map(function(p) { return p[0] });\n var resid = jStat.subtract(endog, predict);\n var ybar = jStat.mean(endog);\n // constant cause problem\n // var SST = jStat.sum(endog.map(function(y) {\n // return Math.pow(y-ybar,2);\n // }));\n var SSE = jStat.sum(predict.map(function(f) {\n return Math.pow(f - ybar, 2);\n }));\n var SSR = jStat.sum(endog.map(function(y, i) {\n return Math.pow(y - predict[i], 2);\n }));\n var SST = SSE + SSR;\n var R2 = (SSE / SST);\n return {\n exog:exog,\n endog:endog,\n nobs:nobs,\n df_model:df_model,\n df_resid:df_resid,\n coef:coef,\n predict:predict,\n resid:resid,\n ybar:ybar,\n SST:SST,\n SSE:SSE,\n SSR:SSR,\n R2:R2\n };\n }\n\n // H0: b_I=0\n // H1: b_I!=0\n function t_test(model) {\n var subModelList = sub_regress(model.exog);\n //var sigmaHat=jStat.stdev(model.resid);\n var sigmaHat = Math.sqrt(model.SSR / (model.df_resid));\n var seBetaHat = subModelList.map(function(mod) {\n var SST = mod.SST;\n var R2 = mod.R2;\n return sigmaHat / Math.sqrt(SST * (1 - R2));\n });\n var tStatistic = model.coef.map(function(coef, i) {\n return (coef - 0) / seBetaHat[i];\n });\n var pValue = tStatistic.map(function(t) {\n var leftppf = jStat.studentt.cdf(t, model.df_resid);\n return (leftppf > 0.5 ? 1 - leftppf : leftppf) * 2;\n });\n var c = jStat.studentt.inv(0.975, model.df_resid);\n var interval95 = model.coef.map(function(coef, i) {\n var d = c * seBetaHat[i];\n return [coef - d, coef + d];\n })\n return {\n se: seBetaHat,\n t: tStatistic,\n p: pValue,\n sigmaHat: sigmaHat,\n interval95: interval95\n };\n }\n\n function F_test(model) {\n var F_statistic =\n (model.R2 / model.df_model) / ((1 - model.R2) / model.df_resid);\n var fcdf = function(x, n1, n2) {\n return jStat.beta.cdf(x / (n2 / n1 + x), n1 / 2, n2 / 2)\n }\n var pvalue = 1 - fcdf(F_statistic, model.df_model, model.df_resid);\n return { F_statistic: F_statistic, pvalue: pvalue };\n }\n\n function ols_wrap(endog, exog) {\n var model = ols(endog,exog);\n var ttest = t_test(model);\n var ftest = F_test(model);\n // Provide the Wherry / Ezekiel / McNemar / Cohen Adjusted R^2\n // Which matches the 'adjusted R^2' provided by R's lm package\n var adjust_R2 =\n 1 - (1 - model.R2) * ((model.nobs - 1) / (model.df_resid));\n model.t = ttest;\n model.f = ftest;\n model.adjust_R2 = adjust_R2;\n return model;\n }\n\n return { ols: ols_wrap };\n})();\n//To regress, simply build X matrix\n//(append column of 1's) using\n//buildxmatrix and build the Y\n//matrix using buildymatrix\n//(simply the transpose)\n//and run regress.\n\n\n\n//Regressions\n\njStat.extend({\n buildxmatrix: function buildxmatrix(){\n //Parameters will be passed in as such\n //(array1,array2,array3,...)\n //as (x1,x2,x3,...)\n //needs to be (1,x1,x2,x3,...)\n var matrixRows = new Array(arguments.length);\n for(var i=0;i1){\n result = [];\n for (i = 0; i < A.rows(); i++) {\n result[i] = [];\n for (j = 0; j < B.cols(); j++) {\n sum = 0;\n for (k = 0; k < A.cols(); k++) {\n sum += A.toArray()[i][k] * B.toArray()[k][j];\n }\n result[i][j] = sum;\n }\n }\n return jStat(result);\n }\n result = [];\n for (i = 0; i < A.rows(); i++) {\n result[i] = [];\n for (j = 0; j < B.cols(); j++) {\n sum = 0;\n for (k = 0; k < A.cols(); k++) {\n sum += A.toArray()[i][k] * B.toArray()[j];\n }\n result[i][j] = sum;\n }\n }\n return jStat(result);\n }\n },\n\n //regress and regresst to be fixed\n\n regress: function regress(jMatX,jMatY){\n //print(\"regressin!\");\n //print(jMatX.toArray());\n var innerinv = jStat.xtranspxinv(jMatX);\n //print(innerinv);\n var xtransp = jMatX.transpose();\n var next = jStat.matrixmult(jStat(innerinv),xtransp);\n return jStat.matrixmult(next,jMatY);\n\n },\n\n regresst: function regresst(jMatX,jMatY,sides){\n var beta = jStat.regress(jMatX,jMatY);\n\n var compile = {};\n compile.anova = {};\n var jMatYBar = jStat.jMatYBar(jMatX, beta);\n compile.yBar = jMatYBar;\n var yAverage = jMatY.mean();\n compile.anova.residuals = jStat.residuals(jMatY, jMatYBar);\n\n compile.anova.ssr = jStat.ssr(jMatYBar, yAverage);\n compile.anova.msr = compile.anova.ssr / (jMatX[0].length - 1);\n\n compile.anova.sse = jStat.sse(jMatY, jMatYBar);\n compile.anova.mse =\n compile.anova.sse / (jMatY.length - (jMatX[0].length - 1) - 1);\n\n compile.anova.sst = jStat.sst(jMatY, yAverage);\n compile.anova.mst = compile.anova.sst / (jMatY.length - 1);\n\n compile.anova.r2 = 1 - (compile.anova.sse / compile.anova.sst);\n if (compile.anova.r2 < 0) compile.anova.r2 = 0;\n\n compile.anova.fratio = compile.anova.msr / compile.anova.mse;\n compile.anova.pvalue =\n jStat.anovaftest(compile.anova.fratio,\n jMatX[0].length - 1,\n jMatY.length - (jMatX[0].length - 1) - 1);\n\n compile.anova.rmse = Math.sqrt(compile.anova.mse);\n\n compile.anova.r2adj = 1 - (compile.anova.mse / compile.anova.mst);\n if (compile.anova.r2adj < 0) compile.anova.r2adj = 0;\n\n compile.stats = new Array(jMatX[0].length);\n var covar = jStat.xtranspxinv(jMatX);\n var sds, ts, ps;\n\n for(var i=0; i Occurrence Index bitmap.\n// YYYY -> DSL Method Type bitmap.\n// ZZZZZZZZZZZZZZZ -> Rule short Index bitmap.\n// TTTTTTTTT -> alternation alternative index bitmap\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getKeyForAutomaticLookahead = exports.AT_LEAST_ONE_SEP_IDX = exports.MANY_SEP_IDX = exports.AT_LEAST_ONE_IDX = exports.MANY_IDX = exports.OPTION_IDX = exports.OR_IDX = exports.BITS_FOR_ALT_IDX = exports.BITS_FOR_RULE_IDX = exports.BITS_FOR_OCCURRENCE_IDX = exports.BITS_FOR_METHOD_TYPE = void 0;\nexports.BITS_FOR_METHOD_TYPE = 4;\nexports.BITS_FOR_OCCURRENCE_IDX = 8;\nexports.BITS_FOR_RULE_IDX = 12;\n// TODO: validation, this means that there may at most 2^8 --> 256 alternatives for an alternation.\nexports.BITS_FOR_ALT_IDX = 8;\n// short string used as part of mapping keys.\n// being short improves the performance when composing KEYS for maps out of these\n// The 5 - 8 bits (16 possible values, are reserved for the DSL method indices)\nexports.OR_IDX = 1 << exports.BITS_FOR_OCCURRENCE_IDX;\nexports.OPTION_IDX = 2 << exports.BITS_FOR_OCCURRENCE_IDX;\nexports.MANY_IDX = 3 << exports.BITS_FOR_OCCURRENCE_IDX;\nexports.AT_LEAST_ONE_IDX = 4 << exports.BITS_FOR_OCCURRENCE_IDX;\nexports.MANY_SEP_IDX = 5 << exports.BITS_FOR_OCCURRENCE_IDX;\nexports.AT_LEAST_ONE_SEP_IDX = 6 << exports.BITS_FOR_OCCURRENCE_IDX;\n// this actually returns a number, but it is always used as a string (object prop key)\nfunction getKeyForAutomaticLookahead(ruleIdx, dslMethodIdx, occurrence) {\n return occurrence | dslMethodIdx | ruleIdx;\n}\nexports.getKeyForAutomaticLookahead = getKeyForAutomaticLookahead;\nvar BITS_START_FOR_ALT_IDX = 32 - exports.BITS_FOR_ALT_IDX;\n//# sourceMappingURL=keys.js.map","var Stack = require('./_Stack'),\n equalArrays = require('./_equalArrays'),\n equalByTag = require('./_equalByTag'),\n equalObjects = require('./_equalObjects'),\n getTag = require('./_getTag'),\n isArray = require('./isArray'),\n isBuffer = require('./isBuffer'),\n isTypedArray = require('./isTypedArray');\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1;\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n arrayTag = '[object Array]',\n objectTag = '[object Object]';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * A specialized version of `baseIsEqual` for arrays and objects which performs\n * deep comparisons and tracks traversed objects enabling objects with circular\n * references to be compared.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} [stack] Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) {\n var objIsArr = isArray(object),\n othIsArr = isArray(other),\n objTag = objIsArr ? arrayTag : getTag(object),\n othTag = othIsArr ? arrayTag : getTag(other);\n\n objTag = objTag == argsTag ? objectTag : objTag;\n othTag = othTag == argsTag ? objectTag : othTag;\n\n var objIsObj = objTag == objectTag,\n othIsObj = othTag == objectTag,\n isSameTag = objTag == othTag;\n\n if (isSameTag && isBuffer(object)) {\n if (!isBuffer(other)) {\n return false;\n }\n objIsArr = true;\n objIsObj = false;\n }\n if (isSameTag && !objIsObj) {\n stack || (stack = new Stack);\n return (objIsArr || isTypedArray(object))\n ? equalArrays(object, other, bitmask, customizer, equalFunc, stack)\n : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack);\n }\n if (!(bitmask & COMPARE_PARTIAL_FLAG)) {\n var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),\n othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');\n\n if (objIsWrapped || othIsWrapped) {\n var objUnwrapped = objIsWrapped ? object.value() : object,\n othUnwrapped = othIsWrapped ? other.value() : other;\n\n stack || (stack = new Stack);\n return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack);\n }\n }\n if (!isSameTag) {\n return false;\n }\n stack || (stack = new Stack);\n return equalObjects(object, other, bitmask, customizer, equalFunc, stack);\n}\n\nmodule.exports = baseIsEqualDeep;\n","var baseIsTypedArray = require('./_baseIsTypedArray'),\n baseUnary = require('./_baseUnary'),\n nodeUtil = require('./_nodeUtil');\n\n/* Node.js helper references. */\nvar nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;\n\n/**\n * Checks if `value` is classified as a typed array.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n * @example\n *\n * _.isTypedArray(new Uint8Array);\n * // => true\n *\n * _.isTypedArray([]);\n * // => false\n */\nvar isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;\n\nmodule.exports = isTypedArray;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.applyMixins = void 0;\nfunction applyMixins(derivedCtor, baseCtors) {\n baseCtors.forEach(function (baseCtor) {\n var baseProto = baseCtor.prototype;\n Object.getOwnPropertyNames(baseProto).forEach(function (propName) {\n if (propName === \"constructor\") {\n return;\n }\n var basePropDescriptor = Object.getOwnPropertyDescriptor(baseProto, propName);\n // Handle Accessors\n if (basePropDescriptor &&\n (basePropDescriptor.get || basePropDescriptor.set)) {\n Object.defineProperty(derivedCtor.prototype, propName, basePropDescriptor);\n }\n else {\n derivedCtor.prototype[propName] = baseCtor.prototype[propName];\n }\n });\n });\n}\nexports.applyMixins = applyMixins;\n//# sourceMappingURL=apply_mixins.js.map","/**\n * A specialized version of `matchesProperty` for source values suitable\n * for strict equality comparisons, i.e. `===`.\n *\n * @private\n * @param {string} key The key of the property to get.\n * @param {*} srcValue The value to match.\n * @returns {Function} Returns the new spec function.\n */\nfunction matchesStrictComparable(key, srcValue) {\n return function(object) {\n if (object == null) {\n return false;\n }\n return object[key] === srcValue &&\n (srcValue !== undefined || (key in Object(object)));\n };\n}\n\nmodule.exports = matchesStrictComparable;\n","var cloneArrayBuffer = require('./_cloneArrayBuffer'),\n cloneDataView = require('./_cloneDataView'),\n cloneRegExp = require('./_cloneRegExp'),\n cloneSymbol = require('./_cloneSymbol'),\n cloneTypedArray = require('./_cloneTypedArray');\n\n/** `Object#toString` result references. */\nvar boolTag = '[object Boolean]',\n dateTag = '[object Date]',\n mapTag = '[object Map]',\n numberTag = '[object Number]',\n regexpTag = '[object RegExp]',\n setTag = '[object Set]',\n stringTag = '[object String]',\n symbolTag = '[object Symbol]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n dataViewTag = '[object DataView]',\n float32Tag = '[object Float32Array]',\n float64Tag = '[object Float64Array]',\n int8Tag = '[object Int8Array]',\n int16Tag = '[object Int16Array]',\n int32Tag = '[object Int32Array]',\n uint8Tag = '[object Uint8Array]',\n uint8ClampedTag = '[object Uint8ClampedArray]',\n uint16Tag = '[object Uint16Array]',\n uint32Tag = '[object Uint32Array]';\n\n/**\n * Initializes an object clone based on its `toStringTag`.\n *\n * **Note:** This function only supports cloning values with tags of\n * `Boolean`, `Date`, `Error`, `Map`, `Number`, `RegExp`, `Set`, or `String`.\n *\n * @private\n * @param {Object} object The object to clone.\n * @param {string} tag The `toStringTag` of the object to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the initialized clone.\n */\nfunction initCloneByTag(object, tag, isDeep) {\n var Ctor = object.constructor;\n switch (tag) {\n case arrayBufferTag:\n return cloneArrayBuffer(object);\n\n case boolTag:\n case dateTag:\n return new Ctor(+object);\n\n case dataViewTag:\n return cloneDataView(object, isDeep);\n\n case float32Tag: case float64Tag:\n case int8Tag: case int16Tag: case int32Tag:\n case uint8Tag: case uint8ClampedTag: case uint16Tag: case uint32Tag:\n return cloneTypedArray(object, isDeep);\n\n case mapTag:\n return new Ctor;\n\n case numberTag:\n case stringTag:\n return new Ctor(object);\n\n case regexpTag:\n return cloneRegExp(object);\n\n case setTag:\n return new Ctor;\n\n case symbolTag:\n return cloneSymbol(object);\n }\n}\n\nmodule.exports = initCloneByTag;\n","\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.RecognizerEngine = void 0;\nvar isEmpty_1 = __importDefault(require(\"lodash/isEmpty\"));\nvar isArray_1 = __importDefault(require(\"lodash/isArray\"));\nvar flatten_1 = __importDefault(require(\"lodash/flatten\"));\nvar every_1 = __importDefault(require(\"lodash/every\"));\nvar uniq_1 = __importDefault(require(\"lodash/uniq\"));\nvar isObject_1 = __importDefault(require(\"lodash/isObject\"));\nvar has_1 = __importDefault(require(\"lodash/has\"));\nvar values_1 = __importDefault(require(\"lodash/values\"));\nvar reduce_1 = __importDefault(require(\"lodash/reduce\"));\nvar clone_1 = __importDefault(require(\"lodash/clone\"));\nvar keys_1 = require(\"../../grammar/keys\");\nvar exceptions_public_1 = require(\"../../exceptions_public\");\nvar lookahead_1 = require(\"../../grammar/lookahead\");\nvar interpreter_1 = require(\"../../grammar/interpreter\");\nvar parser_1 = require(\"../parser\");\nvar recoverable_1 = require(\"./recoverable\");\nvar tokens_public_1 = require(\"../../../scan/tokens_public\");\nvar tokens_1 = require(\"../../../scan/tokens\");\n/**\n * This trait is responsible for the runtime parsing engine\n * Used by the official API (recognizer_api.ts)\n */\nvar RecognizerEngine = /** @class */ (function () {\n function RecognizerEngine() {\n }\n RecognizerEngine.prototype.initRecognizerEngine = function (tokenVocabulary, config) {\n this.className = this.constructor.name;\n // TODO: would using an ES6 Map or plain object be faster (CST building scenario)\n this.shortRuleNameToFull = {};\n this.fullRuleNameToShort = {};\n this.ruleShortNameIdx = 256;\n this.tokenMatcher = tokens_1.tokenStructuredMatcherNoCategories;\n this.subruleIdx = 0;\n this.definedRulesNames = [];\n this.tokensMap = {};\n this.isBackTrackingStack = [];\n this.RULE_STACK = [];\n this.RULE_OCCURRENCE_STACK = [];\n this.gastProductionsCache = {};\n if ((0, has_1.default)(config, \"serializedGrammar\")) {\n throw Error(\"The Parser's configuration can no longer contain a property.\\n\" +\n \"\\tSee: https://chevrotain.io/docs/changes/BREAKING_CHANGES.html#_6-0-0\\n\" +\n \"\\tFor Further details.\");\n }\n if ((0, isArray_1.default)(tokenVocabulary)) {\n // This only checks for Token vocabularies provided as arrays.\n // That is good enough because the main objective is to detect users of pre-V4.0 APIs\n // rather than all edge cases of empty Token vocabularies.\n if ((0, isEmpty_1.default)(tokenVocabulary)) {\n throw Error(\"A Token Vocabulary cannot be empty.\\n\" +\n \"\\tNote that the first argument for the parser constructor\\n\" +\n \"\\tis no longer a Token vector (since v4.0).\");\n }\n if (typeof tokenVocabulary[0].startOffset === \"number\") {\n throw Error(\"The Parser constructor no longer accepts a token vector as the first argument.\\n\" +\n \"\\tSee: https://chevrotain.io/docs/changes/BREAKING_CHANGES.html#_4-0-0\\n\" +\n \"\\tFor Further details.\");\n }\n }\n if ((0, isArray_1.default)(tokenVocabulary)) {\n this.tokensMap = (0, reduce_1.default)(tokenVocabulary, function (acc, tokType) {\n acc[tokType.name] = tokType;\n return acc;\n }, {});\n }\n else if ((0, has_1.default)(tokenVocabulary, \"modes\") &&\n (0, every_1.default)((0, flatten_1.default)((0, values_1.default)(tokenVocabulary.modes)), tokens_1.isTokenType)) {\n var allTokenTypes_1 = (0, flatten_1.default)((0, values_1.default)(tokenVocabulary.modes));\n var uniqueTokens = (0, uniq_1.default)(allTokenTypes_1);\n this.tokensMap = (0, reduce_1.default)(uniqueTokens, function (acc, tokType) {\n acc[tokType.name] = tokType;\n return acc;\n }, {});\n }\n else if ((0, isObject_1.default)(tokenVocabulary)) {\n this.tokensMap = (0, clone_1.default)(tokenVocabulary);\n }\n else {\n throw new Error(\" argument must be An Array of Token constructors,\" +\n \" A dictionary of Token constructors or an IMultiModeLexerDefinition\");\n }\n // always add EOF to the tokenNames -> constructors map. it is useful to assure all the input has been\n // parsed with a clear error message (\"expecting EOF but found ...\")\n this.tokensMap[\"EOF\"] = tokens_public_1.EOF;\n var allTokenTypes = (0, has_1.default)(tokenVocabulary, \"modes\")\n ? (0, flatten_1.default)((0, values_1.default)(tokenVocabulary.modes))\n : (0, values_1.default)(tokenVocabulary);\n var noTokenCategoriesUsed = (0, every_1.default)(allTokenTypes, function (tokenConstructor) {\n return (0, isEmpty_1.default)(tokenConstructor.categoryMatches);\n });\n this.tokenMatcher = noTokenCategoriesUsed\n ? tokens_1.tokenStructuredMatcherNoCategories\n : tokens_1.tokenStructuredMatcher;\n // Because ES2015+ syntax should be supported for creating Token classes\n // We cannot assume that the Token classes were created using the \"extendToken\" utilities\n // Therefore we must augment the Token classes both on Lexer initialization and on Parser initialization\n (0, tokens_1.augmentTokenTypes)((0, values_1.default)(this.tokensMap));\n };\n RecognizerEngine.prototype.defineRule = function (ruleName, impl, config) {\n if (this.selfAnalysisDone) {\n throw Error(\"Grammar rule <\".concat(ruleName, \"> may not be defined after the 'performSelfAnalysis' method has been called'\\n\") +\n \"Make sure that all grammar rule definitions are done before 'performSelfAnalysis' is called.\");\n }\n var resyncEnabled = (0, has_1.default)(config, \"resyncEnabled\")\n ? config.resyncEnabled // assumes end user provides the correct config value/type\n : parser_1.DEFAULT_RULE_CONFIG.resyncEnabled;\n var recoveryValueFunc = (0, has_1.default)(config, \"recoveryValueFunc\")\n ? config.recoveryValueFunc // assumes end user provides the correct config value/type\n : parser_1.DEFAULT_RULE_CONFIG.recoveryValueFunc;\n // performance optimization: Use small integers as keys for the longer human readable \"full\" rule names.\n // this greatly improves Map access time (as much as 8% for some performance benchmarks).\n var shortName = this.ruleShortNameIdx << (keys_1.BITS_FOR_METHOD_TYPE + keys_1.BITS_FOR_OCCURRENCE_IDX);\n this.ruleShortNameIdx++;\n this.shortRuleNameToFull[shortName] = ruleName;\n this.fullRuleNameToShort[ruleName] = shortName;\n var invokeRuleWithTry;\n // Micro optimization, only check the condition **once** on rule definition\n // instead of **every single** rule invocation.\n if (this.outputCst === true) {\n invokeRuleWithTry = function invokeRuleWithTry() {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n try {\n this.ruleInvocationStateUpdate(shortName, ruleName, this.subruleIdx);\n impl.apply(this, args);\n var cst = this.CST_STACK[this.CST_STACK.length - 1];\n this.cstPostRule(cst);\n return cst;\n }\n catch (e) {\n return this.invokeRuleCatch(e, resyncEnabled, recoveryValueFunc);\n }\n finally {\n this.ruleFinallyStateUpdate();\n }\n };\n }\n else {\n invokeRuleWithTry = function invokeRuleWithTryCst() {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n try {\n this.ruleInvocationStateUpdate(shortName, ruleName, this.subruleIdx);\n return impl.apply(this, args);\n }\n catch (e) {\n return this.invokeRuleCatch(e, resyncEnabled, recoveryValueFunc);\n }\n finally {\n this.ruleFinallyStateUpdate();\n }\n };\n }\n var wrappedGrammarRule = Object.assign(invokeRuleWithTry, { ruleName: ruleName, originalGrammarAction: impl });\n return wrappedGrammarRule;\n };\n RecognizerEngine.prototype.invokeRuleCatch = function (e, resyncEnabledConfig, recoveryValueFunc) {\n var isFirstInvokedRule = this.RULE_STACK.length === 1;\n // note the reSync is always enabled for the first rule invocation, because we must always be able to\n // reSync with EOF and just output some INVALID ParseTree\n // during backtracking reSync recovery is disabled, otherwise we can't be certain the backtracking\n // path is really the most valid one\n var reSyncEnabled = resyncEnabledConfig && !this.isBackTracking() && this.recoveryEnabled;\n if ((0, exceptions_public_1.isRecognitionException)(e)) {\n var recogError = e;\n if (reSyncEnabled) {\n var reSyncTokType = this.findReSyncTokenType();\n if (this.isInCurrentRuleReSyncSet(reSyncTokType)) {\n recogError.resyncedTokens = this.reSyncTo(reSyncTokType);\n if (this.outputCst) {\n var partialCstResult = this.CST_STACK[this.CST_STACK.length - 1];\n partialCstResult.recoveredNode = true;\n return partialCstResult;\n }\n else {\n return recoveryValueFunc(e);\n }\n }\n else {\n if (this.outputCst) {\n var partialCstResult = this.CST_STACK[this.CST_STACK.length - 1];\n partialCstResult.recoveredNode = true;\n recogError.partialCstResult = partialCstResult;\n }\n // to be handled Further up the call stack\n throw recogError;\n }\n }\n else if (isFirstInvokedRule) {\n // otherwise a Redundant input error will be created as well and we cannot guarantee that this is indeed the case\n this.moveToTerminatedState();\n // the parser should never throw one of its own errors outside its flow.\n // even if error recovery is disabled\n return recoveryValueFunc(e);\n }\n else {\n // to be recovered Further up the call stack\n throw recogError;\n }\n }\n else {\n // some other Error type which we don't know how to handle (for example a built in JavaScript Error)\n throw e;\n }\n };\n // Implementation of parsing DSL\n RecognizerEngine.prototype.optionInternal = function (actionORMethodDef, occurrence) {\n var key = this.getKeyForAutomaticLookahead(keys_1.OPTION_IDX, occurrence);\n return this.optionInternalLogic(actionORMethodDef, occurrence, key);\n };\n RecognizerEngine.prototype.optionInternalLogic = function (actionORMethodDef, occurrence, key) {\n var _this = this;\n var lookAheadFunc = this.getLaFuncFromCache(key);\n var action;\n if (typeof actionORMethodDef !== \"function\") {\n action = actionORMethodDef.DEF;\n var predicate_1 = actionORMethodDef.GATE;\n // predicate present\n if (predicate_1 !== undefined) {\n var orgLookaheadFunction_1 = lookAheadFunc;\n lookAheadFunc = function () {\n return predicate_1.call(_this) && orgLookaheadFunction_1.call(_this);\n };\n }\n }\n else {\n action = actionORMethodDef;\n }\n if (lookAheadFunc.call(this) === true) {\n return action.call(this);\n }\n return undefined;\n };\n RecognizerEngine.prototype.atLeastOneInternal = function (prodOccurrence, actionORMethodDef) {\n var laKey = this.getKeyForAutomaticLookahead(keys_1.AT_LEAST_ONE_IDX, prodOccurrence);\n return this.atLeastOneInternalLogic(prodOccurrence, actionORMethodDef, laKey);\n };\n RecognizerEngine.prototype.atLeastOneInternalLogic = function (prodOccurrence, actionORMethodDef, key) {\n var _this = this;\n var lookAheadFunc = this.getLaFuncFromCache(key);\n var action;\n if (typeof actionORMethodDef !== \"function\") {\n action = actionORMethodDef.DEF;\n var predicate_2 = actionORMethodDef.GATE;\n // predicate present\n if (predicate_2 !== undefined) {\n var orgLookaheadFunction_2 = lookAheadFunc;\n lookAheadFunc = function () {\n return predicate_2.call(_this) && orgLookaheadFunction_2.call(_this);\n };\n }\n }\n else {\n action = actionORMethodDef;\n }\n if (lookAheadFunc.call(this) === true) {\n var notStuck = this.doSingleRepetition(action);\n while (lookAheadFunc.call(this) === true &&\n notStuck === true) {\n notStuck = this.doSingleRepetition(action);\n }\n }\n else {\n throw this.raiseEarlyExitException(prodOccurrence, lookahead_1.PROD_TYPE.REPETITION_MANDATORY, actionORMethodDef.ERR_MSG);\n }\n // note that while it may seem that this can cause an error because by using a recursive call to\n // AT_LEAST_ONE we change the grammar to AT_LEAST_TWO, AT_LEAST_THREE ... , the possible recursive call\n // from the tryInRepetitionRecovery(...) will only happen IFF there really are TWO/THREE/.... items.\n // Performance optimization: \"attemptInRepetitionRecovery\" will be defined as NOOP unless recovery is enabled\n this.attemptInRepetitionRecovery(this.atLeastOneInternal, [prodOccurrence, actionORMethodDef], lookAheadFunc, keys_1.AT_LEAST_ONE_IDX, prodOccurrence, interpreter_1.NextTerminalAfterAtLeastOneWalker);\n };\n RecognizerEngine.prototype.atLeastOneSepFirstInternal = function (prodOccurrence, options) {\n var laKey = this.getKeyForAutomaticLookahead(keys_1.AT_LEAST_ONE_SEP_IDX, prodOccurrence);\n this.atLeastOneSepFirstInternalLogic(prodOccurrence, options, laKey);\n };\n RecognizerEngine.prototype.atLeastOneSepFirstInternalLogic = function (prodOccurrence, options, key) {\n var _this = this;\n var action = options.DEF;\n var separator = options.SEP;\n var firstIterationLookaheadFunc = this.getLaFuncFromCache(key);\n // 1st iteration\n if (firstIterationLookaheadFunc.call(this) === true) {\n ;\n action.call(this);\n // TODO: Optimization can move this function construction into \"attemptInRepetitionRecovery\"\n // because it is only needed in error recovery scenarios.\n var separatorLookAheadFunc = function () {\n return _this.tokenMatcher(_this.LA(1), separator);\n };\n // 2nd..nth iterations\n while (this.tokenMatcher(this.LA(1), separator) === true) {\n // note that this CONSUME will never enter recovery because\n // the separatorLookAheadFunc checks that the separator really does exist.\n this.CONSUME(separator);\n action.call(this);\n }\n // Performance optimization: \"attemptInRepetitionRecovery\" will be defined as NOOP unless recovery is enabled\n this.attemptInRepetitionRecovery(this.repetitionSepSecondInternal, [\n prodOccurrence,\n separator,\n separatorLookAheadFunc,\n action,\n interpreter_1.NextTerminalAfterAtLeastOneSepWalker\n ], separatorLookAheadFunc, keys_1.AT_LEAST_ONE_SEP_IDX, prodOccurrence, interpreter_1.NextTerminalAfterAtLeastOneSepWalker);\n }\n else {\n throw this.raiseEarlyExitException(prodOccurrence, lookahead_1.PROD_TYPE.REPETITION_MANDATORY_WITH_SEPARATOR, options.ERR_MSG);\n }\n };\n RecognizerEngine.prototype.manyInternal = function (prodOccurrence, actionORMethodDef) {\n var laKey = this.getKeyForAutomaticLookahead(keys_1.MANY_IDX, prodOccurrence);\n return this.manyInternalLogic(prodOccurrence, actionORMethodDef, laKey);\n };\n RecognizerEngine.prototype.manyInternalLogic = function (prodOccurrence, actionORMethodDef, key) {\n var _this = this;\n var lookaheadFunction = this.getLaFuncFromCache(key);\n var action;\n if (typeof actionORMethodDef !== \"function\") {\n action = actionORMethodDef.DEF;\n var predicate_3 = actionORMethodDef.GATE;\n // predicate present\n if (predicate_3 !== undefined) {\n var orgLookaheadFunction_3 = lookaheadFunction;\n lookaheadFunction = function () {\n return predicate_3.call(_this) && orgLookaheadFunction_3.call(_this);\n };\n }\n }\n else {\n action = actionORMethodDef;\n }\n var notStuck = true;\n while (lookaheadFunction.call(this) === true && notStuck === true) {\n notStuck = this.doSingleRepetition(action);\n }\n // Performance optimization: \"attemptInRepetitionRecovery\" will be defined as NOOP unless recovery is enabled\n this.attemptInRepetitionRecovery(this.manyInternal, [prodOccurrence, actionORMethodDef], lookaheadFunction, keys_1.MANY_IDX, prodOccurrence, interpreter_1.NextTerminalAfterManyWalker, \n // The notStuck parameter is only relevant when \"attemptInRepetitionRecovery\"\n // is invoked from manyInternal, in the MANY_SEP case and AT_LEAST_ONE[_SEP]\n // An infinite loop cannot occur as:\n // - Either the lookahead is guaranteed to consume something (Single Token Separator)\n // - AT_LEAST_ONE by definition is guaranteed to consume something (or error out).\n notStuck);\n };\n RecognizerEngine.prototype.manySepFirstInternal = function (prodOccurrence, options) {\n var laKey = this.getKeyForAutomaticLookahead(keys_1.MANY_SEP_IDX, prodOccurrence);\n this.manySepFirstInternalLogic(prodOccurrence, options, laKey);\n };\n RecognizerEngine.prototype.manySepFirstInternalLogic = function (prodOccurrence, options, key) {\n var _this = this;\n var action = options.DEF;\n var separator = options.SEP;\n var firstIterationLaFunc = this.getLaFuncFromCache(key);\n // 1st iteration\n if (firstIterationLaFunc.call(this) === true) {\n action.call(this);\n var separatorLookAheadFunc = function () {\n return _this.tokenMatcher(_this.LA(1), separator);\n };\n // 2nd..nth iterations\n while (this.tokenMatcher(this.LA(1), separator) === true) {\n // note that this CONSUME will never enter recovery because\n // the separatorLookAheadFunc checks that the separator really does exist.\n this.CONSUME(separator);\n // No need for checking infinite loop here due to consuming the separator.\n action.call(this);\n }\n // Performance optimization: \"attemptInRepetitionRecovery\" will be defined as NOOP unless recovery is enabled\n this.attemptInRepetitionRecovery(this.repetitionSepSecondInternal, [\n prodOccurrence,\n separator,\n separatorLookAheadFunc,\n action,\n interpreter_1.NextTerminalAfterManySepWalker\n ], separatorLookAheadFunc, keys_1.MANY_SEP_IDX, prodOccurrence, interpreter_1.NextTerminalAfterManySepWalker);\n }\n };\n RecognizerEngine.prototype.repetitionSepSecondInternal = function (prodOccurrence, separator, separatorLookAheadFunc, action, nextTerminalAfterWalker) {\n while (separatorLookAheadFunc()) {\n // note that this CONSUME will never enter recovery because\n // the separatorLookAheadFunc checks that the separator really does exist.\n this.CONSUME(separator);\n action.call(this);\n }\n // we can only arrive to this function after an error\n // has occurred (hence the name 'second') so the following\n // IF will always be entered, its possible to remove it...\n // however it is kept to avoid confusion and be consistent.\n // Performance optimization: \"attemptInRepetitionRecovery\" will be defined as NOOP unless recovery is enabled\n /* istanbul ignore else */\n this.attemptInRepetitionRecovery(this.repetitionSepSecondInternal, [\n prodOccurrence,\n separator,\n separatorLookAheadFunc,\n action,\n nextTerminalAfterWalker\n ], separatorLookAheadFunc, keys_1.AT_LEAST_ONE_SEP_IDX, prodOccurrence, nextTerminalAfterWalker);\n };\n RecognizerEngine.prototype.doSingleRepetition = function (action) {\n var beforeIteration = this.getLexerPosition();\n action.call(this);\n var afterIteration = this.getLexerPosition();\n // This boolean will indicate if this repetition progressed\n // or if we are \"stuck\" (potential infinite loop in the repetition).\n return afterIteration > beforeIteration;\n };\n RecognizerEngine.prototype.orInternal = function (altsOrOpts, occurrence) {\n var laKey = this.getKeyForAutomaticLookahead(keys_1.OR_IDX, occurrence);\n var alts = (0, isArray_1.default)(altsOrOpts) ? altsOrOpts : altsOrOpts.DEF;\n var laFunc = this.getLaFuncFromCache(laKey);\n var altIdxToTake = laFunc.call(this, alts);\n if (altIdxToTake !== undefined) {\n var chosenAlternative = alts[altIdxToTake];\n return chosenAlternative.ALT.call(this);\n }\n this.raiseNoAltException(occurrence, altsOrOpts.ERR_MSG);\n };\n RecognizerEngine.prototype.ruleFinallyStateUpdate = function () {\n this.RULE_STACK.pop();\n this.RULE_OCCURRENCE_STACK.pop();\n // NOOP when cst is disabled\n this.cstFinallyStateUpdate();\n if (this.RULE_STACK.length === 0 && this.isAtEndOfInput() === false) {\n var firstRedundantTok = this.LA(1);\n var errMsg = this.errorMessageProvider.buildNotAllInputParsedMessage({\n firstRedundant: firstRedundantTok,\n ruleName: this.getCurrRuleFullName()\n });\n this.SAVE_ERROR(new exceptions_public_1.NotAllInputParsedException(errMsg, firstRedundantTok));\n }\n };\n RecognizerEngine.prototype.subruleInternal = function (ruleToCall, idx, options) {\n var ruleResult;\n try {\n var args = options !== undefined ? options.ARGS : undefined;\n this.subruleIdx = idx;\n ruleResult = ruleToCall.apply(this, args);\n this.cstPostNonTerminal(ruleResult, options !== undefined && options.LABEL !== undefined\n ? options.LABEL\n : ruleToCall.ruleName);\n return ruleResult;\n }\n catch (e) {\n throw this.subruleInternalError(e, options, ruleToCall.ruleName);\n }\n };\n RecognizerEngine.prototype.subruleInternalError = function (e, options, ruleName) {\n if ((0, exceptions_public_1.isRecognitionException)(e) && e.partialCstResult !== undefined) {\n this.cstPostNonTerminal(e.partialCstResult, options !== undefined && options.LABEL !== undefined\n ? options.LABEL\n : ruleName);\n delete e.partialCstResult;\n }\n throw e;\n };\n RecognizerEngine.prototype.consumeInternal = function (tokType, idx, options) {\n var consumedToken;\n try {\n var nextToken = this.LA(1);\n if (this.tokenMatcher(nextToken, tokType) === true) {\n this.consumeToken();\n consumedToken = nextToken;\n }\n else {\n this.consumeInternalError(tokType, nextToken, options);\n }\n }\n catch (eFromConsumption) {\n consumedToken = this.consumeInternalRecovery(tokType, idx, eFromConsumption);\n }\n this.cstPostTerminal(options !== undefined && options.LABEL !== undefined\n ? options.LABEL\n : tokType.name, consumedToken);\n return consumedToken;\n };\n RecognizerEngine.prototype.consumeInternalError = function (tokType, nextToken, options) {\n var msg;\n var previousToken = this.LA(0);\n if (options !== undefined && options.ERR_MSG) {\n msg = options.ERR_MSG;\n }\n else {\n msg = this.errorMessageProvider.buildMismatchTokenMessage({\n expected: tokType,\n actual: nextToken,\n previous: previousToken,\n ruleName: this.getCurrRuleFullName()\n });\n }\n throw this.SAVE_ERROR(new exceptions_public_1.MismatchedTokenException(msg, nextToken, previousToken));\n };\n RecognizerEngine.prototype.consumeInternalRecovery = function (tokType, idx, eFromConsumption) {\n // no recovery allowed during backtracking, otherwise backtracking may recover invalid syntax and accept it\n // but the original syntax could have been parsed successfully without any backtracking + recovery\n if (this.recoveryEnabled &&\n // TODO: more robust checking of the exception type. Perhaps Typescript extending expressions?\n eFromConsumption.name === \"MismatchedTokenException\" &&\n !this.isBackTracking()) {\n var follows = this.getFollowsForInRuleRecovery(tokType, idx);\n try {\n return this.tryInRuleRecovery(tokType, follows);\n }\n catch (eFromInRuleRecovery) {\n if (eFromInRuleRecovery.name === recoverable_1.IN_RULE_RECOVERY_EXCEPTION) {\n // failed in RuleRecovery.\n // throw the original error in order to trigger reSync error recovery\n throw eFromConsumption;\n }\n else {\n throw eFromInRuleRecovery;\n }\n }\n }\n else {\n throw eFromConsumption;\n }\n };\n RecognizerEngine.prototype.saveRecogState = function () {\n // errors is a getter which will clone the errors array\n var savedErrors = this.errors;\n var savedRuleStack = (0, clone_1.default)(this.RULE_STACK);\n return {\n errors: savedErrors,\n lexerState: this.exportLexerState(),\n RULE_STACK: savedRuleStack,\n CST_STACK: this.CST_STACK\n };\n };\n RecognizerEngine.prototype.reloadRecogState = function (newState) {\n this.errors = newState.errors;\n this.importLexerState(newState.lexerState);\n this.RULE_STACK = newState.RULE_STACK;\n };\n RecognizerEngine.prototype.ruleInvocationStateUpdate = function (shortName, fullName, idxInCallingRule) {\n this.RULE_OCCURRENCE_STACK.push(idxInCallingRule);\n this.RULE_STACK.push(shortName);\n // NOOP when cst is disabled\n this.cstInvocationStateUpdate(fullName);\n };\n RecognizerEngine.prototype.isBackTracking = function () {\n return this.isBackTrackingStack.length !== 0;\n };\n RecognizerEngine.prototype.getCurrRuleFullName = function () {\n var shortName = this.getLastExplicitRuleShortName();\n return this.shortRuleNameToFull[shortName];\n };\n RecognizerEngine.prototype.shortRuleNameToFullName = function (shortName) {\n return this.shortRuleNameToFull[shortName];\n };\n RecognizerEngine.prototype.isAtEndOfInput = function () {\n return this.tokenMatcher(this.LA(1), tokens_public_1.EOF);\n };\n RecognizerEngine.prototype.reset = function () {\n this.resetLexerState();\n this.subruleIdx = 0;\n this.isBackTrackingStack = [];\n this.errors = [];\n this.RULE_STACK = [];\n // TODO: extract a specific reset for TreeBuilder trait\n this.CST_STACK = [];\n this.RULE_OCCURRENCE_STACK = [];\n };\n return RecognizerEngine;\n}());\nexports.RecognizerEngine = RecognizerEngine;\n//# sourceMappingURL=recognizer_engine.js.map","var ListCache = require('./_ListCache'),\n stackClear = require('./_stackClear'),\n stackDelete = require('./_stackDelete'),\n stackGet = require('./_stackGet'),\n stackHas = require('./_stackHas'),\n stackSet = require('./_stackSet');\n\n/**\n * Creates a stack cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Stack(entries) {\n var data = this.__data__ = new ListCache(entries);\n this.size = data.size;\n}\n\n// Add methods to `Stack`.\nStack.prototype.clear = stackClear;\nStack.prototype['delete'] = stackDelete;\nStack.prototype.get = stackGet;\nStack.prototype.has = stackHas;\nStack.prototype.set = stackSet;\n\nmodule.exports = Stack;\n","/**\n * The base implementation of `_.property` without support for deep paths.\n *\n * @private\n * @param {string} key The key of the property to get.\n * @returns {Function} Returns the new accessor function.\n */\nfunction baseProperty(key) {\n return function(object) {\n return object == null ? undefined : object[key];\n };\n}\n\nmodule.exports = baseProperty;\n","var arrayLikeKeys = require('./_arrayLikeKeys'),\n baseKeysIn = require('./_baseKeysIn'),\n isArrayLike = require('./isArrayLike');\n\n/**\n * Creates an array of the own and inherited enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keysIn(new Foo);\n * // => ['a', 'b', 'c'] (iteration order is not guaranteed)\n */\nfunction keysIn(object) {\n return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object);\n}\n\nmodule.exports = keysIn;\n","var baseGet = require('./_baseGet');\n\n/**\n * A specialized version of `baseProperty` which supports deep paths.\n *\n * @private\n * @param {Array|string} path The path of the property to get.\n * @returns {Function} Returns the new accessor function.\n */\nfunction basePropertyDeep(path) {\n return function(object) {\n return baseGet(object, path);\n };\n}\n\nmodule.exports = basePropertyDeep;\n","/**\n * A specialized version of `_.every` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {boolean} Returns `true` if all elements pass the predicate check,\n * else `false`.\n */\nfunction arrayEvery(array, predicate) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n while (++index < length) {\n if (!predicate(array[index], index, array)) {\n return false;\n }\n }\n return true;\n}\n\nmodule.exports = arrayEvery;\n","var coreJsData = require('./_coreJsData');\n\n/** Used to detect methods masquerading as native. */\nvar maskSrcKey = (function() {\n var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');\n return uid ? ('Symbol(src)_1.' + uid) : '';\n}());\n\n/**\n * Checks if `func` has its source masked.\n *\n * @private\n * @param {Function} func The function to check.\n * @returns {boolean} Returns `true` if `func` is masked, else `false`.\n */\nfunction isMasked(func) {\n return !!maskSrcKey && (maskSrcKey in func);\n}\n\nmodule.exports = isMasked;\n","/**\n * The base implementation of `_.unary` without support for storing metadata.\n *\n * @private\n * @param {Function} func The function to cap arguments for.\n * @returns {Function} Returns the new capped function.\n */\nfunction baseUnary(func) {\n return function(value) {\n return func(value);\n };\n}\n\nmodule.exports = baseUnary;\n","var baseFlatten = require('./_baseFlatten'),\n map = require('./map');\n\n/**\n * Creates a flattened array of values by running each element in `collection`\n * thru `iteratee` and flattening the mapped results. The iteratee is invoked\n * with three arguments: (value, index|key, collection).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the new flattened array.\n * @example\n *\n * function duplicate(n) {\n * return [n, n];\n * }\n *\n * _.flatMap([1, 2], duplicate);\n * // => [1, 1, 2, 2]\n */\nfunction flatMap(collection, iteratee) {\n return baseFlatten(map(collection, iteratee), 1);\n}\n\nmodule.exports = flatMap;\n","var createFind = require('./_createFind'),\n findIndex = require('./findIndex');\n\n/**\n * Iterates over elements of `collection`, returning the first element\n * `predicate` returns truthy for. The predicate is invoked with three\n * arguments: (value, index|key, collection).\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to inspect.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @param {number} [fromIndex=0] The index to search from.\n * @returns {*} Returns the matched element, else `undefined`.\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'age': 36, 'active': true },\n * { 'user': 'fred', 'age': 40, 'active': false },\n * { 'user': 'pebbles', 'age': 1, 'active': true }\n * ];\n *\n * _.find(users, function(o) { return o.age < 40; });\n * // => object for 'barney'\n *\n * // The `_.matches` iteratee shorthand.\n * _.find(users, { 'age': 1, 'active': true });\n * // => object for 'pebbles'\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.find(users, ['active', false]);\n * // => object for 'fred'\n *\n * // The `_.property` iteratee shorthand.\n * _.find(users, 'active');\n * // => object for 'barney'\n */\nvar find = createFind(findIndex);\n\nmodule.exports = find;\n","/**\n * Creates a function that returns `value`.\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Util\n * @param {*} value The value to return from the new function.\n * @returns {Function} Returns the new constant function.\n * @example\n *\n * var objects = _.times(2, _.constant({ 'a': 1 }));\n *\n * console.log(objects);\n * // => [{ 'a': 1 }, { 'a': 1 }]\n *\n * console.log(objects[0] === objects[1]);\n * // => true\n */\nfunction constant(value) {\n return function() {\n return value;\n };\n}\n\nmodule.exports = constant;\n","var toNumber = require('./toNumber');\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0,\n MAX_INTEGER = 1.7976931348623157e+308;\n\n/**\n * Converts `value` to a finite number.\n *\n * @static\n * @memberOf _\n * @since 4.12.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {number} Returns the converted number.\n * @example\n *\n * _.toFinite(3.2);\n * // => 3.2\n *\n * _.toFinite(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toFinite(Infinity);\n * // => 1.7976931348623157e+308\n *\n * _.toFinite('3.2');\n * // => 3.2\n */\nfunction toFinite(value) {\n if (!value) {\n return value === 0 ? value : 0;\n }\n value = toNumber(value);\n if (value === INFINITY || value === -INFINITY) {\n var sign = (value < 0 ? -1 : 1);\n return sign * MAX_INTEGER;\n }\n return value === value ? value : 0;\n}\n\nmodule.exports = toFinite;\n","var baseGet = require('./_baseGet'),\n baseSet = require('./_baseSet'),\n castPath = require('./_castPath');\n\n/**\n * The base implementation of `_.pickBy` without support for iteratee shorthands.\n *\n * @private\n * @param {Object} object The source object.\n * @param {string[]} paths The property paths to pick.\n * @param {Function} predicate The function invoked per property.\n * @returns {Object} Returns the new object.\n */\nfunction basePickBy(object, paths, predicate) {\n var index = -1,\n length = paths.length,\n result = {};\n\n while (++index < length) {\n var path = paths[index],\n value = baseGet(object, path);\n\n if (predicate(value, path)) {\n baseSet(result, castPath(path, object), value);\n }\n }\n return result;\n}\n\nmodule.exports = basePickBy;\n","var castPath = require('./_castPath'),\n toKey = require('./_toKey');\n\n/**\n * The base implementation of `_.get` without support for default values.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @returns {*} Returns the resolved value.\n */\nfunction baseGet(object, path) {\n path = castPath(path, object);\n\n var index = 0,\n length = path.length;\n\n while (object != null && index < length) {\n object = object[toKey(path[index++])];\n }\n return (index && index == length) ? object : undefined;\n}\n\nmodule.exports = baseGet;\n","\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.TreeBuilder = void 0;\nvar cst_1 = require(\"../../cst/cst\");\nvar noop_1 = __importDefault(require(\"lodash/noop\"));\nvar has_1 = __importDefault(require(\"lodash/has\"));\nvar keys_1 = __importDefault(require(\"lodash/keys\"));\nvar isUndefined_1 = __importDefault(require(\"lodash/isUndefined\"));\nvar cst_visitor_1 = require(\"../../cst/cst_visitor\");\nvar parser_1 = require(\"../parser\");\n/**\n * This trait is responsible for the CST building logic.\n */\nvar TreeBuilder = /** @class */ (function () {\n function TreeBuilder() {\n }\n TreeBuilder.prototype.initTreeBuilder = function (config) {\n this.CST_STACK = [];\n // outputCst is no longer exposed/defined in the pubic API\n this.outputCst = config.outputCst;\n this.nodeLocationTracking = (0, has_1.default)(config, \"nodeLocationTracking\")\n ? config.nodeLocationTracking // assumes end user provides the correct config value/type\n : parser_1.DEFAULT_PARSER_CONFIG.nodeLocationTracking;\n if (!this.outputCst) {\n this.cstInvocationStateUpdate = noop_1.default;\n this.cstFinallyStateUpdate = noop_1.default;\n this.cstPostTerminal = noop_1.default;\n this.cstPostNonTerminal = noop_1.default;\n this.cstPostRule = noop_1.default;\n }\n else {\n if (/full/i.test(this.nodeLocationTracking)) {\n if (this.recoveryEnabled) {\n this.setNodeLocationFromToken = cst_1.setNodeLocationFull;\n this.setNodeLocationFromNode = cst_1.setNodeLocationFull;\n this.cstPostRule = noop_1.default;\n this.setInitialNodeLocation = this.setInitialNodeLocationFullRecovery;\n }\n else {\n this.setNodeLocationFromToken = noop_1.default;\n this.setNodeLocationFromNode = noop_1.default;\n this.cstPostRule = this.cstPostRuleFull;\n this.setInitialNodeLocation = this.setInitialNodeLocationFullRegular;\n }\n }\n else if (/onlyOffset/i.test(this.nodeLocationTracking)) {\n if (this.recoveryEnabled) {\n this.setNodeLocationFromToken = cst_1.setNodeLocationOnlyOffset;\n this.setNodeLocationFromNode = cst_1.setNodeLocationOnlyOffset;\n this.cstPostRule = noop_1.default;\n this.setInitialNodeLocation =\n this.setInitialNodeLocationOnlyOffsetRecovery;\n }\n else {\n this.setNodeLocationFromToken = noop_1.default;\n this.setNodeLocationFromNode = noop_1.default;\n this.cstPostRule = this.cstPostRuleOnlyOffset;\n this.setInitialNodeLocation =\n this.setInitialNodeLocationOnlyOffsetRegular;\n }\n }\n else if (/none/i.test(this.nodeLocationTracking)) {\n this.setNodeLocationFromToken = noop_1.default;\n this.setNodeLocationFromNode = noop_1.default;\n this.cstPostRule = noop_1.default;\n this.setInitialNodeLocation = noop_1.default;\n }\n else {\n throw Error(\"Invalid config option: \\\"\".concat(config.nodeLocationTracking, \"\\\"\"));\n }\n }\n };\n TreeBuilder.prototype.setInitialNodeLocationOnlyOffsetRecovery = function (cstNode) {\n cstNode.location = {\n startOffset: NaN,\n endOffset: NaN\n };\n };\n TreeBuilder.prototype.setInitialNodeLocationOnlyOffsetRegular = function (cstNode) {\n cstNode.location = {\n // without error recovery the starting Location of a new CstNode is guaranteed\n // To be the next Token's startOffset (for valid inputs).\n // For invalid inputs there won't be any CSTOutput so this potential\n // inaccuracy does not matter\n startOffset: this.LA(1).startOffset,\n endOffset: NaN\n };\n };\n TreeBuilder.prototype.setInitialNodeLocationFullRecovery = function (cstNode) {\n cstNode.location = {\n startOffset: NaN,\n startLine: NaN,\n startColumn: NaN,\n endOffset: NaN,\n endLine: NaN,\n endColumn: NaN\n };\n };\n /**\n * @see setInitialNodeLocationOnlyOffsetRegular for explanation why this work\n \n * @param cstNode\n */\n TreeBuilder.prototype.setInitialNodeLocationFullRegular = function (cstNode) {\n var nextToken = this.LA(1);\n cstNode.location = {\n startOffset: nextToken.startOffset,\n startLine: nextToken.startLine,\n startColumn: nextToken.startColumn,\n endOffset: NaN,\n endLine: NaN,\n endColumn: NaN\n };\n };\n TreeBuilder.prototype.cstInvocationStateUpdate = function (fullRuleName) {\n var cstNode = {\n name: fullRuleName,\n children: Object.create(null)\n };\n this.setInitialNodeLocation(cstNode);\n this.CST_STACK.push(cstNode);\n };\n TreeBuilder.prototype.cstFinallyStateUpdate = function () {\n this.CST_STACK.pop();\n };\n TreeBuilder.prototype.cstPostRuleFull = function (ruleCstNode) {\n // casts to `required` are safe because `cstPostRuleFull` should only be invoked when full location is enabled\n var prevToken = this.LA(0);\n var loc = ruleCstNode.location;\n // If this condition is true it means we consumed at least one Token\n // In this CstNode.\n if (loc.startOffset <= prevToken.startOffset === true) {\n loc.endOffset = prevToken.endOffset;\n loc.endLine = prevToken.endLine;\n loc.endColumn = prevToken.endColumn;\n }\n // \"empty\" CstNode edge case\n else {\n loc.startOffset = NaN;\n loc.startLine = NaN;\n loc.startColumn = NaN;\n }\n };\n TreeBuilder.prototype.cstPostRuleOnlyOffset = function (ruleCstNode) {\n var prevToken = this.LA(0);\n // `location' is not null because `cstPostRuleOnlyOffset` will only be invoked when location tracking is enabled.\n var loc = ruleCstNode.location;\n // If this condition is true it means we consumed at least one Token\n // In this CstNode.\n if (loc.startOffset <= prevToken.startOffset === true) {\n loc.endOffset = prevToken.endOffset;\n }\n // \"empty\" CstNode edge case\n else {\n loc.startOffset = NaN;\n }\n };\n TreeBuilder.prototype.cstPostTerminal = function (key, consumedToken) {\n var rootCst = this.CST_STACK[this.CST_STACK.length - 1];\n (0, cst_1.addTerminalToCst)(rootCst, consumedToken, key);\n // This is only used when **both** error recovery and CST Output are enabled.\n this.setNodeLocationFromToken(rootCst.location, consumedToken);\n };\n TreeBuilder.prototype.cstPostNonTerminal = function (ruleCstResult, ruleName) {\n var preCstNode = this.CST_STACK[this.CST_STACK.length - 1];\n (0, cst_1.addNoneTerminalToCst)(preCstNode, ruleName, ruleCstResult);\n // This is only used when **both** error recovery and CST Output are enabled.\n this.setNodeLocationFromNode(preCstNode.location, ruleCstResult.location);\n };\n TreeBuilder.prototype.getBaseCstVisitorConstructor = function () {\n if ((0, isUndefined_1.default)(this.baseCstVisitorConstructor)) {\n var newBaseCstVisitorConstructor = (0, cst_visitor_1.createBaseSemanticVisitorConstructor)(this.className, (0, keys_1.default)(this.gastProductionsCache));\n this.baseCstVisitorConstructor = newBaseCstVisitorConstructor;\n return newBaseCstVisitorConstructor;\n }\n return this.baseCstVisitorConstructor;\n };\n TreeBuilder.prototype.getBaseCstVisitorConstructorWithDefaults = function () {\n if ((0, isUndefined_1.default)(this.baseCstVisitorWithDefaultsConstructor)) {\n var newConstructor = (0, cst_visitor_1.createBaseVisitorConstructorWithDefaults)(this.className, (0, keys_1.default)(this.gastProductionsCache), this.getBaseCstVisitorConstructor());\n this.baseCstVisitorWithDefaultsConstructor = newConstructor;\n return newConstructor;\n }\n return this.baseCstVisitorWithDefaultsConstructor;\n };\n TreeBuilder.prototype.getLastExplicitRuleShortName = function () {\n var ruleStack = this.RULE_STACK;\n return ruleStack[ruleStack.length - 1];\n };\n TreeBuilder.prototype.getPreviousExplicitRuleShortName = function () {\n var ruleStack = this.RULE_STACK;\n return ruleStack[ruleStack.length - 2];\n };\n TreeBuilder.prototype.getLastExplicitRuleOccurrenceIndex = function () {\n var occurrenceStack = this.RULE_OCCURRENCE_STACK;\n return occurrenceStack[occurrenceStack.length - 1];\n };\n return TreeBuilder;\n}());\nexports.TreeBuilder = TreeBuilder;\n//# sourceMappingURL=tree_builder.js.map","/** Used for built-in method references. */\nvar funcProto = Function.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/**\n * Converts `func` to its source code.\n *\n * @private\n * @param {Function} func The function to convert.\n * @returns {string} Returns the source code.\n */\nfunction toSource(func) {\n if (func != null) {\n try {\n return funcToString.call(func);\n } catch (e) {}\n try {\n return (func + '');\n } catch (e) {}\n }\n return '';\n}\n\nmodule.exports = toSource;\n","var baseGetTag = require('./_baseGetTag'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]';\n\n/**\n * The base implementation of `_.isArguments`.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n */\nfunction baseIsArguments(value) {\n return isObjectLike(value) && baseGetTag(value) == argsTag;\n}\n\nmodule.exports = baseIsArguments;\n","var baseSlice = require('./_baseSlice'),\n toInteger = require('./toInteger');\n\n/**\n * Creates a slice of `array` with `n` elements dropped from the end.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Array\n * @param {Array} array The array to query.\n * @param {number} [n=1] The number of elements to drop.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {Array} Returns the slice of `array`.\n * @example\n *\n * _.dropRight([1, 2, 3]);\n * // => [1, 2]\n *\n * _.dropRight([1, 2, 3], 2);\n * // => [1]\n *\n * _.dropRight([1, 2, 3], 5);\n * // => []\n *\n * _.dropRight([1, 2, 3], 0);\n * // => [1, 2, 3]\n */\nfunction dropRight(array, n, guard) {\n var length = array == null ? 0 : array.length;\n if (!length) {\n return [];\n }\n n = (guard || n === undefined) ? 1 : toInteger(n);\n n = length - n;\n return baseSlice(array, 0, n < 0 ? 0 : n);\n}\n\nmodule.exports = dropRight;\n","var Symbol = require('./_Symbol'),\n arrayMap = require('./_arrayMap'),\n isArray = require('./isArray'),\n isSymbol = require('./isSymbol');\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0;\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n symbolToString = symbolProto ? symbolProto.toString : undefined;\n\n/**\n * The base implementation of `_.toString` which doesn't convert nullish\n * values to empty strings.\n *\n * @private\n * @param {*} value The value to process.\n * @returns {string} Returns the string.\n */\nfunction baseToString(value) {\n // Exit early for strings to avoid a performance hit in some environments.\n if (typeof value == 'string') {\n return value;\n }\n if (isArray(value)) {\n // Recursively convert values (susceptible to call stack limits).\n return arrayMap(value, baseToString) + '';\n }\n if (isSymbol(value)) {\n return symbolToString ? symbolToString.call(value) : '';\n }\n var result = (value + '');\n return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n}\n\nmodule.exports = baseToString;\n","var arrayFilter = require('./_arrayFilter'),\n baseFilter = require('./_baseFilter'),\n baseIteratee = require('./_baseIteratee'),\n isArray = require('./isArray');\n\n/**\n * Iterates over elements of `collection`, returning an array of all elements\n * `predicate` returns truthy for. The predicate is invoked with three\n * arguments: (value, index|key, collection).\n *\n * **Note:** Unlike `_.remove`, this method returns a new array.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the new filtered array.\n * @see _.reject\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'age': 36, 'active': true },\n * { 'user': 'fred', 'age': 40, 'active': false }\n * ];\n *\n * _.filter(users, function(o) { return !o.active; });\n * // => objects for ['fred']\n *\n * // The `_.matches` iteratee shorthand.\n * _.filter(users, { 'age': 36, 'active': true });\n * // => objects for ['barney']\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.filter(users, ['active', false]);\n * // => objects for ['fred']\n *\n * // The `_.property` iteratee shorthand.\n * _.filter(users, 'active');\n * // => objects for ['barney']\n *\n * // Combining several predicates using `_.overEvery` or `_.overSome`.\n * _.filter(users, _.overSome([{ 'age': 36 }, ['age', 40]]));\n * // => objects for ['fred', 'barney']\n */\nfunction filter(collection, predicate) {\n var func = isArray(collection) ? arrayFilter : baseFilter;\n return func(collection, baseIteratee(predicate, 3));\n}\n\nmodule.exports = filter;\n","var getMapData = require('./_getMapData');\n\n/**\n * Removes `key` and its value from the map.\n *\n * @private\n * @name delete\n * @memberOf MapCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction mapCacheDelete(key) {\n var result = getMapData(this, key)['delete'](key);\n this.size -= result ? 1 : 0;\n return result;\n}\n\nmodule.exports = mapCacheDelete;\n","var baseIsMap = require('./_baseIsMap'),\n baseUnary = require('./_baseUnary'),\n nodeUtil = require('./_nodeUtil');\n\n/* Node.js helper references. */\nvar nodeIsMap = nodeUtil && nodeUtil.isMap;\n\n/**\n * Checks if `value` is classified as a `Map` object.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a map, else `false`.\n * @example\n *\n * _.isMap(new Map);\n * // => true\n *\n * _.isMap(new WeakMap);\n * // => false\n */\nvar isMap = nodeIsMap ? baseUnary(nodeIsMap) : baseIsMap;\n\nmodule.exports = isMap;\n","\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ErrorHandler = void 0;\nvar exceptions_public_1 = require(\"../../exceptions_public\");\nvar has_1 = __importDefault(require(\"lodash/has\"));\nvar clone_1 = __importDefault(require(\"lodash/clone\"));\nvar lookahead_1 = require(\"../../grammar/lookahead\");\nvar parser_1 = require(\"../parser\");\n/**\n * Trait responsible for runtime parsing errors.\n */\nvar ErrorHandler = /** @class */ (function () {\n function ErrorHandler() {\n }\n ErrorHandler.prototype.initErrorHandler = function (config) {\n this._errors = [];\n this.errorMessageProvider = (0, has_1.default)(config, \"errorMessageProvider\")\n ? config.errorMessageProvider // assumes end user provides the correct config value/type\n : parser_1.DEFAULT_PARSER_CONFIG.errorMessageProvider;\n };\n ErrorHandler.prototype.SAVE_ERROR = function (error) {\n if ((0, exceptions_public_1.isRecognitionException)(error)) {\n error.context = {\n ruleStack: this.getHumanReadableRuleStack(),\n ruleOccurrenceStack: (0, clone_1.default)(this.RULE_OCCURRENCE_STACK)\n };\n this._errors.push(error);\n return error;\n }\n else {\n throw Error(\"Trying to save an Error which is not a RecognitionException\");\n }\n };\n Object.defineProperty(ErrorHandler.prototype, \"errors\", {\n get: function () {\n return (0, clone_1.default)(this._errors);\n },\n set: function (newErrors) {\n this._errors = newErrors;\n },\n enumerable: false,\n configurable: true\n });\n // TODO: consider caching the error message computed information\n ErrorHandler.prototype.raiseEarlyExitException = function (occurrence, prodType, userDefinedErrMsg) {\n var ruleName = this.getCurrRuleFullName();\n var ruleGrammar = this.getGAstProductions()[ruleName];\n var lookAheadPathsPerAlternative = (0, lookahead_1.getLookaheadPathsForOptionalProd)(occurrence, ruleGrammar, prodType, this.maxLookahead);\n var insideProdPaths = lookAheadPathsPerAlternative[0];\n var actualTokens = [];\n for (var i = 1; i <= this.maxLookahead; i++) {\n actualTokens.push(this.LA(i));\n }\n var msg = this.errorMessageProvider.buildEarlyExitMessage({\n expectedIterationPaths: insideProdPaths,\n actual: actualTokens,\n previous: this.LA(0),\n customUserDescription: userDefinedErrMsg,\n ruleName: ruleName\n });\n throw this.SAVE_ERROR(new exceptions_public_1.EarlyExitException(msg, this.LA(1), this.LA(0)));\n };\n // TODO: consider caching the error message computed information\n ErrorHandler.prototype.raiseNoAltException = function (occurrence, errMsgTypes) {\n var ruleName = this.getCurrRuleFullName();\n var ruleGrammar = this.getGAstProductions()[ruleName];\n // TODO: getLookaheadPathsForOr can be slow for large enough maxLookahead and certain grammars, consider caching ?\n var lookAheadPathsPerAlternative = (0, lookahead_1.getLookaheadPathsForOr)(occurrence, ruleGrammar, this.maxLookahead);\n var actualTokens = [];\n for (var i = 1; i <= this.maxLookahead; i++) {\n actualTokens.push(this.LA(i));\n }\n var previousToken = this.LA(0);\n var errMsg = this.errorMessageProvider.buildNoViableAltMessage({\n expectedPathsPerAlt: lookAheadPathsPerAlternative,\n actual: actualTokens,\n previous: previousToken,\n customUserDescription: errMsgTypes,\n ruleName: this.getCurrRuleFullName()\n });\n throw this.SAVE_ERROR(new exceptions_public_1.NoViableAltException(errMsg, this.LA(1), previousToken));\n };\n return ErrorHandler;\n}());\nexports.ErrorHandler = ErrorHandler;\n//# sourceMappingURL=error_handler.js.map","var isSymbol = require('./isSymbol');\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0;\n\n/**\n * Converts `value` to a string key if it's not a string or symbol.\n *\n * @private\n * @param {*} value The value to inspect.\n * @returns {string|symbol} Returns the key.\n */\nfunction toKey(value) {\n if (typeof value == 'string' || isSymbol(value)) {\n return value;\n }\n var result = (value + '');\n return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n}\n\nmodule.exports = toKey;\n","var root = require('./_root');\n\n/** Built-in value references. */\nvar Uint8Array = root.Uint8Array;\n\nmodule.exports = Uint8Array;\n","var baseIsEqual = require('./_baseIsEqual'),\n get = require('./get'),\n hasIn = require('./hasIn'),\n isKey = require('./_isKey'),\n isStrictComparable = require('./_isStrictComparable'),\n matchesStrictComparable = require('./_matchesStrictComparable'),\n toKey = require('./_toKey');\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1,\n COMPARE_UNORDERED_FLAG = 2;\n\n/**\n * The base implementation of `_.matchesProperty` which doesn't clone `srcValue`.\n *\n * @private\n * @param {string} path The path of the property to get.\n * @param {*} srcValue The value to match.\n * @returns {Function} Returns the new spec function.\n */\nfunction baseMatchesProperty(path, srcValue) {\n if (isKey(path) && isStrictComparable(srcValue)) {\n return matchesStrictComparable(toKey(path), srcValue);\n }\n return function(object) {\n var objValue = get(object, path);\n return (objValue === undefined && objValue === srcValue)\n ? hasIn(object, path)\n : baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG);\n };\n}\n\nmodule.exports = baseMatchesProperty;\n","/**\n * The base implementation of `_.hasIn` without support for deep paths.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {Array|string} key The key to check.\n * @returns {boolean} Returns `true` if `key` exists, else `false`.\n */\nfunction baseHasIn(object, key) {\n return object != null && key in Object(object);\n}\n\nmodule.exports = baseHasIn;\n","var arrayFilter = require('./_arrayFilter'),\n baseFilter = require('./_baseFilter'),\n baseIteratee = require('./_baseIteratee'),\n isArray = require('./isArray'),\n negate = require('./negate');\n\n/**\n * The opposite of `_.filter`; this method returns the elements of `collection`\n * that `predicate` does **not** return truthy for.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the new filtered array.\n * @see _.filter\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'age': 36, 'active': false },\n * { 'user': 'fred', 'age': 40, 'active': true }\n * ];\n *\n * _.reject(users, function(o) { return !o.active; });\n * // => objects for ['fred']\n *\n * // The `_.matches` iteratee shorthand.\n * _.reject(users, { 'age': 40, 'active': true });\n * // => objects for ['barney']\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.reject(users, ['active', false]);\n * // => objects for ['fred']\n *\n * // The `_.property` iteratee shorthand.\n * _.reject(users, 'active');\n * // => objects for ['barney']\n */\nfunction reject(collection, predicate) {\n var func = isArray(collection) ? arrayFilter : baseFilter;\n return func(collection, negate(baseIteratee(predicate, 3)));\n}\n\nmodule.exports = reject;\n","/**\n * Gets the last element of `array`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to query.\n * @returns {*} Returns the last element of `array`.\n * @example\n *\n * _.last([1, 2, 3]);\n * // => 3\n */\nfunction last(array) {\n var length = array == null ? 0 : array.length;\n return length ? array[length - 1] : undefined;\n}\n\nmodule.exports = last;\n","/**\n * The base implementation of `_.times` without support for iteratee shorthands\n * or max array length checks.\n *\n * @private\n * @param {number} n The number of times to invoke `iteratee`.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the array of results.\n */\nfunction baseTimes(n, iteratee) {\n var index = -1,\n result = Array(n);\n\n while (++index < n) {\n result[index] = iteratee(index);\n }\n return result;\n}\n\nmodule.exports = baseTimes;\n","var baseGet = require('./_baseGet');\n\n/**\n * Gets the value at `path` of `object`. If the resolved value is\n * `undefined`, the `defaultValue` is returned in its place.\n *\n * @static\n * @memberOf _\n * @since 3.7.0\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @param {*} [defaultValue] The value returned for `undefined` resolved values.\n * @returns {*} Returns the resolved value.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n *\n * _.get(object, 'a[0].b.c');\n * // => 3\n *\n * _.get(object, ['a', '0', 'b', 'c']);\n * // => 3\n *\n * _.get(object, 'a.b.c', 'default');\n * // => 'default'\n */\nfunction get(object, path, defaultValue) {\n var result = object == null ? undefined : baseGet(object, path);\n return result === undefined ? defaultValue : result;\n}\n\nmodule.exports = get;\n","\"use strict\";\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.attemptInRepetitionRecovery = exports.Recoverable = exports.InRuleRecoveryException = exports.IN_RULE_RECOVERY_EXCEPTION = exports.EOF_FOLLOW_KEY = void 0;\nvar tokens_public_1 = require(\"../../../scan/tokens_public\");\nvar isEmpty_1 = __importDefault(require(\"lodash/isEmpty\"));\nvar dropRight_1 = __importDefault(require(\"lodash/dropRight\"));\nvar flatten_1 = __importDefault(require(\"lodash/flatten\"));\nvar map_1 = __importDefault(require(\"lodash/map\"));\nvar find_1 = __importDefault(require(\"lodash/find\"));\nvar has_1 = __importDefault(require(\"lodash/has\"));\nvar includes_1 = __importDefault(require(\"lodash/includes\"));\nvar clone_1 = __importDefault(require(\"lodash/clone\"));\nvar exceptions_public_1 = require(\"../../exceptions_public\");\nvar constants_1 = require(\"../../constants\");\nvar parser_1 = require(\"../parser\");\nexports.EOF_FOLLOW_KEY = {};\nexports.IN_RULE_RECOVERY_EXCEPTION = \"InRuleRecoveryException\";\nvar InRuleRecoveryException = /** @class */ (function (_super) {\n __extends(InRuleRecoveryException, _super);\n function InRuleRecoveryException(message) {\n var _this = _super.call(this, message) || this;\n _this.name = exports.IN_RULE_RECOVERY_EXCEPTION;\n return _this;\n }\n return InRuleRecoveryException;\n}(Error));\nexports.InRuleRecoveryException = InRuleRecoveryException;\n/**\n * This trait is responsible for the error recovery and fault tolerant logic\n */\nvar Recoverable = /** @class */ (function () {\n function Recoverable() {\n }\n Recoverable.prototype.initRecoverable = function (config) {\n this.firstAfterRepMap = {};\n this.resyncFollows = {};\n this.recoveryEnabled = (0, has_1.default)(config, \"recoveryEnabled\")\n ? config.recoveryEnabled // assumes end user provides the correct config value/type\n : parser_1.DEFAULT_PARSER_CONFIG.recoveryEnabled;\n // performance optimization, NOOP will be inlined which\n // effectively means that this optional feature does not exist\n // when not used.\n if (this.recoveryEnabled) {\n this.attemptInRepetitionRecovery = attemptInRepetitionRecovery;\n }\n };\n Recoverable.prototype.getTokenToInsert = function (tokType) {\n var tokToInsert = (0, tokens_public_1.createTokenInstance)(tokType, \"\", NaN, NaN, NaN, NaN, NaN, NaN);\n tokToInsert.isInsertedInRecovery = true;\n return tokToInsert;\n };\n Recoverable.prototype.canTokenTypeBeInsertedInRecovery = function (tokType) {\n return true;\n };\n Recoverable.prototype.canTokenTypeBeDeletedInRecovery = function (tokType) {\n return true;\n };\n Recoverable.prototype.tryInRepetitionRecovery = function (grammarRule, grammarRuleArgs, lookAheadFunc, expectedTokType) {\n var _this = this;\n // TODO: can the resyncTokenType be cached?\n var reSyncTokType = this.findReSyncTokenType();\n var savedLexerState = this.exportLexerState();\n var resyncedTokens = [];\n var passedResyncPoint = false;\n var nextTokenWithoutResync = this.LA(1);\n var currToken = this.LA(1);\n var generateErrorMessage = function () {\n var previousToken = _this.LA(0);\n // we are preemptively re-syncing before an error has been detected, therefor we must reproduce\n // the error that would have been thrown\n var msg = _this.errorMessageProvider.buildMismatchTokenMessage({\n expected: expectedTokType,\n actual: nextTokenWithoutResync,\n previous: previousToken,\n ruleName: _this.getCurrRuleFullName()\n });\n var error = new exceptions_public_1.MismatchedTokenException(msg, nextTokenWithoutResync, _this.LA(0));\n // the first token here will be the original cause of the error, this is not part of the resyncedTokens property.\n error.resyncedTokens = (0, dropRight_1.default)(resyncedTokens);\n _this.SAVE_ERROR(error);\n };\n while (!passedResyncPoint) {\n // re-synced to a point where we can safely exit the repetition/\n if (this.tokenMatcher(currToken, expectedTokType)) {\n generateErrorMessage();\n return; // must return here to avoid reverting the inputIdx\n }\n else if (lookAheadFunc.call(this)) {\n // we skipped enough tokens so we can resync right back into another iteration of the repetition grammar rule\n generateErrorMessage();\n // recursive invocation in other to support multiple re-syncs in the same top level repetition grammar rule\n grammarRule.apply(this, grammarRuleArgs);\n return; // must return here to avoid reverting the inputIdx\n }\n else if (this.tokenMatcher(currToken, reSyncTokType)) {\n passedResyncPoint = true;\n }\n else {\n currToken = this.SKIP_TOKEN();\n this.addToResyncTokens(currToken, resyncedTokens);\n }\n }\n // we were unable to find a CLOSER point to resync inside the Repetition, reset the state.\n // The parsing exception we were trying to prevent will happen in the NEXT parsing step. it may be handled by\n // \"between rules\" resync recovery later in the flow.\n this.importLexerState(savedLexerState);\n };\n Recoverable.prototype.shouldInRepetitionRecoveryBeTried = function (expectTokAfterLastMatch, nextTokIdx, notStuck) {\n // Edge case of arriving from a MANY repetition which is stuck\n // Attempting recovery in this case could cause an infinite loop\n if (notStuck === false) {\n return false;\n }\n // no need to recover, next token is what we expect...\n if (this.tokenMatcher(this.LA(1), expectTokAfterLastMatch)) {\n return false;\n }\n // error recovery is disabled during backtracking as it can make the parser ignore a valid grammar path\n // and prefer some backtracking path that includes recovered errors.\n if (this.isBackTracking()) {\n return false;\n }\n // if we can perform inRule recovery (single token insertion or deletion) we always prefer that recovery algorithm\n // because if it works, it makes the least amount of changes to the input stream (greedy algorithm)\n //noinspection RedundantIfStatementJS\n if (this.canPerformInRuleRecovery(expectTokAfterLastMatch, this.getFollowsForInRuleRecovery(expectTokAfterLastMatch, nextTokIdx))) {\n return false;\n }\n return true;\n };\n // Error Recovery functionality\n Recoverable.prototype.getFollowsForInRuleRecovery = function (tokType, tokIdxInRule) {\n var grammarPath = this.getCurrentGrammarPath(tokType, tokIdxInRule);\n var follows = this.getNextPossibleTokenTypes(grammarPath);\n return follows;\n };\n Recoverable.prototype.tryInRuleRecovery = function (expectedTokType, follows) {\n if (this.canRecoverWithSingleTokenInsertion(expectedTokType, follows)) {\n var tokToInsert = this.getTokenToInsert(expectedTokType);\n return tokToInsert;\n }\n if (this.canRecoverWithSingleTokenDeletion(expectedTokType)) {\n var nextTok = this.SKIP_TOKEN();\n this.consumeToken();\n return nextTok;\n }\n throw new InRuleRecoveryException(\"sad sad panda\");\n };\n Recoverable.prototype.canPerformInRuleRecovery = function (expectedToken, follows) {\n return (this.canRecoverWithSingleTokenInsertion(expectedToken, follows) ||\n this.canRecoverWithSingleTokenDeletion(expectedToken));\n };\n Recoverable.prototype.canRecoverWithSingleTokenInsertion = function (expectedTokType, follows) {\n var _this = this;\n if (!this.canTokenTypeBeInsertedInRecovery(expectedTokType)) {\n return false;\n }\n // must know the possible following tokens to perform single token insertion\n if ((0, isEmpty_1.default)(follows)) {\n return false;\n }\n var mismatchedTok = this.LA(1);\n var isMisMatchedTokInFollows = (0, find_1.default)(follows, function (possibleFollowsTokType) {\n return _this.tokenMatcher(mismatchedTok, possibleFollowsTokType);\n }) !== undefined;\n return isMisMatchedTokInFollows;\n };\n Recoverable.prototype.canRecoverWithSingleTokenDeletion = function (expectedTokType) {\n if (!this.canTokenTypeBeDeletedInRecovery(expectedTokType)) {\n return false;\n }\n var isNextTokenWhatIsExpected = this.tokenMatcher(this.LA(2), expectedTokType);\n return isNextTokenWhatIsExpected;\n };\n Recoverable.prototype.isInCurrentRuleReSyncSet = function (tokenTypeIdx) {\n var followKey = this.getCurrFollowKey();\n var currentRuleReSyncSet = this.getFollowSetFromFollowKey(followKey);\n return (0, includes_1.default)(currentRuleReSyncSet, tokenTypeIdx);\n };\n Recoverable.prototype.findReSyncTokenType = function () {\n var allPossibleReSyncTokTypes = this.flattenFollowSet();\n // this loop will always terminate as EOF is always in the follow stack and also always (virtually) in the input\n var nextToken = this.LA(1);\n var k = 2;\n while (true) {\n var foundMatch = (0, find_1.default)(allPossibleReSyncTokTypes, function (resyncTokType) {\n var canMatch = (0, tokens_public_1.tokenMatcher)(nextToken, resyncTokType);\n return canMatch;\n });\n if (foundMatch !== undefined) {\n return foundMatch;\n }\n nextToken = this.LA(k);\n k++;\n }\n };\n Recoverable.prototype.getCurrFollowKey = function () {\n // the length is at least one as we always add the ruleName to the stack before invoking the rule.\n if (this.RULE_STACK.length === 1) {\n return exports.EOF_FOLLOW_KEY;\n }\n var currRuleShortName = this.getLastExplicitRuleShortName();\n var currRuleIdx = this.getLastExplicitRuleOccurrenceIndex();\n var prevRuleShortName = this.getPreviousExplicitRuleShortName();\n return {\n ruleName: this.shortRuleNameToFullName(currRuleShortName),\n idxInCallingRule: currRuleIdx,\n inRule: this.shortRuleNameToFullName(prevRuleShortName)\n };\n };\n Recoverable.prototype.buildFullFollowKeyStack = function () {\n var _this = this;\n var explicitRuleStack = this.RULE_STACK;\n var explicitOccurrenceStack = this.RULE_OCCURRENCE_STACK;\n return (0, map_1.default)(explicitRuleStack, function (ruleName, idx) {\n if (idx === 0) {\n return exports.EOF_FOLLOW_KEY;\n }\n return {\n ruleName: _this.shortRuleNameToFullName(ruleName),\n idxInCallingRule: explicitOccurrenceStack[idx],\n inRule: _this.shortRuleNameToFullName(explicitRuleStack[idx - 1])\n };\n });\n };\n Recoverable.prototype.flattenFollowSet = function () {\n var _this = this;\n var followStack = (0, map_1.default)(this.buildFullFollowKeyStack(), function (currKey) {\n return _this.getFollowSetFromFollowKey(currKey);\n });\n return (0, flatten_1.default)(followStack);\n };\n Recoverable.prototype.getFollowSetFromFollowKey = function (followKey) {\n if (followKey === exports.EOF_FOLLOW_KEY) {\n return [tokens_public_1.EOF];\n }\n var followName = followKey.ruleName + followKey.idxInCallingRule + constants_1.IN + followKey.inRule;\n return this.resyncFollows[followName];\n };\n // It does not make any sense to include a virtual EOF token in the list of resynced tokens\n // as EOF does not really exist and thus does not contain any useful information (line/column numbers)\n Recoverable.prototype.addToResyncTokens = function (token, resyncTokens) {\n if (!this.tokenMatcher(token, tokens_public_1.EOF)) {\n resyncTokens.push(token);\n }\n return resyncTokens;\n };\n Recoverable.prototype.reSyncTo = function (tokType) {\n var resyncedTokens = [];\n var nextTok = this.LA(1);\n while (this.tokenMatcher(nextTok, tokType) === false) {\n nextTok = this.SKIP_TOKEN();\n this.addToResyncTokens(nextTok, resyncedTokens);\n }\n // the last token is not part of the error.\n return (0, dropRight_1.default)(resyncedTokens);\n };\n Recoverable.prototype.attemptInRepetitionRecovery = function (prodFunc, args, lookaheadFunc, dslMethodIdx, prodOccurrence, nextToksWalker, notStuck) {\n // by default this is a NO-OP\n // The actual implementation is with the function(not method) below\n };\n Recoverable.prototype.getCurrentGrammarPath = function (tokType, tokIdxInRule) {\n var pathRuleStack = this.getHumanReadableRuleStack();\n var pathOccurrenceStack = (0, clone_1.default)(this.RULE_OCCURRENCE_STACK);\n var grammarPath = {\n ruleStack: pathRuleStack,\n occurrenceStack: pathOccurrenceStack,\n lastTok: tokType,\n lastTokOccurrence: tokIdxInRule\n };\n return grammarPath;\n };\n Recoverable.prototype.getHumanReadableRuleStack = function () {\n var _this = this;\n return (0, map_1.default)(this.RULE_STACK, function (currShortName) {\n return _this.shortRuleNameToFullName(currShortName);\n });\n };\n return Recoverable;\n}());\nexports.Recoverable = Recoverable;\nfunction attemptInRepetitionRecovery(prodFunc, args, lookaheadFunc, dslMethodIdx, prodOccurrence, nextToksWalker, notStuck) {\n var key = this.getKeyForAutomaticLookahead(dslMethodIdx, prodOccurrence);\n var firstAfterRepInfo = this.firstAfterRepMap[key];\n if (firstAfterRepInfo === undefined) {\n var currRuleName = this.getCurrRuleFullName();\n var ruleGrammar = this.getGAstProductions()[currRuleName];\n var walker = new nextToksWalker(ruleGrammar, prodOccurrence);\n firstAfterRepInfo = walker.startWalking();\n this.firstAfterRepMap[key] = firstAfterRepInfo;\n }\n var expectTokAfterLastMatch = firstAfterRepInfo.token;\n var nextTokIdx = firstAfterRepInfo.occurrence;\n var isEndOfRule = firstAfterRepInfo.isEndOfRule;\n // special edge case of a TOP most repetition after which the input should END.\n // this will force an attempt for inRule recovery in that scenario.\n if (this.RULE_STACK.length === 1 &&\n isEndOfRule &&\n expectTokAfterLastMatch === undefined) {\n expectTokAfterLastMatch = tokens_public_1.EOF;\n nextTokIdx = 1;\n }\n // We don't have anything to re-sync to...\n // this condition was extracted from `shouldInRepetitionRecoveryBeTried` to act as a type-guard\n if (expectTokAfterLastMatch === undefined || nextTokIdx === undefined) {\n return;\n }\n if (this.shouldInRepetitionRecoveryBeTried(expectTokAfterLastMatch, nextTokIdx, notStuck)) {\n // TODO: performance optimization: instead of passing the original args here, we modify\n // the args param (or create a new one) and make sure the lookahead func is explicitly provided\n // to avoid searching the cache for it once more.\n this.tryInRepetitionRecovery(prodFunc, args, lookaheadFunc, expectTokAfterLastMatch);\n }\n}\nexports.attemptInRepetitionRecovery = attemptInRepetitionRecovery;\n//# sourceMappingURL=recoverable.js.map","var getNative = require('./_getNative'),\n root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar Map = getNative(root, 'Map');\n\nmodule.exports = Map;\n","var getNative = require('./_getNative'),\n root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar WeakMap = getNative(root, 'WeakMap');\n\nmodule.exports = WeakMap;\n","var isArrayLike = require('./isArrayLike');\n\n/**\n * Creates a `baseEach` or `baseEachRight` function.\n *\n * @private\n * @param {Function} eachFunc The function to iterate over a collection.\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new base function.\n */\nfunction createBaseEach(eachFunc, fromRight) {\n return function(collection, iteratee) {\n if (collection == null) {\n return collection;\n }\n if (!isArrayLike(collection)) {\n return eachFunc(collection, iteratee);\n }\n var length = collection.length,\n index = fromRight ? length : -1,\n iterable = Object(collection);\n\n while ((fromRight ? index-- : ++index < length)) {\n if (iteratee(iterable[index], index, iterable) === false) {\n break;\n }\n }\n return collection;\n };\n}\n\nmodule.exports = createBaseEach;\n","import { Cell } from \"../Cell\";\nimport { CellEvent } from \"../Cell/CellEvent\";\nimport { EventDispatcher } from \"../Utility/EventDispatcher\";\nimport { DependencyBuilder } from \"./DependencyBuilder\";\nimport { CellRegistry } from \"../Sheet/CellRegistry\";\n\nexport class DependencyTree {\n\n protected depTree : Record = {};\n protected cellRegistry : CellRegistry;\n\n constructor(\n cellRegistry : CellRegistry,\n private dispatcher : EventDispatcher,\n private builder : DependencyBuilder\n ) {\n this.cellRegistry = cellRegistry;\n this.buildTree();\n this.dispatcher.listen(CellEvent.FORMULA_CHANGED, this._updateGraph.bind(this));\n }\n\n private buildTree() {\n // Build the dependency tree from cell registry\n this.cellRegistry.each((cell: Cell) => {\n if (cell.formula) {\n this.depTree[cell.address] = cell;\n }\n });\n }\n\n private _updateGraph(event: any)\n {\n // Rebuild the tree when a formula changes\n this.buildTree();\n }\n\n markAsDirty(cell : Cell) {\n if (this.depTree[cell.address]) {\n this.depTree[cell.address].markAsDirty();\n\n // Recursively mark dependents as dirty\n const dependents = this.depTree[cell.address].getDependents();\n for (const address in dependents) {\n this.markAsDirty(dependents[address]);\n }\n }\n }\n\n /**\n * Topologically sort object tree into array based on depth level\n *\n * a -\n * |- c -\n * b - | - e -\n * d - | - g\n * |\n * f -\n *\n * to\n *\n * a | c | e | g\n * b | d | f |\n */\n topologicalSort() : Array> {\n const levels: Array> = [];\n const visited = new Set();\n const cellLevels = new Map();\n\n // Calculate level for each cell based on its precedents\n const calculateLevel = (cell: Cell): number => {\n if (cellLevels.has(cell.address)) {\n return cellLevels.get(cell.address)!;\n }\n\n const precedents = cell.getPrecedents();\n if (!precedents || Object.keys(precedents).length === 0) {\n // No precedents, this is a leaf node (level 0)\n cellLevels.set(cell.address, 0);\n return 0;\n }\n\n // Find the maximum level among precedents\n let maxLevel = -1;\n for (const address in precedents) {\n const precedent = precedents[address];\n if (precedent) {\n const precedentLevel = calculateLevel(precedent);\n if (precedentLevel > maxLevel) {\n maxLevel = precedentLevel;\n }\n }\n }\n\n const level = maxLevel + 1;\n cellLevels.set(cell.address, level);\n return level;\n };\n\n // Calculate levels for all cells with formulas\n this.cellRegistry.each((cell: Cell) => {\n if (cell.formula && !visited.has(cell.address)) {\n calculateLevel(cell);\n }\n });\n\n // Group cells by level (only include cells with formulas)\n cellLevels.forEach((level, address) => {\n const cell = this.cellRegistry.get(address);\n // Only include cells that have formulas\n if (cell && cell.formula) {\n if (!levels[level]) {\n levels[level] = [];\n }\n levels[level].push(cell);\n }\n });\n\n return levels;\n }\n\n /**\n * Flatten dependency graph into a flat array in topological order\n * Returns cells in the order they should be calculated\n * @returns Array of cells in topological order\n */\n flattenToTopology(): Cell[] {\n const levels = this.topologicalSort();\n const result: Cell[] = [];\n\n // Flatten the 2D array of levels into a 1D array\n for (const level of levels) {\n if (level) { // Skip undefined levels\n result.push(...level);\n }\n }\n\n return result;\n }\n\n /**\n * Get the depth level of the tree\n */\n getDepth() : number {\n return this._getDepth(this.depTree);\n }\n\n private _getDepth(tree : Record) : number {\n let max = 0;\n\n for (const key in tree) {\n const cell = tree[key];\n\n if (cell.getDependents()) {\n const depth = this._getDepth(cell.getDependents());\n\n if (depth > max) {\n max = depth;\n }\n }\n }\n\n return max + 1;\n }\n\n}","import { Cell } from \"../Cell\";\nimport { CellRegistry } from \"../Sheet/CellRegistry\";\nimport { EventDispatcher } from \"../Utility/EventDispatcher\";\nimport { DependencyTree } from \"./DependencyTree\";\nimport { Workbook } from \"../Workbook\";\n\nexport class DependencyBuilder {\n private patterns : Record = {\n remoteColumnRange : /\\#?[A-Za-z0-9_]+\\s*!\\s*[A-Za-z]+\\s*:\\s*[A-Za-z]+/g,\n remoteRowRange : /\\#?[A-Za-z0-9_]+\\s*!\\s*[0-9]+\\s*:\\s*[0-9]+/g,\n remoteCellRange : /\\#?[A-Za-z0-9_]+\\s*!\\s*[A-Za-z]+[0-9]+\\s*:\\s*[A-Za-z]+[0-9]+/g,\n remoteCell : /\\#?[A-Za-z0-9_]+\\s*!\\s*[A-Za-z]+[0-9]+/g,\n columnRange : /[A-Za-z]+\\s*:\\s*[A-Za-z]+/g,\n rowRange : /[0-9]+\\s*:\\s*[0-9]+/g,\n cellRange : /[A-Za-z]+[0-9]+\\s*:\\s*[A-Za-z]+[0-9]+/g,\n cell : /[A-Z]+[0-9]+/g,\n namedRange : /[A-Za-z_][A-Za-z0-9_\\.]*/g\n };\n\n private workbook?: Workbook;\n\n constructor() {\n\n }\n\n setWorkbook(workbook: Workbook) {\n this.workbook = workbook;\n }\n\n build(cells : CellRegistry, sheet?: any) : DependencyTree {\n // Build dependencies for each cell\n cells.each((cell : Cell) => {\n if (cell.formula) {\n const { localDeps, remoteDeps } = this.getFormulaDependencies(cell.formula);\n\n // Resolve local addresses to actual Cell objects\n const dependencies: Record = {};\n for (const address in localDeps) {\n const precedentCell = cells.get(address);\n if (precedentCell) {\n dependencies[address] = precedentCell;\n }\n }\n\n // Set precedents for this cell\n cell.setPrecedents(dependencies);\n\n // Set this cell as dependent for each local precedent\n for (const address in dependencies) {\n const precedentCell = dependencies[address];\n if (precedentCell) {\n precedentCell.addDependent(cell);\n }\n }\n\n // Handle remote (cross-sheet) dependencies\n if (this.workbook) {\n for (const remoteRef in remoteDeps) {\n const { sheetName, cellAddress } = this.parseRemoteReference(remoteRef);\n try {\n const remoteSheet = this.workbook.getSheet(sheetName);\n if (remoteSheet) {\n const remoteCellObj = remoteSheet.getCellDirect(cellAddress);\n if (remoteCellObj) {\n // Add this cell as a remote dependent of the precedent cell\n remoteCellObj.addRemoteDependent(cell);\n }\n }\n } catch (e) {\n // Sheet might not exist yet\n }\n }\n }\n }\n });\n\n return new DependencyTree(cells, new EventDispatcher, this);\n }\n\n public parseRemoteReference(remoteRef: string): { sheetName: string, cellAddress: string } {\n // Remove # prefix if present\n const cleanRef = remoteRef.replace(/^#/, '').trim();\n const parts = cleanRef.split('!');\n return {\n sheetName: parts[0].trim(),\n cellAddress: parts[1].trim()\n };\n }\n\n public getFormulaDependencies(formula : string) : { localDeps: Record, remoteDeps: Record } {\n const localDeps: Record = {};\n const remoteDeps: Record = {};\n\n // Remove leading '=' if present\n let cleanFormula = formula.startsWith('=') ? formula.substring(1) : formula;\n\n // Process patterns in order, replacing matched portions to prevent overlapping matches\n // Order matters: match more specific patterns first (e.g., ranges before individual cells)\n\n // 1. Remote column ranges: #Sheet1!A:C\n const remoteColumnMatches = cleanFormula.match(this.patterns.remoteColumnRange);\n if (remoteColumnMatches) {\n remoteColumnMatches.forEach(match => {\n remoteDeps[match.trim()] = true;\n });\n cleanFormula = cleanFormula.replace(this.patterns.remoteColumnRange, '');\n }\n\n // 2. Remote row ranges: #Sheet1!1:3\n const remoteRowMatches = cleanFormula.match(this.patterns.remoteRowRange);\n if (remoteRowMatches) {\n remoteRowMatches.forEach(match => {\n remoteDeps[match.trim()] = true;\n });\n cleanFormula = cleanFormula.replace(this.patterns.remoteRowRange, '');\n }\n\n // 3. Remote cell ranges: #Sheet1!A1:B3\n const remoteCellRangeMatches = cleanFormula.match(this.patterns.remoteCellRange);\n if (remoteCellRangeMatches) {\n remoteCellRangeMatches.forEach(match => {\n const [sheetPart, rangePart] = match.split('!');\n // Expand range into individual cells and add with sheet name\n const addresses = this.expandCellRange(rangePart.trim());\n addresses.forEach(addr => {\n remoteDeps[sheetPart + '!' + addr] = true;\n });\n });\n cleanFormula = cleanFormula.replace(this.patterns.remoteCellRange, '');\n }\n\n // 4. Remote cells: #Sheet1!A1\n const remoteCellMatches = cleanFormula.match(this.patterns.remoteCell);\n if (remoteCellMatches) {\n remoteCellMatches.forEach(match => {\n remoteDeps[match.trim()] = true;\n });\n cleanFormula = cleanFormula.replace(this.patterns.remoteCell, '');\n }\n\n // 5. Cell ranges: A1:B3\n const cellRangeMatches = cleanFormula.match(this.patterns.cellRange);\n if (cellRangeMatches) {\n cellRangeMatches.forEach(match => {\n // Expand range into individual cells\n const addresses = this.expandCellRange(match);\n addresses.forEach(addr => {\n localDeps[addr] = true;\n });\n });\n cleanFormula = cleanFormula.replace(this.patterns.cellRange, '');\n }\n\n // 6. Individual cells: A1, B2, etc.\n const cellMatches = cleanFormula.match(this.patterns.cell);\n if (cellMatches) {\n cellMatches.forEach(match => {\n // Filter out function names and keywords\n if (!this.isFunctionOrKeyword(match)) {\n localDeps[match] = true;\n }\n });\n }\n\n // 7. Named ranges: Resolve named ranges to their underlying cell references\n // After removing all other patterns, check remaining identifiers against named ranges\n if (this.workbook) {\n // Extract potential named range identifiers (words that aren't functions)\n const identifierMatches = cleanFormula.match(/[A-Za-z_][A-Za-z0-9_\\.]*/g);\n if (identifierMatches) {\n identifierMatches.forEach(identifier => {\n // Skip if it's a function or keyword\n if (this.isFunctionOrKeyword(identifier)) {\n return;\n }\n\n // Check if it's a named range\n if (this.workbook!.nameManager.has(identifier)) {\n const reference = this.workbook!.nameManager.getReference(identifier);\n if (reference) {\n // Check if it's a remote reference (contains !)\n if (reference.includes('!')) {\n // It's a cross-sheet reference\n remoteDeps[reference] = true;\n } else {\n // Parse the reference to extract cell addresses\n if (reference.includes(':')) {\n // It's a range\n const addresses = this.expandCellRange(reference);\n addresses.forEach(addr => {\n localDeps[addr] = true;\n });\n } else if (/^[A-Z]+[0-9]+$/.test(reference)) {\n // It's a single cell\n localDeps[reference] = true;\n }\n }\n }\n }\n });\n }\n }\n\n // Note: Column ranges (A:A) and row ranges (1:1) are dynamic dependencies\n // and should be handled separately as they don't have fixed precedents\n\n return { localDeps, remoteDeps };\n }\n\n private isFunctionOrKeyword(text: string): boolean {\n const keywords = [\n 'SUM', 'AVERAGE', 'MAX', 'MIN', 'COUNT', 'IF', 'AND', 'OR',\n 'VLOOKUP', 'HLOOKUP', 'INDEX', 'MATCH', 'CONCATENATE',\n 'TRUE', 'FALSE', 'NULL'\n ];\n return keywords.includes(text.toUpperCase());\n }\n\n /**\n * Extract cell addresses from a cell range (e.g., \"A1:B3\")\n * Handles reverse ranges like \"B2:A1\" by normalizing them\n */\n private expandCellRange(range: string): string[] {\n const [start, end] = range.split(':');\n const addresses: string[] = [];\n\n const startColMatch = start.match(/[A-Z]+/);\n const startRowMatch = start.match(/\\d+/);\n const endColMatch = end.match(/[A-Z]+/);\n const endRowMatch = end.match(/\\d+/);\n\n if (!startColMatch || !startRowMatch || !endColMatch || !endRowMatch) {\n return [];\n }\n\n const startCol = startColMatch[0];\n const startRow = parseInt(startRowMatch[0]);\n const endCol = endColMatch[0];\n const endRow = parseInt(endRowMatch[0]);\n\n const colToNum = (col: string) => {\n let num = 0;\n for (let i = 0; i < col.length; i++) {\n num = num * 26 + (col.charCodeAt(i) - 64);\n }\n return num;\n };\n\n const numToCol = (num: number) => {\n let col = '';\n while (num > 0) {\n const remainder = (num - 1) % 26;\n col = String.fromCharCode(65 + remainder) + col;\n num = Math.floor((num - 1) / 26);\n }\n return col;\n };\n\n const startColNum = colToNum(startCol);\n const endColNum = colToNum(endCol);\n\n // Normalize range to handle reverse ranges (B2:A1 -> A1:B2)\n const minRow = Math.min(startRow, endRow);\n const maxRow = Math.max(startRow, endRow);\n const minCol = Math.min(startColNum, endColNum);\n const maxCol = Math.max(startColNum, endColNum);\n\n for (let row = minRow; row <= maxRow; row++) {\n for (let col = minCol; col <= maxCol; col++) {\n addresses.push(numToCol(col) + row);\n }\n }\n\n return addresses;\n }\n}","var baseIsSet = require('./_baseIsSet'),\n baseUnary = require('./_baseUnary'),\n nodeUtil = require('./_nodeUtil');\n\n/* Node.js helper references. */\nvar nodeIsSet = nodeUtil && nodeUtil.isSet;\n\n/**\n * Checks if `value` is classified as a `Set` object.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a set, else `false`.\n * @example\n *\n * _.isSet(new Set);\n * // => true\n *\n * _.isSet(new WeakSet);\n * // => false\n */\nvar isSet = nodeIsSet ? baseUnary(nodeIsSet) : baseIsSet;\n\nmodule.exports = isSet;\n","\"use strict\";\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.serializeProduction = exports.serializeGrammar = exports.Terminal = exports.Alternation = exports.RepetitionWithSeparator = exports.Repetition = exports.RepetitionMandatoryWithSeparator = exports.RepetitionMandatory = exports.Option = exports.Alternative = exports.Rule = exports.NonTerminal = exports.AbstractProduction = void 0;\nvar map_1 = __importDefault(require(\"lodash/map\"));\nvar forEach_1 = __importDefault(require(\"lodash/forEach\"));\nvar isString_1 = __importDefault(require(\"lodash/isString\"));\nvar isRegExp_1 = __importDefault(require(\"lodash/isRegExp\"));\nvar pickBy_1 = __importDefault(require(\"lodash/pickBy\"));\nvar assign_1 = __importDefault(require(\"lodash/assign\"));\n// TODO: duplicated code to avoid extracting another sub-package -- how to avoid?\nfunction tokenLabel(tokType) {\n if (hasTokenLabel(tokType)) {\n return tokType.LABEL;\n }\n else {\n return tokType.name;\n }\n}\n// TODO: duplicated code to avoid extracting another sub-package -- how to avoid?\nfunction hasTokenLabel(obj) {\n return (0, isString_1.default)(obj.LABEL) && obj.LABEL !== \"\";\n}\nvar AbstractProduction = /** @class */ (function () {\n function AbstractProduction(_definition) {\n this._definition = _definition;\n }\n Object.defineProperty(AbstractProduction.prototype, \"definition\", {\n get: function () {\n return this._definition;\n },\n set: function (value) {\n this._definition = value;\n },\n enumerable: false,\n configurable: true\n });\n AbstractProduction.prototype.accept = function (visitor) {\n visitor.visit(this);\n (0, forEach_1.default)(this.definition, function (prod) {\n prod.accept(visitor);\n });\n };\n return AbstractProduction;\n}());\nexports.AbstractProduction = AbstractProduction;\nvar NonTerminal = /** @class */ (function (_super) {\n __extends(NonTerminal, _super);\n function NonTerminal(options) {\n var _this = _super.call(this, []) || this;\n _this.idx = 1;\n (0, assign_1.default)(_this, (0, pickBy_1.default)(options, function (v) { return v !== undefined; }));\n return _this;\n }\n Object.defineProperty(NonTerminal.prototype, \"definition\", {\n get: function () {\n if (this.referencedRule !== undefined) {\n return this.referencedRule.definition;\n }\n return [];\n },\n set: function (definition) {\n // immutable\n },\n enumerable: false,\n configurable: true\n });\n NonTerminal.prototype.accept = function (visitor) {\n visitor.visit(this);\n // don't visit children of a reference, we will get cyclic infinite loops if we do so\n };\n return NonTerminal;\n}(AbstractProduction));\nexports.NonTerminal = NonTerminal;\nvar Rule = /** @class */ (function (_super) {\n __extends(Rule, _super);\n function Rule(options) {\n var _this = _super.call(this, options.definition) || this;\n _this.orgText = \"\";\n (0, assign_1.default)(_this, (0, pickBy_1.default)(options, function (v) { return v !== undefined; }));\n return _this;\n }\n return Rule;\n}(AbstractProduction));\nexports.Rule = Rule;\nvar Alternative = /** @class */ (function (_super) {\n __extends(Alternative, _super);\n function Alternative(options) {\n var _this = _super.call(this, options.definition) || this;\n _this.ignoreAmbiguities = false;\n (0, assign_1.default)(_this, (0, pickBy_1.default)(options, function (v) { return v !== undefined; }));\n return _this;\n }\n return Alternative;\n}(AbstractProduction));\nexports.Alternative = Alternative;\nvar Option = /** @class */ (function (_super) {\n __extends(Option, _super);\n function Option(options) {\n var _this = _super.call(this, options.definition) || this;\n _this.idx = 1;\n (0, assign_1.default)(_this, (0, pickBy_1.default)(options, function (v) { return v !== undefined; }));\n return _this;\n }\n return Option;\n}(AbstractProduction));\nexports.Option = Option;\nvar RepetitionMandatory = /** @class */ (function (_super) {\n __extends(RepetitionMandatory, _super);\n function RepetitionMandatory(options) {\n var _this = _super.call(this, options.definition) || this;\n _this.idx = 1;\n (0, assign_1.default)(_this, (0, pickBy_1.default)(options, function (v) { return v !== undefined; }));\n return _this;\n }\n return RepetitionMandatory;\n}(AbstractProduction));\nexports.RepetitionMandatory = RepetitionMandatory;\nvar RepetitionMandatoryWithSeparator = /** @class */ (function (_super) {\n __extends(RepetitionMandatoryWithSeparator, _super);\n function RepetitionMandatoryWithSeparator(options) {\n var _this = _super.call(this, options.definition) || this;\n _this.idx = 1;\n (0, assign_1.default)(_this, (0, pickBy_1.default)(options, function (v) { return v !== undefined; }));\n return _this;\n }\n return RepetitionMandatoryWithSeparator;\n}(AbstractProduction));\nexports.RepetitionMandatoryWithSeparator = RepetitionMandatoryWithSeparator;\nvar Repetition = /** @class */ (function (_super) {\n __extends(Repetition, _super);\n function Repetition(options) {\n var _this = _super.call(this, options.definition) || this;\n _this.idx = 1;\n (0, assign_1.default)(_this, (0, pickBy_1.default)(options, function (v) { return v !== undefined; }));\n return _this;\n }\n return Repetition;\n}(AbstractProduction));\nexports.Repetition = Repetition;\nvar RepetitionWithSeparator = /** @class */ (function (_super) {\n __extends(RepetitionWithSeparator, _super);\n function RepetitionWithSeparator(options) {\n var _this = _super.call(this, options.definition) || this;\n _this.idx = 1;\n (0, assign_1.default)(_this, (0, pickBy_1.default)(options, function (v) { return v !== undefined; }));\n return _this;\n }\n return RepetitionWithSeparator;\n}(AbstractProduction));\nexports.RepetitionWithSeparator = RepetitionWithSeparator;\nvar Alternation = /** @class */ (function (_super) {\n __extends(Alternation, _super);\n function Alternation(options) {\n var _this = _super.call(this, options.definition) || this;\n _this.idx = 1;\n _this.ignoreAmbiguities = false;\n _this.hasPredicates = false;\n (0, assign_1.default)(_this, (0, pickBy_1.default)(options, function (v) { return v !== undefined; }));\n return _this;\n }\n Object.defineProperty(Alternation.prototype, \"definition\", {\n get: function () {\n return this._definition;\n },\n set: function (value) {\n this._definition = value;\n },\n enumerable: false,\n configurable: true\n });\n return Alternation;\n}(AbstractProduction));\nexports.Alternation = Alternation;\nvar Terminal = /** @class */ (function () {\n function Terminal(options) {\n this.idx = 1;\n (0, assign_1.default)(this, (0, pickBy_1.default)(options, function (v) { return v !== undefined; }));\n }\n Terminal.prototype.accept = function (visitor) {\n visitor.visit(this);\n };\n return Terminal;\n}());\nexports.Terminal = Terminal;\nfunction serializeGrammar(topRules) {\n return (0, map_1.default)(topRules, serializeProduction);\n}\nexports.serializeGrammar = serializeGrammar;\nfunction serializeProduction(node) {\n function convertDefinition(definition) {\n return (0, map_1.default)(definition, serializeProduction);\n }\n /* istanbul ignore else */\n if (node instanceof NonTerminal) {\n var serializedNonTerminal = {\n type: \"NonTerminal\",\n name: node.nonTerminalName,\n idx: node.idx\n };\n if ((0, isString_1.default)(node.label)) {\n serializedNonTerminal.label = node.label;\n }\n return serializedNonTerminal;\n }\n else if (node instanceof Alternative) {\n return {\n type: \"Alternative\",\n definition: convertDefinition(node.definition)\n };\n }\n else if (node instanceof Option) {\n return {\n type: \"Option\",\n idx: node.idx,\n definition: convertDefinition(node.definition)\n };\n }\n else if (node instanceof RepetitionMandatory) {\n return {\n type: \"RepetitionMandatory\",\n idx: node.idx,\n definition: convertDefinition(node.definition)\n };\n }\n else if (node instanceof RepetitionMandatoryWithSeparator) {\n return {\n type: \"RepetitionMandatoryWithSeparator\",\n idx: node.idx,\n separator: (serializeProduction(new Terminal({ terminalType: node.separator }))),\n definition: convertDefinition(node.definition)\n };\n }\n else if (node instanceof RepetitionWithSeparator) {\n return {\n type: \"RepetitionWithSeparator\",\n idx: node.idx,\n separator: (serializeProduction(new Terminal({ terminalType: node.separator }))),\n definition: convertDefinition(node.definition)\n };\n }\n else if (node instanceof Repetition) {\n return {\n type: \"Repetition\",\n idx: node.idx,\n definition: convertDefinition(node.definition)\n };\n }\n else if (node instanceof Alternation) {\n return {\n type: \"Alternation\",\n idx: node.idx,\n definition: convertDefinition(node.definition)\n };\n }\n else if (node instanceof Terminal) {\n var serializedTerminal = {\n type: \"Terminal\",\n name: node.terminalType.name,\n label: tokenLabel(node.terminalType),\n idx: node.idx\n };\n if ((0, isString_1.default)(node.label)) {\n serializedTerminal.terminalLabel = node.label;\n }\n var pattern = node.terminalType.PATTERN;\n if (node.terminalType.PATTERN) {\n serializedTerminal.pattern = (0, isRegExp_1.default)(pattern)\n ? pattern.source\n : pattern;\n }\n return serializedTerminal;\n }\n else if (node instanceof Rule) {\n return {\n type: \"Rule\",\n name: node.name,\n orgText: node.orgText,\n definition: convertDefinition(node.definition)\n };\n }\n else {\n throw Error(\"non exhaustive match\");\n }\n}\nexports.serializeProduction = serializeProduction;\n//# sourceMappingURL=model.js.map","var isArray = require('./isArray'),\n isSymbol = require('./isSymbol');\n\n/** Used to match property names within property paths. */\nvar reIsDeepProp = /\\.|\\[(?:[^[\\]]*|([\"'])(?:(?!\\1)[^\\\\]|\\\\.)*?\\1)\\]/,\n reIsPlainProp = /^\\w*$/;\n\n/**\n * Checks if `value` is a property name and not a property path.\n *\n * @private\n * @param {*} value The value to check.\n * @param {Object} [object] The object to query keys on.\n * @returns {boolean} Returns `true` if `value` is a property name, else `false`.\n */\nfunction isKey(value, object) {\n if (isArray(value)) {\n return false;\n }\n var type = typeof value;\n if (type == 'number' || type == 'symbol' || type == 'boolean' ||\n value == null || isSymbol(value)) {\n return true;\n }\n return reIsPlainProp.test(value) || !reIsDeepProp.test(value) ||\n (object != null && value in Object(object));\n}\n\nmodule.exports = isKey;\n","var assocIndexOf = require('./_assocIndexOf');\n\n/**\n * Checks if a list cache value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf ListCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction listCacheHas(key) {\n return assocIndexOf(this.__data__, key) > -1;\n}\n\nmodule.exports = listCacheHas;\n","\"use strict\";\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.areTokenCategoriesNotUsed = exports.isStrictPrefixOfPath = exports.containsPath = exports.getLookaheadPathsForOptionalProd = exports.getLookaheadPathsForOr = exports.lookAheadSequenceFromAlternatives = exports.buildSingleAlternativeLookaheadFunction = exports.buildAlternativesLookAheadFunc = exports.buildLookaheadFuncForOptionalProd = exports.buildLookaheadFuncForOr = exports.getLookaheadPaths = exports.getProdType = exports.PROD_TYPE = void 0;\nvar isEmpty_1 = __importDefault(require(\"lodash/isEmpty\"));\nvar flatten_1 = __importDefault(require(\"lodash/flatten\"));\nvar every_1 = __importDefault(require(\"lodash/every\"));\nvar map_1 = __importDefault(require(\"lodash/map\"));\nvar forEach_1 = __importDefault(require(\"lodash/forEach\"));\nvar has_1 = __importDefault(require(\"lodash/has\"));\nvar reduce_1 = __importDefault(require(\"lodash/reduce\"));\nvar interpreter_1 = require(\"./interpreter\");\nvar rest_1 = require(\"./rest\");\nvar tokens_1 = require(\"../../scan/tokens\");\nvar gast_1 = require(\"@chevrotain/gast\");\nvar gast_2 = require(\"@chevrotain/gast\");\nvar PROD_TYPE;\n(function (PROD_TYPE) {\n PROD_TYPE[PROD_TYPE[\"OPTION\"] = 0] = \"OPTION\";\n PROD_TYPE[PROD_TYPE[\"REPETITION\"] = 1] = \"REPETITION\";\n PROD_TYPE[PROD_TYPE[\"REPETITION_MANDATORY\"] = 2] = \"REPETITION_MANDATORY\";\n PROD_TYPE[PROD_TYPE[\"REPETITION_MANDATORY_WITH_SEPARATOR\"] = 3] = \"REPETITION_MANDATORY_WITH_SEPARATOR\";\n PROD_TYPE[PROD_TYPE[\"REPETITION_WITH_SEPARATOR\"] = 4] = \"REPETITION_WITH_SEPARATOR\";\n PROD_TYPE[PROD_TYPE[\"ALTERNATION\"] = 5] = \"ALTERNATION\";\n})(PROD_TYPE = exports.PROD_TYPE || (exports.PROD_TYPE = {}));\nfunction getProdType(prod) {\n /* istanbul ignore else */\n if (prod instanceof gast_1.Option || prod === \"Option\") {\n return PROD_TYPE.OPTION;\n }\n else if (prod instanceof gast_1.Repetition || prod === \"Repetition\") {\n return PROD_TYPE.REPETITION;\n }\n else if (prod instanceof gast_1.RepetitionMandatory ||\n prod === \"RepetitionMandatory\") {\n return PROD_TYPE.REPETITION_MANDATORY;\n }\n else if (prod instanceof gast_1.RepetitionMandatoryWithSeparator ||\n prod === \"RepetitionMandatoryWithSeparator\") {\n return PROD_TYPE.REPETITION_MANDATORY_WITH_SEPARATOR;\n }\n else if (prod instanceof gast_1.RepetitionWithSeparator ||\n prod === \"RepetitionWithSeparator\") {\n return PROD_TYPE.REPETITION_WITH_SEPARATOR;\n }\n else if (prod instanceof gast_1.Alternation || prod === \"Alternation\") {\n return PROD_TYPE.ALTERNATION;\n }\n else {\n throw Error(\"non exhaustive match\");\n }\n}\nexports.getProdType = getProdType;\nfunction getLookaheadPaths(options) {\n var occurrence = options.occurrence, rule = options.rule, prodType = options.prodType, maxLookahead = options.maxLookahead;\n var type = getProdType(prodType);\n if (type === PROD_TYPE.ALTERNATION) {\n return getLookaheadPathsForOr(occurrence, rule, maxLookahead);\n }\n else {\n return getLookaheadPathsForOptionalProd(occurrence, rule, type, maxLookahead);\n }\n}\nexports.getLookaheadPaths = getLookaheadPaths;\nfunction buildLookaheadFuncForOr(occurrence, ruleGrammar, maxLookahead, hasPredicates, dynamicTokensEnabled, laFuncBuilder) {\n var lookAheadPaths = getLookaheadPathsForOr(occurrence, ruleGrammar, maxLookahead);\n var tokenMatcher = areTokenCategoriesNotUsed(lookAheadPaths)\n ? tokens_1.tokenStructuredMatcherNoCategories\n : tokens_1.tokenStructuredMatcher;\n return laFuncBuilder(lookAheadPaths, hasPredicates, tokenMatcher, dynamicTokensEnabled);\n}\nexports.buildLookaheadFuncForOr = buildLookaheadFuncForOr;\n/**\n * When dealing with an Optional production (OPTION/MANY/2nd iteration of AT_LEAST_ONE/...) we need to compare\n * the lookahead \"inside\" the production and the lookahead immediately \"after\" it in the same top level rule (context free).\n *\n * Example: given a production:\n * ABC(DE)?DF\n *\n * The optional '(DE)?' should only be entered if we see 'DE'. a single Token 'D' is not sufficient to distinguish between the two\n * alternatives.\n *\n * @returns A Lookahead function which will return true IFF the parser should parse the Optional production.\n */\nfunction buildLookaheadFuncForOptionalProd(occurrence, ruleGrammar, k, dynamicTokensEnabled, prodType, lookaheadBuilder) {\n var lookAheadPaths = getLookaheadPathsForOptionalProd(occurrence, ruleGrammar, prodType, k);\n var tokenMatcher = areTokenCategoriesNotUsed(lookAheadPaths)\n ? tokens_1.tokenStructuredMatcherNoCategories\n : tokens_1.tokenStructuredMatcher;\n return lookaheadBuilder(lookAheadPaths[0], tokenMatcher, dynamicTokensEnabled);\n}\nexports.buildLookaheadFuncForOptionalProd = buildLookaheadFuncForOptionalProd;\nfunction buildAlternativesLookAheadFunc(alts, hasPredicates, tokenMatcher, dynamicTokensEnabled) {\n var numOfAlts = alts.length;\n var areAllOneTokenLookahead = (0, every_1.default)(alts, function (currAlt) {\n return (0, every_1.default)(currAlt, function (currPath) {\n return currPath.length === 1;\n });\n });\n // This version takes into account the predicates as well.\n if (hasPredicates) {\n /**\n * @returns {number} - The chosen alternative index\n */\n return function (orAlts) {\n // unfortunately the predicates must be extracted every single time\n // as they cannot be cached due to references to parameters(vars) which are no longer valid.\n // note that in the common case of no predicates, no cpu time will be wasted on this (see else block)\n var predicates = (0, map_1.default)(orAlts, function (currAlt) { return currAlt.GATE; });\n for (var t = 0; t < numOfAlts; t++) {\n var currAlt = alts[t];\n var currNumOfPaths = currAlt.length;\n var currPredicate = predicates[t];\n if (currPredicate !== undefined && currPredicate.call(this) === false) {\n // if the predicate does not match there is no point in checking the paths\n continue;\n }\n nextPath: for (var j = 0; j < currNumOfPaths; j++) {\n var currPath = currAlt[j];\n var currPathLength = currPath.length;\n for (var i = 0; i < currPathLength; i++) {\n var nextToken = this.LA(i + 1);\n if (tokenMatcher(nextToken, currPath[i]) === false) {\n // mismatch in current path\n // try the next pth\n continue nextPath;\n }\n }\n // found a full path that matches.\n // this will also work for an empty ALT as the loop will be skipped\n return t;\n }\n // none of the paths for the current alternative matched\n // try the next alternative\n }\n // none of the alternatives could be matched\n return undefined;\n };\n }\n else if (areAllOneTokenLookahead && !dynamicTokensEnabled) {\n // optimized (common) case of all the lookaheads paths requiring only\n // a single token lookahead. These Optimizations cannot work if dynamically defined Tokens are used.\n var singleTokenAlts = (0, map_1.default)(alts, function (currAlt) {\n return (0, flatten_1.default)(currAlt);\n });\n var choiceToAlt_1 = (0, reduce_1.default)(singleTokenAlts, function (result, currAlt, idx) {\n (0, forEach_1.default)(currAlt, function (currTokType) {\n if (!(0, has_1.default)(result, currTokType.tokenTypeIdx)) {\n result[currTokType.tokenTypeIdx] = idx;\n }\n (0, forEach_1.default)(currTokType.categoryMatches, function (currExtendingType) {\n if (!(0, has_1.default)(result, currExtendingType)) {\n result[currExtendingType] = idx;\n }\n });\n });\n return result;\n }, {});\n /**\n * @returns {number} - The chosen alternative index\n */\n return function () {\n var nextToken = this.LA(1);\n return choiceToAlt_1[nextToken.tokenTypeIdx];\n };\n }\n else {\n // optimized lookahead without needing to check the predicates at all.\n // this causes code duplication which is intentional to improve performance.\n /**\n * @returns {number} - The chosen alternative index\n */\n return function () {\n for (var t = 0; t < numOfAlts; t++) {\n var currAlt = alts[t];\n var currNumOfPaths = currAlt.length;\n nextPath: for (var j = 0; j < currNumOfPaths; j++) {\n var currPath = currAlt[j];\n var currPathLength = currPath.length;\n for (var i = 0; i < currPathLength; i++) {\n var nextToken = this.LA(i + 1);\n if (tokenMatcher(nextToken, currPath[i]) === false) {\n // mismatch in current path\n // try the next pth\n continue nextPath;\n }\n }\n // found a full path that matches.\n // this will also work for an empty ALT as the loop will be skipped\n return t;\n }\n // none of the paths for the current alternative matched\n // try the next alternative\n }\n // none of the alternatives could be matched\n return undefined;\n };\n }\n}\nexports.buildAlternativesLookAheadFunc = buildAlternativesLookAheadFunc;\nfunction buildSingleAlternativeLookaheadFunction(alt, tokenMatcher, dynamicTokensEnabled) {\n var areAllOneTokenLookahead = (0, every_1.default)(alt, function (currPath) {\n return currPath.length === 1;\n });\n var numOfPaths = alt.length;\n // optimized (common) case of all the lookaheads paths requiring only\n // a single token lookahead.\n if (areAllOneTokenLookahead && !dynamicTokensEnabled) {\n var singleTokensTypes = (0, flatten_1.default)(alt);\n if (singleTokensTypes.length === 1 &&\n (0, isEmpty_1.default)(singleTokensTypes[0].categoryMatches)) {\n var expectedTokenType = singleTokensTypes[0];\n var expectedTokenUniqueKey_1 = expectedTokenType.tokenTypeIdx;\n return function () {\n return this.LA(1).tokenTypeIdx === expectedTokenUniqueKey_1;\n };\n }\n else {\n var choiceToAlt_2 = (0, reduce_1.default)(singleTokensTypes, function (result, currTokType, idx) {\n result[currTokType.tokenTypeIdx] = true;\n (0, forEach_1.default)(currTokType.categoryMatches, function (currExtendingType) {\n result[currExtendingType] = true;\n });\n return result;\n }, []);\n return function () {\n var nextToken = this.LA(1);\n return choiceToAlt_2[nextToken.tokenTypeIdx] === true;\n };\n }\n }\n else {\n return function () {\n nextPath: for (var j = 0; j < numOfPaths; j++) {\n var currPath = alt[j];\n var currPathLength = currPath.length;\n for (var i = 0; i < currPathLength; i++) {\n var nextToken = this.LA(i + 1);\n if (tokenMatcher(nextToken, currPath[i]) === false) {\n // mismatch in current path\n // try the next pth\n continue nextPath;\n }\n }\n // found a full path that matches.\n return true;\n }\n // none of the paths matched\n return false;\n };\n }\n}\nexports.buildSingleAlternativeLookaheadFunction = buildSingleAlternativeLookaheadFunction;\nvar RestDefinitionFinderWalker = /** @class */ (function (_super) {\n __extends(RestDefinitionFinderWalker, _super);\n function RestDefinitionFinderWalker(topProd, targetOccurrence, targetProdType) {\n var _this = _super.call(this) || this;\n _this.topProd = topProd;\n _this.targetOccurrence = targetOccurrence;\n _this.targetProdType = targetProdType;\n return _this;\n }\n RestDefinitionFinderWalker.prototype.startWalking = function () {\n this.walk(this.topProd);\n return this.restDef;\n };\n RestDefinitionFinderWalker.prototype.checkIsTarget = function (node, expectedProdType, currRest, prevRest) {\n if (node.idx === this.targetOccurrence &&\n this.targetProdType === expectedProdType) {\n this.restDef = currRest.concat(prevRest);\n return true;\n }\n // performance optimization, do not iterate over the entire Grammar ast after we have found the target\n return false;\n };\n RestDefinitionFinderWalker.prototype.walkOption = function (optionProd, currRest, prevRest) {\n if (!this.checkIsTarget(optionProd, PROD_TYPE.OPTION, currRest, prevRest)) {\n _super.prototype.walkOption.call(this, optionProd, currRest, prevRest);\n }\n };\n RestDefinitionFinderWalker.prototype.walkAtLeastOne = function (atLeastOneProd, currRest, prevRest) {\n if (!this.checkIsTarget(atLeastOneProd, PROD_TYPE.REPETITION_MANDATORY, currRest, prevRest)) {\n _super.prototype.walkOption.call(this, atLeastOneProd, currRest, prevRest);\n }\n };\n RestDefinitionFinderWalker.prototype.walkAtLeastOneSep = function (atLeastOneSepProd, currRest, prevRest) {\n if (!this.checkIsTarget(atLeastOneSepProd, PROD_TYPE.REPETITION_MANDATORY_WITH_SEPARATOR, currRest, prevRest)) {\n _super.prototype.walkOption.call(this, atLeastOneSepProd, currRest, prevRest);\n }\n };\n RestDefinitionFinderWalker.prototype.walkMany = function (manyProd, currRest, prevRest) {\n if (!this.checkIsTarget(manyProd, PROD_TYPE.REPETITION, currRest, prevRest)) {\n _super.prototype.walkOption.call(this, manyProd, currRest, prevRest);\n }\n };\n RestDefinitionFinderWalker.prototype.walkManySep = function (manySepProd, currRest, prevRest) {\n if (!this.checkIsTarget(manySepProd, PROD_TYPE.REPETITION_WITH_SEPARATOR, currRest, prevRest)) {\n _super.prototype.walkOption.call(this, manySepProd, currRest, prevRest);\n }\n };\n return RestDefinitionFinderWalker;\n}(rest_1.RestWalker));\n/**\n * Returns the definition of a target production in a top level level rule.\n */\nvar InsideDefinitionFinderVisitor = /** @class */ (function (_super) {\n __extends(InsideDefinitionFinderVisitor, _super);\n function InsideDefinitionFinderVisitor(targetOccurrence, targetProdType, targetRef) {\n var _this = _super.call(this) || this;\n _this.targetOccurrence = targetOccurrence;\n _this.targetProdType = targetProdType;\n _this.targetRef = targetRef;\n _this.result = [];\n return _this;\n }\n InsideDefinitionFinderVisitor.prototype.checkIsTarget = function (node, expectedProdName) {\n if (node.idx === this.targetOccurrence &&\n this.targetProdType === expectedProdName &&\n (this.targetRef === undefined || node === this.targetRef)) {\n this.result = node.definition;\n }\n };\n InsideDefinitionFinderVisitor.prototype.visitOption = function (node) {\n this.checkIsTarget(node, PROD_TYPE.OPTION);\n };\n InsideDefinitionFinderVisitor.prototype.visitRepetition = function (node) {\n this.checkIsTarget(node, PROD_TYPE.REPETITION);\n };\n InsideDefinitionFinderVisitor.prototype.visitRepetitionMandatory = function (node) {\n this.checkIsTarget(node, PROD_TYPE.REPETITION_MANDATORY);\n };\n InsideDefinitionFinderVisitor.prototype.visitRepetitionMandatoryWithSeparator = function (node) {\n this.checkIsTarget(node, PROD_TYPE.REPETITION_MANDATORY_WITH_SEPARATOR);\n };\n InsideDefinitionFinderVisitor.prototype.visitRepetitionWithSeparator = function (node) {\n this.checkIsTarget(node, PROD_TYPE.REPETITION_WITH_SEPARATOR);\n };\n InsideDefinitionFinderVisitor.prototype.visitAlternation = function (node) {\n this.checkIsTarget(node, PROD_TYPE.ALTERNATION);\n };\n return InsideDefinitionFinderVisitor;\n}(gast_2.GAstVisitor));\nfunction initializeArrayOfArrays(size) {\n var result = new Array(size);\n for (var i = 0; i < size; i++) {\n result[i] = [];\n }\n return result;\n}\n/**\n * A sort of hash function between a Path in the grammar and a string.\n * Note that this returns multiple \"hashes\" to support the scenario of token categories.\n * - A single path with categories may match multiple **actual** paths.\n */\nfunction pathToHashKeys(path) {\n var keys = [\"\"];\n for (var i = 0; i < path.length; i++) {\n var tokType = path[i];\n var longerKeys = [];\n for (var j = 0; j < keys.length; j++) {\n var currShorterKey = keys[j];\n longerKeys.push(currShorterKey + \"_\" + tokType.tokenTypeIdx);\n for (var t = 0; t < tokType.categoryMatches.length; t++) {\n var categoriesKeySuffix = \"_\" + tokType.categoryMatches[t];\n longerKeys.push(currShorterKey + categoriesKeySuffix);\n }\n }\n keys = longerKeys;\n }\n return keys;\n}\n/**\n * Imperative style due to being called from a hot spot\n */\nfunction isUniquePrefixHash(altKnownPathsKeys, searchPathKeys, idx) {\n for (var currAltIdx = 0; currAltIdx < altKnownPathsKeys.length; currAltIdx++) {\n // We only want to test vs the other alternatives\n if (currAltIdx === idx) {\n continue;\n }\n var otherAltKnownPathsKeys = altKnownPathsKeys[currAltIdx];\n for (var searchIdx = 0; searchIdx < searchPathKeys.length; searchIdx++) {\n var searchKey = searchPathKeys[searchIdx];\n if (otherAltKnownPathsKeys[searchKey] === true) {\n return false;\n }\n }\n }\n // None of the SearchPathKeys were found in any of the other alternatives\n return true;\n}\nfunction lookAheadSequenceFromAlternatives(altsDefs, k) {\n var partialAlts = (0, map_1.default)(altsDefs, function (currAlt) {\n return (0, interpreter_1.possiblePathsFrom)([currAlt], 1);\n });\n var finalResult = initializeArrayOfArrays(partialAlts.length);\n var altsHashes = (0, map_1.default)(partialAlts, function (currAltPaths) {\n var dict = {};\n (0, forEach_1.default)(currAltPaths, function (item) {\n var keys = pathToHashKeys(item.partialPath);\n (0, forEach_1.default)(keys, function (currKey) {\n dict[currKey] = true;\n });\n });\n return dict;\n });\n var newData = partialAlts;\n // maxLookahead loop\n for (var pathLength = 1; pathLength <= k; pathLength++) {\n var currDataset = newData;\n newData = initializeArrayOfArrays(currDataset.length);\n var _loop_1 = function (altIdx) {\n var currAltPathsAndSuffixes = currDataset[altIdx];\n // paths in current alternative loop\n for (var currPathIdx = 0; currPathIdx < currAltPathsAndSuffixes.length; currPathIdx++) {\n var currPathPrefix = currAltPathsAndSuffixes[currPathIdx].partialPath;\n var suffixDef = currAltPathsAndSuffixes[currPathIdx].suffixDef;\n var prefixKeys = pathToHashKeys(currPathPrefix);\n var isUnique = isUniquePrefixHash(altsHashes, prefixKeys, altIdx);\n // End of the line for this path.\n if (isUnique || (0, isEmpty_1.default)(suffixDef) || currPathPrefix.length === k) {\n var currAltResult = finalResult[altIdx];\n // TODO: Can we implement a containsPath using Maps/Dictionaries?\n if (containsPath(currAltResult, currPathPrefix) === false) {\n currAltResult.push(currPathPrefix);\n // Update all new keys for the current path.\n for (var j = 0; j < prefixKeys.length; j++) {\n var currKey = prefixKeys[j];\n altsHashes[altIdx][currKey] = true;\n }\n }\n }\n // Expand longer paths\n else {\n var newPartialPathsAndSuffixes = (0, interpreter_1.possiblePathsFrom)(suffixDef, pathLength + 1, currPathPrefix);\n newData[altIdx] = newData[altIdx].concat(newPartialPathsAndSuffixes);\n // Update keys for new known paths\n (0, forEach_1.default)(newPartialPathsAndSuffixes, function (item) {\n var prefixKeys = pathToHashKeys(item.partialPath);\n (0, forEach_1.default)(prefixKeys, function (key) {\n altsHashes[altIdx][key] = true;\n });\n });\n }\n }\n };\n // alternatives loop\n for (var altIdx = 0; altIdx < currDataset.length; altIdx++) {\n _loop_1(altIdx);\n }\n }\n return finalResult;\n}\nexports.lookAheadSequenceFromAlternatives = lookAheadSequenceFromAlternatives;\nfunction getLookaheadPathsForOr(occurrence, ruleGrammar, k, orProd) {\n var visitor = new InsideDefinitionFinderVisitor(occurrence, PROD_TYPE.ALTERNATION, orProd);\n ruleGrammar.accept(visitor);\n return lookAheadSequenceFromAlternatives(visitor.result, k);\n}\nexports.getLookaheadPathsForOr = getLookaheadPathsForOr;\nfunction getLookaheadPathsForOptionalProd(occurrence, ruleGrammar, prodType, k) {\n var insideDefVisitor = new InsideDefinitionFinderVisitor(occurrence, prodType);\n ruleGrammar.accept(insideDefVisitor);\n var insideDef = insideDefVisitor.result;\n var afterDefWalker = new RestDefinitionFinderWalker(ruleGrammar, occurrence, prodType);\n var afterDef = afterDefWalker.startWalking();\n var insideFlat = new gast_1.Alternative({ definition: insideDef });\n var afterFlat = new gast_1.Alternative({ definition: afterDef });\n return lookAheadSequenceFromAlternatives([insideFlat, afterFlat], k);\n}\nexports.getLookaheadPathsForOptionalProd = getLookaheadPathsForOptionalProd;\nfunction containsPath(alternative, searchPath) {\n compareOtherPath: for (var i = 0; i < alternative.length; i++) {\n var otherPath = alternative[i];\n if (otherPath.length !== searchPath.length) {\n continue;\n }\n for (var j = 0; j < otherPath.length; j++) {\n var searchTok = searchPath[j];\n var otherTok = otherPath[j];\n var matchingTokens = searchTok === otherTok ||\n otherTok.categoryMatchesMap[searchTok.tokenTypeIdx] !== undefined;\n if (matchingTokens === false) {\n continue compareOtherPath;\n }\n }\n return true;\n }\n return false;\n}\nexports.containsPath = containsPath;\nfunction isStrictPrefixOfPath(prefix, other) {\n return (prefix.length < other.length &&\n (0, every_1.default)(prefix, function (tokType, idx) {\n var otherTokType = other[idx];\n return (tokType === otherTokType ||\n otherTokType.categoryMatchesMap[tokType.tokenTypeIdx]);\n }));\n}\nexports.isStrictPrefixOfPath = isStrictPrefixOfPath;\nfunction areTokenCategoriesNotUsed(lookAheadPaths) {\n return (0, every_1.default)(lookAheadPaths, function (singleAltPaths) {\n return (0, every_1.default)(singleAltPaths, function (singlePath) {\n return (0, every_1.default)(singlePath, function (token) { return (0, isEmpty_1.default)(token.categoryMatches); });\n });\n });\n}\nexports.areTokenCategoriesNotUsed = areTokenCategoriesNotUsed;\n//# sourceMappingURL=lookahead.js.map","var baseSlice = require('./_baseSlice');\n\n/**\n * Casts `array` to a slice if it's needed.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {number} start The start position.\n * @param {number} [end=array.length] The end position.\n * @returns {Array} Returns the cast slice.\n */\nfunction castSlice(array, start, end) {\n var length = array.length;\n end = end === undefined ? length : end;\n return (!start && end >= length) ? array : baseSlice(array, start, end);\n}\n\nmodule.exports = castSlice;\n","var MapCache = require('./_MapCache'),\n setCacheAdd = require('./_setCacheAdd'),\n setCacheHas = require('./_setCacheHas');\n\n/**\n *\n * Creates an array cache object to store unique values.\n *\n * @private\n * @constructor\n * @param {Array} [values] The values to cache.\n */\nfunction SetCache(values) {\n var index = -1,\n length = values == null ? 0 : values.length;\n\n this.__data__ = new MapCache;\n while (++index < length) {\n this.add(values[index]);\n }\n}\n\n// Add methods to `SetCache`.\nSetCache.prototype.add = SetCache.prototype.push = setCacheAdd;\nSetCache.prototype.has = setCacheHas;\n\nmodule.exports = SetCache;\n","var overArg = require('./_overArg');\n\n/** Built-in value references. */\nvar getPrototype = overArg(Object.getPrototypeOf, Object);\n\nmodule.exports = getPrototype;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.toFastProperties = exports.timer = exports.PRINT_ERROR = exports.PRINT_WARNING = void 0;\nvar print_1 = require(\"./print\");\nObject.defineProperty(exports, \"PRINT_WARNING\", { enumerable: true, get: function () { return print_1.PRINT_WARNING; } });\nObject.defineProperty(exports, \"PRINT_ERROR\", { enumerable: true, get: function () { return print_1.PRINT_ERROR; } });\nvar timer_1 = require(\"./timer\");\nObject.defineProperty(exports, \"timer\", { enumerable: true, get: function () { return timer_1.timer; } });\nvar to_fast_properties_1 = require(\"./to-fast-properties\");\nObject.defineProperty(exports, \"toFastProperties\", { enumerable: true, get: function () { return to_fast_properties_1.toFastProperties; } });\n//# sourceMappingURL=api.js.map","var copyObject = require('./_copyObject'),\n getSymbolsIn = require('./_getSymbolsIn');\n\n/**\n * Copies own and inherited symbols of `source` to `object`.\n *\n * @private\n * @param {Object} source The object to copy symbols from.\n * @param {Object} [object={}] The object to copy symbols to.\n * @returns {Object} Returns `object`.\n */\nfunction copySymbolsIn(source, object) {\n return copyObject(source, getSymbolsIn(source), object);\n}\n\nmodule.exports = copySymbolsIn;\n","var isPrototype = require('./_isPrototype'),\n nativeKeys = require('./_nativeKeys');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction baseKeys(object) {\n if (!isPrototype(object)) {\n return nativeKeys(object);\n }\n var result = [];\n for (var key in Object(object)) {\n if (hasOwnProperty.call(object, key) && key != 'constructor') {\n result.push(key);\n }\n }\n return result;\n}\n\nmodule.exports = baseKeys;\n","var getTag = require('./_getTag'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar mapTag = '[object Map]';\n\n/**\n * The base implementation of `_.isMap` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a map, else `false`.\n */\nfunction baseIsMap(value) {\n return isObjectLike(value) && getTag(value) == mapTag;\n}\n\nmodule.exports = baseIsMap;\n","/**\n * Checks if a `cache` value for `key` exists.\n *\n * @private\n * @param {Object} cache The cache to query.\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction cacheHas(cache, key) {\n return cache.has(key);\n}\n\nmodule.exports = cacheHas;\n","var identity = require('./identity'),\n overRest = require('./_overRest'),\n setToString = require('./_setToString');\n\n/**\n * The base implementation of `_.rest` which doesn't validate or coerce arguments.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @returns {Function} Returns the new function.\n */\nfunction baseRest(func, start) {\n return setToString(overRest(func, start, identity), func + '');\n}\n\nmodule.exports = baseRest;\n","var freeGlobal = require('./_freeGlobal');\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\nmodule.exports = root;\n","var castPath = require('./_castPath'),\n isArguments = require('./isArguments'),\n isArray = require('./isArray'),\n isIndex = require('./_isIndex'),\n isLength = require('./isLength'),\n toKey = require('./_toKey');\n\n/**\n * Checks if `path` exists on `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} path The path to check.\n * @param {Function} hasFunc The function to check properties.\n * @returns {boolean} Returns `true` if `path` exists, else `false`.\n */\nfunction hasPath(object, path, hasFunc) {\n path = castPath(path, object);\n\n var index = -1,\n length = path.length,\n result = false;\n\n while (++index < length) {\n var key = toKey(path[index]);\n if (!(result = object != null && hasFunc(object, key))) {\n break;\n }\n object = object[key];\n }\n if (result || ++index != length) {\n return result;\n }\n length = object == null ? 0 : object.length;\n return !!length && isLength(length) && isIndex(key, length) &&\n (isArray(object) || isArguments(object));\n}\n\nmodule.exports = hasPath;\n","var isObject = require('./isObject');\n\n/** Built-in value references. */\nvar objectCreate = Object.create;\n\n/**\n * The base implementation of `_.create` without support for assigning\n * properties to the created object.\n *\n * @private\n * @param {Object} proto The object to inherit from.\n * @returns {Object} Returns the new object.\n */\nvar baseCreate = (function() {\n function object() {}\n return function(proto) {\n if (!isObject(proto)) {\n return {};\n }\n if (objectCreate) {\n return objectCreate(proto);\n }\n object.prototype = proto;\n var result = new object;\n object.prototype = undefined;\n return result;\n };\n}());\n\nmodule.exports = baseCreate;\n","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/**\n * Converts `value` to a string using `Object.prototype.toString`.\n *\n * @private\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n */\nfunction objectToString(value) {\n return nativeObjectToString.call(value);\n}\n\nmodule.exports = objectToString;\n","var baseTrim = require('./_baseTrim'),\n isObject = require('./isObject'),\n isSymbol = require('./isSymbol');\n\n/** Used as references for various `Number` constants. */\nvar NAN = 0 / 0;\n\n/** Used to detect bad signed hexadecimal string values. */\nvar reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\n/** Used to detect binary string values. */\nvar reIsBinary = /^0b[01]+$/i;\n\n/** Used to detect octal string values. */\nvar reIsOctal = /^0o[0-7]+$/i;\n\n/** Built-in method references without a dependency on `root`. */\nvar freeParseInt = parseInt;\n\n/**\n * Converts `value` to a number.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to process.\n * @returns {number} Returns the number.\n * @example\n *\n * _.toNumber(3.2);\n * // => 3.2\n *\n * _.toNumber(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toNumber(Infinity);\n * // => Infinity\n *\n * _.toNumber('3.2');\n * // => 3.2\n */\nfunction toNumber(value) {\n if (typeof value == 'number') {\n return value;\n }\n if (isSymbol(value)) {\n return NAN;\n }\n if (isObject(value)) {\n var other = typeof value.valueOf == 'function' ? value.valueOf() : value;\n value = isObject(other) ? (other + '') : other;\n }\n if (typeof value != 'string') {\n return value === 0 ? value : +value;\n }\n value = baseTrim(value);\n var isBinary = reIsBinary.test(value);\n return (isBinary || reIsOctal.test(value))\n ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n : (reIsBadHex.test(value) ? NAN : +value);\n}\n\nmodule.exports = toNumber;\n","\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.tokenMatcher = exports.createTokenInstance = exports.EOF = exports.createToken = exports.hasTokenLabel = exports.tokenName = exports.tokenLabel = void 0;\nvar isString_1 = __importDefault(require(\"lodash/isString\"));\nvar has_1 = __importDefault(require(\"lodash/has\"));\nvar isUndefined_1 = __importDefault(require(\"lodash/isUndefined\"));\nvar lexer_public_1 = require(\"./lexer_public\");\nvar tokens_1 = require(\"./tokens\");\nfunction tokenLabel(tokType) {\n if (hasTokenLabel(tokType)) {\n return tokType.LABEL;\n }\n else {\n return tokType.name;\n }\n}\nexports.tokenLabel = tokenLabel;\nfunction tokenName(tokType) {\n return tokType.name;\n}\nexports.tokenName = tokenName;\nfunction hasTokenLabel(obj) {\n return (0, isString_1.default)(obj.LABEL) && obj.LABEL !== \"\";\n}\nexports.hasTokenLabel = hasTokenLabel;\nvar PARENT = \"parent\";\nvar CATEGORIES = \"categories\";\nvar LABEL = \"label\";\nvar GROUP = \"group\";\nvar PUSH_MODE = \"push_mode\";\nvar POP_MODE = \"pop_mode\";\nvar LONGER_ALT = \"longer_alt\";\nvar LINE_BREAKS = \"line_breaks\";\nvar START_CHARS_HINT = \"start_chars_hint\";\nfunction createToken(config) {\n return createTokenInternal(config);\n}\nexports.createToken = createToken;\nfunction createTokenInternal(config) {\n var pattern = config.pattern;\n var tokenType = {};\n tokenType.name = config.name;\n if (!(0, isUndefined_1.default)(pattern)) {\n tokenType.PATTERN = pattern;\n }\n if ((0, has_1.default)(config, PARENT)) {\n throw (\"The parent property is no longer supported.\\n\" +\n \"See: https://github.com/chevrotain/chevrotain/issues/564#issuecomment-349062346 for details.\");\n }\n if ((0, has_1.default)(config, CATEGORIES)) {\n // casting to ANY as this will be fixed inside `augmentTokenTypes``\n tokenType.CATEGORIES = config[CATEGORIES];\n }\n (0, tokens_1.augmentTokenTypes)([tokenType]);\n if ((0, has_1.default)(config, LABEL)) {\n tokenType.LABEL = config[LABEL];\n }\n if ((0, has_1.default)(config, GROUP)) {\n tokenType.GROUP = config[GROUP];\n }\n if ((0, has_1.default)(config, POP_MODE)) {\n tokenType.POP_MODE = config[POP_MODE];\n }\n if ((0, has_1.default)(config, PUSH_MODE)) {\n tokenType.PUSH_MODE = config[PUSH_MODE];\n }\n if ((0, has_1.default)(config, LONGER_ALT)) {\n tokenType.LONGER_ALT = config[LONGER_ALT];\n }\n if ((0, has_1.default)(config, LINE_BREAKS)) {\n tokenType.LINE_BREAKS = config[LINE_BREAKS];\n }\n if ((0, has_1.default)(config, START_CHARS_HINT)) {\n tokenType.START_CHARS_HINT = config[START_CHARS_HINT];\n }\n return tokenType;\n}\nexports.EOF = createToken({ name: \"EOF\", pattern: lexer_public_1.Lexer.NA });\n(0, tokens_1.augmentTokenTypes)([exports.EOF]);\nfunction createTokenInstance(tokType, image, startOffset, endOffset, startLine, endLine, startColumn, endColumn) {\n return {\n image: image,\n startOffset: startOffset,\n endOffset: endOffset,\n startLine: startLine,\n endLine: endLine,\n startColumn: startColumn,\n endColumn: endColumn,\n tokenTypeIdx: tokType.tokenTypeIdx,\n tokenType: tokType\n };\n}\nexports.createTokenInstance = createTokenInstance;\nfunction tokenMatcher(token, tokType) {\n return (0, tokens_1.tokenStructuredMatcher)(token, tokType);\n}\nexports.tokenMatcher = tokenMatcher;\n//# sourceMappingURL=tokens_public.js.map","var constant = require('./constant'),\n defineProperty = require('./_defineProperty'),\n identity = require('./identity');\n\n/**\n * The base implementation of `setToString` without support for hot loop shorting.\n *\n * @private\n * @param {Function} func The function to modify.\n * @param {Function} string The `toString` result.\n * @returns {Function} Returns `func`.\n */\nvar baseSetToString = !defineProperty ? identity : function(func, string) {\n return defineProperty(func, 'toString', {\n 'configurable': true,\n 'enumerable': false,\n 'value': constant(string),\n 'writable': true\n });\n};\n\nmodule.exports = baseSetToString;\n","var baseIsRegExp = require('./_baseIsRegExp'),\n baseUnary = require('./_baseUnary'),\n nodeUtil = require('./_nodeUtil');\n\n/* Node.js helper references. */\nvar nodeIsRegExp = nodeUtil && nodeUtil.isRegExp;\n\n/**\n * Checks if `value` is classified as a `RegExp` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a regexp, else `false`.\n * @example\n *\n * _.isRegExp(/abc/);\n * // => true\n *\n * _.isRegExp('/abc/');\n * // => false\n */\nvar isRegExp = nodeIsRegExp ? baseUnary(nodeIsRegExp) : baseIsRegExp;\n\nmodule.exports = isRegExp;\n","var Uint8Array = require('./_Uint8Array');\n\n/**\n * Creates a clone of `arrayBuffer`.\n *\n * @private\n * @param {ArrayBuffer} arrayBuffer The array buffer to clone.\n * @returns {ArrayBuffer} Returns the cloned array buffer.\n */\nfunction cloneArrayBuffer(arrayBuffer) {\n var result = new arrayBuffer.constructor(arrayBuffer.byteLength);\n new Uint8Array(result).set(new Uint8Array(arrayBuffer));\n return result;\n}\n\nmodule.exports = cloneArrayBuffer;\n","\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.validateMissingCstMethods = exports.validateVisitor = exports.CstVisitorDefinitionError = exports.createBaseVisitorConstructorWithDefaults = exports.createBaseSemanticVisitorConstructor = exports.defaultVisit = void 0;\nvar isEmpty_1 = __importDefault(require(\"lodash/isEmpty\"));\nvar compact_1 = __importDefault(require(\"lodash/compact\"));\nvar isArray_1 = __importDefault(require(\"lodash/isArray\"));\nvar map_1 = __importDefault(require(\"lodash/map\"));\nvar forEach_1 = __importDefault(require(\"lodash/forEach\"));\nvar filter_1 = __importDefault(require(\"lodash/filter\"));\nvar keys_1 = __importDefault(require(\"lodash/keys\"));\nvar isFunction_1 = __importDefault(require(\"lodash/isFunction\"));\nvar isUndefined_1 = __importDefault(require(\"lodash/isUndefined\"));\nvar lang_extensions_1 = require(\"../../lang/lang_extensions\");\nfunction defaultVisit(ctx, param) {\n var childrenNames = (0, keys_1.default)(ctx);\n var childrenNamesLength = childrenNames.length;\n for (var i = 0; i < childrenNamesLength; i++) {\n var currChildName = childrenNames[i];\n var currChildArray = ctx[currChildName];\n var currChildArrayLength = currChildArray.length;\n for (var j = 0; j < currChildArrayLength; j++) {\n var currChild = currChildArray[j];\n // distinction between Tokens Children and CstNode children\n if (currChild.tokenTypeIdx === undefined) {\n this[currChild.name](currChild.children, param);\n }\n }\n }\n // defaultVisit does not support generic out param\n}\nexports.defaultVisit = defaultVisit;\nfunction createBaseSemanticVisitorConstructor(grammarName, ruleNames) {\n var derivedConstructor = function () { };\n // can be overwritten according to:\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/\n // name?redirectlocale=en-US&redirectslug=JavaScript%2FReference%2FGlobal_Objects%2FFunction%2Fname\n (0, lang_extensions_1.defineNameProp)(derivedConstructor, grammarName + \"BaseSemantics\");\n var semanticProto = {\n visit: function (cstNode, param) {\n // enables writing more concise visitor methods when CstNode has only a single child\n if ((0, isArray_1.default)(cstNode)) {\n // A CST Node's children dictionary can never have empty arrays as values\n // If a key is defined there will be at least one element in the corresponding value array.\n cstNode = cstNode[0];\n }\n // enables passing optional CstNodes concisely.\n if ((0, isUndefined_1.default)(cstNode)) {\n return undefined;\n }\n return this[cstNode.name](cstNode.children, param);\n },\n validateVisitor: function () {\n var semanticDefinitionErrors = validateVisitor(this, ruleNames);\n if (!(0, isEmpty_1.default)(semanticDefinitionErrors)) {\n var errorMessages = (0, map_1.default)(semanticDefinitionErrors, function (currDefError) { return currDefError.msg; });\n throw Error(\"Errors Detected in CST Visitor <\".concat(this.constructor.name, \">:\\n\\t\") +\n \"\".concat(errorMessages.join(\"\\n\\n\").replace(/\\n/g, \"\\n\\t\")));\n }\n }\n };\n derivedConstructor.prototype = semanticProto;\n derivedConstructor.prototype.constructor = derivedConstructor;\n derivedConstructor._RULE_NAMES = ruleNames;\n return derivedConstructor;\n}\nexports.createBaseSemanticVisitorConstructor = createBaseSemanticVisitorConstructor;\nfunction createBaseVisitorConstructorWithDefaults(grammarName, ruleNames, baseConstructor) {\n var derivedConstructor = function () { };\n // can be overwritten according to:\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/\n // name?redirectlocale=en-US&redirectslug=JavaScript%2FReference%2FGlobal_Objects%2FFunction%2Fname\n (0, lang_extensions_1.defineNameProp)(derivedConstructor, grammarName + \"BaseSemanticsWithDefaults\");\n var withDefaultsProto = Object.create(baseConstructor.prototype);\n (0, forEach_1.default)(ruleNames, function (ruleName) {\n withDefaultsProto[ruleName] = defaultVisit;\n });\n derivedConstructor.prototype = withDefaultsProto;\n derivedConstructor.prototype.constructor = derivedConstructor;\n return derivedConstructor;\n}\nexports.createBaseVisitorConstructorWithDefaults = createBaseVisitorConstructorWithDefaults;\nvar CstVisitorDefinitionError;\n(function (CstVisitorDefinitionError) {\n CstVisitorDefinitionError[CstVisitorDefinitionError[\"REDUNDANT_METHOD\"] = 0] = \"REDUNDANT_METHOD\";\n CstVisitorDefinitionError[CstVisitorDefinitionError[\"MISSING_METHOD\"] = 1] = \"MISSING_METHOD\";\n})(CstVisitorDefinitionError = exports.CstVisitorDefinitionError || (exports.CstVisitorDefinitionError = {}));\nfunction validateVisitor(visitorInstance, ruleNames) {\n var missingErrors = validateMissingCstMethods(visitorInstance, ruleNames);\n return missingErrors;\n}\nexports.validateVisitor = validateVisitor;\nfunction validateMissingCstMethods(visitorInstance, ruleNames) {\n var missingRuleNames = (0, filter_1.default)(ruleNames, function (currRuleName) {\n return (0, isFunction_1.default)(visitorInstance[currRuleName]) === false;\n });\n var errors = (0, map_1.default)(missingRuleNames, function (currRuleName) {\n return {\n msg: \"Missing visitor method: <\".concat(currRuleName, \"> on \").concat((visitorInstance.constructor.name), \" CST Visitor.\"),\n type: CstVisitorDefinitionError.MISSING_METHOD,\n methodName: currRuleName\n };\n });\n return (0, compact_1.default)(errors);\n}\nexports.validateMissingCstMethods = validateMissingCstMethods;\n//# sourceMappingURL=cst_visitor.js.map","/** Used to compose unicode character classes. */\nvar rsAstralRange = '\\\\ud800-\\\\udfff',\n rsComboMarksRange = '\\\\u0300-\\\\u036f',\n reComboHalfMarksRange = '\\\\ufe20-\\\\ufe2f',\n rsComboSymbolsRange = '\\\\u20d0-\\\\u20ff',\n rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange,\n rsVarRange = '\\\\ufe0e\\\\ufe0f';\n\n/** Used to compose unicode capture groups. */\nvar rsZWJ = '\\\\u200d';\n\n/** Used to detect strings with [zero-width joiners or code points from the astral planes](http://eev.ee/blog/2015/09/12/dark-corners-of-unicode/). */\nvar reHasUnicode = RegExp('[' + rsZWJ + rsAstralRange + rsComboRange + rsVarRange + ']');\n\n/**\n * Checks if `string` contains Unicode symbols.\n *\n * @private\n * @param {string} string The string to inspect.\n * @returns {boolean} Returns `true` if a symbol is found, else `false`.\n */\nfunction hasUnicode(string) {\n return reHasUnicode.test(string);\n}\n\nmodule.exports = hasUnicode;\n","var arrayEvery = require('./_arrayEvery'),\n baseEvery = require('./_baseEvery'),\n baseIteratee = require('./_baseIteratee'),\n isArray = require('./isArray'),\n isIterateeCall = require('./_isIterateeCall');\n\n/**\n * Checks if `predicate` returns truthy for **all** elements of `collection`.\n * Iteration is stopped once `predicate` returns falsey. The predicate is\n * invoked with three arguments: (value, index|key, collection).\n *\n * **Note:** This method returns `true` for\n * [empty collections](https://en.wikipedia.org/wiki/Empty_set) because\n * [everything is true](https://en.wikipedia.org/wiki/Vacuous_truth) of\n * elements of empty collections.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {boolean} Returns `true` if all elements pass the predicate check,\n * else `false`.\n * @example\n *\n * _.every([true, 1, null, 'yes'], Boolean);\n * // => false\n *\n * var users = [\n * { 'user': 'barney', 'age': 36, 'active': false },\n * { 'user': 'fred', 'age': 40, 'active': false }\n * ];\n *\n * // The `_.matches` iteratee shorthand.\n * _.every(users, { 'user': 'barney', 'active': false });\n * // => false\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.every(users, ['active', false]);\n * // => true\n *\n * // The `_.property` iteratee shorthand.\n * _.every(users, 'active');\n * // => false\n */\nfunction every(collection, predicate, guard) {\n var func = isArray(collection) ? arrayEvery : baseEvery;\n if (guard && isIterateeCall(collection, predicate, guard)) {\n predicate = undefined;\n }\n return func(collection, baseIteratee(predicate, 3));\n}\n\nmodule.exports = every;\n","var arrayEach = require('./_arrayEach'),\n baseEach = require('./_baseEach'),\n castFunction = require('./_castFunction'),\n isArray = require('./isArray');\n\n/**\n * Iterates over elements of `collection` and invokes `iteratee` for each element.\n * The iteratee is invoked with three arguments: (value, index|key, collection).\n * Iteratee functions may exit iteration early by explicitly returning `false`.\n *\n * **Note:** As with other \"Collections\" methods, objects with a \"length\"\n * property are iterated like arrays. To avoid this behavior use `_.forIn`\n * or `_.forOwn` for object iteration.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @alias each\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Array|Object} Returns `collection`.\n * @see _.forEachRight\n * @example\n *\n * _.forEach([1, 2], function(value) {\n * console.log(value);\n * });\n * // => Logs `1` then `2`.\n *\n * _.forEach({ 'a': 1, 'b': 2 }, function(value, key) {\n * console.log(key);\n * });\n * // => Logs 'a' then 'b' (iteration order is not guaranteed).\n */\nfunction forEach(collection, iteratee) {\n var func = isArray(collection) ? arrayEach : baseEach;\n return func(collection, castFunction(iteratee));\n}\n\nmodule.exports = forEach;\n","/**\n * A specialized version of `_.filter` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {Array} Returns the new filtered array.\n */\nfunction arrayFilter(array, predicate) {\n var index = -1,\n length = array == null ? 0 : array.length,\n resIndex = 0,\n result = [];\n\n while (++index < length) {\n var value = array[index];\n if (predicate(value, index, array)) {\n result[resIndex++] = value;\n }\n }\n return result;\n}\n\nmodule.exports = arrayFilter;\n","/**\n * Checks if a stack value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Stack\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction stackHas(key) {\n return this.__data__.has(key);\n}\n\nmodule.exports = stackHas;\n","var baseIndexOf = require('./_baseIndexOf'),\n isArrayLike = require('./isArrayLike'),\n isString = require('./isString'),\n toInteger = require('./toInteger'),\n values = require('./values');\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max;\n\n/**\n * Checks if `value` is in `collection`. If `collection` is a string, it's\n * checked for a substring of `value`, otherwise\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * is used for equality comparisons. If `fromIndex` is negative, it's used as\n * the offset from the end of `collection`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object|string} collection The collection to inspect.\n * @param {*} value The value to search for.\n * @param {number} [fromIndex=0] The index to search from.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`.\n * @returns {boolean} Returns `true` if `value` is found, else `false`.\n * @example\n *\n * _.includes([1, 2, 3], 1);\n * // => true\n *\n * _.includes([1, 2, 3], 1, 2);\n * // => false\n *\n * _.includes({ 'a': 1, 'b': 2 }, 1);\n * // => true\n *\n * _.includes('abcd', 'bc');\n * // => true\n */\nfunction includes(collection, value, fromIndex, guard) {\n collection = isArrayLike(collection) ? collection : values(collection);\n fromIndex = (fromIndex && !guard) ? toInteger(fromIndex) : 0;\n\n var length = collection.length;\n if (fromIndex < 0) {\n fromIndex = nativeMax(length + fromIndex, 0);\n }\n return isString(collection)\n ? (fromIndex <= length && collection.indexOf(value, fromIndex) > -1)\n : (!!length && baseIndexOf(collection, value, fromIndex) > -1);\n}\n\nmodule.exports = includes;\n","/**\n * This function is like `arrayIncludes` except that it accepts a comparator.\n *\n * @private\n * @param {Array} [array] The array to inspect.\n * @param {*} target The value to search for.\n * @param {Function} comparator The comparator invoked per element.\n * @returns {boolean} Returns `true` if `target` is found, else `false`.\n */\nfunction arrayIncludesWith(array, value, comparator) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n while (++index < length) {\n if (comparator(value, array[index])) {\n return true;\n }\n }\n return false;\n}\n\nmodule.exports = arrayIncludesWith;\n","\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.validateGrammar = exports.resolveGrammar = void 0;\nvar forEach_1 = __importDefault(require(\"lodash/forEach\"));\nvar defaults_1 = __importDefault(require(\"lodash/defaults\"));\nvar resolver_1 = require(\"../resolver\");\nvar checks_1 = require(\"../checks\");\nvar errors_public_1 = require(\"../../errors_public\");\nfunction resolveGrammar(options) {\n var actualOptions = (0, defaults_1.default)(options, {\n errMsgProvider: errors_public_1.defaultGrammarResolverErrorProvider\n });\n var topRulesTable = {};\n (0, forEach_1.default)(options.rules, function (rule) {\n topRulesTable[rule.name] = rule;\n });\n return (0, resolver_1.resolveGrammar)(topRulesTable, actualOptions.errMsgProvider);\n}\nexports.resolveGrammar = resolveGrammar;\nfunction validateGrammar(options) {\n options = (0, defaults_1.default)(options, {\n errMsgProvider: errors_public_1.defaultGrammarValidatorErrorProvider\n });\n return (0, checks_1.validateGrammar)(options.rules, options.tokenTypes, options.errMsgProvider, options.grammarName);\n}\nexports.validateGrammar = validateGrammar;\n//# sourceMappingURL=gast_resolver_public.js.map","/**\n * This method returns `false`.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {boolean} Returns `false`.\n * @example\n *\n * _.times(2, _.stubFalse);\n * // => [false, false]\n */\nfunction stubFalse() {\n return false;\n}\n\nmodule.exports = stubFalse;\n","var Stack = require('./_Stack'),\n arrayEach = require('./_arrayEach'),\n assignValue = require('./_assignValue'),\n baseAssign = require('./_baseAssign'),\n baseAssignIn = require('./_baseAssignIn'),\n cloneBuffer = require('./_cloneBuffer'),\n copyArray = require('./_copyArray'),\n copySymbols = require('./_copySymbols'),\n copySymbolsIn = require('./_copySymbolsIn'),\n getAllKeys = require('./_getAllKeys'),\n getAllKeysIn = require('./_getAllKeysIn'),\n getTag = require('./_getTag'),\n initCloneArray = require('./_initCloneArray'),\n initCloneByTag = require('./_initCloneByTag'),\n initCloneObject = require('./_initCloneObject'),\n isArray = require('./isArray'),\n isBuffer = require('./isBuffer'),\n isMap = require('./isMap'),\n isObject = require('./isObject'),\n isSet = require('./isSet'),\n keys = require('./keys'),\n keysIn = require('./keysIn');\n\n/** Used to compose bitmasks for cloning. */\nvar CLONE_DEEP_FLAG = 1,\n CLONE_FLAT_FLAG = 2,\n CLONE_SYMBOLS_FLAG = 4;\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n arrayTag = '[object Array]',\n boolTag = '[object Boolean]',\n dateTag = '[object Date]',\n errorTag = '[object Error]',\n funcTag = '[object Function]',\n genTag = '[object GeneratorFunction]',\n mapTag = '[object Map]',\n numberTag = '[object Number]',\n objectTag = '[object Object]',\n regexpTag = '[object RegExp]',\n setTag = '[object Set]',\n stringTag = '[object String]',\n symbolTag = '[object Symbol]',\n weakMapTag = '[object WeakMap]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n dataViewTag = '[object DataView]',\n float32Tag = '[object Float32Array]',\n float64Tag = '[object Float64Array]',\n int8Tag = '[object Int8Array]',\n int16Tag = '[object Int16Array]',\n int32Tag = '[object Int32Array]',\n uint8Tag = '[object Uint8Array]',\n uint8ClampedTag = '[object Uint8ClampedArray]',\n uint16Tag = '[object Uint16Array]',\n uint32Tag = '[object Uint32Array]';\n\n/** Used to identify `toStringTag` values supported by `_.clone`. */\nvar cloneableTags = {};\ncloneableTags[argsTag] = cloneableTags[arrayTag] =\ncloneableTags[arrayBufferTag] = cloneableTags[dataViewTag] =\ncloneableTags[boolTag] = cloneableTags[dateTag] =\ncloneableTags[float32Tag] = cloneableTags[float64Tag] =\ncloneableTags[int8Tag] = cloneableTags[int16Tag] =\ncloneableTags[int32Tag] = cloneableTags[mapTag] =\ncloneableTags[numberTag] = cloneableTags[objectTag] =\ncloneableTags[regexpTag] = cloneableTags[setTag] =\ncloneableTags[stringTag] = cloneableTags[symbolTag] =\ncloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] =\ncloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true;\ncloneableTags[errorTag] = cloneableTags[funcTag] =\ncloneableTags[weakMapTag] = false;\n\n/**\n * The base implementation of `_.clone` and `_.cloneDeep` which tracks\n * traversed objects.\n *\n * @private\n * @param {*} value The value to clone.\n * @param {boolean} bitmask The bitmask flags.\n * 1 - Deep clone\n * 2 - Flatten inherited properties\n * 4 - Clone symbols\n * @param {Function} [customizer] The function to customize cloning.\n * @param {string} [key] The key of `value`.\n * @param {Object} [object] The parent object of `value`.\n * @param {Object} [stack] Tracks traversed objects and their clone counterparts.\n * @returns {*} Returns the cloned value.\n */\nfunction baseClone(value, bitmask, customizer, key, object, stack) {\n var result,\n isDeep = bitmask & CLONE_DEEP_FLAG,\n isFlat = bitmask & CLONE_FLAT_FLAG,\n isFull = bitmask & CLONE_SYMBOLS_FLAG;\n\n if (customizer) {\n result = object ? customizer(value, key, object, stack) : customizer(value);\n }\n if (result !== undefined) {\n return result;\n }\n if (!isObject(value)) {\n return value;\n }\n var isArr = isArray(value);\n if (isArr) {\n result = initCloneArray(value);\n if (!isDeep) {\n return copyArray(value, result);\n }\n } else {\n var tag = getTag(value),\n isFunc = tag == funcTag || tag == genTag;\n\n if (isBuffer(value)) {\n return cloneBuffer(value, isDeep);\n }\n if (tag == objectTag || tag == argsTag || (isFunc && !object)) {\n result = (isFlat || isFunc) ? {} : initCloneObject(value);\n if (!isDeep) {\n return isFlat\n ? copySymbolsIn(value, baseAssignIn(result, value))\n : copySymbols(value, baseAssign(result, value));\n }\n } else {\n if (!cloneableTags[tag]) {\n return object ? value : {};\n }\n result = initCloneByTag(value, tag, isDeep);\n }\n }\n // Check for circular references and return its corresponding clone.\n stack || (stack = new Stack);\n var stacked = stack.get(value);\n if (stacked) {\n return stacked;\n }\n stack.set(value, result);\n\n if (isSet(value)) {\n value.forEach(function(subValue) {\n result.add(baseClone(subValue, bitmask, customizer, subValue, value, stack));\n });\n } else if (isMap(value)) {\n value.forEach(function(subValue, key) {\n result.set(key, baseClone(subValue, bitmask, customizer, key, value, stack));\n });\n }\n\n var keysFunc = isFull\n ? (isFlat ? getAllKeysIn : getAllKeys)\n : (isFlat ? keysIn : keys);\n\n var props = isArr ? undefined : keysFunc(value);\n arrayEach(props || value, function(subValue, key) {\n if (props) {\n key = subValue;\n subValue = value[key];\n }\n // Recursively populate clone (susceptible to call stack limits).\n assignValue(result, key, baseClone(subValue, bitmask, customizer, key, value, stack));\n });\n return result;\n}\n\nmodule.exports = baseClone;\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\tid: moduleId,\n\t\tloaded: false,\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Flag the module as loaded\n\tmodule.loaded = true;\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.nmd = (module) => {\n\tmodule.paths = [];\n\tif (!module.children) module.children = [];\n\treturn module;\n};","// startup\n// Load entry module and return exports\n// This entry module is referenced by other modules so it can't be inlined\nvar __webpack_exports__ = __webpack_require__(3475);\n"],"names":["baseGetAllKeys","getSymbols","keys","module","exports","object","listCacheClear","listCacheDelete","listCacheGet","listCacheHas","listCacheSet","ListCache","entries","index","length","this","clear","entry","set","prototype","get","has","assocIndexOf","splice","Array","key","data","__data__","pop","call","size","MapCache","memoize","func","resolver","TypeError","memoized","args","arguments","apply","cache","result","Cache","extendStatics","__extends","d","b","Object","setPrototypeOf","__proto__","p","hasOwnProperty","String","__","constructor","create","__importDefault","mod","__esModule","defineProperty","value","EarlyExitException","NotAllInputParsedException","NoViableAltException","MismatchedTokenException","isRecognitionException","includes_1","MISMATCHED_TOKEN_EXCEPTION","NO_VIABLE_ALT_EXCEPTION","EARLY_EXIT_EXCEPTION","NOT_ALL_INPUT_PARSED_EXCEPTION","RECOGNITION_EXCEPTION_NAMES","freeze","error","default","name","RecognitionException","_super","message","token","_newTarget","_this","resyncedTokens","Error","captureStackTrace","previousToken","Lexer","LexerDefinitionErrorType","lexer_1","noop_1","isEmpty_1","isArray_1","last_1","reject_1","map_1","forEach_1","keys_1","isUndefined_1","identity_1","assign_1","reduce_1","clone_1","utils_1","tokens_1","lexer_errors_public_1","reg_exp_parser_1","DEFAULT_LEXER_CONFIG","deferDefinitionErrorsHandling","positionTracking","lineTerminatorsPattern","lineTerminatorCharacters","ensureOptimizations","safeMode","errorMessageProvider","defaultLexerErrorProvider","traceInitPerf","skipValidations","recoveryEnabled","lexerDefinition","config","lexerDefinitionErrors","lexerDefinitionWarning","patternIdxToConfig","charCodeToPatternIdxToConfig","modes","emptyGroups","trackStartLines","trackEndLines","hasCustom","canModeBeOptimized","TRACE_INIT","phaseDesc","phaseImpl","traceInitIndent","indent","join","traceInitMaxIdent","console","log","concat","_a","timer","time","traceMethod","warn","traceInitVal","Infinity","actualDefinition","hasOnlySingleMode","LineTerminatorOptimizedTester","test","defaultMode","DEFAULT_MODE","performRuntimeChecks","performWarningRuntimeChecks","currModeValue","currModeName","currTokType","allModeNames","currModDef","currModName","currAnalyzeResult_1","push","validatePatterns","augmentTokenTypes","analyzeTokenTypes","tracer","canBeOptimized","allErrMessagesString","warningDescriptor","PRINT_WARNING","SUPPORT_STICKY","chopInput","match","matchWithTest","updateLastIndex","matchWithExec","handleModes","computeNewColumn","updateTokenEndLineColumnLocation","createTokenInstance","createFullToken","createStartOnlyToken","createOffsetOnlyToken","addToken","addTokenUsingPush","handlePayload","handlePayloadWithCustom","addTokenUsingMemberAccess","handlePayloadNoCustom","unOptimizedModes","cannotBeOptimized","modeName","clearRegExpParserCache","toFastProperties","tokenize","text","initialMode","tokenizeInternal","i","j","k","matchAltImage","longerAlt","matchedImage","payload","altPayload","imageLength","group","tokType","newToken","errLength","msg","getPossiblePatterns","orgText","orgLength","offset","matchedTokensIndex","guessedNumberOfTokens","Math","floor","matchedTokens","errors","line","undefined","column","groups","cloneEmptyGroups","trackLines","lineTerminatorPattern","currModePatternsLength","currCharCodeToPatternIdxToConfig","modeStack","emptyArray","getPossiblePatternsSlow","getPossiblePatternsOptimized","charCode","optimizedCharIdx","charCodeToOptimizedIndex","possiblePatterns","currConfig","pop_mode","popToken","tokenType","PUSH_MODE","msg_1","buildUnableToPopLexerModeMessage","startOffset","startLine","startColumn","image","newMode","modeCanBeOptimized","push_mode","nextCharCode","charCodeAt","chosenPatternIdxToConfig","chosenPatternsLength","currPattern","pattern","singleCharCode","short","isCustom","exec","longerAltLength","longerAltConfig","longerAltPattern","tokenTypeIdx","canLineTerminator","numOfLTsInMatch","foundTerminator","lastLTEndOffset","lastIndex","errorStartOffset","errorLine","errorColumn","foundResyncPoint","currConfig_1","buildUnexpectedCharactersMessage","tokens","pushMode","substring","regExp","newLastIndex","lastLTIdx","lastCharIsLT","fixForEndingInLT","endLine","endColumn","oldColumn","endOffset","tokenVector","tokenToAdd","regExpArray","SKIPPED","NA","baseIsEqualDeep","isObjectLike","baseIsEqual","other","bitmask","customizer","stack","getMapData","map","forEach","reIsUint","type","getRegExpAst","regexp_to_ast_1","regExpAstCache","regExpParser","RegExpParser","regExpStr","toString","regExpAst","fullText","charAt","__assign","assign","t","s","n","checkPrefixAlternativesAmbiguities","validateSomeNonEmptyLookaheadPath","validateTooManyAlts","RepetitionCollector","validateAmbiguousAlternationAlternatives","validateEmptyOrAlternative","getFirstNoneTerminal","validateNoLeftRecursion","validateRuleIsOverridden","validateRuleDoesNotAlreadyExist","OccurrenceValidationCollector","identifyProductionForDuplicates","validateGrammar","validateLookahead","first_1","drop_1","flatten_1","filter_1","difference_1","groupBy_1","pickBy_1","values_1","flatMap_1","parser_1","gast_1","lookahead_1","interpreter_1","gast_2","gast_3","dropRight_1","compact_1","prod","getProductionDslName","idx","getExtraProductionArgument","Terminal","terminalType","NonTerminal","nonTerminalName","options","lookaheadValidationErrorMessages","lookaheadStrategy","validate","rules","tokenTypes","grammarName","errorMessage","ParserDefinitionErrorType","CUSTOM_LOOKAHEAD_VALIDATION","topLevels","errMsgProvider","duplicateErrors","currTopLevel","topLevelRule","collectorVisitor","accept","allRuleProductions","allProductions","productionGroups","duplicates","currGroup","currDuplicates","firstProd","buildDuplicateFoundError","dslName","defError","DUPLICATE_PRODUCTIONS","ruleName","occurrence","param","parameter","validateDuplicateProductions","termsNamespaceConflictErrors","tokenNames","currToken","currRule","currRuleName","errMsg","buildNamespaceConflictError","CONFLICT_TOKENS_RULES_NAMESPACE","checkTerminalAndNoneTerminalsNameSpace","tooManyAltsErrors","curRule","duplicateRulesError","visitNonTerminal","subrule","visitOption","option","visitRepetitionWithSeparator","manySep","visitRepetitionMandatory","atLeastOne","visitRepetitionMandatoryWithSeparator","atLeastOneSep","visitRepetition","many","visitAlternation","or","visitTerminal","terminal","GAstVisitor","rule","allRules","className","buildDuplicateRuleNameError","DUPLICATE_RULE_NAME","definition","referencedRule","Alternative","Option","RepetitionMandatory","RepetitionMandatoryWithSeparator","RepetitionWithSeparator","Repetition","Alternation","currSubDef","isFirstOptional","isOptionalProd","hasMore","rest","definedRulesNames","INVALID_RULE_OVERRIDE","topRule","path","nextNonTerminals","buildLeftRecursionError","leftRecursionPath","LEFT_RECURSION","validNextSteps","errorsFromNextSteps","currRefRule","newPath","OrCollector","alternations","node","orCollector","ors","currOr","exceptLast","currAlternative","currAltIdx","possibleFirstInAlt","nextPossibleTokensAfter","tokenStructuredMatcher","buildEmptyAlternationError","alternation","emptyChoiceIdx","NONE_LAST_EMPTY_ALT","alternative","globalMaxLookahead","ignoreAmbiguities","currOccurrence","actualMaxLookahead","maxLookahead","alternatives","getLookaheadPathsForOr","altsAmbiguityErrors","foundAmbiguousPaths","identicalAmbiguities","currAlt","currPath","altsCurrPathAppearsIn","currOtherAlt","currOtherAltIdx","containsPath","alts","currAmbDescriptor","ambgIndices","buildAlternationAmbiguityError","ambiguityIndices","prefixPath","AMBIGUOUS_ALTS","checkAlternativesAmbiguities","altsPrefixAmbiguityErrors","buildTooManyAlternativesError","TOO_MANY_ALTS","pathsAndIndices","currPathsAndIdx","currPathAndIdx","targetIdx","targetPath","prefixAmbiguitiesPathsAndIndices","searchPathAndIdx","isStrictPrefixOfPath","currAmbPathAndIdx","buildAlternationPrefixAmbiguityError","AMBIGUOUS_PREFIX_ALTS","topLevelRules","currTopRule","currProd","prodType","getProdType","pathsInsideProduction","getLookaheadPathsForOptionalProd","buildEmptyRepetitionError","repetition","NO_NON_EMPTY_LOOKAHEAD","arrayMap","props","baseProperty","basePropertyDeep","isKey","toKey","ContentAssist","initContentAssist","computeContentAssist","startRuleName","precedingInput","startRuleGast","gastProductionsCache","tokenMatcher","getNextPossibleTokenTypes","grammarPath","topRuleName","ruleStack","topProduction","getGAstProductions","NextAfterTokenWalker","startWalking","baseHasIn","hasPath","baseFor","iteratee","Symbol","objectProto","nativeObjectToString","symToStringTag","toStringTag","isOwn","tag","unmasked","e","getAllKeys","equalFunc","isPartial","objProps","objLength","objStacked","othStacked","skipCtor","objValue","othValue","compared","objCtor","othCtor","baseTimes","isArguments","isArray","isBuffer","isIndex","isTypedArray","inherited","isArr","isArg","isBuff","isType","skipIndexes","isObject","isStrictComparable","arrayReduce","baseEach","baseIteratee","baseReduce","collection","accumulator","initAccum","defaultGrammarValidatorErrorProvider","defaultGrammarResolverErrorProvider","defaultParserErrorProvider","tokens_public_1","buildMismatchTokenMessage","expected","actual","expectedMsg","previous","hasTokenLabel","tokenLabel","buildNotAllInputParsedMessage","firstRedundant","buildNoViableAltMessage","expectedPathsPerAlt","customUserDescription","errPrefix","errSuffix","allLookAheadPaths","currAltPaths","nextValidTokenSequences","currTokenType","nextValidSequenceItems","itemMsg","buildEarlyExitMessage","expectedIterationPaths","buildRuleNotFoundError","undefinedRule","duplicateProds","topLevelName","duplicateProd","extraArgument","hasExplicitIndex","replace","pathMsg","currTok","currtok","currMessage","buildTokenNameError","pathNames","leftRecursivePath","buildInvalidRuleNameError","Rule","array","baseForOwn","createBaseEach","predicate","LexerAdapter","initLexerAdapter","tokVector","tokVectorLength","currIdx","newInput","selfAnalysisDone","reset","enumerable","configurable","SKIP_TOKEN","consumeToken","LA","END_OF_FILE","howMuch","soughtIdx","exportLexerState","importLexerState","newState","resetLexerState","moveToTerminatedState","getLexerPosition","Map","pairs","LARGE_ARRAY_SIZE","baseRest","isIterateeCall","assigner","sources","guard","source","thisArg","nativeCreate","getNative","string","split","basePickBy","getAllKeysIn","prop","RecognizerApi","exceptions_public_1","errors_public_1","checks_1","ACTION","impl","consume","consumeInternal","ruleToCall","subruleInternal","actionORMethodDef","optionInternal","altsOrOpts","orInternal","manyInternal","atLeastOneInternal","CONSUME","CONSUME1","CONSUME2","CONSUME3","CONSUME4","CONSUME5","CONSUME6","CONSUME7","CONSUME8","CONSUME9","SUBRULE","SUBRULE1","SUBRULE2","SUBRULE3","SUBRULE4","SUBRULE5","SUBRULE6","SUBRULE7","SUBRULE8","SUBRULE9","OPTION","OPTION1","OPTION2","OPTION3","OPTION4","OPTION5","OPTION6","OPTION7","OPTION8","OPTION9","OR","OR1","OR2","OR3","OR4","OR5","OR6","OR7","OR8","OR9","MANY","MANY1","MANY2","MANY3","MANY4","MANY5","MANY6","MANY7","MANY8","MANY9","MANY_SEP","manySepFirstInternal","MANY_SEP1","MANY_SEP2","MANY_SEP3","MANY_SEP4","MANY_SEP5","MANY_SEP6","MANY_SEP7","MANY_SEP8","MANY_SEP9","AT_LEAST_ONE","AT_LEAST_ONE1","AT_LEAST_ONE2","AT_LEAST_ONE3","AT_LEAST_ONE4","AT_LEAST_ONE5","AT_LEAST_ONE6","AT_LEAST_ONE7","AT_LEAST_ONE8","AT_LEAST_ONE9","AT_LEAST_ONE_SEP","atLeastOneSepFirstInternal","AT_LEAST_ONE_SEP1","AT_LEAST_ONE_SEP2","AT_LEAST_ONE_SEP3","AT_LEAST_ONE_SEP4","AT_LEAST_ONE_SEP5","AT_LEAST_ONE_SEP6","AT_LEAST_ONE_SEP7","AT_LEAST_ONE_SEP8","AT_LEAST_ONE_SEP9","RULE","implementation","DEFAULT_RULE_CONFIG","definitionErrors","ruleImplementation","defineRule","OVERRIDE_RULE","ruleErrors","BACKTRACK","grammarRule","isBackTrackingStack","orgState","saveRecogState","reloadRecogState","getSerializedGastProductions","serializeGrammar","version_1","VERSION","CstParser","EmbeddedActionsParser","EMPTY_ALT","lexer_public_1","createToken","EOF","tokenName","getLookaheadPaths","llk_lookahead_1","LLkLookaheadStrategy","serializeProduction","cst_dts_gen_1","generateCstDts","render_public_1","createSyntaxDiagramsCode","baseGetTag","baseHas","toFinite","remainder","hashClear","hashDelete","hashGet","hashHas","hashSet","Hash","start","Date","getTime","val","baseIndexOf","toInteger","nativeMax","max","fromIndex","stringToPath","assignValue","baseAssignValue","isNew","newValue","Stack","matchData","noCustomizer","srcValue","COMPARE_PARTIAL_FLAG","reWhitespace","memoizeCapped","rePropName","reEscapeChar","number","quote","subString","nativeNow","now","count","lastCalled","stamp","remaining","CellEvent","cloneArrayBuffer","typedArray","isDeep","buffer","byteOffset","Uint8Array","eq","equalArrays","mapToArray","setToArray","symbolProto","symbolValueOf","valueOf","byteLength","convert","stacked","arrayAggregator","baseAggregator","setter","initializer","isArrayLike","findIndexFunc","iterable","createAggregator","groupBy","rsAstralRange","rsAstral","rsCombo","rsFitz","rsNonAstral","rsRegional","rsSurrPair","reOptMod","rsModifier","rsOptVar","rsSeq","rsSymbol","reUnicode","RegExp","collectMethods","LooksAhead","has_1","initLooksAhead","dynamicTokensEnabled","DEFAULT_PARSER_CONFIG","lookAheadFuncsCache","preComputeLookaheadFunctions","repetitionMandatory","repetitionMandatoryWithSeparator","repetitionWithSeparator","prodIdx","laFunc","buildLookaheadForAlternation","prodOccurrence","hasPredicates","getKeyForAutomaticLookahead","fullRuleNameToShort","OR_IDX","setLaFuncCache","computeLookaheadFunc","MANY_IDX","OPTION_IDX","AT_LEAST_ONE_IDX","AT_LEAST_ONE_SEP_IDX","MANY_SEP_IDX","prodKey","prodMaxLookahead","dslMethodName","buildLookaheadForOptional","dslMethodIdx","currRuleShortName","getLastExplicitRuleShortName","getLaFuncFromCache","DslMethodsCollectorVisitor","dslMethods","PerformanceTracer","initPerformanceTracer","userTraceInitPerf","traceIsNumber","baseKeys","getTag","isPrototype","firstForTerminal","firstForBranching","firstForSequence","first","uniq_1","isSequenceProd","isBranchingProd","currSubProd","firstSet","seq","nextSubProdIdx","hasInnerProdsRemaining","isLastInnerProdOptional","allAlternativesFirsts","innerProd","arrayPush","keysFunc","symbolsFunc","copyObject","PRINT_ERROR","GastRecorder","some_1","isFunction_1","RECORDING_NULL_OBJECT","description","HANDLE_SEPARATOR","MAX_METHOD_IDX","pow","BITS_FOR_OCCURRENCE_IDX","RFT","RECORDING_PHASE_TOKEN","RECORDING_PHASE_CSTNODE","children","initGastRecorder","recordingProdStack","RECORDING_PHASE","enableRecording","_loop_1","arg1","arg2","consumeInternalRecord","subruleInternalRecord","optionInternalRecord","orInternalRecord","manyInternalRecord","manySepFirstInternalRecord","atLeastOneInternalRecord","atLeastOneSepFirstInternalRecord","ACTION_RECORD","BACKTRACK_RECORD","LA_RECORD","disableRecording","that","topLevelRuleRecord","def","newTopLevelRule","originalError","KNOWN_RECORDER_ERROR","mutabilityError","recordProd","recordOrProd","assertMethodIdxIsValid","getIdxSuffix","JSON","stringify","prevProd","newNoneTerminal","label","LABEL","outputCst","hasShortKeyProperty","prodConstructor","mainProdArg","handleSep","grammarAction","DEF","newProd","separator","SEP","MAX_LOOKAHEAD","hasOptions","newOrProd","IGNORE_AMBIGUITIES","GATE","currAltFlat","ALT","arraySome","baseSome","baseIsArguments","propertyIsEnumerable","self","saveState","input","groupIdx","restoreState","consumeChar","disjunction","flags","loc","begin","end","global","ignoreCase","multiLine","unicode","sticky","isRegExpFlag","popChar","addFlag","peekChar","terms","isTerm","term","isAssertion","assertion","atom","ASSERT_EXISTS","ASSERT_NEVER_REACH_HERE","quantifier","isBacktracking","range","atLeast","atMost","integerIncludingZero","isDigit","greedy","dotAll","atomEscape","characterClass","isPatternCharacter","patternCharacter","isQuantifier","complement","cc","decimalEscapeAtom","characterClassEscape","controlEscapeAtom","controlLetterEscapeAtom","nulCharacterAtom","hexEscapeSequenceAtom","regExpUnicodeEscapeSequenceAtom","identityEscapeAtom","positiveInteger","digitsCharCodes","whitespaceCodes","wordCharCodes","escapeCode","letter","toUpperCase","parseHexDigits","classPatternCharacterAtom","isClassAtom","from","classAtom","isRangeDash","to","insertToSet","classEscape","capturing","groupAst","decimalPatternNoZero","decimalPattern","parseInt","nextChar","isAtom","prevState","howMany","hexString","hexChar","hexDigitPattern","char","item","subItem","flagObj","flagKey","obj","BaseRegExpVisitor","visitChildren","child","visit","subChild","visitPattern","visitFlags","visitDisjunction","visitAlternative","visitStartAnchor","visitEndAnchor","visitWordBoundary","visitNonWordBoundary","visitLookahead","visitNegativeLookahead","visitCharacter","visitSet","visitGroup","visitGroupBackReference","visitQuantifier","castSlice","hasUnicode","stringToArray","methodName","strSymbols","chr","trailing","slice","fromRight","getRawTag","objectToString","baseClone","isKeyable","Promise","baseSetToString","setToString","shortOut","nativeKeysIn","isProto","isTokenType","hasExtendingTokensTypesMapProperty","hasExtendingTokensTypesProperty","hasCategoriesProperty","singleAssignCategoriesToksMap","assignCategoriesMapProp","assignCategoriesTokensProp","assignTokenDefaultProps","expandCategories","tokenIdxToClass","tokenShortNameIdx","tokenStructuredMatcherNoCategories","categories","searching","CATEGORIES","newCategories","categoryMatches","categoryMatchesMap","nextNode","pathNode","nextCategory","tokInstance","tokConstructor","instanceType","isParent","tokenTypesAndParents","isFlattenable","baseFlatten","depth","isStrict","RestWalker","walk","prevRest","subProd","currRest","walkProdRef","walkTerminal","walkFlat","walkOption","walkAtLeastOne","walkAtLeastOneSep","walkManySep","walkMany","walkOr","refProd","flatProd","fullOrRest","optionProd","atLeastOneProd","fullAtLeastOneRest","atLeastOneSepProd","fullAtLeastOneSepRest","restForRepetitionWithSeparator","manyProd","fullManyRest","manySepProd","fullManySepRest","orProd","alt","prodWrapper","repSepProd","castPath","nested","reFlags","regexp","baseToString","model_1","generate_1","defaultOptions","includeVisitorInterface","visitorInterfaceName","productions","effectiveOptions","model","buildModel","genDts","root","freeExports","nodeType","freeModule","Buffer","allocUnsafe","copy","getSymbolsIn","keysIn","baseUniq","visitor_1","helpers_1","Plus","Minus","Mult","Div","LParen","RParen","Comma","RowRange","NumberLiteral","longer_alt","Variable","SheetName","CellRange","CellRef","StringLiteral","Concat","FunctionName","WhiteSpace","GreaterThan","LessThan","GreaterThanEqual","LessThanEqual","Equal","NotEqual","IfFunction","TrueKeyword","FalseKeyword","NullKeyword","ArrayRowSep","RangeIntersect","ErrorConstant","IfErrorFunction","IfsFunction","SwitchFunction","LCurly","RCurly","ColumnRange","Power","allTokens","CalxTokens","CalxLexer","CalxParser","super","comparisonExpression","atomicExpression","$","arrayFormula","expression","additionExpression","concatenationExpression","multiplicationExpression","exponentiationExpression","unaryExpression","ifFunctionCall","functionCall","ifErrorFunctionCall","ifsFunctionCall","switchFunctionCall","arrayRow","performSelfAnalysis","parse","inputText","lexResult","cst","ErrorType","ArrayResult","values","rows","cols","getValue","row","col","isSingleValue","getSingleValue","toFlatArray","fromVerticalArray","v","fromHorizontalArray","from2DArray","normalized","newRow","fromSingleValue","parserInstance","CalxInterpreter","getBaseCstVisitorConstructorWithDefaults","validateVisitor","setContext","context","yy","getContext","ctx","separators","sort","a","currentRow","expressions","exp","left","lhs","rhs","right","operators","rightValue","operator","arrayOperation","operation","isError","leftArray","rightArray","resultLength","leftVal","min","rightVal","Number","str","ref","sheetName","resolveVariable","resolveCellReference","resolveCellRange","resolveRowRange","resolveColumnRange","condition","isTruthy","whenTrue","whenFalse","funcName","expr","callFunction","excelEpoch","msPerDay","getFunction","executeBuiltInFunction","isErrorValue","valueIfError","conditions","results","arrayExpression","getNamedRange","workbook","nameManager","getVariable","getCellValue","getCellRange","getRowRange","getColumnRange","includes","reduce","sum","flattenAndSum","isNaN","flattenedArray","flattenArray","filter","arrayMax","arrayMin","every","some","arr","flat","parseInput","cleanInput","startsWith","parseCst","ERROR","Range","sheet","address","_cells","_address","parseAddress","loadCells","cleanAddress","addr","_startAddress","trim","_endAddress","isSingleCell","cell","getCellDirect","expandRange","cells","startCol","startRow","endCol","endRow","startColNum","colToNum","endColNum","minRow","maxRow","minCol","maxCol","numToCol","getValues","setValuesFromArray","formula","cellIndex","rowData","setValues","toArray","calculate","columns","each","callback","find","getCellAt","getCellAtPosition","num","fromCharCode","getRange","SheetEvent","SheetState","DataType","DateUtil","serialToDate","serialDate","epochDate","ms","MS_PER_DAY","dateToSerial","date","isValidSerialDate","fromComponents","year","month","day","toComponents","getFullYear","getMonth","getDate","weekday","getDay","hours","getHours","minutes","getMinutes","seconds","getSeconds","toISOString","fromISOString","isoString","today","setHours","EXCEL_EPOCH","Cell","_type","NUMBER","_rules","precedents","dependents","remotePrecedents","remoteDependents","dynamicPrecedents","_dirty","_calculated","_hasRemotePrecedents","_hasRemoteDependents","_hasDynamicPrecedents","_isArrayAnchor","init","mount","el","dispatcher","dispatch","ELEMENT_MOUNTED","isEmpty","rawValue","_computed","_value","_formula","eval","handleArrayResult","valueChanged","CALCULATED","_markDependentsAsDirty","autoCalculate","_recalculateDependents","arrayResult","_arrayResult","checkSpillRange","spillArray","SPILL","getCellCoordinates","r","c","targetAddress","coordinatesToAddress","targetCell","getCell","_spillRange","colStr","isArrayAnchor","getSpillRange","setFormat","format","getFormat","setFormatter","formatter","getFormattedValue","isCalculated","isDirty","markAsDirty","isNumeric","parseFloat","oldFormula","updateDynamicPrecedents","FORMULA_CHANGED","newFormula","oldPrecedents","getPrecedents","precedent","removeDependent","rebuildDependencies","builder","setWorkbook","localDeps","remoteDeps","getFormulaDependencies","dependencies","precedentCell","addDependent","setPrecedents","remoteRef","cellAddress","parseRemoteReference","targetSheet","getSheet","addRemoteDependent","addRemotePrecedent","parsed","BOOLEAN","DATE","DATETIME","TIME","TEXT","trimmed","upperValue","parts","VALUE_CHANGED","invalidateDynamicDependents","recalculateDirtyCells","getDependents","dependent","getStringValue","getNumericValue","getDateValue","getSerialDateValue","setDateValue","setSerialDateValue","getFormattedDate","isDate","addPrecedent","setDependents","columnRanges","rowRanges","columnPattern","rowPattern","beforeMatch","hasDynamicPrecedents","dependsOnColumn","colNum","columnToNumber","dependsOnRow","CellRegistry","event","add","CELL_ADDED","remove","CELL_REMOVED","CELL_CREATED","all","filtered","numToStr","round","strToNum","chars","base","indexOf","getCellsInRange","regex","rangeStart","rangeEnd","boundaries","cellRange","isValidBinary","strRepeat","qty","repeat","unique","initial","arrayMerge","objectToArray","trimEmptyCell","rangeToTable","alphaPattern","numPattern","arrayTable","resultTable","colLength","resultRow","rowLength","transposeTable","table","newTable","translateFormula","cellRowOffset","cellColOffset","translated","col1Abs","col1","row1Abs","row1","col2Abs","col2","row2Abs","row2","col1Num","row1Num","newRow1Num","newStart","col2Num","row2Num","newRow2Num","colAbs","rowAbs","rowNum","newRowNum","updateMovedReferences","oldStartCol","oldStartRow","oldEndCol","oldEndRow","newStartCol","newStartRow","newEndCol","newEndRow","oldStartColNum","oldEndColNum","newStartColNum","newEndColNum","oldMinRow","oldMaxRow","oldMinCol","oldMaxCol","newMinRow","newMaxRow","newMinCol","newMaxCol","rangeMinCol","rangeMaxCol","rangeMinRow","rangeMaxRow","newCol1","newCol2","Sheet","EventDispatcher","_states","calculation","CALCULATION_IDLE","_variables","_autoCalculate","_id","_generateId","random","wasAutoCalculate","element","setAttribute","id","_el","ELEMENT_ATTACHED","listen","withoutEvent","pauseListener","_depTree","calculationOrder","topologicalSort","level","resumeListener","requestCalculate","depAddress","cellAddr","createCell","setActiveSheet","parser","buildDependencyTree","DependencyBuilder","build","setVariable","getCellRangeValues","startColMatch","startRowMatch","endColMatch","endRowMatch","getRowRangeValues","allCells","rowMatch","getColumnRangeValues","colMatch","loadArray","anchor","anchorMatch","anchorCol","anchorRow","anchorColNum","formulaRowOffset","formulaColOffset","rowIdx","colIdx","translatedFormula","moveRange","srcRange","dstAddress","srcParts","srcStart","srcEnd","srcStartCol","srcStartRow","srcEndCol","srcEndRow","dstCleaned","dstStartCol","dstStartRow","srcStartColNum","srcEndColNum","colCount","abs","rowCount","dstStartColNum","dstEndColNum","dstEndRow","dstEndCol","rowOffset","colOffset","srcCellAddresses","cellData","srcAddr","srcColMatch","srcRowMatch","srcCol","dstRow","dstAddr","existingCell","updatedFormula","copyRange","srcCell","nil","div0","na","flattenShallow","aIsArray","bIsArray","isFlat","flatten","argument","argsToArray","arrayEach","numbers","cleanFloat","power","parseBool","bool","up","parseNumber","parseString","parseNumberArray","len","parseDate","serial","utc_days","date_info","fractional_day","total_seconds","days","getUTCDate","getUTCMonth","getUTCFullYear","serialNumberToDate","parseDateArray","anyError","isDefined","arg","anyIsError","anyIsString","arrayValuesToNumbers","d1900","UTC","WEEK_STARTS","WEEK_TYPES","WEEKEND_TYPES","DATEDIF","start_date","end_date","unit","start_date_year","start_date_month","start_date_day","end_date_year","end_date_month","end_date_day","YEARFRAC","DAYS","setFullYear","setMonth","DATEVALUE","date_text","DAY","serial_number","startOfDay","newDate","DAYS360","method","sm","sd","ed","em","smd","emd","EDATE","months","EOMONTH","HOUR","INTERVAL","second","hour","sec","ISOWEEKNUM","setDate","yearStart","ceil","MINUTE","MONTH","NETWORKDAYS","holidays","INTL","NOW","SECOND","minute","TIMEVALUE","time_text","TODAY","WEEKDAY","return_type","WEEKNUM","week_start","jan","inc","WORKDAY","YEAR","isLeapYear","daysBetween","basis","sy","ey","feb29Between","date1","date2","year1","mar1year1","year2","mar1year2","ylength","years","average","addOn","weekend","isMask","maskDays","maskIndex","maskRegex","h","total","getTimezoneOffset","getUTCDay","dec","holiday","defaultOperator","validSymbols","_TOKEN_TYPE_OPERATOR","_TOKEN_TYPE_LITERAL","SUPPORTED_TOKENS","TOKEN_TYPE_OPERATOR","TOKEN_TYPE_LITERAL","literalValue","analyzedTokens","castValueToCorrectType","unshift","analyzeTokens","expressionLength","cursorIndex","processedValue","processedSymbol","tokenizeExpression","compute","evaluate","CELL","INFO","ISBLANK","ISBINARY","ISERR","value$1","isFinite","ISERROR","ISEVEN","ISFORMULA","ISLOGICAL","ISNA","ISNONTEXT","ISNUMBER","ISODD","ISREF","ISTEXT","N","SHEET","SHEETS","TYPE","CHOOSE","COLUMN","reference","COLUMNS","HLOOKUP","lookup_value","table_array","row_index_num","range_lookup","VLOOKUP","matrix","INDEX","row_num","column_num","someError","isOneDimensionRange","LOOKUP","result_array","isNumberLookup","localeCompare","MATCH","lookup_array","match_type","indexValue","lookupValueStr","toLowerCase","ROWS","TRANSPOSE","UNIQUE","hasElement","col_index_num","exactMatchOnly","error_val","SQRT2PI","AVEDEV","flatArgumentsDefined","subtract","AVERAGE","AVERAGEA","AVERAGEIF","criteria","average_range","average_count","isWildcard","tokenizedCriteria","AVERAGEIFS","criteriaLength","isMeetCondition","computedResult","BETA","x","alpha","beta","cumulative","cdf","pdf","probability","inv","BINOM","number_s","trials","probability_s","DIST","RANGE","number_s2","COMBIN","INV","CHISQ","deg_freedom","RT","TEST","actual_range","expected_range","tmp","dof","xsqr","Pi","PI","sqrt","ChiSq","CONFIDENCE","CORREL","array1","array2","COUNT","COUNTA","flatArguments","COUNTBLANK","COUNTIN","blanks","COUNTIF","matches","COUNTIFS","COUNTUNIQUE","NORM","standard_dev","T","COVARIANCE","DEVSQ","mean","P","mean1","mean2","S","EXPON","lambda","F","FISHER","FISHERINV","y","e2y","FORECAST","known_ys","known_xs","xmean","ymean","den","FREQUENCY","data_array","bins_array","GAMMA","GAMMALN","GAUSS","z","GEOMEAN","GROWTH","known_y","known_x","new_x","use_const","avg_x","avg_y","avg_xy","avg_xx","new_y","HARMEAN","deg_freedom1","deg_freedom2","sumOfSquares","x1","SUM","x2","PRECISE","HYPGEOM","INTERCEPT","KURT","sigma","LARGE","LINEST","m","LOGEST","sample_s","number_sample","population_s","number_pop","M","LOGNORM","MAX","MAXA","MEDIAN","MIN","MINA","MODE","currentItem","maxItems","MULT","NEGBINOM","number_f","PEARSON","den1","den2","PERCENTILE","l","fl","PERCENTRANK","PERMUT","number_chosen","FACT","PERMUTATIONA","PHI","EXC","significance","uniques","INC","POISSON","PROB","x_range","prob_range","lower_limit","upper_limit","sorted","QUARTILE","quart","RANK","ROW","RSQ","SKEW","SLOPE","SMALL","STANDARDIZE","AVG","order","EQ","m2","m3","STDEV","STDEVA","VARA","STDEVPA","VARPA","STEYX","lft","VAR","T$1","TREND","new_xs","linest","TRIMMEAN","percent","FLOOR","mean_x","mean_y","s_x","s_y","WEIBULL","Z","ABS","ACOS","acos","ACOSH","ACOT","atan","ACOTH","AGGREGATE","function_num","ref1","ref2","PRODUCT","SNGL","ARABIC","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I","ASIN","asin","ASINH","ATAN","ATAN2","x_num","y_num","atan2","ATANH","BASE","radix","min_length","anyError$1","CEILING","mode","precision","ROUND","COMBINA","COS","cos","COSH","COT","tan","COTH","e2","CSC","sin","CSCH","DECIMAL","DEGREES","angle","EVEN","EXP","MATH","MEMOIZED_FACT","FACTDOUBLE","GCD","r0","ri","INT","ISO","LCM","o","LN","LN10","LN2","LOG10E","LOG2E","LOG","LOG10","MOD","divisor","modulus","MROUND","multiple","MULTINOMIAL","ODD","temp","E","POWER","QUOTIENT","numerator","denominator","RADIANS","RAND","RANDBETWEEN","bottom","top","ROMAN","digits","roman","num_digits","ROUNDDOWN","ROUNDUP","SEC","SECH","SERIESSUM","coefficients","SIGN","SIN","SINH","SQRT","SQRTPI","SQRT1_2","SQRT2","SUBTOTAL","ADD","num1","num2","MINUS","DIVIDE","dividend","MULTIPLY","factor1","factor2","GT","GTE","LT","LTE","value1","value2","NE","POW","exponent","inner_result","SUMIF","sum_range","sumValue","SUMIFS","shift","criterias","valueToTest","SUMPRODUCT","arrays","product","_i","_ij","_ij_arg","_i_arg","SUMSQ","SUMX2MY2","array_x","array_y","SUMX2PY2","SUMXMY2","TAN","TANH","TRUNC","ASC","BAHTTEXT","CHAR","CLEAN","CODE","CONCATENATE","trueFound","falseFound","CONCAT","DBCS","DOLLAR","decimals","style","currency","minimumFractionDigits","maximumFractionDigits","formattedNumber","toLocaleString","EXACT","text1","text2","FIND","find_text","within_text","start_num","found_index","FIXED","no_commas","factor","toFixed","HTML2TEXT","LEFT","num_chars","LEN","LOWER","MID","NUMBERVALUE","decimal_separator","group_separator","PRONETIC","PROPER","txt","substr","REGEXEXTRACT","regular_expression","REGEXMATCH","full","REGEXREPLACE","replacement","REPLACE","old_text","new_text","REPT","number_times","RIGHT","SEARCH","foundAt","SPLIT","SUBSTITUTE","instance_num","currencySymbol","isPercent","endsWith","TEXTJOIN","delimiter","ignore_empty","flatArgs","textToJoin","chunks","TRIM","UNICHAR","UNICODE","UPPER","VALUE","output","isValidBinaryNumber","BESSELI","bessel","besseli","BESSELJ","besselj","BESSELK","besselk","BESSELY","bessely","BIN2DEC","stringified","BIN2HEX","places","BIN2OCT","BITAND","number1","number2","BITLSHIFT","shift_amount","BITOR","BITRSHIFT","BITXOR","COMPLEX","real_num","i_num","suffix","sign","CONVERT","from_unit","to_unit","units","binary_prefixes","Yi","Zi","Ei","Ti","Gi","Mi","ki","unit_prefixes","Y","G","u","f","base_from_unit","base_to_unit","from_multiplier","to_multiplier","from_binary_prefix","from_unit_prefix","to_binary_prefix","to_unit_prefix","DEC2BIN","DEC2HEX","DEC2OCT","DELTA","ERF","ERFC","GESTEP","step","HEX2BIN","negative","decimal","HEX2DEC","HEX2OCT","IMABS","inumber","IMREAL","IMAGINARY","plus","minus","last","IMARGUMENT","IMCONJUGATE","IMCOS","IMCOSH","IMCOT","IMDIV","IMSIN","inumber1","inumber2","unit1","unit2","IMEXP","IMLN","IMLOG10","IMLOG2","IMPOWER","IMPRODUCT","IMSEC","IMSECH","IMSINH","IMSQRT","IMCSC","IMCSCH","IMSUB","IMSUM","IMTAN","OCT2BIN","OCT2DEC","OCT2HEX","BETADIST","BETAINV","BINOMDIST","CEILINGMATH","CEILINGPRECISE","CHIDIST","CHIDISTRT","CHIINV","CHIINVRT","CHITEST","COVAR","COVARIANCEP","COVARIANCES","CRITBINOM","ERFCPRECISE","ERFPRECISE","EXPONDIST","FDIST","FDISTRT","FINV","FINVRT","FLOORMATH","FLOORPRECISE","FTEST","GAMMADIST","GAMMAINV","GAMMALNPRECISE","HYPGEOMDIST","LOGINV","LOGNORMDIST","LOGNORMINV","MODEMULT","MODESNGL","NEGBINOMDIST","NETWORKDAYSINTL","NORMDIST","NORMINV","NORMSDIST","NORMSINV","PERCENTILEEXC","PERCENTILEINC","PERCENTRANKEXC","PERCENTRANKINC","POISSONDIST","QUARTILEEXC","QUARTILEINC","RANKAVG","RANKEQ","SKEWP","STDEVP","STDEVS","TDIST","TDISTRT","TINV","TTEST","VARP","VARS","WEIBULLDIST","WORKDAYINTL","ZTEST","compact","FINDFIELD","database","title","findResultIndex","maxCriteriaLength","currentCriteriaResult","hasMatchingCriteria","criteriaField","DAVERAGE","field","resultIndexes","targetFields","DCOUNT","targetValues","DCOUNTA","DGET","DMAX","maxValue","DMIN","minValue","DPRODUCT","DSTDEV","DSTDEVP","DSUM","DVAR","DVARP","validDate","ensureDate","ACCRINT","issue","first_interest","settlement","rate","par","frequency","ACCRINTM","AMORDEGRC","AMORLINC","COUPDAYBS","COUPDAYS","COUPDAYSNC","COUPNCD","COUPNUM","COUPPCD","CUMIPMT","nper","pv","start_period","end_period","payment","PMT","interest","FV","CUMPRINC","principal","DB","cost","salvage","life","period","current","ceiling","DDB","DISC","DOLLARDE","fractional_dollar","fraction","DOLLARFR","decimal_dollar","DURATION","EFFECT","nominal_rate","npery","FVSCHEDULE","schedule","future","INTRATE","IPMT","per","fv","IRR","guess","irrResult","dates","irrResultDeriv","frac","positive","newRate","epsRate","resultValue","resultRate","contLoop","ISPMT","MDURATION","MIRR","finance_rate","reinvest_rate","payments","incomes","NPV","NOMINAL","effect_rate","NPER","pmt","ODDFPRICE","ODDFYIELD","ODDLPRICE","ODDLYIELD","PDURATION","PPMT","PRICE","PRICEDISC","PRICEMAT","PV","RATE","epsMax","dy","df","RECEIVED","RRI","SLN","SYD","TBILLEQ","maturity","discount","TBILLPRICE","TBILLYIELD","pr","VDB","XIRR","XNPV","YIELD","YIELDDISC","YIELDMAT","AND","FALSE","IF","logical_test","value_if_true","value_if_false","IFS","IFERROR","value_if_error","IFNA","value_if_na","NOT","logical","TRUE","XOR","SWITCH","targetValue","argc","switchCount","switchSatisfied","hasDefaultClause","defaultClause","FLATTEN","ARGS2ARRAY","REFERENCE","opening","JOIN","NUMBERS","FormulaJSWrapper","upperName","Calx","formulae","sequenceFunction","bind","sortFunction","filterFunction","uniqueFunction","fn","sortIndex","sortOrder","byCol","arr2D","aVal","bVal","include","ifEmpty","include1D","includeVal","exactlyOnce","was1D","seen","convertArg","isDynamicArrayFunction","getAvailableFunctions","hasFunction","SharedContext","sheets","_formulaJSWrapper","activeSheet","addSheet","resolve","NameManager","_nameRegistry","_workbook","define","comment","isValidName","getReference","namedRange","getActiveSheet","getSheets","sheetNames","getAll","Comparator","equal","notEqual","lessThan","greaterThan","lessEqualThan","greaterEqualThan","createParser","interpreter","globalFormatterRegistry","cleaned","inputStr","hasPercent","integer","globalStyleFormatterRegistry","color","zero","Workbook","_elements","Set","_eventListeners","_formatters","_styleFormatters","_sheets","_parser","_dispatcher","_nameManager","isValidCellAddress","_deps","_depsBuilder","hydrateObj","attachElement","detachElement","delete","_removeElementListeners","_addElementListener","eventName","handler","target","listeners","removeEventListener","registerFormatter","registerStyleFormatter","getFormatter","getStyleFormatter","registerGlobalFormatter","registerGlobalStyleFormatter","getGlobalFormatter","destroy","createSheet","loadData","cellKey","exportJSON","variables","createFromData","sharedContext","utility","comparator","createFromElement","elements","NodeList","varName","hasSheetStructure","getAttribute","flatData","convertedData","_processDataAttributes","_setupEventListeners","_updateAllCells","calxCounter","querySelectorAll","autoAddress","dataType","tagName","initialValue","defaultValue","textContent","typeMap","focusHandler","cellRef","blurHandler","formattedValue","changeHandler","rawInput","isReadonly","readOnly","readonly","hasFormula","parsedValue","inputHandler","addEventListener","globalDoc","globalThis","document","activeElement","dataFormat","cellFormat","displayValue","_applyStyleFormatter","styleFormatterName","styleFormatter","css","property","setFormula","setFormulae","createWorkbook","createWorkbookFromData","createWorkbookFromElement","createInterpreter","every_1","alreadyVisited","AbstractProduction","nativeKeys","overArg","stubFalse","mapCacheClear","mapCacheDelete","mapCacheGet","mapCacheHas","mapCacheSet","baseIsMatch","getMatchData","matchesStrictComparable","resIndex","symbol","baseSlice","asciiToArray","unicodeToArray","SetCache","arrayIncludes","arrayIncludesWith","baseUnary","cacheHas","isCommon","valuesLength","outer","computed","valuesIndex","GastRefResolverVisitor","resolveGrammar","refResolver","resolveRefs","nameToTopRule","UNRESOLVED_SUBRULE_REF","unresolvedRefName","identity","nodeAny","visitRule","trimmedEndIndex","reTrimStart","transform","possiblePathsFrom","NextTerminalAfterAtLeastOneSepWalker","NextTerminalAfterAtLeastOneWalker","NextTerminalAfterManySepWalker","NextTerminalAfterManyWalker","AbstractNextTerminalAfterProductionWalker","AbstractNextPossibleTokensWalker","rest_1","first_2","topProd","possibleTokTypes","nextProductionName","nextProductionOccurrence","found","isAtEndOfPath","reverse","occurrenceStack","updateExpectedNext","fullRest","nextTerminalName","nextTerminalOccurrence","lastTok","lastTokOccurrence","restProd","isEndOfRule","firstAfterMany","firstAfterManySep","firstAfterAtLeastOne","atleastOneSepProd","firstAfterfirstAfterAtLeastOneSep","expandTopLevelRule","currRuleStack","currOccurrenceStack","newRuleStack","newCurrOccurrenceStack","targetDef","maxLength","getAlternativesForProd","newDef","partialPath","suffixDef","initialDef","tokMatcher","maxLookAhead","EXIT_NON_TERMINAL","EXIT_NON_TERMINAL_ARR","EXIT_ALTERNATIVE","foundCompletePath","tokenVectorLength","minimalAlternativesIndex","possiblePaths","currDef","nextPath","nextIdx","nextTokenType","nextTokenOccurrence","newOccurrenceStack","nextPathWithout","nextPathWith","secondIteration","separatorGast","nthRepetition","currAltPath","noop","createSet","defineNameProp","nameValue","writable","arrayFilter","stubArray","nativeGetSymbols","getOwnPropertySymbols","defaults","propsIndex","propsLength","baseFindIndex","factory","BESSEL","version","_horner","_bessel_iter","f0","f1","tdx","f2","_bessel_wrap","bessel0","bessel1","nonzero","NaN","W","b0_a1a","b0_a2a","b0_a1b","b0_a2b","b1_a1a","b1_a2a","b1_a1b","b1_a2b","b0_a","b0_b","b1_a","b1_b","a1","a2","xx","ret","jsum","bjp","bj","bjm","tox","bip","bi","bim","DO_NOT_EXPORT_BESSEL","freeGlobal","g","isFunction","isLength","typedArrayTags","IN","minOptimizationVal","buildLineBreakIssueMessage","isShortPattern","isCustomPattern","addStickyFlag","addStartOfInput","findUnreachablePatterns","findModesThatDoNotExist","findInvalidGroupType","findDuplicatePatterns","findUnsupportedFlags","findStartOfInputAnchor","findEmptyMatchRegExps","findEndOfInputAnchor","findInvalidPatterns","findMissingPatterns","enableSticky","disableSticky","MODES","indexOf_1","isString_1","find_1","isRegExp_1","defaults_1","reg_exp_1","PATTERN","tokenTypesWithMissingPattern","currType","MISSING_PATTERN","valid","tokenTypesWithInvalidPattern","INVALID_PATTERN","onlyRelevantTypes","useSticky","debug","action","charCodeToOptimizedIdxMap","initCharCodeToOptimizedIndexMap","allTransformedPatterns","patternIdxToType","patternIdxToGroup","patternIdxToLongerAltIdxArr","patternIdxToPushMode","patternIdxToPopMode","patternIdxToCanLineTerminator","patternIdxToIsCustom","patternIdxToShort","regExpSource","escapedRegExpString","wrappedRegExp","clazz","groupName","GROUP","longerAltType","LONGER_ALT","lineTerminatorCharCodes","getCharCodes","LINE_BREAKS","checkLineBreaksIssues","canMatchCharCode","acc","optimizedIdx","addToMapOfArrays","START_CHARS_HINT","lastOptimizedIdx_1","charOrInt","currOptimizedIdx","failedOptimizationPrefixMsg","optimizedCodes","getOptimizedStartCodesIndices","code","validModesNames","missingResult","invalidResult","validTokenTypes","withRegExpPatterns","validateRegExpPattern","end_of_input","EndAnchorFinder","invalidRegex","regexpAst","endAnchorVisitor","EOI_ANCHOR_FOUND","matchesEmptyString","EMPTY_MATCH_PATTERN","start_of_input","StartAnchorFinder","startAnchorVisitor","SOI_ANCHOR_FOUND","invalidFlags","multiline","UNSUPPORTED_FLAGS_FOUND","identicalPatterns","outerType","innerType","duplicatePatterns","currIdenticalSet","setOfIdentical","tokenTypeNames","dupPatternSrc","DUPLICATE_PATTERNS_FOUND","invalidTypes","INVALID_GROUP_TYPE_FOUND","validModes","invalidModes","PUSH_MODE_DOES_NOT_EXIST","canBeTested","metaChars","testIdx","testTokenType","UNREACHABLE_PATTERN","IDENTIFY_TERMINATOR","CUSTOM_LINE_BREAK","details","charsOrCodes","numOrString","MULTI_MODE_LEXER_WITHOUT_DEFAULT_MODE","MULTI_MODE_LEXER_WITHOUT_MODES_PROPERTY","MULTI_MODE_LEXER_DEFAULT_MODE_VALUE_DOES_NOT_EXIST","LEXER_DEFINITION_CANNOT_CONTAIN_UNDEFINED","currLongerAlt","MULTI_MODE_LEXER_LONGER_ALT_NOT_IN_CURRENT_MODE","warnings","hasAnyLineBreak","allTokenTypes","concreteTokenTypes","terminatorCharCodes","currIssue","NO_LINE_BREAKS_FLAGS","clonedResult","groupKeys","currKey","currGroupValue","isMasked","toSource","reIsHostCtor","funcProto","Function","funcToString","reIsNative","baseMap","baseMatches","baseMatchesProperty","coreJsData","Ctor","baseCreate","getPrototype","eachFunc","DataView","_listeners","_isEventPaused","listener","addListener","hasListener","removeListener","listenerArray","eventData","__spreadArray","pack","ar","leftRecursionErrors","emptyAltErrors","validateEmptyOrAlternatives","ambiguousAltsErrors","emptyRepetitionErrors","buildLookaheadFuncForOr","buildAlternativesLookAheadFunc","buildLookaheadFuncForOptionalProd","buildSingleAlternativeLookaheadFunction","seenIndex","upperFirst","createCaseFirst","WeakMap","mapTag","promiseTag","setTag","weakMapTag","dataViewTag","dataViewCtorString","mapCtorString","promiseCtorString","setCtorString","weakMapCtorString","ArrayBuffer","ctorString","baseValues","spreadableSymbol","isConcatSpreadable","arrLength","othLength","arrStacked","arrValue","othIndex","arrayLikeKeys","grammar","_b","_c","resourceBase","_d","freeProcess","process","nodeUtil","require","types","binding","generator","CstNodeDefinitionGenerator","rawElements","visitEach","grouped","propertyName","properties","allNullable","canBeNull","propertyType","optional","visitEachAndOverrideWith","getType","override","production","kind","baseIsNative","baseIsNaN","strictIndexOf","createAssigner","dataView","buildInProdFollowPrefix","buildBetweenProdsFollowPrefix","computeAllProdsFollows","ResyncFollowsWalker","constants_1","follows","followName","t_in_topProd_follows","inner","occurenceInParent","topProductions","reSyncFollows","currRefsFollow","firstCharOptimizedIndices","complementErrorMessage","ast","addOptimizedIdxToResult","rangeCode","minUnOptVal","maxUnOptVal","minOptIdx","maxOptIdx","currOptIdx","isOptionalQuantifier","isWholeOptional","upperChar","lowerChar","handleIgnoreCase","findCode","setNode","targetCharCodes","codeOrRange","range_1","targetCode","msgSuffix","CharCodeFinder","charCodes","charCodeFinder","baseDifference","isArrayLikeObject","difference","toBecomeFast","FakeConstructor","fakeInstance","fakeAccess","bar","Parser","follow_1","gast_resolver_public_1","recoverable_1","looksahead_1","tree_builder_1","lexer_adapter_1","recognizer_api_1","recognizer_engine_1","error_handler_1","context_assist_1","gast_recorder_1","perf_tracer_1","apply_mixins_1","nodeLocationTracking","recoveryValueFunc","resyncEnabled","tokenVocabulary","initErrorHandler","initRecognizerEngine","initRecoverable","initTreeBuilder","defErrorsMsgs","recordedRuleGast","originalGrammarAction","resolverErrors","validationErrors","tokensMap","lookaheadValidationErrors","allFollows","resyncFollows","initialize","DEFER_DEFINITION_ERRORS_HANDLING","applyMixins","Recoverable","TreeBuilder","RecognizerEngine","ErrorHandler","configClone","upperFirst_1","getTypeString","getNodeInterfaceName","getNodeChildrenTypeName","nodes","contentParts","nodeCstInterface","nodeInterfaceName","childrenTypeName","genNodeInterface","nodeChildrenInterface","typeName","typeNames","buildTypeString","genChildProperty","genNodeChildrenType","genCstNodeTypes","genVisitorFunction","jStat","calcRdx","isNumber","_init","retZero","retOne","retIdent","utils","toVector","_random_fn","setRandom","extend","dimensions","rowa","submat","arange","ind","cola","diag","nrow","res","antidiag","transpose","objArr","toAlter","ncol","cumreduce","alter","zeros","ones","rand","symmetric","cnt","hival","rl","_slice","list","rcSlice","colSlice","rowSlice","sliceAssign","A","B","nl","ml","diagonal","diagArray","mat","jProto","funcs","passfunc","setTimeout","ascNum","clip","sumsqrd","sumsqerr","sumrow","low","high","hash","_arr","meansqerr","geomean","logs","meanOfLogs","median","arrlen","cumsum","cumprod","diff","diffs","arrLen","rank","distinctNumbers","numberCounts","sortedDistinctNumbers","numberRanks","currentRank","maxCount","numMaxCount","mode_arr","variance","flag","pooledvariance","samples","deviation","dev","stdev","pooledstdev","meandev","meddev","coeffvar","quartiles","quantiles","quantilesArray","alphap","betap","aleph","gamma","sortedArray","quantileVals","percentile","exclusive","realIndex","percentileOfScore","score","counter","strict","histogram","binCnt","binWidth","bins","covariance","arr1","arr2","arr1Len","sq_dev","corrcoeff","spearmancoeff","stanMoment","mu","skewSum","skewness","kurtosis","fullbool","tmpthis","callbackFunction","argsToPass","curriedFunction","vector","gammaln","cof","ser","loggam","x0","xp","gl","gl0","gammafn","yi","q","fact","xden","xnum","gammap","lowRegGamma","an","aln","ap","del","ITMAX","factorialln","factorial","combination","combinationln","permutation","betafn","betaln","betacf","aa","fpmin","qab","qap","qam","gammapinv","pp","lna1","afac","gln","erf","ty","isneg","dd","erfc","erfcinv","err","ibetainv","lna","lnb","al","w","b1","ibeta","bt","randn","randg","shape","oalph","betinc","eps","c9","a0","b0","m9","tukeyWprob","rr","xleg","aleg","qsqz","wincr","pr_w","normal","blb","binc","bub","einsum","cc1","wi","elsum","jj","ac","qexpo","rinsum","newthis","sample","vals","fnfunc","centralF","df1","df2","binomial","cauchy","local","scale","chisquare","exponential","invgamma","kumaraswamy","lognormal","noncentralt","ncp","studentt","tol","flip","prob","lastvalue","std","pareto","dof2","weibull","uniform","betacdf","negbin","hypgeom","scaledPDF","samplesDone","scaledCDF","poisson","sumarr","sampleSmall","sampleLarge","U","slam","loglam","invalpha","vr","us","lam","triangular","arcsine","laplace","tukey","nmeans","xlegq","alegq","ulen","f2lf","f21","ff4","ans","otsum","twa1","t1","ps","tukeyQinv","valx0","valx1","iter","isUsable","divide","multiply","nrescols","rescols","dot","norm","nnorm","aug","newarr","gauss_jordan","det","determinant","submatrix","gauss_elimination","maug","pivot","y2","maxrow","triaUpSolve","matrix_mode","triaLowSolve","lu","R","cholesky","gauss_jacobi","xv","xk","gauss_seidel","SOR","householder","QR","lstsq","array_mode","Q","attrs","Q1","RI","Aj","cAi","Ij","cIi","R_I","Q2","jacobi","maxim","theta","ev","rungekutta","t_j","u_j","k1","k2","k3","romberg","h1","richardson","pos","y1","h_min","simpson","hermite","dF","dl","lagrange","cubic_spline","sq","gauss_quadrature","PCA","temp1","Bt","temp2","Vt","differenceOfProportions","p1","n1","p2","n2","pooled","zscore","ztest","sides","tscore","ttest","anovafscore","expVar","sampMean","sampSampMean","tmpargs","unexpVar","anovaftest","ftest","fscore","anovaftes","qscore","qtest","tukeyhsd","means","normalci","change","tci","significant","pvalue","oneSidedDifferenceOfProportions","twoSidedDifferenceOfProportions","models","ols","endog","exog","nobs","df_model","df_resid","coef","predict","resid","ybar","SSE","SSR","SST","R2","t_test","var_count","subModelList","endog_index","exog_index","sigmaHat","seBetaHat","tStatistic","pValue","leftppf","interval95","se","F_statistic","F_test","adjust_R2","buildxmatrix","matrixRows","builddxmatrix","buildjxmatrix","jMat","pass","buildymatrix","buildjymatrix","matrixmult","regress","jMatX","jMatY","innerinv","xtranspxinv","xtransp","next","regresst","compile","jMatYBar","yBar","yAverage","anova","residuals","ssr","msr","sse","mse","sst","mst","r2","fratio","rmse","r2adj","stats","sds","ts","covar","xtranspx","matrixsubtract","createBaseFor","otherArgs","addNoneTerminalToCst","addTerminalToCst","setNodeLocationFull","setNodeLocationOnlyOffset","currNodeLocation","newLocationInfo","tokenTypeName","ruleResult","BITS_FOR_ALT_IDX","BITS_FOR_RULE_IDX","BITS_FOR_METHOD_TYPE","ruleIdx","equalByTag","equalObjects","argsTag","arrayTag","objectTag","objIsArr","othIsArr","objTag","othTag","objIsObj","othIsObj","isSameTag","objIsWrapped","othIsWrapped","objUnwrapped","othUnwrapped","baseIsTypedArray","nodeIsTypedArray","derivedCtor","baseCtors","baseCtor","baseProto","getOwnPropertyNames","propName","basePropDescriptor","getOwnPropertyDescriptor","cloneDataView","cloneRegExp","cloneSymbol","cloneTypedArray","isObject_1","shortRuleNameToFull","ruleShortNameIdx","subruleIdx","RULE_STACK","RULE_OCCURRENCE_STACK","allTokenTypes_1","uniqueTokens","noTokenCategoriesUsed","tokenConstructor","invokeRuleWithTry","shortName","ruleInvocationStateUpdate","CST_STACK","cstPostRule","invokeRuleCatch","ruleFinallyStateUpdate","resyncEnabledConfig","isFirstInvokedRule","reSyncEnabled","isBackTracking","recogError","partialCstResult","reSyncTokType","findReSyncTokenType","isInCurrentRuleReSyncSet","reSyncTo","recoveredNode","optionInternalLogic","lookAheadFunc","predicate_1","orgLookaheadFunction_1","laKey","atLeastOneInternalLogic","predicate_2","orgLookaheadFunction_2","raiseEarlyExitException","PROD_TYPE","REPETITION_MANDATORY","ERR_MSG","notStuck","doSingleRepetition","attemptInRepetitionRecovery","atLeastOneSepFirstInternalLogic","REPETITION_MANDATORY_WITH_SEPARATOR","separatorLookAheadFunc","repetitionSepSecondInternal","manyInternalLogic","lookaheadFunction","predicate_3","orgLookaheadFunction_3","manySepFirstInternalLogic","nextTerminalAfterWalker","beforeIteration","altIdxToTake","raiseNoAltException","cstFinallyStateUpdate","isAtEndOfInput","firstRedundantTok","getCurrRuleFullName","SAVE_ERROR","ARGS","cstPostNonTerminal","subruleInternalError","consumedToken","nextToken","consumeInternalError","eFromConsumption","consumeInternalRecovery","cstPostTerminal","getFollowsForInRuleRecovery","tryInRuleRecovery","eFromInRuleRecovery","IN_RULE_RECOVERY_EXCEPTION","savedErrors","savedRuleStack","lexerState","fullName","idxInCallingRule","cstInvocationStateUpdate","shortRuleNameToFullName","stackClear","stackDelete","stackGet","stackHas","stackSet","baseKeysIn","baseGet","uid","maskSrcKey","IE_PROTO","createFind","toNumber","INFINITY","baseSet","paths","cst_1","cst_visitor_1","setNodeLocationFromToken","setNodeLocationFromNode","setInitialNodeLocation","setInitialNodeLocationFullRecovery","cstPostRuleFull","setInitialNodeLocationFullRegular","setInitialNodeLocationOnlyOffsetRecovery","cstPostRuleOnlyOffset","setInitialNodeLocationOnlyOffsetRegular","cstNode","location","fullRuleName","ruleCstNode","prevToken","rootCst","ruleCstResult","preCstNode","getBaseCstVisitorConstructor","baseCstVisitorConstructor","newBaseCstVisitorConstructor","createBaseSemanticVisitorConstructor","baseCstVisitorWithDefaultsConstructor","newConstructor","createBaseVisitorConstructorWithDefaults","getPreviousExplicitRuleShortName","getLastExplicitRuleOccurrenceIndex","isSymbol","symbolToString","baseFilter","baseIsMap","nodeIsMap","isMap","_errors","getHumanReadableRuleStack","ruleOccurrenceStack","newErrors","userDefinedErrMsg","ruleGrammar","insideProdPaths","actualTokens","errMsgTypes","lookAheadPathsPerAlternative","hasIn","negate","InRuleRecoveryException","EOF_FOLLOW_KEY","firstAfterRepMap","getTokenToInsert","tokToInsert","isInsertedInRecovery","canTokenTypeBeInsertedInRecovery","canTokenTypeBeDeletedInRecovery","tryInRepetitionRecovery","grammarRuleArgs","expectedTokType","savedLexerState","passedResyncPoint","nextTokenWithoutResync","generateErrorMessage","addToResyncTokens","shouldInRepetitionRecoveryBeTried","expectTokAfterLastMatch","nextTokIdx","canPerformInRuleRecovery","tokIdxInRule","getCurrentGrammarPath","canRecoverWithSingleTokenInsertion","canRecoverWithSingleTokenDeletion","nextTok","expectedToken","mismatchedTok","possibleFollowsTokType","followKey","getCurrFollowKey","currentRuleReSyncSet","getFollowSetFromFollowKey","allPossibleReSyncTokTypes","flattenFollowSet","foundMatch","resyncTokType","currRuleIdx","prevRuleShortName","inRule","buildFullFollowKeyStack","explicitRuleStack","explicitOccurrenceStack","followStack","resyncTokens","prodFunc","lookaheadFunc","nextToksWalker","currShortName","firstAfterRepInfo","DependencyTree","cellRegistry","depTree","buildTree","_updateGraph","levels","visited","cellLevels","calculateLevel","maxLevel","precedentLevel","flattenToTopology","getDepth","_getDepth","tree","patterns","remoteColumnRange","remoteRowRange","remoteCellRange","remoteCell","columnRange","rowRange","remoteSheet","remoteCellObj","cleanFormula","remoteColumnMatches","remoteRowMatches","remoteCellRangeMatches","sheetPart","rangePart","expandCellRange","remoteCellMatches","cellRangeMatches","cellMatches","isFunctionOrKeyword","identifierMatches","identifier","addresses","baseIsSet","nodeIsSet","isSet","_definition","visitor","convertDefinition","serializedNonTerminal","serializedTerminal","terminalLabel","topRules","reIsDeepProp","reIsPlainProp","areTokenCategoriesNotUsed","lookAheadSequenceFromAlternatives","REPETITION","REPETITION_WITH_SEPARATOR","ALTERNATION","laFuncBuilder","lookAheadPaths","lookaheadBuilder","numOfAlts","areAllOneTokenLookahead","orAlts","predicates","currNumOfPaths","currPredicate","currPathLength","singleTokenAlts","choiceToAlt_1","currExtendingType","numOfPaths","singleTokensTypes","expectedTokenUniqueKey_1","choiceToAlt_2","RestDefinitionFinderWalker","targetOccurrence","targetProdType","restDef","checkIsTarget","expectedProdType","InsideDefinitionFinderVisitor","targetRef","expectedProdName","initializeArrayOfArrays","pathToHashKeys","longerKeys","currShorterKey","categoriesKeySuffix","isUniquePrefixHash","altKnownPathsKeys","searchPathKeys","otherAltKnownPathsKeys","searchIdx","altsDefs","partialAlts","finalResult","altsHashes","dict","newData","pathLength","currDataset","altIdx","currAltPathsAndSuffixes","currPathIdx","currPathPrefix","prefixKeys","currAltResult","newPartialPathsAndSuffixes","insideDefVisitor","insideDef","afterDef","searchPath","compareOtherPath","otherPath","searchTok","otherTok","singleAltPaths","singlePath","prefix","otherTokType","setCacheAdd","setCacheHas","getPrototypeOf","print_1","timer_1","to_fast_properties_1","overRest","freeSelf","hasFunc","objectCreate","proto","baseTrim","reIsBadHex","reIsBinary","reIsOctal","freeParseInt","isBinary","POP_MODE","createTokenInternal","constant","baseIsRegExp","nodeIsRegExp","isRegExp","arrayBuffer","validateMissingCstMethods","CstVisitorDefinitionError","defaultVisit","lang_extensions_1","childrenNames","childrenNamesLength","currChildArray","currChildArrayLength","currChild","visitorInstance","ruleNames","missingRuleNames","MISSING_METHOD","derivedConstructor","semanticDefinitionErrors","errorMessages","currDefError","_RULE_NAMES","baseConstructor","withDefaultsProto","reHasUnicode","arrayEvery","baseEvery","castFunction","isString","resolver_1","actualOptions","topRulesTable","baseAssign","baseAssignIn","cloneBuffer","copyArray","copySymbols","copySymbolsIn","initCloneArray","initCloneByTag","initCloneObject","funcTag","cloneableTags","isFull","isFunc","subValue","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","loaded","__webpack_modules__","window","nmd","__webpack_exports__"],"sourceRoot":""} \ No newline at end of file diff --git a/dist/calx.js b/dist/calx.js deleted file mode 100644 index 1870ce1..0000000 --- a/dist/calx.js +++ /dev/null @@ -1,2 +0,0 @@ -!function(t,e){if("object"==typeof exports&&"object"==typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var n=e();for(var r in n)("object"==typeof exports?exports:t)[r]=n[r]}}(self,()=>(()=>{var t={2:(t,e,n)=>{var r=n(2199),o=n(4664),i=n(5950);t.exports=function(t){return r(t,i,o)}},79:(t,e,n)=>{var r=n(3702),o=n(80),i=n(4739),a=n(8655),s=n(1175);function u(t){var e=-1,n=null==t?0:t.length;for(this.clear();++e{var r=n(6025),o=Array.prototype.splice;t.exports=function(t){var e=this.__data__,n=r(e,t);return!(n<0||(n==e.length-1?e.pop():o.call(e,n,1),--this.size,0))}},104:(t,e,n)=>{var r=n(3661);function o(t,e){if("function"!=typeof t||null!=e&&"function"!=typeof e)throw new TypeError("Expected a function");var n=function(){var r=arguments,o=e?e.apply(this,r):r[0],i=n.cache;if(i.has(o))return i.get(o);var a=t.apply(this,r);return n.cache=i.set(o,a)||i,a};return n.cache=new(o.Cache||r),n}o.Cache=r,t.exports=o},109:function(t,e,n){"use strict";var r,o=this&&this.__extends||(r=function(t,e){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n])},r(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function n(){this.constructor=t}r(t,e),t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)}),i=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0}),e.EarlyExitException=e.NotAllInputParsedException=e.NoViableAltException=e.MismatchedTokenException=e.isRecognitionException=void 0;var a=i(n(9859)),s="MismatchedTokenException",u="NoViableAltException",c="EarlyExitException",l="NotAllInputParsedException",f=[s,u,c,l];Object.freeze(f),e.isRecognitionException=function(t){return(0,a.default)(f,t.name)};var h=function(t){function e(e,n){var r=this.constructor,o=t.call(this,e)||this;return o.token=n,o.resyncedTokens=[],Object.setPrototypeOf(o,r.prototype),Error.captureStackTrace&&Error.captureStackTrace(o,o.constructor),o}return o(e,t),e}(Error),p=function(t){function e(e,n,r){var o=t.call(this,e,n)||this;return o.previousToken=r,o.name=s,o}return o(e,t),e}(h);e.MismatchedTokenException=p;var d=function(t){function e(e,n,r){var o=t.call(this,e,n)||this;return o.previousToken=r,o.name=u,o}return o(e,t),e}(h);e.NoViableAltException=d;var m=function(t){function e(e,n){var r=t.call(this,e,n)||this;return r.name=l,r}return o(e,t),e}(h);e.NotAllInputParsedException=m;var g=function(t){function e(e,n,r){var o=t.call(this,e,n)||this;return o.previousToken=r,o.name=c,o}return o(e,t),e}(h);e.EarlyExitException=g},127:function(t,e,n){"use strict";var r=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0}),e.Lexer=e.LexerDefinitionErrorType=void 0;var o,i=n(5063),a=r(n(3950)),s=r(n(2193)),u=r(n(6449)),c=r(n(8090)),l=r(n(8081)),f=r(n(5378)),h=r(n(9754)),p=r(n(5950)),d=r(n(2216)),m=r(n(3488)),g=r(n(6139)),v=r(n(860)),y=r(n(2629)),E=n(8927),T=n(3087),A=n(433),_=n(393);(o=e.LexerDefinitionErrorType||(e.LexerDefinitionErrorType={}))[o.MISSING_PATTERN=0]="MISSING_PATTERN",o[o.INVALID_PATTERN=1]="INVALID_PATTERN",o[o.EOI_ANCHOR_FOUND=2]="EOI_ANCHOR_FOUND",o[o.UNSUPPORTED_FLAGS_FOUND=3]="UNSUPPORTED_FLAGS_FOUND",o[o.DUPLICATE_PATTERNS_FOUND=4]="DUPLICATE_PATTERNS_FOUND",o[o.INVALID_GROUP_TYPE_FOUND=5]="INVALID_GROUP_TYPE_FOUND",o[o.PUSH_MODE_DOES_NOT_EXIST=6]="PUSH_MODE_DOES_NOT_EXIST",o[o.MULTI_MODE_LEXER_WITHOUT_DEFAULT_MODE=7]="MULTI_MODE_LEXER_WITHOUT_DEFAULT_MODE",o[o.MULTI_MODE_LEXER_WITHOUT_MODES_PROPERTY=8]="MULTI_MODE_LEXER_WITHOUT_MODES_PROPERTY",o[o.MULTI_MODE_LEXER_DEFAULT_MODE_VALUE_DOES_NOT_EXIST=9]="MULTI_MODE_LEXER_DEFAULT_MODE_VALUE_DOES_NOT_EXIST",o[o.LEXER_DEFINITION_CANNOT_CONTAIN_UNDEFINED=10]="LEXER_DEFINITION_CANNOT_CONTAIN_UNDEFINED",o[o.SOI_ANCHOR_FOUND=11]="SOI_ANCHOR_FOUND",o[o.EMPTY_MATCH_PATTERN=12]="EMPTY_MATCH_PATTERN",o[o.NO_LINE_BREAKS_FLAGS=13]="NO_LINE_BREAKS_FLAGS",o[o.UNREACHABLE_PATTERN=14]="UNREACHABLE_PATTERN",o[o.IDENTIFY_TERMINATOR=15]="IDENTIFY_TERMINATOR",o[o.CUSTOM_LINE_BREAK=16]="CUSTOM_LINE_BREAK",o[o.MULTI_MODE_LEXER_LONGER_ALT_NOT_IN_CURRENT_MODE=17]="MULTI_MODE_LEXER_LONGER_ALT_NOT_IN_CURRENT_MODE";var R={deferDefinitionErrorsHandling:!1,positionTracking:"full",lineTerminatorsPattern:/\n|\r\n?/g,lineTerminatorCharacters:["\n","\r"],ensureOptimizations:!1,safeMode:!1,errorMessageProvider:A.defaultLexerErrorProvider,traceInitPerf:!1,skipValidations:!1,recoveryEnabled:!0};Object.freeze(R);var N=function(){function t(t,e){void 0===e&&(e=R);var n=this;if(this.lexerDefinition=t,this.lexerDefinitionErrors=[],this.lexerDefinitionWarning=[],this.patternIdxToConfig={},this.charCodeToPatternIdxToConfig={},this.modes=[],this.emptyGroups={},this.trackStartLines=!0,this.trackEndLines=!0,this.hasCustom=!1,this.canModeBeOptimized={},this.TRACE_INIT=function(t,e){if(!0===n.traceInitPerf){n.traceInitIndent++;var r=new Array(n.traceInitIndent+1).join("\t");n.traceInitIndent"));var o=(0,E.timer)(e),i=o.time,a=o.value,s=i>10?console.warn:console.log;return n.traceInitIndent time: ").concat(i,"ms")),n.traceInitIndent--,a}return e()},"boolean"==typeof e)throw Error("The second argument to the Lexer constructor is now an ILexerConfig Object.\na boolean 2nd argument is no longer supported");this.config=(0,g.default)({},R,e);var r=this.config.traceInitPerf;!0===r?(this.traceInitMaxIdent=1/0,this.traceInitPerf=!0):"number"==typeof r&&(this.traceInitMaxIdent=r,this.traceInitPerf=!0),this.traceInitIndent=-1,this.TRACE_INIT("Lexer Constructor",function(){var r,o=!0;n.TRACE_INIT("Lexer Config handling",function(){if(n.config.lineTerminatorsPattern===R.lineTerminatorsPattern)n.config.lineTerminatorsPattern=i.LineTerminatorOptimizedTester;else if(n.config.lineTerminatorCharacters===R.lineTerminatorCharacters)throw Error("Error: Missing property on the Lexer config.\n\tFor details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#MISSING_LINE_TERM_CHARS");if(e.safeMode&&e.ensureOptimizations)throw Error('"safeMode" and "ensureOptimizations" flags are mutually exclusive.');n.trackStartLines=/full|onlyStart/i.test(n.config.positionTracking),n.trackEndLines=/full/i.test(n.config.positionTracking),(0,u.default)(t)?r={modes:{defaultMode:(0,y.default)(t)},defaultMode:i.DEFAULT_MODE}:(o=!1,r=(0,y.default)(t))}),!1===n.config.skipValidations&&(n.TRACE_INIT("performRuntimeChecks",function(){n.lexerDefinitionErrors=n.lexerDefinitionErrors.concat((0,i.performRuntimeChecks)(r,n.trackStartLines,n.config.lineTerminatorCharacters))}),n.TRACE_INIT("performWarningRuntimeChecks",function(){n.lexerDefinitionWarning=n.lexerDefinitionWarning.concat((0,i.performWarningRuntimeChecks)(r,n.trackStartLines,n.config.lineTerminatorCharacters))})),r.modes=r.modes?r.modes:{},(0,h.default)(r.modes,function(t,e){r.modes[e]=(0,l.default)(t,function(t){return(0,d.default)(t)})});var c=(0,p.default)(r.modes);if((0,h.default)(r.modes,function(t,r){n.TRACE_INIT("Mode: <".concat(r,"> processing"),function(){var o;n.modes.push(r),!1===n.config.skipValidations&&n.TRACE_INIT("validatePatterns",function(){n.lexerDefinitionErrors=n.lexerDefinitionErrors.concat((0,i.validatePatterns)(t,c))}),(0,s.default)(n.lexerDefinitionErrors)&&((0,T.augmentTokenTypes)(t),n.TRACE_INIT("analyzeTokenTypes",function(){o=(0,i.analyzeTokenTypes)(t,{lineTerminatorCharacters:n.config.lineTerminatorCharacters,positionTracking:e.positionTracking,ensureOptimizations:e.ensureOptimizations,safeMode:e.safeMode,tracer:n.TRACE_INIT})}),n.patternIdxToConfig[r]=o.patternIdxToConfig,n.charCodeToPatternIdxToConfig[r]=o.charCodeToPatternIdxToConfig,n.emptyGroups=(0,g.default)({},n.emptyGroups,o.emptyGroups),n.hasCustom=o.hasCustom||n.hasCustom,n.canModeBeOptimized[r]=o.canBeOptimized)})}),n.defaultMode=r.defaultMode,!(0,s.default)(n.lexerDefinitionErrors)&&!n.config.deferDefinitionErrorsHandling){var A=(0,f.default)(n.lexerDefinitionErrors,function(t){return t.message}).join("-----------------------\n");throw new Error("Errors detected in definition of Lexer:\n"+A)}(0,h.default)(n.lexerDefinitionWarning,function(t){(0,E.PRINT_WARNING)(t.message)}),n.TRACE_INIT("Choosing sub-methods implementations",function(){if(i.SUPPORT_STICKY?(n.chopInput=m.default,n.match=n.matchWithTest):(n.updateLastIndex=a.default,n.match=n.matchWithExec),o&&(n.handleModes=a.default),!1===n.trackStartLines&&(n.computeNewColumn=m.default),!1===n.trackEndLines&&(n.updateTokenEndLineColumnLocation=a.default),/full/i.test(n.config.positionTracking))n.createTokenInstance=n.createFullToken;else if(/onlyStart/i.test(n.config.positionTracking))n.createTokenInstance=n.createStartOnlyToken;else{if(!/onlyOffset/i.test(n.config.positionTracking))throw Error('Invalid config option: "'.concat(n.config.positionTracking,'"'));n.createTokenInstance=n.createOffsetOnlyToken}n.hasCustom?(n.addToken=n.addTokenUsingPush,n.handlePayload=n.handlePayloadWithCustom):(n.addToken=n.addTokenUsingMemberAccess,n.handlePayload=n.handlePayloadNoCustom)}),n.TRACE_INIT("Failed Optimization Warnings",function(){var t=(0,v.default)(n.canModeBeOptimized,function(t,e,n){return!1===e&&t.push(n),t},[]);if(e.ensureOptimizations&&!(0,s.default)(t))throw Error("Lexer Modes: < ".concat(t.join(", ")," > cannot be optimized.\n")+'\t Disable the "ensureOptimizations" lexer config flag to silently ignore this and run the lexer in an un-optimized mode.\n\t Or inspect the console log for details on how to resolve these issues.')}),n.TRACE_INIT("clearRegExpParserCache",function(){(0,_.clearRegExpParserCache)()}),n.TRACE_INIT("toFastProperties",function(){(0,E.toFastProperties)(n)})})}return t.prototype.tokenize=function(t,e){if(void 0===e&&(e=this.defaultMode),!(0,s.default)(this.lexerDefinitionErrors)){var n=(0,f.default)(this.lexerDefinitionErrors,function(t){return t.message}).join("-----------------------\n");throw new Error("Unable to Tokenize because Errors detected in definition of Lexer:\n"+n)}return this.tokenizeInternal(t,e)},t.prototype.tokenizeInternal=function(t,e){var n,r,o,a,s,u,l,f,h,p,d,m,g,v,y,E,T=this,A=t,_=A.length,R=0,N=0,O=this.hasCustom?0:Math.floor(t.length/10),I=new Array(O),S=[],x=this.trackStartLines?1:void 0,b=this.trackStartLines?1:void 0,M=(0,i.cloneEmptyGroups)(this.emptyGroups),C=this.trackStartLines,L=this.config.lineTerminatorsPattern,P=0,w=[],D=[],k=[],U=[];function F(){return w}function j(t){var e=(0,i.charCodeToOptimizedIndex)(t),n=D[e];return void 0===n?U:n}Object.freeze(U);var V,B=function(t){if(1===k.length&&void 0===t.tokenType.PUSH_MODE){var e=T.config.errorMessageProvider.buildUnableToPopLexerModeMessage(t);S.push({offset:t.startOffset,line:t.startLine,column:t.startColumn,length:t.image.length,message:e})}else{k.pop();var n=(0,c.default)(k);w=T.patternIdxToConfig[n],D=T.charCodeToPatternIdxToConfig[n],P=w.length;var r=T.canModeBeOptimized[n]&&!1===T.config.safeMode;E=D&&r?j:F}};function G(t){k.push(t),D=this.charCodeToPatternIdxToConfig[t],w=this.patternIdxToConfig[t],P=w.length,P=w.length;var e=this.canModeBeOptimized[t]&&!1===this.config.safeMode;E=D&&e?j:F}G.call(this,e);for(var W=this.config.recoveryEnabled;R<_;){u=null;var z=A.charCodeAt(R),Y=E(z),q=Y.length;for(n=0;nu.length){u=a,l=f,V=X;break}}}break}}if(null!==u){if(h=u.length,void 0!==(p=V.group)&&(d=V.tokenTypeIdx,m=this.createTokenInstance(u,R,d,V.tokenType,x,b,h),this.handlePayload(m,l),!1===p?N=this.addToken(I,N,m):M[p].push(m)),t=this.chopInput(t,h),R+=h,b=this.computeNewColumn(b,h),!0===C&&!0===V.canLineTerminator){var Z=0,Q=void 0,J=void 0;L.lastIndex=0;do{!0===(Q=L.test(u))&&(J=L.lastIndex-1,Z++)}while(!0===Q);0!==Z&&(x+=Z,b=h-J,this.updateTokenEndLineColumnLocation(m,p,J,Z,x,b,h))}this.handleModes(V,B,G,m)}else{for(var tt=R,et=x,nt=b,rt=!1===W;!1===rt&&R<_;)for(t=this.chopInput(t,1),R++,r=0;r{t.exports=function(t){var e=[];if(null!=t)for(var n in Object(t))e.push(n);return e}},270:(t,e,n)=>{var r=n(7068),o=n(346);t.exports=function t(e,n,i,a,s){return e===n||(null==e||null==n||!o(e)&&!o(n)?e!=e&&n!=n:r(e,n,i,a,t,s))}},289:(t,e,n)=>{var r=n(2651);t.exports=function(t){return r(this,t).get(t)}},294:t=>{t.exports=function(t){return"number"==typeof t&&t>-1&&t%1==0&&t<=9007199254740991}},317:t=>{t.exports=function(t){var e=-1,n=Array(t.size);return t.forEach(function(t,r){n[++e]=[r,t]}),n}},346:t=>{t.exports=function(t){return null!=t&&"object"==typeof t}},361:t=>{var e=/^(?:0|[1-9]\d*)$/;t.exports=function(t,n){var r=typeof t;return!!(n=null==n?9007199254740991:n)&&("number"==r||"symbol"!=r&&e.test(t))&&t>-1&&t%1==0&&t{t.exports=function(t,e){return null==t?void 0:t[e]}},393:(t,e,n)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.clearRegExpParserCache=e.getRegExpAst=void 0;var r=n(2475),o={},i=new r.RegExpParser;e.getRegExpAst=function(t){var e=t.toString();if(o.hasOwnProperty(e))return o[e];var n=i.pattern(e);return o[e]=n,n},e.clearRegExpParserCache=function(){o={}}},426:t=>{var e=Object.prototype.hasOwnProperty;t.exports=function(t,n){return null!=t&&e.call(t,n)}},433:(t,e)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.defaultLexerErrorProvider=void 0,e.defaultLexerErrorProvider={buildUnableToPopLexerModeMessage:function(t){return"Unable to pop Lexer Mode after encountering Token ->".concat(t.image,"<- The Mode Stack is empty")},buildUnexpectedCharactersMessage:function(t,e,n,r,o){return"unexpected character: ->".concat(t.charAt(e),"<- at offset: ").concat(e,",")+" skipped ".concat(n," characters.")}}},500:function(t,e,n){"use strict";var r,o=this&&this.__extends||(r=function(t,e){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n])},r(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function n(){this.constructor=t}r(t,e),t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)}),i=this&&this.__assign||function(){return i=Object.assign||function(t){for(var e,n=1,r=arguments.length;n1});return(0,d.default)((0,E.default)(i),function(n){var r=(0,s.default)(n),o=e.buildDuplicateFoundError(t,n),i=(0,N.getProductionDslName)(r),a={message:o,type:R.ParserDefinitionErrorType.DUPLICATE_PRODUCTIONS,ruleName:t.name,dslName:i,occurrence:r.idx},u=P(r);return u&&(a.parameter=u),a})}(t,n)}),i=function(t,e,n){var r=[],o=(0,d.default)(e,function(t){return t.name});return(0,m.default)(t,function(t){var e=t.name;if((0,T.default)(o,e)){var i=n.buildNamespaceConflictError(t);r.push({message:i,type:R.ParserDefinitionErrorType.CONFLICT_TOKENS_RULES_NAMESPACE,ruleName:e})}}),r}(t,e,n),a=(0,A.default)(t,function(t){return j(t,n)}),u=(0,A.default)(t,function(e){return D(e,t,r,n)});return o.concat(i,a,u)},e.identifyProductionForDuplicates=L;var w=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.allProductions=[],e}return o(e,t),e.prototype.visitNonTerminal=function(t){this.allProductions.push(t)},e.prototype.visitOption=function(t){this.allProductions.push(t)},e.prototype.visitRepetitionWithSeparator=function(t){this.allProductions.push(t)},e.prototype.visitRepetitionMandatory=function(t){this.allProductions.push(t)},e.prototype.visitRepetitionMandatoryWithSeparator=function(t){this.allProductions.push(t)},e.prototype.visitRepetition=function(t){this.allProductions.push(t)},e.prototype.visitAlternation=function(t){this.allProductions.push(t)},e.prototype.visitTerminal=function(t){this.allProductions.push(t)},e}(x.GAstVisitor);function D(t,e,n,r){var o=[];if((0,v.default)(e,function(e,n){return n.name===t.name?e+1:e},0)>1){var i=r.buildDuplicateRuleNameError({topLevelRule:t,grammarName:n});o.push({message:i,type:R.ParserDefinitionErrorType.DUPLICATE_RULE_NAME,ruleName:t.name})}return o}function k(t){var e=[];if((0,u.default)(t))return e;var n=(0,s.default)(t);if(n instanceof S.NonTerminal)e.push(n.referencedRule);else if(n instanceof S.Alternative||n instanceof S.Option||n instanceof S.RepetitionMandatory||n instanceof S.RepetitionMandatoryWithSeparator||n instanceof S.RepetitionWithSeparator||n instanceof S.Repetition)e=e.concat(k(n.definition));else if(n instanceof S.Alternation)e=(0,l.default)((0,d.default)(n.definition,function(t){return k(t.definition)}));else if(!(n instanceof S.Terminal))throw Error("non exhaustive match");var r=(0,N.isOptionalProd)(n),o=t.length>1;if(r&&o){var i=(0,c.default)(t);return e.concat(k(i))}return e}e.OccurrenceValidationCollector=w,e.validateRuleDoesNotAlreadyExist=D,e.validateRuleIsOverridden=function(t,e,n){var r,o=[];return(0,T.default)(e,t)||(r="Invalid rule override, rule: ->".concat(t,"<- cannot be overridden in the grammar: ->").concat(n,"<-")+"as it is not defined in any of the super grammars ",o.push({message:r,type:R.ParserDefinitionErrorType.INVALID_RULE_OVERRIDE,ruleName:t})),o},e.validateNoLeftRecursion=function t(e,n,r,o){void 0===o&&(o=[]);var i=[],a=k(n.definition);if((0,u.default)(a))return[];var s=e.name;(0,T.default)(a,e)&&i.push({message:r.buildLeftRecursionError({topLevelRule:e,leftRecursionPath:o}),type:R.ParserDefinitionErrorType.LEFT_RECURSION,ruleName:s});var c=(0,p.default)(a,o.concat([e])),l=(0,A.default)(c,function(n){var i=(0,_.default)(o);return i.push(n),t(e,n,r,i)});return i.concat(l)},e.getFirstNoneTerminal=k;var U=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.alternations=[],e}return o(e,t),e.prototype.visitAlternation=function(t){this.alternations.push(t)},e}(x.GAstVisitor);e.validateEmptyOrAlternative=function(t,e){var n=new U;t.accept(n);var r=n.alternations;return(0,A.default)(r,function(n){var r=(0,b.default)(n.definition);return(0,A.default)(r,function(r,o){var i=(0,I.nextPossibleTokensAfter)([r],[],C.tokenStructuredMatcher,1);return(0,u.default)(i)?[{message:e.buildEmptyAlternationError({topLevelRule:t,alternation:n,emptyChoiceIdx:o}),type:R.ParserDefinitionErrorType.NONE_LAST_EMPTY_ALT,ruleName:t.name,occurrence:n.idx,alternative:o+1}]:[]})})},e.validateAmbiguousAlternationAlternatives=function(t,e,n){var r=new U;t.accept(r);var o=r.alternations;return o=(0,h.default)(o,function(t){return!0===t.ignoreAmbiguities}),(0,A.default)(o,function(r){var o=r.idx,i=r.maxLookahead||e,a=(0,O.getLookaheadPathsForOr)(o,t,i,r),s=function(t,e,n,r){var o=[],i=(0,v.default)(t,function(n,r,i){return!0===e.definition[i].ignoreAmbiguities||(0,m.default)(r,function(r){var a=[i];(0,m.default)(t,function(t,n){i!==n&&(0,O.containsPath)(t,r)&&!0!==e.definition[n].ignoreAmbiguities&&a.push(n)}),a.length>1&&!(0,O.containsPath)(o,r)&&(o.push(r),n.push({alts:a,path:r}))}),n},[]);return(0,d.default)(i,function(t){var o=(0,d.default)(t.alts,function(t){return t+1});return{message:r.buildAlternationAmbiguityError({topLevelRule:n,alternation:e,ambiguityIndices:o,prefixPath:t.path}),type:R.ParserDefinitionErrorType.AMBIGUOUS_ALTS,ruleName:n.name,occurrence:e.idx,alternatives:t.alts}})}(a,r,t,n),u=V(a,r,t,n);return s.concat(u)})};var F=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.allProductions=[],e}return o(e,t),e.prototype.visitRepetitionWithSeparator=function(t){this.allProductions.push(t)},e.prototype.visitRepetitionMandatory=function(t){this.allProductions.push(t)},e.prototype.visitRepetitionMandatoryWithSeparator=function(t){this.allProductions.push(t)},e.prototype.visitRepetition=function(t){this.allProductions.push(t)},e}(x.GAstVisitor);function j(t,e){var n=new U;t.accept(n);var r=n.alternations;return(0,A.default)(r,function(n){return n.definition.length>255?[{message:e.buildTooManyAlternativesError({topLevelRule:t,alternation:n}),type:R.ParserDefinitionErrorType.TOO_MANY_ALTS,ruleName:t.name,occurrence:n.idx}]:[]})}function V(t,e,n,r){var o=(0,v.default)(t,function(t,e,n){var r=(0,d.default)(e,function(t){return{idx:n,path:t}});return t.concat(r)},[]);return(0,M.default)((0,A.default)(o,function(t){if(!0===e.definition[t.idx].ignoreAmbiguities)return[];var i=t.idx,a=t.path,s=(0,f.default)(o,function(t){return!0!==e.definition[t.idx].ignoreAmbiguities&&t.idx{var r=n(4932);t.exports=function(t,e){return r(e,function(e){return t[e]})}},583:(t,e,n)=>{var r=n(7237),o=n(7255),i=n(8586),a=n(7797);t.exports=function(t){return i(t)?r(a(t)):o(t)}},626:function(t,e,n){"use strict";var r=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0}),e.ContentAssist=void 0;var o=n(4471),i=r(n(6170)),a=r(n(2216)),s=function(){function t(){}return t.prototype.initContentAssist=function(){},t.prototype.computeContentAssist=function(t,e){var n=this.gastProductionsCache[t];if((0,a.default)(n))throw Error("Rule ->".concat(t,"<- does not exist in this grammar."));return(0,o.nextPossibleTokensAfter)([n],e,this.tokenMatcher,this.maxLookahead)},t.prototype.getNextPossibleTokenTypes=function(t){var e=(0,i.default)(t.ruleStack),n=this.getGAstProductions()[e];return new o.NextAfterTokenWalker(n,t).startWalking()},t}();e.ContentAssist=s},631:(t,e,n)=>{var r=n(8077),o=n(9326);t.exports=function(t,e){return null!=t&&o(t,e,r)}},641:(t,e,n)=>{var r=n(6649),o=n(5950);t.exports=function(t,e){return t&&r(t,e,o)}},659:(t,e,n)=>{var r=n(1873),o=Object.prototype,i=o.hasOwnProperty,a=o.toString,s=r?r.toStringTag:void 0;t.exports=function(t){var e=i.call(t,s),n=t[s];try{t[s]=void 0;var r=!0}catch(t){}var o=a.call(t);return r&&(e?t[s]=n:delete t[s]),o}},689:(t,e,n)=>{var r=n(2),o=Object.prototype.hasOwnProperty;t.exports=function(t,e,n,i,a,s){var u=1&n,c=r(t),l=c.length;if(l!=r(e).length&&!u)return!1;for(var f=l;f--;){var h=c[f];if(!(u?h in e:o.call(e,h)))return!1}var p=s.get(t),d=s.get(e);if(p&&d)return p==e&&d==t;var m=!0;s.set(t,e),s.set(e,t);for(var g=u;++f{var r=n(8096),o=n(2428),i=n(6449),a=n(3656),s=n(361),u=n(7167),c=Object.prototype.hasOwnProperty;t.exports=function(t,e){var n=i(t),l=!n&&o(t),f=!n&&!l&&a(t),h=!n&&!l&&!f&&u(t),p=n||l||f||h,d=p?r(t.length,String):[],m=d.length;for(var g in t)!e&&!c.call(t,g)||p&&("length"==g||f&&("offset"==g||"parent"==g)||h&&("buffer"==g||"byteLength"==g||"byteOffset"==g)||s(g,m))||d.push(g);return d}},756:(t,e,n)=>{var r=n(3805);t.exports=function(t){return t==t&&!r(t)}},776:(t,e,n)=>{var r=n(756),o=n(5950);t.exports=function(t){for(var e=o(t),n=e.length;n--;){var i=e[n],a=t[i];e[n]=[i,a,r(a)]}return e}},860:(t,e,n)=>{var r=n(882),o=n(909),i=n(5389),a=n(5558),s=n(6449);t.exports=function(t,e,n){var u=s(t)?r:a,c=arguments.length<3;return u(t,i(e,4),n,c,o)}},870:function(t,e,n){"use strict";var r=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0}),e.defaultGrammarValidatorErrorProvider=e.defaultGrammarResolverErrorProvider=e.defaultParserErrorProvider=void 0;var o=n(9399),i=r(n(6170)),a=r(n(5378)),s=r(n(860)),u=n(3387),c=n(3387);e.defaultParserErrorProvider={buildMismatchTokenMessage:function(t){var e=t.expected,n=t.actual,r=(t.previous,t.ruleName,(0,o.hasTokenLabel)(e)?"--\x3e ".concat((0,o.tokenLabel)(e)," <--"):"token of type --\x3e ".concat(e.name," <--"));return"Expecting ".concat(r," but found --\x3e '").concat(n.image,"' <--")},buildNotAllInputParsedMessage:function(t){var e=t.firstRedundant;return t.ruleName,"Redundant input, expecting EOF but found: "+e.image},buildNoViableAltMessage:function(t){var e=t.expectedPathsPerAlt,n=t.actual,r=(t.previous,t.customUserDescription),u=(t.ruleName,"Expecting: "),c="\nbut found: '"+(0,i.default)(n).image+"'";if(r)return u+r+c;var l=(0,s.default)(e,function(t,e){return t.concat(e)},[]),f=(0,a.default)(l,function(t){return"[".concat((0,a.default)(t,function(t){return(0,o.tokenLabel)(t)}).join(", "),"]")}),h=(0,a.default)(f,function(t,e){return" ".concat(e+1,". ").concat(t)});return u+"one of these possible Token sequences:\n".concat(h.join("\n"))+c},buildEarlyExitMessage:function(t){var e=t.expectedIterationPaths,n=t.actual,r=t.customUserDescription,s=(t.ruleName,"Expecting: "),u="\nbut found: '"+(0,i.default)(n).image+"'";if(r)return s+r+u;var c=(0,a.default)(e,function(t){return"[".concat((0,a.default)(t,function(t){return(0,o.tokenLabel)(t)}).join(","),"]")});return s+"expecting at least one iteration which starts with one of these possible Token sequences::\n "+"<".concat(c.join(" ,"),">")+u}},Object.freeze(e.defaultParserErrorProvider),e.defaultGrammarResolverErrorProvider={buildRuleNotFoundError:function(t,e){return"Invalid grammar, reference to a rule which is not defined: ->"+e.nonTerminalName+"<-\ninside top level rule: ->"+t.name+"<-"}},e.defaultGrammarValidatorErrorProvider={buildDuplicateFoundError:function(t,e){var n,r=t.name,o=(0,i.default)(e),a=o.idx,s=(0,c.getProductionDslName)(o),l=(n=o)instanceof u.Terminal?n.terminalType.name:n instanceof u.NonTerminal?n.nonTerminalName:"",f=a>0,h="->".concat(s).concat(f?a:"","<- ").concat(l?"with argument: ->".concat(l,"<-"):"","\n appears more than once (").concat(e.length," times) in the top level rule: ->").concat(r,"<-. \n For further details see: https://chevrotain.io/docs/FAQ.html#NUMERICAL_SUFFIXES \n ");return(h=h.replace(/[ \t]+/g," ")).replace(/\s\s+/g,"\n")},buildNamespaceConflictError:function(t){return"Namespace conflict found in grammar.\n"+"The grammar has both a Terminal(Token) and a Non-Terminal(Rule) named: <".concat(t.name,">.\n")+"To resolve this make sure each Terminal and Non-Terminal names are unique\nThis is easy to accomplish by using the convention that Terminal names start with an uppercase letter\nand Non-Terminal names start with a lower case letter."},buildAlternationPrefixAmbiguityError:function(t){var e=(0,a.default)(t.prefixPath,function(t){return(0,o.tokenLabel)(t)}).join(", "),n=0===t.alternation.idx?"":t.alternation.idx;return"Ambiguous alternatives: <".concat(t.ambiguityIndices.join(" ,"),"> due to common lookahead prefix\n")+"in inside <").concat(t.topLevelRule.name,"> Rule,\n")+"<".concat(e,"> may appears as a prefix path in all these alternatives.\n")+"See: https://chevrotain.io/docs/guide/resolving_grammar_errors.html#COMMON_PREFIX\nFor Further details."},buildAlternationAmbiguityError:function(t){var e=(0,a.default)(t.prefixPath,function(t){return(0,o.tokenLabel)(t)}).join(", "),n=0===t.alternation.idx?"":t.alternation.idx;return"Ambiguous Alternatives Detected: <".concat(t.ambiguityIndices.join(" ,"),"> in ")+" inside <".concat(t.topLevelRule.name,"> Rule,\n")+"<".concat(e,"> may appears as a prefix path in all these alternatives.\n")+"See: https://chevrotain.io/docs/guide/resolving_grammar_errors.html#AMBIGUOUS_ALTERNATIVES\nFor Further details."},buildEmptyRepetitionError:function(t){var e=(0,c.getProductionDslName)(t.repetition);return 0!==t.repetition.idx&&(e+=t.repetition.idx),"The repetition <".concat(e,"> within Rule <").concat(t.topLevelRule.name,"> can never consume any tokens.\n")+"This could lead to an infinite loop."},buildTokenNameError:function(t){return"deprecated"},buildEmptyAlternationError:function(t){return"Ambiguous empty alternative: <".concat(t.emptyChoiceIdx+1,">")+" in inside <").concat(t.topLevelRule.name,"> Rule.\n")+"Only the last alternative may be an empty alternative."},buildTooManyAlternativesError:function(t){return"An Alternation cannot have more than 256 alternatives:\n"+" inside <").concat(t.topLevelRule.name,"> Rule.\n has ").concat(t.alternation.definition.length+1," alternatives.")},buildLeftRecursionError:function(t){var e=t.topLevelRule.name,n=(0,a.default)(t.leftRecursionPath,function(t){return t.name}),r="".concat(e," --\x3e ").concat(n.concat([e]).join(" --\x3e "));return"Left Recursion found in grammar.\n"+"rule: <".concat(e,"> can be invoked from itself (directly or indirectly)\n")+"without consuming any Tokens. The grammar path that causes this is: \n ".concat(r,"\n")+" To fix this refactor your grammar to remove the left recursion.\nsee: https://en.wikipedia.org/wiki/LL_parser#Left_factoring."},buildInvalidRuleNameError:function(t){return"deprecated"},buildDuplicateRuleNameError:function(t){var e;return e=t.topLevelRule instanceof u.Rule?t.topLevelRule.name:t.topLevelRule,"Duplicate definition, rule: ->".concat(e,"<- is already defined in the grammar: ->").concat(t.grammarName,"<-")}}},882:t=>{t.exports=function(t,e,n,r){var o=-1,i=null==t?0:t.length;for(r&&i&&(n=t[++o]);++o{var r=n(641),o=n(8329)(r);t.exports=o},912:t=>{t.exports=function(t){return t&&t.length?t[0]:void 0}},916:(t,e,n)=>{var r=n(909);t.exports=function(t,e){var n;return r(t,function(t,r,o){return!(n=e(t,r,o))}),!!n}},935:(t,e,n)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.LexerAdapter=void 0;var r=n(6312),o=function(){function t(){}return t.prototype.initLexerAdapter=function(){this.tokVector=[],this.tokVectorLength=0,this.currIdx=-1},Object.defineProperty(t.prototype,"input",{get:function(){return this.tokVector},set:function(t){if(!0!==this.selfAnalysisDone)throw Error("Missing invocation at the end of the Parser's constructor.");this.reset(),this.tokVector=t,this.tokVectorLength=t.length},enumerable:!1,configurable:!0}),t.prototype.SKIP_TOKEN=function(){return this.currIdx<=this.tokVector.length-2?(this.consumeToken(),this.LA(1)):r.END_OF_FILE},t.prototype.LA=function(t){var e=this.currIdx+t;return e<0||this.tokVectorLength<=e?r.END_OF_FILE:this.tokVector[e]},t.prototype.consumeToken=function(){this.currIdx++},t.prototype.exportLexerState=function(){return this.currIdx},t.prototype.importLexerState=function(t){this.currIdx=t},t.prototype.resetLexerState=function(){this.currIdx=-1},t.prototype.moveToTerminatedState=function(){this.currIdx=this.tokVector.length-1},t.prototype.getLexerPosition=function(){return this.exportLexerState()},t}();e.LexerAdapter=o},938:t=>{t.exports=function(t){var e=this.__data__,n=e.delete(t);return this.size=e.size,n}},945:(t,e,n)=>{var r=n(79),o=n(8223),i=n(3661);t.exports=function(t,e){var n=this.__data__;if(n instanceof r){var a=n.__data__;if(!o||a.length<199)return a.push([t,e]),this.size=++n.size,this;n=this.__data__=new i(a)}return n.set(t,e),this.size=n.size,this}},999:(t,e,n)=>{var r=n(9302),o=n(6800);t.exports=function(t){return r(function(e,n){var r=-1,i=n.length,a=i>1?n[i-1]:void 0,s=i>2?n[2]:void 0;for(a=t.length>3&&"function"==typeof a?(i--,a):void 0,s&&o(n[0],n[1],s)&&(a=i<3?void 0:a,i=1),e=Object(e);++r{t.exports=function(t,e,n){switch(n.length){case 0:return t.call(e);case 1:return t.call(e,n[0]);case 2:return t.call(e,n[0],n[1]);case 3:return t.call(e,n[0],n[1],n[2])}return t.apply(e,n)}},1042:(t,e,n)=>{var r=n(6110)(Object,"create");t.exports=r},1074:t=>{t.exports=function(t){return t.split("")}},1086:(t,e,n)=>{var r=n(4932),o=n(5389),i=n(7420),a=n(3349);t.exports=function(t,e){if(null==t)return{};var n=r(a(t),function(t){return[t]});return e=o(e),i(t,n,function(t,n){return e(t,n[0])})}},1120:function(t,e,n){"use strict";var r=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0}),e.RecognizerApi=void 0;var o=r(n(5880)),i=r(n(9859)),a=n(109),s=n(6312),u=n(870),c=n(500),l=n(3387),f=function(){function t(){}return t.prototype.ACTION=function(t){return t.call(this)},t.prototype.consume=function(t,e,n){return this.consumeInternal(e,t,n)},t.prototype.subrule=function(t,e,n){return this.subruleInternal(e,t,n)},t.prototype.option=function(t,e){return this.optionInternal(e,t)},t.prototype.or=function(t,e){return this.orInternal(e,t)},t.prototype.many=function(t,e){return this.manyInternal(t,e)},t.prototype.atLeastOne=function(t,e){return this.atLeastOneInternal(t,e)},t.prototype.CONSUME=function(t,e){return this.consumeInternal(t,0,e)},t.prototype.CONSUME1=function(t,e){return this.consumeInternal(t,1,e)},t.prototype.CONSUME2=function(t,e){return this.consumeInternal(t,2,e)},t.prototype.CONSUME3=function(t,e){return this.consumeInternal(t,3,e)},t.prototype.CONSUME4=function(t,e){return this.consumeInternal(t,4,e)},t.prototype.CONSUME5=function(t,e){return this.consumeInternal(t,5,e)},t.prototype.CONSUME6=function(t,e){return this.consumeInternal(t,6,e)},t.prototype.CONSUME7=function(t,e){return this.consumeInternal(t,7,e)},t.prototype.CONSUME8=function(t,e){return this.consumeInternal(t,8,e)},t.prototype.CONSUME9=function(t,e){return this.consumeInternal(t,9,e)},t.prototype.SUBRULE=function(t,e){return this.subruleInternal(t,0,e)},t.prototype.SUBRULE1=function(t,e){return this.subruleInternal(t,1,e)},t.prototype.SUBRULE2=function(t,e){return this.subruleInternal(t,2,e)},t.prototype.SUBRULE3=function(t,e){return this.subruleInternal(t,3,e)},t.prototype.SUBRULE4=function(t,e){return this.subruleInternal(t,4,e)},t.prototype.SUBRULE5=function(t,e){return this.subruleInternal(t,5,e)},t.prototype.SUBRULE6=function(t,e){return this.subruleInternal(t,6,e)},t.prototype.SUBRULE7=function(t,e){return this.subruleInternal(t,7,e)},t.prototype.SUBRULE8=function(t,e){return this.subruleInternal(t,8,e)},t.prototype.SUBRULE9=function(t,e){return this.subruleInternal(t,9,e)},t.prototype.OPTION=function(t){return this.optionInternal(t,0)},t.prototype.OPTION1=function(t){return this.optionInternal(t,1)},t.prototype.OPTION2=function(t){return this.optionInternal(t,2)},t.prototype.OPTION3=function(t){return this.optionInternal(t,3)},t.prototype.OPTION4=function(t){return this.optionInternal(t,4)},t.prototype.OPTION5=function(t){return this.optionInternal(t,5)},t.prototype.OPTION6=function(t){return this.optionInternal(t,6)},t.prototype.OPTION7=function(t){return this.optionInternal(t,7)},t.prototype.OPTION8=function(t){return this.optionInternal(t,8)},t.prototype.OPTION9=function(t){return this.optionInternal(t,9)},t.prototype.OR=function(t){return this.orInternal(t,0)},t.prototype.OR1=function(t){return this.orInternal(t,1)},t.prototype.OR2=function(t){return this.orInternal(t,2)},t.prototype.OR3=function(t){return this.orInternal(t,3)},t.prototype.OR4=function(t){return this.orInternal(t,4)},t.prototype.OR5=function(t){return this.orInternal(t,5)},t.prototype.OR6=function(t){return this.orInternal(t,6)},t.prototype.OR7=function(t){return this.orInternal(t,7)},t.prototype.OR8=function(t){return this.orInternal(t,8)},t.prototype.OR9=function(t){return this.orInternal(t,9)},t.prototype.MANY=function(t){this.manyInternal(0,t)},t.prototype.MANY1=function(t){this.manyInternal(1,t)},t.prototype.MANY2=function(t){this.manyInternal(2,t)},t.prototype.MANY3=function(t){this.manyInternal(3,t)},t.prototype.MANY4=function(t){this.manyInternal(4,t)},t.prototype.MANY5=function(t){this.manyInternal(5,t)},t.prototype.MANY6=function(t){this.manyInternal(6,t)},t.prototype.MANY7=function(t){this.manyInternal(7,t)},t.prototype.MANY8=function(t){this.manyInternal(8,t)},t.prototype.MANY9=function(t){this.manyInternal(9,t)},t.prototype.MANY_SEP=function(t){this.manySepFirstInternal(0,t)},t.prototype.MANY_SEP1=function(t){this.manySepFirstInternal(1,t)},t.prototype.MANY_SEP2=function(t){this.manySepFirstInternal(2,t)},t.prototype.MANY_SEP3=function(t){this.manySepFirstInternal(3,t)},t.prototype.MANY_SEP4=function(t){this.manySepFirstInternal(4,t)},t.prototype.MANY_SEP5=function(t){this.manySepFirstInternal(5,t)},t.prototype.MANY_SEP6=function(t){this.manySepFirstInternal(6,t)},t.prototype.MANY_SEP7=function(t){this.manySepFirstInternal(7,t)},t.prototype.MANY_SEP8=function(t){this.manySepFirstInternal(8,t)},t.prototype.MANY_SEP9=function(t){this.manySepFirstInternal(9,t)},t.prototype.AT_LEAST_ONE=function(t){this.atLeastOneInternal(0,t)},t.prototype.AT_LEAST_ONE1=function(t){return this.atLeastOneInternal(1,t)},t.prototype.AT_LEAST_ONE2=function(t){this.atLeastOneInternal(2,t)},t.prototype.AT_LEAST_ONE3=function(t){this.atLeastOneInternal(3,t)},t.prototype.AT_LEAST_ONE4=function(t){this.atLeastOneInternal(4,t)},t.prototype.AT_LEAST_ONE5=function(t){this.atLeastOneInternal(5,t)},t.prototype.AT_LEAST_ONE6=function(t){this.atLeastOneInternal(6,t)},t.prototype.AT_LEAST_ONE7=function(t){this.atLeastOneInternal(7,t)},t.prototype.AT_LEAST_ONE8=function(t){this.atLeastOneInternal(8,t)},t.prototype.AT_LEAST_ONE9=function(t){this.atLeastOneInternal(9,t)},t.prototype.AT_LEAST_ONE_SEP=function(t){this.atLeastOneSepFirstInternal(0,t)},t.prototype.AT_LEAST_ONE_SEP1=function(t){this.atLeastOneSepFirstInternal(1,t)},t.prototype.AT_LEAST_ONE_SEP2=function(t){this.atLeastOneSepFirstInternal(2,t)},t.prototype.AT_LEAST_ONE_SEP3=function(t){this.atLeastOneSepFirstInternal(3,t)},t.prototype.AT_LEAST_ONE_SEP4=function(t){this.atLeastOneSepFirstInternal(4,t)},t.prototype.AT_LEAST_ONE_SEP5=function(t){this.atLeastOneSepFirstInternal(5,t)},t.prototype.AT_LEAST_ONE_SEP6=function(t){this.atLeastOneSepFirstInternal(6,t)},t.prototype.AT_LEAST_ONE_SEP7=function(t){this.atLeastOneSepFirstInternal(7,t)},t.prototype.AT_LEAST_ONE_SEP8=function(t){this.atLeastOneSepFirstInternal(8,t)},t.prototype.AT_LEAST_ONE_SEP9=function(t){this.atLeastOneSepFirstInternal(9,t)},t.prototype.RULE=function(t,e,n){if(void 0===n&&(n=s.DEFAULT_RULE_CONFIG),(0,i.default)(this.definedRulesNames,t)){var r={message:u.defaultGrammarValidatorErrorProvider.buildDuplicateRuleNameError({topLevelRule:t,grammarName:this.className}),type:s.ParserDefinitionErrorType.DUPLICATE_RULE_NAME,ruleName:t};this.definitionErrors.push(r)}this.definedRulesNames.push(t);var o=this.defineRule(t,e,n);return this[t]=o,o},t.prototype.OVERRIDE_RULE=function(t,e,n){void 0===n&&(n=s.DEFAULT_RULE_CONFIG);var r=(0,c.validateRuleIsOverridden)(t,this.definedRulesNames,this.className);this.definitionErrors=this.definitionErrors.concat(r);var o=this.defineRule(t,e,n);return this[t]=o,o},t.prototype.BACKTRACK=function(t,e){return function(){this.isBackTrackingStack.push(1);var n=this.saveRecogState();try{return t.apply(this,e),!0}catch(t){if((0,a.isRecognitionException)(t))return!1;throw t}finally{this.reloadRecogState(n),this.isBackTrackingStack.pop()}}},t.prototype.getGAstProductions=function(){return this.gastProductionsCache},t.prototype.getSerializedGastProductions=function(){return(0,l.serializeGrammar)((0,o.default)(this.gastProductionsCache))},t}();e.RecognizerApi=f},1175:(t,e,n)=>{var r=n(6025);t.exports=function(t,e){var n=this.__data__,o=r(n,t);return o<0?(++this.size,n.push([t,e])):n[o][1]=e,this}},1380:t=>{t.exports=function(t){return this.__data__.set(t,"__lodash_hash_undefined__"),this}},1419:(t,e,n)=>{"use strict";e.iX=e.jT=e.IL=e.Ro=e.C_=e.Ug=e._3=e.BK=e.jO=e.Pp=e.Cy=e.$P=e.Y2=e.c$=e.wL=e.EF=e.ak=e.PW=e.X2=e.xd=e.Vv=e.lC=e.DN=e.my=e.T6=e.jk=e.vb=e.G=e.Sk=e.LT=e.fx=e.Ey=e._J=e.JG=e.mT=e.D2=e.jr=e.cA=e.xv=void 0;var r=n(4927);Object.defineProperty(e,"xv",{enumerable:!0,get:function(){return r.VERSION}});var o=n(6312);Object.defineProperty(e,"cA",{enumerable:!0,get:function(){return o.CstParser}}),Object.defineProperty(e,"jr",{enumerable:!0,get:function(){return o.EmbeddedActionsParser}}),Object.defineProperty(e,"D2",{enumerable:!0,get:function(){return o.ParserDefinitionErrorType}}),Object.defineProperty(e,"mT",{enumerable:!0,get:function(){return o.EMPTY_ALT}});var i=n(127);Object.defineProperty(e,"JG",{enumerable:!0,get:function(){return i.Lexer}}),Object.defineProperty(e,"_J",{enumerable:!0,get:function(){return i.LexerDefinitionErrorType}});var a=n(9399);Object.defineProperty(e,"Ey",{enumerable:!0,get:function(){return a.createToken}}),Object.defineProperty(e,"fx",{enumerable:!0,get:function(){return a.createTokenInstance}}),Object.defineProperty(e,"LT",{enumerable:!0,get:function(){return a.EOF}}),Object.defineProperty(e,"Sk",{enumerable:!0,get:function(){return a.tokenLabel}}),Object.defineProperty(e,"G",{enumerable:!0,get:function(){return a.tokenMatcher}}),Object.defineProperty(e,"vb",{enumerable:!0,get:function(){return a.tokenName}});var s=n(8737);Object.defineProperty(e,"jk",{enumerable:!0,get:function(){return s.getLookaheadPaths}});var u=n(5679);Object.defineProperty(e,"T6",{enumerable:!0,get:function(){return u.LLkLookaheadStrategy}});var c=n(870);Object.defineProperty(e,"my",{enumerable:!0,get:function(){return c.defaultParserErrorProvider}});var l=n(109);Object.defineProperty(e,"DN",{enumerable:!0,get:function(){return l.EarlyExitException}}),Object.defineProperty(e,"lC",{enumerable:!0,get:function(){return l.isRecognitionException}}),Object.defineProperty(e,"Vv",{enumerable:!0,get:function(){return l.MismatchedTokenException}}),Object.defineProperty(e,"xd",{enumerable:!0,get:function(){return l.NotAllInputParsedException}}),Object.defineProperty(e,"X2",{enumerable:!0,get:function(){return l.NoViableAltException}});var f=n(433);Object.defineProperty(e,"PW",{enumerable:!0,get:function(){return f.defaultLexerErrorProvider}});var h=n(3387);Object.defineProperty(e,"ak",{enumerable:!0,get:function(){return h.Alternation}}),Object.defineProperty(e,"EF",{enumerable:!0,get:function(){return h.Alternative}}),Object.defineProperty(e,"wL",{enumerable:!0,get:function(){return h.NonTerminal}}),Object.defineProperty(e,"c$",{enumerable:!0,get:function(){return h.Option}}),Object.defineProperty(e,"Y2",{enumerable:!0,get:function(){return h.Repetition}}),Object.defineProperty(e,"$P",{enumerable:!0,get:function(){return h.RepetitionMandatory}}),Object.defineProperty(e,"Cy",{enumerable:!0,get:function(){return h.RepetitionMandatoryWithSeparator}}),Object.defineProperty(e,"Pp",{enumerable:!0,get:function(){return h.RepetitionWithSeparator}}),Object.defineProperty(e,"jO",{enumerable:!0,get:function(){return h.Rule}}),Object.defineProperty(e,"BK",{enumerable:!0,get:function(){return h.Terminal}});var p=n(3387);Object.defineProperty(e,"_3",{enumerable:!0,get:function(){return p.serializeGrammar}}),Object.defineProperty(e,"Ug",{enumerable:!0,get:function(){return p.serializeProduction}}),Object.defineProperty(e,"C_",{enumerable:!0,get:function(){return p.GAstVisitor}});var d=n(3271);Object.defineProperty(e,"Ro",{enumerable:!0,get:function(){return d.generateCstDts}}),e.IL=function(){console.warn("The clearCache function was 'soft' removed from the Chevrotain API.\n\t It performs no action other than printing this message.\n\t Please avoid using it as it will be completely removed in the future")};var m=n(5994);Object.defineProperty(e,"jT",{enumerable:!0,get:function(){return m.createSyntaxDiagramsCode}});e.iX=function(){throw new Error("The Parser class has been deprecated, use CstParser or EmbeddedActionsParser instead.\t\nSee: https://chevrotain.io/docs/changes/BREAKING_CHANGES.html#_7-0-0")}},1420:(t,e,n)=>{var r=n(79);t.exports=function(){this.__data__=new r,this.size=0}},1437:(t,e,n)=>{var r=n(2552),o=n(346);t.exports=function(t){return o(t)&&"[object RegExp]"==r(t)}},1448:(t,e,n)=>{var r=n(426),o=n(9326);t.exports=function(t,e){return null!=t&&o(t,e,r)}},1459:t=>{t.exports=function(t){return this.__data__.has(t)}},1489:(t,e,n)=>{var r=n(7400);t.exports=function(t){var e=r(t),n=e%1;return e==e?n?e-n:e:0}},1549:(t,e,n)=>{var r=n(2032),o=n(3862),i=n(6721),a=n(2749),s=n(5749);function u(t){var e=-1,n=null==t?0:t.length;for(this.clear();++e{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.timer=void 0,e.timer=function(t){var e=(new Date).getTime(),n=t();return{time:(new Date).getTime()-e,value:n}}},1585:(t,e,n)=>{var r=n(6131),o=n(1489),i=Math.max;t.exports=function(t,e,n){var a=null==t?0:t.length;if(!a)return-1;var s=null==n?0:o(n);return s<0&&(s=i(a+s,0)),r(t,e,s)}},1769:(t,e,n)=>{var r=n(6449),o=n(8586),i=n(1802),a=n(3222);t.exports=function(t,e){return r(t)?t:o(t,e)?[t]:i(a(t))}},1791:(t,e,n)=>{var r=n(6547),o=n(3360);t.exports=function(t,e,n,i){var a=!n;n||(n={});for(var s=-1,u=e.length;++s{var r=n(7217),o=n(270);t.exports=function(t,e,n,i){var a=n.length,s=a,u=!i;if(null==t)return!s;for(t=Object(t);a--;){var c=n[a];if(u&&c[2]?c[1]!==t[c[0]]:!(c[0]in t))return!1}for(;++a{var e=/\s/;t.exports=function(t){for(var n=t.length;n--&&e.test(t.charAt(n)););return n}},1802:(t,e,n)=>{var r=n(2224),o=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,i=/\\(\\)?/g,a=r(function(t){var e=[];return 46===t.charCodeAt(0)&&e.push(""),t.replace(o,function(t,n,r,o){e.push(r?o.replace(i,"$1"):n||t)}),e});t.exports=a},1811:t=>{var e=Date.now;t.exports=function(t){var n=0,r=0;return function(){var o=e(),i=16-(o-r);if(r=o,i>0){if(++n>=800)return arguments[0]}else n=0;return t.apply(void 0,arguments)}}},1873:(t,e,n)=>{var r=n(9325).Symbol;t.exports=r},1882:(t,e,n)=>{var r=n(2552),o=n(3805);t.exports=function(t){if(!o(t))return!1;var e=r(t);return"[object Function]"==e||"[object GeneratorFunction]"==e||"[object AsyncFunction]"==e||"[object Proxy]"==e}},1887:(t,e,n)=>{"use strict";var r;n.d(e,{X:()=>r}),function(t){t.VALUE_CHANGED="value.changed",t.FORMULA_CHANGED="fomula.changed",t.FORMULA_CALCULATED="formula.calculated",t.CALCULATED="calculated",t.ELEMENT_MOUNTED="element.mounted"}(r||(r={}))},1961:(t,e,n)=>{var r=n(9653);t.exports=function(t,e){var n=e?r(t.buffer):t.buffer;return new t.constructor(n,t.byteOffset,t.length)}},1986:(t,e,n)=>{var r=n(1873),o=n(7828),i=n(5288),a=n(5911),s=n(317),u=n(4247),c=r?r.prototype:void 0,l=c?c.valueOf:void 0;t.exports=function(t,e,n,r,c,f,h){switch(n){case"[object DataView]":if(t.byteLength!=e.byteLength||t.byteOffset!=e.byteOffset)return!1;t=t.buffer,e=e.buffer;case"[object ArrayBuffer]":return!(t.byteLength!=e.byteLength||!f(new o(t),new o(e)));case"[object Boolean]":case"[object Date]":case"[object Number]":return i(+t,+e);case"[object Error]":return t.name==e.name&&t.message==e.message;case"[object RegExp]":case"[object String]":return t==e+"";case"[object Map]":var p=s;case"[object Set]":var d=1&r;if(p||(p=u),t.size!=e.size&&!d)return!1;var m=h.get(t);if(m)return m==e;r|=2,h.set(t,e);var g=a(p(t),p(e),r,c,f,h);return h.delete(t),g;case"[object Symbol]":if(l)return l.call(t)==l.call(e)}return!1}},2e3:(t,e,n)=>{var r=n(3945),o=n(2429),i=n(5389),a=n(6449);t.exports=function(t,e){return function(n,s){var u=a(n)?r:o,c=e?e():{};return u(n,t,i(s,2),c)}}},2006:(t,e,n)=>{var r=n(5389),o=n(4894),i=n(5950);t.exports=function(t){return function(e,n,a){var s=Object(e);if(!o(e)){var u=r(n,3);e=i(e),n=function(t){return u(s[t],t,s)}}var c=t(e,n,a);return c>-1?s[u?e[c]:c]:void 0}}},2013:(t,e,n)=>{var r=n(3360),o=n(2e3),i=Object.prototype.hasOwnProperty,a=o(function(t,e,n){i.call(t,n)?t[n].push(e):r(t,n,[e])});t.exports=a},2032:(t,e,n)=>{var r=n(1042);t.exports=function(){this.__data__=r?r(null):{},this.size=0}},2054:t=>{var e="\\ud800-\\udfff",n="["+e+"]",r="[\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]",o="\\ud83c[\\udffb-\\udfff]",i="[^"+e+"]",a="(?:\\ud83c[\\udde6-\\uddff]){2}",s="[\\ud800-\\udbff][\\udc00-\\udfff]",u="(?:"+r+"|"+o+")?",c="[\\ufe0e\\ufe0f]?",l=c+u+"(?:\\u200d(?:"+[i,a,s].join("|")+")"+c+u+")*",f="(?:"+[i+r+"?",r,a,s,n].join("|")+")",h=RegExp(o+"(?="+o+")|"+f+l,"g");t.exports=function(t){return t.match(h)||[]}},2056:function(t,e,n){"use strict";var r,o=this&&this.__extends||(r=function(t,e){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n])},r(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function n(){this.constructor=t}r(t,e),t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)}),i=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0}),e.collectMethods=e.LooksAhead=void 0;var a=i(n(9754)),s=i(n(1448)),u=n(6312),c=n(7045),l=n(3387),f=n(3387),h=n(5679),p=function(){function t(){}return t.prototype.initLooksAhead=function(t){this.dynamicTokensEnabled=(0,s.default)(t,"dynamicTokensEnabled")?t.dynamicTokensEnabled:u.DEFAULT_PARSER_CONFIG.dynamicTokensEnabled,this.maxLookahead=(0,s.default)(t,"maxLookahead")?t.maxLookahead:u.DEFAULT_PARSER_CONFIG.maxLookahead,this.lookaheadStrategy=(0,s.default)(t,"lookaheadStrategy")?t.lookaheadStrategy:new h.LLkLookaheadStrategy({maxLookahead:this.maxLookahead}),this.lookAheadFuncsCache=new Map},t.prototype.preComputeLookaheadFunctions=function(t){var e=this;(0,a.default)(t,function(t){e.TRACE_INIT("".concat(t.name," Rule Lookahead"),function(){var n=g(t),r=n.alternation,o=n.repetition,i=n.option,s=n.repetitionMandatory,u=n.repetitionMandatoryWithSeparator,l=n.repetitionWithSeparator;(0,a.default)(r,function(n){var r=0===n.idx?"":n.idx;e.TRACE_INIT("".concat((0,f.getProductionDslName)(n)).concat(r),function(){var r=e.lookaheadStrategy.buildLookaheadForAlternation({prodOccurrence:n.idx,rule:t,maxLookahead:n.maxLookahead||e.maxLookahead,hasPredicates:n.hasPredicates,dynamicTokensEnabled:e.dynamicTokensEnabled}),o=(0,c.getKeyForAutomaticLookahead)(e.fullRuleNameToShort[t.name],c.OR_IDX,n.idx);e.setLaFuncCache(o,r)})}),(0,a.default)(o,function(n){e.computeLookaheadFunc(t,n.idx,c.MANY_IDX,"Repetition",n.maxLookahead,(0,f.getProductionDslName)(n))}),(0,a.default)(i,function(n){e.computeLookaheadFunc(t,n.idx,c.OPTION_IDX,"Option",n.maxLookahead,(0,f.getProductionDslName)(n))}),(0,a.default)(s,function(n){e.computeLookaheadFunc(t,n.idx,c.AT_LEAST_ONE_IDX,"RepetitionMandatory",n.maxLookahead,(0,f.getProductionDslName)(n))}),(0,a.default)(u,function(n){e.computeLookaheadFunc(t,n.idx,c.AT_LEAST_ONE_SEP_IDX,"RepetitionMandatoryWithSeparator",n.maxLookahead,(0,f.getProductionDslName)(n))}),(0,a.default)(l,function(n){e.computeLookaheadFunc(t,n.idx,c.MANY_SEP_IDX,"RepetitionWithSeparator",n.maxLookahead,(0,f.getProductionDslName)(n))})})})},t.prototype.computeLookaheadFunc=function(t,e,n,r,o,i){var a=this;this.TRACE_INIT("".concat(i).concat(0===e?"":e),function(){var i=a.lookaheadStrategy.buildLookaheadForOptional({prodOccurrence:e,rule:t,maxLookahead:o||a.maxLookahead,dynamicTokensEnabled:a.dynamicTokensEnabled,prodType:r}),s=(0,c.getKeyForAutomaticLookahead)(a.fullRuleNameToShort[t.name],n,e);a.setLaFuncCache(s,i)})},t.prototype.getKeyForAutomaticLookahead=function(t,e){var n=this.getLastExplicitRuleShortName();return(0,c.getKeyForAutomaticLookahead)(n,t,e)},t.prototype.getLaFuncFromCache=function(t){return this.lookAheadFuncsCache.get(t)},t.prototype.setLaFuncCache=function(t,e){this.lookAheadFuncsCache.set(t,e)},t}();e.LooksAhead=p;var d=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.dslMethods={option:[],alternation:[],repetition:[],repetitionWithSeparator:[],repetitionMandatory:[],repetitionMandatoryWithSeparator:[]},e}return o(e,t),e.prototype.reset=function(){this.dslMethods={option:[],alternation:[],repetition:[],repetitionWithSeparator:[],repetitionMandatory:[],repetitionMandatoryWithSeparator:[]}},e.prototype.visitOption=function(t){this.dslMethods.option.push(t)},e.prototype.visitRepetitionWithSeparator=function(t){this.dslMethods.repetitionWithSeparator.push(t)},e.prototype.visitRepetitionMandatory=function(t){this.dslMethods.repetitionMandatory.push(t)},e.prototype.visitRepetitionMandatoryWithSeparator=function(t){this.dslMethods.repetitionMandatoryWithSeparator.push(t)},e.prototype.visitRepetition=function(t){this.dslMethods.repetition.push(t)},e.prototype.visitAlternation=function(t){this.dslMethods.alternation.push(t)},e}(l.GAstVisitor),m=new d;function g(t){m.reset(),t.accept(m);var e=m.dslMethods;return m.reset(),e}e.collectMethods=g},2112:function(t,e,n){"use strict";var r=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0}),e.PerformanceTracer=void 0;var o=r(n(1448)),i=n(8927),a=n(6312),s=function(){function t(){}return t.prototype.initPerformanceTracer=function(t){if((0,o.default)(t,"traceInitPerf")){var e=t.traceInitPerf,n="number"==typeof e;this.traceInitMaxIdent=n?e:1/0,this.traceInitPerf=n?e>0:e}else this.traceInitMaxIdent=0,this.traceInitPerf=a.DEFAULT_PARSER_CONFIG.traceInitPerf;this.traceInitIndent=-1},t.prototype.TRACE_INIT=function(t,e){if(!0===this.traceInitPerf){this.traceInitIndent++;var n=new Array(this.traceInitIndent+1).join("\t");this.traceInitIndent"));var r=(0,i.timer)(e),o=r.time,a=r.value,s=o>10?console.warn:console.log;return this.traceInitIndent time: ").concat(o,"ms")),this.traceInitIndent--,a}return e()},t}();e.PerformanceTracer=s},2193:(t,e,n)=>{var r=n(8984),o=n(5861),i=n(2428),a=n(6449),s=n(4894),u=n(3656),c=n(5527),l=n(7167),f=Object.prototype.hasOwnProperty;t.exports=function(t){if(null==t)return!0;if(s(t)&&(a(t)||"string"==typeof t||"function"==typeof t.splice||u(t)||l(t)||i(t)))return!t.length;var e=o(t);if("[object Map]"==e||"[object Set]"==e)return!t.size;if(c(t))return!r(t).length;for(var n in t)if(f.call(t,n))return!1;return!0}},2195:function(t,e,n){"use strict";var r=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0}),e.firstForTerminal=e.firstForBranching=e.firstForSequence=e.first=void 0;var o=r(n(5970)),i=r(n(3375)),a=r(n(5378)),s=n(3387),u=n(3387);function c(t){if(t instanceof s.NonTerminal)return c(t.referencedRule);if(t instanceof s.Terminal)return h(t);if((0,u.isSequenceProd)(t))return l(t);if((0,u.isBranchingProd)(t))return f(t);throw Error("non exhaustive match")}function l(t){for(var e,n=[],r=t.definition,o=0,a=r.length>o,s=!0;a&&s;)e=r[o],s=(0,u.isOptionalProd)(e),n=n.concat(c(e)),o+=1,a=r.length>o;return(0,i.default)(n)}function f(t){var e=(0,a.default)(t.definition,function(t){return c(t)});return(0,i.default)((0,o.default)(e))}function h(t){return[t.terminalType]}e.first=c,e.firstForSequence=l,e.firstForBranching=f,e.firstForTerminal=h},2199:(t,e,n)=>{var r=n(4528),o=n(6449);t.exports=function(t,e,n){var i=e(t);return o(t)?i:r(i,n(t))}},2216:t=>{t.exports=function(t){return void 0===t}},2224:(t,e,n)=>{var r=n(104);t.exports=function(t){var e=r(t,function(t){return 500===n.size&&n.clear(),t}),n=e.cache;return e}},2271:(t,e,n)=>{var r=n(1791),o=n(4664);t.exports=function(t,e){return r(t,o(t),e)}},2308:(t,e)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.PRINT_WARNING=e.PRINT_ERROR=void 0,e.PRINT_ERROR=function(t){console&&console.error&&console.error("Error: ".concat(t))},e.PRINT_WARNING=function(t){console&&console.warn&&console.warn("Warning: ".concat(t))}},2423:function(t,e,n){"use strict";var r=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0}),e.GastRecorder=void 0;var o=r(n(8090)),i=r(n(6449)),a=r(n(2426)),s=r(n(9754)),u=r(n(1882)),c=r(n(1448)),l=n(3387),f=n(127),h=n(3087),p=n(9399),d=n(6312),m=n(7045),g={description:"This Object indicates the Parser is during Recording Phase"};Object.freeze(g);var v=!0,y=Math.pow(2,m.BITS_FOR_OCCURRENCE_IDX)-1,E=(0,p.createToken)({name:"RECORDING_PHASE_TOKEN",pattern:f.Lexer.NA});(0,h.augmentTokenTypes)([E]);var T=(0,p.createTokenInstance)(E,"This IToken indicates the Parser is in Recording Phase\n\tSee: https://chevrotain.io/docs/guide/internals.html#grammar-recording for details",-1,-1,-1,-1,-1,-1);Object.freeze(T);var A={name:"This CSTNode indicates the Parser is in Recording Phase\n\tSee: https://chevrotain.io/docs/guide/internals.html#grammar-recording for details",children:{}},_=function(){function t(){}return t.prototype.initGastRecorder=function(t){this.recordingProdStack=[],this.RECORDING_PHASE=!1},t.prototype.enableRecording=function(){var t=this;this.RECORDING_PHASE=!0,this.TRACE_INIT("Enable Recording",function(){for(var e=function(e){var n=e>0?e:"";t["CONSUME".concat(n)]=function(t,n){return this.consumeInternalRecord(t,e,n)},t["SUBRULE".concat(n)]=function(t,n){return this.subruleInternalRecord(t,e,n)},t["OPTION".concat(n)]=function(t){return this.optionInternalRecord(t,e)},t["OR".concat(n)]=function(t){return this.orInternalRecord(t,e)},t["MANY".concat(n)]=function(t){this.manyInternalRecord(e,t)},t["MANY_SEP".concat(n)]=function(t){this.manySepFirstInternalRecord(e,t)},t["AT_LEAST_ONE".concat(n)]=function(t){this.atLeastOneInternalRecord(e,t)},t["AT_LEAST_ONE_SEP".concat(n)]=function(t){this.atLeastOneSepFirstInternalRecord(e,t)}},n=0;n<10;n++)e(n);t.consume=function(t,e,n){return this.consumeInternalRecord(e,t,n)},t.subrule=function(t,e,n){return this.subruleInternalRecord(e,t,n)},t.option=function(t,e){return this.optionInternalRecord(e,t)},t.or=function(t,e){return this.orInternalRecord(e,t)},t.many=function(t,e){this.manyInternalRecord(t,e)},t.atLeastOne=function(t,e){this.atLeastOneInternalRecord(t,e)},t.ACTION=t.ACTION_RECORD,t.BACKTRACK=t.BACKTRACK_RECORD,t.LA=t.LA_RECORD})},t.prototype.disableRecording=function(){var t=this;this.RECORDING_PHASE=!1,this.TRACE_INIT("Deleting Recording methods",function(){for(var e=t,n=0;n<10;n++){var r=n>0?n:"";delete e["CONSUME".concat(r)],delete e["SUBRULE".concat(r)],delete e["OPTION".concat(r)],delete e["OR".concat(r)],delete e["MANY".concat(r)],delete e["MANY_SEP".concat(r)],delete e["AT_LEAST_ONE".concat(r)],delete e["AT_LEAST_ONE_SEP".concat(r)]}delete e.consume,delete e.subrule,delete e.option,delete e.or,delete e.many,delete e.atLeastOne,delete e.ACTION,delete e.BACKTRACK,delete e.LA})},t.prototype.ACTION_RECORD=function(t){},t.prototype.BACKTRACK_RECORD=function(t,e){return function(){return!0}},t.prototype.LA_RECORD=function(t){return d.END_OF_FILE},t.prototype.topLevelRuleRecord=function(t,e){try{var n=new l.Rule({definition:[],name:t});return n.name=t,this.recordingProdStack.push(n),e.call(this),this.recordingProdStack.pop(),n}catch(t){if(!0!==t.KNOWN_RECORDER_ERROR)try{t.message=t.message+'\n\t This error was thrown during the "grammar recording phase" For more info see:\n\thttps://chevrotain.io/docs/guide/internals.html#grammar-recording'}catch(e){throw t}throw t}},t.prototype.optionInternalRecord=function(t,e){return R.call(this,l.Option,t,e)},t.prototype.atLeastOneInternalRecord=function(t,e){R.call(this,l.RepetitionMandatory,e,t)},t.prototype.atLeastOneSepFirstInternalRecord=function(t,e){R.call(this,l.RepetitionMandatoryWithSeparator,e,t,v)},t.prototype.manyInternalRecord=function(t,e){R.call(this,l.Repetition,e,t)},t.prototype.manySepFirstInternalRecord=function(t,e){R.call(this,l.RepetitionWithSeparator,e,t,v)},t.prototype.orInternalRecord=function(t,e){return N.call(this,t,e)},t.prototype.subruleInternalRecord=function(t,e,n){if(I(e),!t||!1===(0,c.default)(t,"ruleName")){var r=new Error(" argument is invalid")+" expecting a Parser method reference but got: <".concat(JSON.stringify(t),">")+"\n inside top level rule: <".concat(this.recordingProdStack[0].name,">"));throw r.KNOWN_RECORDER_ERROR=!0,r}var i=(0,o.default)(this.recordingProdStack),a=t.ruleName,s=new l.NonTerminal({idx:e,nonTerminalName:a,label:null==n?void 0:n.LABEL,referencedRule:void 0});return i.definition.push(s),this.outputCst?A:g},t.prototype.consumeInternalRecord=function(t,e,n){if(I(e),!(0,h.hasShortKeyProperty)(t)){var r=new Error(" argument is invalid")+" expecting a TokenType reference but got: <".concat(JSON.stringify(t),">")+"\n inside top level rule: <".concat(this.recordingProdStack[0].name,">"));throw r.KNOWN_RECORDER_ERROR=!0,r}var i=(0,o.default)(this.recordingProdStack),a=new l.Terminal({idx:e,terminalType:t,label:null==n?void 0:n.LABEL});return i.definition.push(a),T},t}();function R(t,e,n,r){void 0===r&&(r=!1),I(n);var i=(0,o.default)(this.recordingProdStack),a=(0,u.default)(e)?e:e.DEF,s=new t({definition:[],idx:n});return r&&(s.separator=e.SEP),(0,c.default)(e,"MAX_LOOKAHEAD")&&(s.maxLookahead=e.MAX_LOOKAHEAD),this.recordingProdStack.push(s),a.call(this),i.definition.push(s),this.recordingProdStack.pop(),g}function N(t,e){var n=this;I(e);var r=(0,o.default)(this.recordingProdStack),f=!1===(0,i.default)(t),h=!1===f?t:t.DEF,p=new l.Alternation({definition:[],idx:e,ignoreAmbiguities:f&&!0===t.IGNORE_AMBIGUITIES});(0,c.default)(t,"MAX_LOOKAHEAD")&&(p.maxLookahead=t.MAX_LOOKAHEAD);var d=(0,a.default)(h,function(t){return(0,u.default)(t.GATE)});return p.hasPredicates=d,r.definition.push(p),(0,s.default)(h,function(t){var e=new l.Alternative({definition:[]});p.definition.push(e),(0,c.default)(t,"IGNORE_AMBIGUITIES")?e.ignoreAmbiguities=t.IGNORE_AMBIGUITIES:(0,c.default)(t,"GATE")&&(e.ignoreAmbiguities=!0),n.recordingProdStack.push(e),t.ALT.call(n),n.recordingProdStack.pop()}),g}function O(t){return 0===t?"":"".concat(t)}function I(t){if(t<0||t>y){var e=new Error("Invalid DSL Method idx value: <".concat(t,">\n\t")+"Idx value must be a none negative value smaller than ".concat(y+1));throw e.KNOWN_RECORDER_ERROR=!0,e}}e.GastRecorder=_},2426:(t,e,n)=>{var r=n(4248),o=n(5389),i=n(916),a=n(6449),s=n(6800);t.exports=function(t,e,n){var u=a(t)?r:i;return n&&s(t,e,n)&&(e=void 0),u(t,o(e,3))}},2428:(t,e,n)=>{var r=n(7534),o=n(346),i=Object.prototype,a=i.hasOwnProperty,s=i.propertyIsEnumerable,u=r(function(){return arguments}())?r:function(t){return o(t)&&a.call(t,"callee")&&!s.call(t,"callee")};t.exports=u},2429:(t,e,n)=>{var r=n(909);t.exports=function(t,e,n,o){return r(t,function(t,r,i){e(o,t,n(t),i)}),o}},2475:function(t,e){var n,r;"undefined"!=typeof self&&self,void 0===(r="function"==typeof(n=function(){function t(){}t.prototype.saveState=function(){return{idx:this.idx,input:this.input,groupIdx:this.groupIdx}},t.prototype.restoreState=function(t){this.idx=t.idx,this.input=t.input,this.groupIdx=t.groupIdx},t.prototype.pattern=function(t){this.idx=0,this.input=t,this.groupIdx=0,this.consumeChar("/");var e=this.disjunction();this.consumeChar("/");for(var n={type:"Flags",loc:{begin:this.idx,end:t.length},global:!1,ignoreCase:!1,multiLine:!1,unicode:!1,sticky:!1};this.isRegExpFlag();)switch(this.popChar()){case"g":s(n,"global");break;case"i":s(n,"ignoreCase");break;case"m":s(n,"multiLine");break;case"u":s(n,"unicode");break;case"y":s(n,"sticky")}if(this.idx!==this.input.length)throw Error("Redundant input: "+this.input.substring(this.idx));return{type:"Pattern",flags:n,value:e,loc:this.loc(0)}},t.prototype.disjunction=function(){var t=[],e=this.idx;for(t.push(this.alternative());"|"===this.peekChar();)this.consumeChar("|"),t.push(this.alternative());return{type:"Disjunction",value:t,loc:this.loc(e)}},t.prototype.alternative=function(){for(var t=[],e=this.idx;this.isTerm();)t.push(this.term());return{type:"Alternative",value:t,loc:this.loc(e)}},t.prototype.term=function(){return this.isAssertion()?this.assertion():this.atom()},t.prototype.assertion=function(){var t=this.idx;switch(this.popChar()){case"^":return{type:"StartAnchor",loc:this.loc(t)};case"$":return{type:"EndAnchor",loc:this.loc(t)};case"\\":switch(this.popChar()){case"b":return{type:"WordBoundary",loc:this.loc(t)};case"B":return{type:"NonWordBoundary",loc:this.loc(t)}}throw Error("Invalid Assertion Escape");case"(":var e;switch(this.consumeChar("?"),this.popChar()){case"=":e="Lookahead";break;case"!":e="NegativeLookahead"}u(e);var n=this.disjunction();return this.consumeChar(")"),{type:e,value:n,loc:this.loc(t)}}!function(){throw Error("Internal Error - Should never get here!")}()},t.prototype.quantifier=function(t){var e,n=this.idx;switch(this.popChar()){case"*":e={atLeast:0,atMost:1/0};break;case"+":e={atLeast:1,atMost:1/0};break;case"?":e={atLeast:0,atMost:1};break;case"{":var r=this.integerIncludingZero();switch(this.popChar()){case"}":e={atLeast:r,atMost:r};break;case",":e=this.isDigit()?{atLeast:r,atMost:this.integerIncludingZero()}:{atLeast:r,atMost:1/0},this.consumeChar("}")}if(!0===t&&void 0===e)return;u(e)}if(!0!==t||void 0!==e)return u(e),"?"===this.peekChar(0)?(this.consumeChar("?"),e.greedy=!1):e.greedy=!0,e.type="Quantifier",e.loc=this.loc(n),e},t.prototype.atom=function(){var t,e=this.idx;switch(this.peekChar()){case".":t=this.dotAll();break;case"\\":t=this.atomEscape();break;case"[":t=this.characterClass();break;case"(":t=this.group()}return void 0===t&&this.isPatternCharacter()&&(t=this.patternCharacter()),u(t),t.loc=this.loc(e),this.isQuantifier()&&(t.quantifier=this.quantifier()),t},t.prototype.dotAll=function(){return this.consumeChar("."),{type:"Set",complement:!0,value:[i("\n"),i("\r"),i("\u2028"),i("\u2029")]}},t.prototype.atomEscape=function(){switch(this.consumeChar("\\"),this.peekChar()){case"1":case"2":case"3":case"4":case"5":case"6":case"7":case"8":case"9":return this.decimalEscapeAtom();case"d":case"D":case"s":case"S":case"w":case"W":return this.characterClassEscape();case"f":case"n":case"r":case"t":case"v":return this.controlEscapeAtom();case"c":return this.controlLetterEscapeAtom();case"0":return this.nulCharacterAtom();case"x":return this.hexEscapeSequenceAtom();case"u":return this.regExpUnicodeEscapeSequenceAtom();default:return this.identityEscapeAtom()}},t.prototype.decimalEscapeAtom=function(){return{type:"GroupBackReference",value:this.positiveInteger()}},t.prototype.characterClassEscape=function(){var t,e=!1;switch(this.popChar()){case"d":t=c;break;case"D":t=c,e=!0;break;case"s":t=f;break;case"S":t=f,e=!0;break;case"w":t=l;break;case"W":t=l,e=!0}return u(t),{type:"Set",value:t,complement:e}},t.prototype.controlEscapeAtom=function(){var t;switch(this.popChar()){case"f":t=i("\f");break;case"n":t=i("\n");break;case"r":t=i("\r");break;case"t":t=i("\t");break;case"v":t=i("\v")}return u(t),{type:"Character",value:t}},t.prototype.controlLetterEscapeAtom=function(){this.consumeChar("c");var t=this.popChar();if(!1===/[a-zA-Z]/.test(t))throw Error("Invalid ");return{type:"Character",value:t.toUpperCase().charCodeAt(0)-64}},t.prototype.nulCharacterAtom=function(){return this.consumeChar("0"),{type:"Character",value:i("\0")}},t.prototype.hexEscapeSequenceAtom=function(){return this.consumeChar("x"),this.parseHexDigits(2)},t.prototype.regExpUnicodeEscapeSequenceAtom=function(){return this.consumeChar("u"),this.parseHexDigits(4)},t.prototype.identityEscapeAtom=function(){return{type:"Character",value:i(this.popChar())}},t.prototype.classPatternCharacterAtom=function(){switch(this.peekChar()){case"\n":case"\r":case"\u2028":case"\u2029":case"\\":case"]":throw Error("TBD");default:return{type:"Character",value:i(this.popChar())}}},t.prototype.characterClass=function(){var t=[],e=!1;for(this.consumeChar("["),"^"===this.peekChar(0)&&(this.consumeChar("^"),e=!0);this.isClassAtom();){var n=this.classAtom();if("Character"===n.type&&this.isRangeDash()){this.consumeChar("-");var r=this.classAtom();if("Character"===r.type){if(r.value=this.input.length)throw Error("Unexpected end of input");this.idx++},t.prototype.loc=function(t){return{begin:t,end:this.idx}};var e,n=/[0-9a-fA-F]/,r=/[0-9]/,o=/[1-9]/;function i(t){return t.charCodeAt(0)}function a(t,e){void 0!==t.length?t.forEach(function(t){e.push(t)}):e.push(t)}function s(t,e){if(!0===t[e])throw"duplicate flag "+e;t[e]=!0}function u(t){if(void 0===t)throw Error("Internal Error - Should never get here!")}var c=[];for(e=i("0");e<=i("9");e++)c.push(e);var l=[i("_")].concat(c);for(e=i("a");e<=i("z");e++)l.push(e);for(e=i("A");e<=i("Z");e++)l.push(e);var f=[i(" "),i("\f"),i("\n"),i("\r"),i("\t"),i("\v"),i("\t"),i(" "),i(" "),i(" "),i(" "),i(" "),i(" "),i(" "),i(" "),i(" "),i(" "),i(" "),i(" "),i(" "),i("\u2028"),i("\u2029"),i(" "),i(" "),i(" "),i("\ufeff")];function h(){}return h.prototype.visitChildren=function(t){for(var e in t){var n=t[e];t.hasOwnProperty(e)&&(void 0!==n.type?this.visit(n):Array.isArray(n)&&n.forEach(function(t){this.visit(t)},this))}},h.prototype.visit=function(t){switch(t.type){case"Pattern":this.visitPattern(t);break;case"Flags":this.visitFlags(t);break;case"Disjunction":this.visitDisjunction(t);break;case"Alternative":this.visitAlternative(t);break;case"StartAnchor":this.visitStartAnchor(t);break;case"EndAnchor":this.visitEndAnchor(t);break;case"WordBoundary":this.visitWordBoundary(t);break;case"NonWordBoundary":this.visitNonWordBoundary(t);break;case"Lookahead":this.visitLookahead(t);break;case"NegativeLookahead":this.visitNegativeLookahead(t);break;case"Character":this.visitCharacter(t);break;case"Set":this.visitSet(t);break;case"Group":this.visitGroup(t);break;case"GroupBackReference":this.visitGroupBackReference(t);break;case"Quantifier":this.visitQuantifier(t)}this.visitChildren(t)},h.prototype.visitPattern=function(t){},h.prototype.visitFlags=function(t){},h.prototype.visitDisjunction=function(t){},h.prototype.visitAlternative=function(t){},h.prototype.visitStartAnchor=function(t){},h.prototype.visitEndAnchor=function(t){},h.prototype.visitWordBoundary=function(t){},h.prototype.visitNonWordBoundary=function(t){},h.prototype.visitLookahead=function(t){},h.prototype.visitNegativeLookahead=function(t){},h.prototype.visitCharacter=function(t){},h.prototype.visitSet=function(t){},h.prototype.visitGroup=function(t){},h.prototype.visitGroupBackReference=function(t){},h.prototype.visitQuantifier=function(t){},{RegExpParser:t,BaseRegExpVisitor:h,VERSION:"0.5.0"}})?n.apply(e,[]):n)||(t.exports=r)},2507:(t,e,n)=>{var r=n(8754),o=n(9698),i=n(3912),a=n(3222);t.exports=function(t){return function(e){e=a(e);var n=o(e)?i(e):void 0,s=n?n[0]:e.charAt(0),u=n?r(n,1).join(""):e.slice(1);return s[t]()+u}}},2523:t=>{t.exports=function(t,e,n,r){for(var o=t.length,i=n+(r?1:-1);r?i--:++i{var r=n(1873),o=n(659),i=n(9350),a=r?r.toStringTag:void 0;t.exports=function(t){return null==t?void 0===t?"[object Undefined]":"[object Null]":a&&a in Object(t)?o(t):i(t)}},2629:(t,e,n)=>{var r=n(9999);t.exports=function(t){return r(t,4)}},2651:(t,e,n)=>{var r=n(4218);t.exports=function(t,e){var n=t.__data__;return r(e)?n["string"==typeof e?"string":"hash"]:n.map}},2749:(t,e,n)=>{var r=n(1042),o=Object.prototype.hasOwnProperty;t.exports=function(t){var e=this.__data__;return r?void 0!==e[t]:o.call(e,t)}},2804:(t,e,n)=>{var r=n(6110)(n(9325),"Promise");t.exports=r},2865:(t,e,n)=>{var r=n(9570),o=n(1811)(r);t.exports=o},2903:(t,e,n)=>{var r=n(3805),o=n(5527),i=n(181),a=Object.prototype.hasOwnProperty;t.exports=function(t){if(!r(t))return i(t);var e=o(t),n=[];for(var s in t)("constructor"!=s||!e&&a.call(t,s))&&n.push(s);return n}},2949:(t,e,n)=>{var r=n(2651);t.exports=function(t,e){var n=r(this,t),o=n.size;return n.set(t,e),this.size+=n.size==o?0:1,this}},3007:t=>{t.exports=function(t,e){var n=-1,r=t.length;for(e||(e=Array(r));++n{var r=n(1549),o=n(79),i=n(8223);t.exports=function(){this.size=0,this.__data__={hash:new r,map:new(i||o),string:new r}}},3087:function(t,e,n){"use strict";var r=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0}),e.isTokenType=e.hasExtendingTokensTypesMapProperty=e.hasExtendingTokensTypesProperty=e.hasCategoriesProperty=e.hasShortKeyProperty=e.singleAssignCategoriesToksMap=e.assignCategoriesMapProp=e.assignCategoriesTokensProp=e.assignTokenDefaultProps=e.expandCategories=e.augmentTokenTypes=e.tokenIdxToClass=e.tokenShortNameIdx=e.tokenStructuredMatcherNoCategories=e.tokenStructuredMatcher=void 0;var o=r(n(2193)),i=r(n(3673)),a=r(n(6449)),s=r(n(5970)),u=r(n(6245)),c=r(n(5378)),l=r(n(9754)),f=r(n(1448)),h=r(n(9859)),p=r(n(2629));function d(t){for(var e=(0,p.default)(t),n=t,r=!0;r;){n=(0,i.default)((0,s.default)((0,c.default)(n,function(t){return t.CATEGORIES})));var a=(0,u.default)(n,e);e=e.concat(a),(0,o.default)(a)?r=!1:n=a}return e}function m(t){(0,l.default)(t,function(t){E(t)||(e.tokenIdxToClass[e.tokenShortNameIdx]=t,t.tokenTypeIdx=e.tokenShortNameIdx++),T(t)&&!(0,a.default)(t.CATEGORIES)&&(t.CATEGORIES=[t.CATEGORIES]),T(t)||(t.CATEGORIES=[]),A(t)||(t.categoryMatches=[]),_(t)||(t.categoryMatchesMap={})})}function g(t){(0,l.default)(t,function(t){t.categoryMatches=[],(0,l.default)(t.categoryMatchesMap,function(n,r){t.categoryMatches.push(e.tokenIdxToClass[r].tokenTypeIdx)})})}function v(t){(0,l.default)(t,function(t){y([],t)})}function y(t,e){(0,l.default)(t,function(t){e.categoryMatchesMap[t.tokenTypeIdx]=!0}),(0,l.default)(e.CATEGORIES,function(n){var r=t.concat(e);(0,h.default)(r,n)||y(r,n)})}function E(t){return(0,f.default)(t,"tokenTypeIdx")}function T(t){return(0,f.default)(t,"CATEGORIES")}function A(t){return(0,f.default)(t,"categoryMatches")}function _(t){return(0,f.default)(t,"categoryMatchesMap")}e.tokenStructuredMatcher=function(t,e){var n=t.tokenTypeIdx;return n===e.tokenTypeIdx||!0===e.isParent&&!0===e.categoryMatchesMap[n]},e.tokenStructuredMatcherNoCategories=function(t,e){return t.tokenTypeIdx===e.tokenTypeIdx},e.tokenShortNameIdx=1,e.tokenIdxToClass={},e.augmentTokenTypes=function(t){var e=d(t);m(e),v(e),g(e),(0,l.default)(e,function(t){t.isParent=t.categoryMatches.length>0})},e.expandCategories=d,e.assignTokenDefaultProps=m,e.assignCategoriesTokensProp=g,e.assignCategoriesMapProp=v,e.singleAssignCategoriesToksMap=y,e.hasShortKeyProperty=E,e.hasCategoriesProperty=T,e.hasExtendingTokensTypesProperty=A,e.hasExtendingTokensTypesMapProperty=_,e.isTokenType=function(t){return(0,f.default)(t,"tokenTypeIdx")}},3120:(t,e,n)=>{var r=n(4528),o=n(5891);t.exports=function t(e,n,i,a,s){var u=-1,c=e.length;for(i||(i=o),s||(s=[]);++u0&&i(l)?n>1?t(l,n-1,i,a,s):r(s,l):a||(s[s.length]=l)}return s}},3131:function(t,e,n){"use strict";var r=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0}),e.RestWalker=void 0;var o=r(n(3739)),i=r(n(9754)),a=n(3387),s=function(){function t(){}return t.prototype.walk=function(t,e){var n=this;void 0===e&&(e=[]),(0,i.default)(t.definition,function(r,i){var s=(0,o.default)(t.definition,i+1);if(r instanceof a.NonTerminal)n.walkProdRef(r,s,e);else if(r instanceof a.Terminal)n.walkTerminal(r,s,e);else if(r instanceof a.Alternative)n.walkFlat(r,s,e);else if(r instanceof a.Option)n.walkOption(r,s,e);else if(r instanceof a.RepetitionMandatory)n.walkAtLeastOne(r,s,e);else if(r instanceof a.RepetitionMandatoryWithSeparator)n.walkAtLeastOneSep(r,s,e);else if(r instanceof a.RepetitionWithSeparator)n.walkManySep(r,s,e);else if(r instanceof a.Repetition)n.walkMany(r,s,e);else{if(!(r instanceof a.Alternation))throw Error("non exhaustive match");n.walkOr(r,s,e)}})},t.prototype.walkTerminal=function(t,e,n){},t.prototype.walkProdRef=function(t,e,n){},t.prototype.walkFlat=function(t,e,n){var r=e.concat(n);this.walk(t,r)},t.prototype.walkOption=function(t,e,n){var r=e.concat(n);this.walk(t,r)},t.prototype.walkAtLeastOne=function(t,e,n){var r=[new a.Option({definition:t.definition})].concat(e,n);this.walk(t,r)},t.prototype.walkAtLeastOneSep=function(t,e,n){var r=u(t,e,n);this.walk(t,r)},t.prototype.walkMany=function(t,e,n){var r=[new a.Option({definition:t.definition})].concat(e,n);this.walk(t,r)},t.prototype.walkManySep=function(t,e,n){var r=u(t,e,n);this.walk(t,r)},t.prototype.walkOr=function(t,e,n){var r=this,o=e.concat(n);(0,i.default)(t.definition,function(t){var e=new a.Alternative({definition:[t]});r.walk(e,o)})},t}();function u(t,e,n){return[new a.Option({definition:[new a.Terminal({terminalType:t.separator})].concat(t.definition)})].concat(e,n)}e.RestWalker=s},3170:(t,e,n)=>{var r=n(6547),o=n(1769),i=n(361),a=n(3805),s=n(7797);t.exports=function(t,e,n,u){if(!a(t))return t;for(var c=-1,l=(e=o(e,t)).length,f=l-1,h=t;null!=h&&++c{var e=/\w*$/;t.exports=function(t){var n=new t.constructor(t.source,e.exec(t));return n.lastIndex=t.lastIndex,n}},3221:t=>{t.exports=function(t){return function(e,n,r){for(var o=-1,i=Object(e),a=r(e),s=a.length;s--;){var u=a[t?s:++o];if(!1===n(i[u],u,i))break}return e}}},3222:(t,e,n)=>{var r=n(7556);t.exports=function(t){return null==t?"":r(t)}},3243:(t,e,n)=>{var r=n(6110),o=function(){try{var t=r(Object,"defineProperty");return t({},"",{}),t}catch(t){}}();t.exports=o},3271:function(t,e,n){"use strict";var r=this&&this.__assign||function(){return r=Object.assign||function(t){for(var e,n=1,r=arguments.length;n{t=n.nmd(t);var r=n(9325),o=e&&!e.nodeType&&e,i=o&&t&&!t.nodeType&&t,a=i&&i.exports===o?r.Buffer:void 0,s=a?a.allocUnsafe:void 0;t.exports=function(t,e){if(e)return t.slice();var n=t.length,r=s?s(n):new t.constructor(n);return t.copy(r),r}},3345:t=>{t.exports=function(){return[]}},3349:(t,e,n)=>{var r=n(2199),o=n(6375),i=n(7241);t.exports=function(t){return r(t,i,o)}},3360:(t,e,n)=>{var r=n(3243);t.exports=function(t,e,n){"__proto__"==e&&r?r(t,e,{configurable:!0,enumerable:!0,value:n,writable:!0}):t[e]=n}},3375:(t,e,n)=>{var r=n(5765);t.exports=function(t){return t&&t.length?r(t):[]}},3387:(t,e,n)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.isSequenceProd=e.isBranchingProd=e.isOptionalProd=e.getProductionDslName=e.GAstVisitor=e.serializeProduction=e.serializeGrammar=e.Alternative=e.Alternation=e.RepetitionWithSeparator=e.RepetitionMandatoryWithSeparator=e.RepetitionMandatory=e.Repetition=e.Option=e.NonTerminal=e.Terminal=e.Rule=void 0;var r=n(8538);Object.defineProperty(e,"Rule",{enumerable:!0,get:function(){return r.Rule}}),Object.defineProperty(e,"Terminal",{enumerable:!0,get:function(){return r.Terminal}}),Object.defineProperty(e,"NonTerminal",{enumerable:!0,get:function(){return r.NonTerminal}}),Object.defineProperty(e,"Option",{enumerable:!0,get:function(){return r.Option}}),Object.defineProperty(e,"Repetition",{enumerable:!0,get:function(){return r.Repetition}}),Object.defineProperty(e,"RepetitionMandatory",{enumerable:!0,get:function(){return r.RepetitionMandatory}}),Object.defineProperty(e,"RepetitionMandatoryWithSeparator",{enumerable:!0,get:function(){return r.RepetitionMandatoryWithSeparator}}),Object.defineProperty(e,"RepetitionWithSeparator",{enumerable:!0,get:function(){return r.RepetitionWithSeparator}}),Object.defineProperty(e,"Alternation",{enumerable:!0,get:function(){return r.Alternation}}),Object.defineProperty(e,"Alternative",{enumerable:!0,get:function(){return r.Alternative}}),Object.defineProperty(e,"serializeGrammar",{enumerable:!0,get:function(){return r.serializeGrammar}}),Object.defineProperty(e,"serializeProduction",{enumerable:!0,get:function(){return r.serializeProduction}});var o=n(4105);Object.defineProperty(e,"GAstVisitor",{enumerable:!0,get:function(){return o.GAstVisitor}});var i=n(3598);Object.defineProperty(e,"getProductionDslName",{enumerable:!0,get:function(){return i.getProductionDslName}}),Object.defineProperty(e,"isOptionalProd",{enumerable:!0,get:function(){return i.isOptionalProd}}),Object.defineProperty(e,"isBranchingProd",{enumerable:!0,get:function(){return i.isBranchingProd}}),Object.defineProperty(e,"isSequenceProd",{enumerable:!0,get:function(){return i.isSequenceProd}})},3475:(t,e,n)=>{"use strict";n.r(e),n.d(e,{Calx:()=>el,DateUtil:()=>at});var r={};n.r(r),n.d(r,{ABS:()=>br,ACCRINT:()=>vu,ACCRINTM:()=>yu,ACOS:()=>Mr,ACOSH:()=>Cr,ACOT:()=>Lr,ACOTH:()=>Pr,ADD:()=>zo,AGGREGATE:()=>wr,AMORDEGRC:()=>Eu,AMORLINC:()=>Tu,AND:()=>yc,ARABIC:()=>Dr,ARGS2ARRAY:()=>Mc,ASC:()=>hi,ASIN:()=>kr,ASINH:()=>Ur,ATAN:()=>Fr,ATAN2:()=>jr,ATANH:()=>Vr,AVEDEV:()=>cn,AVERAGE:()=>ln,AVERAGEA:()=>fn,AVERAGEIF:()=>hn,AVERAGEIFS:()=>pn,BAHTTEXT:()=>pi,BASE:()=>Br,BESSELI:()=>$i,BESSELJ:()=>Zi,BESSELK:()=>Qi,BESSELY:()=>Ji,BETA:()=>dn,BETADIST:()=>Ha,BETAINV:()=>Xa,BIN2DEC:()=>ta,BIN2HEX:()=>ea,BIN2OCT:()=>na,BINOM:()=>mn,BINOMDIST:()=>$a,BITAND:()=>ra,BITLSHIFT:()=>oa,BITOR:()=>ia,BITRSHIFT:()=>aa,BITXOR:()=>sa,CEILING:()=>Gr,CEILINGMATH:()=>Za,CEILINGPRECISE:()=>Qa,CELL:()=>be,CHAR:()=>di,CHIDIST:()=>Ja,CHIDISTRT:()=>ts,CHIINV:()=>es,CHIINVRT:()=>ns,CHISQ:()=>gn,CHITEST:()=>rs,CHOOSE:()=>$e,CLEAN:()=>mi,CODE:()=>gi,COLUMN:()=>Ze,COLUMNS:()=>Qe,COMBIN:()=>Wr,COMBINA:()=>zr,COMPLEX:()=>ua,CONCAT:()=>yi,CONCATENATE:()=>vi,CONFIDENCE:()=>vn,CONVERT:()=>ca,CORREL:()=>yn,COS:()=>Yr,COSH:()=>qr,COT:()=>Kr,COTH:()=>Hr,COUNT:()=>En,COUNTA:()=>Tn,COUNTBLANK:()=>_n,COUNTIF:()=>Rn,COUNTIFS:()=>Nn,COUNTIN:()=>An,COUNTUNIQUE:()=>On,COUPDAYBS:()=>Au,COUPDAYS:()=>_u,COUPDAYSNC:()=>Ru,COUPNCD:()=>Nu,COUPNUM:()=>Ou,COUPPCD:()=>Iu,COVAR:()=>os,COVARIANCE:()=>In,COVARIANCEP:()=>is,COVARIANCES:()=>as,CRITBINOM:()=>ss,CSC:()=>Xr,CSCH:()=>$r,CUMIPMT:()=>Su,CUMPRINC:()=>xu,DATE:()=>Yt,DATEDIF:()=>qt,DATEVALUE:()=>Kt,DAVERAGE:()=>ru,DAY:()=>Ht,DAYS:()=>$t,DAYS360:()=>Zt,DB:()=>bu,DBCS:()=>Ei,DCOUNT:()=>ou,DCOUNTA:()=>iu,DDB:()=>Mu,DEC2BIN:()=>la,DEC2HEX:()=>fa,DEC2OCT:()=>ha,DECIMAL:()=>Zr,DEGREES:()=>Qr,DELTA:()=>pa,DEVSQ:()=>Sn,DGET:()=>au,DISC:()=>Cu,DIVIDE:()=>qo,DMAX:()=>su,DMIN:()=>uu,DOLLAR:()=>Ti,DOLLARDE:()=>Lu,DOLLARFR:()=>Pu,DPRODUCT:()=>cu,DSTDEV:()=>lu,DSTDEVP:()=>fu,DSUM:()=>hu,DURATION:()=>wu,DVAR:()=>pu,DVARP:()=>du,E:()=>_o,EDATE:()=>Qt,EFFECT:()=>Du,EOMONTH:()=>Jt,EQ:()=>Qo,ERF:()=>da,ERFC:()=>ma,ERFCPRECISE:()=>us,ERFPRECISE:()=>cs,ERROR:()=>Me,EVEN:()=>Jr,EXACT:()=>Ai,EXP:()=>to,EXPON:()=>xn,EXPONDIST:()=>ls,F:()=>bn,FACT:()=>no,FACTDOUBLE:()=>ro,FALSE:()=>Ec,FDIST:()=>fs,FDISTRT:()=>hs,FIND:()=>_i,FINDFIELD:()=>eu,FINV:()=>ps,FINVRT:()=>ds,FISHER:()=>Mn,FISHERINV:()=>Cn,FIXED:()=>Ri,FLATTEN:()=>bc,FLOOR:()=>oo,FLOORMATH:()=>ms,FLOORPRECISE:()=>gs,FORECAST:()=>Ln,FREQUENCY:()=>Pn,FTEST:()=>vs,FV:()=>ku,FVSCHEDULE:()=>Uu,GAMMA:()=>wn,GAMMADIST:()=>ys,GAMMAINV:()=>Es,GAMMALN:()=>Dn,GAMMALNPRECISE:()=>Ts,GAUSS:()=>kn,GCD:()=>io,GEOMEAN:()=>Un,GESTEP:()=>ga,GROWTH:()=>Fn,GT:()=>Ho,GTE:()=>Xo,HARMEAN:()=>jn,HEX2BIN:()=>va,HEX2DEC:()=>ya,HEX2OCT:()=>Ea,HLOOKUP:()=>Je,HOUR:()=>te,HTML2TEXT:()=>Ni,HYPGEOM:()=>Vn,HYPGEOMDIST:()=>As,IF:()=>Tc,IFERROR:()=>_c,IFNA:()=>Rc,IFS:()=>Ac,IMABS:()=>Ta,IMAGINARY:()=>Aa,IMARGUMENT:()=>_a,IMCONJUGATE:()=>Ra,IMCOS:()=>Na,IMCOSH:()=>Oa,IMCOT:()=>Ia,IMCSC:()=>Va,IMCSCH:()=>Ba,IMDIV:()=>Sa,IMEXP:()=>xa,IMLN:()=>ba,IMLOG10:()=>Ma,IMLOG2:()=>Ca,IMPOWER:()=>La,IMPRODUCT:()=>Pa,IMREAL:()=>wa,IMSEC:()=>Da,IMSECH:()=>ka,IMSIN:()=>Ua,IMSINH:()=>Fa,IMSQRT:()=>ja,IMSUB:()=>Ga,IMSUM:()=>Wa,IMTAN:()=>za,INDEX:()=>tn,INFO:()=>Ce,INT:()=>ao,INTERCEPT:()=>Bn,INTERVAL:()=>ee,INTRATE:()=>Fu,IPMT:()=>ju,IRR:()=>Vu,ISBINARY:()=>Pe,ISBLANK:()=>Le,ISERR:()=>we,ISERROR:()=>De,ISEVEN:()=>ke,ISFORMULA:()=>Ue,ISLOGICAL:()=>Fe,ISNA:()=>je,ISNONTEXT:()=>Ve,ISNUMBER:()=>Be,ISO:()=>so,ISODD:()=>Ge,ISOWEEKNUM:()=>ne,ISPMT:()=>Bu,ISREF:()=>We,ISTEXT:()=>ze,JOIN:()=>Lc,KURT:()=>Gn,LARGE:()=>Wn,LCM:()=>uo,LEFT:()=>Oi,LEN:()=>Ii,LINEST:()=>zn,LN:()=>co,LN10:()=>lo,LN2:()=>fo,LOG:()=>mo,LOG10:()=>go,LOG10E:()=>ho,LOG2E:()=>po,LOGEST:()=>Yn,LOGINV:()=>_s,LOGNORM:()=>qn,LOGNORMDIST:()=>Rs,LOGNORMINV:()=>Ns,LOOKUP:()=>en,LOWER:()=>Si,LT:()=>$o,LTE:()=>Zo,MATCH:()=>nn,MAX:()=>Kn,MAXA:()=>Hn,MDURATION:()=>Gu,MEDIAN:()=>Xn,MID:()=>xi,MIN:()=>$n,MINA:()=>Zn,MINUS:()=>Yo,MINUTE:()=>re,MIRR:()=>Wu,MOD:()=>vo,MODE:()=>Qn,MODEMULT:()=>Os,MODESNGL:()=>Is,MONTH:()=>oe,MROUND:()=>yo,MULTINOMIAL:()=>Eo,MULTIPLY:()=>Ko,N:()=>Ye,NA:()=>qe,NE:()=>Jo,NEGBINOM:()=>Jn,NEGBINOMDIST:()=>Ss,NETWORKDAYS:()=>ie,NETWORKDAYSINTL:()=>xs,NOMINAL:()=>zu,NORM:()=>tr,NORMDIST:()=>bs,NORMINV:()=>Ms,NORMSDIST:()=>Cs,NORMSINV:()=>Ls,NOT:()=>Nc,NOW:()=>ae,NPER:()=>Yu,NPV:()=>qu,NUMBERS:()=>Pc,NUMBERVALUE:()=>bi,OCT2BIN:()=>Ya,OCT2DEC:()=>qa,OCT2HEX:()=>Ka,ODD:()=>To,ODDFPRICE:()=>Ku,ODDFYIELD:()=>Hu,ODDLPRICE:()=>Xu,ODDLYIELD:()=>$u,OR:()=>Oc,PDURATION:()=>Zu,PEARSON:()=>er,PERCENTILE:()=>nr,PERCENTILEEXC:()=>Ps,PERCENTILEINC:()=>ws,PERCENTRANK:()=>rr,PERCENTRANKEXC:()=>Ds,PERCENTRANKINC:()=>ks,PERMUT:()=>or,PERMUTATIONA:()=>ir,PHI:()=>ar,PI:()=>Ao,PMT:()=>Qu,POISSON:()=>sr,POISSONDIST:()=>Us,POW:()=>ti,POWER:()=>Ro,PPMT:()=>Ju,PRICE:()=>tc,PRICEDISC:()=>ec,PRICEMAT:()=>nc,PROB:()=>ur,PRODUCT:()=>No,PRONETIC:()=>Mi,PROPER:()=>Ci,PV:()=>rc,QUARTILE:()=>cr,QUARTILEEXC:()=>Fs,QUARTILEINC:()=>js,QUOTIENT:()=>Oo,RADIANS:()=>Io,RAND:()=>So,RANDBETWEEN:()=>xo,RANK:()=>lr,RANKAVG:()=>Vs,RANKEQ:()=>Bs,RATE:()=>oc,RECEIVED:()=>ic,REFERENCE:()=>Cc,REGEXEXTRACT:()=>Li,REGEXMATCH:()=>Pi,REGEXREPLACE:()=>wi,REPLACE:()=>Di,REPT:()=>ki,RIGHT:()=>Ui,ROMAN:()=>bo,ROUND:()=>Mo,ROUNDDOWN:()=>Co,ROUNDUP:()=>Lo,ROW:()=>fr,ROWS:()=>rn,RRI:()=>ac,RSQ:()=>hr,SEARCH:()=>Fi,SEC:()=>Po,SECH:()=>wo,SECOND:()=>se,SERIESSUM:()=>Do,SHEET:()=>Ke,SHEETS:()=>He,SIGN:()=>ko,SIN:()=>Uo,SINH:()=>Fo,SKEW:()=>pr,SKEWP:()=>Gs,SLN:()=>sc,SLOPE:()=>dr,SMALL:()=>mr,SPLIT:()=>ji,SQRT:()=>jo,SQRT1_2:()=>Bo,SQRT2:()=>Go,SQRTPI:()=>Vo,STANDARDIZE:()=>gr,STDEV:()=>vr,STDEVA:()=>yr,STDEVP:()=>Ws,STDEVPA:()=>Er,STDEVS:()=>zs,STEYX:()=>Tr,SUBSTITUTE:()=>Vi,SUBTOTAL:()=>Wo,SUM:()=>ei,SUMIF:()=>ni,SUMIFS:()=>ri,SUMPRODUCT:()=>oi,SUMSQ:()=>ii,SUMX2MY2:()=>ai,SUMX2PY2:()=>si,SUMXMY2:()=>ui,SWITCH:()=>xc,SYD:()=>uc,T:()=>Bi,TAN:()=>ci,TANH:()=>li,TBILLEQ:()=>cc,TBILLPRICE:()=>lc,TBILLYIELD:()=>fc,TDIST:()=>Ys,TDISTRT:()=>qs,TEXT:()=>Gi,TEXTJOIN:()=>Wi,TIME:()=>ue,TIMEVALUE:()=>ce,TINV:()=>Ks,TODAY:()=>le,TRANSPOSE:()=>on,TREND:()=>_r,TRIM:()=>zi,TRIMMEAN:()=>Rr,TRUE:()=>Ic,TRUNC:()=>fi,TTEST:()=>Hs,TYPE:()=>Xe,UNICHAR:()=>Yi,UNICODE:()=>qi,UNIQUE:()=>an,UPPER:()=>Ki,VALUE:()=>Hi,VAR:()=>Nr,VARA:()=>Or,VARP:()=>Xs,VARPA:()=>Ir,VARS:()=>$s,VDB:()=>hc,VLOOKUP:()=>sn,WEEKDAY:()=>fe,WEEKNUM:()=>he,WEIBULL:()=>Sr,WEIBULLDIST:()=>Zs,WORKDAY:()=>pe,WORKDAYINTL:()=>Qs,XIRR:()=>pc,XNPV:()=>dc,XOR:()=>Sc,YEAR:()=>de,YEARFRAC:()=>ve,YIELD:()=>mc,YIELDDISC:()=>gc,YIELDMAT:()=>vc,Z:()=>xr,ZTEST:()=>Js});var o={};n.r(o),n.d(o,{arrayMerge:()=>Yc,getCellsInRange:()=>Fc,initial:()=>Wc,isValidBinary:()=>jc,numToStr:()=>kc,objectToArray:()=>Kc,rangeToTable:()=>Xc,repeat:()=>Bc,rest:()=>zc,strRepeat:()=>Vc,strToNum:()=>Uc,toArray:()=>qc,transposeTable:()=>$c,trimEmptyCell:()=>Hc,unique:()=>Gc});var i=n(1419);i.ak,i.EF;const a=i.cA,s=(i.mT,i.LT,i.DN,i.jr,i.C_,i.T6,i.JG),u=(i._J,i.Vv,i.X2,i.wL,i.xd,i.c$,i.iX,i.D2,i.Y2,i.$P,i.Cy,i.Pp,i.jO,i.BK,i.xv,i.IL,i.jT,i.Ey),c=(i.fx,i.PW,i.my,i.Ro,i.jk,i.lC,i._3,i.Ug,i.Sk,i.G,i.vb,u({name:"Plus",pattern:/\+/})),l=u({name:"Minus",pattern:/-/}),f=u({name:"Mult",pattern:/\*/}),h=u({name:"Div",pattern:/\//}),p=u({name:"LParen",pattern:/\(/}),d=u({name:"RParen",pattern:/\)/}),m=u({name:"Comma",pattern:/,/}),g=u({name:"RowRange",pattern:/\$?\d+:\$?\d+/}),v=u({name:"NumberLiteral",pattern:/\d+(\.\d+)?/,longer_alt:g}),y=u({name:"Variable",pattern:/[A-Za-z_][A-Za-z0-9_]*/}),E=u({name:"SheetName",pattern:/[A-Za-z_][A-Za-z0-9_-]*!/}),T=u({name:"CellRange",pattern:/\$?[A-Za-z]+\$?\d+:\$?[A-Za-z]+\$?\d+/}),A=u({name:"CellRef",pattern:/\$?[A-Za-z]+\$?\d+/}),_=u({name:"StringLiteral",pattern:/(["'])(?:(?!\1).)*\1/}),R=u({name:"Concat",pattern:/&/}),N=u({name:"FunctionName",pattern:/[A-Za-z]+(?=\()/i,longer_alt:A}),O=u({name:"WhiteSpace",pattern:/\s+/,group:s.SKIPPED}),I=u({name:"GreaterThan",pattern:/>/}),S=u({name:"LessThan",pattern:/=/}),b=u({name:"LessThanEqual",pattern:/<=/}),M=u({name:"Equal",pattern:/=/}),C=u({name:"NotEqual",pattern:/<>/}),L=u({name:"IfFunction",pattern:/IF(?=\()/i,longer_alt:y}),P=u({name:"TrueKeyword",pattern:/TRUE/i,longer_alt:y}),w=u({name:"FalseKeyword",pattern:/FALSE/i,longer_alt:y}),D=u({name:"NullKeyword",pattern:/NULL/i,longer_alt:y}),k=u({name:"ArrayRowSep",pattern:/;/}),U=u({name:"RangeIntersect",pattern:/ +/}),F=u({name:"ErrorConstant",pattern:/#(DIV\/0!|N\/A|NAME\?|NULL!|NUM!|REF!|VALUE!|#SPILL!)/}),j=u({name:"IfErrorFunction",pattern:/IFERROR(?=\()/i,longer_alt:y}),V=u({name:"IfsFunction",pattern:/IFS(?=\()/i,longer_alt:y}),B=u({name:"SwitchFunction",pattern:/SWITCH(?=\()/i,longer_alt:y}),G=u({name:"LCurly",pattern:/{/}),W=u({name:"RCurly",pattern:/}/}),z=u({name:"ColumnRange",pattern:/\$?[A-Za-z]+:\$?[A-Za-z]+/}),Y=u({name:"Power",pattern:/\*\*|\^/}),q=[O,x,b,C,I,S,M,c,l,R,Y,f,h,p,d,G,W,m,k,E,z,g,T,A,U,v,_,F,L,j,V,B,P,w,D,N,y],K={Plus:c,Minus:l,Mult:f,Div:h,LParen:p,RParen:d,Comma:m,RowRange:g,NumberLiteral:v,Variable:y,SheetName:E,CellRange:T,CellRef:A,StringLiteral:_,Concat:R,FunctionName:N,WhiteSpace:O,GreaterThan:I,LessThan:S,GreaterThanEqual:x,LessThanEqual:b,Equal:M,NotEqual:C,IfFunction:L,TrueKeyword:P,FalseKeyword:w,NullKeyword:D,ArrayRowSep:k,RangeIntersect:U,ErrorConstant:F,IfErrorFunction:j,IfsFunction:V,SwitchFunction:B,LCurly:G,RCurly:W,ColumnRange:z,Power:Y},H=new s(q);class X extends a{constructor(){super(q),this.cache={comparisonExpression:!1,atomicExpression:!1};const t=this;t.RULE("expression",()=>{t.OR([{ALT:()=>t.SUBRULE(t.arrayFormula)},{ALT:()=>t.SUBRULE(t.comparisonExpression)}])}),t.RULE("arrayFormula",()=>{t.CONSUME(K.LCurly),t.OPTION(()=>{t.CONSUME(K.Equal)}),t.SUBRULE(t.expression),t.MANY(()=>{t.OR([{ALT:()=>t.CONSUME(K.Comma)},{ALT:()=>t.CONSUME(K.ArrayRowSep)}]),t.SUBRULE2(t.expression)}),t.CONSUME(K.RCurly)}),t.RULE("comparisonExpression",()=>{t.SUBRULE(t.additionExpression,{LABEL:"lhs"}),t.OPTION(()=>{t.cache.comparisonExpression||t.OR([{ALT:()=>t.CONSUME(K.GreaterThan)},{ALT:()=>t.CONSUME(K.LessThan)},{ALT:()=>t.CONSUME(K.GreaterThanEqual)},{ALT:()=>t.CONSUME(K.LessThanEqual)},{ALT:()=>t.CONSUME(K.Equal)},{ALT:()=>t.CONSUME(K.NotEqual)}]),t.SUBRULE2(t.additionExpression,{LABEL:"rhs"})})}),t.RULE("additionExpression",()=>{t.SUBRULE(t.concatenationExpression,{LABEL:"lhs"}),t.MANY(()=>{t.OR([{ALT:()=>t.CONSUME(K.Plus)},{ALT:()=>t.CONSUME(K.Minus)}]),t.SUBRULE2(t.concatenationExpression,{LABEL:"rhs"})})}),t.RULE("concatenationExpression",()=>{t.SUBRULE(t.multiplicationExpression,{LABEL:"lhs"}),t.MANY(()=>{t.CONSUME(K.Concat),t.SUBRULE2(t.multiplicationExpression,{LABEL:"rhs"})})}),t.RULE("multiplicationExpression",()=>{t.SUBRULE(t.exponentiationExpression,{LABEL:"lhs"}),t.MANY(()=>{t.OR([{ALT:()=>t.CONSUME(K.Mult)},{ALT:()=>t.CONSUME(K.Div)}]),t.SUBRULE2(t.exponentiationExpression,{LABEL:"rhs"})})}),t.RULE("exponentiationExpression",()=>{t.SUBRULE(t.unaryExpression,{LABEL:"lhs"}),t.MANY(()=>{t.CONSUME(K.Power),t.SUBRULE2(t.unaryExpression,{LABEL:"rhs"})})}),t.RULE("unaryExpression",()=>{t.OR([{ALT:()=>{t.CONSUME(K.Minus),t.SUBRULE(t.unaryExpression)}},{ALT:()=>t.SUBRULE(t.atomicExpression)}])}),t.RULE("atomicExpression",()=>{t.cache.atomicExpression||t.OR([{ALT:()=>t.CONSUME(K.NumberLiteral)},{ALT:()=>t.CONSUME(K.StringLiteral)},{ALT:()=>t.CONSUME(K.TrueKeyword)},{ALT:()=>t.CONSUME(K.FalseKeyword)},{ALT:()=>t.CONSUME(K.NullKeyword)},{ALT:()=>{t.OPTION(()=>{t.CONSUME(K.SheetName)}),t.OR1([{ALT:()=>t.CONSUME(K.Variable)},{ALT:()=>t.CONSUME(K.CellRef)},{ALT:()=>t.CONSUME(K.CellRange)},{ALT:()=>t.CONSUME(K.RowRange)},{ALT:()=>t.CONSUME(K.ColumnRange)}])}},{ALT:()=>t.SUBRULE(t.ifFunctionCall)},{ALT:()=>t.SUBRULE(t.functionCall)},{ALT:()=>t.CONSUME(K.ErrorConstant)},{ALT:()=>t.SUBRULE(t.ifErrorFunctionCall)},{ALT:()=>t.SUBRULE(t.ifsFunctionCall)},{ALT:()=>t.SUBRULE(t.switchFunctionCall)},{ALT:()=>{t.CONSUME(K.LParen),t.SUBRULE(t.expression),t.CONSUME(K.RParen)}}])}),t.RULE("ifFunctionCall",()=>{t.CONSUME(K.IfFunction),t.CONSUME(K.LParen),t.SUBRULE(t.expression,{LABEL:"condition"}),t.CONSUME1(K.Comma),t.SUBRULE2(t.expression,{LABEL:"whenTrue"}),t.OPTION(()=>{t.CONSUME2(K.Comma),t.SUBRULE3(t.expression,{LABEL:"whenFalse"})}),t.CONSUME(K.RParen)}),t.RULE("ifErrorFunctionCall",()=>{t.CONSUME(K.IfErrorFunction),t.CONSUME(K.LParen),t.SUBRULE(t.expression,{LABEL:"value"}),t.CONSUME1(K.Comma),t.SUBRULE2(t.expression,{LABEL:"valueIfError"}),t.CONSUME(K.RParen)}),t.RULE("ifsFunctionCall",()=>{t.CONSUME(K.IfsFunction),t.CONSUME(K.LParen),t.AT_LEAST_ONE(()=>{t.SUBRULE(t.expression,{LABEL:"condition"}),t.CONSUME1(K.Comma),t.SUBRULE2(t.expression,{LABEL:"value"}),t.OPTION(()=>t.CONSUME2(K.Comma))}),t.CONSUME(K.RParen)}),t.RULE("switchFunctionCall",()=>{t.CONSUME(K.SwitchFunction),t.CONSUME(K.LParen),t.SUBRULE(t.expression,{LABEL:"expression"}),t.CONSUME1(K.Comma),t.AT_LEAST_ONE(()=>{t.SUBRULE2(t.expression,{LABEL:"value"}),t.CONSUME2(K.Comma),t.SUBRULE3(t.expression,{LABEL:"result"}),t.OPTION(()=>t.CONSUME3(K.Comma))}),t.OPTION2(()=>{t.SUBRULE4(t.expression,{LABEL:"default"})}),t.CONSUME(K.RParen)}),t.RULE("functionCall",()=>{t.CONSUME(K.FunctionName),t.CONSUME(K.LParen),t.OPTION(()=>{t.SUBRULE(t.expression),t.MANY(()=>{t.CONSUME(K.Comma),t.SUBRULE2(t.expression)})}),t.CONSUME(K.RParen)}),t.RULE("arrayExpression",()=>{t.CONSUME(K.LParen),t.SUBRULE(t.arrayRow),t.MANY(()=>{t.CONSUME(K.ArrayRowSep),t.SUBRULE2(t.arrayRow)}),t.CONSUME(K.RParen)}),t.RULE("arrayRow",()=>{t.SUBRULE(t.expression),t.MANY(()=>{t.CONSUME(K.Comma),t.SUBRULE2(t.expression)})}),this.performSelfAnalysis()}parse(t){console.log("Parsing input:",t);const e=H.tokenize(t);if(console.log("Lexer result:",e.tokens),e.errors.length>0)throw console.error(e.errors),new Error("Lexer errors detected");this.input=e.tokens;const n=this.expression();if(this.errors.length>0)throw console.error(this.errors),new Error("Parsing errors detected");return n}}var $;!function(t){t.DIV_BY_ZERO="#DIV/0!",t.INVALID_NAME="#NAME?",t.INVALID_REF="#REF!",t.INVALID_VAL="#VALUE!",t.INVALID_NUM="#NUM!",t.NA="#N/A!",t.NULL="#NULL!",t.SPILL="#SPILL!",t.ERROR="#ERROR!"}($||($={}));class Z{constructor(t,e,n){this.values=t,this.rows=e,this.cols=n}getValue(t,e){if(t>=0&&t=0&&e[t]),t.length,1)}static fromHorizontalArray(t){return new Z([t],1,t.length)}static from2DArray(t){const e=t.length,n=e>0?Math.max(...t.map(t=>t.length)):0,r=t.map(t=>{const e=[...t];for(;e.length0?this.visit(t.arrayFormula[0]):this.visit(t.comparisonExpression[0])}arrayFormula(t){if(t.ArrayRowSep&&t.ArrayRowSep.length>0){const e=[];t.Comma&&t.Comma.forEach(t=>{e.push({offset:t.startOffset,type:"comma"})}),t.ArrayRowSep&&t.ArrayRowSep.forEach(t=>{e.push({offset:t.startOffset,type:"semicolon"})}),e.sort((t,e)=>t.offset-e.offset);const n=[];let r=[];for(let o=0;o0&&n.push(r),Z.from2DArray(n)}const e=t.expression.map(t=>this.visit(t));if(1===e.length){const t=e[0];return t instanceof Z?t:Array.isArray(t)?Z.fromHorizontalArray(t):Z.fromSingleValue(t)}return Z.fromHorizontalArray(e)}comparisonExpression(t){const e=this.visit(t.lhs[0]);if(!t.rhs||0===t.rhs.length)return e;const n=this.visit(t.rhs[0]);return t.GreaterThan?e>n:t.LessThan?e=n:t.LessThanEqual?e<=n:t.Equal?e===n:t.NotEqual?e!==n:e}additionExpression(t){let e=this.visit(t.lhs[0]);if(t.rhs&&t.rhs.length>0){const n=[];t.Plus&&t.Plus.forEach(t=>{n.push({type:"plus",offset:t.startOffset})}),t.Minus&&t.Minus.forEach(t=>{n.push({type:"minus",offset:t.startOffset})}),n.sort((t,e)=>t.offset-e.offset);for(let r=0;rt+e):"minus"===i.type&&(e=this.arrayOperation(e,o,(t,e)=>t-e))}}return e}arrayOperation(t,e,n){if(this.isError(t))return t;if(this.isError(e))return e;if(!Array.isArray(t)&&!Array.isArray(e))return n(t,e);const r=Array.isArray(t)?t:[t],o=Array.isArray(e)?e:[e],i=Math.max(r.length,o.length),a=[];for(let t=0;t0)for(let n=0;n0){const n=[];t.Mult&&t.Mult.forEach(t=>{n.push({type:"mult",offset:t.startOffset})}),t.Div&&t.Div.forEach(t=>{n.push({type:"div",offset:t.startOffset})}),n.sort((t,e)=>t.offset-e.offset);for(let r=0;rt*e):"div"===i.type&&(e=this.arrayOperation(e,o,(t,e)=>0===e?"#DIV/0!":t/e))}}return e}exponentiationExpression(t){let e=this.visit(t.lhs[0]);if(t.rhs&&t.rhs.length>0)for(let n=0;nMath.pow(t,e))}return e}unaryExpression(t){return t.Minus?-this.visit(t.unaryExpression[0]):this.visit(t.atomicExpression[0])}atomicExpression(t){if(t.NumberLiteral)return Number(t.NumberLiteral[0].image);if(t.StringLiteral){const e=t.StringLiteral[0].image;return e.substring(1,e.length-1)}if(t.TrueKeyword)return!0;if(t.FalseKeyword)return!1;if(t.NullKeyword)return null;if(t.ErrorConstant)return t.ErrorConstant[0].image;if(t.Variable||t.CellRef||t.CellRange||t.RowRange||t.ColumnRange){let e,n="";if(t.SheetName&&t.SheetName.length>0&&(n=t.SheetName[0].image,n=n.substring(0,n.length-1)),t.Variable&&t.Variable.length>0)return e=t.Variable[0].image,this.resolveVariable(e,n);if(t.CellRef&&t.CellRef.length>0)return e=t.CellRef[0].image,this.resolveCellReference(e,n);if(t.CellRange&&t.CellRange.length>0)return e=t.CellRange[0].image,this.resolveCellRange(e,n);if(t.RowRange&&t.RowRange.length>0)return e=t.RowRange[0].image,this.resolveRowRange(e,n);if(t.ColumnRange&&t.ColumnRange.length>0)return e=t.ColumnRange[0].image,this.resolveColumnRange(e,n)}return t.ifFunctionCall?this.visit(t.ifFunctionCall[0]):t.functionCall?this.visit(t.functionCall[0]):t.ifErrorFunctionCall?this.visit(t.ifErrorFunctionCall[0]):t.ifsFunctionCall?this.visit(t.ifsFunctionCall[0]):t.switchFunctionCall?this.visit(t.switchFunctionCall[0]):t.LParen?this.visit(t.expression[0]):(console.warn("Unhandled atomic expression:",t),null)}ifFunctionCall(t){const e=this.visit(t.condition[0]);return this.isTruthy(e)?this.visit(t.whenTrue[0]):!!(t.whenFalse&&t.whenFalse.length>0)&&this.visit(t.whenFalse[0])}functionCall(t){const e=t.FunctionName[0].image.toUpperCase(),n=[];if(t.expression)for(const e of t.expression)n.push(this.visit(e));if(this.context&&"function"==typeof this.context.callFunction)try{let t=this.context.callFunction(e,n);if(t instanceof Date){const e=new Date(1899,11,30).getTime(),n=864e5;t=Math.floor((t.getTime()-e)/n)}return t}catch(t){console.warn(`Function ${e} not found in callFunction, trying getFunction`)}if(this.context&&"function"==typeof this.context.getFunction){const t=this.context.getFunction(e);if("function"==typeof t)try{let e=t(...n);if(e instanceof Date){const t=new Date(1899,11,30).getTime(),n=864e5;e=Math.floor((e.getTime()-t)/n)}return e}catch(t){return console.error(`Error executing function ${e}:`,t),"#ERROR!"}}return this.executeBuiltInFunction(e,n)}ifErrorFunctionCall(t){try{const e=this.visit(t.value[0]);return this.isErrorValue(e)?this.visit(t.valueIfError[0]):e}catch(e){return this.visit(t.valueIfError[0])}}ifsFunctionCall(t){const e=t.condition,n=t.value;for(let t=0;t0?this.visit(t.default[0]):"#N/A"}arrayExpression(t){const e=[];if(e.push(this.visit(t.arrayRow[0])),t.arrayRow.length>1)for(let n=1;n1)for(let n=1;nArray.isArray(e)?t+this.flattenAndSum(e):isNaN(e)?t:t+Number(e),0);case"AVERAGE":let t=0;return e.forEach(e=>{if(Array.isArray(e)){const r=this.flattenArray(e);t+=r.reduce((t,e)=>t+(isNaN(e)?0:Number(e)),0),n+=r.filter(t=>!isNaN(t)).length}else isNaN(e)||(t+=Number(e),n++)}),n>0?t/n:"#DIV/0!";case"MAX":let r=-1/0;return e.forEach(t=>{if(Array.isArray(t)){const e=this.flattenArray(t),n=Math.max(...e.filter(t=>!isNaN(t)).map(Number));n>r&&(r=n)}else!isNaN(t)&&Number(t)>r&&(r=Number(t))}),r===-1/0?0:r;case"MIN":let o=1/0;return e.forEach(t=>{if(Array.isArray(t)){const e=this.flattenArray(t),n=Math.min(...e.filter(t=>!isNaN(t)).map(Number));n{if(Array.isArray(t)){const e=this.flattenArray(t);n+=e.filter(t=>!isNaN(t)).length}else isNaN(t)||n++}),n;case"CONCATENATE":return e.reduce((t,e)=>t+String(e),"");case"AND":return e.every(t=>this.isTruthy(t));case"OR":return e.some(t=>this.isTruthy(t));default:return"#NAME?"}}flattenAndSum(t){return Array.isArray(t)?t.reduce((t,e)=>Array.isArray(e)?t+this.flattenAndSum(e):t+(isNaN(e)?0:Number(e)),0):isNaN(t)?0:Number(t)}flattenArray(t){return t.reduce((t,e)=>Array.isArray(e)?t.concat(this.flattenArray(e)):t.concat(e),[])}parseInput(t){const e=t.startsWith("=")?t.substring(1):t,n=H.tokenize(e);Q.input=n.tokens;const r=Q.expression();if(Q.errors.length>0)throw console.error("Parser errors:",JSON.stringify(Q.errors,null,2)),Error("Parsing errors detected");return this.visit(r)}parseCst(t){return this.visit(t)}parse(t){try{return this.parseInput(t)}catch(e){return console.error("Parsing error for input:",t),console.error("Error details:",e),e instanceof Error&&console.error("Stack trace:",e.stack),$.ERROR}}}class tt{constructor(t,e){this.sheet=t,this._cells=[],this._address=e,this.parseAddress(e),this.loadCells()}parseAddress(t){const e=t=>t.replace(/\$/g,"");if(t.includes(":")){const[n,r]=t.split(":");this._startAddress=e(n.trim()),this._endAddress=e(r.trim())}else this._startAddress=e(t.trim()),this._endAddress=e(t.trim())}loadCells(){if(this.isSingleCell()){const t=this.sheet.getCellDirect(this._startAddress);this._cells=[t]}else this._cells=this.expandRange()}expandRange(){var t,e,n,r;const o=[],i=(null===(t=this._startAddress.match(/[A-Z]+/))||void 0===t?void 0:t[0])||"A",a=parseInt((null===(e=this._startAddress.match(/\d+/))||void 0===e?void 0:e[0])||"1"),s=(null===(n=this._endAddress.match(/[A-Z]+/))||void 0===n?void 0:n[0])||"A",u=parseInt((null===(r=this._endAddress.match(/\d+/))||void 0===r?void 0:r[0])||"1"),c=this.colToNum(i),l=this.colToNum(s),f=Math.min(a,u),h=Math.max(a,u),p=Math.min(c,l),d=Math.max(c,l);for(let t=f;t<=h;t++)for(let e=p;e<=d;e++){const n=this.numToCol(e)+t;o.push(this.sheet.getCellDirect(n))}return o}isSingleCell(){return this._startAddress===this._endAddress}get address(){return this._address}get cells(){return this._cells}get cell(){return this._cells[0]}get value(){var t,e;return this.isSingleCell()?null!==(e=null===(t=this._cells[0])||void 0===t?void 0:t.value)&&void 0!==e?e:null:this.getValues()}set value(t){this.isSingleCell()?this._cells[0].value=t:Array.isArray(t)?this.setValuesFromArray(t):this._cells.forEach(e=>e.value=t)}get formula(){return this.isSingleCell()?this._cells[0].formula:null}set formula(t){this.isSingleCell()?this._cells[0].formula=t:this._cells.forEach(e=>e.formula=t)}getValues(){var t,e,n,r;const o=(null===(t=this._startAddress.match(/[A-Z]+/))||void 0===t?void 0:t[0])||"A",i=parseInt((null===(e=this._startAddress.match(/\d+/))||void 0===e?void 0:e[0])||"1"),a=(null===(n=this._endAddress.match(/[A-Z]+/))||void 0===n?void 0:n[0])||"A",s=parseInt((null===(r=this._endAddress.match(/\d+/))||void 0===r?void 0:r[0])||"1"),u=this.colToNum(o),c=this.colToNum(a),l=[];let f=0;for(let t=i;t<=s;t++){const t=[];for(let e=u;e<=c;e++)t.push(this._cells[f++].value);l.push(t)}return l}setValues(t){let e=0;for(let n=0;nt.value)}calculate(){this._cells.forEach(t=>{t.formula&&t.calculate()})}get count(){return this._cells.length}get rows(){var t,e;const n=parseInt((null===(t=this._startAddress.match(/\d+/))||void 0===t?void 0:t[0])||"1");return parseInt((null===(e=this._endAddress.match(/\d+/))||void 0===e?void 0:e[0])||"1")-n+1}get columns(){var t,e;const n=(null===(t=this._startAddress.match(/[A-Z]+/))||void 0===t?void 0:t[0])||"A",r=(null===(e=this._endAddress.match(/[A-Z]+/))||void 0===e?void 0:e[0])||"A";return this.colToNum(r)-this.colToNum(n)+1}each(t){this._cells.forEach((e,n)=>t(e,n))}map(t){return this._cells.map((e,n)=>t(e,n))}filter(t){return this._cells.filter((e,n)=>t(e,n))}find(t){return this._cells.find((e,n)=>t(e,n))}getCellAt(t){return this._cells[t]}getCellAtPosition(t,e){const n=t*this.columns+e;return this._cells[n]}colToNum(t){let e=0;for(let n=0;n0;){const n=(t-1)%26;e=String.fromCharCode(65+n)+e,t=Math.floor((t-1)/26)}return e}getRange(t){return new tt(this.sheet,t)}clear(){this._cells.forEach(t=>{t.value=null,t.formula=""})}toString(){return this.isSingleCell()?`Range(${this._address})`:`Range(${this._address}) [${this.rows}x${this.columns}]`}}var et,nt,rt=n(5592);!function(t){t.CALCULATION_STARTED="calculation.started",t.CALCULATION_PAUSED="calculation.paused",t.CALCULATION_RESUMED="calculation.resumed",t.CALCULATION_FINISHED="calculation.finished",t.CELL_ADDED="cell.added",t.CELL_REMOVED="cell.removed",t.CELL_CREATED="CELL_CREATED",t.ELEMENT_ATTACHED="element.attached",t.ELEMENT_DETACHED="element.detached"}(et||(et={})),function(t){t.CALCULATION_STARTED="calculation.started",t.CALCULATION_PAUSED="calculation.paused",t.CALCULATION_RESUMED="calculation.resumed",t.CALCULATION_FINISHED="calculation.finished",t.CALCULATION_IDLE="calculation.idle"}(nt||(nt={}));var ot,it=n(1887);!function(t){t.TEXT="text",t.NUMBER="number",t.DATE="date",t.TIME="time",t.DATETIME="datetime",t.BOOLEAN="boolean",t.ERROR="error"}(ot||(ot={}));class at{static serialToDate(t){if("number"!=typeof t||isNaN(t))throw new Error("Invalid serial date: must be a number");const e=new Date(1899,11,30,0,0,0,0),n=t*at.MS_PER_DAY;return new Date(e.getTime()+n)}static dateToSerial(t){if(!(t instanceof Date)||isNaN(t.getTime()))throw new Error("Invalid date: must be a valid Date object");const e=new Date(1899,11,30,0,0,0,0),n=t.getTime()-e.getTime();return Math.floor(n/at.MS_PER_DAY)}static isValidSerialDate(t){return"number"==typeof t&&!isNaN(t)&&t>=-36522&&t<=2958465}static fromComponents(t,e,n){const r=new Date(t,e-1,n);return at.dateToSerial(r)}static toComponents(t){const e=at.serialToDate(t);return{year:e.getFullYear(),month:e.getMonth()+1,day:e.getDate(),weekday:e.getDay(),hours:e.getHours(),minutes:e.getMinutes(),seconds:e.getSeconds()}}static toISOString(t){return at.serialToDate(t).toISOString().split("T")[0]}static fromISOString(t){const e=new Date(t);if(isNaN(e.getTime()))throw new Error(`Invalid ISO date string: ${t}`);return at.dateToSerial(e)}static today(){const t=new Date;return t.setHours(0,0,0,0),at.dateToSerial(t)}static now(){return at.dateToSerial(new Date)}}at.EXCEL_EPOCH=new Date(1899,11,30).getTime(),at.MS_PER_DAY=864e5;class st{constructor(t,e,n=ot.NUMBER){this.sheet=e,this._type=n,this._rules={address:/^\$?[A-Z]+\$?[0-9]+$/},this.precedents={},this.dependents={},this.remotePrecedents={},this.remoteDependents={},this.dynamicPrecedents={},this._dirty=!1,this._calculated=!1,this._hasRemotePrecedents=!1,this._hasRemoteDependents=!1,this._hasDynamicPrecedents=!1,this._isArrayAnchor=!1,this.address=t,this.init()}init(){}mount(t){this.el=t,this.sheet.dispatcher.dispatch(it.X.ELEMENT_MOUNTED,{cell:this.address,el:t})}isError(){return Object.values($).includes(this.value)}isEmpty(){const t=this.formula?this._computed:this._value;return null==t||""===t}calculate(){if(!this._formula)return this._calculated=!0,this._dirty=!1,this._value;try{const t=this.sheet.eval(this._formula);if(t instanceof Z)return this.handleArrayResult(t);const e=this._computed!==t;return this._computed=t,this._calculated=!0,this._dirty=!1,this.sheet.dispatcher.dispatch(it.X.CALCULATED,{cell:this.address,value:this._computed}),e&&(this._markDependentsAsDirty(),this.sheet.autoCalculate&&this._recalculateDependents()),this._computed}catch(t){return console.error(`Error calculating cell ${this.address}:`,t),this._computed=$.ERROR,this._calculated=!0,this._dirty=!1,this._computed}}handleArrayResult(t){return this._isArrayAnchor=!0,this._arrayResult=t,t.isSingleValue()?(this._computed=t.getSingleValue(),this._calculated=!0,this._dirty=!1,this._computed):this.checkSpillRange(t)?(this.spillArray(t),this._computed=t.getValue(0,0),this._calculated=!0,this._dirty=!1,this._computed):(this._computed=$.SPILL,this._calculated=!0,this._dirty=!1,this._computed)}checkSpillRange(t){const{row:e,col:n}=this.getCellCoordinates(this.address);for(let r=0;r0;){const t=(r-1)%26;n=String.fromCharCode(65+t)+n,r=Math.floor((r-1)/26)}return n+t}isArrayAnchor(){return this._isArrayAnchor}getSpillRange(){return this._spillRange}setFormat(t){this.format=t}setFormatter(t){this.formatter=t}getFormattedValue(){var t;return this.formatter?this.formatter.format(this.value):(null===(t=this.value)||void 0===t?void 0:t.toString())||""}isCalculated(){return this._calculated}isDirty(){return this._dirty}markAsDirty(){this._dirty=!0}isNumeric(){return!isNaN(this.value-parseFloat(this.value))}get address(){return this._address}set address(t){if(!t.match(this._rules.address))throw new Error("Cell address should follow spreadsheet like address rule");this._address=t}get type(){return this._type}set type(t){this._type=t}get formula(){return this._formula}set formula(t){const e=this._formula;this._formula=t,this.updateDynamicPrecedents(t),this.sheet.dispatcher.dispatch(it.X.FORMULA_CHANGED,{cell:this.address,oldFormula:e,newFormula:t});const n=this.getPrecedents();if(n)for(const t in n){const e=n[t];e&&e.removeDependent(this)}this.precedents={},this.markAsDirty(),this.sheet.workbook&&t&&this.rebuildDependencies()}rebuildDependencies(){if(!this._formula)return;const t=new(n(8377).B);t.setWorkbook(this.sheet.workbook);const{localDeps:e,remoteDeps:r}=t.getFormulaDependencies(this._formula),o={};for(const t in e){const e=this.sheet.getCellDirect(t);e&&(o[t]=e,e.addDependent(this))}this.setPrecedents(o);for(const e in r)try{const{sheetName:n,cellAddress:r}=t.parseRemoteReference(e),o=this.sheet.workbook.getSheet(n);if(o){const t=o.getCellDirect(r);t&&(t.addRemoteDependent(this),this.addRemotePrecedent(t))}}catch(t){}}get value(){let t=this.formula?this._computed:this._value;if("string"==typeof t&&Object.values($).includes(t))return t;switch(this._type){case ot.NUMBER:if(null==t||""===t)return 0;if("number"==typeof t)return t;const e=parseFloat(t);return isNaN(e)?t:e;case ot.BOOLEAN:return!!t;case ot.DATE:case ot.DATETIME:case ot.TIME:return t;case ot.ERROR:return $[t];default:return t}}set value(t){if(this._type===ot.BOOLEAN&&"string"==typeof t){const e=t.trim().toUpperCase();"TRUE"===e?t=!0:"FALSE"===e&&(t=!1)}if(this._type===ot.DATE||this._type===ot.DATETIME)if("string"==typeof t&&""!==t.trim())try{const e=t.match(/^(\d{4})-(\d{2})-(\d{2})/);if(e){const n=parseInt(e[1],10),r=parseInt(e[2],10)-1,o=parseInt(e[3],10),i=new Date(n,r,o);t=at.dateToSerial(i)}else{const e=new Date(t);isNaN(e.getTime())||(t=at.dateToSerial(e))}}catch(t){}else t instanceof Date&&(t=at.dateToSerial(t));this._value=t,this._formula="",this.sheet.dispatcher.dispatch(it.X.VALUE_CHANGED,{cell:this.address,value:t}),this._markDependentsAsDirty(),this.sheet.invalidateDynamicDependents(this.address),this.sheet.autoCalculate&&(this._recalculateDependents(),this.sheet.recalculateDirtyCells())}_markDependentsAsDirty(){const t=this.getDependents();for(const e in t){const n=t[e];n.markAsDirty(),n._markDependentsAsDirty()}}_recalculateDependents(){const t=this.getDependents();for(const e in t){const n=t[e];n.calculate(),n._recalculateDependents()}}getStringValue(){return this.value.toString()}getNumericValue(){return isNaN(parseFloat(this.value))?0:parseFloat(this.value)}getDateValue(){if(this._type!==ot.DATE&&this._type!==ot.DATETIME&&this._type!==ot.TIME)return null;const t=this.value;if(t instanceof Date)return t;if("number"==typeof t&&at.isValidSerialDate(t))return at.serialToDate(t);if("string"==typeof t){const e=new Date(t);if(!isNaN(e.getTime()))return e}return null}getSerialDateValue(){if(this._type!==ot.DATE&&this._type!==ot.DATETIME&&this._type!==ot.TIME)return null;const t=this.value;if("number"==typeof t&&at.isValidSerialDate(t))return t;if(t instanceof Date)return at.dateToSerial(t);if("string"==typeof t)try{return at.fromISOString(t)}catch(t){return null}return null}setDateValue(t){if(!(t instanceof Date)||isNaN(t.getTime()))throw new Error("Invalid date: must be a valid Date object");this._type=ot.DATE,this.value=at.dateToSerial(t)}setSerialDateValue(t){if(!at.isValidSerialDate(t))throw new Error("Invalid serial date: must be a valid number");this._type=ot.DATE,this.value=t}getFormattedDate(){const t=this.getSerialDateValue();return null===t?null:at.toISOString(t)}isDate(){return this._type===ot.DATE||this._type===ot.DATETIME||this._type===ot.TIME}getPrecedents(){return this._hasDynamicPrecedents?null:this.precedents}setPrecedents(t){this.precedents=t}addPrecedent(t){this.precedents[t.address]=t}getDependents(){return Object.assign(Object.assign({},this.dependents),this.remoteDependents)}setDependents(t){this.dependents=t}addDependent(t){this.dependents[t.address]=t}removeDependent(t){delete this.dependents[t.address]}addRemoteDependent(t){const e=t.sheet.name+"!"+t.address;this.remoteDependents[e]=t,this._hasRemoteDependents=!0}addRemotePrecedent(t){const e=t.sheet.name+"!"+t.address;this.remotePrecedents[e]=t}updateDynamicPrecedents(t){if(!t)return this.dynamicPrecedents={},void(this._hasDynamicPrecedents=!1);const e=[],n=[],r=/\b([A-Z]+)\s*:\s*([A-Z]+)\b/g;let o;for(;null!==(o=r.exec(t));)e.push(o[0]);const i=/\b(\d+)\s*:\s*(\d+)\b/g;for(;null!==(o=i.exec(t));){const e=t[o.index-1];e&&/[A-Z]/i.test(e)||n.push(o[0])}this.dynamicPrecedents={},e.length>0&&(this.dynamicPrecedents.columnRanges=e),n.length>0&&(this.dynamicPrecedents.rowRanges=n),this._hasDynamicPrecedents=e.length>0||n.length>0}hasDynamicPrecedents(){return this._hasDynamicPrecedents}dependsOnColumn(t){if(!this._hasDynamicPrecedents||!this.dynamicPrecedents.columnRanges)return!1;const e=this.columnToNumber(t);return this.dynamicPrecedents.columnRanges.some(t=>{const[n,r]=t.split(":").map(t=>this.columnToNumber(t.trim()));return e>=n&&e<=r})}dependsOnRow(t){return!(!this._hasDynamicPrecedents||!this.dynamicPrecedents.rowRanges)&&this.dynamicPrecedents.rowRanges.some(e=>{const[n,r]=e.split(":").map(t=>parseInt(t.trim()));return t>=n&&t<=r})}columnToNumber(t){let e=0;for(let n=0;nMath.floor(16*Math.random()).toString(16))}get autoCalculate(){return this._autoCalculate}set autoCalculate(t){this._autoCalculate=t}recalculateDirtyCells(){const t=this._autoCalculate;this._autoCalculate=!1,this._cells.each(t=>{t.isDirty()&&t.calculate()}),this._autoCalculate=t}set element(t){t.setAttribute("data-calx-id",this.id),this._el=t,this.dispatcher.dispatch(et.ELEMENT_ATTACHED,{sheet:this,el:t})}get element(){return this._el}get id(){return this._id}get cells(){return this._cells.all()}listen(t,e){this.dispatcher.listen(t,e)}calculate(t={withoutEvent:!1}){if(t.withoutEvent&&this.dispatcher.pauseListener(),this._depTree){const t=this._depTree.topologicalSort();for(const e of t)if(e)for(const t of e)!t.isDirty()&&t.isCalculated()||t.calculate();this._cells.each(t=>{!t.hasDynamicPrecedents()||!t.isDirty()&&t.isCalculated()||t.calculate()})}else for(const t in this.cells)this.cells[t].calculate();this.dispatcher.resumeListener()}requestCalculate(t){const e=this.getCell(t);if(e){e.markAsDirty(),e.calculate();const t=e.getDependents();for(const e in t)t[e].markAsDirty()}}getRange(t){return new tt(this,t)}getCellDirect(t){return this._cells.get(t)}getCell(t){return this._cells.get(t)}getCellValue(t){return this.getRange(t).value}createCell(t,e){const n=this._cells.create(t,e||{});return this.invalidateDynamicDependents(t),n}eval(t){return this.workbook.setActiveSheet(this),this.workbook.parser.parse(t)}buildDependencyTree(){const t=new ct.B;t.setWorkbook(this.workbook),this._depTree=t.build(this._cells)}invalidateDynamicDependents(t){const e=t.match(/^([A-Z]+)(\d+)$/);if(!e)return;const n=e[1],r=parseInt(e[2]);this._cells.each(t=>{t.hasDynamicPrecedents()&&(t.dependsOnColumn(n)||t.dependsOnRow(r))&&t.markAsDirty()})}getVariable(t){return void 0!==this._variables[t]?this._variables[t]:"#NAME?"}setVariable(t,e){this._variables[t]=e}getCellRangeValues(t,e){const n=t.match(/[A-Z]+/),r=t.match(/\d+/),o=e.match(/[A-Z]+/),i=e.match(/\d+/);if(!(n&&r&&o&&i))throw new Error(`Invalid cell range: ${t}:${e}`);const a=n[0],s=parseInt(r[0]),u=o[0],c=parseInt(i[0]),l=[],f=t=>{let e=0;for(let n=0;n{let e="";for(;t>0;){const n=(t-1)%26;e=String.fromCharCode(65+n)+e,t=Math.floor((t-1)/26)}return e},p=f(a),d=f(u);for(let t=s;t<=c;t++)for(let e=p;e<=d;e++){const n=h(e)+t,r=this._cells.get(n);l.push(r?r.value:null)}return l}getRowRangeValues(t){const e=t.replace(/\$/g,"").split(":"),n=parseInt(e[0]),r=parseInt(e[1]),o=[],i=this._cells.all();for(const t in i){const e=t.match(/(\d+)$/);if(e){const a=parseInt(e[1]);a>=n&&a<=r&&o.push(i[t].value)}}return o}getColumnRangeValues(t){const e=t.replace(/\$/g,"").split(":"),[n,r]=e,o=t=>{let e=0;for(let n=0;n=i&&n<=a&&s.push(u[t].value)}}return s}}var ft=n(4809),ht=n(6572);const pt=new Error("#NULL!"),dt=new Error("#DIV/0!"),mt=new Error("#VALUE!"),gt=new Error("#REF!"),vt=new Error("#NAME?"),yt=new Error("#NUM!"),Et=new Error("#N/A"),Tt=new Error("#ERROR!"),At=new Error("#GETTING_DATA");function _t(t){return t&&t.reduce?t.reduce((t,e)=>{const n=Array.isArray(t),r=Array.isArray(e);return n&&r?t.concat(e):n?(t.push(e),t):r?[t].concat(e):[t,e]}):[t]}function Rt(t){if(!t)return!1;for(let e=0;e{e.push(t)}),e}function It(){return Nt.apply(null,arguments).filter(t=>"number"==typeof t)}function St(t){const e=1e14;return Math.round(t*e)/e}function xt(t){if("boolean"==typeof t)return t;if(t instanceof Error)return t;if("number"==typeof t)return 0!==t;if("string"==typeof t){const e=t.toUpperCase();if("TRUE"===e)return!0;if("FALSE"===e)return!1}return t instanceof Date&&!isNaN(t)||mt}function bt(t){return t instanceof Error?t:null==t||""===t?0:("boolean"==typeof t&&(t=+t),isNaN(t)?mt:parseFloat(t))}function Mt(t){return t instanceof Error?t:null==t?"":t.toString()}function Ct(t){let e,n;if(!t||0===(e=t.length))return mt;for(;e--;){if(t[e]instanceof Error)return t[e];if(n=bt(t[e]),n instanceof Error)return n;t[e]=n}return t}function Lt(t){if(!isNaN(t)){if(t instanceof Date)return new Date(t);const e=parseFloat(t);return e<0||e>=2958466?yt:function(t){t<60&&(t+=1);const e=Math.floor(t-25569),n=new Date(86400*e*1e3),r=t-Math.floor(t)+1e-7;let o=Math.floor(86400*r);const i=o%60;o-=i;const a=Math.floor(o/3600),s=Math.floor(o/60)%60;let u=n.getUTCDate(),c=n.getUTCMonth();return t>=60&&t<61&&(u=29,c=1),new Date(n.getUTCFullYear(),c,u,a,s,i)}(e)}return"string"!=typeof t||(t=/(\d{4})-(\d\d?)-(\d\d?)$/.test(t)?new Date(t+"T00:00:00.000"):new Date(t),isNaN(t))?mt:t}function Pt(t){let e,n=t.length;for(;n--;){if(e=Lt(t[n]),e===mt)return e;t[n]=e}return t}function wt(){for(let t=0;to||s===o&&u0?e+"Y":"",n=n>0?n+"M":"",r=r>0?r+"D":"",o=o>0?o+"H":"",i=i>0?i+"M":"",a=a>0?a+"S":"","P"+e+n+r+"T"+o+i+a}function ne(t){if((t=Lt(t))instanceof Error)return t;(t=Xt(t)).setDate(t.getDate()+4-(t.getDay()||7));const e=new Date(t.getFullYear(),0,1);return Math.ceil(((t-e)/864e5+1)/7)}function re(t){return(t=Lt(t))instanceof Error?t:t.getMinutes()}function oe(t){return(t=Lt(t))instanceof Error?t:t.getMonth()+1}function ie(t,e,n){return ie.INTL(t,e,1,n)}function ae(){return new Date}function se(t){return(t=Lt(t))instanceof Error?t:t.getSeconds()}function ue(t,e,n){return kt(t=bt(t),e=bt(e),n=bt(n))?mt:t<0||e<0||n<0?yt:(3600*t+60*e+n)/86400}function ce(t){return(t=Lt(t))instanceof Error?t:(3600*t.getHours()+60*t.getMinutes()+t.getSeconds())/86400}function le(){return Xt(new Date)}function fe(t,e){if((t=Lt(t))instanceof Error)return t;void 0===e&&(e=1);const n=t.getDay();return Wt[e][n]}function he(t,e){if((t=Lt(t))instanceof Error)return t;if(void 0===e&&(e=1),21===e)return ne(t);const n=Gt[e];let r=new Date(t.getFullYear(),0,1);const o=r.getDay(){const n=t.getFullYear(),r=new Date(n,2,1);if(me(n)&&t=r)return!0;const o=e.getFullYear(),i=new Date(o,2,1);return me(o)&&e>=i&&ts||o===s&&r>=a))return(i===u&&me(i)||n(t,e)||1===s&&29===a)&&(c=366),ge(t,e)/c;const l=u-i+1,f=(new Date(u+1,0,1)-new Date(i,0,1))/1e3/60/60/24/l;return ge(t,e)/f}case 2:return ge(t,e)/360;case 3:return ge(t,e)/365;case 4:return(a+30*s+360*u-(r+30*o+360*i))/360}}function ye(t){const e=t>-22038912e5?2:1;return Math.ceil((t-Bt)/864e5)+e}ie.INTL=(t,e,n,r)=>{if((t=Lt(t))instanceof Error)return t;if((e=Lt(e))instanceof Error)return e;let o=!1;const i=[],a=[1,2,3,4,5,6,0],s=new RegExp("^[0|1]{7}$");if(void 0===n)n=zt[1];else if("string"==typeof n&&s.test(n)){o=!0,n=n.split("");for(let t=0;t0?l.getUTCDay():l.getDay();let e=o?i.includes(t):t===n[0]||t===n[1];for(let t=0;t{if((t=Lt(t))instanceof Error)return t;if((e=bt(e))instanceof Error)return e;if(e<0)return yt;if(!((n=void 0===n?zt[1]:zt[n])instanceof Array))return mt;void 0===r?r=[]:r instanceof Array||(r=[r]);for(let t=0;t",">=","<","<=","=","<>"],Ae="operator",_e="literal",Re=[Ae,_e],Ne=Ae,Oe=_e;function Ie(t,e){if(-1===Re.indexOf(e))throw new Error("Unsupported token type: "+e);return{value:t,type:e}}function Se(t){return function(t){let e="";const n=[];for(let r=0;r=0?n.push(Ie(o,Ne)):e+=o}return e.length>0&&n.push(Ie(function(t){return"string"!=typeof t||/^\d+(\.\d+)?$/.test(t)&&(t=-1===t.indexOf(".")?parseInt(t,10):parseFloat(t)),t}(e),Oe)),n.length>0&&n[0].type!==Ne&&n.unshift(Ie(Ee,Ne)),n}(function(t){const e=t.length,n=[];let r=0,o="",i="";for(;r":case"<":case"=":i+=e,o.length>0&&(n.push(o),o="");break;default:i.length>0&&(n.push(i),i=""),o+=e}r++}return o.length>0&&n.push(o),i.length>0&&n.push(i),n}(t))}const xe=function(t){const e=[];let n;for(let r=0;r":n=t[0]>t[1];break;case">=":n=t[0]>=t[1];break;case"<":n=t[0]":n=t[0]!=t[1]}return n}(e,n)};function be(){throw new Error("CELL is not implemented")}const Me={};function Ce(){throw new Error("INFO is not implemented")}function Le(t){return null===t}function Pe(t){return/^[01]{1,10}$/.test(t)}function we(t){return[mt,gt,dt,yt,vt,pt].indexOf(t)>=0||"number"==typeof t&&(isNaN(t)||!isFinite(t))}function De(t){return we(t)||t===Et}function ke(t){return!(1&Math.floor(Math.abs(t)))}function Ue(){throw new Error("ISFORMULA is not implemented")}function Fe(t){return!0===t||!1===t}function je(t){return t===Et}function Ve(t){return"string"!=typeof t}function Be(t){return"number"==typeof t&&!isNaN(t)&&isFinite(t)}function Ge(t){return!!(1&Math.floor(Math.abs(t)))}function We(){throw new Error("ISREF is not implemented")}function ze(t){return"string"==typeof t}function Ye(t){return Be(t)?t:t instanceof Date?t.getTime():!0===t?1:!1===t?0:De(t)?t:0}function qe(){return Et}function Ke(){throw new Error("SHEET is not implemented")}function He(){throw new Error("SHEETS is not implemented")}function Xe(t){return Be(t)?1:ze(t)?2:Fe(t)?4:De(t)?16:Array.isArray(t)?64:void 0}function $e(){if(arguments.length<2)return Et;const t=arguments[0];return t<1||t>254||arguments.lengtho.map(t=>t[e])):mt,n,r);var o}function tn(t,e,n){const r=wt(t,e,n);if(r)return r;if(!Array.isArray(t))return mt;const o=t.length>0&&!Array.isArray(t[0]);return o&&!n?(n=e,e=1):(n=n||1,e=e||1),n<0||e<0?mt:o&&1===e&&n<=t.length?t[n-1]:e<=t.length&&n<=t[e-1].length?t[e-1][n-1]:gt}function en(t,e,n){e=Nt(e),n=n?Nt(n):e;const r="number"==typeof t;let o=Et;for(let i=0;it)return o}return o}function nn(t,e,n){if(!t||!e)return Et;if(2===arguments.length&&(n=1),!((e=Nt(e))instanceof Array))return Et;if(-1!==n&&0!==n&&1!==n)return Et;let r,o;for(let i=0;io&&(r=i+1,o=e[i]):(r=i+1,o=e[i]))}else if(0===n){if("string"==typeof t&&"string"==typeof e[i]){const n=t.toLowerCase().replace(/\?/g,".").replace(/\*/g,".*").replace(/~/g,"\\");if(new RegExp("^"+n+"$").test(e[i].toLowerCase()))return i+1}else if(e[i]===t)return i+1}else if(-1===n){if(e[i]===t)return i+1;e[i]>t&&(o?e[i]t&&(a=!0)}return o}Me.TYPE=t=>{switch(t){case pt:return 1;case dt:return 2;case mt:return 3;case gt:return 4;case vt:return 5;case yt:return 6;case Et:return 7;case At:return 8}return Et};const un=2.5066282746310002;function cn(){const t=Nt(arguments).filter(Dt);if(0===t.length)return yt;const e=Ct(t);return e instanceof Error?e:ht.sum(ht(e).subtract(ht.mean(e)).abs()[0])/e.length}function ln(){const t=Nt(arguments).filter(Dt);if(0===t.length)return dt;const e=wt.apply(void 0,t);if(e)return e;const n=It(t),r=n.length;let o,i=0,a=0;for(let t=0;t(r=void 0===r?0:r,o=void 0===o?1:o,kt(t=bt(t),e=bt(e),n=bt(n),r=bt(r),o=bt(o))?mt:ht.beta.inv(t,e,n)*(o-r)+r)},mn={DIST:(t,e,n,r)=>kt(t=bt(t),e=bt(e),n=bt(n),r=bt(r))?mt:r?ht.binomial.cdf(t,e,n):ht.binomial.pdf(t,e,n)};mn.DIST.RANGE=(t,e,n,r)=>{if(r=void 0===r?n:r,kt(t=bt(t),e=bt(e),n=bt(n),r=bt(r)))return mt;let o=0;for(let i=n;i<=r;i++)o+=Wr(t,i)*Math.pow(e,i)*Math.pow(1-e,t-i);return o},mn.INV=(t,e,n)=>{if(kt(t=bt(t),e=bt(e),n=bt(n)))return mt;let r=0;for(;r<=t;){if(ht.binomial.cdf(r,t,e)>=n)return r;r++}};const gn={DIST:(t,e,n)=>kt(t=bt(t),e=bt(e))?mt:n?ht.chisquare.cdf(t,e):ht.chisquare.pdf(t,e)};gn.DIST.RT=(t,e)=>!t|!e?Et:t<1||e>Math.pow(10,10)?yt:"number"!=typeof t||"number"!=typeof e?mt:1-ht.chisquare.cdf(t,e),gn.INV=(t,e)=>kt(t=bt(t),e=bt(e))?mt:ht.chisquare.inv(t,e),gn.INV.RT=(t,e)=>!t|!e?Et:t<0||t>1||e<1||e>Math.pow(10,10)?yt:"number"!=typeof t||"number"!=typeof e?mt:ht.chisquare.inv(1-t,e),gn.TEST=function(t,e){if(2!==arguments.length)return Et;if(!(t instanceof Array&&e instanceof Array))return mt;if(t.length!==e.length)return mt;if(t[0]&&e[0]&&t[0].length!==e[0].length)return mt;const n=t.length;let r,o,i;for(o=0;o=2;)n=n*t/r,r-=2;let o=n,i=e;for(;o>1e-10*n;)i+=2,o=o*t/i,n+=o;return 1-n}(u,s))/1e6};const vn={};function yn(t,e){return kt(t=Ct(Nt(t)),e=Ct(Nt(e)))?mt:ht.corrcoeff(t,e)}function En(){return It(Nt(arguments)).length}function Tn(){const t=Nt(arguments);return t.length-_n(t)}function An(t,e){let n=0;t=Nt(t);for(let r=0;rkt(t=bt(t),e=bt(e),n=bt(n))?mt:ht.normalci(1,t,e,n)[1]-1,vn.T=(t,e,n)=>kt(t=bt(t),e=bt(e),n=bt(n))?mt:ht.tci(1,t,e,n)[1]-1;const In={};function Sn(){const t=Ct(Nt(arguments));if(t instanceof Error)return t;const e=ht.mean(t);let n=0;for(let r=0;r{if(kt(t=Ct(Nt(t)),e=Ct(Nt(e))))return mt;const n=ht.mean(t),r=ht.mean(e);let o=0;const i=t.length;for(let a=0;akt(t=Ct(Nt(t)),e=Ct(Nt(e)))?mt:ht.covariance(t,e);const xn={DIST:(t,e,n)=>kt(t=bt(t),e=bt(e))?mt:n?ht.exponential.cdf(t,e):ht.exponential.pdf(t,e)},bn={};function Mn(t){return(t=bt(t))instanceof Error?t:Math.log((1+t)/(1-t))/2}function Cn(t){if((t=bt(t))instanceof Error)return t;const e=Math.exp(2*t);return(e-1)/(e+1)}function Ln(t,e,n){if(kt(t=bt(t),e=Ct(Nt(e)),n=Ct(Nt(n))))return mt;const r=ht.mean(n),o=ht.mean(e),i=n.length;let a=0,s=0;for(let t=0;te[i-1]&&t[a]<=e[i]&&(o[i]+=1):i===r&&t[a]>e[r-1]&&(o[r]+=1)}return o}function wn(t){return(t=bt(t))instanceof Error?t:0===t||parseInt(t,10)===t&&t<0?yt:ht.gammafn(t)}function Dn(t){return(t=bt(t))instanceof Error?t:ht.gammaln(t)}function kn(t){return(t=bt(t))instanceof Error?t:ht.normal.cdf(t,0,1)-.5}function Un(){const t=Ct(Nt(arguments));return t instanceof Error?t:ht.geomean(t)}function Fn(t,e,n,r){if((t=Ct(t))instanceof Error)return t;let o;if(void 0===e)for(e=[],o=1;o<=t.length;o++)e.push(o);if(void 0===n)for(n=[],o=1;o<=t.length;o++)n.push(o);if(kt(e=Ct(e),n=Ct(n)))return mt;void 0===r&&(r=!0);const i=t.length;let a,s,u=0,c=0,l=0,f=0;for(o=0;okt(t=bt(t),e=bt(e),n=bt(n))?mt:r?ht.centralF.cdf(t,e,n):ht.centralF.pdf(t,e,n),bn.DIST.RT=function(t,e,n){return 3!==arguments.length?Et:t<0||e<1||n<1?yt:"number"!=typeof t||"number"!=typeof e||"number"!=typeof n?mt:1-ht.centralF.cdf(t,e,n)},bn.INV=(t,e,n)=>kt(t=bt(t),e=bt(e),n=bt(n))?mt:t<=0||t>1?yt:ht.centralF.inv(t,e,n),bn.INV.RT=function(t,e,n){return 3!==arguments.length?Et:t<0||t>1||e<1||e>Math.pow(10,10)||n<1||n>Math.pow(10,10)?yt:"number"!=typeof t||"number"!=typeof e||"number"!=typeof n?mt:ht.centralF.inv(1-t,e,n)},bn.TEST=(t,e)=>{if(!t||!e)return Et;if(!(t instanceof Array&&e instanceof Array))return Et;if(t.length<2||e.length<2)return dt;const n=(t,e)=>{let n=0;for(let r=0;r1||e<=0||n<=0?yt:"number"!=typeof t||"number"!=typeof e||"number"!=typeof n?mt:ht.gamma.inv(t,e,n)},Dn.PRECISE=function(t){return 1!==arguments.length?Et:t<=0?yt:"number"!=typeof t?mt:ht.gammaln(t)};const Vn={};function Bn(t,e){return kt(t=Ct(t),e=Ct(e))?mt:t.length!==e.length?Et:Ln(0,t,e)}function Gn(){const t=Ct(Nt(arguments));if(t instanceof Error)return t;const e=ht.mean(t),n=t.length;let r=0;for(let o=0;oe-t)[e-1]}function zn(t,e){if(kt(t=Ct(Nt(t)),e=Ct(Nt(e))))return mt;const n=ht.mean(t),r=ht.mean(e),o=e.length;let i=0,a=0;for(let s=0;s{if(kt(t=bt(t),e=bt(e),n=bt(n),r=bt(r)))return mt;function i(t,e,n,r){return Wr(n,t)*Wr(r-n,e-t)/Wr(r,e)}return o?function(t,e,n,r){let o=0;for(let a=0;a<=t;a++)o+=i(a,e,n,r);return o}(t,e,n,r):i(t,e,n,r)};const qn={};function Kn(){const t=Nt(arguments),e=wt.apply(void 0,t);if(e)return e;const n=It(t);return 0===n.length?0:Math.max.apply(Math,n)}function Hn(){const t=Nt(arguments),e=wt.apply(void 0,t);if(e)return e;let n=Ft(t);return n=n.map(t=>null==t?0:t),0===n.length?0:Math.max.apply(Math,n)}function Xn(){const t=Nt(arguments),e=wt.apply(void 0,t);if(e)return e;const n=Ft(t);let r=ht.median(n);return isNaN(r)&&(r=yt),r}function $n(){const t=Nt(arguments),e=wt.apply(void 0,t);if(e)return e;const n=It(t);return 0===n.length?0:Math.min.apply(Math,n)}function Zn(){const t=Nt(arguments),e=wt.apply(void 0,t);if(e)return e;let n=Ft(t);return n=n.map(t=>null==t?0:t),0===n.length?0:Math.min.apply(Math,n)}qn.DIST=(t,e,n,r)=>kt(t=bt(t),e=bt(e),n=bt(n))?mt:r?ht.lognormal.cdf(t,e,n):ht.lognormal.pdf(t,e,n),qn.INV=(t,e,n)=>kt(t=bt(t),e=bt(e),n=bt(n))?mt:ht.lognormal.inv(t,e,n);const Qn={MULT:function(){const t=Ct(Nt(arguments));if(t instanceof Error)return t;const e=t.length,n={};let r,o=[],i=0;for(let a=0;ai&&(i=n[r],o=[]),n[r]===i&&(o[o.length]=r);return o},SNGL:function(){const t=Ct(Nt(arguments));return t instanceof Error?t:Qn.MULT(t).sort((t,e)=>t-e)[0]}},Jn={DIST:(t,e,n,r)=>kt(t=bt(t),e=bt(e),n=bt(n))?mt:r?ht.negbin.cdf(t,e,n):ht.negbin.pdf(t,e,n)},tr={};function er(t,e){if(kt(e=Ct(Nt(e)),t=Ct(Nt(t))))return mt;const n=ht.mean(t),r=ht.mean(e),o=t.length;let i=0,a=0,s=0;for(let u=0;ukt(t=bt(t),e=bt(e),n=bt(n))?mt:n<=0?yt:r?ht.normal.cdf(t,e,n):ht.normal.pdf(t,e,n),tr.INV=(t,e,n)=>kt(t=bt(t),e=bt(e),n=bt(n))?mt:ht.normal.inv(t,e,n),tr.S={},tr.S.DIST=(t,e)=>(t=bt(t))instanceof Error?mt:e?ht.normal.cdf(t,0,1):ht.normal.pdf(t,0,1),tr.S.INV=t=>(t=bt(t))instanceof Error?mt:ht.normal.inv(t,0,1);const nr={EXC:(t,e)=>{if(kt(t=Ct(Nt(t)),e=bt(e)))return mt;const n=(t=t.sort((t,e)=>t-e)).length;if(e<1/(n+1)||e>1-1/(n+1))return yt;const r=e*(n+1)-1,o=Math.floor(r);return St(r===o?t[r]:t[o]+(r-o)*(t[o+1]-t[o]))},INC:(t,e)=>{if(kt(t=Ct(Nt(t)),e=bt(e)))return mt;const n=e*((t=t.sort((t,e)=>t-e)).length-1),r=Math.floor(n);return St(n===r?t[n]:t[r]+(n-r)*(t[r+1]-t[r]))}},rr={};function or(t,e){return kt(t=bt(t),e=bt(e))?mt:no(t)/no(t-e)}function ir(t,e){return kt(t=bt(t),e=bt(e))?mt:Math.pow(t,e)}function ar(t){return(t=bt(t))instanceof Error?mt:Math.exp(-.5*t*t)/un}rr.EXC=(t,e,n)=>{if(n=void 0===n?3:n,kt(t=Ct(Nt(t)),e=bt(e),n=bt(n)))return mt;t=t.sort((t,e)=>t-e);const r=an.apply(null,t),o=t.length,i=r.length,a=Math.pow(10,n);let s=0,u=!1,c=0;for(;!u&&c=r[c]&&(e{if(n=void 0===n?3:n,kt(t=Ct(Nt(t)),e=bt(e),n=bt(n)))return mt;t=t.sort((t,e)=>t-e);const r=an.apply(null,t),o=t.length,i=r.length,a=Math.pow(10,n);let s=0,u=!1,c=0;for(;!u&&c=r[c]&&(e=0?e[t.indexOf(n)]:0;const o=t.sort((t,e)=>t-e),i=o.length;let a=0;for(let s=0;s=n&&o[s]<=r&&(a+=e[t.indexOf(o[s])]);return a}sr.DIST=(t,e,n)=>kt(t=bt(t),e=bt(e))?mt:n?ht.poisson.cdf(t,e):ht.poisson.pdf(t,e);const cr={EXC:(t,e)=>{if(kt(t=Ct(Nt(t)),e=bt(e)))return mt;switch(e){case 1:return nr.EXC(t,.25);case 2:return nr.EXC(t,.5);case 3:return nr.EXC(t,.75);default:return yt}},INC:(t,e)=>{if(kt(t=Ct(Nt(t)),e=bt(e)))return mt;switch(e){case 1:return nr.INC(t,.25);case 2:return nr.INC(t,.5);case 3:return nr.INC(t,.75);default:return yt}}},lr={};function fr(t,e){return 2!==arguments.length?Et:e<0?yt:t instanceof Array&&"number"==typeof e?0!==t.length?ht.row(t,e):void 0:mt}function hr(t,e){return kt(t=Ct(Nt(t)),e=Ct(Nt(e)))?mt:Math.pow(er(t,e),2)}function pr(){const t=Ct(Nt(arguments));if(t instanceof Error)return t;const e=ht.mean(t),n=t.length;let r=0;for(let o=0;ot-e)[e-1]}function gr(t,e,n){return kt(t=bt(t),e=bt(e),n=bt(n))?mt:(t-e)/n}lr.AVG=(t,e,n)=>{if(kt(t=bt(t),e=Ct(Nt(e))))return mt;const r=(n=n||!1)?(t,e)=>t-e:(t,e)=>e-t,o=(e=(e=Nt(e)).sort(r)).length;let i=0;for(let n=0;n1?(2*e.indexOf(t)+i+1)/2:e.indexOf(t)+1},lr.EQ=(t,e,n)=>{if(kt(t=bt(t),e=Ct(Nt(e))))return mt;const r=(n=n||!1)?(t,e)=>t-e:(t,e)=>e-t;return(e=e.sort(r)).indexOf(t)+1},pr.P=function(){const t=Ct(Nt(arguments));if(t instanceof Error)return t;const e=ht.mean(t),n=t.length;let r=0,o=0;for(let i=0;i{a.push(o*t+i)}),a}function Rr(t,e){if(kt(t=Ct(Nt(t)),e=bt(e)))return mt;const n=oo(t.length*e,2)/2;return ht.mean((o=(o=n)||1,(r=jt(t.sort((t,e)=>t-e),n))&&"function"==typeof r.slice?r.slice(0,r.length-o):r));var r,o}Ar.DIST=(t,e,n)=>1!==n&&2!==n?yt:1===n?Ar.DIST.RT(t,e):Ar.DIST["2T"](t,e),Ar.DIST["2T"]=function(t,e){return 2!==arguments.length?Et:t<0||e<1?yt:"number"!=typeof t||"number"!=typeof e?mt:2*(1-ht.studentt.cdf(t,e))},Ar.DIST.RT=function(t,e){return 2!==arguments.length?Et:t<0||e<1?yt:"number"!=typeof t||"number"!=typeof e?mt:1-ht.studentt.cdf(t,e)},Ar.INV=(t,e)=>kt(t=bt(t),e=bt(e))?mt:ht.studentt.inv(t,e),Ar.INV["2T"]=(t,e)=>(t=bt(t),e=bt(e),t<=0||t>1||e<1?yt:kt(t,e)?mt:Math.abs(ht.studentt.inv(t/2,e))),Ar.TEST=(t,e)=>{if(kt(t=Ct(Nt(t)),e=Ct(Nt(e))))return mt;const n=ht.mean(t),r=ht.mean(e);let o,i=0,a=0;for(o=0;okt(t=bt(t),e=bt(e),n=bt(n))?mt:r?1-Math.exp(-Math.pow(t/n,e)):Math.pow(t,e-1)*Math.exp(-Math.pow(t/n,e))*e/Math.pow(n,e)},xr={};function br(t){return(t=bt(t))instanceof Error?t:Math.abs(t)}function Mr(t){if((t=bt(t))instanceof Error)return t;let e=Math.acos(t);return isNaN(e)&&(e=yt),e}function Cr(t){if((t=bt(t))instanceof Error)return t;let e=Math.log(t+Math.sqrt(t*t-1));return isNaN(e)&&(e=yt),e}function Lr(t){return(t=bt(t))instanceof Error?t:Math.atan(1/t)}function Pr(t){if((t=bt(t))instanceof Error)return t;let e=.5*Math.log((t+1)/(t-1));return isNaN(e)&&(e=yt),e}function wr(t,e,n,r){if(kt(t=bt(t),bt(t)))return mt;switch(t){case 1:return ln(n);case 2:return En(n);case 3:return Tn(n);case 4:return Kn(n);case 5:return $n(n);case 6:return No(n);case 7:return vr.S(n);case 8:return vr.P(n);case 9:return ei(n);case 10:return Nr.S(n);case 11:return Nr.P(n);case 12:return Xn(n);case 13:return Qn.SNGL(n);case 14:return Wn(n,r);case 15:return mr(n,r);case 16:return nr.INC(n,r);case 17:return cr.INC(n,r);case 18:return nr.EXC(n,r);case 19:return cr.EXC(n,r)}}function Dr(t){if(null==t)return 0;if(t instanceof Error)return t;if(!/^M*(?:D?C{0,3}|C[MD])(?:L?X{0,3}|X[CL])(?:V?I{0,3}|I[XV])$/.test(t))return mt;let e=0;return t.replace(/[MDLV]|C[MD]?|X[CL]?|I[XV]?/g,t=>{e+={M:1e3,CM:900,D:500,CD:400,C:100,XC:90,L:50,XL:40,X:10,IX:9,V:5,IV:4,I:1}[t]}),e}function kr(t){if((t=bt(t))instanceof Error)return t;let e=Math.asin(t);return isNaN(e)&&(e=yt),e}function Ur(t){return(t=bt(t))instanceof Error?t:Math.log(t+Math.sqrt(t*t+1))}function Fr(t){return(t=bt(t))instanceof Error?t:Math.atan(t)}function jr(t,e){return wt(t=bt(t),e=bt(e))||Math.atan2(t,e)}function Vr(t){if((t=bt(t))instanceof Error)return t;let e=Math.log((1+t)/(1-t))/2;return isNaN(e)&&(e=yt),e}function Br(t,e,n){const r=wt(t=bt(t),e=bt(e),n=bt(n));if(r)return r;if(0===e)return yt;const o=t.toString(e);return new Array(Math.max(n+1-o.length,0)).join("0")+o}function Gr(t,e,n){const r=wt(t=bt(t),e=bt(e),n=bt(n));if(r)return r;if(0===e)return 0;e=Math.abs(e);const o=-Math.floor(Math.log(e)/Math.log(10));return t>=0?Mo(Math.ceil(t/e)*e,o):0===n?-Mo(Math.floor(Math.abs(t)/e)*e,o):-Mo(Math.ceil(Math.abs(t)/e)*e,o)}function Wr(t,e){return wt(t=bt(t),e=bt(e))||(t1?Tt:(t=bt(t))instanceof Error?t:t=Math.exp(t)}xr.TEST=(t,e,n)=>{if(kt(t=Ct(Nt(t)),e=bt(e)))return mt;n=n||vr.S(t);const r=t.length;return 1-tr.S.DIST((ln(t)-e)/(n/Math.sqrt(r)),!0)},Gr.MATH=Gr,Gr.PRECISE=Gr;const eo=[];function no(t){if((t=bt(t))instanceof Error)return t;const e=Math.floor(t);return 0===e||1===e?1:(eo[e]>0||(eo[e]=no(e-1)*e),eo[e])}function ro(t){if((t=bt(t))instanceof Error)return t;const e=Math.floor(t);return e<=0?1:e*ro(e-2)}function oo(t,e){const n=wt(t=bt(t),e=bt(e));if(n)return n;if(0===e)return 0;if(!(t>=0&&e>0||t<=0&&e<0))return yt;e=Math.abs(e);const r=-Math.floor(Math.log(e)/Math.log(10));return t>=0?Mo(Math.floor(t/e)*e,r):-Mo(Math.ceil(Math.abs(t)/e),r)}function io(){const t=Ct(Nt(arguments));if(t instanceof Error)return t;const e=t.length,n=t[0];let r=n<0?-n:n;for(let n=1;no?r%=o:o%=r;r+=o}return r}function ao(t){return(t=bt(t))instanceof Error?t:Math.floor(t)}oo.MATH=(t,e,n)=>{if(e instanceof Error)return e;e=void 0===e?0:e;const r=wt(t=bt(t),e=bt(e),n=bt(n));if(r)return r;if(0===e)return 0;e=e?Math.abs(e):1;const o=-Math.floor(Math.log(e)/Math.log(10));return t>=0?Mo(Math.floor(t/e)*e,o):0===n||void 0===n?-Mo(Math.ceil(Math.abs(t)/e)*e,o):-Mo(Math.floor(Math.abs(t)/e)*e,o)},oo.PRECISE=oo.MATH;const so={CEILING:Gr};function uo(){const t=Ct(Nt(arguments));if(t instanceof Error)return t;for(var e,n,r,o,i=1;void 0!==(r=t.pop());){if(0===r)return 0;for(;r>1;){if(r%2){for(e=3,n=Math.floor(Math.sqrt(r));e<=n&&r%e;e+=2);o=e<=n?e:r}else o=2;for(r/=o,i*=o,e=t.length;e;t[--e]%o===0&&1===(t[e]/=o)&&t.splice(e,1));}}return i}function co(t){return(t=bt(t))instanceof Error?t:0===t?yt:Math.log(t)}function lo(){return Math.log(10)}function fo(){return Math.log(2)}function ho(){return Math.LOG10E}function po(){return Math.LOG2E}function mo(t,e){return wt(t=bt(t),e=bt(e))||(0===t||0===e?yt:Math.log(t)/Math.log(e))}function go(t){return(t=bt(t))instanceof Error?t:0===t?yt:Math.log(t)/Math.log(10)}function vo(t,e){const n=wt(t=bt(t),e=bt(e));if(n)return n;if(0===e)return dt;let r=Math.abs(t%e);return r=t<0?e-r:r,e>0?r:-r}function yo(t,e){return wt(t=bt(t),e=bt(e))||(t*e===0?0:t*e<0?yt:Math.round(t/e)*e)}function Eo(){const t=Ct(Nt(arguments));if(t instanceof Error)return t;let e=0,n=1;for(let r=0;r=0?e:-e}function Ao(){return Math.PI}function _o(){return Math.E}function Ro(t,e){const n=wt(t=bt(t),e=bt(e));if(n)return n;if(0===t&&0===e)return yt;const r=Math.pow(t,e);return isNaN(r)?yt:r}function No(){const t=Nt(arguments).filter(t=>null!=t);if(0===t.length)return 0;const e=Ct(t);if(e instanceof Error)return e;let n=1;for(let t=0;t0?1:-1)*Math.floor(Math.abs(t)*Math.pow(10,e))/Math.pow(10,e)}function Lo(t,e){const n=wt(t=bt(t),e=bt(e));return n||(t>0?1:-1)*Math.ceil(Math.abs(t)*Math.pow(10,e))/Math.pow(10,e)}function Po(t){return(t=bt(t))instanceof Error?t:1/Math.cos(t)}function wo(t){return(t=bt(t))instanceof Error?t:2/(Math.exp(t)+Math.exp(-t))}function Do(t,e,n,r){if(kt(t=bt(t),e=bt(e),n=bt(n),r=Ct(r)))return mt;let o=r[0]*Math.pow(t,e);for(let i=1;ie}function Xo(t,e){if(2!==arguments.length)return Et;Ut(t,e)?(t=Mt(t),e=Mt(e)):(t=bt(t),e=bt(e));return wt(t,e)||t>=e}function $o(t,e){if(2!==arguments.length)return Et;Ut(t,e)?(t=Mt(t),e=Mt(e)):(t=bt(t),e=bt(e));return wt(t,e)||t{if(t instanceof Error)return!1;if(e instanceof Error)t=e;else if("number"==typeof e)t+=e;else if("string"==typeof e){const n=parseFloat(e);!isNaN(n)&&(t+=n)}else if(Array.isArray(e)){const n=ei.apply(null,e);n instanceof Error?t=n:t+=n}}),t}function ni(t,e,n){if(t=Nt(t),n=n?Nt(n):t,t instanceof Error)return t;if(null==e||e instanceof Error)return 0;let r=0;const o="*"===e,i=o?null:Se(e+"");for(let e=0;e0?1:-1)*Math.floor(Math.abs(t)*Math.pow(10,e))/Math.pow(10,e)}function hi(){throw new Error("ASC is not implemented")}function pi(){throw new Error("BAHTTEXT is not implemented")}function di(t){return 0===(t=bt(t))?mt:t instanceof Error?t:String.fromCharCode(t)}function mi(t){return kt(t)?t:(t=t||"").replace(/[\0-\x1F]/g,"")}function gi(t){if(kt(t))return t;let e=(t=t||"").charCodeAt(0);return isNaN(e)&&(e=mt),e}function vi(){const t=Nt(arguments),e=wt.apply(void 0,t);if(e)return e;let n=0;for(;(n=t.indexOf(!0))>-1;)t[n]="TRUE";let r=0;for(;(r=t.indexOf(!1))>-1;)t[r]="FALSE";return t.join("")}const yi=vi;function Ei(){throw new Error("DBCS is not implemented")}function Ti(t,e=2){if(t=bt(t),isNaN(t))return mt;const n={style:"currency",currency:"USD",minimumFractionDigits:e>=0?e:0,maximumFractionDigits:e>=0?e:0},r=(t=Mo(t,e)).toLocaleString("en-US",n);return t<0?"$("+r.slice(2)+")":r}function Ai(t,e){if(2!==arguments.length)return Et;return wt(t,e)||(t=Mt(t))===Mt(e)}function _i(t,e,n){if(arguments.length<2)return Et;t=Mt(t),n=void 0===n?0:n;const r=(e=Mt(e)).indexOf(t,n-1);return-1===r?mt:r+1}function Ri(t,e=2,n=!1){if(t=bt(t),isNaN(t))return mt;if(e=bt(e),isNaN(e))return mt;if(e<0){const n=Math.pow(10,-e);t=Math.round(t/n)*n}else t=t.toFixed(e);if(n)t=t.toString().replace(/,/g,"");else{const e=t.toString().split(".");e[0]=e[0].replace(/\B(?=(\d{3})+$)/g,","),t=e.join(".")}return t}function Ni(t){if(kt(t))return t;let e="";return t&&(t instanceof Array?t.forEach(t=>{""!==e&&(e+="\n"),e+=t.replace(/<(?:.|\n)*?>/gm,"")}):e=t.replace(/<(?:.|\n)*?>/gm,"")),e}function Oi(t,e){return wt(t,e)||(t=Mt(t),(e=bt(e=void 0===e?1:e))instanceof Error||"string"!=typeof t?mt:t.substring(0,e))}function Ii(t){return 0===arguments.length?Tt:t instanceof Error?t:Array.isArray(t)?mt:Mt(t).length}function Si(t){return 1!==arguments.length?mt:kt(t=Mt(t))?t:t.toLowerCase()}function xi(t,e,n){if(null==e)return mt;if(kt(e=bt(e),n=bt(n))||"string"!=typeof t)return n;const r=e-1,o=r+n;return t.substring(r,o)}function bi(t,e,n){return"number"==typeof(t=Dt(t)?t:"")?t:"string"!=typeof t?Et:(e=void 0===e?".":e,n=void 0===n?",":n,Number(t.replace(e,".").replace(n,"")))}function Mi(){throw new Error("PRONETIC is not implemented")}function Ci(t){return kt(t)?t:isNaN(t)&&"number"==typeof t?mt:(t=Mt(t)).replace(/\w\S*/g,t=>t.charAt(0).toUpperCase()+t.substr(1).toLowerCase())}function Li(t,e){if(arguments.length<2)return Et;const n=t.match(new RegExp(e));return n?n[n.length>1?n.length-1:0]:null}function Pi(t,e,n){if(arguments.length<2)return Et;const r=t.match(new RegExp(e));return n?r:!!r}function wi(t,e,n){return arguments.length<3?Et:t.replace(new RegExp(e),n)}function Di(t,e,n,r){return kt(e=bt(e),n=bt(n))||"string"!=typeof t||"string"!=typeof r?mt:t.substr(0,e-1)+r+t.substr(e-1+n)}function ki(t,e){return wt(t,e)||(t=Mt(t),(e=bt(e))instanceof Error?e:new Array(e+1).join(t))}function Ui(t,e){return wt(t,e)||(t=Mt(t),(e=bt(e=void 0===e?1:e))instanceof Error?e:t.substring(t.length-e))}function Fi(t,e,n){let r;return"string"!=typeof t||"string"!=typeof e?mt:(n=void 0===n?0:n,r=e.toLowerCase().indexOf(t.toLowerCase(),n-1)+1,0===r?mt:r)}function ji(t,e){return t.split(e)}function Vi(t,e,n,r){if(arguments.length<3)return Et;if(t&&e){if(void 0===r)return t.split(e).join(n);{if(r=Math.floor(Number(r)),Number.isNaN(r)||r<=0)return mt;let o=0,i=0;for(;o>-1&&t.indexOf(e,o)>-1;)if(o=t.indexOf(e,o+1),i++,o>-1&&i===r)return t.substring(0,o)+n+t.substring(o+e.length);return t}}return t}function Bi(t){return t instanceof Error||"string"==typeof t?t:""}function Gi(t,e){if(void 0===t||void 0===e)return Et;const n=e.startsWith("$")?"$":"",r=e.endsWith("%");return r&&(t*=100),t=(t=Ri(t,(e=e.replace(/%/g,"").replace(/\$/g,"")).split(".")[1].match(/0/g).length,!e.includes(","))).startsWith("-")?"-"+n+(t=t.replace("-","")):n+t,r&&(t+="%"),t}function Wi(t,e,...n){if("boolean"!=typeof e&&(e=xt(e)),arguments.length<3)return Et;t=null!=t?t:"";let r=Nt(n),o=e?r.filter(t=>t):r;if(Array.isArray(t)){t=Nt(t);let e=o.map(t=>[t]),n=0;for(let r=0;r=r.length?ki("0",e-r.length)+r:yt}function na(t,e){if(!Xi(t))return yt;const n=t.toString();if(10===n.length&&"1"===n.substring(0,1))return(1073741312+parseInt(n.substring(1),2)).toString(8);const r=parseInt(t,2).toString(8);return void 0===e?r:isNaN(e)?mt:e<0?yt:(e=Math.floor(e))>=r.length?ki("0",e-r.length)+r:yt}function ra(t,e){return kt(t=bt(t),e=bt(e))?mt:t<0||e<0||Math.floor(t)!==t||Math.floor(e)!==e||t>0xffffffffffff||e>0xffffffffffff?yt:t&e}function oa(t,e){return kt(t=bt(t),e=bt(e))?mt:t<0||Math.floor(t)!==t||t>0xffffffffffff||Math.abs(e)>53?yt:e>=0?t<>-e}function ia(t,e){return kt(t=bt(t),e=bt(e))?mt:t<0||e<0||Math.floor(t)!==t||Math.floor(e)!==e||t>0xffffffffffff||e>0xffffffffffff?yt:t|e}function aa(t,e){return kt(t=bt(t),e=bt(e))?mt:t<0||Math.floor(t)!==t||t>0xffffffffffff||Math.abs(e)>53?yt:e>=0?t>>e:t<<-e}function sa(t,e){return kt(t=bt(t),e=bt(e))?mt:t<0||e<0||Math.floor(t)!==t||Math.floor(e)!==e||t>0xffffffffffff||e>0xffffffffffff?yt:t^e}function ua(t,e,n){if(kt(t=bt(t),e=bt(e)))return t;if("i"!==(n=void 0===n?"i":n)&&"j"!==n)return mt;if(0===t&&0===e)return 0;if(0===t)return 1===e?n:e.toString()+n;if(0===e)return t.toString();{const r=e>0?"+":"";return t.toString()+r+(1===e?n:e.toString()+n)}}function ca(t,e,n){if((t=bt(t))instanceof Error)return t;const r=[["a.u. of action","?",null,"action",!1,!1,105457168181818e-48],["a.u. of charge","e",null,"electric_charge",!1,!1,160217653141414e-33],["a.u. of energy","Eh",null,"energy",!1,!1,435974417757576e-32],["a.u. of length","a?",null,"length",!1,!1,529177210818182e-25],["a.u. of mass","m?",null,"mass",!1,!1,910938261616162e-45],["a.u. of time","?/Eh",null,"time",!1,!1,241888432650516e-31],["admiralty knot","admkn",null,"speed",!1,!0,.514773333],["ampere","A",null,"electric_current",!0,!1,1],["ampere per meter","A/m",null,"magnetic_field_intensity",!0,!1,1],["ångström","Å",["ang"],"length",!1,!0,1e-10],["are","ar",null,"area",!1,!0,100],["astronomical unit","ua",null,"length",!1,!1,149597870691667e-25],["bar","bar",null,"pressure",!1,!1,1e5],["barn","b",null,"area",!1,!1,1e-28],["becquerel","Bq",null,"radioactivity",!0,!1,1],["bit","bit",["b"],"information",!1,!0,1],["btu","BTU",["btu"],"energy",!1,!0,1055.05585262],["byte","byte",null,"information",!1,!0,8],["candela","cd",null,"luminous_intensity",!0,!1,1],["candela per square metre","cd/m?",null,"luminance",!0,!1,1],["coulomb","C",null,"electric_charge",!0,!1,1],["cubic ångström","ang3",["ang^3"],"volume",!1,!0,1e-30],["cubic foot","ft3",["ft^3"],"volume",!1,!0,.028316846592],["cubic inch","in3",["in^3"],"volume",!1,!0,16387064e-12],["cubic light-year","ly3",["ly^3"],"volume",!1,!0,846786664623715e-61],["cubic metre","m?",null,"volume",!0,!0,1],["cubic mile","mi3",["mi^3"],"volume",!1,!0,4168181825.44058],["cubic nautical mile","Nmi3",["Nmi^3"],"volume",!1,!0,6352182208],["cubic Pica","Pica3",["Picapt3","Pica^3","Picapt^3"],"volume",!1,!0,7.58660370370369e-8],["cubic yard","yd3",["yd^3"],"volume",!1,!0,.764554857984],["cup","cup",null,"volume",!1,!0,.0002365882365],["dalton","Da",["u"],"mass",!1,!1,166053886282828e-41],["day","d",["day"],"time",!1,!0,86400],["degree","°",null,"angle",!1,!1,.0174532925199433],["degrees Rankine","Rank",null,"temperature",!1,!0,.555555555555556],["dyne","dyn",["dy"],"force",!1,!0,1e-5],["electronvolt","eV",["ev"],"energy",!1,!0,1.60217656514141],["ell","ell",null,"length",!1,!0,1.143],["erg","erg",["e"],"energy",!1,!0,1e-7],["farad","F",null,"electric_capacitance",!0,!1,1],["fluid ounce","oz",null,"volume",!1,!0,295735295625e-16],["foot","ft",null,"length",!1,!0,.3048],["foot-pound","flb",null,"energy",!1,!0,1.3558179483314],["gal","Gal",null,"acceleration",!1,!1,.01],["gallon","gal",null,"volume",!1,!0,.003785411784],["gauss","G",["ga"],"magnetic_flux_density",!1,!0,1],["grain","grain",null,"mass",!1,!0,647989e-10],["gram","g",null,"mass",!1,!0,.001],["gray","Gy",null,"absorbed_dose",!0,!1,1],["gross registered ton","GRT",["regton"],"volume",!1,!0,2.8316846592],["hectare","ha",null,"area",!1,!0,1e4],["henry","H",null,"inductance",!0,!1,1],["hertz","Hz",null,"frequency",!0,!1,1],["horsepower","HP",["h"],"power",!1,!0,745.69987158227],["horsepower-hour","HPh",["hh","hph"],"energy",!1,!0,2684519.538],["hour","h",["hr"],"time",!1,!0,3600],["imperial gallon (U.K.)","uk_gal",null,"volume",!1,!0,.00454609],["imperial hundredweight","lcwt",["uk_cwt","hweight"],"mass",!1,!0,50.802345],["imperial quart (U.K)","uk_qt",null,"volume",!1,!0,.0011365225],["imperial ton","brton",["uk_ton","LTON"],"mass",!1,!0,1016.046909],["inch","in",null,"length",!1,!0,.0254],["international acre","uk_acre",null,"area",!1,!0,4046.8564224],["IT calorie","cal",null,"energy",!1,!0,4.1868],["joule","J",null,"energy",!0,!0,1],["katal","kat",null,"catalytic_activity",!0,!1,1],["kelvin","K",["kel"],"temperature",!0,!0,1],["kilogram","kg",null,"mass",!0,!0,1],["knot","kn",null,"speed",!1,!0,.514444444444444],["light-year","ly",null,"length",!1,!0,9460730472580800],["litre","L",["l","lt"],"volume",!1,!0,.001],["lumen","lm",null,"luminous_flux",!0,!1,1],["lux","lx",null,"illuminance",!0,!1,1],["maxwell","Mx",null,"magnetic_flux",!1,!1,1e-18],["measurement ton","MTON",null,"volume",!1,!0,1.13267386368],["meter per hour","m/h",["m/hr"],"speed",!1,!0,.00027777777777778],["meter per second","m/s",["m/sec"],"speed",!0,!0,1],["meter per second squared","m?s??",null,"acceleration",!0,!1,1],["parsec","pc",["parsec"],"length",!1,!0,0x6da012f958ee1c],["meter squared per second","m?/s",null,"kinematic_viscosity",!0,!1,1],["metre","m",null,"length",!0,!0,1],["miles per hour","mph",null,"speed",!1,!0,.44704],["millimetre of mercury","mmHg",null,"pressure",!1,!1,133.322],["minute","?",null,"angle",!1,!1,.000290888208665722],["minute","min",["mn"],"time",!1,!0,60],["modern teaspoon","tspm",null,"volume",!1,!0,5e-6],["mole","mol",null,"amount_of_substance",!0,!1,1],["morgen","Morgen",null,"area",!1,!0,2500],["n.u. of action","?",null,"action",!1,!1,105457168181818e-48],["n.u. of mass","m?",null,"mass",!1,!1,910938261616162e-45],["n.u. of speed","c?",null,"speed",!1,!1,299792458],["n.u. of time","?/(me?c??)",null,"time",!1,!1,128808866778687e-35],["nautical mile","M",["Nmi"],"length",!1,!0,1852],["newton","N",null,"force",!0,!0,1],["œrsted","Oe ",null,"magnetic_field_intensity",!1,!1,79.5774715459477],["ohm","Ω",null,"electric_resistance",!0,!1,1],["ounce mass","ozm",null,"mass",!1,!0,.028349523125],["pascal","Pa",null,"pressure",!0,!1,1],["pascal second","Pa?s",null,"dynamic_viscosity",!0,!1,1],["pferdestärke","PS",null,"power",!1,!0,735.49875],["phot","ph",null,"illuminance",!1,!1,1e-4],["pica (1/6 inch)","pica",null,"length",!1,!0,.00035277777777778],["pica (1/72 inch)","Pica",["Picapt"],"length",!1,!0,.00423333333333333],["poise","P",null,"dynamic_viscosity",!1,!1,.1],["pond","pond",null,"force",!1,!0,.00980665],["pound force","lbf",null,"force",!1,!0,4.4482216152605],["pound mass","lbm",null,"mass",!1,!0,.45359237],["quart","qt",null,"volume",!1,!0,.000946352946],["radian","rad",null,"angle",!0,!1,1],["second","?",null,"angle",!1,!1,484813681109536e-20],["second","s",["sec"],"time",!0,!0,1],["short hundredweight","cwt",["shweight"],"mass",!1,!0,45.359237],["siemens","S",null,"electrical_conductance",!0,!1,1],["sievert","Sv",null,"equivalent_dose",!0,!1,1],["slug","sg",null,"mass",!1,!0,14.59390294],["square ångström","ang2",["ang^2"],"area",!1,!0,1e-20],["square foot","ft2",["ft^2"],"area",!1,!0,.09290304],["square inch","in2",["in^2"],"area",!1,!0,64516e-8],["square light-year","ly2",["ly^2"],"area",!1,!0,895054210748189e17],["square meter","m?",null,"area",!0,!0,1],["square mile","mi2",["mi^2"],"area",!1,!0,2589988.110336],["square nautical mile","Nmi2",["Nmi^2"],"area",!1,!0,3429904],["square Pica","Pica2",["Picapt2","Pica^2","Picapt^2"],"area",!1,!0,1792111111111e-17],["square yard","yd2",["yd^2"],"area",!1,!0,.83612736],["statute mile","mi",null,"length",!1,!0,1609.344],["steradian","sr",null,"solid_angle",!0,!1,1],["stilb","sb",null,"luminance",!1,!1,1e-4],["stokes","St",null,"kinematic_viscosity",!1,!1,1e-4],["stone","stone",null,"mass",!1,!0,6.35029318],["tablespoon","tbs",null,"volume",!1,!0,147868e-10],["teaspoon","tsp",null,"volume",!1,!0,492892e-11],["tesla","T",null,"magnetic_flux_density",!0,!0,1],["thermodynamic calorie","c",null,"energy",!1,!0,4.184],["ton","ton",null,"mass",!1,!0,907.18474],["tonne","t",null,"mass",!1,!1,1e3],["U.K. pint","uk_pt",null,"volume",!1,!0,.00056826125],["U.S. bushel","bushel",null,"volume",!1,!0,.03523907],["U.S. oil barrel","barrel",null,"volume",!1,!0,.158987295],["U.S. pint","pt",["us_pt"],"volume",!1,!0,.000473176473],["U.S. survey mile","survey_mi",null,"length",!1,!0,1609.347219],["U.S. survey/statute acre","us_acre",null,"area",!1,!0,4046.87261],["volt","V",null,"voltage",!0,!1,1],["watt","W",null,"power",!0,!0,1],["watt-hour","Wh",["wh"],"energy",!1,!0,3600],["weber","Wb",null,"magnetic_flux",!0,!1,1],["yard","yd",null,"length",!1,!0,.9144],["year","yr",null,"time",!1,!0,31557600]],o={Yi:["yobi",80,12089258196146292e8,"Yi","yotta"],Zi:["zebi",70,11805916207174113e5,"Zi","zetta"],Ei:["exbi",60,0x1000000000000000,"Ei","exa"],Pi:["pebi",50,0x4000000000000,"Pi","peta"],Ti:["tebi",40,1099511627776,"Ti","tera"],Gi:["gibi",30,1073741824,"Gi","giga"],Mi:["mebi",20,1048576,"Mi","mega"],ki:["kibi",10,1024,"ki","kilo"]},i={Y:["yotta",1e24,"Y"],Z:["zetta",1e21,"Z"],E:["exa",1e18,"E"],P:["peta",1e15,"P"],T:["tera",1e12,"T"],G:["giga",1e9,"G"],M:["mega",1e6,"M"],k:["kilo",1e3,"k"],h:["hecto",100,"h"],e:["dekao",10,"e"],d:["deci",.1,"d"],c:["centi",.01,"c"],m:["milli",.001,"m"],u:["micro",1e-6,"u"],n:["nano",1e-9,"n"],p:["pico",1e-12,"p"],f:["femto",1e-15,"f"],a:["atto",1e-18,"a"],z:["zepto",1e-21,"z"],y:["yocto",1e-24,"y"]};let a,s=null,u=null,c=e,l=n,f=1,h=1;for(let t=0;t=0)&&(s=r[t]),(r[t][1]===l||a.indexOf(l)>=0)&&(u=r[t]);if(null===s){const t=o[e.substring(0,2)];let n=i[e.substring(0,1)];"da"===e.substring(0,2)&&(n=["dekao",10,"da"]),t?(f=t[2],c=e.substring(2)):n&&(f=n[1],c=e.substring(n[2].length));for(let t=0;t=0)&&(s=r[t])}if(null===u){const t=o[n.substring(0,2)];let e=i[n.substring(0,1)];"da"===n.substring(0,2)&&(e=["dekao",10,"da"]),t?(h=t[2],l=n.substring(2)):e&&(h=e[1],l=n.substring(e[2].length));for(let t=0;t=0)&&(u=r[t])}return null===s||null===u||s[3]!==u[3]?Et:t*s[6]*f/(u[6]*h)}function la(t,e){if((t=bt(t))instanceof Error)return t;if(!/^-?[0-9]{1,3}$/.test(t)||t<-512||t>511)return yt;if(t<0)return"1"+ki("0",9-(512+t).toString(2).length)+(512+t).toString(2);const n=parseInt(t,10).toString(2);return void 0===e?n:isNaN(e)?mt:e<0?yt:(e=Math.floor(e))>=n.length?ki("0",e-n.length)+n:yt}function fa(t,e){if((t=bt(t))instanceof Error)return t;if(!/^-?[0-9]{1,12}$/.test(t)||t<-549755813888||t>549755813887)return yt;if(t<0)return(1099511627776+t).toString(16);const n=parseInt(t,10).toString(16);return void 0===e?n:isNaN(e)?mt:e<0?yt:(e=Math.floor(e))>=n.length?ki("0",e-n.length)+n:yt}function ha(t,e){if((t=bt(t))instanceof Error)return t;if(!/^-?[0-9]{1,9}$/.test(t)||t<-536870912||t>536870911)return yt;if(t<0)return(1073741824+t).toString(8);const n=parseInt(t,10).toString(8);return void 0===e?n:isNaN(e)?mt:e<0?yt:(e=Math.floor(e))>=n.length?ki("0",e-n.length)+n:yt}function pa(t,e){return e=void 0===e?0:e,kt(t=bt(t),e=bt(e))?mt:t===e?1:0}function da(t,e){return e=void 0===e?0:e,kt(t=bt(t),e=bt(e))?mt:ht.erf(t)}function ma(t){return isNaN(t)?mt:ht.erfc(t)}function ga(t,e){return kt(e=e||0,t=bt(t))?t:t>=e?1:0}function va(t,e){if(!/^[0-9A-Fa-f]{1,10}$/.test(t))return yt;const n=!(10!==t.length||"f"!==t.substring(0,1).toLowerCase()),r=n?parseInt(t,16)-1099511627776:parseInt(t,16);if(r<-512||r>511)return yt;if(n)return"1"+ki("0",9-(512+r).toString(2).length)+(512+r).toString(2);const o=r.toString(2);return void 0===e?o:isNaN(e)?mt:e<0?yt:(e=Math.floor(e))>=o.length?ki("0",e-o.length)+o:yt}function ya(t){if(!/^[0-9A-Fa-f]{1,10}$/.test(t))return yt;const e=parseInt(t,16);return e>=549755813888?e-1099511627776:e}function Ea(t,e){if(!/^[0-9A-Fa-f]{1,10}$/.test(t))return yt;const n=parseInt(t,16);if(n>536870911&&n<0xffe0000000)return yt;if(n>=0xffe0000000)return(n-0xffc0000000).toString(8);const r=n.toString(8);return void 0===e?r:isNaN(e)?mt:e<0?yt:(e=Math.floor(e))>=r.length?ki("0",e-r.length)+r:yt}function Ta(t){const e=wa(t),n=Aa(t);return kt(e,n)?mt:Math.sqrt(Math.pow(e,2)+Math.pow(n,2))}function Aa(t){if(void 0===t||!0===t||!1===t)return mt;if(0===t||"0"===t)return 0;if(["i","j"].indexOf(t)>=0)return 1;let e=(t=(t+="").replace("+i","+1i").replace("-i","-1i").replace("+j","+1j").replace("-j","-1j")).indexOf("+"),n=t.indexOf("-");0===e&&(e=t.indexOf("+",1)),0===n&&(n=t.indexOf("-",1));const r=t.substring(t.length-1,t.length),o="i"===r||"j"===r;return e>=0||n>=0?o?e>=0?isNaN(t.substring(0,e))||isNaN(t.substring(e+1,t.length-1))?yt:Number(t.substring(e+1,t.length-1)):isNaN(t.substring(0,n))||isNaN(t.substring(n+1,t.length-1))?yt:-Number(t.substring(n+1,t.length-1)):yt:o?isNaN(t.substring(0,t.length-1))?yt:t.substring(0,t.length-1):isNaN(t)?yt:0}function _a(t){const e=wa(t),n=Aa(t);return kt(e,n)?mt:0===e&&0===n?dt:0===e&&n>0?Math.PI/2:0===e&&n<0?-Math.PI/2:0===n&&e>0?0:0===n&&e<0?-Math.PI:e>0?Math.atan(n/e):e<0&&n>=0?Math.atan(n/e)+Math.PI:Math.atan(n/e)-Math.PI}function Ra(t){const e=wa(t),n=Aa(t);if(kt(e,n))return mt;let r=t.substring(t.length-1);return r="i"===r||"j"===r?r:"i",0!==n?ua(e,-n,r):t}function Na(t){const e=wa(t),n=Aa(t);if(kt(e,n))return mt;let r=t.substring(t.length-1);return r="i"===r||"j"===r?r:"i",ua(Math.cos(e)*(Math.exp(n)+Math.exp(-n))/2,-Math.sin(e)*(Math.exp(n)-Math.exp(-n))/2,r)}function Oa(t){const e=wa(t),n=Aa(t);if(kt(e,n))return mt;let r=t.substring(t.length-1);return r="i"===r||"j"===r?r:"i",ua(Math.cos(n)*(Math.exp(e)+Math.exp(-e))/2,Math.sin(n)*(Math.exp(e)-Math.exp(-e))/2,r)}function Ia(t){return kt(wa(t),Aa(t))?mt:Sa(Na(t),Ua(t))}function Sa(t,e){const n=wa(t),r=Aa(t),o=wa(e),i=Aa(e);if(kt(n,r,o,i))return mt;const a=t.substring(t.length-1),s=e.substring(e.length-1);let u="i";if(("j"===a||"j"===s)&&(u="j"),0===o&&0===i)return yt;const c=o*o+i*i;return ua((n*o+r*i)/c,(r*o-n*i)/c,u)}function xa(t){const e=wa(t),n=Aa(t);if(kt(e,n))return mt;let r=t.substring(t.length-1);r="i"===r||"j"===r?r:"i";const o=Math.exp(e);return ua(o*Math.cos(n),o*Math.sin(n),r)}function ba(t){const e=wa(t),n=Aa(t);if(kt(e,n))return mt;let r=t.substring(t.length-1);return r="i"===r||"j"===r?r:"i",ua(Math.log(Math.sqrt(e*e+n*n)),Math.atan(n/e),r)}function Ma(t){const e=wa(t),n=Aa(t);if(kt(e,n))return mt;let r=t.substring(t.length-1);return r="i"===r||"j"===r?r:"i",ua(Math.log(Math.sqrt(e*e+n*n))/Math.log(10),Math.atan(n/e)/Math.log(10),r)}function Ca(t){const e=wa(t),n=Aa(t);if(kt(e,n))return mt;let r=t.substring(t.length-1);return r="i"===r||"j"===r?r:"i",ua(Math.log(Math.sqrt(e*e+n*n))/Math.log(2),Math.atan(n/e)/Math.log(2),r)}function La(t,e){if(kt(e=bt(e),wa(t),Aa(t)))return mt;let n=t.substring(t.length-1);n="i"===n||"j"===n?n:"i";const r=Math.pow(Ta(t),e),o=_a(t);return ua(r*Math.cos(e*o),r*Math.sin(e*o),n)}function Pa(){let t=arguments[0];if(!arguments.length)return mt;for(let e=1;e=0)return 0;let e=(t+="").indexOf("+"),n=t.indexOf("-");0===e&&(e=t.indexOf("+",1)),0===n&&(n=t.indexOf("-",1));const r=t.substring(t.length-1,t.length),o="i"===r||"j"===r;return e>=0||n>=0?o?e>=0?isNaN(t.substring(0,e))||isNaN(t.substring(e+1,t.length-1))?yt:Number(t.substring(0,e)):isNaN(t.substring(0,n))||isNaN(t.substring(n+1,t.length-1))?yt:Number(t.substring(0,n)):yt:o?isNaN(t.substring(0,t.length-1))?yt:0:isNaN(t)?yt:t}function Da(t){return!0===t||!1===t||kt(wa(t),Aa(t))?mt:Sa("1",Na(t))}function ka(t){return kt(wa(t),Aa(t))?mt:Sa("1",Oa(t))}function Ua(t){const e=wa(t),n=Aa(t);if(kt(e,n))return mt;let r=t.substring(t.length-1);return r="i"===r||"j"===r?r:"i",ua(Math.sin(e)*(Math.exp(n)+Math.exp(-n))/2,Math.cos(e)*(Math.exp(n)-Math.exp(-n))/2,r)}function Fa(t){const e=wa(t),n=Aa(t);if(kt(e,n))return mt;let r=t.substring(t.length-1);return r="i"===r||"j"===r?r:"i",ua(Math.cos(n)*(Math.exp(e)-Math.exp(-e))/2,Math.sin(n)*(Math.exp(e)+Math.exp(-e))/2,r)}function ja(t){if(kt(wa(t),Aa(t)))return mt;let e=t.substring(t.length-1);e="i"===e||"j"===e?e:"i";const n=Math.sqrt(Ta(t)),r=_a(t);return ua(n*Math.cos(r/2),n*Math.sin(r/2),e)}function Va(t){return!0===t||!1===t?mt:kt(wa(t),Aa(t))?yt:Sa("1",Ua(t))}function Ba(t){return!0===t||!1===t?mt:kt(wa(t),Aa(t))?yt:Sa("1",Fa(t))}function Ga(t,e){const n=wa(t),r=Aa(t),o=wa(e),i=Aa(e);if(kt(n,r,o,i))return mt;const a=t.substring(t.length-1),s=e.substring(e.length-1);let u="i";return("j"===a||"j"===s)&&(u="j"),ua(n-o,r-i,u)}function Wa(){if(!arguments.length)return mt;const t=Nt(arguments);let e=t[0];for(let n=1;n511)return yt;if(n)return"1"+ki("0",9-(512+r).toString(2).length)+(512+r).toString(2);const o=r.toString(2);return void 0===e?o:isNaN(e)?mt:e<0?yt:(e=Math.floor(e))>=o.length?ki("0",e-o.length)+o:yt}function qa(t){if(!/^[0-7]{1,10}$/.test(t))return yt;const e=parseInt(t,8);return e>=536870912?e-1073741824:e}function Ka(t,e){if(!/^[0-7]{1,10}$/.test(t))return yt;const n=parseInt(t,8);if(n>=536870912)return"ff"+(n+3221225472).toString(16);const r=n.toString(16);return void 0===e?r:isNaN(e)?mt:e<0?yt:(e=Math.floor(e))>=r.length?ki("0",e-r.length)+r:yt}da.PRECISE=()=>{throw new Error("ERF.PRECISE is not implemented")},ma.PRECISE=()=>{throw new Error("ERFC.PRECISE is not implemented")};const Ha=dn.DIST,Xa=dn.INV,$a=mn.DIST,Za=Gr.MATH,Qa=Gr.PRECISE,Ja=gn.DIST,ts=gn.DIST.RT,es=gn.INV,ns=gn.INV.RT,rs=gn.TEST,os=In.P,is=In.P,as=In.S,ss=mn.INV,us=ma.PRECISE,cs=da.PRECISE,ls=xn.DIST,fs=bn.DIST,hs=bn.DIST.RT,ps=bn.INV,ds=bn.INV.RT,ms=oo.MATH,gs=oo.PRECISE,vs=bn.TEST,ys=wn.DIST,Es=wn.INV,Ts=Dn.PRECISE,As=Vn.DIST,_s=qn.INV,Rs=qn.DIST,Ns=qn.INV,Os=Qn.MULT,Is=Qn.SNGL,Ss=Jn.DIST,xs=ie.INTL,bs=tr.DIST,Ms=tr.INV,Cs=tr.S.DIST,Ls=tr.S.INV,Ps=nr.EXC,ws=nr.INC,Ds=rr.EXC,ks=rr.INC,Us=sr.DIST,Fs=cr.EXC,js=cr.INC,Vs=lr.AVG,Bs=lr.EQ,Gs=pr.P,Ws=vr.P,zs=vr.S,Ys=Ar.DIST,qs=Ar.DIST.RT,Ks=Ar.INV,Hs=Ar.TEST,Xs=Nr.P,$s=Nr.S,Zs=Sr.DIST,Qs=pe.INTL,Js=xr.TEST;function tu(t){const e=[];return Vt(t,t=>{t&&e.push(t)}),e}function eu(t,e){let n=null;return Vt(t,(t,r)=>{if(t[0]===e)return n=r,!1}),null==n?mt:n}function nu(t,e){const n={};for(let e=1;er&&(r=e[t].length);for(let o=1;o{i+=o[t]}),0===r.length?dt:i/r.length}function ou(t,e,n){if(isNaN(e)&&"string"!=typeof e)return mt;const r=nu(t,n);let o=[];if("string"==typeof e){const n=eu(t,e);o=jt(t[n])}else o=jt(t[e]);const i=[];return Vt(r,t=>{i.push(o[t])}),En(i)}function iu(t,e,n){if(isNaN(e)&&"string"!=typeof e)return mt;const r=nu(t,n);let o=[];if("string"==typeof e){const n=eu(t,e);o=jt(t[n])}else o=jt(t[e]);const i=[];return Vt(r,t=>{i.push(o[t])}),Tn(i)}function au(t,e,n){if(isNaN(e)&&"string"!=typeof e)return mt;const r=nu(t,n);let o=[];return o=jt("string"==typeof e?t[eu(t,e)]:t[e]),0===r.length?mt:r.length>1?yt:o[r[0]]}function su(t,e,n){if(isNaN(e)&&"string"!=typeof e)return mt;const r=nu(t,n);let o=[];if("string"==typeof e){const n=eu(t,e);o=jt(t[n])}else o=jt(t[e]);let i=o[r[0]];return Vt(r,t=>{i{i>o[t]&&(i=o[t])}),i}function cu(t,e,n){if(isNaN(e)&&"string"!=typeof e)return mt;const r=nu(t,n);let o=[];if("string"==typeof e){const n=eu(t,e);o=jt(t[n])}else o=jt(t[e]);let i=[];Vt(r,t=>{i.push(o[t])}),i=tu(i);let a=1;return Vt(i,t=>{a*=t}),a}function lu(t,e,n){if(isNaN(e)&&"string"!=typeof e)return mt;const r=nu(t,n);let o=[];if("string"==typeof e){const n=eu(t,e);o=jt(t[n])}else o=jt(t[e]);let i=[];return Vt(r,t=>{i.push(o[t])}),i=tu(i),vr.S(i)}function fu(t,e,n){if(isNaN(e)&&"string"!=typeof e)return mt;const r=nu(t,n);let o=[];if("string"==typeof e){const n=eu(t,e);o=jt(t[n])}else o=jt(t[e]);let i=[];return Vt(r,t=>{i.push(o[t])}),i=tu(i),vr.P(i)}function hu(t,e,n){if(isNaN(e)&&"string"!=typeof e)return mt;const r=nu(t,n);let o=[];if("string"==typeof e){const n=eu(t,e);o=jt(t[n])}else o=jt(t[e]);const i=[];return Vt(r,t=>{i.push(o[t])}),ei(i)}function pu(t,e,n){if(isNaN(e)&&"string"!=typeof e)return mt;const r=nu(t,n);let o=[];if("string"==typeof e){const n=eu(t,e);o=jt(t[n])}else o=jt(t[e]);const i=[];return Vt(r,t=>{i.push(o[t])}),Nr.S(i)}function du(t,e,n){if(isNaN(e)&&"string"!=typeof e)return mt;const r=nu(t,n);let o=[];if("string"==typeof e){const n=eu(t,e);o=jt(t[n])}else o=jt(t[e]);const i=[];return Vt(r,t=>{i.push(o[t])}),Nr.P(i)}function mu(t){return t&&t.getTime&&!isNaN(t.getTime())}function gu(t){return t instanceof Date?t:new Date(t)}function vu(t,e,n,r,o,i,a){return t=gu(t),e=gu(e),n=gu(n),mu(t)&&mu(e)&&mu(n)?r<=0||o<=0||-1===[1,2,4].indexOf(i)||-1===[0,1,2,3,4].indexOf(a)||n<=t?yt:(o=o||0)*r*ve(t,n,a=a||0):mt}function yu(){throw new Error("ACCRINTM is not implemented")}function Eu(){throw new Error("AMORDEGRC is not implemented")}function Tu(){throw new Error("AMORLINC is not implemented")}function Au(){throw new Error("COUPDAYBS is not implemented")}function _u(){throw new Error("COUPDAYS is not implemented")}function Ru(){throw new Error("COUPDAYSNC is not implemented")}function Nu(){throw new Error("COUPNCD is not implemented")}function Ou(){throw new Error("COUPNUM is not implemented")}function Iu(){throw new Error("COUPPCD is not implemented")}function Su(t,e,n,r,o,i){if(kt(t=bt(t),e=bt(e),n=bt(n)))return mt;if(t<=0||e<=0||n<=0)return yt;if(r<1||o<1||r>o)return yt;if(0!==i&&1!==i)return yt;const a=Qu(t,e,n,0,i);let s=0;1===r&&(0===i&&(s=-n),r++);for(let e=r;e<=o;e++)s+=1===i?ku(t,e-2,a,n,1)-a:ku(t,e-1,a,n,0);return s*=t,s}function xu(t,e,n,r,o,i){if(kt(t=bt(t),e=bt(e),n=bt(n)))return mt;if(t<=0||e<=0||n<=0)return yt;if(r<1||o<1||r>o)return yt;if(0!==i&&1!==i)return yt;const a=Qu(t,e,n,0,i);let s=0;1===r&&(s=0===i?a+n*t:a,r++);for(let e=r;e<=o;e++)s+=i>0?a-(ku(t,e-2,a,n,1)-a)*t:a-ku(t,e-1,a,n,0)*t;return s}function bu(t,e,n,r,o){if(o=void 0===o?12:o,kt(t=bt(t),e=bt(e),n=bt(n),r=bt(r),o=bt(o)))return mt;if(t<0||e<0||n<0||r<0)return yt;if(-1===[1,2,3,4,5,6,7,8,9,10,11,12].indexOf(o))return yt;if(r>n)return yt;if(e>=t)return 0;const i=(1-Math.pow(e/t,1/n)).toFixed(3),a=t*i*o/12;let s=a,u=0;const c=r===n?n-1:r;for(let e=2;e<=c;e++)u=(t-s)*i,s+=u;return 1===r?a:r===n?(t-s)*i:u}function Mu(t,e,n,r,o){if(o=void 0===o?2:o,kt(t=bt(t),e=bt(e),n=bt(n),r=bt(r),o=bt(o)))return mt;if(t<0||e<0||n<0||r<0||o<=0)return yt;if(r>n)return yt;if(e>=t)return 0;let i=0,a=0;for(let s=1;s<=r;s++)a=Math.min(o/n*(t-i),t-e-i),i+=a;return a}function Cu(){throw new Error("DISC is not implemented")}function Lu(t,e){if(kt(t=bt(t),e=bt(e)))return mt;if(e<0)return yt;if(e>=0&&e<1)return dt;e=parseInt(e,10);let n=parseInt(t,10);n+=t%1*Math.pow(10,Math.ceil(Math.log(e)/Math.LN10))/e;const r=Math.pow(10,Math.ceil(Math.log(e)/Math.LN2)+1);return n=Math.round(n*r)/r,n}function Pu(t,e){if(kt(t=bt(t),e=bt(e)))return mt;if(e<0)return yt;if(e>=0&&e<1)return dt;e=parseInt(e,10);let n=parseInt(t,10);return n+=t%1*Math.pow(10,-Math.ceil(Math.log(e)/Math.LN10))*e,n}function wu(){throw new Error("DURATION is not implemented")}function Du(t,e){return kt(t=bt(t),e=bt(e))?mt:t<=0||e<1?yt:(e=parseInt(e,10),Math.pow(1+t/e,e)-1)}function ku(t,e,n,r,o){if(r=r||0,o=o||0,kt(t=bt(t),e=bt(e),n=bt(n),r=bt(r),o=bt(o)))return mt;let i;if(0===t)i=r+n*e;else{const a=Math.pow(1+t,e);i=1===o?r*a+n*(1+t)*(a-1)/t:r*a+n*(a-1)/t}return-i}function Uu(t,e){if(kt(t=bt(t),e=Ct(Nt(e))))return mt;const n=e.length;let r=t;for(let t=0;t{const r=n+1;let o=t[0];for(let n=1;n{const r=n+1;let o=0;for(let n=1;n0&&(i=!0),t[e]<0&&(a=!0);if(!i||!a)return yt;let s,u,c,l=e=void 0===e?.1:e,f=!0;do{c=n(t,o,l),s=l-c/r(t,o,l),u=Math.abs(s-l),l=s,f=u>1e-10&&Math.abs(c)>1e-10}while(f);return l}function Bu(t,e,n,r){return kt(t=bt(t),e=bt(e),n=bt(n),r=bt(r))?mt:r*t*(e/n-1)}function Gu(){throw new Error("MDURATION is not implemented")}function Wu(t,e,n){if(kt(t=Ct(Nt(t)),e=bt(e),n=bt(n)))return mt;const r=t.length,o=[],i=[];for(let e=0;en?yt:(t-e)*(n-(r=parseInt(r,10))+1)*2/(n*(n+1))}function cc(t,e,n){return kt(t=Lt(t),e=Lt(e),n=bt(n))?mt:n<=0||t>e||e-t>31536e6?yt:365*n/(360-n*Zt(t,e,!1))}function lc(t,e,n){return kt(t=Lt(t),e=Lt(e),n=bt(n))?mt:n<=0||t>e||e-t>31536e6?yt:100*(1-n*Zt(t,e,!1)/360)}function fc(t,e,n){return kt(t=Lt(t),e=Lt(e),n=bt(n))?mt:n<=0||t>e||e-t>31536e6?yt:360*(100-n)/(n*Zt(t,e,!1))}function hc(){throw new Error("VDB is not implemented")}function pc(t,e,n){if(kt(t=Ct(Nt(t)),e=Pt(Nt(e)),n=bt(n)))return mt;const r=(t,e,n)=>{const r=n+1;let o=t[0];for(let n=1;n{const r=n+1;let o=0;for(let n=1;n0&&(i=!0),t[e]<0&&(a=!0);if(!i||!a)return yt;let s,u,c,l=n=n||.1,f=!0;do{c=r(t,e,l),s=l-c/o(t,e,l),u=Math.abs(s-l),l=s,f=u>1e-10&&Math.abs(c)>1e-10}while(f);return l}function dc(t,e,n){if(kt(t=bt(t),e=Ct(Nt(e)),n=Pt(Nt(n))))return mt;let r=0;for(let o=0;o=2)||e)&&(e=0),null==(n=3===arguments.length&&n)&&(n=0),t?e:n)}function Ac(){for(let t=0;t0){const e=arguments[0],n=arguments.length-1,r=Math.floor(n/2);let o=!1;const i=n%2!=0,a=n%2==0?null:arguments[arguments.length-1];if(r)for(let n=0;n"number"==typeof t)}class wc{constructor(t){this.context=t}getFunction(t){const e=t.toUpperCase();try{const{Calx:t}=n(3475);if(t.formulae&&t.formulae[e])return t.formulae[e]}catch(t){}if("SEQUENCE"===e)return this.sequenceFunction.bind(this);if("SORT"===e)return this.sortFunction.bind(this);if("FILTER"===e)return this.filterFunction.bind(this);if("UNIQUE"===e)return this.uniqueFunction.bind(this);let o=r[e];return o&&"object"==typeof o&&!Array.isArray(o)&&("function"==typeof o.S?o=o.S:"function"==typeof o.P&&(o=o.P)),"function"==typeof o?o:void 0}sequenceFunction(t,e=1,n=1,r=1){const o=[];let i=n;for(let n=0;nt[0]):o}sortFunction(t,e=1,n=1,r=!1){let o;o=Array.isArray(t)?Array.isArray(t[0])?t:t.map(t=>[t]):[[t]];const i=o.map(t=>[...t]);if(!r){const t=e-1;i.sort((e,r)=>{const o=e[t],i=r[t];return null==o&&null==i?0:null==o?1===n?1:-1:null==i||oi?1===n?1:-1:0})}return Array.isArray(t[0])?i:i.map(t=>t[0])}filterFunction(t,e,n="#N/A"){let r,o;r=Array.isArray(t)?Array.isArray(t[0])?t:t.map(t=>[t]):[[t]],o=Array.isArray(e)?Array.isArray(e[0])?e.map(t=>t[0]):e:[e];const i=r.filter((t,e)=>{const n=o[e];return!1!==n&&0!==n&&null!=n});return 0===i.length?n:Array.isArray(t[0])?i:i.map(t=>t[0])}uniqueFunction(t,e=!1,n=!1){let r,o=!1;Array.isArray(t)?Array.isArray(t[0])?r=t:(r=t.map(t=>[t]),o=!0):(r=[[t]],o=!0);const i=[],a=new Map;for(const t of r){const e=JSON.stringify(t),n=a.get(e)||0;a.set(e,n+1),0===n&&i.push(t)}if(n){const t=i.filter(t=>{const e=JSON.stringify(t);return 1===a.get(e)});return 0===t.length?"#N/A":o?t.map(t=>t[0]):t}return o?i.map(t=>t[0]):i}callFunction(t,e){const n=this.getFunction(t);if(!n)throw new Error(`Function ${t} not found`);try{let r=n(...e.map(t=>this.convertArg(t)));if(r instanceof Date){const t=new Date(1899,11,30).getTime(),e=864e5;r=Math.floor((r.getTime()-t)/e)}return Array.isArray(r)&&this.isDynamicArrayFunction(t)?r.length>0&&Array.isArray(r[0])?Z.from2DArray(r):Z.fromVerticalArray(r):r&&"object"==typeof r&&r.error?"#ERROR!":r}catch(e){return console.error(`Error calling function ${t}:`,e),"#ERROR!"}}isDynamicArrayFunction(t){return["SEQUENCE","SORT","UNIQUE","FILTER","RANDARRAY","SORTBY","XLOOKUP","XMATCH"].includes(t.toUpperCase())}convertArg(t){if(null==t)return t;if(Array.isArray(t))return t.map(t=>this.convertArg(t));if(t&&"object"==typeof t&&"function"==typeof t.toArray){const e=t.toArray();return 1===e.length?e[0]:e}return t&&"object"==typeof t&&"value"in t?t.value:t}getAvailableFunctions(){return Object.keys(r).filter(t=>"function"==typeof r[t])}hasFunction(t){return void 0!==this.getFunction(t)}}class Dc{constructor(t){this.sheets={},Object.assign(this,t),this._formulaJSWrapper=new wc(this)}setActiveSheet(t){this.activeSheet=t}setWorkbook(t){this.workbook=t}addSheet(t){this.sheets[t.id]=t}callFunction(t,e){return this._formulaJSWrapper?this._formulaJSWrapper.callFunction(t,e):"#NAME?"}getFunction(t){if(this._formulaJSWrapper)return this._formulaJSWrapper.getFunction(t)}getVariable(t,e){const n=e?this.sheets[e]:this.activeSheet;return n?n.getVariable(t):"#NAME?"}getCellValue(t,e){let n=this.activeSheet;return e&&(n=this.sheets[e]||Object.values(this.sheets).find(t=>t.name===e)),n?n.getCellValue(t):"#REF!"}getCellRange(t,e){const n=e?this.sheets[e]:this.activeSheet;if(n){const[e,r]=t.split(":");return n.getCellRangeValues(e,r)}return[]}getRowRange(t,e){const n=e?this.sheets[e]:this.activeSheet;return n?n.getRowRangeValues(t):[]}getColumnRange(t,e){const n=e?this.sheets[e]:this.activeSheet;return n?n.getColumnRangeValues(t):[]}getNamedRange(t){return this.workbook?this.workbook.nameManager.resolve(t):"#NAME?"}}function kc(t){var e="";for(t=Math.round(t-1);t>=0;)e=String.fromCharCode(t%26+97)+e,t=Math.floor(t/26)-1;return e.toUpperCase()}function Uc(t){const e=t.toUpperCase().split(""),n="ABCDEFGHIJKLMNOPQRSTUVWXYZ".split("");let r,o,i=0;for(r=0,o=e.length-1;r0;)1&e&&(n+=t),e>>=1,t+=t;return n}function Bc(t,e,n){if(null==t)return"";if(e=~~e,null==n)return Vc(String(t),e);for(var r=[];e>0;r[--e]=t);return r.join(n)}function Gc(t){return t.reduce(function(t,e){return t.indexOf(e)<0&&t.push(e),t},[])}function Wc(t,e,n){return Array.prototype.slice.call(t,0,Math.max(0,t.length-(null==e||n?1:e)))}function zc(t,e,n){return Array.prototype.slice.call(t,null==e||n?1:e)}function Yc(t){let e=[];for(let n=0;n0&&(n=t[e[0]])}n&&this._workbook.setActiveSheet(n);const r=e.reference.startsWith("=")?e.reference:`=${e.reference}`;return this._workbook.parser.parse(r)}has(t){return t in this._nameRegistry}getAll(){return Object.values(this._nameRegistry)}get(t){return this._nameRegistry[t]}remove(t){return t in this._nameRegistry&&(delete this._nameRegistry[t],!0)}clear(){this._nameRegistry={}}}const Qc={equal:(t,e)=>"string"==typeof t?t.toLowerCase()==(""+e).toLowerCase():t==e,notEqual:(t,e)=>"string"==typeof t?t.toLowerCase()!=(""+e).toLowerCase():t!=e,lessThan:(t,e)=>tt>e,lessEqualThan:(t,e)=>t<=e,greaterEqualThan:(t,e)=>t>=e};function Jc(t){const e=new J;return e.setContext(t),e}class tl{constructor(t,e,n){this._autoCalculate=!0,this._sheets={},this._parser=t,this._dispatcher=n,this._nameManager=e,this._nameManager.setContext(this)}get parser(){return this._parser}get dispatcher(){return this._dispatcher}get nameManager(){return this._nameManager}get autoCalculate(){return this._autoCalculate}set autoCalculate(t){this._autoCalculate=t;for(const e in this._sheets)this._sheets[e].autoCalculate=t}setActiveSheet(t){if(this._parser){const e=this._parser.getContext();e&&(e.activeSheet=t,e.setActiveSheet(t))}}getActiveSheet(){var t;return null===(t=this._parser.yy)||void 0===t?void 0:t.activeSheet}isValidCellAddress(t){return t.match(/^[A-Z]+\d+$/)}calculate(){this._deps||this.build();for(const t in this._sheets)this._sheets[t].calculate()}build(){this._depsBuilder=new ct.B;for(const t in this._sheets)this._sheets[t].buildDependencyTree()}hydrateObj(t){for(const e in t)if("object"==typeof t[e])this.hydrateObj(t[e]);else if("string"==typeof t[e]&&t[e].startsWith("#")){const[n,r]=t[e].split("!");n in this._sheets&&(t[e]=this._sheets[n].getCell(r).value)}}createSheet(t,e){if(!t)throw new Error("Sheet should have a name");if(this._sheets[t])throw new Error(`Sheet with the name "${t}" is already exists`);const n=new lt(this,t);return n.autoCalculate=this._autoCalculate,e&&(n.element=e),this._sheets[t]=n,this._parser&&this._parser.yy&&(this._parser.yy.sheets[t]=n),n}getSheets(){return this._sheets}getSheet(t){if(t in this._sheets)return this._sheets[t];throw Error(`Sheet not found with name ${t}`)}loadData(t){var e;for(const n in t.sheets){const r=this.createSheet(n,null===(e=t.sheets[n])||void 0===e?void 0:e.element);for(const e in t.sheets[n].cells){const o=t.sheets[n].cells[e];r.createCell(e,o)}}}static createFromData(t){const e=new Dc({sheets:{},utility:o,comparator:Qc}),n=Jc(e),r=new rt.Q,i=new Zc,a=new tl(n,i,r);return e.workbook=a,a.loadData(t),a}static createFromElement(t,e){const n=Jc(new Dc({sheets:{},utility:o,comparator:null})),r=new rt.Q,i=new Zc,a=new tl(n,i,r);return e&&a.loadData(e),a}}class el{static setFormula(t,e){el.formulae[t]=e}static setFormulae(t){el.formulae=Object.assign(Object.assign({},el.formulae),t)}static createWorkbook(){return el.createWorkbookFromData({sheets:{}})}static createWorkbookFromData(t){return tl.createFromData(t)}static createWorkbookFromElement(t,e){return tl.createFromElement(t,e)}static createParser(){return new X}static createInterpreter(){return new J}}el.formulae={}},3488:t=>{t.exports=function(t){return t}},3598:function(t,e,n){"use strict";var r=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0}),e.getProductionDslName=e.isBranchingProd=e.isOptionalProd=e.isSequenceProd=void 0;var o=r(n(2426)),i=r(n(9747)),a=r(n(9859)),s=n(8538);e.isSequenceProd=function(t){return t instanceof s.Alternative||t instanceof s.Option||t instanceof s.Repetition||t instanceof s.RepetitionMandatory||t instanceof s.RepetitionMandatoryWithSeparator||t instanceof s.RepetitionWithSeparator||t instanceof s.Terminal||t instanceof s.Rule},e.isOptionalProd=function t(e,n){return void 0===n&&(n=[]),!!(e instanceof s.Option||e instanceof s.Repetition||e instanceof s.RepetitionWithSeparator)||(e instanceof s.Alternation?(0,o.default)(e.definition,function(e){return t(e,n)}):!(e instanceof s.NonTerminal&&(0,a.default)(n,e))&&e instanceof s.AbstractProduction&&(e instanceof s.NonTerminal&&n.push(e),(0,i.default)(e.definition,function(e){return t(e,n)})))},e.isBranchingProd=function(t){return t instanceof s.Alternation},e.getProductionDslName=function(t){if(t instanceof s.NonTerminal)return"SUBRULE";if(t instanceof s.Option)return"OPTION";if(t instanceof s.Alternation)return"OR";if(t instanceof s.RepetitionMandatory)return"AT_LEAST_ONE";if(t instanceof s.RepetitionMandatoryWithSeparator)return"AT_LEAST_ONE_SEP";if(t instanceof s.RepetitionWithSeparator)return"MANY_SEP";if(t instanceof s.Repetition)return"MANY";if(t instanceof s.Terminal)return"CONSUME";throw Error("non exhaustive match")}},3605:t=>{t.exports=function(t){return this.__data__.get(t)}},3650:(t,e,n)=>{var r=n(4335)(Object.keys,Object);t.exports=r},3656:(t,e,n)=>{t=n.nmd(t);var r=n(9325),o=n(9935),i=e&&!e.nodeType&&e,a=i&&t&&!t.nodeType&&t,s=a&&a.exports===i?r.Buffer:void 0,u=(s?s.isBuffer:void 0)||o;t.exports=u},3661:(t,e,n)=>{var r=n(3040),o=n(7670),i=n(289),a=n(4509),s=n(2949);function u(t){var e=-1,n=null==t?0:t.length;for(this.clear();++e{var r=n(1799),o=n(776),i=n(7197);t.exports=function(t){var e=o(t);return 1==e.length&&e[0][2]?i(e[0][0],e[0][1]):function(n){return n===t||r(n,t,e)}}},3673:t=>{t.exports=function(t){for(var e=-1,n=null==t?0:t.length,r=0,o=[];++e{var r=n(4894),o=n(346);t.exports=function(t){return o(t)&&r(t)}},3702:t=>{t.exports=function(){this.__data__=[],this.size=0}},3729:t=>{t.exports=function(t,e){for(var n=-1,r=null==t?0:t.length;++n{var r=n(1873),o=r?r.prototype:void 0,i=o?o.valueOf:void 0;t.exports=function(t){return i?Object(i.call(t)):{}}},3739:(t,e,n)=>{var r=n(5160),o=n(1489);t.exports=function(t,e,n){var i=null==t?0:t.length;return i?(e=n||void 0===e?1:o(e),r(t,e<0?0:e,i)):[]}},3777:(t,e,n)=>{var r=n(909);t.exports=function(t,e){var n=!0;return r(t,function(t,r,o){return n=!!e(t,r,o)}),n}},3805:t=>{t.exports=function(t){var e=typeof t;return null!=t&&("object"==e||"function"==e)}},3838:(t,e,n)=>{var r=n(1791),o=n(7241);t.exports=function(t,e){return t&&r(e,o(e),t)}},3862:t=>{t.exports=function(t){var e=this.has(t)&&delete this.__data__[t];return this.size-=e?1:0,e}},3912:(t,e,n)=>{var r=n(1074),o=n(9698),i=n(2054);t.exports=function(t){return o(t)?i(t):r(t)}},3915:(t,e,n)=>{var r=n(8859),o=n(5325),i=n(9905),a=n(4932),s=n(7301),u=n(9219);t.exports=function(t,e,n,c){var l=-1,f=o,h=!0,p=t.length,d=[],m=e.length;if(!p)return d;n&&(e=a(e,s(n))),c?(f=i,h=!1):e.length>=200&&(f=u,h=!1,e=new r(e));t:for(;++l{t.exports=function(t,e,n,r){for(var o=-1,i=null==t?0:t.length;++o{t.exports=function(){}},4066:(t,e,n)=>{var r=n(3488);t.exports=function(t){return"function"==typeof t?t:r}},4105:(t,e,n)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.GAstVisitor=void 0;var r=n(8538),o=function(){function t(){}return t.prototype.visit=function(t){var e=t;switch(e.constructor){case r.NonTerminal:return this.visitNonTerminal(e);case r.Alternative:return this.visitAlternative(e);case r.Option:return this.visitOption(e);case r.RepetitionMandatory:return this.visitRepetitionMandatory(e);case r.RepetitionMandatoryWithSeparator:return this.visitRepetitionMandatoryWithSeparator(e);case r.RepetitionWithSeparator:return this.visitRepetitionWithSeparator(e);case r.Repetition:return this.visitRepetition(e);case r.Alternation:return this.visitAlternation(e);case r.Terminal:return this.visitTerminal(e);case r.Rule:return this.visitRule(e);default:throw Error("non exhaustive match")}},t.prototype.visitNonTerminal=function(t){},t.prototype.visitAlternative=function(t){},t.prototype.visitOption=function(t){},t.prototype.visitRepetition=function(t){},t.prototype.visitRepetitionMandatory=function(t){},t.prototype.visitRepetitionMandatoryWithSeparator=function(t){},t.prototype.visitRepetitionWithSeparator=function(t){},t.prototype.visitAlternation=function(t){},t.prototype.visitTerminal=function(t){},t.prototype.visitRule=function(t){},t}();e.GAstVisitor=o},4128:(t,e,n)=>{var r=n(1800),o=/^\s+/;t.exports=function(t){return t?t.slice(0,r(t)+1).replace(o,""):t}},4218:t=>{t.exports=function(t){var e=typeof t;return"string"==e||"number"==e||"symbol"==e||"boolean"==e?"__proto__"!==t:null===t}},4247:t=>{t.exports=function(t){var e=-1,n=Array(t.size);return t.forEach(function(t){n[++e]=t}),n}},4248:t=>{t.exports=function(t,e){for(var n=-1,r=null==t?0:t.length;++n{t.exports=function(t,e){return function(n){return t(e(n))}}},4394:(t,e,n)=>{var r=n(2552),o=n(346);t.exports=function(t){return"symbol"==typeof t||o(t)&&"[object Symbol]"==r(t)}},4471:function(t,e,n){"use strict";var r,o=this&&this.__extends||(r=function(t,e){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n])},r(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function n(){this.constructor=t}r(t,e),t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)}),i=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0}),e.nextPossibleTokensAfter=e.possiblePathsFrom=e.NextTerminalAfterAtLeastOneSepWalker=e.NextTerminalAfterAtLeastOneWalker=e.NextTerminalAfterManySepWalker=e.NextTerminalAfterManyWalker=e.AbstractNextTerminalAfterProductionWalker=e.NextAfterTokenWalker=e.AbstractNextPossibleTokensWalker=void 0;var a=n(3131),s=i(n(6170)),u=i(n(2193)),c=i(n(7537)),l=i(n(3739)),f=i(n(8090)),h=i(n(9754)),p=i(n(2629)),d=n(2195),m=n(3387),g=function(t){function e(e,n){var r=t.call(this)||this;return r.topProd=e,r.path=n,r.possibleTokTypes=[],r.nextProductionName="",r.nextProductionOccurrence=0,r.found=!1,r.isAtEndOfPath=!1,r}return o(e,t),e.prototype.startWalking=function(){if(this.found=!1,this.path.ruleStack[0]!==this.topProd.name)throw Error("The path does not start with the walker's top Rule!");return this.ruleStack=(0,p.default)(this.path.ruleStack).reverse(),this.occurrenceStack=(0,p.default)(this.path.occurrenceStack).reverse(),this.ruleStack.pop(),this.occurrenceStack.pop(),this.updateExpectedNext(),this.walk(this.topProd),this.possibleTokTypes},e.prototype.walk=function(e,n){void 0===n&&(n=[]),this.found||t.prototype.walk.call(this,e,n)},e.prototype.walkProdRef=function(t,e,n){if(t.referencedRule.name===this.nextProductionName&&t.idx===this.nextProductionOccurrence){var r=e.concat(n);this.updateExpectedNext(),this.walk(t.referencedRule,r)}},e.prototype.updateExpectedNext=function(){(0,u.default)(this.ruleStack)?(this.nextProductionName="",this.nextProductionOccurrence=0,this.isAtEndOfPath=!0):(this.nextProductionName=this.ruleStack.pop(),this.nextProductionOccurrence=this.occurrenceStack.pop())},e}(a.RestWalker);e.AbstractNextPossibleTokensWalker=g;var v=function(t){function e(e,n){var r=t.call(this,e,n)||this;return r.path=n,r.nextTerminalName="",r.nextTerminalOccurrence=0,r.nextTerminalName=r.path.lastTok.name,r.nextTerminalOccurrence=r.path.lastTokOccurrence,r}return o(e,t),e.prototype.walkTerminal=function(t,e,n){if(this.isAtEndOfPath&&t.terminalType.name===this.nextTerminalName&&t.idx===this.nextTerminalOccurrence&&!this.found){var r=e.concat(n),o=new m.Alternative({definition:r});this.possibleTokTypes=(0,d.first)(o),this.found=!0}},e}(g);e.NextAfterTokenWalker=v;var y=function(t){function e(e,n){var r=t.call(this)||this;return r.topRule=e,r.occurrence=n,r.result={token:void 0,occurrence:void 0,isEndOfRule:void 0},r}return o(e,t),e.prototype.startWalking=function(){return this.walk(this.topRule),this.result},e}(a.RestWalker);e.AbstractNextTerminalAfterProductionWalker=y;var E=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.prototype.walkMany=function(e,n,r){if(e.idx===this.occurrence){var o=(0,s.default)(n.concat(r));this.result.isEndOfRule=void 0===o,o instanceof m.Terminal&&(this.result.token=o.terminalType,this.result.occurrence=o.idx)}else t.prototype.walkMany.call(this,e,n,r)},e}(y);e.NextTerminalAfterManyWalker=E;var T=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.prototype.walkManySep=function(e,n,r){if(e.idx===this.occurrence){var o=(0,s.default)(n.concat(r));this.result.isEndOfRule=void 0===o,o instanceof m.Terminal&&(this.result.token=o.terminalType,this.result.occurrence=o.idx)}else t.prototype.walkManySep.call(this,e,n,r)},e}(y);e.NextTerminalAfterManySepWalker=T;var A=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.prototype.walkAtLeastOne=function(e,n,r){if(e.idx===this.occurrence){var o=(0,s.default)(n.concat(r));this.result.isEndOfRule=void 0===o,o instanceof m.Terminal&&(this.result.token=o.terminalType,this.result.occurrence=o.idx)}else t.prototype.walkAtLeastOne.call(this,e,n,r)},e}(y);e.NextTerminalAfterAtLeastOneWalker=A;var _=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.prototype.walkAtLeastOneSep=function(e,n,r){if(e.idx===this.occurrence){var o=(0,s.default)(n.concat(r));this.result.isEndOfRule=void 0===o,o instanceof m.Terminal&&(this.result.token=o.terminalType,this.result.occurrence=o.idx)}else t.prototype.walkAtLeastOneSep.call(this,e,n,r)},e}(y);function R(t,e,n,r){var o=(0,p.default)(n);o.push(t.name);var i=(0,p.default)(r);return i.push(1),{idx:e,def:t.definition,ruleStack:o,occurrenceStack:i}}e.NextTerminalAfterAtLeastOneSepWalker=_,e.possiblePathsFrom=function t(e,n,r){void 0===r&&(r=[]),r=(0,p.default)(r);var o=[],i=0;function a(a){var s=t(a.concat((0,l.default)(e,i+1)),n,r);return o.concat(s)}for(;r.length=0;w--){var D={idx:T,def:N.definition[w].definition.concat((0,l.default)(E)),ruleStack:A,occurrenceStack:_};v.push(D),v.push(a)}else if(N instanceof m.Alternative)v.push({idx:T,def:N.definition.concat((0,l.default)(E)),ruleStack:A,occurrenceStack:_});else{if(!(N instanceof m.Rule))throw Error("non exhaustive match");v.push(R(N,T,A,_))}}}else s&&(0,f.default)(v).idx<=d&&v.pop()}return g}},4509:(t,e,n)=>{var r=n(2651);t.exports=function(t){return r(this,t).has(t)}},4517:(t,e,n)=>{var r=n(6545),o=n(3950),i=n(4247),a=r&&1/i(new r([,-0]))[1]==1/0?function(t){return new r(t)}:o;t.exports=a},4528:t=>{t.exports=function(t,e){for(var n=-1,r=e.length,o=t.length;++n{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.defineNameProp=void 0,e.defineNameProp=function(t,e){Object.defineProperty(t,"name",{enumerable:!1,configurable:!0,writable:!1,value:e})}},4664:(t,e,n)=>{var r=n(9770),o=n(3345),i=Object.prototype.propertyIsEnumerable,a=Object.getOwnPropertySymbols,s=a?function(t){return null==t?[]:(t=Object(t),r(a(t),function(e){return i.call(t,e)}))}:o;t.exports=s},4684:(t,e,n)=>{var r=n(9302),o=n(5288),i=n(6800),a=n(7241),s=Object.prototype,u=s.hasOwnProperty,c=r(function(t,e){t=Object(t);var n=-1,r=e.length,c=r>2?e[2]:void 0;for(c&&i(e[0],e[1],c)&&(r=1);++n{var r=n(2523),o=n(5389),i=n(1489),a=Math.max;t.exports=function(t,e,n){var s=null==t?0:t.length;if(!s)return-1;var u=null==n?0:i(n);return u<0&&(u=a(s+u,0)),r(t,o(e,3),u)}},4733:(t,e,n)=>{var r=n(1791),o=n(5950);t.exports=function(t,e){return t&&r(e,o(e),t)}},4739:(t,e,n)=>{var r=n(6025);t.exports=function(t){var e=this.__data__,n=r(e,t);return n<0?void 0:e[n][1]}},4809:(t,e)=>{var n;n=function(t){t.version="1.0.2";var e=Math;function n(t,e){for(var n=0,r=0;no)i=r(n,o,u(n),p(n),-1);else{for(var a=!1,s=0,c=0,l=1,f=0,h=2/n,d=2*e.floor((o+e.floor(e.sqrt(40*o)))/2);d>0;d--)f=d*h*l-s,s=l,l=f,e.abs(l)>1e10&&(l*=1e-10,s*=1e-10,i*=1e-10,c*=1e-10),a&&(c+=l),a=!a,d==o&&(i=s);i/=c=2*c-l}return i}}(),E=(i=.636619772,a=[-2957821389,7062834065,-512359803.6,10879881.29,-86327.92757,228.4622733].reverse(),s=[40076544269,745249964.8,7189466.438,47447.2647,226.1030244,1].reverse(),u=[1,-.001098628627,2734510407e-14,-2073370639e-15,2.093887211e-7].reverse(),c=[-.01562499995,.0001430488765,-6911147651e-15,7.621095161e-7,-9.34945152e-8].reverse(),l=[-4900604943e3,127527439e4,-51534381390,734926455.1,-4237922.726,8511.937935].reverse(),f=[249958057e5,424441966400,3733650367,22459040.02,102042.605,354.9632885,1].reverse(),h=[1,.00183105,-3516396496e-14,2457520174e-15,-2.40337019e-7].reverse(),p=[.04687499995,-.0002002690873,8449199096e-15,-8.8228987e-7,1.05787412e-7].reverse(),o(function(t){var r=0,o=0,l=0,f=t*t,h=t-.785398164;return t<8?r=(o=n(a,f))/(l=n(s,f))+i*y(t,0)*e.log(t):(o=n(u,f=64/f),l=n(c,f),r=e.sqrt(i/t)*(e.sin(h)*o+e.cos(h)*l*8/t)),r},function(t){var r=0,o=0,a=0,s=t*t,u=t-2.356194491;return t<8?r=(o=t*n(l,s))/(a=n(f,s))+i*(y(t,1)*e.log(t)-1/t):(o=n(h,s=64/s),a=n(p,s),r=e.sqrt(i/t)*(e.sin(u)*o+e.cos(u)*a*8/t)),r},0,1,-1)),T=(d=[1,3.5156229,3.0899424,1.2067492,.2659732,.0360768,.0045813].reverse(),m=[.39894228,.01328592,.00225319,-.00157565,.00916281,-.02057706,.02635537,-.01647633,.00392377].reverse(),g=[.5,.87890594,.51498869,.15084934,.02658733,.00301532,32411e-8].reverse(),v=[.39894228,-.03988024,-.00362018,.00163801,-.01031555,.02282967,-.02895312,.01787654,-.00420059].reverse(),function t(r,o){if(0===(o=Math.round(o)))return function(t){return t<=3.75?n(d,t*t/14.0625):e.exp(e.abs(t))/e.sqrt(e.abs(t))*n(m,3.75/e.abs(t))}(r);if(1===o)return function(t){return t<3.75?t*n(g,t*t/14.0625):(t<0?-1:1)*e.exp(e.abs(t))/e.sqrt(e.abs(t))*n(v,3.75/e.abs(t))}(r);if(o<0)return NaN;if(0===e.abs(r))return 0;if(r==1/0)return 1/0;var i,a=0,s=2/e.abs(r),u=0,c=1,l=0;for(i=2*e.round((o+e.round(e.sqrt(40*o)))/2);i>0;i--)l=i*s*c+u,u=c,c=l,e.abs(c)>1e10&&(c*=1e-10,u*=1e-10,a*=1e-10),i==o&&(a=u);return a*=t(r,0)/c,r<0&&o%2?-a:a}),A=function(){var t=[-.57721566,.4227842,.23069756,.0348859,.00262698,1075e-7,74e-7].reverse(),r=[1.25331414,-.07832358,.02189568,-.01062446,.00587872,-.0025154,53208e-8].reverse(),i=[1,.15443144,-.67278579,-.18156897,-.01919402,-.00110404,-4686e-8].reverse(),a=[1.25331414,.23498619,-.0365562,.01504268,-.00780353,.00325614,-68245e-8].reverse();return o(function(o){return o<=2?-e.log(o/2)*T(o,0)+n(t,o*o/4):e.exp(-o)/e.sqrt(o)*n(r,2/o)},function(t){return t<=2?e.log(t/2)*T(t,1)+1/t*n(i,t*t/4):e.exp(-t)/e.sqrt(t)*n(a,2/t)},0,2,1)}();t.besselj=y,t.bessely=E,t.besseli=T,t.besselk=A},"undefined"==typeof DO_NOT_EXPORT_BESSEL?n(e):n({})},4840:(t,e,n)=>{var r="object"==typeof n.g&&n.g&&n.g.Object===Object&&n.g;t.exports=r},4894:(t,e,n)=>{var r=n(1882),o=n(294);t.exports=function(t){return null!=t&&o(t.length)&&!r(t)}},4901:(t,e,n)=>{var r=n(2552),o=n(294),i=n(346),a={};a["[object Float32Array]"]=a["[object Float64Array]"]=a["[object Int8Array]"]=a["[object Int16Array]"]=a["[object Int32Array]"]=a["[object Uint8Array]"]=a["[object Uint8ClampedArray]"]=a["[object Uint16Array]"]=a["[object Uint32Array]"]=!0,a["[object Arguments]"]=a["[object Array]"]=a["[object ArrayBuffer]"]=a["[object Boolean]"]=a["[object DataView]"]=a["[object Date]"]=a["[object Error]"]=a["[object Function]"]=a["[object Map]"]=a["[object Number]"]=a["[object Object]"]=a["[object RegExp]"]=a["[object Set]"]=a["[object String]"]=a["[object WeakMap]"]=!1,t.exports=function(t){return i(t)&&o(t.length)&&!!a[r(t)]}},4927:(t,e)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.VERSION=void 0,e.VERSION="10.5.0"},4932:t=>{t.exports=function(t,e){for(var n=-1,r=null==t?0:t.length,o=Array(r);++n{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.IN=void 0,e.IN="_~IN~_"},5015:(t,e,n)=>{var r=n(2552),o=n(6449),i=n(346);t.exports=function(t){return"string"==typeof t||!o(t)&&i(t)&&"[object String]"==r(t)}},5063:function(t,e,n){"use strict";var r,o=this&&this.__extends||(r=function(t,e){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n])},r(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function n(){this.constructor=t}r(t,e),t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)}),i=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0}),e.charCodeToOptimizedIndex=e.minOptimizationVal=e.buildLineBreakIssueMessage=e.LineTerminatorOptimizedTester=e.isShortPattern=e.isCustomPattern=e.cloneEmptyGroups=e.performWarningRuntimeChecks=e.performRuntimeChecks=e.addStickyFlag=e.addStartOfInput=e.findUnreachablePatterns=e.findModesThatDoNotExist=e.findInvalidGroupType=e.findDuplicatePatterns=e.findUnsupportedFlags=e.findStartOfInputAnchor=e.findEmptyMatchRegExps=e.findEndOfInputAnchor=e.findInvalidPatterns=e.findMissingPatterns=e.validatePatterns=e.analyzeTokenTypes=e.enableSticky=e.disableSticky=e.SUPPORT_STICKY=e.MODES=e.DEFAULT_MODE=void 0;var a=n(2475),s=n(127),u=i(n(6170)),c=i(n(2193)),l=i(n(3673)),f=i(n(6449)),h=i(n(5880)),p=i(n(5970)),d=i(n(8081)),m=i(n(6245)),g=i(n(1585)),v=i(n(5378)),y=i(n(9754)),E=i(n(5015)),T=i(n(1882)),A=i(n(2216)),_=i(n(7309)),R=i(n(1448)),N=i(n(5950)),O=i(n(9607)),I=i(n(7612)),S=i(n(4684)),x=i(n(860)),b=i(n(9859)),M=n(8927),C=n(6195),L=n(393),P="PATTERN";function w(t){var e=(0,I.default)(t,function(t){return!(0,R.default)(t,P)});return{errors:(0,v.default)(e,function(t){return{message:"Token Type: ->"+t.name+"<- missing static 'PATTERN' property",type:s.LexerDefinitionErrorType.MISSING_PATTERN,tokenTypes:[t]}}),valid:(0,m.default)(t,e)}}function D(t){var e=(0,I.default)(t,function(t){var e=t[P];return!((0,O.default)(e)||(0,T.default)(e)||(0,R.default)(e,"exec")||(0,E.default)(e))});return{errors:(0,v.default)(e,function(t){return{message:"Token Type: ->"+t.name+"<- static 'PATTERN' can only be a RegExp, a Function matching the {CustomPatternMatcherFunc} type or an Object matching the {ICustomPattern} interface.",type:s.LexerDefinitionErrorType.INVALID_PATTERN,tokenTypes:[t]}}),valid:(0,m.default)(t,e)}}e.DEFAULT_MODE="defaultMode",e.MODES="modes",e.SUPPORT_STICKY="boolean"==typeof new RegExp("(?:)").sticky,e.disableSticky=function(){e.SUPPORT_STICKY=!1},e.enableSticky=function(){e.SUPPORT_STICKY=!0},e.analyzeTokenTypes=function(t,n){var r,o=(n=(0,S.default)(n,{useSticky:e.SUPPORT_STICKY,debug:!1,safeMode:!1,positionTracking:"full",lineTerminatorCharacters:["\r","\n"],tracer:function(t,e){return e()}})).tracer;o("initCharCodeToOptimizedIndexMap",function(){!function(){if((0,c.default)(tt)){tt=new Array(65536);for(var t=0;t<65536;t++)tt[t]=t>255?255+~~(t/255):t}}()}),o("Reject Lexer.NA",function(){r=(0,d.default)(t,function(t){return t[P]===s.Lexer.NA})});var i,a,u,l,h,p,m,_,N,I,L,w=!1;o("Transform Patterns",function(){w=!1,i=(0,v.default)(r,function(t){var e=t[P];if((0,O.default)(e)){var r=e.source;return 1!==r.length||"^"===r||"$"===r||"."===r||e.ignoreCase?2!==r.length||"\\"!==r[0]||(0,b.default)(["d","D","s","S","t","r","n","t","0","c","b","B","f","v","w","W"],r[1])?n.useSticky?K(e):q(e):r[1]:r}if((0,T.default)(e))return w=!0,{exec:e};if("object"==typeof e)return w=!0,e;if("string"==typeof e){if(1===e.length)return e;var o=e.replace(/[\\^$.*+?()[\]{}|]/g,"\\$&"),i=new RegExp(o);return n.useSticky?K(i):q(i)}throw Error("non exhaustive match")})}),o("misc mapping",function(){a=(0,v.default)(r,function(t){return t.tokenTypeIdx}),u=(0,v.default)(r,function(t){var e=t.GROUP;if(e!==s.Lexer.SKIPPED){if((0,E.default)(e))return e;if((0,A.default)(e))return!1;throw Error("non exhaustive match")}}),l=(0,v.default)(r,function(t){var e=t.LONGER_ALT;if(e)return(0,f.default)(e)?(0,v.default)(e,function(t){return(0,g.default)(r,t)}):[(0,g.default)(r,e)]}),h=(0,v.default)(r,function(t){return t.PUSH_MODE}),p=(0,v.default)(r,function(t){return(0,R.default)(t,"POP_MODE")})}),o("Line Terminator Handling",function(){var t=Q(n.lineTerminatorCharacters);m=(0,v.default)(r,function(t){return!1}),"onlyOffset"!==n.positionTracking&&(m=(0,v.default)(r,function(e){return(0,R.default)(e,"LINE_BREAKS")?!!e.LINE_BREAKS:!1===$(e,t)&&(0,C.canMatchCharCode)(t,e.PATTERN)}))}),o("Misc Mapping #2",function(){_=(0,v.default)(r,H),N=(0,v.default)(i,X),I=(0,x.default)(r,function(t,e){var n=e.GROUP;return(0,E.default)(n)&&n!==s.Lexer.SKIPPED&&(t[n]=[]),t},{}),L=(0,v.default)(i,function(t,e){return{pattern:i[e],longerAlt:l[e],canLineTerminator:m[e],isCustom:_[e],short:N[e],group:u[e],push:h[e],pop:p[e],tokenTypeIdx:a[e],tokenType:r[e]}})});var D=!0,k=[];return n.safeMode||o("First Char Optimization",function(){k=(0,x.default)(r,function(t,e,r){if("string"==typeof e.PATTERN){var o=et(e.PATTERN.charCodeAt(0));J(t,o,L[r])}else if((0,f.default)(e.START_CHARS_HINT)){var i;(0,y.default)(e.START_CHARS_HINT,function(e){var n=et("string"==typeof e?e.charCodeAt(0):e);i!==n&&(i=n,J(t,n,L[r]))})}else if((0,O.default)(e.PATTERN))if(e.PATTERN.unicode)D=!1,n.ensureOptimizations&&(0,M.PRINT_ERROR)("".concat(C.failedOptimizationPrefixMsg)+"\tUnable to analyze < ".concat(e.PATTERN.toString()," > pattern.\n")+"\tThe regexp unicode flag is not currently supported by the regexp-to-ast library.\n\tThis will disable the lexer's first char optimizations.\n\tFor details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#UNICODE_OPTIMIZE");else{var a=(0,C.getOptimizedStartCodesIndices)(e.PATTERN,n.ensureOptimizations);(0,c.default)(a)&&(D=!1),(0,y.default)(a,function(e){J(t,e,L[r])})}else n.ensureOptimizations&&(0,M.PRINT_ERROR)("".concat(C.failedOptimizationPrefixMsg)+"\tTokenType: <".concat(e.name,"> is using a custom token pattern without providing parameter.\n")+"\tThis will disable the lexer's first char optimizations.\n\tFor details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#CUSTOM_OPTIMIZE"),D=!1;return t},[])}),{emptyGroups:I,patternIdxToConfig:L,charCodeToPatternIdxToConfig:k,hasCustom:w,canBeOptimized:D}},e.validatePatterns=function(t,e){var n=[],r=w(t);n=n.concat(r.errors);var o=D(r.valid),i=o.valid;return(n=(n=(n=(n=n.concat(o.errors)).concat(function(t){var e=[],n=(0,I.default)(t,function(t){return(0,O.default)(t[P])});return e=(e=(e=(e=(e=e.concat(U(n))).concat(V(n))).concat(B(n))).concat(G(n))).concat(F(n))}(i))).concat(W(i))).concat(z(i,e))).concat(Y(i))},e.findMissingPatterns=w,e.findInvalidPatterns=D;var k=/[^\\][$]/;function U(t){var e=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.found=!1,e}return o(e,t),e.prototype.visitEndAnchor=function(t){this.found=!0},e}(a.BaseRegExpVisitor),n=(0,I.default)(t,function(t){var n=t.PATTERN;try{var r=(0,L.getRegExpAst)(n),o=new e;return o.visit(r),o.found}catch(t){return k.test(n.source)}});return(0,v.default)(n,function(t){return{message:"Unexpected RegExp Anchor Error:\n\tToken Type: ->"+t.name+"<- static 'PATTERN' cannot contain end of input anchor '$'\n\tSee chevrotain.io/docs/guide/resolving_lexer_errors.html#ANCHORS\tfor details.",type:s.LexerDefinitionErrorType.EOI_ANCHOR_FOUND,tokenTypes:[t]}})}function F(t){var e=(0,I.default)(t,function(t){return t.PATTERN.test("")});return(0,v.default)(e,function(t){return{message:"Token Type: ->"+t.name+"<- static 'PATTERN' must not match an empty string",type:s.LexerDefinitionErrorType.EMPTY_MATCH_PATTERN,tokenTypes:[t]}})}e.findEndOfInputAnchor=U,e.findEmptyMatchRegExps=F;var j=/[^\\[][\^]|^\^/;function V(t){var e=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.found=!1,e}return o(e,t),e.prototype.visitStartAnchor=function(t){this.found=!0},e}(a.BaseRegExpVisitor),n=(0,I.default)(t,function(t){var n=t.PATTERN;try{var r=(0,L.getRegExpAst)(n),o=new e;return o.visit(r),o.found}catch(t){return j.test(n.source)}});return(0,v.default)(n,function(t){return{message:"Unexpected RegExp Anchor Error:\n\tToken Type: ->"+t.name+"<- static 'PATTERN' cannot contain start of input anchor '^'\n\tSee https://chevrotain.io/docs/guide/resolving_lexer_errors.html#ANCHORS\tfor details.",type:s.LexerDefinitionErrorType.SOI_ANCHOR_FOUND,tokenTypes:[t]}})}function B(t){var e=(0,I.default)(t,function(t){var e=t[P];return e instanceof RegExp&&(e.multiline||e.global)});return(0,v.default)(e,function(t){return{message:"Token Type: ->"+t.name+"<- static 'PATTERN' may NOT contain global('g') or multiline('m')",type:s.LexerDefinitionErrorType.UNSUPPORTED_FLAGS_FOUND,tokenTypes:[t]}})}function G(t){var e=[],n=(0,v.default)(t,function(n){return(0,x.default)(t,function(t,r){return n.PATTERN.source!==r.PATTERN.source||(0,b.default)(e,r)||r.PATTERN===s.Lexer.NA||(e.push(r),t.push(r)),t},[])});n=(0,l.default)(n);var r=(0,I.default)(n,function(t){return t.length>1});return(0,v.default)(r,function(t){var e=(0,v.default)(t,function(t){return t.name}),n=(0,u.default)(t).PATTERN;return{message:"The same RegExp pattern ->".concat(n,"<-")+"has been used in all of the following Token Types: ".concat(e.join(", ")," <-"),type:s.LexerDefinitionErrorType.DUPLICATE_PATTERNS_FOUND,tokenTypes:t}})}function W(t){var e=(0,I.default)(t,function(t){if(!(0,R.default)(t,"GROUP"))return!1;var e=t.GROUP;return e!==s.Lexer.SKIPPED&&e!==s.Lexer.NA&&!(0,E.default)(e)});return(0,v.default)(e,function(t){return{message:"Token Type: ->"+t.name+"<- static 'GROUP' can only be Lexer.SKIPPED/Lexer.NA/A String",type:s.LexerDefinitionErrorType.INVALID_GROUP_TYPE_FOUND,tokenTypes:[t]}})}function z(t,e){var n=(0,I.default)(t,function(t){return void 0!==t.PUSH_MODE&&!(0,b.default)(e,t.PUSH_MODE)});return(0,v.default)(n,function(t){return{message:"Token Type: ->".concat(t.name,"<- static 'PUSH_MODE' value cannot refer to a Lexer Mode ->").concat(t.PUSH_MODE,"<-")+"which does not exist",type:s.LexerDefinitionErrorType.PUSH_MODE_DOES_NOT_EXIST,tokenTypes:[t]}})}function Y(t){var e=[],n=(0,x.default)(t,function(t,e,n){var r,o,i=e.PATTERN;return i===s.Lexer.NA||((0,E.default)(i)?t.push({str:i,idx:n,tokenType:e}):(0,O.default)(i)&&(r=i,o=[".","\\","[","]","|","^","$","(",")","?","*","+","{"],void 0===(0,_.default)(o,function(t){return-1!==r.source.indexOf(t)}))&&t.push({str:i.source,idx:n,tokenType:e})),t},[]);return(0,y.default)(t,function(t,r){(0,y.default)(n,function(n){var o=n.str,i=n.idx,a=n.tokenType;if(r".concat(t.name,"<-")+"in the lexer's definition.\nSee https://chevrotain.io/docs/guide/resolving_lexer_errors.html#UNREACHABLE";e.push({message:u,type:s.LexerDefinitionErrorType.UNREACHABLE_PATTERN,tokenTypes:[t,a]})}})}),e}function q(t){var e=t.ignoreCase?"i":"";return new RegExp("^(?:".concat(t.source,")"),e)}function K(t){var e=t.ignoreCase?"iy":"y";return new RegExp("".concat(t.source),e)}function H(t){var e=t.PATTERN;if((0,O.default)(e))return!1;if((0,T.default)(e))return!0;if((0,R.default)(e,"exec"))return!0;if((0,E.default)(e))return!1;throw Error("non exhaustive match")}function X(t){return!(!(0,E.default)(t)||1!==t.length)&&t.charCodeAt(0)}function $(t,e){if((0,R.default)(t,"LINE_BREAKS"))return!1;if((0,O.default)(t.PATTERN)){try{(0,C.canMatchCharCode)(e,t.PATTERN)}catch(t){return{issue:s.LexerDefinitionErrorType.IDENTIFY_TERMINATOR,errMsg:t.message}}return!1}if((0,E.default)(t.PATTERN))return!1;if(H(t))return{issue:s.LexerDefinitionErrorType.CUSTOM_LINE_BREAK};throw Error("non exhaustive match")}function Z(t,e){if(e.issue===s.LexerDefinitionErrorType.IDENTIFY_TERMINATOR)return"Warning: unable to identify line terminator usage in pattern.\n"+"\tThe problem is in the <".concat(t.name,"> Token Type\n")+"\t Root cause: ".concat(e.errMsg,".\n")+"\tFor details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#IDENTIFY_TERMINATOR";if(e.issue===s.LexerDefinitionErrorType.CUSTOM_LINE_BREAK)return"Warning: A Custom Token Pattern should specify the option.\n"+"\tThe problem is in the <".concat(t.name,"> Token Type\n")+"\tFor details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#CUSTOM_LINE_BREAK";throw Error("non exhaustive match")}function Q(t){return(0,v.default)(t,function(t){return(0,E.default)(t)?t.charCodeAt(0):t})}function J(t,e,n){void 0===t[e]?t[e]=[n]:t[e].push(n)}e.findStartOfInputAnchor=V,e.findUnsupportedFlags=B,e.findDuplicatePatterns=G,e.findInvalidGroupType=W,e.findModesThatDoNotExist=z,e.findUnreachablePatterns=Y,e.addStartOfInput=q,e.addStickyFlag=K,e.performRuntimeChecks=function(t,n,r){var o=[];return(0,R.default)(t,e.DEFAULT_MODE)||o.push({message:"A MultiMode Lexer cannot be initialized without a <"+e.DEFAULT_MODE+"> property in its definition\n",type:s.LexerDefinitionErrorType.MULTI_MODE_LEXER_WITHOUT_DEFAULT_MODE}),(0,R.default)(t,e.MODES)||o.push({message:"A MultiMode Lexer cannot be initialized without a <"+e.MODES+"> property in its definition\n",type:s.LexerDefinitionErrorType.MULTI_MODE_LEXER_WITHOUT_MODES_PROPERTY}),(0,R.default)(t,e.MODES)&&(0,R.default)(t,e.DEFAULT_MODE)&&!(0,R.default)(t.modes,t.defaultMode)&&o.push({message:"A MultiMode Lexer cannot be initialized with a ".concat(e.DEFAULT_MODE,": <").concat(t.defaultMode,">")+"which does not exist\n",type:s.LexerDefinitionErrorType.MULTI_MODE_LEXER_DEFAULT_MODE_VALUE_DOES_NOT_EXIST}),(0,R.default)(t,e.MODES)&&(0,y.default)(t.modes,function(t,e){(0,y.default)(t,function(n,r){if((0,A.default)(n))o.push({message:"A Lexer cannot be initialized using an undefined Token Type. Mode:"+"<".concat(e,"> at index: <").concat(r,">\n"),type:s.LexerDefinitionErrorType.LEXER_DEFINITION_CANNOT_CONTAIN_UNDEFINED});else if((0,R.default)(n,"LONGER_ALT")){var i=(0,f.default)(n.LONGER_ALT)?n.LONGER_ALT:[n.LONGER_ALT];(0,y.default)(i,function(r){(0,A.default)(r)||(0,b.default)(t,r)||o.push({message:"A MultiMode Lexer cannot be initialized with a longer_alt <".concat(r.name,"> on token <").concat(n.name,"> outside of mode <").concat(e,">\n"),type:s.LexerDefinitionErrorType.MULTI_MODE_LEXER_LONGER_ALT_NOT_IN_CURRENT_MODE})})}})}),o},e.performWarningRuntimeChecks=function(t,e,n){var r=[],o=!1,i=(0,l.default)((0,p.default)((0,h.default)(t.modes))),a=(0,d.default)(i,function(t){return t[P]===s.Lexer.NA}),u=Q(n);return e&&(0,y.default)(a,function(t){var e=$(t,u);if(!1!==e){var n={message:Z(t,e),type:e.issue,tokenType:t};r.push(n)}else(0,R.default)(t,"LINE_BREAKS")?!0===t.LINE_BREAKS&&(o=!0):(0,C.canMatchCharCode)(u,t.PATTERN)&&(o=!0)}),e&&!o&&r.push({message:"Warning: No LINE_BREAKS Found.\n\tThis Lexer has been defined to track line and column information,\n\tBut none of the Token Types can be identified as matching a line terminator.\n\tSee https://chevrotain.io/docs/guide/resolving_lexer_errors.html#LINE_BREAKS \n\tfor details.",type:s.LexerDefinitionErrorType.NO_LINE_BREAKS_FLAGS}),r},e.cloneEmptyGroups=function(t){var e={},n=(0,N.default)(t);return(0,y.default)(n,function(n){var r=t[n];if(!(0,f.default)(r))throw Error("non exhaustive match");e[n]=[]}),e},e.isCustomPattern=H,e.isShortPattern=X,e.LineTerminatorOptimizedTester={test:function(t){for(var e=t.length,n=this.lastIndex;n{var r=n(1882),o=n(7296),i=n(3805),a=n(7473),s=/^\[object .+?Constructor\]$/,u=Function.prototype,c=Object.prototype,l=u.toString,f=c.hasOwnProperty,h=RegExp("^"+l.call(f).replace(/[\\^$.*+?()[\]{}|]/g,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");t.exports=function(t){return!(!i(t)||o(t))&&(r(t)?h:s).test(a(t))}},5128:(t,e,n)=>{var r=n(909),o=n(4894);t.exports=function(t,e){var n=-1,i=o(t)?Array(t.length):[];return r(t,function(t,r,o){i[++n]=e(t,r,o)}),i}},5160:t=>{t.exports=function(t,e,n){var r=-1,o=t.length;e<0&&(e=-e>o?0:o+e),(n=n>o?o:n)<0&&(n+=o),o=e>n?0:n-e>>>0,e>>>=0;for(var i=Array(o);++r{t.exports=function(t,e){return t===e||t!=t&&e!=e}},5325:(t,e,n)=>{var r=n(6131);t.exports=function(t,e){return!(null==t||!t.length)&&r(t,e,0)>-1}},5378:(t,e,n)=>{var r=n(4932),o=n(5389),i=n(5128),a=n(6449);t.exports=function(t,e){return(a(t)?r:i)(t,o(e,3))}},5389:(t,e,n)=>{var r=n(3663),o=n(7978),i=n(3488),a=n(6449),s=n(583);t.exports=function(t){return"function"==typeof t?t:null==t?i:"object"==typeof t?a(t)?o(t[0],t[1]):r(t):s(t)}},5463:t=>{t.exports=function(t){return t!=t}},5481:(t,e,n)=>{var r=n(9325)["__core-js_shared__"];t.exports=r},5527:t=>{var e=Object.prototype;t.exports=function(t){var n=t&&t.constructor;return t===("function"==typeof n&&n.prototype||e)}},5529:(t,e,n)=>{var r=n(9344),o=n(8879),i=n(5527);t.exports=function(t){return"function"!=typeof t.constructor||i(t)?{}:r(o(t))}},5558:t=>{t.exports=function(t,e,n,r,o){return o(t,function(t,o,i){n=r?(r=!1,t):e(n,t,o,i)}),n}},5580:(t,e,n)=>{var r=n(6110)(n(9325),"DataView");t.exports=r},5592:(t,e,n)=>{"use strict";n.d(e,{Q:()=>r});class r{constructor(){this._listeners={},this._isEventPaused=!1}listen(t,e){void 0===this._listeners&&(this._listeners={});var n=this._listeners;void 0===n[t]&&(n[t]=[]),-1===n[t].indexOf(e)&&n[t].push(e)}addListener(t,e){this.listen(t,e)}hasListener(t,e){return void 0!==this._listeners&&void 0!==this._listeners[t]&&-1!==this._listeners[t].indexOf(e)}removeListener(t,e){if(void 0!==this._listeners){var n=this._listeners[t];if(void 0!==n){var r=n.indexOf(e);-1!==r&&n.splice(r,1)}}}dispatch(t,e={}){if(!this._isEventPaused&&void 0!==this._listeners&&void 0!==(n=this._listeners[t])){e.target=this;for(var n,r=0,o=(n=n.slice(0)).length;r{var r=n(1042);t.exports=function(t,e){var n=this.__data__;return this.size+=this.has(t)?0:1,n[t]=r&&void 0===e?"__lodash_hash_undefined__":e,this}},5765:(t,e,n)=>{var r=n(8859),o=n(5325),i=n(9905),a=n(9219),s=n(4517),u=n(4247);t.exports=function(t,e,n){var c=-1,l=o,f=t.length,h=!0,p=[],d=p;if(n)h=!1,l=i;else if(f>=200){var m=e?null:s(t);if(m)return u(m);h=!1,l=a,d=new r}else d=e?[]:p;t:for(;++c{var r=n(2507)("toUpperCase");t.exports=r},5861:(t,e,n)=>{var r=n(5580),o=n(8223),i=n(2804),a=n(6545),s=n(8303),u=n(2552),c=n(7473),l="[object Map]",f="[object Promise]",h="[object Set]",p="[object WeakMap]",d="[object DataView]",m=c(r),g=c(o),v=c(i),y=c(a),E=c(s),T=u;(r&&T(new r(new ArrayBuffer(1)))!=d||o&&T(new o)!=l||i&&T(i.resolve())!=f||a&&T(new a)!=h||s&&T(new s)!=p)&&(T=function(t){var e=u(t),n="[object Object]"==e?t.constructor:void 0,r=n?c(n):"";if(r)switch(r){case m:return d;case g:return l;case v:return f;case y:return h;case E:return p}return e}),t.exports=T},5880:(t,e,n)=>{var r=n(514),o=n(5950);t.exports=function(t){return null==t?[]:r(t,o(t))}},5891:(t,e,n)=>{var r=n(1873),o=n(2428),i=n(6449),a=r?r.isConcatSpreadable:void 0;t.exports=function(t){return i(t)||o(t)||!!(a&&t&&t[a])}},5911:(t,e,n)=>{var r=n(8859),o=n(4248),i=n(9219);t.exports=function(t,e,n,a,s,u){var c=1&n,l=t.length,f=e.length;if(l!=f&&!(c&&f>l))return!1;var h=u.get(t),p=u.get(e);if(h&&p)return h==e&&p==t;var d=-1,m=!0,g=2&n?new r:void 0;for(u.set(t,e),u.set(e,t);++d{var r=n(695),o=n(8984),i=n(4894);t.exports=function(t){return i(t)?r(t):o(t)}},5970:(t,e,n)=>{var r=n(3120);t.exports=function(t){return null!=t&&t.length?r(t,1):[]}},5994:(t,e,n)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.createSyntaxDiagramsCode=void 0;var r=n(4927);e.createSyntaxDiagramsCode=function(t,e){var n=void 0===e?{}:e,o=n.resourceBase,i=void 0===o?"https://unpkg.com/chevrotain@".concat(r.VERSION,"/diagrams/"):o,a=n.css,s=void 0===a?"https://unpkg.com/chevrotain@".concat(r.VERSION,"/diagrams/diagrams.css"):a;return'\n\x3c!-- This is a generated file --\x3e\n\n\n\n\n'+"\n\n")+"\n\\n\\n\\n\\n\");\n var diagramsDiv = \"\\n
\\n\";\n var serializedGrammar = \"\\n\\n\");\n var initLogic = \"\\n\\n\";\n return (header + cssHtml + scripts + diagramsDiv + serializedGrammar + initLogic);\n}\nexports.createSyntaxDiagramsCode = createSyntaxDiagramsCode;\n//# sourceMappingURL=render_public.js.map","var freeGlobal = require('./_freeGlobal');\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Detect free variable `process` from Node.js. */\nvar freeProcess = moduleExports && freeGlobal.process;\n\n/** Used to access faster Node.js helpers. */\nvar nodeUtil = (function() {\n try {\n // Use `util.types` for Node.js 10+.\n var types = freeModule && freeModule.require && freeModule.require('util').types;\n\n if (types) {\n return types;\n }\n\n // Legacy `process.binding('util')` for Node.js < 10.\n return freeProcess && freeProcess.binding && freeProcess.binding('util');\n } catch (e) {}\n}());\n\nmodule.exports = nodeUtil;\n","var eq = require('./eq');\n\n/**\n * Gets the index at which the `key` is found in `array` of key-value pairs.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} key The key to search for.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction assocIndexOf(array, key) {\n var length = array.length;\n while (length--) {\n if (eq(array[length][0], key)) {\n return length;\n }\n }\n return -1;\n}\n\nmodule.exports = assocIndexOf;\n","var getTag = require('./_getTag'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar setTag = '[object Set]';\n\n/**\n * The base implementation of `_.isSet` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a set, else `false`.\n */\nfunction baseIsSet(value) {\n return isObjectLike(value) && getTag(value) == setTag;\n}\n\nmodule.exports = baseIsSet;\n","\"use strict\";\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.buildModel = void 0;\nvar gast_1 = require(\"@chevrotain/gast\");\nvar map_1 = __importDefault(require(\"lodash/map\"));\nvar flatten_1 = __importDefault(require(\"lodash/flatten\"));\nvar values_1 = __importDefault(require(\"lodash/values\"));\nvar some_1 = __importDefault(require(\"lodash/some\"));\nvar groupBy_1 = __importDefault(require(\"lodash/groupBy\"));\nvar assign_1 = __importDefault(require(\"lodash/assign\"));\nfunction buildModel(productions) {\n var generator = new CstNodeDefinitionGenerator();\n var allRules = (0, values_1.default)(productions);\n return (0, map_1.default)(allRules, function (rule) { return generator.visitRule(rule); });\n}\nexports.buildModel = buildModel;\nvar CstNodeDefinitionGenerator = /** @class */ (function (_super) {\n __extends(CstNodeDefinitionGenerator, _super);\n function CstNodeDefinitionGenerator() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n CstNodeDefinitionGenerator.prototype.visitRule = function (node) {\n var rawElements = this.visitEach(node.definition);\n var grouped = (0, groupBy_1.default)(rawElements, function (el) { return el.propertyName; });\n var properties = (0, map_1.default)(grouped, function (group, propertyName) {\n var allNullable = !(0, some_1.default)(group, function (el) { return !el.canBeNull; });\n // In an alternation with a label a property name can have\n // multiple types.\n var propertyType = group[0].type;\n if (group.length > 1) {\n propertyType = (0, map_1.default)(group, function (g) { return g.type; });\n }\n return {\n name: propertyName,\n type: propertyType,\n optional: allNullable\n };\n });\n return {\n name: node.name,\n properties: properties\n };\n };\n CstNodeDefinitionGenerator.prototype.visitAlternative = function (node) {\n return this.visitEachAndOverrideWith(node.definition, { canBeNull: true });\n };\n CstNodeDefinitionGenerator.prototype.visitOption = function (node) {\n return this.visitEachAndOverrideWith(node.definition, { canBeNull: true });\n };\n CstNodeDefinitionGenerator.prototype.visitRepetition = function (node) {\n return this.visitEachAndOverrideWith(node.definition, { canBeNull: true });\n };\n CstNodeDefinitionGenerator.prototype.visitRepetitionMandatory = function (node) {\n return this.visitEach(node.definition);\n };\n CstNodeDefinitionGenerator.prototype.visitRepetitionMandatoryWithSeparator = function (node) {\n return this.visitEach(node.definition).concat({\n propertyName: node.separator.name,\n canBeNull: true,\n type: getType(node.separator)\n });\n };\n CstNodeDefinitionGenerator.prototype.visitRepetitionWithSeparator = function (node) {\n return this.visitEachAndOverrideWith(node.definition, {\n canBeNull: true\n }).concat({\n propertyName: node.separator.name,\n canBeNull: true,\n type: getType(node.separator)\n });\n };\n CstNodeDefinitionGenerator.prototype.visitAlternation = function (node) {\n return this.visitEachAndOverrideWith(node.definition, { canBeNull: true });\n };\n CstNodeDefinitionGenerator.prototype.visitTerminal = function (node) {\n return [\n {\n propertyName: node.label || node.terminalType.name,\n canBeNull: false,\n type: getType(node)\n }\n ];\n };\n CstNodeDefinitionGenerator.prototype.visitNonTerminal = function (node) {\n return [\n {\n propertyName: node.label || node.nonTerminalName,\n canBeNull: false,\n type: getType(node)\n }\n ];\n };\n CstNodeDefinitionGenerator.prototype.visitEachAndOverrideWith = function (definition, override) {\n return (0, map_1.default)(this.visitEach(definition), function (definition) { return (0, assign_1.default)({}, definition, override); });\n };\n CstNodeDefinitionGenerator.prototype.visitEach = function (definition) {\n var _this = this;\n return (0, flatten_1.default)((0, map_1.default)(definition, function (definition) { return _this.visit(definition); }));\n };\n return CstNodeDefinitionGenerator;\n}(gast_1.GAstVisitor));\nfunction getType(production) {\n if (production instanceof gast_1.NonTerminal) {\n return {\n kind: \"rule\",\n name: production.referencedRule.name\n };\n }\n return { kind: \"token\" };\n}\n//# sourceMappingURL=model.js.map","/** Error message constants. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/**\n * Creates a function that negates the result of the predicate `func`. The\n * `func` predicate is invoked with the `this` binding and arguments of the\n * created function.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Function\n * @param {Function} predicate The predicate to negate.\n * @returns {Function} Returns the new negated function.\n * @example\n *\n * function isEven(n) {\n * return n % 2 == 0;\n * }\n *\n * _.filter([1, 2, 3, 4, 5, 6], _.negate(isEven));\n * // => [1, 3, 5]\n */\nfunction negate(predicate) {\n if (typeof predicate != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n return function() {\n var args = arguments;\n switch (args.length) {\n case 0: return !predicate.call(this);\n case 1: return !predicate.call(this, args[0]);\n case 2: return !predicate.call(this, args[0], args[1]);\n case 3: return !predicate.call(this, args[0], args[1], args[2]);\n }\n return !predicate.apply(this, args);\n };\n}\n\nmodule.exports = negate;\n","var baseIsNative = require('./_baseIsNative'),\n getValue = require('./_getValue');\n\n/**\n * Gets the native function at `key` of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the method to get.\n * @returns {*} Returns the function if it's native, else `undefined`.\n */\nfunction getNative(object, key) {\n var value = getValue(object, key);\n return baseIsNative(value) ? value : undefined;\n}\n\nmodule.exports = getNative;\n","var baseFindIndex = require('./_baseFindIndex'),\n baseIsNaN = require('./_baseIsNaN'),\n strictIndexOf = require('./_strictIndexOf');\n\n/**\n * The base implementation of `_.indexOf` without `fromIndex` bounds checks.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @param {number} fromIndex The index to search from.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction baseIndexOf(array, value, fromIndex) {\n return value === value\n ? strictIndexOf(array, value, fromIndex)\n : baseFindIndex(array, baseIsNaN, fromIndex);\n}\n\nmodule.exports = baseIndexOf;\n","var assignValue = require('./_assignValue'),\n copyObject = require('./_copyObject'),\n createAssigner = require('./_createAssigner'),\n isArrayLike = require('./isArrayLike'),\n isPrototype = require('./_isPrototype'),\n keys = require('./keys');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Assigns own enumerable string keyed properties of source objects to the\n * destination object. Source objects are applied from left to right.\n * Subsequent sources overwrite property assignments of previous sources.\n *\n * **Note:** This method mutates `object` and is loosely based on\n * [`Object.assign`](https://mdn.io/Object/assign).\n *\n * @static\n * @memberOf _\n * @since 0.10.0\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} [sources] The source objects.\n * @returns {Object} Returns `object`.\n * @see _.assignIn\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * }\n *\n * function Bar() {\n * this.c = 3;\n * }\n *\n * Foo.prototype.b = 2;\n * Bar.prototype.d = 4;\n *\n * _.assign({ 'a': 0 }, new Foo, new Bar);\n * // => { 'a': 1, 'c': 3 }\n */\nvar assign = createAssigner(function(object, source) {\n if (isPrototype(source) || isArrayLike(source)) {\n copyObject(source, keys(source), object);\n return;\n }\n for (var key in source) {\n if (hasOwnProperty.call(source, key)) {\n assignValue(object, key, source[key]);\n }\n }\n});\n\nmodule.exports = assign;\n","var cloneArrayBuffer = require('./_cloneArrayBuffer');\n\n/**\n * Creates a clone of `dataView`.\n *\n * @private\n * @param {Object} dataView The data view to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the cloned data view.\n */\nfunction cloneDataView(dataView, isDeep) {\n var buffer = isDeep ? cloneArrayBuffer(dataView.buffer) : dataView.buffer;\n return new dataView.constructor(buffer, dataView.byteOffset, dataView.byteLength);\n}\n\nmodule.exports = cloneDataView;\n","module.exports = require('./head');\n","\"use strict\";\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.buildInProdFollowPrefix = exports.buildBetweenProdsFollowPrefix = exports.computeAllProdsFollows = exports.ResyncFollowsWalker = void 0;\nvar rest_1 = require(\"./rest\");\nvar first_1 = require(\"./first\");\nvar forEach_1 = __importDefault(require(\"lodash/forEach\"));\nvar assign_1 = __importDefault(require(\"lodash/assign\"));\nvar constants_1 = require(\"../constants\");\nvar gast_1 = require(\"@chevrotain/gast\");\n// This ResyncFollowsWalker computes all of the follows required for RESYNC\n// (skipping reference production).\nvar ResyncFollowsWalker = /** @class */ (function (_super) {\n __extends(ResyncFollowsWalker, _super);\n function ResyncFollowsWalker(topProd) {\n var _this = _super.call(this) || this;\n _this.topProd = topProd;\n _this.follows = {};\n return _this;\n }\n ResyncFollowsWalker.prototype.startWalking = function () {\n this.walk(this.topProd);\n return this.follows;\n };\n ResyncFollowsWalker.prototype.walkTerminal = function (terminal, currRest, prevRest) {\n // do nothing! just like in the public sector after 13:00\n };\n ResyncFollowsWalker.prototype.walkProdRef = function (refProd, currRest, prevRest) {\n var followName = buildBetweenProdsFollowPrefix(refProd.referencedRule, refProd.idx) +\n this.topProd.name;\n var fullRest = currRest.concat(prevRest);\n var restProd = new gast_1.Alternative({ definition: fullRest });\n var t_in_topProd_follows = (0, first_1.first)(restProd);\n this.follows[followName] = t_in_topProd_follows;\n };\n return ResyncFollowsWalker;\n}(rest_1.RestWalker));\nexports.ResyncFollowsWalker = ResyncFollowsWalker;\nfunction computeAllProdsFollows(topProductions) {\n var reSyncFollows = {};\n (0, forEach_1.default)(topProductions, function (topProd) {\n var currRefsFollow = new ResyncFollowsWalker(topProd).startWalking();\n (0, assign_1.default)(reSyncFollows, currRefsFollow);\n });\n return reSyncFollows;\n}\nexports.computeAllProdsFollows = computeAllProdsFollows;\nfunction buildBetweenProdsFollowPrefix(inner, occurenceInParent) {\n return inner.name + occurenceInParent + constants_1.IN;\n}\nexports.buildBetweenProdsFollowPrefix = buildBetweenProdsFollowPrefix;\nfunction buildInProdFollowPrefix(terminal) {\n var terminalName = terminal.terminalType.name;\n return terminalName + terminal.idx + constants_1.IN;\n}\nexports.buildInProdFollowPrefix = buildInProdFollowPrefix;\n//# sourceMappingURL=follow.js.map","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Initializes an array clone.\n *\n * @private\n * @param {Array} array The array to clone.\n * @returns {Array} Returns the initialized clone.\n */\nfunction initCloneArray(array) {\n var length = array.length,\n result = new array.constructor(length);\n\n // Add properties assigned by `RegExp#exec`.\n if (length && typeof array[0] == 'string' && hasOwnProperty.call(array, 'index')) {\n result.index = array.index;\n result.input = array.input;\n }\n return result;\n}\n\nmodule.exports = initCloneArray;\n","\"use strict\";\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.canMatchCharCode = exports.firstCharOptimizedIndices = exports.getOptimizedStartCodesIndices = exports.failedOptimizationPrefixMsg = void 0;\nvar regexp_to_ast_1 = require(\"regexp-to-ast\");\nvar isArray_1 = __importDefault(require(\"lodash/isArray\"));\nvar every_1 = __importDefault(require(\"lodash/every\"));\nvar forEach_1 = __importDefault(require(\"lodash/forEach\"));\nvar find_1 = __importDefault(require(\"lodash/find\"));\nvar values_1 = __importDefault(require(\"lodash/values\"));\nvar includes_1 = __importDefault(require(\"lodash/includes\"));\nvar utils_1 = require(\"@chevrotain/utils\");\nvar reg_exp_parser_1 = require(\"./reg_exp_parser\");\nvar lexer_1 = require(\"./lexer\");\nvar complementErrorMessage = \"Complement Sets are not supported for first char optimization\";\nexports.failedOptimizationPrefixMsg = 'Unable to use \"first char\" lexer optimizations:\\n';\nfunction getOptimizedStartCodesIndices(regExp, ensureOptimizations) {\n if (ensureOptimizations === void 0) { ensureOptimizations = false; }\n try {\n var ast = (0, reg_exp_parser_1.getRegExpAst)(regExp);\n var firstChars = firstCharOptimizedIndices(ast.value, {}, ast.flags.ignoreCase);\n return firstChars;\n }\n catch (e) {\n /* istanbul ignore next */\n // Testing this relies on the regexp-to-ast library having a bug... */\n // TODO: only the else branch needs to be ignored, try to fix with newer prettier / tsc\n if (e.message === complementErrorMessage) {\n if (ensureOptimizations) {\n (0, utils_1.PRINT_WARNING)(\"\".concat(exports.failedOptimizationPrefixMsg) +\n \"\\tUnable to optimize: < \".concat(regExp.toString(), \" >\\n\") +\n \"\\tComplement Sets cannot be automatically optimized.\\n\" +\n \"\\tThis will disable the lexer's first char optimizations.\\n\" +\n \"\\tSee: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#COMPLEMENT for details.\");\n }\n }\n else {\n var msgSuffix = \"\";\n if (ensureOptimizations) {\n msgSuffix =\n \"\\n\\tThis will disable the lexer's first char optimizations.\\n\" +\n \"\\tSee: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#REGEXP_PARSING for details.\";\n }\n (0, utils_1.PRINT_ERROR)(\"\".concat(exports.failedOptimizationPrefixMsg, \"\\n\") +\n \"\\tFailed parsing: < \".concat(regExp.toString(), \" >\\n\") +\n \"\\tUsing the regexp-to-ast library version: \".concat(regexp_to_ast_1.VERSION, \"\\n\") +\n \"\\tPlease open an issue at: https://github.com/bd82/regexp-to-ast/issues\" +\n msgSuffix);\n }\n }\n return [];\n}\nexports.getOptimizedStartCodesIndices = getOptimizedStartCodesIndices;\nfunction firstCharOptimizedIndices(ast, result, ignoreCase) {\n switch (ast.type) {\n case \"Disjunction\":\n for (var i = 0; i < ast.value.length; i++) {\n firstCharOptimizedIndices(ast.value[i], result, ignoreCase);\n }\n break;\n case \"Alternative\":\n var terms = ast.value;\n for (var i = 0; i < terms.length; i++) {\n var term = terms[i];\n // skip terms that cannot effect the first char results\n switch (term.type) {\n case \"EndAnchor\":\n // A group back reference cannot affect potential starting char.\n // because if a back reference is the first production than automatically\n // the group being referenced has had to come BEFORE so its codes have already been added\n case \"GroupBackReference\":\n // assertions do not affect potential starting codes\n case \"Lookahead\":\n case \"NegativeLookahead\":\n case \"StartAnchor\":\n case \"WordBoundary\":\n case \"NonWordBoundary\":\n continue;\n }\n var atom = term;\n switch (atom.type) {\n case \"Character\":\n addOptimizedIdxToResult(atom.value, result, ignoreCase);\n break;\n case \"Set\":\n if (atom.complement === true) {\n throw Error(complementErrorMessage);\n }\n (0, forEach_1.default)(atom.value, function (code) {\n if (typeof code === \"number\") {\n addOptimizedIdxToResult(code, result, ignoreCase);\n }\n else {\n // range\n var range = code;\n // cannot optimize when ignoreCase is\n if (ignoreCase === true) {\n for (var rangeCode = range.from; rangeCode <= range.to; rangeCode++) {\n addOptimizedIdxToResult(rangeCode, result, ignoreCase);\n }\n }\n // Optimization (2 orders of magnitude less work for very large ranges)\n else {\n // handle unoptimized values\n for (var rangeCode = range.from; rangeCode <= range.to && rangeCode < lexer_1.minOptimizationVal; rangeCode++) {\n addOptimizedIdxToResult(rangeCode, result, ignoreCase);\n }\n // Less common charCode where we optimize for faster init time, by using larger \"buckets\"\n if (range.to >= lexer_1.minOptimizationVal) {\n var minUnOptVal = range.from >= lexer_1.minOptimizationVal\n ? range.from\n : lexer_1.minOptimizationVal;\n var maxUnOptVal = range.to;\n var minOptIdx = (0, lexer_1.charCodeToOptimizedIndex)(minUnOptVal);\n var maxOptIdx = (0, lexer_1.charCodeToOptimizedIndex)(maxUnOptVal);\n for (var currOptIdx = minOptIdx; currOptIdx <= maxOptIdx; currOptIdx++) {\n result[currOptIdx] = currOptIdx;\n }\n }\n }\n }\n });\n break;\n case \"Group\":\n firstCharOptimizedIndices(atom.value, result, ignoreCase);\n break;\n /* istanbul ignore next */\n default:\n throw Error(\"Non Exhaustive Match\");\n }\n // reached a mandatory production, no more **start** codes can be found on this alternative\n var isOptionalQuantifier = atom.quantifier !== undefined && atom.quantifier.atLeast === 0;\n if (\n // A group may be optional due to empty contents /(?:)/\n // or if everything inside it is optional /((a)?)/\n (atom.type === \"Group\" && isWholeOptional(atom) === false) ||\n // If this term is not a group it may only be optional if it has an optional quantifier\n (atom.type !== \"Group\" && isOptionalQuantifier === false)) {\n break;\n }\n }\n break;\n /* istanbul ignore next */\n default:\n throw Error(\"non exhaustive match!\");\n }\n // console.log(Object.keys(result).length)\n return (0, values_1.default)(result);\n}\nexports.firstCharOptimizedIndices = firstCharOptimizedIndices;\nfunction addOptimizedIdxToResult(code, result, ignoreCase) {\n var optimizedCharIdx = (0, lexer_1.charCodeToOptimizedIndex)(code);\n result[optimizedCharIdx] = optimizedCharIdx;\n if (ignoreCase === true) {\n handleIgnoreCase(code, result);\n }\n}\nfunction handleIgnoreCase(code, result) {\n var char = String.fromCharCode(code);\n var upperChar = char.toUpperCase();\n /* istanbul ignore else */\n if (upperChar !== char) {\n var optimizedCharIdx = (0, lexer_1.charCodeToOptimizedIndex)(upperChar.charCodeAt(0));\n result[optimizedCharIdx] = optimizedCharIdx;\n }\n else {\n var lowerChar = char.toLowerCase();\n if (lowerChar !== char) {\n var optimizedCharIdx = (0, lexer_1.charCodeToOptimizedIndex)(lowerChar.charCodeAt(0));\n result[optimizedCharIdx] = optimizedCharIdx;\n }\n }\n}\nfunction findCode(setNode, targetCharCodes) {\n return (0, find_1.default)(setNode.value, function (codeOrRange) {\n if (typeof codeOrRange === \"number\") {\n return (0, includes_1.default)(targetCharCodes, codeOrRange);\n }\n else {\n // range\n var range_1 = codeOrRange;\n return ((0, find_1.default)(targetCharCodes, function (targetCode) { return range_1.from <= targetCode && targetCode <= range_1.to; }) !== undefined);\n }\n });\n}\nfunction isWholeOptional(ast) {\n var quantifier = ast.quantifier;\n if (quantifier && quantifier.atLeast === 0) {\n return true;\n }\n if (!ast.value) {\n return false;\n }\n return (0, isArray_1.default)(ast.value)\n ? (0, every_1.default)(ast.value, isWholeOptional)\n : isWholeOptional(ast.value);\n}\nvar CharCodeFinder = /** @class */ (function (_super) {\n __extends(CharCodeFinder, _super);\n function CharCodeFinder(targetCharCodes) {\n var _this = _super.call(this) || this;\n _this.targetCharCodes = targetCharCodes;\n _this.found = false;\n return _this;\n }\n CharCodeFinder.prototype.visitChildren = function (node) {\n // No need to keep looking...\n if (this.found === true) {\n return;\n }\n // switch lookaheads as they do not actually consume any characters thus\n // finding a charCode at lookahead context does not mean that regexp can actually contain it in a match.\n switch (node.type) {\n case \"Lookahead\":\n this.visitLookahead(node);\n return;\n case \"NegativeLookahead\":\n this.visitNegativeLookahead(node);\n return;\n }\n _super.prototype.visitChildren.call(this, node);\n };\n CharCodeFinder.prototype.visitCharacter = function (node) {\n if ((0, includes_1.default)(this.targetCharCodes, node.value)) {\n this.found = true;\n }\n };\n CharCodeFinder.prototype.visitSet = function (node) {\n if (node.complement) {\n if (findCode(node, this.targetCharCodes) === undefined) {\n this.found = true;\n }\n }\n else {\n if (findCode(node, this.targetCharCodes) !== undefined) {\n this.found = true;\n }\n }\n };\n return CharCodeFinder;\n}(regexp_to_ast_1.BaseRegExpVisitor));\nfunction canMatchCharCode(charCodes, pattern) {\n if (pattern instanceof RegExp) {\n var ast = (0, reg_exp_parser_1.getRegExpAst)(pattern);\n var charCodeFinder = new CharCodeFinder(charCodes);\n charCodeFinder.visit(ast);\n return charCodeFinder.found;\n }\n else {\n return ((0, find_1.default)(pattern, function (char) {\n return (0, includes_1.default)(charCodes, char.charCodeAt(0));\n }) !== undefined);\n }\n}\nexports.canMatchCharCode = canMatchCharCode;\n//# sourceMappingURL=reg_exp.js.map","var baseDifference = require('./_baseDifference'),\n baseFlatten = require('./_baseFlatten'),\n baseRest = require('./_baseRest'),\n isArrayLikeObject = require('./isArrayLikeObject');\n\n/**\n * Creates an array of `array` values not included in the other given arrays\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons. The order and references of result values are\n * determined by the first array.\n *\n * **Note:** Unlike `_.pullAll`, this method returns a new array.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {...Array} [values] The values to exclude.\n * @returns {Array} Returns the new array of filtered values.\n * @see _.without, _.xor\n * @example\n *\n * _.difference([2, 1], [2, 3]);\n * // => [1]\n */\nvar difference = baseRest(function(array, values) {\n return isArrayLikeObject(array)\n ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true))\n : [];\n});\n\nmodule.exports = difference;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.toFastProperties = void 0;\n// based on: https://github.com/petkaantonov/bluebird/blob/b97c0d2d487e8c5076e8bd897e0dcd4622d31846/src/util.js#L201-L216\nfunction toFastProperties(toBecomeFast) {\n function FakeConstructor() { }\n // If our object is used as a constructor it would receive\n FakeConstructor.prototype = toBecomeFast;\n var fakeInstance = new FakeConstructor();\n function fakeAccess() {\n return typeof fakeInstance.bar;\n }\n // help V8 understand this is a \"real\" prototype by actually using\n // the fake instance.\n fakeAccess();\n fakeAccess();\n // Always true condition to suppress the Firefox warning of unreachable\n // code after a return statement.\n if (1)\n return toBecomeFast;\n // Eval prevents optimization of this method (even though this is dead code)\n /* istanbul ignore next */\n // tslint:disable-next-line\n eval(toBecomeFast);\n}\nexports.toFastProperties = toFastProperties;\n//# sourceMappingURL=to-fast-properties.js.map","\"use strict\";\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.EmbeddedActionsParser = exports.CstParser = exports.Parser = exports.EMPTY_ALT = exports.ParserDefinitionErrorType = exports.DEFAULT_RULE_CONFIG = exports.DEFAULT_PARSER_CONFIG = exports.END_OF_FILE = void 0;\nvar isEmpty_1 = __importDefault(require(\"lodash/isEmpty\"));\nvar map_1 = __importDefault(require(\"lodash/map\"));\nvar forEach_1 = __importDefault(require(\"lodash/forEach\"));\nvar values_1 = __importDefault(require(\"lodash/values\"));\nvar has_1 = __importDefault(require(\"lodash/has\"));\nvar clone_1 = __importDefault(require(\"lodash/clone\"));\nvar utils_1 = require(\"@chevrotain/utils\");\nvar follow_1 = require(\"../grammar/follow\");\nvar tokens_public_1 = require(\"../../scan/tokens_public\");\nvar errors_public_1 = require(\"../errors_public\");\nvar gast_resolver_public_1 = require(\"../grammar/gast/gast_resolver_public\");\nvar recoverable_1 = require(\"./traits/recoverable\");\nvar looksahead_1 = require(\"./traits/looksahead\");\nvar tree_builder_1 = require(\"./traits/tree_builder\");\nvar lexer_adapter_1 = require(\"./traits/lexer_adapter\");\nvar recognizer_api_1 = require(\"./traits/recognizer_api\");\nvar recognizer_engine_1 = require(\"./traits/recognizer_engine\");\nvar error_handler_1 = require(\"./traits/error_handler\");\nvar context_assist_1 = require(\"./traits/context_assist\");\nvar gast_recorder_1 = require(\"./traits/gast_recorder\");\nvar perf_tracer_1 = require(\"./traits/perf_tracer\");\nvar apply_mixins_1 = require(\"./utils/apply_mixins\");\nvar checks_1 = require(\"../grammar/checks\");\nexports.END_OF_FILE = (0, tokens_public_1.createTokenInstance)(tokens_public_1.EOF, \"\", NaN, NaN, NaN, NaN, NaN, NaN);\nObject.freeze(exports.END_OF_FILE);\nexports.DEFAULT_PARSER_CONFIG = Object.freeze({\n recoveryEnabled: false,\n maxLookahead: 3,\n dynamicTokensEnabled: false,\n outputCst: true,\n errorMessageProvider: errors_public_1.defaultParserErrorProvider,\n nodeLocationTracking: \"none\",\n traceInitPerf: false,\n skipValidations: false\n});\nexports.DEFAULT_RULE_CONFIG = Object.freeze({\n recoveryValueFunc: function () { return undefined; },\n resyncEnabled: true\n});\nvar ParserDefinitionErrorType;\n(function (ParserDefinitionErrorType) {\n ParserDefinitionErrorType[ParserDefinitionErrorType[\"INVALID_RULE_NAME\"] = 0] = \"INVALID_RULE_NAME\";\n ParserDefinitionErrorType[ParserDefinitionErrorType[\"DUPLICATE_RULE_NAME\"] = 1] = \"DUPLICATE_RULE_NAME\";\n ParserDefinitionErrorType[ParserDefinitionErrorType[\"INVALID_RULE_OVERRIDE\"] = 2] = \"INVALID_RULE_OVERRIDE\";\n ParserDefinitionErrorType[ParserDefinitionErrorType[\"DUPLICATE_PRODUCTIONS\"] = 3] = \"DUPLICATE_PRODUCTIONS\";\n ParserDefinitionErrorType[ParserDefinitionErrorType[\"UNRESOLVED_SUBRULE_REF\"] = 4] = \"UNRESOLVED_SUBRULE_REF\";\n ParserDefinitionErrorType[ParserDefinitionErrorType[\"LEFT_RECURSION\"] = 5] = \"LEFT_RECURSION\";\n ParserDefinitionErrorType[ParserDefinitionErrorType[\"NONE_LAST_EMPTY_ALT\"] = 6] = \"NONE_LAST_EMPTY_ALT\";\n ParserDefinitionErrorType[ParserDefinitionErrorType[\"AMBIGUOUS_ALTS\"] = 7] = \"AMBIGUOUS_ALTS\";\n ParserDefinitionErrorType[ParserDefinitionErrorType[\"CONFLICT_TOKENS_RULES_NAMESPACE\"] = 8] = \"CONFLICT_TOKENS_RULES_NAMESPACE\";\n ParserDefinitionErrorType[ParserDefinitionErrorType[\"INVALID_TOKEN_NAME\"] = 9] = \"INVALID_TOKEN_NAME\";\n ParserDefinitionErrorType[ParserDefinitionErrorType[\"NO_NON_EMPTY_LOOKAHEAD\"] = 10] = \"NO_NON_EMPTY_LOOKAHEAD\";\n ParserDefinitionErrorType[ParserDefinitionErrorType[\"AMBIGUOUS_PREFIX_ALTS\"] = 11] = \"AMBIGUOUS_PREFIX_ALTS\";\n ParserDefinitionErrorType[ParserDefinitionErrorType[\"TOO_MANY_ALTS\"] = 12] = \"TOO_MANY_ALTS\";\n ParserDefinitionErrorType[ParserDefinitionErrorType[\"CUSTOM_LOOKAHEAD_VALIDATION\"] = 13] = \"CUSTOM_LOOKAHEAD_VALIDATION\";\n})(ParserDefinitionErrorType = exports.ParserDefinitionErrorType || (exports.ParserDefinitionErrorType = {}));\nfunction EMPTY_ALT(value) {\n if (value === void 0) { value = undefined; }\n return function () {\n return value;\n };\n}\nexports.EMPTY_ALT = EMPTY_ALT;\nvar Parser = /** @class */ (function () {\n function Parser(tokenVocabulary, config) {\n this.definitionErrors = [];\n this.selfAnalysisDone = false;\n var that = this;\n that.initErrorHandler(config);\n that.initLexerAdapter();\n that.initLooksAhead(config);\n that.initRecognizerEngine(tokenVocabulary, config);\n that.initRecoverable(config);\n that.initTreeBuilder(config);\n that.initContentAssist();\n that.initGastRecorder(config);\n that.initPerformanceTracer(config);\n if ((0, has_1.default)(config, \"ignoredIssues\")) {\n throw new Error(\"The IParserConfig property has been deprecated.\\n\\t\" +\n \"Please use the flag on the relevant DSL method instead.\\n\\t\" +\n \"See: https://chevrotain.io/docs/guide/resolving_grammar_errors.html#IGNORING_AMBIGUITIES\\n\\t\" +\n \"For further details.\");\n }\n this.skipValidations = (0, has_1.default)(config, \"skipValidations\")\n ? config.skipValidations // casting assumes the end user passing the correct type\n : exports.DEFAULT_PARSER_CONFIG.skipValidations;\n }\n /**\n * @deprecated use the **instance** method with the same name instead\n */\n Parser.performSelfAnalysis = function (parserInstance) {\n throw Error(\"The **static** `performSelfAnalysis` method has been deprecated.\" +\n \"\\t\\nUse the **instance** method with the same name instead.\");\n };\n Parser.prototype.performSelfAnalysis = function () {\n var _this = this;\n this.TRACE_INIT(\"performSelfAnalysis\", function () {\n var defErrorsMsgs;\n _this.selfAnalysisDone = true;\n var className = _this.className;\n _this.TRACE_INIT(\"toFastProps\", function () {\n // Without this voodoo magic the parser would be x3-x4 slower\n // It seems it is better to invoke `toFastProperties` **before**\n // Any manipulations of the `this` object done during the recording phase.\n (0, utils_1.toFastProperties)(_this);\n });\n _this.TRACE_INIT(\"Grammar Recording\", function () {\n try {\n _this.enableRecording();\n // Building the GAST\n (0, forEach_1.default)(_this.definedRulesNames, function (currRuleName) {\n var wrappedRule = _this[currRuleName];\n var originalGrammarAction = wrappedRule[\"originalGrammarAction\"];\n var recordedRuleGast;\n _this.TRACE_INIT(\"\".concat(currRuleName, \" Rule\"), function () {\n recordedRuleGast = _this.topLevelRuleRecord(currRuleName, originalGrammarAction);\n });\n _this.gastProductionsCache[currRuleName] = recordedRuleGast;\n });\n }\n finally {\n _this.disableRecording();\n }\n });\n var resolverErrors = [];\n _this.TRACE_INIT(\"Grammar Resolving\", function () {\n resolverErrors = (0, gast_resolver_public_1.resolveGrammar)({\n rules: (0, values_1.default)(_this.gastProductionsCache)\n });\n _this.definitionErrors = _this.definitionErrors.concat(resolverErrors);\n });\n _this.TRACE_INIT(\"Grammar Validations\", function () {\n // only perform additional grammar validations IFF no resolving errors have occurred.\n // as unresolved grammar may lead to unhandled runtime exceptions in the follow up validations.\n if ((0, isEmpty_1.default)(resolverErrors) && _this.skipValidations === false) {\n var validationErrors = (0, gast_resolver_public_1.validateGrammar)({\n rules: (0, values_1.default)(_this.gastProductionsCache),\n tokenTypes: (0, values_1.default)(_this.tokensMap),\n errMsgProvider: errors_public_1.defaultGrammarValidatorErrorProvider,\n grammarName: className\n });\n var lookaheadValidationErrors = (0, checks_1.validateLookahead)({\n lookaheadStrategy: _this.lookaheadStrategy,\n rules: (0, values_1.default)(_this.gastProductionsCache),\n tokenTypes: (0, values_1.default)(_this.tokensMap),\n grammarName: className\n });\n _this.definitionErrors = _this.definitionErrors.concat(validationErrors, lookaheadValidationErrors);\n }\n });\n // this analysis may fail if the grammar is not perfectly valid\n if ((0, isEmpty_1.default)(_this.definitionErrors)) {\n // The results of these computations are not needed unless error recovery is enabled.\n if (_this.recoveryEnabled) {\n _this.TRACE_INIT(\"computeAllProdsFollows\", function () {\n var allFollows = (0, follow_1.computeAllProdsFollows)((0, values_1.default)(_this.gastProductionsCache));\n _this.resyncFollows = allFollows;\n });\n }\n _this.TRACE_INIT(\"ComputeLookaheadFunctions\", function () {\n var _a, _b;\n (_b = (_a = _this.lookaheadStrategy).initialize) === null || _b === void 0 ? void 0 : _b.call(_a, {\n rules: (0, values_1.default)(_this.gastProductionsCache)\n });\n _this.preComputeLookaheadFunctions((0, values_1.default)(_this.gastProductionsCache));\n });\n }\n if (!Parser.DEFER_DEFINITION_ERRORS_HANDLING &&\n !(0, isEmpty_1.default)(_this.definitionErrors)) {\n defErrorsMsgs = (0, map_1.default)(_this.definitionErrors, function (defError) { return defError.message; });\n throw new Error(\"Parser Definition Errors detected:\\n \".concat(defErrorsMsgs.join(\"\\n-------------------------------\\n\")));\n }\n });\n };\n // Set this flag to true if you don't want the Parser to throw error when problems in it's definition are detected.\n // (normally during the parser's constructor).\n // This is a design time flag, it will not affect the runtime error handling of the parser, just design time errors,\n // for example: duplicate rule names, referencing an unresolved subrule, ect...\n // This flag should not be enabled during normal usage, it is used in special situations, for example when\n // needing to display the parser definition errors in some GUI(online playground).\n Parser.DEFER_DEFINITION_ERRORS_HANDLING = false;\n return Parser;\n}());\nexports.Parser = Parser;\n(0, apply_mixins_1.applyMixins)(Parser, [\n recoverable_1.Recoverable,\n looksahead_1.LooksAhead,\n tree_builder_1.TreeBuilder,\n lexer_adapter_1.LexerAdapter,\n recognizer_engine_1.RecognizerEngine,\n recognizer_api_1.RecognizerApi,\n error_handler_1.ErrorHandler,\n context_assist_1.ContentAssist,\n gast_recorder_1.GastRecorder,\n perf_tracer_1.PerformanceTracer\n]);\nvar CstParser = /** @class */ (function (_super) {\n __extends(CstParser, _super);\n function CstParser(tokenVocabulary, config) {\n if (config === void 0) { config = exports.DEFAULT_PARSER_CONFIG; }\n var configClone = (0, clone_1.default)(config);\n configClone.outputCst = true;\n return _super.call(this, tokenVocabulary, configClone) || this;\n }\n return CstParser;\n}(Parser));\nexports.CstParser = CstParser;\nvar EmbeddedActionsParser = /** @class */ (function (_super) {\n __extends(EmbeddedActionsParser, _super);\n function EmbeddedActionsParser(tokenVocabulary, config) {\n if (config === void 0) { config = exports.DEFAULT_PARSER_CONFIG; }\n var configClone = (0, clone_1.default)(config);\n configClone.outputCst = false;\n return _super.call(this, tokenVocabulary, configClone) || this;\n }\n return EmbeddedActionsParser;\n}(Parser));\nexports.EmbeddedActionsParser = EmbeddedActionsParser;\n//# sourceMappingURL=parser.js.map","var arrayPush = require('./_arrayPush'),\n getPrototype = require('./_getPrototype'),\n getSymbols = require('./_getSymbols'),\n stubArray = require('./stubArray');\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeGetSymbols = Object.getOwnPropertySymbols;\n\n/**\n * Creates an array of the own and inherited enumerable symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of symbols.\n */\nvar getSymbolsIn = !nativeGetSymbols ? stubArray : function(object) {\n var result = [];\n while (object) {\n arrayPush(result, getSymbols(object));\n object = getPrototype(object);\n }\n return result;\n};\n\nmodule.exports = getSymbolsIn;\n","\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.genDts = void 0;\nvar flatten_1 = __importDefault(require(\"lodash/flatten\"));\nvar isArray_1 = __importDefault(require(\"lodash/isArray\"));\nvar map_1 = __importDefault(require(\"lodash/map\"));\nvar reduce_1 = __importDefault(require(\"lodash/reduce\"));\nvar uniq_1 = __importDefault(require(\"lodash/uniq\"));\nvar upperFirst_1 = __importDefault(require(\"lodash/upperFirst\"));\nfunction genDts(model, options) {\n var contentParts = [];\n contentParts = contentParts.concat(\"import type { CstNode, ICstVisitor, IToken } from \\\"chevrotain\\\";\");\n contentParts = contentParts.concat((0, flatten_1.default)((0, map_1.default)(model, function (node) { return genCstNodeTypes(node); })));\n if (options.includeVisitorInterface) {\n contentParts = contentParts.concat(genVisitor(options.visitorInterfaceName, model));\n }\n return contentParts.join(\"\\n\\n\") + \"\\n\";\n}\nexports.genDts = genDts;\nfunction genCstNodeTypes(node) {\n var nodeCstInterface = genNodeInterface(node);\n var nodeChildrenInterface = genNodeChildrenType(node);\n return [nodeCstInterface, nodeChildrenInterface];\n}\nfunction genNodeInterface(node) {\n var nodeInterfaceName = getNodeInterfaceName(node.name);\n var childrenTypeName = getNodeChildrenTypeName(node.name);\n return \"export interface \".concat(nodeInterfaceName, \" extends CstNode {\\n name: \\\"\").concat(node.name, \"\\\";\\n children: \").concat(childrenTypeName, \";\\n}\");\n}\nfunction genNodeChildrenType(node) {\n var typeName = getNodeChildrenTypeName(node.name);\n return \"export type \".concat(typeName, \" = {\\n \").concat((0, map_1.default)(node.properties, function (property) { return genChildProperty(property); }).join(\"\\n \"), \"\\n};\");\n}\nfunction genChildProperty(prop) {\n var typeName = buildTypeString(prop.type);\n return \"\".concat(prop.name).concat(prop.optional ? \"?\" : \"\", \": \").concat(typeName, \"[];\");\n}\nfunction genVisitor(name, nodes) {\n return \"export interface \".concat(name, \" extends ICstVisitor {\\n \").concat((0, map_1.default)(nodes, function (node) { return genVisitorFunction(node); }).join(\"\\n \"), \"\\n}\");\n}\nfunction genVisitorFunction(node) {\n var childrenTypeName = getNodeChildrenTypeName(node.name);\n return \"\".concat(node.name, \"(children: \").concat(childrenTypeName, \", param?: IN): OUT;\");\n}\nfunction buildTypeString(type) {\n if ((0, isArray_1.default)(type)) {\n var typeNames = (0, uniq_1.default)((0, map_1.default)(type, function (t) { return getTypeString(t); }));\n var typeString = (0, reduce_1.default)(typeNames, function (sum, t) { return sum + \" | \" + t; });\n return \"(\" + typeString + \")\";\n }\n else {\n return getTypeString(type);\n }\n}\nfunction getTypeString(type) {\n if (type.kind === \"token\") {\n return \"IToken\";\n }\n return getNodeInterfaceName(type.name);\n}\nfunction getNodeInterfaceName(ruleName) {\n return (0, upperFirst_1.default)(ruleName) + \"CstNode\";\n}\nfunction getNodeChildrenTypeName(ruleName) {\n return (0, upperFirst_1.default)(ruleName) + \"CstChildren\";\n}\n//# sourceMappingURL=generate.js.map","/**\n * Checks if `value` is classified as an `Array` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(document.body.children);\n * // => false\n *\n * _.isArray('abc');\n * // => false\n *\n * _.isArray(_.noop);\n * // => false\n */\nvar isArray = Array.isArray;\n\nmodule.exports = isArray;\n","var getNative = require('./_getNative'),\n root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar Set = getNative(root, 'Set');\n\nmodule.exports = Set;\n","var baseAssignValue = require('./_baseAssignValue'),\n eq = require('./eq');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Assigns `value` to `key` of `object` if the existing value is not equivalent\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\nfunction assignValue(object, key, value) {\n var objValue = object[key];\n if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) ||\n (value === undefined && !(key in object))) {\n baseAssignValue(object, key, value);\n }\n}\n\nmodule.exports = assignValue;\n","(function (window, factory) {\n if (typeof exports === 'object') {\n module.exports = factory();\n } else if (typeof define === 'function' && define.amd) {\n define(factory);\n } else {\n window.jStat = factory();\n }\n})(this, function () {\nvar jStat = (function(Math, undefined) {\n\n// For quick reference.\nvar concat = Array.prototype.concat;\nvar slice = Array.prototype.slice;\nvar toString = Object.prototype.toString;\n\n// Calculate correction for IEEE error\n// TODO: This calculation can be improved.\nfunction calcRdx(n, m) {\n var val = n > m ? n : m;\n return Math.pow(10,\n 17 - ~~(Math.log(((val > 0) ? val : -val)) * Math.LOG10E));\n}\n\n\nvar isArray = Array.isArray || function isArray(arg) {\n return toString.call(arg) === '[object Array]';\n};\n\n\nfunction isFunction(arg) {\n return toString.call(arg) === '[object Function]';\n}\n\n\nfunction isNumber(num) {\n return (typeof num === 'number') ? num - num === 0 : false;\n}\n\n\n// Converts the jStat matrix to vector.\nfunction toVector(arr) {\n return concat.apply([], arr);\n}\n\n\n// The one and only jStat constructor.\nfunction jStat() {\n return new jStat._init(arguments);\n}\n\n\n// TODO: Remove after all references in src files have been removed.\njStat.fn = jStat.prototype;\n\n\n// By separating the initializer from the constructor it's easier to handle\n// always returning a new instance whether \"new\" was used or not.\njStat._init = function _init(args) {\n // If first argument is an array, must be vector or matrix.\n if (isArray(args[0])) {\n // Check if matrix.\n if (isArray(args[0][0])) {\n // See if a mapping function was also passed.\n if (isFunction(args[1]))\n args[0] = jStat.map(args[0], args[1]);\n // Iterate over each is faster than this.push.apply(this, args[0].\n for (var i = 0; i < args[0].length; i++)\n this[i] = args[0][i];\n this.length = args[0].length;\n\n // Otherwise must be a vector.\n } else {\n this[0] = isFunction(args[1]) ? jStat.map(args[0], args[1]) : args[0];\n this.length = 1;\n }\n\n // If first argument is number, assume creation of sequence.\n } else if (isNumber(args[0])) {\n this[0] = jStat.seq.apply(null, args);\n this.length = 1;\n\n // Handle case when jStat object is passed to jStat.\n } else if (args[0] instanceof jStat) {\n // Duplicate the object and pass it back.\n return jStat(args[0].toArray());\n\n // Unexpected argument value, return empty jStat object.\n // TODO: This is strange behavior. Shouldn't this throw or some such to let\n // the user know they had bad arguments?\n } else {\n this[0] = [];\n this.length = 1;\n }\n\n return this;\n};\njStat._init.prototype = jStat.prototype;\njStat._init.constructor = jStat;\n\n\n// Utility functions.\n// TODO: for internal use only?\njStat.utils = {\n calcRdx: calcRdx,\n isArray: isArray,\n isFunction: isFunction,\n isNumber: isNumber,\n toVector: toVector\n};\n\n\njStat._random_fn = Math.random;\njStat.setRandom = function setRandom(fn) {\n if (typeof fn !== 'function')\n throw new TypeError('fn is not a function');\n jStat._random_fn = fn;\n};\n\n\n// Easily extend the jStat object.\n// TODO: is this seriously necessary?\njStat.extend = function extend(obj) {\n var i, j;\n\n if (arguments.length === 1) {\n for (j in obj)\n jStat[j] = obj[j];\n return this;\n }\n\n for (i = 1; i < arguments.length; i++) {\n for (j in arguments[i])\n obj[j] = arguments[i][j];\n }\n\n return obj;\n};\n\n\n// Returns the number of rows in the matrix.\njStat.rows = function rows(arr) {\n return arr.length || 1;\n};\n\n\n// Returns the number of columns in the matrix.\njStat.cols = function cols(arr) {\n return arr[0].length || 1;\n};\n\n\n// Returns the dimensions of the object { rows: i, cols: j }\njStat.dimensions = function dimensions(arr) {\n return {\n rows: jStat.rows(arr),\n cols: jStat.cols(arr)\n };\n};\n\n\n// Returns a specified row as a vector or return a sub matrix by pick some rows\njStat.row = function row(arr, index) {\n if (isArray(index)) {\n return index.map(function(i) {\n return jStat.row(arr, i);\n })\n }\n return arr[index];\n};\n\n\n// return row as array\n// rowa([[1,2],[3,4]],0) -> [1,2]\njStat.rowa = function rowa(arr, i) {\n return jStat.row(arr, i);\n};\n\n\n// Returns the specified column as a vector or return a sub matrix by pick some\n// columns\njStat.col = function col(arr, index) {\n if (isArray(index)) {\n var submat = jStat.arange(arr.length).map(function() {\n return new Array(index.length);\n });\n index.forEach(function(ind, i){\n jStat.arange(arr.length).forEach(function(j) {\n submat[j][i] = arr[j][ind];\n });\n });\n return submat;\n }\n var column = new Array(arr.length);\n for (var i = 0; i < arr.length; i++)\n column[i] = [arr[i][index]];\n return column;\n};\n\n\n// return column as array\n// cola([[1,2],[3,4]],0) -> [1,3]\njStat.cola = function cola(arr, i) {\n return jStat.col(arr, i).map(function(a){ return a[0] });\n};\n\n\n// Returns the diagonal of the matrix\njStat.diag = function diag(arr) {\n var nrow = jStat.rows(arr);\n var res = new Array(nrow);\n for (var row = 0; row < nrow; row++)\n res[row] = [arr[row][row]];\n return res;\n};\n\n\n// Returns the anti-diagonal of the matrix\njStat.antidiag = function antidiag(arr) {\n var nrow = jStat.rows(arr) - 1;\n var res = new Array(nrow);\n for (var i = 0; nrow >= 0; nrow--, i++)\n res[i] = [arr[i][nrow]];\n return res;\n};\n\n// Transpose a matrix or array.\njStat.transpose = function transpose(arr) {\n var obj = [];\n var objArr, rows, cols, j, i;\n\n // Make sure arr is in matrix format.\n if (!isArray(arr[0]))\n arr = [arr];\n\n rows = arr.length;\n cols = arr[0].length;\n\n for (i = 0; i < cols; i++) {\n objArr = new Array(rows);\n for (j = 0; j < rows; j++)\n objArr[j] = arr[j][i];\n obj.push(objArr);\n }\n\n // If obj is vector, return only single array.\n return obj.length === 1 ? obj[0] : obj;\n};\n\n\n// Map a function to an array or array of arrays.\n// \"toAlter\" is an internal variable.\njStat.map = function map(arr, func, toAlter) {\n var row, nrow, ncol, res, col;\n\n if (!isArray(arr[0]))\n arr = [arr];\n\n nrow = arr.length;\n ncol = arr[0].length;\n res = toAlter ? arr : new Array(nrow);\n\n for (row = 0; row < nrow; row++) {\n // if the row doesn't exist, create it\n if (!res[row])\n res[row] = new Array(ncol);\n for (col = 0; col < ncol; col++)\n res[row][col] = func(arr[row][col], row, col);\n }\n\n return res.length === 1 ? res[0] : res;\n};\n\n\n// Cumulatively combine the elements of an array or array of arrays using a function.\njStat.cumreduce = function cumreduce(arr, func, toAlter) {\n var row, nrow, ncol, res, col;\n\n if (!isArray(arr[0]))\n arr = [arr];\n\n nrow = arr.length;\n ncol = arr[0].length;\n res = toAlter ? arr : new Array(nrow);\n\n for (row = 0; row < nrow; row++) {\n // if the row doesn't exist, create it\n if (!res[row])\n res[row] = new Array(ncol);\n if (ncol > 0)\n res[row][0] = arr[row][0];\n for (col = 1; col < ncol; col++)\n res[row][col] = func(res[row][col-1], arr[row][col]);\n }\n return res.length === 1 ? res[0] : res;\n};\n\n\n// Destructively alter an array.\njStat.alter = function alter(arr, func) {\n return jStat.map(arr, func, true);\n};\n\n\n// Generate a rows x cols matrix according to the supplied function.\njStat.create = function create(rows, cols, func) {\n var res = new Array(rows);\n var i, j;\n\n if (isFunction(cols)) {\n func = cols;\n cols = rows;\n }\n\n for (i = 0; i < rows; i++) {\n res[i] = new Array(cols);\n for (j = 0; j < cols; j++)\n res[i][j] = func(i, j);\n }\n\n return res;\n};\n\n\nfunction retZero() { return 0; }\n\n\n// Generate a rows x cols matrix of zeros.\njStat.zeros = function zeros(rows, cols) {\n if (!isNumber(cols))\n cols = rows;\n return jStat.create(rows, cols, retZero);\n};\n\n\nfunction retOne() { return 1; }\n\n\n// Generate a rows x cols matrix of ones.\njStat.ones = function ones(rows, cols) {\n if (!isNumber(cols))\n cols = rows;\n return jStat.create(rows, cols, retOne);\n};\n\n\n// Generate a rows x cols matrix of uniformly random numbers.\njStat.rand = function rand(rows, cols) {\n if (!isNumber(cols))\n cols = rows;\n return jStat.create(rows, cols, jStat._random_fn);\n};\n\n\nfunction retIdent(i, j) { return i === j ? 1 : 0; }\n\n\n// Generate an identity matrix of size row x cols.\njStat.identity = function identity(rows, cols) {\n if (!isNumber(cols))\n cols = rows;\n return jStat.create(rows, cols, retIdent);\n};\n\n\n// Tests whether a matrix is symmetric\njStat.symmetric = function symmetric(arr) {\n var size = arr.length;\n var row, col;\n\n if (arr.length !== arr[0].length)\n return false;\n\n for (row = 0; row < size; row++) {\n for (col = 0; col < size; col++)\n if (arr[col][row] !== arr[row][col])\n return false;\n }\n\n return true;\n};\n\n\n// Set all values to zero.\njStat.clear = function clear(arr) {\n return jStat.alter(arr, retZero);\n};\n\n\n// Generate sequence.\njStat.seq = function seq(min, max, length, func) {\n if (!isFunction(func))\n func = false;\n\n var arr = [];\n var hival = calcRdx(min, max);\n var step = (max * hival - min * hival) / ((length - 1) * hival);\n var current = min;\n var cnt;\n\n // Current is assigned using a technique to compensate for IEEE error.\n // TODO: Needs better implementation.\n for (cnt = 0;\n current <= max && cnt < length;\n cnt++, current = (min * hival + step * hival * cnt) / hival) {\n arr.push((func ? func(current, cnt) : current));\n }\n\n return arr;\n};\n\n\n// arange(5) -> [0,1,2,3,4]\n// arange(1,5) -> [1,2,3,4]\n// arange(5,1,-1) -> [5,4,3,2]\njStat.arange = function arange(start, end, step) {\n var rl = [];\n var i;\n step = step || 1;\n if (end === undefined) {\n end = start;\n start = 0;\n }\n if (start === end || step === 0) {\n return [];\n }\n if (start < end && step < 0) {\n return [];\n }\n if (start > end && step > 0) {\n return [];\n }\n if (step > 0) {\n for (i = start; i < end; i += step) {\n rl.push(i);\n }\n } else {\n for (i = start; i > end; i += step) {\n rl.push(i);\n }\n }\n return rl;\n};\n\n\n// A=[[1,2,3],[4,5,6],[7,8,9]]\n// slice(A,{row:{end:2},col:{start:1}}) -> [[2,3],[5,6]]\n// slice(A,1,{start:1}) -> [5,6]\n// as numpy code A[:2,1:]\njStat.slice = (function(){\n function _slice(list, start, end, step) {\n // note it's not equal to range.map mode it's a bug\n var i;\n var rl = [];\n var length = list.length;\n if (start === undefined && end === undefined && step === undefined) {\n return jStat.copy(list);\n }\n\n start = start || 0;\n end = end || list.length;\n start = start >= 0 ? start : length + start;\n end = end >= 0 ? end : length + end;\n step = step || 1;\n if (start === end || step === 0) {\n return [];\n }\n if (start < end && step < 0) {\n return [];\n }\n if (start > end && step > 0) {\n return [];\n }\n if (step > 0) {\n for (i = start; i < end; i += step) {\n rl.push(list[i]);\n }\n } else {\n for (i = start; i > end;i += step) {\n rl.push(list[i]);\n }\n }\n return rl;\n }\n\n function slice(list, rcSlice) {\n var colSlice, rowSlice;\n rcSlice = rcSlice || {};\n if (isNumber(rcSlice.row)) {\n if (isNumber(rcSlice.col))\n return list[rcSlice.row][rcSlice.col];\n var row = jStat.rowa(list, rcSlice.row);\n colSlice = rcSlice.col || {};\n return _slice(row, colSlice.start, colSlice.end, colSlice.step);\n }\n\n if (isNumber(rcSlice.col)) {\n var col = jStat.cola(list, rcSlice.col);\n rowSlice = rcSlice.row || {};\n return _slice(col, rowSlice.start, rowSlice.end, rowSlice.step);\n }\n\n rowSlice = rcSlice.row || {};\n colSlice = rcSlice.col || {};\n var rows = _slice(list, rowSlice.start, rowSlice.end, rowSlice.step);\n return rows.map(function(row) {\n return _slice(row, colSlice.start, colSlice.end, colSlice.step);\n });\n }\n\n return slice;\n}());\n\n\n// A=[[1,2,3],[4,5,6],[7,8,9]]\n// sliceAssign(A,{row:{start:1},col:{start:1}},[[0,0],[0,0]])\n// A=[[1,2,3],[4,0,0],[7,0,0]]\njStat.sliceAssign = function sliceAssign(A, rcSlice, B) {\n var nl, ml;\n if (isNumber(rcSlice.row)) {\n if (isNumber(rcSlice.col))\n return A[rcSlice.row][rcSlice.col] = B;\n rcSlice.col = rcSlice.col || {};\n rcSlice.col.start = rcSlice.col.start || 0;\n rcSlice.col.end = rcSlice.col.end || A[0].length;\n rcSlice.col.step = rcSlice.col.step || 1;\n nl = jStat.arange(rcSlice.col.start,\n Math.min(A.length, rcSlice.col.end),\n rcSlice.col.step);\n var m = rcSlice.row;\n nl.forEach(function(n, i) {\n A[m][n] = B[i];\n });\n return A;\n }\n\n if (isNumber(rcSlice.col)) {\n rcSlice.row = rcSlice.row || {};\n rcSlice.row.start = rcSlice.row.start || 0;\n rcSlice.row.end = rcSlice.row.end || A.length;\n rcSlice.row.step = rcSlice.row.step || 1;\n ml = jStat.arange(rcSlice.row.start,\n Math.min(A[0].length, rcSlice.row.end),\n rcSlice.row.step);\n var n = rcSlice.col;\n ml.forEach(function(m, j) {\n A[m][n] = B[j];\n });\n return A;\n }\n\n if (B[0].length === undefined) {\n B = [B];\n }\n rcSlice.row.start = rcSlice.row.start || 0;\n rcSlice.row.end = rcSlice.row.end || A.length;\n rcSlice.row.step = rcSlice.row.step || 1;\n rcSlice.col.start = rcSlice.col.start || 0;\n rcSlice.col.end = rcSlice.col.end || A[0].length;\n rcSlice.col.step = rcSlice.col.step || 1;\n ml = jStat.arange(rcSlice.row.start,\n Math.min(A.length, rcSlice.row.end),\n rcSlice.row.step);\n nl = jStat.arange(rcSlice.col.start,\n Math.min(A[0].length, rcSlice.col.end),\n rcSlice.col.step);\n ml.forEach(function(m, i) {\n nl.forEach(function(n, j) {\n A[m][n] = B[i][j];\n });\n });\n return A;\n};\n\n\n// [1,2,3] ->\n// [[1,0,0],[0,2,0],[0,0,3]]\njStat.diagonal = function diagonal(diagArray) {\n var mat = jStat.zeros(diagArray.length, diagArray.length);\n diagArray.forEach(function(t, i) {\n mat[i][i] = t;\n });\n return mat;\n};\n\n\n// return copy of A\njStat.copy = function copy(A) {\n return A.map(function(row) {\n if (isNumber(row))\n return row;\n return row.map(function(t) {\n return t;\n });\n });\n};\n\n\n// TODO: Go over this entire implementation. Seems a tragic waste of resources\n// doing all this work. Instead, and while ugly, use new Function() to generate\n// a custom function for each static method.\n\n// Quick reference.\nvar jProto = jStat.prototype;\n\n// Default length.\njProto.length = 0;\n\n// For internal use only.\n// TODO: Check if they're actually used, and if they are then rename them\n// to _*\njProto.push = Array.prototype.push;\njProto.sort = Array.prototype.sort;\njProto.splice = Array.prototype.splice;\njProto.slice = Array.prototype.slice;\n\n\n// Return a clean array.\njProto.toArray = function toArray() {\n return this.length > 1 ? slice.call(this) : slice.call(this)[0];\n};\n\n\n// Map a function to a matrix or vector.\njProto.map = function map(func, toAlter) {\n return jStat(jStat.map(this, func, toAlter));\n};\n\n\n// Cumulatively combine the elements of a matrix or vector using a function.\njProto.cumreduce = function cumreduce(func, toAlter) {\n return jStat(jStat.cumreduce(this, func, toAlter));\n};\n\n\n// Destructively alter an array.\njProto.alter = function alter(func) {\n jStat.alter(this, func);\n return this;\n};\n\n\n// Extend prototype with methods that have no argument.\n(function(funcs) {\n for (var i = 0; i < funcs.length; i++) (function(passfunc) {\n jProto[passfunc] = function(func) {\n var self = this,\n results;\n // Check for callback.\n if (func) {\n setTimeout(function() {\n func.call(self, jProto[passfunc].call(self));\n });\n return this;\n }\n results = jStat[passfunc](this);\n return isArray(results) ? jStat(results) : results;\n };\n })(funcs[i]);\n})('transpose clear symmetric rows cols dimensions diag antidiag'.split(' '));\n\n\n// Extend prototype with methods that have one argument.\n(function(funcs) {\n for (var i = 0; i < funcs.length; i++) (function(passfunc) {\n jProto[passfunc] = function(index, func) {\n var self = this;\n // check for callback\n if (func) {\n setTimeout(function() {\n func.call(self, jProto[passfunc].call(self, index));\n });\n return this;\n }\n return jStat(jStat[passfunc](this, index));\n };\n })(funcs[i]);\n})('row col'.split(' '));\n\n\n// Extend prototype with simple shortcut methods.\n(function(funcs) {\n for (var i = 0; i < funcs.length; i++) (function(passfunc) {\n jProto[passfunc] = function() {\n return jStat(jStat[passfunc].apply(null, arguments));\n };\n })(funcs[i]);\n})('create zeros ones rand identity'.split(' '));\n\n\n// Exposing jStat.\nreturn jStat;\n\n}(Math));\n(function(jStat, Math) {\n\nvar isFunction = jStat.utils.isFunction;\n\n// Ascending functions for sort\nfunction ascNum(a, b) { return a - b; }\n\nfunction clip(arg, min, max) {\n return Math.max(min, Math.min(arg, max));\n}\n\n\n// sum of an array\njStat.sum = function sum(arr) {\n var sum = 0;\n var i = arr.length;\n while (--i >= 0)\n sum += arr[i];\n return sum;\n};\n\n\n// sum squared\njStat.sumsqrd = function sumsqrd(arr) {\n var sum = 0;\n var i = arr.length;\n while (--i >= 0)\n sum += arr[i] * arr[i];\n return sum;\n};\n\n\n// sum of squared errors of prediction (SSE)\njStat.sumsqerr = function sumsqerr(arr) {\n var mean = jStat.mean(arr);\n var sum = 0;\n var i = arr.length;\n var tmp;\n while (--i >= 0) {\n tmp = arr[i] - mean;\n sum += tmp * tmp;\n }\n return sum;\n};\n\n// sum of an array in each row\njStat.sumrow = function sumrow(arr) {\n var sum = 0;\n var i = arr.length;\n while (--i >= 0)\n sum += arr[i];\n return sum;\n};\n\n// product of an array\njStat.product = function product(arr) {\n var prod = 1;\n var i = arr.length;\n while (--i >= 0)\n prod *= arr[i];\n return prod;\n};\n\n\n// minimum value of an array\njStat.min = function min(arr) {\n var low = arr[0];\n var i = 0;\n while (++i < arr.length)\n if (arr[i] < low)\n low = arr[i];\n return low;\n};\n\n\n// maximum value of an array\njStat.max = function max(arr) {\n var high = arr[0];\n var i = 0;\n while (++i < arr.length)\n if (arr[i] > high)\n high = arr[i];\n return high;\n};\n\n\n// unique values of an array\njStat.unique = function unique(arr) {\n var hash = {}, _arr = [];\n for(var i = 0; i < arr.length; i++) {\n if (!hash[arr[i]]) {\n hash[arr[i]] = true;\n _arr.push(arr[i]);\n }\n }\n return _arr;\n};\n\n\n// mean value of an array\njStat.mean = function mean(arr) {\n return jStat.sum(arr) / arr.length;\n};\n\n\n// mean squared error (MSE)\njStat.meansqerr = function meansqerr(arr) {\n return jStat.sumsqerr(arr) / arr.length;\n};\n\n\n// geometric mean of an array\njStat.geomean = function geomean(arr) {\n var logs = arr.map(Math.log)\n var meanOfLogs = jStat.mean(logs)\n return Math.exp(meanOfLogs)\n};\n\n\n// median of an array\njStat.median = function median(arr) {\n var arrlen = arr.length;\n var _arr = arr.slice().sort(ascNum);\n // check if array is even or odd, then return the appropriate\n return !(arrlen & 1)\n ? (_arr[(arrlen / 2) - 1 ] + _arr[(arrlen / 2)]) / 2\n : _arr[(arrlen / 2) | 0 ];\n};\n\n\n// cumulative sum of an array\njStat.cumsum = function cumsum(arr) {\n return jStat.cumreduce(arr, function (a, b) { return a + b; });\n};\n\n\n// cumulative product of an array\njStat.cumprod = function cumprod(arr) {\n return jStat.cumreduce(arr, function (a, b) { return a * b; });\n};\n\n\n// successive differences of a sequence\njStat.diff = function diff(arr) {\n var diffs = [];\n var arrLen = arr.length;\n var i;\n for (i = 1; i < arrLen; i++)\n diffs.push(arr[i] - arr[i - 1]);\n return diffs;\n};\n\n\n// ranks of an array\njStat.rank = function (arr) {\n var i;\n var distinctNumbers = [];\n var numberCounts = {};\n for (i = 0; i < arr.length; i++) {\n var number = arr[i];\n if (numberCounts[number]) {\n numberCounts[number]++;\n } else {\n numberCounts[number] = 1;\n distinctNumbers.push(number);\n }\n }\n\n var sortedDistinctNumbers = distinctNumbers.sort(ascNum);\n var numberRanks = {};\n var currentRank = 1;\n for (i = 0; i < sortedDistinctNumbers.length; i++) {\n var number = sortedDistinctNumbers[i];\n var count = numberCounts[number];\n var first = currentRank;\n var last = currentRank + count - 1;\n var rank = (first + last) / 2;\n numberRanks[number] = rank;\n currentRank += count;\n }\n\n return arr.map(function (number) {\n return numberRanks[number];\n });\n};\n\n\n// mode of an array\n// if there are multiple modes of an array, return all of them\n// is this the appropriate way of handling it?\njStat.mode = function mode(arr) {\n var arrLen = arr.length;\n var _arr = arr.slice().sort(ascNum);\n var count = 1;\n var maxCount = 0;\n var numMaxCount = 0;\n var mode_arr = [];\n var i;\n\n for (i = 0; i < arrLen; i++) {\n if (_arr[i] === _arr[i + 1]) {\n count++;\n } else {\n if (count > maxCount) {\n mode_arr = [_arr[i]];\n maxCount = count;\n numMaxCount = 0;\n }\n // are there multiple max counts\n else if (count === maxCount) {\n mode_arr.push(_arr[i]);\n numMaxCount++;\n }\n // resetting count for new value in array\n count = 1;\n }\n }\n\n return numMaxCount === 0 ? mode_arr[0] : mode_arr;\n};\n\n\n// range of an array\njStat.range = function range(arr) {\n return jStat.max(arr) - jStat.min(arr);\n};\n\n// variance of an array\n// flag = true indicates sample instead of population\njStat.variance = function variance(arr, flag) {\n return jStat.sumsqerr(arr) / (arr.length - (flag ? 1 : 0));\n};\n\n// pooled variance of an array of arrays\njStat.pooledvariance = function pooledvariance(arr) {\n var sumsqerr = arr.reduce(function (a, samples) {return a + jStat.sumsqerr(samples);}, 0);\n var count = arr.reduce(function (a, samples) {return a + samples.length;}, 0);\n return sumsqerr / (count - arr.length);\n};\n\n// deviation of an array\njStat.deviation = function (arr) {\n var mean = jStat.mean(arr);\n var arrlen = arr.length;\n var dev = new Array(arrlen);\n for (var i = 0; i < arrlen; i++) {\n dev[i] = arr[i] - mean;\n }\n return dev;\n};\n\n// standard deviation of an array\n// flag = true indicates sample instead of population\njStat.stdev = function stdev(arr, flag) {\n return Math.sqrt(jStat.variance(arr, flag));\n};\n\n// pooled standard deviation of an array of arrays\njStat.pooledstdev = function pooledstdev(arr) {\n return Math.sqrt(jStat.pooledvariance(arr));\n};\n\n// mean deviation (mean absolute deviation) of an array\njStat.meandev = function meandev(arr) {\n var mean = jStat.mean(arr);\n var a = [];\n for (var i = arr.length - 1; i >= 0; i--) {\n a.push(Math.abs(arr[i] - mean));\n }\n return jStat.mean(a);\n};\n\n\n// median deviation (median absolute deviation) of an array\njStat.meddev = function meddev(arr) {\n var median = jStat.median(arr);\n var a = [];\n for (var i = arr.length - 1; i >= 0; i--) {\n a.push(Math.abs(arr[i] - median));\n }\n return jStat.median(a);\n};\n\n\n// coefficient of variation\njStat.coeffvar = function coeffvar(arr) {\n return jStat.stdev(arr) / jStat.mean(arr);\n};\n\n\n// quartiles of an array\njStat.quartiles = function quartiles(arr) {\n var arrlen = arr.length;\n var _arr = arr.slice().sort(ascNum);\n return [\n _arr[ Math.round((arrlen) / 4) - 1 ],\n _arr[ Math.round((arrlen) / 2) - 1 ],\n _arr[ Math.round((arrlen) * 3 / 4) - 1 ]\n ];\n};\n\n\n// Arbitary quantiles of an array. Direct port of the scipy.stats\n// implementation by Pierre GF Gerard-Marchant.\njStat.quantiles = function quantiles(arr, quantilesArray, alphap, betap) {\n var sortedArray = arr.slice().sort(ascNum);\n var quantileVals = [quantilesArray.length];\n var n = arr.length;\n var i, p, m, aleph, k, gamma;\n\n if (typeof alphap === 'undefined')\n alphap = 3 / 8;\n if (typeof betap === 'undefined')\n betap = 3 / 8;\n\n for (i = 0; i < quantilesArray.length; i++) {\n p = quantilesArray[i];\n m = alphap + p * (1 - alphap - betap);\n aleph = n * p + m;\n k = Math.floor(clip(aleph, 1, n - 1));\n gamma = clip(aleph - k, 0, 1);\n quantileVals[i] = (1 - gamma) * sortedArray[k - 1] + gamma * sortedArray[k];\n }\n\n return quantileVals;\n};\n\n// Return the k-th percentile of values in a range, where k is in the range 0..1, inclusive.\n// Passing true for the exclusive parameter excludes both endpoints of the range.\njStat.percentile = function percentile(arr, k, exclusive) {\n var _arr = arr.slice().sort(ascNum);\n var realIndex = k * (_arr.length + (exclusive ? 1 : -1)) + (exclusive ? 0 : 1);\n var index = parseInt(realIndex);\n var frac = realIndex - index;\n if (index + 1 < _arr.length) {\n return _arr[index - 1] + frac * (_arr[index] - _arr[index - 1]);\n } else {\n return _arr[index - 1];\n }\n}\n\n// The percentile rank of score in a given array. Returns the percentage\n// of all values in the input array that are less than (kind='strict') or\n// less or equal than (kind='weak') score. Default is weak.\njStat.percentileOfScore = function percentileOfScore(arr, score, kind) {\n var counter = 0;\n var len = arr.length;\n var strict = false;\n var value, i;\n\n if (kind === 'strict')\n strict = true;\n\n for (i = 0; i < len; i++) {\n value = arr[i];\n if ((strict && value < score) ||\n (!strict && value <= score)) {\n counter++;\n }\n }\n\n return counter / len;\n};\n\n\n// Histogram (bin count) data\njStat.histogram = function histogram(arr, binCnt) {\n binCnt = binCnt || 4;\n var first = jStat.min(arr);\n var binWidth = (jStat.max(arr) - first) / binCnt;\n var len = arr.length;\n var bins = [];\n var i;\n\n for (i = 0; i < binCnt; i++)\n bins[i] = 0;\n for (i = 0; i < len; i++)\n bins[Math.min(Math.floor(((arr[i] - first) / binWidth)), binCnt - 1)] += 1;\n\n return bins;\n};\n\n\n// covariance of two arrays\njStat.covariance = function covariance(arr1, arr2) {\n var u = jStat.mean(arr1);\n var v = jStat.mean(arr2);\n var arr1Len = arr1.length;\n var sq_dev = new Array(arr1Len);\n var i;\n\n for (i = 0; i < arr1Len; i++)\n sq_dev[i] = (arr1[i] - u) * (arr2[i] - v);\n\n return jStat.sum(sq_dev) / (arr1Len - 1);\n};\n\n\n// (pearson's) population correlation coefficient, rho\njStat.corrcoeff = function corrcoeff(arr1, arr2) {\n return jStat.covariance(arr1, arr2) /\n jStat.stdev(arr1, 1) /\n jStat.stdev(arr2, 1);\n};\n\n // (spearman's) rank correlation coefficient, sp\njStat.spearmancoeff = function (arr1, arr2) {\n arr1 = jStat.rank(arr1);\n arr2 = jStat.rank(arr2);\n //return pearson's correlation of the ranks:\n return jStat.corrcoeff(arr1, arr2);\n}\n\n\n// statistical standardized moments (general form of skew/kurt)\njStat.stanMoment = function stanMoment(arr, n) {\n var mu = jStat.mean(arr);\n var sigma = jStat.stdev(arr);\n var len = arr.length;\n var skewSum = 0;\n\n for (var i = 0; i < len; i++)\n skewSum += Math.pow((arr[i] - mu) / sigma, n);\n\n return skewSum / arr.length;\n};\n\n// (pearson's) moment coefficient of skewness\njStat.skewness = function skewness(arr) {\n return jStat.stanMoment(arr, 3);\n};\n\n// (pearson's) (excess) kurtosis\njStat.kurtosis = function kurtosis(arr) {\n return jStat.stanMoment(arr, 4) - 3;\n};\n\n\nvar jProto = jStat.prototype;\n\n\n// Extend jProto with method for calculating cumulative sums and products.\n// This differs from the similar extension below as cumsum and cumprod should\n// not be run again in the case fullbool === true.\n// If a matrix is passed, automatically assume operation should be done on the\n// columns.\n(function(funcs) {\n for (var i = 0; i < funcs.length; i++) (function(passfunc) {\n // If a matrix is passed, automatically assume operation should be done on\n // the columns.\n jProto[passfunc] = function(fullbool, func) {\n var arr = [];\n var i = 0;\n var tmpthis = this;\n // Assignment reassignation depending on how parameters were passed in.\n if (isFunction(fullbool)) {\n func = fullbool;\n fullbool = false;\n }\n // Check if a callback was passed with the function.\n if (func) {\n setTimeout(function() {\n func.call(tmpthis, jProto[passfunc].call(tmpthis, fullbool));\n });\n return this;\n }\n // Check if matrix and run calculations.\n if (this.length > 1) {\n tmpthis = fullbool === true ? this : this.transpose();\n for (; i < tmpthis.length; i++)\n arr[i] = jStat[passfunc](tmpthis[i]);\n return arr;\n }\n // Pass fullbool if only vector, not a matrix. for variance and stdev.\n return jStat[passfunc](this[0], fullbool);\n };\n })(funcs[i]);\n})(('cumsum cumprod').split(' '));\n\n\n// Extend jProto with methods which don't require arguments and work on columns.\n(function(funcs) {\n for (var i = 0; i < funcs.length; i++) (function(passfunc) {\n // If a matrix is passed, automatically assume operation should be done on\n // the columns.\n jProto[passfunc] = function(fullbool, func) {\n var arr = [];\n var i = 0;\n var tmpthis = this;\n // Assignment reassignation depending on how parameters were passed in.\n if (isFunction(fullbool)) {\n func = fullbool;\n fullbool = false;\n }\n // Check if a callback was passed with the function.\n if (func) {\n setTimeout(function() {\n func.call(tmpthis, jProto[passfunc].call(tmpthis, fullbool));\n });\n return this;\n }\n // Check if matrix and run calculations.\n if (this.length > 1) {\n if (passfunc !== 'sumrow')\n tmpthis = fullbool === true ? this : this.transpose();\n for (; i < tmpthis.length; i++)\n arr[i] = jStat[passfunc](tmpthis[i]);\n return fullbool === true\n ? jStat[passfunc](jStat.utils.toVector(arr))\n : arr;\n }\n // Pass fullbool if only vector, not a matrix. for variance and stdev.\n return jStat[passfunc](this[0], fullbool);\n };\n })(funcs[i]);\n})(('sum sumsqrd sumsqerr sumrow product min max unique mean meansqerr ' +\n 'geomean median diff rank mode range variance deviation stdev meandev ' +\n 'meddev coeffvar quartiles histogram skewness kurtosis').split(' '));\n\n\n// Extend jProto with functions that take arguments. Operations on matrices are\n// done on columns.\n(function(funcs) {\n for (var i = 0; i < funcs.length; i++) (function(passfunc) {\n jProto[passfunc] = function() {\n var arr = [];\n var i = 0;\n var tmpthis = this;\n var args = Array.prototype.slice.call(arguments);\n var callbackFunction;\n\n // If the last argument is a function, we assume it's a callback; we\n // strip the callback out and call the function again.\n if (isFunction(args[args.length - 1])) {\n callbackFunction = args[args.length - 1];\n var argsToPass = args.slice(0, args.length - 1);\n\n setTimeout(function() {\n callbackFunction.call(tmpthis,\n jProto[passfunc].apply(tmpthis, argsToPass));\n });\n return this;\n\n // Otherwise we curry the function args and call normally.\n } else {\n callbackFunction = undefined;\n var curriedFunction = function curriedFunction(vector) {\n return jStat[passfunc].apply(tmpthis, [vector].concat(args));\n }\n }\n\n // If this is a matrix, run column-by-column.\n if (this.length > 1) {\n tmpthis = tmpthis.transpose();\n for (; i < tmpthis.length; i++)\n arr[i] = curriedFunction(tmpthis[i]);\n return arr;\n }\n\n // Otherwise run on the vector.\n return curriedFunction(this[0]);\n };\n })(funcs[i]);\n})('quantiles percentileOfScore'.split(' '));\n\n}(jStat, Math));\n// Special functions //\n(function(jStat, Math) {\n\n// Log-gamma function\njStat.gammaln = function gammaln(x) {\n var j = 0;\n var cof = [\n 76.18009172947146, -86.50532032941677, 24.01409824083091,\n -1.231739572450155, 0.1208650973866179e-2, -0.5395239384953e-5\n ];\n var ser = 1.000000000190015;\n var xx, y, tmp;\n tmp = (y = xx = x) + 5.5;\n tmp -= (xx + 0.5) * Math.log(tmp);\n for (; j < 6; j++)\n ser += cof[j] / ++y;\n return Math.log(2.5066282746310005 * ser / xx) - tmp;\n};\n\n/*\n * log-gamma function to support poisson distribution sampling. The\n * algorithm comes from SPECFUN by Shanjie Zhang and Jianming Jin and their\n * book \"Computation of Special Functions\", 1996, John Wiley & Sons, Inc.\n */\njStat.loggam = function loggam(x) {\n var x0, x2, xp, gl, gl0;\n var k, n;\n\n var a = [8.333333333333333e-02, -2.777777777777778e-03,\n 7.936507936507937e-04, -5.952380952380952e-04,\n 8.417508417508418e-04, -1.917526917526918e-03,\n 6.410256410256410e-03, -2.955065359477124e-02,\n 1.796443723688307e-01, -1.39243221690590e+00];\n x0 = x;\n n = 0;\n if ((x == 1.0) || (x == 2.0)) {\n return 0.0;\n }\n if (x <= 7.0) {\n n = Math.floor(7 - x);\n x0 = x + n;\n }\n x2 = 1.0 / (x0 * x0);\n xp = 2 * Math.PI;\n gl0 = a[9];\n for (k = 8; k >= 0; k--) {\n gl0 *= x2;\n gl0 += a[k];\n }\n gl = gl0 / x0 + 0.5 * Math.log(xp) + (x0 - 0.5) * Math.log(x0) - x0;\n if (x <= 7.0) {\n for (k = 1; k <= n; k++) {\n gl -= Math.log(x0 - 1.0);\n x0 -= 1.0;\n }\n }\n return gl;\n}\n\n// gamma of x\njStat.gammafn = function gammafn(x) {\n var p = [-1.716185138865495, 24.76565080557592, -379.80425647094563,\n 629.3311553128184, 866.9662027904133, -31451.272968848367,\n -36144.413418691176, 66456.14382024054\n ];\n var q = [-30.8402300119739, 315.35062697960416, -1015.1563674902192,\n -3107.771671572311, 22538.118420980151, 4755.8462775278811,\n -134659.9598649693, -115132.2596755535];\n var fact = false;\n var n = 0;\n var xden = 0;\n var xnum = 0;\n var y = x;\n var i, z, yi, res;\n if (x > 171.6243769536076) {\n return Infinity;\n }\n if (y <= 0) {\n res = y % 1 + 3.6e-16;\n if (res) {\n fact = (!(y & 1) ? 1 : -1) * Math.PI / Math.sin(Math.PI * res);\n y = 1 - y;\n } else {\n return Infinity;\n }\n }\n yi = y;\n if (y < 1) {\n z = y++;\n } else {\n z = (y -= n = (y | 0) - 1) - 1;\n }\n for (i = 0; i < 8; ++i) {\n xnum = (xnum + p[i]) * z;\n xden = xden * z + q[i];\n }\n res = xnum / xden + 1;\n if (yi < y) {\n res /= yi;\n } else if (yi > y) {\n for (i = 0; i < n; ++i) {\n res *= y;\n y++;\n }\n }\n if (fact) {\n res = fact / res;\n }\n return res;\n};\n\n\n// lower incomplete gamma function, which is usually typeset with a\n// lower-case greek gamma as the function symbol\njStat.gammap = function gammap(a, x) {\n return jStat.lowRegGamma(a, x) * jStat.gammafn(a);\n};\n\n\n// The lower regularized incomplete gamma function, usually written P(a,x)\njStat.lowRegGamma = function lowRegGamma(a, x) {\n var aln = jStat.gammaln(a);\n var ap = a;\n var sum = 1 / a;\n var del = sum;\n var b = x + 1 - a;\n var c = 1 / 1.0e-30;\n var d = 1 / b;\n var h = d;\n var i = 1;\n // calculate maximum number of itterations required for a\n var ITMAX = -~(Math.log((a >= 1) ? a : 1 / a) * 8.5 + a * 0.4 + 17);\n var an;\n\n if (x < 0 || a <= 0) {\n return NaN;\n } else if (x < a + 1) {\n for (; i <= ITMAX; i++) {\n sum += del *= x / ++ap;\n }\n return (sum * Math.exp(-x + a * Math.log(x) - (aln)));\n }\n\n for (; i <= ITMAX; i++) {\n an = -i * (i - a);\n b += 2;\n d = an * d + b;\n c = b + an / c;\n d = 1 / d;\n h *= d * c;\n }\n\n return (1 - h * Math.exp(-x + a * Math.log(x) - (aln)));\n};\n\n// natural log factorial of n\njStat.factorialln = function factorialln(n) {\n return n < 0 ? NaN : jStat.gammaln(n + 1);\n};\n\n// factorial of n\njStat.factorial = function factorial(n) {\n return n < 0 ? NaN : jStat.gammafn(n + 1);\n};\n\n// combinations of n, m\njStat.combination = function combination(n, m) {\n // make sure n or m don't exceed the upper limit of usable values\n return (n > 170 || m > 170)\n ? Math.exp(jStat.combinationln(n, m))\n : (jStat.factorial(n) / jStat.factorial(m)) / jStat.factorial(n - m);\n};\n\n\njStat.combinationln = function combinationln(n, m){\n return jStat.factorialln(n) - jStat.factorialln(m) - jStat.factorialln(n - m);\n};\n\n\n// permutations of n, m\njStat.permutation = function permutation(n, m) {\n return jStat.factorial(n) / jStat.factorial(n - m);\n};\n\n\n// beta function\njStat.betafn = function betafn(x, y) {\n // ensure arguments are positive\n if (x <= 0 || y <= 0)\n return undefined;\n // make sure x + y doesn't exceed the upper limit of usable values\n return (x + y > 170)\n ? Math.exp(jStat.betaln(x, y))\n : jStat.gammafn(x) * jStat.gammafn(y) / jStat.gammafn(x + y);\n};\n\n\n// natural logarithm of beta function\njStat.betaln = function betaln(x, y) {\n return jStat.gammaln(x) + jStat.gammaln(y) - jStat.gammaln(x + y);\n};\n\n\n// Evaluates the continued fraction for incomplete beta function by modified\n// Lentz's method.\njStat.betacf = function betacf(x, a, b) {\n var fpmin = 1e-30;\n var m = 1;\n var qab = a + b;\n var qap = a + 1;\n var qam = a - 1;\n var c = 1;\n var d = 1 - qab * x / qap;\n var m2, aa, del, h;\n\n // These q's will be used in factors that occur in the coefficients\n if (Math.abs(d) < fpmin)\n d = fpmin;\n d = 1 / d;\n h = d;\n\n for (; m <= 100; m++) {\n m2 = 2 * m;\n aa = m * (b - m) * x / ((qam + m2) * (a + m2));\n // One step (the even one) of the recurrence\n d = 1 + aa * d;\n if (Math.abs(d) < fpmin)\n d = fpmin;\n c = 1 + aa / c;\n if (Math.abs(c) < fpmin)\n c = fpmin;\n d = 1 / d;\n h *= d * c;\n aa = -(a + m) * (qab + m) * x / ((a + m2) * (qap + m2));\n // Next step of the recurrence (the odd one)\n d = 1 + aa * d;\n if (Math.abs(d) < fpmin)\n d = fpmin;\n c = 1 + aa / c;\n if (Math.abs(c) < fpmin)\n c = fpmin;\n d = 1 / d;\n del = d * c;\n h *= del;\n if (Math.abs(del - 1.0) < 3e-7)\n break;\n }\n\n return h;\n};\n\n\n// Returns the inverse of the lower regularized inomplete gamma function\njStat.gammapinv = function gammapinv(p, a) {\n var j = 0;\n var a1 = a - 1;\n var EPS = 1e-8;\n var gln = jStat.gammaln(a);\n var x, err, t, u, pp, lna1, afac;\n\n if (p >= 1)\n return Math.max(100, a + 100 * Math.sqrt(a));\n if (p <= 0)\n return 0;\n if (a > 1) {\n lna1 = Math.log(a1);\n afac = Math.exp(a1 * (lna1 - 1) - gln);\n pp = (p < 0.5) ? p : 1 - p;\n t = Math.sqrt(-2 * Math.log(pp));\n x = (2.30753 + t * 0.27061) / (1 + t * (0.99229 + t * 0.04481)) - t;\n if (p < 0.5)\n x = -x;\n x = Math.max(1e-3,\n a * Math.pow(1 - 1 / (9 * a) - x / (3 * Math.sqrt(a)), 3));\n } else {\n t = 1 - a * (0.253 + a * 0.12);\n if (p < t)\n x = Math.pow(p / t, 1 / a);\n else\n x = 1 - Math.log(1 - (p - t) / (1 - t));\n }\n\n for(; j < 12; j++) {\n if (x <= 0)\n return 0;\n err = jStat.lowRegGamma(a, x) - p;\n if (a > 1)\n t = afac * Math.exp(-(x - a1) + a1 * (Math.log(x) - lna1));\n else\n t = Math.exp(-x + a1 * Math.log(x) - gln);\n u = err / t;\n x -= (t = u / (1 - 0.5 * Math.min(1, u * ((a - 1) / x - 1))));\n if (x <= 0)\n x = 0.5 * (x + t);\n if (Math.abs(t) < EPS * x)\n break;\n }\n\n return x;\n};\n\n\n// Returns the error function erf(x)\njStat.erf = function erf(x) {\n var cof = [-1.3026537197817094, 6.4196979235649026e-1, 1.9476473204185836e-2,\n -9.561514786808631e-3, -9.46595344482036e-4, 3.66839497852761e-4,\n 4.2523324806907e-5, -2.0278578112534e-5, -1.624290004647e-6,\n 1.303655835580e-6, 1.5626441722e-8, -8.5238095915e-8,\n 6.529054439e-9, 5.059343495e-9, -9.91364156e-10,\n -2.27365122e-10, 9.6467911e-11, 2.394038e-12,\n -6.886027e-12, 8.94487e-13, 3.13092e-13,\n -1.12708e-13, 3.81e-16, 7.106e-15,\n -1.523e-15, -9.4e-17, 1.21e-16,\n -2.8e-17];\n var j = cof.length - 1;\n var isneg = false;\n var d = 0;\n var dd = 0;\n var t, ty, tmp, res;\n\n if (x < 0) {\n x = -x;\n isneg = true;\n }\n\n t = 2 / (2 + x);\n ty = 4 * t - 2;\n\n for(; j > 0; j--) {\n tmp = d;\n d = ty * d - dd + cof[j];\n dd = tmp;\n }\n\n res = t * Math.exp(-x * x + 0.5 * (cof[0] + ty * d) - dd);\n return isneg ? res - 1 : 1 - res;\n};\n\n\n// Returns the complmentary error function erfc(x)\njStat.erfc = function erfc(x) {\n return 1 - jStat.erf(x);\n};\n\n\n// Returns the inverse of the complementary error function\njStat.erfcinv = function erfcinv(p) {\n var j = 0;\n var x, err, t, pp;\n if (p >= 2)\n return -100;\n if (p <= 0)\n return 100;\n pp = (p < 1) ? p : 2 - p;\n t = Math.sqrt(-2 * Math.log(pp / 2));\n x = -0.70711 * ((2.30753 + t * 0.27061) /\n (1 + t * (0.99229 + t * 0.04481)) - t);\n for (; j < 2; j++) {\n err = jStat.erfc(x) - pp;\n x += err / (1.12837916709551257 * Math.exp(-x * x) - x * err);\n }\n return (p < 1) ? x : -x;\n};\n\n\n// Returns the inverse of the incomplete beta function\njStat.ibetainv = function ibetainv(p, a, b) {\n var EPS = 1e-8;\n var a1 = a - 1;\n var b1 = b - 1;\n var j = 0;\n var lna, lnb, pp, t, u, err, x, al, h, w, afac;\n if (p <= 0)\n return 0;\n if (p >= 1)\n return 1;\n if (a >= 1 && b >= 1) {\n pp = (p < 0.5) ? p : 1 - p;\n t = Math.sqrt(-2 * Math.log(pp));\n x = (2.30753 + t * 0.27061) / (1 + t* (0.99229 + t * 0.04481)) - t;\n if (p < 0.5)\n x = -x;\n al = (x * x - 3) / 6;\n h = 2 / (1 / (2 * a - 1) + 1 / (2 * b - 1));\n w = (x * Math.sqrt(al + h) / h) - (1 / (2 * b - 1) - 1 / (2 * a - 1)) *\n (al + 5 / 6 - 2 / (3 * h));\n x = a / (a + b * Math.exp(2 * w));\n } else {\n lna = Math.log(a / (a + b));\n lnb = Math.log(b / (a + b));\n t = Math.exp(a * lna) / a;\n u = Math.exp(b * lnb) / b;\n w = t + u;\n if (p < t / w)\n x = Math.pow(a * w * p, 1 / a);\n else\n x = 1 - Math.pow(b * w * (1 - p), 1 / b);\n }\n afac = -jStat.gammaln(a) - jStat.gammaln(b) + jStat.gammaln(a + b);\n for(; j < 10; j++) {\n if (x === 0 || x === 1)\n return x;\n err = jStat.ibeta(x, a, b) - p;\n t = Math.exp(a1 * Math.log(x) + b1 * Math.log(1 - x) + afac);\n u = err / t;\n x -= (t = u / (1 - 0.5 * Math.min(1, u * (a1 / x - b1 / (1 - x)))));\n if (x <= 0)\n x = 0.5 * (x + t);\n if (x >= 1)\n x = 0.5 * (x + t + 1);\n if (Math.abs(t) < EPS * x && j > 0)\n break;\n }\n return x;\n};\n\n\n// Returns the incomplete beta function I_x(a,b)\njStat.ibeta = function ibeta(x, a, b) {\n // Factors in front of the continued fraction.\n var bt = (x === 0 || x === 1) ? 0 :\n Math.exp(jStat.gammaln(a + b) - jStat.gammaln(a) -\n jStat.gammaln(b) + a * Math.log(x) + b *\n Math.log(1 - x));\n if (x < 0 || x > 1)\n return false;\n if (x < (a + 1) / (a + b + 2))\n // Use continued fraction directly.\n return bt * jStat.betacf(x, a, b) / a;\n // else use continued fraction after making the symmetry transformation.\n return 1 - bt * jStat.betacf(1 - x, b, a) / b;\n};\n\n\n// Returns a normal deviate (mu=0, sigma=1).\n// If n and m are specified it returns a object of normal deviates.\njStat.randn = function randn(n, m) {\n var u, v, x, y, q;\n if (!m)\n m = n;\n if (n)\n return jStat.create(n, m, function() { return jStat.randn(); });\n do {\n u = jStat._random_fn();\n v = 1.7156 * (jStat._random_fn() - 0.5);\n x = u - 0.449871;\n y = Math.abs(v) + 0.386595;\n q = x * x + y * (0.19600 * y - 0.25472 * x);\n } while (q > 0.27597 && (q > 0.27846 || v * v > -4 * Math.log(u) * u * u));\n return v / u;\n};\n\n\n// Returns a gamma deviate by the method of Marsaglia and Tsang.\njStat.randg = function randg(shape, n, m) {\n var oalph = shape;\n var a1, a2, u, v, x, mat;\n if (!m)\n m = n;\n if (!shape)\n shape = 1;\n if (n) {\n mat = jStat.zeros(n,m);\n mat.alter(function() { return jStat.randg(shape); });\n return mat;\n }\n if (shape < 1)\n shape += 1;\n a1 = shape - 1 / 3;\n a2 = 1 / Math.sqrt(9 * a1);\n do {\n do {\n x = jStat.randn();\n v = 1 + a2 * x;\n } while(v <= 0);\n v = v * v * v;\n u = jStat._random_fn();\n } while(u > 1 - 0.331 * Math.pow(x, 4) &&\n Math.log(u) > 0.5 * x*x + a1 * (1 - v + Math.log(v)));\n // alpha > 1\n if (shape == oalph)\n return a1 * v;\n // alpha < 1\n do {\n u = jStat._random_fn();\n } while(u === 0);\n return Math.pow(u, 1 / oalph) * a1 * v;\n};\n\n\n// making use of static methods on the instance\n(function(funcs) {\n for (var i = 0; i < funcs.length; i++) (function(passfunc) {\n jStat.fn[passfunc] = function() {\n return jStat(\n jStat.map(this, function(value) { return jStat[passfunc](value); }));\n }\n })(funcs[i]);\n})('gammaln gammafn factorial factorialln'.split(' '));\n\n\n(function(funcs) {\n for (var i = 0; i < funcs.length; i++) (function(passfunc) {\n jStat.fn[passfunc] = function() {\n return jStat(jStat[passfunc].apply(null, arguments));\n };\n })(funcs[i]);\n})('randn'.split(' '));\n\n}(jStat, Math));\n(function(jStat, Math) {\n\n// generate all distribution instance methods\n(function(list) {\n for (var i = 0; i < list.length; i++) (function(func) {\n // distribution instance method\n jStat[func] = function f(a, b, c) {\n if (!(this instanceof f))\n return new f(a, b, c);\n this._a = a;\n this._b = b;\n this._c = c;\n return this;\n };\n // distribution method to be used on a jStat instance\n jStat.fn[func] = function(a, b, c) {\n var newthis = jStat[func](a, b, c);\n newthis.data = this;\n return newthis;\n };\n // sample instance method\n jStat[func].prototype.sample = function(arr) {\n var a = this._a;\n var b = this._b;\n var c = this._c;\n if (arr)\n return jStat.alter(arr, function() {\n return jStat[func].sample(a, b, c);\n });\n else\n return jStat[func].sample(a, b, c);\n };\n // generate the pdf, cdf and inv instance methods\n (function(vals) {\n for (var i = 0; i < vals.length; i++) (function(fnfunc) {\n jStat[func].prototype[fnfunc] = function(x) {\n var a = this._a;\n var b = this._b;\n var c = this._c;\n if (!x && x !== 0)\n x = this.data;\n if (typeof x !== 'number') {\n return jStat.fn.map.call(x, function(x) {\n return jStat[func][fnfunc](x, a, b, c);\n });\n }\n return jStat[func][fnfunc](x, a, b, c);\n };\n })(vals[i]);\n })('pdf cdf inv'.split(' '));\n // generate the mean, median, mode and variance instance methods\n (function(vals) {\n for (var i = 0; i < vals.length; i++) (function(fnfunc) {\n jStat[func].prototype[fnfunc] = function() {\n return jStat[func][fnfunc](this._a, this._b, this._c);\n };\n })(vals[i]);\n })('mean median mode variance'.split(' '));\n })(list[i]);\n})((\n 'beta centralF cauchy chisquare exponential gamma invgamma kumaraswamy ' +\n 'laplace lognormal noncentralt normal pareto studentt weibull uniform ' +\n 'binomial negbin hypgeom poisson triangular tukey arcsine'\n).split(' '));\n\n\n\n// extend beta function with static methods\njStat.extend(jStat.beta, {\n pdf: function pdf(x, alpha, beta) {\n // PDF is zero outside the support\n if (x > 1 || x < 0)\n return 0;\n // PDF is one for the uniform case\n if (alpha == 1 && beta == 1)\n return 1;\n\n if (alpha < 512 && beta < 512) {\n return (Math.pow(x, alpha - 1) * Math.pow(1 - x, beta - 1)) /\n jStat.betafn(alpha, beta);\n } else {\n return Math.exp((alpha - 1) * Math.log(x) +\n (beta - 1) * Math.log(1 - x) -\n jStat.betaln(alpha, beta));\n }\n },\n\n cdf: function cdf(x, alpha, beta) {\n return (x > 1 || x < 0) ? (x > 1) * 1 : jStat.ibeta(x, alpha, beta);\n },\n\n inv: function inv(x, alpha, beta) {\n return jStat.ibetainv(x, alpha, beta);\n },\n\n mean: function mean(alpha, beta) {\n return alpha / (alpha + beta);\n },\n\n median: function median(alpha, beta) {\n return jStat.ibetainv(0.5, alpha, beta);\n },\n\n mode: function mode(alpha, beta) {\n return (alpha - 1 ) / ( alpha + beta - 2);\n },\n\n // return a random sample\n sample: function sample(alpha, beta) {\n var u = jStat.randg(alpha);\n return u / (u + jStat.randg(beta));\n },\n\n variance: function variance(alpha, beta) {\n return (alpha * beta) / (Math.pow(alpha + beta, 2) * (alpha + beta + 1));\n }\n});\n\n// extend F function with static methods\njStat.extend(jStat.centralF, {\n // This implementation of the pdf function avoids float overflow\n // See the way that R calculates this value:\n // https://svn.r-project.org/R/trunk/src/nmath/df.c\n pdf: function pdf(x, df1, df2) {\n var p, q, f;\n\n if (x < 0)\n return 0;\n\n if (df1 <= 2) {\n if (x === 0 && df1 < 2) {\n return Infinity;\n }\n if (x === 0 && df1 === 2) {\n return 1;\n }\n return (1 / jStat.betafn(df1 / 2, df2 / 2)) *\n Math.pow(df1 / df2, df1 / 2) *\n Math.pow(x, (df1/2) - 1) *\n Math.pow((1 + (df1 / df2) * x), -(df1 + df2) / 2);\n }\n\n p = (df1 * x) / (df2 + x * df1);\n q = df2 / (df2 + x * df1);\n f = df1 * q / 2.0;\n return f * jStat.binomial.pdf((df1 - 2) / 2, (df1 + df2 - 2) / 2, p);\n },\n\n cdf: function cdf(x, df1, df2) {\n if (x < 0)\n return 0;\n return jStat.ibeta((df1 * x) / (df1 * x + df2), df1 / 2, df2 / 2);\n },\n\n inv: function inv(x, df1, df2) {\n return df2 / (df1 * (1 / jStat.ibetainv(x, df1 / 2, df2 / 2) - 1));\n },\n\n mean: function mean(df1, df2) {\n return (df2 > 2) ? df2 / (df2 - 2) : undefined;\n },\n\n mode: function mode(df1, df2) {\n return (df1 > 2) ? (df2 * (df1 - 2)) / (df1 * (df2 + 2)) : undefined;\n },\n\n // return a random sample\n sample: function sample(df1, df2) {\n var x1 = jStat.randg(df1 / 2) * 2;\n var x2 = jStat.randg(df2 / 2) * 2;\n return (x1 / df1) / (x2 / df2);\n },\n\n variance: function variance(df1, df2) {\n if (df2 <= 4)\n return undefined;\n return 2 * df2 * df2 * (df1 + df2 - 2) /\n (df1 * (df2 - 2) * (df2 - 2) * (df2 - 4));\n }\n});\n\n\n// extend cauchy function with static methods\njStat.extend(jStat.cauchy, {\n pdf: function pdf(x, local, scale) {\n if (scale < 0) { return 0; }\n\n return (scale / (Math.pow(x - local, 2) + Math.pow(scale, 2))) / Math.PI;\n },\n\n cdf: function cdf(x, local, scale) {\n return Math.atan((x - local) / scale) / Math.PI + 0.5;\n },\n\n inv: function(p, local, scale) {\n return local + scale * Math.tan(Math.PI * (p - 0.5));\n },\n\n median: function median(local/*, scale*/) {\n return local;\n },\n\n mode: function mode(local/*, scale*/) {\n return local;\n },\n\n sample: function sample(local, scale) {\n return jStat.randn() *\n Math.sqrt(1 / (2 * jStat.randg(0.5))) * scale + local;\n }\n});\n\n\n\n// extend chisquare function with static methods\njStat.extend(jStat.chisquare, {\n pdf: function pdf(x, dof) {\n if (x < 0)\n return 0;\n return (x === 0 && dof === 2) ? 0.5 :\n Math.exp((dof / 2 - 1) * Math.log(x) - x / 2 - (dof / 2) *\n Math.log(2) - jStat.gammaln(dof / 2));\n },\n\n cdf: function cdf(x, dof) {\n if (x < 0)\n return 0;\n return jStat.lowRegGamma(dof / 2, x / 2);\n },\n\n inv: function(p, dof) {\n return 2 * jStat.gammapinv(p, 0.5 * dof);\n },\n\n mean : function(dof) {\n return dof;\n },\n\n // TODO: this is an approximation (is there a better way?)\n median: function median(dof) {\n return dof * Math.pow(1 - (2 / (9 * dof)), 3);\n },\n\n mode: function mode(dof) {\n return (dof - 2 > 0) ? dof - 2 : 0;\n },\n\n sample: function sample(dof) {\n return jStat.randg(dof / 2) * 2;\n },\n\n variance: function variance(dof) {\n return 2 * dof;\n }\n});\n\n\n\n// extend exponential function with static methods\njStat.extend(jStat.exponential, {\n pdf: function pdf(x, rate) {\n return x < 0 ? 0 : rate * Math.exp(-rate * x);\n },\n\n cdf: function cdf(x, rate) {\n return x < 0 ? 0 : 1 - Math.exp(-rate * x);\n },\n\n inv: function(p, rate) {\n return -Math.log(1 - p) / rate;\n },\n\n mean : function(rate) {\n return 1 / rate;\n },\n\n median: function (rate) {\n return (1 / rate) * Math.log(2);\n },\n\n mode: function mode(/*rate*/) {\n return 0;\n },\n\n sample: function sample(rate) {\n return -1 / rate * Math.log(jStat._random_fn());\n },\n\n variance : function(rate) {\n return Math.pow(rate, -2);\n }\n});\n\n\n\n// extend gamma function with static methods\njStat.extend(jStat.gamma, {\n pdf: function pdf(x, shape, scale) {\n if (x < 0)\n return 0;\n return (x === 0 && shape === 1) ? 1 / scale :\n Math.exp((shape - 1) * Math.log(x) - x / scale -\n jStat.gammaln(shape) - shape * Math.log(scale));\n },\n\n cdf: function cdf(x, shape, scale) {\n if (x < 0)\n return 0;\n return jStat.lowRegGamma(shape, x / scale);\n },\n\n inv: function(p, shape, scale) {\n return jStat.gammapinv(p, shape) * scale;\n },\n\n mean : function(shape, scale) {\n return shape * scale;\n },\n\n mode: function mode(shape, scale) {\n if(shape > 1) return (shape - 1) * scale;\n return undefined;\n },\n\n sample: function sample(shape, scale) {\n return jStat.randg(shape) * scale;\n },\n\n variance: function variance(shape, scale) {\n return shape * scale * scale;\n }\n});\n\n// extend inverse gamma function with static methods\njStat.extend(jStat.invgamma, {\n pdf: function pdf(x, shape, scale) {\n if (x <= 0)\n return 0;\n return Math.exp(-(shape + 1) * Math.log(x) - scale / x -\n jStat.gammaln(shape) + shape * Math.log(scale));\n },\n\n cdf: function cdf(x, shape, scale) {\n if (x <= 0)\n return 0;\n return 1 - jStat.lowRegGamma(shape, scale / x);\n },\n\n inv: function(p, shape, scale) {\n return scale / jStat.gammapinv(1 - p, shape);\n },\n\n mean : function(shape, scale) {\n return (shape > 1) ? scale / (shape - 1) : undefined;\n },\n\n mode: function mode(shape, scale) {\n return scale / (shape + 1);\n },\n\n sample: function sample(shape, scale) {\n return scale / jStat.randg(shape);\n },\n\n variance: function variance(shape, scale) {\n if (shape <= 2)\n return undefined;\n return scale * scale / ((shape - 1) * (shape - 1) * (shape - 2));\n }\n});\n\n\n// extend kumaraswamy function with static methods\njStat.extend(jStat.kumaraswamy, {\n pdf: function pdf(x, alpha, beta) {\n if (x === 0 && alpha === 1)\n return beta;\n else if (x === 1 && beta === 1)\n return alpha;\n return Math.exp(Math.log(alpha) + Math.log(beta) + (alpha - 1) *\n Math.log(x) + (beta - 1) *\n Math.log(1 - Math.pow(x, alpha)));\n },\n\n cdf: function cdf(x, alpha, beta) {\n if (x < 0)\n return 0;\n else if (x > 1)\n return 1;\n return (1 - Math.pow(1 - Math.pow(x, alpha), beta));\n },\n\n inv: function inv(p, alpha, beta) {\n return Math.pow(1 - Math.pow(1 - p, 1 / beta), 1 / alpha);\n },\n\n mean : function(alpha, beta) {\n return (beta * jStat.gammafn(1 + 1 / alpha) *\n jStat.gammafn(beta)) / (jStat.gammafn(1 + 1 / alpha + beta));\n },\n\n median: function median(alpha, beta) {\n return Math.pow(1 - Math.pow(2, -1 / beta), 1 / alpha);\n },\n\n mode: function mode(alpha, beta) {\n if (!(alpha >= 1 && beta >= 1 && (alpha !== 1 && beta !== 1)))\n return undefined;\n return Math.pow((alpha - 1) / (alpha * beta - 1), 1 / alpha);\n },\n\n variance: function variance(/*alpha, beta*/) {\n throw new Error('variance not yet implemented');\n // TODO: complete this\n }\n});\n\n\n\n// extend lognormal function with static methods\njStat.extend(jStat.lognormal, {\n pdf: function pdf(x, mu, sigma) {\n if (x <= 0)\n return 0;\n return Math.exp(-Math.log(x) - 0.5 * Math.log(2 * Math.PI) -\n Math.log(sigma) - Math.pow(Math.log(x) - mu, 2) /\n (2 * sigma * sigma));\n },\n\n cdf: function cdf(x, mu, sigma) {\n if (x < 0)\n return 0;\n return 0.5 +\n (0.5 * jStat.erf((Math.log(x) - mu) / Math.sqrt(2 * sigma * sigma)));\n },\n\n inv: function(p, mu, sigma) {\n return Math.exp(-1.41421356237309505 * sigma * jStat.erfcinv(2 * p) + mu);\n },\n\n mean: function mean(mu, sigma) {\n return Math.exp(mu + sigma * sigma / 2);\n },\n\n median: function median(mu/*, sigma*/) {\n return Math.exp(mu);\n },\n\n mode: function mode(mu, sigma) {\n return Math.exp(mu - sigma * sigma);\n },\n\n sample: function sample(mu, sigma) {\n return Math.exp(jStat.randn() * sigma + mu);\n },\n\n variance: function variance(mu, sigma) {\n return (Math.exp(sigma * sigma) - 1) * Math.exp(2 * mu + sigma * sigma);\n }\n});\n\n\n\n// extend noncentralt function with static methods\njStat.extend(jStat.noncentralt, {\n pdf: function pdf(x, dof, ncp) {\n var tol = 1e-14;\n if (Math.abs(ncp) < tol) // ncp approx 0; use student-t\n return jStat.studentt.pdf(x, dof)\n\n if (Math.abs(x) < tol) { // different formula for x == 0\n return Math.exp(jStat.gammaln((dof + 1) / 2) - ncp * ncp / 2 -\n 0.5 * Math.log(Math.PI * dof) - jStat.gammaln(dof / 2));\n }\n\n // formula for x != 0\n return dof / x *\n (jStat.noncentralt.cdf(x * Math.sqrt(1 + 2 / dof), dof+2, ncp) -\n jStat.noncentralt.cdf(x, dof, ncp));\n },\n\n cdf: function cdf(x, dof, ncp) {\n var tol = 1e-14;\n var min_iterations = 200;\n\n if (Math.abs(ncp) < tol) // ncp approx 0; use student-t\n return jStat.studentt.cdf(x, dof);\n\n // turn negative x into positive and flip result afterwards\n var flip = false;\n if (x < 0) {\n flip = true;\n ncp = -ncp;\n }\n\n var prob = jStat.normal.cdf(-ncp, 0, 1);\n var value = tol + 1;\n // use value at last two steps to determine convergence\n var lastvalue = value;\n var y = x * x / (x * x + dof);\n var j = 0;\n var p = Math.exp(-ncp * ncp / 2);\n var q = Math.exp(-ncp * ncp / 2 - 0.5 * Math.log(2) -\n jStat.gammaln(3 / 2)) * ncp;\n while (j < min_iterations || lastvalue > tol || value > tol) {\n lastvalue = value;\n if (j > 0) {\n p *= (ncp * ncp) / (2 * j);\n q *= (ncp * ncp) / (2 * (j + 1 / 2));\n }\n value = p * jStat.beta.cdf(y, j + 0.5, dof / 2) +\n q * jStat.beta.cdf(y, j+1, dof/2);\n prob += 0.5 * value;\n j++;\n }\n\n return flip ? (1 - prob) : prob;\n }\n});\n\n\n// extend normal function with static methods\njStat.extend(jStat.normal, {\n pdf: function pdf(x, mean, std) {\n return Math.exp(-0.5 * Math.log(2 * Math.PI) -\n Math.log(std) - Math.pow(x - mean, 2) / (2 * std * std));\n },\n\n cdf: function cdf(x, mean, std) {\n return 0.5 * (1 + jStat.erf((x - mean) / Math.sqrt(2 * std * std)));\n },\n\n inv: function(p, mean, std) {\n return -1.41421356237309505 * std * jStat.erfcinv(2 * p) + mean;\n },\n\n mean : function(mean/*, std*/) {\n return mean;\n },\n\n median: function median(mean/*, std*/) {\n return mean;\n },\n\n mode: function (mean/*, std*/) {\n return mean;\n },\n\n sample: function sample(mean, std) {\n return jStat.randn() * std + mean;\n },\n\n variance : function(mean, std) {\n return std * std;\n }\n});\n\n\n\n// extend pareto function with static methods\njStat.extend(jStat.pareto, {\n pdf: function pdf(x, scale, shape) {\n if (x < scale)\n return 0;\n return (shape * Math.pow(scale, shape)) / Math.pow(x, shape + 1);\n },\n\n cdf: function cdf(x, scale, shape) {\n if (x < scale)\n return 0;\n return 1 - Math.pow(scale / x, shape);\n },\n\n inv: function inv(p, scale, shape) {\n return scale / Math.pow(1 - p, 1 / shape);\n },\n\n mean: function mean(scale, shape) {\n if (shape <= 1)\n return undefined;\n return (shape * Math.pow(scale, shape)) / (shape - 1);\n },\n\n median: function median(scale, shape) {\n return scale * (shape * Math.SQRT2);\n },\n\n mode: function mode(scale/*, shape*/) {\n return scale;\n },\n\n variance : function(scale, shape) {\n if (shape <= 2)\n return undefined;\n return (scale*scale * shape) / (Math.pow(shape - 1, 2) * (shape - 2));\n }\n});\n\n\n\n// extend studentt function with static methods\njStat.extend(jStat.studentt, {\n pdf: function pdf(x, dof) {\n dof = dof > 1e100 ? 1e100 : dof;\n return (1/(Math.sqrt(dof) * jStat.betafn(0.5, dof/2))) *\n Math.pow(1 + ((x * x) / dof), -((dof + 1) / 2));\n },\n\n cdf: function cdf(x, dof) {\n var dof2 = dof / 2;\n return jStat.ibeta((x + Math.sqrt(x * x + dof)) /\n (2 * Math.sqrt(x * x + dof)), dof2, dof2);\n },\n\n inv: function(p, dof) {\n var x = jStat.ibetainv(2 * Math.min(p, 1 - p), 0.5 * dof, 0.5);\n x = Math.sqrt(dof * (1 - x) / x);\n return (p > 0.5) ? x : -x;\n },\n\n mean: function mean(dof) {\n return (dof > 1) ? 0 : undefined;\n },\n\n median: function median(/*dof*/) {\n return 0;\n },\n\n mode: function mode(/*dof*/) {\n return 0;\n },\n\n sample: function sample(dof) {\n return jStat.randn() * Math.sqrt(dof / (2 * jStat.randg(dof / 2)));\n },\n\n variance: function variance(dof) {\n return (dof > 2) ? dof / (dof - 2) : (dof > 1) ? Infinity : undefined;\n }\n});\n\n\n\n// extend weibull function with static methods\njStat.extend(jStat.weibull, {\n pdf: function pdf(x, scale, shape) {\n if (x < 0 || scale < 0 || shape < 0)\n return 0;\n return (shape / scale) * Math.pow((x / scale), (shape - 1)) *\n Math.exp(-(Math.pow((x / scale), shape)));\n },\n\n cdf: function cdf(x, scale, shape) {\n return x < 0 ? 0 : 1 - Math.exp(-Math.pow((x / scale), shape));\n },\n\n inv: function(p, scale, shape) {\n return scale * Math.pow(-Math.log(1 - p), 1 / shape);\n },\n\n mean : function(scale, shape) {\n return scale * jStat.gammafn(1 + 1 / shape);\n },\n\n median: function median(scale, shape) {\n return scale * Math.pow(Math.log(2), 1 / shape);\n },\n\n mode: function mode(scale, shape) {\n if (shape <= 1)\n return 0;\n return scale * Math.pow((shape - 1) / shape, 1 / shape);\n },\n\n sample: function sample(scale, shape) {\n return scale * Math.pow(-Math.log(jStat._random_fn()), 1 / shape);\n },\n\n variance: function variance(scale, shape) {\n return scale * scale * jStat.gammafn(1 + 2 / shape) -\n Math.pow(jStat.weibull.mean(scale, shape), 2);\n }\n});\n\n\n\n// extend uniform function with static methods\njStat.extend(jStat.uniform, {\n pdf: function pdf(x, a, b) {\n return (x < a || x > b) ? 0 : 1 / (b - a);\n },\n\n cdf: function cdf(x, a, b) {\n if (x < a)\n return 0;\n else if (x < b)\n return (x - a) / (b - a);\n return 1;\n },\n\n inv: function(p, a, b) {\n return a + (p * (b - a));\n },\n\n mean: function mean(a, b) {\n return 0.5 * (a + b);\n },\n\n median: function median(a, b) {\n return jStat.mean(a, b);\n },\n\n mode: function mode(/*a, b*/) {\n throw new Error('mode is not yet implemented');\n },\n\n sample: function sample(a, b) {\n return (a / 2 + b / 2) + (b / 2 - a / 2) * (2 * jStat._random_fn() - 1);\n },\n\n variance: function variance(a, b) {\n return Math.pow(b - a, 2) / 12;\n }\n});\n\n\n// Got this from http://www.math.ucla.edu/~tom/distributions/binomial.html\nfunction betinc(x, a, b, eps) {\n var a0 = 0;\n var b0 = 1;\n var a1 = 1;\n var b1 = 1;\n var m9 = 0;\n var a2 = 0;\n var c9;\n\n while (Math.abs((a1 - a2) / a1) > eps) {\n a2 = a1;\n c9 = -(a + m9) * (a + b + m9) * x / (a + 2 * m9) / (a + 2 * m9 + 1);\n a0 = a1 + c9 * a0;\n b0 = b1 + c9 * b0;\n m9 = m9 + 1;\n c9 = m9 * (b - m9) * x / (a + 2 * m9 - 1) / (a + 2 * m9);\n a1 = a0 + c9 * a1;\n b1 = b0 + c9 * b1;\n a0 = a0 / b1;\n b0 = b0 / b1;\n a1 = a1 / b1;\n b1 = 1;\n }\n\n return a1 / a;\n}\n\n\n// extend uniform function with static methods\njStat.extend(jStat.binomial, {\n pdf: function pdf(k, n, p) {\n return (p === 0 || p === 1) ?\n ((n * p) === k ? 1 : 0) :\n jStat.combination(n, k) * Math.pow(p, k) * Math.pow(1 - p, n - k);\n },\n\n cdf: function cdf(x, n, p) {\n var betacdf;\n var eps = 1e-10;\n\n if (x < 0)\n return 0;\n if (x >= n)\n return 1;\n if (p < 0 || p > 1 || n <= 0)\n return NaN;\n\n x = Math.floor(x);\n var z = p;\n var a = x + 1;\n var b = n - x;\n var s = a + b;\n var bt = Math.exp(jStat.gammaln(s) - jStat.gammaln(b) -\n jStat.gammaln(a) + a * Math.log(z) + b * Math.log(1 - z));\n\n if (z < (a + 1) / (s + 2))\n betacdf = bt * betinc(z, a, b, eps);\n else\n betacdf = 1 - bt * betinc(1 - z, b, a, eps);\n\n return Math.round((1 - betacdf) * (1 / eps)) / (1 / eps);\n }\n});\n\n\n\n// extend uniform function with static methods\njStat.extend(jStat.negbin, {\n pdf: function pdf(k, r, p) {\n if (k !== k >>> 0)\n return false;\n if (k < 0)\n return 0;\n return jStat.combination(k + r - 1, r - 1) *\n Math.pow(1 - p, k) * Math.pow(p, r);\n },\n\n cdf: function cdf(x, r, p) {\n var sum = 0,\n k = 0;\n if (x < 0) return 0;\n for (; k <= x; k++) {\n sum += jStat.negbin.pdf(k, r, p);\n }\n return sum;\n }\n});\n\n\n\n// extend uniform function with static methods\njStat.extend(jStat.hypgeom, {\n pdf: function pdf(k, N, m, n) {\n // Hypergeometric PDF.\n\n // A simplification of the CDF algorithm below.\n\n // k = number of successes drawn\n // N = population size\n // m = number of successes in population\n // n = number of items drawn from population\n\n if(k !== k | 0) {\n return false;\n } else if(k < 0 || k < m - (N - n)) {\n // It's impossible to have this few successes drawn.\n return 0;\n } else if(k > n || k > m) {\n // It's impossible to have this many successes drawn.\n return 0;\n } else if (m * 2 > N) {\n // More than half the population is successes.\n\n if(n * 2 > N) {\n // More than half the population is sampled.\n\n return jStat.hypgeom.pdf(N - m - n + k, N, N - m, N - n)\n } else {\n // Half or less of the population is sampled.\n\n return jStat.hypgeom.pdf(n - k, N, N - m, n);\n }\n\n } else if(n * 2 > N) {\n // Half or less is successes.\n\n return jStat.hypgeom.pdf(m - k, N, m, N - n);\n\n } else if(m < n) {\n // We want to have the number of things sampled to be less than the\n // successes available. So swap the definitions of successful and sampled.\n return jStat.hypgeom.pdf(k, N, n, m);\n } else {\n // If we get here, half or less of the population was sampled, half or\n // less of it was successes, and we had fewer sampled things than\n // successes. Now we can do this complicated iterative algorithm in an\n // efficient way.\n\n // The basic premise of the algorithm is that we partially normalize our\n // intermediate product to keep it in a numerically good region, and then\n // finish the normalization at the end.\n\n // This variable holds the scaled probability of the current number of\n // successes.\n var scaledPDF = 1;\n\n // This keeps track of how much we have normalized.\n var samplesDone = 0;\n\n for(var i = 0; i < k; i++) {\n // For every possible number of successes up to that observed...\n\n while(scaledPDF > 1 && samplesDone < n) {\n // Intermediate result is growing too big. Apply some of the\n // normalization to shrink everything.\n\n scaledPDF *= 1 - (m / (N - samplesDone));\n\n // Say we've normalized by this sample already.\n samplesDone++;\n }\n\n // Work out the partially-normalized hypergeometric PDF for the next\n // number of successes\n scaledPDF *= (n - i) * (m - i) / ((i + 1) * (N - m - n + i + 1));\n }\n\n for(; samplesDone < n; samplesDone++) {\n // Apply all the rest of the normalization\n scaledPDF *= 1 - (m / (N - samplesDone));\n }\n\n // Bound answer sanely before returning.\n return Math.min(1, Math.max(0, scaledPDF));\n }\n },\n\n cdf: function cdf(x, N, m, n) {\n // Hypergeometric CDF.\n\n // This algorithm is due to Prof. Thomas S. Ferguson, ,\n // and comes from his hypergeometric test calculator at\n // .\n\n // x = number of successes drawn\n // N = population size\n // m = number of successes in population\n // n = number of items drawn from population\n\n if(x < 0 || x < m - (N - n)) {\n // It's impossible to have this few successes drawn or fewer.\n return 0;\n } else if(x >= n || x >= m) {\n // We will always have this many successes or fewer.\n return 1;\n } else if (m * 2 > N) {\n // More than half the population is successes.\n\n if(n * 2 > N) {\n // More than half the population is sampled.\n\n return jStat.hypgeom.cdf(N - m - n + x, N, N - m, N - n)\n } else {\n // Half or less of the population is sampled.\n\n return 1 - jStat.hypgeom.cdf(n - x - 1, N, N - m, n);\n }\n\n } else if(n * 2 > N) {\n // Half or less is successes.\n\n return 1 - jStat.hypgeom.cdf(m - x - 1, N, m, N - n);\n\n } else if(m < n) {\n // We want to have the number of things sampled to be less than the\n // successes available. So swap the definitions of successful and sampled.\n return jStat.hypgeom.cdf(x, N, n, m);\n } else {\n // If we get here, half or less of the population was sampled, half or\n // less of it was successes, and we had fewer sampled things than\n // successes. Now we can do this complicated iterative algorithm in an\n // efficient way.\n\n // The basic premise of the algorithm is that we partially normalize our\n // intermediate sum to keep it in a numerically good region, and then\n // finish the normalization at the end.\n\n // Holds the intermediate, scaled total CDF.\n var scaledCDF = 1;\n\n // This variable holds the scaled probability of the current number of\n // successes.\n var scaledPDF = 1;\n\n // This keeps track of how much we have normalized.\n var samplesDone = 0;\n\n for(var i = 0; i < x; i++) {\n // For every possible number of successes up to that observed...\n\n while(scaledCDF > 1 && samplesDone < n) {\n // Intermediate result is growing too big. Apply some of the\n // normalization to shrink everything.\n\n var factor = 1 - (m / (N - samplesDone));\n\n scaledPDF *= factor;\n scaledCDF *= factor;\n\n // Say we've normalized by this sample already.\n samplesDone++;\n }\n\n // Work out the partially-normalized hypergeometric PDF for the next\n // number of successes\n scaledPDF *= (n - i) * (m - i) / ((i + 1) * (N - m - n + i + 1));\n\n // Add to the CDF answer.\n scaledCDF += scaledPDF;\n }\n\n for(; samplesDone < n; samplesDone++) {\n // Apply all the rest of the normalization\n scaledCDF *= 1 - (m / (N - samplesDone));\n }\n\n // Bound answer sanely before returning.\n return Math.min(1, Math.max(0, scaledCDF));\n }\n }\n});\n\n\n\n// extend uniform function with static methods\njStat.extend(jStat.poisson, {\n pdf: function pdf(k, l) {\n if (l < 0 || (k % 1) !== 0 || k < 0) {\n return 0;\n }\n\n return Math.pow(l, k) * Math.exp(-l) / jStat.factorial(k);\n },\n\n cdf: function cdf(x, l) {\n var sumarr = [],\n k = 0;\n if (x < 0) return 0;\n for (; k <= x; k++) {\n sumarr.push(jStat.poisson.pdf(k, l));\n }\n return jStat.sum(sumarr);\n },\n\n mean : function(l) {\n return l;\n },\n\n variance : function(l) {\n return l;\n },\n\n sampleSmall: function sampleSmall(l) {\n var p = 1, k = 0, L = Math.exp(-l);\n do {\n k++;\n p *= jStat._random_fn();\n } while (p > L);\n return k - 1;\n },\n\n sampleLarge: function sampleLarge(l) {\n var lam = l;\n var k;\n var U, V, slam, loglam, a, b, invalpha, vr, us;\n\n slam = Math.sqrt(lam);\n loglam = Math.log(lam);\n b = 0.931 + 2.53 * slam;\n a = -0.059 + 0.02483 * b;\n invalpha = 1.1239 + 1.1328 / (b - 3.4);\n vr = 0.9277 - 3.6224 / (b - 2);\n\n while (1) {\n U = Math.random() - 0.5;\n V = Math.random();\n us = 0.5 - Math.abs(U);\n k = Math.floor((2 * a / us + b) * U + lam + 0.43);\n if ((us >= 0.07) && (V <= vr)) {\n return k;\n }\n if ((k < 0) || ((us < 0.013) && (V > us))) {\n continue;\n }\n /* log(V) == log(0.0) ok here */\n /* if U==0.0 so that us==0.0, log is ok since always returns */\n if ((Math.log(V) + Math.log(invalpha) - Math.log(a / (us * us) + b)) <= (-lam + k * loglam - jStat.loggam(k + 1))) {\n return k;\n }\n }\n },\n\n sample: function sample(l) {\n if (l < 10)\n return this.sampleSmall(l);\n else\n return this.sampleLarge(l);\n }\n});\n\n// extend triangular function with static methods\njStat.extend(jStat.triangular, {\n pdf: function pdf(x, a, b, c) {\n if (b <= a || c < a || c > b) {\n return NaN;\n } else {\n if (x < a || x > b) {\n return 0;\n } else if (x < c) {\n return (2 * (x - a)) / ((b - a) * (c - a));\n } else if (x === c) {\n return (2 / (b - a));\n } else { // x > c\n return (2 * (b - x)) / ((b - a) * (b - c));\n }\n }\n },\n\n cdf: function cdf(x, a, b, c) {\n if (b <= a || c < a || c > b)\n return NaN;\n if (x <= a)\n return 0;\n else if (x >= b)\n return 1;\n if (x <= c)\n return Math.pow(x - a, 2) / ((b - a) * (c - a));\n else // x > c\n return 1 - Math.pow(b - x, 2) / ((b - a) * (b - c));\n },\n\n inv: function inv(p, a, b, c) {\n if (b <= a || c < a || c > b) {\n return NaN;\n } else {\n if (p <= ((c - a) / (b - a))) {\n return a + (b - a) * Math.sqrt(p * ((c - a) / (b - a)));\n } else { // p > ((c - a) / (b - a))\n return a + (b - a) * (1 - Math.sqrt((1 - p) * (1 - ((c - a) / (b - a)))));\n }\n }\n },\n\n mean: function mean(a, b, c) {\n return (a + b + c) / 3;\n },\n\n median: function median(a, b, c) {\n if (c <= (a + b) / 2) {\n return b - Math.sqrt((b - a) * (b - c)) / Math.sqrt(2);\n } else if (c > (a + b) / 2) {\n return a + Math.sqrt((b - a) * (c - a)) / Math.sqrt(2);\n }\n },\n\n mode: function mode(a, b, c) {\n return c;\n },\n\n sample: function sample(a, b, c) {\n var u = jStat._random_fn();\n if (u < ((c - a) / (b - a)))\n return a + Math.sqrt(u * (b - a) * (c - a))\n return b - Math.sqrt((1 - u) * (b - a) * (b - c));\n },\n\n variance: function variance(a, b, c) {\n return (a * a + b * b + c * c - a * b - a * c - b * c) / 18;\n }\n});\n\n\n// extend arcsine function with static methods\njStat.extend(jStat.arcsine, {\n pdf: function pdf(x, a, b) {\n if (b <= a) return NaN;\n\n return (x <= a || x >= b) ? 0 :\n (2 / Math.PI) *\n Math.pow(Math.pow(b - a, 2) -\n Math.pow(2 * x - a - b, 2), -0.5);\n },\n\n cdf: function cdf(x, a, b) {\n if (x < a)\n return 0;\n else if (x < b)\n return (2 / Math.PI) * Math.asin(Math.sqrt((x - a)/(b - a)));\n return 1;\n },\n\n inv: function(p, a, b) {\n return a + (0.5 - 0.5 * Math.cos(Math.PI * p)) * (b - a);\n },\n\n mean: function mean(a, b) {\n if (b <= a) return NaN;\n return (a + b) / 2;\n },\n\n median: function median(a, b) {\n if (b <= a) return NaN;\n return (a + b) / 2;\n },\n\n mode: function mode(/*a, b*/) {\n throw new Error('mode is not yet implemented');\n },\n\n sample: function sample(a, b) {\n return ((a + b) / 2) + ((b - a) / 2) *\n Math.sin(2 * Math.PI * jStat.uniform.sample(0, 1));\n },\n\n variance: function variance(a, b) {\n if (b <= a) return NaN;\n return Math.pow(b - a, 2) / 8;\n }\n});\n\n\nfunction laplaceSign(x) { return x / Math.abs(x); }\n\njStat.extend(jStat.laplace, {\n pdf: function pdf(x, mu, b) {\n return (b <= 0) ? 0 : (Math.exp(-Math.abs(x - mu) / b)) / (2 * b);\n },\n\n cdf: function cdf(x, mu, b) {\n if (b <= 0) { return 0; }\n\n if(x < mu) {\n return 0.5 * Math.exp((x - mu) / b);\n } else {\n return 1 - 0.5 * Math.exp(- (x - mu) / b);\n }\n },\n\n mean: function(mu/*, b*/) {\n return mu;\n },\n\n median: function(mu/*, b*/) {\n return mu;\n },\n\n mode: function(mu/*, b*/) {\n return mu;\n },\n\n variance: function(mu, b) {\n return 2 * b * b;\n },\n\n sample: function sample(mu, b) {\n var u = jStat._random_fn() - 0.5;\n\n return mu - (b * laplaceSign(u) * Math.log(1 - (2 * Math.abs(u))));\n }\n});\n\nfunction tukeyWprob(w, rr, cc) {\n var nleg = 12;\n var ihalf = 6;\n\n var C1 = -30;\n var C2 = -50;\n var C3 = 60;\n var bb = 8;\n var wlar = 3;\n var wincr1 = 2;\n var wincr2 = 3;\n var xleg = [\n 0.981560634246719250690549090149,\n 0.904117256370474856678465866119,\n 0.769902674194304687036893833213,\n 0.587317954286617447296702418941,\n 0.367831498998180193752691536644,\n 0.125233408511468915472441369464\n ];\n var aleg = [\n 0.047175336386511827194615961485,\n 0.106939325995318430960254718194,\n 0.160078328543346226334652529543,\n 0.203167426723065921749064455810,\n 0.233492536538354808760849898925,\n 0.249147045813402785000562436043\n ];\n\n var qsqz = w * 0.5;\n\n // if w >= 16 then the integral lower bound (occurs for c=20)\n // is 0.99999999999995 so return a value of 1.\n\n if (qsqz >= bb)\n return 1.0;\n\n // find (f(w/2) - 1) ^ cc\n // (first term in integral of hartley's form).\n\n var pr_w = 2 * jStat.normal.cdf(qsqz, 0, 1, 1, 0) - 1; // erf(qsqz / M_SQRT2)\n // if pr_w ^ cc < 2e-22 then set pr_w = 0\n if (pr_w >= Math.exp(C2 / cc))\n pr_w = Math.pow(pr_w, cc);\n else\n pr_w = 0.0;\n\n // if w is large then the second component of the\n // integral is small, so fewer intervals are needed.\n\n var wincr;\n if (w > wlar)\n wincr = wincr1;\n else\n wincr = wincr2;\n\n // find the integral of second term of hartley's form\n // for the integral of the range for equal-length\n // intervals using legendre quadrature. limits of\n // integration are from (w/2, 8). two or three\n // equal-length intervals are used.\n\n // blb and bub are lower and upper limits of integration.\n\n var blb = qsqz;\n var binc = (bb - qsqz) / wincr;\n var bub = blb + binc;\n var einsum = 0.0;\n\n // integrate over each interval\n\n var cc1 = cc - 1.0;\n for (var wi = 1; wi <= wincr; wi++) {\n var elsum = 0.0;\n var a = 0.5 * (bub + blb);\n\n // legendre quadrature with order = nleg\n\n var b = 0.5 * (bub - blb);\n\n for (var jj = 1; jj <= nleg; jj++) {\n var j, xx;\n if (ihalf < jj) {\n j = (nleg - jj) + 1;\n xx = xleg[j-1];\n } else {\n j = jj;\n xx = -xleg[j-1];\n }\n var c = b * xx;\n var ac = a + c;\n\n // if exp(-qexpo/2) < 9e-14,\n // then doesn't contribute to integral\n\n var qexpo = ac * ac;\n if (qexpo > C3)\n break;\n\n var pplus = 2 * jStat.normal.cdf(ac, 0, 1, 1, 0);\n var pminus= 2 * jStat.normal.cdf(ac, w, 1, 1, 0);\n\n // if rinsum ^ (cc-1) < 9e-14,\n // then doesn't contribute to integral\n\n var rinsum = (pplus * 0.5) - (pminus * 0.5);\n if (rinsum >= Math.exp(C1 / cc1)) {\n rinsum = (aleg[j-1] * Math.exp(-(0.5 * qexpo))) * Math.pow(rinsum, cc1);\n elsum += rinsum;\n }\n }\n elsum *= (((2.0 * b) * cc) / Math.sqrt(2 * Math.PI));\n einsum += elsum;\n blb = bub;\n bub += binc;\n }\n\n // if pr_w ^ rr < 9e-14, then return 0\n pr_w += einsum;\n if (pr_w <= Math.exp(C1 / rr))\n return 0;\n\n pr_w = Math.pow(pr_w, rr);\n if (pr_w >= 1) // 1 was iMax was eps\n return 1;\n return pr_w;\n}\n\nfunction tukeyQinv(p, c, v) {\n var p0 = 0.322232421088;\n var q0 = 0.993484626060e-01;\n var p1 = -1.0;\n var q1 = 0.588581570495;\n var p2 = -0.342242088547;\n var q2 = 0.531103462366;\n var p3 = -0.204231210125;\n var q3 = 0.103537752850;\n var p4 = -0.453642210148e-04;\n var q4 = 0.38560700634e-02;\n var c1 = 0.8832;\n var c2 = 0.2368;\n var c3 = 1.214;\n var c4 = 1.208;\n var c5 = 1.4142;\n var vmax = 120.0;\n\n var ps = 0.5 - 0.5 * p;\n var yi = Math.sqrt(Math.log(1.0 / (ps * ps)));\n var t = yi + (((( yi * p4 + p3) * yi + p2) * yi + p1) * yi + p0)\n / (((( yi * q4 + q3) * yi + q2) * yi + q1) * yi + q0);\n if (v < vmax) t += (t * t * t + t) / v / 4.0;\n var q = c1 - c2 * t;\n if (v < vmax) q += -c3 / v + c4 * t / v;\n return t * (q * Math.log(c - 1.0) + c5);\n}\n\njStat.extend(jStat.tukey, {\n cdf: function cdf(q, nmeans, df) {\n // Identical implementation as the R ptukey() function as of commit 68947\n var rr = 1;\n var cc = nmeans;\n\n var nlegq = 16;\n var ihalfq = 8;\n\n var eps1 = -30.0;\n var eps2 = 1.0e-14;\n var dhaf = 100.0;\n var dquar = 800.0;\n var deigh = 5000.0;\n var dlarg = 25000.0;\n var ulen1 = 1.0;\n var ulen2 = 0.5;\n var ulen3 = 0.25;\n var ulen4 = 0.125;\n var xlegq = [\n 0.989400934991649932596154173450,\n 0.944575023073232576077988415535,\n 0.865631202387831743880467897712,\n 0.755404408355003033895101194847,\n 0.617876244402643748446671764049,\n 0.458016777657227386342419442984,\n 0.281603550779258913230460501460,\n 0.950125098376374401853193354250e-1\n ];\n var alegq = [\n 0.271524594117540948517805724560e-1,\n 0.622535239386478928628438369944e-1,\n 0.951585116824927848099251076022e-1,\n 0.124628971255533872052476282192,\n 0.149595988816576732081501730547,\n 0.169156519395002538189312079030,\n 0.182603415044923588866763667969,\n 0.189450610455068496285396723208\n ];\n\n if (q <= 0)\n return 0;\n\n // df must be > 1\n // there must be at least two values\n\n if (df < 2 || rr < 1 || cc < 2) return NaN;\n\n if (!Number.isFinite(q))\n return 1;\n\n if (df > dlarg)\n return tukeyWprob(q, rr, cc);\n\n // calculate leading constant\n\n var f2 = df * 0.5;\n var f2lf = ((f2 * Math.log(df)) - (df * Math.log(2))) - jStat.gammaln(f2);\n var f21 = f2 - 1.0;\n\n // integral is divided into unit, half-unit, quarter-unit, or\n // eighth-unit length intervals depending on the value of the\n // degrees of freedom.\n\n var ff4 = df * 0.25;\n var ulen;\n if (df <= dhaf) ulen = ulen1;\n else if (df <= dquar) ulen = ulen2;\n else if (df <= deigh) ulen = ulen3;\n else ulen = ulen4;\n\n f2lf += Math.log(ulen);\n\n // integrate over each subinterval\n\n var ans = 0.0;\n\n for (var i = 1; i <= 50; i++) {\n var otsum = 0.0;\n\n // legendre quadrature with order = nlegq\n // nodes (stored in xlegq) are symmetric around zero.\n\n var twa1 = (2 * i - 1) * ulen;\n\n for (var jj = 1; jj <= nlegq; jj++) {\n var j, t1;\n if (ihalfq < jj) {\n j = jj - ihalfq - 1;\n t1 = (f2lf + (f21 * Math.log(twa1 + (xlegq[j] * ulen))))\n - (((xlegq[j] * ulen) + twa1) * ff4);\n } else {\n j = jj - 1;\n t1 = (f2lf + (f21 * Math.log(twa1 - (xlegq[j] * ulen))))\n + (((xlegq[j] * ulen) - twa1) * ff4);\n }\n\n // if exp(t1) < 9e-14, then doesn't contribute to integral\n var qsqz;\n if (t1 >= eps1) {\n if (ihalfq < jj) {\n qsqz = q * Math.sqrt(((xlegq[j] * ulen) + twa1) * 0.5);\n } else {\n qsqz = q * Math.sqrt(((-(xlegq[j] * ulen)) + twa1) * 0.5);\n }\n\n // call wprob to find integral of range portion\n\n var wprb = tukeyWprob(qsqz, rr, cc);\n var rotsum = (wprb * alegq[j]) * Math.exp(t1);\n otsum += rotsum;\n }\n // end legendre integral for interval i\n // L200:\n }\n\n // if integral for interval i < 1e-14, then stop.\n // However, in order to avoid small area under left tail,\n // at least 1 / ulen intervals are calculated.\n if (i * ulen >= 1.0 && otsum <= eps2)\n break;\n\n // end of interval i\n // L330:\n\n ans += otsum;\n }\n\n if (otsum > eps2) { // not converged\n throw new Error('tukey.cdf failed to converge');\n }\n if (ans > 1)\n ans = 1;\n return ans;\n },\n\n inv: function(p, nmeans, df) {\n // Identical implementation as the R qtukey() function as of commit 68947\n var rr = 1;\n var cc = nmeans;\n\n var eps = 0.0001;\n var maxiter = 50;\n\n // df must be > 1 ; there must be at least two values\n if (df < 2 || rr < 1 || cc < 2) return NaN;\n\n if (p < 0 || p > 1) return NaN;\n if (p === 0) return 0;\n if (p === 1) return Infinity;\n\n // Initial value\n\n var x0 = tukeyQinv(p, cc, df);\n\n // Find prob(value < x0)\n\n var valx0 = jStat.tukey.cdf(x0, nmeans, df) - p;\n\n // Find the second iterate and prob(value < x1).\n // If the first iterate has probability value\n // exceeding p then second iterate is 1 less than\n // first iterate; otherwise it is 1 greater.\n\n var x1;\n if (valx0 > 0.0)\n x1 = Math.max(0.0, x0 - 1.0);\n else\n x1 = x0 + 1.0;\n var valx1 = jStat.tukey.cdf(x1, nmeans, df) - p;\n\n // Find new iterate\n\n var ans;\n for(var iter = 1; iter < maxiter; iter++) {\n ans = x1 - ((valx1 * (x1 - x0)) / (valx1 - valx0));\n valx0 = valx1;\n\n // New iterate must be >= 0\n\n x0 = x1;\n if (ans < 0.0) {\n ans = 0.0;\n valx1 = -p;\n }\n // Find prob(value < new iterate)\n\n valx1 = jStat.tukey.cdf(ans, nmeans, df) - p;\n x1 = ans;\n\n // If the difference between two successive\n // iterates is less than eps, stop\n\n var xabs = Math.abs(x1 - x0);\n if (xabs < eps)\n return ans;\n }\n\n throw new Error('tukey.inv failed to converge');\n }\n});\n\n}(jStat, Math));\n/* Provides functions for the solution of linear system of equations, integration, extrapolation,\n * interpolation, eigenvalue problems, differential equations and PCA analysis. */\n\n(function(jStat, Math) {\n\nvar push = Array.prototype.push;\nvar isArray = jStat.utils.isArray;\n\nfunction isUsable(arg) {\n return isArray(arg) || arg instanceof jStat;\n}\n\njStat.extend({\n\n // add a vector/matrix to a vector/matrix or scalar\n add: function add(arr, arg) {\n // check if arg is a vector or scalar\n if (isUsable(arg)) {\n if (!isUsable(arg[0])) arg = [ arg ];\n return jStat.map(arr, function(value, row, col) {\n return value + arg[row][col];\n });\n }\n return jStat.map(arr, function(value) { return value + arg; });\n },\n\n // subtract a vector or scalar from the vector\n subtract: function subtract(arr, arg) {\n // check if arg is a vector or scalar\n if (isUsable(arg)) {\n if (!isUsable(arg[0])) arg = [ arg ];\n return jStat.map(arr, function(value, row, col) {\n return value - arg[row][col] || 0;\n });\n }\n return jStat.map(arr, function(value) { return value - arg; });\n },\n\n // matrix division\n divide: function divide(arr, arg) {\n if (isUsable(arg)) {\n if (!isUsable(arg[0])) arg = [ arg ];\n return jStat.multiply(arr, jStat.inv(arg));\n }\n return jStat.map(arr, function(value) { return value / arg; });\n },\n\n // matrix multiplication\n multiply: function multiply(arr, arg) {\n var row, col, nrescols, sum, nrow, ncol, res, rescols;\n // eg: arr = 2 arg = 3 -> 6 for res[0][0] statement closure\n if (arr.length === undefined && arg.length === undefined) {\n return arr * arg;\n }\n nrow = arr.length,\n ncol = arr[0].length,\n res = jStat.zeros(nrow, nrescols = (isUsable(arg)) ? arg[0].length : ncol),\n rescols = 0;\n if (isUsable(arg)) {\n for (; rescols < nrescols; rescols++) {\n for (row = 0; row < nrow; row++) {\n sum = 0;\n for (col = 0; col < ncol; col++)\n sum += arr[row][col] * arg[col][rescols];\n res[row][rescols] = sum;\n }\n }\n return (nrow === 1 && rescols === 1) ? res[0][0] : res;\n }\n return jStat.map(arr, function(value) { return value * arg; });\n },\n\n // outer([1,2,3],[4,5,6])\n // ===\n // [[1],[2],[3]] times [[4,5,6]]\n // ->\n // [[4,5,6],[8,10,12],[12,15,18]]\n outer:function outer(A, B) {\n return jStat.multiply(A.map(function(t){ return [t] }), [B]);\n },\n\n\n // Returns the dot product of two matricies\n dot: function dot(arr, arg) {\n if (!isUsable(arr[0])) arr = [ arr ];\n if (!isUsable(arg[0])) arg = [ arg ];\n // convert column to row vector\n var left = (arr[0].length === 1 && arr.length !== 1) ? jStat.transpose(arr) : arr,\n right = (arg[0].length === 1 && arg.length !== 1) ? jStat.transpose(arg) : arg,\n res = [],\n row = 0,\n nrow = left.length,\n ncol = left[0].length,\n sum, col;\n for (; row < nrow; row++) {\n res[row] = [];\n sum = 0;\n for (col = 0; col < ncol; col++)\n sum += left[row][col] * right[row][col];\n res[row] = sum;\n }\n return (res.length === 1) ? res[0] : res;\n },\n\n // raise every element by a scalar\n pow: function pow(arr, arg) {\n return jStat.map(arr, function(value) { return Math.pow(value, arg); });\n },\n\n // exponentiate every element\n exp: function exp(arr) {\n return jStat.map(arr, function(value) { return Math.exp(value); });\n },\n\n // generate the natural log of every element\n log: function exp(arr) {\n return jStat.map(arr, function(value) { return Math.log(value); });\n },\n\n // generate the absolute values of the vector\n abs: function abs(arr) {\n return jStat.map(arr, function(value) { return Math.abs(value); });\n },\n\n // computes the p-norm of the vector\n // In the case that a matrix is passed, uses the first row as the vector\n norm: function norm(arr, p) {\n var nnorm = 0,\n i = 0;\n // check the p-value of the norm, and set for most common case\n if (isNaN(p)) p = 2;\n // check if multi-dimensional array, and make vector correction\n if (isUsable(arr[0])) arr = arr[0];\n // vector norm\n for (; i < arr.length; i++) {\n nnorm += Math.pow(Math.abs(arr[i]), p);\n }\n return Math.pow(nnorm, 1 / p);\n },\n\n // computes the angle between two vectors in rads\n // In case a matrix is passed, this uses the first row as the vector\n angle: function angle(arr, arg) {\n return Math.acos(jStat.dot(arr, arg) / (jStat.norm(arr) * jStat.norm(arg)));\n },\n\n // augment one matrix by another\n // Note: this function returns a matrix, not a jStat object\n aug: function aug(a, b) {\n var newarr = [];\n var i;\n for (i = 0; i < a.length; i++) {\n newarr.push(a[i].slice());\n }\n for (i = 0; i < newarr.length; i++) {\n push.apply(newarr[i], b[i]);\n }\n return newarr;\n },\n\n // The inv() function calculates the inverse of a matrix\n // Create the inverse by augmenting the matrix by the identity matrix of the\n // appropriate size, and then use G-J elimination on the augmented matrix.\n inv: function inv(a) {\n var rows = a.length;\n var cols = a[0].length;\n var b = jStat.identity(rows, cols);\n var c = jStat.gauss_jordan(a, b);\n var result = [];\n var i = 0;\n var j;\n\n //We need to copy the inverse portion to a new matrix to rid G-J artifacts\n for (; i < rows; i++) {\n result[i] = [];\n for (j = cols; j < c[0].length; j++)\n result[i][j - cols] = c[i][j];\n }\n return result;\n },\n\n // calculate the determinant of a matrix\n det: function det(a) {\n if (a.length === 2) {\n return a[0][0] * a[1][1] - a[0][1] * a[1][0];\n }\n\n var determinant = 0;\n for (var i = 0; i < a.length; i++) {\n // build a sub matrix without column `i`\n var submatrix = [];\n for (var row = 1; row < a.length; row++) {\n submatrix[row - 1] = [];\n for (var col = 0; col < a.length; col++) {\n if (col < i) {\n submatrix[row - 1][col] = a[row][col];\n } else if (col > i) {\n submatrix[row - 1][col - 1] = a[row][col];\n }\n }\n }\n\n // alternate between + and - between determinants\n var sign = i % 2 ? -1 : 1;\n determinant += det(submatrix) * a[0][i] * sign;\n }\n\n return determinant\n },\n\n gauss_elimination: function gauss_elimination(a, b) {\n var i = 0,\n j = 0,\n n = a.length,\n m = a[0].length,\n factor = 1,\n sum = 0,\n x = [],\n maug, pivot, temp, k;\n a = jStat.aug(a, b);\n maug = a[0].length;\n for(i = 0; i < n; i++) {\n pivot = a[i][i];\n j = i;\n for (k = i + 1; k < m; k++) {\n if (pivot < Math.abs(a[k][i])) {\n pivot = a[k][i];\n j = k;\n }\n }\n if (j != i) {\n for(k = 0; k < maug; k++) {\n temp = a[i][k];\n a[i][k] = a[j][k];\n a[j][k] = temp;\n }\n }\n for (j = i + 1; j < n; j++) {\n factor = a[j][i] / a[i][i];\n for(k = i; k < maug; k++) {\n a[j][k] = a[j][k] - factor * a[i][k];\n }\n }\n }\n for (i = n - 1; i >= 0; i--) {\n sum = 0;\n for (j = i + 1; j<= n - 1; j++) {\n sum = sum + x[j] * a[i][j];\n }\n x[i] =(a[i][maug - 1] - sum) / a[i][i];\n }\n return x;\n },\n\n gauss_jordan: function gauss_jordan(a, b) {\n var m = jStat.aug(a, b);\n var h = m.length;\n var w = m[0].length;\n var c = 0;\n var x, y, y2;\n // find max pivot\n for (y = 0; y < h; y++) {\n var maxrow = y;\n for (y2 = y+1; y2 < h; y2++) {\n if (Math.abs(m[y2][y]) > Math.abs(m[maxrow][y]))\n maxrow = y2;\n }\n var tmp = m[y];\n m[y] = m[maxrow];\n m[maxrow] = tmp\n for (y2 = y+1; y2 < h; y2++) {\n c = m[y2][y] / m[y][y];\n for (x = y; x < w; x++) {\n m[y2][x] -= m[y][x] * c;\n }\n }\n }\n // backsubstitute\n for (y = h-1; y >= 0; y--) {\n c = m[y][y];\n for (y2 = 0; y2 < y; y2++) {\n for (x = w-1; x > y-1; x--) {\n m[y2][x] -= m[y][x] * m[y2][y] / c;\n }\n }\n m[y][y] /= c;\n for (x = h; x < w; x++) {\n m[y][x] /= c;\n }\n }\n return m;\n },\n\n // solve equation\n // Ax=b\n // A is upper triangular matrix\n // A=[[1,2,3],[0,4,5],[0,6,7]]\n // b=[1,2,3]\n // triaUpSolve(A,b) // -> [2.666,0.1666,1.666]\n // if you use matrix style\n // A=[[1,2,3],[0,4,5],[0,6,7]]\n // b=[[1],[2],[3]]\n // will return [[2.666],[0.1666],[1.666]]\n triaUpSolve: function triaUpSolve(A, b) {\n var size = A[0].length;\n var x = jStat.zeros(1, size)[0];\n var parts;\n var matrix_mode = false;\n\n if (b[0].length != undefined) {\n b = b.map(function(i){ return i[0] });\n matrix_mode = true;\n }\n\n jStat.arange(size - 1, -1, -1).forEach(function(i) {\n parts = jStat.arange(i + 1, size).map(function(j) {\n return x[j] * A[i][j];\n });\n x[i] = (b[i] - jStat.sum(parts)) / A[i][i];\n });\n\n if (matrix_mode)\n return x.map(function(i){ return [i] });\n return x;\n },\n\n triaLowSolve: function triaLowSolve(A, b) {\n // like to triaUpSolve but A is lower triangular matrix\n var size = A[0].length;\n var x = jStat.zeros(1, size)[0];\n var parts;\n\n var matrix_mode=false;\n if (b[0].length != undefined) {\n b = b.map(function(i){ return i[0] });\n matrix_mode = true;\n }\n\n jStat.arange(size).forEach(function(i) {\n parts = jStat.arange(i).map(function(j) {\n return A[i][j] * x[j];\n });\n x[i] = (b[i] - jStat.sum(parts)) / A[i][i];\n })\n\n if (matrix_mode)\n return x.map(function(i){ return [i] });\n return x;\n },\n\n\n // A -> [L,U]\n // A=LU\n // L is lower triangular matrix\n // U is upper triangular matrix\n lu: function lu(A) {\n var size = A.length;\n //var L=jStat.diagonal(jStat.ones(1,size)[0]);\n var L = jStat.identity(size);\n var R = jStat.zeros(A.length, A[0].length);\n var parts;\n jStat.arange(size).forEach(function(t) {\n R[0][t] = A[0][t];\n });\n jStat.arange(1, size).forEach(function(l) {\n jStat.arange(l).forEach(function(i) {\n parts = jStat.arange(i).map(function(jj) {\n return L[l][jj] * R[jj][i];\n });\n L[l][i] = (A[l][i] - jStat.sum(parts)) / R[i][i];\n });\n jStat.arange(l, size).forEach(function(j) {\n parts = jStat.arange(l).map(function(jj) {\n return L[l][jj] * R[jj][j];\n });\n R[l][j] = A[parts.length][j] - jStat.sum(parts);\n });\n });\n return [L, R];\n },\n\n // A -> T\n // A=TT'\n // T is lower triangular matrix\n cholesky: function cholesky(A) {\n var size = A.length;\n var T = jStat.zeros(A.length, A[0].length);\n var parts;\n jStat.arange(size).forEach(function(i) {\n parts = jStat.arange(i).map(function(t) {\n return Math.pow(T[i][t],2);\n });\n T[i][i] = Math.sqrt(A[i][i] - jStat.sum(parts));\n jStat.arange(i + 1, size).forEach(function(j) {\n parts = jStat.arange(i).map(function(t) {\n return T[i][t] * T[j][t];\n });\n T[j][i] = (A[i][j] - jStat.sum(parts)) / T[i][i];\n });\n });\n return T;\n },\n\n\n gauss_jacobi: function gauss_jacobi(a, b, x, r) {\n var i = 0;\n var j = 0;\n var n = a.length;\n var l = [];\n var u = [];\n var d = [];\n var xv, c, h, xk;\n for (; i < n; i++) {\n l[i] = [];\n u[i] = [];\n d[i] = [];\n for (j = 0; j < n; j++) {\n if (i > j) {\n l[i][j] = a[i][j];\n u[i][j] = d[i][j] = 0;\n } else if (i < j) {\n u[i][j] = a[i][j];\n l[i][j] = d[i][j] = 0;\n } else {\n d[i][j] = a[i][j];\n l[i][j] = u[i][j] = 0;\n }\n }\n }\n h = jStat.multiply(jStat.multiply(jStat.inv(d), jStat.add(l, u)), -1);\n c = jStat.multiply(jStat.inv(d), b);\n xv = x;\n xk = jStat.add(jStat.multiply(h, x), c);\n i = 2;\n while (Math.abs(jStat.norm(jStat.subtract(xk,xv))) > r) {\n xv = xk;\n xk = jStat.add(jStat.multiply(h, xv), c);\n i++;\n }\n return xk;\n },\n\n gauss_seidel: function gauss_seidel(a, b, x, r) {\n var i = 0;\n var n = a.length;\n var l = [];\n var u = [];\n var d = [];\n var j, xv, c, h, xk;\n for (; i < n; i++) {\n l[i] = [];\n u[i] = [];\n d[i] = [];\n for (j = 0; j < n; j++) {\n if (i > j) {\n l[i][j] = a[i][j];\n u[i][j] = d[i][j] = 0;\n } else if (i < j) {\n u[i][j] = a[i][j];\n l[i][j] = d[i][j] = 0;\n } else {\n d[i][j] = a[i][j];\n l[i][j] = u[i][j] = 0;\n }\n }\n }\n h = jStat.multiply(jStat.multiply(jStat.inv(jStat.add(d, l)), u), -1);\n c = jStat.multiply(jStat.inv(jStat.add(d, l)), b);\n xv = x;\n xk = jStat.add(jStat.multiply(h, x), c);\n i = 2;\n while (Math.abs(jStat.norm(jStat.subtract(xk, xv))) > r) {\n xv = xk;\n xk = jStat.add(jStat.multiply(h, xv), c);\n i = i + 1;\n }\n return xk;\n },\n\n SOR: function SOR(a, b, x, r, w) {\n var i = 0;\n var n = a.length;\n var l = [];\n var u = [];\n var d = [];\n var j, xv, c, h, xk;\n for (; i < n; i++) {\n l[i] = [];\n u[i] = [];\n d[i] = [];\n for (j = 0; j < n; j++) {\n if (i > j) {\n l[i][j] = a[i][j];\n u[i][j] = d[i][j] = 0;\n } else if (i < j) {\n u[i][j] = a[i][j];\n l[i][j] = d[i][j] = 0;\n } else {\n d[i][j] = a[i][j];\n l[i][j] = u[i][j] = 0;\n }\n }\n }\n h = jStat.multiply(jStat.inv(jStat.add(d, jStat.multiply(l, w))),\n jStat.subtract(jStat.multiply(d, 1 - w),\n jStat.multiply(u, w)));\n c = jStat.multiply(jStat.multiply(jStat.inv(jStat.add(d,\n jStat.multiply(l, w))), b), w);\n xv = x;\n xk = jStat.add(jStat.multiply(h, x), c);\n i = 2;\n while (Math.abs(jStat.norm(jStat.subtract(xk, xv))) > r) {\n xv = xk;\n xk = jStat.add(jStat.multiply(h, xv), c);\n i++;\n }\n return xk;\n },\n\n householder: function householder(a) {\n var m = a.length;\n var n = a[0].length;\n var i = 0;\n var w = [];\n var p = [];\n var alpha, r, k, j, factor;\n for (; i < m - 1; i++) {\n alpha = 0;\n for (j = i + 1; j < n; j++)\n alpha += (a[j][i] * a[j][i]);\n factor = (a[i + 1][i] > 0) ? -1 : 1;\n alpha = factor * Math.sqrt(alpha);\n r = Math.sqrt((((alpha * alpha) - a[i + 1][i] * alpha) / 2));\n w = jStat.zeros(m, 1);\n w[i + 1][0] = (a[i + 1][i] - alpha) / (2 * r);\n for (k = i + 2; k < m; k++) w[k][0] = a[k][i] / (2 * r);\n p = jStat.subtract(jStat.identity(m, n),\n jStat.multiply(jStat.multiply(w, jStat.transpose(w)), 2));\n a = jStat.multiply(p, jStat.multiply(a, p));\n }\n return a;\n },\n\n // A -> [Q,R]\n // Q is orthogonal matrix\n // R is upper triangular\n QR: (function() {\n // x -> Q\n // find a orthogonal matrix Q st.\n // Qx=y\n // y is [||x||,0,0,...]\n\n // quick ref\n var sum = jStat.sum;\n var range = jStat.arange;\n\n function qr2(x) {\n // quick impletation\n // https://www.stat.wisc.edu/~larget/math496/qr.html\n\n var n = x.length;\n var p = x[0].length;\n\n var r = jStat.zeros(p, p);\n x = jStat.copy(x);\n\n var i,j,k;\n for(j = 0; j < p; j++){\n r[j][j] = Math.sqrt(sum(range(n).map(function(i){\n return x[i][j] * x[i][j];\n })));\n for(i = 0; i < n; i++){\n x[i][j] = x[i][j] / r[j][j];\n }\n for(k = j+1; k < p; k++){\n r[j][k] = sum(range(n).map(function(i){\n return x[i][j] * x[i][k];\n }));\n for(i = 0; i < n; i++){\n x[i][k] = x[i][k] - x[i][j]*r[j][k];\n }\n }\n }\n return [x, r];\n }\n\n return qr2;\n }()),\n\n lstsq: (function() {\n // solve least squard problem for Ax=b as QR decomposition way if b is\n // [[b1],[b2],[b3]] form will return [[x1],[x2],[x3]] array form solution\n // else b is [b1,b2,b3] form will return [x1,x2,x3] array form solution\n function R_I(A) {\n A = jStat.copy(A);\n var size = A.length;\n var I = jStat.identity(size);\n jStat.arange(size - 1, -1, -1).forEach(function(i) {\n jStat.sliceAssign(\n I, { row: i }, jStat.divide(jStat.slice(I, { row: i }), A[i][i]));\n jStat.sliceAssign(\n A, { row: i }, jStat.divide(jStat.slice(A, { row: i }), A[i][i]));\n jStat.arange(i).forEach(function(j) {\n var c = jStat.multiply(A[j][i], -1);\n var Aj = jStat.slice(A, { row: j });\n var cAi = jStat.multiply(jStat.slice(A, { row: i }), c);\n jStat.sliceAssign(A, { row: j }, jStat.add(Aj, cAi));\n var Ij = jStat.slice(I, { row: j });\n var cIi = jStat.multiply(jStat.slice(I, { row: i }), c);\n jStat.sliceAssign(I, { row: j }, jStat.add(Ij, cIi));\n })\n });\n return I;\n }\n\n function qr_solve(A, b){\n var array_mode = false;\n if (b[0].length === undefined) {\n // [c1,c2,c3] mode\n b = b.map(function(x){ return [x] });\n array_mode = true;\n }\n var QR = jStat.QR(A);\n var Q = QR[0];\n var R = QR[1];\n var attrs = A[0].length;\n var Q1 = jStat.slice(Q,{col:{end:attrs}});\n var R1 = jStat.slice(R,{row:{end:attrs}});\n var RI = R_I(R1);\n var Q2 = jStat.transpose(Q1);\n\n if(Q2[0].length === undefined){\n Q2 = [Q2]; // The confusing jStat.multifly implementation threat nature process again.\n }\n\n var x = jStat.multiply(jStat.multiply(RI, Q2), b);\n\n if(x.length === undefined){\n x = [[x]]; // The confusing jStat.multifly implementation threat nature process again.\n }\n\n\n if (array_mode)\n return x.map(function(i){ return i[0] });\n return x;\n }\n\n return qr_solve;\n }()),\n\n jacobi: function jacobi(a) {\n var condition = 1;\n var n = a.length;\n var e = jStat.identity(n, n);\n var ev = [];\n var b, i, j, p, q, maxim, theta, s;\n // condition === 1 only if tolerance is not reached\n while (condition === 1) {\n maxim = a[0][1];\n p = 0;\n q = 1;\n for (i = 0; i < n; i++) {\n for (j = 0; j < n; j++) {\n if (i != j) {\n if (maxim < Math.abs(a[i][j])) {\n maxim = Math.abs(a[i][j]);\n p = i;\n q = j;\n }\n }\n }\n }\n if (a[p][p] === a[q][q])\n theta = (a[p][q] > 0) ? Math.PI / 4 : -Math.PI / 4;\n else\n theta = Math.atan(2 * a[p][q] / (a[p][p] - a[q][q])) / 2;\n s = jStat.identity(n, n);\n s[p][p] = Math.cos(theta);\n s[p][q] = -Math.sin(theta);\n s[q][p] = Math.sin(theta);\n s[q][q] = Math.cos(theta);\n // eigen vector matrix\n e = jStat.multiply(e, s);\n b = jStat.multiply(jStat.multiply(jStat.inv(s), a), s);\n a = b;\n condition = 0;\n for (i = 1; i < n; i++) {\n for (j = 1; j < n; j++) {\n if (i != j && Math.abs(a[i][j]) > 0.001) {\n condition = 1;\n }\n }\n }\n }\n for (i = 0; i < n; i++) ev.push(a[i][i]);\n //returns both the eigenvalue and eigenmatrix\n return [e, ev];\n },\n\n rungekutta: function rungekutta(f, h, p, t_j, u_j, order) {\n var k1, k2, u_j1, k3, k4;\n if (order === 2) {\n while (t_j <= p) {\n k1 = h * f(t_j, u_j);\n k2 = h * f(t_j + h, u_j + k1);\n u_j1 = u_j + (k1 + k2) / 2;\n u_j = u_j1;\n t_j = t_j + h;\n }\n }\n if (order === 4) {\n while (t_j <= p) {\n k1 = h * f(t_j, u_j);\n k2 = h * f(t_j + h / 2, u_j + k1 / 2);\n k3 = h * f(t_j + h / 2, u_j + k2 / 2);\n k4 = h * f(t_j +h, u_j + k3);\n u_j1 = u_j + (k1 + 2 * k2 + 2 * k3 + k4) / 6;\n u_j = u_j1;\n t_j = t_j + h;\n }\n }\n return u_j;\n },\n\n romberg: function romberg(f, a, b, order) {\n var i = 0;\n var h = (b - a) / 2;\n var x = [];\n var h1 = [];\n var g = [];\n var m, a1, j, k, I;\n while (i < order / 2) {\n I = f(a);\n for (j = a, k = 0; j <= b; j = j + h, k++) x[k] = j;\n m = x.length;\n for (j = 1; j < m - 1; j++) {\n I += (((j % 2) !== 0) ? 4 : 2) * f(x[j]);\n }\n I = (h / 3) * (I + f(b));\n g[i] = I;\n h /= 2;\n i++;\n }\n a1 = g.length;\n m = 1;\n while (a1 !== 1) {\n for (j = 0; j < a1 - 1; j++)\n h1[j] = ((Math.pow(4, m)) * g[j + 1] - g[j]) / (Math.pow(4, m) - 1);\n a1 = h1.length;\n g = h1;\n h1 = [];\n m++;\n }\n return g;\n },\n\n richardson: function richardson(X, f, x, h) {\n function pos(X, x) {\n var i = 0;\n var n = X.length;\n var p;\n for (; i < n; i++)\n if (X[i] === x) p = i;\n return p;\n }\n var h_min = Math.abs(x - X[pos(X, x) + 1]);\n var i = 0;\n var g = [];\n var h1 = [];\n var y1, y2, m, a, j;\n while (h >= h_min) {\n y1 = pos(X, x + h);\n y2 = pos(X, x);\n g[i] = (f[y1] - 2 * f[y2] + f[2 * y2 - y1]) / (h * h);\n h /= 2;\n i++;\n }\n a = g.length;\n m = 1;\n while (a != 1) {\n for (j = 0; j < a - 1; j++)\n h1[j] = ((Math.pow(4, m)) * g[j + 1] - g[j]) / (Math.pow(4, m) - 1);\n a = h1.length;\n g = h1;\n h1 = [];\n m++;\n }\n return g;\n },\n\n simpson: function simpson(f, a, b, n) {\n var h = (b - a) / n;\n var I = f(a);\n var x = [];\n var j = a;\n var k = 0;\n var i = 1;\n var m;\n for (; j <= b; j = j + h, k++)\n x[k] = j;\n m = x.length;\n for (; i < m - 1; i++) {\n I += ((i % 2 !== 0) ? 4 : 2) * f(x[i]);\n }\n return (h / 3) * (I + f(b));\n },\n\n hermite: function hermite(X, F, dF, value) {\n var n = X.length;\n var p = 0;\n var i = 0;\n var l = [];\n var dl = [];\n var A = [];\n var B = [];\n var j;\n for (; i < n; i++) {\n l[i] = 1;\n for (j = 0; j < n; j++) {\n if (i != j) l[i] *= (value - X[j]) / (X[i] - X[j]);\n }\n dl[i] = 0;\n for (j = 0; j < n; j++) {\n if (i != j) dl[i] += 1 / (X [i] - X[j]);\n }\n A[i] = (1 - 2 * (value - X[i]) * dl[i]) * (l[i] * l[i]);\n B[i] = (value - X[i]) * (l[i] * l[i]);\n p += (A[i] * F[i] + B[i] * dF[i]);\n }\n return p;\n },\n\n lagrange: function lagrange(X, F, value) {\n var p = 0;\n var i = 0;\n var j, l;\n var n = X.length;\n for (; i < n; i++) {\n l = F[i];\n for (j = 0; j < n; j++) {\n // calculating the lagrange polynomial L_i\n if (i != j) l *= (value - X[j]) / (X[i] - X[j]);\n }\n // adding the lagrange polynomials found above\n p += l;\n }\n return p;\n },\n\n cubic_spline: function cubic_spline(X, F, value) {\n var n = X.length;\n var i = 0, j;\n var A = [];\n var B = [];\n var alpha = [];\n var c = [];\n var h = [];\n var b = [];\n var d = [];\n for (; i < n - 1; i++)\n h[i] = X[i + 1] - X[i];\n alpha[0] = 0;\n for (i = 1; i < n - 1; i++) {\n alpha[i] = (3 / h[i]) * (F[i + 1] - F[i]) -\n (3 / h[i-1]) * (F[i] - F[i-1]);\n }\n for (i = 1; i < n - 1; i++) {\n A[i] = [];\n B[i] = [];\n A[i][i-1] = h[i-1];\n A[i][i] = 2 * (h[i - 1] + h[i]);\n A[i][i+1] = h[i];\n B[i][0] = alpha[i];\n }\n c = jStat.multiply(jStat.inv(A), B);\n for (j = 0; j < n - 1; j++) {\n b[j] = (F[j + 1] - F[j]) / h[j] - h[j] * (c[j + 1][0] + 2 * c[j][0]) / 3;\n d[j] = (c[j + 1][0] - c[j][0]) / (3 * h[j]);\n }\n for (j = 0; j < n; j++) {\n if (X[j] > value) break;\n }\n j -= 1;\n return F[j] + (value - X[j]) * b[j] + jStat.sq(value-X[j]) *\n c[j] + (value - X[j]) * jStat.sq(value - X[j]) * d[j];\n },\n\n gauss_quadrature: function gauss_quadrature() {\n throw new Error('gauss_quadrature not yet implemented');\n },\n\n PCA: function PCA(X) {\n var m = X.length;\n var n = X[0].length;\n var i = 0;\n var j, temp1;\n var u = [];\n var D = [];\n var result = [];\n var temp2 = [];\n var Y = [];\n var Bt = [];\n var B = [];\n var C = [];\n var V = [];\n var Vt = [];\n for (i = 0; i < m; i++) {\n u[i] = jStat.sum(X[i]) / n;\n }\n for (i = 0; i < n; i++) {\n B[i] = [];\n for(j = 0; j < m; j++) {\n B[i][j] = X[j][i] - u[j];\n }\n }\n B = jStat.transpose(B);\n for (i = 0; i < m; i++) {\n C[i] = [];\n for (j = 0; j < m; j++) {\n C[i][j] = (jStat.dot([B[i]], [B[j]])) / (n - 1);\n }\n }\n result = jStat.jacobi(C);\n V = result[0];\n D = result[1];\n Vt = jStat.transpose(V);\n for (i = 0; i < D.length; i++) {\n for (j = i; j < D.length; j++) {\n if(D[i] < D[j]) {\n temp1 = D[i];\n D[i] = D[j];\n D[j] = temp1;\n temp2 = Vt[i];\n Vt[i] = Vt[j];\n Vt[j] = temp2;\n }\n }\n }\n Bt = jStat.transpose(B);\n for (i = 0; i < m; i++) {\n Y[i] = [];\n for (j = 0; j < Bt.length; j++) {\n Y[i][j] = jStat.dot([Vt[i]], [Bt[j]]);\n }\n }\n return [X, D, Vt, Y];\n }\n});\n\n// extend jStat.fn with methods that require one argument\n(function(funcs) {\n for (var i = 0; i < funcs.length; i++) (function(passfunc) {\n jStat.fn[passfunc] = function(arg, func) {\n var tmpthis = this;\n // check for callback\n if (func) {\n setTimeout(function() {\n func.call(tmpthis, jStat.fn[passfunc].call(tmpthis, arg));\n }, 15);\n return this;\n }\n if (typeof jStat[passfunc](this, arg) === 'number')\n return jStat[passfunc](this, arg);\n else\n return jStat(jStat[passfunc](this, arg));\n };\n }(funcs[i]));\n}('add divide multiply subtract dot pow exp log abs norm angle'.split(' ')));\n\n}(jStat, Math));\n(function(jStat, Math) {\n\nvar slice = [].slice;\nvar isNumber = jStat.utils.isNumber;\nvar isArray = jStat.utils.isArray;\n\n// flag==true denotes use of sample standard deviation\n// Z Statistics\njStat.extend({\n // 2 different parameter lists:\n // (value, mean, sd)\n // (value, array, flag)\n zscore: function zscore() {\n var args = slice.call(arguments);\n if (isNumber(args[1])) {\n return (args[0] - args[1]) / args[2];\n }\n return (args[0] - jStat.mean(args[1])) / jStat.stdev(args[1], args[2]);\n },\n\n // 3 different paramter lists:\n // (value, mean, sd, sides)\n // (zscore, sides)\n // (value, array, sides, flag)\n ztest: function ztest() {\n var args = slice.call(arguments);\n var z;\n if (isArray(args[1])) {\n // (value, array, sides, flag)\n z = jStat.zscore(args[0],args[1],args[3]);\n return (args[2] === 1) ?\n (jStat.normal.cdf(-Math.abs(z), 0, 1)) :\n (jStat.normal.cdf(-Math.abs(z), 0, 1)*2);\n } else {\n if (args.length > 2) {\n // (value, mean, sd, sides)\n z = jStat.zscore(args[0],args[1],args[2]);\n return (args[3] === 1) ?\n (jStat.normal.cdf(-Math.abs(z),0,1)) :\n (jStat.normal.cdf(-Math.abs(z),0,1)* 2);\n } else {\n // (zscore, sides)\n z = args[0];\n return (args[1] === 1) ?\n (jStat.normal.cdf(-Math.abs(z),0,1)) :\n (jStat.normal.cdf(-Math.abs(z),0,1)*2);\n }\n }\n }\n});\n\njStat.extend(jStat.fn, {\n zscore: function zscore(value, flag) {\n return (value - this.mean()) / this.stdev(flag);\n },\n\n ztest: function ztest(value, sides, flag) {\n var zscore = Math.abs(this.zscore(value, flag));\n return (sides === 1) ?\n (jStat.normal.cdf(-zscore, 0, 1)) :\n (jStat.normal.cdf(-zscore, 0, 1) * 2);\n }\n});\n\n// T Statistics\njStat.extend({\n // 2 parameter lists\n // (value, mean, sd, n)\n // (value, array)\n tscore: function tscore() {\n var args = slice.call(arguments);\n return (args.length === 4) ?\n ((args[0] - args[1]) / (args[2] / Math.sqrt(args[3]))) :\n ((args[0] - jStat.mean(args[1])) /\n (jStat.stdev(args[1], true) / Math.sqrt(args[1].length)));\n },\n\n // 3 different paramter lists:\n // (value, mean, sd, n, sides)\n // (tscore, n, sides)\n // (value, array, sides)\n ttest: function ttest() {\n var args = slice.call(arguments);\n var tscore;\n if (args.length === 5) {\n tscore = Math.abs(jStat.tscore(args[0], args[1], args[2], args[3]));\n return (args[4] === 1) ?\n (jStat.studentt.cdf(-tscore, args[3]-1)) :\n (jStat.studentt.cdf(-tscore, args[3]-1)*2);\n }\n if (isNumber(args[1])) {\n tscore = Math.abs(args[0])\n return (args[2] == 1) ?\n (jStat.studentt.cdf(-tscore, args[1]-1)) :\n (jStat.studentt.cdf(-tscore, args[1]-1) * 2);\n }\n tscore = Math.abs(jStat.tscore(args[0], args[1]))\n return (args[2] == 1) ?\n (jStat.studentt.cdf(-tscore, args[1].length-1)) :\n (jStat.studentt.cdf(-tscore, args[1].length-1) * 2);\n }\n});\n\njStat.extend(jStat.fn, {\n tscore: function tscore(value) {\n return (value - this.mean()) / (this.stdev(true) / Math.sqrt(this.cols()));\n },\n\n ttest: function ttest(value, sides) {\n return (sides === 1) ?\n (1 - jStat.studentt.cdf(Math.abs(this.tscore(value)), this.cols()-1)) :\n (jStat.studentt.cdf(-Math.abs(this.tscore(value)), this.cols()-1)*2);\n }\n});\n\n// F Statistics\njStat.extend({\n // Paramter list is as follows:\n // (array1, array2, array3, ...)\n // or it is an array of arrays\n // array of arrays conversion\n anovafscore: function anovafscore() {\n var args = slice.call(arguments),\n expVar, sample, sampMean, sampSampMean, tmpargs, unexpVar, i, j;\n if (args.length === 1) {\n tmpargs = new Array(args[0].length);\n for (i = 0; i < args[0].length; i++) {\n tmpargs[i] = args[0][i];\n }\n args = tmpargs;\n }\n // Builds sample array\n sample = new Array();\n for (i = 0; i < args.length; i++) {\n sample = sample.concat(args[i]);\n }\n sampMean = jStat.mean(sample);\n // Computes the explained variance\n expVar = 0;\n for (i = 0; i < args.length; i++) {\n expVar = expVar + args[i].length * Math.pow(jStat.mean(args[i]) - sampMean, 2);\n }\n expVar /= (args.length - 1);\n // Computes unexplained variance\n unexpVar = 0;\n for (i = 0; i < args.length; i++) {\n sampSampMean = jStat.mean(args[i]);\n for (j = 0; j < args[i].length; j++) {\n unexpVar += Math.pow(args[i][j] - sampSampMean, 2);\n }\n }\n unexpVar /= (sample.length - args.length);\n return expVar / unexpVar;\n },\n\n // 2 different paramter setups\n // (array1, array2, array3, ...)\n // (anovafscore, df1, df2)\n anovaftest: function anovaftest() {\n var args = slice.call(arguments),\n df1, df2, n, i;\n if (isNumber(args[0])) {\n return 1 - jStat.centralF.cdf(args[0], args[1], args[2]);\n }\n var anovafscore = jStat.anovafscore(args);\n df1 = args.length - 1;\n n = 0;\n for (i = 0; i < args.length; i++) {\n n = n + args[i].length;\n }\n df2 = n - df1 - 1;\n return 1 - jStat.centralF.cdf(anovafscore, df1, df2);\n },\n\n ftest: function ftest(fscore, df1, df2) {\n return 1 - jStat.centralF.cdf(fscore, df1, df2);\n }\n});\n\njStat.extend(jStat.fn, {\n anovafscore: function anovafscore() {\n return jStat.anovafscore(this.toArray());\n },\n\n anovaftes: function anovaftes() {\n var n = 0;\n var i;\n for (i = 0; i < this.length; i++) {\n n = n + this[i].length;\n }\n return jStat.ftest(this.anovafscore(), this.length - 1, n - this.length);\n }\n});\n\n// Tukey's range test\njStat.extend({\n // 2 parameter lists\n // (mean1, mean2, n1, n2, sd)\n // (array1, array2, sd)\n qscore: function qscore() {\n var args = slice.call(arguments);\n var mean1, mean2, n1, n2, sd;\n if (isNumber(args[0])) {\n mean1 = args[0];\n mean2 = args[1];\n n1 = args[2];\n n2 = args[3];\n sd = args[4];\n } else {\n mean1 = jStat.mean(args[0]);\n mean2 = jStat.mean(args[1]);\n n1 = args[0].length;\n n2 = args[1].length;\n sd = args[2];\n }\n return Math.abs(mean1 - mean2) / (sd * Math.sqrt((1 / n1 + 1 / n2) / 2));\n },\n\n // 3 different parameter lists:\n // (qscore, n, k)\n // (mean1, mean2, n1, n2, sd, n, k)\n // (array1, array2, sd, n, k)\n qtest: function qtest() {\n var args = slice.call(arguments);\n\n var qscore;\n if (args.length === 3) {\n qscore = args[0];\n args = args.slice(1);\n } else if (args.length === 7) {\n qscore = jStat.qscore(args[0], args[1], args[2], args[3], args[4]);\n args = args.slice(5);\n } else {\n qscore = jStat.qscore(args[0], args[1], args[2]);\n args = args.slice(3);\n }\n\n var n = args[0];\n var k = args[1];\n\n return 1 - jStat.tukey.cdf(qscore, k, n - k);\n },\n\n tukeyhsd: function tukeyhsd(arrays) {\n var sd = jStat.pooledstdev(arrays);\n var means = arrays.map(function (arr) {return jStat.mean(arr);});\n var n = arrays.reduce(function (n, arr) {return n + arr.length;}, 0);\n\n var results = [];\n for (var i = 0; i < arrays.length; ++i) {\n for (var j = i + 1; j < arrays.length; ++j) {\n var p = jStat.qtest(means[i], means[j], arrays[i].length, arrays[j].length, sd, n, arrays.length);\n results.push([[i, j], p]);\n }\n }\n\n return results;\n }\n});\n\n// Error Bounds\njStat.extend({\n // 2 different parameter setups\n // (value, alpha, sd, n)\n // (value, alpha, array)\n normalci: function normalci() {\n var args = slice.call(arguments),\n ans = new Array(2),\n change;\n if (args.length === 4) {\n change = Math.abs(jStat.normal.inv(args[1] / 2, 0, 1) *\n args[2] / Math.sqrt(args[3]));\n } else {\n change = Math.abs(jStat.normal.inv(args[1] / 2, 0, 1) *\n jStat.stdev(args[2]) / Math.sqrt(args[2].length));\n }\n ans[0] = args[0] - change;\n ans[1] = args[0] + change;\n return ans;\n },\n\n // 2 different parameter setups\n // (value, alpha, sd, n)\n // (value, alpha, array)\n tci: function tci() {\n var args = slice.call(arguments),\n ans = new Array(2),\n change;\n if (args.length === 4) {\n change = Math.abs(jStat.studentt.inv(args[1] / 2, args[3] - 1) *\n args[2] / Math.sqrt(args[3]));\n } else {\n change = Math.abs(jStat.studentt.inv(args[1] / 2, args[2].length - 1) *\n jStat.stdev(args[2], true) / Math.sqrt(args[2].length));\n }\n ans[0] = args[0] - change;\n ans[1] = args[0] + change;\n return ans;\n },\n\n significant: function significant(pvalue, alpha) {\n return pvalue < alpha;\n }\n});\n\njStat.extend(jStat.fn, {\n normalci: function normalci(value, alpha) {\n return jStat.normalci(value, alpha, this.toArray());\n },\n\n tci: function tci(value, alpha) {\n return jStat.tci(value, alpha, this.toArray());\n }\n});\n\n// internal method for calculating the z-score for a difference of proportions test\nfunction differenceOfProportions(p1, n1, p2, n2) {\n if (p1 > 1 || p2 > 1 || p1 <= 0 || p2 <= 0) {\n throw new Error(\"Proportions should be greater than 0 and less than 1\")\n }\n var pooled = (p1 * n1 + p2 * n2) / (n1 + n2);\n var se = Math.sqrt(pooled * (1 - pooled) * ((1/n1) + (1/n2)));\n return (p1 - p2) / se;\n}\n\n// Difference of Proportions\njStat.extend(jStat.fn, {\n oneSidedDifferenceOfProportions: function oneSidedDifferenceOfProportions(p1, n1, p2, n2) {\n var z = differenceOfProportions(p1, n1, p2, n2);\n return jStat.ztest(z, 1);\n },\n\n twoSidedDifferenceOfProportions: function twoSidedDifferenceOfProportions(p1, n1, p2, n2) {\n var z = differenceOfProportions(p1, n1, p2, n2);\n return jStat.ztest(z, 2);\n }\n});\n\n}(jStat, Math));\njStat.models = (function(){\n function sub_regress(exog) {\n var var_count = exog[0].length;\n var modelList = jStat.arange(var_count).map(function(endog_index) {\n var exog_index =\n jStat.arange(var_count).filter(function(i){return i!==endog_index});\n return ols(jStat.col(exog, endog_index).map(function(x){ return x[0] }),\n jStat.col(exog, exog_index))\n });\n return modelList;\n }\n\n // do OLS model regress\n // exog have include const columns ,it will not generate it .In fact, exog is\n // \"design matrix\" look at\n //https://en.wikipedia.org/wiki/Design_matrix\n function ols(endog, exog) {\n var nobs = endog.length;\n var df_model = exog[0].length - 1;\n var df_resid = nobs-df_model - 1;\n var coef = jStat.lstsq(exog, endog);\n var predict =\n jStat.multiply(exog, coef.map(function(x) { return [x] }))\n .map(function(p) { return p[0] });\n var resid = jStat.subtract(endog, predict);\n var ybar = jStat.mean(endog);\n // constant cause problem\n // var SST = jStat.sum(endog.map(function(y) {\n // return Math.pow(y-ybar,2);\n // }));\n var SSE = jStat.sum(predict.map(function(f) {\n return Math.pow(f - ybar, 2);\n }));\n var SSR = jStat.sum(endog.map(function(y, i) {\n return Math.pow(y - predict[i], 2);\n }));\n var SST = SSE + SSR;\n var R2 = (SSE / SST);\n return {\n exog:exog,\n endog:endog,\n nobs:nobs,\n df_model:df_model,\n df_resid:df_resid,\n coef:coef,\n predict:predict,\n resid:resid,\n ybar:ybar,\n SST:SST,\n SSE:SSE,\n SSR:SSR,\n R2:R2\n };\n }\n\n // H0: b_I=0\n // H1: b_I!=0\n function t_test(model) {\n var subModelList = sub_regress(model.exog);\n //var sigmaHat=jStat.stdev(model.resid);\n var sigmaHat = Math.sqrt(model.SSR / (model.df_resid));\n var seBetaHat = subModelList.map(function(mod) {\n var SST = mod.SST;\n var R2 = mod.R2;\n return sigmaHat / Math.sqrt(SST * (1 - R2));\n });\n var tStatistic = model.coef.map(function(coef, i) {\n return (coef - 0) / seBetaHat[i];\n });\n var pValue = tStatistic.map(function(t) {\n var leftppf = jStat.studentt.cdf(t, model.df_resid);\n return (leftppf > 0.5 ? 1 - leftppf : leftppf) * 2;\n });\n var c = jStat.studentt.inv(0.975, model.df_resid);\n var interval95 = model.coef.map(function(coef, i) {\n var d = c * seBetaHat[i];\n return [coef - d, coef + d];\n })\n return {\n se: seBetaHat,\n t: tStatistic,\n p: pValue,\n sigmaHat: sigmaHat,\n interval95: interval95\n };\n }\n\n function F_test(model) {\n var F_statistic =\n (model.R2 / model.df_model) / ((1 - model.R2) / model.df_resid);\n var fcdf = function(x, n1, n2) {\n return jStat.beta.cdf(x / (n2 / n1 + x), n1 / 2, n2 / 2)\n }\n var pvalue = 1 - fcdf(F_statistic, model.df_model, model.df_resid);\n return { F_statistic: F_statistic, pvalue: pvalue };\n }\n\n function ols_wrap(endog, exog) {\n var model = ols(endog,exog);\n var ttest = t_test(model);\n var ftest = F_test(model);\n // Provide the Wherry / Ezekiel / McNemar / Cohen Adjusted R^2\n // Which matches the 'adjusted R^2' provided by R's lm package\n var adjust_R2 =\n 1 - (1 - model.R2) * ((model.nobs - 1) / (model.df_resid));\n model.t = ttest;\n model.f = ftest;\n model.adjust_R2 = adjust_R2;\n return model;\n }\n\n return { ols: ols_wrap };\n})();\n//To regress, simply build X matrix\n//(append column of 1's) using\n//buildxmatrix and build the Y\n//matrix using buildymatrix\n//(simply the transpose)\n//and run regress.\n\n\n\n//Regressions\n\njStat.extend({\n buildxmatrix: function buildxmatrix(){\n //Parameters will be passed in as such\n //(array1,array2,array3,...)\n //as (x1,x2,x3,...)\n //needs to be (1,x1,x2,x3,...)\n var matrixRows = new Array(arguments.length);\n for(var i=0;i1){\n result = [];\n for (i = 0; i < A.rows(); i++) {\n result[i] = [];\n for (j = 0; j < B.cols(); j++) {\n sum = 0;\n for (k = 0; k < A.cols(); k++) {\n sum += A.toArray()[i][k] * B.toArray()[k][j];\n }\n result[i][j] = sum;\n }\n }\n return jStat(result);\n }\n result = [];\n for (i = 0; i < A.rows(); i++) {\n result[i] = [];\n for (j = 0; j < B.cols(); j++) {\n sum = 0;\n for (k = 0; k < A.cols(); k++) {\n sum += A.toArray()[i][k] * B.toArray()[j];\n }\n result[i][j] = sum;\n }\n }\n return jStat(result);\n }\n },\n\n //regress and regresst to be fixed\n\n regress: function regress(jMatX,jMatY){\n //print(\"regressin!\");\n //print(jMatX.toArray());\n var innerinv = jStat.xtranspxinv(jMatX);\n //print(innerinv);\n var xtransp = jMatX.transpose();\n var next = jStat.matrixmult(jStat(innerinv),xtransp);\n return jStat.matrixmult(next,jMatY);\n\n },\n\n regresst: function regresst(jMatX,jMatY,sides){\n var beta = jStat.regress(jMatX,jMatY);\n\n var compile = {};\n compile.anova = {};\n var jMatYBar = jStat.jMatYBar(jMatX, beta);\n compile.yBar = jMatYBar;\n var yAverage = jMatY.mean();\n compile.anova.residuals = jStat.residuals(jMatY, jMatYBar);\n\n compile.anova.ssr = jStat.ssr(jMatYBar, yAverage);\n compile.anova.msr = compile.anova.ssr / (jMatX[0].length - 1);\n\n compile.anova.sse = jStat.sse(jMatY, jMatYBar);\n compile.anova.mse =\n compile.anova.sse / (jMatY.length - (jMatX[0].length - 1) - 1);\n\n compile.anova.sst = jStat.sst(jMatY, yAverage);\n compile.anova.mst = compile.anova.sst / (jMatY.length - 1);\n\n compile.anova.r2 = 1 - (compile.anova.sse / compile.anova.sst);\n if (compile.anova.r2 < 0) compile.anova.r2 = 0;\n\n compile.anova.fratio = compile.anova.msr / compile.anova.mse;\n compile.anova.pvalue =\n jStat.anovaftest(compile.anova.fratio,\n jMatX[0].length - 1,\n jMatY.length - (jMatX[0].length - 1) - 1);\n\n compile.anova.rmse = Math.sqrt(compile.anova.mse);\n\n compile.anova.r2adj = 1 - (compile.anova.mse / compile.anova.mst);\n if (compile.anova.r2adj < 0) compile.anova.r2adj = 0;\n\n compile.stats = new Array(jMatX[0].length);\n var covar = jStat.xtranspxinv(jMatX);\n var sds, ts, ps;\n\n for(var i=0; i Occurrence Index bitmap.\n// YYYY -> DSL Method Type bitmap.\n// ZZZZZZZZZZZZZZZ -> Rule short Index bitmap.\n// TTTTTTTTT -> alternation alternative index bitmap\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getKeyForAutomaticLookahead = exports.AT_LEAST_ONE_SEP_IDX = exports.MANY_SEP_IDX = exports.AT_LEAST_ONE_IDX = exports.MANY_IDX = exports.OPTION_IDX = exports.OR_IDX = exports.BITS_FOR_ALT_IDX = exports.BITS_FOR_RULE_IDX = exports.BITS_FOR_OCCURRENCE_IDX = exports.BITS_FOR_METHOD_TYPE = void 0;\nexports.BITS_FOR_METHOD_TYPE = 4;\nexports.BITS_FOR_OCCURRENCE_IDX = 8;\nexports.BITS_FOR_RULE_IDX = 12;\n// TODO: validation, this means that there may at most 2^8 --> 256 alternatives for an alternation.\nexports.BITS_FOR_ALT_IDX = 8;\n// short string used as part of mapping keys.\n// being short improves the performance when composing KEYS for maps out of these\n// The 5 - 8 bits (16 possible values, are reserved for the DSL method indices)\nexports.OR_IDX = 1 << exports.BITS_FOR_OCCURRENCE_IDX;\nexports.OPTION_IDX = 2 << exports.BITS_FOR_OCCURRENCE_IDX;\nexports.MANY_IDX = 3 << exports.BITS_FOR_OCCURRENCE_IDX;\nexports.AT_LEAST_ONE_IDX = 4 << exports.BITS_FOR_OCCURRENCE_IDX;\nexports.MANY_SEP_IDX = 5 << exports.BITS_FOR_OCCURRENCE_IDX;\nexports.AT_LEAST_ONE_SEP_IDX = 6 << exports.BITS_FOR_OCCURRENCE_IDX;\n// this actually returns a number, but it is always used as a string (object prop key)\nfunction getKeyForAutomaticLookahead(ruleIdx, dslMethodIdx, occurrence) {\n return occurrence | dslMethodIdx | ruleIdx;\n}\nexports.getKeyForAutomaticLookahead = getKeyForAutomaticLookahead;\nvar BITS_START_FOR_ALT_IDX = 32 - exports.BITS_FOR_ALT_IDX;\n//# sourceMappingURL=keys.js.map","var Stack = require('./_Stack'),\n equalArrays = require('./_equalArrays'),\n equalByTag = require('./_equalByTag'),\n equalObjects = require('./_equalObjects'),\n getTag = require('./_getTag'),\n isArray = require('./isArray'),\n isBuffer = require('./isBuffer'),\n isTypedArray = require('./isTypedArray');\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1;\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n arrayTag = '[object Array]',\n objectTag = '[object Object]';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * A specialized version of `baseIsEqual` for arrays and objects which performs\n * deep comparisons and tracks traversed objects enabling objects with circular\n * references to be compared.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} [stack] Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) {\n var objIsArr = isArray(object),\n othIsArr = isArray(other),\n objTag = objIsArr ? arrayTag : getTag(object),\n othTag = othIsArr ? arrayTag : getTag(other);\n\n objTag = objTag == argsTag ? objectTag : objTag;\n othTag = othTag == argsTag ? objectTag : othTag;\n\n var objIsObj = objTag == objectTag,\n othIsObj = othTag == objectTag,\n isSameTag = objTag == othTag;\n\n if (isSameTag && isBuffer(object)) {\n if (!isBuffer(other)) {\n return false;\n }\n objIsArr = true;\n objIsObj = false;\n }\n if (isSameTag && !objIsObj) {\n stack || (stack = new Stack);\n return (objIsArr || isTypedArray(object))\n ? equalArrays(object, other, bitmask, customizer, equalFunc, stack)\n : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack);\n }\n if (!(bitmask & COMPARE_PARTIAL_FLAG)) {\n var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),\n othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');\n\n if (objIsWrapped || othIsWrapped) {\n var objUnwrapped = objIsWrapped ? object.value() : object,\n othUnwrapped = othIsWrapped ? other.value() : other;\n\n stack || (stack = new Stack);\n return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack);\n }\n }\n if (!isSameTag) {\n return false;\n }\n stack || (stack = new Stack);\n return equalObjects(object, other, bitmask, customizer, equalFunc, stack);\n}\n\nmodule.exports = baseIsEqualDeep;\n","var baseIsTypedArray = require('./_baseIsTypedArray'),\n baseUnary = require('./_baseUnary'),\n nodeUtil = require('./_nodeUtil');\n\n/* Node.js helper references. */\nvar nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;\n\n/**\n * Checks if `value` is classified as a typed array.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n * @example\n *\n * _.isTypedArray(new Uint8Array);\n * // => true\n *\n * _.isTypedArray([]);\n * // => false\n */\nvar isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;\n\nmodule.exports = isTypedArray;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.applyMixins = void 0;\nfunction applyMixins(derivedCtor, baseCtors) {\n baseCtors.forEach(function (baseCtor) {\n var baseProto = baseCtor.prototype;\n Object.getOwnPropertyNames(baseProto).forEach(function (propName) {\n if (propName === \"constructor\") {\n return;\n }\n var basePropDescriptor = Object.getOwnPropertyDescriptor(baseProto, propName);\n // Handle Accessors\n if (basePropDescriptor &&\n (basePropDescriptor.get || basePropDescriptor.set)) {\n Object.defineProperty(derivedCtor.prototype, propName, basePropDescriptor);\n }\n else {\n derivedCtor.prototype[propName] = baseCtor.prototype[propName];\n }\n });\n });\n}\nexports.applyMixins = applyMixins;\n//# sourceMappingURL=apply_mixins.js.map","/**\n * A specialized version of `matchesProperty` for source values suitable\n * for strict equality comparisons, i.e. `===`.\n *\n * @private\n * @param {string} key The key of the property to get.\n * @param {*} srcValue The value to match.\n * @returns {Function} Returns the new spec function.\n */\nfunction matchesStrictComparable(key, srcValue) {\n return function(object) {\n if (object == null) {\n return false;\n }\n return object[key] === srcValue &&\n (srcValue !== undefined || (key in Object(object)));\n };\n}\n\nmodule.exports = matchesStrictComparable;\n","var cloneArrayBuffer = require('./_cloneArrayBuffer'),\n cloneDataView = require('./_cloneDataView'),\n cloneRegExp = require('./_cloneRegExp'),\n cloneSymbol = require('./_cloneSymbol'),\n cloneTypedArray = require('./_cloneTypedArray');\n\n/** `Object#toString` result references. */\nvar boolTag = '[object Boolean]',\n dateTag = '[object Date]',\n mapTag = '[object Map]',\n numberTag = '[object Number]',\n regexpTag = '[object RegExp]',\n setTag = '[object Set]',\n stringTag = '[object String]',\n symbolTag = '[object Symbol]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n dataViewTag = '[object DataView]',\n float32Tag = '[object Float32Array]',\n float64Tag = '[object Float64Array]',\n int8Tag = '[object Int8Array]',\n int16Tag = '[object Int16Array]',\n int32Tag = '[object Int32Array]',\n uint8Tag = '[object Uint8Array]',\n uint8ClampedTag = '[object Uint8ClampedArray]',\n uint16Tag = '[object Uint16Array]',\n uint32Tag = '[object Uint32Array]';\n\n/**\n * Initializes an object clone based on its `toStringTag`.\n *\n * **Note:** This function only supports cloning values with tags of\n * `Boolean`, `Date`, `Error`, `Map`, `Number`, `RegExp`, `Set`, or `String`.\n *\n * @private\n * @param {Object} object The object to clone.\n * @param {string} tag The `toStringTag` of the object to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the initialized clone.\n */\nfunction initCloneByTag(object, tag, isDeep) {\n var Ctor = object.constructor;\n switch (tag) {\n case arrayBufferTag:\n return cloneArrayBuffer(object);\n\n case boolTag:\n case dateTag:\n return new Ctor(+object);\n\n case dataViewTag:\n return cloneDataView(object, isDeep);\n\n case float32Tag: case float64Tag:\n case int8Tag: case int16Tag: case int32Tag:\n case uint8Tag: case uint8ClampedTag: case uint16Tag: case uint32Tag:\n return cloneTypedArray(object, isDeep);\n\n case mapTag:\n return new Ctor;\n\n case numberTag:\n case stringTag:\n return new Ctor(object);\n\n case regexpTag:\n return cloneRegExp(object);\n\n case setTag:\n return new Ctor;\n\n case symbolTag:\n return cloneSymbol(object);\n }\n}\n\nmodule.exports = initCloneByTag;\n","\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.RecognizerEngine = void 0;\nvar isEmpty_1 = __importDefault(require(\"lodash/isEmpty\"));\nvar isArray_1 = __importDefault(require(\"lodash/isArray\"));\nvar flatten_1 = __importDefault(require(\"lodash/flatten\"));\nvar every_1 = __importDefault(require(\"lodash/every\"));\nvar uniq_1 = __importDefault(require(\"lodash/uniq\"));\nvar isObject_1 = __importDefault(require(\"lodash/isObject\"));\nvar has_1 = __importDefault(require(\"lodash/has\"));\nvar values_1 = __importDefault(require(\"lodash/values\"));\nvar reduce_1 = __importDefault(require(\"lodash/reduce\"));\nvar clone_1 = __importDefault(require(\"lodash/clone\"));\nvar keys_1 = require(\"../../grammar/keys\");\nvar exceptions_public_1 = require(\"../../exceptions_public\");\nvar lookahead_1 = require(\"../../grammar/lookahead\");\nvar interpreter_1 = require(\"../../grammar/interpreter\");\nvar parser_1 = require(\"../parser\");\nvar recoverable_1 = require(\"./recoverable\");\nvar tokens_public_1 = require(\"../../../scan/tokens_public\");\nvar tokens_1 = require(\"../../../scan/tokens\");\n/**\n * This trait is responsible for the runtime parsing engine\n * Used by the official API (recognizer_api.ts)\n */\nvar RecognizerEngine = /** @class */ (function () {\n function RecognizerEngine() {\n }\n RecognizerEngine.prototype.initRecognizerEngine = function (tokenVocabulary, config) {\n this.className = this.constructor.name;\n // TODO: would using an ES6 Map or plain object be faster (CST building scenario)\n this.shortRuleNameToFull = {};\n this.fullRuleNameToShort = {};\n this.ruleShortNameIdx = 256;\n this.tokenMatcher = tokens_1.tokenStructuredMatcherNoCategories;\n this.subruleIdx = 0;\n this.definedRulesNames = [];\n this.tokensMap = {};\n this.isBackTrackingStack = [];\n this.RULE_STACK = [];\n this.RULE_OCCURRENCE_STACK = [];\n this.gastProductionsCache = {};\n if ((0, has_1.default)(config, \"serializedGrammar\")) {\n throw Error(\"The Parser's configuration can no longer contain a property.\\n\" +\n \"\\tSee: https://chevrotain.io/docs/changes/BREAKING_CHANGES.html#_6-0-0\\n\" +\n \"\\tFor Further details.\");\n }\n if ((0, isArray_1.default)(tokenVocabulary)) {\n // This only checks for Token vocabularies provided as arrays.\n // That is good enough because the main objective is to detect users of pre-V4.0 APIs\n // rather than all edge cases of empty Token vocabularies.\n if ((0, isEmpty_1.default)(tokenVocabulary)) {\n throw Error(\"A Token Vocabulary cannot be empty.\\n\" +\n \"\\tNote that the first argument for the parser constructor\\n\" +\n \"\\tis no longer a Token vector (since v4.0).\");\n }\n if (typeof tokenVocabulary[0].startOffset === \"number\") {\n throw Error(\"The Parser constructor no longer accepts a token vector as the first argument.\\n\" +\n \"\\tSee: https://chevrotain.io/docs/changes/BREAKING_CHANGES.html#_4-0-0\\n\" +\n \"\\tFor Further details.\");\n }\n }\n if ((0, isArray_1.default)(tokenVocabulary)) {\n this.tokensMap = (0, reduce_1.default)(tokenVocabulary, function (acc, tokType) {\n acc[tokType.name] = tokType;\n return acc;\n }, {});\n }\n else if ((0, has_1.default)(tokenVocabulary, \"modes\") &&\n (0, every_1.default)((0, flatten_1.default)((0, values_1.default)(tokenVocabulary.modes)), tokens_1.isTokenType)) {\n var allTokenTypes_1 = (0, flatten_1.default)((0, values_1.default)(tokenVocabulary.modes));\n var uniqueTokens = (0, uniq_1.default)(allTokenTypes_1);\n this.tokensMap = (0, reduce_1.default)(uniqueTokens, function (acc, tokType) {\n acc[tokType.name] = tokType;\n return acc;\n }, {});\n }\n else if ((0, isObject_1.default)(tokenVocabulary)) {\n this.tokensMap = (0, clone_1.default)(tokenVocabulary);\n }\n else {\n throw new Error(\" argument must be An Array of Token constructors,\" +\n \" A dictionary of Token constructors or an IMultiModeLexerDefinition\");\n }\n // always add EOF to the tokenNames -> constructors map. it is useful to assure all the input has been\n // parsed with a clear error message (\"expecting EOF but found ...\")\n this.tokensMap[\"EOF\"] = tokens_public_1.EOF;\n var allTokenTypes = (0, has_1.default)(tokenVocabulary, \"modes\")\n ? (0, flatten_1.default)((0, values_1.default)(tokenVocabulary.modes))\n : (0, values_1.default)(tokenVocabulary);\n var noTokenCategoriesUsed = (0, every_1.default)(allTokenTypes, function (tokenConstructor) {\n return (0, isEmpty_1.default)(tokenConstructor.categoryMatches);\n });\n this.tokenMatcher = noTokenCategoriesUsed\n ? tokens_1.tokenStructuredMatcherNoCategories\n : tokens_1.tokenStructuredMatcher;\n // Because ES2015+ syntax should be supported for creating Token classes\n // We cannot assume that the Token classes were created using the \"extendToken\" utilities\n // Therefore we must augment the Token classes both on Lexer initialization and on Parser initialization\n (0, tokens_1.augmentTokenTypes)((0, values_1.default)(this.tokensMap));\n };\n RecognizerEngine.prototype.defineRule = function (ruleName, impl, config) {\n if (this.selfAnalysisDone) {\n throw Error(\"Grammar rule <\".concat(ruleName, \"> may not be defined after the 'performSelfAnalysis' method has been called'\\n\") +\n \"Make sure that all grammar rule definitions are done before 'performSelfAnalysis' is called.\");\n }\n var resyncEnabled = (0, has_1.default)(config, \"resyncEnabled\")\n ? config.resyncEnabled // assumes end user provides the correct config value/type\n : parser_1.DEFAULT_RULE_CONFIG.resyncEnabled;\n var recoveryValueFunc = (0, has_1.default)(config, \"recoveryValueFunc\")\n ? config.recoveryValueFunc // assumes end user provides the correct config value/type\n : parser_1.DEFAULT_RULE_CONFIG.recoveryValueFunc;\n // performance optimization: Use small integers as keys for the longer human readable \"full\" rule names.\n // this greatly improves Map access time (as much as 8% for some performance benchmarks).\n var shortName = this.ruleShortNameIdx << (keys_1.BITS_FOR_METHOD_TYPE + keys_1.BITS_FOR_OCCURRENCE_IDX);\n this.ruleShortNameIdx++;\n this.shortRuleNameToFull[shortName] = ruleName;\n this.fullRuleNameToShort[ruleName] = shortName;\n var invokeRuleWithTry;\n // Micro optimization, only check the condition **once** on rule definition\n // instead of **every single** rule invocation.\n if (this.outputCst === true) {\n invokeRuleWithTry = function invokeRuleWithTry() {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n try {\n this.ruleInvocationStateUpdate(shortName, ruleName, this.subruleIdx);\n impl.apply(this, args);\n var cst = this.CST_STACK[this.CST_STACK.length - 1];\n this.cstPostRule(cst);\n return cst;\n }\n catch (e) {\n return this.invokeRuleCatch(e, resyncEnabled, recoveryValueFunc);\n }\n finally {\n this.ruleFinallyStateUpdate();\n }\n };\n }\n else {\n invokeRuleWithTry = function invokeRuleWithTryCst() {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n try {\n this.ruleInvocationStateUpdate(shortName, ruleName, this.subruleIdx);\n return impl.apply(this, args);\n }\n catch (e) {\n return this.invokeRuleCatch(e, resyncEnabled, recoveryValueFunc);\n }\n finally {\n this.ruleFinallyStateUpdate();\n }\n };\n }\n var wrappedGrammarRule = Object.assign(invokeRuleWithTry, { ruleName: ruleName, originalGrammarAction: impl });\n return wrappedGrammarRule;\n };\n RecognizerEngine.prototype.invokeRuleCatch = function (e, resyncEnabledConfig, recoveryValueFunc) {\n var isFirstInvokedRule = this.RULE_STACK.length === 1;\n // note the reSync is always enabled for the first rule invocation, because we must always be able to\n // reSync with EOF and just output some INVALID ParseTree\n // during backtracking reSync recovery is disabled, otherwise we can't be certain the backtracking\n // path is really the most valid one\n var reSyncEnabled = resyncEnabledConfig && !this.isBackTracking() && this.recoveryEnabled;\n if ((0, exceptions_public_1.isRecognitionException)(e)) {\n var recogError = e;\n if (reSyncEnabled) {\n var reSyncTokType = this.findReSyncTokenType();\n if (this.isInCurrentRuleReSyncSet(reSyncTokType)) {\n recogError.resyncedTokens = this.reSyncTo(reSyncTokType);\n if (this.outputCst) {\n var partialCstResult = this.CST_STACK[this.CST_STACK.length - 1];\n partialCstResult.recoveredNode = true;\n return partialCstResult;\n }\n else {\n return recoveryValueFunc(e);\n }\n }\n else {\n if (this.outputCst) {\n var partialCstResult = this.CST_STACK[this.CST_STACK.length - 1];\n partialCstResult.recoveredNode = true;\n recogError.partialCstResult = partialCstResult;\n }\n // to be handled Further up the call stack\n throw recogError;\n }\n }\n else if (isFirstInvokedRule) {\n // otherwise a Redundant input error will be created as well and we cannot guarantee that this is indeed the case\n this.moveToTerminatedState();\n // the parser should never throw one of its own errors outside its flow.\n // even if error recovery is disabled\n return recoveryValueFunc(e);\n }\n else {\n // to be recovered Further up the call stack\n throw recogError;\n }\n }\n else {\n // some other Error type which we don't know how to handle (for example a built in JavaScript Error)\n throw e;\n }\n };\n // Implementation of parsing DSL\n RecognizerEngine.prototype.optionInternal = function (actionORMethodDef, occurrence) {\n var key = this.getKeyForAutomaticLookahead(keys_1.OPTION_IDX, occurrence);\n return this.optionInternalLogic(actionORMethodDef, occurrence, key);\n };\n RecognizerEngine.prototype.optionInternalLogic = function (actionORMethodDef, occurrence, key) {\n var _this = this;\n var lookAheadFunc = this.getLaFuncFromCache(key);\n var action;\n if (typeof actionORMethodDef !== \"function\") {\n action = actionORMethodDef.DEF;\n var predicate_1 = actionORMethodDef.GATE;\n // predicate present\n if (predicate_1 !== undefined) {\n var orgLookaheadFunction_1 = lookAheadFunc;\n lookAheadFunc = function () {\n return predicate_1.call(_this) && orgLookaheadFunction_1.call(_this);\n };\n }\n }\n else {\n action = actionORMethodDef;\n }\n if (lookAheadFunc.call(this) === true) {\n return action.call(this);\n }\n return undefined;\n };\n RecognizerEngine.prototype.atLeastOneInternal = function (prodOccurrence, actionORMethodDef) {\n var laKey = this.getKeyForAutomaticLookahead(keys_1.AT_LEAST_ONE_IDX, prodOccurrence);\n return this.atLeastOneInternalLogic(prodOccurrence, actionORMethodDef, laKey);\n };\n RecognizerEngine.prototype.atLeastOneInternalLogic = function (prodOccurrence, actionORMethodDef, key) {\n var _this = this;\n var lookAheadFunc = this.getLaFuncFromCache(key);\n var action;\n if (typeof actionORMethodDef !== \"function\") {\n action = actionORMethodDef.DEF;\n var predicate_2 = actionORMethodDef.GATE;\n // predicate present\n if (predicate_2 !== undefined) {\n var orgLookaheadFunction_2 = lookAheadFunc;\n lookAheadFunc = function () {\n return predicate_2.call(_this) && orgLookaheadFunction_2.call(_this);\n };\n }\n }\n else {\n action = actionORMethodDef;\n }\n if (lookAheadFunc.call(this) === true) {\n var notStuck = this.doSingleRepetition(action);\n while (lookAheadFunc.call(this) === true &&\n notStuck === true) {\n notStuck = this.doSingleRepetition(action);\n }\n }\n else {\n throw this.raiseEarlyExitException(prodOccurrence, lookahead_1.PROD_TYPE.REPETITION_MANDATORY, actionORMethodDef.ERR_MSG);\n }\n // note that while it may seem that this can cause an error because by using a recursive call to\n // AT_LEAST_ONE we change the grammar to AT_LEAST_TWO, AT_LEAST_THREE ... , the possible recursive call\n // from the tryInRepetitionRecovery(...) will only happen IFF there really are TWO/THREE/.... items.\n // Performance optimization: \"attemptInRepetitionRecovery\" will be defined as NOOP unless recovery is enabled\n this.attemptInRepetitionRecovery(this.atLeastOneInternal, [prodOccurrence, actionORMethodDef], lookAheadFunc, keys_1.AT_LEAST_ONE_IDX, prodOccurrence, interpreter_1.NextTerminalAfterAtLeastOneWalker);\n };\n RecognizerEngine.prototype.atLeastOneSepFirstInternal = function (prodOccurrence, options) {\n var laKey = this.getKeyForAutomaticLookahead(keys_1.AT_LEAST_ONE_SEP_IDX, prodOccurrence);\n this.atLeastOneSepFirstInternalLogic(prodOccurrence, options, laKey);\n };\n RecognizerEngine.prototype.atLeastOneSepFirstInternalLogic = function (prodOccurrence, options, key) {\n var _this = this;\n var action = options.DEF;\n var separator = options.SEP;\n var firstIterationLookaheadFunc = this.getLaFuncFromCache(key);\n // 1st iteration\n if (firstIterationLookaheadFunc.call(this) === true) {\n ;\n action.call(this);\n // TODO: Optimization can move this function construction into \"attemptInRepetitionRecovery\"\n // because it is only needed in error recovery scenarios.\n var separatorLookAheadFunc = function () {\n return _this.tokenMatcher(_this.LA(1), separator);\n };\n // 2nd..nth iterations\n while (this.tokenMatcher(this.LA(1), separator) === true) {\n // note that this CONSUME will never enter recovery because\n // the separatorLookAheadFunc checks that the separator really does exist.\n this.CONSUME(separator);\n action.call(this);\n }\n // Performance optimization: \"attemptInRepetitionRecovery\" will be defined as NOOP unless recovery is enabled\n this.attemptInRepetitionRecovery(this.repetitionSepSecondInternal, [\n prodOccurrence,\n separator,\n separatorLookAheadFunc,\n action,\n interpreter_1.NextTerminalAfterAtLeastOneSepWalker\n ], separatorLookAheadFunc, keys_1.AT_LEAST_ONE_SEP_IDX, prodOccurrence, interpreter_1.NextTerminalAfterAtLeastOneSepWalker);\n }\n else {\n throw this.raiseEarlyExitException(prodOccurrence, lookahead_1.PROD_TYPE.REPETITION_MANDATORY_WITH_SEPARATOR, options.ERR_MSG);\n }\n };\n RecognizerEngine.prototype.manyInternal = function (prodOccurrence, actionORMethodDef) {\n var laKey = this.getKeyForAutomaticLookahead(keys_1.MANY_IDX, prodOccurrence);\n return this.manyInternalLogic(prodOccurrence, actionORMethodDef, laKey);\n };\n RecognizerEngine.prototype.manyInternalLogic = function (prodOccurrence, actionORMethodDef, key) {\n var _this = this;\n var lookaheadFunction = this.getLaFuncFromCache(key);\n var action;\n if (typeof actionORMethodDef !== \"function\") {\n action = actionORMethodDef.DEF;\n var predicate_3 = actionORMethodDef.GATE;\n // predicate present\n if (predicate_3 !== undefined) {\n var orgLookaheadFunction_3 = lookaheadFunction;\n lookaheadFunction = function () {\n return predicate_3.call(_this) && orgLookaheadFunction_3.call(_this);\n };\n }\n }\n else {\n action = actionORMethodDef;\n }\n var notStuck = true;\n while (lookaheadFunction.call(this) === true && notStuck === true) {\n notStuck = this.doSingleRepetition(action);\n }\n // Performance optimization: \"attemptInRepetitionRecovery\" will be defined as NOOP unless recovery is enabled\n this.attemptInRepetitionRecovery(this.manyInternal, [prodOccurrence, actionORMethodDef], lookaheadFunction, keys_1.MANY_IDX, prodOccurrence, interpreter_1.NextTerminalAfterManyWalker, \n // The notStuck parameter is only relevant when \"attemptInRepetitionRecovery\"\n // is invoked from manyInternal, in the MANY_SEP case and AT_LEAST_ONE[_SEP]\n // An infinite loop cannot occur as:\n // - Either the lookahead is guaranteed to consume something (Single Token Separator)\n // - AT_LEAST_ONE by definition is guaranteed to consume something (or error out).\n notStuck);\n };\n RecognizerEngine.prototype.manySepFirstInternal = function (prodOccurrence, options) {\n var laKey = this.getKeyForAutomaticLookahead(keys_1.MANY_SEP_IDX, prodOccurrence);\n this.manySepFirstInternalLogic(prodOccurrence, options, laKey);\n };\n RecognizerEngine.prototype.manySepFirstInternalLogic = function (prodOccurrence, options, key) {\n var _this = this;\n var action = options.DEF;\n var separator = options.SEP;\n var firstIterationLaFunc = this.getLaFuncFromCache(key);\n // 1st iteration\n if (firstIterationLaFunc.call(this) === true) {\n action.call(this);\n var separatorLookAheadFunc = function () {\n return _this.tokenMatcher(_this.LA(1), separator);\n };\n // 2nd..nth iterations\n while (this.tokenMatcher(this.LA(1), separator) === true) {\n // note that this CONSUME will never enter recovery because\n // the separatorLookAheadFunc checks that the separator really does exist.\n this.CONSUME(separator);\n // No need for checking infinite loop here due to consuming the separator.\n action.call(this);\n }\n // Performance optimization: \"attemptInRepetitionRecovery\" will be defined as NOOP unless recovery is enabled\n this.attemptInRepetitionRecovery(this.repetitionSepSecondInternal, [\n prodOccurrence,\n separator,\n separatorLookAheadFunc,\n action,\n interpreter_1.NextTerminalAfterManySepWalker\n ], separatorLookAheadFunc, keys_1.MANY_SEP_IDX, prodOccurrence, interpreter_1.NextTerminalAfterManySepWalker);\n }\n };\n RecognizerEngine.prototype.repetitionSepSecondInternal = function (prodOccurrence, separator, separatorLookAheadFunc, action, nextTerminalAfterWalker) {\n while (separatorLookAheadFunc()) {\n // note that this CONSUME will never enter recovery because\n // the separatorLookAheadFunc checks that the separator really does exist.\n this.CONSUME(separator);\n action.call(this);\n }\n // we can only arrive to this function after an error\n // has occurred (hence the name 'second') so the following\n // IF will always be entered, its possible to remove it...\n // however it is kept to avoid confusion and be consistent.\n // Performance optimization: \"attemptInRepetitionRecovery\" will be defined as NOOP unless recovery is enabled\n /* istanbul ignore else */\n this.attemptInRepetitionRecovery(this.repetitionSepSecondInternal, [\n prodOccurrence,\n separator,\n separatorLookAheadFunc,\n action,\n nextTerminalAfterWalker\n ], separatorLookAheadFunc, keys_1.AT_LEAST_ONE_SEP_IDX, prodOccurrence, nextTerminalAfterWalker);\n };\n RecognizerEngine.prototype.doSingleRepetition = function (action) {\n var beforeIteration = this.getLexerPosition();\n action.call(this);\n var afterIteration = this.getLexerPosition();\n // This boolean will indicate if this repetition progressed\n // or if we are \"stuck\" (potential infinite loop in the repetition).\n return afterIteration > beforeIteration;\n };\n RecognizerEngine.prototype.orInternal = function (altsOrOpts, occurrence) {\n var laKey = this.getKeyForAutomaticLookahead(keys_1.OR_IDX, occurrence);\n var alts = (0, isArray_1.default)(altsOrOpts) ? altsOrOpts : altsOrOpts.DEF;\n var laFunc = this.getLaFuncFromCache(laKey);\n var altIdxToTake = laFunc.call(this, alts);\n if (altIdxToTake !== undefined) {\n var chosenAlternative = alts[altIdxToTake];\n return chosenAlternative.ALT.call(this);\n }\n this.raiseNoAltException(occurrence, altsOrOpts.ERR_MSG);\n };\n RecognizerEngine.prototype.ruleFinallyStateUpdate = function () {\n this.RULE_STACK.pop();\n this.RULE_OCCURRENCE_STACK.pop();\n // NOOP when cst is disabled\n this.cstFinallyStateUpdate();\n if (this.RULE_STACK.length === 0 && this.isAtEndOfInput() === false) {\n var firstRedundantTok = this.LA(1);\n var errMsg = this.errorMessageProvider.buildNotAllInputParsedMessage({\n firstRedundant: firstRedundantTok,\n ruleName: this.getCurrRuleFullName()\n });\n this.SAVE_ERROR(new exceptions_public_1.NotAllInputParsedException(errMsg, firstRedundantTok));\n }\n };\n RecognizerEngine.prototype.subruleInternal = function (ruleToCall, idx, options) {\n var ruleResult;\n try {\n var args = options !== undefined ? options.ARGS : undefined;\n this.subruleIdx = idx;\n ruleResult = ruleToCall.apply(this, args);\n this.cstPostNonTerminal(ruleResult, options !== undefined && options.LABEL !== undefined\n ? options.LABEL\n : ruleToCall.ruleName);\n return ruleResult;\n }\n catch (e) {\n throw this.subruleInternalError(e, options, ruleToCall.ruleName);\n }\n };\n RecognizerEngine.prototype.subruleInternalError = function (e, options, ruleName) {\n if ((0, exceptions_public_1.isRecognitionException)(e) && e.partialCstResult !== undefined) {\n this.cstPostNonTerminal(e.partialCstResult, options !== undefined && options.LABEL !== undefined\n ? options.LABEL\n : ruleName);\n delete e.partialCstResult;\n }\n throw e;\n };\n RecognizerEngine.prototype.consumeInternal = function (tokType, idx, options) {\n var consumedToken;\n try {\n var nextToken = this.LA(1);\n if (this.tokenMatcher(nextToken, tokType) === true) {\n this.consumeToken();\n consumedToken = nextToken;\n }\n else {\n this.consumeInternalError(tokType, nextToken, options);\n }\n }\n catch (eFromConsumption) {\n consumedToken = this.consumeInternalRecovery(tokType, idx, eFromConsumption);\n }\n this.cstPostTerminal(options !== undefined && options.LABEL !== undefined\n ? options.LABEL\n : tokType.name, consumedToken);\n return consumedToken;\n };\n RecognizerEngine.prototype.consumeInternalError = function (tokType, nextToken, options) {\n var msg;\n var previousToken = this.LA(0);\n if (options !== undefined && options.ERR_MSG) {\n msg = options.ERR_MSG;\n }\n else {\n msg = this.errorMessageProvider.buildMismatchTokenMessage({\n expected: tokType,\n actual: nextToken,\n previous: previousToken,\n ruleName: this.getCurrRuleFullName()\n });\n }\n throw this.SAVE_ERROR(new exceptions_public_1.MismatchedTokenException(msg, nextToken, previousToken));\n };\n RecognizerEngine.prototype.consumeInternalRecovery = function (tokType, idx, eFromConsumption) {\n // no recovery allowed during backtracking, otherwise backtracking may recover invalid syntax and accept it\n // but the original syntax could have been parsed successfully without any backtracking + recovery\n if (this.recoveryEnabled &&\n // TODO: more robust checking of the exception type. Perhaps Typescript extending expressions?\n eFromConsumption.name === \"MismatchedTokenException\" &&\n !this.isBackTracking()) {\n var follows = this.getFollowsForInRuleRecovery(tokType, idx);\n try {\n return this.tryInRuleRecovery(tokType, follows);\n }\n catch (eFromInRuleRecovery) {\n if (eFromInRuleRecovery.name === recoverable_1.IN_RULE_RECOVERY_EXCEPTION) {\n // failed in RuleRecovery.\n // throw the original error in order to trigger reSync error recovery\n throw eFromConsumption;\n }\n else {\n throw eFromInRuleRecovery;\n }\n }\n }\n else {\n throw eFromConsumption;\n }\n };\n RecognizerEngine.prototype.saveRecogState = function () {\n // errors is a getter which will clone the errors array\n var savedErrors = this.errors;\n var savedRuleStack = (0, clone_1.default)(this.RULE_STACK);\n return {\n errors: savedErrors,\n lexerState: this.exportLexerState(),\n RULE_STACK: savedRuleStack,\n CST_STACK: this.CST_STACK\n };\n };\n RecognizerEngine.prototype.reloadRecogState = function (newState) {\n this.errors = newState.errors;\n this.importLexerState(newState.lexerState);\n this.RULE_STACK = newState.RULE_STACK;\n };\n RecognizerEngine.prototype.ruleInvocationStateUpdate = function (shortName, fullName, idxInCallingRule) {\n this.RULE_OCCURRENCE_STACK.push(idxInCallingRule);\n this.RULE_STACK.push(shortName);\n // NOOP when cst is disabled\n this.cstInvocationStateUpdate(fullName);\n };\n RecognizerEngine.prototype.isBackTracking = function () {\n return this.isBackTrackingStack.length !== 0;\n };\n RecognizerEngine.prototype.getCurrRuleFullName = function () {\n var shortName = this.getLastExplicitRuleShortName();\n return this.shortRuleNameToFull[shortName];\n };\n RecognizerEngine.prototype.shortRuleNameToFullName = function (shortName) {\n return this.shortRuleNameToFull[shortName];\n };\n RecognizerEngine.prototype.isAtEndOfInput = function () {\n return this.tokenMatcher(this.LA(1), tokens_public_1.EOF);\n };\n RecognizerEngine.prototype.reset = function () {\n this.resetLexerState();\n this.subruleIdx = 0;\n this.isBackTrackingStack = [];\n this.errors = [];\n this.RULE_STACK = [];\n // TODO: extract a specific reset for TreeBuilder trait\n this.CST_STACK = [];\n this.RULE_OCCURRENCE_STACK = [];\n };\n return RecognizerEngine;\n}());\nexports.RecognizerEngine = RecognizerEngine;\n//# sourceMappingURL=recognizer_engine.js.map","var ListCache = require('./_ListCache'),\n stackClear = require('./_stackClear'),\n stackDelete = require('./_stackDelete'),\n stackGet = require('./_stackGet'),\n stackHas = require('./_stackHas'),\n stackSet = require('./_stackSet');\n\n/**\n * Creates a stack cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Stack(entries) {\n var data = this.__data__ = new ListCache(entries);\n this.size = data.size;\n}\n\n// Add methods to `Stack`.\nStack.prototype.clear = stackClear;\nStack.prototype['delete'] = stackDelete;\nStack.prototype.get = stackGet;\nStack.prototype.has = stackHas;\nStack.prototype.set = stackSet;\n\nmodule.exports = Stack;\n","/**\n * The base implementation of `_.property` without support for deep paths.\n *\n * @private\n * @param {string} key The key of the property to get.\n * @returns {Function} Returns the new accessor function.\n */\nfunction baseProperty(key) {\n return function(object) {\n return object == null ? undefined : object[key];\n };\n}\n\nmodule.exports = baseProperty;\n","var arrayLikeKeys = require('./_arrayLikeKeys'),\n baseKeysIn = require('./_baseKeysIn'),\n isArrayLike = require('./isArrayLike');\n\n/**\n * Creates an array of the own and inherited enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keysIn(new Foo);\n * // => ['a', 'b', 'c'] (iteration order is not guaranteed)\n */\nfunction keysIn(object) {\n return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object);\n}\n\nmodule.exports = keysIn;\n","var baseGet = require('./_baseGet');\n\n/**\n * A specialized version of `baseProperty` which supports deep paths.\n *\n * @private\n * @param {Array|string} path The path of the property to get.\n * @returns {Function} Returns the new accessor function.\n */\nfunction basePropertyDeep(path) {\n return function(object) {\n return baseGet(object, path);\n };\n}\n\nmodule.exports = basePropertyDeep;\n","/**\n * A specialized version of `_.every` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {boolean} Returns `true` if all elements pass the predicate check,\n * else `false`.\n */\nfunction arrayEvery(array, predicate) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n while (++index < length) {\n if (!predicate(array[index], index, array)) {\n return false;\n }\n }\n return true;\n}\n\nmodule.exports = arrayEvery;\n","var coreJsData = require('./_coreJsData');\n\n/** Used to detect methods masquerading as native. */\nvar maskSrcKey = (function() {\n var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');\n return uid ? ('Symbol(src)_1.' + uid) : '';\n}());\n\n/**\n * Checks if `func` has its source masked.\n *\n * @private\n * @param {Function} func The function to check.\n * @returns {boolean} Returns `true` if `func` is masked, else `false`.\n */\nfunction isMasked(func) {\n return !!maskSrcKey && (maskSrcKey in func);\n}\n\nmodule.exports = isMasked;\n","/**\n * The base implementation of `_.unary` without support for storing metadata.\n *\n * @private\n * @param {Function} func The function to cap arguments for.\n * @returns {Function} Returns the new capped function.\n */\nfunction baseUnary(func) {\n return function(value) {\n return func(value);\n };\n}\n\nmodule.exports = baseUnary;\n","var baseFlatten = require('./_baseFlatten'),\n map = require('./map');\n\n/**\n * Creates a flattened array of values by running each element in `collection`\n * thru `iteratee` and flattening the mapped results. The iteratee is invoked\n * with three arguments: (value, index|key, collection).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the new flattened array.\n * @example\n *\n * function duplicate(n) {\n * return [n, n];\n * }\n *\n * _.flatMap([1, 2], duplicate);\n * // => [1, 1, 2, 2]\n */\nfunction flatMap(collection, iteratee) {\n return baseFlatten(map(collection, iteratee), 1);\n}\n\nmodule.exports = flatMap;\n","var createFind = require('./_createFind'),\n findIndex = require('./findIndex');\n\n/**\n * Iterates over elements of `collection`, returning the first element\n * `predicate` returns truthy for. The predicate is invoked with three\n * arguments: (value, index|key, collection).\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to inspect.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @param {number} [fromIndex=0] The index to search from.\n * @returns {*} Returns the matched element, else `undefined`.\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'age': 36, 'active': true },\n * { 'user': 'fred', 'age': 40, 'active': false },\n * { 'user': 'pebbles', 'age': 1, 'active': true }\n * ];\n *\n * _.find(users, function(o) { return o.age < 40; });\n * // => object for 'barney'\n *\n * // The `_.matches` iteratee shorthand.\n * _.find(users, { 'age': 1, 'active': true });\n * // => object for 'pebbles'\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.find(users, ['active', false]);\n * // => object for 'fred'\n *\n * // The `_.property` iteratee shorthand.\n * _.find(users, 'active');\n * // => object for 'barney'\n */\nvar find = createFind(findIndex);\n\nmodule.exports = find;\n","/**\n * Creates a function that returns `value`.\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Util\n * @param {*} value The value to return from the new function.\n * @returns {Function} Returns the new constant function.\n * @example\n *\n * var objects = _.times(2, _.constant({ 'a': 1 }));\n *\n * console.log(objects);\n * // => [{ 'a': 1 }, { 'a': 1 }]\n *\n * console.log(objects[0] === objects[1]);\n * // => true\n */\nfunction constant(value) {\n return function() {\n return value;\n };\n}\n\nmodule.exports = constant;\n","var toNumber = require('./toNumber');\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0,\n MAX_INTEGER = 1.7976931348623157e+308;\n\n/**\n * Converts `value` to a finite number.\n *\n * @static\n * @memberOf _\n * @since 4.12.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {number} Returns the converted number.\n * @example\n *\n * _.toFinite(3.2);\n * // => 3.2\n *\n * _.toFinite(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toFinite(Infinity);\n * // => 1.7976931348623157e+308\n *\n * _.toFinite('3.2');\n * // => 3.2\n */\nfunction toFinite(value) {\n if (!value) {\n return value === 0 ? value : 0;\n }\n value = toNumber(value);\n if (value === INFINITY || value === -INFINITY) {\n var sign = (value < 0 ? -1 : 1);\n return sign * MAX_INTEGER;\n }\n return value === value ? value : 0;\n}\n\nmodule.exports = toFinite;\n","var baseGet = require('./_baseGet'),\n baseSet = require('./_baseSet'),\n castPath = require('./_castPath');\n\n/**\n * The base implementation of `_.pickBy` without support for iteratee shorthands.\n *\n * @private\n * @param {Object} object The source object.\n * @param {string[]} paths The property paths to pick.\n * @param {Function} predicate The function invoked per property.\n * @returns {Object} Returns the new object.\n */\nfunction basePickBy(object, paths, predicate) {\n var index = -1,\n length = paths.length,\n result = {};\n\n while (++index < length) {\n var path = paths[index],\n value = baseGet(object, path);\n\n if (predicate(value, path)) {\n baseSet(result, castPath(path, object), value);\n }\n }\n return result;\n}\n\nmodule.exports = basePickBy;\n","var castPath = require('./_castPath'),\n toKey = require('./_toKey');\n\n/**\n * The base implementation of `_.get` without support for default values.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @returns {*} Returns the resolved value.\n */\nfunction baseGet(object, path) {\n path = castPath(path, object);\n\n var index = 0,\n length = path.length;\n\n while (object != null && index < length) {\n object = object[toKey(path[index++])];\n }\n return (index && index == length) ? object : undefined;\n}\n\nmodule.exports = baseGet;\n","\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.TreeBuilder = void 0;\nvar cst_1 = require(\"../../cst/cst\");\nvar noop_1 = __importDefault(require(\"lodash/noop\"));\nvar has_1 = __importDefault(require(\"lodash/has\"));\nvar keys_1 = __importDefault(require(\"lodash/keys\"));\nvar isUndefined_1 = __importDefault(require(\"lodash/isUndefined\"));\nvar cst_visitor_1 = require(\"../../cst/cst_visitor\");\nvar parser_1 = require(\"../parser\");\n/**\n * This trait is responsible for the CST building logic.\n */\nvar TreeBuilder = /** @class */ (function () {\n function TreeBuilder() {\n }\n TreeBuilder.prototype.initTreeBuilder = function (config) {\n this.CST_STACK = [];\n // outputCst is no longer exposed/defined in the pubic API\n this.outputCst = config.outputCst;\n this.nodeLocationTracking = (0, has_1.default)(config, \"nodeLocationTracking\")\n ? config.nodeLocationTracking // assumes end user provides the correct config value/type\n : parser_1.DEFAULT_PARSER_CONFIG.nodeLocationTracking;\n if (!this.outputCst) {\n this.cstInvocationStateUpdate = noop_1.default;\n this.cstFinallyStateUpdate = noop_1.default;\n this.cstPostTerminal = noop_1.default;\n this.cstPostNonTerminal = noop_1.default;\n this.cstPostRule = noop_1.default;\n }\n else {\n if (/full/i.test(this.nodeLocationTracking)) {\n if (this.recoveryEnabled) {\n this.setNodeLocationFromToken = cst_1.setNodeLocationFull;\n this.setNodeLocationFromNode = cst_1.setNodeLocationFull;\n this.cstPostRule = noop_1.default;\n this.setInitialNodeLocation = this.setInitialNodeLocationFullRecovery;\n }\n else {\n this.setNodeLocationFromToken = noop_1.default;\n this.setNodeLocationFromNode = noop_1.default;\n this.cstPostRule = this.cstPostRuleFull;\n this.setInitialNodeLocation = this.setInitialNodeLocationFullRegular;\n }\n }\n else if (/onlyOffset/i.test(this.nodeLocationTracking)) {\n if (this.recoveryEnabled) {\n this.setNodeLocationFromToken = cst_1.setNodeLocationOnlyOffset;\n this.setNodeLocationFromNode = cst_1.setNodeLocationOnlyOffset;\n this.cstPostRule = noop_1.default;\n this.setInitialNodeLocation =\n this.setInitialNodeLocationOnlyOffsetRecovery;\n }\n else {\n this.setNodeLocationFromToken = noop_1.default;\n this.setNodeLocationFromNode = noop_1.default;\n this.cstPostRule = this.cstPostRuleOnlyOffset;\n this.setInitialNodeLocation =\n this.setInitialNodeLocationOnlyOffsetRegular;\n }\n }\n else if (/none/i.test(this.nodeLocationTracking)) {\n this.setNodeLocationFromToken = noop_1.default;\n this.setNodeLocationFromNode = noop_1.default;\n this.cstPostRule = noop_1.default;\n this.setInitialNodeLocation = noop_1.default;\n }\n else {\n throw Error(\"Invalid config option: \\\"\".concat(config.nodeLocationTracking, \"\\\"\"));\n }\n }\n };\n TreeBuilder.prototype.setInitialNodeLocationOnlyOffsetRecovery = function (cstNode) {\n cstNode.location = {\n startOffset: NaN,\n endOffset: NaN\n };\n };\n TreeBuilder.prototype.setInitialNodeLocationOnlyOffsetRegular = function (cstNode) {\n cstNode.location = {\n // without error recovery the starting Location of a new CstNode is guaranteed\n // To be the next Token's startOffset (for valid inputs).\n // For invalid inputs there won't be any CSTOutput so this potential\n // inaccuracy does not matter\n startOffset: this.LA(1).startOffset,\n endOffset: NaN\n };\n };\n TreeBuilder.prototype.setInitialNodeLocationFullRecovery = function (cstNode) {\n cstNode.location = {\n startOffset: NaN,\n startLine: NaN,\n startColumn: NaN,\n endOffset: NaN,\n endLine: NaN,\n endColumn: NaN\n };\n };\n /**\n * @see setInitialNodeLocationOnlyOffsetRegular for explanation why this work\n \n * @param cstNode\n */\n TreeBuilder.prototype.setInitialNodeLocationFullRegular = function (cstNode) {\n var nextToken = this.LA(1);\n cstNode.location = {\n startOffset: nextToken.startOffset,\n startLine: nextToken.startLine,\n startColumn: nextToken.startColumn,\n endOffset: NaN,\n endLine: NaN,\n endColumn: NaN\n };\n };\n TreeBuilder.prototype.cstInvocationStateUpdate = function (fullRuleName) {\n var cstNode = {\n name: fullRuleName,\n children: Object.create(null)\n };\n this.setInitialNodeLocation(cstNode);\n this.CST_STACK.push(cstNode);\n };\n TreeBuilder.prototype.cstFinallyStateUpdate = function () {\n this.CST_STACK.pop();\n };\n TreeBuilder.prototype.cstPostRuleFull = function (ruleCstNode) {\n // casts to `required` are safe because `cstPostRuleFull` should only be invoked when full location is enabled\n var prevToken = this.LA(0);\n var loc = ruleCstNode.location;\n // If this condition is true it means we consumed at least one Token\n // In this CstNode.\n if (loc.startOffset <= prevToken.startOffset === true) {\n loc.endOffset = prevToken.endOffset;\n loc.endLine = prevToken.endLine;\n loc.endColumn = prevToken.endColumn;\n }\n // \"empty\" CstNode edge case\n else {\n loc.startOffset = NaN;\n loc.startLine = NaN;\n loc.startColumn = NaN;\n }\n };\n TreeBuilder.prototype.cstPostRuleOnlyOffset = function (ruleCstNode) {\n var prevToken = this.LA(0);\n // `location' is not null because `cstPostRuleOnlyOffset` will only be invoked when location tracking is enabled.\n var loc = ruleCstNode.location;\n // If this condition is true it means we consumed at least one Token\n // In this CstNode.\n if (loc.startOffset <= prevToken.startOffset === true) {\n loc.endOffset = prevToken.endOffset;\n }\n // \"empty\" CstNode edge case\n else {\n loc.startOffset = NaN;\n }\n };\n TreeBuilder.prototype.cstPostTerminal = function (key, consumedToken) {\n var rootCst = this.CST_STACK[this.CST_STACK.length - 1];\n (0, cst_1.addTerminalToCst)(rootCst, consumedToken, key);\n // This is only used when **both** error recovery and CST Output are enabled.\n this.setNodeLocationFromToken(rootCst.location, consumedToken);\n };\n TreeBuilder.prototype.cstPostNonTerminal = function (ruleCstResult, ruleName) {\n var preCstNode = this.CST_STACK[this.CST_STACK.length - 1];\n (0, cst_1.addNoneTerminalToCst)(preCstNode, ruleName, ruleCstResult);\n // This is only used when **both** error recovery and CST Output are enabled.\n this.setNodeLocationFromNode(preCstNode.location, ruleCstResult.location);\n };\n TreeBuilder.prototype.getBaseCstVisitorConstructor = function () {\n if ((0, isUndefined_1.default)(this.baseCstVisitorConstructor)) {\n var newBaseCstVisitorConstructor = (0, cst_visitor_1.createBaseSemanticVisitorConstructor)(this.className, (0, keys_1.default)(this.gastProductionsCache));\n this.baseCstVisitorConstructor = newBaseCstVisitorConstructor;\n return newBaseCstVisitorConstructor;\n }\n return this.baseCstVisitorConstructor;\n };\n TreeBuilder.prototype.getBaseCstVisitorConstructorWithDefaults = function () {\n if ((0, isUndefined_1.default)(this.baseCstVisitorWithDefaultsConstructor)) {\n var newConstructor = (0, cst_visitor_1.createBaseVisitorConstructorWithDefaults)(this.className, (0, keys_1.default)(this.gastProductionsCache), this.getBaseCstVisitorConstructor());\n this.baseCstVisitorWithDefaultsConstructor = newConstructor;\n return newConstructor;\n }\n return this.baseCstVisitorWithDefaultsConstructor;\n };\n TreeBuilder.prototype.getLastExplicitRuleShortName = function () {\n var ruleStack = this.RULE_STACK;\n return ruleStack[ruleStack.length - 1];\n };\n TreeBuilder.prototype.getPreviousExplicitRuleShortName = function () {\n var ruleStack = this.RULE_STACK;\n return ruleStack[ruleStack.length - 2];\n };\n TreeBuilder.prototype.getLastExplicitRuleOccurrenceIndex = function () {\n var occurrenceStack = this.RULE_OCCURRENCE_STACK;\n return occurrenceStack[occurrenceStack.length - 1];\n };\n return TreeBuilder;\n}());\nexports.TreeBuilder = TreeBuilder;\n//# sourceMappingURL=tree_builder.js.map","/** Used for built-in method references. */\nvar funcProto = Function.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/**\n * Converts `func` to its source code.\n *\n * @private\n * @param {Function} func The function to convert.\n * @returns {string} Returns the source code.\n */\nfunction toSource(func) {\n if (func != null) {\n try {\n return funcToString.call(func);\n } catch (e) {}\n try {\n return (func + '');\n } catch (e) {}\n }\n return '';\n}\n\nmodule.exports = toSource;\n","var baseGetTag = require('./_baseGetTag'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]';\n\n/**\n * The base implementation of `_.isArguments`.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n */\nfunction baseIsArguments(value) {\n return isObjectLike(value) && baseGetTag(value) == argsTag;\n}\n\nmodule.exports = baseIsArguments;\n","var baseSlice = require('./_baseSlice'),\n toInteger = require('./toInteger');\n\n/**\n * Creates a slice of `array` with `n` elements dropped from the end.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Array\n * @param {Array} array The array to query.\n * @param {number} [n=1] The number of elements to drop.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {Array} Returns the slice of `array`.\n * @example\n *\n * _.dropRight([1, 2, 3]);\n * // => [1, 2]\n *\n * _.dropRight([1, 2, 3], 2);\n * // => [1]\n *\n * _.dropRight([1, 2, 3], 5);\n * // => []\n *\n * _.dropRight([1, 2, 3], 0);\n * // => [1, 2, 3]\n */\nfunction dropRight(array, n, guard) {\n var length = array == null ? 0 : array.length;\n if (!length) {\n return [];\n }\n n = (guard || n === undefined) ? 1 : toInteger(n);\n n = length - n;\n return baseSlice(array, 0, n < 0 ? 0 : n);\n}\n\nmodule.exports = dropRight;\n","var Symbol = require('./_Symbol'),\n arrayMap = require('./_arrayMap'),\n isArray = require('./isArray'),\n isSymbol = require('./isSymbol');\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0;\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n symbolToString = symbolProto ? symbolProto.toString : undefined;\n\n/**\n * The base implementation of `_.toString` which doesn't convert nullish\n * values to empty strings.\n *\n * @private\n * @param {*} value The value to process.\n * @returns {string} Returns the string.\n */\nfunction baseToString(value) {\n // Exit early for strings to avoid a performance hit in some environments.\n if (typeof value == 'string') {\n return value;\n }\n if (isArray(value)) {\n // Recursively convert values (susceptible to call stack limits).\n return arrayMap(value, baseToString) + '';\n }\n if (isSymbol(value)) {\n return symbolToString ? symbolToString.call(value) : '';\n }\n var result = (value + '');\n return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n}\n\nmodule.exports = baseToString;\n","var arrayFilter = require('./_arrayFilter'),\n baseFilter = require('./_baseFilter'),\n baseIteratee = require('./_baseIteratee'),\n isArray = require('./isArray');\n\n/**\n * Iterates over elements of `collection`, returning an array of all elements\n * `predicate` returns truthy for. The predicate is invoked with three\n * arguments: (value, index|key, collection).\n *\n * **Note:** Unlike `_.remove`, this method returns a new array.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the new filtered array.\n * @see _.reject\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'age': 36, 'active': true },\n * { 'user': 'fred', 'age': 40, 'active': false }\n * ];\n *\n * _.filter(users, function(o) { return !o.active; });\n * // => objects for ['fred']\n *\n * // The `_.matches` iteratee shorthand.\n * _.filter(users, { 'age': 36, 'active': true });\n * // => objects for ['barney']\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.filter(users, ['active', false]);\n * // => objects for ['fred']\n *\n * // The `_.property` iteratee shorthand.\n * _.filter(users, 'active');\n * // => objects for ['barney']\n *\n * // Combining several predicates using `_.overEvery` or `_.overSome`.\n * _.filter(users, _.overSome([{ 'age': 36 }, ['age', 40]]));\n * // => objects for ['fred', 'barney']\n */\nfunction filter(collection, predicate) {\n var func = isArray(collection) ? arrayFilter : baseFilter;\n return func(collection, baseIteratee(predicate, 3));\n}\n\nmodule.exports = filter;\n","var getMapData = require('./_getMapData');\n\n/**\n * Removes `key` and its value from the map.\n *\n * @private\n * @name delete\n * @memberOf MapCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction mapCacheDelete(key) {\n var result = getMapData(this, key)['delete'](key);\n this.size -= result ? 1 : 0;\n return result;\n}\n\nmodule.exports = mapCacheDelete;\n","var baseIsMap = require('./_baseIsMap'),\n baseUnary = require('./_baseUnary'),\n nodeUtil = require('./_nodeUtil');\n\n/* Node.js helper references. */\nvar nodeIsMap = nodeUtil && nodeUtil.isMap;\n\n/**\n * Checks if `value` is classified as a `Map` object.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a map, else `false`.\n * @example\n *\n * _.isMap(new Map);\n * // => true\n *\n * _.isMap(new WeakMap);\n * // => false\n */\nvar isMap = nodeIsMap ? baseUnary(nodeIsMap) : baseIsMap;\n\nmodule.exports = isMap;\n","\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ErrorHandler = void 0;\nvar exceptions_public_1 = require(\"../../exceptions_public\");\nvar has_1 = __importDefault(require(\"lodash/has\"));\nvar clone_1 = __importDefault(require(\"lodash/clone\"));\nvar lookahead_1 = require(\"../../grammar/lookahead\");\nvar parser_1 = require(\"../parser\");\n/**\n * Trait responsible for runtime parsing errors.\n */\nvar ErrorHandler = /** @class */ (function () {\n function ErrorHandler() {\n }\n ErrorHandler.prototype.initErrorHandler = function (config) {\n this._errors = [];\n this.errorMessageProvider = (0, has_1.default)(config, \"errorMessageProvider\")\n ? config.errorMessageProvider // assumes end user provides the correct config value/type\n : parser_1.DEFAULT_PARSER_CONFIG.errorMessageProvider;\n };\n ErrorHandler.prototype.SAVE_ERROR = function (error) {\n if ((0, exceptions_public_1.isRecognitionException)(error)) {\n error.context = {\n ruleStack: this.getHumanReadableRuleStack(),\n ruleOccurrenceStack: (0, clone_1.default)(this.RULE_OCCURRENCE_STACK)\n };\n this._errors.push(error);\n return error;\n }\n else {\n throw Error(\"Trying to save an Error which is not a RecognitionException\");\n }\n };\n Object.defineProperty(ErrorHandler.prototype, \"errors\", {\n get: function () {\n return (0, clone_1.default)(this._errors);\n },\n set: function (newErrors) {\n this._errors = newErrors;\n },\n enumerable: false,\n configurable: true\n });\n // TODO: consider caching the error message computed information\n ErrorHandler.prototype.raiseEarlyExitException = function (occurrence, prodType, userDefinedErrMsg) {\n var ruleName = this.getCurrRuleFullName();\n var ruleGrammar = this.getGAstProductions()[ruleName];\n var lookAheadPathsPerAlternative = (0, lookahead_1.getLookaheadPathsForOptionalProd)(occurrence, ruleGrammar, prodType, this.maxLookahead);\n var insideProdPaths = lookAheadPathsPerAlternative[0];\n var actualTokens = [];\n for (var i = 1; i <= this.maxLookahead; i++) {\n actualTokens.push(this.LA(i));\n }\n var msg = this.errorMessageProvider.buildEarlyExitMessage({\n expectedIterationPaths: insideProdPaths,\n actual: actualTokens,\n previous: this.LA(0),\n customUserDescription: userDefinedErrMsg,\n ruleName: ruleName\n });\n throw this.SAVE_ERROR(new exceptions_public_1.EarlyExitException(msg, this.LA(1), this.LA(0)));\n };\n // TODO: consider caching the error message computed information\n ErrorHandler.prototype.raiseNoAltException = function (occurrence, errMsgTypes) {\n var ruleName = this.getCurrRuleFullName();\n var ruleGrammar = this.getGAstProductions()[ruleName];\n // TODO: getLookaheadPathsForOr can be slow for large enough maxLookahead and certain grammars, consider caching ?\n var lookAheadPathsPerAlternative = (0, lookahead_1.getLookaheadPathsForOr)(occurrence, ruleGrammar, this.maxLookahead);\n var actualTokens = [];\n for (var i = 1; i <= this.maxLookahead; i++) {\n actualTokens.push(this.LA(i));\n }\n var previousToken = this.LA(0);\n var errMsg = this.errorMessageProvider.buildNoViableAltMessage({\n expectedPathsPerAlt: lookAheadPathsPerAlternative,\n actual: actualTokens,\n previous: previousToken,\n customUserDescription: errMsgTypes,\n ruleName: this.getCurrRuleFullName()\n });\n throw this.SAVE_ERROR(new exceptions_public_1.NoViableAltException(errMsg, this.LA(1), previousToken));\n };\n return ErrorHandler;\n}());\nexports.ErrorHandler = ErrorHandler;\n//# sourceMappingURL=error_handler.js.map","var isSymbol = require('./isSymbol');\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0;\n\n/**\n * Converts `value` to a string key if it's not a string or symbol.\n *\n * @private\n * @param {*} value The value to inspect.\n * @returns {string|symbol} Returns the key.\n */\nfunction toKey(value) {\n if (typeof value == 'string' || isSymbol(value)) {\n return value;\n }\n var result = (value + '');\n return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n}\n\nmodule.exports = toKey;\n","var root = require('./_root');\n\n/** Built-in value references. */\nvar Uint8Array = root.Uint8Array;\n\nmodule.exports = Uint8Array;\n","var baseIsEqual = require('./_baseIsEqual'),\n get = require('./get'),\n hasIn = require('./hasIn'),\n isKey = require('./_isKey'),\n isStrictComparable = require('./_isStrictComparable'),\n matchesStrictComparable = require('./_matchesStrictComparable'),\n toKey = require('./_toKey');\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1,\n COMPARE_UNORDERED_FLAG = 2;\n\n/**\n * The base implementation of `_.matchesProperty` which doesn't clone `srcValue`.\n *\n * @private\n * @param {string} path The path of the property to get.\n * @param {*} srcValue The value to match.\n * @returns {Function} Returns the new spec function.\n */\nfunction baseMatchesProperty(path, srcValue) {\n if (isKey(path) && isStrictComparable(srcValue)) {\n return matchesStrictComparable(toKey(path), srcValue);\n }\n return function(object) {\n var objValue = get(object, path);\n return (objValue === undefined && objValue === srcValue)\n ? hasIn(object, path)\n : baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG);\n };\n}\n\nmodule.exports = baseMatchesProperty;\n","/**\n * The base implementation of `_.hasIn` without support for deep paths.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {Array|string} key The key to check.\n * @returns {boolean} Returns `true` if `key` exists, else `false`.\n */\nfunction baseHasIn(object, key) {\n return object != null && key in Object(object);\n}\n\nmodule.exports = baseHasIn;\n","var arrayFilter = require('./_arrayFilter'),\n baseFilter = require('./_baseFilter'),\n baseIteratee = require('./_baseIteratee'),\n isArray = require('./isArray'),\n negate = require('./negate');\n\n/**\n * The opposite of `_.filter`; this method returns the elements of `collection`\n * that `predicate` does **not** return truthy for.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the new filtered array.\n * @see _.filter\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'age': 36, 'active': false },\n * { 'user': 'fred', 'age': 40, 'active': true }\n * ];\n *\n * _.reject(users, function(o) { return !o.active; });\n * // => objects for ['fred']\n *\n * // The `_.matches` iteratee shorthand.\n * _.reject(users, { 'age': 40, 'active': true });\n * // => objects for ['barney']\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.reject(users, ['active', false]);\n * // => objects for ['fred']\n *\n * // The `_.property` iteratee shorthand.\n * _.reject(users, 'active');\n * // => objects for ['barney']\n */\nfunction reject(collection, predicate) {\n var func = isArray(collection) ? arrayFilter : baseFilter;\n return func(collection, negate(baseIteratee(predicate, 3)));\n}\n\nmodule.exports = reject;\n","/**\n * Gets the last element of `array`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to query.\n * @returns {*} Returns the last element of `array`.\n * @example\n *\n * _.last([1, 2, 3]);\n * // => 3\n */\nfunction last(array) {\n var length = array == null ? 0 : array.length;\n return length ? array[length - 1] : undefined;\n}\n\nmodule.exports = last;\n","/**\n * The base implementation of `_.times` without support for iteratee shorthands\n * or max array length checks.\n *\n * @private\n * @param {number} n The number of times to invoke `iteratee`.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the array of results.\n */\nfunction baseTimes(n, iteratee) {\n var index = -1,\n result = Array(n);\n\n while (++index < n) {\n result[index] = iteratee(index);\n }\n return result;\n}\n\nmodule.exports = baseTimes;\n","var baseGet = require('./_baseGet');\n\n/**\n * Gets the value at `path` of `object`. If the resolved value is\n * `undefined`, the `defaultValue` is returned in its place.\n *\n * @static\n * @memberOf _\n * @since 3.7.0\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @param {*} [defaultValue] The value returned for `undefined` resolved values.\n * @returns {*} Returns the resolved value.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n *\n * _.get(object, 'a[0].b.c');\n * // => 3\n *\n * _.get(object, ['a', '0', 'b', 'c']);\n * // => 3\n *\n * _.get(object, 'a.b.c', 'default');\n * // => 'default'\n */\nfunction get(object, path, defaultValue) {\n var result = object == null ? undefined : baseGet(object, path);\n return result === undefined ? defaultValue : result;\n}\n\nmodule.exports = get;\n","\"use strict\";\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.attemptInRepetitionRecovery = exports.Recoverable = exports.InRuleRecoveryException = exports.IN_RULE_RECOVERY_EXCEPTION = exports.EOF_FOLLOW_KEY = void 0;\nvar tokens_public_1 = require(\"../../../scan/tokens_public\");\nvar isEmpty_1 = __importDefault(require(\"lodash/isEmpty\"));\nvar dropRight_1 = __importDefault(require(\"lodash/dropRight\"));\nvar flatten_1 = __importDefault(require(\"lodash/flatten\"));\nvar map_1 = __importDefault(require(\"lodash/map\"));\nvar find_1 = __importDefault(require(\"lodash/find\"));\nvar has_1 = __importDefault(require(\"lodash/has\"));\nvar includes_1 = __importDefault(require(\"lodash/includes\"));\nvar clone_1 = __importDefault(require(\"lodash/clone\"));\nvar exceptions_public_1 = require(\"../../exceptions_public\");\nvar constants_1 = require(\"../../constants\");\nvar parser_1 = require(\"../parser\");\nexports.EOF_FOLLOW_KEY = {};\nexports.IN_RULE_RECOVERY_EXCEPTION = \"InRuleRecoveryException\";\nvar InRuleRecoveryException = /** @class */ (function (_super) {\n __extends(InRuleRecoveryException, _super);\n function InRuleRecoveryException(message) {\n var _this = _super.call(this, message) || this;\n _this.name = exports.IN_RULE_RECOVERY_EXCEPTION;\n return _this;\n }\n return InRuleRecoveryException;\n}(Error));\nexports.InRuleRecoveryException = InRuleRecoveryException;\n/**\n * This trait is responsible for the error recovery and fault tolerant logic\n */\nvar Recoverable = /** @class */ (function () {\n function Recoverable() {\n }\n Recoverable.prototype.initRecoverable = function (config) {\n this.firstAfterRepMap = {};\n this.resyncFollows = {};\n this.recoveryEnabled = (0, has_1.default)(config, \"recoveryEnabled\")\n ? config.recoveryEnabled // assumes end user provides the correct config value/type\n : parser_1.DEFAULT_PARSER_CONFIG.recoveryEnabled;\n // performance optimization, NOOP will be inlined which\n // effectively means that this optional feature does not exist\n // when not used.\n if (this.recoveryEnabled) {\n this.attemptInRepetitionRecovery = attemptInRepetitionRecovery;\n }\n };\n Recoverable.prototype.getTokenToInsert = function (tokType) {\n var tokToInsert = (0, tokens_public_1.createTokenInstance)(tokType, \"\", NaN, NaN, NaN, NaN, NaN, NaN);\n tokToInsert.isInsertedInRecovery = true;\n return tokToInsert;\n };\n Recoverable.prototype.canTokenTypeBeInsertedInRecovery = function (tokType) {\n return true;\n };\n Recoverable.prototype.canTokenTypeBeDeletedInRecovery = function (tokType) {\n return true;\n };\n Recoverable.prototype.tryInRepetitionRecovery = function (grammarRule, grammarRuleArgs, lookAheadFunc, expectedTokType) {\n var _this = this;\n // TODO: can the resyncTokenType be cached?\n var reSyncTokType = this.findReSyncTokenType();\n var savedLexerState = this.exportLexerState();\n var resyncedTokens = [];\n var passedResyncPoint = false;\n var nextTokenWithoutResync = this.LA(1);\n var currToken = this.LA(1);\n var generateErrorMessage = function () {\n var previousToken = _this.LA(0);\n // we are preemptively re-syncing before an error has been detected, therefor we must reproduce\n // the error that would have been thrown\n var msg = _this.errorMessageProvider.buildMismatchTokenMessage({\n expected: expectedTokType,\n actual: nextTokenWithoutResync,\n previous: previousToken,\n ruleName: _this.getCurrRuleFullName()\n });\n var error = new exceptions_public_1.MismatchedTokenException(msg, nextTokenWithoutResync, _this.LA(0));\n // the first token here will be the original cause of the error, this is not part of the resyncedTokens property.\n error.resyncedTokens = (0, dropRight_1.default)(resyncedTokens);\n _this.SAVE_ERROR(error);\n };\n while (!passedResyncPoint) {\n // re-synced to a point where we can safely exit the repetition/\n if (this.tokenMatcher(currToken, expectedTokType)) {\n generateErrorMessage();\n return; // must return here to avoid reverting the inputIdx\n }\n else if (lookAheadFunc.call(this)) {\n // we skipped enough tokens so we can resync right back into another iteration of the repetition grammar rule\n generateErrorMessage();\n // recursive invocation in other to support multiple re-syncs in the same top level repetition grammar rule\n grammarRule.apply(this, grammarRuleArgs);\n return; // must return here to avoid reverting the inputIdx\n }\n else if (this.tokenMatcher(currToken, reSyncTokType)) {\n passedResyncPoint = true;\n }\n else {\n currToken = this.SKIP_TOKEN();\n this.addToResyncTokens(currToken, resyncedTokens);\n }\n }\n // we were unable to find a CLOSER point to resync inside the Repetition, reset the state.\n // The parsing exception we were trying to prevent will happen in the NEXT parsing step. it may be handled by\n // \"between rules\" resync recovery later in the flow.\n this.importLexerState(savedLexerState);\n };\n Recoverable.prototype.shouldInRepetitionRecoveryBeTried = function (expectTokAfterLastMatch, nextTokIdx, notStuck) {\n // Edge case of arriving from a MANY repetition which is stuck\n // Attempting recovery in this case could cause an infinite loop\n if (notStuck === false) {\n return false;\n }\n // no need to recover, next token is what we expect...\n if (this.tokenMatcher(this.LA(1), expectTokAfterLastMatch)) {\n return false;\n }\n // error recovery is disabled during backtracking as it can make the parser ignore a valid grammar path\n // and prefer some backtracking path that includes recovered errors.\n if (this.isBackTracking()) {\n return false;\n }\n // if we can perform inRule recovery (single token insertion or deletion) we always prefer that recovery algorithm\n // because if it works, it makes the least amount of changes to the input stream (greedy algorithm)\n //noinspection RedundantIfStatementJS\n if (this.canPerformInRuleRecovery(expectTokAfterLastMatch, this.getFollowsForInRuleRecovery(expectTokAfterLastMatch, nextTokIdx))) {\n return false;\n }\n return true;\n };\n // Error Recovery functionality\n Recoverable.prototype.getFollowsForInRuleRecovery = function (tokType, tokIdxInRule) {\n var grammarPath = this.getCurrentGrammarPath(tokType, tokIdxInRule);\n var follows = this.getNextPossibleTokenTypes(grammarPath);\n return follows;\n };\n Recoverable.prototype.tryInRuleRecovery = function (expectedTokType, follows) {\n if (this.canRecoverWithSingleTokenInsertion(expectedTokType, follows)) {\n var tokToInsert = this.getTokenToInsert(expectedTokType);\n return tokToInsert;\n }\n if (this.canRecoverWithSingleTokenDeletion(expectedTokType)) {\n var nextTok = this.SKIP_TOKEN();\n this.consumeToken();\n return nextTok;\n }\n throw new InRuleRecoveryException(\"sad sad panda\");\n };\n Recoverable.prototype.canPerformInRuleRecovery = function (expectedToken, follows) {\n return (this.canRecoverWithSingleTokenInsertion(expectedToken, follows) ||\n this.canRecoverWithSingleTokenDeletion(expectedToken));\n };\n Recoverable.prototype.canRecoverWithSingleTokenInsertion = function (expectedTokType, follows) {\n var _this = this;\n if (!this.canTokenTypeBeInsertedInRecovery(expectedTokType)) {\n return false;\n }\n // must know the possible following tokens to perform single token insertion\n if ((0, isEmpty_1.default)(follows)) {\n return false;\n }\n var mismatchedTok = this.LA(1);\n var isMisMatchedTokInFollows = (0, find_1.default)(follows, function (possibleFollowsTokType) {\n return _this.tokenMatcher(mismatchedTok, possibleFollowsTokType);\n }) !== undefined;\n return isMisMatchedTokInFollows;\n };\n Recoverable.prototype.canRecoverWithSingleTokenDeletion = function (expectedTokType) {\n if (!this.canTokenTypeBeDeletedInRecovery(expectedTokType)) {\n return false;\n }\n var isNextTokenWhatIsExpected = this.tokenMatcher(this.LA(2), expectedTokType);\n return isNextTokenWhatIsExpected;\n };\n Recoverable.prototype.isInCurrentRuleReSyncSet = function (tokenTypeIdx) {\n var followKey = this.getCurrFollowKey();\n var currentRuleReSyncSet = this.getFollowSetFromFollowKey(followKey);\n return (0, includes_1.default)(currentRuleReSyncSet, tokenTypeIdx);\n };\n Recoverable.prototype.findReSyncTokenType = function () {\n var allPossibleReSyncTokTypes = this.flattenFollowSet();\n // this loop will always terminate as EOF is always in the follow stack and also always (virtually) in the input\n var nextToken = this.LA(1);\n var k = 2;\n while (true) {\n var foundMatch = (0, find_1.default)(allPossibleReSyncTokTypes, function (resyncTokType) {\n var canMatch = (0, tokens_public_1.tokenMatcher)(nextToken, resyncTokType);\n return canMatch;\n });\n if (foundMatch !== undefined) {\n return foundMatch;\n }\n nextToken = this.LA(k);\n k++;\n }\n };\n Recoverable.prototype.getCurrFollowKey = function () {\n // the length is at least one as we always add the ruleName to the stack before invoking the rule.\n if (this.RULE_STACK.length === 1) {\n return exports.EOF_FOLLOW_KEY;\n }\n var currRuleShortName = this.getLastExplicitRuleShortName();\n var currRuleIdx = this.getLastExplicitRuleOccurrenceIndex();\n var prevRuleShortName = this.getPreviousExplicitRuleShortName();\n return {\n ruleName: this.shortRuleNameToFullName(currRuleShortName),\n idxInCallingRule: currRuleIdx,\n inRule: this.shortRuleNameToFullName(prevRuleShortName)\n };\n };\n Recoverable.prototype.buildFullFollowKeyStack = function () {\n var _this = this;\n var explicitRuleStack = this.RULE_STACK;\n var explicitOccurrenceStack = this.RULE_OCCURRENCE_STACK;\n return (0, map_1.default)(explicitRuleStack, function (ruleName, idx) {\n if (idx === 0) {\n return exports.EOF_FOLLOW_KEY;\n }\n return {\n ruleName: _this.shortRuleNameToFullName(ruleName),\n idxInCallingRule: explicitOccurrenceStack[idx],\n inRule: _this.shortRuleNameToFullName(explicitRuleStack[idx - 1])\n };\n });\n };\n Recoverable.prototype.flattenFollowSet = function () {\n var _this = this;\n var followStack = (0, map_1.default)(this.buildFullFollowKeyStack(), function (currKey) {\n return _this.getFollowSetFromFollowKey(currKey);\n });\n return (0, flatten_1.default)(followStack);\n };\n Recoverable.prototype.getFollowSetFromFollowKey = function (followKey) {\n if (followKey === exports.EOF_FOLLOW_KEY) {\n return [tokens_public_1.EOF];\n }\n var followName = followKey.ruleName + followKey.idxInCallingRule + constants_1.IN + followKey.inRule;\n return this.resyncFollows[followName];\n };\n // It does not make any sense to include a virtual EOF token in the list of resynced tokens\n // as EOF does not really exist and thus does not contain any useful information (line/column numbers)\n Recoverable.prototype.addToResyncTokens = function (token, resyncTokens) {\n if (!this.tokenMatcher(token, tokens_public_1.EOF)) {\n resyncTokens.push(token);\n }\n return resyncTokens;\n };\n Recoverable.prototype.reSyncTo = function (tokType) {\n var resyncedTokens = [];\n var nextTok = this.LA(1);\n while (this.tokenMatcher(nextTok, tokType) === false) {\n nextTok = this.SKIP_TOKEN();\n this.addToResyncTokens(nextTok, resyncedTokens);\n }\n // the last token is not part of the error.\n return (0, dropRight_1.default)(resyncedTokens);\n };\n Recoverable.prototype.attemptInRepetitionRecovery = function (prodFunc, args, lookaheadFunc, dslMethodIdx, prodOccurrence, nextToksWalker, notStuck) {\n // by default this is a NO-OP\n // The actual implementation is with the function(not method) below\n };\n Recoverable.prototype.getCurrentGrammarPath = function (tokType, tokIdxInRule) {\n var pathRuleStack = this.getHumanReadableRuleStack();\n var pathOccurrenceStack = (0, clone_1.default)(this.RULE_OCCURRENCE_STACK);\n var grammarPath = {\n ruleStack: pathRuleStack,\n occurrenceStack: pathOccurrenceStack,\n lastTok: tokType,\n lastTokOccurrence: tokIdxInRule\n };\n return grammarPath;\n };\n Recoverable.prototype.getHumanReadableRuleStack = function () {\n var _this = this;\n return (0, map_1.default)(this.RULE_STACK, function (currShortName) {\n return _this.shortRuleNameToFullName(currShortName);\n });\n };\n return Recoverable;\n}());\nexports.Recoverable = Recoverable;\nfunction attemptInRepetitionRecovery(prodFunc, args, lookaheadFunc, dslMethodIdx, prodOccurrence, nextToksWalker, notStuck) {\n var key = this.getKeyForAutomaticLookahead(dslMethodIdx, prodOccurrence);\n var firstAfterRepInfo = this.firstAfterRepMap[key];\n if (firstAfterRepInfo === undefined) {\n var currRuleName = this.getCurrRuleFullName();\n var ruleGrammar = this.getGAstProductions()[currRuleName];\n var walker = new nextToksWalker(ruleGrammar, prodOccurrence);\n firstAfterRepInfo = walker.startWalking();\n this.firstAfterRepMap[key] = firstAfterRepInfo;\n }\n var expectTokAfterLastMatch = firstAfterRepInfo.token;\n var nextTokIdx = firstAfterRepInfo.occurrence;\n var isEndOfRule = firstAfterRepInfo.isEndOfRule;\n // special edge case of a TOP most repetition after which the input should END.\n // this will force an attempt for inRule recovery in that scenario.\n if (this.RULE_STACK.length === 1 &&\n isEndOfRule &&\n expectTokAfterLastMatch === undefined) {\n expectTokAfterLastMatch = tokens_public_1.EOF;\n nextTokIdx = 1;\n }\n // We don't have anything to re-sync to...\n // this condition was extracted from `shouldInRepetitionRecoveryBeTried` to act as a type-guard\n if (expectTokAfterLastMatch === undefined || nextTokIdx === undefined) {\n return;\n }\n if (this.shouldInRepetitionRecoveryBeTried(expectTokAfterLastMatch, nextTokIdx, notStuck)) {\n // TODO: performance optimization: instead of passing the original args here, we modify\n // the args param (or create a new one) and make sure the lookahead func is explicitly provided\n // to avoid searching the cache for it once more.\n this.tryInRepetitionRecovery(prodFunc, args, lookaheadFunc, expectTokAfterLastMatch);\n }\n}\nexports.attemptInRepetitionRecovery = attemptInRepetitionRecovery;\n//# sourceMappingURL=recoverable.js.map","var getNative = require('./_getNative'),\n root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar Map = getNative(root, 'Map');\n\nmodule.exports = Map;\n","var getNative = require('./_getNative'),\n root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar WeakMap = getNative(root, 'WeakMap');\n\nmodule.exports = WeakMap;\n","var isArrayLike = require('./isArrayLike');\n\n/**\n * Creates a `baseEach` or `baseEachRight` function.\n *\n * @private\n * @param {Function} eachFunc The function to iterate over a collection.\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new base function.\n */\nfunction createBaseEach(eachFunc, fromRight) {\n return function(collection, iteratee) {\n if (collection == null) {\n return collection;\n }\n if (!isArrayLike(collection)) {\n return eachFunc(collection, iteratee);\n }\n var length = collection.length,\n index = fromRight ? length : -1,\n iterable = Object(collection);\n\n while ((fromRight ? index-- : ++index < length)) {\n if (iteratee(iterable[index], index, iterable) === false) {\n break;\n }\n }\n return collection;\n };\n}\n\nmodule.exports = createBaseEach;\n","import { Cell } from \"../Cell\";\nimport { CellEvent } from \"../Cell/CellEvent\";\nimport { EventDispatcher } from \"../Utility/EventDispatcher\";\nimport { DependencyBuilder } from \"./DependencyBuilder\";\nimport { CellRegistry } from \"../Sheet/CellRegistry\";\n\nexport class DependencyTree {\n\n protected depTree : Record = {};\n protected cellRegistry : CellRegistry;\n\n constructor(\n cellRegistry : CellRegistry,\n private dispatcher : EventDispatcher,\n private builder : DependencyBuilder\n ) {\n this.cellRegistry = cellRegistry;\n this.buildTree();\n this.dispatcher.listen(CellEvent.FORMULA_CHANGED, this._updateGraph.bind(this));\n }\n\n private buildTree() {\n // Build the dependency tree from cell registry\n this.cellRegistry.each((cell: Cell) => {\n if (cell.formula) {\n this.depTree[cell.address] = cell;\n }\n });\n }\n\n private _updateGraph(event: any)\n {\n // Rebuild the tree when a formula changes\n this.buildTree();\n }\n\n markAsDirty(cell : Cell) {\n if (this.depTree[cell.address]) {\n this.depTree[cell.address].markAsDirty();\n\n // Recursively mark dependents as dirty\n const dependents = this.depTree[cell.address].getDependents();\n for (const address in dependents) {\n this.markAsDirty(dependents[address]);\n }\n }\n }\n\n /**\n * Topologically sort object tree into array based on depth level\n *\n * a -\n * |- c -\n * b - | - e -\n * d - | - g\n * |\n * f -\n *\n * to\n *\n * a | c | e | g\n * b | d | f |\n */\n topologicalSort() : Array> {\n const levels: Array> = [];\n const visited = new Set();\n const cellLevels = new Map();\n\n // Calculate level for each cell based on its precedents\n const calculateLevel = (cell: Cell): number => {\n if (cellLevels.has(cell.address)) {\n return cellLevels.get(cell.address)!;\n }\n\n const precedents = cell.getPrecedents();\n if (!precedents || Object.keys(precedents).length === 0) {\n // No precedents, this is a leaf node (level 0)\n cellLevels.set(cell.address, 0);\n return 0;\n }\n\n // Find the maximum level among precedents\n let maxLevel = -1;\n for (const address in precedents) {\n const precedent = precedents[address];\n if (precedent) {\n const precedentLevel = calculateLevel(precedent);\n if (precedentLevel > maxLevel) {\n maxLevel = precedentLevel;\n }\n }\n }\n\n const level = maxLevel + 1;\n cellLevels.set(cell.address, level);\n return level;\n };\n\n // Calculate levels for all cells with formulas\n this.cellRegistry.each((cell: Cell) => {\n if (cell.formula && !visited.has(cell.address)) {\n calculateLevel(cell);\n }\n });\n\n // Group cells by level (only include cells with formulas)\n cellLevels.forEach((level, address) => {\n const cell = this.cellRegistry.get(address);\n // Only include cells that have formulas\n if (cell && cell.formula) {\n if (!levels[level]) {\n levels[level] = [];\n }\n levels[level].push(cell);\n }\n });\n\n return levels;\n }\n\n /**\n * Flatten dependency graph into a flat array in topological order\n * Returns cells in the order they should be calculated\n * @returns Array of cells in topological order\n */\n flattenToTopology(): Cell[] {\n const levels = this.topologicalSort();\n const result: Cell[] = [];\n\n // Flatten the 2D array of levels into a 1D array\n for (const level of levels) {\n if (level) { // Skip undefined levels\n result.push(...level);\n }\n }\n\n return result;\n }\n\n /**\n * Get the depth level of the tree\n */\n getDepth() : number {\n return this._getDepth(this.depTree);\n }\n\n private _getDepth(tree : Record) : number {\n let max = 0;\n\n for (const key in tree) {\n const cell = tree[key];\n\n if (cell.getDependents()) {\n const depth = this._getDepth(cell.getDependents());\n\n if (depth > max) {\n max = depth;\n }\n }\n }\n\n return max + 1;\n }\n\n}","import { Cell } from \"../Cell\";\nimport { CellRegistry } from \"../Sheet/CellRegistry\";\nimport { EventDispatcher } from \"../Utility/EventDispatcher\";\nimport { DependencyTree } from \"./DependencyTree\";\nimport { Workbook } from \"../Workbook\";\n\nexport class DependencyBuilder {\n private patterns : Record = {\n remoteColumnRange : /\\#?[A-Za-z0-9_]+\\s*!\\s*[A-Za-z]+\\s*:\\s*[A-Za-z]+/g,\n remoteRowRange : /\\#?[A-Za-z0-9_]+\\s*!\\s*[0-9]+\\s*:\\s*[0-9]+/g,\n remoteCellRange : /\\#?[A-Za-z0-9_]+\\s*!\\s*[A-Za-z]+[0-9]+\\s*:\\s*[A-Za-z]+[0-9]+/g,\n remoteCell : /\\#?[A-Za-z0-9_]+\\s*!\\s*[A-Za-z]+[0-9]+/g,\n columnRange : /[A-Za-z]+\\s*:\\s*[A-Za-z]+/g,\n rowRange : /[0-9]+\\s*:\\s*[0-9]+/g,\n cellRange : /[A-Za-z]+[0-9]+\\s*:\\s*[A-Za-z]+[0-9]+/g,\n cell : /[A-Z]+[0-9]+/g,\n namedRange : /[A-Za-z_][A-Za-z0-9_\\.]*/g\n };\n\n private workbook?: Workbook;\n\n constructor() {\n\n }\n\n setWorkbook(workbook: Workbook) {\n this.workbook = workbook;\n }\n\n build(cells : CellRegistry, sheet?: any) : DependencyTree {\n // Build dependencies for each cell\n cells.each((cell : Cell) => {\n if (cell.formula) {\n const { localDeps, remoteDeps } = this.getFormulaDependencies(cell.formula);\n\n // Resolve local addresses to actual Cell objects\n const dependencies: Record = {};\n for (const address in localDeps) {\n const precedentCell = cells.get(address);\n if (precedentCell) {\n dependencies[address] = precedentCell;\n }\n }\n\n // Set precedents for this cell\n cell.setPrecedents(dependencies);\n\n // Set this cell as dependent for each local precedent\n for (const address in dependencies) {\n const precedentCell = dependencies[address];\n if (precedentCell) {\n precedentCell.addDependent(cell);\n }\n }\n\n // Handle remote (cross-sheet) dependencies\n if (this.workbook) {\n for (const remoteRef in remoteDeps) {\n const { sheetName, cellAddress } = this.parseRemoteReference(remoteRef);\n try {\n const remoteSheet = this.workbook.getSheet(sheetName);\n if (remoteSheet) {\n const remoteCellObj = remoteSheet.getCellDirect(cellAddress);\n if (remoteCellObj) {\n // Add this cell as a remote dependent of the precedent cell\n remoteCellObj.addRemoteDependent(cell);\n }\n }\n } catch (e) {\n // Sheet might not exist yet\n }\n }\n }\n }\n });\n\n return new DependencyTree(cells, new EventDispatcher, this);\n }\n\n public parseRemoteReference(remoteRef: string): { sheetName: string, cellAddress: string } {\n // Remove # prefix if present\n const cleanRef = remoteRef.replace(/^#/, '').trim();\n const parts = cleanRef.split('!');\n return {\n sheetName: parts[0].trim(),\n cellAddress: parts[1].trim()\n };\n }\n\n public getFormulaDependencies(formula : string) : { localDeps: Record, remoteDeps: Record } {\n const localDeps: Record = {};\n const remoteDeps: Record = {};\n\n // Remove leading '=' if present\n let cleanFormula = formula.startsWith('=') ? formula.substring(1) : formula;\n\n // Process patterns in order, replacing matched portions to prevent overlapping matches\n // Order matters: match more specific patterns first (e.g., ranges before individual cells)\n\n // 1. Remote column ranges: #Sheet1!A:C\n const remoteColumnMatches = cleanFormula.match(this.patterns.remoteColumnRange);\n if (remoteColumnMatches) {\n remoteColumnMatches.forEach(match => {\n remoteDeps[match.trim()] = true;\n });\n cleanFormula = cleanFormula.replace(this.patterns.remoteColumnRange, '');\n }\n\n // 2. Remote row ranges: #Sheet1!1:3\n const remoteRowMatches = cleanFormula.match(this.patterns.remoteRowRange);\n if (remoteRowMatches) {\n remoteRowMatches.forEach(match => {\n remoteDeps[match.trim()] = true;\n });\n cleanFormula = cleanFormula.replace(this.patterns.remoteRowRange, '');\n }\n\n // 3. Remote cell ranges: #Sheet1!A1:B3\n const remoteCellRangeMatches = cleanFormula.match(this.patterns.remoteCellRange);\n if (remoteCellRangeMatches) {\n remoteCellRangeMatches.forEach(match => {\n const [sheetPart, rangePart] = match.split('!');\n // Expand range into individual cells and add with sheet name\n const addresses = this.expandCellRange(rangePart.trim());\n addresses.forEach(addr => {\n remoteDeps[sheetPart + '!' + addr] = true;\n });\n });\n cleanFormula = cleanFormula.replace(this.patterns.remoteCellRange, '');\n }\n\n // 4. Remote cells: #Sheet1!A1\n const remoteCellMatches = cleanFormula.match(this.patterns.remoteCell);\n if (remoteCellMatches) {\n remoteCellMatches.forEach(match => {\n remoteDeps[match.trim()] = true;\n });\n cleanFormula = cleanFormula.replace(this.patterns.remoteCell, '');\n }\n\n // 5. Cell ranges: A1:B3\n const cellRangeMatches = cleanFormula.match(this.patterns.cellRange);\n if (cellRangeMatches) {\n cellRangeMatches.forEach(match => {\n // Expand range into individual cells\n const addresses = this.expandCellRange(match);\n addresses.forEach(addr => {\n localDeps[addr] = true;\n });\n });\n cleanFormula = cleanFormula.replace(this.patterns.cellRange, '');\n }\n\n // 6. Individual cells: A1, B2, etc.\n const cellMatches = cleanFormula.match(this.patterns.cell);\n if (cellMatches) {\n cellMatches.forEach(match => {\n // Filter out function names and keywords\n if (!this.isFunctionOrKeyword(match)) {\n localDeps[match] = true;\n }\n });\n }\n\n // 7. Named ranges: Resolve named ranges to their underlying cell references\n // After removing all other patterns, check remaining identifiers against named ranges\n if (this.workbook) {\n // Extract potential named range identifiers (words that aren't functions)\n const identifierMatches = cleanFormula.match(/[A-Za-z_][A-Za-z0-9_\\.]*/g);\n if (identifierMatches) {\n identifierMatches.forEach(identifier => {\n // Skip if it's a function or keyword\n if (this.isFunctionOrKeyword(identifier)) {\n return;\n }\n\n // Check if it's a named range\n if (this.workbook!.nameManager.has(identifier)) {\n const reference = this.workbook!.nameManager.getReference(identifier);\n if (reference) {\n // Check if it's a remote reference (contains !)\n if (reference.includes('!')) {\n // It's a cross-sheet reference\n remoteDeps[reference] = true;\n } else {\n // Parse the reference to extract cell addresses\n if (reference.includes(':')) {\n // It's a range\n const addresses = this.expandCellRange(reference);\n addresses.forEach(addr => {\n localDeps[addr] = true;\n });\n } else if (/^[A-Z]+[0-9]+$/.test(reference)) {\n // It's a single cell\n localDeps[reference] = true;\n }\n }\n }\n }\n });\n }\n }\n\n // Note: Column ranges (A:A) and row ranges (1:1) are dynamic dependencies\n // and should be handled separately as they don't have fixed precedents\n\n return { localDeps, remoteDeps };\n }\n\n private isFunctionOrKeyword(text: string): boolean {\n const keywords = [\n 'SUM', 'AVERAGE', 'MAX', 'MIN', 'COUNT', 'IF', 'AND', 'OR',\n 'VLOOKUP', 'HLOOKUP', 'INDEX', 'MATCH', 'CONCATENATE',\n 'TRUE', 'FALSE', 'NULL'\n ];\n return keywords.includes(text.toUpperCase());\n }\n\n /**\n * Extract cell addresses from a cell range (e.g., \"A1:B3\")\n * Handles reverse ranges like \"B2:A1\" by normalizing them\n */\n private expandCellRange(range: string): string[] {\n const [start, end] = range.split(':');\n const addresses: string[] = [];\n\n const startColMatch = start.match(/[A-Z]+/);\n const startRowMatch = start.match(/\\d+/);\n const endColMatch = end.match(/[A-Z]+/);\n const endRowMatch = end.match(/\\d+/);\n\n if (!startColMatch || !startRowMatch || !endColMatch || !endRowMatch) {\n return [];\n }\n\n const startCol = startColMatch[0];\n const startRow = parseInt(startRowMatch[0]);\n const endCol = endColMatch[0];\n const endRow = parseInt(endRowMatch[0]);\n\n const colToNum = (col: string) => {\n let num = 0;\n for (let i = 0; i < col.length; i++) {\n num = num * 26 + (col.charCodeAt(i) - 64);\n }\n return num;\n };\n\n const numToCol = (num: number) => {\n let col = '';\n while (num > 0) {\n const remainder = (num - 1) % 26;\n col = String.fromCharCode(65 + remainder) + col;\n num = Math.floor((num - 1) / 26);\n }\n return col;\n };\n\n const startColNum = colToNum(startCol);\n const endColNum = colToNum(endCol);\n\n // Normalize range to handle reverse ranges (B2:A1 -> A1:B2)\n const minRow = Math.min(startRow, endRow);\n const maxRow = Math.max(startRow, endRow);\n const minCol = Math.min(startColNum, endColNum);\n const maxCol = Math.max(startColNum, endColNum);\n\n for (let row = minRow; row <= maxRow; row++) {\n for (let col = minCol; col <= maxCol; col++) {\n addresses.push(numToCol(col) + row);\n }\n }\n\n return addresses;\n }\n}","var baseIsSet = require('./_baseIsSet'),\n baseUnary = require('./_baseUnary'),\n nodeUtil = require('./_nodeUtil');\n\n/* Node.js helper references. */\nvar nodeIsSet = nodeUtil && nodeUtil.isSet;\n\n/**\n * Checks if `value` is classified as a `Set` object.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a set, else `false`.\n * @example\n *\n * _.isSet(new Set);\n * // => true\n *\n * _.isSet(new WeakSet);\n * // => false\n */\nvar isSet = nodeIsSet ? baseUnary(nodeIsSet) : baseIsSet;\n\nmodule.exports = isSet;\n","\"use strict\";\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.serializeProduction = exports.serializeGrammar = exports.Terminal = exports.Alternation = exports.RepetitionWithSeparator = exports.Repetition = exports.RepetitionMandatoryWithSeparator = exports.RepetitionMandatory = exports.Option = exports.Alternative = exports.Rule = exports.NonTerminal = exports.AbstractProduction = void 0;\nvar map_1 = __importDefault(require(\"lodash/map\"));\nvar forEach_1 = __importDefault(require(\"lodash/forEach\"));\nvar isString_1 = __importDefault(require(\"lodash/isString\"));\nvar isRegExp_1 = __importDefault(require(\"lodash/isRegExp\"));\nvar pickBy_1 = __importDefault(require(\"lodash/pickBy\"));\nvar assign_1 = __importDefault(require(\"lodash/assign\"));\n// TODO: duplicated code to avoid extracting another sub-package -- how to avoid?\nfunction tokenLabel(tokType) {\n if (hasTokenLabel(tokType)) {\n return tokType.LABEL;\n }\n else {\n return tokType.name;\n }\n}\n// TODO: duplicated code to avoid extracting another sub-package -- how to avoid?\nfunction hasTokenLabel(obj) {\n return (0, isString_1.default)(obj.LABEL) && obj.LABEL !== \"\";\n}\nvar AbstractProduction = /** @class */ (function () {\n function AbstractProduction(_definition) {\n this._definition = _definition;\n }\n Object.defineProperty(AbstractProduction.prototype, \"definition\", {\n get: function () {\n return this._definition;\n },\n set: function (value) {\n this._definition = value;\n },\n enumerable: false,\n configurable: true\n });\n AbstractProduction.prototype.accept = function (visitor) {\n visitor.visit(this);\n (0, forEach_1.default)(this.definition, function (prod) {\n prod.accept(visitor);\n });\n };\n return AbstractProduction;\n}());\nexports.AbstractProduction = AbstractProduction;\nvar NonTerminal = /** @class */ (function (_super) {\n __extends(NonTerminal, _super);\n function NonTerminal(options) {\n var _this = _super.call(this, []) || this;\n _this.idx = 1;\n (0, assign_1.default)(_this, (0, pickBy_1.default)(options, function (v) { return v !== undefined; }));\n return _this;\n }\n Object.defineProperty(NonTerminal.prototype, \"definition\", {\n get: function () {\n if (this.referencedRule !== undefined) {\n return this.referencedRule.definition;\n }\n return [];\n },\n set: function (definition) {\n // immutable\n },\n enumerable: false,\n configurable: true\n });\n NonTerminal.prototype.accept = function (visitor) {\n visitor.visit(this);\n // don't visit children of a reference, we will get cyclic infinite loops if we do so\n };\n return NonTerminal;\n}(AbstractProduction));\nexports.NonTerminal = NonTerminal;\nvar Rule = /** @class */ (function (_super) {\n __extends(Rule, _super);\n function Rule(options) {\n var _this = _super.call(this, options.definition) || this;\n _this.orgText = \"\";\n (0, assign_1.default)(_this, (0, pickBy_1.default)(options, function (v) { return v !== undefined; }));\n return _this;\n }\n return Rule;\n}(AbstractProduction));\nexports.Rule = Rule;\nvar Alternative = /** @class */ (function (_super) {\n __extends(Alternative, _super);\n function Alternative(options) {\n var _this = _super.call(this, options.definition) || this;\n _this.ignoreAmbiguities = false;\n (0, assign_1.default)(_this, (0, pickBy_1.default)(options, function (v) { return v !== undefined; }));\n return _this;\n }\n return Alternative;\n}(AbstractProduction));\nexports.Alternative = Alternative;\nvar Option = /** @class */ (function (_super) {\n __extends(Option, _super);\n function Option(options) {\n var _this = _super.call(this, options.definition) || this;\n _this.idx = 1;\n (0, assign_1.default)(_this, (0, pickBy_1.default)(options, function (v) { return v !== undefined; }));\n return _this;\n }\n return Option;\n}(AbstractProduction));\nexports.Option = Option;\nvar RepetitionMandatory = /** @class */ (function (_super) {\n __extends(RepetitionMandatory, _super);\n function RepetitionMandatory(options) {\n var _this = _super.call(this, options.definition) || this;\n _this.idx = 1;\n (0, assign_1.default)(_this, (0, pickBy_1.default)(options, function (v) { return v !== undefined; }));\n return _this;\n }\n return RepetitionMandatory;\n}(AbstractProduction));\nexports.RepetitionMandatory = RepetitionMandatory;\nvar RepetitionMandatoryWithSeparator = /** @class */ (function (_super) {\n __extends(RepetitionMandatoryWithSeparator, _super);\n function RepetitionMandatoryWithSeparator(options) {\n var _this = _super.call(this, options.definition) || this;\n _this.idx = 1;\n (0, assign_1.default)(_this, (0, pickBy_1.default)(options, function (v) { return v !== undefined; }));\n return _this;\n }\n return RepetitionMandatoryWithSeparator;\n}(AbstractProduction));\nexports.RepetitionMandatoryWithSeparator = RepetitionMandatoryWithSeparator;\nvar Repetition = /** @class */ (function (_super) {\n __extends(Repetition, _super);\n function Repetition(options) {\n var _this = _super.call(this, options.definition) || this;\n _this.idx = 1;\n (0, assign_1.default)(_this, (0, pickBy_1.default)(options, function (v) { return v !== undefined; }));\n return _this;\n }\n return Repetition;\n}(AbstractProduction));\nexports.Repetition = Repetition;\nvar RepetitionWithSeparator = /** @class */ (function (_super) {\n __extends(RepetitionWithSeparator, _super);\n function RepetitionWithSeparator(options) {\n var _this = _super.call(this, options.definition) || this;\n _this.idx = 1;\n (0, assign_1.default)(_this, (0, pickBy_1.default)(options, function (v) { return v !== undefined; }));\n return _this;\n }\n return RepetitionWithSeparator;\n}(AbstractProduction));\nexports.RepetitionWithSeparator = RepetitionWithSeparator;\nvar Alternation = /** @class */ (function (_super) {\n __extends(Alternation, _super);\n function Alternation(options) {\n var _this = _super.call(this, options.definition) || this;\n _this.idx = 1;\n _this.ignoreAmbiguities = false;\n _this.hasPredicates = false;\n (0, assign_1.default)(_this, (0, pickBy_1.default)(options, function (v) { return v !== undefined; }));\n return _this;\n }\n Object.defineProperty(Alternation.prototype, \"definition\", {\n get: function () {\n return this._definition;\n },\n set: function (value) {\n this._definition = value;\n },\n enumerable: false,\n configurable: true\n });\n return Alternation;\n}(AbstractProduction));\nexports.Alternation = Alternation;\nvar Terminal = /** @class */ (function () {\n function Terminal(options) {\n this.idx = 1;\n (0, assign_1.default)(this, (0, pickBy_1.default)(options, function (v) { return v !== undefined; }));\n }\n Terminal.prototype.accept = function (visitor) {\n visitor.visit(this);\n };\n return Terminal;\n}());\nexports.Terminal = Terminal;\nfunction serializeGrammar(topRules) {\n return (0, map_1.default)(topRules, serializeProduction);\n}\nexports.serializeGrammar = serializeGrammar;\nfunction serializeProduction(node) {\n function convertDefinition(definition) {\n return (0, map_1.default)(definition, serializeProduction);\n }\n /* istanbul ignore else */\n if (node instanceof NonTerminal) {\n var serializedNonTerminal = {\n type: \"NonTerminal\",\n name: node.nonTerminalName,\n idx: node.idx\n };\n if ((0, isString_1.default)(node.label)) {\n serializedNonTerminal.label = node.label;\n }\n return serializedNonTerminal;\n }\n else if (node instanceof Alternative) {\n return {\n type: \"Alternative\",\n definition: convertDefinition(node.definition)\n };\n }\n else if (node instanceof Option) {\n return {\n type: \"Option\",\n idx: node.idx,\n definition: convertDefinition(node.definition)\n };\n }\n else if (node instanceof RepetitionMandatory) {\n return {\n type: \"RepetitionMandatory\",\n idx: node.idx,\n definition: convertDefinition(node.definition)\n };\n }\n else if (node instanceof RepetitionMandatoryWithSeparator) {\n return {\n type: \"RepetitionMandatoryWithSeparator\",\n idx: node.idx,\n separator: (serializeProduction(new Terminal({ terminalType: node.separator }))),\n definition: convertDefinition(node.definition)\n };\n }\n else if (node instanceof RepetitionWithSeparator) {\n return {\n type: \"RepetitionWithSeparator\",\n idx: node.idx,\n separator: (serializeProduction(new Terminal({ terminalType: node.separator }))),\n definition: convertDefinition(node.definition)\n };\n }\n else if (node instanceof Repetition) {\n return {\n type: \"Repetition\",\n idx: node.idx,\n definition: convertDefinition(node.definition)\n };\n }\n else if (node instanceof Alternation) {\n return {\n type: \"Alternation\",\n idx: node.idx,\n definition: convertDefinition(node.definition)\n };\n }\n else if (node instanceof Terminal) {\n var serializedTerminal = {\n type: \"Terminal\",\n name: node.terminalType.name,\n label: tokenLabel(node.terminalType),\n idx: node.idx\n };\n if ((0, isString_1.default)(node.label)) {\n serializedTerminal.terminalLabel = node.label;\n }\n var pattern = node.terminalType.PATTERN;\n if (node.terminalType.PATTERN) {\n serializedTerminal.pattern = (0, isRegExp_1.default)(pattern)\n ? pattern.source\n : pattern;\n }\n return serializedTerminal;\n }\n else if (node instanceof Rule) {\n return {\n type: \"Rule\",\n name: node.name,\n orgText: node.orgText,\n definition: convertDefinition(node.definition)\n };\n }\n else {\n throw Error(\"non exhaustive match\");\n }\n}\nexports.serializeProduction = serializeProduction;\n//# sourceMappingURL=model.js.map","var isArray = require('./isArray'),\n isSymbol = require('./isSymbol');\n\n/** Used to match property names within property paths. */\nvar reIsDeepProp = /\\.|\\[(?:[^[\\]]*|([\"'])(?:(?!\\1)[^\\\\]|\\\\.)*?\\1)\\]/,\n reIsPlainProp = /^\\w*$/;\n\n/**\n * Checks if `value` is a property name and not a property path.\n *\n * @private\n * @param {*} value The value to check.\n * @param {Object} [object] The object to query keys on.\n * @returns {boolean} Returns `true` if `value` is a property name, else `false`.\n */\nfunction isKey(value, object) {\n if (isArray(value)) {\n return false;\n }\n var type = typeof value;\n if (type == 'number' || type == 'symbol' || type == 'boolean' ||\n value == null || isSymbol(value)) {\n return true;\n }\n return reIsPlainProp.test(value) || !reIsDeepProp.test(value) ||\n (object != null && value in Object(object));\n}\n\nmodule.exports = isKey;\n","var assocIndexOf = require('./_assocIndexOf');\n\n/**\n * Checks if a list cache value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf ListCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction listCacheHas(key) {\n return assocIndexOf(this.__data__, key) > -1;\n}\n\nmodule.exports = listCacheHas;\n","\"use strict\";\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.areTokenCategoriesNotUsed = exports.isStrictPrefixOfPath = exports.containsPath = exports.getLookaheadPathsForOptionalProd = exports.getLookaheadPathsForOr = exports.lookAheadSequenceFromAlternatives = exports.buildSingleAlternativeLookaheadFunction = exports.buildAlternativesLookAheadFunc = exports.buildLookaheadFuncForOptionalProd = exports.buildLookaheadFuncForOr = exports.getLookaheadPaths = exports.getProdType = exports.PROD_TYPE = void 0;\nvar isEmpty_1 = __importDefault(require(\"lodash/isEmpty\"));\nvar flatten_1 = __importDefault(require(\"lodash/flatten\"));\nvar every_1 = __importDefault(require(\"lodash/every\"));\nvar map_1 = __importDefault(require(\"lodash/map\"));\nvar forEach_1 = __importDefault(require(\"lodash/forEach\"));\nvar has_1 = __importDefault(require(\"lodash/has\"));\nvar reduce_1 = __importDefault(require(\"lodash/reduce\"));\nvar interpreter_1 = require(\"./interpreter\");\nvar rest_1 = require(\"./rest\");\nvar tokens_1 = require(\"../../scan/tokens\");\nvar gast_1 = require(\"@chevrotain/gast\");\nvar gast_2 = require(\"@chevrotain/gast\");\nvar PROD_TYPE;\n(function (PROD_TYPE) {\n PROD_TYPE[PROD_TYPE[\"OPTION\"] = 0] = \"OPTION\";\n PROD_TYPE[PROD_TYPE[\"REPETITION\"] = 1] = \"REPETITION\";\n PROD_TYPE[PROD_TYPE[\"REPETITION_MANDATORY\"] = 2] = \"REPETITION_MANDATORY\";\n PROD_TYPE[PROD_TYPE[\"REPETITION_MANDATORY_WITH_SEPARATOR\"] = 3] = \"REPETITION_MANDATORY_WITH_SEPARATOR\";\n PROD_TYPE[PROD_TYPE[\"REPETITION_WITH_SEPARATOR\"] = 4] = \"REPETITION_WITH_SEPARATOR\";\n PROD_TYPE[PROD_TYPE[\"ALTERNATION\"] = 5] = \"ALTERNATION\";\n})(PROD_TYPE = exports.PROD_TYPE || (exports.PROD_TYPE = {}));\nfunction getProdType(prod) {\n /* istanbul ignore else */\n if (prod instanceof gast_1.Option || prod === \"Option\") {\n return PROD_TYPE.OPTION;\n }\n else if (prod instanceof gast_1.Repetition || prod === \"Repetition\") {\n return PROD_TYPE.REPETITION;\n }\n else if (prod instanceof gast_1.RepetitionMandatory ||\n prod === \"RepetitionMandatory\") {\n return PROD_TYPE.REPETITION_MANDATORY;\n }\n else if (prod instanceof gast_1.RepetitionMandatoryWithSeparator ||\n prod === \"RepetitionMandatoryWithSeparator\") {\n return PROD_TYPE.REPETITION_MANDATORY_WITH_SEPARATOR;\n }\n else if (prod instanceof gast_1.RepetitionWithSeparator ||\n prod === \"RepetitionWithSeparator\") {\n return PROD_TYPE.REPETITION_WITH_SEPARATOR;\n }\n else if (prod instanceof gast_1.Alternation || prod === \"Alternation\") {\n return PROD_TYPE.ALTERNATION;\n }\n else {\n throw Error(\"non exhaustive match\");\n }\n}\nexports.getProdType = getProdType;\nfunction getLookaheadPaths(options) {\n var occurrence = options.occurrence, rule = options.rule, prodType = options.prodType, maxLookahead = options.maxLookahead;\n var type = getProdType(prodType);\n if (type === PROD_TYPE.ALTERNATION) {\n return getLookaheadPathsForOr(occurrence, rule, maxLookahead);\n }\n else {\n return getLookaheadPathsForOptionalProd(occurrence, rule, type, maxLookahead);\n }\n}\nexports.getLookaheadPaths = getLookaheadPaths;\nfunction buildLookaheadFuncForOr(occurrence, ruleGrammar, maxLookahead, hasPredicates, dynamicTokensEnabled, laFuncBuilder) {\n var lookAheadPaths = getLookaheadPathsForOr(occurrence, ruleGrammar, maxLookahead);\n var tokenMatcher = areTokenCategoriesNotUsed(lookAheadPaths)\n ? tokens_1.tokenStructuredMatcherNoCategories\n : tokens_1.tokenStructuredMatcher;\n return laFuncBuilder(lookAheadPaths, hasPredicates, tokenMatcher, dynamicTokensEnabled);\n}\nexports.buildLookaheadFuncForOr = buildLookaheadFuncForOr;\n/**\n * When dealing with an Optional production (OPTION/MANY/2nd iteration of AT_LEAST_ONE/...) we need to compare\n * the lookahead \"inside\" the production and the lookahead immediately \"after\" it in the same top level rule (context free).\n *\n * Example: given a production:\n * ABC(DE)?DF\n *\n * The optional '(DE)?' should only be entered if we see 'DE'. a single Token 'D' is not sufficient to distinguish between the two\n * alternatives.\n *\n * @returns A Lookahead function which will return true IFF the parser should parse the Optional production.\n */\nfunction buildLookaheadFuncForOptionalProd(occurrence, ruleGrammar, k, dynamicTokensEnabled, prodType, lookaheadBuilder) {\n var lookAheadPaths = getLookaheadPathsForOptionalProd(occurrence, ruleGrammar, prodType, k);\n var tokenMatcher = areTokenCategoriesNotUsed(lookAheadPaths)\n ? tokens_1.tokenStructuredMatcherNoCategories\n : tokens_1.tokenStructuredMatcher;\n return lookaheadBuilder(lookAheadPaths[0], tokenMatcher, dynamicTokensEnabled);\n}\nexports.buildLookaheadFuncForOptionalProd = buildLookaheadFuncForOptionalProd;\nfunction buildAlternativesLookAheadFunc(alts, hasPredicates, tokenMatcher, dynamicTokensEnabled) {\n var numOfAlts = alts.length;\n var areAllOneTokenLookahead = (0, every_1.default)(alts, function (currAlt) {\n return (0, every_1.default)(currAlt, function (currPath) {\n return currPath.length === 1;\n });\n });\n // This version takes into account the predicates as well.\n if (hasPredicates) {\n /**\n * @returns {number} - The chosen alternative index\n */\n return function (orAlts) {\n // unfortunately the predicates must be extracted every single time\n // as they cannot be cached due to references to parameters(vars) which are no longer valid.\n // note that in the common case of no predicates, no cpu time will be wasted on this (see else block)\n var predicates = (0, map_1.default)(orAlts, function (currAlt) { return currAlt.GATE; });\n for (var t = 0; t < numOfAlts; t++) {\n var currAlt = alts[t];\n var currNumOfPaths = currAlt.length;\n var currPredicate = predicates[t];\n if (currPredicate !== undefined && currPredicate.call(this) === false) {\n // if the predicate does not match there is no point in checking the paths\n continue;\n }\n nextPath: for (var j = 0; j < currNumOfPaths; j++) {\n var currPath = currAlt[j];\n var currPathLength = currPath.length;\n for (var i = 0; i < currPathLength; i++) {\n var nextToken = this.LA(i + 1);\n if (tokenMatcher(nextToken, currPath[i]) === false) {\n // mismatch in current path\n // try the next pth\n continue nextPath;\n }\n }\n // found a full path that matches.\n // this will also work for an empty ALT as the loop will be skipped\n return t;\n }\n // none of the paths for the current alternative matched\n // try the next alternative\n }\n // none of the alternatives could be matched\n return undefined;\n };\n }\n else if (areAllOneTokenLookahead && !dynamicTokensEnabled) {\n // optimized (common) case of all the lookaheads paths requiring only\n // a single token lookahead. These Optimizations cannot work if dynamically defined Tokens are used.\n var singleTokenAlts = (0, map_1.default)(alts, function (currAlt) {\n return (0, flatten_1.default)(currAlt);\n });\n var choiceToAlt_1 = (0, reduce_1.default)(singleTokenAlts, function (result, currAlt, idx) {\n (0, forEach_1.default)(currAlt, function (currTokType) {\n if (!(0, has_1.default)(result, currTokType.tokenTypeIdx)) {\n result[currTokType.tokenTypeIdx] = idx;\n }\n (0, forEach_1.default)(currTokType.categoryMatches, function (currExtendingType) {\n if (!(0, has_1.default)(result, currExtendingType)) {\n result[currExtendingType] = idx;\n }\n });\n });\n return result;\n }, {});\n /**\n * @returns {number} - The chosen alternative index\n */\n return function () {\n var nextToken = this.LA(1);\n return choiceToAlt_1[nextToken.tokenTypeIdx];\n };\n }\n else {\n // optimized lookahead without needing to check the predicates at all.\n // this causes code duplication which is intentional to improve performance.\n /**\n * @returns {number} - The chosen alternative index\n */\n return function () {\n for (var t = 0; t < numOfAlts; t++) {\n var currAlt = alts[t];\n var currNumOfPaths = currAlt.length;\n nextPath: for (var j = 0; j < currNumOfPaths; j++) {\n var currPath = currAlt[j];\n var currPathLength = currPath.length;\n for (var i = 0; i < currPathLength; i++) {\n var nextToken = this.LA(i + 1);\n if (tokenMatcher(nextToken, currPath[i]) === false) {\n // mismatch in current path\n // try the next pth\n continue nextPath;\n }\n }\n // found a full path that matches.\n // this will also work for an empty ALT as the loop will be skipped\n return t;\n }\n // none of the paths for the current alternative matched\n // try the next alternative\n }\n // none of the alternatives could be matched\n return undefined;\n };\n }\n}\nexports.buildAlternativesLookAheadFunc = buildAlternativesLookAheadFunc;\nfunction buildSingleAlternativeLookaheadFunction(alt, tokenMatcher, dynamicTokensEnabled) {\n var areAllOneTokenLookahead = (0, every_1.default)(alt, function (currPath) {\n return currPath.length === 1;\n });\n var numOfPaths = alt.length;\n // optimized (common) case of all the lookaheads paths requiring only\n // a single token lookahead.\n if (areAllOneTokenLookahead && !dynamicTokensEnabled) {\n var singleTokensTypes = (0, flatten_1.default)(alt);\n if (singleTokensTypes.length === 1 &&\n (0, isEmpty_1.default)(singleTokensTypes[0].categoryMatches)) {\n var expectedTokenType = singleTokensTypes[0];\n var expectedTokenUniqueKey_1 = expectedTokenType.tokenTypeIdx;\n return function () {\n return this.LA(1).tokenTypeIdx === expectedTokenUniqueKey_1;\n };\n }\n else {\n var choiceToAlt_2 = (0, reduce_1.default)(singleTokensTypes, function (result, currTokType, idx) {\n result[currTokType.tokenTypeIdx] = true;\n (0, forEach_1.default)(currTokType.categoryMatches, function (currExtendingType) {\n result[currExtendingType] = true;\n });\n return result;\n }, []);\n return function () {\n var nextToken = this.LA(1);\n return choiceToAlt_2[nextToken.tokenTypeIdx] === true;\n };\n }\n }\n else {\n return function () {\n nextPath: for (var j = 0; j < numOfPaths; j++) {\n var currPath = alt[j];\n var currPathLength = currPath.length;\n for (var i = 0; i < currPathLength; i++) {\n var nextToken = this.LA(i + 1);\n if (tokenMatcher(nextToken, currPath[i]) === false) {\n // mismatch in current path\n // try the next pth\n continue nextPath;\n }\n }\n // found a full path that matches.\n return true;\n }\n // none of the paths matched\n return false;\n };\n }\n}\nexports.buildSingleAlternativeLookaheadFunction = buildSingleAlternativeLookaheadFunction;\nvar RestDefinitionFinderWalker = /** @class */ (function (_super) {\n __extends(RestDefinitionFinderWalker, _super);\n function RestDefinitionFinderWalker(topProd, targetOccurrence, targetProdType) {\n var _this = _super.call(this) || this;\n _this.topProd = topProd;\n _this.targetOccurrence = targetOccurrence;\n _this.targetProdType = targetProdType;\n return _this;\n }\n RestDefinitionFinderWalker.prototype.startWalking = function () {\n this.walk(this.topProd);\n return this.restDef;\n };\n RestDefinitionFinderWalker.prototype.checkIsTarget = function (node, expectedProdType, currRest, prevRest) {\n if (node.idx === this.targetOccurrence &&\n this.targetProdType === expectedProdType) {\n this.restDef = currRest.concat(prevRest);\n return true;\n }\n // performance optimization, do not iterate over the entire Grammar ast after we have found the target\n return false;\n };\n RestDefinitionFinderWalker.prototype.walkOption = function (optionProd, currRest, prevRest) {\n if (!this.checkIsTarget(optionProd, PROD_TYPE.OPTION, currRest, prevRest)) {\n _super.prototype.walkOption.call(this, optionProd, currRest, prevRest);\n }\n };\n RestDefinitionFinderWalker.prototype.walkAtLeastOne = function (atLeastOneProd, currRest, prevRest) {\n if (!this.checkIsTarget(atLeastOneProd, PROD_TYPE.REPETITION_MANDATORY, currRest, prevRest)) {\n _super.prototype.walkOption.call(this, atLeastOneProd, currRest, prevRest);\n }\n };\n RestDefinitionFinderWalker.prototype.walkAtLeastOneSep = function (atLeastOneSepProd, currRest, prevRest) {\n if (!this.checkIsTarget(atLeastOneSepProd, PROD_TYPE.REPETITION_MANDATORY_WITH_SEPARATOR, currRest, prevRest)) {\n _super.prototype.walkOption.call(this, atLeastOneSepProd, currRest, prevRest);\n }\n };\n RestDefinitionFinderWalker.prototype.walkMany = function (manyProd, currRest, prevRest) {\n if (!this.checkIsTarget(manyProd, PROD_TYPE.REPETITION, currRest, prevRest)) {\n _super.prototype.walkOption.call(this, manyProd, currRest, prevRest);\n }\n };\n RestDefinitionFinderWalker.prototype.walkManySep = function (manySepProd, currRest, prevRest) {\n if (!this.checkIsTarget(manySepProd, PROD_TYPE.REPETITION_WITH_SEPARATOR, currRest, prevRest)) {\n _super.prototype.walkOption.call(this, manySepProd, currRest, prevRest);\n }\n };\n return RestDefinitionFinderWalker;\n}(rest_1.RestWalker));\n/**\n * Returns the definition of a target production in a top level level rule.\n */\nvar InsideDefinitionFinderVisitor = /** @class */ (function (_super) {\n __extends(InsideDefinitionFinderVisitor, _super);\n function InsideDefinitionFinderVisitor(targetOccurrence, targetProdType, targetRef) {\n var _this = _super.call(this) || this;\n _this.targetOccurrence = targetOccurrence;\n _this.targetProdType = targetProdType;\n _this.targetRef = targetRef;\n _this.result = [];\n return _this;\n }\n InsideDefinitionFinderVisitor.prototype.checkIsTarget = function (node, expectedProdName) {\n if (node.idx === this.targetOccurrence &&\n this.targetProdType === expectedProdName &&\n (this.targetRef === undefined || node === this.targetRef)) {\n this.result = node.definition;\n }\n };\n InsideDefinitionFinderVisitor.prototype.visitOption = function (node) {\n this.checkIsTarget(node, PROD_TYPE.OPTION);\n };\n InsideDefinitionFinderVisitor.prototype.visitRepetition = function (node) {\n this.checkIsTarget(node, PROD_TYPE.REPETITION);\n };\n InsideDefinitionFinderVisitor.prototype.visitRepetitionMandatory = function (node) {\n this.checkIsTarget(node, PROD_TYPE.REPETITION_MANDATORY);\n };\n InsideDefinitionFinderVisitor.prototype.visitRepetitionMandatoryWithSeparator = function (node) {\n this.checkIsTarget(node, PROD_TYPE.REPETITION_MANDATORY_WITH_SEPARATOR);\n };\n InsideDefinitionFinderVisitor.prototype.visitRepetitionWithSeparator = function (node) {\n this.checkIsTarget(node, PROD_TYPE.REPETITION_WITH_SEPARATOR);\n };\n InsideDefinitionFinderVisitor.prototype.visitAlternation = function (node) {\n this.checkIsTarget(node, PROD_TYPE.ALTERNATION);\n };\n return InsideDefinitionFinderVisitor;\n}(gast_2.GAstVisitor));\nfunction initializeArrayOfArrays(size) {\n var result = new Array(size);\n for (var i = 0; i < size; i++) {\n result[i] = [];\n }\n return result;\n}\n/**\n * A sort of hash function between a Path in the grammar and a string.\n * Note that this returns multiple \"hashes\" to support the scenario of token categories.\n * - A single path with categories may match multiple **actual** paths.\n */\nfunction pathToHashKeys(path) {\n var keys = [\"\"];\n for (var i = 0; i < path.length; i++) {\n var tokType = path[i];\n var longerKeys = [];\n for (var j = 0; j < keys.length; j++) {\n var currShorterKey = keys[j];\n longerKeys.push(currShorterKey + \"_\" + tokType.tokenTypeIdx);\n for (var t = 0; t < tokType.categoryMatches.length; t++) {\n var categoriesKeySuffix = \"_\" + tokType.categoryMatches[t];\n longerKeys.push(currShorterKey + categoriesKeySuffix);\n }\n }\n keys = longerKeys;\n }\n return keys;\n}\n/**\n * Imperative style due to being called from a hot spot\n */\nfunction isUniquePrefixHash(altKnownPathsKeys, searchPathKeys, idx) {\n for (var currAltIdx = 0; currAltIdx < altKnownPathsKeys.length; currAltIdx++) {\n // We only want to test vs the other alternatives\n if (currAltIdx === idx) {\n continue;\n }\n var otherAltKnownPathsKeys = altKnownPathsKeys[currAltIdx];\n for (var searchIdx = 0; searchIdx < searchPathKeys.length; searchIdx++) {\n var searchKey = searchPathKeys[searchIdx];\n if (otherAltKnownPathsKeys[searchKey] === true) {\n return false;\n }\n }\n }\n // None of the SearchPathKeys were found in any of the other alternatives\n return true;\n}\nfunction lookAheadSequenceFromAlternatives(altsDefs, k) {\n var partialAlts = (0, map_1.default)(altsDefs, function (currAlt) {\n return (0, interpreter_1.possiblePathsFrom)([currAlt], 1);\n });\n var finalResult = initializeArrayOfArrays(partialAlts.length);\n var altsHashes = (0, map_1.default)(partialAlts, function (currAltPaths) {\n var dict = {};\n (0, forEach_1.default)(currAltPaths, function (item) {\n var keys = pathToHashKeys(item.partialPath);\n (0, forEach_1.default)(keys, function (currKey) {\n dict[currKey] = true;\n });\n });\n return dict;\n });\n var newData = partialAlts;\n // maxLookahead loop\n for (var pathLength = 1; pathLength <= k; pathLength++) {\n var currDataset = newData;\n newData = initializeArrayOfArrays(currDataset.length);\n var _loop_1 = function (altIdx) {\n var currAltPathsAndSuffixes = currDataset[altIdx];\n // paths in current alternative loop\n for (var currPathIdx = 0; currPathIdx < currAltPathsAndSuffixes.length; currPathIdx++) {\n var currPathPrefix = currAltPathsAndSuffixes[currPathIdx].partialPath;\n var suffixDef = currAltPathsAndSuffixes[currPathIdx].suffixDef;\n var prefixKeys = pathToHashKeys(currPathPrefix);\n var isUnique = isUniquePrefixHash(altsHashes, prefixKeys, altIdx);\n // End of the line for this path.\n if (isUnique || (0, isEmpty_1.default)(suffixDef) || currPathPrefix.length === k) {\n var currAltResult = finalResult[altIdx];\n // TODO: Can we implement a containsPath using Maps/Dictionaries?\n if (containsPath(currAltResult, currPathPrefix) === false) {\n currAltResult.push(currPathPrefix);\n // Update all new keys for the current path.\n for (var j = 0; j < prefixKeys.length; j++) {\n var currKey = prefixKeys[j];\n altsHashes[altIdx][currKey] = true;\n }\n }\n }\n // Expand longer paths\n else {\n var newPartialPathsAndSuffixes = (0, interpreter_1.possiblePathsFrom)(suffixDef, pathLength + 1, currPathPrefix);\n newData[altIdx] = newData[altIdx].concat(newPartialPathsAndSuffixes);\n // Update keys for new known paths\n (0, forEach_1.default)(newPartialPathsAndSuffixes, function (item) {\n var prefixKeys = pathToHashKeys(item.partialPath);\n (0, forEach_1.default)(prefixKeys, function (key) {\n altsHashes[altIdx][key] = true;\n });\n });\n }\n }\n };\n // alternatives loop\n for (var altIdx = 0; altIdx < currDataset.length; altIdx++) {\n _loop_1(altIdx);\n }\n }\n return finalResult;\n}\nexports.lookAheadSequenceFromAlternatives = lookAheadSequenceFromAlternatives;\nfunction getLookaheadPathsForOr(occurrence, ruleGrammar, k, orProd) {\n var visitor = new InsideDefinitionFinderVisitor(occurrence, PROD_TYPE.ALTERNATION, orProd);\n ruleGrammar.accept(visitor);\n return lookAheadSequenceFromAlternatives(visitor.result, k);\n}\nexports.getLookaheadPathsForOr = getLookaheadPathsForOr;\nfunction getLookaheadPathsForOptionalProd(occurrence, ruleGrammar, prodType, k) {\n var insideDefVisitor = new InsideDefinitionFinderVisitor(occurrence, prodType);\n ruleGrammar.accept(insideDefVisitor);\n var insideDef = insideDefVisitor.result;\n var afterDefWalker = new RestDefinitionFinderWalker(ruleGrammar, occurrence, prodType);\n var afterDef = afterDefWalker.startWalking();\n var insideFlat = new gast_1.Alternative({ definition: insideDef });\n var afterFlat = new gast_1.Alternative({ definition: afterDef });\n return lookAheadSequenceFromAlternatives([insideFlat, afterFlat], k);\n}\nexports.getLookaheadPathsForOptionalProd = getLookaheadPathsForOptionalProd;\nfunction containsPath(alternative, searchPath) {\n compareOtherPath: for (var i = 0; i < alternative.length; i++) {\n var otherPath = alternative[i];\n if (otherPath.length !== searchPath.length) {\n continue;\n }\n for (var j = 0; j < otherPath.length; j++) {\n var searchTok = searchPath[j];\n var otherTok = otherPath[j];\n var matchingTokens = searchTok === otherTok ||\n otherTok.categoryMatchesMap[searchTok.tokenTypeIdx] !== undefined;\n if (matchingTokens === false) {\n continue compareOtherPath;\n }\n }\n return true;\n }\n return false;\n}\nexports.containsPath = containsPath;\nfunction isStrictPrefixOfPath(prefix, other) {\n return (prefix.length < other.length &&\n (0, every_1.default)(prefix, function (tokType, idx) {\n var otherTokType = other[idx];\n return (tokType === otherTokType ||\n otherTokType.categoryMatchesMap[tokType.tokenTypeIdx]);\n }));\n}\nexports.isStrictPrefixOfPath = isStrictPrefixOfPath;\nfunction areTokenCategoriesNotUsed(lookAheadPaths) {\n return (0, every_1.default)(lookAheadPaths, function (singleAltPaths) {\n return (0, every_1.default)(singleAltPaths, function (singlePath) {\n return (0, every_1.default)(singlePath, function (token) { return (0, isEmpty_1.default)(token.categoryMatches); });\n });\n });\n}\nexports.areTokenCategoriesNotUsed = areTokenCategoriesNotUsed;\n//# sourceMappingURL=lookahead.js.map","var baseSlice = require('./_baseSlice');\n\n/**\n * Casts `array` to a slice if it's needed.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {number} start The start position.\n * @param {number} [end=array.length] The end position.\n * @returns {Array} Returns the cast slice.\n */\nfunction castSlice(array, start, end) {\n var length = array.length;\n end = end === undefined ? length : end;\n return (!start && end >= length) ? array : baseSlice(array, start, end);\n}\n\nmodule.exports = castSlice;\n","var MapCache = require('./_MapCache'),\n setCacheAdd = require('./_setCacheAdd'),\n setCacheHas = require('./_setCacheHas');\n\n/**\n *\n * Creates an array cache object to store unique values.\n *\n * @private\n * @constructor\n * @param {Array} [values] The values to cache.\n */\nfunction SetCache(values) {\n var index = -1,\n length = values == null ? 0 : values.length;\n\n this.__data__ = new MapCache;\n while (++index < length) {\n this.add(values[index]);\n }\n}\n\n// Add methods to `SetCache`.\nSetCache.prototype.add = SetCache.prototype.push = setCacheAdd;\nSetCache.prototype.has = setCacheHas;\n\nmodule.exports = SetCache;\n","var overArg = require('./_overArg');\n\n/** Built-in value references. */\nvar getPrototype = overArg(Object.getPrototypeOf, Object);\n\nmodule.exports = getPrototype;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.toFastProperties = exports.timer = exports.PRINT_ERROR = exports.PRINT_WARNING = void 0;\nvar print_1 = require(\"./print\");\nObject.defineProperty(exports, \"PRINT_WARNING\", { enumerable: true, get: function () { return print_1.PRINT_WARNING; } });\nObject.defineProperty(exports, \"PRINT_ERROR\", { enumerable: true, get: function () { return print_1.PRINT_ERROR; } });\nvar timer_1 = require(\"./timer\");\nObject.defineProperty(exports, \"timer\", { enumerable: true, get: function () { return timer_1.timer; } });\nvar to_fast_properties_1 = require(\"./to-fast-properties\");\nObject.defineProperty(exports, \"toFastProperties\", { enumerable: true, get: function () { return to_fast_properties_1.toFastProperties; } });\n//# sourceMappingURL=api.js.map","var copyObject = require('./_copyObject'),\n getSymbolsIn = require('./_getSymbolsIn');\n\n/**\n * Copies own and inherited symbols of `source` to `object`.\n *\n * @private\n * @param {Object} source The object to copy symbols from.\n * @param {Object} [object={}] The object to copy symbols to.\n * @returns {Object} Returns `object`.\n */\nfunction copySymbolsIn(source, object) {\n return copyObject(source, getSymbolsIn(source), object);\n}\n\nmodule.exports = copySymbolsIn;\n","var isPrototype = require('./_isPrototype'),\n nativeKeys = require('./_nativeKeys');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction baseKeys(object) {\n if (!isPrototype(object)) {\n return nativeKeys(object);\n }\n var result = [];\n for (var key in Object(object)) {\n if (hasOwnProperty.call(object, key) && key != 'constructor') {\n result.push(key);\n }\n }\n return result;\n}\n\nmodule.exports = baseKeys;\n","var getTag = require('./_getTag'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar mapTag = '[object Map]';\n\n/**\n * The base implementation of `_.isMap` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a map, else `false`.\n */\nfunction baseIsMap(value) {\n return isObjectLike(value) && getTag(value) == mapTag;\n}\n\nmodule.exports = baseIsMap;\n","/**\n * Checks if a `cache` value for `key` exists.\n *\n * @private\n * @param {Object} cache The cache to query.\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction cacheHas(cache, key) {\n return cache.has(key);\n}\n\nmodule.exports = cacheHas;\n","var identity = require('./identity'),\n overRest = require('./_overRest'),\n setToString = require('./_setToString');\n\n/**\n * The base implementation of `_.rest` which doesn't validate or coerce arguments.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @returns {Function} Returns the new function.\n */\nfunction baseRest(func, start) {\n return setToString(overRest(func, start, identity), func + '');\n}\n\nmodule.exports = baseRest;\n","var freeGlobal = require('./_freeGlobal');\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\nmodule.exports = root;\n","var castPath = require('./_castPath'),\n isArguments = require('./isArguments'),\n isArray = require('./isArray'),\n isIndex = require('./_isIndex'),\n isLength = require('./isLength'),\n toKey = require('./_toKey');\n\n/**\n * Checks if `path` exists on `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} path The path to check.\n * @param {Function} hasFunc The function to check properties.\n * @returns {boolean} Returns `true` if `path` exists, else `false`.\n */\nfunction hasPath(object, path, hasFunc) {\n path = castPath(path, object);\n\n var index = -1,\n length = path.length,\n result = false;\n\n while (++index < length) {\n var key = toKey(path[index]);\n if (!(result = object != null && hasFunc(object, key))) {\n break;\n }\n object = object[key];\n }\n if (result || ++index != length) {\n return result;\n }\n length = object == null ? 0 : object.length;\n return !!length && isLength(length) && isIndex(key, length) &&\n (isArray(object) || isArguments(object));\n}\n\nmodule.exports = hasPath;\n","var isObject = require('./isObject');\n\n/** Built-in value references. */\nvar objectCreate = Object.create;\n\n/**\n * The base implementation of `_.create` without support for assigning\n * properties to the created object.\n *\n * @private\n * @param {Object} proto The object to inherit from.\n * @returns {Object} Returns the new object.\n */\nvar baseCreate = (function() {\n function object() {}\n return function(proto) {\n if (!isObject(proto)) {\n return {};\n }\n if (objectCreate) {\n return objectCreate(proto);\n }\n object.prototype = proto;\n var result = new object;\n object.prototype = undefined;\n return result;\n };\n}());\n\nmodule.exports = baseCreate;\n","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/**\n * Converts `value` to a string using `Object.prototype.toString`.\n *\n * @private\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n */\nfunction objectToString(value) {\n return nativeObjectToString.call(value);\n}\n\nmodule.exports = objectToString;\n","var baseTrim = require('./_baseTrim'),\n isObject = require('./isObject'),\n isSymbol = require('./isSymbol');\n\n/** Used as references for various `Number` constants. */\nvar NAN = 0 / 0;\n\n/** Used to detect bad signed hexadecimal string values. */\nvar reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\n/** Used to detect binary string values. */\nvar reIsBinary = /^0b[01]+$/i;\n\n/** Used to detect octal string values. */\nvar reIsOctal = /^0o[0-7]+$/i;\n\n/** Built-in method references without a dependency on `root`. */\nvar freeParseInt = parseInt;\n\n/**\n * Converts `value` to a number.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to process.\n * @returns {number} Returns the number.\n * @example\n *\n * _.toNumber(3.2);\n * // => 3.2\n *\n * _.toNumber(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toNumber(Infinity);\n * // => Infinity\n *\n * _.toNumber('3.2');\n * // => 3.2\n */\nfunction toNumber(value) {\n if (typeof value == 'number') {\n return value;\n }\n if (isSymbol(value)) {\n return NAN;\n }\n if (isObject(value)) {\n var other = typeof value.valueOf == 'function' ? value.valueOf() : value;\n value = isObject(other) ? (other + '') : other;\n }\n if (typeof value != 'string') {\n return value === 0 ? value : +value;\n }\n value = baseTrim(value);\n var isBinary = reIsBinary.test(value);\n return (isBinary || reIsOctal.test(value))\n ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n : (reIsBadHex.test(value) ? NAN : +value);\n}\n\nmodule.exports = toNumber;\n","\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.tokenMatcher = exports.createTokenInstance = exports.EOF = exports.createToken = exports.hasTokenLabel = exports.tokenName = exports.tokenLabel = void 0;\nvar isString_1 = __importDefault(require(\"lodash/isString\"));\nvar has_1 = __importDefault(require(\"lodash/has\"));\nvar isUndefined_1 = __importDefault(require(\"lodash/isUndefined\"));\nvar lexer_public_1 = require(\"./lexer_public\");\nvar tokens_1 = require(\"./tokens\");\nfunction tokenLabel(tokType) {\n if (hasTokenLabel(tokType)) {\n return tokType.LABEL;\n }\n else {\n return tokType.name;\n }\n}\nexports.tokenLabel = tokenLabel;\nfunction tokenName(tokType) {\n return tokType.name;\n}\nexports.tokenName = tokenName;\nfunction hasTokenLabel(obj) {\n return (0, isString_1.default)(obj.LABEL) && obj.LABEL !== \"\";\n}\nexports.hasTokenLabel = hasTokenLabel;\nvar PARENT = \"parent\";\nvar CATEGORIES = \"categories\";\nvar LABEL = \"label\";\nvar GROUP = \"group\";\nvar PUSH_MODE = \"push_mode\";\nvar POP_MODE = \"pop_mode\";\nvar LONGER_ALT = \"longer_alt\";\nvar LINE_BREAKS = \"line_breaks\";\nvar START_CHARS_HINT = \"start_chars_hint\";\nfunction createToken(config) {\n return createTokenInternal(config);\n}\nexports.createToken = createToken;\nfunction createTokenInternal(config) {\n var pattern = config.pattern;\n var tokenType = {};\n tokenType.name = config.name;\n if (!(0, isUndefined_1.default)(pattern)) {\n tokenType.PATTERN = pattern;\n }\n if ((0, has_1.default)(config, PARENT)) {\n throw (\"The parent property is no longer supported.\\n\" +\n \"See: https://github.com/chevrotain/chevrotain/issues/564#issuecomment-349062346 for details.\");\n }\n if ((0, has_1.default)(config, CATEGORIES)) {\n // casting to ANY as this will be fixed inside `augmentTokenTypes``\n tokenType.CATEGORIES = config[CATEGORIES];\n }\n (0, tokens_1.augmentTokenTypes)([tokenType]);\n if ((0, has_1.default)(config, LABEL)) {\n tokenType.LABEL = config[LABEL];\n }\n if ((0, has_1.default)(config, GROUP)) {\n tokenType.GROUP = config[GROUP];\n }\n if ((0, has_1.default)(config, POP_MODE)) {\n tokenType.POP_MODE = config[POP_MODE];\n }\n if ((0, has_1.default)(config, PUSH_MODE)) {\n tokenType.PUSH_MODE = config[PUSH_MODE];\n }\n if ((0, has_1.default)(config, LONGER_ALT)) {\n tokenType.LONGER_ALT = config[LONGER_ALT];\n }\n if ((0, has_1.default)(config, LINE_BREAKS)) {\n tokenType.LINE_BREAKS = config[LINE_BREAKS];\n }\n if ((0, has_1.default)(config, START_CHARS_HINT)) {\n tokenType.START_CHARS_HINT = config[START_CHARS_HINT];\n }\n return tokenType;\n}\nexports.EOF = createToken({ name: \"EOF\", pattern: lexer_public_1.Lexer.NA });\n(0, tokens_1.augmentTokenTypes)([exports.EOF]);\nfunction createTokenInstance(tokType, image, startOffset, endOffset, startLine, endLine, startColumn, endColumn) {\n return {\n image: image,\n startOffset: startOffset,\n endOffset: endOffset,\n startLine: startLine,\n endLine: endLine,\n startColumn: startColumn,\n endColumn: endColumn,\n tokenTypeIdx: tokType.tokenTypeIdx,\n tokenType: tokType\n };\n}\nexports.createTokenInstance = createTokenInstance;\nfunction tokenMatcher(token, tokType) {\n return (0, tokens_1.tokenStructuredMatcher)(token, tokType);\n}\nexports.tokenMatcher = tokenMatcher;\n//# sourceMappingURL=tokens_public.js.map","var constant = require('./constant'),\n defineProperty = require('./_defineProperty'),\n identity = require('./identity');\n\n/**\n * The base implementation of `setToString` without support for hot loop shorting.\n *\n * @private\n * @param {Function} func The function to modify.\n * @param {Function} string The `toString` result.\n * @returns {Function} Returns `func`.\n */\nvar baseSetToString = !defineProperty ? identity : function(func, string) {\n return defineProperty(func, 'toString', {\n 'configurable': true,\n 'enumerable': false,\n 'value': constant(string),\n 'writable': true\n });\n};\n\nmodule.exports = baseSetToString;\n","var baseIsRegExp = require('./_baseIsRegExp'),\n baseUnary = require('./_baseUnary'),\n nodeUtil = require('./_nodeUtil');\n\n/* Node.js helper references. */\nvar nodeIsRegExp = nodeUtil && nodeUtil.isRegExp;\n\n/**\n * Checks if `value` is classified as a `RegExp` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a regexp, else `false`.\n * @example\n *\n * _.isRegExp(/abc/);\n * // => true\n *\n * _.isRegExp('/abc/');\n * // => false\n */\nvar isRegExp = nodeIsRegExp ? baseUnary(nodeIsRegExp) : baseIsRegExp;\n\nmodule.exports = isRegExp;\n","var Uint8Array = require('./_Uint8Array');\n\n/**\n * Creates a clone of `arrayBuffer`.\n *\n * @private\n * @param {ArrayBuffer} arrayBuffer The array buffer to clone.\n * @returns {ArrayBuffer} Returns the cloned array buffer.\n */\nfunction cloneArrayBuffer(arrayBuffer) {\n var result = new arrayBuffer.constructor(arrayBuffer.byteLength);\n new Uint8Array(result).set(new Uint8Array(arrayBuffer));\n return result;\n}\n\nmodule.exports = cloneArrayBuffer;\n","\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.validateMissingCstMethods = exports.validateVisitor = exports.CstVisitorDefinitionError = exports.createBaseVisitorConstructorWithDefaults = exports.createBaseSemanticVisitorConstructor = exports.defaultVisit = void 0;\nvar isEmpty_1 = __importDefault(require(\"lodash/isEmpty\"));\nvar compact_1 = __importDefault(require(\"lodash/compact\"));\nvar isArray_1 = __importDefault(require(\"lodash/isArray\"));\nvar map_1 = __importDefault(require(\"lodash/map\"));\nvar forEach_1 = __importDefault(require(\"lodash/forEach\"));\nvar filter_1 = __importDefault(require(\"lodash/filter\"));\nvar keys_1 = __importDefault(require(\"lodash/keys\"));\nvar isFunction_1 = __importDefault(require(\"lodash/isFunction\"));\nvar isUndefined_1 = __importDefault(require(\"lodash/isUndefined\"));\nvar lang_extensions_1 = require(\"../../lang/lang_extensions\");\nfunction defaultVisit(ctx, param) {\n var childrenNames = (0, keys_1.default)(ctx);\n var childrenNamesLength = childrenNames.length;\n for (var i = 0; i < childrenNamesLength; i++) {\n var currChildName = childrenNames[i];\n var currChildArray = ctx[currChildName];\n var currChildArrayLength = currChildArray.length;\n for (var j = 0; j < currChildArrayLength; j++) {\n var currChild = currChildArray[j];\n // distinction between Tokens Children and CstNode children\n if (currChild.tokenTypeIdx === undefined) {\n this[currChild.name](currChild.children, param);\n }\n }\n }\n // defaultVisit does not support generic out param\n}\nexports.defaultVisit = defaultVisit;\nfunction createBaseSemanticVisitorConstructor(grammarName, ruleNames) {\n var derivedConstructor = function () { };\n // can be overwritten according to:\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/\n // name?redirectlocale=en-US&redirectslug=JavaScript%2FReference%2FGlobal_Objects%2FFunction%2Fname\n (0, lang_extensions_1.defineNameProp)(derivedConstructor, grammarName + \"BaseSemantics\");\n var semanticProto = {\n visit: function (cstNode, param) {\n // enables writing more concise visitor methods when CstNode has only a single child\n if ((0, isArray_1.default)(cstNode)) {\n // A CST Node's children dictionary can never have empty arrays as values\n // If a key is defined there will be at least one element in the corresponding value array.\n cstNode = cstNode[0];\n }\n // enables passing optional CstNodes concisely.\n if ((0, isUndefined_1.default)(cstNode)) {\n return undefined;\n }\n return this[cstNode.name](cstNode.children, param);\n },\n validateVisitor: function () {\n var semanticDefinitionErrors = validateVisitor(this, ruleNames);\n if (!(0, isEmpty_1.default)(semanticDefinitionErrors)) {\n var errorMessages = (0, map_1.default)(semanticDefinitionErrors, function (currDefError) { return currDefError.msg; });\n throw Error(\"Errors Detected in CST Visitor <\".concat(this.constructor.name, \">:\\n\\t\") +\n \"\".concat(errorMessages.join(\"\\n\\n\").replace(/\\n/g, \"\\n\\t\")));\n }\n }\n };\n derivedConstructor.prototype = semanticProto;\n derivedConstructor.prototype.constructor = derivedConstructor;\n derivedConstructor._RULE_NAMES = ruleNames;\n return derivedConstructor;\n}\nexports.createBaseSemanticVisitorConstructor = createBaseSemanticVisitorConstructor;\nfunction createBaseVisitorConstructorWithDefaults(grammarName, ruleNames, baseConstructor) {\n var derivedConstructor = function () { };\n // can be overwritten according to:\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/\n // name?redirectlocale=en-US&redirectslug=JavaScript%2FReference%2FGlobal_Objects%2FFunction%2Fname\n (0, lang_extensions_1.defineNameProp)(derivedConstructor, grammarName + \"BaseSemanticsWithDefaults\");\n var withDefaultsProto = Object.create(baseConstructor.prototype);\n (0, forEach_1.default)(ruleNames, function (ruleName) {\n withDefaultsProto[ruleName] = defaultVisit;\n });\n derivedConstructor.prototype = withDefaultsProto;\n derivedConstructor.prototype.constructor = derivedConstructor;\n return derivedConstructor;\n}\nexports.createBaseVisitorConstructorWithDefaults = createBaseVisitorConstructorWithDefaults;\nvar CstVisitorDefinitionError;\n(function (CstVisitorDefinitionError) {\n CstVisitorDefinitionError[CstVisitorDefinitionError[\"REDUNDANT_METHOD\"] = 0] = \"REDUNDANT_METHOD\";\n CstVisitorDefinitionError[CstVisitorDefinitionError[\"MISSING_METHOD\"] = 1] = \"MISSING_METHOD\";\n})(CstVisitorDefinitionError = exports.CstVisitorDefinitionError || (exports.CstVisitorDefinitionError = {}));\nfunction validateVisitor(visitorInstance, ruleNames) {\n var missingErrors = validateMissingCstMethods(visitorInstance, ruleNames);\n return missingErrors;\n}\nexports.validateVisitor = validateVisitor;\nfunction validateMissingCstMethods(visitorInstance, ruleNames) {\n var missingRuleNames = (0, filter_1.default)(ruleNames, function (currRuleName) {\n return (0, isFunction_1.default)(visitorInstance[currRuleName]) === false;\n });\n var errors = (0, map_1.default)(missingRuleNames, function (currRuleName) {\n return {\n msg: \"Missing visitor method: <\".concat(currRuleName, \"> on \").concat((visitorInstance.constructor.name), \" CST Visitor.\"),\n type: CstVisitorDefinitionError.MISSING_METHOD,\n methodName: currRuleName\n };\n });\n return (0, compact_1.default)(errors);\n}\nexports.validateMissingCstMethods = validateMissingCstMethods;\n//# sourceMappingURL=cst_visitor.js.map","/** Used to compose unicode character classes. */\nvar rsAstralRange = '\\\\ud800-\\\\udfff',\n rsComboMarksRange = '\\\\u0300-\\\\u036f',\n reComboHalfMarksRange = '\\\\ufe20-\\\\ufe2f',\n rsComboSymbolsRange = '\\\\u20d0-\\\\u20ff',\n rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange,\n rsVarRange = '\\\\ufe0e\\\\ufe0f';\n\n/** Used to compose unicode capture groups. */\nvar rsZWJ = '\\\\u200d';\n\n/** Used to detect strings with [zero-width joiners or code points from the astral planes](http://eev.ee/blog/2015/09/12/dark-corners-of-unicode/). */\nvar reHasUnicode = RegExp('[' + rsZWJ + rsAstralRange + rsComboRange + rsVarRange + ']');\n\n/**\n * Checks if `string` contains Unicode symbols.\n *\n * @private\n * @param {string} string The string to inspect.\n * @returns {boolean} Returns `true` if a symbol is found, else `false`.\n */\nfunction hasUnicode(string) {\n return reHasUnicode.test(string);\n}\n\nmodule.exports = hasUnicode;\n","var arrayEvery = require('./_arrayEvery'),\n baseEvery = require('./_baseEvery'),\n baseIteratee = require('./_baseIteratee'),\n isArray = require('./isArray'),\n isIterateeCall = require('./_isIterateeCall');\n\n/**\n * Checks if `predicate` returns truthy for **all** elements of `collection`.\n * Iteration is stopped once `predicate` returns falsey. The predicate is\n * invoked with three arguments: (value, index|key, collection).\n *\n * **Note:** This method returns `true` for\n * [empty collections](https://en.wikipedia.org/wiki/Empty_set) because\n * [everything is true](https://en.wikipedia.org/wiki/Vacuous_truth) of\n * elements of empty collections.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {boolean} Returns `true` if all elements pass the predicate check,\n * else `false`.\n * @example\n *\n * _.every([true, 1, null, 'yes'], Boolean);\n * // => false\n *\n * var users = [\n * { 'user': 'barney', 'age': 36, 'active': false },\n * { 'user': 'fred', 'age': 40, 'active': false }\n * ];\n *\n * // The `_.matches` iteratee shorthand.\n * _.every(users, { 'user': 'barney', 'active': false });\n * // => false\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.every(users, ['active', false]);\n * // => true\n *\n * // The `_.property` iteratee shorthand.\n * _.every(users, 'active');\n * // => false\n */\nfunction every(collection, predicate, guard) {\n var func = isArray(collection) ? arrayEvery : baseEvery;\n if (guard && isIterateeCall(collection, predicate, guard)) {\n predicate = undefined;\n }\n return func(collection, baseIteratee(predicate, 3));\n}\n\nmodule.exports = every;\n","var arrayEach = require('./_arrayEach'),\n baseEach = require('./_baseEach'),\n castFunction = require('./_castFunction'),\n isArray = require('./isArray');\n\n/**\n * Iterates over elements of `collection` and invokes `iteratee` for each element.\n * The iteratee is invoked with three arguments: (value, index|key, collection).\n * Iteratee functions may exit iteration early by explicitly returning `false`.\n *\n * **Note:** As with other \"Collections\" methods, objects with a \"length\"\n * property are iterated like arrays. To avoid this behavior use `_.forIn`\n * or `_.forOwn` for object iteration.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @alias each\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Array|Object} Returns `collection`.\n * @see _.forEachRight\n * @example\n *\n * _.forEach([1, 2], function(value) {\n * console.log(value);\n * });\n * // => Logs `1` then `2`.\n *\n * _.forEach({ 'a': 1, 'b': 2 }, function(value, key) {\n * console.log(key);\n * });\n * // => Logs 'a' then 'b' (iteration order is not guaranteed).\n */\nfunction forEach(collection, iteratee) {\n var func = isArray(collection) ? arrayEach : baseEach;\n return func(collection, castFunction(iteratee));\n}\n\nmodule.exports = forEach;\n","/**\n * A specialized version of `_.filter` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {Array} Returns the new filtered array.\n */\nfunction arrayFilter(array, predicate) {\n var index = -1,\n length = array == null ? 0 : array.length,\n resIndex = 0,\n result = [];\n\n while (++index < length) {\n var value = array[index];\n if (predicate(value, index, array)) {\n result[resIndex++] = value;\n }\n }\n return result;\n}\n\nmodule.exports = arrayFilter;\n","/**\n * Checks if a stack value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Stack\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction stackHas(key) {\n return this.__data__.has(key);\n}\n\nmodule.exports = stackHas;\n","var baseIndexOf = require('./_baseIndexOf'),\n isArrayLike = require('./isArrayLike'),\n isString = require('./isString'),\n toInteger = require('./toInteger'),\n values = require('./values');\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max;\n\n/**\n * Checks if `value` is in `collection`. If `collection` is a string, it's\n * checked for a substring of `value`, otherwise\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * is used for equality comparisons. If `fromIndex` is negative, it's used as\n * the offset from the end of `collection`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object|string} collection The collection to inspect.\n * @param {*} value The value to search for.\n * @param {number} [fromIndex=0] The index to search from.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`.\n * @returns {boolean} Returns `true` if `value` is found, else `false`.\n * @example\n *\n * _.includes([1, 2, 3], 1);\n * // => true\n *\n * _.includes([1, 2, 3], 1, 2);\n * // => false\n *\n * _.includes({ 'a': 1, 'b': 2 }, 1);\n * // => true\n *\n * _.includes('abcd', 'bc');\n * // => true\n */\nfunction includes(collection, value, fromIndex, guard) {\n collection = isArrayLike(collection) ? collection : values(collection);\n fromIndex = (fromIndex && !guard) ? toInteger(fromIndex) : 0;\n\n var length = collection.length;\n if (fromIndex < 0) {\n fromIndex = nativeMax(length + fromIndex, 0);\n }\n return isString(collection)\n ? (fromIndex <= length && collection.indexOf(value, fromIndex) > -1)\n : (!!length && baseIndexOf(collection, value, fromIndex) > -1);\n}\n\nmodule.exports = includes;\n","/**\n * This function is like `arrayIncludes` except that it accepts a comparator.\n *\n * @private\n * @param {Array} [array] The array to inspect.\n * @param {*} target The value to search for.\n * @param {Function} comparator The comparator invoked per element.\n * @returns {boolean} Returns `true` if `target` is found, else `false`.\n */\nfunction arrayIncludesWith(array, value, comparator) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n while (++index < length) {\n if (comparator(value, array[index])) {\n return true;\n }\n }\n return false;\n}\n\nmodule.exports = arrayIncludesWith;\n","\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.validateGrammar = exports.resolveGrammar = void 0;\nvar forEach_1 = __importDefault(require(\"lodash/forEach\"));\nvar defaults_1 = __importDefault(require(\"lodash/defaults\"));\nvar resolver_1 = require(\"../resolver\");\nvar checks_1 = require(\"../checks\");\nvar errors_public_1 = require(\"../../errors_public\");\nfunction resolveGrammar(options) {\n var actualOptions = (0, defaults_1.default)(options, {\n errMsgProvider: errors_public_1.defaultGrammarResolverErrorProvider\n });\n var topRulesTable = {};\n (0, forEach_1.default)(options.rules, function (rule) {\n topRulesTable[rule.name] = rule;\n });\n return (0, resolver_1.resolveGrammar)(topRulesTable, actualOptions.errMsgProvider);\n}\nexports.resolveGrammar = resolveGrammar;\nfunction validateGrammar(options) {\n options = (0, defaults_1.default)(options, {\n errMsgProvider: errors_public_1.defaultGrammarValidatorErrorProvider\n });\n return (0, checks_1.validateGrammar)(options.rules, options.tokenTypes, options.errMsgProvider, options.grammarName);\n}\nexports.validateGrammar = validateGrammar;\n//# sourceMappingURL=gast_resolver_public.js.map","/**\n * This method returns `false`.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {boolean} Returns `false`.\n * @example\n *\n * _.times(2, _.stubFalse);\n * // => [false, false]\n */\nfunction stubFalse() {\n return false;\n}\n\nmodule.exports = stubFalse;\n","var Stack = require('./_Stack'),\n arrayEach = require('./_arrayEach'),\n assignValue = require('./_assignValue'),\n baseAssign = require('./_baseAssign'),\n baseAssignIn = require('./_baseAssignIn'),\n cloneBuffer = require('./_cloneBuffer'),\n copyArray = require('./_copyArray'),\n copySymbols = require('./_copySymbols'),\n copySymbolsIn = require('./_copySymbolsIn'),\n getAllKeys = require('./_getAllKeys'),\n getAllKeysIn = require('./_getAllKeysIn'),\n getTag = require('./_getTag'),\n initCloneArray = require('./_initCloneArray'),\n initCloneByTag = require('./_initCloneByTag'),\n initCloneObject = require('./_initCloneObject'),\n isArray = require('./isArray'),\n isBuffer = require('./isBuffer'),\n isMap = require('./isMap'),\n isObject = require('./isObject'),\n isSet = require('./isSet'),\n keys = require('./keys'),\n keysIn = require('./keysIn');\n\n/** Used to compose bitmasks for cloning. */\nvar CLONE_DEEP_FLAG = 1,\n CLONE_FLAT_FLAG = 2,\n CLONE_SYMBOLS_FLAG = 4;\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n arrayTag = '[object Array]',\n boolTag = '[object Boolean]',\n dateTag = '[object Date]',\n errorTag = '[object Error]',\n funcTag = '[object Function]',\n genTag = '[object GeneratorFunction]',\n mapTag = '[object Map]',\n numberTag = '[object Number]',\n objectTag = '[object Object]',\n regexpTag = '[object RegExp]',\n setTag = '[object Set]',\n stringTag = '[object String]',\n symbolTag = '[object Symbol]',\n weakMapTag = '[object WeakMap]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n dataViewTag = '[object DataView]',\n float32Tag = '[object Float32Array]',\n float64Tag = '[object Float64Array]',\n int8Tag = '[object Int8Array]',\n int16Tag = '[object Int16Array]',\n int32Tag = '[object Int32Array]',\n uint8Tag = '[object Uint8Array]',\n uint8ClampedTag = '[object Uint8ClampedArray]',\n uint16Tag = '[object Uint16Array]',\n uint32Tag = '[object Uint32Array]';\n\n/** Used to identify `toStringTag` values supported by `_.clone`. */\nvar cloneableTags = {};\ncloneableTags[argsTag] = cloneableTags[arrayTag] =\ncloneableTags[arrayBufferTag] = cloneableTags[dataViewTag] =\ncloneableTags[boolTag] = cloneableTags[dateTag] =\ncloneableTags[float32Tag] = cloneableTags[float64Tag] =\ncloneableTags[int8Tag] = cloneableTags[int16Tag] =\ncloneableTags[int32Tag] = cloneableTags[mapTag] =\ncloneableTags[numberTag] = cloneableTags[objectTag] =\ncloneableTags[regexpTag] = cloneableTags[setTag] =\ncloneableTags[stringTag] = cloneableTags[symbolTag] =\ncloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] =\ncloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true;\ncloneableTags[errorTag] = cloneableTags[funcTag] =\ncloneableTags[weakMapTag] = false;\n\n/**\n * The base implementation of `_.clone` and `_.cloneDeep` which tracks\n * traversed objects.\n *\n * @private\n * @param {*} value The value to clone.\n * @param {boolean} bitmask The bitmask flags.\n * 1 - Deep clone\n * 2 - Flatten inherited properties\n * 4 - Clone symbols\n * @param {Function} [customizer] The function to customize cloning.\n * @param {string} [key] The key of `value`.\n * @param {Object} [object] The parent object of `value`.\n * @param {Object} [stack] Tracks traversed objects and their clone counterparts.\n * @returns {*} Returns the cloned value.\n */\nfunction baseClone(value, bitmask, customizer, key, object, stack) {\n var result,\n isDeep = bitmask & CLONE_DEEP_FLAG,\n isFlat = bitmask & CLONE_FLAT_FLAG,\n isFull = bitmask & CLONE_SYMBOLS_FLAG;\n\n if (customizer) {\n result = object ? customizer(value, key, object, stack) : customizer(value);\n }\n if (result !== undefined) {\n return result;\n }\n if (!isObject(value)) {\n return value;\n }\n var isArr = isArray(value);\n if (isArr) {\n result = initCloneArray(value);\n if (!isDeep) {\n return copyArray(value, result);\n }\n } else {\n var tag = getTag(value),\n isFunc = tag == funcTag || tag == genTag;\n\n if (isBuffer(value)) {\n return cloneBuffer(value, isDeep);\n }\n if (tag == objectTag || tag == argsTag || (isFunc && !object)) {\n result = (isFlat || isFunc) ? {} : initCloneObject(value);\n if (!isDeep) {\n return isFlat\n ? copySymbolsIn(value, baseAssignIn(result, value))\n : copySymbols(value, baseAssign(result, value));\n }\n } else {\n if (!cloneableTags[tag]) {\n return object ? value : {};\n }\n result = initCloneByTag(value, tag, isDeep);\n }\n }\n // Check for circular references and return its corresponding clone.\n stack || (stack = new Stack);\n var stacked = stack.get(value);\n if (stacked) {\n return stacked;\n }\n stack.set(value, result);\n\n if (isSet(value)) {\n value.forEach(function(subValue) {\n result.add(baseClone(subValue, bitmask, customizer, subValue, value, stack));\n });\n } else if (isMap(value)) {\n value.forEach(function(subValue, key) {\n result.set(key, baseClone(subValue, bitmask, customizer, key, value, stack));\n });\n }\n\n var keysFunc = isFull\n ? (isFlat ? getAllKeysIn : getAllKeys)\n : (isFlat ? keysIn : keys);\n\n var props = isArr ? undefined : keysFunc(value);\n arrayEach(props || value, function(subValue, key) {\n if (props) {\n key = subValue;\n subValue = value[key];\n }\n // Recursively populate clone (susceptible to call stack limits).\n assignValue(result, key, baseClone(subValue, bitmask, customizer, key, value, stack));\n });\n return result;\n}\n\nmodule.exports = baseClone;\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\tid: moduleId,\n\t\tloaded: false,\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Flag the module as loaded\n\tmodule.loaded = true;\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.nmd = (module) => {\n\tmodule.paths = [];\n\tif (!module.children) module.children = [];\n\treturn module;\n};","// startup\n// Load entry module and return exports\n// This entry module is referenced by other modules so it can't be inlined\nvar __webpack_exports__ = __webpack_require__(3475);\n"],"names":["root","factory","exports","module","define","amd","a","i","self","baseGetAllKeys","getSymbols","keys","object","listCacheClear","listCacheDelete","listCacheGet","listCacheHas","listCacheSet","ListCache","entries","index","length","this","clear","entry","set","prototype","get","has","assocIndexOf","splice","Array","key","data","__data__","pop","call","size","MapCache","memoize","func","resolver","TypeError","memoized","args","arguments","apply","cache","result","Cache","extendStatics","__extends","d","b","Object","setPrototypeOf","__proto__","p","hasOwnProperty","String","__","constructor","create","__importDefault","mod","__esModule","defineProperty","value","EarlyExitException","NotAllInputParsedException","NoViableAltException","MismatchedTokenException","isRecognitionException","includes_1","MISMATCHED_TOKEN_EXCEPTION","NO_VIABLE_ALT_EXCEPTION","EARLY_EXIT_EXCEPTION","NOT_ALL_INPUT_PARSED_EXCEPTION","RECOGNITION_EXCEPTION_NAMES","freeze","error","default","name","RecognitionException","_super","message","token","_newTarget","_this","resyncedTokens","Error","captureStackTrace","previousToken","Lexer","LexerDefinitionErrorType","lexer_1","noop_1","isEmpty_1","isArray_1","last_1","reject_1","map_1","forEach_1","keys_1","isUndefined_1","identity_1","assign_1","reduce_1","clone_1","utils_1","tokens_1","lexer_errors_public_1","reg_exp_parser_1","DEFAULT_LEXER_CONFIG","deferDefinitionErrorsHandling","positionTracking","lineTerminatorsPattern","lineTerminatorCharacters","ensureOptimizations","safeMode","errorMessageProvider","defaultLexerErrorProvider","traceInitPerf","skipValidations","recoveryEnabled","lexerDefinition","config","lexerDefinitionErrors","lexerDefinitionWarning","patternIdxToConfig","charCodeToPatternIdxToConfig","modes","emptyGroups","trackStartLines","trackEndLines","hasCustom","canModeBeOptimized","TRACE_INIT","phaseDesc","phaseImpl","traceInitIndent","indent","join","traceInitMaxIdent","console","log","concat","_a","timer","time","traceMethod","warn","traceInitVal","Infinity","actualDefinition","hasOnlySingleMode","LineTerminatorOptimizedTester","test","defaultMode","DEFAULT_MODE","performRuntimeChecks","performWarningRuntimeChecks","currModeValue","currModeName","currTokType","allModeNames","currModDef","currModName","currAnalyzeResult_1","push","validatePatterns","augmentTokenTypes","analyzeTokenTypes","tracer","canBeOptimized","allErrMessagesString","warningDescriptor","PRINT_WARNING","SUPPORT_STICKY","chopInput","match","matchWithTest","updateLastIndex","matchWithExec","handleModes","computeNewColumn","updateTokenEndLineColumnLocation","createTokenInstance","createFullToken","createStartOnlyToken","createOffsetOnlyToken","addToken","addTokenUsingPush","handlePayload","handlePayloadWithCustom","addTokenUsingMemberAccess","handlePayloadNoCustom","unOptimizedModes","cannotBeOptimized","modeName","clearRegExpParserCache","toFastProperties","tokenize","text","initialMode","tokenizeInternal","j","k","matchAltImage","longerAlt","matchedImage","payload","altPayload","imageLength","group","tokType","newToken","errLength","msg","getPossiblePatterns","orgText","orgLength","offset","matchedTokensIndex","guessedNumberOfTokens","Math","floor","matchedTokens","errors","line","undefined","column","groups","cloneEmptyGroups","trackLines","lineTerminatorPattern","currModePatternsLength","currCharCodeToPatternIdxToConfig","modeStack","emptyArray","getPossiblePatternsSlow","getPossiblePatternsOptimized","charCode","optimizedCharIdx","charCodeToOptimizedIndex","possiblePatterns","currConfig","pop_mode","popToken","tokenType","PUSH_MODE","msg_1","buildUnableToPopLexerModeMessage","startOffset","startLine","startColumn","image","newMode","modeCanBeOptimized","push_mode","nextCharCode","charCodeAt","chosenPatternIdxToConfig","chosenPatternsLength","currPattern","pattern","singleCharCode","short","isCustom","exec","longerAltLength","longerAltConfig","longerAltPattern","tokenTypeIdx","canLineTerminator","numOfLTsInMatch","foundTerminator","lastLTEndOffset","lastIndex","errorStartOffset","errorLine","errorColumn","foundResyncPoint","currConfig_1","buildUnexpectedCharactersMessage","tokens","pushMode","substring","regExp","newLastIndex","lastLTIdx","lastCharIsLT","fixForEndingInLT","endLine","endColumn","oldColumn","endOffset","tokenVector","tokenToAdd","regExpArray","SKIPPED","NA","baseIsEqualDeep","isObjectLike","baseIsEqual","other","bitmask","customizer","stack","getMapData","map","forEach","reIsUint","type","getRegExpAst","regexp_to_ast_1","regExpAstCache","regExpParser","RegExpParser","regExpStr","toString","regExpAst","fullText","charAt","__assign","assign","t","s","n","checkPrefixAlternativesAmbiguities","validateSomeNonEmptyLookaheadPath","validateTooManyAlts","RepetitionCollector","validateAmbiguousAlternationAlternatives","validateEmptyOrAlternative","getFirstNoneTerminal","validateNoLeftRecursion","validateRuleIsOverridden","validateRuleDoesNotAlreadyExist","OccurrenceValidationCollector","identifyProductionForDuplicates","validateGrammar","validateLookahead","first_1","drop_1","flatten_1","filter_1","difference_1","groupBy_1","pickBy_1","values_1","flatMap_1","parser_1","gast_1","lookahead_1","interpreter_1","gast_2","gast_3","dropRight_1","compact_1","prod","getProductionDslName","idx","getExtraProductionArgument","Terminal","terminalType","NonTerminal","nonTerminalName","options","lookaheadValidationErrorMessages","lookaheadStrategy","validate","rules","tokenTypes","grammarName","errorMessage","ParserDefinitionErrorType","CUSTOM_LOOKAHEAD_VALIDATION","topLevels","errMsgProvider","duplicateErrors","currTopLevel","topLevelRule","collectorVisitor","accept","allRuleProductions","allProductions","productionGroups","duplicates","currGroup","currDuplicates","firstProd","buildDuplicateFoundError","dslName","defError","DUPLICATE_PRODUCTIONS","ruleName","occurrence","param","parameter","validateDuplicateProductions","termsNamespaceConflictErrors","tokenNames","currToken","currRule","currRuleName","errMsg","buildNamespaceConflictError","CONFLICT_TOKENS_RULES_NAMESPACE","checkTerminalAndNoneTerminalsNameSpace","tooManyAltsErrors","curRule","duplicateRulesError","visitNonTerminal","subrule","visitOption","option","visitRepetitionWithSeparator","manySep","visitRepetitionMandatory","atLeastOne","visitRepetitionMandatoryWithSeparator","atLeastOneSep","visitRepetition","many","visitAlternation","or","visitTerminal","terminal","GAstVisitor","rule","allRules","className","buildDuplicateRuleNameError","DUPLICATE_RULE_NAME","definition","referencedRule","Alternative","Option","RepetitionMandatory","RepetitionMandatoryWithSeparator","RepetitionWithSeparator","Repetition","Alternation","currSubDef","isFirstOptional","isOptionalProd","hasMore","rest","definedRulesNames","INVALID_RULE_OVERRIDE","topRule","path","nextNonTerminals","buildLeftRecursionError","leftRecursionPath","LEFT_RECURSION","validNextSteps","errorsFromNextSteps","currRefRule","newPath","OrCollector","alternations","node","orCollector","ors","currOr","exceptLast","currAlternative","currAltIdx","possibleFirstInAlt","nextPossibleTokensAfter","tokenStructuredMatcher","buildEmptyAlternationError","alternation","emptyChoiceIdx","NONE_LAST_EMPTY_ALT","alternative","globalMaxLookahead","ignoreAmbiguities","currOccurrence","actualMaxLookahead","maxLookahead","alternatives","getLookaheadPathsForOr","altsAmbiguityErrors","foundAmbiguousPaths","identicalAmbiguities","currAlt","currPath","altsCurrPathAppearsIn","currOtherAlt","currOtherAltIdx","containsPath","alts","currAmbDescriptor","ambgIndices","buildAlternationAmbiguityError","ambiguityIndices","prefixPath","AMBIGUOUS_ALTS","checkAlternativesAmbiguities","altsPrefixAmbiguityErrors","buildTooManyAlternativesError","TOO_MANY_ALTS","pathsAndIndices","currPathsAndIdx","currPathAndIdx","targetIdx","targetPath","prefixAmbiguitiesPathsAndIndices","searchPathAndIdx","isStrictPrefixOfPath","currAmbPathAndIdx","buildAlternationPrefixAmbiguityError","AMBIGUOUS_PREFIX_ALTS","topLevelRules","currTopRule","currProd","prodType","getProdType","pathsInsideProduction","getLookaheadPathsForOptionalProd","buildEmptyRepetitionError","repetition","NO_NON_EMPTY_LOOKAHEAD","arrayMap","props","baseProperty","basePropertyDeep","isKey","toKey","ContentAssist","initContentAssist","computeContentAssist","startRuleName","precedingInput","startRuleGast","gastProductionsCache","tokenMatcher","getNextPossibleTokenTypes","grammarPath","topRuleName","ruleStack","topProduction","getGAstProductions","NextAfterTokenWalker","startWalking","baseHasIn","hasPath","baseFor","iteratee","Symbol","objectProto","nativeObjectToString","symToStringTag","toStringTag","isOwn","tag","unmasked","e","getAllKeys","equalFunc","isPartial","objProps","objLength","objStacked","othStacked","skipCtor","objValue","othValue","compared","objCtor","othCtor","baseTimes","isArguments","isArray","isBuffer","isIndex","isTypedArray","inherited","isArr","isArg","isBuff","isType","skipIndexes","isObject","isStrictComparable","arrayReduce","baseEach","baseIteratee","baseReduce","collection","accumulator","initAccum","defaultGrammarValidatorErrorProvider","defaultGrammarResolverErrorProvider","defaultParserErrorProvider","tokens_public_1","buildMismatchTokenMessage","expected","actual","expectedMsg","previous","hasTokenLabel","tokenLabel","buildNotAllInputParsedMessage","firstRedundant","buildNoViableAltMessage","expectedPathsPerAlt","customUserDescription","errPrefix","errSuffix","allLookAheadPaths","currAltPaths","nextValidTokenSequences","currTokenType","nextValidSequenceItems","itemMsg","buildEarlyExitMessage","expectedIterationPaths","buildRuleNotFoundError","undefinedRule","duplicateProds","topLevelName","duplicateProd","extraArgument","hasExplicitIndex","replace","pathMsg","currTok","currtok","currMessage","buildTokenNameError","pathNames","leftRecursivePath","buildInvalidRuleNameError","Rule","array","baseForOwn","createBaseEach","predicate","LexerAdapter","initLexerAdapter","tokVector","tokVectorLength","currIdx","newInput","selfAnalysisDone","reset","enumerable","configurable","SKIP_TOKEN","consumeToken","LA","END_OF_FILE","howMuch","soughtIdx","exportLexerState","importLexerState","newState","resetLexerState","moveToTerminatedState","getLexerPosition","Map","pairs","LARGE_ARRAY_SIZE","baseRest","isIterateeCall","assigner","sources","guard","source","thisArg","nativeCreate","getNative","string","split","basePickBy","getAllKeysIn","prop","RecognizerApi","exceptions_public_1","errors_public_1","checks_1","ACTION","impl","consume","consumeInternal","ruleToCall","subruleInternal","actionORMethodDef","optionInternal","altsOrOpts","orInternal","manyInternal","atLeastOneInternal","CONSUME","CONSUME1","CONSUME2","CONSUME3","CONSUME4","CONSUME5","CONSUME6","CONSUME7","CONSUME8","CONSUME9","SUBRULE","SUBRULE1","SUBRULE2","SUBRULE3","SUBRULE4","SUBRULE5","SUBRULE6","SUBRULE7","SUBRULE8","SUBRULE9","OPTION","OPTION1","OPTION2","OPTION3","OPTION4","OPTION5","OPTION6","OPTION7","OPTION8","OPTION9","OR","OR1","OR2","OR3","OR4","OR5","OR6","OR7","OR8","OR9","MANY","MANY1","MANY2","MANY3","MANY4","MANY5","MANY6","MANY7","MANY8","MANY9","MANY_SEP","manySepFirstInternal","MANY_SEP1","MANY_SEP2","MANY_SEP3","MANY_SEP4","MANY_SEP5","MANY_SEP6","MANY_SEP7","MANY_SEP8","MANY_SEP9","AT_LEAST_ONE","AT_LEAST_ONE1","AT_LEAST_ONE2","AT_LEAST_ONE3","AT_LEAST_ONE4","AT_LEAST_ONE5","AT_LEAST_ONE6","AT_LEAST_ONE7","AT_LEAST_ONE8","AT_LEAST_ONE9","AT_LEAST_ONE_SEP","atLeastOneSepFirstInternal","AT_LEAST_ONE_SEP1","AT_LEAST_ONE_SEP2","AT_LEAST_ONE_SEP3","AT_LEAST_ONE_SEP4","AT_LEAST_ONE_SEP5","AT_LEAST_ONE_SEP6","AT_LEAST_ONE_SEP7","AT_LEAST_ONE_SEP8","AT_LEAST_ONE_SEP9","RULE","implementation","DEFAULT_RULE_CONFIG","definitionErrors","ruleImplementation","defineRule","OVERRIDE_RULE","ruleErrors","BACKTRACK","grammarRule","isBackTrackingStack","orgState","saveRecogState","reloadRecogState","getSerializedGastProductions","serializeGrammar","version_1","VERSION","CstParser","EmbeddedActionsParser","EMPTY_ALT","lexer_public_1","createToken","EOF","tokenName","getLookaheadPaths","llk_lookahead_1","LLkLookaheadStrategy","serializeProduction","cst_dts_gen_1","generateCstDts","render_public_1","createSyntaxDiagramsCode","baseGetTag","baseHas","toFinite","remainder","hashClear","hashDelete","hashGet","hashHas","hashSet","Hash","start","Date","getTime","val","baseIndexOf","toInteger","nativeMax","max","fromIndex","stringToPath","assignValue","baseAssignValue","isNew","newValue","Stack","matchData","noCustomizer","srcValue","COMPARE_PARTIAL_FLAG","reWhitespace","memoizeCapped","rePropName","reEscapeChar","number","quote","subString","nativeNow","now","count","lastCalled","stamp","remaining","CellEvent","cloneArrayBuffer","typedArray","isDeep","buffer","byteOffset","Uint8Array","eq","equalArrays","mapToArray","setToArray","symbolProto","symbolValueOf","valueOf","byteLength","convert","stacked","arrayAggregator","baseAggregator","setter","initializer","isArrayLike","findIndexFunc","iterable","createAggregator","groupBy","rsAstralRange","rsAstral","rsCombo","rsFitz","rsNonAstral","rsRegional","rsSurrPair","reOptMod","rsModifier","rsOptVar","rsSeq","rsSymbol","reUnicode","RegExp","collectMethods","LooksAhead","has_1","initLooksAhead","dynamicTokensEnabled","DEFAULT_PARSER_CONFIG","lookAheadFuncsCache","preComputeLookaheadFunctions","repetitionMandatory","repetitionMandatoryWithSeparator","repetitionWithSeparator","prodIdx","laFunc","buildLookaheadForAlternation","prodOccurrence","hasPredicates","getKeyForAutomaticLookahead","fullRuleNameToShort","OR_IDX","setLaFuncCache","computeLookaheadFunc","MANY_IDX","OPTION_IDX","AT_LEAST_ONE_IDX","AT_LEAST_ONE_SEP_IDX","MANY_SEP_IDX","prodKey","prodMaxLookahead","dslMethodName","buildLookaheadForOptional","dslMethodIdx","currRuleShortName","getLastExplicitRuleShortName","getLaFuncFromCache","DslMethodsCollectorVisitor","dslMethods","PerformanceTracer","initPerformanceTracer","userTraceInitPerf","traceIsNumber","baseKeys","getTag","isPrototype","firstForTerminal","firstForBranching","firstForSequence","first","uniq_1","isSequenceProd","isBranchingProd","currSubProd","firstSet","seq","nextSubProdIdx","hasInnerProdsRemaining","isLastInnerProdOptional","allAlternativesFirsts","innerProd","arrayPush","keysFunc","symbolsFunc","copyObject","PRINT_ERROR","GastRecorder","some_1","isFunction_1","RECORDING_NULL_OBJECT","description","HANDLE_SEPARATOR","MAX_METHOD_IDX","pow","BITS_FOR_OCCURRENCE_IDX","RFT","RECORDING_PHASE_TOKEN","RECORDING_PHASE_CSTNODE","children","initGastRecorder","recordingProdStack","RECORDING_PHASE","enableRecording","_loop_1","arg1","arg2","consumeInternalRecord","subruleInternalRecord","optionInternalRecord","orInternalRecord","manyInternalRecord","manySepFirstInternalRecord","atLeastOneInternalRecord","atLeastOneSepFirstInternalRecord","ACTION_RECORD","BACKTRACK_RECORD","LA_RECORD","disableRecording","that","topLevelRuleRecord","def","newTopLevelRule","originalError","KNOWN_RECORDER_ERROR","mutabilityError","recordProd","recordOrProd","assertMethodIdxIsValid","getIdxSuffix","JSON","stringify","prevProd","newNoneTerminal","label","LABEL","outputCst","hasShortKeyProperty","prodConstructor","mainProdArg","handleSep","grammarAction","DEF","newProd","separator","SEP","MAX_LOOKAHEAD","hasOptions","newOrProd","IGNORE_AMBIGUITIES","GATE","currAltFlat","ALT","arraySome","baseSome","baseIsArguments","propertyIsEnumerable","saveState","input","groupIdx","restoreState","consumeChar","disjunction","flags","loc","begin","end","global","ignoreCase","multiLine","unicode","sticky","isRegExpFlag","popChar","addFlag","peekChar","terms","isTerm","term","isAssertion","assertion","atom","ASSERT_EXISTS","ASSERT_NEVER_REACH_HERE","quantifier","isBacktracking","range","atLeast","atMost","integerIncludingZero","isDigit","greedy","dotAll","atomEscape","characterClass","isPatternCharacter","patternCharacter","isQuantifier","complement","cc","decimalEscapeAtom","characterClassEscape","controlEscapeAtom","controlLetterEscapeAtom","nulCharacterAtom","hexEscapeSequenceAtom","regExpUnicodeEscapeSequenceAtom","identityEscapeAtom","positiveInteger","digitsCharCodes","whitespaceCodes","wordCharCodes","escapeCode","letter","toUpperCase","parseHexDigits","classPatternCharacterAtom","isClassAtom","from","classAtom","isRangeDash","to","insertToSet","classEscape","capturing","groupAst","decimalPatternNoZero","decimalPattern","parseInt","nextChar","isAtom","prevState","howMany","hexString","hexChar","hexDigitPattern","char","item","subItem","flagObj","flagKey","obj","BaseRegExpVisitor","visitChildren","child","visit","subChild","visitPattern","visitFlags","visitDisjunction","visitAlternative","visitStartAnchor","visitEndAnchor","visitWordBoundary","visitNonWordBoundary","visitLookahead","visitNegativeLookahead","visitCharacter","visitSet","visitGroup","visitGroupBackReference","visitQuantifier","castSlice","hasUnicode","stringToArray","methodName","strSymbols","chr","trailing","slice","fromRight","getRawTag","objectToString","baseClone","isKeyable","Promise","baseSetToString","setToString","shortOut","nativeKeysIn","isProto","isTokenType","hasExtendingTokensTypesMapProperty","hasExtendingTokensTypesProperty","hasCategoriesProperty","singleAssignCategoriesToksMap","assignCategoriesMapProp","assignCategoriesTokensProp","assignTokenDefaultProps","expandCategories","tokenIdxToClass","tokenShortNameIdx","tokenStructuredMatcherNoCategories","categories","searching","CATEGORIES","newCategories","categoryMatches","categoryMatchesMap","nextNode","pathNode","nextCategory","tokInstance","tokConstructor","instanceType","isParent","tokenTypesAndParents","isFlattenable","baseFlatten","depth","isStrict","RestWalker","walk","prevRest","subProd","currRest","walkProdRef","walkTerminal","walkFlat","walkOption","walkAtLeastOne","walkAtLeastOneSep","walkManySep","walkMany","walkOr","refProd","flatProd","fullOrRest","optionProd","atLeastOneProd","fullAtLeastOneRest","atLeastOneSepProd","fullAtLeastOneSepRest","restForRepetitionWithSeparator","manyProd","fullManyRest","manySepProd","fullManySepRest","orProd","alt","prodWrapper","repSepProd","castPath","nested","reFlags","regexp","baseToString","model_1","generate_1","defaultOptions","includeVisitorInterface","visitorInterfaceName","productions","effectiveOptions","model","buildModel","genDts","freeExports","nodeType","freeModule","Buffer","allocUnsafe","copy","getSymbolsIn","keysIn","baseUniq","visitor_1","helpers_1","Plus","Minus","Mult","Div","LParen","RParen","Comma","RowRange","NumberLiteral","longer_alt","Variable","SheetName","CellRange","CellRef","StringLiteral","Concat","FunctionName","WhiteSpace","GreaterThan","LessThan","GreaterThanEqual","LessThanEqual","Equal","NotEqual","IfFunction","TrueKeyword","FalseKeyword","NullKeyword","ArrayRowSep","RangeIntersect","ErrorConstant","IfErrorFunction","IfsFunction","SwitchFunction","LCurly","RCurly","ColumnRange","Power","allTokens","CalxTokens","CalxLexer","CalxParser","super","comparisonExpression","atomicExpression","$","arrayFormula","expression","additionExpression","concatenationExpression","multiplicationExpression","exponentiationExpression","unaryExpression","ifFunctionCall","functionCall","ifErrorFunctionCall","ifsFunctionCall","switchFunctionCall","arrayRow","performSelfAnalysis","parse","inputText","lexResult","cst","ErrorType","ArrayResult","values","rows","cols","getValue","row","col","isSingleValue","getSingleValue","toFlatArray","fromVerticalArray","v","fromHorizontalArray","from2DArray","normalized","newRow","fromSingleValue","parserInstance","CalxInterpreter","getBaseCstVisitorConstructorWithDefaults","validateVisitor","setContext","context","yy","getContext","ctx","separators","sort","currentRow","expressions","exp","left","lhs","rhs","right","operators","rightValue","operator","arrayOperation","operation","isError","leftArray","rightArray","resultLength","leftVal","min","rightVal","Number","str","ref","sheetName","resolveVariable","resolveCellReference","resolveCellRange","resolveRowRange","resolveColumnRange","condition","isTruthy","whenTrue","whenFalse","funcName","expr","callFunction","excelEpoch","msPerDay","getFunction","executeBuiltInFunction","isErrorValue","valueIfError","conditions","results","arrayExpression","getNamedRange","workbook","nameManager","getVariable","getCellValue","getCellRange","getRowRange","getColumnRange","includes","reduce","sum","flattenAndSum","isNaN","flattenedArray","flattenArray","filter","arrayMax","arrayMin","every","some","arr","flat","parseInput","cleanInput","startsWith","parseCst","ERROR","Range","sheet","address","_cells","_address","parseAddress","loadCells","cleanAddress","addr","_startAddress","trim","_endAddress","isSingleCell","cell","getCellDirect","expandRange","cells","startCol","startRow","endCol","endRow","startColNum","colToNum","endColNum","minRow","maxRow","minCol","maxCol","numToCol","getValues","setValuesFromArray","formula","cellIndex","rowData","setValues","toArray","calculate","columns","each","callback","find","getCellAt","getCellAtPosition","num","fromCharCode","getRange","SheetEvent","SheetState","DataType","DateUtil","serialToDate","serialDate","epochDate","ms","MS_PER_DAY","dateToSerial","date","isValidSerialDate","fromComponents","year","month","day","toComponents","getFullYear","getMonth","getDate","weekday","getDay","hours","getHours","minutes","getMinutes","seconds","getSeconds","toISOString","fromISOString","isoString","today","setHours","EXCEL_EPOCH","Cell","_type","NUMBER","_rules","precedents","dependents","remotePrecedents","remoteDependents","dynamicPrecedents","_dirty","_calculated","_hasRemotePrecedents","_hasRemoteDependents","_hasDynamicPrecedents","_isArrayAnchor","init","mount","el","dispatcher","dispatch","ELEMENT_MOUNTED","isEmpty","rawValue","_computed","_value","_formula","eval","handleArrayResult","valueChanged","CALCULATED","_markDependentsAsDirty","autoCalculate","_recalculateDependents","arrayResult","_arrayResult","checkSpillRange","spillArray","SPILL","getCellCoordinates","r","c","targetAddress","coordinatesToAddress","targetCell","getCell","_spillRange","colStr","isArrayAnchor","getSpillRange","setFormat","format","setFormatter","formatter","getFormattedValue","isCalculated","isDirty","markAsDirty","isNumeric","parseFloat","oldFormula","updateDynamicPrecedents","FORMULA_CHANGED","newFormula","oldPrecedents","getPrecedents","precedent","removeDependent","rebuildDependencies","builder","setWorkbook","localDeps","remoteDeps","getFormulaDependencies","dependencies","precedentCell","addDependent","setPrecedents","remoteRef","cellAddress","parseRemoteReference","targetSheet","getSheet","addRemoteDependent","addRemotePrecedent","parsed","BOOLEAN","DATE","DATETIME","TIME","upperValue","parts","VALUE_CHANGED","invalidateDynamicDependents","recalculateDirtyCells","getDependents","dependent","getStringValue","getNumericValue","getDateValue","getSerialDateValue","setDateValue","setSerialDateValue","getFormattedDate","isDate","addPrecedent","setDependents","columnRanges","rowRanges","columnPattern","rowPattern","beforeMatch","hasDynamicPrecedents","dependsOnColumn","colNum","columnToNumber","dependsOnRow","CellRegistry","event","add","CELL_ADDED","remove","CELL_REMOVED","CELL_CREATED","all","filtered","Sheet","EventDispatcher","_states","calculation","CALCULATION_IDLE","_variables","_autoCalculate","_id","_generateId","random","wasAutoCalculate","element","setAttribute","id","_el","ELEMENT_ATTACHED","listen","withoutEvent","pauseListener","_depTree","calculationOrder","topologicalSort","level","resumeListener","requestCalculate","depAddress","cellAddr","createCell","setActiveSheet","parser","buildDependencyTree","DependencyBuilder","build","setVariable","getCellRangeValues","startColMatch","startRowMatch","endColMatch","endRowMatch","getRowRangeValues","allCells","rowMatch","getColumnRangeValues","colMatch","nil","div0","na","flattenShallow","aIsArray","bIsArray","isFlat","flatten","argument","argsToArray","arrayEach","numbers","cleanFloat","power","round","parseBool","bool","up","parseNumber","parseString","parseNumberArray","len","parseDate","serial","utc_days","date_info","fractional_day","total_seconds","days","getUTCDate","getUTCMonth","getUTCFullYear","serialNumberToDate","parseDateArray","anyError","isDefined","arg","anyIsError","anyIsString","arrayValuesToNumbers","d1900","UTC","WEEK_STARTS","WEEK_TYPES","WEEKEND_TYPES","DATEDIF","start_date","end_date","unit","start_date_year","start_date_month","start_date_day","end_date_year","end_date_month","end_date_day","YEARFRAC","DAYS","setFullYear","setMonth","DATEVALUE","date_text","DAY","serial_number","startOfDay","newDate","DAYS360","method","sm","sd","ed","em","smd","emd","EDATE","months","EOMONTH","HOUR","INTERVAL","second","hour","sec","ISOWEEKNUM","setDate","yearStart","ceil","MINUTE","MONTH","NETWORKDAYS","holidays","INTL","NOW","SECOND","minute","TIMEVALUE","time_text","TODAY","WEEKDAY","return_type","WEEKNUM","week_start","jan","inc","abs","WORKDAY","YEAR","isLeapYear","daysBetween","basis","sy","ey","feb29Between","date1","date2","year1","mar1year1","year2","mar1year2","ylength","years","average","addOn","weekend","isMask","maskDays","maskIndex","maskRegex","h","total","getTimezoneOffset","getUTCDay","dec","holiday","defaultOperator","validSymbols","_TOKEN_TYPE_OPERATOR","_TOKEN_TYPE_LITERAL","SUPPORTED_TOKENS","TOKEN_TYPE_OPERATOR","TOKEN_TYPE_LITERAL","indexOf","literalValue","analyzedTokens","castValueToCorrectType","unshift","analyzeTokens","expressionLength","cursorIndex","processedValue","processedSymbol","tokenizeExpression","compute","evaluate","CELL","INFO","ISBLANK","ISBINARY","ISERR","value$1","isFinite","ISERROR","ISEVEN","ISFORMULA","ISLOGICAL","ISNA","ISNONTEXT","ISNUMBER","ISODD","ISREF","ISTEXT","N","SHEET","SHEETS","TYPE","CHOOSE","COLUMN","reference","COLUMNS","HLOOKUP","lookup_value","table_array","row_index_num","range_lookup","VLOOKUP","matrix","INDEX","row_num","column_num","someError","isOneDimensionRange","LOOKUP","result_array","isNumberLookup","localeCompare","MATCH","lookup_array","match_type","indexValue","lookupValueStr","toLowerCase","ROWS","TRANSPOSE","UNIQUE","hasElement","col_index_num","exactMatchOnly","error_val","SQRT2PI","AVEDEV","flatArgumentsDefined","subtract","AVERAGE","AVERAGEA","AVERAGEIF","criteria","average_range","average_count","isWildcard","tokenizedCriteria","AVERAGEIFS","criteriaLength","isMeetCondition","computedResult","BETA","x","alpha","beta","cumulative","cdf","pdf","probability","inv","BINOM","number_s","trials","probability_s","DIST","RANGE","number_s2","COMBIN","INV","CHISQ","deg_freedom","RT","TEST","actual_range","expected_range","tmp","dof","xsqr","Pi","PI","sqrt","ChiSq","CONFIDENCE","CORREL","array1","array2","COUNT","COUNTA","flatArguments","COUNTBLANK","COUNTIN","blanks","COUNTIF","matches","COUNTIFS","COUNTUNIQUE","NORM","standard_dev","T","COVARIANCE","DEVSQ","mean","P","mean1","mean2","S","EXPON","lambda","F","FISHER","FISHERINV","y","e2y","FORECAST","known_ys","known_xs","xmean","ymean","den","FREQUENCY","data_array","bins_array","GAMMA","GAMMALN","GAUSS","z","GEOMEAN","GROWTH","known_y","known_x","new_x","use_const","avg_x","avg_y","avg_xy","avg_xx","new_y","HARMEAN","deg_freedom1","deg_freedom2","sumOfSquares","x1","SUM","x2","PRECISE","HYPGEOM","INTERCEPT","KURT","sigma","LARGE","LINEST","m","LOGEST","sample_s","number_sample","population_s","number_pop","M","LOGNORM","MAX","MAXA","MEDIAN","MIN","MINA","MODE","currentItem","maxItems","MULT","NEGBINOM","number_f","PEARSON","den1","den2","PERCENTILE","l","fl","PERCENTRANK","PERMUT","number_chosen","FACT","PERMUTATIONA","PHI","EXC","significance","uniques","INC","POISSON","PROB","x_range","prob_range","lower_limit","upper_limit","sorted","QUARTILE","quart","RANK","ROW","RSQ","SKEW","SLOPE","SMALL","STANDARDIZE","AVG","order","EQ","m2","m3","STDEV","STDEVA","VARA","STDEVPA","VARPA","STEYX","lft","VAR","T$1","TREND","new_xs","linest","TRIMMEAN","percent","FLOOR","mean_x","mean_y","s_x","s_y","WEIBULL","Z","ABS","ACOS","acos","ACOSH","ACOT","atan","ACOTH","AGGREGATE","function_num","ref1","ref2","PRODUCT","SNGL","ARABIC","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I","ASIN","asin","ASINH","ATAN","ATAN2","x_num","y_num","atan2","ATANH","BASE","radix","min_length","anyError$1","CEILING","mode","precision","ROUND","COMBINA","COS","cos","COSH","COT","tan","COTH","e2","CSC","sin","CSCH","DECIMAL","DEGREES","angle","EVEN","EXP","MATH","MEMOIZED_FACT","FACTDOUBLE","GCD","r0","ri","INT","ISO","LCM","o","LN","LN10","LN2","LOG10E","LOG2E","LOG","base","LOG10","MOD","divisor","modulus","MROUND","multiple","MULTINOMIAL","ODD","temp","E","POWER","QUOTIENT","numerator","denominator","RADIANS","RAND","RANDBETWEEN","bottom","top","ROMAN","digits","roman","num_digits","ROUNDDOWN","ROUNDUP","SEC","SECH","SERIESSUM","coefficients","SIGN","SIN","SINH","SQRT","SQRTPI","SQRT1_2","SQRT2","SUBTOTAL","ADD","num1","num2","MINUS","DIVIDE","dividend","MULTIPLY","factor1","factor2","GT","GTE","LT","LTE","value1","value2","NE","POW","exponent","inner_result","SUMIF","sum_range","sumValue","SUMIFS","shift","criterias","valueToTest","SUMPRODUCT","arrays","product","_i","_ij","_ij_arg","_i_arg","SUMSQ","SUMX2MY2","array_x","array_y","SUMX2PY2","SUMXMY2","TAN","TANH","TRUNC","ASC","BAHTTEXT","CHAR","CLEAN","CODE","CONCATENATE","trueFound","falseFound","CONCAT","DBCS","DOLLAR","decimals","style","currency","minimumFractionDigits","maximumFractionDigits","formattedNumber","toLocaleString","EXACT","text1","text2","FIND","find_text","within_text","start_num","found_index","FIXED","no_commas","factor","toFixed","HTML2TEXT","LEFT","num_chars","LEN","LOWER","MID","NUMBERVALUE","decimal_separator","group_separator","PRONETIC","PROPER","txt","substr","REGEXEXTRACT","regular_expression","REGEXMATCH","full","REGEXREPLACE","replacement","REPLACE","old_text","new_text","REPT","number_times","RIGHT","SEARCH","foundAt","SPLIT","SUBSTITUTE","instance_num","TEXT","currencySymbol","isPercent","endsWith","TEXTJOIN","delimiter","ignore_empty","flatArgs","textToJoin","chunks","TRIM","UNICHAR","UNICODE","UPPER","VALUE","output","isValidBinaryNumber","BESSELI","bessel","besseli","BESSELJ","besselj","BESSELK","besselk","BESSELY","bessely","BIN2DEC","stringified","BIN2HEX","places","BIN2OCT","BITAND","number1","number2","BITLSHIFT","shift_amount","BITOR","BITRSHIFT","BITXOR","COMPLEX","real_num","i_num","suffix","sign","CONVERT","from_unit","to_unit","units","binary_prefixes","Yi","Zi","Ei","Ti","Gi","Mi","ki","unit_prefixes","Y","G","u","f","base_from_unit","base_to_unit","from_multiplier","to_multiplier","from_binary_prefix","from_unit_prefix","to_binary_prefix","to_unit_prefix","DEC2BIN","DEC2HEX","DEC2OCT","DELTA","ERF","ERFC","GESTEP","step","HEX2BIN","negative","decimal","HEX2DEC","HEX2OCT","IMABS","inumber","IMREAL","IMAGINARY","plus","minus","last","IMARGUMENT","IMCONJUGATE","IMCOS","IMCOSH","IMCOT","IMDIV","IMSIN","inumber1","inumber2","unit1","unit2","IMEXP","IMLN","IMLOG10","IMLOG2","IMPOWER","IMPRODUCT","IMSEC","IMSECH","IMSINH","IMSQRT","IMCSC","IMCSCH","IMSUB","IMSUM","IMTAN","OCT2BIN","OCT2DEC","OCT2HEX","BETADIST","BETAINV","BINOMDIST","CEILINGMATH","CEILINGPRECISE","CHIDIST","CHIDISTRT","CHIINV","CHIINVRT","CHITEST","COVAR","COVARIANCEP","COVARIANCES","CRITBINOM","ERFCPRECISE","ERFPRECISE","EXPONDIST","FDIST","FDISTRT","FINV","FINVRT","FLOORMATH","FLOORPRECISE","FTEST","GAMMADIST","GAMMAINV","GAMMALNPRECISE","HYPGEOMDIST","LOGINV","LOGNORMDIST","LOGNORMINV","MODEMULT","MODESNGL","NEGBINOMDIST","NETWORKDAYSINTL","NORMDIST","NORMINV","NORMSDIST","NORMSINV","PERCENTILEEXC","PERCENTILEINC","PERCENTRANKEXC","PERCENTRANKINC","POISSONDIST","QUARTILEEXC","QUARTILEINC","RANKAVG","RANKEQ","SKEWP","STDEVP","STDEVS","TDIST","TDISTRT","TINV","TTEST","VARP","VARS","WEIBULLDIST","WORKDAYINTL","ZTEST","compact","FINDFIELD","database","title","findResultIndex","maxCriteriaLength","currentCriteriaResult","hasMatchingCriteria","criteriaField","DAVERAGE","field","resultIndexes","targetFields","DCOUNT","targetValues","DCOUNTA","DGET","DMAX","maxValue","DMIN","minValue","DPRODUCT","DSTDEV","DSTDEVP","DSUM","DVAR","DVARP","validDate","ensureDate","ACCRINT","issue","first_interest","settlement","rate","par","frequency","ACCRINTM","AMORDEGRC","AMORLINC","COUPDAYBS","COUPDAYS","COUPDAYSNC","COUPNCD","COUPNUM","COUPPCD","CUMIPMT","nper","pv","start_period","end_period","payment","PMT","interest","FV","CUMPRINC","principal","DB","cost","salvage","life","period","initial","current","ceiling","DDB","DISC","DOLLARDE","fractional_dollar","fraction","DOLLARFR","decimal_dollar","DURATION","EFFECT","nominal_rate","npery","FVSCHEDULE","schedule","future","INTRATE","IPMT","per","fv","IRR","guess","irrResult","dates","irrResultDeriv","frac","positive","newRate","epsRate","resultValue","resultRate","contLoop","ISPMT","MDURATION","MIRR","finance_rate","reinvest_rate","payments","incomes","NPV","NOMINAL","effect_rate","NPER","pmt","ODDFPRICE","ODDFYIELD","ODDLPRICE","ODDLYIELD","PDURATION","PPMT","PRICE","PRICEDISC","PRICEMAT","PV","RATE","epsMax","dy","df","RECEIVED","RRI","SLN","SYD","TBILLEQ","maturity","discount","TBILLPRICE","TBILLYIELD","pr","VDB","XIRR","XNPV","YIELD","YIELDDISC","YIELDMAT","AND","FALSE","IF","logical_test","value_if_true","value_if_false","IFS","IFERROR","value_if_error","IFNA","value_if_na","NOT","logical","TRUE","XOR","SWITCH","targetValue","argc","switchCount","switchSatisfied","hasDefaultClause","defaultClause","FLATTEN","ARGS2ARRAY","REFERENCE","opening","JOIN","NUMBERS","FormulaJSWrapper","upperName","Calx","formulae","sequenceFunction","bind","sortFunction","filterFunction","uniqueFunction","fn","sortIndex","sortOrder","byCol","arr2D","colIdx","aVal","bVal","include","ifEmpty","include1D","includeVal","exactlyOnce","was1D","unique","seen","convertArg","isDynamicArrayFunction","getAvailableFunctions","hasFunction","SharedContext","sheets","_formulaJSWrapper","activeSheet","addSheet","resolve","numToStr","strToNum","chars","getCellsInRange","regex","rangeStart","rangeEnd","boundaries","cellRange","isValidBinary","strRepeat","qty","repeat","arrayMerge","objectToArray","trimEmptyCell","rangeToTable","alphaPattern","numPattern","arrayTable","resultTable","colLength","resultRow","rowLength","transposeTable","table","newTable","NameManager","_nameRegistry","_workbook","comment","isValidName","getReference","namedRange","getActiveSheet","getSheets","sheetNames","getAll","Comparator","equal","notEqual","lessThan","greaterThan","lessEqualThan","greaterEqualThan","createParser","interpreter","Workbook","_sheets","_parser","_dispatcher","_nameManager","isValidCellAddress","_deps","_depsBuilder","hydrateObj","createSheet","loadData","cellKey","cellData","createFromData","sharedContext","utility","comparator","createFromElement","setFormula","setFormulae","createWorkbook","createWorkbookFromData","createWorkbookFromElement","createInterpreter","every_1","alreadyVisited","AbstractProduction","nativeKeys","overArg","stubFalse","mapCacheClear","mapCacheDelete","mapCacheGet","mapCacheHas","mapCacheSet","baseIsMatch","getMatchData","matchesStrictComparable","resIndex","symbol","baseSlice","asciiToArray","unicodeToArray","SetCache","arrayIncludes","arrayIncludesWith","baseUnary","cacheHas","isCommon","valuesLength","outer","computed","valuesIndex","GastRefResolverVisitor","resolveGrammar","refResolver","resolveRefs","nameToTopRule","UNRESOLVED_SUBRULE_REF","unresolvedRefName","identity","nodeAny","visitRule","trimmedEndIndex","reTrimStart","transform","possiblePathsFrom","NextTerminalAfterAtLeastOneSepWalker","NextTerminalAfterAtLeastOneWalker","NextTerminalAfterManySepWalker","NextTerminalAfterManyWalker","AbstractNextTerminalAfterProductionWalker","AbstractNextPossibleTokensWalker","rest_1","first_2","topProd","possibleTokTypes","nextProductionName","nextProductionOccurrence","found","isAtEndOfPath","reverse","occurrenceStack","updateExpectedNext","fullRest","nextTerminalName","nextTerminalOccurrence","lastTok","lastTokOccurrence","restProd","isEndOfRule","firstAfterMany","firstAfterManySep","firstAfterAtLeastOne","atleastOneSepProd","firstAfterfirstAfterAtLeastOneSep","expandTopLevelRule","currRuleStack","currOccurrenceStack","newRuleStack","newCurrOccurrenceStack","targetDef","maxLength","getAlternativesForProd","newDef","partialPath","suffixDef","initialDef","tokMatcher","maxLookAhead","EXIT_NON_TERMINAL","EXIT_NON_TERMINAL_ARR","EXIT_ALTERNATIVE","foundCompletePath","tokenVectorLength","minimalAlternativesIndex","possiblePaths","currDef","nextPath","nextIdx","nextTokenType","nextTokenOccurrence","newOccurrenceStack","nextPathWithout","nextPathWith","secondIteration","separatorGast","nthRepetition","currAltPath","Set","noop","createSet","defineNameProp","nameValue","writable","arrayFilter","stubArray","nativeGetSymbols","getOwnPropertySymbols","defaults","propsIndex","propsLength","baseFindIndex","BESSEL","version","_horner","_bessel_iter","f0","f1","tdx","f2","_bessel_wrap","bessel0","bessel1","nonzero","NaN","W","b0_a1a","b0_a2a","b0_a1b","b0_a2b","b1_a1a","b1_a2a","b1_a1b","b1_a2b","b0_a","b0_b","b1_a","b1_b","a1","a2","xx","ret","jsum","bjp","bj","bjm","tox","bip","bi","bim","DO_NOT_EXPORT_BESSEL","freeGlobal","g","isFunction","isLength","typedArrayTags","IN","minOptimizationVal","buildLineBreakIssueMessage","isShortPattern","isCustomPattern","addStickyFlag","addStartOfInput","findUnreachablePatterns","findModesThatDoNotExist","findInvalidGroupType","findDuplicatePatterns","findUnsupportedFlags","findStartOfInputAnchor","findEmptyMatchRegExps","findEndOfInputAnchor","findInvalidPatterns","findMissingPatterns","enableSticky","disableSticky","MODES","indexOf_1","isString_1","find_1","isRegExp_1","defaults_1","reg_exp_1","PATTERN","tokenTypesWithMissingPattern","currType","MISSING_PATTERN","valid","tokenTypesWithInvalidPattern","INVALID_PATTERN","onlyRelevantTypes","useSticky","debug","action","charCodeToOptimizedIdxMap","initCharCodeToOptimizedIndexMap","allTransformedPatterns","patternIdxToType","patternIdxToGroup","patternIdxToLongerAltIdxArr","patternIdxToPushMode","patternIdxToPopMode","patternIdxToCanLineTerminator","patternIdxToIsCustom","patternIdxToShort","regExpSource","escapedRegExpString","wrappedRegExp","clazz","groupName","GROUP","longerAltType","LONGER_ALT","lineTerminatorCharCodes","getCharCodes","LINE_BREAKS","checkLineBreaksIssues","canMatchCharCode","acc","optimizedIdx","addToMapOfArrays","START_CHARS_HINT","lastOptimizedIdx_1","charOrInt","currOptimizedIdx","failedOptimizationPrefixMsg","optimizedCodes","getOptimizedStartCodesIndices","code","validModesNames","missingResult","invalidResult","validTokenTypes","withRegExpPatterns","validateRegExpPattern","end_of_input","EndAnchorFinder","invalidRegex","regexpAst","endAnchorVisitor","EOI_ANCHOR_FOUND","matchesEmptyString","EMPTY_MATCH_PATTERN","start_of_input","StartAnchorFinder","startAnchorVisitor","SOI_ANCHOR_FOUND","invalidFlags","multiline","UNSUPPORTED_FLAGS_FOUND","identicalPatterns","outerType","innerType","duplicatePatterns","currIdenticalSet","setOfIdentical","tokenTypeNames","dupPatternSrc","DUPLICATE_PATTERNS_FOUND","invalidTypes","INVALID_GROUP_TYPE_FOUND","validModes","invalidModes","PUSH_MODE_DOES_NOT_EXIST","canBeTested","metaChars","testIdx","testTokenType","UNREACHABLE_PATTERN","IDENTIFY_TERMINATOR","CUSTOM_LINE_BREAK","details","charsOrCodes","numOrString","MULTI_MODE_LEXER_WITHOUT_DEFAULT_MODE","MULTI_MODE_LEXER_WITHOUT_MODES_PROPERTY","MULTI_MODE_LEXER_DEFAULT_MODE_VALUE_DOES_NOT_EXIST","LEXER_DEFINITION_CANNOT_CONTAIN_UNDEFINED","currLongerAlt","MULTI_MODE_LEXER_LONGER_ALT_NOT_IN_CURRENT_MODE","warnings","hasAnyLineBreak","allTokenTypes","concreteTokenTypes","terminatorCharCodes","currIssue","NO_LINE_BREAKS_FLAGS","clonedResult","groupKeys","currKey","currGroupValue","isMasked","toSource","reIsHostCtor","funcProto","Function","funcToString","reIsNative","baseMap","baseMatches","baseMatchesProperty","property","coreJsData","Ctor","baseCreate","getPrototype","eachFunc","DataView","_listeners","_isEventPaused","listener","listeners","addListener","hasListener","removeListener","listenerArray","eventName","eventData","target","__spreadArray","pack","ar","leftRecursionErrors","emptyAltErrors","validateEmptyOrAlternatives","ambiguousAltsErrors","emptyRepetitionErrors","buildLookaheadFuncForOr","buildAlternativesLookAheadFunc","buildLookaheadFuncForOptionalProd","buildSingleAlternativeLookaheadFunction","seenIndex","upperFirst","createCaseFirst","WeakMap","mapTag","promiseTag","setTag","weakMapTag","dataViewTag","dataViewCtorString","mapCtorString","promiseCtorString","setCtorString","weakMapCtorString","ArrayBuffer","ctorString","baseValues","spreadableSymbol","isConcatSpreadable","arrLength","othLength","arrStacked","arrValue","othIndex","arrayLikeKeys","grammar","_b","_c","resourceBase","_d","css","freeProcess","process","nodeUtil","require","types","binding","generator","CstNodeDefinitionGenerator","rawElements","visitEach","grouped","propertyName","properties","allNullable","canBeNull","propertyType","optional","visitEachAndOverrideWith","getType","override","production","kind","baseIsNative","baseIsNaN","strictIndexOf","createAssigner","dataView","buildInProdFollowPrefix","buildBetweenProdsFollowPrefix","computeAllProdsFollows","ResyncFollowsWalker","constants_1","follows","followName","t_in_topProd_follows","inner","occurenceInParent","topProductions","reSyncFollows","currRefsFollow","firstCharOptimizedIndices","complementErrorMessage","ast","addOptimizedIdxToResult","rangeCode","minUnOptVal","maxUnOptVal","minOptIdx","maxOptIdx","currOptIdx","isOptionalQuantifier","isWholeOptional","upperChar","lowerChar","handleIgnoreCase","findCode","setNode","targetCharCodes","codeOrRange","range_1","targetCode","msgSuffix","CharCodeFinder","charCodes","charCodeFinder","baseDifference","isArrayLikeObject","difference","toBecomeFast","FakeConstructor","fakeInstance","fakeAccess","bar","Parser","follow_1","gast_resolver_public_1","recoverable_1","looksahead_1","tree_builder_1","lexer_adapter_1","recognizer_api_1","recognizer_engine_1","error_handler_1","context_assist_1","gast_recorder_1","perf_tracer_1","apply_mixins_1","nodeLocationTracking","recoveryValueFunc","resyncEnabled","tokenVocabulary","initErrorHandler","initRecognizerEngine","initRecoverable","initTreeBuilder","defErrorsMsgs","recordedRuleGast","originalGrammarAction","resolverErrors","validationErrors","tokensMap","lookaheadValidationErrors","allFollows","resyncFollows","initialize","DEFER_DEFINITION_ERRORS_HANDLING","applyMixins","Recoverable","TreeBuilder","RecognizerEngine","ErrorHandler","configClone","upperFirst_1","getTypeString","getNodeInterfaceName","getNodeChildrenTypeName","nodes","contentParts","nodeCstInterface","nodeInterfaceName","childrenTypeName","genNodeInterface","nodeChildrenInterface","typeName","typeNames","buildTypeString","genChildProperty","genNodeChildrenType","genCstNodeTypes","genVisitorFunction","jStat","calcRdx","isNumber","_init","retZero","retOne","retIdent","utils","toVector","_random_fn","setRandom","extend","dimensions","rowa","submat","arange","ind","cola","diag","nrow","res","antidiag","transpose","objArr","toAlter","ncol","cumreduce","alter","zeros","ones","rand","symmetric","cnt","hival","rl","_slice","list","rcSlice","colSlice","rowSlice","sliceAssign","A","B","nl","ml","diagonal","diagArray","mat","jProto","funcs","passfunc","setTimeout","ascNum","clip","sumsqrd","sumsqerr","sumrow","low","high","hash","_arr","meansqerr","geomean","logs","meanOfLogs","median","arrlen","cumsum","cumprod","diff","diffs","arrLen","rank","distinctNumbers","numberCounts","sortedDistinctNumbers","numberRanks","currentRank","maxCount","numMaxCount","mode_arr","variance","flag","pooledvariance","samples","deviation","dev","stdev","pooledstdev","meandev","meddev","coeffvar","quartiles","quantiles","quantilesArray","alphap","betap","aleph","gamma","sortedArray","quantileVals","percentile","exclusive","realIndex","percentileOfScore","score","counter","strict","histogram","binCnt","binWidth","bins","covariance","arr1","arr2","arr1Len","sq_dev","corrcoeff","spearmancoeff","stanMoment","mu","skewSum","skewness","kurtosis","fullbool","tmpthis","callbackFunction","argsToPass","curriedFunction","vector","gammaln","cof","ser","loggam","x0","xp","gl","gl0","gammafn","yi","q","fact","xden","xnum","gammap","lowRegGamma","an","aln","ap","del","ITMAX","factorialln","factorial","combination","combinationln","permutation","betafn","betaln","betacf","aa","fpmin","qab","qap","qam","gammapinv","pp","lna1","afac","gln","erf","ty","isneg","dd","erfc","erfcinv","err","ibetainv","lna","lnb","al","w","b1","ibeta","bt","randn","randg","shape","oalph","betinc","eps","c9","a0","b0","m9","tukeyWprob","rr","xleg","aleg","qsqz","wincr","pr_w","normal","blb","binc","bub","einsum","cc1","wi","elsum","jj","ac","qexpo","rinsum","newthis","sample","vals","fnfunc","centralF","df1","df2","binomial","cauchy","local","scale","chisquare","exponential","invgamma","kumaraswamy","lognormal","noncentralt","ncp","studentt","tol","flip","prob","lastvalue","std","pareto","dof2","weibull","uniform","betacdf","negbin","hypgeom","scaledPDF","samplesDone","scaledCDF","poisson","sumarr","sampleSmall","sampleLarge","U","slam","loglam","invalpha","vr","us","lam","triangular","arcsine","laplace","tukey","nmeans","xlegq","alegq","ulen","f2lf","f21","ff4","ans","otsum","twa1","t1","ps","tukeyQinv","valx0","valx1","iter","isUsable","divide","multiply","nrescols","rescols","dot","norm","nnorm","aug","newarr","gauss_jordan","det","determinant","submatrix","gauss_elimination","maug","pivot","y2","maxrow","triaUpSolve","matrix_mode","triaLowSolve","lu","R","cholesky","gauss_jacobi","xv","xk","gauss_seidel","SOR","householder","QR","lstsq","array_mode","Q","attrs","Q1","RI","Aj","cAi","Ij","cIi","R_I","Q2","jacobi","maxim","theta","ev","rungekutta","t_j","u_j","k1","k2","k3","romberg","h1","richardson","pos","y1","h_min","simpson","hermite","dF","dl","lagrange","cubic_spline","sq","gauss_quadrature","PCA","temp1","Bt","temp2","Vt","differenceOfProportions","p1","n1","p2","n2","pooled","zscore","ztest","sides","tscore","ttest","anovafscore","expVar","sampMean","sampSampMean","tmpargs","unexpVar","anovaftest","ftest","fscore","anovaftes","qscore","qtest","tukeyhsd","means","normalci","change","tci","significant","pvalue","oneSidedDifferenceOfProportions","twoSidedDifferenceOfProportions","models","ols","endog","exog","nobs","df_model","df_resid","coef","predict","resid","ybar","SSE","SSR","SST","R2","t_test","var_count","subModelList","endog_index","exog_index","sigmaHat","seBetaHat","tStatistic","pValue","leftppf","interval95","se","F_statistic","F_test","adjust_R2","buildxmatrix","matrixRows","builddxmatrix","buildjxmatrix","jMat","pass","buildymatrix","buildjymatrix","matrixmult","regress","jMatX","jMatY","innerinv","xtranspxinv","xtransp","next","regresst","compile","jMatYBar","yBar","yAverage","anova","residuals","ssr","msr","sse","mse","sst","mst","r2","fratio","rmse","r2adj","stats","sds","ts","covar","xtranspx","matrixsubtract","createBaseFor","otherArgs","addNoneTerminalToCst","addTerminalToCst","setNodeLocationFull","setNodeLocationOnlyOffset","currNodeLocation","newLocationInfo","tokenTypeName","ruleResult","BITS_FOR_ALT_IDX","BITS_FOR_RULE_IDX","BITS_FOR_METHOD_TYPE","ruleIdx","equalByTag","equalObjects","argsTag","arrayTag","objectTag","objIsArr","othIsArr","objTag","othTag","objIsObj","othIsObj","isSameTag","objIsWrapped","othIsWrapped","objUnwrapped","othUnwrapped","baseIsTypedArray","nodeIsTypedArray","derivedCtor","baseCtors","baseCtor","baseProto","getOwnPropertyNames","propName","basePropDescriptor","getOwnPropertyDescriptor","cloneDataView","cloneRegExp","cloneSymbol","cloneTypedArray","isObject_1","shortRuleNameToFull","ruleShortNameIdx","subruleIdx","RULE_STACK","RULE_OCCURRENCE_STACK","allTokenTypes_1","uniqueTokens","noTokenCategoriesUsed","tokenConstructor","invokeRuleWithTry","shortName","ruleInvocationStateUpdate","CST_STACK","cstPostRule","invokeRuleCatch","ruleFinallyStateUpdate","resyncEnabledConfig","isFirstInvokedRule","reSyncEnabled","isBackTracking","recogError","partialCstResult","reSyncTokType","findReSyncTokenType","isInCurrentRuleReSyncSet","reSyncTo","recoveredNode","optionInternalLogic","lookAheadFunc","predicate_1","orgLookaheadFunction_1","laKey","atLeastOneInternalLogic","predicate_2","orgLookaheadFunction_2","raiseEarlyExitException","PROD_TYPE","REPETITION_MANDATORY","ERR_MSG","notStuck","doSingleRepetition","attemptInRepetitionRecovery","atLeastOneSepFirstInternalLogic","REPETITION_MANDATORY_WITH_SEPARATOR","separatorLookAheadFunc","repetitionSepSecondInternal","manyInternalLogic","lookaheadFunction","predicate_3","orgLookaheadFunction_3","manySepFirstInternalLogic","nextTerminalAfterWalker","beforeIteration","altIdxToTake","raiseNoAltException","cstFinallyStateUpdate","isAtEndOfInput","firstRedundantTok","getCurrRuleFullName","SAVE_ERROR","ARGS","cstPostNonTerminal","subruleInternalError","consumedToken","nextToken","consumeInternalError","eFromConsumption","consumeInternalRecovery","cstPostTerminal","getFollowsForInRuleRecovery","tryInRuleRecovery","eFromInRuleRecovery","IN_RULE_RECOVERY_EXCEPTION","savedErrors","savedRuleStack","lexerState","fullName","idxInCallingRule","cstInvocationStateUpdate","shortRuleNameToFullName","stackClear","stackDelete","stackGet","stackHas","stackSet","baseKeysIn","baseGet","uid","maskSrcKey","IE_PROTO","createFind","toNumber","INFINITY","baseSet","paths","cst_1","cst_visitor_1","setNodeLocationFromToken","setNodeLocationFromNode","setInitialNodeLocation","setInitialNodeLocationFullRecovery","cstPostRuleFull","setInitialNodeLocationFullRegular","setInitialNodeLocationOnlyOffsetRecovery","cstPostRuleOnlyOffset","setInitialNodeLocationOnlyOffsetRegular","cstNode","location","fullRuleName","ruleCstNode","prevToken","rootCst","ruleCstResult","preCstNode","getBaseCstVisitorConstructor","baseCstVisitorConstructor","newBaseCstVisitorConstructor","createBaseSemanticVisitorConstructor","baseCstVisitorWithDefaultsConstructor","newConstructor","createBaseVisitorConstructorWithDefaults","getPreviousExplicitRuleShortName","getLastExplicitRuleOccurrenceIndex","isSymbol","symbolToString","baseFilter","baseIsMap","nodeIsMap","isMap","_errors","getHumanReadableRuleStack","ruleOccurrenceStack","newErrors","userDefinedErrMsg","ruleGrammar","insideProdPaths","actualTokens","errMsgTypes","lookAheadPathsPerAlternative","hasIn","negate","defaultValue","InRuleRecoveryException","EOF_FOLLOW_KEY","firstAfterRepMap","getTokenToInsert","tokToInsert","isInsertedInRecovery","canTokenTypeBeInsertedInRecovery","canTokenTypeBeDeletedInRecovery","tryInRepetitionRecovery","grammarRuleArgs","expectedTokType","savedLexerState","passedResyncPoint","nextTokenWithoutResync","generateErrorMessage","addToResyncTokens","shouldInRepetitionRecoveryBeTried","expectTokAfterLastMatch","nextTokIdx","canPerformInRuleRecovery","tokIdxInRule","getCurrentGrammarPath","canRecoverWithSingleTokenInsertion","canRecoverWithSingleTokenDeletion","nextTok","expectedToken","mismatchedTok","possibleFollowsTokType","followKey","getCurrFollowKey","currentRuleReSyncSet","getFollowSetFromFollowKey","allPossibleReSyncTokTypes","flattenFollowSet","foundMatch","resyncTokType","currRuleIdx","prevRuleShortName","inRule","buildFullFollowKeyStack","explicitRuleStack","explicitOccurrenceStack","followStack","resyncTokens","prodFunc","lookaheadFunc","nextToksWalker","currShortName","firstAfterRepInfo","DependencyTree","cellRegistry","depTree","buildTree","_updateGraph","levels","visited","cellLevels","calculateLevel","maxLevel","precedentLevel","flattenToTopology","getDepth","_getDepth","tree","patterns","remoteColumnRange","remoteRowRange","remoteCellRange","remoteCell","columnRange","rowRange","remoteSheet","remoteCellObj","cleanFormula","remoteColumnMatches","remoteRowMatches","remoteCellRangeMatches","sheetPart","rangePart","expandCellRange","remoteCellMatches","cellRangeMatches","cellMatches","isFunctionOrKeyword","identifierMatches","identifier","addresses","baseIsSet","nodeIsSet","isSet","_definition","visitor","convertDefinition","serializedNonTerminal","serializedTerminal","terminalLabel","topRules","reIsDeepProp","reIsPlainProp","areTokenCategoriesNotUsed","lookAheadSequenceFromAlternatives","REPETITION","REPETITION_WITH_SEPARATOR","ALTERNATION","laFuncBuilder","lookAheadPaths","lookaheadBuilder","numOfAlts","areAllOneTokenLookahead","orAlts","predicates","currNumOfPaths","currPredicate","currPathLength","singleTokenAlts","choiceToAlt_1","currExtendingType","numOfPaths","singleTokensTypes","expectedTokenUniqueKey_1","choiceToAlt_2","RestDefinitionFinderWalker","targetOccurrence","targetProdType","restDef","checkIsTarget","expectedProdType","InsideDefinitionFinderVisitor","targetRef","expectedProdName","initializeArrayOfArrays","pathToHashKeys","longerKeys","currShorterKey","categoriesKeySuffix","isUniquePrefixHash","altKnownPathsKeys","searchPathKeys","otherAltKnownPathsKeys","searchIdx","altsDefs","partialAlts","finalResult","altsHashes","dict","newData","pathLength","currDataset","altIdx","currAltPathsAndSuffixes","currPathIdx","currPathPrefix","prefixKeys","currAltResult","newPartialPathsAndSuffixes","insideDefVisitor","insideDef","afterDef","searchPath","compareOtherPath","otherPath","searchTok","otherTok","singleAltPaths","singlePath","prefix","otherTokType","setCacheAdd","setCacheHas","getPrototypeOf","print_1","timer_1","to_fast_properties_1","overRest","freeSelf","hasFunc","objectCreate","proto","baseTrim","reIsBadHex","reIsBinary","reIsOctal","freeParseInt","isBinary","POP_MODE","createTokenInternal","constant","baseIsRegExp","nodeIsRegExp","isRegExp","arrayBuffer","validateMissingCstMethods","CstVisitorDefinitionError","defaultVisit","lang_extensions_1","childrenNames","childrenNamesLength","currChildArray","currChildArrayLength","currChild","visitorInstance","ruleNames","missingRuleNames","MISSING_METHOD","derivedConstructor","semanticDefinitionErrors","errorMessages","currDefError","_RULE_NAMES","baseConstructor","withDefaultsProto","reHasUnicode","arrayEvery","baseEvery","castFunction","isString","resolver_1","actualOptions","topRulesTable","baseAssign","baseAssignIn","cloneBuffer","copyArray","copySymbols","copySymbolsIn","initCloneArray","initCloneByTag","initCloneObject","funcTag","cloneableTags","isFull","isFunc","subValue","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","loaded","__webpack_modules__","globalThis","window","nmd"],"sourceRoot":""} \ No newline at end of file diff --git a/dist/index.d.ts b/dist/index.d.ts new file mode 100644 index 0000000..008871f --- /dev/null +++ b/dist/index.d.ts @@ -0,0 +1,6 @@ +import { Calx } from "./Calx"; +import { Workbook } from "./Calx/Workbook"; +import { Sheet } from "./Calx/Sheet"; +import { Cell } from "./Calx/Cell"; +export { Calx, Workbook, Sheet, Cell }; +export default Calx; diff --git a/dist/index.js b/dist/index.js index 1870ce1..806f58a 100644 --- a/dist/index.js +++ b/dist/index.js @@ -1,2 +1,2 @@ -!function(t,e){if("object"==typeof exports&&"object"==typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var n=e();for(var r in n)("object"==typeof exports?exports:t)[r]=n[r]}}(self,()=>(()=>{var t={2:(t,e,n)=>{var r=n(2199),o=n(4664),i=n(5950);t.exports=function(t){return r(t,i,o)}},79:(t,e,n)=>{var r=n(3702),o=n(80),i=n(4739),a=n(8655),s=n(1175);function u(t){var e=-1,n=null==t?0:t.length;for(this.clear();++e{var r=n(6025),o=Array.prototype.splice;t.exports=function(t){var e=this.__data__,n=r(e,t);return!(n<0||(n==e.length-1?e.pop():o.call(e,n,1),--this.size,0))}},104:(t,e,n)=>{var r=n(3661);function o(t,e){if("function"!=typeof t||null!=e&&"function"!=typeof e)throw new TypeError("Expected a function");var n=function(){var r=arguments,o=e?e.apply(this,r):r[0],i=n.cache;if(i.has(o))return i.get(o);var a=t.apply(this,r);return n.cache=i.set(o,a)||i,a};return n.cache=new(o.Cache||r),n}o.Cache=r,t.exports=o},109:function(t,e,n){"use strict";var r,o=this&&this.__extends||(r=function(t,e){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n])},r(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function n(){this.constructor=t}r(t,e),t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)}),i=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0}),e.EarlyExitException=e.NotAllInputParsedException=e.NoViableAltException=e.MismatchedTokenException=e.isRecognitionException=void 0;var a=i(n(9859)),s="MismatchedTokenException",u="NoViableAltException",c="EarlyExitException",l="NotAllInputParsedException",f=[s,u,c,l];Object.freeze(f),e.isRecognitionException=function(t){return(0,a.default)(f,t.name)};var h=function(t){function e(e,n){var r=this.constructor,o=t.call(this,e)||this;return o.token=n,o.resyncedTokens=[],Object.setPrototypeOf(o,r.prototype),Error.captureStackTrace&&Error.captureStackTrace(o,o.constructor),o}return o(e,t),e}(Error),p=function(t){function e(e,n,r){var o=t.call(this,e,n)||this;return o.previousToken=r,o.name=s,o}return o(e,t),e}(h);e.MismatchedTokenException=p;var d=function(t){function e(e,n,r){var o=t.call(this,e,n)||this;return o.previousToken=r,o.name=u,o}return o(e,t),e}(h);e.NoViableAltException=d;var m=function(t){function e(e,n){var r=t.call(this,e,n)||this;return r.name=l,r}return o(e,t),e}(h);e.NotAllInputParsedException=m;var g=function(t){function e(e,n,r){var o=t.call(this,e,n)||this;return o.previousToken=r,o.name=c,o}return o(e,t),e}(h);e.EarlyExitException=g},127:function(t,e,n){"use strict";var r=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0}),e.Lexer=e.LexerDefinitionErrorType=void 0;var o,i=n(5063),a=r(n(3950)),s=r(n(2193)),u=r(n(6449)),c=r(n(8090)),l=r(n(8081)),f=r(n(5378)),h=r(n(9754)),p=r(n(5950)),d=r(n(2216)),m=r(n(3488)),g=r(n(6139)),v=r(n(860)),y=r(n(2629)),E=n(8927),T=n(3087),A=n(433),_=n(393);(o=e.LexerDefinitionErrorType||(e.LexerDefinitionErrorType={}))[o.MISSING_PATTERN=0]="MISSING_PATTERN",o[o.INVALID_PATTERN=1]="INVALID_PATTERN",o[o.EOI_ANCHOR_FOUND=2]="EOI_ANCHOR_FOUND",o[o.UNSUPPORTED_FLAGS_FOUND=3]="UNSUPPORTED_FLAGS_FOUND",o[o.DUPLICATE_PATTERNS_FOUND=4]="DUPLICATE_PATTERNS_FOUND",o[o.INVALID_GROUP_TYPE_FOUND=5]="INVALID_GROUP_TYPE_FOUND",o[o.PUSH_MODE_DOES_NOT_EXIST=6]="PUSH_MODE_DOES_NOT_EXIST",o[o.MULTI_MODE_LEXER_WITHOUT_DEFAULT_MODE=7]="MULTI_MODE_LEXER_WITHOUT_DEFAULT_MODE",o[o.MULTI_MODE_LEXER_WITHOUT_MODES_PROPERTY=8]="MULTI_MODE_LEXER_WITHOUT_MODES_PROPERTY",o[o.MULTI_MODE_LEXER_DEFAULT_MODE_VALUE_DOES_NOT_EXIST=9]="MULTI_MODE_LEXER_DEFAULT_MODE_VALUE_DOES_NOT_EXIST",o[o.LEXER_DEFINITION_CANNOT_CONTAIN_UNDEFINED=10]="LEXER_DEFINITION_CANNOT_CONTAIN_UNDEFINED",o[o.SOI_ANCHOR_FOUND=11]="SOI_ANCHOR_FOUND",o[o.EMPTY_MATCH_PATTERN=12]="EMPTY_MATCH_PATTERN",o[o.NO_LINE_BREAKS_FLAGS=13]="NO_LINE_BREAKS_FLAGS",o[o.UNREACHABLE_PATTERN=14]="UNREACHABLE_PATTERN",o[o.IDENTIFY_TERMINATOR=15]="IDENTIFY_TERMINATOR",o[o.CUSTOM_LINE_BREAK=16]="CUSTOM_LINE_BREAK",o[o.MULTI_MODE_LEXER_LONGER_ALT_NOT_IN_CURRENT_MODE=17]="MULTI_MODE_LEXER_LONGER_ALT_NOT_IN_CURRENT_MODE";var R={deferDefinitionErrorsHandling:!1,positionTracking:"full",lineTerminatorsPattern:/\n|\r\n?/g,lineTerminatorCharacters:["\n","\r"],ensureOptimizations:!1,safeMode:!1,errorMessageProvider:A.defaultLexerErrorProvider,traceInitPerf:!1,skipValidations:!1,recoveryEnabled:!0};Object.freeze(R);var N=function(){function t(t,e){void 0===e&&(e=R);var n=this;if(this.lexerDefinition=t,this.lexerDefinitionErrors=[],this.lexerDefinitionWarning=[],this.patternIdxToConfig={},this.charCodeToPatternIdxToConfig={},this.modes=[],this.emptyGroups={},this.trackStartLines=!0,this.trackEndLines=!0,this.hasCustom=!1,this.canModeBeOptimized={},this.TRACE_INIT=function(t,e){if(!0===n.traceInitPerf){n.traceInitIndent++;var r=new Array(n.traceInitIndent+1).join("\t");n.traceInitIndent"));var o=(0,E.timer)(e),i=o.time,a=o.value,s=i>10?console.warn:console.log;return n.traceInitIndent time: ").concat(i,"ms")),n.traceInitIndent--,a}return e()},"boolean"==typeof e)throw Error("The second argument to the Lexer constructor is now an ILexerConfig Object.\na boolean 2nd argument is no longer supported");this.config=(0,g.default)({},R,e);var r=this.config.traceInitPerf;!0===r?(this.traceInitMaxIdent=1/0,this.traceInitPerf=!0):"number"==typeof r&&(this.traceInitMaxIdent=r,this.traceInitPerf=!0),this.traceInitIndent=-1,this.TRACE_INIT("Lexer Constructor",function(){var r,o=!0;n.TRACE_INIT("Lexer Config handling",function(){if(n.config.lineTerminatorsPattern===R.lineTerminatorsPattern)n.config.lineTerminatorsPattern=i.LineTerminatorOptimizedTester;else if(n.config.lineTerminatorCharacters===R.lineTerminatorCharacters)throw Error("Error: Missing property on the Lexer config.\n\tFor details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#MISSING_LINE_TERM_CHARS");if(e.safeMode&&e.ensureOptimizations)throw Error('"safeMode" and "ensureOptimizations" flags are mutually exclusive.');n.trackStartLines=/full|onlyStart/i.test(n.config.positionTracking),n.trackEndLines=/full/i.test(n.config.positionTracking),(0,u.default)(t)?r={modes:{defaultMode:(0,y.default)(t)},defaultMode:i.DEFAULT_MODE}:(o=!1,r=(0,y.default)(t))}),!1===n.config.skipValidations&&(n.TRACE_INIT("performRuntimeChecks",function(){n.lexerDefinitionErrors=n.lexerDefinitionErrors.concat((0,i.performRuntimeChecks)(r,n.trackStartLines,n.config.lineTerminatorCharacters))}),n.TRACE_INIT("performWarningRuntimeChecks",function(){n.lexerDefinitionWarning=n.lexerDefinitionWarning.concat((0,i.performWarningRuntimeChecks)(r,n.trackStartLines,n.config.lineTerminatorCharacters))})),r.modes=r.modes?r.modes:{},(0,h.default)(r.modes,function(t,e){r.modes[e]=(0,l.default)(t,function(t){return(0,d.default)(t)})});var c=(0,p.default)(r.modes);if((0,h.default)(r.modes,function(t,r){n.TRACE_INIT("Mode: <".concat(r,"> processing"),function(){var o;n.modes.push(r),!1===n.config.skipValidations&&n.TRACE_INIT("validatePatterns",function(){n.lexerDefinitionErrors=n.lexerDefinitionErrors.concat((0,i.validatePatterns)(t,c))}),(0,s.default)(n.lexerDefinitionErrors)&&((0,T.augmentTokenTypes)(t),n.TRACE_INIT("analyzeTokenTypes",function(){o=(0,i.analyzeTokenTypes)(t,{lineTerminatorCharacters:n.config.lineTerminatorCharacters,positionTracking:e.positionTracking,ensureOptimizations:e.ensureOptimizations,safeMode:e.safeMode,tracer:n.TRACE_INIT})}),n.patternIdxToConfig[r]=o.patternIdxToConfig,n.charCodeToPatternIdxToConfig[r]=o.charCodeToPatternIdxToConfig,n.emptyGroups=(0,g.default)({},n.emptyGroups,o.emptyGroups),n.hasCustom=o.hasCustom||n.hasCustom,n.canModeBeOptimized[r]=o.canBeOptimized)})}),n.defaultMode=r.defaultMode,!(0,s.default)(n.lexerDefinitionErrors)&&!n.config.deferDefinitionErrorsHandling){var A=(0,f.default)(n.lexerDefinitionErrors,function(t){return t.message}).join("-----------------------\n");throw new Error("Errors detected in definition of Lexer:\n"+A)}(0,h.default)(n.lexerDefinitionWarning,function(t){(0,E.PRINT_WARNING)(t.message)}),n.TRACE_INIT("Choosing sub-methods implementations",function(){if(i.SUPPORT_STICKY?(n.chopInput=m.default,n.match=n.matchWithTest):(n.updateLastIndex=a.default,n.match=n.matchWithExec),o&&(n.handleModes=a.default),!1===n.trackStartLines&&(n.computeNewColumn=m.default),!1===n.trackEndLines&&(n.updateTokenEndLineColumnLocation=a.default),/full/i.test(n.config.positionTracking))n.createTokenInstance=n.createFullToken;else if(/onlyStart/i.test(n.config.positionTracking))n.createTokenInstance=n.createStartOnlyToken;else{if(!/onlyOffset/i.test(n.config.positionTracking))throw Error('Invalid config option: "'.concat(n.config.positionTracking,'"'));n.createTokenInstance=n.createOffsetOnlyToken}n.hasCustom?(n.addToken=n.addTokenUsingPush,n.handlePayload=n.handlePayloadWithCustom):(n.addToken=n.addTokenUsingMemberAccess,n.handlePayload=n.handlePayloadNoCustom)}),n.TRACE_INIT("Failed Optimization Warnings",function(){var t=(0,v.default)(n.canModeBeOptimized,function(t,e,n){return!1===e&&t.push(n),t},[]);if(e.ensureOptimizations&&!(0,s.default)(t))throw Error("Lexer Modes: < ".concat(t.join(", ")," > cannot be optimized.\n")+'\t Disable the "ensureOptimizations" lexer config flag to silently ignore this and run the lexer in an un-optimized mode.\n\t Or inspect the console log for details on how to resolve these issues.')}),n.TRACE_INIT("clearRegExpParserCache",function(){(0,_.clearRegExpParserCache)()}),n.TRACE_INIT("toFastProperties",function(){(0,E.toFastProperties)(n)})})}return t.prototype.tokenize=function(t,e){if(void 0===e&&(e=this.defaultMode),!(0,s.default)(this.lexerDefinitionErrors)){var n=(0,f.default)(this.lexerDefinitionErrors,function(t){return t.message}).join("-----------------------\n");throw new Error("Unable to Tokenize because Errors detected in definition of Lexer:\n"+n)}return this.tokenizeInternal(t,e)},t.prototype.tokenizeInternal=function(t,e){var n,r,o,a,s,u,l,f,h,p,d,m,g,v,y,E,T=this,A=t,_=A.length,R=0,N=0,O=this.hasCustom?0:Math.floor(t.length/10),I=new Array(O),S=[],x=this.trackStartLines?1:void 0,b=this.trackStartLines?1:void 0,M=(0,i.cloneEmptyGroups)(this.emptyGroups),C=this.trackStartLines,L=this.config.lineTerminatorsPattern,P=0,w=[],D=[],k=[],U=[];function F(){return w}function j(t){var e=(0,i.charCodeToOptimizedIndex)(t),n=D[e];return void 0===n?U:n}Object.freeze(U);var V,B=function(t){if(1===k.length&&void 0===t.tokenType.PUSH_MODE){var e=T.config.errorMessageProvider.buildUnableToPopLexerModeMessage(t);S.push({offset:t.startOffset,line:t.startLine,column:t.startColumn,length:t.image.length,message:e})}else{k.pop();var n=(0,c.default)(k);w=T.patternIdxToConfig[n],D=T.charCodeToPatternIdxToConfig[n],P=w.length;var r=T.canModeBeOptimized[n]&&!1===T.config.safeMode;E=D&&r?j:F}};function G(t){k.push(t),D=this.charCodeToPatternIdxToConfig[t],w=this.patternIdxToConfig[t],P=w.length,P=w.length;var e=this.canModeBeOptimized[t]&&!1===this.config.safeMode;E=D&&e?j:F}G.call(this,e);for(var W=this.config.recoveryEnabled;R<_;){u=null;var z=A.charCodeAt(R),Y=E(z),q=Y.length;for(n=0;nu.length){u=a,l=f,V=X;break}}}break}}if(null!==u){if(h=u.length,void 0!==(p=V.group)&&(d=V.tokenTypeIdx,m=this.createTokenInstance(u,R,d,V.tokenType,x,b,h),this.handlePayload(m,l),!1===p?N=this.addToken(I,N,m):M[p].push(m)),t=this.chopInput(t,h),R+=h,b=this.computeNewColumn(b,h),!0===C&&!0===V.canLineTerminator){var Z=0,Q=void 0,J=void 0;L.lastIndex=0;do{!0===(Q=L.test(u))&&(J=L.lastIndex-1,Z++)}while(!0===Q);0!==Z&&(x+=Z,b=h-J,this.updateTokenEndLineColumnLocation(m,p,J,Z,x,b,h))}this.handleModes(V,B,G,m)}else{for(var tt=R,et=x,nt=b,rt=!1===W;!1===rt&&R<_;)for(t=this.chopInput(t,1),R++,r=0;r{t.exports=function(t){var e=[];if(null!=t)for(var n in Object(t))e.push(n);return e}},270:(t,e,n)=>{var r=n(7068),o=n(346);t.exports=function t(e,n,i,a,s){return e===n||(null==e||null==n||!o(e)&&!o(n)?e!=e&&n!=n:r(e,n,i,a,t,s))}},289:(t,e,n)=>{var r=n(2651);t.exports=function(t){return r(this,t).get(t)}},294:t=>{t.exports=function(t){return"number"==typeof t&&t>-1&&t%1==0&&t<=9007199254740991}},317:t=>{t.exports=function(t){var e=-1,n=Array(t.size);return t.forEach(function(t,r){n[++e]=[r,t]}),n}},346:t=>{t.exports=function(t){return null!=t&&"object"==typeof t}},361:t=>{var e=/^(?:0|[1-9]\d*)$/;t.exports=function(t,n){var r=typeof t;return!!(n=null==n?9007199254740991:n)&&("number"==r||"symbol"!=r&&e.test(t))&&t>-1&&t%1==0&&t{t.exports=function(t,e){return null==t?void 0:t[e]}},393:(t,e,n)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.clearRegExpParserCache=e.getRegExpAst=void 0;var r=n(2475),o={},i=new r.RegExpParser;e.getRegExpAst=function(t){var e=t.toString();if(o.hasOwnProperty(e))return o[e];var n=i.pattern(e);return o[e]=n,n},e.clearRegExpParserCache=function(){o={}}},426:t=>{var e=Object.prototype.hasOwnProperty;t.exports=function(t,n){return null!=t&&e.call(t,n)}},433:(t,e)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.defaultLexerErrorProvider=void 0,e.defaultLexerErrorProvider={buildUnableToPopLexerModeMessage:function(t){return"Unable to pop Lexer Mode after encountering Token ->".concat(t.image,"<- The Mode Stack is empty")},buildUnexpectedCharactersMessage:function(t,e,n,r,o){return"unexpected character: ->".concat(t.charAt(e),"<- at offset: ").concat(e,",")+" skipped ".concat(n," characters.")}}},500:function(t,e,n){"use strict";var r,o=this&&this.__extends||(r=function(t,e){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n])},r(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function n(){this.constructor=t}r(t,e),t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)}),i=this&&this.__assign||function(){return i=Object.assign||function(t){for(var e,n=1,r=arguments.length;n1});return(0,d.default)((0,E.default)(i),function(n){var r=(0,s.default)(n),o=e.buildDuplicateFoundError(t,n),i=(0,N.getProductionDslName)(r),a={message:o,type:R.ParserDefinitionErrorType.DUPLICATE_PRODUCTIONS,ruleName:t.name,dslName:i,occurrence:r.idx},u=P(r);return u&&(a.parameter=u),a})}(t,n)}),i=function(t,e,n){var r=[],o=(0,d.default)(e,function(t){return t.name});return(0,m.default)(t,function(t){var e=t.name;if((0,T.default)(o,e)){var i=n.buildNamespaceConflictError(t);r.push({message:i,type:R.ParserDefinitionErrorType.CONFLICT_TOKENS_RULES_NAMESPACE,ruleName:e})}}),r}(t,e,n),a=(0,A.default)(t,function(t){return j(t,n)}),u=(0,A.default)(t,function(e){return D(e,t,r,n)});return o.concat(i,a,u)},e.identifyProductionForDuplicates=L;var w=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.allProductions=[],e}return o(e,t),e.prototype.visitNonTerminal=function(t){this.allProductions.push(t)},e.prototype.visitOption=function(t){this.allProductions.push(t)},e.prototype.visitRepetitionWithSeparator=function(t){this.allProductions.push(t)},e.prototype.visitRepetitionMandatory=function(t){this.allProductions.push(t)},e.prototype.visitRepetitionMandatoryWithSeparator=function(t){this.allProductions.push(t)},e.prototype.visitRepetition=function(t){this.allProductions.push(t)},e.prototype.visitAlternation=function(t){this.allProductions.push(t)},e.prototype.visitTerminal=function(t){this.allProductions.push(t)},e}(x.GAstVisitor);function D(t,e,n,r){var o=[];if((0,v.default)(e,function(e,n){return n.name===t.name?e+1:e},0)>1){var i=r.buildDuplicateRuleNameError({topLevelRule:t,grammarName:n});o.push({message:i,type:R.ParserDefinitionErrorType.DUPLICATE_RULE_NAME,ruleName:t.name})}return o}function k(t){var e=[];if((0,u.default)(t))return e;var n=(0,s.default)(t);if(n instanceof S.NonTerminal)e.push(n.referencedRule);else if(n instanceof S.Alternative||n instanceof S.Option||n instanceof S.RepetitionMandatory||n instanceof S.RepetitionMandatoryWithSeparator||n instanceof S.RepetitionWithSeparator||n instanceof S.Repetition)e=e.concat(k(n.definition));else if(n instanceof S.Alternation)e=(0,l.default)((0,d.default)(n.definition,function(t){return k(t.definition)}));else if(!(n instanceof S.Terminal))throw Error("non exhaustive match");var r=(0,N.isOptionalProd)(n),o=t.length>1;if(r&&o){var i=(0,c.default)(t);return e.concat(k(i))}return e}e.OccurrenceValidationCollector=w,e.validateRuleDoesNotAlreadyExist=D,e.validateRuleIsOverridden=function(t,e,n){var r,o=[];return(0,T.default)(e,t)||(r="Invalid rule override, rule: ->".concat(t,"<- cannot be overridden in the grammar: ->").concat(n,"<-")+"as it is not defined in any of the super grammars ",o.push({message:r,type:R.ParserDefinitionErrorType.INVALID_RULE_OVERRIDE,ruleName:t})),o},e.validateNoLeftRecursion=function t(e,n,r,o){void 0===o&&(o=[]);var i=[],a=k(n.definition);if((0,u.default)(a))return[];var s=e.name;(0,T.default)(a,e)&&i.push({message:r.buildLeftRecursionError({topLevelRule:e,leftRecursionPath:o}),type:R.ParserDefinitionErrorType.LEFT_RECURSION,ruleName:s});var c=(0,p.default)(a,o.concat([e])),l=(0,A.default)(c,function(n){var i=(0,_.default)(o);return i.push(n),t(e,n,r,i)});return i.concat(l)},e.getFirstNoneTerminal=k;var U=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.alternations=[],e}return o(e,t),e.prototype.visitAlternation=function(t){this.alternations.push(t)},e}(x.GAstVisitor);e.validateEmptyOrAlternative=function(t,e){var n=new U;t.accept(n);var r=n.alternations;return(0,A.default)(r,function(n){var r=(0,b.default)(n.definition);return(0,A.default)(r,function(r,o){var i=(0,I.nextPossibleTokensAfter)([r],[],C.tokenStructuredMatcher,1);return(0,u.default)(i)?[{message:e.buildEmptyAlternationError({topLevelRule:t,alternation:n,emptyChoiceIdx:o}),type:R.ParserDefinitionErrorType.NONE_LAST_EMPTY_ALT,ruleName:t.name,occurrence:n.idx,alternative:o+1}]:[]})})},e.validateAmbiguousAlternationAlternatives=function(t,e,n){var r=new U;t.accept(r);var o=r.alternations;return o=(0,h.default)(o,function(t){return!0===t.ignoreAmbiguities}),(0,A.default)(o,function(r){var o=r.idx,i=r.maxLookahead||e,a=(0,O.getLookaheadPathsForOr)(o,t,i,r),s=function(t,e,n,r){var o=[],i=(0,v.default)(t,function(n,r,i){return!0===e.definition[i].ignoreAmbiguities||(0,m.default)(r,function(r){var a=[i];(0,m.default)(t,function(t,n){i!==n&&(0,O.containsPath)(t,r)&&!0!==e.definition[n].ignoreAmbiguities&&a.push(n)}),a.length>1&&!(0,O.containsPath)(o,r)&&(o.push(r),n.push({alts:a,path:r}))}),n},[]);return(0,d.default)(i,function(t){var o=(0,d.default)(t.alts,function(t){return t+1});return{message:r.buildAlternationAmbiguityError({topLevelRule:n,alternation:e,ambiguityIndices:o,prefixPath:t.path}),type:R.ParserDefinitionErrorType.AMBIGUOUS_ALTS,ruleName:n.name,occurrence:e.idx,alternatives:t.alts}})}(a,r,t,n),u=V(a,r,t,n);return s.concat(u)})};var F=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.allProductions=[],e}return o(e,t),e.prototype.visitRepetitionWithSeparator=function(t){this.allProductions.push(t)},e.prototype.visitRepetitionMandatory=function(t){this.allProductions.push(t)},e.prototype.visitRepetitionMandatoryWithSeparator=function(t){this.allProductions.push(t)},e.prototype.visitRepetition=function(t){this.allProductions.push(t)},e}(x.GAstVisitor);function j(t,e){var n=new U;t.accept(n);var r=n.alternations;return(0,A.default)(r,function(n){return n.definition.length>255?[{message:e.buildTooManyAlternativesError({topLevelRule:t,alternation:n}),type:R.ParserDefinitionErrorType.TOO_MANY_ALTS,ruleName:t.name,occurrence:n.idx}]:[]})}function V(t,e,n,r){var o=(0,v.default)(t,function(t,e,n){var r=(0,d.default)(e,function(t){return{idx:n,path:t}});return t.concat(r)},[]);return(0,M.default)((0,A.default)(o,function(t){if(!0===e.definition[t.idx].ignoreAmbiguities)return[];var i=t.idx,a=t.path,s=(0,f.default)(o,function(t){return!0!==e.definition[t.idx].ignoreAmbiguities&&t.idx{var r=n(4932);t.exports=function(t,e){return r(e,function(e){return t[e]})}},583:(t,e,n)=>{var r=n(7237),o=n(7255),i=n(8586),a=n(7797);t.exports=function(t){return i(t)?r(a(t)):o(t)}},626:function(t,e,n){"use strict";var r=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0}),e.ContentAssist=void 0;var o=n(4471),i=r(n(6170)),a=r(n(2216)),s=function(){function t(){}return t.prototype.initContentAssist=function(){},t.prototype.computeContentAssist=function(t,e){var n=this.gastProductionsCache[t];if((0,a.default)(n))throw Error("Rule ->".concat(t,"<- does not exist in this grammar."));return(0,o.nextPossibleTokensAfter)([n],e,this.tokenMatcher,this.maxLookahead)},t.prototype.getNextPossibleTokenTypes=function(t){var e=(0,i.default)(t.ruleStack),n=this.getGAstProductions()[e];return new o.NextAfterTokenWalker(n,t).startWalking()},t}();e.ContentAssist=s},631:(t,e,n)=>{var r=n(8077),o=n(9326);t.exports=function(t,e){return null!=t&&o(t,e,r)}},641:(t,e,n)=>{var r=n(6649),o=n(5950);t.exports=function(t,e){return t&&r(t,e,o)}},659:(t,e,n)=>{var r=n(1873),o=Object.prototype,i=o.hasOwnProperty,a=o.toString,s=r?r.toStringTag:void 0;t.exports=function(t){var e=i.call(t,s),n=t[s];try{t[s]=void 0;var r=!0}catch(t){}var o=a.call(t);return r&&(e?t[s]=n:delete t[s]),o}},689:(t,e,n)=>{var r=n(2),o=Object.prototype.hasOwnProperty;t.exports=function(t,e,n,i,a,s){var u=1&n,c=r(t),l=c.length;if(l!=r(e).length&&!u)return!1;for(var f=l;f--;){var h=c[f];if(!(u?h in e:o.call(e,h)))return!1}var p=s.get(t),d=s.get(e);if(p&&d)return p==e&&d==t;var m=!0;s.set(t,e),s.set(e,t);for(var g=u;++f{var r=n(8096),o=n(2428),i=n(6449),a=n(3656),s=n(361),u=n(7167),c=Object.prototype.hasOwnProperty;t.exports=function(t,e){var n=i(t),l=!n&&o(t),f=!n&&!l&&a(t),h=!n&&!l&&!f&&u(t),p=n||l||f||h,d=p?r(t.length,String):[],m=d.length;for(var g in t)!e&&!c.call(t,g)||p&&("length"==g||f&&("offset"==g||"parent"==g)||h&&("buffer"==g||"byteLength"==g||"byteOffset"==g)||s(g,m))||d.push(g);return d}},756:(t,e,n)=>{var r=n(3805);t.exports=function(t){return t==t&&!r(t)}},776:(t,e,n)=>{var r=n(756),o=n(5950);t.exports=function(t){for(var e=o(t),n=e.length;n--;){var i=e[n],a=t[i];e[n]=[i,a,r(a)]}return e}},860:(t,e,n)=>{var r=n(882),o=n(909),i=n(5389),a=n(5558),s=n(6449);t.exports=function(t,e,n){var u=s(t)?r:a,c=arguments.length<3;return u(t,i(e,4),n,c,o)}},870:function(t,e,n){"use strict";var r=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0}),e.defaultGrammarValidatorErrorProvider=e.defaultGrammarResolverErrorProvider=e.defaultParserErrorProvider=void 0;var o=n(9399),i=r(n(6170)),a=r(n(5378)),s=r(n(860)),u=n(3387),c=n(3387);e.defaultParserErrorProvider={buildMismatchTokenMessage:function(t){var e=t.expected,n=t.actual,r=(t.previous,t.ruleName,(0,o.hasTokenLabel)(e)?"--\x3e ".concat((0,o.tokenLabel)(e)," <--"):"token of type --\x3e ".concat(e.name," <--"));return"Expecting ".concat(r," but found --\x3e '").concat(n.image,"' <--")},buildNotAllInputParsedMessage:function(t){var e=t.firstRedundant;return t.ruleName,"Redundant input, expecting EOF but found: "+e.image},buildNoViableAltMessage:function(t){var e=t.expectedPathsPerAlt,n=t.actual,r=(t.previous,t.customUserDescription),u=(t.ruleName,"Expecting: "),c="\nbut found: '"+(0,i.default)(n).image+"'";if(r)return u+r+c;var l=(0,s.default)(e,function(t,e){return t.concat(e)},[]),f=(0,a.default)(l,function(t){return"[".concat((0,a.default)(t,function(t){return(0,o.tokenLabel)(t)}).join(", "),"]")}),h=(0,a.default)(f,function(t,e){return" ".concat(e+1,". ").concat(t)});return u+"one of these possible Token sequences:\n".concat(h.join("\n"))+c},buildEarlyExitMessage:function(t){var e=t.expectedIterationPaths,n=t.actual,r=t.customUserDescription,s=(t.ruleName,"Expecting: "),u="\nbut found: '"+(0,i.default)(n).image+"'";if(r)return s+r+u;var c=(0,a.default)(e,function(t){return"[".concat((0,a.default)(t,function(t){return(0,o.tokenLabel)(t)}).join(","),"]")});return s+"expecting at least one iteration which starts with one of these possible Token sequences::\n "+"<".concat(c.join(" ,"),">")+u}},Object.freeze(e.defaultParserErrorProvider),e.defaultGrammarResolverErrorProvider={buildRuleNotFoundError:function(t,e){return"Invalid grammar, reference to a rule which is not defined: ->"+e.nonTerminalName+"<-\ninside top level rule: ->"+t.name+"<-"}},e.defaultGrammarValidatorErrorProvider={buildDuplicateFoundError:function(t,e){var n,r=t.name,o=(0,i.default)(e),a=o.idx,s=(0,c.getProductionDslName)(o),l=(n=o)instanceof u.Terminal?n.terminalType.name:n instanceof u.NonTerminal?n.nonTerminalName:"",f=a>0,h="->".concat(s).concat(f?a:"","<- ").concat(l?"with argument: ->".concat(l,"<-"):"","\n appears more than once (").concat(e.length," times) in the top level rule: ->").concat(r,"<-. \n For further details see: https://chevrotain.io/docs/FAQ.html#NUMERICAL_SUFFIXES \n ");return(h=h.replace(/[ \t]+/g," ")).replace(/\s\s+/g,"\n")},buildNamespaceConflictError:function(t){return"Namespace conflict found in grammar.\n"+"The grammar has both a Terminal(Token) and a Non-Terminal(Rule) named: <".concat(t.name,">.\n")+"To resolve this make sure each Terminal and Non-Terminal names are unique\nThis is easy to accomplish by using the convention that Terminal names start with an uppercase letter\nand Non-Terminal names start with a lower case letter."},buildAlternationPrefixAmbiguityError:function(t){var e=(0,a.default)(t.prefixPath,function(t){return(0,o.tokenLabel)(t)}).join(", "),n=0===t.alternation.idx?"":t.alternation.idx;return"Ambiguous alternatives: <".concat(t.ambiguityIndices.join(" ,"),"> due to common lookahead prefix\n")+"in inside <").concat(t.topLevelRule.name,"> Rule,\n")+"<".concat(e,"> may appears as a prefix path in all these alternatives.\n")+"See: https://chevrotain.io/docs/guide/resolving_grammar_errors.html#COMMON_PREFIX\nFor Further details."},buildAlternationAmbiguityError:function(t){var e=(0,a.default)(t.prefixPath,function(t){return(0,o.tokenLabel)(t)}).join(", "),n=0===t.alternation.idx?"":t.alternation.idx;return"Ambiguous Alternatives Detected: <".concat(t.ambiguityIndices.join(" ,"),"> in ")+" inside <".concat(t.topLevelRule.name,"> Rule,\n")+"<".concat(e,"> may appears as a prefix path in all these alternatives.\n")+"See: https://chevrotain.io/docs/guide/resolving_grammar_errors.html#AMBIGUOUS_ALTERNATIVES\nFor Further details."},buildEmptyRepetitionError:function(t){var e=(0,c.getProductionDslName)(t.repetition);return 0!==t.repetition.idx&&(e+=t.repetition.idx),"The repetition <".concat(e,"> within Rule <").concat(t.topLevelRule.name,"> can never consume any tokens.\n")+"This could lead to an infinite loop."},buildTokenNameError:function(t){return"deprecated"},buildEmptyAlternationError:function(t){return"Ambiguous empty alternative: <".concat(t.emptyChoiceIdx+1,">")+" in inside <").concat(t.topLevelRule.name,"> Rule.\n")+"Only the last alternative may be an empty alternative."},buildTooManyAlternativesError:function(t){return"An Alternation cannot have more than 256 alternatives:\n"+" inside <").concat(t.topLevelRule.name,"> Rule.\n has ").concat(t.alternation.definition.length+1," alternatives.")},buildLeftRecursionError:function(t){var e=t.topLevelRule.name,n=(0,a.default)(t.leftRecursionPath,function(t){return t.name}),r="".concat(e," --\x3e ").concat(n.concat([e]).join(" --\x3e "));return"Left Recursion found in grammar.\n"+"rule: <".concat(e,"> can be invoked from itself (directly or indirectly)\n")+"without consuming any Tokens. The grammar path that causes this is: \n ".concat(r,"\n")+" To fix this refactor your grammar to remove the left recursion.\nsee: https://en.wikipedia.org/wiki/LL_parser#Left_factoring."},buildInvalidRuleNameError:function(t){return"deprecated"},buildDuplicateRuleNameError:function(t){var e;return e=t.topLevelRule instanceof u.Rule?t.topLevelRule.name:t.topLevelRule,"Duplicate definition, rule: ->".concat(e,"<- is already defined in the grammar: ->").concat(t.grammarName,"<-")}}},882:t=>{t.exports=function(t,e,n,r){var o=-1,i=null==t?0:t.length;for(r&&i&&(n=t[++o]);++o{var r=n(641),o=n(8329)(r);t.exports=o},912:t=>{t.exports=function(t){return t&&t.length?t[0]:void 0}},916:(t,e,n)=>{var r=n(909);t.exports=function(t,e){var n;return r(t,function(t,r,o){return!(n=e(t,r,o))}),!!n}},935:(t,e,n)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.LexerAdapter=void 0;var r=n(6312),o=function(){function t(){}return t.prototype.initLexerAdapter=function(){this.tokVector=[],this.tokVectorLength=0,this.currIdx=-1},Object.defineProperty(t.prototype,"input",{get:function(){return this.tokVector},set:function(t){if(!0!==this.selfAnalysisDone)throw Error("Missing invocation at the end of the Parser's constructor.");this.reset(),this.tokVector=t,this.tokVectorLength=t.length},enumerable:!1,configurable:!0}),t.prototype.SKIP_TOKEN=function(){return this.currIdx<=this.tokVector.length-2?(this.consumeToken(),this.LA(1)):r.END_OF_FILE},t.prototype.LA=function(t){var e=this.currIdx+t;return e<0||this.tokVectorLength<=e?r.END_OF_FILE:this.tokVector[e]},t.prototype.consumeToken=function(){this.currIdx++},t.prototype.exportLexerState=function(){return this.currIdx},t.prototype.importLexerState=function(t){this.currIdx=t},t.prototype.resetLexerState=function(){this.currIdx=-1},t.prototype.moveToTerminatedState=function(){this.currIdx=this.tokVector.length-1},t.prototype.getLexerPosition=function(){return this.exportLexerState()},t}();e.LexerAdapter=o},938:t=>{t.exports=function(t){var e=this.__data__,n=e.delete(t);return this.size=e.size,n}},945:(t,e,n)=>{var r=n(79),o=n(8223),i=n(3661);t.exports=function(t,e){var n=this.__data__;if(n instanceof r){var a=n.__data__;if(!o||a.length<199)return a.push([t,e]),this.size=++n.size,this;n=this.__data__=new i(a)}return n.set(t,e),this.size=n.size,this}},999:(t,e,n)=>{var r=n(9302),o=n(6800);t.exports=function(t){return r(function(e,n){var r=-1,i=n.length,a=i>1?n[i-1]:void 0,s=i>2?n[2]:void 0;for(a=t.length>3&&"function"==typeof a?(i--,a):void 0,s&&o(n[0],n[1],s)&&(a=i<3?void 0:a,i=1),e=Object(e);++r{t.exports=function(t,e,n){switch(n.length){case 0:return t.call(e);case 1:return t.call(e,n[0]);case 2:return t.call(e,n[0],n[1]);case 3:return t.call(e,n[0],n[1],n[2])}return t.apply(e,n)}},1042:(t,e,n)=>{var r=n(6110)(Object,"create");t.exports=r},1074:t=>{t.exports=function(t){return t.split("")}},1086:(t,e,n)=>{var r=n(4932),o=n(5389),i=n(7420),a=n(3349);t.exports=function(t,e){if(null==t)return{};var n=r(a(t),function(t){return[t]});return e=o(e),i(t,n,function(t,n){return e(t,n[0])})}},1120:function(t,e,n){"use strict";var r=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0}),e.RecognizerApi=void 0;var o=r(n(5880)),i=r(n(9859)),a=n(109),s=n(6312),u=n(870),c=n(500),l=n(3387),f=function(){function t(){}return t.prototype.ACTION=function(t){return t.call(this)},t.prototype.consume=function(t,e,n){return this.consumeInternal(e,t,n)},t.prototype.subrule=function(t,e,n){return this.subruleInternal(e,t,n)},t.prototype.option=function(t,e){return this.optionInternal(e,t)},t.prototype.or=function(t,e){return this.orInternal(e,t)},t.prototype.many=function(t,e){return this.manyInternal(t,e)},t.prototype.atLeastOne=function(t,e){return this.atLeastOneInternal(t,e)},t.prototype.CONSUME=function(t,e){return this.consumeInternal(t,0,e)},t.prototype.CONSUME1=function(t,e){return this.consumeInternal(t,1,e)},t.prototype.CONSUME2=function(t,e){return this.consumeInternal(t,2,e)},t.prototype.CONSUME3=function(t,e){return this.consumeInternal(t,3,e)},t.prototype.CONSUME4=function(t,e){return this.consumeInternal(t,4,e)},t.prototype.CONSUME5=function(t,e){return this.consumeInternal(t,5,e)},t.prototype.CONSUME6=function(t,e){return this.consumeInternal(t,6,e)},t.prototype.CONSUME7=function(t,e){return this.consumeInternal(t,7,e)},t.prototype.CONSUME8=function(t,e){return this.consumeInternal(t,8,e)},t.prototype.CONSUME9=function(t,e){return this.consumeInternal(t,9,e)},t.prototype.SUBRULE=function(t,e){return this.subruleInternal(t,0,e)},t.prototype.SUBRULE1=function(t,e){return this.subruleInternal(t,1,e)},t.prototype.SUBRULE2=function(t,e){return this.subruleInternal(t,2,e)},t.prototype.SUBRULE3=function(t,e){return this.subruleInternal(t,3,e)},t.prototype.SUBRULE4=function(t,e){return this.subruleInternal(t,4,e)},t.prototype.SUBRULE5=function(t,e){return this.subruleInternal(t,5,e)},t.prototype.SUBRULE6=function(t,e){return this.subruleInternal(t,6,e)},t.prototype.SUBRULE7=function(t,e){return this.subruleInternal(t,7,e)},t.prototype.SUBRULE8=function(t,e){return this.subruleInternal(t,8,e)},t.prototype.SUBRULE9=function(t,e){return this.subruleInternal(t,9,e)},t.prototype.OPTION=function(t){return this.optionInternal(t,0)},t.prototype.OPTION1=function(t){return this.optionInternal(t,1)},t.prototype.OPTION2=function(t){return this.optionInternal(t,2)},t.prototype.OPTION3=function(t){return this.optionInternal(t,3)},t.prototype.OPTION4=function(t){return this.optionInternal(t,4)},t.prototype.OPTION5=function(t){return this.optionInternal(t,5)},t.prototype.OPTION6=function(t){return this.optionInternal(t,6)},t.prototype.OPTION7=function(t){return this.optionInternal(t,7)},t.prototype.OPTION8=function(t){return this.optionInternal(t,8)},t.prototype.OPTION9=function(t){return this.optionInternal(t,9)},t.prototype.OR=function(t){return this.orInternal(t,0)},t.prototype.OR1=function(t){return this.orInternal(t,1)},t.prototype.OR2=function(t){return this.orInternal(t,2)},t.prototype.OR3=function(t){return this.orInternal(t,3)},t.prototype.OR4=function(t){return this.orInternal(t,4)},t.prototype.OR5=function(t){return this.orInternal(t,5)},t.prototype.OR6=function(t){return this.orInternal(t,6)},t.prototype.OR7=function(t){return this.orInternal(t,7)},t.prototype.OR8=function(t){return this.orInternal(t,8)},t.prototype.OR9=function(t){return this.orInternal(t,9)},t.prototype.MANY=function(t){this.manyInternal(0,t)},t.prototype.MANY1=function(t){this.manyInternal(1,t)},t.prototype.MANY2=function(t){this.manyInternal(2,t)},t.prototype.MANY3=function(t){this.manyInternal(3,t)},t.prototype.MANY4=function(t){this.manyInternal(4,t)},t.prototype.MANY5=function(t){this.manyInternal(5,t)},t.prototype.MANY6=function(t){this.manyInternal(6,t)},t.prototype.MANY7=function(t){this.manyInternal(7,t)},t.prototype.MANY8=function(t){this.manyInternal(8,t)},t.prototype.MANY9=function(t){this.manyInternal(9,t)},t.prototype.MANY_SEP=function(t){this.manySepFirstInternal(0,t)},t.prototype.MANY_SEP1=function(t){this.manySepFirstInternal(1,t)},t.prototype.MANY_SEP2=function(t){this.manySepFirstInternal(2,t)},t.prototype.MANY_SEP3=function(t){this.manySepFirstInternal(3,t)},t.prototype.MANY_SEP4=function(t){this.manySepFirstInternal(4,t)},t.prototype.MANY_SEP5=function(t){this.manySepFirstInternal(5,t)},t.prototype.MANY_SEP6=function(t){this.manySepFirstInternal(6,t)},t.prototype.MANY_SEP7=function(t){this.manySepFirstInternal(7,t)},t.prototype.MANY_SEP8=function(t){this.manySepFirstInternal(8,t)},t.prototype.MANY_SEP9=function(t){this.manySepFirstInternal(9,t)},t.prototype.AT_LEAST_ONE=function(t){this.atLeastOneInternal(0,t)},t.prototype.AT_LEAST_ONE1=function(t){return this.atLeastOneInternal(1,t)},t.prototype.AT_LEAST_ONE2=function(t){this.atLeastOneInternal(2,t)},t.prototype.AT_LEAST_ONE3=function(t){this.atLeastOneInternal(3,t)},t.prototype.AT_LEAST_ONE4=function(t){this.atLeastOneInternal(4,t)},t.prototype.AT_LEAST_ONE5=function(t){this.atLeastOneInternal(5,t)},t.prototype.AT_LEAST_ONE6=function(t){this.atLeastOneInternal(6,t)},t.prototype.AT_LEAST_ONE7=function(t){this.atLeastOneInternal(7,t)},t.prototype.AT_LEAST_ONE8=function(t){this.atLeastOneInternal(8,t)},t.prototype.AT_LEAST_ONE9=function(t){this.atLeastOneInternal(9,t)},t.prototype.AT_LEAST_ONE_SEP=function(t){this.atLeastOneSepFirstInternal(0,t)},t.prototype.AT_LEAST_ONE_SEP1=function(t){this.atLeastOneSepFirstInternal(1,t)},t.prototype.AT_LEAST_ONE_SEP2=function(t){this.atLeastOneSepFirstInternal(2,t)},t.prototype.AT_LEAST_ONE_SEP3=function(t){this.atLeastOneSepFirstInternal(3,t)},t.prototype.AT_LEAST_ONE_SEP4=function(t){this.atLeastOneSepFirstInternal(4,t)},t.prototype.AT_LEAST_ONE_SEP5=function(t){this.atLeastOneSepFirstInternal(5,t)},t.prototype.AT_LEAST_ONE_SEP6=function(t){this.atLeastOneSepFirstInternal(6,t)},t.prototype.AT_LEAST_ONE_SEP7=function(t){this.atLeastOneSepFirstInternal(7,t)},t.prototype.AT_LEAST_ONE_SEP8=function(t){this.atLeastOneSepFirstInternal(8,t)},t.prototype.AT_LEAST_ONE_SEP9=function(t){this.atLeastOneSepFirstInternal(9,t)},t.prototype.RULE=function(t,e,n){if(void 0===n&&(n=s.DEFAULT_RULE_CONFIG),(0,i.default)(this.definedRulesNames,t)){var r={message:u.defaultGrammarValidatorErrorProvider.buildDuplicateRuleNameError({topLevelRule:t,grammarName:this.className}),type:s.ParserDefinitionErrorType.DUPLICATE_RULE_NAME,ruleName:t};this.definitionErrors.push(r)}this.definedRulesNames.push(t);var o=this.defineRule(t,e,n);return this[t]=o,o},t.prototype.OVERRIDE_RULE=function(t,e,n){void 0===n&&(n=s.DEFAULT_RULE_CONFIG);var r=(0,c.validateRuleIsOverridden)(t,this.definedRulesNames,this.className);this.definitionErrors=this.definitionErrors.concat(r);var o=this.defineRule(t,e,n);return this[t]=o,o},t.prototype.BACKTRACK=function(t,e){return function(){this.isBackTrackingStack.push(1);var n=this.saveRecogState();try{return t.apply(this,e),!0}catch(t){if((0,a.isRecognitionException)(t))return!1;throw t}finally{this.reloadRecogState(n),this.isBackTrackingStack.pop()}}},t.prototype.getGAstProductions=function(){return this.gastProductionsCache},t.prototype.getSerializedGastProductions=function(){return(0,l.serializeGrammar)((0,o.default)(this.gastProductionsCache))},t}();e.RecognizerApi=f},1175:(t,e,n)=>{var r=n(6025);t.exports=function(t,e){var n=this.__data__,o=r(n,t);return o<0?(++this.size,n.push([t,e])):n[o][1]=e,this}},1380:t=>{t.exports=function(t){return this.__data__.set(t,"__lodash_hash_undefined__"),this}},1419:(t,e,n)=>{"use strict";e.iX=e.jT=e.IL=e.Ro=e.C_=e.Ug=e._3=e.BK=e.jO=e.Pp=e.Cy=e.$P=e.Y2=e.c$=e.wL=e.EF=e.ak=e.PW=e.X2=e.xd=e.Vv=e.lC=e.DN=e.my=e.T6=e.jk=e.vb=e.G=e.Sk=e.LT=e.fx=e.Ey=e._J=e.JG=e.mT=e.D2=e.jr=e.cA=e.xv=void 0;var r=n(4927);Object.defineProperty(e,"xv",{enumerable:!0,get:function(){return r.VERSION}});var o=n(6312);Object.defineProperty(e,"cA",{enumerable:!0,get:function(){return o.CstParser}}),Object.defineProperty(e,"jr",{enumerable:!0,get:function(){return o.EmbeddedActionsParser}}),Object.defineProperty(e,"D2",{enumerable:!0,get:function(){return o.ParserDefinitionErrorType}}),Object.defineProperty(e,"mT",{enumerable:!0,get:function(){return o.EMPTY_ALT}});var i=n(127);Object.defineProperty(e,"JG",{enumerable:!0,get:function(){return i.Lexer}}),Object.defineProperty(e,"_J",{enumerable:!0,get:function(){return i.LexerDefinitionErrorType}});var a=n(9399);Object.defineProperty(e,"Ey",{enumerable:!0,get:function(){return a.createToken}}),Object.defineProperty(e,"fx",{enumerable:!0,get:function(){return a.createTokenInstance}}),Object.defineProperty(e,"LT",{enumerable:!0,get:function(){return a.EOF}}),Object.defineProperty(e,"Sk",{enumerable:!0,get:function(){return a.tokenLabel}}),Object.defineProperty(e,"G",{enumerable:!0,get:function(){return a.tokenMatcher}}),Object.defineProperty(e,"vb",{enumerable:!0,get:function(){return a.tokenName}});var s=n(8737);Object.defineProperty(e,"jk",{enumerable:!0,get:function(){return s.getLookaheadPaths}});var u=n(5679);Object.defineProperty(e,"T6",{enumerable:!0,get:function(){return u.LLkLookaheadStrategy}});var c=n(870);Object.defineProperty(e,"my",{enumerable:!0,get:function(){return c.defaultParserErrorProvider}});var l=n(109);Object.defineProperty(e,"DN",{enumerable:!0,get:function(){return l.EarlyExitException}}),Object.defineProperty(e,"lC",{enumerable:!0,get:function(){return l.isRecognitionException}}),Object.defineProperty(e,"Vv",{enumerable:!0,get:function(){return l.MismatchedTokenException}}),Object.defineProperty(e,"xd",{enumerable:!0,get:function(){return l.NotAllInputParsedException}}),Object.defineProperty(e,"X2",{enumerable:!0,get:function(){return l.NoViableAltException}});var f=n(433);Object.defineProperty(e,"PW",{enumerable:!0,get:function(){return f.defaultLexerErrorProvider}});var h=n(3387);Object.defineProperty(e,"ak",{enumerable:!0,get:function(){return h.Alternation}}),Object.defineProperty(e,"EF",{enumerable:!0,get:function(){return h.Alternative}}),Object.defineProperty(e,"wL",{enumerable:!0,get:function(){return h.NonTerminal}}),Object.defineProperty(e,"c$",{enumerable:!0,get:function(){return h.Option}}),Object.defineProperty(e,"Y2",{enumerable:!0,get:function(){return h.Repetition}}),Object.defineProperty(e,"$P",{enumerable:!0,get:function(){return h.RepetitionMandatory}}),Object.defineProperty(e,"Cy",{enumerable:!0,get:function(){return h.RepetitionMandatoryWithSeparator}}),Object.defineProperty(e,"Pp",{enumerable:!0,get:function(){return h.RepetitionWithSeparator}}),Object.defineProperty(e,"jO",{enumerable:!0,get:function(){return h.Rule}}),Object.defineProperty(e,"BK",{enumerable:!0,get:function(){return h.Terminal}});var p=n(3387);Object.defineProperty(e,"_3",{enumerable:!0,get:function(){return p.serializeGrammar}}),Object.defineProperty(e,"Ug",{enumerable:!0,get:function(){return p.serializeProduction}}),Object.defineProperty(e,"C_",{enumerable:!0,get:function(){return p.GAstVisitor}});var d=n(3271);Object.defineProperty(e,"Ro",{enumerable:!0,get:function(){return d.generateCstDts}}),e.IL=function(){console.warn("The clearCache function was 'soft' removed from the Chevrotain API.\n\t It performs no action other than printing this message.\n\t Please avoid using it as it will be completely removed in the future")};var m=n(5994);Object.defineProperty(e,"jT",{enumerable:!0,get:function(){return m.createSyntaxDiagramsCode}});e.iX=function(){throw new Error("The Parser class has been deprecated, use CstParser or EmbeddedActionsParser instead.\t\nSee: https://chevrotain.io/docs/changes/BREAKING_CHANGES.html#_7-0-0")}},1420:(t,e,n)=>{var r=n(79);t.exports=function(){this.__data__=new r,this.size=0}},1437:(t,e,n)=>{var r=n(2552),o=n(346);t.exports=function(t){return o(t)&&"[object RegExp]"==r(t)}},1448:(t,e,n)=>{var r=n(426),o=n(9326);t.exports=function(t,e){return null!=t&&o(t,e,r)}},1459:t=>{t.exports=function(t){return this.__data__.has(t)}},1489:(t,e,n)=>{var r=n(7400);t.exports=function(t){var e=r(t),n=e%1;return e==e?n?e-n:e:0}},1549:(t,e,n)=>{var r=n(2032),o=n(3862),i=n(6721),a=n(2749),s=n(5749);function u(t){var e=-1,n=null==t?0:t.length;for(this.clear();++e{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.timer=void 0,e.timer=function(t){var e=(new Date).getTime(),n=t();return{time:(new Date).getTime()-e,value:n}}},1585:(t,e,n)=>{var r=n(6131),o=n(1489),i=Math.max;t.exports=function(t,e,n){var a=null==t?0:t.length;if(!a)return-1;var s=null==n?0:o(n);return s<0&&(s=i(a+s,0)),r(t,e,s)}},1769:(t,e,n)=>{var r=n(6449),o=n(8586),i=n(1802),a=n(3222);t.exports=function(t,e){return r(t)?t:o(t,e)?[t]:i(a(t))}},1791:(t,e,n)=>{var r=n(6547),o=n(3360);t.exports=function(t,e,n,i){var a=!n;n||(n={});for(var s=-1,u=e.length;++s{var r=n(7217),o=n(270);t.exports=function(t,e,n,i){var a=n.length,s=a,u=!i;if(null==t)return!s;for(t=Object(t);a--;){var c=n[a];if(u&&c[2]?c[1]!==t[c[0]]:!(c[0]in t))return!1}for(;++a{var e=/\s/;t.exports=function(t){for(var n=t.length;n--&&e.test(t.charAt(n)););return n}},1802:(t,e,n)=>{var r=n(2224),o=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,i=/\\(\\)?/g,a=r(function(t){var e=[];return 46===t.charCodeAt(0)&&e.push(""),t.replace(o,function(t,n,r,o){e.push(r?o.replace(i,"$1"):n||t)}),e});t.exports=a},1811:t=>{var e=Date.now;t.exports=function(t){var n=0,r=0;return function(){var o=e(),i=16-(o-r);if(r=o,i>0){if(++n>=800)return arguments[0]}else n=0;return t.apply(void 0,arguments)}}},1873:(t,e,n)=>{var r=n(9325).Symbol;t.exports=r},1882:(t,e,n)=>{var r=n(2552),o=n(3805);t.exports=function(t){if(!o(t))return!1;var e=r(t);return"[object Function]"==e||"[object GeneratorFunction]"==e||"[object AsyncFunction]"==e||"[object Proxy]"==e}},1887:(t,e,n)=>{"use strict";var r;n.d(e,{X:()=>r}),function(t){t.VALUE_CHANGED="value.changed",t.FORMULA_CHANGED="fomula.changed",t.FORMULA_CALCULATED="formula.calculated",t.CALCULATED="calculated",t.ELEMENT_MOUNTED="element.mounted"}(r||(r={}))},1961:(t,e,n)=>{var r=n(9653);t.exports=function(t,e){var n=e?r(t.buffer):t.buffer;return new t.constructor(n,t.byteOffset,t.length)}},1986:(t,e,n)=>{var r=n(1873),o=n(7828),i=n(5288),a=n(5911),s=n(317),u=n(4247),c=r?r.prototype:void 0,l=c?c.valueOf:void 0;t.exports=function(t,e,n,r,c,f,h){switch(n){case"[object DataView]":if(t.byteLength!=e.byteLength||t.byteOffset!=e.byteOffset)return!1;t=t.buffer,e=e.buffer;case"[object ArrayBuffer]":return!(t.byteLength!=e.byteLength||!f(new o(t),new o(e)));case"[object Boolean]":case"[object Date]":case"[object Number]":return i(+t,+e);case"[object Error]":return t.name==e.name&&t.message==e.message;case"[object RegExp]":case"[object String]":return t==e+"";case"[object Map]":var p=s;case"[object Set]":var d=1&r;if(p||(p=u),t.size!=e.size&&!d)return!1;var m=h.get(t);if(m)return m==e;r|=2,h.set(t,e);var g=a(p(t),p(e),r,c,f,h);return h.delete(t),g;case"[object Symbol]":if(l)return l.call(t)==l.call(e)}return!1}},2e3:(t,e,n)=>{var r=n(3945),o=n(2429),i=n(5389),a=n(6449);t.exports=function(t,e){return function(n,s){var u=a(n)?r:o,c=e?e():{};return u(n,t,i(s,2),c)}}},2006:(t,e,n)=>{var r=n(5389),o=n(4894),i=n(5950);t.exports=function(t){return function(e,n,a){var s=Object(e);if(!o(e)){var u=r(n,3);e=i(e),n=function(t){return u(s[t],t,s)}}var c=t(e,n,a);return c>-1?s[u?e[c]:c]:void 0}}},2013:(t,e,n)=>{var r=n(3360),o=n(2e3),i=Object.prototype.hasOwnProperty,a=o(function(t,e,n){i.call(t,n)?t[n].push(e):r(t,n,[e])});t.exports=a},2032:(t,e,n)=>{var r=n(1042);t.exports=function(){this.__data__=r?r(null):{},this.size=0}},2054:t=>{var e="\\ud800-\\udfff",n="["+e+"]",r="[\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]",o="\\ud83c[\\udffb-\\udfff]",i="[^"+e+"]",a="(?:\\ud83c[\\udde6-\\uddff]){2}",s="[\\ud800-\\udbff][\\udc00-\\udfff]",u="(?:"+r+"|"+o+")?",c="[\\ufe0e\\ufe0f]?",l=c+u+"(?:\\u200d(?:"+[i,a,s].join("|")+")"+c+u+")*",f="(?:"+[i+r+"?",r,a,s,n].join("|")+")",h=RegExp(o+"(?="+o+")|"+f+l,"g");t.exports=function(t){return t.match(h)||[]}},2056:function(t,e,n){"use strict";var r,o=this&&this.__extends||(r=function(t,e){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n])},r(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function n(){this.constructor=t}r(t,e),t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)}),i=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0}),e.collectMethods=e.LooksAhead=void 0;var a=i(n(9754)),s=i(n(1448)),u=n(6312),c=n(7045),l=n(3387),f=n(3387),h=n(5679),p=function(){function t(){}return t.prototype.initLooksAhead=function(t){this.dynamicTokensEnabled=(0,s.default)(t,"dynamicTokensEnabled")?t.dynamicTokensEnabled:u.DEFAULT_PARSER_CONFIG.dynamicTokensEnabled,this.maxLookahead=(0,s.default)(t,"maxLookahead")?t.maxLookahead:u.DEFAULT_PARSER_CONFIG.maxLookahead,this.lookaheadStrategy=(0,s.default)(t,"lookaheadStrategy")?t.lookaheadStrategy:new h.LLkLookaheadStrategy({maxLookahead:this.maxLookahead}),this.lookAheadFuncsCache=new Map},t.prototype.preComputeLookaheadFunctions=function(t){var e=this;(0,a.default)(t,function(t){e.TRACE_INIT("".concat(t.name," Rule Lookahead"),function(){var n=g(t),r=n.alternation,o=n.repetition,i=n.option,s=n.repetitionMandatory,u=n.repetitionMandatoryWithSeparator,l=n.repetitionWithSeparator;(0,a.default)(r,function(n){var r=0===n.idx?"":n.idx;e.TRACE_INIT("".concat((0,f.getProductionDslName)(n)).concat(r),function(){var r=e.lookaheadStrategy.buildLookaheadForAlternation({prodOccurrence:n.idx,rule:t,maxLookahead:n.maxLookahead||e.maxLookahead,hasPredicates:n.hasPredicates,dynamicTokensEnabled:e.dynamicTokensEnabled}),o=(0,c.getKeyForAutomaticLookahead)(e.fullRuleNameToShort[t.name],c.OR_IDX,n.idx);e.setLaFuncCache(o,r)})}),(0,a.default)(o,function(n){e.computeLookaheadFunc(t,n.idx,c.MANY_IDX,"Repetition",n.maxLookahead,(0,f.getProductionDslName)(n))}),(0,a.default)(i,function(n){e.computeLookaheadFunc(t,n.idx,c.OPTION_IDX,"Option",n.maxLookahead,(0,f.getProductionDslName)(n))}),(0,a.default)(s,function(n){e.computeLookaheadFunc(t,n.idx,c.AT_LEAST_ONE_IDX,"RepetitionMandatory",n.maxLookahead,(0,f.getProductionDslName)(n))}),(0,a.default)(u,function(n){e.computeLookaheadFunc(t,n.idx,c.AT_LEAST_ONE_SEP_IDX,"RepetitionMandatoryWithSeparator",n.maxLookahead,(0,f.getProductionDslName)(n))}),(0,a.default)(l,function(n){e.computeLookaheadFunc(t,n.idx,c.MANY_SEP_IDX,"RepetitionWithSeparator",n.maxLookahead,(0,f.getProductionDslName)(n))})})})},t.prototype.computeLookaheadFunc=function(t,e,n,r,o,i){var a=this;this.TRACE_INIT("".concat(i).concat(0===e?"":e),function(){var i=a.lookaheadStrategy.buildLookaheadForOptional({prodOccurrence:e,rule:t,maxLookahead:o||a.maxLookahead,dynamicTokensEnabled:a.dynamicTokensEnabled,prodType:r}),s=(0,c.getKeyForAutomaticLookahead)(a.fullRuleNameToShort[t.name],n,e);a.setLaFuncCache(s,i)})},t.prototype.getKeyForAutomaticLookahead=function(t,e){var n=this.getLastExplicitRuleShortName();return(0,c.getKeyForAutomaticLookahead)(n,t,e)},t.prototype.getLaFuncFromCache=function(t){return this.lookAheadFuncsCache.get(t)},t.prototype.setLaFuncCache=function(t,e){this.lookAheadFuncsCache.set(t,e)},t}();e.LooksAhead=p;var d=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.dslMethods={option:[],alternation:[],repetition:[],repetitionWithSeparator:[],repetitionMandatory:[],repetitionMandatoryWithSeparator:[]},e}return o(e,t),e.prototype.reset=function(){this.dslMethods={option:[],alternation:[],repetition:[],repetitionWithSeparator:[],repetitionMandatory:[],repetitionMandatoryWithSeparator:[]}},e.prototype.visitOption=function(t){this.dslMethods.option.push(t)},e.prototype.visitRepetitionWithSeparator=function(t){this.dslMethods.repetitionWithSeparator.push(t)},e.prototype.visitRepetitionMandatory=function(t){this.dslMethods.repetitionMandatory.push(t)},e.prototype.visitRepetitionMandatoryWithSeparator=function(t){this.dslMethods.repetitionMandatoryWithSeparator.push(t)},e.prototype.visitRepetition=function(t){this.dslMethods.repetition.push(t)},e.prototype.visitAlternation=function(t){this.dslMethods.alternation.push(t)},e}(l.GAstVisitor),m=new d;function g(t){m.reset(),t.accept(m);var e=m.dslMethods;return m.reset(),e}e.collectMethods=g},2112:function(t,e,n){"use strict";var r=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0}),e.PerformanceTracer=void 0;var o=r(n(1448)),i=n(8927),a=n(6312),s=function(){function t(){}return t.prototype.initPerformanceTracer=function(t){if((0,o.default)(t,"traceInitPerf")){var e=t.traceInitPerf,n="number"==typeof e;this.traceInitMaxIdent=n?e:1/0,this.traceInitPerf=n?e>0:e}else this.traceInitMaxIdent=0,this.traceInitPerf=a.DEFAULT_PARSER_CONFIG.traceInitPerf;this.traceInitIndent=-1},t.prototype.TRACE_INIT=function(t,e){if(!0===this.traceInitPerf){this.traceInitIndent++;var n=new Array(this.traceInitIndent+1).join("\t");this.traceInitIndent"));var r=(0,i.timer)(e),o=r.time,a=r.value,s=o>10?console.warn:console.log;return this.traceInitIndent time: ").concat(o,"ms")),this.traceInitIndent--,a}return e()},t}();e.PerformanceTracer=s},2193:(t,e,n)=>{var r=n(8984),o=n(5861),i=n(2428),a=n(6449),s=n(4894),u=n(3656),c=n(5527),l=n(7167),f=Object.prototype.hasOwnProperty;t.exports=function(t){if(null==t)return!0;if(s(t)&&(a(t)||"string"==typeof t||"function"==typeof t.splice||u(t)||l(t)||i(t)))return!t.length;var e=o(t);if("[object Map]"==e||"[object Set]"==e)return!t.size;if(c(t))return!r(t).length;for(var n in t)if(f.call(t,n))return!1;return!0}},2195:function(t,e,n){"use strict";var r=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0}),e.firstForTerminal=e.firstForBranching=e.firstForSequence=e.first=void 0;var o=r(n(5970)),i=r(n(3375)),a=r(n(5378)),s=n(3387),u=n(3387);function c(t){if(t instanceof s.NonTerminal)return c(t.referencedRule);if(t instanceof s.Terminal)return h(t);if((0,u.isSequenceProd)(t))return l(t);if((0,u.isBranchingProd)(t))return f(t);throw Error("non exhaustive match")}function l(t){for(var e,n=[],r=t.definition,o=0,a=r.length>o,s=!0;a&&s;)e=r[o],s=(0,u.isOptionalProd)(e),n=n.concat(c(e)),o+=1,a=r.length>o;return(0,i.default)(n)}function f(t){var e=(0,a.default)(t.definition,function(t){return c(t)});return(0,i.default)((0,o.default)(e))}function h(t){return[t.terminalType]}e.first=c,e.firstForSequence=l,e.firstForBranching=f,e.firstForTerminal=h},2199:(t,e,n)=>{var r=n(4528),o=n(6449);t.exports=function(t,e,n){var i=e(t);return o(t)?i:r(i,n(t))}},2216:t=>{t.exports=function(t){return void 0===t}},2224:(t,e,n)=>{var r=n(104);t.exports=function(t){var e=r(t,function(t){return 500===n.size&&n.clear(),t}),n=e.cache;return e}},2271:(t,e,n)=>{var r=n(1791),o=n(4664);t.exports=function(t,e){return r(t,o(t),e)}},2308:(t,e)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.PRINT_WARNING=e.PRINT_ERROR=void 0,e.PRINT_ERROR=function(t){console&&console.error&&console.error("Error: ".concat(t))},e.PRINT_WARNING=function(t){console&&console.warn&&console.warn("Warning: ".concat(t))}},2423:function(t,e,n){"use strict";var r=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0}),e.GastRecorder=void 0;var o=r(n(8090)),i=r(n(6449)),a=r(n(2426)),s=r(n(9754)),u=r(n(1882)),c=r(n(1448)),l=n(3387),f=n(127),h=n(3087),p=n(9399),d=n(6312),m=n(7045),g={description:"This Object indicates the Parser is during Recording Phase"};Object.freeze(g);var v=!0,y=Math.pow(2,m.BITS_FOR_OCCURRENCE_IDX)-1,E=(0,p.createToken)({name:"RECORDING_PHASE_TOKEN",pattern:f.Lexer.NA});(0,h.augmentTokenTypes)([E]);var T=(0,p.createTokenInstance)(E,"This IToken indicates the Parser is in Recording Phase\n\tSee: https://chevrotain.io/docs/guide/internals.html#grammar-recording for details",-1,-1,-1,-1,-1,-1);Object.freeze(T);var A={name:"This CSTNode indicates the Parser is in Recording Phase\n\tSee: https://chevrotain.io/docs/guide/internals.html#grammar-recording for details",children:{}},_=function(){function t(){}return t.prototype.initGastRecorder=function(t){this.recordingProdStack=[],this.RECORDING_PHASE=!1},t.prototype.enableRecording=function(){var t=this;this.RECORDING_PHASE=!0,this.TRACE_INIT("Enable Recording",function(){for(var e=function(e){var n=e>0?e:"";t["CONSUME".concat(n)]=function(t,n){return this.consumeInternalRecord(t,e,n)},t["SUBRULE".concat(n)]=function(t,n){return this.subruleInternalRecord(t,e,n)},t["OPTION".concat(n)]=function(t){return this.optionInternalRecord(t,e)},t["OR".concat(n)]=function(t){return this.orInternalRecord(t,e)},t["MANY".concat(n)]=function(t){this.manyInternalRecord(e,t)},t["MANY_SEP".concat(n)]=function(t){this.manySepFirstInternalRecord(e,t)},t["AT_LEAST_ONE".concat(n)]=function(t){this.atLeastOneInternalRecord(e,t)},t["AT_LEAST_ONE_SEP".concat(n)]=function(t){this.atLeastOneSepFirstInternalRecord(e,t)}},n=0;n<10;n++)e(n);t.consume=function(t,e,n){return this.consumeInternalRecord(e,t,n)},t.subrule=function(t,e,n){return this.subruleInternalRecord(e,t,n)},t.option=function(t,e){return this.optionInternalRecord(e,t)},t.or=function(t,e){return this.orInternalRecord(e,t)},t.many=function(t,e){this.manyInternalRecord(t,e)},t.atLeastOne=function(t,e){this.atLeastOneInternalRecord(t,e)},t.ACTION=t.ACTION_RECORD,t.BACKTRACK=t.BACKTRACK_RECORD,t.LA=t.LA_RECORD})},t.prototype.disableRecording=function(){var t=this;this.RECORDING_PHASE=!1,this.TRACE_INIT("Deleting Recording methods",function(){for(var e=t,n=0;n<10;n++){var r=n>0?n:"";delete e["CONSUME".concat(r)],delete e["SUBRULE".concat(r)],delete e["OPTION".concat(r)],delete e["OR".concat(r)],delete e["MANY".concat(r)],delete e["MANY_SEP".concat(r)],delete e["AT_LEAST_ONE".concat(r)],delete e["AT_LEAST_ONE_SEP".concat(r)]}delete e.consume,delete e.subrule,delete e.option,delete e.or,delete e.many,delete e.atLeastOne,delete e.ACTION,delete e.BACKTRACK,delete e.LA})},t.prototype.ACTION_RECORD=function(t){},t.prototype.BACKTRACK_RECORD=function(t,e){return function(){return!0}},t.prototype.LA_RECORD=function(t){return d.END_OF_FILE},t.prototype.topLevelRuleRecord=function(t,e){try{var n=new l.Rule({definition:[],name:t});return n.name=t,this.recordingProdStack.push(n),e.call(this),this.recordingProdStack.pop(),n}catch(t){if(!0!==t.KNOWN_RECORDER_ERROR)try{t.message=t.message+'\n\t This error was thrown during the "grammar recording phase" For more info see:\n\thttps://chevrotain.io/docs/guide/internals.html#grammar-recording'}catch(e){throw t}throw t}},t.prototype.optionInternalRecord=function(t,e){return R.call(this,l.Option,t,e)},t.prototype.atLeastOneInternalRecord=function(t,e){R.call(this,l.RepetitionMandatory,e,t)},t.prototype.atLeastOneSepFirstInternalRecord=function(t,e){R.call(this,l.RepetitionMandatoryWithSeparator,e,t,v)},t.prototype.manyInternalRecord=function(t,e){R.call(this,l.Repetition,e,t)},t.prototype.manySepFirstInternalRecord=function(t,e){R.call(this,l.RepetitionWithSeparator,e,t,v)},t.prototype.orInternalRecord=function(t,e){return N.call(this,t,e)},t.prototype.subruleInternalRecord=function(t,e,n){if(I(e),!t||!1===(0,c.default)(t,"ruleName")){var r=new Error(" argument is invalid")+" expecting a Parser method reference but got: <".concat(JSON.stringify(t),">")+"\n inside top level rule: <".concat(this.recordingProdStack[0].name,">"));throw r.KNOWN_RECORDER_ERROR=!0,r}var i=(0,o.default)(this.recordingProdStack),a=t.ruleName,s=new l.NonTerminal({idx:e,nonTerminalName:a,label:null==n?void 0:n.LABEL,referencedRule:void 0});return i.definition.push(s),this.outputCst?A:g},t.prototype.consumeInternalRecord=function(t,e,n){if(I(e),!(0,h.hasShortKeyProperty)(t)){var r=new Error(" argument is invalid")+" expecting a TokenType reference but got: <".concat(JSON.stringify(t),">")+"\n inside top level rule: <".concat(this.recordingProdStack[0].name,">"));throw r.KNOWN_RECORDER_ERROR=!0,r}var i=(0,o.default)(this.recordingProdStack),a=new l.Terminal({idx:e,terminalType:t,label:null==n?void 0:n.LABEL});return i.definition.push(a),T},t}();function R(t,e,n,r){void 0===r&&(r=!1),I(n);var i=(0,o.default)(this.recordingProdStack),a=(0,u.default)(e)?e:e.DEF,s=new t({definition:[],idx:n});return r&&(s.separator=e.SEP),(0,c.default)(e,"MAX_LOOKAHEAD")&&(s.maxLookahead=e.MAX_LOOKAHEAD),this.recordingProdStack.push(s),a.call(this),i.definition.push(s),this.recordingProdStack.pop(),g}function N(t,e){var n=this;I(e);var r=(0,o.default)(this.recordingProdStack),f=!1===(0,i.default)(t),h=!1===f?t:t.DEF,p=new l.Alternation({definition:[],idx:e,ignoreAmbiguities:f&&!0===t.IGNORE_AMBIGUITIES});(0,c.default)(t,"MAX_LOOKAHEAD")&&(p.maxLookahead=t.MAX_LOOKAHEAD);var d=(0,a.default)(h,function(t){return(0,u.default)(t.GATE)});return p.hasPredicates=d,r.definition.push(p),(0,s.default)(h,function(t){var e=new l.Alternative({definition:[]});p.definition.push(e),(0,c.default)(t,"IGNORE_AMBIGUITIES")?e.ignoreAmbiguities=t.IGNORE_AMBIGUITIES:(0,c.default)(t,"GATE")&&(e.ignoreAmbiguities=!0),n.recordingProdStack.push(e),t.ALT.call(n),n.recordingProdStack.pop()}),g}function O(t){return 0===t?"":"".concat(t)}function I(t){if(t<0||t>y){var e=new Error("Invalid DSL Method idx value: <".concat(t,">\n\t")+"Idx value must be a none negative value smaller than ".concat(y+1));throw e.KNOWN_RECORDER_ERROR=!0,e}}e.GastRecorder=_},2426:(t,e,n)=>{var r=n(4248),o=n(5389),i=n(916),a=n(6449),s=n(6800);t.exports=function(t,e,n){var u=a(t)?r:i;return n&&s(t,e,n)&&(e=void 0),u(t,o(e,3))}},2428:(t,e,n)=>{var r=n(7534),o=n(346),i=Object.prototype,a=i.hasOwnProperty,s=i.propertyIsEnumerable,u=r(function(){return arguments}())?r:function(t){return o(t)&&a.call(t,"callee")&&!s.call(t,"callee")};t.exports=u},2429:(t,e,n)=>{var r=n(909);t.exports=function(t,e,n,o){return r(t,function(t,r,i){e(o,t,n(t),i)}),o}},2475:function(t,e){var n,r;"undefined"!=typeof self&&self,void 0===(r="function"==typeof(n=function(){function t(){}t.prototype.saveState=function(){return{idx:this.idx,input:this.input,groupIdx:this.groupIdx}},t.prototype.restoreState=function(t){this.idx=t.idx,this.input=t.input,this.groupIdx=t.groupIdx},t.prototype.pattern=function(t){this.idx=0,this.input=t,this.groupIdx=0,this.consumeChar("/");var e=this.disjunction();this.consumeChar("/");for(var n={type:"Flags",loc:{begin:this.idx,end:t.length},global:!1,ignoreCase:!1,multiLine:!1,unicode:!1,sticky:!1};this.isRegExpFlag();)switch(this.popChar()){case"g":s(n,"global");break;case"i":s(n,"ignoreCase");break;case"m":s(n,"multiLine");break;case"u":s(n,"unicode");break;case"y":s(n,"sticky")}if(this.idx!==this.input.length)throw Error("Redundant input: "+this.input.substring(this.idx));return{type:"Pattern",flags:n,value:e,loc:this.loc(0)}},t.prototype.disjunction=function(){var t=[],e=this.idx;for(t.push(this.alternative());"|"===this.peekChar();)this.consumeChar("|"),t.push(this.alternative());return{type:"Disjunction",value:t,loc:this.loc(e)}},t.prototype.alternative=function(){for(var t=[],e=this.idx;this.isTerm();)t.push(this.term());return{type:"Alternative",value:t,loc:this.loc(e)}},t.prototype.term=function(){return this.isAssertion()?this.assertion():this.atom()},t.prototype.assertion=function(){var t=this.idx;switch(this.popChar()){case"^":return{type:"StartAnchor",loc:this.loc(t)};case"$":return{type:"EndAnchor",loc:this.loc(t)};case"\\":switch(this.popChar()){case"b":return{type:"WordBoundary",loc:this.loc(t)};case"B":return{type:"NonWordBoundary",loc:this.loc(t)}}throw Error("Invalid Assertion Escape");case"(":var e;switch(this.consumeChar("?"),this.popChar()){case"=":e="Lookahead";break;case"!":e="NegativeLookahead"}u(e);var n=this.disjunction();return this.consumeChar(")"),{type:e,value:n,loc:this.loc(t)}}!function(){throw Error("Internal Error - Should never get here!")}()},t.prototype.quantifier=function(t){var e,n=this.idx;switch(this.popChar()){case"*":e={atLeast:0,atMost:1/0};break;case"+":e={atLeast:1,atMost:1/0};break;case"?":e={atLeast:0,atMost:1};break;case"{":var r=this.integerIncludingZero();switch(this.popChar()){case"}":e={atLeast:r,atMost:r};break;case",":e=this.isDigit()?{atLeast:r,atMost:this.integerIncludingZero()}:{atLeast:r,atMost:1/0},this.consumeChar("}")}if(!0===t&&void 0===e)return;u(e)}if(!0!==t||void 0!==e)return u(e),"?"===this.peekChar(0)?(this.consumeChar("?"),e.greedy=!1):e.greedy=!0,e.type="Quantifier",e.loc=this.loc(n),e},t.prototype.atom=function(){var t,e=this.idx;switch(this.peekChar()){case".":t=this.dotAll();break;case"\\":t=this.atomEscape();break;case"[":t=this.characterClass();break;case"(":t=this.group()}return void 0===t&&this.isPatternCharacter()&&(t=this.patternCharacter()),u(t),t.loc=this.loc(e),this.isQuantifier()&&(t.quantifier=this.quantifier()),t},t.prototype.dotAll=function(){return this.consumeChar("."),{type:"Set",complement:!0,value:[i("\n"),i("\r"),i("\u2028"),i("\u2029")]}},t.prototype.atomEscape=function(){switch(this.consumeChar("\\"),this.peekChar()){case"1":case"2":case"3":case"4":case"5":case"6":case"7":case"8":case"9":return this.decimalEscapeAtom();case"d":case"D":case"s":case"S":case"w":case"W":return this.characterClassEscape();case"f":case"n":case"r":case"t":case"v":return this.controlEscapeAtom();case"c":return this.controlLetterEscapeAtom();case"0":return this.nulCharacterAtom();case"x":return this.hexEscapeSequenceAtom();case"u":return this.regExpUnicodeEscapeSequenceAtom();default:return this.identityEscapeAtom()}},t.prototype.decimalEscapeAtom=function(){return{type:"GroupBackReference",value:this.positiveInteger()}},t.prototype.characterClassEscape=function(){var t,e=!1;switch(this.popChar()){case"d":t=c;break;case"D":t=c,e=!0;break;case"s":t=f;break;case"S":t=f,e=!0;break;case"w":t=l;break;case"W":t=l,e=!0}return u(t),{type:"Set",value:t,complement:e}},t.prototype.controlEscapeAtom=function(){var t;switch(this.popChar()){case"f":t=i("\f");break;case"n":t=i("\n");break;case"r":t=i("\r");break;case"t":t=i("\t");break;case"v":t=i("\v")}return u(t),{type:"Character",value:t}},t.prototype.controlLetterEscapeAtom=function(){this.consumeChar("c");var t=this.popChar();if(!1===/[a-zA-Z]/.test(t))throw Error("Invalid ");return{type:"Character",value:t.toUpperCase().charCodeAt(0)-64}},t.prototype.nulCharacterAtom=function(){return this.consumeChar("0"),{type:"Character",value:i("\0")}},t.prototype.hexEscapeSequenceAtom=function(){return this.consumeChar("x"),this.parseHexDigits(2)},t.prototype.regExpUnicodeEscapeSequenceAtom=function(){return this.consumeChar("u"),this.parseHexDigits(4)},t.prototype.identityEscapeAtom=function(){return{type:"Character",value:i(this.popChar())}},t.prototype.classPatternCharacterAtom=function(){switch(this.peekChar()){case"\n":case"\r":case"\u2028":case"\u2029":case"\\":case"]":throw Error("TBD");default:return{type:"Character",value:i(this.popChar())}}},t.prototype.characterClass=function(){var t=[],e=!1;for(this.consumeChar("["),"^"===this.peekChar(0)&&(this.consumeChar("^"),e=!0);this.isClassAtom();){var n=this.classAtom();if("Character"===n.type&&this.isRangeDash()){this.consumeChar("-");var r=this.classAtom();if("Character"===r.type){if(r.value=this.input.length)throw Error("Unexpected end of input");this.idx++},t.prototype.loc=function(t){return{begin:t,end:this.idx}};var e,n=/[0-9a-fA-F]/,r=/[0-9]/,o=/[1-9]/;function i(t){return t.charCodeAt(0)}function a(t,e){void 0!==t.length?t.forEach(function(t){e.push(t)}):e.push(t)}function s(t,e){if(!0===t[e])throw"duplicate flag "+e;t[e]=!0}function u(t){if(void 0===t)throw Error("Internal Error - Should never get here!")}var c=[];for(e=i("0");e<=i("9");e++)c.push(e);var l=[i("_")].concat(c);for(e=i("a");e<=i("z");e++)l.push(e);for(e=i("A");e<=i("Z");e++)l.push(e);var f=[i(" "),i("\f"),i("\n"),i("\r"),i("\t"),i("\v"),i("\t"),i(" "),i(" "),i(" "),i(" "),i(" "),i(" "),i(" "),i(" "),i(" "),i(" "),i(" "),i(" "),i(" "),i("\u2028"),i("\u2029"),i(" "),i(" "),i(" "),i("\ufeff")];function h(){}return h.prototype.visitChildren=function(t){for(var e in t){var n=t[e];t.hasOwnProperty(e)&&(void 0!==n.type?this.visit(n):Array.isArray(n)&&n.forEach(function(t){this.visit(t)},this))}},h.prototype.visit=function(t){switch(t.type){case"Pattern":this.visitPattern(t);break;case"Flags":this.visitFlags(t);break;case"Disjunction":this.visitDisjunction(t);break;case"Alternative":this.visitAlternative(t);break;case"StartAnchor":this.visitStartAnchor(t);break;case"EndAnchor":this.visitEndAnchor(t);break;case"WordBoundary":this.visitWordBoundary(t);break;case"NonWordBoundary":this.visitNonWordBoundary(t);break;case"Lookahead":this.visitLookahead(t);break;case"NegativeLookahead":this.visitNegativeLookahead(t);break;case"Character":this.visitCharacter(t);break;case"Set":this.visitSet(t);break;case"Group":this.visitGroup(t);break;case"GroupBackReference":this.visitGroupBackReference(t);break;case"Quantifier":this.visitQuantifier(t)}this.visitChildren(t)},h.prototype.visitPattern=function(t){},h.prototype.visitFlags=function(t){},h.prototype.visitDisjunction=function(t){},h.prototype.visitAlternative=function(t){},h.prototype.visitStartAnchor=function(t){},h.prototype.visitEndAnchor=function(t){},h.prototype.visitWordBoundary=function(t){},h.prototype.visitNonWordBoundary=function(t){},h.prototype.visitLookahead=function(t){},h.prototype.visitNegativeLookahead=function(t){},h.prototype.visitCharacter=function(t){},h.prototype.visitSet=function(t){},h.prototype.visitGroup=function(t){},h.prototype.visitGroupBackReference=function(t){},h.prototype.visitQuantifier=function(t){},{RegExpParser:t,BaseRegExpVisitor:h,VERSION:"0.5.0"}})?n.apply(e,[]):n)||(t.exports=r)},2507:(t,e,n)=>{var r=n(8754),o=n(9698),i=n(3912),a=n(3222);t.exports=function(t){return function(e){e=a(e);var n=o(e)?i(e):void 0,s=n?n[0]:e.charAt(0),u=n?r(n,1).join(""):e.slice(1);return s[t]()+u}}},2523:t=>{t.exports=function(t,e,n,r){for(var o=t.length,i=n+(r?1:-1);r?i--:++i{var r=n(1873),o=n(659),i=n(9350),a=r?r.toStringTag:void 0;t.exports=function(t){return null==t?void 0===t?"[object Undefined]":"[object Null]":a&&a in Object(t)?o(t):i(t)}},2629:(t,e,n)=>{var r=n(9999);t.exports=function(t){return r(t,4)}},2651:(t,e,n)=>{var r=n(4218);t.exports=function(t,e){var n=t.__data__;return r(e)?n["string"==typeof e?"string":"hash"]:n.map}},2749:(t,e,n)=>{var r=n(1042),o=Object.prototype.hasOwnProperty;t.exports=function(t){var e=this.__data__;return r?void 0!==e[t]:o.call(e,t)}},2804:(t,e,n)=>{var r=n(6110)(n(9325),"Promise");t.exports=r},2865:(t,e,n)=>{var r=n(9570),o=n(1811)(r);t.exports=o},2903:(t,e,n)=>{var r=n(3805),o=n(5527),i=n(181),a=Object.prototype.hasOwnProperty;t.exports=function(t){if(!r(t))return i(t);var e=o(t),n=[];for(var s in t)("constructor"!=s||!e&&a.call(t,s))&&n.push(s);return n}},2949:(t,e,n)=>{var r=n(2651);t.exports=function(t,e){var n=r(this,t),o=n.size;return n.set(t,e),this.size+=n.size==o?0:1,this}},3007:t=>{t.exports=function(t,e){var n=-1,r=t.length;for(e||(e=Array(r));++n{var r=n(1549),o=n(79),i=n(8223);t.exports=function(){this.size=0,this.__data__={hash:new r,map:new(i||o),string:new r}}},3087:function(t,e,n){"use strict";var r=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0}),e.isTokenType=e.hasExtendingTokensTypesMapProperty=e.hasExtendingTokensTypesProperty=e.hasCategoriesProperty=e.hasShortKeyProperty=e.singleAssignCategoriesToksMap=e.assignCategoriesMapProp=e.assignCategoriesTokensProp=e.assignTokenDefaultProps=e.expandCategories=e.augmentTokenTypes=e.tokenIdxToClass=e.tokenShortNameIdx=e.tokenStructuredMatcherNoCategories=e.tokenStructuredMatcher=void 0;var o=r(n(2193)),i=r(n(3673)),a=r(n(6449)),s=r(n(5970)),u=r(n(6245)),c=r(n(5378)),l=r(n(9754)),f=r(n(1448)),h=r(n(9859)),p=r(n(2629));function d(t){for(var e=(0,p.default)(t),n=t,r=!0;r;){n=(0,i.default)((0,s.default)((0,c.default)(n,function(t){return t.CATEGORIES})));var a=(0,u.default)(n,e);e=e.concat(a),(0,o.default)(a)?r=!1:n=a}return e}function m(t){(0,l.default)(t,function(t){E(t)||(e.tokenIdxToClass[e.tokenShortNameIdx]=t,t.tokenTypeIdx=e.tokenShortNameIdx++),T(t)&&!(0,a.default)(t.CATEGORIES)&&(t.CATEGORIES=[t.CATEGORIES]),T(t)||(t.CATEGORIES=[]),A(t)||(t.categoryMatches=[]),_(t)||(t.categoryMatchesMap={})})}function g(t){(0,l.default)(t,function(t){t.categoryMatches=[],(0,l.default)(t.categoryMatchesMap,function(n,r){t.categoryMatches.push(e.tokenIdxToClass[r].tokenTypeIdx)})})}function v(t){(0,l.default)(t,function(t){y([],t)})}function y(t,e){(0,l.default)(t,function(t){e.categoryMatchesMap[t.tokenTypeIdx]=!0}),(0,l.default)(e.CATEGORIES,function(n){var r=t.concat(e);(0,h.default)(r,n)||y(r,n)})}function E(t){return(0,f.default)(t,"tokenTypeIdx")}function T(t){return(0,f.default)(t,"CATEGORIES")}function A(t){return(0,f.default)(t,"categoryMatches")}function _(t){return(0,f.default)(t,"categoryMatchesMap")}e.tokenStructuredMatcher=function(t,e){var n=t.tokenTypeIdx;return n===e.tokenTypeIdx||!0===e.isParent&&!0===e.categoryMatchesMap[n]},e.tokenStructuredMatcherNoCategories=function(t,e){return t.tokenTypeIdx===e.tokenTypeIdx},e.tokenShortNameIdx=1,e.tokenIdxToClass={},e.augmentTokenTypes=function(t){var e=d(t);m(e),v(e),g(e),(0,l.default)(e,function(t){t.isParent=t.categoryMatches.length>0})},e.expandCategories=d,e.assignTokenDefaultProps=m,e.assignCategoriesTokensProp=g,e.assignCategoriesMapProp=v,e.singleAssignCategoriesToksMap=y,e.hasShortKeyProperty=E,e.hasCategoriesProperty=T,e.hasExtendingTokensTypesProperty=A,e.hasExtendingTokensTypesMapProperty=_,e.isTokenType=function(t){return(0,f.default)(t,"tokenTypeIdx")}},3120:(t,e,n)=>{var r=n(4528),o=n(5891);t.exports=function t(e,n,i,a,s){var u=-1,c=e.length;for(i||(i=o),s||(s=[]);++u0&&i(l)?n>1?t(l,n-1,i,a,s):r(s,l):a||(s[s.length]=l)}return s}},3131:function(t,e,n){"use strict";var r=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0}),e.RestWalker=void 0;var o=r(n(3739)),i=r(n(9754)),a=n(3387),s=function(){function t(){}return t.prototype.walk=function(t,e){var n=this;void 0===e&&(e=[]),(0,i.default)(t.definition,function(r,i){var s=(0,o.default)(t.definition,i+1);if(r instanceof a.NonTerminal)n.walkProdRef(r,s,e);else if(r instanceof a.Terminal)n.walkTerminal(r,s,e);else if(r instanceof a.Alternative)n.walkFlat(r,s,e);else if(r instanceof a.Option)n.walkOption(r,s,e);else if(r instanceof a.RepetitionMandatory)n.walkAtLeastOne(r,s,e);else if(r instanceof a.RepetitionMandatoryWithSeparator)n.walkAtLeastOneSep(r,s,e);else if(r instanceof a.RepetitionWithSeparator)n.walkManySep(r,s,e);else if(r instanceof a.Repetition)n.walkMany(r,s,e);else{if(!(r instanceof a.Alternation))throw Error("non exhaustive match");n.walkOr(r,s,e)}})},t.prototype.walkTerminal=function(t,e,n){},t.prototype.walkProdRef=function(t,e,n){},t.prototype.walkFlat=function(t,e,n){var r=e.concat(n);this.walk(t,r)},t.prototype.walkOption=function(t,e,n){var r=e.concat(n);this.walk(t,r)},t.prototype.walkAtLeastOne=function(t,e,n){var r=[new a.Option({definition:t.definition})].concat(e,n);this.walk(t,r)},t.prototype.walkAtLeastOneSep=function(t,e,n){var r=u(t,e,n);this.walk(t,r)},t.prototype.walkMany=function(t,e,n){var r=[new a.Option({definition:t.definition})].concat(e,n);this.walk(t,r)},t.prototype.walkManySep=function(t,e,n){var r=u(t,e,n);this.walk(t,r)},t.prototype.walkOr=function(t,e,n){var r=this,o=e.concat(n);(0,i.default)(t.definition,function(t){var e=new a.Alternative({definition:[t]});r.walk(e,o)})},t}();function u(t,e,n){return[new a.Option({definition:[new a.Terminal({terminalType:t.separator})].concat(t.definition)})].concat(e,n)}e.RestWalker=s},3170:(t,e,n)=>{var r=n(6547),o=n(1769),i=n(361),a=n(3805),s=n(7797);t.exports=function(t,e,n,u){if(!a(t))return t;for(var c=-1,l=(e=o(e,t)).length,f=l-1,h=t;null!=h&&++c{var e=/\w*$/;t.exports=function(t){var n=new t.constructor(t.source,e.exec(t));return n.lastIndex=t.lastIndex,n}},3221:t=>{t.exports=function(t){return function(e,n,r){for(var o=-1,i=Object(e),a=r(e),s=a.length;s--;){var u=a[t?s:++o];if(!1===n(i[u],u,i))break}return e}}},3222:(t,e,n)=>{var r=n(7556);t.exports=function(t){return null==t?"":r(t)}},3243:(t,e,n)=>{var r=n(6110),o=function(){try{var t=r(Object,"defineProperty");return t({},"",{}),t}catch(t){}}();t.exports=o},3271:function(t,e,n){"use strict";var r=this&&this.__assign||function(){return r=Object.assign||function(t){for(var e,n=1,r=arguments.length;n{t=n.nmd(t);var r=n(9325),o=e&&!e.nodeType&&e,i=o&&t&&!t.nodeType&&t,a=i&&i.exports===o?r.Buffer:void 0,s=a?a.allocUnsafe:void 0;t.exports=function(t,e){if(e)return t.slice();var n=t.length,r=s?s(n):new t.constructor(n);return t.copy(r),r}},3345:t=>{t.exports=function(){return[]}},3349:(t,e,n)=>{var r=n(2199),o=n(6375),i=n(7241);t.exports=function(t){return r(t,i,o)}},3360:(t,e,n)=>{var r=n(3243);t.exports=function(t,e,n){"__proto__"==e&&r?r(t,e,{configurable:!0,enumerable:!0,value:n,writable:!0}):t[e]=n}},3375:(t,e,n)=>{var r=n(5765);t.exports=function(t){return t&&t.length?r(t):[]}},3387:(t,e,n)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.isSequenceProd=e.isBranchingProd=e.isOptionalProd=e.getProductionDslName=e.GAstVisitor=e.serializeProduction=e.serializeGrammar=e.Alternative=e.Alternation=e.RepetitionWithSeparator=e.RepetitionMandatoryWithSeparator=e.RepetitionMandatory=e.Repetition=e.Option=e.NonTerminal=e.Terminal=e.Rule=void 0;var r=n(8538);Object.defineProperty(e,"Rule",{enumerable:!0,get:function(){return r.Rule}}),Object.defineProperty(e,"Terminal",{enumerable:!0,get:function(){return r.Terminal}}),Object.defineProperty(e,"NonTerminal",{enumerable:!0,get:function(){return r.NonTerminal}}),Object.defineProperty(e,"Option",{enumerable:!0,get:function(){return r.Option}}),Object.defineProperty(e,"Repetition",{enumerable:!0,get:function(){return r.Repetition}}),Object.defineProperty(e,"RepetitionMandatory",{enumerable:!0,get:function(){return r.RepetitionMandatory}}),Object.defineProperty(e,"RepetitionMandatoryWithSeparator",{enumerable:!0,get:function(){return r.RepetitionMandatoryWithSeparator}}),Object.defineProperty(e,"RepetitionWithSeparator",{enumerable:!0,get:function(){return r.RepetitionWithSeparator}}),Object.defineProperty(e,"Alternation",{enumerable:!0,get:function(){return r.Alternation}}),Object.defineProperty(e,"Alternative",{enumerable:!0,get:function(){return r.Alternative}}),Object.defineProperty(e,"serializeGrammar",{enumerable:!0,get:function(){return r.serializeGrammar}}),Object.defineProperty(e,"serializeProduction",{enumerable:!0,get:function(){return r.serializeProduction}});var o=n(4105);Object.defineProperty(e,"GAstVisitor",{enumerable:!0,get:function(){return o.GAstVisitor}});var i=n(3598);Object.defineProperty(e,"getProductionDslName",{enumerable:!0,get:function(){return i.getProductionDslName}}),Object.defineProperty(e,"isOptionalProd",{enumerable:!0,get:function(){return i.isOptionalProd}}),Object.defineProperty(e,"isBranchingProd",{enumerable:!0,get:function(){return i.isBranchingProd}}),Object.defineProperty(e,"isSequenceProd",{enumerable:!0,get:function(){return i.isSequenceProd}})},3475:(t,e,n)=>{"use strict";n.r(e),n.d(e,{Calx:()=>el,DateUtil:()=>at});var r={};n.r(r),n.d(r,{ABS:()=>br,ACCRINT:()=>vu,ACCRINTM:()=>yu,ACOS:()=>Mr,ACOSH:()=>Cr,ACOT:()=>Lr,ACOTH:()=>Pr,ADD:()=>zo,AGGREGATE:()=>wr,AMORDEGRC:()=>Eu,AMORLINC:()=>Tu,AND:()=>yc,ARABIC:()=>Dr,ARGS2ARRAY:()=>Mc,ASC:()=>hi,ASIN:()=>kr,ASINH:()=>Ur,ATAN:()=>Fr,ATAN2:()=>jr,ATANH:()=>Vr,AVEDEV:()=>cn,AVERAGE:()=>ln,AVERAGEA:()=>fn,AVERAGEIF:()=>hn,AVERAGEIFS:()=>pn,BAHTTEXT:()=>pi,BASE:()=>Br,BESSELI:()=>$i,BESSELJ:()=>Zi,BESSELK:()=>Qi,BESSELY:()=>Ji,BETA:()=>dn,BETADIST:()=>Ha,BETAINV:()=>Xa,BIN2DEC:()=>ta,BIN2HEX:()=>ea,BIN2OCT:()=>na,BINOM:()=>mn,BINOMDIST:()=>$a,BITAND:()=>ra,BITLSHIFT:()=>oa,BITOR:()=>ia,BITRSHIFT:()=>aa,BITXOR:()=>sa,CEILING:()=>Gr,CEILINGMATH:()=>Za,CEILINGPRECISE:()=>Qa,CELL:()=>be,CHAR:()=>di,CHIDIST:()=>Ja,CHIDISTRT:()=>ts,CHIINV:()=>es,CHIINVRT:()=>ns,CHISQ:()=>gn,CHITEST:()=>rs,CHOOSE:()=>$e,CLEAN:()=>mi,CODE:()=>gi,COLUMN:()=>Ze,COLUMNS:()=>Qe,COMBIN:()=>Wr,COMBINA:()=>zr,COMPLEX:()=>ua,CONCAT:()=>yi,CONCATENATE:()=>vi,CONFIDENCE:()=>vn,CONVERT:()=>ca,CORREL:()=>yn,COS:()=>Yr,COSH:()=>qr,COT:()=>Kr,COTH:()=>Hr,COUNT:()=>En,COUNTA:()=>Tn,COUNTBLANK:()=>_n,COUNTIF:()=>Rn,COUNTIFS:()=>Nn,COUNTIN:()=>An,COUNTUNIQUE:()=>On,COUPDAYBS:()=>Au,COUPDAYS:()=>_u,COUPDAYSNC:()=>Ru,COUPNCD:()=>Nu,COUPNUM:()=>Ou,COUPPCD:()=>Iu,COVAR:()=>os,COVARIANCE:()=>In,COVARIANCEP:()=>is,COVARIANCES:()=>as,CRITBINOM:()=>ss,CSC:()=>Xr,CSCH:()=>$r,CUMIPMT:()=>Su,CUMPRINC:()=>xu,DATE:()=>Yt,DATEDIF:()=>qt,DATEVALUE:()=>Kt,DAVERAGE:()=>ru,DAY:()=>Ht,DAYS:()=>$t,DAYS360:()=>Zt,DB:()=>bu,DBCS:()=>Ei,DCOUNT:()=>ou,DCOUNTA:()=>iu,DDB:()=>Mu,DEC2BIN:()=>la,DEC2HEX:()=>fa,DEC2OCT:()=>ha,DECIMAL:()=>Zr,DEGREES:()=>Qr,DELTA:()=>pa,DEVSQ:()=>Sn,DGET:()=>au,DISC:()=>Cu,DIVIDE:()=>qo,DMAX:()=>su,DMIN:()=>uu,DOLLAR:()=>Ti,DOLLARDE:()=>Lu,DOLLARFR:()=>Pu,DPRODUCT:()=>cu,DSTDEV:()=>lu,DSTDEVP:()=>fu,DSUM:()=>hu,DURATION:()=>wu,DVAR:()=>pu,DVARP:()=>du,E:()=>_o,EDATE:()=>Qt,EFFECT:()=>Du,EOMONTH:()=>Jt,EQ:()=>Qo,ERF:()=>da,ERFC:()=>ma,ERFCPRECISE:()=>us,ERFPRECISE:()=>cs,ERROR:()=>Me,EVEN:()=>Jr,EXACT:()=>Ai,EXP:()=>to,EXPON:()=>xn,EXPONDIST:()=>ls,F:()=>bn,FACT:()=>no,FACTDOUBLE:()=>ro,FALSE:()=>Ec,FDIST:()=>fs,FDISTRT:()=>hs,FIND:()=>_i,FINDFIELD:()=>eu,FINV:()=>ps,FINVRT:()=>ds,FISHER:()=>Mn,FISHERINV:()=>Cn,FIXED:()=>Ri,FLATTEN:()=>bc,FLOOR:()=>oo,FLOORMATH:()=>ms,FLOORPRECISE:()=>gs,FORECAST:()=>Ln,FREQUENCY:()=>Pn,FTEST:()=>vs,FV:()=>ku,FVSCHEDULE:()=>Uu,GAMMA:()=>wn,GAMMADIST:()=>ys,GAMMAINV:()=>Es,GAMMALN:()=>Dn,GAMMALNPRECISE:()=>Ts,GAUSS:()=>kn,GCD:()=>io,GEOMEAN:()=>Un,GESTEP:()=>ga,GROWTH:()=>Fn,GT:()=>Ho,GTE:()=>Xo,HARMEAN:()=>jn,HEX2BIN:()=>va,HEX2DEC:()=>ya,HEX2OCT:()=>Ea,HLOOKUP:()=>Je,HOUR:()=>te,HTML2TEXT:()=>Ni,HYPGEOM:()=>Vn,HYPGEOMDIST:()=>As,IF:()=>Tc,IFERROR:()=>_c,IFNA:()=>Rc,IFS:()=>Ac,IMABS:()=>Ta,IMAGINARY:()=>Aa,IMARGUMENT:()=>_a,IMCONJUGATE:()=>Ra,IMCOS:()=>Na,IMCOSH:()=>Oa,IMCOT:()=>Ia,IMCSC:()=>Va,IMCSCH:()=>Ba,IMDIV:()=>Sa,IMEXP:()=>xa,IMLN:()=>ba,IMLOG10:()=>Ma,IMLOG2:()=>Ca,IMPOWER:()=>La,IMPRODUCT:()=>Pa,IMREAL:()=>wa,IMSEC:()=>Da,IMSECH:()=>ka,IMSIN:()=>Ua,IMSINH:()=>Fa,IMSQRT:()=>ja,IMSUB:()=>Ga,IMSUM:()=>Wa,IMTAN:()=>za,INDEX:()=>tn,INFO:()=>Ce,INT:()=>ao,INTERCEPT:()=>Bn,INTERVAL:()=>ee,INTRATE:()=>Fu,IPMT:()=>ju,IRR:()=>Vu,ISBINARY:()=>Pe,ISBLANK:()=>Le,ISERR:()=>we,ISERROR:()=>De,ISEVEN:()=>ke,ISFORMULA:()=>Ue,ISLOGICAL:()=>Fe,ISNA:()=>je,ISNONTEXT:()=>Ve,ISNUMBER:()=>Be,ISO:()=>so,ISODD:()=>Ge,ISOWEEKNUM:()=>ne,ISPMT:()=>Bu,ISREF:()=>We,ISTEXT:()=>ze,JOIN:()=>Lc,KURT:()=>Gn,LARGE:()=>Wn,LCM:()=>uo,LEFT:()=>Oi,LEN:()=>Ii,LINEST:()=>zn,LN:()=>co,LN10:()=>lo,LN2:()=>fo,LOG:()=>mo,LOG10:()=>go,LOG10E:()=>ho,LOG2E:()=>po,LOGEST:()=>Yn,LOGINV:()=>_s,LOGNORM:()=>qn,LOGNORMDIST:()=>Rs,LOGNORMINV:()=>Ns,LOOKUP:()=>en,LOWER:()=>Si,LT:()=>$o,LTE:()=>Zo,MATCH:()=>nn,MAX:()=>Kn,MAXA:()=>Hn,MDURATION:()=>Gu,MEDIAN:()=>Xn,MID:()=>xi,MIN:()=>$n,MINA:()=>Zn,MINUS:()=>Yo,MINUTE:()=>re,MIRR:()=>Wu,MOD:()=>vo,MODE:()=>Qn,MODEMULT:()=>Os,MODESNGL:()=>Is,MONTH:()=>oe,MROUND:()=>yo,MULTINOMIAL:()=>Eo,MULTIPLY:()=>Ko,N:()=>Ye,NA:()=>qe,NE:()=>Jo,NEGBINOM:()=>Jn,NEGBINOMDIST:()=>Ss,NETWORKDAYS:()=>ie,NETWORKDAYSINTL:()=>xs,NOMINAL:()=>zu,NORM:()=>tr,NORMDIST:()=>bs,NORMINV:()=>Ms,NORMSDIST:()=>Cs,NORMSINV:()=>Ls,NOT:()=>Nc,NOW:()=>ae,NPER:()=>Yu,NPV:()=>qu,NUMBERS:()=>Pc,NUMBERVALUE:()=>bi,OCT2BIN:()=>Ya,OCT2DEC:()=>qa,OCT2HEX:()=>Ka,ODD:()=>To,ODDFPRICE:()=>Ku,ODDFYIELD:()=>Hu,ODDLPRICE:()=>Xu,ODDLYIELD:()=>$u,OR:()=>Oc,PDURATION:()=>Zu,PEARSON:()=>er,PERCENTILE:()=>nr,PERCENTILEEXC:()=>Ps,PERCENTILEINC:()=>ws,PERCENTRANK:()=>rr,PERCENTRANKEXC:()=>Ds,PERCENTRANKINC:()=>ks,PERMUT:()=>or,PERMUTATIONA:()=>ir,PHI:()=>ar,PI:()=>Ao,PMT:()=>Qu,POISSON:()=>sr,POISSONDIST:()=>Us,POW:()=>ti,POWER:()=>Ro,PPMT:()=>Ju,PRICE:()=>tc,PRICEDISC:()=>ec,PRICEMAT:()=>nc,PROB:()=>ur,PRODUCT:()=>No,PRONETIC:()=>Mi,PROPER:()=>Ci,PV:()=>rc,QUARTILE:()=>cr,QUARTILEEXC:()=>Fs,QUARTILEINC:()=>js,QUOTIENT:()=>Oo,RADIANS:()=>Io,RAND:()=>So,RANDBETWEEN:()=>xo,RANK:()=>lr,RANKAVG:()=>Vs,RANKEQ:()=>Bs,RATE:()=>oc,RECEIVED:()=>ic,REFERENCE:()=>Cc,REGEXEXTRACT:()=>Li,REGEXMATCH:()=>Pi,REGEXREPLACE:()=>wi,REPLACE:()=>Di,REPT:()=>ki,RIGHT:()=>Ui,ROMAN:()=>bo,ROUND:()=>Mo,ROUNDDOWN:()=>Co,ROUNDUP:()=>Lo,ROW:()=>fr,ROWS:()=>rn,RRI:()=>ac,RSQ:()=>hr,SEARCH:()=>Fi,SEC:()=>Po,SECH:()=>wo,SECOND:()=>se,SERIESSUM:()=>Do,SHEET:()=>Ke,SHEETS:()=>He,SIGN:()=>ko,SIN:()=>Uo,SINH:()=>Fo,SKEW:()=>pr,SKEWP:()=>Gs,SLN:()=>sc,SLOPE:()=>dr,SMALL:()=>mr,SPLIT:()=>ji,SQRT:()=>jo,SQRT1_2:()=>Bo,SQRT2:()=>Go,SQRTPI:()=>Vo,STANDARDIZE:()=>gr,STDEV:()=>vr,STDEVA:()=>yr,STDEVP:()=>Ws,STDEVPA:()=>Er,STDEVS:()=>zs,STEYX:()=>Tr,SUBSTITUTE:()=>Vi,SUBTOTAL:()=>Wo,SUM:()=>ei,SUMIF:()=>ni,SUMIFS:()=>ri,SUMPRODUCT:()=>oi,SUMSQ:()=>ii,SUMX2MY2:()=>ai,SUMX2PY2:()=>si,SUMXMY2:()=>ui,SWITCH:()=>xc,SYD:()=>uc,T:()=>Bi,TAN:()=>ci,TANH:()=>li,TBILLEQ:()=>cc,TBILLPRICE:()=>lc,TBILLYIELD:()=>fc,TDIST:()=>Ys,TDISTRT:()=>qs,TEXT:()=>Gi,TEXTJOIN:()=>Wi,TIME:()=>ue,TIMEVALUE:()=>ce,TINV:()=>Ks,TODAY:()=>le,TRANSPOSE:()=>on,TREND:()=>_r,TRIM:()=>zi,TRIMMEAN:()=>Rr,TRUE:()=>Ic,TRUNC:()=>fi,TTEST:()=>Hs,TYPE:()=>Xe,UNICHAR:()=>Yi,UNICODE:()=>qi,UNIQUE:()=>an,UPPER:()=>Ki,VALUE:()=>Hi,VAR:()=>Nr,VARA:()=>Or,VARP:()=>Xs,VARPA:()=>Ir,VARS:()=>$s,VDB:()=>hc,VLOOKUP:()=>sn,WEEKDAY:()=>fe,WEEKNUM:()=>he,WEIBULL:()=>Sr,WEIBULLDIST:()=>Zs,WORKDAY:()=>pe,WORKDAYINTL:()=>Qs,XIRR:()=>pc,XNPV:()=>dc,XOR:()=>Sc,YEAR:()=>de,YEARFRAC:()=>ve,YIELD:()=>mc,YIELDDISC:()=>gc,YIELDMAT:()=>vc,Z:()=>xr,ZTEST:()=>Js});var o={};n.r(o),n.d(o,{arrayMerge:()=>Yc,getCellsInRange:()=>Fc,initial:()=>Wc,isValidBinary:()=>jc,numToStr:()=>kc,objectToArray:()=>Kc,rangeToTable:()=>Xc,repeat:()=>Bc,rest:()=>zc,strRepeat:()=>Vc,strToNum:()=>Uc,toArray:()=>qc,transposeTable:()=>$c,trimEmptyCell:()=>Hc,unique:()=>Gc});var i=n(1419);i.ak,i.EF;const a=i.cA,s=(i.mT,i.LT,i.DN,i.jr,i.C_,i.T6,i.JG),u=(i._J,i.Vv,i.X2,i.wL,i.xd,i.c$,i.iX,i.D2,i.Y2,i.$P,i.Cy,i.Pp,i.jO,i.BK,i.xv,i.IL,i.jT,i.Ey),c=(i.fx,i.PW,i.my,i.Ro,i.jk,i.lC,i._3,i.Ug,i.Sk,i.G,i.vb,u({name:"Plus",pattern:/\+/})),l=u({name:"Minus",pattern:/-/}),f=u({name:"Mult",pattern:/\*/}),h=u({name:"Div",pattern:/\//}),p=u({name:"LParen",pattern:/\(/}),d=u({name:"RParen",pattern:/\)/}),m=u({name:"Comma",pattern:/,/}),g=u({name:"RowRange",pattern:/\$?\d+:\$?\d+/}),v=u({name:"NumberLiteral",pattern:/\d+(\.\d+)?/,longer_alt:g}),y=u({name:"Variable",pattern:/[A-Za-z_][A-Za-z0-9_]*/}),E=u({name:"SheetName",pattern:/[A-Za-z_][A-Za-z0-9_-]*!/}),T=u({name:"CellRange",pattern:/\$?[A-Za-z]+\$?\d+:\$?[A-Za-z]+\$?\d+/}),A=u({name:"CellRef",pattern:/\$?[A-Za-z]+\$?\d+/}),_=u({name:"StringLiteral",pattern:/(["'])(?:(?!\1).)*\1/}),R=u({name:"Concat",pattern:/&/}),N=u({name:"FunctionName",pattern:/[A-Za-z]+(?=\()/i,longer_alt:A}),O=u({name:"WhiteSpace",pattern:/\s+/,group:s.SKIPPED}),I=u({name:"GreaterThan",pattern:/>/}),S=u({name:"LessThan",pattern:/=/}),b=u({name:"LessThanEqual",pattern:/<=/}),M=u({name:"Equal",pattern:/=/}),C=u({name:"NotEqual",pattern:/<>/}),L=u({name:"IfFunction",pattern:/IF(?=\()/i,longer_alt:y}),P=u({name:"TrueKeyword",pattern:/TRUE/i,longer_alt:y}),w=u({name:"FalseKeyword",pattern:/FALSE/i,longer_alt:y}),D=u({name:"NullKeyword",pattern:/NULL/i,longer_alt:y}),k=u({name:"ArrayRowSep",pattern:/;/}),U=u({name:"RangeIntersect",pattern:/ +/}),F=u({name:"ErrorConstant",pattern:/#(DIV\/0!|N\/A|NAME\?|NULL!|NUM!|REF!|VALUE!|#SPILL!)/}),j=u({name:"IfErrorFunction",pattern:/IFERROR(?=\()/i,longer_alt:y}),V=u({name:"IfsFunction",pattern:/IFS(?=\()/i,longer_alt:y}),B=u({name:"SwitchFunction",pattern:/SWITCH(?=\()/i,longer_alt:y}),G=u({name:"LCurly",pattern:/{/}),W=u({name:"RCurly",pattern:/}/}),z=u({name:"ColumnRange",pattern:/\$?[A-Za-z]+:\$?[A-Za-z]+/}),Y=u({name:"Power",pattern:/\*\*|\^/}),q=[O,x,b,C,I,S,M,c,l,R,Y,f,h,p,d,G,W,m,k,E,z,g,T,A,U,v,_,F,L,j,V,B,P,w,D,N,y],K={Plus:c,Minus:l,Mult:f,Div:h,LParen:p,RParen:d,Comma:m,RowRange:g,NumberLiteral:v,Variable:y,SheetName:E,CellRange:T,CellRef:A,StringLiteral:_,Concat:R,FunctionName:N,WhiteSpace:O,GreaterThan:I,LessThan:S,GreaterThanEqual:x,LessThanEqual:b,Equal:M,NotEqual:C,IfFunction:L,TrueKeyword:P,FalseKeyword:w,NullKeyword:D,ArrayRowSep:k,RangeIntersect:U,ErrorConstant:F,IfErrorFunction:j,IfsFunction:V,SwitchFunction:B,LCurly:G,RCurly:W,ColumnRange:z,Power:Y},H=new s(q);class X extends a{constructor(){super(q),this.cache={comparisonExpression:!1,atomicExpression:!1};const t=this;t.RULE("expression",()=>{t.OR([{ALT:()=>t.SUBRULE(t.arrayFormula)},{ALT:()=>t.SUBRULE(t.comparisonExpression)}])}),t.RULE("arrayFormula",()=>{t.CONSUME(K.LCurly),t.OPTION(()=>{t.CONSUME(K.Equal)}),t.SUBRULE(t.expression),t.MANY(()=>{t.OR([{ALT:()=>t.CONSUME(K.Comma)},{ALT:()=>t.CONSUME(K.ArrayRowSep)}]),t.SUBRULE2(t.expression)}),t.CONSUME(K.RCurly)}),t.RULE("comparisonExpression",()=>{t.SUBRULE(t.additionExpression,{LABEL:"lhs"}),t.OPTION(()=>{t.cache.comparisonExpression||t.OR([{ALT:()=>t.CONSUME(K.GreaterThan)},{ALT:()=>t.CONSUME(K.LessThan)},{ALT:()=>t.CONSUME(K.GreaterThanEqual)},{ALT:()=>t.CONSUME(K.LessThanEqual)},{ALT:()=>t.CONSUME(K.Equal)},{ALT:()=>t.CONSUME(K.NotEqual)}]),t.SUBRULE2(t.additionExpression,{LABEL:"rhs"})})}),t.RULE("additionExpression",()=>{t.SUBRULE(t.concatenationExpression,{LABEL:"lhs"}),t.MANY(()=>{t.OR([{ALT:()=>t.CONSUME(K.Plus)},{ALT:()=>t.CONSUME(K.Minus)}]),t.SUBRULE2(t.concatenationExpression,{LABEL:"rhs"})})}),t.RULE("concatenationExpression",()=>{t.SUBRULE(t.multiplicationExpression,{LABEL:"lhs"}),t.MANY(()=>{t.CONSUME(K.Concat),t.SUBRULE2(t.multiplicationExpression,{LABEL:"rhs"})})}),t.RULE("multiplicationExpression",()=>{t.SUBRULE(t.exponentiationExpression,{LABEL:"lhs"}),t.MANY(()=>{t.OR([{ALT:()=>t.CONSUME(K.Mult)},{ALT:()=>t.CONSUME(K.Div)}]),t.SUBRULE2(t.exponentiationExpression,{LABEL:"rhs"})})}),t.RULE("exponentiationExpression",()=>{t.SUBRULE(t.unaryExpression,{LABEL:"lhs"}),t.MANY(()=>{t.CONSUME(K.Power),t.SUBRULE2(t.unaryExpression,{LABEL:"rhs"})})}),t.RULE("unaryExpression",()=>{t.OR([{ALT:()=>{t.CONSUME(K.Minus),t.SUBRULE(t.unaryExpression)}},{ALT:()=>t.SUBRULE(t.atomicExpression)}])}),t.RULE("atomicExpression",()=>{t.cache.atomicExpression||t.OR([{ALT:()=>t.CONSUME(K.NumberLiteral)},{ALT:()=>t.CONSUME(K.StringLiteral)},{ALT:()=>t.CONSUME(K.TrueKeyword)},{ALT:()=>t.CONSUME(K.FalseKeyword)},{ALT:()=>t.CONSUME(K.NullKeyword)},{ALT:()=>{t.OPTION(()=>{t.CONSUME(K.SheetName)}),t.OR1([{ALT:()=>t.CONSUME(K.Variable)},{ALT:()=>t.CONSUME(K.CellRef)},{ALT:()=>t.CONSUME(K.CellRange)},{ALT:()=>t.CONSUME(K.RowRange)},{ALT:()=>t.CONSUME(K.ColumnRange)}])}},{ALT:()=>t.SUBRULE(t.ifFunctionCall)},{ALT:()=>t.SUBRULE(t.functionCall)},{ALT:()=>t.CONSUME(K.ErrorConstant)},{ALT:()=>t.SUBRULE(t.ifErrorFunctionCall)},{ALT:()=>t.SUBRULE(t.ifsFunctionCall)},{ALT:()=>t.SUBRULE(t.switchFunctionCall)},{ALT:()=>{t.CONSUME(K.LParen),t.SUBRULE(t.expression),t.CONSUME(K.RParen)}}])}),t.RULE("ifFunctionCall",()=>{t.CONSUME(K.IfFunction),t.CONSUME(K.LParen),t.SUBRULE(t.expression,{LABEL:"condition"}),t.CONSUME1(K.Comma),t.SUBRULE2(t.expression,{LABEL:"whenTrue"}),t.OPTION(()=>{t.CONSUME2(K.Comma),t.SUBRULE3(t.expression,{LABEL:"whenFalse"})}),t.CONSUME(K.RParen)}),t.RULE("ifErrorFunctionCall",()=>{t.CONSUME(K.IfErrorFunction),t.CONSUME(K.LParen),t.SUBRULE(t.expression,{LABEL:"value"}),t.CONSUME1(K.Comma),t.SUBRULE2(t.expression,{LABEL:"valueIfError"}),t.CONSUME(K.RParen)}),t.RULE("ifsFunctionCall",()=>{t.CONSUME(K.IfsFunction),t.CONSUME(K.LParen),t.AT_LEAST_ONE(()=>{t.SUBRULE(t.expression,{LABEL:"condition"}),t.CONSUME1(K.Comma),t.SUBRULE2(t.expression,{LABEL:"value"}),t.OPTION(()=>t.CONSUME2(K.Comma))}),t.CONSUME(K.RParen)}),t.RULE("switchFunctionCall",()=>{t.CONSUME(K.SwitchFunction),t.CONSUME(K.LParen),t.SUBRULE(t.expression,{LABEL:"expression"}),t.CONSUME1(K.Comma),t.AT_LEAST_ONE(()=>{t.SUBRULE2(t.expression,{LABEL:"value"}),t.CONSUME2(K.Comma),t.SUBRULE3(t.expression,{LABEL:"result"}),t.OPTION(()=>t.CONSUME3(K.Comma))}),t.OPTION2(()=>{t.SUBRULE4(t.expression,{LABEL:"default"})}),t.CONSUME(K.RParen)}),t.RULE("functionCall",()=>{t.CONSUME(K.FunctionName),t.CONSUME(K.LParen),t.OPTION(()=>{t.SUBRULE(t.expression),t.MANY(()=>{t.CONSUME(K.Comma),t.SUBRULE2(t.expression)})}),t.CONSUME(K.RParen)}),t.RULE("arrayExpression",()=>{t.CONSUME(K.LParen),t.SUBRULE(t.arrayRow),t.MANY(()=>{t.CONSUME(K.ArrayRowSep),t.SUBRULE2(t.arrayRow)}),t.CONSUME(K.RParen)}),t.RULE("arrayRow",()=>{t.SUBRULE(t.expression),t.MANY(()=>{t.CONSUME(K.Comma),t.SUBRULE2(t.expression)})}),this.performSelfAnalysis()}parse(t){console.log("Parsing input:",t);const e=H.tokenize(t);if(console.log("Lexer result:",e.tokens),e.errors.length>0)throw console.error(e.errors),new Error("Lexer errors detected");this.input=e.tokens;const n=this.expression();if(this.errors.length>0)throw console.error(this.errors),new Error("Parsing errors detected");return n}}var $;!function(t){t.DIV_BY_ZERO="#DIV/0!",t.INVALID_NAME="#NAME?",t.INVALID_REF="#REF!",t.INVALID_VAL="#VALUE!",t.INVALID_NUM="#NUM!",t.NA="#N/A!",t.NULL="#NULL!",t.SPILL="#SPILL!",t.ERROR="#ERROR!"}($||($={}));class Z{constructor(t,e,n){this.values=t,this.rows=e,this.cols=n}getValue(t,e){if(t>=0&&t=0&&e[t]),t.length,1)}static fromHorizontalArray(t){return new Z([t],1,t.length)}static from2DArray(t){const e=t.length,n=e>0?Math.max(...t.map(t=>t.length)):0,r=t.map(t=>{const e=[...t];for(;e.length0?this.visit(t.arrayFormula[0]):this.visit(t.comparisonExpression[0])}arrayFormula(t){if(t.ArrayRowSep&&t.ArrayRowSep.length>0){const e=[];t.Comma&&t.Comma.forEach(t=>{e.push({offset:t.startOffset,type:"comma"})}),t.ArrayRowSep&&t.ArrayRowSep.forEach(t=>{e.push({offset:t.startOffset,type:"semicolon"})}),e.sort((t,e)=>t.offset-e.offset);const n=[];let r=[];for(let o=0;o0&&n.push(r),Z.from2DArray(n)}const e=t.expression.map(t=>this.visit(t));if(1===e.length){const t=e[0];return t instanceof Z?t:Array.isArray(t)?Z.fromHorizontalArray(t):Z.fromSingleValue(t)}return Z.fromHorizontalArray(e)}comparisonExpression(t){const e=this.visit(t.lhs[0]);if(!t.rhs||0===t.rhs.length)return e;const n=this.visit(t.rhs[0]);return t.GreaterThan?e>n:t.LessThan?e=n:t.LessThanEqual?e<=n:t.Equal?e===n:t.NotEqual?e!==n:e}additionExpression(t){let e=this.visit(t.lhs[0]);if(t.rhs&&t.rhs.length>0){const n=[];t.Plus&&t.Plus.forEach(t=>{n.push({type:"plus",offset:t.startOffset})}),t.Minus&&t.Minus.forEach(t=>{n.push({type:"minus",offset:t.startOffset})}),n.sort((t,e)=>t.offset-e.offset);for(let r=0;rt+e):"minus"===i.type&&(e=this.arrayOperation(e,o,(t,e)=>t-e))}}return e}arrayOperation(t,e,n){if(this.isError(t))return t;if(this.isError(e))return e;if(!Array.isArray(t)&&!Array.isArray(e))return n(t,e);const r=Array.isArray(t)?t:[t],o=Array.isArray(e)?e:[e],i=Math.max(r.length,o.length),a=[];for(let t=0;t0)for(let n=0;n0){const n=[];t.Mult&&t.Mult.forEach(t=>{n.push({type:"mult",offset:t.startOffset})}),t.Div&&t.Div.forEach(t=>{n.push({type:"div",offset:t.startOffset})}),n.sort((t,e)=>t.offset-e.offset);for(let r=0;rt*e):"div"===i.type&&(e=this.arrayOperation(e,o,(t,e)=>0===e?"#DIV/0!":t/e))}}return e}exponentiationExpression(t){let e=this.visit(t.lhs[0]);if(t.rhs&&t.rhs.length>0)for(let n=0;nMath.pow(t,e))}return e}unaryExpression(t){return t.Minus?-this.visit(t.unaryExpression[0]):this.visit(t.atomicExpression[0])}atomicExpression(t){if(t.NumberLiteral)return Number(t.NumberLiteral[0].image);if(t.StringLiteral){const e=t.StringLiteral[0].image;return e.substring(1,e.length-1)}if(t.TrueKeyword)return!0;if(t.FalseKeyword)return!1;if(t.NullKeyword)return null;if(t.ErrorConstant)return t.ErrorConstant[0].image;if(t.Variable||t.CellRef||t.CellRange||t.RowRange||t.ColumnRange){let e,n="";if(t.SheetName&&t.SheetName.length>0&&(n=t.SheetName[0].image,n=n.substring(0,n.length-1)),t.Variable&&t.Variable.length>0)return e=t.Variable[0].image,this.resolveVariable(e,n);if(t.CellRef&&t.CellRef.length>0)return e=t.CellRef[0].image,this.resolveCellReference(e,n);if(t.CellRange&&t.CellRange.length>0)return e=t.CellRange[0].image,this.resolveCellRange(e,n);if(t.RowRange&&t.RowRange.length>0)return e=t.RowRange[0].image,this.resolveRowRange(e,n);if(t.ColumnRange&&t.ColumnRange.length>0)return e=t.ColumnRange[0].image,this.resolveColumnRange(e,n)}return t.ifFunctionCall?this.visit(t.ifFunctionCall[0]):t.functionCall?this.visit(t.functionCall[0]):t.ifErrorFunctionCall?this.visit(t.ifErrorFunctionCall[0]):t.ifsFunctionCall?this.visit(t.ifsFunctionCall[0]):t.switchFunctionCall?this.visit(t.switchFunctionCall[0]):t.LParen?this.visit(t.expression[0]):(console.warn("Unhandled atomic expression:",t),null)}ifFunctionCall(t){const e=this.visit(t.condition[0]);return this.isTruthy(e)?this.visit(t.whenTrue[0]):!!(t.whenFalse&&t.whenFalse.length>0)&&this.visit(t.whenFalse[0])}functionCall(t){const e=t.FunctionName[0].image.toUpperCase(),n=[];if(t.expression)for(const e of t.expression)n.push(this.visit(e));if(this.context&&"function"==typeof this.context.callFunction)try{let t=this.context.callFunction(e,n);if(t instanceof Date){const e=new Date(1899,11,30).getTime(),n=864e5;t=Math.floor((t.getTime()-e)/n)}return t}catch(t){console.warn(`Function ${e} not found in callFunction, trying getFunction`)}if(this.context&&"function"==typeof this.context.getFunction){const t=this.context.getFunction(e);if("function"==typeof t)try{let e=t(...n);if(e instanceof Date){const t=new Date(1899,11,30).getTime(),n=864e5;e=Math.floor((e.getTime()-t)/n)}return e}catch(t){return console.error(`Error executing function ${e}:`,t),"#ERROR!"}}return this.executeBuiltInFunction(e,n)}ifErrorFunctionCall(t){try{const e=this.visit(t.value[0]);return this.isErrorValue(e)?this.visit(t.valueIfError[0]):e}catch(e){return this.visit(t.valueIfError[0])}}ifsFunctionCall(t){const e=t.condition,n=t.value;for(let t=0;t0?this.visit(t.default[0]):"#N/A"}arrayExpression(t){const e=[];if(e.push(this.visit(t.arrayRow[0])),t.arrayRow.length>1)for(let n=1;n1)for(let n=1;nArray.isArray(e)?t+this.flattenAndSum(e):isNaN(e)?t:t+Number(e),0);case"AVERAGE":let t=0;return e.forEach(e=>{if(Array.isArray(e)){const r=this.flattenArray(e);t+=r.reduce((t,e)=>t+(isNaN(e)?0:Number(e)),0),n+=r.filter(t=>!isNaN(t)).length}else isNaN(e)||(t+=Number(e),n++)}),n>0?t/n:"#DIV/0!";case"MAX":let r=-1/0;return e.forEach(t=>{if(Array.isArray(t)){const e=this.flattenArray(t),n=Math.max(...e.filter(t=>!isNaN(t)).map(Number));n>r&&(r=n)}else!isNaN(t)&&Number(t)>r&&(r=Number(t))}),r===-1/0?0:r;case"MIN":let o=1/0;return e.forEach(t=>{if(Array.isArray(t)){const e=this.flattenArray(t),n=Math.min(...e.filter(t=>!isNaN(t)).map(Number));n{if(Array.isArray(t)){const e=this.flattenArray(t);n+=e.filter(t=>!isNaN(t)).length}else isNaN(t)||n++}),n;case"CONCATENATE":return e.reduce((t,e)=>t+String(e),"");case"AND":return e.every(t=>this.isTruthy(t));case"OR":return e.some(t=>this.isTruthy(t));default:return"#NAME?"}}flattenAndSum(t){return Array.isArray(t)?t.reduce((t,e)=>Array.isArray(e)?t+this.flattenAndSum(e):t+(isNaN(e)?0:Number(e)),0):isNaN(t)?0:Number(t)}flattenArray(t){return t.reduce((t,e)=>Array.isArray(e)?t.concat(this.flattenArray(e)):t.concat(e),[])}parseInput(t){const e=t.startsWith("=")?t.substring(1):t,n=H.tokenize(e);Q.input=n.tokens;const r=Q.expression();if(Q.errors.length>0)throw console.error("Parser errors:",JSON.stringify(Q.errors,null,2)),Error("Parsing errors detected");return this.visit(r)}parseCst(t){return this.visit(t)}parse(t){try{return this.parseInput(t)}catch(e){return console.error("Parsing error for input:",t),console.error("Error details:",e),e instanceof Error&&console.error("Stack trace:",e.stack),$.ERROR}}}class tt{constructor(t,e){this.sheet=t,this._cells=[],this._address=e,this.parseAddress(e),this.loadCells()}parseAddress(t){const e=t=>t.replace(/\$/g,"");if(t.includes(":")){const[n,r]=t.split(":");this._startAddress=e(n.trim()),this._endAddress=e(r.trim())}else this._startAddress=e(t.trim()),this._endAddress=e(t.trim())}loadCells(){if(this.isSingleCell()){const t=this.sheet.getCellDirect(this._startAddress);this._cells=[t]}else this._cells=this.expandRange()}expandRange(){var t,e,n,r;const o=[],i=(null===(t=this._startAddress.match(/[A-Z]+/))||void 0===t?void 0:t[0])||"A",a=parseInt((null===(e=this._startAddress.match(/\d+/))||void 0===e?void 0:e[0])||"1"),s=(null===(n=this._endAddress.match(/[A-Z]+/))||void 0===n?void 0:n[0])||"A",u=parseInt((null===(r=this._endAddress.match(/\d+/))||void 0===r?void 0:r[0])||"1"),c=this.colToNum(i),l=this.colToNum(s),f=Math.min(a,u),h=Math.max(a,u),p=Math.min(c,l),d=Math.max(c,l);for(let t=f;t<=h;t++)for(let e=p;e<=d;e++){const n=this.numToCol(e)+t;o.push(this.sheet.getCellDirect(n))}return o}isSingleCell(){return this._startAddress===this._endAddress}get address(){return this._address}get cells(){return this._cells}get cell(){return this._cells[0]}get value(){var t,e;return this.isSingleCell()?null!==(e=null===(t=this._cells[0])||void 0===t?void 0:t.value)&&void 0!==e?e:null:this.getValues()}set value(t){this.isSingleCell()?this._cells[0].value=t:Array.isArray(t)?this.setValuesFromArray(t):this._cells.forEach(e=>e.value=t)}get formula(){return this.isSingleCell()?this._cells[0].formula:null}set formula(t){this.isSingleCell()?this._cells[0].formula=t:this._cells.forEach(e=>e.formula=t)}getValues(){var t,e,n,r;const o=(null===(t=this._startAddress.match(/[A-Z]+/))||void 0===t?void 0:t[0])||"A",i=parseInt((null===(e=this._startAddress.match(/\d+/))||void 0===e?void 0:e[0])||"1"),a=(null===(n=this._endAddress.match(/[A-Z]+/))||void 0===n?void 0:n[0])||"A",s=parseInt((null===(r=this._endAddress.match(/\d+/))||void 0===r?void 0:r[0])||"1"),u=this.colToNum(o),c=this.colToNum(a),l=[];let f=0;for(let t=i;t<=s;t++){const t=[];for(let e=u;e<=c;e++)t.push(this._cells[f++].value);l.push(t)}return l}setValues(t){let e=0;for(let n=0;nt.value)}calculate(){this._cells.forEach(t=>{t.formula&&t.calculate()})}get count(){return this._cells.length}get rows(){var t,e;const n=parseInt((null===(t=this._startAddress.match(/\d+/))||void 0===t?void 0:t[0])||"1");return parseInt((null===(e=this._endAddress.match(/\d+/))||void 0===e?void 0:e[0])||"1")-n+1}get columns(){var t,e;const n=(null===(t=this._startAddress.match(/[A-Z]+/))||void 0===t?void 0:t[0])||"A",r=(null===(e=this._endAddress.match(/[A-Z]+/))||void 0===e?void 0:e[0])||"A";return this.colToNum(r)-this.colToNum(n)+1}each(t){this._cells.forEach((e,n)=>t(e,n))}map(t){return this._cells.map((e,n)=>t(e,n))}filter(t){return this._cells.filter((e,n)=>t(e,n))}find(t){return this._cells.find((e,n)=>t(e,n))}getCellAt(t){return this._cells[t]}getCellAtPosition(t,e){const n=t*this.columns+e;return this._cells[n]}colToNum(t){let e=0;for(let n=0;n0;){const n=(t-1)%26;e=String.fromCharCode(65+n)+e,t=Math.floor((t-1)/26)}return e}getRange(t){return new tt(this.sheet,t)}clear(){this._cells.forEach(t=>{t.value=null,t.formula=""})}toString(){return this.isSingleCell()?`Range(${this._address})`:`Range(${this._address}) [${this.rows}x${this.columns}]`}}var et,nt,rt=n(5592);!function(t){t.CALCULATION_STARTED="calculation.started",t.CALCULATION_PAUSED="calculation.paused",t.CALCULATION_RESUMED="calculation.resumed",t.CALCULATION_FINISHED="calculation.finished",t.CELL_ADDED="cell.added",t.CELL_REMOVED="cell.removed",t.CELL_CREATED="CELL_CREATED",t.ELEMENT_ATTACHED="element.attached",t.ELEMENT_DETACHED="element.detached"}(et||(et={})),function(t){t.CALCULATION_STARTED="calculation.started",t.CALCULATION_PAUSED="calculation.paused",t.CALCULATION_RESUMED="calculation.resumed",t.CALCULATION_FINISHED="calculation.finished",t.CALCULATION_IDLE="calculation.idle"}(nt||(nt={}));var ot,it=n(1887);!function(t){t.TEXT="text",t.NUMBER="number",t.DATE="date",t.TIME="time",t.DATETIME="datetime",t.BOOLEAN="boolean",t.ERROR="error"}(ot||(ot={}));class at{static serialToDate(t){if("number"!=typeof t||isNaN(t))throw new Error("Invalid serial date: must be a number");const e=new Date(1899,11,30,0,0,0,0),n=t*at.MS_PER_DAY;return new Date(e.getTime()+n)}static dateToSerial(t){if(!(t instanceof Date)||isNaN(t.getTime()))throw new Error("Invalid date: must be a valid Date object");const e=new Date(1899,11,30,0,0,0,0),n=t.getTime()-e.getTime();return Math.floor(n/at.MS_PER_DAY)}static isValidSerialDate(t){return"number"==typeof t&&!isNaN(t)&&t>=-36522&&t<=2958465}static fromComponents(t,e,n){const r=new Date(t,e-1,n);return at.dateToSerial(r)}static toComponents(t){const e=at.serialToDate(t);return{year:e.getFullYear(),month:e.getMonth()+1,day:e.getDate(),weekday:e.getDay(),hours:e.getHours(),minutes:e.getMinutes(),seconds:e.getSeconds()}}static toISOString(t){return at.serialToDate(t).toISOString().split("T")[0]}static fromISOString(t){const e=new Date(t);if(isNaN(e.getTime()))throw new Error(`Invalid ISO date string: ${t}`);return at.dateToSerial(e)}static today(){const t=new Date;return t.setHours(0,0,0,0),at.dateToSerial(t)}static now(){return at.dateToSerial(new Date)}}at.EXCEL_EPOCH=new Date(1899,11,30).getTime(),at.MS_PER_DAY=864e5;class st{constructor(t,e,n=ot.NUMBER){this.sheet=e,this._type=n,this._rules={address:/^\$?[A-Z]+\$?[0-9]+$/},this.precedents={},this.dependents={},this.remotePrecedents={},this.remoteDependents={},this.dynamicPrecedents={},this._dirty=!1,this._calculated=!1,this._hasRemotePrecedents=!1,this._hasRemoteDependents=!1,this._hasDynamicPrecedents=!1,this._isArrayAnchor=!1,this.address=t,this.init()}init(){}mount(t){this.el=t,this.sheet.dispatcher.dispatch(it.X.ELEMENT_MOUNTED,{cell:this.address,el:t})}isError(){return Object.values($).includes(this.value)}isEmpty(){const t=this.formula?this._computed:this._value;return null==t||""===t}calculate(){if(!this._formula)return this._calculated=!0,this._dirty=!1,this._value;try{const t=this.sheet.eval(this._formula);if(t instanceof Z)return this.handleArrayResult(t);const e=this._computed!==t;return this._computed=t,this._calculated=!0,this._dirty=!1,this.sheet.dispatcher.dispatch(it.X.CALCULATED,{cell:this.address,value:this._computed}),e&&(this._markDependentsAsDirty(),this.sheet.autoCalculate&&this._recalculateDependents()),this._computed}catch(t){return console.error(`Error calculating cell ${this.address}:`,t),this._computed=$.ERROR,this._calculated=!0,this._dirty=!1,this._computed}}handleArrayResult(t){return this._isArrayAnchor=!0,this._arrayResult=t,t.isSingleValue()?(this._computed=t.getSingleValue(),this._calculated=!0,this._dirty=!1,this._computed):this.checkSpillRange(t)?(this.spillArray(t),this._computed=t.getValue(0,0),this._calculated=!0,this._dirty=!1,this._computed):(this._computed=$.SPILL,this._calculated=!0,this._dirty=!1,this._computed)}checkSpillRange(t){const{row:e,col:n}=this.getCellCoordinates(this.address);for(let r=0;r0;){const t=(r-1)%26;n=String.fromCharCode(65+t)+n,r=Math.floor((r-1)/26)}return n+t}isArrayAnchor(){return this._isArrayAnchor}getSpillRange(){return this._spillRange}setFormat(t){this.format=t}setFormatter(t){this.formatter=t}getFormattedValue(){var t;return this.formatter?this.formatter.format(this.value):(null===(t=this.value)||void 0===t?void 0:t.toString())||""}isCalculated(){return this._calculated}isDirty(){return this._dirty}markAsDirty(){this._dirty=!0}isNumeric(){return!isNaN(this.value-parseFloat(this.value))}get address(){return this._address}set address(t){if(!t.match(this._rules.address))throw new Error("Cell address should follow spreadsheet like address rule");this._address=t}get type(){return this._type}set type(t){this._type=t}get formula(){return this._formula}set formula(t){const e=this._formula;this._formula=t,this.updateDynamicPrecedents(t),this.sheet.dispatcher.dispatch(it.X.FORMULA_CHANGED,{cell:this.address,oldFormula:e,newFormula:t});const n=this.getPrecedents();if(n)for(const t in n){const e=n[t];e&&e.removeDependent(this)}this.precedents={},this.markAsDirty(),this.sheet.workbook&&t&&this.rebuildDependencies()}rebuildDependencies(){if(!this._formula)return;const t=new(n(8377).B);t.setWorkbook(this.sheet.workbook);const{localDeps:e,remoteDeps:r}=t.getFormulaDependencies(this._formula),o={};for(const t in e){const e=this.sheet.getCellDirect(t);e&&(o[t]=e,e.addDependent(this))}this.setPrecedents(o);for(const e in r)try{const{sheetName:n,cellAddress:r}=t.parseRemoteReference(e),o=this.sheet.workbook.getSheet(n);if(o){const t=o.getCellDirect(r);t&&(t.addRemoteDependent(this),this.addRemotePrecedent(t))}}catch(t){}}get value(){let t=this.formula?this._computed:this._value;if("string"==typeof t&&Object.values($).includes(t))return t;switch(this._type){case ot.NUMBER:if(null==t||""===t)return 0;if("number"==typeof t)return t;const e=parseFloat(t);return isNaN(e)?t:e;case ot.BOOLEAN:return!!t;case ot.DATE:case ot.DATETIME:case ot.TIME:return t;case ot.ERROR:return $[t];default:return t}}set value(t){if(this._type===ot.BOOLEAN&&"string"==typeof t){const e=t.trim().toUpperCase();"TRUE"===e?t=!0:"FALSE"===e&&(t=!1)}if(this._type===ot.DATE||this._type===ot.DATETIME)if("string"==typeof t&&""!==t.trim())try{const e=t.match(/^(\d{4})-(\d{2})-(\d{2})/);if(e){const n=parseInt(e[1],10),r=parseInt(e[2],10)-1,o=parseInt(e[3],10),i=new Date(n,r,o);t=at.dateToSerial(i)}else{const e=new Date(t);isNaN(e.getTime())||(t=at.dateToSerial(e))}}catch(t){}else t instanceof Date&&(t=at.dateToSerial(t));this._value=t,this._formula="",this.sheet.dispatcher.dispatch(it.X.VALUE_CHANGED,{cell:this.address,value:t}),this._markDependentsAsDirty(),this.sheet.invalidateDynamicDependents(this.address),this.sheet.autoCalculate&&(this._recalculateDependents(),this.sheet.recalculateDirtyCells())}_markDependentsAsDirty(){const t=this.getDependents();for(const e in t){const n=t[e];n.markAsDirty(),n._markDependentsAsDirty()}}_recalculateDependents(){const t=this.getDependents();for(const e in t){const n=t[e];n.calculate(),n._recalculateDependents()}}getStringValue(){return this.value.toString()}getNumericValue(){return isNaN(parseFloat(this.value))?0:parseFloat(this.value)}getDateValue(){if(this._type!==ot.DATE&&this._type!==ot.DATETIME&&this._type!==ot.TIME)return null;const t=this.value;if(t instanceof Date)return t;if("number"==typeof t&&at.isValidSerialDate(t))return at.serialToDate(t);if("string"==typeof t){const e=new Date(t);if(!isNaN(e.getTime()))return e}return null}getSerialDateValue(){if(this._type!==ot.DATE&&this._type!==ot.DATETIME&&this._type!==ot.TIME)return null;const t=this.value;if("number"==typeof t&&at.isValidSerialDate(t))return t;if(t instanceof Date)return at.dateToSerial(t);if("string"==typeof t)try{return at.fromISOString(t)}catch(t){return null}return null}setDateValue(t){if(!(t instanceof Date)||isNaN(t.getTime()))throw new Error("Invalid date: must be a valid Date object");this._type=ot.DATE,this.value=at.dateToSerial(t)}setSerialDateValue(t){if(!at.isValidSerialDate(t))throw new Error("Invalid serial date: must be a valid number");this._type=ot.DATE,this.value=t}getFormattedDate(){const t=this.getSerialDateValue();return null===t?null:at.toISOString(t)}isDate(){return this._type===ot.DATE||this._type===ot.DATETIME||this._type===ot.TIME}getPrecedents(){return this._hasDynamicPrecedents?null:this.precedents}setPrecedents(t){this.precedents=t}addPrecedent(t){this.precedents[t.address]=t}getDependents(){return Object.assign(Object.assign({},this.dependents),this.remoteDependents)}setDependents(t){this.dependents=t}addDependent(t){this.dependents[t.address]=t}removeDependent(t){delete this.dependents[t.address]}addRemoteDependent(t){const e=t.sheet.name+"!"+t.address;this.remoteDependents[e]=t,this._hasRemoteDependents=!0}addRemotePrecedent(t){const e=t.sheet.name+"!"+t.address;this.remotePrecedents[e]=t}updateDynamicPrecedents(t){if(!t)return this.dynamicPrecedents={},void(this._hasDynamicPrecedents=!1);const e=[],n=[],r=/\b([A-Z]+)\s*:\s*([A-Z]+)\b/g;let o;for(;null!==(o=r.exec(t));)e.push(o[0]);const i=/\b(\d+)\s*:\s*(\d+)\b/g;for(;null!==(o=i.exec(t));){const e=t[o.index-1];e&&/[A-Z]/i.test(e)||n.push(o[0])}this.dynamicPrecedents={},e.length>0&&(this.dynamicPrecedents.columnRanges=e),n.length>0&&(this.dynamicPrecedents.rowRanges=n),this._hasDynamicPrecedents=e.length>0||n.length>0}hasDynamicPrecedents(){return this._hasDynamicPrecedents}dependsOnColumn(t){if(!this._hasDynamicPrecedents||!this.dynamicPrecedents.columnRanges)return!1;const e=this.columnToNumber(t);return this.dynamicPrecedents.columnRanges.some(t=>{const[n,r]=t.split(":").map(t=>this.columnToNumber(t.trim()));return e>=n&&e<=r})}dependsOnRow(t){return!(!this._hasDynamicPrecedents||!this.dynamicPrecedents.rowRanges)&&this.dynamicPrecedents.rowRanges.some(e=>{const[n,r]=e.split(":").map(t=>parseInt(t.trim()));return t>=n&&t<=r})}columnToNumber(t){let e=0;for(let n=0;nMath.floor(16*Math.random()).toString(16))}get autoCalculate(){return this._autoCalculate}set autoCalculate(t){this._autoCalculate=t}recalculateDirtyCells(){const t=this._autoCalculate;this._autoCalculate=!1,this._cells.each(t=>{t.isDirty()&&t.calculate()}),this._autoCalculate=t}set element(t){t.setAttribute("data-calx-id",this.id),this._el=t,this.dispatcher.dispatch(et.ELEMENT_ATTACHED,{sheet:this,el:t})}get element(){return this._el}get id(){return this._id}get cells(){return this._cells.all()}listen(t,e){this.dispatcher.listen(t,e)}calculate(t={withoutEvent:!1}){if(t.withoutEvent&&this.dispatcher.pauseListener(),this._depTree){const t=this._depTree.topologicalSort();for(const e of t)if(e)for(const t of e)!t.isDirty()&&t.isCalculated()||t.calculate();this._cells.each(t=>{!t.hasDynamicPrecedents()||!t.isDirty()&&t.isCalculated()||t.calculate()})}else for(const t in this.cells)this.cells[t].calculate();this.dispatcher.resumeListener()}requestCalculate(t){const e=this.getCell(t);if(e){e.markAsDirty(),e.calculate();const t=e.getDependents();for(const e in t)t[e].markAsDirty()}}getRange(t){return new tt(this,t)}getCellDirect(t){return this._cells.get(t)}getCell(t){return this._cells.get(t)}getCellValue(t){return this.getRange(t).value}createCell(t,e){const n=this._cells.create(t,e||{});return this.invalidateDynamicDependents(t),n}eval(t){return this.workbook.setActiveSheet(this),this.workbook.parser.parse(t)}buildDependencyTree(){const t=new ct.B;t.setWorkbook(this.workbook),this._depTree=t.build(this._cells)}invalidateDynamicDependents(t){const e=t.match(/^([A-Z]+)(\d+)$/);if(!e)return;const n=e[1],r=parseInt(e[2]);this._cells.each(t=>{t.hasDynamicPrecedents()&&(t.dependsOnColumn(n)||t.dependsOnRow(r))&&t.markAsDirty()})}getVariable(t){return void 0!==this._variables[t]?this._variables[t]:"#NAME?"}setVariable(t,e){this._variables[t]=e}getCellRangeValues(t,e){const n=t.match(/[A-Z]+/),r=t.match(/\d+/),o=e.match(/[A-Z]+/),i=e.match(/\d+/);if(!(n&&r&&o&&i))throw new Error(`Invalid cell range: ${t}:${e}`);const a=n[0],s=parseInt(r[0]),u=o[0],c=parseInt(i[0]),l=[],f=t=>{let e=0;for(let n=0;n{let e="";for(;t>0;){const n=(t-1)%26;e=String.fromCharCode(65+n)+e,t=Math.floor((t-1)/26)}return e},p=f(a),d=f(u);for(let t=s;t<=c;t++)for(let e=p;e<=d;e++){const n=h(e)+t,r=this._cells.get(n);l.push(r?r.value:null)}return l}getRowRangeValues(t){const e=t.replace(/\$/g,"").split(":"),n=parseInt(e[0]),r=parseInt(e[1]),o=[],i=this._cells.all();for(const t in i){const e=t.match(/(\d+)$/);if(e){const a=parseInt(e[1]);a>=n&&a<=r&&o.push(i[t].value)}}return o}getColumnRangeValues(t){const e=t.replace(/\$/g,"").split(":"),[n,r]=e,o=t=>{let e=0;for(let n=0;n=i&&n<=a&&s.push(u[t].value)}}return s}}var ft=n(4809),ht=n(6572);const pt=new Error("#NULL!"),dt=new Error("#DIV/0!"),mt=new Error("#VALUE!"),gt=new Error("#REF!"),vt=new Error("#NAME?"),yt=new Error("#NUM!"),Et=new Error("#N/A"),Tt=new Error("#ERROR!"),At=new Error("#GETTING_DATA");function _t(t){return t&&t.reduce?t.reduce((t,e)=>{const n=Array.isArray(t),r=Array.isArray(e);return n&&r?t.concat(e):n?(t.push(e),t):r?[t].concat(e):[t,e]}):[t]}function Rt(t){if(!t)return!1;for(let e=0;e{e.push(t)}),e}function It(){return Nt.apply(null,arguments).filter(t=>"number"==typeof t)}function St(t){const e=1e14;return Math.round(t*e)/e}function xt(t){if("boolean"==typeof t)return t;if(t instanceof Error)return t;if("number"==typeof t)return 0!==t;if("string"==typeof t){const e=t.toUpperCase();if("TRUE"===e)return!0;if("FALSE"===e)return!1}return t instanceof Date&&!isNaN(t)||mt}function bt(t){return t instanceof Error?t:null==t||""===t?0:("boolean"==typeof t&&(t=+t),isNaN(t)?mt:parseFloat(t))}function Mt(t){return t instanceof Error?t:null==t?"":t.toString()}function Ct(t){let e,n;if(!t||0===(e=t.length))return mt;for(;e--;){if(t[e]instanceof Error)return t[e];if(n=bt(t[e]),n instanceof Error)return n;t[e]=n}return t}function Lt(t){if(!isNaN(t)){if(t instanceof Date)return new Date(t);const e=parseFloat(t);return e<0||e>=2958466?yt:function(t){t<60&&(t+=1);const e=Math.floor(t-25569),n=new Date(86400*e*1e3),r=t-Math.floor(t)+1e-7;let o=Math.floor(86400*r);const i=o%60;o-=i;const a=Math.floor(o/3600),s=Math.floor(o/60)%60;let u=n.getUTCDate(),c=n.getUTCMonth();return t>=60&&t<61&&(u=29,c=1),new Date(n.getUTCFullYear(),c,u,a,s,i)}(e)}return"string"!=typeof t||(t=/(\d{4})-(\d\d?)-(\d\d?)$/.test(t)?new Date(t+"T00:00:00.000"):new Date(t),isNaN(t))?mt:t}function Pt(t){let e,n=t.length;for(;n--;){if(e=Lt(t[n]),e===mt)return e;t[n]=e}return t}function wt(){for(let t=0;to||s===o&&u0?e+"Y":"",n=n>0?n+"M":"",r=r>0?r+"D":"",o=o>0?o+"H":"",i=i>0?i+"M":"",a=a>0?a+"S":"","P"+e+n+r+"T"+o+i+a}function ne(t){if((t=Lt(t))instanceof Error)return t;(t=Xt(t)).setDate(t.getDate()+4-(t.getDay()||7));const e=new Date(t.getFullYear(),0,1);return Math.ceil(((t-e)/864e5+1)/7)}function re(t){return(t=Lt(t))instanceof Error?t:t.getMinutes()}function oe(t){return(t=Lt(t))instanceof Error?t:t.getMonth()+1}function ie(t,e,n){return ie.INTL(t,e,1,n)}function ae(){return new Date}function se(t){return(t=Lt(t))instanceof Error?t:t.getSeconds()}function ue(t,e,n){return kt(t=bt(t),e=bt(e),n=bt(n))?mt:t<0||e<0||n<0?yt:(3600*t+60*e+n)/86400}function ce(t){return(t=Lt(t))instanceof Error?t:(3600*t.getHours()+60*t.getMinutes()+t.getSeconds())/86400}function le(){return Xt(new Date)}function fe(t,e){if((t=Lt(t))instanceof Error)return t;void 0===e&&(e=1);const n=t.getDay();return Wt[e][n]}function he(t,e){if((t=Lt(t))instanceof Error)return t;if(void 0===e&&(e=1),21===e)return ne(t);const n=Gt[e];let r=new Date(t.getFullYear(),0,1);const o=r.getDay(){const n=t.getFullYear(),r=new Date(n,2,1);if(me(n)&&t=r)return!0;const o=e.getFullYear(),i=new Date(o,2,1);return me(o)&&e>=i&&ts||o===s&&r>=a))return(i===u&&me(i)||n(t,e)||1===s&&29===a)&&(c=366),ge(t,e)/c;const l=u-i+1,f=(new Date(u+1,0,1)-new Date(i,0,1))/1e3/60/60/24/l;return ge(t,e)/f}case 2:return ge(t,e)/360;case 3:return ge(t,e)/365;case 4:return(a+30*s+360*u-(r+30*o+360*i))/360}}function ye(t){const e=t>-22038912e5?2:1;return Math.ceil((t-Bt)/864e5)+e}ie.INTL=(t,e,n,r)=>{if((t=Lt(t))instanceof Error)return t;if((e=Lt(e))instanceof Error)return e;let o=!1;const i=[],a=[1,2,3,4,5,6,0],s=new RegExp("^[0|1]{7}$");if(void 0===n)n=zt[1];else if("string"==typeof n&&s.test(n)){o=!0,n=n.split("");for(let t=0;t0?l.getUTCDay():l.getDay();let e=o?i.includes(t):t===n[0]||t===n[1];for(let t=0;t{if((t=Lt(t))instanceof Error)return t;if((e=bt(e))instanceof Error)return e;if(e<0)return yt;if(!((n=void 0===n?zt[1]:zt[n])instanceof Array))return mt;void 0===r?r=[]:r instanceof Array||(r=[r]);for(let t=0;t",">=","<","<=","=","<>"],Ae="operator",_e="literal",Re=[Ae,_e],Ne=Ae,Oe=_e;function Ie(t,e){if(-1===Re.indexOf(e))throw new Error("Unsupported token type: "+e);return{value:t,type:e}}function Se(t){return function(t){let e="";const n=[];for(let r=0;r=0?n.push(Ie(o,Ne)):e+=o}return e.length>0&&n.push(Ie(function(t){return"string"!=typeof t||/^\d+(\.\d+)?$/.test(t)&&(t=-1===t.indexOf(".")?parseInt(t,10):parseFloat(t)),t}(e),Oe)),n.length>0&&n[0].type!==Ne&&n.unshift(Ie(Ee,Ne)),n}(function(t){const e=t.length,n=[];let r=0,o="",i="";for(;r":case"<":case"=":i+=e,o.length>0&&(n.push(o),o="");break;default:i.length>0&&(n.push(i),i=""),o+=e}r++}return o.length>0&&n.push(o),i.length>0&&n.push(i),n}(t))}const xe=function(t){const e=[];let n;for(let r=0;r":n=t[0]>t[1];break;case">=":n=t[0]>=t[1];break;case"<":n=t[0]":n=t[0]!=t[1]}return n}(e,n)};function be(){throw new Error("CELL is not implemented")}const Me={};function Ce(){throw new Error("INFO is not implemented")}function Le(t){return null===t}function Pe(t){return/^[01]{1,10}$/.test(t)}function we(t){return[mt,gt,dt,yt,vt,pt].indexOf(t)>=0||"number"==typeof t&&(isNaN(t)||!isFinite(t))}function De(t){return we(t)||t===Et}function ke(t){return!(1&Math.floor(Math.abs(t)))}function Ue(){throw new Error("ISFORMULA is not implemented")}function Fe(t){return!0===t||!1===t}function je(t){return t===Et}function Ve(t){return"string"!=typeof t}function Be(t){return"number"==typeof t&&!isNaN(t)&&isFinite(t)}function Ge(t){return!!(1&Math.floor(Math.abs(t)))}function We(){throw new Error("ISREF is not implemented")}function ze(t){return"string"==typeof t}function Ye(t){return Be(t)?t:t instanceof Date?t.getTime():!0===t?1:!1===t?0:De(t)?t:0}function qe(){return Et}function Ke(){throw new Error("SHEET is not implemented")}function He(){throw new Error("SHEETS is not implemented")}function Xe(t){return Be(t)?1:ze(t)?2:Fe(t)?4:De(t)?16:Array.isArray(t)?64:void 0}function $e(){if(arguments.length<2)return Et;const t=arguments[0];return t<1||t>254||arguments.lengtho.map(t=>t[e])):mt,n,r);var o}function tn(t,e,n){const r=wt(t,e,n);if(r)return r;if(!Array.isArray(t))return mt;const o=t.length>0&&!Array.isArray(t[0]);return o&&!n?(n=e,e=1):(n=n||1,e=e||1),n<0||e<0?mt:o&&1===e&&n<=t.length?t[n-1]:e<=t.length&&n<=t[e-1].length?t[e-1][n-1]:gt}function en(t,e,n){e=Nt(e),n=n?Nt(n):e;const r="number"==typeof t;let o=Et;for(let i=0;it)return o}return o}function nn(t,e,n){if(!t||!e)return Et;if(2===arguments.length&&(n=1),!((e=Nt(e))instanceof Array))return Et;if(-1!==n&&0!==n&&1!==n)return Et;let r,o;for(let i=0;io&&(r=i+1,o=e[i]):(r=i+1,o=e[i]))}else if(0===n){if("string"==typeof t&&"string"==typeof e[i]){const n=t.toLowerCase().replace(/\?/g,".").replace(/\*/g,".*").replace(/~/g,"\\");if(new RegExp("^"+n+"$").test(e[i].toLowerCase()))return i+1}else if(e[i]===t)return i+1}else if(-1===n){if(e[i]===t)return i+1;e[i]>t&&(o?e[i]t&&(a=!0)}return o}Me.TYPE=t=>{switch(t){case pt:return 1;case dt:return 2;case mt:return 3;case gt:return 4;case vt:return 5;case yt:return 6;case Et:return 7;case At:return 8}return Et};const un=2.5066282746310002;function cn(){const t=Nt(arguments).filter(Dt);if(0===t.length)return yt;const e=Ct(t);return e instanceof Error?e:ht.sum(ht(e).subtract(ht.mean(e)).abs()[0])/e.length}function ln(){const t=Nt(arguments).filter(Dt);if(0===t.length)return dt;const e=wt.apply(void 0,t);if(e)return e;const n=It(t),r=n.length;let o,i=0,a=0;for(let t=0;t(r=void 0===r?0:r,o=void 0===o?1:o,kt(t=bt(t),e=bt(e),n=bt(n),r=bt(r),o=bt(o))?mt:ht.beta.inv(t,e,n)*(o-r)+r)},mn={DIST:(t,e,n,r)=>kt(t=bt(t),e=bt(e),n=bt(n),r=bt(r))?mt:r?ht.binomial.cdf(t,e,n):ht.binomial.pdf(t,e,n)};mn.DIST.RANGE=(t,e,n,r)=>{if(r=void 0===r?n:r,kt(t=bt(t),e=bt(e),n=bt(n),r=bt(r)))return mt;let o=0;for(let i=n;i<=r;i++)o+=Wr(t,i)*Math.pow(e,i)*Math.pow(1-e,t-i);return o},mn.INV=(t,e,n)=>{if(kt(t=bt(t),e=bt(e),n=bt(n)))return mt;let r=0;for(;r<=t;){if(ht.binomial.cdf(r,t,e)>=n)return r;r++}};const gn={DIST:(t,e,n)=>kt(t=bt(t),e=bt(e))?mt:n?ht.chisquare.cdf(t,e):ht.chisquare.pdf(t,e)};gn.DIST.RT=(t,e)=>!t|!e?Et:t<1||e>Math.pow(10,10)?yt:"number"!=typeof t||"number"!=typeof e?mt:1-ht.chisquare.cdf(t,e),gn.INV=(t,e)=>kt(t=bt(t),e=bt(e))?mt:ht.chisquare.inv(t,e),gn.INV.RT=(t,e)=>!t|!e?Et:t<0||t>1||e<1||e>Math.pow(10,10)?yt:"number"!=typeof t||"number"!=typeof e?mt:ht.chisquare.inv(1-t,e),gn.TEST=function(t,e){if(2!==arguments.length)return Et;if(!(t instanceof Array&&e instanceof Array))return mt;if(t.length!==e.length)return mt;if(t[0]&&e[0]&&t[0].length!==e[0].length)return mt;const n=t.length;let r,o,i;for(o=0;o=2;)n=n*t/r,r-=2;let o=n,i=e;for(;o>1e-10*n;)i+=2,o=o*t/i,n+=o;return 1-n}(u,s))/1e6};const vn={};function yn(t,e){return kt(t=Ct(Nt(t)),e=Ct(Nt(e)))?mt:ht.corrcoeff(t,e)}function En(){return It(Nt(arguments)).length}function Tn(){const t=Nt(arguments);return t.length-_n(t)}function An(t,e){let n=0;t=Nt(t);for(let r=0;rkt(t=bt(t),e=bt(e),n=bt(n))?mt:ht.normalci(1,t,e,n)[1]-1,vn.T=(t,e,n)=>kt(t=bt(t),e=bt(e),n=bt(n))?mt:ht.tci(1,t,e,n)[1]-1;const In={};function Sn(){const t=Ct(Nt(arguments));if(t instanceof Error)return t;const e=ht.mean(t);let n=0;for(let r=0;r{if(kt(t=Ct(Nt(t)),e=Ct(Nt(e))))return mt;const n=ht.mean(t),r=ht.mean(e);let o=0;const i=t.length;for(let a=0;akt(t=Ct(Nt(t)),e=Ct(Nt(e)))?mt:ht.covariance(t,e);const xn={DIST:(t,e,n)=>kt(t=bt(t),e=bt(e))?mt:n?ht.exponential.cdf(t,e):ht.exponential.pdf(t,e)},bn={};function Mn(t){return(t=bt(t))instanceof Error?t:Math.log((1+t)/(1-t))/2}function Cn(t){if((t=bt(t))instanceof Error)return t;const e=Math.exp(2*t);return(e-1)/(e+1)}function Ln(t,e,n){if(kt(t=bt(t),e=Ct(Nt(e)),n=Ct(Nt(n))))return mt;const r=ht.mean(n),o=ht.mean(e),i=n.length;let a=0,s=0;for(let t=0;te[i-1]&&t[a]<=e[i]&&(o[i]+=1):i===r&&t[a]>e[r-1]&&(o[r]+=1)}return o}function wn(t){return(t=bt(t))instanceof Error?t:0===t||parseInt(t,10)===t&&t<0?yt:ht.gammafn(t)}function Dn(t){return(t=bt(t))instanceof Error?t:ht.gammaln(t)}function kn(t){return(t=bt(t))instanceof Error?t:ht.normal.cdf(t,0,1)-.5}function Un(){const t=Ct(Nt(arguments));return t instanceof Error?t:ht.geomean(t)}function Fn(t,e,n,r){if((t=Ct(t))instanceof Error)return t;let o;if(void 0===e)for(e=[],o=1;o<=t.length;o++)e.push(o);if(void 0===n)for(n=[],o=1;o<=t.length;o++)n.push(o);if(kt(e=Ct(e),n=Ct(n)))return mt;void 0===r&&(r=!0);const i=t.length;let a,s,u=0,c=0,l=0,f=0;for(o=0;okt(t=bt(t),e=bt(e),n=bt(n))?mt:r?ht.centralF.cdf(t,e,n):ht.centralF.pdf(t,e,n),bn.DIST.RT=function(t,e,n){return 3!==arguments.length?Et:t<0||e<1||n<1?yt:"number"!=typeof t||"number"!=typeof e||"number"!=typeof n?mt:1-ht.centralF.cdf(t,e,n)},bn.INV=(t,e,n)=>kt(t=bt(t),e=bt(e),n=bt(n))?mt:t<=0||t>1?yt:ht.centralF.inv(t,e,n),bn.INV.RT=function(t,e,n){return 3!==arguments.length?Et:t<0||t>1||e<1||e>Math.pow(10,10)||n<1||n>Math.pow(10,10)?yt:"number"!=typeof t||"number"!=typeof e||"number"!=typeof n?mt:ht.centralF.inv(1-t,e,n)},bn.TEST=(t,e)=>{if(!t||!e)return Et;if(!(t instanceof Array&&e instanceof Array))return Et;if(t.length<2||e.length<2)return dt;const n=(t,e)=>{let n=0;for(let r=0;r1||e<=0||n<=0?yt:"number"!=typeof t||"number"!=typeof e||"number"!=typeof n?mt:ht.gamma.inv(t,e,n)},Dn.PRECISE=function(t){return 1!==arguments.length?Et:t<=0?yt:"number"!=typeof t?mt:ht.gammaln(t)};const Vn={};function Bn(t,e){return kt(t=Ct(t),e=Ct(e))?mt:t.length!==e.length?Et:Ln(0,t,e)}function Gn(){const t=Ct(Nt(arguments));if(t instanceof Error)return t;const e=ht.mean(t),n=t.length;let r=0;for(let o=0;oe-t)[e-1]}function zn(t,e){if(kt(t=Ct(Nt(t)),e=Ct(Nt(e))))return mt;const n=ht.mean(t),r=ht.mean(e),o=e.length;let i=0,a=0;for(let s=0;s{if(kt(t=bt(t),e=bt(e),n=bt(n),r=bt(r)))return mt;function i(t,e,n,r){return Wr(n,t)*Wr(r-n,e-t)/Wr(r,e)}return o?function(t,e,n,r){let o=0;for(let a=0;a<=t;a++)o+=i(a,e,n,r);return o}(t,e,n,r):i(t,e,n,r)};const qn={};function Kn(){const t=Nt(arguments),e=wt.apply(void 0,t);if(e)return e;const n=It(t);return 0===n.length?0:Math.max.apply(Math,n)}function Hn(){const t=Nt(arguments),e=wt.apply(void 0,t);if(e)return e;let n=Ft(t);return n=n.map(t=>null==t?0:t),0===n.length?0:Math.max.apply(Math,n)}function Xn(){const t=Nt(arguments),e=wt.apply(void 0,t);if(e)return e;const n=Ft(t);let r=ht.median(n);return isNaN(r)&&(r=yt),r}function $n(){const t=Nt(arguments),e=wt.apply(void 0,t);if(e)return e;const n=It(t);return 0===n.length?0:Math.min.apply(Math,n)}function Zn(){const t=Nt(arguments),e=wt.apply(void 0,t);if(e)return e;let n=Ft(t);return n=n.map(t=>null==t?0:t),0===n.length?0:Math.min.apply(Math,n)}qn.DIST=(t,e,n,r)=>kt(t=bt(t),e=bt(e),n=bt(n))?mt:r?ht.lognormal.cdf(t,e,n):ht.lognormal.pdf(t,e,n),qn.INV=(t,e,n)=>kt(t=bt(t),e=bt(e),n=bt(n))?mt:ht.lognormal.inv(t,e,n);const Qn={MULT:function(){const t=Ct(Nt(arguments));if(t instanceof Error)return t;const e=t.length,n={};let r,o=[],i=0;for(let a=0;ai&&(i=n[r],o=[]),n[r]===i&&(o[o.length]=r);return o},SNGL:function(){const t=Ct(Nt(arguments));return t instanceof Error?t:Qn.MULT(t).sort((t,e)=>t-e)[0]}},Jn={DIST:(t,e,n,r)=>kt(t=bt(t),e=bt(e),n=bt(n))?mt:r?ht.negbin.cdf(t,e,n):ht.negbin.pdf(t,e,n)},tr={};function er(t,e){if(kt(e=Ct(Nt(e)),t=Ct(Nt(t))))return mt;const n=ht.mean(t),r=ht.mean(e),o=t.length;let i=0,a=0,s=0;for(let u=0;ukt(t=bt(t),e=bt(e),n=bt(n))?mt:n<=0?yt:r?ht.normal.cdf(t,e,n):ht.normal.pdf(t,e,n),tr.INV=(t,e,n)=>kt(t=bt(t),e=bt(e),n=bt(n))?mt:ht.normal.inv(t,e,n),tr.S={},tr.S.DIST=(t,e)=>(t=bt(t))instanceof Error?mt:e?ht.normal.cdf(t,0,1):ht.normal.pdf(t,0,1),tr.S.INV=t=>(t=bt(t))instanceof Error?mt:ht.normal.inv(t,0,1);const nr={EXC:(t,e)=>{if(kt(t=Ct(Nt(t)),e=bt(e)))return mt;const n=(t=t.sort((t,e)=>t-e)).length;if(e<1/(n+1)||e>1-1/(n+1))return yt;const r=e*(n+1)-1,o=Math.floor(r);return St(r===o?t[r]:t[o]+(r-o)*(t[o+1]-t[o]))},INC:(t,e)=>{if(kt(t=Ct(Nt(t)),e=bt(e)))return mt;const n=e*((t=t.sort((t,e)=>t-e)).length-1),r=Math.floor(n);return St(n===r?t[n]:t[r]+(n-r)*(t[r+1]-t[r]))}},rr={};function or(t,e){return kt(t=bt(t),e=bt(e))?mt:no(t)/no(t-e)}function ir(t,e){return kt(t=bt(t),e=bt(e))?mt:Math.pow(t,e)}function ar(t){return(t=bt(t))instanceof Error?mt:Math.exp(-.5*t*t)/un}rr.EXC=(t,e,n)=>{if(n=void 0===n?3:n,kt(t=Ct(Nt(t)),e=bt(e),n=bt(n)))return mt;t=t.sort((t,e)=>t-e);const r=an.apply(null,t),o=t.length,i=r.length,a=Math.pow(10,n);let s=0,u=!1,c=0;for(;!u&&c=r[c]&&(e{if(n=void 0===n?3:n,kt(t=Ct(Nt(t)),e=bt(e),n=bt(n)))return mt;t=t.sort((t,e)=>t-e);const r=an.apply(null,t),o=t.length,i=r.length,a=Math.pow(10,n);let s=0,u=!1,c=0;for(;!u&&c=r[c]&&(e=0?e[t.indexOf(n)]:0;const o=t.sort((t,e)=>t-e),i=o.length;let a=0;for(let s=0;s=n&&o[s]<=r&&(a+=e[t.indexOf(o[s])]);return a}sr.DIST=(t,e,n)=>kt(t=bt(t),e=bt(e))?mt:n?ht.poisson.cdf(t,e):ht.poisson.pdf(t,e);const cr={EXC:(t,e)=>{if(kt(t=Ct(Nt(t)),e=bt(e)))return mt;switch(e){case 1:return nr.EXC(t,.25);case 2:return nr.EXC(t,.5);case 3:return nr.EXC(t,.75);default:return yt}},INC:(t,e)=>{if(kt(t=Ct(Nt(t)),e=bt(e)))return mt;switch(e){case 1:return nr.INC(t,.25);case 2:return nr.INC(t,.5);case 3:return nr.INC(t,.75);default:return yt}}},lr={};function fr(t,e){return 2!==arguments.length?Et:e<0?yt:t instanceof Array&&"number"==typeof e?0!==t.length?ht.row(t,e):void 0:mt}function hr(t,e){return kt(t=Ct(Nt(t)),e=Ct(Nt(e)))?mt:Math.pow(er(t,e),2)}function pr(){const t=Ct(Nt(arguments));if(t instanceof Error)return t;const e=ht.mean(t),n=t.length;let r=0;for(let o=0;ot-e)[e-1]}function gr(t,e,n){return kt(t=bt(t),e=bt(e),n=bt(n))?mt:(t-e)/n}lr.AVG=(t,e,n)=>{if(kt(t=bt(t),e=Ct(Nt(e))))return mt;const r=(n=n||!1)?(t,e)=>t-e:(t,e)=>e-t,o=(e=(e=Nt(e)).sort(r)).length;let i=0;for(let n=0;n1?(2*e.indexOf(t)+i+1)/2:e.indexOf(t)+1},lr.EQ=(t,e,n)=>{if(kt(t=bt(t),e=Ct(Nt(e))))return mt;const r=(n=n||!1)?(t,e)=>t-e:(t,e)=>e-t;return(e=e.sort(r)).indexOf(t)+1},pr.P=function(){const t=Ct(Nt(arguments));if(t instanceof Error)return t;const e=ht.mean(t),n=t.length;let r=0,o=0;for(let i=0;i{a.push(o*t+i)}),a}function Rr(t,e){if(kt(t=Ct(Nt(t)),e=bt(e)))return mt;const n=oo(t.length*e,2)/2;return ht.mean((o=(o=n)||1,(r=jt(t.sort((t,e)=>t-e),n))&&"function"==typeof r.slice?r.slice(0,r.length-o):r));var r,o}Ar.DIST=(t,e,n)=>1!==n&&2!==n?yt:1===n?Ar.DIST.RT(t,e):Ar.DIST["2T"](t,e),Ar.DIST["2T"]=function(t,e){return 2!==arguments.length?Et:t<0||e<1?yt:"number"!=typeof t||"number"!=typeof e?mt:2*(1-ht.studentt.cdf(t,e))},Ar.DIST.RT=function(t,e){return 2!==arguments.length?Et:t<0||e<1?yt:"number"!=typeof t||"number"!=typeof e?mt:1-ht.studentt.cdf(t,e)},Ar.INV=(t,e)=>kt(t=bt(t),e=bt(e))?mt:ht.studentt.inv(t,e),Ar.INV["2T"]=(t,e)=>(t=bt(t),e=bt(e),t<=0||t>1||e<1?yt:kt(t,e)?mt:Math.abs(ht.studentt.inv(t/2,e))),Ar.TEST=(t,e)=>{if(kt(t=Ct(Nt(t)),e=Ct(Nt(e))))return mt;const n=ht.mean(t),r=ht.mean(e);let o,i=0,a=0;for(o=0;okt(t=bt(t),e=bt(e),n=bt(n))?mt:r?1-Math.exp(-Math.pow(t/n,e)):Math.pow(t,e-1)*Math.exp(-Math.pow(t/n,e))*e/Math.pow(n,e)},xr={};function br(t){return(t=bt(t))instanceof Error?t:Math.abs(t)}function Mr(t){if((t=bt(t))instanceof Error)return t;let e=Math.acos(t);return isNaN(e)&&(e=yt),e}function Cr(t){if((t=bt(t))instanceof Error)return t;let e=Math.log(t+Math.sqrt(t*t-1));return isNaN(e)&&(e=yt),e}function Lr(t){return(t=bt(t))instanceof Error?t:Math.atan(1/t)}function Pr(t){if((t=bt(t))instanceof Error)return t;let e=.5*Math.log((t+1)/(t-1));return isNaN(e)&&(e=yt),e}function wr(t,e,n,r){if(kt(t=bt(t),bt(t)))return mt;switch(t){case 1:return ln(n);case 2:return En(n);case 3:return Tn(n);case 4:return Kn(n);case 5:return $n(n);case 6:return No(n);case 7:return vr.S(n);case 8:return vr.P(n);case 9:return ei(n);case 10:return Nr.S(n);case 11:return Nr.P(n);case 12:return Xn(n);case 13:return Qn.SNGL(n);case 14:return Wn(n,r);case 15:return mr(n,r);case 16:return nr.INC(n,r);case 17:return cr.INC(n,r);case 18:return nr.EXC(n,r);case 19:return cr.EXC(n,r)}}function Dr(t){if(null==t)return 0;if(t instanceof Error)return t;if(!/^M*(?:D?C{0,3}|C[MD])(?:L?X{0,3}|X[CL])(?:V?I{0,3}|I[XV])$/.test(t))return mt;let e=0;return t.replace(/[MDLV]|C[MD]?|X[CL]?|I[XV]?/g,t=>{e+={M:1e3,CM:900,D:500,CD:400,C:100,XC:90,L:50,XL:40,X:10,IX:9,V:5,IV:4,I:1}[t]}),e}function kr(t){if((t=bt(t))instanceof Error)return t;let e=Math.asin(t);return isNaN(e)&&(e=yt),e}function Ur(t){return(t=bt(t))instanceof Error?t:Math.log(t+Math.sqrt(t*t+1))}function Fr(t){return(t=bt(t))instanceof Error?t:Math.atan(t)}function jr(t,e){return wt(t=bt(t),e=bt(e))||Math.atan2(t,e)}function Vr(t){if((t=bt(t))instanceof Error)return t;let e=Math.log((1+t)/(1-t))/2;return isNaN(e)&&(e=yt),e}function Br(t,e,n){const r=wt(t=bt(t),e=bt(e),n=bt(n));if(r)return r;if(0===e)return yt;const o=t.toString(e);return new Array(Math.max(n+1-o.length,0)).join("0")+o}function Gr(t,e,n){const r=wt(t=bt(t),e=bt(e),n=bt(n));if(r)return r;if(0===e)return 0;e=Math.abs(e);const o=-Math.floor(Math.log(e)/Math.log(10));return t>=0?Mo(Math.ceil(t/e)*e,o):0===n?-Mo(Math.floor(Math.abs(t)/e)*e,o):-Mo(Math.ceil(Math.abs(t)/e)*e,o)}function Wr(t,e){return wt(t=bt(t),e=bt(e))||(t1?Tt:(t=bt(t))instanceof Error?t:t=Math.exp(t)}xr.TEST=(t,e,n)=>{if(kt(t=Ct(Nt(t)),e=bt(e)))return mt;n=n||vr.S(t);const r=t.length;return 1-tr.S.DIST((ln(t)-e)/(n/Math.sqrt(r)),!0)},Gr.MATH=Gr,Gr.PRECISE=Gr;const eo=[];function no(t){if((t=bt(t))instanceof Error)return t;const e=Math.floor(t);return 0===e||1===e?1:(eo[e]>0||(eo[e]=no(e-1)*e),eo[e])}function ro(t){if((t=bt(t))instanceof Error)return t;const e=Math.floor(t);return e<=0?1:e*ro(e-2)}function oo(t,e){const n=wt(t=bt(t),e=bt(e));if(n)return n;if(0===e)return 0;if(!(t>=0&&e>0||t<=0&&e<0))return yt;e=Math.abs(e);const r=-Math.floor(Math.log(e)/Math.log(10));return t>=0?Mo(Math.floor(t/e)*e,r):-Mo(Math.ceil(Math.abs(t)/e),r)}function io(){const t=Ct(Nt(arguments));if(t instanceof Error)return t;const e=t.length,n=t[0];let r=n<0?-n:n;for(let n=1;no?r%=o:o%=r;r+=o}return r}function ao(t){return(t=bt(t))instanceof Error?t:Math.floor(t)}oo.MATH=(t,e,n)=>{if(e instanceof Error)return e;e=void 0===e?0:e;const r=wt(t=bt(t),e=bt(e),n=bt(n));if(r)return r;if(0===e)return 0;e=e?Math.abs(e):1;const o=-Math.floor(Math.log(e)/Math.log(10));return t>=0?Mo(Math.floor(t/e)*e,o):0===n||void 0===n?-Mo(Math.ceil(Math.abs(t)/e)*e,o):-Mo(Math.floor(Math.abs(t)/e)*e,o)},oo.PRECISE=oo.MATH;const so={CEILING:Gr};function uo(){const t=Ct(Nt(arguments));if(t instanceof Error)return t;for(var e,n,r,o,i=1;void 0!==(r=t.pop());){if(0===r)return 0;for(;r>1;){if(r%2){for(e=3,n=Math.floor(Math.sqrt(r));e<=n&&r%e;e+=2);o=e<=n?e:r}else o=2;for(r/=o,i*=o,e=t.length;e;t[--e]%o===0&&1===(t[e]/=o)&&t.splice(e,1));}}return i}function co(t){return(t=bt(t))instanceof Error?t:0===t?yt:Math.log(t)}function lo(){return Math.log(10)}function fo(){return Math.log(2)}function ho(){return Math.LOG10E}function po(){return Math.LOG2E}function mo(t,e){return wt(t=bt(t),e=bt(e))||(0===t||0===e?yt:Math.log(t)/Math.log(e))}function go(t){return(t=bt(t))instanceof Error?t:0===t?yt:Math.log(t)/Math.log(10)}function vo(t,e){const n=wt(t=bt(t),e=bt(e));if(n)return n;if(0===e)return dt;let r=Math.abs(t%e);return r=t<0?e-r:r,e>0?r:-r}function yo(t,e){return wt(t=bt(t),e=bt(e))||(t*e===0?0:t*e<0?yt:Math.round(t/e)*e)}function Eo(){const t=Ct(Nt(arguments));if(t instanceof Error)return t;let e=0,n=1;for(let r=0;r=0?e:-e}function Ao(){return Math.PI}function _o(){return Math.E}function Ro(t,e){const n=wt(t=bt(t),e=bt(e));if(n)return n;if(0===t&&0===e)return yt;const r=Math.pow(t,e);return isNaN(r)?yt:r}function No(){const t=Nt(arguments).filter(t=>null!=t);if(0===t.length)return 0;const e=Ct(t);if(e instanceof Error)return e;let n=1;for(let t=0;t0?1:-1)*Math.floor(Math.abs(t)*Math.pow(10,e))/Math.pow(10,e)}function Lo(t,e){const n=wt(t=bt(t),e=bt(e));return n||(t>0?1:-1)*Math.ceil(Math.abs(t)*Math.pow(10,e))/Math.pow(10,e)}function Po(t){return(t=bt(t))instanceof Error?t:1/Math.cos(t)}function wo(t){return(t=bt(t))instanceof Error?t:2/(Math.exp(t)+Math.exp(-t))}function Do(t,e,n,r){if(kt(t=bt(t),e=bt(e),n=bt(n),r=Ct(r)))return mt;let o=r[0]*Math.pow(t,e);for(let i=1;ie}function Xo(t,e){if(2!==arguments.length)return Et;Ut(t,e)?(t=Mt(t),e=Mt(e)):(t=bt(t),e=bt(e));return wt(t,e)||t>=e}function $o(t,e){if(2!==arguments.length)return Et;Ut(t,e)?(t=Mt(t),e=Mt(e)):(t=bt(t),e=bt(e));return wt(t,e)||t{if(t instanceof Error)return!1;if(e instanceof Error)t=e;else if("number"==typeof e)t+=e;else if("string"==typeof e){const n=parseFloat(e);!isNaN(n)&&(t+=n)}else if(Array.isArray(e)){const n=ei.apply(null,e);n instanceof Error?t=n:t+=n}}),t}function ni(t,e,n){if(t=Nt(t),n=n?Nt(n):t,t instanceof Error)return t;if(null==e||e instanceof Error)return 0;let r=0;const o="*"===e,i=o?null:Se(e+"");for(let e=0;e0?1:-1)*Math.floor(Math.abs(t)*Math.pow(10,e))/Math.pow(10,e)}function hi(){throw new Error("ASC is not implemented")}function pi(){throw new Error("BAHTTEXT is not implemented")}function di(t){return 0===(t=bt(t))?mt:t instanceof Error?t:String.fromCharCode(t)}function mi(t){return kt(t)?t:(t=t||"").replace(/[\0-\x1F]/g,"")}function gi(t){if(kt(t))return t;let e=(t=t||"").charCodeAt(0);return isNaN(e)&&(e=mt),e}function vi(){const t=Nt(arguments),e=wt.apply(void 0,t);if(e)return e;let n=0;for(;(n=t.indexOf(!0))>-1;)t[n]="TRUE";let r=0;for(;(r=t.indexOf(!1))>-1;)t[r]="FALSE";return t.join("")}const yi=vi;function Ei(){throw new Error("DBCS is not implemented")}function Ti(t,e=2){if(t=bt(t),isNaN(t))return mt;const n={style:"currency",currency:"USD",minimumFractionDigits:e>=0?e:0,maximumFractionDigits:e>=0?e:0},r=(t=Mo(t,e)).toLocaleString("en-US",n);return t<0?"$("+r.slice(2)+")":r}function Ai(t,e){if(2!==arguments.length)return Et;return wt(t,e)||(t=Mt(t))===Mt(e)}function _i(t,e,n){if(arguments.length<2)return Et;t=Mt(t),n=void 0===n?0:n;const r=(e=Mt(e)).indexOf(t,n-1);return-1===r?mt:r+1}function Ri(t,e=2,n=!1){if(t=bt(t),isNaN(t))return mt;if(e=bt(e),isNaN(e))return mt;if(e<0){const n=Math.pow(10,-e);t=Math.round(t/n)*n}else t=t.toFixed(e);if(n)t=t.toString().replace(/,/g,"");else{const e=t.toString().split(".");e[0]=e[0].replace(/\B(?=(\d{3})+$)/g,","),t=e.join(".")}return t}function Ni(t){if(kt(t))return t;let e="";return t&&(t instanceof Array?t.forEach(t=>{""!==e&&(e+="\n"),e+=t.replace(/<(?:.|\n)*?>/gm,"")}):e=t.replace(/<(?:.|\n)*?>/gm,"")),e}function Oi(t,e){return wt(t,e)||(t=Mt(t),(e=bt(e=void 0===e?1:e))instanceof Error||"string"!=typeof t?mt:t.substring(0,e))}function Ii(t){return 0===arguments.length?Tt:t instanceof Error?t:Array.isArray(t)?mt:Mt(t).length}function Si(t){return 1!==arguments.length?mt:kt(t=Mt(t))?t:t.toLowerCase()}function xi(t,e,n){if(null==e)return mt;if(kt(e=bt(e),n=bt(n))||"string"!=typeof t)return n;const r=e-1,o=r+n;return t.substring(r,o)}function bi(t,e,n){return"number"==typeof(t=Dt(t)?t:"")?t:"string"!=typeof t?Et:(e=void 0===e?".":e,n=void 0===n?",":n,Number(t.replace(e,".").replace(n,"")))}function Mi(){throw new Error("PRONETIC is not implemented")}function Ci(t){return kt(t)?t:isNaN(t)&&"number"==typeof t?mt:(t=Mt(t)).replace(/\w\S*/g,t=>t.charAt(0).toUpperCase()+t.substr(1).toLowerCase())}function Li(t,e){if(arguments.length<2)return Et;const n=t.match(new RegExp(e));return n?n[n.length>1?n.length-1:0]:null}function Pi(t,e,n){if(arguments.length<2)return Et;const r=t.match(new RegExp(e));return n?r:!!r}function wi(t,e,n){return arguments.length<3?Et:t.replace(new RegExp(e),n)}function Di(t,e,n,r){return kt(e=bt(e),n=bt(n))||"string"!=typeof t||"string"!=typeof r?mt:t.substr(0,e-1)+r+t.substr(e-1+n)}function ki(t,e){return wt(t,e)||(t=Mt(t),(e=bt(e))instanceof Error?e:new Array(e+1).join(t))}function Ui(t,e){return wt(t,e)||(t=Mt(t),(e=bt(e=void 0===e?1:e))instanceof Error?e:t.substring(t.length-e))}function Fi(t,e,n){let r;return"string"!=typeof t||"string"!=typeof e?mt:(n=void 0===n?0:n,r=e.toLowerCase().indexOf(t.toLowerCase(),n-1)+1,0===r?mt:r)}function ji(t,e){return t.split(e)}function Vi(t,e,n,r){if(arguments.length<3)return Et;if(t&&e){if(void 0===r)return t.split(e).join(n);{if(r=Math.floor(Number(r)),Number.isNaN(r)||r<=0)return mt;let o=0,i=0;for(;o>-1&&t.indexOf(e,o)>-1;)if(o=t.indexOf(e,o+1),i++,o>-1&&i===r)return t.substring(0,o)+n+t.substring(o+e.length);return t}}return t}function Bi(t){return t instanceof Error||"string"==typeof t?t:""}function Gi(t,e){if(void 0===t||void 0===e)return Et;const n=e.startsWith("$")?"$":"",r=e.endsWith("%");return r&&(t*=100),t=(t=Ri(t,(e=e.replace(/%/g,"").replace(/\$/g,"")).split(".")[1].match(/0/g).length,!e.includes(","))).startsWith("-")?"-"+n+(t=t.replace("-","")):n+t,r&&(t+="%"),t}function Wi(t,e,...n){if("boolean"!=typeof e&&(e=xt(e)),arguments.length<3)return Et;t=null!=t?t:"";let r=Nt(n),o=e?r.filter(t=>t):r;if(Array.isArray(t)){t=Nt(t);let e=o.map(t=>[t]),n=0;for(let r=0;r=r.length?ki("0",e-r.length)+r:yt}function na(t,e){if(!Xi(t))return yt;const n=t.toString();if(10===n.length&&"1"===n.substring(0,1))return(1073741312+parseInt(n.substring(1),2)).toString(8);const r=parseInt(t,2).toString(8);return void 0===e?r:isNaN(e)?mt:e<0?yt:(e=Math.floor(e))>=r.length?ki("0",e-r.length)+r:yt}function ra(t,e){return kt(t=bt(t),e=bt(e))?mt:t<0||e<0||Math.floor(t)!==t||Math.floor(e)!==e||t>0xffffffffffff||e>0xffffffffffff?yt:t&e}function oa(t,e){return kt(t=bt(t),e=bt(e))?mt:t<0||Math.floor(t)!==t||t>0xffffffffffff||Math.abs(e)>53?yt:e>=0?t<>-e}function ia(t,e){return kt(t=bt(t),e=bt(e))?mt:t<0||e<0||Math.floor(t)!==t||Math.floor(e)!==e||t>0xffffffffffff||e>0xffffffffffff?yt:t|e}function aa(t,e){return kt(t=bt(t),e=bt(e))?mt:t<0||Math.floor(t)!==t||t>0xffffffffffff||Math.abs(e)>53?yt:e>=0?t>>e:t<<-e}function sa(t,e){return kt(t=bt(t),e=bt(e))?mt:t<0||e<0||Math.floor(t)!==t||Math.floor(e)!==e||t>0xffffffffffff||e>0xffffffffffff?yt:t^e}function ua(t,e,n){if(kt(t=bt(t),e=bt(e)))return t;if("i"!==(n=void 0===n?"i":n)&&"j"!==n)return mt;if(0===t&&0===e)return 0;if(0===t)return 1===e?n:e.toString()+n;if(0===e)return t.toString();{const r=e>0?"+":"";return t.toString()+r+(1===e?n:e.toString()+n)}}function ca(t,e,n){if((t=bt(t))instanceof Error)return t;const r=[["a.u. of action","?",null,"action",!1,!1,105457168181818e-48],["a.u. of charge","e",null,"electric_charge",!1,!1,160217653141414e-33],["a.u. of energy","Eh",null,"energy",!1,!1,435974417757576e-32],["a.u. of length","a?",null,"length",!1,!1,529177210818182e-25],["a.u. of mass","m?",null,"mass",!1,!1,910938261616162e-45],["a.u. of time","?/Eh",null,"time",!1,!1,241888432650516e-31],["admiralty knot","admkn",null,"speed",!1,!0,.514773333],["ampere","A",null,"electric_current",!0,!1,1],["ampere per meter","A/m",null,"magnetic_field_intensity",!0,!1,1],["ångström","Å",["ang"],"length",!1,!0,1e-10],["are","ar",null,"area",!1,!0,100],["astronomical unit","ua",null,"length",!1,!1,149597870691667e-25],["bar","bar",null,"pressure",!1,!1,1e5],["barn","b",null,"area",!1,!1,1e-28],["becquerel","Bq",null,"radioactivity",!0,!1,1],["bit","bit",["b"],"information",!1,!0,1],["btu","BTU",["btu"],"energy",!1,!0,1055.05585262],["byte","byte",null,"information",!1,!0,8],["candela","cd",null,"luminous_intensity",!0,!1,1],["candela per square metre","cd/m?",null,"luminance",!0,!1,1],["coulomb","C",null,"electric_charge",!0,!1,1],["cubic ångström","ang3",["ang^3"],"volume",!1,!0,1e-30],["cubic foot","ft3",["ft^3"],"volume",!1,!0,.028316846592],["cubic inch","in3",["in^3"],"volume",!1,!0,16387064e-12],["cubic light-year","ly3",["ly^3"],"volume",!1,!0,846786664623715e-61],["cubic metre","m?",null,"volume",!0,!0,1],["cubic mile","mi3",["mi^3"],"volume",!1,!0,4168181825.44058],["cubic nautical mile","Nmi3",["Nmi^3"],"volume",!1,!0,6352182208],["cubic Pica","Pica3",["Picapt3","Pica^3","Picapt^3"],"volume",!1,!0,7.58660370370369e-8],["cubic yard","yd3",["yd^3"],"volume",!1,!0,.764554857984],["cup","cup",null,"volume",!1,!0,.0002365882365],["dalton","Da",["u"],"mass",!1,!1,166053886282828e-41],["day","d",["day"],"time",!1,!0,86400],["degree","°",null,"angle",!1,!1,.0174532925199433],["degrees Rankine","Rank",null,"temperature",!1,!0,.555555555555556],["dyne","dyn",["dy"],"force",!1,!0,1e-5],["electronvolt","eV",["ev"],"energy",!1,!0,1.60217656514141],["ell","ell",null,"length",!1,!0,1.143],["erg","erg",["e"],"energy",!1,!0,1e-7],["farad","F",null,"electric_capacitance",!0,!1,1],["fluid ounce","oz",null,"volume",!1,!0,295735295625e-16],["foot","ft",null,"length",!1,!0,.3048],["foot-pound","flb",null,"energy",!1,!0,1.3558179483314],["gal","Gal",null,"acceleration",!1,!1,.01],["gallon","gal",null,"volume",!1,!0,.003785411784],["gauss","G",["ga"],"magnetic_flux_density",!1,!0,1],["grain","grain",null,"mass",!1,!0,647989e-10],["gram","g",null,"mass",!1,!0,.001],["gray","Gy",null,"absorbed_dose",!0,!1,1],["gross registered ton","GRT",["regton"],"volume",!1,!0,2.8316846592],["hectare","ha",null,"area",!1,!0,1e4],["henry","H",null,"inductance",!0,!1,1],["hertz","Hz",null,"frequency",!0,!1,1],["horsepower","HP",["h"],"power",!1,!0,745.69987158227],["horsepower-hour","HPh",["hh","hph"],"energy",!1,!0,2684519.538],["hour","h",["hr"],"time",!1,!0,3600],["imperial gallon (U.K.)","uk_gal",null,"volume",!1,!0,.00454609],["imperial hundredweight","lcwt",["uk_cwt","hweight"],"mass",!1,!0,50.802345],["imperial quart (U.K)","uk_qt",null,"volume",!1,!0,.0011365225],["imperial ton","brton",["uk_ton","LTON"],"mass",!1,!0,1016.046909],["inch","in",null,"length",!1,!0,.0254],["international acre","uk_acre",null,"area",!1,!0,4046.8564224],["IT calorie","cal",null,"energy",!1,!0,4.1868],["joule","J",null,"energy",!0,!0,1],["katal","kat",null,"catalytic_activity",!0,!1,1],["kelvin","K",["kel"],"temperature",!0,!0,1],["kilogram","kg",null,"mass",!0,!0,1],["knot","kn",null,"speed",!1,!0,.514444444444444],["light-year","ly",null,"length",!1,!0,9460730472580800],["litre","L",["l","lt"],"volume",!1,!0,.001],["lumen","lm",null,"luminous_flux",!0,!1,1],["lux","lx",null,"illuminance",!0,!1,1],["maxwell","Mx",null,"magnetic_flux",!1,!1,1e-18],["measurement ton","MTON",null,"volume",!1,!0,1.13267386368],["meter per hour","m/h",["m/hr"],"speed",!1,!0,.00027777777777778],["meter per second","m/s",["m/sec"],"speed",!0,!0,1],["meter per second squared","m?s??",null,"acceleration",!0,!1,1],["parsec","pc",["parsec"],"length",!1,!0,0x6da012f958ee1c],["meter squared per second","m?/s",null,"kinematic_viscosity",!0,!1,1],["metre","m",null,"length",!0,!0,1],["miles per hour","mph",null,"speed",!1,!0,.44704],["millimetre of mercury","mmHg",null,"pressure",!1,!1,133.322],["minute","?",null,"angle",!1,!1,.000290888208665722],["minute","min",["mn"],"time",!1,!0,60],["modern teaspoon","tspm",null,"volume",!1,!0,5e-6],["mole","mol",null,"amount_of_substance",!0,!1,1],["morgen","Morgen",null,"area",!1,!0,2500],["n.u. of action","?",null,"action",!1,!1,105457168181818e-48],["n.u. of mass","m?",null,"mass",!1,!1,910938261616162e-45],["n.u. of speed","c?",null,"speed",!1,!1,299792458],["n.u. of time","?/(me?c??)",null,"time",!1,!1,128808866778687e-35],["nautical mile","M",["Nmi"],"length",!1,!0,1852],["newton","N",null,"force",!0,!0,1],["œrsted","Oe ",null,"magnetic_field_intensity",!1,!1,79.5774715459477],["ohm","Ω",null,"electric_resistance",!0,!1,1],["ounce mass","ozm",null,"mass",!1,!0,.028349523125],["pascal","Pa",null,"pressure",!0,!1,1],["pascal second","Pa?s",null,"dynamic_viscosity",!0,!1,1],["pferdestärke","PS",null,"power",!1,!0,735.49875],["phot","ph",null,"illuminance",!1,!1,1e-4],["pica (1/6 inch)","pica",null,"length",!1,!0,.00035277777777778],["pica (1/72 inch)","Pica",["Picapt"],"length",!1,!0,.00423333333333333],["poise","P",null,"dynamic_viscosity",!1,!1,.1],["pond","pond",null,"force",!1,!0,.00980665],["pound force","lbf",null,"force",!1,!0,4.4482216152605],["pound mass","lbm",null,"mass",!1,!0,.45359237],["quart","qt",null,"volume",!1,!0,.000946352946],["radian","rad",null,"angle",!0,!1,1],["second","?",null,"angle",!1,!1,484813681109536e-20],["second","s",["sec"],"time",!0,!0,1],["short hundredweight","cwt",["shweight"],"mass",!1,!0,45.359237],["siemens","S",null,"electrical_conductance",!0,!1,1],["sievert","Sv",null,"equivalent_dose",!0,!1,1],["slug","sg",null,"mass",!1,!0,14.59390294],["square ångström","ang2",["ang^2"],"area",!1,!0,1e-20],["square foot","ft2",["ft^2"],"area",!1,!0,.09290304],["square inch","in2",["in^2"],"area",!1,!0,64516e-8],["square light-year","ly2",["ly^2"],"area",!1,!0,895054210748189e17],["square meter","m?",null,"area",!0,!0,1],["square mile","mi2",["mi^2"],"area",!1,!0,2589988.110336],["square nautical mile","Nmi2",["Nmi^2"],"area",!1,!0,3429904],["square Pica","Pica2",["Picapt2","Pica^2","Picapt^2"],"area",!1,!0,1792111111111e-17],["square yard","yd2",["yd^2"],"area",!1,!0,.83612736],["statute mile","mi",null,"length",!1,!0,1609.344],["steradian","sr",null,"solid_angle",!0,!1,1],["stilb","sb",null,"luminance",!1,!1,1e-4],["stokes","St",null,"kinematic_viscosity",!1,!1,1e-4],["stone","stone",null,"mass",!1,!0,6.35029318],["tablespoon","tbs",null,"volume",!1,!0,147868e-10],["teaspoon","tsp",null,"volume",!1,!0,492892e-11],["tesla","T",null,"magnetic_flux_density",!0,!0,1],["thermodynamic calorie","c",null,"energy",!1,!0,4.184],["ton","ton",null,"mass",!1,!0,907.18474],["tonne","t",null,"mass",!1,!1,1e3],["U.K. pint","uk_pt",null,"volume",!1,!0,.00056826125],["U.S. bushel","bushel",null,"volume",!1,!0,.03523907],["U.S. oil barrel","barrel",null,"volume",!1,!0,.158987295],["U.S. pint","pt",["us_pt"],"volume",!1,!0,.000473176473],["U.S. survey mile","survey_mi",null,"length",!1,!0,1609.347219],["U.S. survey/statute acre","us_acre",null,"area",!1,!0,4046.87261],["volt","V",null,"voltage",!0,!1,1],["watt","W",null,"power",!0,!0,1],["watt-hour","Wh",["wh"],"energy",!1,!0,3600],["weber","Wb",null,"magnetic_flux",!0,!1,1],["yard","yd",null,"length",!1,!0,.9144],["year","yr",null,"time",!1,!0,31557600]],o={Yi:["yobi",80,12089258196146292e8,"Yi","yotta"],Zi:["zebi",70,11805916207174113e5,"Zi","zetta"],Ei:["exbi",60,0x1000000000000000,"Ei","exa"],Pi:["pebi",50,0x4000000000000,"Pi","peta"],Ti:["tebi",40,1099511627776,"Ti","tera"],Gi:["gibi",30,1073741824,"Gi","giga"],Mi:["mebi",20,1048576,"Mi","mega"],ki:["kibi",10,1024,"ki","kilo"]},i={Y:["yotta",1e24,"Y"],Z:["zetta",1e21,"Z"],E:["exa",1e18,"E"],P:["peta",1e15,"P"],T:["tera",1e12,"T"],G:["giga",1e9,"G"],M:["mega",1e6,"M"],k:["kilo",1e3,"k"],h:["hecto",100,"h"],e:["dekao",10,"e"],d:["deci",.1,"d"],c:["centi",.01,"c"],m:["milli",.001,"m"],u:["micro",1e-6,"u"],n:["nano",1e-9,"n"],p:["pico",1e-12,"p"],f:["femto",1e-15,"f"],a:["atto",1e-18,"a"],z:["zepto",1e-21,"z"],y:["yocto",1e-24,"y"]};let a,s=null,u=null,c=e,l=n,f=1,h=1;for(let t=0;t=0)&&(s=r[t]),(r[t][1]===l||a.indexOf(l)>=0)&&(u=r[t]);if(null===s){const t=o[e.substring(0,2)];let n=i[e.substring(0,1)];"da"===e.substring(0,2)&&(n=["dekao",10,"da"]),t?(f=t[2],c=e.substring(2)):n&&(f=n[1],c=e.substring(n[2].length));for(let t=0;t=0)&&(s=r[t])}if(null===u){const t=o[n.substring(0,2)];let e=i[n.substring(0,1)];"da"===n.substring(0,2)&&(e=["dekao",10,"da"]),t?(h=t[2],l=n.substring(2)):e&&(h=e[1],l=n.substring(e[2].length));for(let t=0;t=0)&&(u=r[t])}return null===s||null===u||s[3]!==u[3]?Et:t*s[6]*f/(u[6]*h)}function la(t,e){if((t=bt(t))instanceof Error)return t;if(!/^-?[0-9]{1,3}$/.test(t)||t<-512||t>511)return yt;if(t<0)return"1"+ki("0",9-(512+t).toString(2).length)+(512+t).toString(2);const n=parseInt(t,10).toString(2);return void 0===e?n:isNaN(e)?mt:e<0?yt:(e=Math.floor(e))>=n.length?ki("0",e-n.length)+n:yt}function fa(t,e){if((t=bt(t))instanceof Error)return t;if(!/^-?[0-9]{1,12}$/.test(t)||t<-549755813888||t>549755813887)return yt;if(t<0)return(1099511627776+t).toString(16);const n=parseInt(t,10).toString(16);return void 0===e?n:isNaN(e)?mt:e<0?yt:(e=Math.floor(e))>=n.length?ki("0",e-n.length)+n:yt}function ha(t,e){if((t=bt(t))instanceof Error)return t;if(!/^-?[0-9]{1,9}$/.test(t)||t<-536870912||t>536870911)return yt;if(t<0)return(1073741824+t).toString(8);const n=parseInt(t,10).toString(8);return void 0===e?n:isNaN(e)?mt:e<0?yt:(e=Math.floor(e))>=n.length?ki("0",e-n.length)+n:yt}function pa(t,e){return e=void 0===e?0:e,kt(t=bt(t),e=bt(e))?mt:t===e?1:0}function da(t,e){return e=void 0===e?0:e,kt(t=bt(t),e=bt(e))?mt:ht.erf(t)}function ma(t){return isNaN(t)?mt:ht.erfc(t)}function ga(t,e){return kt(e=e||0,t=bt(t))?t:t>=e?1:0}function va(t,e){if(!/^[0-9A-Fa-f]{1,10}$/.test(t))return yt;const n=!(10!==t.length||"f"!==t.substring(0,1).toLowerCase()),r=n?parseInt(t,16)-1099511627776:parseInt(t,16);if(r<-512||r>511)return yt;if(n)return"1"+ki("0",9-(512+r).toString(2).length)+(512+r).toString(2);const o=r.toString(2);return void 0===e?o:isNaN(e)?mt:e<0?yt:(e=Math.floor(e))>=o.length?ki("0",e-o.length)+o:yt}function ya(t){if(!/^[0-9A-Fa-f]{1,10}$/.test(t))return yt;const e=parseInt(t,16);return e>=549755813888?e-1099511627776:e}function Ea(t,e){if(!/^[0-9A-Fa-f]{1,10}$/.test(t))return yt;const n=parseInt(t,16);if(n>536870911&&n<0xffe0000000)return yt;if(n>=0xffe0000000)return(n-0xffc0000000).toString(8);const r=n.toString(8);return void 0===e?r:isNaN(e)?mt:e<0?yt:(e=Math.floor(e))>=r.length?ki("0",e-r.length)+r:yt}function Ta(t){const e=wa(t),n=Aa(t);return kt(e,n)?mt:Math.sqrt(Math.pow(e,2)+Math.pow(n,2))}function Aa(t){if(void 0===t||!0===t||!1===t)return mt;if(0===t||"0"===t)return 0;if(["i","j"].indexOf(t)>=0)return 1;let e=(t=(t+="").replace("+i","+1i").replace("-i","-1i").replace("+j","+1j").replace("-j","-1j")).indexOf("+"),n=t.indexOf("-");0===e&&(e=t.indexOf("+",1)),0===n&&(n=t.indexOf("-",1));const r=t.substring(t.length-1,t.length),o="i"===r||"j"===r;return e>=0||n>=0?o?e>=0?isNaN(t.substring(0,e))||isNaN(t.substring(e+1,t.length-1))?yt:Number(t.substring(e+1,t.length-1)):isNaN(t.substring(0,n))||isNaN(t.substring(n+1,t.length-1))?yt:-Number(t.substring(n+1,t.length-1)):yt:o?isNaN(t.substring(0,t.length-1))?yt:t.substring(0,t.length-1):isNaN(t)?yt:0}function _a(t){const e=wa(t),n=Aa(t);return kt(e,n)?mt:0===e&&0===n?dt:0===e&&n>0?Math.PI/2:0===e&&n<0?-Math.PI/2:0===n&&e>0?0:0===n&&e<0?-Math.PI:e>0?Math.atan(n/e):e<0&&n>=0?Math.atan(n/e)+Math.PI:Math.atan(n/e)-Math.PI}function Ra(t){const e=wa(t),n=Aa(t);if(kt(e,n))return mt;let r=t.substring(t.length-1);return r="i"===r||"j"===r?r:"i",0!==n?ua(e,-n,r):t}function Na(t){const e=wa(t),n=Aa(t);if(kt(e,n))return mt;let r=t.substring(t.length-1);return r="i"===r||"j"===r?r:"i",ua(Math.cos(e)*(Math.exp(n)+Math.exp(-n))/2,-Math.sin(e)*(Math.exp(n)-Math.exp(-n))/2,r)}function Oa(t){const e=wa(t),n=Aa(t);if(kt(e,n))return mt;let r=t.substring(t.length-1);return r="i"===r||"j"===r?r:"i",ua(Math.cos(n)*(Math.exp(e)+Math.exp(-e))/2,Math.sin(n)*(Math.exp(e)-Math.exp(-e))/2,r)}function Ia(t){return kt(wa(t),Aa(t))?mt:Sa(Na(t),Ua(t))}function Sa(t,e){const n=wa(t),r=Aa(t),o=wa(e),i=Aa(e);if(kt(n,r,o,i))return mt;const a=t.substring(t.length-1),s=e.substring(e.length-1);let u="i";if(("j"===a||"j"===s)&&(u="j"),0===o&&0===i)return yt;const c=o*o+i*i;return ua((n*o+r*i)/c,(r*o-n*i)/c,u)}function xa(t){const e=wa(t),n=Aa(t);if(kt(e,n))return mt;let r=t.substring(t.length-1);r="i"===r||"j"===r?r:"i";const o=Math.exp(e);return ua(o*Math.cos(n),o*Math.sin(n),r)}function ba(t){const e=wa(t),n=Aa(t);if(kt(e,n))return mt;let r=t.substring(t.length-1);return r="i"===r||"j"===r?r:"i",ua(Math.log(Math.sqrt(e*e+n*n)),Math.atan(n/e),r)}function Ma(t){const e=wa(t),n=Aa(t);if(kt(e,n))return mt;let r=t.substring(t.length-1);return r="i"===r||"j"===r?r:"i",ua(Math.log(Math.sqrt(e*e+n*n))/Math.log(10),Math.atan(n/e)/Math.log(10),r)}function Ca(t){const e=wa(t),n=Aa(t);if(kt(e,n))return mt;let r=t.substring(t.length-1);return r="i"===r||"j"===r?r:"i",ua(Math.log(Math.sqrt(e*e+n*n))/Math.log(2),Math.atan(n/e)/Math.log(2),r)}function La(t,e){if(kt(e=bt(e),wa(t),Aa(t)))return mt;let n=t.substring(t.length-1);n="i"===n||"j"===n?n:"i";const r=Math.pow(Ta(t),e),o=_a(t);return ua(r*Math.cos(e*o),r*Math.sin(e*o),n)}function Pa(){let t=arguments[0];if(!arguments.length)return mt;for(let e=1;e=0)return 0;let e=(t+="").indexOf("+"),n=t.indexOf("-");0===e&&(e=t.indexOf("+",1)),0===n&&(n=t.indexOf("-",1));const r=t.substring(t.length-1,t.length),o="i"===r||"j"===r;return e>=0||n>=0?o?e>=0?isNaN(t.substring(0,e))||isNaN(t.substring(e+1,t.length-1))?yt:Number(t.substring(0,e)):isNaN(t.substring(0,n))||isNaN(t.substring(n+1,t.length-1))?yt:Number(t.substring(0,n)):yt:o?isNaN(t.substring(0,t.length-1))?yt:0:isNaN(t)?yt:t}function Da(t){return!0===t||!1===t||kt(wa(t),Aa(t))?mt:Sa("1",Na(t))}function ka(t){return kt(wa(t),Aa(t))?mt:Sa("1",Oa(t))}function Ua(t){const e=wa(t),n=Aa(t);if(kt(e,n))return mt;let r=t.substring(t.length-1);return r="i"===r||"j"===r?r:"i",ua(Math.sin(e)*(Math.exp(n)+Math.exp(-n))/2,Math.cos(e)*(Math.exp(n)-Math.exp(-n))/2,r)}function Fa(t){const e=wa(t),n=Aa(t);if(kt(e,n))return mt;let r=t.substring(t.length-1);return r="i"===r||"j"===r?r:"i",ua(Math.cos(n)*(Math.exp(e)-Math.exp(-e))/2,Math.sin(n)*(Math.exp(e)+Math.exp(-e))/2,r)}function ja(t){if(kt(wa(t),Aa(t)))return mt;let e=t.substring(t.length-1);e="i"===e||"j"===e?e:"i";const n=Math.sqrt(Ta(t)),r=_a(t);return ua(n*Math.cos(r/2),n*Math.sin(r/2),e)}function Va(t){return!0===t||!1===t?mt:kt(wa(t),Aa(t))?yt:Sa("1",Ua(t))}function Ba(t){return!0===t||!1===t?mt:kt(wa(t),Aa(t))?yt:Sa("1",Fa(t))}function Ga(t,e){const n=wa(t),r=Aa(t),o=wa(e),i=Aa(e);if(kt(n,r,o,i))return mt;const a=t.substring(t.length-1),s=e.substring(e.length-1);let u="i";return("j"===a||"j"===s)&&(u="j"),ua(n-o,r-i,u)}function Wa(){if(!arguments.length)return mt;const t=Nt(arguments);let e=t[0];for(let n=1;n511)return yt;if(n)return"1"+ki("0",9-(512+r).toString(2).length)+(512+r).toString(2);const o=r.toString(2);return void 0===e?o:isNaN(e)?mt:e<0?yt:(e=Math.floor(e))>=o.length?ki("0",e-o.length)+o:yt}function qa(t){if(!/^[0-7]{1,10}$/.test(t))return yt;const e=parseInt(t,8);return e>=536870912?e-1073741824:e}function Ka(t,e){if(!/^[0-7]{1,10}$/.test(t))return yt;const n=parseInt(t,8);if(n>=536870912)return"ff"+(n+3221225472).toString(16);const r=n.toString(16);return void 0===e?r:isNaN(e)?mt:e<0?yt:(e=Math.floor(e))>=r.length?ki("0",e-r.length)+r:yt}da.PRECISE=()=>{throw new Error("ERF.PRECISE is not implemented")},ma.PRECISE=()=>{throw new Error("ERFC.PRECISE is not implemented")};const Ha=dn.DIST,Xa=dn.INV,$a=mn.DIST,Za=Gr.MATH,Qa=Gr.PRECISE,Ja=gn.DIST,ts=gn.DIST.RT,es=gn.INV,ns=gn.INV.RT,rs=gn.TEST,os=In.P,is=In.P,as=In.S,ss=mn.INV,us=ma.PRECISE,cs=da.PRECISE,ls=xn.DIST,fs=bn.DIST,hs=bn.DIST.RT,ps=bn.INV,ds=bn.INV.RT,ms=oo.MATH,gs=oo.PRECISE,vs=bn.TEST,ys=wn.DIST,Es=wn.INV,Ts=Dn.PRECISE,As=Vn.DIST,_s=qn.INV,Rs=qn.DIST,Ns=qn.INV,Os=Qn.MULT,Is=Qn.SNGL,Ss=Jn.DIST,xs=ie.INTL,bs=tr.DIST,Ms=tr.INV,Cs=tr.S.DIST,Ls=tr.S.INV,Ps=nr.EXC,ws=nr.INC,Ds=rr.EXC,ks=rr.INC,Us=sr.DIST,Fs=cr.EXC,js=cr.INC,Vs=lr.AVG,Bs=lr.EQ,Gs=pr.P,Ws=vr.P,zs=vr.S,Ys=Ar.DIST,qs=Ar.DIST.RT,Ks=Ar.INV,Hs=Ar.TEST,Xs=Nr.P,$s=Nr.S,Zs=Sr.DIST,Qs=pe.INTL,Js=xr.TEST;function tu(t){const e=[];return Vt(t,t=>{t&&e.push(t)}),e}function eu(t,e){let n=null;return Vt(t,(t,r)=>{if(t[0]===e)return n=r,!1}),null==n?mt:n}function nu(t,e){const n={};for(let e=1;er&&(r=e[t].length);for(let o=1;o{i+=o[t]}),0===r.length?dt:i/r.length}function ou(t,e,n){if(isNaN(e)&&"string"!=typeof e)return mt;const r=nu(t,n);let o=[];if("string"==typeof e){const n=eu(t,e);o=jt(t[n])}else o=jt(t[e]);const i=[];return Vt(r,t=>{i.push(o[t])}),En(i)}function iu(t,e,n){if(isNaN(e)&&"string"!=typeof e)return mt;const r=nu(t,n);let o=[];if("string"==typeof e){const n=eu(t,e);o=jt(t[n])}else o=jt(t[e]);const i=[];return Vt(r,t=>{i.push(o[t])}),Tn(i)}function au(t,e,n){if(isNaN(e)&&"string"!=typeof e)return mt;const r=nu(t,n);let o=[];return o=jt("string"==typeof e?t[eu(t,e)]:t[e]),0===r.length?mt:r.length>1?yt:o[r[0]]}function su(t,e,n){if(isNaN(e)&&"string"!=typeof e)return mt;const r=nu(t,n);let o=[];if("string"==typeof e){const n=eu(t,e);o=jt(t[n])}else o=jt(t[e]);let i=o[r[0]];return Vt(r,t=>{i{i>o[t]&&(i=o[t])}),i}function cu(t,e,n){if(isNaN(e)&&"string"!=typeof e)return mt;const r=nu(t,n);let o=[];if("string"==typeof e){const n=eu(t,e);o=jt(t[n])}else o=jt(t[e]);let i=[];Vt(r,t=>{i.push(o[t])}),i=tu(i);let a=1;return Vt(i,t=>{a*=t}),a}function lu(t,e,n){if(isNaN(e)&&"string"!=typeof e)return mt;const r=nu(t,n);let o=[];if("string"==typeof e){const n=eu(t,e);o=jt(t[n])}else o=jt(t[e]);let i=[];return Vt(r,t=>{i.push(o[t])}),i=tu(i),vr.S(i)}function fu(t,e,n){if(isNaN(e)&&"string"!=typeof e)return mt;const r=nu(t,n);let o=[];if("string"==typeof e){const n=eu(t,e);o=jt(t[n])}else o=jt(t[e]);let i=[];return Vt(r,t=>{i.push(o[t])}),i=tu(i),vr.P(i)}function hu(t,e,n){if(isNaN(e)&&"string"!=typeof e)return mt;const r=nu(t,n);let o=[];if("string"==typeof e){const n=eu(t,e);o=jt(t[n])}else o=jt(t[e]);const i=[];return Vt(r,t=>{i.push(o[t])}),ei(i)}function pu(t,e,n){if(isNaN(e)&&"string"!=typeof e)return mt;const r=nu(t,n);let o=[];if("string"==typeof e){const n=eu(t,e);o=jt(t[n])}else o=jt(t[e]);const i=[];return Vt(r,t=>{i.push(o[t])}),Nr.S(i)}function du(t,e,n){if(isNaN(e)&&"string"!=typeof e)return mt;const r=nu(t,n);let o=[];if("string"==typeof e){const n=eu(t,e);o=jt(t[n])}else o=jt(t[e]);const i=[];return Vt(r,t=>{i.push(o[t])}),Nr.P(i)}function mu(t){return t&&t.getTime&&!isNaN(t.getTime())}function gu(t){return t instanceof Date?t:new Date(t)}function vu(t,e,n,r,o,i,a){return t=gu(t),e=gu(e),n=gu(n),mu(t)&&mu(e)&&mu(n)?r<=0||o<=0||-1===[1,2,4].indexOf(i)||-1===[0,1,2,3,4].indexOf(a)||n<=t?yt:(o=o||0)*r*ve(t,n,a=a||0):mt}function yu(){throw new Error("ACCRINTM is not implemented")}function Eu(){throw new Error("AMORDEGRC is not implemented")}function Tu(){throw new Error("AMORLINC is not implemented")}function Au(){throw new Error("COUPDAYBS is not implemented")}function _u(){throw new Error("COUPDAYS is not implemented")}function Ru(){throw new Error("COUPDAYSNC is not implemented")}function Nu(){throw new Error("COUPNCD is not implemented")}function Ou(){throw new Error("COUPNUM is not implemented")}function Iu(){throw new Error("COUPPCD is not implemented")}function Su(t,e,n,r,o,i){if(kt(t=bt(t),e=bt(e),n=bt(n)))return mt;if(t<=0||e<=0||n<=0)return yt;if(r<1||o<1||r>o)return yt;if(0!==i&&1!==i)return yt;const a=Qu(t,e,n,0,i);let s=0;1===r&&(0===i&&(s=-n),r++);for(let e=r;e<=o;e++)s+=1===i?ku(t,e-2,a,n,1)-a:ku(t,e-1,a,n,0);return s*=t,s}function xu(t,e,n,r,o,i){if(kt(t=bt(t),e=bt(e),n=bt(n)))return mt;if(t<=0||e<=0||n<=0)return yt;if(r<1||o<1||r>o)return yt;if(0!==i&&1!==i)return yt;const a=Qu(t,e,n,0,i);let s=0;1===r&&(s=0===i?a+n*t:a,r++);for(let e=r;e<=o;e++)s+=i>0?a-(ku(t,e-2,a,n,1)-a)*t:a-ku(t,e-1,a,n,0)*t;return s}function bu(t,e,n,r,o){if(o=void 0===o?12:o,kt(t=bt(t),e=bt(e),n=bt(n),r=bt(r),o=bt(o)))return mt;if(t<0||e<0||n<0||r<0)return yt;if(-1===[1,2,3,4,5,6,7,8,9,10,11,12].indexOf(o))return yt;if(r>n)return yt;if(e>=t)return 0;const i=(1-Math.pow(e/t,1/n)).toFixed(3),a=t*i*o/12;let s=a,u=0;const c=r===n?n-1:r;for(let e=2;e<=c;e++)u=(t-s)*i,s+=u;return 1===r?a:r===n?(t-s)*i:u}function Mu(t,e,n,r,o){if(o=void 0===o?2:o,kt(t=bt(t),e=bt(e),n=bt(n),r=bt(r),o=bt(o)))return mt;if(t<0||e<0||n<0||r<0||o<=0)return yt;if(r>n)return yt;if(e>=t)return 0;let i=0,a=0;for(let s=1;s<=r;s++)a=Math.min(o/n*(t-i),t-e-i),i+=a;return a}function Cu(){throw new Error("DISC is not implemented")}function Lu(t,e){if(kt(t=bt(t),e=bt(e)))return mt;if(e<0)return yt;if(e>=0&&e<1)return dt;e=parseInt(e,10);let n=parseInt(t,10);n+=t%1*Math.pow(10,Math.ceil(Math.log(e)/Math.LN10))/e;const r=Math.pow(10,Math.ceil(Math.log(e)/Math.LN2)+1);return n=Math.round(n*r)/r,n}function Pu(t,e){if(kt(t=bt(t),e=bt(e)))return mt;if(e<0)return yt;if(e>=0&&e<1)return dt;e=parseInt(e,10);let n=parseInt(t,10);return n+=t%1*Math.pow(10,-Math.ceil(Math.log(e)/Math.LN10))*e,n}function wu(){throw new Error("DURATION is not implemented")}function Du(t,e){return kt(t=bt(t),e=bt(e))?mt:t<=0||e<1?yt:(e=parseInt(e,10),Math.pow(1+t/e,e)-1)}function ku(t,e,n,r,o){if(r=r||0,o=o||0,kt(t=bt(t),e=bt(e),n=bt(n),r=bt(r),o=bt(o)))return mt;let i;if(0===t)i=r+n*e;else{const a=Math.pow(1+t,e);i=1===o?r*a+n*(1+t)*(a-1)/t:r*a+n*(a-1)/t}return-i}function Uu(t,e){if(kt(t=bt(t),e=Ct(Nt(e))))return mt;const n=e.length;let r=t;for(let t=0;t{const r=n+1;let o=t[0];for(let n=1;n{const r=n+1;let o=0;for(let n=1;n0&&(i=!0),t[e]<0&&(a=!0);if(!i||!a)return yt;let s,u,c,l=e=void 0===e?.1:e,f=!0;do{c=n(t,o,l),s=l-c/r(t,o,l),u=Math.abs(s-l),l=s,f=u>1e-10&&Math.abs(c)>1e-10}while(f);return l}function Bu(t,e,n,r){return kt(t=bt(t),e=bt(e),n=bt(n),r=bt(r))?mt:r*t*(e/n-1)}function Gu(){throw new Error("MDURATION is not implemented")}function Wu(t,e,n){if(kt(t=Ct(Nt(t)),e=bt(e),n=bt(n)))return mt;const r=t.length,o=[],i=[];for(let e=0;en?yt:(t-e)*(n-(r=parseInt(r,10))+1)*2/(n*(n+1))}function cc(t,e,n){return kt(t=Lt(t),e=Lt(e),n=bt(n))?mt:n<=0||t>e||e-t>31536e6?yt:365*n/(360-n*Zt(t,e,!1))}function lc(t,e,n){return kt(t=Lt(t),e=Lt(e),n=bt(n))?mt:n<=0||t>e||e-t>31536e6?yt:100*(1-n*Zt(t,e,!1)/360)}function fc(t,e,n){return kt(t=Lt(t),e=Lt(e),n=bt(n))?mt:n<=0||t>e||e-t>31536e6?yt:360*(100-n)/(n*Zt(t,e,!1))}function hc(){throw new Error("VDB is not implemented")}function pc(t,e,n){if(kt(t=Ct(Nt(t)),e=Pt(Nt(e)),n=bt(n)))return mt;const r=(t,e,n)=>{const r=n+1;let o=t[0];for(let n=1;n{const r=n+1;let o=0;for(let n=1;n0&&(i=!0),t[e]<0&&(a=!0);if(!i||!a)return yt;let s,u,c,l=n=n||.1,f=!0;do{c=r(t,e,l),s=l-c/o(t,e,l),u=Math.abs(s-l),l=s,f=u>1e-10&&Math.abs(c)>1e-10}while(f);return l}function dc(t,e,n){if(kt(t=bt(t),e=Ct(Nt(e)),n=Pt(Nt(n))))return mt;let r=0;for(let o=0;o=2)||e)&&(e=0),null==(n=3===arguments.length&&n)&&(n=0),t?e:n)}function Ac(){for(let t=0;t0){const e=arguments[0],n=arguments.length-1,r=Math.floor(n/2);let o=!1;const i=n%2!=0,a=n%2==0?null:arguments[arguments.length-1];if(r)for(let n=0;n"number"==typeof t)}class wc{constructor(t){this.context=t}getFunction(t){const e=t.toUpperCase();try{const{Calx:t}=n(3475);if(t.formulae&&t.formulae[e])return t.formulae[e]}catch(t){}if("SEQUENCE"===e)return this.sequenceFunction.bind(this);if("SORT"===e)return this.sortFunction.bind(this);if("FILTER"===e)return this.filterFunction.bind(this);if("UNIQUE"===e)return this.uniqueFunction.bind(this);let o=r[e];return o&&"object"==typeof o&&!Array.isArray(o)&&("function"==typeof o.S?o=o.S:"function"==typeof o.P&&(o=o.P)),"function"==typeof o?o:void 0}sequenceFunction(t,e=1,n=1,r=1){const o=[];let i=n;for(let n=0;nt[0]):o}sortFunction(t,e=1,n=1,r=!1){let o;o=Array.isArray(t)?Array.isArray(t[0])?t:t.map(t=>[t]):[[t]];const i=o.map(t=>[...t]);if(!r){const t=e-1;i.sort((e,r)=>{const o=e[t],i=r[t];return null==o&&null==i?0:null==o?1===n?1:-1:null==i||oi?1===n?1:-1:0})}return Array.isArray(t[0])?i:i.map(t=>t[0])}filterFunction(t,e,n="#N/A"){let r,o;r=Array.isArray(t)?Array.isArray(t[0])?t:t.map(t=>[t]):[[t]],o=Array.isArray(e)?Array.isArray(e[0])?e.map(t=>t[0]):e:[e];const i=r.filter((t,e)=>{const n=o[e];return!1!==n&&0!==n&&null!=n});return 0===i.length?n:Array.isArray(t[0])?i:i.map(t=>t[0])}uniqueFunction(t,e=!1,n=!1){let r,o=!1;Array.isArray(t)?Array.isArray(t[0])?r=t:(r=t.map(t=>[t]),o=!0):(r=[[t]],o=!0);const i=[],a=new Map;for(const t of r){const e=JSON.stringify(t),n=a.get(e)||0;a.set(e,n+1),0===n&&i.push(t)}if(n){const t=i.filter(t=>{const e=JSON.stringify(t);return 1===a.get(e)});return 0===t.length?"#N/A":o?t.map(t=>t[0]):t}return o?i.map(t=>t[0]):i}callFunction(t,e){const n=this.getFunction(t);if(!n)throw new Error(`Function ${t} not found`);try{let r=n(...e.map(t=>this.convertArg(t)));if(r instanceof Date){const t=new Date(1899,11,30).getTime(),e=864e5;r=Math.floor((r.getTime()-t)/e)}return Array.isArray(r)&&this.isDynamicArrayFunction(t)?r.length>0&&Array.isArray(r[0])?Z.from2DArray(r):Z.fromVerticalArray(r):r&&"object"==typeof r&&r.error?"#ERROR!":r}catch(e){return console.error(`Error calling function ${t}:`,e),"#ERROR!"}}isDynamicArrayFunction(t){return["SEQUENCE","SORT","UNIQUE","FILTER","RANDARRAY","SORTBY","XLOOKUP","XMATCH"].includes(t.toUpperCase())}convertArg(t){if(null==t)return t;if(Array.isArray(t))return t.map(t=>this.convertArg(t));if(t&&"object"==typeof t&&"function"==typeof t.toArray){const e=t.toArray();return 1===e.length?e[0]:e}return t&&"object"==typeof t&&"value"in t?t.value:t}getAvailableFunctions(){return Object.keys(r).filter(t=>"function"==typeof r[t])}hasFunction(t){return void 0!==this.getFunction(t)}}class Dc{constructor(t){this.sheets={},Object.assign(this,t),this._formulaJSWrapper=new wc(this)}setActiveSheet(t){this.activeSheet=t}setWorkbook(t){this.workbook=t}addSheet(t){this.sheets[t.id]=t}callFunction(t,e){return this._formulaJSWrapper?this._formulaJSWrapper.callFunction(t,e):"#NAME?"}getFunction(t){if(this._formulaJSWrapper)return this._formulaJSWrapper.getFunction(t)}getVariable(t,e){const n=e?this.sheets[e]:this.activeSheet;return n?n.getVariable(t):"#NAME?"}getCellValue(t,e){let n=this.activeSheet;return e&&(n=this.sheets[e]||Object.values(this.sheets).find(t=>t.name===e)),n?n.getCellValue(t):"#REF!"}getCellRange(t,e){const n=e?this.sheets[e]:this.activeSheet;if(n){const[e,r]=t.split(":");return n.getCellRangeValues(e,r)}return[]}getRowRange(t,e){const n=e?this.sheets[e]:this.activeSheet;return n?n.getRowRangeValues(t):[]}getColumnRange(t,e){const n=e?this.sheets[e]:this.activeSheet;return n?n.getColumnRangeValues(t):[]}getNamedRange(t){return this.workbook?this.workbook.nameManager.resolve(t):"#NAME?"}}function kc(t){var e="";for(t=Math.round(t-1);t>=0;)e=String.fromCharCode(t%26+97)+e,t=Math.floor(t/26)-1;return e.toUpperCase()}function Uc(t){const e=t.toUpperCase().split(""),n="ABCDEFGHIJKLMNOPQRSTUVWXYZ".split("");let r,o,i=0;for(r=0,o=e.length-1;r0;)1&e&&(n+=t),e>>=1,t+=t;return n}function Bc(t,e,n){if(null==t)return"";if(e=~~e,null==n)return Vc(String(t),e);for(var r=[];e>0;r[--e]=t);return r.join(n)}function Gc(t){return t.reduce(function(t,e){return t.indexOf(e)<0&&t.push(e),t},[])}function Wc(t,e,n){return Array.prototype.slice.call(t,0,Math.max(0,t.length-(null==e||n?1:e)))}function zc(t,e,n){return Array.prototype.slice.call(t,null==e||n?1:e)}function Yc(t){let e=[];for(let n=0;n0&&(n=t[e[0]])}n&&this._workbook.setActiveSheet(n);const r=e.reference.startsWith("=")?e.reference:`=${e.reference}`;return this._workbook.parser.parse(r)}has(t){return t in this._nameRegistry}getAll(){return Object.values(this._nameRegistry)}get(t){return this._nameRegistry[t]}remove(t){return t in this._nameRegistry&&(delete this._nameRegistry[t],!0)}clear(){this._nameRegistry={}}}const Qc={equal:(t,e)=>"string"==typeof t?t.toLowerCase()==(""+e).toLowerCase():t==e,notEqual:(t,e)=>"string"==typeof t?t.toLowerCase()!=(""+e).toLowerCase():t!=e,lessThan:(t,e)=>tt>e,lessEqualThan:(t,e)=>t<=e,greaterEqualThan:(t,e)=>t>=e};function Jc(t){const e=new J;return e.setContext(t),e}class tl{constructor(t,e,n){this._autoCalculate=!0,this._sheets={},this._parser=t,this._dispatcher=n,this._nameManager=e,this._nameManager.setContext(this)}get parser(){return this._parser}get dispatcher(){return this._dispatcher}get nameManager(){return this._nameManager}get autoCalculate(){return this._autoCalculate}set autoCalculate(t){this._autoCalculate=t;for(const e in this._sheets)this._sheets[e].autoCalculate=t}setActiveSheet(t){if(this._parser){const e=this._parser.getContext();e&&(e.activeSheet=t,e.setActiveSheet(t))}}getActiveSheet(){var t;return null===(t=this._parser.yy)||void 0===t?void 0:t.activeSheet}isValidCellAddress(t){return t.match(/^[A-Z]+\d+$/)}calculate(){this._deps||this.build();for(const t in this._sheets)this._sheets[t].calculate()}build(){this._depsBuilder=new ct.B;for(const t in this._sheets)this._sheets[t].buildDependencyTree()}hydrateObj(t){for(const e in t)if("object"==typeof t[e])this.hydrateObj(t[e]);else if("string"==typeof t[e]&&t[e].startsWith("#")){const[n,r]=t[e].split("!");n in this._sheets&&(t[e]=this._sheets[n].getCell(r).value)}}createSheet(t,e){if(!t)throw new Error("Sheet should have a name");if(this._sheets[t])throw new Error(`Sheet with the name "${t}" is already exists`);const n=new lt(this,t);return n.autoCalculate=this._autoCalculate,e&&(n.element=e),this._sheets[t]=n,this._parser&&this._parser.yy&&(this._parser.yy.sheets[t]=n),n}getSheets(){return this._sheets}getSheet(t){if(t in this._sheets)return this._sheets[t];throw Error(`Sheet not found with name ${t}`)}loadData(t){var e;for(const n in t.sheets){const r=this.createSheet(n,null===(e=t.sheets[n])||void 0===e?void 0:e.element);for(const e in t.sheets[n].cells){const o=t.sheets[n].cells[e];r.createCell(e,o)}}}static createFromData(t){const e=new Dc({sheets:{},utility:o,comparator:Qc}),n=Jc(e),r=new rt.Q,i=new Zc,a=new tl(n,i,r);return e.workbook=a,a.loadData(t),a}static createFromElement(t,e){const n=Jc(new Dc({sheets:{},utility:o,comparator:null})),r=new rt.Q,i=new Zc,a=new tl(n,i,r);return e&&a.loadData(e),a}}class el{static setFormula(t,e){el.formulae[t]=e}static setFormulae(t){el.formulae=Object.assign(Object.assign({},el.formulae),t)}static createWorkbook(){return el.createWorkbookFromData({sheets:{}})}static createWorkbookFromData(t){return tl.createFromData(t)}static createWorkbookFromElement(t,e){return tl.createFromElement(t,e)}static createParser(){return new X}static createInterpreter(){return new J}}el.formulae={}},3488:t=>{t.exports=function(t){return t}},3598:function(t,e,n){"use strict";var r=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0}),e.getProductionDslName=e.isBranchingProd=e.isOptionalProd=e.isSequenceProd=void 0;var o=r(n(2426)),i=r(n(9747)),a=r(n(9859)),s=n(8538);e.isSequenceProd=function(t){return t instanceof s.Alternative||t instanceof s.Option||t instanceof s.Repetition||t instanceof s.RepetitionMandatory||t instanceof s.RepetitionMandatoryWithSeparator||t instanceof s.RepetitionWithSeparator||t instanceof s.Terminal||t instanceof s.Rule},e.isOptionalProd=function t(e,n){return void 0===n&&(n=[]),!!(e instanceof s.Option||e instanceof s.Repetition||e instanceof s.RepetitionWithSeparator)||(e instanceof s.Alternation?(0,o.default)(e.definition,function(e){return t(e,n)}):!(e instanceof s.NonTerminal&&(0,a.default)(n,e))&&e instanceof s.AbstractProduction&&(e instanceof s.NonTerminal&&n.push(e),(0,i.default)(e.definition,function(e){return t(e,n)})))},e.isBranchingProd=function(t){return t instanceof s.Alternation},e.getProductionDslName=function(t){if(t instanceof s.NonTerminal)return"SUBRULE";if(t instanceof s.Option)return"OPTION";if(t instanceof s.Alternation)return"OR";if(t instanceof s.RepetitionMandatory)return"AT_LEAST_ONE";if(t instanceof s.RepetitionMandatoryWithSeparator)return"AT_LEAST_ONE_SEP";if(t instanceof s.RepetitionWithSeparator)return"MANY_SEP";if(t instanceof s.Repetition)return"MANY";if(t instanceof s.Terminal)return"CONSUME";throw Error("non exhaustive match")}},3605:t=>{t.exports=function(t){return this.__data__.get(t)}},3650:(t,e,n)=>{var r=n(4335)(Object.keys,Object);t.exports=r},3656:(t,e,n)=>{t=n.nmd(t);var r=n(9325),o=n(9935),i=e&&!e.nodeType&&e,a=i&&t&&!t.nodeType&&t,s=a&&a.exports===i?r.Buffer:void 0,u=(s?s.isBuffer:void 0)||o;t.exports=u},3661:(t,e,n)=>{var r=n(3040),o=n(7670),i=n(289),a=n(4509),s=n(2949);function u(t){var e=-1,n=null==t?0:t.length;for(this.clear();++e{var r=n(1799),o=n(776),i=n(7197);t.exports=function(t){var e=o(t);return 1==e.length&&e[0][2]?i(e[0][0],e[0][1]):function(n){return n===t||r(n,t,e)}}},3673:t=>{t.exports=function(t){for(var e=-1,n=null==t?0:t.length,r=0,o=[];++e{var r=n(4894),o=n(346);t.exports=function(t){return o(t)&&r(t)}},3702:t=>{t.exports=function(){this.__data__=[],this.size=0}},3729:t=>{t.exports=function(t,e){for(var n=-1,r=null==t?0:t.length;++n{var r=n(1873),o=r?r.prototype:void 0,i=o?o.valueOf:void 0;t.exports=function(t){return i?Object(i.call(t)):{}}},3739:(t,e,n)=>{var r=n(5160),o=n(1489);t.exports=function(t,e,n){var i=null==t?0:t.length;return i?(e=n||void 0===e?1:o(e),r(t,e<0?0:e,i)):[]}},3777:(t,e,n)=>{var r=n(909);t.exports=function(t,e){var n=!0;return r(t,function(t,r,o){return n=!!e(t,r,o)}),n}},3805:t=>{t.exports=function(t){var e=typeof t;return null!=t&&("object"==e||"function"==e)}},3838:(t,e,n)=>{var r=n(1791),o=n(7241);t.exports=function(t,e){return t&&r(e,o(e),t)}},3862:t=>{t.exports=function(t){var e=this.has(t)&&delete this.__data__[t];return this.size-=e?1:0,e}},3912:(t,e,n)=>{var r=n(1074),o=n(9698),i=n(2054);t.exports=function(t){return o(t)?i(t):r(t)}},3915:(t,e,n)=>{var r=n(8859),o=n(5325),i=n(9905),a=n(4932),s=n(7301),u=n(9219);t.exports=function(t,e,n,c){var l=-1,f=o,h=!0,p=t.length,d=[],m=e.length;if(!p)return d;n&&(e=a(e,s(n))),c?(f=i,h=!1):e.length>=200&&(f=u,h=!1,e=new r(e));t:for(;++l{t.exports=function(t,e,n,r){for(var o=-1,i=null==t?0:t.length;++o{t.exports=function(){}},4066:(t,e,n)=>{var r=n(3488);t.exports=function(t){return"function"==typeof t?t:r}},4105:(t,e,n)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.GAstVisitor=void 0;var r=n(8538),o=function(){function t(){}return t.prototype.visit=function(t){var e=t;switch(e.constructor){case r.NonTerminal:return this.visitNonTerminal(e);case r.Alternative:return this.visitAlternative(e);case r.Option:return this.visitOption(e);case r.RepetitionMandatory:return this.visitRepetitionMandatory(e);case r.RepetitionMandatoryWithSeparator:return this.visitRepetitionMandatoryWithSeparator(e);case r.RepetitionWithSeparator:return this.visitRepetitionWithSeparator(e);case r.Repetition:return this.visitRepetition(e);case r.Alternation:return this.visitAlternation(e);case r.Terminal:return this.visitTerminal(e);case r.Rule:return this.visitRule(e);default:throw Error("non exhaustive match")}},t.prototype.visitNonTerminal=function(t){},t.prototype.visitAlternative=function(t){},t.prototype.visitOption=function(t){},t.prototype.visitRepetition=function(t){},t.prototype.visitRepetitionMandatory=function(t){},t.prototype.visitRepetitionMandatoryWithSeparator=function(t){},t.prototype.visitRepetitionWithSeparator=function(t){},t.prototype.visitAlternation=function(t){},t.prototype.visitTerminal=function(t){},t.prototype.visitRule=function(t){},t}();e.GAstVisitor=o},4128:(t,e,n)=>{var r=n(1800),o=/^\s+/;t.exports=function(t){return t?t.slice(0,r(t)+1).replace(o,""):t}},4218:t=>{t.exports=function(t){var e=typeof t;return"string"==e||"number"==e||"symbol"==e||"boolean"==e?"__proto__"!==t:null===t}},4247:t=>{t.exports=function(t){var e=-1,n=Array(t.size);return t.forEach(function(t){n[++e]=t}),n}},4248:t=>{t.exports=function(t,e){for(var n=-1,r=null==t?0:t.length;++n{t.exports=function(t,e){return function(n){return t(e(n))}}},4394:(t,e,n)=>{var r=n(2552),o=n(346);t.exports=function(t){return"symbol"==typeof t||o(t)&&"[object Symbol]"==r(t)}},4471:function(t,e,n){"use strict";var r,o=this&&this.__extends||(r=function(t,e){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n])},r(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function n(){this.constructor=t}r(t,e),t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)}),i=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0}),e.nextPossibleTokensAfter=e.possiblePathsFrom=e.NextTerminalAfterAtLeastOneSepWalker=e.NextTerminalAfterAtLeastOneWalker=e.NextTerminalAfterManySepWalker=e.NextTerminalAfterManyWalker=e.AbstractNextTerminalAfterProductionWalker=e.NextAfterTokenWalker=e.AbstractNextPossibleTokensWalker=void 0;var a=n(3131),s=i(n(6170)),u=i(n(2193)),c=i(n(7537)),l=i(n(3739)),f=i(n(8090)),h=i(n(9754)),p=i(n(2629)),d=n(2195),m=n(3387),g=function(t){function e(e,n){var r=t.call(this)||this;return r.topProd=e,r.path=n,r.possibleTokTypes=[],r.nextProductionName="",r.nextProductionOccurrence=0,r.found=!1,r.isAtEndOfPath=!1,r}return o(e,t),e.prototype.startWalking=function(){if(this.found=!1,this.path.ruleStack[0]!==this.topProd.name)throw Error("The path does not start with the walker's top Rule!");return this.ruleStack=(0,p.default)(this.path.ruleStack).reverse(),this.occurrenceStack=(0,p.default)(this.path.occurrenceStack).reverse(),this.ruleStack.pop(),this.occurrenceStack.pop(),this.updateExpectedNext(),this.walk(this.topProd),this.possibleTokTypes},e.prototype.walk=function(e,n){void 0===n&&(n=[]),this.found||t.prototype.walk.call(this,e,n)},e.prototype.walkProdRef=function(t,e,n){if(t.referencedRule.name===this.nextProductionName&&t.idx===this.nextProductionOccurrence){var r=e.concat(n);this.updateExpectedNext(),this.walk(t.referencedRule,r)}},e.prototype.updateExpectedNext=function(){(0,u.default)(this.ruleStack)?(this.nextProductionName="",this.nextProductionOccurrence=0,this.isAtEndOfPath=!0):(this.nextProductionName=this.ruleStack.pop(),this.nextProductionOccurrence=this.occurrenceStack.pop())},e}(a.RestWalker);e.AbstractNextPossibleTokensWalker=g;var v=function(t){function e(e,n){var r=t.call(this,e,n)||this;return r.path=n,r.nextTerminalName="",r.nextTerminalOccurrence=0,r.nextTerminalName=r.path.lastTok.name,r.nextTerminalOccurrence=r.path.lastTokOccurrence,r}return o(e,t),e.prototype.walkTerminal=function(t,e,n){if(this.isAtEndOfPath&&t.terminalType.name===this.nextTerminalName&&t.idx===this.nextTerminalOccurrence&&!this.found){var r=e.concat(n),o=new m.Alternative({definition:r});this.possibleTokTypes=(0,d.first)(o),this.found=!0}},e}(g);e.NextAfterTokenWalker=v;var y=function(t){function e(e,n){var r=t.call(this)||this;return r.topRule=e,r.occurrence=n,r.result={token:void 0,occurrence:void 0,isEndOfRule:void 0},r}return o(e,t),e.prototype.startWalking=function(){return this.walk(this.topRule),this.result},e}(a.RestWalker);e.AbstractNextTerminalAfterProductionWalker=y;var E=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.prototype.walkMany=function(e,n,r){if(e.idx===this.occurrence){var o=(0,s.default)(n.concat(r));this.result.isEndOfRule=void 0===o,o instanceof m.Terminal&&(this.result.token=o.terminalType,this.result.occurrence=o.idx)}else t.prototype.walkMany.call(this,e,n,r)},e}(y);e.NextTerminalAfterManyWalker=E;var T=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.prototype.walkManySep=function(e,n,r){if(e.idx===this.occurrence){var o=(0,s.default)(n.concat(r));this.result.isEndOfRule=void 0===o,o instanceof m.Terminal&&(this.result.token=o.terminalType,this.result.occurrence=o.idx)}else t.prototype.walkManySep.call(this,e,n,r)},e}(y);e.NextTerminalAfterManySepWalker=T;var A=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.prototype.walkAtLeastOne=function(e,n,r){if(e.idx===this.occurrence){var o=(0,s.default)(n.concat(r));this.result.isEndOfRule=void 0===o,o instanceof m.Terminal&&(this.result.token=o.terminalType,this.result.occurrence=o.idx)}else t.prototype.walkAtLeastOne.call(this,e,n,r)},e}(y);e.NextTerminalAfterAtLeastOneWalker=A;var _=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.prototype.walkAtLeastOneSep=function(e,n,r){if(e.idx===this.occurrence){var o=(0,s.default)(n.concat(r));this.result.isEndOfRule=void 0===o,o instanceof m.Terminal&&(this.result.token=o.terminalType,this.result.occurrence=o.idx)}else t.prototype.walkAtLeastOneSep.call(this,e,n,r)},e}(y);function R(t,e,n,r){var o=(0,p.default)(n);o.push(t.name);var i=(0,p.default)(r);return i.push(1),{idx:e,def:t.definition,ruleStack:o,occurrenceStack:i}}e.NextTerminalAfterAtLeastOneSepWalker=_,e.possiblePathsFrom=function t(e,n,r){void 0===r&&(r=[]),r=(0,p.default)(r);var o=[],i=0;function a(a){var s=t(a.concat((0,l.default)(e,i+1)),n,r);return o.concat(s)}for(;r.length=0;w--){var D={idx:T,def:N.definition[w].definition.concat((0,l.default)(E)),ruleStack:A,occurrenceStack:_};v.push(D),v.push(a)}else if(N instanceof m.Alternative)v.push({idx:T,def:N.definition.concat((0,l.default)(E)),ruleStack:A,occurrenceStack:_});else{if(!(N instanceof m.Rule))throw Error("non exhaustive match");v.push(R(N,T,A,_))}}}else s&&(0,f.default)(v).idx<=d&&v.pop()}return g}},4509:(t,e,n)=>{var r=n(2651);t.exports=function(t){return r(this,t).has(t)}},4517:(t,e,n)=>{var r=n(6545),o=n(3950),i=n(4247),a=r&&1/i(new r([,-0]))[1]==1/0?function(t){return new r(t)}:o;t.exports=a},4528:t=>{t.exports=function(t,e){for(var n=-1,r=e.length,o=t.length;++n{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.defineNameProp=void 0,e.defineNameProp=function(t,e){Object.defineProperty(t,"name",{enumerable:!1,configurable:!0,writable:!1,value:e})}},4664:(t,e,n)=>{var r=n(9770),o=n(3345),i=Object.prototype.propertyIsEnumerable,a=Object.getOwnPropertySymbols,s=a?function(t){return null==t?[]:(t=Object(t),r(a(t),function(e){return i.call(t,e)}))}:o;t.exports=s},4684:(t,e,n)=>{var r=n(9302),o=n(5288),i=n(6800),a=n(7241),s=Object.prototype,u=s.hasOwnProperty,c=r(function(t,e){t=Object(t);var n=-1,r=e.length,c=r>2?e[2]:void 0;for(c&&i(e[0],e[1],c)&&(r=1);++n{var r=n(2523),o=n(5389),i=n(1489),a=Math.max;t.exports=function(t,e,n){var s=null==t?0:t.length;if(!s)return-1;var u=null==n?0:i(n);return u<0&&(u=a(s+u,0)),r(t,o(e,3),u)}},4733:(t,e,n)=>{var r=n(1791),o=n(5950);t.exports=function(t,e){return t&&r(e,o(e),t)}},4739:(t,e,n)=>{var r=n(6025);t.exports=function(t){var e=this.__data__,n=r(e,t);return n<0?void 0:e[n][1]}},4809:(t,e)=>{var n;n=function(t){t.version="1.0.2";var e=Math;function n(t,e){for(var n=0,r=0;no)i=r(n,o,u(n),p(n),-1);else{for(var a=!1,s=0,c=0,l=1,f=0,h=2/n,d=2*e.floor((o+e.floor(e.sqrt(40*o)))/2);d>0;d--)f=d*h*l-s,s=l,l=f,e.abs(l)>1e10&&(l*=1e-10,s*=1e-10,i*=1e-10,c*=1e-10),a&&(c+=l),a=!a,d==o&&(i=s);i/=c=2*c-l}return i}}(),E=(i=.636619772,a=[-2957821389,7062834065,-512359803.6,10879881.29,-86327.92757,228.4622733].reverse(),s=[40076544269,745249964.8,7189466.438,47447.2647,226.1030244,1].reverse(),u=[1,-.001098628627,2734510407e-14,-2073370639e-15,2.093887211e-7].reverse(),c=[-.01562499995,.0001430488765,-6911147651e-15,7.621095161e-7,-9.34945152e-8].reverse(),l=[-4900604943e3,127527439e4,-51534381390,734926455.1,-4237922.726,8511.937935].reverse(),f=[249958057e5,424441966400,3733650367,22459040.02,102042.605,354.9632885,1].reverse(),h=[1,.00183105,-3516396496e-14,2457520174e-15,-2.40337019e-7].reverse(),p=[.04687499995,-.0002002690873,8449199096e-15,-8.8228987e-7,1.05787412e-7].reverse(),o(function(t){var r=0,o=0,l=0,f=t*t,h=t-.785398164;return t<8?r=(o=n(a,f))/(l=n(s,f))+i*y(t,0)*e.log(t):(o=n(u,f=64/f),l=n(c,f),r=e.sqrt(i/t)*(e.sin(h)*o+e.cos(h)*l*8/t)),r},function(t){var r=0,o=0,a=0,s=t*t,u=t-2.356194491;return t<8?r=(o=t*n(l,s))/(a=n(f,s))+i*(y(t,1)*e.log(t)-1/t):(o=n(h,s=64/s),a=n(p,s),r=e.sqrt(i/t)*(e.sin(u)*o+e.cos(u)*a*8/t)),r},0,1,-1)),T=(d=[1,3.5156229,3.0899424,1.2067492,.2659732,.0360768,.0045813].reverse(),m=[.39894228,.01328592,.00225319,-.00157565,.00916281,-.02057706,.02635537,-.01647633,.00392377].reverse(),g=[.5,.87890594,.51498869,.15084934,.02658733,.00301532,32411e-8].reverse(),v=[.39894228,-.03988024,-.00362018,.00163801,-.01031555,.02282967,-.02895312,.01787654,-.00420059].reverse(),function t(r,o){if(0===(o=Math.round(o)))return function(t){return t<=3.75?n(d,t*t/14.0625):e.exp(e.abs(t))/e.sqrt(e.abs(t))*n(m,3.75/e.abs(t))}(r);if(1===o)return function(t){return t<3.75?t*n(g,t*t/14.0625):(t<0?-1:1)*e.exp(e.abs(t))/e.sqrt(e.abs(t))*n(v,3.75/e.abs(t))}(r);if(o<0)return NaN;if(0===e.abs(r))return 0;if(r==1/0)return 1/0;var i,a=0,s=2/e.abs(r),u=0,c=1,l=0;for(i=2*e.round((o+e.round(e.sqrt(40*o)))/2);i>0;i--)l=i*s*c+u,u=c,c=l,e.abs(c)>1e10&&(c*=1e-10,u*=1e-10,a*=1e-10),i==o&&(a=u);return a*=t(r,0)/c,r<0&&o%2?-a:a}),A=function(){var t=[-.57721566,.4227842,.23069756,.0348859,.00262698,1075e-7,74e-7].reverse(),r=[1.25331414,-.07832358,.02189568,-.01062446,.00587872,-.0025154,53208e-8].reverse(),i=[1,.15443144,-.67278579,-.18156897,-.01919402,-.00110404,-4686e-8].reverse(),a=[1.25331414,.23498619,-.0365562,.01504268,-.00780353,.00325614,-68245e-8].reverse();return o(function(o){return o<=2?-e.log(o/2)*T(o,0)+n(t,o*o/4):e.exp(-o)/e.sqrt(o)*n(r,2/o)},function(t){return t<=2?e.log(t/2)*T(t,1)+1/t*n(i,t*t/4):e.exp(-t)/e.sqrt(t)*n(a,2/t)},0,2,1)}();t.besselj=y,t.bessely=E,t.besseli=T,t.besselk=A},"undefined"==typeof DO_NOT_EXPORT_BESSEL?n(e):n({})},4840:(t,e,n)=>{var r="object"==typeof n.g&&n.g&&n.g.Object===Object&&n.g;t.exports=r},4894:(t,e,n)=>{var r=n(1882),o=n(294);t.exports=function(t){return null!=t&&o(t.length)&&!r(t)}},4901:(t,e,n)=>{var r=n(2552),o=n(294),i=n(346),a={};a["[object Float32Array]"]=a["[object Float64Array]"]=a["[object Int8Array]"]=a["[object Int16Array]"]=a["[object Int32Array]"]=a["[object Uint8Array]"]=a["[object Uint8ClampedArray]"]=a["[object Uint16Array]"]=a["[object Uint32Array]"]=!0,a["[object Arguments]"]=a["[object Array]"]=a["[object ArrayBuffer]"]=a["[object Boolean]"]=a["[object DataView]"]=a["[object Date]"]=a["[object Error]"]=a["[object Function]"]=a["[object Map]"]=a["[object Number]"]=a["[object Object]"]=a["[object RegExp]"]=a["[object Set]"]=a["[object String]"]=a["[object WeakMap]"]=!1,t.exports=function(t){return i(t)&&o(t.length)&&!!a[r(t)]}},4927:(t,e)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.VERSION=void 0,e.VERSION="10.5.0"},4932:t=>{t.exports=function(t,e){for(var n=-1,r=null==t?0:t.length,o=Array(r);++n{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.IN=void 0,e.IN="_~IN~_"},5015:(t,e,n)=>{var r=n(2552),o=n(6449),i=n(346);t.exports=function(t){return"string"==typeof t||!o(t)&&i(t)&&"[object String]"==r(t)}},5063:function(t,e,n){"use strict";var r,o=this&&this.__extends||(r=function(t,e){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n])},r(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function n(){this.constructor=t}r(t,e),t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)}),i=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0}),e.charCodeToOptimizedIndex=e.minOptimizationVal=e.buildLineBreakIssueMessage=e.LineTerminatorOptimizedTester=e.isShortPattern=e.isCustomPattern=e.cloneEmptyGroups=e.performWarningRuntimeChecks=e.performRuntimeChecks=e.addStickyFlag=e.addStartOfInput=e.findUnreachablePatterns=e.findModesThatDoNotExist=e.findInvalidGroupType=e.findDuplicatePatterns=e.findUnsupportedFlags=e.findStartOfInputAnchor=e.findEmptyMatchRegExps=e.findEndOfInputAnchor=e.findInvalidPatterns=e.findMissingPatterns=e.validatePatterns=e.analyzeTokenTypes=e.enableSticky=e.disableSticky=e.SUPPORT_STICKY=e.MODES=e.DEFAULT_MODE=void 0;var a=n(2475),s=n(127),u=i(n(6170)),c=i(n(2193)),l=i(n(3673)),f=i(n(6449)),h=i(n(5880)),p=i(n(5970)),d=i(n(8081)),m=i(n(6245)),g=i(n(1585)),v=i(n(5378)),y=i(n(9754)),E=i(n(5015)),T=i(n(1882)),A=i(n(2216)),_=i(n(7309)),R=i(n(1448)),N=i(n(5950)),O=i(n(9607)),I=i(n(7612)),S=i(n(4684)),x=i(n(860)),b=i(n(9859)),M=n(8927),C=n(6195),L=n(393),P="PATTERN";function w(t){var e=(0,I.default)(t,function(t){return!(0,R.default)(t,P)});return{errors:(0,v.default)(e,function(t){return{message:"Token Type: ->"+t.name+"<- missing static 'PATTERN' property",type:s.LexerDefinitionErrorType.MISSING_PATTERN,tokenTypes:[t]}}),valid:(0,m.default)(t,e)}}function D(t){var e=(0,I.default)(t,function(t){var e=t[P];return!((0,O.default)(e)||(0,T.default)(e)||(0,R.default)(e,"exec")||(0,E.default)(e))});return{errors:(0,v.default)(e,function(t){return{message:"Token Type: ->"+t.name+"<- static 'PATTERN' can only be a RegExp, a Function matching the {CustomPatternMatcherFunc} type or an Object matching the {ICustomPattern} interface.",type:s.LexerDefinitionErrorType.INVALID_PATTERN,tokenTypes:[t]}}),valid:(0,m.default)(t,e)}}e.DEFAULT_MODE="defaultMode",e.MODES="modes",e.SUPPORT_STICKY="boolean"==typeof new RegExp("(?:)").sticky,e.disableSticky=function(){e.SUPPORT_STICKY=!1},e.enableSticky=function(){e.SUPPORT_STICKY=!0},e.analyzeTokenTypes=function(t,n){var r,o=(n=(0,S.default)(n,{useSticky:e.SUPPORT_STICKY,debug:!1,safeMode:!1,positionTracking:"full",lineTerminatorCharacters:["\r","\n"],tracer:function(t,e){return e()}})).tracer;o("initCharCodeToOptimizedIndexMap",function(){!function(){if((0,c.default)(tt)){tt=new Array(65536);for(var t=0;t<65536;t++)tt[t]=t>255?255+~~(t/255):t}}()}),o("Reject Lexer.NA",function(){r=(0,d.default)(t,function(t){return t[P]===s.Lexer.NA})});var i,a,u,l,h,p,m,_,N,I,L,w=!1;o("Transform Patterns",function(){w=!1,i=(0,v.default)(r,function(t){var e=t[P];if((0,O.default)(e)){var r=e.source;return 1!==r.length||"^"===r||"$"===r||"."===r||e.ignoreCase?2!==r.length||"\\"!==r[0]||(0,b.default)(["d","D","s","S","t","r","n","t","0","c","b","B","f","v","w","W"],r[1])?n.useSticky?K(e):q(e):r[1]:r}if((0,T.default)(e))return w=!0,{exec:e};if("object"==typeof e)return w=!0,e;if("string"==typeof e){if(1===e.length)return e;var o=e.replace(/[\\^$.*+?()[\]{}|]/g,"\\$&"),i=new RegExp(o);return n.useSticky?K(i):q(i)}throw Error("non exhaustive match")})}),o("misc mapping",function(){a=(0,v.default)(r,function(t){return t.tokenTypeIdx}),u=(0,v.default)(r,function(t){var e=t.GROUP;if(e!==s.Lexer.SKIPPED){if((0,E.default)(e))return e;if((0,A.default)(e))return!1;throw Error("non exhaustive match")}}),l=(0,v.default)(r,function(t){var e=t.LONGER_ALT;if(e)return(0,f.default)(e)?(0,v.default)(e,function(t){return(0,g.default)(r,t)}):[(0,g.default)(r,e)]}),h=(0,v.default)(r,function(t){return t.PUSH_MODE}),p=(0,v.default)(r,function(t){return(0,R.default)(t,"POP_MODE")})}),o("Line Terminator Handling",function(){var t=Q(n.lineTerminatorCharacters);m=(0,v.default)(r,function(t){return!1}),"onlyOffset"!==n.positionTracking&&(m=(0,v.default)(r,function(e){return(0,R.default)(e,"LINE_BREAKS")?!!e.LINE_BREAKS:!1===$(e,t)&&(0,C.canMatchCharCode)(t,e.PATTERN)}))}),o("Misc Mapping #2",function(){_=(0,v.default)(r,H),N=(0,v.default)(i,X),I=(0,x.default)(r,function(t,e){var n=e.GROUP;return(0,E.default)(n)&&n!==s.Lexer.SKIPPED&&(t[n]=[]),t},{}),L=(0,v.default)(i,function(t,e){return{pattern:i[e],longerAlt:l[e],canLineTerminator:m[e],isCustom:_[e],short:N[e],group:u[e],push:h[e],pop:p[e],tokenTypeIdx:a[e],tokenType:r[e]}})});var D=!0,k=[];return n.safeMode||o("First Char Optimization",function(){k=(0,x.default)(r,function(t,e,r){if("string"==typeof e.PATTERN){var o=et(e.PATTERN.charCodeAt(0));J(t,o,L[r])}else if((0,f.default)(e.START_CHARS_HINT)){var i;(0,y.default)(e.START_CHARS_HINT,function(e){var n=et("string"==typeof e?e.charCodeAt(0):e);i!==n&&(i=n,J(t,n,L[r]))})}else if((0,O.default)(e.PATTERN))if(e.PATTERN.unicode)D=!1,n.ensureOptimizations&&(0,M.PRINT_ERROR)("".concat(C.failedOptimizationPrefixMsg)+"\tUnable to analyze < ".concat(e.PATTERN.toString()," > pattern.\n")+"\tThe regexp unicode flag is not currently supported by the regexp-to-ast library.\n\tThis will disable the lexer's first char optimizations.\n\tFor details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#UNICODE_OPTIMIZE");else{var a=(0,C.getOptimizedStartCodesIndices)(e.PATTERN,n.ensureOptimizations);(0,c.default)(a)&&(D=!1),(0,y.default)(a,function(e){J(t,e,L[r])})}else n.ensureOptimizations&&(0,M.PRINT_ERROR)("".concat(C.failedOptimizationPrefixMsg)+"\tTokenType: <".concat(e.name,"> is using a custom token pattern without providing parameter.\n")+"\tThis will disable the lexer's first char optimizations.\n\tFor details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#CUSTOM_OPTIMIZE"),D=!1;return t},[])}),{emptyGroups:I,patternIdxToConfig:L,charCodeToPatternIdxToConfig:k,hasCustom:w,canBeOptimized:D}},e.validatePatterns=function(t,e){var n=[],r=w(t);n=n.concat(r.errors);var o=D(r.valid),i=o.valid;return(n=(n=(n=(n=n.concat(o.errors)).concat(function(t){var e=[],n=(0,I.default)(t,function(t){return(0,O.default)(t[P])});return e=(e=(e=(e=(e=e.concat(U(n))).concat(V(n))).concat(B(n))).concat(G(n))).concat(F(n))}(i))).concat(W(i))).concat(z(i,e))).concat(Y(i))},e.findMissingPatterns=w,e.findInvalidPatterns=D;var k=/[^\\][$]/;function U(t){var e=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.found=!1,e}return o(e,t),e.prototype.visitEndAnchor=function(t){this.found=!0},e}(a.BaseRegExpVisitor),n=(0,I.default)(t,function(t){var n=t.PATTERN;try{var r=(0,L.getRegExpAst)(n),o=new e;return o.visit(r),o.found}catch(t){return k.test(n.source)}});return(0,v.default)(n,function(t){return{message:"Unexpected RegExp Anchor Error:\n\tToken Type: ->"+t.name+"<- static 'PATTERN' cannot contain end of input anchor '$'\n\tSee chevrotain.io/docs/guide/resolving_lexer_errors.html#ANCHORS\tfor details.",type:s.LexerDefinitionErrorType.EOI_ANCHOR_FOUND,tokenTypes:[t]}})}function F(t){var e=(0,I.default)(t,function(t){return t.PATTERN.test("")});return(0,v.default)(e,function(t){return{message:"Token Type: ->"+t.name+"<- static 'PATTERN' must not match an empty string",type:s.LexerDefinitionErrorType.EMPTY_MATCH_PATTERN,tokenTypes:[t]}})}e.findEndOfInputAnchor=U,e.findEmptyMatchRegExps=F;var j=/[^\\[][\^]|^\^/;function V(t){var e=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.found=!1,e}return o(e,t),e.prototype.visitStartAnchor=function(t){this.found=!0},e}(a.BaseRegExpVisitor),n=(0,I.default)(t,function(t){var n=t.PATTERN;try{var r=(0,L.getRegExpAst)(n),o=new e;return o.visit(r),o.found}catch(t){return j.test(n.source)}});return(0,v.default)(n,function(t){return{message:"Unexpected RegExp Anchor Error:\n\tToken Type: ->"+t.name+"<- static 'PATTERN' cannot contain start of input anchor '^'\n\tSee https://chevrotain.io/docs/guide/resolving_lexer_errors.html#ANCHORS\tfor details.",type:s.LexerDefinitionErrorType.SOI_ANCHOR_FOUND,tokenTypes:[t]}})}function B(t){var e=(0,I.default)(t,function(t){var e=t[P];return e instanceof RegExp&&(e.multiline||e.global)});return(0,v.default)(e,function(t){return{message:"Token Type: ->"+t.name+"<- static 'PATTERN' may NOT contain global('g') or multiline('m')",type:s.LexerDefinitionErrorType.UNSUPPORTED_FLAGS_FOUND,tokenTypes:[t]}})}function G(t){var e=[],n=(0,v.default)(t,function(n){return(0,x.default)(t,function(t,r){return n.PATTERN.source!==r.PATTERN.source||(0,b.default)(e,r)||r.PATTERN===s.Lexer.NA||(e.push(r),t.push(r)),t},[])});n=(0,l.default)(n);var r=(0,I.default)(n,function(t){return t.length>1});return(0,v.default)(r,function(t){var e=(0,v.default)(t,function(t){return t.name}),n=(0,u.default)(t).PATTERN;return{message:"The same RegExp pattern ->".concat(n,"<-")+"has been used in all of the following Token Types: ".concat(e.join(", ")," <-"),type:s.LexerDefinitionErrorType.DUPLICATE_PATTERNS_FOUND,tokenTypes:t}})}function W(t){var e=(0,I.default)(t,function(t){if(!(0,R.default)(t,"GROUP"))return!1;var e=t.GROUP;return e!==s.Lexer.SKIPPED&&e!==s.Lexer.NA&&!(0,E.default)(e)});return(0,v.default)(e,function(t){return{message:"Token Type: ->"+t.name+"<- static 'GROUP' can only be Lexer.SKIPPED/Lexer.NA/A String",type:s.LexerDefinitionErrorType.INVALID_GROUP_TYPE_FOUND,tokenTypes:[t]}})}function z(t,e){var n=(0,I.default)(t,function(t){return void 0!==t.PUSH_MODE&&!(0,b.default)(e,t.PUSH_MODE)});return(0,v.default)(n,function(t){return{message:"Token Type: ->".concat(t.name,"<- static 'PUSH_MODE' value cannot refer to a Lexer Mode ->").concat(t.PUSH_MODE,"<-")+"which does not exist",type:s.LexerDefinitionErrorType.PUSH_MODE_DOES_NOT_EXIST,tokenTypes:[t]}})}function Y(t){var e=[],n=(0,x.default)(t,function(t,e,n){var r,o,i=e.PATTERN;return i===s.Lexer.NA||((0,E.default)(i)?t.push({str:i,idx:n,tokenType:e}):(0,O.default)(i)&&(r=i,o=[".","\\","[","]","|","^","$","(",")","?","*","+","{"],void 0===(0,_.default)(o,function(t){return-1!==r.source.indexOf(t)}))&&t.push({str:i.source,idx:n,tokenType:e})),t},[]);return(0,y.default)(t,function(t,r){(0,y.default)(n,function(n){var o=n.str,i=n.idx,a=n.tokenType;if(r".concat(t.name,"<-")+"in the lexer's definition.\nSee https://chevrotain.io/docs/guide/resolving_lexer_errors.html#UNREACHABLE";e.push({message:u,type:s.LexerDefinitionErrorType.UNREACHABLE_PATTERN,tokenTypes:[t,a]})}})}),e}function q(t){var e=t.ignoreCase?"i":"";return new RegExp("^(?:".concat(t.source,")"),e)}function K(t){var e=t.ignoreCase?"iy":"y";return new RegExp("".concat(t.source),e)}function H(t){var e=t.PATTERN;if((0,O.default)(e))return!1;if((0,T.default)(e))return!0;if((0,R.default)(e,"exec"))return!0;if((0,E.default)(e))return!1;throw Error("non exhaustive match")}function X(t){return!(!(0,E.default)(t)||1!==t.length)&&t.charCodeAt(0)}function $(t,e){if((0,R.default)(t,"LINE_BREAKS"))return!1;if((0,O.default)(t.PATTERN)){try{(0,C.canMatchCharCode)(e,t.PATTERN)}catch(t){return{issue:s.LexerDefinitionErrorType.IDENTIFY_TERMINATOR,errMsg:t.message}}return!1}if((0,E.default)(t.PATTERN))return!1;if(H(t))return{issue:s.LexerDefinitionErrorType.CUSTOM_LINE_BREAK};throw Error("non exhaustive match")}function Z(t,e){if(e.issue===s.LexerDefinitionErrorType.IDENTIFY_TERMINATOR)return"Warning: unable to identify line terminator usage in pattern.\n"+"\tThe problem is in the <".concat(t.name,"> Token Type\n")+"\t Root cause: ".concat(e.errMsg,".\n")+"\tFor details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#IDENTIFY_TERMINATOR";if(e.issue===s.LexerDefinitionErrorType.CUSTOM_LINE_BREAK)return"Warning: A Custom Token Pattern should specify the option.\n"+"\tThe problem is in the <".concat(t.name,"> Token Type\n")+"\tFor details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#CUSTOM_LINE_BREAK";throw Error("non exhaustive match")}function Q(t){return(0,v.default)(t,function(t){return(0,E.default)(t)?t.charCodeAt(0):t})}function J(t,e,n){void 0===t[e]?t[e]=[n]:t[e].push(n)}e.findStartOfInputAnchor=V,e.findUnsupportedFlags=B,e.findDuplicatePatterns=G,e.findInvalidGroupType=W,e.findModesThatDoNotExist=z,e.findUnreachablePatterns=Y,e.addStartOfInput=q,e.addStickyFlag=K,e.performRuntimeChecks=function(t,n,r){var o=[];return(0,R.default)(t,e.DEFAULT_MODE)||o.push({message:"A MultiMode Lexer cannot be initialized without a <"+e.DEFAULT_MODE+"> property in its definition\n",type:s.LexerDefinitionErrorType.MULTI_MODE_LEXER_WITHOUT_DEFAULT_MODE}),(0,R.default)(t,e.MODES)||o.push({message:"A MultiMode Lexer cannot be initialized without a <"+e.MODES+"> property in its definition\n",type:s.LexerDefinitionErrorType.MULTI_MODE_LEXER_WITHOUT_MODES_PROPERTY}),(0,R.default)(t,e.MODES)&&(0,R.default)(t,e.DEFAULT_MODE)&&!(0,R.default)(t.modes,t.defaultMode)&&o.push({message:"A MultiMode Lexer cannot be initialized with a ".concat(e.DEFAULT_MODE,": <").concat(t.defaultMode,">")+"which does not exist\n",type:s.LexerDefinitionErrorType.MULTI_MODE_LEXER_DEFAULT_MODE_VALUE_DOES_NOT_EXIST}),(0,R.default)(t,e.MODES)&&(0,y.default)(t.modes,function(t,e){(0,y.default)(t,function(n,r){if((0,A.default)(n))o.push({message:"A Lexer cannot be initialized using an undefined Token Type. Mode:"+"<".concat(e,"> at index: <").concat(r,">\n"),type:s.LexerDefinitionErrorType.LEXER_DEFINITION_CANNOT_CONTAIN_UNDEFINED});else if((0,R.default)(n,"LONGER_ALT")){var i=(0,f.default)(n.LONGER_ALT)?n.LONGER_ALT:[n.LONGER_ALT];(0,y.default)(i,function(r){(0,A.default)(r)||(0,b.default)(t,r)||o.push({message:"A MultiMode Lexer cannot be initialized with a longer_alt <".concat(r.name,"> on token <").concat(n.name,"> outside of mode <").concat(e,">\n"),type:s.LexerDefinitionErrorType.MULTI_MODE_LEXER_LONGER_ALT_NOT_IN_CURRENT_MODE})})}})}),o},e.performWarningRuntimeChecks=function(t,e,n){var r=[],o=!1,i=(0,l.default)((0,p.default)((0,h.default)(t.modes))),a=(0,d.default)(i,function(t){return t[P]===s.Lexer.NA}),u=Q(n);return e&&(0,y.default)(a,function(t){var e=$(t,u);if(!1!==e){var n={message:Z(t,e),type:e.issue,tokenType:t};r.push(n)}else(0,R.default)(t,"LINE_BREAKS")?!0===t.LINE_BREAKS&&(o=!0):(0,C.canMatchCharCode)(u,t.PATTERN)&&(o=!0)}),e&&!o&&r.push({message:"Warning: No LINE_BREAKS Found.\n\tThis Lexer has been defined to track line and column information,\n\tBut none of the Token Types can be identified as matching a line terminator.\n\tSee https://chevrotain.io/docs/guide/resolving_lexer_errors.html#LINE_BREAKS \n\tfor details.",type:s.LexerDefinitionErrorType.NO_LINE_BREAKS_FLAGS}),r},e.cloneEmptyGroups=function(t){var e={},n=(0,N.default)(t);return(0,y.default)(n,function(n){var r=t[n];if(!(0,f.default)(r))throw Error("non exhaustive match");e[n]=[]}),e},e.isCustomPattern=H,e.isShortPattern=X,e.LineTerminatorOptimizedTester={test:function(t){for(var e=t.length,n=this.lastIndex;n{var r=n(1882),o=n(7296),i=n(3805),a=n(7473),s=/^\[object .+?Constructor\]$/,u=Function.prototype,c=Object.prototype,l=u.toString,f=c.hasOwnProperty,h=RegExp("^"+l.call(f).replace(/[\\^$.*+?()[\]{}|]/g,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");t.exports=function(t){return!(!i(t)||o(t))&&(r(t)?h:s).test(a(t))}},5128:(t,e,n)=>{var r=n(909),o=n(4894);t.exports=function(t,e){var n=-1,i=o(t)?Array(t.length):[];return r(t,function(t,r,o){i[++n]=e(t,r,o)}),i}},5160:t=>{t.exports=function(t,e,n){var r=-1,o=t.length;e<0&&(e=-e>o?0:o+e),(n=n>o?o:n)<0&&(n+=o),o=e>n?0:n-e>>>0,e>>>=0;for(var i=Array(o);++r{t.exports=function(t,e){return t===e||t!=t&&e!=e}},5325:(t,e,n)=>{var r=n(6131);t.exports=function(t,e){return!(null==t||!t.length)&&r(t,e,0)>-1}},5378:(t,e,n)=>{var r=n(4932),o=n(5389),i=n(5128),a=n(6449);t.exports=function(t,e){return(a(t)?r:i)(t,o(e,3))}},5389:(t,e,n)=>{var r=n(3663),o=n(7978),i=n(3488),a=n(6449),s=n(583);t.exports=function(t){return"function"==typeof t?t:null==t?i:"object"==typeof t?a(t)?o(t[0],t[1]):r(t):s(t)}},5463:t=>{t.exports=function(t){return t!=t}},5481:(t,e,n)=>{var r=n(9325)["__core-js_shared__"];t.exports=r},5527:t=>{var e=Object.prototype;t.exports=function(t){var n=t&&t.constructor;return t===("function"==typeof n&&n.prototype||e)}},5529:(t,e,n)=>{var r=n(9344),o=n(8879),i=n(5527);t.exports=function(t){return"function"!=typeof t.constructor||i(t)?{}:r(o(t))}},5558:t=>{t.exports=function(t,e,n,r,o){return o(t,function(t,o,i){n=r?(r=!1,t):e(n,t,o,i)}),n}},5580:(t,e,n)=>{var r=n(6110)(n(9325),"DataView");t.exports=r},5592:(t,e,n)=>{"use strict";n.d(e,{Q:()=>r});class r{constructor(){this._listeners={},this._isEventPaused=!1}listen(t,e){void 0===this._listeners&&(this._listeners={});var n=this._listeners;void 0===n[t]&&(n[t]=[]),-1===n[t].indexOf(e)&&n[t].push(e)}addListener(t,e){this.listen(t,e)}hasListener(t,e){return void 0!==this._listeners&&void 0!==this._listeners[t]&&-1!==this._listeners[t].indexOf(e)}removeListener(t,e){if(void 0!==this._listeners){var n=this._listeners[t];if(void 0!==n){var r=n.indexOf(e);-1!==r&&n.splice(r,1)}}}dispatch(t,e={}){if(!this._isEventPaused&&void 0!==this._listeners&&void 0!==(n=this._listeners[t])){e.target=this;for(var n,r=0,o=(n=n.slice(0)).length;r{var r=n(1042);t.exports=function(t,e){var n=this.__data__;return this.size+=this.has(t)?0:1,n[t]=r&&void 0===e?"__lodash_hash_undefined__":e,this}},5765:(t,e,n)=>{var r=n(8859),o=n(5325),i=n(9905),a=n(9219),s=n(4517),u=n(4247);t.exports=function(t,e,n){var c=-1,l=o,f=t.length,h=!0,p=[],d=p;if(n)h=!1,l=i;else if(f>=200){var m=e?null:s(t);if(m)return u(m);h=!1,l=a,d=new r}else d=e?[]:p;t:for(;++c{var r=n(2507)("toUpperCase");t.exports=r},5861:(t,e,n)=>{var r=n(5580),o=n(8223),i=n(2804),a=n(6545),s=n(8303),u=n(2552),c=n(7473),l="[object Map]",f="[object Promise]",h="[object Set]",p="[object WeakMap]",d="[object DataView]",m=c(r),g=c(o),v=c(i),y=c(a),E=c(s),T=u;(r&&T(new r(new ArrayBuffer(1)))!=d||o&&T(new o)!=l||i&&T(i.resolve())!=f||a&&T(new a)!=h||s&&T(new s)!=p)&&(T=function(t){var e=u(t),n="[object Object]"==e?t.constructor:void 0,r=n?c(n):"";if(r)switch(r){case m:return d;case g:return l;case v:return f;case y:return h;case E:return p}return e}),t.exports=T},5880:(t,e,n)=>{var r=n(514),o=n(5950);t.exports=function(t){return null==t?[]:r(t,o(t))}},5891:(t,e,n)=>{var r=n(1873),o=n(2428),i=n(6449),a=r?r.isConcatSpreadable:void 0;t.exports=function(t){return i(t)||o(t)||!!(a&&t&&t[a])}},5911:(t,e,n)=>{var r=n(8859),o=n(4248),i=n(9219);t.exports=function(t,e,n,a,s,u){var c=1&n,l=t.length,f=e.length;if(l!=f&&!(c&&f>l))return!1;var h=u.get(t),p=u.get(e);if(h&&p)return h==e&&p==t;var d=-1,m=!0,g=2&n?new r:void 0;for(u.set(t,e),u.set(e,t);++d{var r=n(695),o=n(8984),i=n(4894);t.exports=function(t){return i(t)?r(t):o(t)}},5970:(t,e,n)=>{var r=n(3120);t.exports=function(t){return null!=t&&t.length?r(t,1):[]}},5994:(t,e,n)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.createSyntaxDiagramsCode=void 0;var r=n(4927);e.createSyntaxDiagramsCode=function(t,e){var n=void 0===e?{}:e,o=n.resourceBase,i=void 0===o?"https://unpkg.com/chevrotain@".concat(r.VERSION,"/diagrams/"):o,a=n.css,s=void 0===a?"https://unpkg.com/chevrotain@".concat(r.VERSION,"/diagrams/diagrams.css"):a;return'\n\x3c!-- This is a generated file --\x3e\n\n\n\n\n'+"\n\n")+"\n\\n\\n\\n\\n\");\n var diagramsDiv = \"\\n
\\n\";\n var serializedGrammar = \"\\n\\n\");\n var initLogic = \"\\n\\n\";\n return (header + cssHtml + scripts + diagramsDiv + serializedGrammar + initLogic);\n}\nexports.createSyntaxDiagramsCode = createSyntaxDiagramsCode;\n//# sourceMappingURL=render_public.js.map","var freeGlobal = require('./_freeGlobal');\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Detect free variable `process` from Node.js. */\nvar freeProcess = moduleExports && freeGlobal.process;\n\n/** Used to access faster Node.js helpers. */\nvar nodeUtil = (function() {\n try {\n // Use `util.types` for Node.js 10+.\n var types = freeModule && freeModule.require && freeModule.require('util').types;\n\n if (types) {\n return types;\n }\n\n // Legacy `process.binding('util')` for Node.js < 10.\n return freeProcess && freeProcess.binding && freeProcess.binding('util');\n } catch (e) {}\n}());\n\nmodule.exports = nodeUtil;\n","var eq = require('./eq');\n\n/**\n * Gets the index at which the `key` is found in `array` of key-value pairs.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} key The key to search for.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction assocIndexOf(array, key) {\n var length = array.length;\n while (length--) {\n if (eq(array[length][0], key)) {\n return length;\n }\n }\n return -1;\n}\n\nmodule.exports = assocIndexOf;\n","var getTag = require('./_getTag'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar setTag = '[object Set]';\n\n/**\n * The base implementation of `_.isSet` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a set, else `false`.\n */\nfunction baseIsSet(value) {\n return isObjectLike(value) && getTag(value) == setTag;\n}\n\nmodule.exports = baseIsSet;\n","\"use strict\";\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.buildModel = void 0;\nvar gast_1 = require(\"@chevrotain/gast\");\nvar map_1 = __importDefault(require(\"lodash/map\"));\nvar flatten_1 = __importDefault(require(\"lodash/flatten\"));\nvar values_1 = __importDefault(require(\"lodash/values\"));\nvar some_1 = __importDefault(require(\"lodash/some\"));\nvar groupBy_1 = __importDefault(require(\"lodash/groupBy\"));\nvar assign_1 = __importDefault(require(\"lodash/assign\"));\nfunction buildModel(productions) {\n var generator = new CstNodeDefinitionGenerator();\n var allRules = (0, values_1.default)(productions);\n return (0, map_1.default)(allRules, function (rule) { return generator.visitRule(rule); });\n}\nexports.buildModel = buildModel;\nvar CstNodeDefinitionGenerator = /** @class */ (function (_super) {\n __extends(CstNodeDefinitionGenerator, _super);\n function CstNodeDefinitionGenerator() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n CstNodeDefinitionGenerator.prototype.visitRule = function (node) {\n var rawElements = this.visitEach(node.definition);\n var grouped = (0, groupBy_1.default)(rawElements, function (el) { return el.propertyName; });\n var properties = (0, map_1.default)(grouped, function (group, propertyName) {\n var allNullable = !(0, some_1.default)(group, function (el) { return !el.canBeNull; });\n // In an alternation with a label a property name can have\n // multiple types.\n var propertyType = group[0].type;\n if (group.length > 1) {\n propertyType = (0, map_1.default)(group, function (g) { return g.type; });\n }\n return {\n name: propertyName,\n type: propertyType,\n optional: allNullable\n };\n });\n return {\n name: node.name,\n properties: properties\n };\n };\n CstNodeDefinitionGenerator.prototype.visitAlternative = function (node) {\n return this.visitEachAndOverrideWith(node.definition, { canBeNull: true });\n };\n CstNodeDefinitionGenerator.prototype.visitOption = function (node) {\n return this.visitEachAndOverrideWith(node.definition, { canBeNull: true });\n };\n CstNodeDefinitionGenerator.prototype.visitRepetition = function (node) {\n return this.visitEachAndOverrideWith(node.definition, { canBeNull: true });\n };\n CstNodeDefinitionGenerator.prototype.visitRepetitionMandatory = function (node) {\n return this.visitEach(node.definition);\n };\n CstNodeDefinitionGenerator.prototype.visitRepetitionMandatoryWithSeparator = function (node) {\n return this.visitEach(node.definition).concat({\n propertyName: node.separator.name,\n canBeNull: true,\n type: getType(node.separator)\n });\n };\n CstNodeDefinitionGenerator.prototype.visitRepetitionWithSeparator = function (node) {\n return this.visitEachAndOverrideWith(node.definition, {\n canBeNull: true\n }).concat({\n propertyName: node.separator.name,\n canBeNull: true,\n type: getType(node.separator)\n });\n };\n CstNodeDefinitionGenerator.prototype.visitAlternation = function (node) {\n return this.visitEachAndOverrideWith(node.definition, { canBeNull: true });\n };\n CstNodeDefinitionGenerator.prototype.visitTerminal = function (node) {\n return [\n {\n propertyName: node.label || node.terminalType.name,\n canBeNull: false,\n type: getType(node)\n }\n ];\n };\n CstNodeDefinitionGenerator.prototype.visitNonTerminal = function (node) {\n return [\n {\n propertyName: node.label || node.nonTerminalName,\n canBeNull: false,\n type: getType(node)\n }\n ];\n };\n CstNodeDefinitionGenerator.prototype.visitEachAndOverrideWith = function (definition, override) {\n return (0, map_1.default)(this.visitEach(definition), function (definition) { return (0, assign_1.default)({}, definition, override); });\n };\n CstNodeDefinitionGenerator.prototype.visitEach = function (definition) {\n var _this = this;\n return (0, flatten_1.default)((0, map_1.default)(definition, function (definition) { return _this.visit(definition); }));\n };\n return CstNodeDefinitionGenerator;\n}(gast_1.GAstVisitor));\nfunction getType(production) {\n if (production instanceof gast_1.NonTerminal) {\n return {\n kind: \"rule\",\n name: production.referencedRule.name\n };\n }\n return { kind: \"token\" };\n}\n//# sourceMappingURL=model.js.map","/** Error message constants. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/**\n * Creates a function that negates the result of the predicate `func`. The\n * `func` predicate is invoked with the `this` binding and arguments of the\n * created function.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Function\n * @param {Function} predicate The predicate to negate.\n * @returns {Function} Returns the new negated function.\n * @example\n *\n * function isEven(n) {\n * return n % 2 == 0;\n * }\n *\n * _.filter([1, 2, 3, 4, 5, 6], _.negate(isEven));\n * // => [1, 3, 5]\n */\nfunction negate(predicate) {\n if (typeof predicate != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n return function() {\n var args = arguments;\n switch (args.length) {\n case 0: return !predicate.call(this);\n case 1: return !predicate.call(this, args[0]);\n case 2: return !predicate.call(this, args[0], args[1]);\n case 3: return !predicate.call(this, args[0], args[1], args[2]);\n }\n return !predicate.apply(this, args);\n };\n}\n\nmodule.exports = negate;\n","var baseIsNative = require('./_baseIsNative'),\n getValue = require('./_getValue');\n\n/**\n * Gets the native function at `key` of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the method to get.\n * @returns {*} Returns the function if it's native, else `undefined`.\n */\nfunction getNative(object, key) {\n var value = getValue(object, key);\n return baseIsNative(value) ? value : undefined;\n}\n\nmodule.exports = getNative;\n","var baseFindIndex = require('./_baseFindIndex'),\n baseIsNaN = require('./_baseIsNaN'),\n strictIndexOf = require('./_strictIndexOf');\n\n/**\n * The base implementation of `_.indexOf` without `fromIndex` bounds checks.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @param {number} fromIndex The index to search from.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction baseIndexOf(array, value, fromIndex) {\n return value === value\n ? strictIndexOf(array, value, fromIndex)\n : baseFindIndex(array, baseIsNaN, fromIndex);\n}\n\nmodule.exports = baseIndexOf;\n","var assignValue = require('./_assignValue'),\n copyObject = require('./_copyObject'),\n createAssigner = require('./_createAssigner'),\n isArrayLike = require('./isArrayLike'),\n isPrototype = require('./_isPrototype'),\n keys = require('./keys');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Assigns own enumerable string keyed properties of source objects to the\n * destination object. Source objects are applied from left to right.\n * Subsequent sources overwrite property assignments of previous sources.\n *\n * **Note:** This method mutates `object` and is loosely based on\n * [`Object.assign`](https://mdn.io/Object/assign).\n *\n * @static\n * @memberOf _\n * @since 0.10.0\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} [sources] The source objects.\n * @returns {Object} Returns `object`.\n * @see _.assignIn\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * }\n *\n * function Bar() {\n * this.c = 3;\n * }\n *\n * Foo.prototype.b = 2;\n * Bar.prototype.d = 4;\n *\n * _.assign({ 'a': 0 }, new Foo, new Bar);\n * // => { 'a': 1, 'c': 3 }\n */\nvar assign = createAssigner(function(object, source) {\n if (isPrototype(source) || isArrayLike(source)) {\n copyObject(source, keys(source), object);\n return;\n }\n for (var key in source) {\n if (hasOwnProperty.call(source, key)) {\n assignValue(object, key, source[key]);\n }\n }\n});\n\nmodule.exports = assign;\n","var cloneArrayBuffer = require('./_cloneArrayBuffer');\n\n/**\n * Creates a clone of `dataView`.\n *\n * @private\n * @param {Object} dataView The data view to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the cloned data view.\n */\nfunction cloneDataView(dataView, isDeep) {\n var buffer = isDeep ? cloneArrayBuffer(dataView.buffer) : dataView.buffer;\n return new dataView.constructor(buffer, dataView.byteOffset, dataView.byteLength);\n}\n\nmodule.exports = cloneDataView;\n","module.exports = require('./head');\n","\"use strict\";\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.buildInProdFollowPrefix = exports.buildBetweenProdsFollowPrefix = exports.computeAllProdsFollows = exports.ResyncFollowsWalker = void 0;\nvar rest_1 = require(\"./rest\");\nvar first_1 = require(\"./first\");\nvar forEach_1 = __importDefault(require(\"lodash/forEach\"));\nvar assign_1 = __importDefault(require(\"lodash/assign\"));\nvar constants_1 = require(\"../constants\");\nvar gast_1 = require(\"@chevrotain/gast\");\n// This ResyncFollowsWalker computes all of the follows required for RESYNC\n// (skipping reference production).\nvar ResyncFollowsWalker = /** @class */ (function (_super) {\n __extends(ResyncFollowsWalker, _super);\n function ResyncFollowsWalker(topProd) {\n var _this = _super.call(this) || this;\n _this.topProd = topProd;\n _this.follows = {};\n return _this;\n }\n ResyncFollowsWalker.prototype.startWalking = function () {\n this.walk(this.topProd);\n return this.follows;\n };\n ResyncFollowsWalker.prototype.walkTerminal = function (terminal, currRest, prevRest) {\n // do nothing! just like in the public sector after 13:00\n };\n ResyncFollowsWalker.prototype.walkProdRef = function (refProd, currRest, prevRest) {\n var followName = buildBetweenProdsFollowPrefix(refProd.referencedRule, refProd.idx) +\n this.topProd.name;\n var fullRest = currRest.concat(prevRest);\n var restProd = new gast_1.Alternative({ definition: fullRest });\n var t_in_topProd_follows = (0, first_1.first)(restProd);\n this.follows[followName] = t_in_topProd_follows;\n };\n return ResyncFollowsWalker;\n}(rest_1.RestWalker));\nexports.ResyncFollowsWalker = ResyncFollowsWalker;\nfunction computeAllProdsFollows(topProductions) {\n var reSyncFollows = {};\n (0, forEach_1.default)(topProductions, function (topProd) {\n var currRefsFollow = new ResyncFollowsWalker(topProd).startWalking();\n (0, assign_1.default)(reSyncFollows, currRefsFollow);\n });\n return reSyncFollows;\n}\nexports.computeAllProdsFollows = computeAllProdsFollows;\nfunction buildBetweenProdsFollowPrefix(inner, occurenceInParent) {\n return inner.name + occurenceInParent + constants_1.IN;\n}\nexports.buildBetweenProdsFollowPrefix = buildBetweenProdsFollowPrefix;\nfunction buildInProdFollowPrefix(terminal) {\n var terminalName = terminal.terminalType.name;\n return terminalName + terminal.idx + constants_1.IN;\n}\nexports.buildInProdFollowPrefix = buildInProdFollowPrefix;\n//# sourceMappingURL=follow.js.map","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Initializes an array clone.\n *\n * @private\n * @param {Array} array The array to clone.\n * @returns {Array} Returns the initialized clone.\n */\nfunction initCloneArray(array) {\n var length = array.length,\n result = new array.constructor(length);\n\n // Add properties assigned by `RegExp#exec`.\n if (length && typeof array[0] == 'string' && hasOwnProperty.call(array, 'index')) {\n result.index = array.index;\n result.input = array.input;\n }\n return result;\n}\n\nmodule.exports = initCloneArray;\n","\"use strict\";\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.canMatchCharCode = exports.firstCharOptimizedIndices = exports.getOptimizedStartCodesIndices = exports.failedOptimizationPrefixMsg = void 0;\nvar regexp_to_ast_1 = require(\"regexp-to-ast\");\nvar isArray_1 = __importDefault(require(\"lodash/isArray\"));\nvar every_1 = __importDefault(require(\"lodash/every\"));\nvar forEach_1 = __importDefault(require(\"lodash/forEach\"));\nvar find_1 = __importDefault(require(\"lodash/find\"));\nvar values_1 = __importDefault(require(\"lodash/values\"));\nvar includes_1 = __importDefault(require(\"lodash/includes\"));\nvar utils_1 = require(\"@chevrotain/utils\");\nvar reg_exp_parser_1 = require(\"./reg_exp_parser\");\nvar lexer_1 = require(\"./lexer\");\nvar complementErrorMessage = \"Complement Sets are not supported for first char optimization\";\nexports.failedOptimizationPrefixMsg = 'Unable to use \"first char\" lexer optimizations:\\n';\nfunction getOptimizedStartCodesIndices(regExp, ensureOptimizations) {\n if (ensureOptimizations === void 0) { ensureOptimizations = false; }\n try {\n var ast = (0, reg_exp_parser_1.getRegExpAst)(regExp);\n var firstChars = firstCharOptimizedIndices(ast.value, {}, ast.flags.ignoreCase);\n return firstChars;\n }\n catch (e) {\n /* istanbul ignore next */\n // Testing this relies on the regexp-to-ast library having a bug... */\n // TODO: only the else branch needs to be ignored, try to fix with newer prettier / tsc\n if (e.message === complementErrorMessage) {\n if (ensureOptimizations) {\n (0, utils_1.PRINT_WARNING)(\"\".concat(exports.failedOptimizationPrefixMsg) +\n \"\\tUnable to optimize: < \".concat(regExp.toString(), \" >\\n\") +\n \"\\tComplement Sets cannot be automatically optimized.\\n\" +\n \"\\tThis will disable the lexer's first char optimizations.\\n\" +\n \"\\tSee: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#COMPLEMENT for details.\");\n }\n }\n else {\n var msgSuffix = \"\";\n if (ensureOptimizations) {\n msgSuffix =\n \"\\n\\tThis will disable the lexer's first char optimizations.\\n\" +\n \"\\tSee: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#REGEXP_PARSING for details.\";\n }\n (0, utils_1.PRINT_ERROR)(\"\".concat(exports.failedOptimizationPrefixMsg, \"\\n\") +\n \"\\tFailed parsing: < \".concat(regExp.toString(), \" >\\n\") +\n \"\\tUsing the regexp-to-ast library version: \".concat(regexp_to_ast_1.VERSION, \"\\n\") +\n \"\\tPlease open an issue at: https://github.com/bd82/regexp-to-ast/issues\" +\n msgSuffix);\n }\n }\n return [];\n}\nexports.getOptimizedStartCodesIndices = getOptimizedStartCodesIndices;\nfunction firstCharOptimizedIndices(ast, result, ignoreCase) {\n switch (ast.type) {\n case \"Disjunction\":\n for (var i = 0; i < ast.value.length; i++) {\n firstCharOptimizedIndices(ast.value[i], result, ignoreCase);\n }\n break;\n case \"Alternative\":\n var terms = ast.value;\n for (var i = 0; i < terms.length; i++) {\n var term = terms[i];\n // skip terms that cannot effect the first char results\n switch (term.type) {\n case \"EndAnchor\":\n // A group back reference cannot affect potential starting char.\n // because if a back reference is the first production than automatically\n // the group being referenced has had to come BEFORE so its codes have already been added\n case \"GroupBackReference\":\n // assertions do not affect potential starting codes\n case \"Lookahead\":\n case \"NegativeLookahead\":\n case \"StartAnchor\":\n case \"WordBoundary\":\n case \"NonWordBoundary\":\n continue;\n }\n var atom = term;\n switch (atom.type) {\n case \"Character\":\n addOptimizedIdxToResult(atom.value, result, ignoreCase);\n break;\n case \"Set\":\n if (atom.complement === true) {\n throw Error(complementErrorMessage);\n }\n (0, forEach_1.default)(atom.value, function (code) {\n if (typeof code === \"number\") {\n addOptimizedIdxToResult(code, result, ignoreCase);\n }\n else {\n // range\n var range = code;\n // cannot optimize when ignoreCase is\n if (ignoreCase === true) {\n for (var rangeCode = range.from; rangeCode <= range.to; rangeCode++) {\n addOptimizedIdxToResult(rangeCode, result, ignoreCase);\n }\n }\n // Optimization (2 orders of magnitude less work for very large ranges)\n else {\n // handle unoptimized values\n for (var rangeCode = range.from; rangeCode <= range.to && rangeCode < lexer_1.minOptimizationVal; rangeCode++) {\n addOptimizedIdxToResult(rangeCode, result, ignoreCase);\n }\n // Less common charCode where we optimize for faster init time, by using larger \"buckets\"\n if (range.to >= lexer_1.minOptimizationVal) {\n var minUnOptVal = range.from >= lexer_1.minOptimizationVal\n ? range.from\n : lexer_1.minOptimizationVal;\n var maxUnOptVal = range.to;\n var minOptIdx = (0, lexer_1.charCodeToOptimizedIndex)(minUnOptVal);\n var maxOptIdx = (0, lexer_1.charCodeToOptimizedIndex)(maxUnOptVal);\n for (var currOptIdx = minOptIdx; currOptIdx <= maxOptIdx; currOptIdx++) {\n result[currOptIdx] = currOptIdx;\n }\n }\n }\n }\n });\n break;\n case \"Group\":\n firstCharOptimizedIndices(atom.value, result, ignoreCase);\n break;\n /* istanbul ignore next */\n default:\n throw Error(\"Non Exhaustive Match\");\n }\n // reached a mandatory production, no more **start** codes can be found on this alternative\n var isOptionalQuantifier = atom.quantifier !== undefined && atom.quantifier.atLeast === 0;\n if (\n // A group may be optional due to empty contents /(?:)/\n // or if everything inside it is optional /((a)?)/\n (atom.type === \"Group\" && isWholeOptional(atom) === false) ||\n // If this term is not a group it may only be optional if it has an optional quantifier\n (atom.type !== \"Group\" && isOptionalQuantifier === false)) {\n break;\n }\n }\n break;\n /* istanbul ignore next */\n default:\n throw Error(\"non exhaustive match!\");\n }\n // console.log(Object.keys(result).length)\n return (0, values_1.default)(result);\n}\nexports.firstCharOptimizedIndices = firstCharOptimizedIndices;\nfunction addOptimizedIdxToResult(code, result, ignoreCase) {\n var optimizedCharIdx = (0, lexer_1.charCodeToOptimizedIndex)(code);\n result[optimizedCharIdx] = optimizedCharIdx;\n if (ignoreCase === true) {\n handleIgnoreCase(code, result);\n }\n}\nfunction handleIgnoreCase(code, result) {\n var char = String.fromCharCode(code);\n var upperChar = char.toUpperCase();\n /* istanbul ignore else */\n if (upperChar !== char) {\n var optimizedCharIdx = (0, lexer_1.charCodeToOptimizedIndex)(upperChar.charCodeAt(0));\n result[optimizedCharIdx] = optimizedCharIdx;\n }\n else {\n var lowerChar = char.toLowerCase();\n if (lowerChar !== char) {\n var optimizedCharIdx = (0, lexer_1.charCodeToOptimizedIndex)(lowerChar.charCodeAt(0));\n result[optimizedCharIdx] = optimizedCharIdx;\n }\n }\n}\nfunction findCode(setNode, targetCharCodes) {\n return (0, find_1.default)(setNode.value, function (codeOrRange) {\n if (typeof codeOrRange === \"number\") {\n return (0, includes_1.default)(targetCharCodes, codeOrRange);\n }\n else {\n // range\n var range_1 = codeOrRange;\n return ((0, find_1.default)(targetCharCodes, function (targetCode) { return range_1.from <= targetCode && targetCode <= range_1.to; }) !== undefined);\n }\n });\n}\nfunction isWholeOptional(ast) {\n var quantifier = ast.quantifier;\n if (quantifier && quantifier.atLeast === 0) {\n return true;\n }\n if (!ast.value) {\n return false;\n }\n return (0, isArray_1.default)(ast.value)\n ? (0, every_1.default)(ast.value, isWholeOptional)\n : isWholeOptional(ast.value);\n}\nvar CharCodeFinder = /** @class */ (function (_super) {\n __extends(CharCodeFinder, _super);\n function CharCodeFinder(targetCharCodes) {\n var _this = _super.call(this) || this;\n _this.targetCharCodes = targetCharCodes;\n _this.found = false;\n return _this;\n }\n CharCodeFinder.prototype.visitChildren = function (node) {\n // No need to keep looking...\n if (this.found === true) {\n return;\n }\n // switch lookaheads as they do not actually consume any characters thus\n // finding a charCode at lookahead context does not mean that regexp can actually contain it in a match.\n switch (node.type) {\n case \"Lookahead\":\n this.visitLookahead(node);\n return;\n case \"NegativeLookahead\":\n this.visitNegativeLookahead(node);\n return;\n }\n _super.prototype.visitChildren.call(this, node);\n };\n CharCodeFinder.prototype.visitCharacter = function (node) {\n if ((0, includes_1.default)(this.targetCharCodes, node.value)) {\n this.found = true;\n }\n };\n CharCodeFinder.prototype.visitSet = function (node) {\n if (node.complement) {\n if (findCode(node, this.targetCharCodes) === undefined) {\n this.found = true;\n }\n }\n else {\n if (findCode(node, this.targetCharCodes) !== undefined) {\n this.found = true;\n }\n }\n };\n return CharCodeFinder;\n}(regexp_to_ast_1.BaseRegExpVisitor));\nfunction canMatchCharCode(charCodes, pattern) {\n if (pattern instanceof RegExp) {\n var ast = (0, reg_exp_parser_1.getRegExpAst)(pattern);\n var charCodeFinder = new CharCodeFinder(charCodes);\n charCodeFinder.visit(ast);\n return charCodeFinder.found;\n }\n else {\n return ((0, find_1.default)(pattern, function (char) {\n return (0, includes_1.default)(charCodes, char.charCodeAt(0));\n }) !== undefined);\n }\n}\nexports.canMatchCharCode = canMatchCharCode;\n//# sourceMappingURL=reg_exp.js.map","var baseDifference = require('./_baseDifference'),\n baseFlatten = require('./_baseFlatten'),\n baseRest = require('./_baseRest'),\n isArrayLikeObject = require('./isArrayLikeObject');\n\n/**\n * Creates an array of `array` values not included in the other given arrays\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons. The order and references of result values are\n * determined by the first array.\n *\n * **Note:** Unlike `_.pullAll`, this method returns a new array.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {...Array} [values] The values to exclude.\n * @returns {Array} Returns the new array of filtered values.\n * @see _.without, _.xor\n * @example\n *\n * _.difference([2, 1], [2, 3]);\n * // => [1]\n */\nvar difference = baseRest(function(array, values) {\n return isArrayLikeObject(array)\n ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true))\n : [];\n});\n\nmodule.exports = difference;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.toFastProperties = void 0;\n// based on: https://github.com/petkaantonov/bluebird/blob/b97c0d2d487e8c5076e8bd897e0dcd4622d31846/src/util.js#L201-L216\nfunction toFastProperties(toBecomeFast) {\n function FakeConstructor() { }\n // If our object is used as a constructor it would receive\n FakeConstructor.prototype = toBecomeFast;\n var fakeInstance = new FakeConstructor();\n function fakeAccess() {\n return typeof fakeInstance.bar;\n }\n // help V8 understand this is a \"real\" prototype by actually using\n // the fake instance.\n fakeAccess();\n fakeAccess();\n // Always true condition to suppress the Firefox warning of unreachable\n // code after a return statement.\n if (1)\n return toBecomeFast;\n // Eval prevents optimization of this method (even though this is dead code)\n /* istanbul ignore next */\n // tslint:disable-next-line\n eval(toBecomeFast);\n}\nexports.toFastProperties = toFastProperties;\n//# sourceMappingURL=to-fast-properties.js.map","\"use strict\";\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.EmbeddedActionsParser = exports.CstParser = exports.Parser = exports.EMPTY_ALT = exports.ParserDefinitionErrorType = exports.DEFAULT_RULE_CONFIG = exports.DEFAULT_PARSER_CONFIG = exports.END_OF_FILE = void 0;\nvar isEmpty_1 = __importDefault(require(\"lodash/isEmpty\"));\nvar map_1 = __importDefault(require(\"lodash/map\"));\nvar forEach_1 = __importDefault(require(\"lodash/forEach\"));\nvar values_1 = __importDefault(require(\"lodash/values\"));\nvar has_1 = __importDefault(require(\"lodash/has\"));\nvar clone_1 = __importDefault(require(\"lodash/clone\"));\nvar utils_1 = require(\"@chevrotain/utils\");\nvar follow_1 = require(\"../grammar/follow\");\nvar tokens_public_1 = require(\"../../scan/tokens_public\");\nvar errors_public_1 = require(\"../errors_public\");\nvar gast_resolver_public_1 = require(\"../grammar/gast/gast_resolver_public\");\nvar recoverable_1 = require(\"./traits/recoverable\");\nvar looksahead_1 = require(\"./traits/looksahead\");\nvar tree_builder_1 = require(\"./traits/tree_builder\");\nvar lexer_adapter_1 = require(\"./traits/lexer_adapter\");\nvar recognizer_api_1 = require(\"./traits/recognizer_api\");\nvar recognizer_engine_1 = require(\"./traits/recognizer_engine\");\nvar error_handler_1 = require(\"./traits/error_handler\");\nvar context_assist_1 = require(\"./traits/context_assist\");\nvar gast_recorder_1 = require(\"./traits/gast_recorder\");\nvar perf_tracer_1 = require(\"./traits/perf_tracer\");\nvar apply_mixins_1 = require(\"./utils/apply_mixins\");\nvar checks_1 = require(\"../grammar/checks\");\nexports.END_OF_FILE = (0, tokens_public_1.createTokenInstance)(tokens_public_1.EOF, \"\", NaN, NaN, NaN, NaN, NaN, NaN);\nObject.freeze(exports.END_OF_FILE);\nexports.DEFAULT_PARSER_CONFIG = Object.freeze({\n recoveryEnabled: false,\n maxLookahead: 3,\n dynamicTokensEnabled: false,\n outputCst: true,\n errorMessageProvider: errors_public_1.defaultParserErrorProvider,\n nodeLocationTracking: \"none\",\n traceInitPerf: false,\n skipValidations: false\n});\nexports.DEFAULT_RULE_CONFIG = Object.freeze({\n recoveryValueFunc: function () { return undefined; },\n resyncEnabled: true\n});\nvar ParserDefinitionErrorType;\n(function (ParserDefinitionErrorType) {\n ParserDefinitionErrorType[ParserDefinitionErrorType[\"INVALID_RULE_NAME\"] = 0] = \"INVALID_RULE_NAME\";\n ParserDefinitionErrorType[ParserDefinitionErrorType[\"DUPLICATE_RULE_NAME\"] = 1] = \"DUPLICATE_RULE_NAME\";\n ParserDefinitionErrorType[ParserDefinitionErrorType[\"INVALID_RULE_OVERRIDE\"] = 2] = \"INVALID_RULE_OVERRIDE\";\n ParserDefinitionErrorType[ParserDefinitionErrorType[\"DUPLICATE_PRODUCTIONS\"] = 3] = \"DUPLICATE_PRODUCTIONS\";\n ParserDefinitionErrorType[ParserDefinitionErrorType[\"UNRESOLVED_SUBRULE_REF\"] = 4] = \"UNRESOLVED_SUBRULE_REF\";\n ParserDefinitionErrorType[ParserDefinitionErrorType[\"LEFT_RECURSION\"] = 5] = \"LEFT_RECURSION\";\n ParserDefinitionErrorType[ParserDefinitionErrorType[\"NONE_LAST_EMPTY_ALT\"] = 6] = \"NONE_LAST_EMPTY_ALT\";\n ParserDefinitionErrorType[ParserDefinitionErrorType[\"AMBIGUOUS_ALTS\"] = 7] = \"AMBIGUOUS_ALTS\";\n ParserDefinitionErrorType[ParserDefinitionErrorType[\"CONFLICT_TOKENS_RULES_NAMESPACE\"] = 8] = \"CONFLICT_TOKENS_RULES_NAMESPACE\";\n ParserDefinitionErrorType[ParserDefinitionErrorType[\"INVALID_TOKEN_NAME\"] = 9] = \"INVALID_TOKEN_NAME\";\n ParserDefinitionErrorType[ParserDefinitionErrorType[\"NO_NON_EMPTY_LOOKAHEAD\"] = 10] = \"NO_NON_EMPTY_LOOKAHEAD\";\n ParserDefinitionErrorType[ParserDefinitionErrorType[\"AMBIGUOUS_PREFIX_ALTS\"] = 11] = \"AMBIGUOUS_PREFIX_ALTS\";\n ParserDefinitionErrorType[ParserDefinitionErrorType[\"TOO_MANY_ALTS\"] = 12] = \"TOO_MANY_ALTS\";\n ParserDefinitionErrorType[ParserDefinitionErrorType[\"CUSTOM_LOOKAHEAD_VALIDATION\"] = 13] = \"CUSTOM_LOOKAHEAD_VALIDATION\";\n})(ParserDefinitionErrorType = exports.ParserDefinitionErrorType || (exports.ParserDefinitionErrorType = {}));\nfunction EMPTY_ALT(value) {\n if (value === void 0) { value = undefined; }\n return function () {\n return value;\n };\n}\nexports.EMPTY_ALT = EMPTY_ALT;\nvar Parser = /** @class */ (function () {\n function Parser(tokenVocabulary, config) {\n this.definitionErrors = [];\n this.selfAnalysisDone = false;\n var that = this;\n that.initErrorHandler(config);\n that.initLexerAdapter();\n that.initLooksAhead(config);\n that.initRecognizerEngine(tokenVocabulary, config);\n that.initRecoverable(config);\n that.initTreeBuilder(config);\n that.initContentAssist();\n that.initGastRecorder(config);\n that.initPerformanceTracer(config);\n if ((0, has_1.default)(config, \"ignoredIssues\")) {\n throw new Error(\"The IParserConfig property has been deprecated.\\n\\t\" +\n \"Please use the flag on the relevant DSL method instead.\\n\\t\" +\n \"See: https://chevrotain.io/docs/guide/resolving_grammar_errors.html#IGNORING_AMBIGUITIES\\n\\t\" +\n \"For further details.\");\n }\n this.skipValidations = (0, has_1.default)(config, \"skipValidations\")\n ? config.skipValidations // casting assumes the end user passing the correct type\n : exports.DEFAULT_PARSER_CONFIG.skipValidations;\n }\n /**\n * @deprecated use the **instance** method with the same name instead\n */\n Parser.performSelfAnalysis = function (parserInstance) {\n throw Error(\"The **static** `performSelfAnalysis` method has been deprecated.\" +\n \"\\t\\nUse the **instance** method with the same name instead.\");\n };\n Parser.prototype.performSelfAnalysis = function () {\n var _this = this;\n this.TRACE_INIT(\"performSelfAnalysis\", function () {\n var defErrorsMsgs;\n _this.selfAnalysisDone = true;\n var className = _this.className;\n _this.TRACE_INIT(\"toFastProps\", function () {\n // Without this voodoo magic the parser would be x3-x4 slower\n // It seems it is better to invoke `toFastProperties` **before**\n // Any manipulations of the `this` object done during the recording phase.\n (0, utils_1.toFastProperties)(_this);\n });\n _this.TRACE_INIT(\"Grammar Recording\", function () {\n try {\n _this.enableRecording();\n // Building the GAST\n (0, forEach_1.default)(_this.definedRulesNames, function (currRuleName) {\n var wrappedRule = _this[currRuleName];\n var originalGrammarAction = wrappedRule[\"originalGrammarAction\"];\n var recordedRuleGast;\n _this.TRACE_INIT(\"\".concat(currRuleName, \" Rule\"), function () {\n recordedRuleGast = _this.topLevelRuleRecord(currRuleName, originalGrammarAction);\n });\n _this.gastProductionsCache[currRuleName] = recordedRuleGast;\n });\n }\n finally {\n _this.disableRecording();\n }\n });\n var resolverErrors = [];\n _this.TRACE_INIT(\"Grammar Resolving\", function () {\n resolverErrors = (0, gast_resolver_public_1.resolveGrammar)({\n rules: (0, values_1.default)(_this.gastProductionsCache)\n });\n _this.definitionErrors = _this.definitionErrors.concat(resolverErrors);\n });\n _this.TRACE_INIT(\"Grammar Validations\", function () {\n // only perform additional grammar validations IFF no resolving errors have occurred.\n // as unresolved grammar may lead to unhandled runtime exceptions in the follow up validations.\n if ((0, isEmpty_1.default)(resolverErrors) && _this.skipValidations === false) {\n var validationErrors = (0, gast_resolver_public_1.validateGrammar)({\n rules: (0, values_1.default)(_this.gastProductionsCache),\n tokenTypes: (0, values_1.default)(_this.tokensMap),\n errMsgProvider: errors_public_1.defaultGrammarValidatorErrorProvider,\n grammarName: className\n });\n var lookaheadValidationErrors = (0, checks_1.validateLookahead)({\n lookaheadStrategy: _this.lookaheadStrategy,\n rules: (0, values_1.default)(_this.gastProductionsCache),\n tokenTypes: (0, values_1.default)(_this.tokensMap),\n grammarName: className\n });\n _this.definitionErrors = _this.definitionErrors.concat(validationErrors, lookaheadValidationErrors);\n }\n });\n // this analysis may fail if the grammar is not perfectly valid\n if ((0, isEmpty_1.default)(_this.definitionErrors)) {\n // The results of these computations are not needed unless error recovery is enabled.\n if (_this.recoveryEnabled) {\n _this.TRACE_INIT(\"computeAllProdsFollows\", function () {\n var allFollows = (0, follow_1.computeAllProdsFollows)((0, values_1.default)(_this.gastProductionsCache));\n _this.resyncFollows = allFollows;\n });\n }\n _this.TRACE_INIT(\"ComputeLookaheadFunctions\", function () {\n var _a, _b;\n (_b = (_a = _this.lookaheadStrategy).initialize) === null || _b === void 0 ? void 0 : _b.call(_a, {\n rules: (0, values_1.default)(_this.gastProductionsCache)\n });\n _this.preComputeLookaheadFunctions((0, values_1.default)(_this.gastProductionsCache));\n });\n }\n if (!Parser.DEFER_DEFINITION_ERRORS_HANDLING &&\n !(0, isEmpty_1.default)(_this.definitionErrors)) {\n defErrorsMsgs = (0, map_1.default)(_this.definitionErrors, function (defError) { return defError.message; });\n throw new Error(\"Parser Definition Errors detected:\\n \".concat(defErrorsMsgs.join(\"\\n-------------------------------\\n\")));\n }\n });\n };\n // Set this flag to true if you don't want the Parser to throw error when problems in it's definition are detected.\n // (normally during the parser's constructor).\n // This is a design time flag, it will not affect the runtime error handling of the parser, just design time errors,\n // for example: duplicate rule names, referencing an unresolved subrule, ect...\n // This flag should not be enabled during normal usage, it is used in special situations, for example when\n // needing to display the parser definition errors in some GUI(online playground).\n Parser.DEFER_DEFINITION_ERRORS_HANDLING = false;\n return Parser;\n}());\nexports.Parser = Parser;\n(0, apply_mixins_1.applyMixins)(Parser, [\n recoverable_1.Recoverable,\n looksahead_1.LooksAhead,\n tree_builder_1.TreeBuilder,\n lexer_adapter_1.LexerAdapter,\n recognizer_engine_1.RecognizerEngine,\n recognizer_api_1.RecognizerApi,\n error_handler_1.ErrorHandler,\n context_assist_1.ContentAssist,\n gast_recorder_1.GastRecorder,\n perf_tracer_1.PerformanceTracer\n]);\nvar CstParser = /** @class */ (function (_super) {\n __extends(CstParser, _super);\n function CstParser(tokenVocabulary, config) {\n if (config === void 0) { config = exports.DEFAULT_PARSER_CONFIG; }\n var configClone = (0, clone_1.default)(config);\n configClone.outputCst = true;\n return _super.call(this, tokenVocabulary, configClone) || this;\n }\n return CstParser;\n}(Parser));\nexports.CstParser = CstParser;\nvar EmbeddedActionsParser = /** @class */ (function (_super) {\n __extends(EmbeddedActionsParser, _super);\n function EmbeddedActionsParser(tokenVocabulary, config) {\n if (config === void 0) { config = exports.DEFAULT_PARSER_CONFIG; }\n var configClone = (0, clone_1.default)(config);\n configClone.outputCst = false;\n return _super.call(this, tokenVocabulary, configClone) || this;\n }\n return EmbeddedActionsParser;\n}(Parser));\nexports.EmbeddedActionsParser = EmbeddedActionsParser;\n//# sourceMappingURL=parser.js.map","var arrayPush = require('./_arrayPush'),\n getPrototype = require('./_getPrototype'),\n getSymbols = require('./_getSymbols'),\n stubArray = require('./stubArray');\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeGetSymbols = Object.getOwnPropertySymbols;\n\n/**\n * Creates an array of the own and inherited enumerable symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of symbols.\n */\nvar getSymbolsIn = !nativeGetSymbols ? stubArray : function(object) {\n var result = [];\n while (object) {\n arrayPush(result, getSymbols(object));\n object = getPrototype(object);\n }\n return result;\n};\n\nmodule.exports = getSymbolsIn;\n","\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.genDts = void 0;\nvar flatten_1 = __importDefault(require(\"lodash/flatten\"));\nvar isArray_1 = __importDefault(require(\"lodash/isArray\"));\nvar map_1 = __importDefault(require(\"lodash/map\"));\nvar reduce_1 = __importDefault(require(\"lodash/reduce\"));\nvar uniq_1 = __importDefault(require(\"lodash/uniq\"));\nvar upperFirst_1 = __importDefault(require(\"lodash/upperFirst\"));\nfunction genDts(model, options) {\n var contentParts = [];\n contentParts = contentParts.concat(\"import type { CstNode, ICstVisitor, IToken } from \\\"chevrotain\\\";\");\n contentParts = contentParts.concat((0, flatten_1.default)((0, map_1.default)(model, function (node) { return genCstNodeTypes(node); })));\n if (options.includeVisitorInterface) {\n contentParts = contentParts.concat(genVisitor(options.visitorInterfaceName, model));\n }\n return contentParts.join(\"\\n\\n\") + \"\\n\";\n}\nexports.genDts = genDts;\nfunction genCstNodeTypes(node) {\n var nodeCstInterface = genNodeInterface(node);\n var nodeChildrenInterface = genNodeChildrenType(node);\n return [nodeCstInterface, nodeChildrenInterface];\n}\nfunction genNodeInterface(node) {\n var nodeInterfaceName = getNodeInterfaceName(node.name);\n var childrenTypeName = getNodeChildrenTypeName(node.name);\n return \"export interface \".concat(nodeInterfaceName, \" extends CstNode {\\n name: \\\"\").concat(node.name, \"\\\";\\n children: \").concat(childrenTypeName, \";\\n}\");\n}\nfunction genNodeChildrenType(node) {\n var typeName = getNodeChildrenTypeName(node.name);\n return \"export type \".concat(typeName, \" = {\\n \").concat((0, map_1.default)(node.properties, function (property) { return genChildProperty(property); }).join(\"\\n \"), \"\\n};\");\n}\nfunction genChildProperty(prop) {\n var typeName = buildTypeString(prop.type);\n return \"\".concat(prop.name).concat(prop.optional ? \"?\" : \"\", \": \").concat(typeName, \"[];\");\n}\nfunction genVisitor(name, nodes) {\n return \"export interface \".concat(name, \" extends ICstVisitor {\\n \").concat((0, map_1.default)(nodes, function (node) { return genVisitorFunction(node); }).join(\"\\n \"), \"\\n}\");\n}\nfunction genVisitorFunction(node) {\n var childrenTypeName = getNodeChildrenTypeName(node.name);\n return \"\".concat(node.name, \"(children: \").concat(childrenTypeName, \", param?: IN): OUT;\");\n}\nfunction buildTypeString(type) {\n if ((0, isArray_1.default)(type)) {\n var typeNames = (0, uniq_1.default)((0, map_1.default)(type, function (t) { return getTypeString(t); }));\n var typeString = (0, reduce_1.default)(typeNames, function (sum, t) { return sum + \" | \" + t; });\n return \"(\" + typeString + \")\";\n }\n else {\n return getTypeString(type);\n }\n}\nfunction getTypeString(type) {\n if (type.kind === \"token\") {\n return \"IToken\";\n }\n return getNodeInterfaceName(type.name);\n}\nfunction getNodeInterfaceName(ruleName) {\n return (0, upperFirst_1.default)(ruleName) + \"CstNode\";\n}\nfunction getNodeChildrenTypeName(ruleName) {\n return (0, upperFirst_1.default)(ruleName) + \"CstChildren\";\n}\n//# sourceMappingURL=generate.js.map","/**\n * Checks if `value` is classified as an `Array` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(document.body.children);\n * // => false\n *\n * _.isArray('abc');\n * // => false\n *\n * _.isArray(_.noop);\n * // => false\n */\nvar isArray = Array.isArray;\n\nmodule.exports = isArray;\n","var getNative = require('./_getNative'),\n root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar Set = getNative(root, 'Set');\n\nmodule.exports = Set;\n","var baseAssignValue = require('./_baseAssignValue'),\n eq = require('./eq');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Assigns `value` to `key` of `object` if the existing value is not equivalent\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\nfunction assignValue(object, key, value) {\n var objValue = object[key];\n if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) ||\n (value === undefined && !(key in object))) {\n baseAssignValue(object, key, value);\n }\n}\n\nmodule.exports = assignValue;\n","(function (window, factory) {\n if (typeof exports === 'object') {\n module.exports = factory();\n } else if (typeof define === 'function' && define.amd) {\n define(factory);\n } else {\n window.jStat = factory();\n }\n})(this, function () {\nvar jStat = (function(Math, undefined) {\n\n// For quick reference.\nvar concat = Array.prototype.concat;\nvar slice = Array.prototype.slice;\nvar toString = Object.prototype.toString;\n\n// Calculate correction for IEEE error\n// TODO: This calculation can be improved.\nfunction calcRdx(n, m) {\n var val = n > m ? n : m;\n return Math.pow(10,\n 17 - ~~(Math.log(((val > 0) ? val : -val)) * Math.LOG10E));\n}\n\n\nvar isArray = Array.isArray || function isArray(arg) {\n return toString.call(arg) === '[object Array]';\n};\n\n\nfunction isFunction(arg) {\n return toString.call(arg) === '[object Function]';\n}\n\n\nfunction isNumber(num) {\n return (typeof num === 'number') ? num - num === 0 : false;\n}\n\n\n// Converts the jStat matrix to vector.\nfunction toVector(arr) {\n return concat.apply([], arr);\n}\n\n\n// The one and only jStat constructor.\nfunction jStat() {\n return new jStat._init(arguments);\n}\n\n\n// TODO: Remove after all references in src files have been removed.\njStat.fn = jStat.prototype;\n\n\n// By separating the initializer from the constructor it's easier to handle\n// always returning a new instance whether \"new\" was used or not.\njStat._init = function _init(args) {\n // If first argument is an array, must be vector or matrix.\n if (isArray(args[0])) {\n // Check if matrix.\n if (isArray(args[0][0])) {\n // See if a mapping function was also passed.\n if (isFunction(args[1]))\n args[0] = jStat.map(args[0], args[1]);\n // Iterate over each is faster than this.push.apply(this, args[0].\n for (var i = 0; i < args[0].length; i++)\n this[i] = args[0][i];\n this.length = args[0].length;\n\n // Otherwise must be a vector.\n } else {\n this[0] = isFunction(args[1]) ? jStat.map(args[0], args[1]) : args[0];\n this.length = 1;\n }\n\n // If first argument is number, assume creation of sequence.\n } else if (isNumber(args[0])) {\n this[0] = jStat.seq.apply(null, args);\n this.length = 1;\n\n // Handle case when jStat object is passed to jStat.\n } else if (args[0] instanceof jStat) {\n // Duplicate the object and pass it back.\n return jStat(args[0].toArray());\n\n // Unexpected argument value, return empty jStat object.\n // TODO: This is strange behavior. Shouldn't this throw or some such to let\n // the user know they had bad arguments?\n } else {\n this[0] = [];\n this.length = 1;\n }\n\n return this;\n};\njStat._init.prototype = jStat.prototype;\njStat._init.constructor = jStat;\n\n\n// Utility functions.\n// TODO: for internal use only?\njStat.utils = {\n calcRdx: calcRdx,\n isArray: isArray,\n isFunction: isFunction,\n isNumber: isNumber,\n toVector: toVector\n};\n\n\njStat._random_fn = Math.random;\njStat.setRandom = function setRandom(fn) {\n if (typeof fn !== 'function')\n throw new TypeError('fn is not a function');\n jStat._random_fn = fn;\n};\n\n\n// Easily extend the jStat object.\n// TODO: is this seriously necessary?\njStat.extend = function extend(obj) {\n var i, j;\n\n if (arguments.length === 1) {\n for (j in obj)\n jStat[j] = obj[j];\n return this;\n }\n\n for (i = 1; i < arguments.length; i++) {\n for (j in arguments[i])\n obj[j] = arguments[i][j];\n }\n\n return obj;\n};\n\n\n// Returns the number of rows in the matrix.\njStat.rows = function rows(arr) {\n return arr.length || 1;\n};\n\n\n// Returns the number of columns in the matrix.\njStat.cols = function cols(arr) {\n return arr[0].length || 1;\n};\n\n\n// Returns the dimensions of the object { rows: i, cols: j }\njStat.dimensions = function dimensions(arr) {\n return {\n rows: jStat.rows(arr),\n cols: jStat.cols(arr)\n };\n};\n\n\n// Returns a specified row as a vector or return a sub matrix by pick some rows\njStat.row = function row(arr, index) {\n if (isArray(index)) {\n return index.map(function(i) {\n return jStat.row(arr, i);\n })\n }\n return arr[index];\n};\n\n\n// return row as array\n// rowa([[1,2],[3,4]],0) -> [1,2]\njStat.rowa = function rowa(arr, i) {\n return jStat.row(arr, i);\n};\n\n\n// Returns the specified column as a vector or return a sub matrix by pick some\n// columns\njStat.col = function col(arr, index) {\n if (isArray(index)) {\n var submat = jStat.arange(arr.length).map(function() {\n return new Array(index.length);\n });\n index.forEach(function(ind, i){\n jStat.arange(arr.length).forEach(function(j) {\n submat[j][i] = arr[j][ind];\n });\n });\n return submat;\n }\n var column = new Array(arr.length);\n for (var i = 0; i < arr.length; i++)\n column[i] = [arr[i][index]];\n return column;\n};\n\n\n// return column as array\n// cola([[1,2],[3,4]],0) -> [1,3]\njStat.cola = function cola(arr, i) {\n return jStat.col(arr, i).map(function(a){ return a[0] });\n};\n\n\n// Returns the diagonal of the matrix\njStat.diag = function diag(arr) {\n var nrow = jStat.rows(arr);\n var res = new Array(nrow);\n for (var row = 0; row < nrow; row++)\n res[row] = [arr[row][row]];\n return res;\n};\n\n\n// Returns the anti-diagonal of the matrix\njStat.antidiag = function antidiag(arr) {\n var nrow = jStat.rows(arr) - 1;\n var res = new Array(nrow);\n for (var i = 0; nrow >= 0; nrow--, i++)\n res[i] = [arr[i][nrow]];\n return res;\n};\n\n// Transpose a matrix or array.\njStat.transpose = function transpose(arr) {\n var obj = [];\n var objArr, rows, cols, j, i;\n\n // Make sure arr is in matrix format.\n if (!isArray(arr[0]))\n arr = [arr];\n\n rows = arr.length;\n cols = arr[0].length;\n\n for (i = 0; i < cols; i++) {\n objArr = new Array(rows);\n for (j = 0; j < rows; j++)\n objArr[j] = arr[j][i];\n obj.push(objArr);\n }\n\n // If obj is vector, return only single array.\n return obj.length === 1 ? obj[0] : obj;\n};\n\n\n// Map a function to an array or array of arrays.\n// \"toAlter\" is an internal variable.\njStat.map = function map(arr, func, toAlter) {\n var row, nrow, ncol, res, col;\n\n if (!isArray(arr[0]))\n arr = [arr];\n\n nrow = arr.length;\n ncol = arr[0].length;\n res = toAlter ? arr : new Array(nrow);\n\n for (row = 0; row < nrow; row++) {\n // if the row doesn't exist, create it\n if (!res[row])\n res[row] = new Array(ncol);\n for (col = 0; col < ncol; col++)\n res[row][col] = func(arr[row][col], row, col);\n }\n\n return res.length === 1 ? res[0] : res;\n};\n\n\n// Cumulatively combine the elements of an array or array of arrays using a function.\njStat.cumreduce = function cumreduce(arr, func, toAlter) {\n var row, nrow, ncol, res, col;\n\n if (!isArray(arr[0]))\n arr = [arr];\n\n nrow = arr.length;\n ncol = arr[0].length;\n res = toAlter ? arr : new Array(nrow);\n\n for (row = 0; row < nrow; row++) {\n // if the row doesn't exist, create it\n if (!res[row])\n res[row] = new Array(ncol);\n if (ncol > 0)\n res[row][0] = arr[row][0];\n for (col = 1; col < ncol; col++)\n res[row][col] = func(res[row][col-1], arr[row][col]);\n }\n return res.length === 1 ? res[0] : res;\n};\n\n\n// Destructively alter an array.\njStat.alter = function alter(arr, func) {\n return jStat.map(arr, func, true);\n};\n\n\n// Generate a rows x cols matrix according to the supplied function.\njStat.create = function create(rows, cols, func) {\n var res = new Array(rows);\n var i, j;\n\n if (isFunction(cols)) {\n func = cols;\n cols = rows;\n }\n\n for (i = 0; i < rows; i++) {\n res[i] = new Array(cols);\n for (j = 0; j < cols; j++)\n res[i][j] = func(i, j);\n }\n\n return res;\n};\n\n\nfunction retZero() { return 0; }\n\n\n// Generate a rows x cols matrix of zeros.\njStat.zeros = function zeros(rows, cols) {\n if (!isNumber(cols))\n cols = rows;\n return jStat.create(rows, cols, retZero);\n};\n\n\nfunction retOne() { return 1; }\n\n\n// Generate a rows x cols matrix of ones.\njStat.ones = function ones(rows, cols) {\n if (!isNumber(cols))\n cols = rows;\n return jStat.create(rows, cols, retOne);\n};\n\n\n// Generate a rows x cols matrix of uniformly random numbers.\njStat.rand = function rand(rows, cols) {\n if (!isNumber(cols))\n cols = rows;\n return jStat.create(rows, cols, jStat._random_fn);\n};\n\n\nfunction retIdent(i, j) { return i === j ? 1 : 0; }\n\n\n// Generate an identity matrix of size row x cols.\njStat.identity = function identity(rows, cols) {\n if (!isNumber(cols))\n cols = rows;\n return jStat.create(rows, cols, retIdent);\n};\n\n\n// Tests whether a matrix is symmetric\njStat.symmetric = function symmetric(arr) {\n var size = arr.length;\n var row, col;\n\n if (arr.length !== arr[0].length)\n return false;\n\n for (row = 0; row < size; row++) {\n for (col = 0; col < size; col++)\n if (arr[col][row] !== arr[row][col])\n return false;\n }\n\n return true;\n};\n\n\n// Set all values to zero.\njStat.clear = function clear(arr) {\n return jStat.alter(arr, retZero);\n};\n\n\n// Generate sequence.\njStat.seq = function seq(min, max, length, func) {\n if (!isFunction(func))\n func = false;\n\n var arr = [];\n var hival = calcRdx(min, max);\n var step = (max * hival - min * hival) / ((length - 1) * hival);\n var current = min;\n var cnt;\n\n // Current is assigned using a technique to compensate for IEEE error.\n // TODO: Needs better implementation.\n for (cnt = 0;\n current <= max && cnt < length;\n cnt++, current = (min * hival + step * hival * cnt) / hival) {\n arr.push((func ? func(current, cnt) : current));\n }\n\n return arr;\n};\n\n\n// arange(5) -> [0,1,2,3,4]\n// arange(1,5) -> [1,2,3,4]\n// arange(5,1,-1) -> [5,4,3,2]\njStat.arange = function arange(start, end, step) {\n var rl = [];\n var i;\n step = step || 1;\n if (end === undefined) {\n end = start;\n start = 0;\n }\n if (start === end || step === 0) {\n return [];\n }\n if (start < end && step < 0) {\n return [];\n }\n if (start > end && step > 0) {\n return [];\n }\n if (step > 0) {\n for (i = start; i < end; i += step) {\n rl.push(i);\n }\n } else {\n for (i = start; i > end; i += step) {\n rl.push(i);\n }\n }\n return rl;\n};\n\n\n// A=[[1,2,3],[4,5,6],[7,8,9]]\n// slice(A,{row:{end:2},col:{start:1}}) -> [[2,3],[5,6]]\n// slice(A,1,{start:1}) -> [5,6]\n// as numpy code A[:2,1:]\njStat.slice = (function(){\n function _slice(list, start, end, step) {\n // note it's not equal to range.map mode it's a bug\n var i;\n var rl = [];\n var length = list.length;\n if (start === undefined && end === undefined && step === undefined) {\n return jStat.copy(list);\n }\n\n start = start || 0;\n end = end || list.length;\n start = start >= 0 ? start : length + start;\n end = end >= 0 ? end : length + end;\n step = step || 1;\n if (start === end || step === 0) {\n return [];\n }\n if (start < end && step < 0) {\n return [];\n }\n if (start > end && step > 0) {\n return [];\n }\n if (step > 0) {\n for (i = start; i < end; i += step) {\n rl.push(list[i]);\n }\n } else {\n for (i = start; i > end;i += step) {\n rl.push(list[i]);\n }\n }\n return rl;\n }\n\n function slice(list, rcSlice) {\n var colSlice, rowSlice;\n rcSlice = rcSlice || {};\n if (isNumber(rcSlice.row)) {\n if (isNumber(rcSlice.col))\n return list[rcSlice.row][rcSlice.col];\n var row = jStat.rowa(list, rcSlice.row);\n colSlice = rcSlice.col || {};\n return _slice(row, colSlice.start, colSlice.end, colSlice.step);\n }\n\n if (isNumber(rcSlice.col)) {\n var col = jStat.cola(list, rcSlice.col);\n rowSlice = rcSlice.row || {};\n return _slice(col, rowSlice.start, rowSlice.end, rowSlice.step);\n }\n\n rowSlice = rcSlice.row || {};\n colSlice = rcSlice.col || {};\n var rows = _slice(list, rowSlice.start, rowSlice.end, rowSlice.step);\n return rows.map(function(row) {\n return _slice(row, colSlice.start, colSlice.end, colSlice.step);\n });\n }\n\n return slice;\n}());\n\n\n// A=[[1,2,3],[4,5,6],[7,8,9]]\n// sliceAssign(A,{row:{start:1},col:{start:1}},[[0,0],[0,0]])\n// A=[[1,2,3],[4,0,0],[7,0,0]]\njStat.sliceAssign = function sliceAssign(A, rcSlice, B) {\n var nl, ml;\n if (isNumber(rcSlice.row)) {\n if (isNumber(rcSlice.col))\n return A[rcSlice.row][rcSlice.col] = B;\n rcSlice.col = rcSlice.col || {};\n rcSlice.col.start = rcSlice.col.start || 0;\n rcSlice.col.end = rcSlice.col.end || A[0].length;\n rcSlice.col.step = rcSlice.col.step || 1;\n nl = jStat.arange(rcSlice.col.start,\n Math.min(A.length, rcSlice.col.end),\n rcSlice.col.step);\n var m = rcSlice.row;\n nl.forEach(function(n, i) {\n A[m][n] = B[i];\n });\n return A;\n }\n\n if (isNumber(rcSlice.col)) {\n rcSlice.row = rcSlice.row || {};\n rcSlice.row.start = rcSlice.row.start || 0;\n rcSlice.row.end = rcSlice.row.end || A.length;\n rcSlice.row.step = rcSlice.row.step || 1;\n ml = jStat.arange(rcSlice.row.start,\n Math.min(A[0].length, rcSlice.row.end),\n rcSlice.row.step);\n var n = rcSlice.col;\n ml.forEach(function(m, j) {\n A[m][n] = B[j];\n });\n return A;\n }\n\n if (B[0].length === undefined) {\n B = [B];\n }\n rcSlice.row.start = rcSlice.row.start || 0;\n rcSlice.row.end = rcSlice.row.end || A.length;\n rcSlice.row.step = rcSlice.row.step || 1;\n rcSlice.col.start = rcSlice.col.start || 0;\n rcSlice.col.end = rcSlice.col.end || A[0].length;\n rcSlice.col.step = rcSlice.col.step || 1;\n ml = jStat.arange(rcSlice.row.start,\n Math.min(A.length, rcSlice.row.end),\n rcSlice.row.step);\n nl = jStat.arange(rcSlice.col.start,\n Math.min(A[0].length, rcSlice.col.end),\n rcSlice.col.step);\n ml.forEach(function(m, i) {\n nl.forEach(function(n, j) {\n A[m][n] = B[i][j];\n });\n });\n return A;\n};\n\n\n// [1,2,3] ->\n// [[1,0,0],[0,2,0],[0,0,3]]\njStat.diagonal = function diagonal(diagArray) {\n var mat = jStat.zeros(diagArray.length, diagArray.length);\n diagArray.forEach(function(t, i) {\n mat[i][i] = t;\n });\n return mat;\n};\n\n\n// return copy of A\njStat.copy = function copy(A) {\n return A.map(function(row) {\n if (isNumber(row))\n return row;\n return row.map(function(t) {\n return t;\n });\n });\n};\n\n\n// TODO: Go over this entire implementation. Seems a tragic waste of resources\n// doing all this work. Instead, and while ugly, use new Function() to generate\n// a custom function for each static method.\n\n// Quick reference.\nvar jProto = jStat.prototype;\n\n// Default length.\njProto.length = 0;\n\n// For internal use only.\n// TODO: Check if they're actually used, and if they are then rename them\n// to _*\njProto.push = Array.prototype.push;\njProto.sort = Array.prototype.sort;\njProto.splice = Array.prototype.splice;\njProto.slice = Array.prototype.slice;\n\n\n// Return a clean array.\njProto.toArray = function toArray() {\n return this.length > 1 ? slice.call(this) : slice.call(this)[0];\n};\n\n\n// Map a function to a matrix or vector.\njProto.map = function map(func, toAlter) {\n return jStat(jStat.map(this, func, toAlter));\n};\n\n\n// Cumulatively combine the elements of a matrix or vector using a function.\njProto.cumreduce = function cumreduce(func, toAlter) {\n return jStat(jStat.cumreduce(this, func, toAlter));\n};\n\n\n// Destructively alter an array.\njProto.alter = function alter(func) {\n jStat.alter(this, func);\n return this;\n};\n\n\n// Extend prototype with methods that have no argument.\n(function(funcs) {\n for (var i = 0; i < funcs.length; i++) (function(passfunc) {\n jProto[passfunc] = function(func) {\n var self = this,\n results;\n // Check for callback.\n if (func) {\n setTimeout(function() {\n func.call(self, jProto[passfunc].call(self));\n });\n return this;\n }\n results = jStat[passfunc](this);\n return isArray(results) ? jStat(results) : results;\n };\n })(funcs[i]);\n})('transpose clear symmetric rows cols dimensions diag antidiag'.split(' '));\n\n\n// Extend prototype with methods that have one argument.\n(function(funcs) {\n for (var i = 0; i < funcs.length; i++) (function(passfunc) {\n jProto[passfunc] = function(index, func) {\n var self = this;\n // check for callback\n if (func) {\n setTimeout(function() {\n func.call(self, jProto[passfunc].call(self, index));\n });\n return this;\n }\n return jStat(jStat[passfunc](this, index));\n };\n })(funcs[i]);\n})('row col'.split(' '));\n\n\n// Extend prototype with simple shortcut methods.\n(function(funcs) {\n for (var i = 0; i < funcs.length; i++) (function(passfunc) {\n jProto[passfunc] = function() {\n return jStat(jStat[passfunc].apply(null, arguments));\n };\n })(funcs[i]);\n})('create zeros ones rand identity'.split(' '));\n\n\n// Exposing jStat.\nreturn jStat;\n\n}(Math));\n(function(jStat, Math) {\n\nvar isFunction = jStat.utils.isFunction;\n\n// Ascending functions for sort\nfunction ascNum(a, b) { return a - b; }\n\nfunction clip(arg, min, max) {\n return Math.max(min, Math.min(arg, max));\n}\n\n\n// sum of an array\njStat.sum = function sum(arr) {\n var sum = 0;\n var i = arr.length;\n while (--i >= 0)\n sum += arr[i];\n return sum;\n};\n\n\n// sum squared\njStat.sumsqrd = function sumsqrd(arr) {\n var sum = 0;\n var i = arr.length;\n while (--i >= 0)\n sum += arr[i] * arr[i];\n return sum;\n};\n\n\n// sum of squared errors of prediction (SSE)\njStat.sumsqerr = function sumsqerr(arr) {\n var mean = jStat.mean(arr);\n var sum = 0;\n var i = arr.length;\n var tmp;\n while (--i >= 0) {\n tmp = arr[i] - mean;\n sum += tmp * tmp;\n }\n return sum;\n};\n\n// sum of an array in each row\njStat.sumrow = function sumrow(arr) {\n var sum = 0;\n var i = arr.length;\n while (--i >= 0)\n sum += arr[i];\n return sum;\n};\n\n// product of an array\njStat.product = function product(arr) {\n var prod = 1;\n var i = arr.length;\n while (--i >= 0)\n prod *= arr[i];\n return prod;\n};\n\n\n// minimum value of an array\njStat.min = function min(arr) {\n var low = arr[0];\n var i = 0;\n while (++i < arr.length)\n if (arr[i] < low)\n low = arr[i];\n return low;\n};\n\n\n// maximum value of an array\njStat.max = function max(arr) {\n var high = arr[0];\n var i = 0;\n while (++i < arr.length)\n if (arr[i] > high)\n high = arr[i];\n return high;\n};\n\n\n// unique values of an array\njStat.unique = function unique(arr) {\n var hash = {}, _arr = [];\n for(var i = 0; i < arr.length; i++) {\n if (!hash[arr[i]]) {\n hash[arr[i]] = true;\n _arr.push(arr[i]);\n }\n }\n return _arr;\n};\n\n\n// mean value of an array\njStat.mean = function mean(arr) {\n return jStat.sum(arr) / arr.length;\n};\n\n\n// mean squared error (MSE)\njStat.meansqerr = function meansqerr(arr) {\n return jStat.sumsqerr(arr) / arr.length;\n};\n\n\n// geometric mean of an array\njStat.geomean = function geomean(arr) {\n var logs = arr.map(Math.log)\n var meanOfLogs = jStat.mean(logs)\n return Math.exp(meanOfLogs)\n};\n\n\n// median of an array\njStat.median = function median(arr) {\n var arrlen = arr.length;\n var _arr = arr.slice().sort(ascNum);\n // check if array is even or odd, then return the appropriate\n return !(arrlen & 1)\n ? (_arr[(arrlen / 2) - 1 ] + _arr[(arrlen / 2)]) / 2\n : _arr[(arrlen / 2) | 0 ];\n};\n\n\n// cumulative sum of an array\njStat.cumsum = function cumsum(arr) {\n return jStat.cumreduce(arr, function (a, b) { return a + b; });\n};\n\n\n// cumulative product of an array\njStat.cumprod = function cumprod(arr) {\n return jStat.cumreduce(arr, function (a, b) { return a * b; });\n};\n\n\n// successive differences of a sequence\njStat.diff = function diff(arr) {\n var diffs = [];\n var arrLen = arr.length;\n var i;\n for (i = 1; i < arrLen; i++)\n diffs.push(arr[i] - arr[i - 1]);\n return diffs;\n};\n\n\n// ranks of an array\njStat.rank = function (arr) {\n var i;\n var distinctNumbers = [];\n var numberCounts = {};\n for (i = 0; i < arr.length; i++) {\n var number = arr[i];\n if (numberCounts[number]) {\n numberCounts[number]++;\n } else {\n numberCounts[number] = 1;\n distinctNumbers.push(number);\n }\n }\n\n var sortedDistinctNumbers = distinctNumbers.sort(ascNum);\n var numberRanks = {};\n var currentRank = 1;\n for (i = 0; i < sortedDistinctNumbers.length; i++) {\n var number = sortedDistinctNumbers[i];\n var count = numberCounts[number];\n var first = currentRank;\n var last = currentRank + count - 1;\n var rank = (first + last) / 2;\n numberRanks[number] = rank;\n currentRank += count;\n }\n\n return arr.map(function (number) {\n return numberRanks[number];\n });\n};\n\n\n// mode of an array\n// if there are multiple modes of an array, return all of them\n// is this the appropriate way of handling it?\njStat.mode = function mode(arr) {\n var arrLen = arr.length;\n var _arr = arr.slice().sort(ascNum);\n var count = 1;\n var maxCount = 0;\n var numMaxCount = 0;\n var mode_arr = [];\n var i;\n\n for (i = 0; i < arrLen; i++) {\n if (_arr[i] === _arr[i + 1]) {\n count++;\n } else {\n if (count > maxCount) {\n mode_arr = [_arr[i]];\n maxCount = count;\n numMaxCount = 0;\n }\n // are there multiple max counts\n else if (count === maxCount) {\n mode_arr.push(_arr[i]);\n numMaxCount++;\n }\n // resetting count for new value in array\n count = 1;\n }\n }\n\n return numMaxCount === 0 ? mode_arr[0] : mode_arr;\n};\n\n\n// range of an array\njStat.range = function range(arr) {\n return jStat.max(arr) - jStat.min(arr);\n};\n\n// variance of an array\n// flag = true indicates sample instead of population\njStat.variance = function variance(arr, flag) {\n return jStat.sumsqerr(arr) / (arr.length - (flag ? 1 : 0));\n};\n\n// pooled variance of an array of arrays\njStat.pooledvariance = function pooledvariance(arr) {\n var sumsqerr = arr.reduce(function (a, samples) {return a + jStat.sumsqerr(samples);}, 0);\n var count = arr.reduce(function (a, samples) {return a + samples.length;}, 0);\n return sumsqerr / (count - arr.length);\n};\n\n// deviation of an array\njStat.deviation = function (arr) {\n var mean = jStat.mean(arr);\n var arrlen = arr.length;\n var dev = new Array(arrlen);\n for (var i = 0; i < arrlen; i++) {\n dev[i] = arr[i] - mean;\n }\n return dev;\n};\n\n// standard deviation of an array\n// flag = true indicates sample instead of population\njStat.stdev = function stdev(arr, flag) {\n return Math.sqrt(jStat.variance(arr, flag));\n};\n\n// pooled standard deviation of an array of arrays\njStat.pooledstdev = function pooledstdev(arr) {\n return Math.sqrt(jStat.pooledvariance(arr));\n};\n\n// mean deviation (mean absolute deviation) of an array\njStat.meandev = function meandev(arr) {\n var mean = jStat.mean(arr);\n var a = [];\n for (var i = arr.length - 1; i >= 0; i--) {\n a.push(Math.abs(arr[i] - mean));\n }\n return jStat.mean(a);\n};\n\n\n// median deviation (median absolute deviation) of an array\njStat.meddev = function meddev(arr) {\n var median = jStat.median(arr);\n var a = [];\n for (var i = arr.length - 1; i >= 0; i--) {\n a.push(Math.abs(arr[i] - median));\n }\n return jStat.median(a);\n};\n\n\n// coefficient of variation\njStat.coeffvar = function coeffvar(arr) {\n return jStat.stdev(arr) / jStat.mean(arr);\n};\n\n\n// quartiles of an array\njStat.quartiles = function quartiles(arr) {\n var arrlen = arr.length;\n var _arr = arr.slice().sort(ascNum);\n return [\n _arr[ Math.round((arrlen) / 4) - 1 ],\n _arr[ Math.round((arrlen) / 2) - 1 ],\n _arr[ Math.round((arrlen) * 3 / 4) - 1 ]\n ];\n};\n\n\n// Arbitary quantiles of an array. Direct port of the scipy.stats\n// implementation by Pierre GF Gerard-Marchant.\njStat.quantiles = function quantiles(arr, quantilesArray, alphap, betap) {\n var sortedArray = arr.slice().sort(ascNum);\n var quantileVals = [quantilesArray.length];\n var n = arr.length;\n var i, p, m, aleph, k, gamma;\n\n if (typeof alphap === 'undefined')\n alphap = 3 / 8;\n if (typeof betap === 'undefined')\n betap = 3 / 8;\n\n for (i = 0; i < quantilesArray.length; i++) {\n p = quantilesArray[i];\n m = alphap + p * (1 - alphap - betap);\n aleph = n * p + m;\n k = Math.floor(clip(aleph, 1, n - 1));\n gamma = clip(aleph - k, 0, 1);\n quantileVals[i] = (1 - gamma) * sortedArray[k - 1] + gamma * sortedArray[k];\n }\n\n return quantileVals;\n};\n\n// Return the k-th percentile of values in a range, where k is in the range 0..1, inclusive.\n// Passing true for the exclusive parameter excludes both endpoints of the range.\njStat.percentile = function percentile(arr, k, exclusive) {\n var _arr = arr.slice().sort(ascNum);\n var realIndex = k * (_arr.length + (exclusive ? 1 : -1)) + (exclusive ? 0 : 1);\n var index = parseInt(realIndex);\n var frac = realIndex - index;\n if (index + 1 < _arr.length) {\n return _arr[index - 1] + frac * (_arr[index] - _arr[index - 1]);\n } else {\n return _arr[index - 1];\n }\n}\n\n// The percentile rank of score in a given array. Returns the percentage\n// of all values in the input array that are less than (kind='strict') or\n// less or equal than (kind='weak') score. Default is weak.\njStat.percentileOfScore = function percentileOfScore(arr, score, kind) {\n var counter = 0;\n var len = arr.length;\n var strict = false;\n var value, i;\n\n if (kind === 'strict')\n strict = true;\n\n for (i = 0; i < len; i++) {\n value = arr[i];\n if ((strict && value < score) ||\n (!strict && value <= score)) {\n counter++;\n }\n }\n\n return counter / len;\n};\n\n\n// Histogram (bin count) data\njStat.histogram = function histogram(arr, binCnt) {\n binCnt = binCnt || 4;\n var first = jStat.min(arr);\n var binWidth = (jStat.max(arr) - first) / binCnt;\n var len = arr.length;\n var bins = [];\n var i;\n\n for (i = 0; i < binCnt; i++)\n bins[i] = 0;\n for (i = 0; i < len; i++)\n bins[Math.min(Math.floor(((arr[i] - first) / binWidth)), binCnt - 1)] += 1;\n\n return bins;\n};\n\n\n// covariance of two arrays\njStat.covariance = function covariance(arr1, arr2) {\n var u = jStat.mean(arr1);\n var v = jStat.mean(arr2);\n var arr1Len = arr1.length;\n var sq_dev = new Array(arr1Len);\n var i;\n\n for (i = 0; i < arr1Len; i++)\n sq_dev[i] = (arr1[i] - u) * (arr2[i] - v);\n\n return jStat.sum(sq_dev) / (arr1Len - 1);\n};\n\n\n// (pearson's) population correlation coefficient, rho\njStat.corrcoeff = function corrcoeff(arr1, arr2) {\n return jStat.covariance(arr1, arr2) /\n jStat.stdev(arr1, 1) /\n jStat.stdev(arr2, 1);\n};\n\n // (spearman's) rank correlation coefficient, sp\njStat.spearmancoeff = function (arr1, arr2) {\n arr1 = jStat.rank(arr1);\n arr2 = jStat.rank(arr2);\n //return pearson's correlation of the ranks:\n return jStat.corrcoeff(arr1, arr2);\n}\n\n\n// statistical standardized moments (general form of skew/kurt)\njStat.stanMoment = function stanMoment(arr, n) {\n var mu = jStat.mean(arr);\n var sigma = jStat.stdev(arr);\n var len = arr.length;\n var skewSum = 0;\n\n for (var i = 0; i < len; i++)\n skewSum += Math.pow((arr[i] - mu) / sigma, n);\n\n return skewSum / arr.length;\n};\n\n// (pearson's) moment coefficient of skewness\njStat.skewness = function skewness(arr) {\n return jStat.stanMoment(arr, 3);\n};\n\n// (pearson's) (excess) kurtosis\njStat.kurtosis = function kurtosis(arr) {\n return jStat.stanMoment(arr, 4) - 3;\n};\n\n\nvar jProto = jStat.prototype;\n\n\n// Extend jProto with method for calculating cumulative sums and products.\n// This differs from the similar extension below as cumsum and cumprod should\n// not be run again in the case fullbool === true.\n// If a matrix is passed, automatically assume operation should be done on the\n// columns.\n(function(funcs) {\n for (var i = 0; i < funcs.length; i++) (function(passfunc) {\n // If a matrix is passed, automatically assume operation should be done on\n // the columns.\n jProto[passfunc] = function(fullbool, func) {\n var arr = [];\n var i = 0;\n var tmpthis = this;\n // Assignment reassignation depending on how parameters were passed in.\n if (isFunction(fullbool)) {\n func = fullbool;\n fullbool = false;\n }\n // Check if a callback was passed with the function.\n if (func) {\n setTimeout(function() {\n func.call(tmpthis, jProto[passfunc].call(tmpthis, fullbool));\n });\n return this;\n }\n // Check if matrix and run calculations.\n if (this.length > 1) {\n tmpthis = fullbool === true ? this : this.transpose();\n for (; i < tmpthis.length; i++)\n arr[i] = jStat[passfunc](tmpthis[i]);\n return arr;\n }\n // Pass fullbool if only vector, not a matrix. for variance and stdev.\n return jStat[passfunc](this[0], fullbool);\n };\n })(funcs[i]);\n})(('cumsum cumprod').split(' '));\n\n\n// Extend jProto with methods which don't require arguments and work on columns.\n(function(funcs) {\n for (var i = 0; i < funcs.length; i++) (function(passfunc) {\n // If a matrix is passed, automatically assume operation should be done on\n // the columns.\n jProto[passfunc] = function(fullbool, func) {\n var arr = [];\n var i = 0;\n var tmpthis = this;\n // Assignment reassignation depending on how parameters were passed in.\n if (isFunction(fullbool)) {\n func = fullbool;\n fullbool = false;\n }\n // Check if a callback was passed with the function.\n if (func) {\n setTimeout(function() {\n func.call(tmpthis, jProto[passfunc].call(tmpthis, fullbool));\n });\n return this;\n }\n // Check if matrix and run calculations.\n if (this.length > 1) {\n if (passfunc !== 'sumrow')\n tmpthis = fullbool === true ? this : this.transpose();\n for (; i < tmpthis.length; i++)\n arr[i] = jStat[passfunc](tmpthis[i]);\n return fullbool === true\n ? jStat[passfunc](jStat.utils.toVector(arr))\n : arr;\n }\n // Pass fullbool if only vector, not a matrix. for variance and stdev.\n return jStat[passfunc](this[0], fullbool);\n };\n })(funcs[i]);\n})(('sum sumsqrd sumsqerr sumrow product min max unique mean meansqerr ' +\n 'geomean median diff rank mode range variance deviation stdev meandev ' +\n 'meddev coeffvar quartiles histogram skewness kurtosis').split(' '));\n\n\n// Extend jProto with functions that take arguments. Operations on matrices are\n// done on columns.\n(function(funcs) {\n for (var i = 0; i < funcs.length; i++) (function(passfunc) {\n jProto[passfunc] = function() {\n var arr = [];\n var i = 0;\n var tmpthis = this;\n var args = Array.prototype.slice.call(arguments);\n var callbackFunction;\n\n // If the last argument is a function, we assume it's a callback; we\n // strip the callback out and call the function again.\n if (isFunction(args[args.length - 1])) {\n callbackFunction = args[args.length - 1];\n var argsToPass = args.slice(0, args.length - 1);\n\n setTimeout(function() {\n callbackFunction.call(tmpthis,\n jProto[passfunc].apply(tmpthis, argsToPass));\n });\n return this;\n\n // Otherwise we curry the function args and call normally.\n } else {\n callbackFunction = undefined;\n var curriedFunction = function curriedFunction(vector) {\n return jStat[passfunc].apply(tmpthis, [vector].concat(args));\n }\n }\n\n // If this is a matrix, run column-by-column.\n if (this.length > 1) {\n tmpthis = tmpthis.transpose();\n for (; i < tmpthis.length; i++)\n arr[i] = curriedFunction(tmpthis[i]);\n return arr;\n }\n\n // Otherwise run on the vector.\n return curriedFunction(this[0]);\n };\n })(funcs[i]);\n})('quantiles percentileOfScore'.split(' '));\n\n}(jStat, Math));\n// Special functions //\n(function(jStat, Math) {\n\n// Log-gamma function\njStat.gammaln = function gammaln(x) {\n var j = 0;\n var cof = [\n 76.18009172947146, -86.50532032941677, 24.01409824083091,\n -1.231739572450155, 0.1208650973866179e-2, -0.5395239384953e-5\n ];\n var ser = 1.000000000190015;\n var xx, y, tmp;\n tmp = (y = xx = x) + 5.5;\n tmp -= (xx + 0.5) * Math.log(tmp);\n for (; j < 6; j++)\n ser += cof[j] / ++y;\n return Math.log(2.5066282746310005 * ser / xx) - tmp;\n};\n\n/*\n * log-gamma function to support poisson distribution sampling. The\n * algorithm comes from SPECFUN by Shanjie Zhang and Jianming Jin and their\n * book \"Computation of Special Functions\", 1996, John Wiley & Sons, Inc.\n */\njStat.loggam = function loggam(x) {\n var x0, x2, xp, gl, gl0;\n var k, n;\n\n var a = [8.333333333333333e-02, -2.777777777777778e-03,\n 7.936507936507937e-04, -5.952380952380952e-04,\n 8.417508417508418e-04, -1.917526917526918e-03,\n 6.410256410256410e-03, -2.955065359477124e-02,\n 1.796443723688307e-01, -1.39243221690590e+00];\n x0 = x;\n n = 0;\n if ((x == 1.0) || (x == 2.0)) {\n return 0.0;\n }\n if (x <= 7.0) {\n n = Math.floor(7 - x);\n x0 = x + n;\n }\n x2 = 1.0 / (x0 * x0);\n xp = 2 * Math.PI;\n gl0 = a[9];\n for (k = 8; k >= 0; k--) {\n gl0 *= x2;\n gl0 += a[k];\n }\n gl = gl0 / x0 + 0.5 * Math.log(xp) + (x0 - 0.5) * Math.log(x0) - x0;\n if (x <= 7.0) {\n for (k = 1; k <= n; k++) {\n gl -= Math.log(x0 - 1.0);\n x0 -= 1.0;\n }\n }\n return gl;\n}\n\n// gamma of x\njStat.gammafn = function gammafn(x) {\n var p = [-1.716185138865495, 24.76565080557592, -379.80425647094563,\n 629.3311553128184, 866.9662027904133, -31451.272968848367,\n -36144.413418691176, 66456.14382024054\n ];\n var q = [-30.8402300119739, 315.35062697960416, -1015.1563674902192,\n -3107.771671572311, 22538.118420980151, 4755.8462775278811,\n -134659.9598649693, -115132.2596755535];\n var fact = false;\n var n = 0;\n var xden = 0;\n var xnum = 0;\n var y = x;\n var i, z, yi, res;\n if (x > 171.6243769536076) {\n return Infinity;\n }\n if (y <= 0) {\n res = y % 1 + 3.6e-16;\n if (res) {\n fact = (!(y & 1) ? 1 : -1) * Math.PI / Math.sin(Math.PI * res);\n y = 1 - y;\n } else {\n return Infinity;\n }\n }\n yi = y;\n if (y < 1) {\n z = y++;\n } else {\n z = (y -= n = (y | 0) - 1) - 1;\n }\n for (i = 0; i < 8; ++i) {\n xnum = (xnum + p[i]) * z;\n xden = xden * z + q[i];\n }\n res = xnum / xden + 1;\n if (yi < y) {\n res /= yi;\n } else if (yi > y) {\n for (i = 0; i < n; ++i) {\n res *= y;\n y++;\n }\n }\n if (fact) {\n res = fact / res;\n }\n return res;\n};\n\n\n// lower incomplete gamma function, which is usually typeset with a\n// lower-case greek gamma as the function symbol\njStat.gammap = function gammap(a, x) {\n return jStat.lowRegGamma(a, x) * jStat.gammafn(a);\n};\n\n\n// The lower regularized incomplete gamma function, usually written P(a,x)\njStat.lowRegGamma = function lowRegGamma(a, x) {\n var aln = jStat.gammaln(a);\n var ap = a;\n var sum = 1 / a;\n var del = sum;\n var b = x + 1 - a;\n var c = 1 / 1.0e-30;\n var d = 1 / b;\n var h = d;\n var i = 1;\n // calculate maximum number of itterations required for a\n var ITMAX = -~(Math.log((a >= 1) ? a : 1 / a) * 8.5 + a * 0.4 + 17);\n var an;\n\n if (x < 0 || a <= 0) {\n return NaN;\n } else if (x < a + 1) {\n for (; i <= ITMAX; i++) {\n sum += del *= x / ++ap;\n }\n return (sum * Math.exp(-x + a * Math.log(x) - (aln)));\n }\n\n for (; i <= ITMAX; i++) {\n an = -i * (i - a);\n b += 2;\n d = an * d + b;\n c = b + an / c;\n d = 1 / d;\n h *= d * c;\n }\n\n return (1 - h * Math.exp(-x + a * Math.log(x) - (aln)));\n};\n\n// natural log factorial of n\njStat.factorialln = function factorialln(n) {\n return n < 0 ? NaN : jStat.gammaln(n + 1);\n};\n\n// factorial of n\njStat.factorial = function factorial(n) {\n return n < 0 ? NaN : jStat.gammafn(n + 1);\n};\n\n// combinations of n, m\njStat.combination = function combination(n, m) {\n // make sure n or m don't exceed the upper limit of usable values\n return (n > 170 || m > 170)\n ? Math.exp(jStat.combinationln(n, m))\n : (jStat.factorial(n) / jStat.factorial(m)) / jStat.factorial(n - m);\n};\n\n\njStat.combinationln = function combinationln(n, m){\n return jStat.factorialln(n) - jStat.factorialln(m) - jStat.factorialln(n - m);\n};\n\n\n// permutations of n, m\njStat.permutation = function permutation(n, m) {\n return jStat.factorial(n) / jStat.factorial(n - m);\n};\n\n\n// beta function\njStat.betafn = function betafn(x, y) {\n // ensure arguments are positive\n if (x <= 0 || y <= 0)\n return undefined;\n // make sure x + y doesn't exceed the upper limit of usable values\n return (x + y > 170)\n ? Math.exp(jStat.betaln(x, y))\n : jStat.gammafn(x) * jStat.gammafn(y) / jStat.gammafn(x + y);\n};\n\n\n// natural logarithm of beta function\njStat.betaln = function betaln(x, y) {\n return jStat.gammaln(x) + jStat.gammaln(y) - jStat.gammaln(x + y);\n};\n\n\n// Evaluates the continued fraction for incomplete beta function by modified\n// Lentz's method.\njStat.betacf = function betacf(x, a, b) {\n var fpmin = 1e-30;\n var m = 1;\n var qab = a + b;\n var qap = a + 1;\n var qam = a - 1;\n var c = 1;\n var d = 1 - qab * x / qap;\n var m2, aa, del, h;\n\n // These q's will be used in factors that occur in the coefficients\n if (Math.abs(d) < fpmin)\n d = fpmin;\n d = 1 / d;\n h = d;\n\n for (; m <= 100; m++) {\n m2 = 2 * m;\n aa = m * (b - m) * x / ((qam + m2) * (a + m2));\n // One step (the even one) of the recurrence\n d = 1 + aa * d;\n if (Math.abs(d) < fpmin)\n d = fpmin;\n c = 1 + aa / c;\n if (Math.abs(c) < fpmin)\n c = fpmin;\n d = 1 / d;\n h *= d * c;\n aa = -(a + m) * (qab + m) * x / ((a + m2) * (qap + m2));\n // Next step of the recurrence (the odd one)\n d = 1 + aa * d;\n if (Math.abs(d) < fpmin)\n d = fpmin;\n c = 1 + aa / c;\n if (Math.abs(c) < fpmin)\n c = fpmin;\n d = 1 / d;\n del = d * c;\n h *= del;\n if (Math.abs(del - 1.0) < 3e-7)\n break;\n }\n\n return h;\n};\n\n\n// Returns the inverse of the lower regularized inomplete gamma function\njStat.gammapinv = function gammapinv(p, a) {\n var j = 0;\n var a1 = a - 1;\n var EPS = 1e-8;\n var gln = jStat.gammaln(a);\n var x, err, t, u, pp, lna1, afac;\n\n if (p >= 1)\n return Math.max(100, a + 100 * Math.sqrt(a));\n if (p <= 0)\n return 0;\n if (a > 1) {\n lna1 = Math.log(a1);\n afac = Math.exp(a1 * (lna1 - 1) - gln);\n pp = (p < 0.5) ? p : 1 - p;\n t = Math.sqrt(-2 * Math.log(pp));\n x = (2.30753 + t * 0.27061) / (1 + t * (0.99229 + t * 0.04481)) - t;\n if (p < 0.5)\n x = -x;\n x = Math.max(1e-3,\n a * Math.pow(1 - 1 / (9 * a) - x / (3 * Math.sqrt(a)), 3));\n } else {\n t = 1 - a * (0.253 + a * 0.12);\n if (p < t)\n x = Math.pow(p / t, 1 / a);\n else\n x = 1 - Math.log(1 - (p - t) / (1 - t));\n }\n\n for(; j < 12; j++) {\n if (x <= 0)\n return 0;\n err = jStat.lowRegGamma(a, x) - p;\n if (a > 1)\n t = afac * Math.exp(-(x - a1) + a1 * (Math.log(x) - lna1));\n else\n t = Math.exp(-x + a1 * Math.log(x) - gln);\n u = err / t;\n x -= (t = u / (1 - 0.5 * Math.min(1, u * ((a - 1) / x - 1))));\n if (x <= 0)\n x = 0.5 * (x + t);\n if (Math.abs(t) < EPS * x)\n break;\n }\n\n return x;\n};\n\n\n// Returns the error function erf(x)\njStat.erf = function erf(x) {\n var cof = [-1.3026537197817094, 6.4196979235649026e-1, 1.9476473204185836e-2,\n -9.561514786808631e-3, -9.46595344482036e-4, 3.66839497852761e-4,\n 4.2523324806907e-5, -2.0278578112534e-5, -1.624290004647e-6,\n 1.303655835580e-6, 1.5626441722e-8, -8.5238095915e-8,\n 6.529054439e-9, 5.059343495e-9, -9.91364156e-10,\n -2.27365122e-10, 9.6467911e-11, 2.394038e-12,\n -6.886027e-12, 8.94487e-13, 3.13092e-13,\n -1.12708e-13, 3.81e-16, 7.106e-15,\n -1.523e-15, -9.4e-17, 1.21e-16,\n -2.8e-17];\n var j = cof.length - 1;\n var isneg = false;\n var d = 0;\n var dd = 0;\n var t, ty, tmp, res;\n\n if (x < 0) {\n x = -x;\n isneg = true;\n }\n\n t = 2 / (2 + x);\n ty = 4 * t - 2;\n\n for(; j > 0; j--) {\n tmp = d;\n d = ty * d - dd + cof[j];\n dd = tmp;\n }\n\n res = t * Math.exp(-x * x + 0.5 * (cof[0] + ty * d) - dd);\n return isneg ? res - 1 : 1 - res;\n};\n\n\n// Returns the complmentary error function erfc(x)\njStat.erfc = function erfc(x) {\n return 1 - jStat.erf(x);\n};\n\n\n// Returns the inverse of the complementary error function\njStat.erfcinv = function erfcinv(p) {\n var j = 0;\n var x, err, t, pp;\n if (p >= 2)\n return -100;\n if (p <= 0)\n return 100;\n pp = (p < 1) ? p : 2 - p;\n t = Math.sqrt(-2 * Math.log(pp / 2));\n x = -0.70711 * ((2.30753 + t * 0.27061) /\n (1 + t * (0.99229 + t * 0.04481)) - t);\n for (; j < 2; j++) {\n err = jStat.erfc(x) - pp;\n x += err / (1.12837916709551257 * Math.exp(-x * x) - x * err);\n }\n return (p < 1) ? x : -x;\n};\n\n\n// Returns the inverse of the incomplete beta function\njStat.ibetainv = function ibetainv(p, a, b) {\n var EPS = 1e-8;\n var a1 = a - 1;\n var b1 = b - 1;\n var j = 0;\n var lna, lnb, pp, t, u, err, x, al, h, w, afac;\n if (p <= 0)\n return 0;\n if (p >= 1)\n return 1;\n if (a >= 1 && b >= 1) {\n pp = (p < 0.5) ? p : 1 - p;\n t = Math.sqrt(-2 * Math.log(pp));\n x = (2.30753 + t * 0.27061) / (1 + t* (0.99229 + t * 0.04481)) - t;\n if (p < 0.5)\n x = -x;\n al = (x * x - 3) / 6;\n h = 2 / (1 / (2 * a - 1) + 1 / (2 * b - 1));\n w = (x * Math.sqrt(al + h) / h) - (1 / (2 * b - 1) - 1 / (2 * a - 1)) *\n (al + 5 / 6 - 2 / (3 * h));\n x = a / (a + b * Math.exp(2 * w));\n } else {\n lna = Math.log(a / (a + b));\n lnb = Math.log(b / (a + b));\n t = Math.exp(a * lna) / a;\n u = Math.exp(b * lnb) / b;\n w = t + u;\n if (p < t / w)\n x = Math.pow(a * w * p, 1 / a);\n else\n x = 1 - Math.pow(b * w * (1 - p), 1 / b);\n }\n afac = -jStat.gammaln(a) - jStat.gammaln(b) + jStat.gammaln(a + b);\n for(; j < 10; j++) {\n if (x === 0 || x === 1)\n return x;\n err = jStat.ibeta(x, a, b) - p;\n t = Math.exp(a1 * Math.log(x) + b1 * Math.log(1 - x) + afac);\n u = err / t;\n x -= (t = u / (1 - 0.5 * Math.min(1, u * (a1 / x - b1 / (1 - x)))));\n if (x <= 0)\n x = 0.5 * (x + t);\n if (x >= 1)\n x = 0.5 * (x + t + 1);\n if (Math.abs(t) < EPS * x && j > 0)\n break;\n }\n return x;\n};\n\n\n// Returns the incomplete beta function I_x(a,b)\njStat.ibeta = function ibeta(x, a, b) {\n // Factors in front of the continued fraction.\n var bt = (x === 0 || x === 1) ? 0 :\n Math.exp(jStat.gammaln(a + b) - jStat.gammaln(a) -\n jStat.gammaln(b) + a * Math.log(x) + b *\n Math.log(1 - x));\n if (x < 0 || x > 1)\n return false;\n if (x < (a + 1) / (a + b + 2))\n // Use continued fraction directly.\n return bt * jStat.betacf(x, a, b) / a;\n // else use continued fraction after making the symmetry transformation.\n return 1 - bt * jStat.betacf(1 - x, b, a) / b;\n};\n\n\n// Returns a normal deviate (mu=0, sigma=1).\n// If n and m are specified it returns a object of normal deviates.\njStat.randn = function randn(n, m) {\n var u, v, x, y, q;\n if (!m)\n m = n;\n if (n)\n return jStat.create(n, m, function() { return jStat.randn(); });\n do {\n u = jStat._random_fn();\n v = 1.7156 * (jStat._random_fn() - 0.5);\n x = u - 0.449871;\n y = Math.abs(v) + 0.386595;\n q = x * x + y * (0.19600 * y - 0.25472 * x);\n } while (q > 0.27597 && (q > 0.27846 || v * v > -4 * Math.log(u) * u * u));\n return v / u;\n};\n\n\n// Returns a gamma deviate by the method of Marsaglia and Tsang.\njStat.randg = function randg(shape, n, m) {\n var oalph = shape;\n var a1, a2, u, v, x, mat;\n if (!m)\n m = n;\n if (!shape)\n shape = 1;\n if (n) {\n mat = jStat.zeros(n,m);\n mat.alter(function() { return jStat.randg(shape); });\n return mat;\n }\n if (shape < 1)\n shape += 1;\n a1 = shape - 1 / 3;\n a2 = 1 / Math.sqrt(9 * a1);\n do {\n do {\n x = jStat.randn();\n v = 1 + a2 * x;\n } while(v <= 0);\n v = v * v * v;\n u = jStat._random_fn();\n } while(u > 1 - 0.331 * Math.pow(x, 4) &&\n Math.log(u) > 0.5 * x*x + a1 * (1 - v + Math.log(v)));\n // alpha > 1\n if (shape == oalph)\n return a1 * v;\n // alpha < 1\n do {\n u = jStat._random_fn();\n } while(u === 0);\n return Math.pow(u, 1 / oalph) * a1 * v;\n};\n\n\n// making use of static methods on the instance\n(function(funcs) {\n for (var i = 0; i < funcs.length; i++) (function(passfunc) {\n jStat.fn[passfunc] = function() {\n return jStat(\n jStat.map(this, function(value) { return jStat[passfunc](value); }));\n }\n })(funcs[i]);\n})('gammaln gammafn factorial factorialln'.split(' '));\n\n\n(function(funcs) {\n for (var i = 0; i < funcs.length; i++) (function(passfunc) {\n jStat.fn[passfunc] = function() {\n return jStat(jStat[passfunc].apply(null, arguments));\n };\n })(funcs[i]);\n})('randn'.split(' '));\n\n}(jStat, Math));\n(function(jStat, Math) {\n\n// generate all distribution instance methods\n(function(list) {\n for (var i = 0; i < list.length; i++) (function(func) {\n // distribution instance method\n jStat[func] = function f(a, b, c) {\n if (!(this instanceof f))\n return new f(a, b, c);\n this._a = a;\n this._b = b;\n this._c = c;\n return this;\n };\n // distribution method to be used on a jStat instance\n jStat.fn[func] = function(a, b, c) {\n var newthis = jStat[func](a, b, c);\n newthis.data = this;\n return newthis;\n };\n // sample instance method\n jStat[func].prototype.sample = function(arr) {\n var a = this._a;\n var b = this._b;\n var c = this._c;\n if (arr)\n return jStat.alter(arr, function() {\n return jStat[func].sample(a, b, c);\n });\n else\n return jStat[func].sample(a, b, c);\n };\n // generate the pdf, cdf and inv instance methods\n (function(vals) {\n for (var i = 0; i < vals.length; i++) (function(fnfunc) {\n jStat[func].prototype[fnfunc] = function(x) {\n var a = this._a;\n var b = this._b;\n var c = this._c;\n if (!x && x !== 0)\n x = this.data;\n if (typeof x !== 'number') {\n return jStat.fn.map.call(x, function(x) {\n return jStat[func][fnfunc](x, a, b, c);\n });\n }\n return jStat[func][fnfunc](x, a, b, c);\n };\n })(vals[i]);\n })('pdf cdf inv'.split(' '));\n // generate the mean, median, mode and variance instance methods\n (function(vals) {\n for (var i = 0; i < vals.length; i++) (function(fnfunc) {\n jStat[func].prototype[fnfunc] = function() {\n return jStat[func][fnfunc](this._a, this._b, this._c);\n };\n })(vals[i]);\n })('mean median mode variance'.split(' '));\n })(list[i]);\n})((\n 'beta centralF cauchy chisquare exponential gamma invgamma kumaraswamy ' +\n 'laplace lognormal noncentralt normal pareto studentt weibull uniform ' +\n 'binomial negbin hypgeom poisson triangular tukey arcsine'\n).split(' '));\n\n\n\n// extend beta function with static methods\njStat.extend(jStat.beta, {\n pdf: function pdf(x, alpha, beta) {\n // PDF is zero outside the support\n if (x > 1 || x < 0)\n return 0;\n // PDF is one for the uniform case\n if (alpha == 1 && beta == 1)\n return 1;\n\n if (alpha < 512 && beta < 512) {\n return (Math.pow(x, alpha - 1) * Math.pow(1 - x, beta - 1)) /\n jStat.betafn(alpha, beta);\n } else {\n return Math.exp((alpha - 1) * Math.log(x) +\n (beta - 1) * Math.log(1 - x) -\n jStat.betaln(alpha, beta));\n }\n },\n\n cdf: function cdf(x, alpha, beta) {\n return (x > 1 || x < 0) ? (x > 1) * 1 : jStat.ibeta(x, alpha, beta);\n },\n\n inv: function inv(x, alpha, beta) {\n return jStat.ibetainv(x, alpha, beta);\n },\n\n mean: function mean(alpha, beta) {\n return alpha / (alpha + beta);\n },\n\n median: function median(alpha, beta) {\n return jStat.ibetainv(0.5, alpha, beta);\n },\n\n mode: function mode(alpha, beta) {\n return (alpha - 1 ) / ( alpha + beta - 2);\n },\n\n // return a random sample\n sample: function sample(alpha, beta) {\n var u = jStat.randg(alpha);\n return u / (u + jStat.randg(beta));\n },\n\n variance: function variance(alpha, beta) {\n return (alpha * beta) / (Math.pow(alpha + beta, 2) * (alpha + beta + 1));\n }\n});\n\n// extend F function with static methods\njStat.extend(jStat.centralF, {\n // This implementation of the pdf function avoids float overflow\n // See the way that R calculates this value:\n // https://svn.r-project.org/R/trunk/src/nmath/df.c\n pdf: function pdf(x, df1, df2) {\n var p, q, f;\n\n if (x < 0)\n return 0;\n\n if (df1 <= 2) {\n if (x === 0 && df1 < 2) {\n return Infinity;\n }\n if (x === 0 && df1 === 2) {\n return 1;\n }\n return (1 / jStat.betafn(df1 / 2, df2 / 2)) *\n Math.pow(df1 / df2, df1 / 2) *\n Math.pow(x, (df1/2) - 1) *\n Math.pow((1 + (df1 / df2) * x), -(df1 + df2) / 2);\n }\n\n p = (df1 * x) / (df2 + x * df1);\n q = df2 / (df2 + x * df1);\n f = df1 * q / 2.0;\n return f * jStat.binomial.pdf((df1 - 2) / 2, (df1 + df2 - 2) / 2, p);\n },\n\n cdf: function cdf(x, df1, df2) {\n if (x < 0)\n return 0;\n return jStat.ibeta((df1 * x) / (df1 * x + df2), df1 / 2, df2 / 2);\n },\n\n inv: function inv(x, df1, df2) {\n return df2 / (df1 * (1 / jStat.ibetainv(x, df1 / 2, df2 / 2) - 1));\n },\n\n mean: function mean(df1, df2) {\n return (df2 > 2) ? df2 / (df2 - 2) : undefined;\n },\n\n mode: function mode(df1, df2) {\n return (df1 > 2) ? (df2 * (df1 - 2)) / (df1 * (df2 + 2)) : undefined;\n },\n\n // return a random sample\n sample: function sample(df1, df2) {\n var x1 = jStat.randg(df1 / 2) * 2;\n var x2 = jStat.randg(df2 / 2) * 2;\n return (x1 / df1) / (x2 / df2);\n },\n\n variance: function variance(df1, df2) {\n if (df2 <= 4)\n return undefined;\n return 2 * df2 * df2 * (df1 + df2 - 2) /\n (df1 * (df2 - 2) * (df2 - 2) * (df2 - 4));\n }\n});\n\n\n// extend cauchy function with static methods\njStat.extend(jStat.cauchy, {\n pdf: function pdf(x, local, scale) {\n if (scale < 0) { return 0; }\n\n return (scale / (Math.pow(x - local, 2) + Math.pow(scale, 2))) / Math.PI;\n },\n\n cdf: function cdf(x, local, scale) {\n return Math.atan((x - local) / scale) / Math.PI + 0.5;\n },\n\n inv: function(p, local, scale) {\n return local + scale * Math.tan(Math.PI * (p - 0.5));\n },\n\n median: function median(local/*, scale*/) {\n return local;\n },\n\n mode: function mode(local/*, scale*/) {\n return local;\n },\n\n sample: function sample(local, scale) {\n return jStat.randn() *\n Math.sqrt(1 / (2 * jStat.randg(0.5))) * scale + local;\n }\n});\n\n\n\n// extend chisquare function with static methods\njStat.extend(jStat.chisquare, {\n pdf: function pdf(x, dof) {\n if (x < 0)\n return 0;\n return (x === 0 && dof === 2) ? 0.5 :\n Math.exp((dof / 2 - 1) * Math.log(x) - x / 2 - (dof / 2) *\n Math.log(2) - jStat.gammaln(dof / 2));\n },\n\n cdf: function cdf(x, dof) {\n if (x < 0)\n return 0;\n return jStat.lowRegGamma(dof / 2, x / 2);\n },\n\n inv: function(p, dof) {\n return 2 * jStat.gammapinv(p, 0.5 * dof);\n },\n\n mean : function(dof) {\n return dof;\n },\n\n // TODO: this is an approximation (is there a better way?)\n median: function median(dof) {\n return dof * Math.pow(1 - (2 / (9 * dof)), 3);\n },\n\n mode: function mode(dof) {\n return (dof - 2 > 0) ? dof - 2 : 0;\n },\n\n sample: function sample(dof) {\n return jStat.randg(dof / 2) * 2;\n },\n\n variance: function variance(dof) {\n return 2 * dof;\n }\n});\n\n\n\n// extend exponential function with static methods\njStat.extend(jStat.exponential, {\n pdf: function pdf(x, rate) {\n return x < 0 ? 0 : rate * Math.exp(-rate * x);\n },\n\n cdf: function cdf(x, rate) {\n return x < 0 ? 0 : 1 - Math.exp(-rate * x);\n },\n\n inv: function(p, rate) {\n return -Math.log(1 - p) / rate;\n },\n\n mean : function(rate) {\n return 1 / rate;\n },\n\n median: function (rate) {\n return (1 / rate) * Math.log(2);\n },\n\n mode: function mode(/*rate*/) {\n return 0;\n },\n\n sample: function sample(rate) {\n return -1 / rate * Math.log(jStat._random_fn());\n },\n\n variance : function(rate) {\n return Math.pow(rate, -2);\n }\n});\n\n\n\n// extend gamma function with static methods\njStat.extend(jStat.gamma, {\n pdf: function pdf(x, shape, scale) {\n if (x < 0)\n return 0;\n return (x === 0 && shape === 1) ? 1 / scale :\n Math.exp((shape - 1) * Math.log(x) - x / scale -\n jStat.gammaln(shape) - shape * Math.log(scale));\n },\n\n cdf: function cdf(x, shape, scale) {\n if (x < 0)\n return 0;\n return jStat.lowRegGamma(shape, x / scale);\n },\n\n inv: function(p, shape, scale) {\n return jStat.gammapinv(p, shape) * scale;\n },\n\n mean : function(shape, scale) {\n return shape * scale;\n },\n\n mode: function mode(shape, scale) {\n if(shape > 1) return (shape - 1) * scale;\n return undefined;\n },\n\n sample: function sample(shape, scale) {\n return jStat.randg(shape) * scale;\n },\n\n variance: function variance(shape, scale) {\n return shape * scale * scale;\n }\n});\n\n// extend inverse gamma function with static methods\njStat.extend(jStat.invgamma, {\n pdf: function pdf(x, shape, scale) {\n if (x <= 0)\n return 0;\n return Math.exp(-(shape + 1) * Math.log(x) - scale / x -\n jStat.gammaln(shape) + shape * Math.log(scale));\n },\n\n cdf: function cdf(x, shape, scale) {\n if (x <= 0)\n return 0;\n return 1 - jStat.lowRegGamma(shape, scale / x);\n },\n\n inv: function(p, shape, scale) {\n return scale / jStat.gammapinv(1 - p, shape);\n },\n\n mean : function(shape, scale) {\n return (shape > 1) ? scale / (shape - 1) : undefined;\n },\n\n mode: function mode(shape, scale) {\n return scale / (shape + 1);\n },\n\n sample: function sample(shape, scale) {\n return scale / jStat.randg(shape);\n },\n\n variance: function variance(shape, scale) {\n if (shape <= 2)\n return undefined;\n return scale * scale / ((shape - 1) * (shape - 1) * (shape - 2));\n }\n});\n\n\n// extend kumaraswamy function with static methods\njStat.extend(jStat.kumaraswamy, {\n pdf: function pdf(x, alpha, beta) {\n if (x === 0 && alpha === 1)\n return beta;\n else if (x === 1 && beta === 1)\n return alpha;\n return Math.exp(Math.log(alpha) + Math.log(beta) + (alpha - 1) *\n Math.log(x) + (beta - 1) *\n Math.log(1 - Math.pow(x, alpha)));\n },\n\n cdf: function cdf(x, alpha, beta) {\n if (x < 0)\n return 0;\n else if (x > 1)\n return 1;\n return (1 - Math.pow(1 - Math.pow(x, alpha), beta));\n },\n\n inv: function inv(p, alpha, beta) {\n return Math.pow(1 - Math.pow(1 - p, 1 / beta), 1 / alpha);\n },\n\n mean : function(alpha, beta) {\n return (beta * jStat.gammafn(1 + 1 / alpha) *\n jStat.gammafn(beta)) / (jStat.gammafn(1 + 1 / alpha + beta));\n },\n\n median: function median(alpha, beta) {\n return Math.pow(1 - Math.pow(2, -1 / beta), 1 / alpha);\n },\n\n mode: function mode(alpha, beta) {\n if (!(alpha >= 1 && beta >= 1 && (alpha !== 1 && beta !== 1)))\n return undefined;\n return Math.pow((alpha - 1) / (alpha * beta - 1), 1 / alpha);\n },\n\n variance: function variance(/*alpha, beta*/) {\n throw new Error('variance not yet implemented');\n // TODO: complete this\n }\n});\n\n\n\n// extend lognormal function with static methods\njStat.extend(jStat.lognormal, {\n pdf: function pdf(x, mu, sigma) {\n if (x <= 0)\n return 0;\n return Math.exp(-Math.log(x) - 0.5 * Math.log(2 * Math.PI) -\n Math.log(sigma) - Math.pow(Math.log(x) - mu, 2) /\n (2 * sigma * sigma));\n },\n\n cdf: function cdf(x, mu, sigma) {\n if (x < 0)\n return 0;\n return 0.5 +\n (0.5 * jStat.erf((Math.log(x) - mu) / Math.sqrt(2 * sigma * sigma)));\n },\n\n inv: function(p, mu, sigma) {\n return Math.exp(-1.41421356237309505 * sigma * jStat.erfcinv(2 * p) + mu);\n },\n\n mean: function mean(mu, sigma) {\n return Math.exp(mu + sigma * sigma / 2);\n },\n\n median: function median(mu/*, sigma*/) {\n return Math.exp(mu);\n },\n\n mode: function mode(mu, sigma) {\n return Math.exp(mu - sigma * sigma);\n },\n\n sample: function sample(mu, sigma) {\n return Math.exp(jStat.randn() * sigma + mu);\n },\n\n variance: function variance(mu, sigma) {\n return (Math.exp(sigma * sigma) - 1) * Math.exp(2 * mu + sigma * sigma);\n }\n});\n\n\n\n// extend noncentralt function with static methods\njStat.extend(jStat.noncentralt, {\n pdf: function pdf(x, dof, ncp) {\n var tol = 1e-14;\n if (Math.abs(ncp) < tol) // ncp approx 0; use student-t\n return jStat.studentt.pdf(x, dof)\n\n if (Math.abs(x) < tol) { // different formula for x == 0\n return Math.exp(jStat.gammaln((dof + 1) / 2) - ncp * ncp / 2 -\n 0.5 * Math.log(Math.PI * dof) - jStat.gammaln(dof / 2));\n }\n\n // formula for x != 0\n return dof / x *\n (jStat.noncentralt.cdf(x * Math.sqrt(1 + 2 / dof), dof+2, ncp) -\n jStat.noncentralt.cdf(x, dof, ncp));\n },\n\n cdf: function cdf(x, dof, ncp) {\n var tol = 1e-14;\n var min_iterations = 200;\n\n if (Math.abs(ncp) < tol) // ncp approx 0; use student-t\n return jStat.studentt.cdf(x, dof);\n\n // turn negative x into positive and flip result afterwards\n var flip = false;\n if (x < 0) {\n flip = true;\n ncp = -ncp;\n }\n\n var prob = jStat.normal.cdf(-ncp, 0, 1);\n var value = tol + 1;\n // use value at last two steps to determine convergence\n var lastvalue = value;\n var y = x * x / (x * x + dof);\n var j = 0;\n var p = Math.exp(-ncp * ncp / 2);\n var q = Math.exp(-ncp * ncp / 2 - 0.5 * Math.log(2) -\n jStat.gammaln(3 / 2)) * ncp;\n while (j < min_iterations || lastvalue > tol || value > tol) {\n lastvalue = value;\n if (j > 0) {\n p *= (ncp * ncp) / (2 * j);\n q *= (ncp * ncp) / (2 * (j + 1 / 2));\n }\n value = p * jStat.beta.cdf(y, j + 0.5, dof / 2) +\n q * jStat.beta.cdf(y, j+1, dof/2);\n prob += 0.5 * value;\n j++;\n }\n\n return flip ? (1 - prob) : prob;\n }\n});\n\n\n// extend normal function with static methods\njStat.extend(jStat.normal, {\n pdf: function pdf(x, mean, std) {\n return Math.exp(-0.5 * Math.log(2 * Math.PI) -\n Math.log(std) - Math.pow(x - mean, 2) / (2 * std * std));\n },\n\n cdf: function cdf(x, mean, std) {\n return 0.5 * (1 + jStat.erf((x - mean) / Math.sqrt(2 * std * std)));\n },\n\n inv: function(p, mean, std) {\n return -1.41421356237309505 * std * jStat.erfcinv(2 * p) + mean;\n },\n\n mean : function(mean/*, std*/) {\n return mean;\n },\n\n median: function median(mean/*, std*/) {\n return mean;\n },\n\n mode: function (mean/*, std*/) {\n return mean;\n },\n\n sample: function sample(mean, std) {\n return jStat.randn() * std + mean;\n },\n\n variance : function(mean, std) {\n return std * std;\n }\n});\n\n\n\n// extend pareto function with static methods\njStat.extend(jStat.pareto, {\n pdf: function pdf(x, scale, shape) {\n if (x < scale)\n return 0;\n return (shape * Math.pow(scale, shape)) / Math.pow(x, shape + 1);\n },\n\n cdf: function cdf(x, scale, shape) {\n if (x < scale)\n return 0;\n return 1 - Math.pow(scale / x, shape);\n },\n\n inv: function inv(p, scale, shape) {\n return scale / Math.pow(1 - p, 1 / shape);\n },\n\n mean: function mean(scale, shape) {\n if (shape <= 1)\n return undefined;\n return (shape * Math.pow(scale, shape)) / (shape - 1);\n },\n\n median: function median(scale, shape) {\n return scale * (shape * Math.SQRT2);\n },\n\n mode: function mode(scale/*, shape*/) {\n return scale;\n },\n\n variance : function(scale, shape) {\n if (shape <= 2)\n return undefined;\n return (scale*scale * shape) / (Math.pow(shape - 1, 2) * (shape - 2));\n }\n});\n\n\n\n// extend studentt function with static methods\njStat.extend(jStat.studentt, {\n pdf: function pdf(x, dof) {\n dof = dof > 1e100 ? 1e100 : dof;\n return (1/(Math.sqrt(dof) * jStat.betafn(0.5, dof/2))) *\n Math.pow(1 + ((x * x) / dof), -((dof + 1) / 2));\n },\n\n cdf: function cdf(x, dof) {\n var dof2 = dof / 2;\n return jStat.ibeta((x + Math.sqrt(x * x + dof)) /\n (2 * Math.sqrt(x * x + dof)), dof2, dof2);\n },\n\n inv: function(p, dof) {\n var x = jStat.ibetainv(2 * Math.min(p, 1 - p), 0.5 * dof, 0.5);\n x = Math.sqrt(dof * (1 - x) / x);\n return (p > 0.5) ? x : -x;\n },\n\n mean: function mean(dof) {\n return (dof > 1) ? 0 : undefined;\n },\n\n median: function median(/*dof*/) {\n return 0;\n },\n\n mode: function mode(/*dof*/) {\n return 0;\n },\n\n sample: function sample(dof) {\n return jStat.randn() * Math.sqrt(dof / (2 * jStat.randg(dof / 2)));\n },\n\n variance: function variance(dof) {\n return (dof > 2) ? dof / (dof - 2) : (dof > 1) ? Infinity : undefined;\n }\n});\n\n\n\n// extend weibull function with static methods\njStat.extend(jStat.weibull, {\n pdf: function pdf(x, scale, shape) {\n if (x < 0 || scale < 0 || shape < 0)\n return 0;\n return (shape / scale) * Math.pow((x / scale), (shape - 1)) *\n Math.exp(-(Math.pow((x / scale), shape)));\n },\n\n cdf: function cdf(x, scale, shape) {\n return x < 0 ? 0 : 1 - Math.exp(-Math.pow((x / scale), shape));\n },\n\n inv: function(p, scale, shape) {\n return scale * Math.pow(-Math.log(1 - p), 1 / shape);\n },\n\n mean : function(scale, shape) {\n return scale * jStat.gammafn(1 + 1 / shape);\n },\n\n median: function median(scale, shape) {\n return scale * Math.pow(Math.log(2), 1 / shape);\n },\n\n mode: function mode(scale, shape) {\n if (shape <= 1)\n return 0;\n return scale * Math.pow((shape - 1) / shape, 1 / shape);\n },\n\n sample: function sample(scale, shape) {\n return scale * Math.pow(-Math.log(jStat._random_fn()), 1 / shape);\n },\n\n variance: function variance(scale, shape) {\n return scale * scale * jStat.gammafn(1 + 2 / shape) -\n Math.pow(jStat.weibull.mean(scale, shape), 2);\n }\n});\n\n\n\n// extend uniform function with static methods\njStat.extend(jStat.uniform, {\n pdf: function pdf(x, a, b) {\n return (x < a || x > b) ? 0 : 1 / (b - a);\n },\n\n cdf: function cdf(x, a, b) {\n if (x < a)\n return 0;\n else if (x < b)\n return (x - a) / (b - a);\n return 1;\n },\n\n inv: function(p, a, b) {\n return a + (p * (b - a));\n },\n\n mean: function mean(a, b) {\n return 0.5 * (a + b);\n },\n\n median: function median(a, b) {\n return jStat.mean(a, b);\n },\n\n mode: function mode(/*a, b*/) {\n throw new Error('mode is not yet implemented');\n },\n\n sample: function sample(a, b) {\n return (a / 2 + b / 2) + (b / 2 - a / 2) * (2 * jStat._random_fn() - 1);\n },\n\n variance: function variance(a, b) {\n return Math.pow(b - a, 2) / 12;\n }\n});\n\n\n// Got this from http://www.math.ucla.edu/~tom/distributions/binomial.html\nfunction betinc(x, a, b, eps) {\n var a0 = 0;\n var b0 = 1;\n var a1 = 1;\n var b1 = 1;\n var m9 = 0;\n var a2 = 0;\n var c9;\n\n while (Math.abs((a1 - a2) / a1) > eps) {\n a2 = a1;\n c9 = -(a + m9) * (a + b + m9) * x / (a + 2 * m9) / (a + 2 * m9 + 1);\n a0 = a1 + c9 * a0;\n b0 = b1 + c9 * b0;\n m9 = m9 + 1;\n c9 = m9 * (b - m9) * x / (a + 2 * m9 - 1) / (a + 2 * m9);\n a1 = a0 + c9 * a1;\n b1 = b0 + c9 * b1;\n a0 = a0 / b1;\n b0 = b0 / b1;\n a1 = a1 / b1;\n b1 = 1;\n }\n\n return a1 / a;\n}\n\n\n// extend uniform function with static methods\njStat.extend(jStat.binomial, {\n pdf: function pdf(k, n, p) {\n return (p === 0 || p === 1) ?\n ((n * p) === k ? 1 : 0) :\n jStat.combination(n, k) * Math.pow(p, k) * Math.pow(1 - p, n - k);\n },\n\n cdf: function cdf(x, n, p) {\n var betacdf;\n var eps = 1e-10;\n\n if (x < 0)\n return 0;\n if (x >= n)\n return 1;\n if (p < 0 || p > 1 || n <= 0)\n return NaN;\n\n x = Math.floor(x);\n var z = p;\n var a = x + 1;\n var b = n - x;\n var s = a + b;\n var bt = Math.exp(jStat.gammaln(s) - jStat.gammaln(b) -\n jStat.gammaln(a) + a * Math.log(z) + b * Math.log(1 - z));\n\n if (z < (a + 1) / (s + 2))\n betacdf = bt * betinc(z, a, b, eps);\n else\n betacdf = 1 - bt * betinc(1 - z, b, a, eps);\n\n return Math.round((1 - betacdf) * (1 / eps)) / (1 / eps);\n }\n});\n\n\n\n// extend uniform function with static methods\njStat.extend(jStat.negbin, {\n pdf: function pdf(k, r, p) {\n if (k !== k >>> 0)\n return false;\n if (k < 0)\n return 0;\n return jStat.combination(k + r - 1, r - 1) *\n Math.pow(1 - p, k) * Math.pow(p, r);\n },\n\n cdf: function cdf(x, r, p) {\n var sum = 0,\n k = 0;\n if (x < 0) return 0;\n for (; k <= x; k++) {\n sum += jStat.negbin.pdf(k, r, p);\n }\n return sum;\n }\n});\n\n\n\n// extend uniform function with static methods\njStat.extend(jStat.hypgeom, {\n pdf: function pdf(k, N, m, n) {\n // Hypergeometric PDF.\n\n // A simplification of the CDF algorithm below.\n\n // k = number of successes drawn\n // N = population size\n // m = number of successes in population\n // n = number of items drawn from population\n\n if(k !== k | 0) {\n return false;\n } else if(k < 0 || k < m - (N - n)) {\n // It's impossible to have this few successes drawn.\n return 0;\n } else if(k > n || k > m) {\n // It's impossible to have this many successes drawn.\n return 0;\n } else if (m * 2 > N) {\n // More than half the population is successes.\n\n if(n * 2 > N) {\n // More than half the population is sampled.\n\n return jStat.hypgeom.pdf(N - m - n + k, N, N - m, N - n)\n } else {\n // Half or less of the population is sampled.\n\n return jStat.hypgeom.pdf(n - k, N, N - m, n);\n }\n\n } else if(n * 2 > N) {\n // Half or less is successes.\n\n return jStat.hypgeom.pdf(m - k, N, m, N - n);\n\n } else if(m < n) {\n // We want to have the number of things sampled to be less than the\n // successes available. So swap the definitions of successful and sampled.\n return jStat.hypgeom.pdf(k, N, n, m);\n } else {\n // If we get here, half or less of the population was sampled, half or\n // less of it was successes, and we had fewer sampled things than\n // successes. Now we can do this complicated iterative algorithm in an\n // efficient way.\n\n // The basic premise of the algorithm is that we partially normalize our\n // intermediate product to keep it in a numerically good region, and then\n // finish the normalization at the end.\n\n // This variable holds the scaled probability of the current number of\n // successes.\n var scaledPDF = 1;\n\n // This keeps track of how much we have normalized.\n var samplesDone = 0;\n\n for(var i = 0; i < k; i++) {\n // For every possible number of successes up to that observed...\n\n while(scaledPDF > 1 && samplesDone < n) {\n // Intermediate result is growing too big. Apply some of the\n // normalization to shrink everything.\n\n scaledPDF *= 1 - (m / (N - samplesDone));\n\n // Say we've normalized by this sample already.\n samplesDone++;\n }\n\n // Work out the partially-normalized hypergeometric PDF for the next\n // number of successes\n scaledPDF *= (n - i) * (m - i) / ((i + 1) * (N - m - n + i + 1));\n }\n\n for(; samplesDone < n; samplesDone++) {\n // Apply all the rest of the normalization\n scaledPDF *= 1 - (m / (N - samplesDone));\n }\n\n // Bound answer sanely before returning.\n return Math.min(1, Math.max(0, scaledPDF));\n }\n },\n\n cdf: function cdf(x, N, m, n) {\n // Hypergeometric CDF.\n\n // This algorithm is due to Prof. Thomas S. Ferguson, ,\n // and comes from his hypergeometric test calculator at\n // .\n\n // x = number of successes drawn\n // N = population size\n // m = number of successes in population\n // n = number of items drawn from population\n\n if(x < 0 || x < m - (N - n)) {\n // It's impossible to have this few successes drawn or fewer.\n return 0;\n } else if(x >= n || x >= m) {\n // We will always have this many successes or fewer.\n return 1;\n } else if (m * 2 > N) {\n // More than half the population is successes.\n\n if(n * 2 > N) {\n // More than half the population is sampled.\n\n return jStat.hypgeom.cdf(N - m - n + x, N, N - m, N - n)\n } else {\n // Half or less of the population is sampled.\n\n return 1 - jStat.hypgeom.cdf(n - x - 1, N, N - m, n);\n }\n\n } else if(n * 2 > N) {\n // Half or less is successes.\n\n return 1 - jStat.hypgeom.cdf(m - x - 1, N, m, N - n);\n\n } else if(m < n) {\n // We want to have the number of things sampled to be less than the\n // successes available. So swap the definitions of successful and sampled.\n return jStat.hypgeom.cdf(x, N, n, m);\n } else {\n // If we get here, half or less of the population was sampled, half or\n // less of it was successes, and we had fewer sampled things than\n // successes. Now we can do this complicated iterative algorithm in an\n // efficient way.\n\n // The basic premise of the algorithm is that we partially normalize our\n // intermediate sum to keep it in a numerically good region, and then\n // finish the normalization at the end.\n\n // Holds the intermediate, scaled total CDF.\n var scaledCDF = 1;\n\n // This variable holds the scaled probability of the current number of\n // successes.\n var scaledPDF = 1;\n\n // This keeps track of how much we have normalized.\n var samplesDone = 0;\n\n for(var i = 0; i < x; i++) {\n // For every possible number of successes up to that observed...\n\n while(scaledCDF > 1 && samplesDone < n) {\n // Intermediate result is growing too big. Apply some of the\n // normalization to shrink everything.\n\n var factor = 1 - (m / (N - samplesDone));\n\n scaledPDF *= factor;\n scaledCDF *= factor;\n\n // Say we've normalized by this sample already.\n samplesDone++;\n }\n\n // Work out the partially-normalized hypergeometric PDF for the next\n // number of successes\n scaledPDF *= (n - i) * (m - i) / ((i + 1) * (N - m - n + i + 1));\n\n // Add to the CDF answer.\n scaledCDF += scaledPDF;\n }\n\n for(; samplesDone < n; samplesDone++) {\n // Apply all the rest of the normalization\n scaledCDF *= 1 - (m / (N - samplesDone));\n }\n\n // Bound answer sanely before returning.\n return Math.min(1, Math.max(0, scaledCDF));\n }\n }\n});\n\n\n\n// extend uniform function with static methods\njStat.extend(jStat.poisson, {\n pdf: function pdf(k, l) {\n if (l < 0 || (k % 1) !== 0 || k < 0) {\n return 0;\n }\n\n return Math.pow(l, k) * Math.exp(-l) / jStat.factorial(k);\n },\n\n cdf: function cdf(x, l) {\n var sumarr = [],\n k = 0;\n if (x < 0) return 0;\n for (; k <= x; k++) {\n sumarr.push(jStat.poisson.pdf(k, l));\n }\n return jStat.sum(sumarr);\n },\n\n mean : function(l) {\n return l;\n },\n\n variance : function(l) {\n return l;\n },\n\n sampleSmall: function sampleSmall(l) {\n var p = 1, k = 0, L = Math.exp(-l);\n do {\n k++;\n p *= jStat._random_fn();\n } while (p > L);\n return k - 1;\n },\n\n sampleLarge: function sampleLarge(l) {\n var lam = l;\n var k;\n var U, V, slam, loglam, a, b, invalpha, vr, us;\n\n slam = Math.sqrt(lam);\n loglam = Math.log(lam);\n b = 0.931 + 2.53 * slam;\n a = -0.059 + 0.02483 * b;\n invalpha = 1.1239 + 1.1328 / (b - 3.4);\n vr = 0.9277 - 3.6224 / (b - 2);\n\n while (1) {\n U = Math.random() - 0.5;\n V = Math.random();\n us = 0.5 - Math.abs(U);\n k = Math.floor((2 * a / us + b) * U + lam + 0.43);\n if ((us >= 0.07) && (V <= vr)) {\n return k;\n }\n if ((k < 0) || ((us < 0.013) && (V > us))) {\n continue;\n }\n /* log(V) == log(0.0) ok here */\n /* if U==0.0 so that us==0.0, log is ok since always returns */\n if ((Math.log(V) + Math.log(invalpha) - Math.log(a / (us * us) + b)) <= (-lam + k * loglam - jStat.loggam(k + 1))) {\n return k;\n }\n }\n },\n\n sample: function sample(l) {\n if (l < 10)\n return this.sampleSmall(l);\n else\n return this.sampleLarge(l);\n }\n});\n\n// extend triangular function with static methods\njStat.extend(jStat.triangular, {\n pdf: function pdf(x, a, b, c) {\n if (b <= a || c < a || c > b) {\n return NaN;\n } else {\n if (x < a || x > b) {\n return 0;\n } else if (x < c) {\n return (2 * (x - a)) / ((b - a) * (c - a));\n } else if (x === c) {\n return (2 / (b - a));\n } else { // x > c\n return (2 * (b - x)) / ((b - a) * (b - c));\n }\n }\n },\n\n cdf: function cdf(x, a, b, c) {\n if (b <= a || c < a || c > b)\n return NaN;\n if (x <= a)\n return 0;\n else if (x >= b)\n return 1;\n if (x <= c)\n return Math.pow(x - a, 2) / ((b - a) * (c - a));\n else // x > c\n return 1 - Math.pow(b - x, 2) / ((b - a) * (b - c));\n },\n\n inv: function inv(p, a, b, c) {\n if (b <= a || c < a || c > b) {\n return NaN;\n } else {\n if (p <= ((c - a) / (b - a))) {\n return a + (b - a) * Math.sqrt(p * ((c - a) / (b - a)));\n } else { // p > ((c - a) / (b - a))\n return a + (b - a) * (1 - Math.sqrt((1 - p) * (1 - ((c - a) / (b - a)))));\n }\n }\n },\n\n mean: function mean(a, b, c) {\n return (a + b + c) / 3;\n },\n\n median: function median(a, b, c) {\n if (c <= (a + b) / 2) {\n return b - Math.sqrt((b - a) * (b - c)) / Math.sqrt(2);\n } else if (c > (a + b) / 2) {\n return a + Math.sqrt((b - a) * (c - a)) / Math.sqrt(2);\n }\n },\n\n mode: function mode(a, b, c) {\n return c;\n },\n\n sample: function sample(a, b, c) {\n var u = jStat._random_fn();\n if (u < ((c - a) / (b - a)))\n return a + Math.sqrt(u * (b - a) * (c - a))\n return b - Math.sqrt((1 - u) * (b - a) * (b - c));\n },\n\n variance: function variance(a, b, c) {\n return (a * a + b * b + c * c - a * b - a * c - b * c) / 18;\n }\n});\n\n\n// extend arcsine function with static methods\njStat.extend(jStat.arcsine, {\n pdf: function pdf(x, a, b) {\n if (b <= a) return NaN;\n\n return (x <= a || x >= b) ? 0 :\n (2 / Math.PI) *\n Math.pow(Math.pow(b - a, 2) -\n Math.pow(2 * x - a - b, 2), -0.5);\n },\n\n cdf: function cdf(x, a, b) {\n if (x < a)\n return 0;\n else if (x < b)\n return (2 / Math.PI) * Math.asin(Math.sqrt((x - a)/(b - a)));\n return 1;\n },\n\n inv: function(p, a, b) {\n return a + (0.5 - 0.5 * Math.cos(Math.PI * p)) * (b - a);\n },\n\n mean: function mean(a, b) {\n if (b <= a) return NaN;\n return (a + b) / 2;\n },\n\n median: function median(a, b) {\n if (b <= a) return NaN;\n return (a + b) / 2;\n },\n\n mode: function mode(/*a, b*/) {\n throw new Error('mode is not yet implemented');\n },\n\n sample: function sample(a, b) {\n return ((a + b) / 2) + ((b - a) / 2) *\n Math.sin(2 * Math.PI * jStat.uniform.sample(0, 1));\n },\n\n variance: function variance(a, b) {\n if (b <= a) return NaN;\n return Math.pow(b - a, 2) / 8;\n }\n});\n\n\nfunction laplaceSign(x) { return x / Math.abs(x); }\n\njStat.extend(jStat.laplace, {\n pdf: function pdf(x, mu, b) {\n return (b <= 0) ? 0 : (Math.exp(-Math.abs(x - mu) / b)) / (2 * b);\n },\n\n cdf: function cdf(x, mu, b) {\n if (b <= 0) { return 0; }\n\n if(x < mu) {\n return 0.5 * Math.exp((x - mu) / b);\n } else {\n return 1 - 0.5 * Math.exp(- (x - mu) / b);\n }\n },\n\n mean: function(mu/*, b*/) {\n return mu;\n },\n\n median: function(mu/*, b*/) {\n return mu;\n },\n\n mode: function(mu/*, b*/) {\n return mu;\n },\n\n variance: function(mu, b) {\n return 2 * b * b;\n },\n\n sample: function sample(mu, b) {\n var u = jStat._random_fn() - 0.5;\n\n return mu - (b * laplaceSign(u) * Math.log(1 - (2 * Math.abs(u))));\n }\n});\n\nfunction tukeyWprob(w, rr, cc) {\n var nleg = 12;\n var ihalf = 6;\n\n var C1 = -30;\n var C2 = -50;\n var C3 = 60;\n var bb = 8;\n var wlar = 3;\n var wincr1 = 2;\n var wincr2 = 3;\n var xleg = [\n 0.981560634246719250690549090149,\n 0.904117256370474856678465866119,\n 0.769902674194304687036893833213,\n 0.587317954286617447296702418941,\n 0.367831498998180193752691536644,\n 0.125233408511468915472441369464\n ];\n var aleg = [\n 0.047175336386511827194615961485,\n 0.106939325995318430960254718194,\n 0.160078328543346226334652529543,\n 0.203167426723065921749064455810,\n 0.233492536538354808760849898925,\n 0.249147045813402785000562436043\n ];\n\n var qsqz = w * 0.5;\n\n // if w >= 16 then the integral lower bound (occurs for c=20)\n // is 0.99999999999995 so return a value of 1.\n\n if (qsqz >= bb)\n return 1.0;\n\n // find (f(w/2) - 1) ^ cc\n // (first term in integral of hartley's form).\n\n var pr_w = 2 * jStat.normal.cdf(qsqz, 0, 1, 1, 0) - 1; // erf(qsqz / M_SQRT2)\n // if pr_w ^ cc < 2e-22 then set pr_w = 0\n if (pr_w >= Math.exp(C2 / cc))\n pr_w = Math.pow(pr_w, cc);\n else\n pr_w = 0.0;\n\n // if w is large then the second component of the\n // integral is small, so fewer intervals are needed.\n\n var wincr;\n if (w > wlar)\n wincr = wincr1;\n else\n wincr = wincr2;\n\n // find the integral of second term of hartley's form\n // for the integral of the range for equal-length\n // intervals using legendre quadrature. limits of\n // integration are from (w/2, 8). two or three\n // equal-length intervals are used.\n\n // blb and bub are lower and upper limits of integration.\n\n var blb = qsqz;\n var binc = (bb - qsqz) / wincr;\n var bub = blb + binc;\n var einsum = 0.0;\n\n // integrate over each interval\n\n var cc1 = cc - 1.0;\n for (var wi = 1; wi <= wincr; wi++) {\n var elsum = 0.0;\n var a = 0.5 * (bub + blb);\n\n // legendre quadrature with order = nleg\n\n var b = 0.5 * (bub - blb);\n\n for (var jj = 1; jj <= nleg; jj++) {\n var j, xx;\n if (ihalf < jj) {\n j = (nleg - jj) + 1;\n xx = xleg[j-1];\n } else {\n j = jj;\n xx = -xleg[j-1];\n }\n var c = b * xx;\n var ac = a + c;\n\n // if exp(-qexpo/2) < 9e-14,\n // then doesn't contribute to integral\n\n var qexpo = ac * ac;\n if (qexpo > C3)\n break;\n\n var pplus = 2 * jStat.normal.cdf(ac, 0, 1, 1, 0);\n var pminus= 2 * jStat.normal.cdf(ac, w, 1, 1, 0);\n\n // if rinsum ^ (cc-1) < 9e-14,\n // then doesn't contribute to integral\n\n var rinsum = (pplus * 0.5) - (pminus * 0.5);\n if (rinsum >= Math.exp(C1 / cc1)) {\n rinsum = (aleg[j-1] * Math.exp(-(0.5 * qexpo))) * Math.pow(rinsum, cc1);\n elsum += rinsum;\n }\n }\n elsum *= (((2.0 * b) * cc) / Math.sqrt(2 * Math.PI));\n einsum += elsum;\n blb = bub;\n bub += binc;\n }\n\n // if pr_w ^ rr < 9e-14, then return 0\n pr_w += einsum;\n if (pr_w <= Math.exp(C1 / rr))\n return 0;\n\n pr_w = Math.pow(pr_w, rr);\n if (pr_w >= 1) // 1 was iMax was eps\n return 1;\n return pr_w;\n}\n\nfunction tukeyQinv(p, c, v) {\n var p0 = 0.322232421088;\n var q0 = 0.993484626060e-01;\n var p1 = -1.0;\n var q1 = 0.588581570495;\n var p2 = -0.342242088547;\n var q2 = 0.531103462366;\n var p3 = -0.204231210125;\n var q3 = 0.103537752850;\n var p4 = -0.453642210148e-04;\n var q4 = 0.38560700634e-02;\n var c1 = 0.8832;\n var c2 = 0.2368;\n var c3 = 1.214;\n var c4 = 1.208;\n var c5 = 1.4142;\n var vmax = 120.0;\n\n var ps = 0.5 - 0.5 * p;\n var yi = Math.sqrt(Math.log(1.0 / (ps * ps)));\n var t = yi + (((( yi * p4 + p3) * yi + p2) * yi + p1) * yi + p0)\n / (((( yi * q4 + q3) * yi + q2) * yi + q1) * yi + q0);\n if (v < vmax) t += (t * t * t + t) / v / 4.0;\n var q = c1 - c2 * t;\n if (v < vmax) q += -c3 / v + c4 * t / v;\n return t * (q * Math.log(c - 1.0) + c5);\n}\n\njStat.extend(jStat.tukey, {\n cdf: function cdf(q, nmeans, df) {\n // Identical implementation as the R ptukey() function as of commit 68947\n var rr = 1;\n var cc = nmeans;\n\n var nlegq = 16;\n var ihalfq = 8;\n\n var eps1 = -30.0;\n var eps2 = 1.0e-14;\n var dhaf = 100.0;\n var dquar = 800.0;\n var deigh = 5000.0;\n var dlarg = 25000.0;\n var ulen1 = 1.0;\n var ulen2 = 0.5;\n var ulen3 = 0.25;\n var ulen4 = 0.125;\n var xlegq = [\n 0.989400934991649932596154173450,\n 0.944575023073232576077988415535,\n 0.865631202387831743880467897712,\n 0.755404408355003033895101194847,\n 0.617876244402643748446671764049,\n 0.458016777657227386342419442984,\n 0.281603550779258913230460501460,\n 0.950125098376374401853193354250e-1\n ];\n var alegq = [\n 0.271524594117540948517805724560e-1,\n 0.622535239386478928628438369944e-1,\n 0.951585116824927848099251076022e-1,\n 0.124628971255533872052476282192,\n 0.149595988816576732081501730547,\n 0.169156519395002538189312079030,\n 0.182603415044923588866763667969,\n 0.189450610455068496285396723208\n ];\n\n if (q <= 0)\n return 0;\n\n // df must be > 1\n // there must be at least two values\n\n if (df < 2 || rr < 1 || cc < 2) return NaN;\n\n if (!Number.isFinite(q))\n return 1;\n\n if (df > dlarg)\n return tukeyWprob(q, rr, cc);\n\n // calculate leading constant\n\n var f2 = df * 0.5;\n var f2lf = ((f2 * Math.log(df)) - (df * Math.log(2))) - jStat.gammaln(f2);\n var f21 = f2 - 1.0;\n\n // integral is divided into unit, half-unit, quarter-unit, or\n // eighth-unit length intervals depending on the value of the\n // degrees of freedom.\n\n var ff4 = df * 0.25;\n var ulen;\n if (df <= dhaf) ulen = ulen1;\n else if (df <= dquar) ulen = ulen2;\n else if (df <= deigh) ulen = ulen3;\n else ulen = ulen4;\n\n f2lf += Math.log(ulen);\n\n // integrate over each subinterval\n\n var ans = 0.0;\n\n for (var i = 1; i <= 50; i++) {\n var otsum = 0.0;\n\n // legendre quadrature with order = nlegq\n // nodes (stored in xlegq) are symmetric around zero.\n\n var twa1 = (2 * i - 1) * ulen;\n\n for (var jj = 1; jj <= nlegq; jj++) {\n var j, t1;\n if (ihalfq < jj) {\n j = jj - ihalfq - 1;\n t1 = (f2lf + (f21 * Math.log(twa1 + (xlegq[j] * ulen))))\n - (((xlegq[j] * ulen) + twa1) * ff4);\n } else {\n j = jj - 1;\n t1 = (f2lf + (f21 * Math.log(twa1 - (xlegq[j] * ulen))))\n + (((xlegq[j] * ulen) - twa1) * ff4);\n }\n\n // if exp(t1) < 9e-14, then doesn't contribute to integral\n var qsqz;\n if (t1 >= eps1) {\n if (ihalfq < jj) {\n qsqz = q * Math.sqrt(((xlegq[j] * ulen) + twa1) * 0.5);\n } else {\n qsqz = q * Math.sqrt(((-(xlegq[j] * ulen)) + twa1) * 0.5);\n }\n\n // call wprob to find integral of range portion\n\n var wprb = tukeyWprob(qsqz, rr, cc);\n var rotsum = (wprb * alegq[j]) * Math.exp(t1);\n otsum += rotsum;\n }\n // end legendre integral for interval i\n // L200:\n }\n\n // if integral for interval i < 1e-14, then stop.\n // However, in order to avoid small area under left tail,\n // at least 1 / ulen intervals are calculated.\n if (i * ulen >= 1.0 && otsum <= eps2)\n break;\n\n // end of interval i\n // L330:\n\n ans += otsum;\n }\n\n if (otsum > eps2) { // not converged\n throw new Error('tukey.cdf failed to converge');\n }\n if (ans > 1)\n ans = 1;\n return ans;\n },\n\n inv: function(p, nmeans, df) {\n // Identical implementation as the R qtukey() function as of commit 68947\n var rr = 1;\n var cc = nmeans;\n\n var eps = 0.0001;\n var maxiter = 50;\n\n // df must be > 1 ; there must be at least two values\n if (df < 2 || rr < 1 || cc < 2) return NaN;\n\n if (p < 0 || p > 1) return NaN;\n if (p === 0) return 0;\n if (p === 1) return Infinity;\n\n // Initial value\n\n var x0 = tukeyQinv(p, cc, df);\n\n // Find prob(value < x0)\n\n var valx0 = jStat.tukey.cdf(x0, nmeans, df) - p;\n\n // Find the second iterate and prob(value < x1).\n // If the first iterate has probability value\n // exceeding p then second iterate is 1 less than\n // first iterate; otherwise it is 1 greater.\n\n var x1;\n if (valx0 > 0.0)\n x1 = Math.max(0.0, x0 - 1.0);\n else\n x1 = x0 + 1.0;\n var valx1 = jStat.tukey.cdf(x1, nmeans, df) - p;\n\n // Find new iterate\n\n var ans;\n for(var iter = 1; iter < maxiter; iter++) {\n ans = x1 - ((valx1 * (x1 - x0)) / (valx1 - valx0));\n valx0 = valx1;\n\n // New iterate must be >= 0\n\n x0 = x1;\n if (ans < 0.0) {\n ans = 0.0;\n valx1 = -p;\n }\n // Find prob(value < new iterate)\n\n valx1 = jStat.tukey.cdf(ans, nmeans, df) - p;\n x1 = ans;\n\n // If the difference between two successive\n // iterates is less than eps, stop\n\n var xabs = Math.abs(x1 - x0);\n if (xabs < eps)\n return ans;\n }\n\n throw new Error('tukey.inv failed to converge');\n }\n});\n\n}(jStat, Math));\n/* Provides functions for the solution of linear system of equations, integration, extrapolation,\n * interpolation, eigenvalue problems, differential equations and PCA analysis. */\n\n(function(jStat, Math) {\n\nvar push = Array.prototype.push;\nvar isArray = jStat.utils.isArray;\n\nfunction isUsable(arg) {\n return isArray(arg) || arg instanceof jStat;\n}\n\njStat.extend({\n\n // add a vector/matrix to a vector/matrix or scalar\n add: function add(arr, arg) {\n // check if arg is a vector or scalar\n if (isUsable(arg)) {\n if (!isUsable(arg[0])) arg = [ arg ];\n return jStat.map(arr, function(value, row, col) {\n return value + arg[row][col];\n });\n }\n return jStat.map(arr, function(value) { return value + arg; });\n },\n\n // subtract a vector or scalar from the vector\n subtract: function subtract(arr, arg) {\n // check if arg is a vector or scalar\n if (isUsable(arg)) {\n if (!isUsable(arg[0])) arg = [ arg ];\n return jStat.map(arr, function(value, row, col) {\n return value - arg[row][col] || 0;\n });\n }\n return jStat.map(arr, function(value) { return value - arg; });\n },\n\n // matrix division\n divide: function divide(arr, arg) {\n if (isUsable(arg)) {\n if (!isUsable(arg[0])) arg = [ arg ];\n return jStat.multiply(arr, jStat.inv(arg));\n }\n return jStat.map(arr, function(value) { return value / arg; });\n },\n\n // matrix multiplication\n multiply: function multiply(arr, arg) {\n var row, col, nrescols, sum, nrow, ncol, res, rescols;\n // eg: arr = 2 arg = 3 -> 6 for res[0][0] statement closure\n if (arr.length === undefined && arg.length === undefined) {\n return arr * arg;\n }\n nrow = arr.length,\n ncol = arr[0].length,\n res = jStat.zeros(nrow, nrescols = (isUsable(arg)) ? arg[0].length : ncol),\n rescols = 0;\n if (isUsable(arg)) {\n for (; rescols < nrescols; rescols++) {\n for (row = 0; row < nrow; row++) {\n sum = 0;\n for (col = 0; col < ncol; col++)\n sum += arr[row][col] * arg[col][rescols];\n res[row][rescols] = sum;\n }\n }\n return (nrow === 1 && rescols === 1) ? res[0][0] : res;\n }\n return jStat.map(arr, function(value) { return value * arg; });\n },\n\n // outer([1,2,3],[4,5,6])\n // ===\n // [[1],[2],[3]] times [[4,5,6]]\n // ->\n // [[4,5,6],[8,10,12],[12,15,18]]\n outer:function outer(A, B) {\n return jStat.multiply(A.map(function(t){ return [t] }), [B]);\n },\n\n\n // Returns the dot product of two matricies\n dot: function dot(arr, arg) {\n if (!isUsable(arr[0])) arr = [ arr ];\n if (!isUsable(arg[0])) arg = [ arg ];\n // convert column to row vector\n var left = (arr[0].length === 1 && arr.length !== 1) ? jStat.transpose(arr) : arr,\n right = (arg[0].length === 1 && arg.length !== 1) ? jStat.transpose(arg) : arg,\n res = [],\n row = 0,\n nrow = left.length,\n ncol = left[0].length,\n sum, col;\n for (; row < nrow; row++) {\n res[row] = [];\n sum = 0;\n for (col = 0; col < ncol; col++)\n sum += left[row][col] * right[row][col];\n res[row] = sum;\n }\n return (res.length === 1) ? res[0] : res;\n },\n\n // raise every element by a scalar\n pow: function pow(arr, arg) {\n return jStat.map(arr, function(value) { return Math.pow(value, arg); });\n },\n\n // exponentiate every element\n exp: function exp(arr) {\n return jStat.map(arr, function(value) { return Math.exp(value); });\n },\n\n // generate the natural log of every element\n log: function exp(arr) {\n return jStat.map(arr, function(value) { return Math.log(value); });\n },\n\n // generate the absolute values of the vector\n abs: function abs(arr) {\n return jStat.map(arr, function(value) { return Math.abs(value); });\n },\n\n // computes the p-norm of the vector\n // In the case that a matrix is passed, uses the first row as the vector\n norm: function norm(arr, p) {\n var nnorm = 0,\n i = 0;\n // check the p-value of the norm, and set for most common case\n if (isNaN(p)) p = 2;\n // check if multi-dimensional array, and make vector correction\n if (isUsable(arr[0])) arr = arr[0];\n // vector norm\n for (; i < arr.length; i++) {\n nnorm += Math.pow(Math.abs(arr[i]), p);\n }\n return Math.pow(nnorm, 1 / p);\n },\n\n // computes the angle between two vectors in rads\n // In case a matrix is passed, this uses the first row as the vector\n angle: function angle(arr, arg) {\n return Math.acos(jStat.dot(arr, arg) / (jStat.norm(arr) * jStat.norm(arg)));\n },\n\n // augment one matrix by another\n // Note: this function returns a matrix, not a jStat object\n aug: function aug(a, b) {\n var newarr = [];\n var i;\n for (i = 0; i < a.length; i++) {\n newarr.push(a[i].slice());\n }\n for (i = 0; i < newarr.length; i++) {\n push.apply(newarr[i], b[i]);\n }\n return newarr;\n },\n\n // The inv() function calculates the inverse of a matrix\n // Create the inverse by augmenting the matrix by the identity matrix of the\n // appropriate size, and then use G-J elimination on the augmented matrix.\n inv: function inv(a) {\n var rows = a.length;\n var cols = a[0].length;\n var b = jStat.identity(rows, cols);\n var c = jStat.gauss_jordan(a, b);\n var result = [];\n var i = 0;\n var j;\n\n //We need to copy the inverse portion to a new matrix to rid G-J artifacts\n for (; i < rows; i++) {\n result[i] = [];\n for (j = cols; j < c[0].length; j++)\n result[i][j - cols] = c[i][j];\n }\n return result;\n },\n\n // calculate the determinant of a matrix\n det: function det(a) {\n if (a.length === 2) {\n return a[0][0] * a[1][1] - a[0][1] * a[1][0];\n }\n\n var determinant = 0;\n for (var i = 0; i < a.length; i++) {\n // build a sub matrix without column `i`\n var submatrix = [];\n for (var row = 1; row < a.length; row++) {\n submatrix[row - 1] = [];\n for (var col = 0; col < a.length; col++) {\n if (col < i) {\n submatrix[row - 1][col] = a[row][col];\n } else if (col > i) {\n submatrix[row - 1][col - 1] = a[row][col];\n }\n }\n }\n\n // alternate between + and - between determinants\n var sign = i % 2 ? -1 : 1;\n determinant += det(submatrix) * a[0][i] * sign;\n }\n\n return determinant\n },\n\n gauss_elimination: function gauss_elimination(a, b) {\n var i = 0,\n j = 0,\n n = a.length,\n m = a[0].length,\n factor = 1,\n sum = 0,\n x = [],\n maug, pivot, temp, k;\n a = jStat.aug(a, b);\n maug = a[0].length;\n for(i = 0; i < n; i++) {\n pivot = a[i][i];\n j = i;\n for (k = i + 1; k < m; k++) {\n if (pivot < Math.abs(a[k][i])) {\n pivot = a[k][i];\n j = k;\n }\n }\n if (j != i) {\n for(k = 0; k < maug; k++) {\n temp = a[i][k];\n a[i][k] = a[j][k];\n a[j][k] = temp;\n }\n }\n for (j = i + 1; j < n; j++) {\n factor = a[j][i] / a[i][i];\n for(k = i; k < maug; k++) {\n a[j][k] = a[j][k] - factor * a[i][k];\n }\n }\n }\n for (i = n - 1; i >= 0; i--) {\n sum = 0;\n for (j = i + 1; j<= n - 1; j++) {\n sum = sum + x[j] * a[i][j];\n }\n x[i] =(a[i][maug - 1] - sum) / a[i][i];\n }\n return x;\n },\n\n gauss_jordan: function gauss_jordan(a, b) {\n var m = jStat.aug(a, b);\n var h = m.length;\n var w = m[0].length;\n var c = 0;\n var x, y, y2;\n // find max pivot\n for (y = 0; y < h; y++) {\n var maxrow = y;\n for (y2 = y+1; y2 < h; y2++) {\n if (Math.abs(m[y2][y]) > Math.abs(m[maxrow][y]))\n maxrow = y2;\n }\n var tmp = m[y];\n m[y] = m[maxrow];\n m[maxrow] = tmp\n for (y2 = y+1; y2 < h; y2++) {\n c = m[y2][y] / m[y][y];\n for (x = y; x < w; x++) {\n m[y2][x] -= m[y][x] * c;\n }\n }\n }\n // backsubstitute\n for (y = h-1; y >= 0; y--) {\n c = m[y][y];\n for (y2 = 0; y2 < y; y2++) {\n for (x = w-1; x > y-1; x--) {\n m[y2][x] -= m[y][x] * m[y2][y] / c;\n }\n }\n m[y][y] /= c;\n for (x = h; x < w; x++) {\n m[y][x] /= c;\n }\n }\n return m;\n },\n\n // solve equation\n // Ax=b\n // A is upper triangular matrix\n // A=[[1,2,3],[0,4,5],[0,6,7]]\n // b=[1,2,3]\n // triaUpSolve(A,b) // -> [2.666,0.1666,1.666]\n // if you use matrix style\n // A=[[1,2,3],[0,4,5],[0,6,7]]\n // b=[[1],[2],[3]]\n // will return [[2.666],[0.1666],[1.666]]\n triaUpSolve: function triaUpSolve(A, b) {\n var size = A[0].length;\n var x = jStat.zeros(1, size)[0];\n var parts;\n var matrix_mode = false;\n\n if (b[0].length != undefined) {\n b = b.map(function(i){ return i[0] });\n matrix_mode = true;\n }\n\n jStat.arange(size - 1, -1, -1).forEach(function(i) {\n parts = jStat.arange(i + 1, size).map(function(j) {\n return x[j] * A[i][j];\n });\n x[i] = (b[i] - jStat.sum(parts)) / A[i][i];\n });\n\n if (matrix_mode)\n return x.map(function(i){ return [i] });\n return x;\n },\n\n triaLowSolve: function triaLowSolve(A, b) {\n // like to triaUpSolve but A is lower triangular matrix\n var size = A[0].length;\n var x = jStat.zeros(1, size)[0];\n var parts;\n\n var matrix_mode=false;\n if (b[0].length != undefined) {\n b = b.map(function(i){ return i[0] });\n matrix_mode = true;\n }\n\n jStat.arange(size).forEach(function(i) {\n parts = jStat.arange(i).map(function(j) {\n return A[i][j] * x[j];\n });\n x[i] = (b[i] - jStat.sum(parts)) / A[i][i];\n })\n\n if (matrix_mode)\n return x.map(function(i){ return [i] });\n return x;\n },\n\n\n // A -> [L,U]\n // A=LU\n // L is lower triangular matrix\n // U is upper triangular matrix\n lu: function lu(A) {\n var size = A.length;\n //var L=jStat.diagonal(jStat.ones(1,size)[0]);\n var L = jStat.identity(size);\n var R = jStat.zeros(A.length, A[0].length);\n var parts;\n jStat.arange(size).forEach(function(t) {\n R[0][t] = A[0][t];\n });\n jStat.arange(1, size).forEach(function(l) {\n jStat.arange(l).forEach(function(i) {\n parts = jStat.arange(i).map(function(jj) {\n return L[l][jj] * R[jj][i];\n });\n L[l][i] = (A[l][i] - jStat.sum(parts)) / R[i][i];\n });\n jStat.arange(l, size).forEach(function(j) {\n parts = jStat.arange(l).map(function(jj) {\n return L[l][jj] * R[jj][j];\n });\n R[l][j] = A[parts.length][j] - jStat.sum(parts);\n });\n });\n return [L, R];\n },\n\n // A -> T\n // A=TT'\n // T is lower triangular matrix\n cholesky: function cholesky(A) {\n var size = A.length;\n var T = jStat.zeros(A.length, A[0].length);\n var parts;\n jStat.arange(size).forEach(function(i) {\n parts = jStat.arange(i).map(function(t) {\n return Math.pow(T[i][t],2);\n });\n T[i][i] = Math.sqrt(A[i][i] - jStat.sum(parts));\n jStat.arange(i + 1, size).forEach(function(j) {\n parts = jStat.arange(i).map(function(t) {\n return T[i][t] * T[j][t];\n });\n T[j][i] = (A[i][j] - jStat.sum(parts)) / T[i][i];\n });\n });\n return T;\n },\n\n\n gauss_jacobi: function gauss_jacobi(a, b, x, r) {\n var i = 0;\n var j = 0;\n var n = a.length;\n var l = [];\n var u = [];\n var d = [];\n var xv, c, h, xk;\n for (; i < n; i++) {\n l[i] = [];\n u[i] = [];\n d[i] = [];\n for (j = 0; j < n; j++) {\n if (i > j) {\n l[i][j] = a[i][j];\n u[i][j] = d[i][j] = 0;\n } else if (i < j) {\n u[i][j] = a[i][j];\n l[i][j] = d[i][j] = 0;\n } else {\n d[i][j] = a[i][j];\n l[i][j] = u[i][j] = 0;\n }\n }\n }\n h = jStat.multiply(jStat.multiply(jStat.inv(d), jStat.add(l, u)), -1);\n c = jStat.multiply(jStat.inv(d), b);\n xv = x;\n xk = jStat.add(jStat.multiply(h, x), c);\n i = 2;\n while (Math.abs(jStat.norm(jStat.subtract(xk,xv))) > r) {\n xv = xk;\n xk = jStat.add(jStat.multiply(h, xv), c);\n i++;\n }\n return xk;\n },\n\n gauss_seidel: function gauss_seidel(a, b, x, r) {\n var i = 0;\n var n = a.length;\n var l = [];\n var u = [];\n var d = [];\n var j, xv, c, h, xk;\n for (; i < n; i++) {\n l[i] = [];\n u[i] = [];\n d[i] = [];\n for (j = 0; j < n; j++) {\n if (i > j) {\n l[i][j] = a[i][j];\n u[i][j] = d[i][j] = 0;\n } else if (i < j) {\n u[i][j] = a[i][j];\n l[i][j] = d[i][j] = 0;\n } else {\n d[i][j] = a[i][j];\n l[i][j] = u[i][j] = 0;\n }\n }\n }\n h = jStat.multiply(jStat.multiply(jStat.inv(jStat.add(d, l)), u), -1);\n c = jStat.multiply(jStat.inv(jStat.add(d, l)), b);\n xv = x;\n xk = jStat.add(jStat.multiply(h, x), c);\n i = 2;\n while (Math.abs(jStat.norm(jStat.subtract(xk, xv))) > r) {\n xv = xk;\n xk = jStat.add(jStat.multiply(h, xv), c);\n i = i + 1;\n }\n return xk;\n },\n\n SOR: function SOR(a, b, x, r, w) {\n var i = 0;\n var n = a.length;\n var l = [];\n var u = [];\n var d = [];\n var j, xv, c, h, xk;\n for (; i < n; i++) {\n l[i] = [];\n u[i] = [];\n d[i] = [];\n for (j = 0; j < n; j++) {\n if (i > j) {\n l[i][j] = a[i][j];\n u[i][j] = d[i][j] = 0;\n } else if (i < j) {\n u[i][j] = a[i][j];\n l[i][j] = d[i][j] = 0;\n } else {\n d[i][j] = a[i][j];\n l[i][j] = u[i][j] = 0;\n }\n }\n }\n h = jStat.multiply(jStat.inv(jStat.add(d, jStat.multiply(l, w))),\n jStat.subtract(jStat.multiply(d, 1 - w),\n jStat.multiply(u, w)));\n c = jStat.multiply(jStat.multiply(jStat.inv(jStat.add(d,\n jStat.multiply(l, w))), b), w);\n xv = x;\n xk = jStat.add(jStat.multiply(h, x), c);\n i = 2;\n while (Math.abs(jStat.norm(jStat.subtract(xk, xv))) > r) {\n xv = xk;\n xk = jStat.add(jStat.multiply(h, xv), c);\n i++;\n }\n return xk;\n },\n\n householder: function householder(a) {\n var m = a.length;\n var n = a[0].length;\n var i = 0;\n var w = [];\n var p = [];\n var alpha, r, k, j, factor;\n for (; i < m - 1; i++) {\n alpha = 0;\n for (j = i + 1; j < n; j++)\n alpha += (a[j][i] * a[j][i]);\n factor = (a[i + 1][i] > 0) ? -1 : 1;\n alpha = factor * Math.sqrt(alpha);\n r = Math.sqrt((((alpha * alpha) - a[i + 1][i] * alpha) / 2));\n w = jStat.zeros(m, 1);\n w[i + 1][0] = (a[i + 1][i] - alpha) / (2 * r);\n for (k = i + 2; k < m; k++) w[k][0] = a[k][i] / (2 * r);\n p = jStat.subtract(jStat.identity(m, n),\n jStat.multiply(jStat.multiply(w, jStat.transpose(w)), 2));\n a = jStat.multiply(p, jStat.multiply(a, p));\n }\n return a;\n },\n\n // A -> [Q,R]\n // Q is orthogonal matrix\n // R is upper triangular\n QR: (function() {\n // x -> Q\n // find a orthogonal matrix Q st.\n // Qx=y\n // y is [||x||,0,0,...]\n\n // quick ref\n var sum = jStat.sum;\n var range = jStat.arange;\n\n function qr2(x) {\n // quick impletation\n // https://www.stat.wisc.edu/~larget/math496/qr.html\n\n var n = x.length;\n var p = x[0].length;\n\n var r = jStat.zeros(p, p);\n x = jStat.copy(x);\n\n var i,j,k;\n for(j = 0; j < p; j++){\n r[j][j] = Math.sqrt(sum(range(n).map(function(i){\n return x[i][j] * x[i][j];\n })));\n for(i = 0; i < n; i++){\n x[i][j] = x[i][j] / r[j][j];\n }\n for(k = j+1; k < p; k++){\n r[j][k] = sum(range(n).map(function(i){\n return x[i][j] * x[i][k];\n }));\n for(i = 0; i < n; i++){\n x[i][k] = x[i][k] - x[i][j]*r[j][k];\n }\n }\n }\n return [x, r];\n }\n\n return qr2;\n }()),\n\n lstsq: (function() {\n // solve least squard problem for Ax=b as QR decomposition way if b is\n // [[b1],[b2],[b3]] form will return [[x1],[x2],[x3]] array form solution\n // else b is [b1,b2,b3] form will return [x1,x2,x3] array form solution\n function R_I(A) {\n A = jStat.copy(A);\n var size = A.length;\n var I = jStat.identity(size);\n jStat.arange(size - 1, -1, -1).forEach(function(i) {\n jStat.sliceAssign(\n I, { row: i }, jStat.divide(jStat.slice(I, { row: i }), A[i][i]));\n jStat.sliceAssign(\n A, { row: i }, jStat.divide(jStat.slice(A, { row: i }), A[i][i]));\n jStat.arange(i).forEach(function(j) {\n var c = jStat.multiply(A[j][i], -1);\n var Aj = jStat.slice(A, { row: j });\n var cAi = jStat.multiply(jStat.slice(A, { row: i }), c);\n jStat.sliceAssign(A, { row: j }, jStat.add(Aj, cAi));\n var Ij = jStat.slice(I, { row: j });\n var cIi = jStat.multiply(jStat.slice(I, { row: i }), c);\n jStat.sliceAssign(I, { row: j }, jStat.add(Ij, cIi));\n })\n });\n return I;\n }\n\n function qr_solve(A, b){\n var array_mode = false;\n if (b[0].length === undefined) {\n // [c1,c2,c3] mode\n b = b.map(function(x){ return [x] });\n array_mode = true;\n }\n var QR = jStat.QR(A);\n var Q = QR[0];\n var R = QR[1];\n var attrs = A[0].length;\n var Q1 = jStat.slice(Q,{col:{end:attrs}});\n var R1 = jStat.slice(R,{row:{end:attrs}});\n var RI = R_I(R1);\n var Q2 = jStat.transpose(Q1);\n\n if(Q2[0].length === undefined){\n Q2 = [Q2]; // The confusing jStat.multifly implementation threat nature process again.\n }\n\n var x = jStat.multiply(jStat.multiply(RI, Q2), b);\n\n if(x.length === undefined){\n x = [[x]]; // The confusing jStat.multifly implementation threat nature process again.\n }\n\n\n if (array_mode)\n return x.map(function(i){ return i[0] });\n return x;\n }\n\n return qr_solve;\n }()),\n\n jacobi: function jacobi(a) {\n var condition = 1;\n var n = a.length;\n var e = jStat.identity(n, n);\n var ev = [];\n var b, i, j, p, q, maxim, theta, s;\n // condition === 1 only if tolerance is not reached\n while (condition === 1) {\n maxim = a[0][1];\n p = 0;\n q = 1;\n for (i = 0; i < n; i++) {\n for (j = 0; j < n; j++) {\n if (i != j) {\n if (maxim < Math.abs(a[i][j])) {\n maxim = Math.abs(a[i][j]);\n p = i;\n q = j;\n }\n }\n }\n }\n if (a[p][p] === a[q][q])\n theta = (a[p][q] > 0) ? Math.PI / 4 : -Math.PI / 4;\n else\n theta = Math.atan(2 * a[p][q] / (a[p][p] - a[q][q])) / 2;\n s = jStat.identity(n, n);\n s[p][p] = Math.cos(theta);\n s[p][q] = -Math.sin(theta);\n s[q][p] = Math.sin(theta);\n s[q][q] = Math.cos(theta);\n // eigen vector matrix\n e = jStat.multiply(e, s);\n b = jStat.multiply(jStat.multiply(jStat.inv(s), a), s);\n a = b;\n condition = 0;\n for (i = 1; i < n; i++) {\n for (j = 1; j < n; j++) {\n if (i != j && Math.abs(a[i][j]) > 0.001) {\n condition = 1;\n }\n }\n }\n }\n for (i = 0; i < n; i++) ev.push(a[i][i]);\n //returns both the eigenvalue and eigenmatrix\n return [e, ev];\n },\n\n rungekutta: function rungekutta(f, h, p, t_j, u_j, order) {\n var k1, k2, u_j1, k3, k4;\n if (order === 2) {\n while (t_j <= p) {\n k1 = h * f(t_j, u_j);\n k2 = h * f(t_j + h, u_j + k1);\n u_j1 = u_j + (k1 + k2) / 2;\n u_j = u_j1;\n t_j = t_j + h;\n }\n }\n if (order === 4) {\n while (t_j <= p) {\n k1 = h * f(t_j, u_j);\n k2 = h * f(t_j + h / 2, u_j + k1 / 2);\n k3 = h * f(t_j + h / 2, u_j + k2 / 2);\n k4 = h * f(t_j +h, u_j + k3);\n u_j1 = u_j + (k1 + 2 * k2 + 2 * k3 + k4) / 6;\n u_j = u_j1;\n t_j = t_j + h;\n }\n }\n return u_j;\n },\n\n romberg: function romberg(f, a, b, order) {\n var i = 0;\n var h = (b - a) / 2;\n var x = [];\n var h1 = [];\n var g = [];\n var m, a1, j, k, I;\n while (i < order / 2) {\n I = f(a);\n for (j = a, k = 0; j <= b; j = j + h, k++) x[k] = j;\n m = x.length;\n for (j = 1; j < m - 1; j++) {\n I += (((j % 2) !== 0) ? 4 : 2) * f(x[j]);\n }\n I = (h / 3) * (I + f(b));\n g[i] = I;\n h /= 2;\n i++;\n }\n a1 = g.length;\n m = 1;\n while (a1 !== 1) {\n for (j = 0; j < a1 - 1; j++)\n h1[j] = ((Math.pow(4, m)) * g[j + 1] - g[j]) / (Math.pow(4, m) - 1);\n a1 = h1.length;\n g = h1;\n h1 = [];\n m++;\n }\n return g;\n },\n\n richardson: function richardson(X, f, x, h) {\n function pos(X, x) {\n var i = 0;\n var n = X.length;\n var p;\n for (; i < n; i++)\n if (X[i] === x) p = i;\n return p;\n }\n var h_min = Math.abs(x - X[pos(X, x) + 1]);\n var i = 0;\n var g = [];\n var h1 = [];\n var y1, y2, m, a, j;\n while (h >= h_min) {\n y1 = pos(X, x + h);\n y2 = pos(X, x);\n g[i] = (f[y1] - 2 * f[y2] + f[2 * y2 - y1]) / (h * h);\n h /= 2;\n i++;\n }\n a = g.length;\n m = 1;\n while (a != 1) {\n for (j = 0; j < a - 1; j++)\n h1[j] = ((Math.pow(4, m)) * g[j + 1] - g[j]) / (Math.pow(4, m) - 1);\n a = h1.length;\n g = h1;\n h1 = [];\n m++;\n }\n return g;\n },\n\n simpson: function simpson(f, a, b, n) {\n var h = (b - a) / n;\n var I = f(a);\n var x = [];\n var j = a;\n var k = 0;\n var i = 1;\n var m;\n for (; j <= b; j = j + h, k++)\n x[k] = j;\n m = x.length;\n for (; i < m - 1; i++) {\n I += ((i % 2 !== 0) ? 4 : 2) * f(x[i]);\n }\n return (h / 3) * (I + f(b));\n },\n\n hermite: function hermite(X, F, dF, value) {\n var n = X.length;\n var p = 0;\n var i = 0;\n var l = [];\n var dl = [];\n var A = [];\n var B = [];\n var j;\n for (; i < n; i++) {\n l[i] = 1;\n for (j = 0; j < n; j++) {\n if (i != j) l[i] *= (value - X[j]) / (X[i] - X[j]);\n }\n dl[i] = 0;\n for (j = 0; j < n; j++) {\n if (i != j) dl[i] += 1 / (X [i] - X[j]);\n }\n A[i] = (1 - 2 * (value - X[i]) * dl[i]) * (l[i] * l[i]);\n B[i] = (value - X[i]) * (l[i] * l[i]);\n p += (A[i] * F[i] + B[i] * dF[i]);\n }\n return p;\n },\n\n lagrange: function lagrange(X, F, value) {\n var p = 0;\n var i = 0;\n var j, l;\n var n = X.length;\n for (; i < n; i++) {\n l = F[i];\n for (j = 0; j < n; j++) {\n // calculating the lagrange polynomial L_i\n if (i != j) l *= (value - X[j]) / (X[i] - X[j]);\n }\n // adding the lagrange polynomials found above\n p += l;\n }\n return p;\n },\n\n cubic_spline: function cubic_spline(X, F, value) {\n var n = X.length;\n var i = 0, j;\n var A = [];\n var B = [];\n var alpha = [];\n var c = [];\n var h = [];\n var b = [];\n var d = [];\n for (; i < n - 1; i++)\n h[i] = X[i + 1] - X[i];\n alpha[0] = 0;\n for (i = 1; i < n - 1; i++) {\n alpha[i] = (3 / h[i]) * (F[i + 1] - F[i]) -\n (3 / h[i-1]) * (F[i] - F[i-1]);\n }\n for (i = 1; i < n - 1; i++) {\n A[i] = [];\n B[i] = [];\n A[i][i-1] = h[i-1];\n A[i][i] = 2 * (h[i - 1] + h[i]);\n A[i][i+1] = h[i];\n B[i][0] = alpha[i];\n }\n c = jStat.multiply(jStat.inv(A), B);\n for (j = 0; j < n - 1; j++) {\n b[j] = (F[j + 1] - F[j]) / h[j] - h[j] * (c[j + 1][0] + 2 * c[j][0]) / 3;\n d[j] = (c[j + 1][0] - c[j][0]) / (3 * h[j]);\n }\n for (j = 0; j < n; j++) {\n if (X[j] > value) break;\n }\n j -= 1;\n return F[j] + (value - X[j]) * b[j] + jStat.sq(value-X[j]) *\n c[j] + (value - X[j]) * jStat.sq(value - X[j]) * d[j];\n },\n\n gauss_quadrature: function gauss_quadrature() {\n throw new Error('gauss_quadrature not yet implemented');\n },\n\n PCA: function PCA(X) {\n var m = X.length;\n var n = X[0].length;\n var i = 0;\n var j, temp1;\n var u = [];\n var D = [];\n var result = [];\n var temp2 = [];\n var Y = [];\n var Bt = [];\n var B = [];\n var C = [];\n var V = [];\n var Vt = [];\n for (i = 0; i < m; i++) {\n u[i] = jStat.sum(X[i]) / n;\n }\n for (i = 0; i < n; i++) {\n B[i] = [];\n for(j = 0; j < m; j++) {\n B[i][j] = X[j][i] - u[j];\n }\n }\n B = jStat.transpose(B);\n for (i = 0; i < m; i++) {\n C[i] = [];\n for (j = 0; j < m; j++) {\n C[i][j] = (jStat.dot([B[i]], [B[j]])) / (n - 1);\n }\n }\n result = jStat.jacobi(C);\n V = result[0];\n D = result[1];\n Vt = jStat.transpose(V);\n for (i = 0; i < D.length; i++) {\n for (j = i; j < D.length; j++) {\n if(D[i] < D[j]) {\n temp1 = D[i];\n D[i] = D[j];\n D[j] = temp1;\n temp2 = Vt[i];\n Vt[i] = Vt[j];\n Vt[j] = temp2;\n }\n }\n }\n Bt = jStat.transpose(B);\n for (i = 0; i < m; i++) {\n Y[i] = [];\n for (j = 0; j < Bt.length; j++) {\n Y[i][j] = jStat.dot([Vt[i]], [Bt[j]]);\n }\n }\n return [X, D, Vt, Y];\n }\n});\n\n// extend jStat.fn with methods that require one argument\n(function(funcs) {\n for (var i = 0; i < funcs.length; i++) (function(passfunc) {\n jStat.fn[passfunc] = function(arg, func) {\n var tmpthis = this;\n // check for callback\n if (func) {\n setTimeout(function() {\n func.call(tmpthis, jStat.fn[passfunc].call(tmpthis, arg));\n }, 15);\n return this;\n }\n if (typeof jStat[passfunc](this, arg) === 'number')\n return jStat[passfunc](this, arg);\n else\n return jStat(jStat[passfunc](this, arg));\n };\n }(funcs[i]));\n}('add divide multiply subtract dot pow exp log abs norm angle'.split(' ')));\n\n}(jStat, Math));\n(function(jStat, Math) {\n\nvar slice = [].slice;\nvar isNumber = jStat.utils.isNumber;\nvar isArray = jStat.utils.isArray;\n\n// flag==true denotes use of sample standard deviation\n// Z Statistics\njStat.extend({\n // 2 different parameter lists:\n // (value, mean, sd)\n // (value, array, flag)\n zscore: function zscore() {\n var args = slice.call(arguments);\n if (isNumber(args[1])) {\n return (args[0] - args[1]) / args[2];\n }\n return (args[0] - jStat.mean(args[1])) / jStat.stdev(args[1], args[2]);\n },\n\n // 3 different paramter lists:\n // (value, mean, sd, sides)\n // (zscore, sides)\n // (value, array, sides, flag)\n ztest: function ztest() {\n var args = slice.call(arguments);\n var z;\n if (isArray(args[1])) {\n // (value, array, sides, flag)\n z = jStat.zscore(args[0],args[1],args[3]);\n return (args[2] === 1) ?\n (jStat.normal.cdf(-Math.abs(z), 0, 1)) :\n (jStat.normal.cdf(-Math.abs(z), 0, 1)*2);\n } else {\n if (args.length > 2) {\n // (value, mean, sd, sides)\n z = jStat.zscore(args[0],args[1],args[2]);\n return (args[3] === 1) ?\n (jStat.normal.cdf(-Math.abs(z),0,1)) :\n (jStat.normal.cdf(-Math.abs(z),0,1)* 2);\n } else {\n // (zscore, sides)\n z = args[0];\n return (args[1] === 1) ?\n (jStat.normal.cdf(-Math.abs(z),0,1)) :\n (jStat.normal.cdf(-Math.abs(z),0,1)*2);\n }\n }\n }\n});\n\njStat.extend(jStat.fn, {\n zscore: function zscore(value, flag) {\n return (value - this.mean()) / this.stdev(flag);\n },\n\n ztest: function ztest(value, sides, flag) {\n var zscore = Math.abs(this.zscore(value, flag));\n return (sides === 1) ?\n (jStat.normal.cdf(-zscore, 0, 1)) :\n (jStat.normal.cdf(-zscore, 0, 1) * 2);\n }\n});\n\n// T Statistics\njStat.extend({\n // 2 parameter lists\n // (value, mean, sd, n)\n // (value, array)\n tscore: function tscore() {\n var args = slice.call(arguments);\n return (args.length === 4) ?\n ((args[0] - args[1]) / (args[2] / Math.sqrt(args[3]))) :\n ((args[0] - jStat.mean(args[1])) /\n (jStat.stdev(args[1], true) / Math.sqrt(args[1].length)));\n },\n\n // 3 different paramter lists:\n // (value, mean, sd, n, sides)\n // (tscore, n, sides)\n // (value, array, sides)\n ttest: function ttest() {\n var args = slice.call(arguments);\n var tscore;\n if (args.length === 5) {\n tscore = Math.abs(jStat.tscore(args[0], args[1], args[2], args[3]));\n return (args[4] === 1) ?\n (jStat.studentt.cdf(-tscore, args[3]-1)) :\n (jStat.studentt.cdf(-tscore, args[3]-1)*2);\n }\n if (isNumber(args[1])) {\n tscore = Math.abs(args[0])\n return (args[2] == 1) ?\n (jStat.studentt.cdf(-tscore, args[1]-1)) :\n (jStat.studentt.cdf(-tscore, args[1]-1) * 2);\n }\n tscore = Math.abs(jStat.tscore(args[0], args[1]))\n return (args[2] == 1) ?\n (jStat.studentt.cdf(-tscore, args[1].length-1)) :\n (jStat.studentt.cdf(-tscore, args[1].length-1) * 2);\n }\n});\n\njStat.extend(jStat.fn, {\n tscore: function tscore(value) {\n return (value - this.mean()) / (this.stdev(true) / Math.sqrt(this.cols()));\n },\n\n ttest: function ttest(value, sides) {\n return (sides === 1) ?\n (1 - jStat.studentt.cdf(Math.abs(this.tscore(value)), this.cols()-1)) :\n (jStat.studentt.cdf(-Math.abs(this.tscore(value)), this.cols()-1)*2);\n }\n});\n\n// F Statistics\njStat.extend({\n // Paramter list is as follows:\n // (array1, array2, array3, ...)\n // or it is an array of arrays\n // array of arrays conversion\n anovafscore: function anovafscore() {\n var args = slice.call(arguments),\n expVar, sample, sampMean, sampSampMean, tmpargs, unexpVar, i, j;\n if (args.length === 1) {\n tmpargs = new Array(args[0].length);\n for (i = 0; i < args[0].length; i++) {\n tmpargs[i] = args[0][i];\n }\n args = tmpargs;\n }\n // Builds sample array\n sample = new Array();\n for (i = 0; i < args.length; i++) {\n sample = sample.concat(args[i]);\n }\n sampMean = jStat.mean(sample);\n // Computes the explained variance\n expVar = 0;\n for (i = 0; i < args.length; i++) {\n expVar = expVar + args[i].length * Math.pow(jStat.mean(args[i]) - sampMean, 2);\n }\n expVar /= (args.length - 1);\n // Computes unexplained variance\n unexpVar = 0;\n for (i = 0; i < args.length; i++) {\n sampSampMean = jStat.mean(args[i]);\n for (j = 0; j < args[i].length; j++) {\n unexpVar += Math.pow(args[i][j] - sampSampMean, 2);\n }\n }\n unexpVar /= (sample.length - args.length);\n return expVar / unexpVar;\n },\n\n // 2 different paramter setups\n // (array1, array2, array3, ...)\n // (anovafscore, df1, df2)\n anovaftest: function anovaftest() {\n var args = slice.call(arguments),\n df1, df2, n, i;\n if (isNumber(args[0])) {\n return 1 - jStat.centralF.cdf(args[0], args[1], args[2]);\n }\n var anovafscore = jStat.anovafscore(args);\n df1 = args.length - 1;\n n = 0;\n for (i = 0; i < args.length; i++) {\n n = n + args[i].length;\n }\n df2 = n - df1 - 1;\n return 1 - jStat.centralF.cdf(anovafscore, df1, df2);\n },\n\n ftest: function ftest(fscore, df1, df2) {\n return 1 - jStat.centralF.cdf(fscore, df1, df2);\n }\n});\n\njStat.extend(jStat.fn, {\n anovafscore: function anovafscore() {\n return jStat.anovafscore(this.toArray());\n },\n\n anovaftes: function anovaftes() {\n var n = 0;\n var i;\n for (i = 0; i < this.length; i++) {\n n = n + this[i].length;\n }\n return jStat.ftest(this.anovafscore(), this.length - 1, n - this.length);\n }\n});\n\n// Tukey's range test\njStat.extend({\n // 2 parameter lists\n // (mean1, mean2, n1, n2, sd)\n // (array1, array2, sd)\n qscore: function qscore() {\n var args = slice.call(arguments);\n var mean1, mean2, n1, n2, sd;\n if (isNumber(args[0])) {\n mean1 = args[0];\n mean2 = args[1];\n n1 = args[2];\n n2 = args[3];\n sd = args[4];\n } else {\n mean1 = jStat.mean(args[0]);\n mean2 = jStat.mean(args[1]);\n n1 = args[0].length;\n n2 = args[1].length;\n sd = args[2];\n }\n return Math.abs(mean1 - mean2) / (sd * Math.sqrt((1 / n1 + 1 / n2) / 2));\n },\n\n // 3 different parameter lists:\n // (qscore, n, k)\n // (mean1, mean2, n1, n2, sd, n, k)\n // (array1, array2, sd, n, k)\n qtest: function qtest() {\n var args = slice.call(arguments);\n\n var qscore;\n if (args.length === 3) {\n qscore = args[0];\n args = args.slice(1);\n } else if (args.length === 7) {\n qscore = jStat.qscore(args[0], args[1], args[2], args[3], args[4]);\n args = args.slice(5);\n } else {\n qscore = jStat.qscore(args[0], args[1], args[2]);\n args = args.slice(3);\n }\n\n var n = args[0];\n var k = args[1];\n\n return 1 - jStat.tukey.cdf(qscore, k, n - k);\n },\n\n tukeyhsd: function tukeyhsd(arrays) {\n var sd = jStat.pooledstdev(arrays);\n var means = arrays.map(function (arr) {return jStat.mean(arr);});\n var n = arrays.reduce(function (n, arr) {return n + arr.length;}, 0);\n\n var results = [];\n for (var i = 0; i < arrays.length; ++i) {\n for (var j = i + 1; j < arrays.length; ++j) {\n var p = jStat.qtest(means[i], means[j], arrays[i].length, arrays[j].length, sd, n, arrays.length);\n results.push([[i, j], p]);\n }\n }\n\n return results;\n }\n});\n\n// Error Bounds\njStat.extend({\n // 2 different parameter setups\n // (value, alpha, sd, n)\n // (value, alpha, array)\n normalci: function normalci() {\n var args = slice.call(arguments),\n ans = new Array(2),\n change;\n if (args.length === 4) {\n change = Math.abs(jStat.normal.inv(args[1] / 2, 0, 1) *\n args[2] / Math.sqrt(args[3]));\n } else {\n change = Math.abs(jStat.normal.inv(args[1] / 2, 0, 1) *\n jStat.stdev(args[2]) / Math.sqrt(args[2].length));\n }\n ans[0] = args[0] - change;\n ans[1] = args[0] + change;\n return ans;\n },\n\n // 2 different parameter setups\n // (value, alpha, sd, n)\n // (value, alpha, array)\n tci: function tci() {\n var args = slice.call(arguments),\n ans = new Array(2),\n change;\n if (args.length === 4) {\n change = Math.abs(jStat.studentt.inv(args[1] / 2, args[3] - 1) *\n args[2] / Math.sqrt(args[3]));\n } else {\n change = Math.abs(jStat.studentt.inv(args[1] / 2, args[2].length - 1) *\n jStat.stdev(args[2], true) / Math.sqrt(args[2].length));\n }\n ans[0] = args[0] - change;\n ans[1] = args[0] + change;\n return ans;\n },\n\n significant: function significant(pvalue, alpha) {\n return pvalue < alpha;\n }\n});\n\njStat.extend(jStat.fn, {\n normalci: function normalci(value, alpha) {\n return jStat.normalci(value, alpha, this.toArray());\n },\n\n tci: function tci(value, alpha) {\n return jStat.tci(value, alpha, this.toArray());\n }\n});\n\n// internal method for calculating the z-score for a difference of proportions test\nfunction differenceOfProportions(p1, n1, p2, n2) {\n if (p1 > 1 || p2 > 1 || p1 <= 0 || p2 <= 0) {\n throw new Error(\"Proportions should be greater than 0 and less than 1\")\n }\n var pooled = (p1 * n1 + p2 * n2) / (n1 + n2);\n var se = Math.sqrt(pooled * (1 - pooled) * ((1/n1) + (1/n2)));\n return (p1 - p2) / se;\n}\n\n// Difference of Proportions\njStat.extend(jStat.fn, {\n oneSidedDifferenceOfProportions: function oneSidedDifferenceOfProportions(p1, n1, p2, n2) {\n var z = differenceOfProportions(p1, n1, p2, n2);\n return jStat.ztest(z, 1);\n },\n\n twoSidedDifferenceOfProportions: function twoSidedDifferenceOfProportions(p1, n1, p2, n2) {\n var z = differenceOfProportions(p1, n1, p2, n2);\n return jStat.ztest(z, 2);\n }\n});\n\n}(jStat, Math));\njStat.models = (function(){\n function sub_regress(exog) {\n var var_count = exog[0].length;\n var modelList = jStat.arange(var_count).map(function(endog_index) {\n var exog_index =\n jStat.arange(var_count).filter(function(i){return i!==endog_index});\n return ols(jStat.col(exog, endog_index).map(function(x){ return x[0] }),\n jStat.col(exog, exog_index))\n });\n return modelList;\n }\n\n // do OLS model regress\n // exog have include const columns ,it will not generate it .In fact, exog is\n // \"design matrix\" look at\n //https://en.wikipedia.org/wiki/Design_matrix\n function ols(endog, exog) {\n var nobs = endog.length;\n var df_model = exog[0].length - 1;\n var df_resid = nobs-df_model - 1;\n var coef = jStat.lstsq(exog, endog);\n var predict =\n jStat.multiply(exog, coef.map(function(x) { return [x] }))\n .map(function(p) { return p[0] });\n var resid = jStat.subtract(endog, predict);\n var ybar = jStat.mean(endog);\n // constant cause problem\n // var SST = jStat.sum(endog.map(function(y) {\n // return Math.pow(y-ybar,2);\n // }));\n var SSE = jStat.sum(predict.map(function(f) {\n return Math.pow(f - ybar, 2);\n }));\n var SSR = jStat.sum(endog.map(function(y, i) {\n return Math.pow(y - predict[i], 2);\n }));\n var SST = SSE + SSR;\n var R2 = (SSE / SST);\n return {\n exog:exog,\n endog:endog,\n nobs:nobs,\n df_model:df_model,\n df_resid:df_resid,\n coef:coef,\n predict:predict,\n resid:resid,\n ybar:ybar,\n SST:SST,\n SSE:SSE,\n SSR:SSR,\n R2:R2\n };\n }\n\n // H0: b_I=0\n // H1: b_I!=0\n function t_test(model) {\n var subModelList = sub_regress(model.exog);\n //var sigmaHat=jStat.stdev(model.resid);\n var sigmaHat = Math.sqrt(model.SSR / (model.df_resid));\n var seBetaHat = subModelList.map(function(mod) {\n var SST = mod.SST;\n var R2 = mod.R2;\n return sigmaHat / Math.sqrt(SST * (1 - R2));\n });\n var tStatistic = model.coef.map(function(coef, i) {\n return (coef - 0) / seBetaHat[i];\n });\n var pValue = tStatistic.map(function(t) {\n var leftppf = jStat.studentt.cdf(t, model.df_resid);\n return (leftppf > 0.5 ? 1 - leftppf : leftppf) * 2;\n });\n var c = jStat.studentt.inv(0.975, model.df_resid);\n var interval95 = model.coef.map(function(coef, i) {\n var d = c * seBetaHat[i];\n return [coef - d, coef + d];\n })\n return {\n se: seBetaHat,\n t: tStatistic,\n p: pValue,\n sigmaHat: sigmaHat,\n interval95: interval95\n };\n }\n\n function F_test(model) {\n var F_statistic =\n (model.R2 / model.df_model) / ((1 - model.R2) / model.df_resid);\n var fcdf = function(x, n1, n2) {\n return jStat.beta.cdf(x / (n2 / n1 + x), n1 / 2, n2 / 2)\n }\n var pvalue = 1 - fcdf(F_statistic, model.df_model, model.df_resid);\n return { F_statistic: F_statistic, pvalue: pvalue };\n }\n\n function ols_wrap(endog, exog) {\n var model = ols(endog,exog);\n var ttest = t_test(model);\n var ftest = F_test(model);\n // Provide the Wherry / Ezekiel / McNemar / Cohen Adjusted R^2\n // Which matches the 'adjusted R^2' provided by R's lm package\n var adjust_R2 =\n 1 - (1 - model.R2) * ((model.nobs - 1) / (model.df_resid));\n model.t = ttest;\n model.f = ftest;\n model.adjust_R2 = adjust_R2;\n return model;\n }\n\n return { ols: ols_wrap };\n})();\n//To regress, simply build X matrix\n//(append column of 1's) using\n//buildxmatrix and build the Y\n//matrix using buildymatrix\n//(simply the transpose)\n//and run regress.\n\n\n\n//Regressions\n\njStat.extend({\n buildxmatrix: function buildxmatrix(){\n //Parameters will be passed in as such\n //(array1,array2,array3,...)\n //as (x1,x2,x3,...)\n //needs to be (1,x1,x2,x3,...)\n var matrixRows = new Array(arguments.length);\n for(var i=0;i1){\n result = [];\n for (i = 0; i < A.rows(); i++) {\n result[i] = [];\n for (j = 0; j < B.cols(); j++) {\n sum = 0;\n for (k = 0; k < A.cols(); k++) {\n sum += A.toArray()[i][k] * B.toArray()[k][j];\n }\n result[i][j] = sum;\n }\n }\n return jStat(result);\n }\n result = [];\n for (i = 0; i < A.rows(); i++) {\n result[i] = [];\n for (j = 0; j < B.cols(); j++) {\n sum = 0;\n for (k = 0; k < A.cols(); k++) {\n sum += A.toArray()[i][k] * B.toArray()[j];\n }\n result[i][j] = sum;\n }\n }\n return jStat(result);\n }\n },\n\n //regress and regresst to be fixed\n\n regress: function regress(jMatX,jMatY){\n //print(\"regressin!\");\n //print(jMatX.toArray());\n var innerinv = jStat.xtranspxinv(jMatX);\n //print(innerinv);\n var xtransp = jMatX.transpose();\n var next = jStat.matrixmult(jStat(innerinv),xtransp);\n return jStat.matrixmult(next,jMatY);\n\n },\n\n regresst: function regresst(jMatX,jMatY,sides){\n var beta = jStat.regress(jMatX,jMatY);\n\n var compile = {};\n compile.anova = {};\n var jMatYBar = jStat.jMatYBar(jMatX, beta);\n compile.yBar = jMatYBar;\n var yAverage = jMatY.mean();\n compile.anova.residuals = jStat.residuals(jMatY, jMatYBar);\n\n compile.anova.ssr = jStat.ssr(jMatYBar, yAverage);\n compile.anova.msr = compile.anova.ssr / (jMatX[0].length - 1);\n\n compile.anova.sse = jStat.sse(jMatY, jMatYBar);\n compile.anova.mse =\n compile.anova.sse / (jMatY.length - (jMatX[0].length - 1) - 1);\n\n compile.anova.sst = jStat.sst(jMatY, yAverage);\n compile.anova.mst = compile.anova.sst / (jMatY.length - 1);\n\n compile.anova.r2 = 1 - (compile.anova.sse / compile.anova.sst);\n if (compile.anova.r2 < 0) compile.anova.r2 = 0;\n\n compile.anova.fratio = compile.anova.msr / compile.anova.mse;\n compile.anova.pvalue =\n jStat.anovaftest(compile.anova.fratio,\n jMatX[0].length - 1,\n jMatY.length - (jMatX[0].length - 1) - 1);\n\n compile.anova.rmse = Math.sqrt(compile.anova.mse);\n\n compile.anova.r2adj = 1 - (compile.anova.mse / compile.anova.mst);\n if (compile.anova.r2adj < 0) compile.anova.r2adj = 0;\n\n compile.stats = new Array(jMatX[0].length);\n var covar = jStat.xtranspxinv(jMatX);\n var sds, ts, ps;\n\n for(var i=0; i Occurrence Index bitmap.\n// YYYY -> DSL Method Type bitmap.\n// ZZZZZZZZZZZZZZZ -> Rule short Index bitmap.\n// TTTTTTTTT -> alternation alternative index bitmap\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getKeyForAutomaticLookahead = exports.AT_LEAST_ONE_SEP_IDX = exports.MANY_SEP_IDX = exports.AT_LEAST_ONE_IDX = exports.MANY_IDX = exports.OPTION_IDX = exports.OR_IDX = exports.BITS_FOR_ALT_IDX = exports.BITS_FOR_RULE_IDX = exports.BITS_FOR_OCCURRENCE_IDX = exports.BITS_FOR_METHOD_TYPE = void 0;\nexports.BITS_FOR_METHOD_TYPE = 4;\nexports.BITS_FOR_OCCURRENCE_IDX = 8;\nexports.BITS_FOR_RULE_IDX = 12;\n// TODO: validation, this means that there may at most 2^8 --> 256 alternatives for an alternation.\nexports.BITS_FOR_ALT_IDX = 8;\n// short string used as part of mapping keys.\n// being short improves the performance when composing KEYS for maps out of these\n// The 5 - 8 bits (16 possible values, are reserved for the DSL method indices)\nexports.OR_IDX = 1 << exports.BITS_FOR_OCCURRENCE_IDX;\nexports.OPTION_IDX = 2 << exports.BITS_FOR_OCCURRENCE_IDX;\nexports.MANY_IDX = 3 << exports.BITS_FOR_OCCURRENCE_IDX;\nexports.AT_LEAST_ONE_IDX = 4 << exports.BITS_FOR_OCCURRENCE_IDX;\nexports.MANY_SEP_IDX = 5 << exports.BITS_FOR_OCCURRENCE_IDX;\nexports.AT_LEAST_ONE_SEP_IDX = 6 << exports.BITS_FOR_OCCURRENCE_IDX;\n// this actually returns a number, but it is always used as a string (object prop key)\nfunction getKeyForAutomaticLookahead(ruleIdx, dslMethodIdx, occurrence) {\n return occurrence | dslMethodIdx | ruleIdx;\n}\nexports.getKeyForAutomaticLookahead = getKeyForAutomaticLookahead;\nvar BITS_START_FOR_ALT_IDX = 32 - exports.BITS_FOR_ALT_IDX;\n//# sourceMappingURL=keys.js.map","var Stack = require('./_Stack'),\n equalArrays = require('./_equalArrays'),\n equalByTag = require('./_equalByTag'),\n equalObjects = require('./_equalObjects'),\n getTag = require('./_getTag'),\n isArray = require('./isArray'),\n isBuffer = require('./isBuffer'),\n isTypedArray = require('./isTypedArray');\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1;\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n arrayTag = '[object Array]',\n objectTag = '[object Object]';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * A specialized version of `baseIsEqual` for arrays and objects which performs\n * deep comparisons and tracks traversed objects enabling objects with circular\n * references to be compared.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} [stack] Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) {\n var objIsArr = isArray(object),\n othIsArr = isArray(other),\n objTag = objIsArr ? arrayTag : getTag(object),\n othTag = othIsArr ? arrayTag : getTag(other);\n\n objTag = objTag == argsTag ? objectTag : objTag;\n othTag = othTag == argsTag ? objectTag : othTag;\n\n var objIsObj = objTag == objectTag,\n othIsObj = othTag == objectTag,\n isSameTag = objTag == othTag;\n\n if (isSameTag && isBuffer(object)) {\n if (!isBuffer(other)) {\n return false;\n }\n objIsArr = true;\n objIsObj = false;\n }\n if (isSameTag && !objIsObj) {\n stack || (stack = new Stack);\n return (objIsArr || isTypedArray(object))\n ? equalArrays(object, other, bitmask, customizer, equalFunc, stack)\n : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack);\n }\n if (!(bitmask & COMPARE_PARTIAL_FLAG)) {\n var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),\n othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');\n\n if (objIsWrapped || othIsWrapped) {\n var objUnwrapped = objIsWrapped ? object.value() : object,\n othUnwrapped = othIsWrapped ? other.value() : other;\n\n stack || (stack = new Stack);\n return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack);\n }\n }\n if (!isSameTag) {\n return false;\n }\n stack || (stack = new Stack);\n return equalObjects(object, other, bitmask, customizer, equalFunc, stack);\n}\n\nmodule.exports = baseIsEqualDeep;\n","var baseIsTypedArray = require('./_baseIsTypedArray'),\n baseUnary = require('./_baseUnary'),\n nodeUtil = require('./_nodeUtil');\n\n/* Node.js helper references. */\nvar nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;\n\n/**\n * Checks if `value` is classified as a typed array.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n * @example\n *\n * _.isTypedArray(new Uint8Array);\n * // => true\n *\n * _.isTypedArray([]);\n * // => false\n */\nvar isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;\n\nmodule.exports = isTypedArray;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.applyMixins = void 0;\nfunction applyMixins(derivedCtor, baseCtors) {\n baseCtors.forEach(function (baseCtor) {\n var baseProto = baseCtor.prototype;\n Object.getOwnPropertyNames(baseProto).forEach(function (propName) {\n if (propName === \"constructor\") {\n return;\n }\n var basePropDescriptor = Object.getOwnPropertyDescriptor(baseProto, propName);\n // Handle Accessors\n if (basePropDescriptor &&\n (basePropDescriptor.get || basePropDescriptor.set)) {\n Object.defineProperty(derivedCtor.prototype, propName, basePropDescriptor);\n }\n else {\n derivedCtor.prototype[propName] = baseCtor.prototype[propName];\n }\n });\n });\n}\nexports.applyMixins = applyMixins;\n//# sourceMappingURL=apply_mixins.js.map","/**\n * A specialized version of `matchesProperty` for source values suitable\n * for strict equality comparisons, i.e. `===`.\n *\n * @private\n * @param {string} key The key of the property to get.\n * @param {*} srcValue The value to match.\n * @returns {Function} Returns the new spec function.\n */\nfunction matchesStrictComparable(key, srcValue) {\n return function(object) {\n if (object == null) {\n return false;\n }\n return object[key] === srcValue &&\n (srcValue !== undefined || (key in Object(object)));\n };\n}\n\nmodule.exports = matchesStrictComparable;\n","var cloneArrayBuffer = require('./_cloneArrayBuffer'),\n cloneDataView = require('./_cloneDataView'),\n cloneRegExp = require('./_cloneRegExp'),\n cloneSymbol = require('./_cloneSymbol'),\n cloneTypedArray = require('./_cloneTypedArray');\n\n/** `Object#toString` result references. */\nvar boolTag = '[object Boolean]',\n dateTag = '[object Date]',\n mapTag = '[object Map]',\n numberTag = '[object Number]',\n regexpTag = '[object RegExp]',\n setTag = '[object Set]',\n stringTag = '[object String]',\n symbolTag = '[object Symbol]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n dataViewTag = '[object DataView]',\n float32Tag = '[object Float32Array]',\n float64Tag = '[object Float64Array]',\n int8Tag = '[object Int8Array]',\n int16Tag = '[object Int16Array]',\n int32Tag = '[object Int32Array]',\n uint8Tag = '[object Uint8Array]',\n uint8ClampedTag = '[object Uint8ClampedArray]',\n uint16Tag = '[object Uint16Array]',\n uint32Tag = '[object Uint32Array]';\n\n/**\n * Initializes an object clone based on its `toStringTag`.\n *\n * **Note:** This function only supports cloning values with tags of\n * `Boolean`, `Date`, `Error`, `Map`, `Number`, `RegExp`, `Set`, or `String`.\n *\n * @private\n * @param {Object} object The object to clone.\n * @param {string} tag The `toStringTag` of the object to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the initialized clone.\n */\nfunction initCloneByTag(object, tag, isDeep) {\n var Ctor = object.constructor;\n switch (tag) {\n case arrayBufferTag:\n return cloneArrayBuffer(object);\n\n case boolTag:\n case dateTag:\n return new Ctor(+object);\n\n case dataViewTag:\n return cloneDataView(object, isDeep);\n\n case float32Tag: case float64Tag:\n case int8Tag: case int16Tag: case int32Tag:\n case uint8Tag: case uint8ClampedTag: case uint16Tag: case uint32Tag:\n return cloneTypedArray(object, isDeep);\n\n case mapTag:\n return new Ctor;\n\n case numberTag:\n case stringTag:\n return new Ctor(object);\n\n case regexpTag:\n return cloneRegExp(object);\n\n case setTag:\n return new Ctor;\n\n case symbolTag:\n return cloneSymbol(object);\n }\n}\n\nmodule.exports = initCloneByTag;\n","\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.RecognizerEngine = void 0;\nvar isEmpty_1 = __importDefault(require(\"lodash/isEmpty\"));\nvar isArray_1 = __importDefault(require(\"lodash/isArray\"));\nvar flatten_1 = __importDefault(require(\"lodash/flatten\"));\nvar every_1 = __importDefault(require(\"lodash/every\"));\nvar uniq_1 = __importDefault(require(\"lodash/uniq\"));\nvar isObject_1 = __importDefault(require(\"lodash/isObject\"));\nvar has_1 = __importDefault(require(\"lodash/has\"));\nvar values_1 = __importDefault(require(\"lodash/values\"));\nvar reduce_1 = __importDefault(require(\"lodash/reduce\"));\nvar clone_1 = __importDefault(require(\"lodash/clone\"));\nvar keys_1 = require(\"../../grammar/keys\");\nvar exceptions_public_1 = require(\"../../exceptions_public\");\nvar lookahead_1 = require(\"../../grammar/lookahead\");\nvar interpreter_1 = require(\"../../grammar/interpreter\");\nvar parser_1 = require(\"../parser\");\nvar recoverable_1 = require(\"./recoverable\");\nvar tokens_public_1 = require(\"../../../scan/tokens_public\");\nvar tokens_1 = require(\"../../../scan/tokens\");\n/**\n * This trait is responsible for the runtime parsing engine\n * Used by the official API (recognizer_api.ts)\n */\nvar RecognizerEngine = /** @class */ (function () {\n function RecognizerEngine() {\n }\n RecognizerEngine.prototype.initRecognizerEngine = function (tokenVocabulary, config) {\n this.className = this.constructor.name;\n // TODO: would using an ES6 Map or plain object be faster (CST building scenario)\n this.shortRuleNameToFull = {};\n this.fullRuleNameToShort = {};\n this.ruleShortNameIdx = 256;\n this.tokenMatcher = tokens_1.tokenStructuredMatcherNoCategories;\n this.subruleIdx = 0;\n this.definedRulesNames = [];\n this.tokensMap = {};\n this.isBackTrackingStack = [];\n this.RULE_STACK = [];\n this.RULE_OCCURRENCE_STACK = [];\n this.gastProductionsCache = {};\n if ((0, has_1.default)(config, \"serializedGrammar\")) {\n throw Error(\"The Parser's configuration can no longer contain a property.\\n\" +\n \"\\tSee: https://chevrotain.io/docs/changes/BREAKING_CHANGES.html#_6-0-0\\n\" +\n \"\\tFor Further details.\");\n }\n if ((0, isArray_1.default)(tokenVocabulary)) {\n // This only checks for Token vocabularies provided as arrays.\n // That is good enough because the main objective is to detect users of pre-V4.0 APIs\n // rather than all edge cases of empty Token vocabularies.\n if ((0, isEmpty_1.default)(tokenVocabulary)) {\n throw Error(\"A Token Vocabulary cannot be empty.\\n\" +\n \"\\tNote that the first argument for the parser constructor\\n\" +\n \"\\tis no longer a Token vector (since v4.0).\");\n }\n if (typeof tokenVocabulary[0].startOffset === \"number\") {\n throw Error(\"The Parser constructor no longer accepts a token vector as the first argument.\\n\" +\n \"\\tSee: https://chevrotain.io/docs/changes/BREAKING_CHANGES.html#_4-0-0\\n\" +\n \"\\tFor Further details.\");\n }\n }\n if ((0, isArray_1.default)(tokenVocabulary)) {\n this.tokensMap = (0, reduce_1.default)(tokenVocabulary, function (acc, tokType) {\n acc[tokType.name] = tokType;\n return acc;\n }, {});\n }\n else if ((0, has_1.default)(tokenVocabulary, \"modes\") &&\n (0, every_1.default)((0, flatten_1.default)((0, values_1.default)(tokenVocabulary.modes)), tokens_1.isTokenType)) {\n var allTokenTypes_1 = (0, flatten_1.default)((0, values_1.default)(tokenVocabulary.modes));\n var uniqueTokens = (0, uniq_1.default)(allTokenTypes_1);\n this.tokensMap = (0, reduce_1.default)(uniqueTokens, function (acc, tokType) {\n acc[tokType.name] = tokType;\n return acc;\n }, {});\n }\n else if ((0, isObject_1.default)(tokenVocabulary)) {\n this.tokensMap = (0, clone_1.default)(tokenVocabulary);\n }\n else {\n throw new Error(\" argument must be An Array of Token constructors,\" +\n \" A dictionary of Token constructors or an IMultiModeLexerDefinition\");\n }\n // always add EOF to the tokenNames -> constructors map. it is useful to assure all the input has been\n // parsed with a clear error message (\"expecting EOF but found ...\")\n this.tokensMap[\"EOF\"] = tokens_public_1.EOF;\n var allTokenTypes = (0, has_1.default)(tokenVocabulary, \"modes\")\n ? (0, flatten_1.default)((0, values_1.default)(tokenVocabulary.modes))\n : (0, values_1.default)(tokenVocabulary);\n var noTokenCategoriesUsed = (0, every_1.default)(allTokenTypes, function (tokenConstructor) {\n return (0, isEmpty_1.default)(tokenConstructor.categoryMatches);\n });\n this.tokenMatcher = noTokenCategoriesUsed\n ? tokens_1.tokenStructuredMatcherNoCategories\n : tokens_1.tokenStructuredMatcher;\n // Because ES2015+ syntax should be supported for creating Token classes\n // We cannot assume that the Token classes were created using the \"extendToken\" utilities\n // Therefore we must augment the Token classes both on Lexer initialization and on Parser initialization\n (0, tokens_1.augmentTokenTypes)((0, values_1.default)(this.tokensMap));\n };\n RecognizerEngine.prototype.defineRule = function (ruleName, impl, config) {\n if (this.selfAnalysisDone) {\n throw Error(\"Grammar rule <\".concat(ruleName, \"> may not be defined after the 'performSelfAnalysis' method has been called'\\n\") +\n \"Make sure that all grammar rule definitions are done before 'performSelfAnalysis' is called.\");\n }\n var resyncEnabled = (0, has_1.default)(config, \"resyncEnabled\")\n ? config.resyncEnabled // assumes end user provides the correct config value/type\n : parser_1.DEFAULT_RULE_CONFIG.resyncEnabled;\n var recoveryValueFunc = (0, has_1.default)(config, \"recoveryValueFunc\")\n ? config.recoveryValueFunc // assumes end user provides the correct config value/type\n : parser_1.DEFAULT_RULE_CONFIG.recoveryValueFunc;\n // performance optimization: Use small integers as keys for the longer human readable \"full\" rule names.\n // this greatly improves Map access time (as much as 8% for some performance benchmarks).\n var shortName = this.ruleShortNameIdx << (keys_1.BITS_FOR_METHOD_TYPE + keys_1.BITS_FOR_OCCURRENCE_IDX);\n this.ruleShortNameIdx++;\n this.shortRuleNameToFull[shortName] = ruleName;\n this.fullRuleNameToShort[ruleName] = shortName;\n var invokeRuleWithTry;\n // Micro optimization, only check the condition **once** on rule definition\n // instead of **every single** rule invocation.\n if (this.outputCst === true) {\n invokeRuleWithTry = function invokeRuleWithTry() {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n try {\n this.ruleInvocationStateUpdate(shortName, ruleName, this.subruleIdx);\n impl.apply(this, args);\n var cst = this.CST_STACK[this.CST_STACK.length - 1];\n this.cstPostRule(cst);\n return cst;\n }\n catch (e) {\n return this.invokeRuleCatch(e, resyncEnabled, recoveryValueFunc);\n }\n finally {\n this.ruleFinallyStateUpdate();\n }\n };\n }\n else {\n invokeRuleWithTry = function invokeRuleWithTryCst() {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n try {\n this.ruleInvocationStateUpdate(shortName, ruleName, this.subruleIdx);\n return impl.apply(this, args);\n }\n catch (e) {\n return this.invokeRuleCatch(e, resyncEnabled, recoveryValueFunc);\n }\n finally {\n this.ruleFinallyStateUpdate();\n }\n };\n }\n var wrappedGrammarRule = Object.assign(invokeRuleWithTry, { ruleName: ruleName, originalGrammarAction: impl });\n return wrappedGrammarRule;\n };\n RecognizerEngine.prototype.invokeRuleCatch = function (e, resyncEnabledConfig, recoveryValueFunc) {\n var isFirstInvokedRule = this.RULE_STACK.length === 1;\n // note the reSync is always enabled for the first rule invocation, because we must always be able to\n // reSync with EOF and just output some INVALID ParseTree\n // during backtracking reSync recovery is disabled, otherwise we can't be certain the backtracking\n // path is really the most valid one\n var reSyncEnabled = resyncEnabledConfig && !this.isBackTracking() && this.recoveryEnabled;\n if ((0, exceptions_public_1.isRecognitionException)(e)) {\n var recogError = e;\n if (reSyncEnabled) {\n var reSyncTokType = this.findReSyncTokenType();\n if (this.isInCurrentRuleReSyncSet(reSyncTokType)) {\n recogError.resyncedTokens = this.reSyncTo(reSyncTokType);\n if (this.outputCst) {\n var partialCstResult = this.CST_STACK[this.CST_STACK.length - 1];\n partialCstResult.recoveredNode = true;\n return partialCstResult;\n }\n else {\n return recoveryValueFunc(e);\n }\n }\n else {\n if (this.outputCst) {\n var partialCstResult = this.CST_STACK[this.CST_STACK.length - 1];\n partialCstResult.recoveredNode = true;\n recogError.partialCstResult = partialCstResult;\n }\n // to be handled Further up the call stack\n throw recogError;\n }\n }\n else if (isFirstInvokedRule) {\n // otherwise a Redundant input error will be created as well and we cannot guarantee that this is indeed the case\n this.moveToTerminatedState();\n // the parser should never throw one of its own errors outside its flow.\n // even if error recovery is disabled\n return recoveryValueFunc(e);\n }\n else {\n // to be recovered Further up the call stack\n throw recogError;\n }\n }\n else {\n // some other Error type which we don't know how to handle (for example a built in JavaScript Error)\n throw e;\n }\n };\n // Implementation of parsing DSL\n RecognizerEngine.prototype.optionInternal = function (actionORMethodDef, occurrence) {\n var key = this.getKeyForAutomaticLookahead(keys_1.OPTION_IDX, occurrence);\n return this.optionInternalLogic(actionORMethodDef, occurrence, key);\n };\n RecognizerEngine.prototype.optionInternalLogic = function (actionORMethodDef, occurrence, key) {\n var _this = this;\n var lookAheadFunc = this.getLaFuncFromCache(key);\n var action;\n if (typeof actionORMethodDef !== \"function\") {\n action = actionORMethodDef.DEF;\n var predicate_1 = actionORMethodDef.GATE;\n // predicate present\n if (predicate_1 !== undefined) {\n var orgLookaheadFunction_1 = lookAheadFunc;\n lookAheadFunc = function () {\n return predicate_1.call(_this) && orgLookaheadFunction_1.call(_this);\n };\n }\n }\n else {\n action = actionORMethodDef;\n }\n if (lookAheadFunc.call(this) === true) {\n return action.call(this);\n }\n return undefined;\n };\n RecognizerEngine.prototype.atLeastOneInternal = function (prodOccurrence, actionORMethodDef) {\n var laKey = this.getKeyForAutomaticLookahead(keys_1.AT_LEAST_ONE_IDX, prodOccurrence);\n return this.atLeastOneInternalLogic(prodOccurrence, actionORMethodDef, laKey);\n };\n RecognizerEngine.prototype.atLeastOneInternalLogic = function (prodOccurrence, actionORMethodDef, key) {\n var _this = this;\n var lookAheadFunc = this.getLaFuncFromCache(key);\n var action;\n if (typeof actionORMethodDef !== \"function\") {\n action = actionORMethodDef.DEF;\n var predicate_2 = actionORMethodDef.GATE;\n // predicate present\n if (predicate_2 !== undefined) {\n var orgLookaheadFunction_2 = lookAheadFunc;\n lookAheadFunc = function () {\n return predicate_2.call(_this) && orgLookaheadFunction_2.call(_this);\n };\n }\n }\n else {\n action = actionORMethodDef;\n }\n if (lookAheadFunc.call(this) === true) {\n var notStuck = this.doSingleRepetition(action);\n while (lookAheadFunc.call(this) === true &&\n notStuck === true) {\n notStuck = this.doSingleRepetition(action);\n }\n }\n else {\n throw this.raiseEarlyExitException(prodOccurrence, lookahead_1.PROD_TYPE.REPETITION_MANDATORY, actionORMethodDef.ERR_MSG);\n }\n // note that while it may seem that this can cause an error because by using a recursive call to\n // AT_LEAST_ONE we change the grammar to AT_LEAST_TWO, AT_LEAST_THREE ... , the possible recursive call\n // from the tryInRepetitionRecovery(...) will only happen IFF there really are TWO/THREE/.... items.\n // Performance optimization: \"attemptInRepetitionRecovery\" will be defined as NOOP unless recovery is enabled\n this.attemptInRepetitionRecovery(this.atLeastOneInternal, [prodOccurrence, actionORMethodDef], lookAheadFunc, keys_1.AT_LEAST_ONE_IDX, prodOccurrence, interpreter_1.NextTerminalAfterAtLeastOneWalker);\n };\n RecognizerEngine.prototype.atLeastOneSepFirstInternal = function (prodOccurrence, options) {\n var laKey = this.getKeyForAutomaticLookahead(keys_1.AT_LEAST_ONE_SEP_IDX, prodOccurrence);\n this.atLeastOneSepFirstInternalLogic(prodOccurrence, options, laKey);\n };\n RecognizerEngine.prototype.atLeastOneSepFirstInternalLogic = function (prodOccurrence, options, key) {\n var _this = this;\n var action = options.DEF;\n var separator = options.SEP;\n var firstIterationLookaheadFunc = this.getLaFuncFromCache(key);\n // 1st iteration\n if (firstIterationLookaheadFunc.call(this) === true) {\n ;\n action.call(this);\n // TODO: Optimization can move this function construction into \"attemptInRepetitionRecovery\"\n // because it is only needed in error recovery scenarios.\n var separatorLookAheadFunc = function () {\n return _this.tokenMatcher(_this.LA(1), separator);\n };\n // 2nd..nth iterations\n while (this.tokenMatcher(this.LA(1), separator) === true) {\n // note that this CONSUME will never enter recovery because\n // the separatorLookAheadFunc checks that the separator really does exist.\n this.CONSUME(separator);\n action.call(this);\n }\n // Performance optimization: \"attemptInRepetitionRecovery\" will be defined as NOOP unless recovery is enabled\n this.attemptInRepetitionRecovery(this.repetitionSepSecondInternal, [\n prodOccurrence,\n separator,\n separatorLookAheadFunc,\n action,\n interpreter_1.NextTerminalAfterAtLeastOneSepWalker\n ], separatorLookAheadFunc, keys_1.AT_LEAST_ONE_SEP_IDX, prodOccurrence, interpreter_1.NextTerminalAfterAtLeastOneSepWalker);\n }\n else {\n throw this.raiseEarlyExitException(prodOccurrence, lookahead_1.PROD_TYPE.REPETITION_MANDATORY_WITH_SEPARATOR, options.ERR_MSG);\n }\n };\n RecognizerEngine.prototype.manyInternal = function (prodOccurrence, actionORMethodDef) {\n var laKey = this.getKeyForAutomaticLookahead(keys_1.MANY_IDX, prodOccurrence);\n return this.manyInternalLogic(prodOccurrence, actionORMethodDef, laKey);\n };\n RecognizerEngine.prototype.manyInternalLogic = function (prodOccurrence, actionORMethodDef, key) {\n var _this = this;\n var lookaheadFunction = this.getLaFuncFromCache(key);\n var action;\n if (typeof actionORMethodDef !== \"function\") {\n action = actionORMethodDef.DEF;\n var predicate_3 = actionORMethodDef.GATE;\n // predicate present\n if (predicate_3 !== undefined) {\n var orgLookaheadFunction_3 = lookaheadFunction;\n lookaheadFunction = function () {\n return predicate_3.call(_this) && orgLookaheadFunction_3.call(_this);\n };\n }\n }\n else {\n action = actionORMethodDef;\n }\n var notStuck = true;\n while (lookaheadFunction.call(this) === true && notStuck === true) {\n notStuck = this.doSingleRepetition(action);\n }\n // Performance optimization: \"attemptInRepetitionRecovery\" will be defined as NOOP unless recovery is enabled\n this.attemptInRepetitionRecovery(this.manyInternal, [prodOccurrence, actionORMethodDef], lookaheadFunction, keys_1.MANY_IDX, prodOccurrence, interpreter_1.NextTerminalAfterManyWalker, \n // The notStuck parameter is only relevant when \"attemptInRepetitionRecovery\"\n // is invoked from manyInternal, in the MANY_SEP case and AT_LEAST_ONE[_SEP]\n // An infinite loop cannot occur as:\n // - Either the lookahead is guaranteed to consume something (Single Token Separator)\n // - AT_LEAST_ONE by definition is guaranteed to consume something (or error out).\n notStuck);\n };\n RecognizerEngine.prototype.manySepFirstInternal = function (prodOccurrence, options) {\n var laKey = this.getKeyForAutomaticLookahead(keys_1.MANY_SEP_IDX, prodOccurrence);\n this.manySepFirstInternalLogic(prodOccurrence, options, laKey);\n };\n RecognizerEngine.prototype.manySepFirstInternalLogic = function (prodOccurrence, options, key) {\n var _this = this;\n var action = options.DEF;\n var separator = options.SEP;\n var firstIterationLaFunc = this.getLaFuncFromCache(key);\n // 1st iteration\n if (firstIterationLaFunc.call(this) === true) {\n action.call(this);\n var separatorLookAheadFunc = function () {\n return _this.tokenMatcher(_this.LA(1), separator);\n };\n // 2nd..nth iterations\n while (this.tokenMatcher(this.LA(1), separator) === true) {\n // note that this CONSUME will never enter recovery because\n // the separatorLookAheadFunc checks that the separator really does exist.\n this.CONSUME(separator);\n // No need for checking infinite loop here due to consuming the separator.\n action.call(this);\n }\n // Performance optimization: \"attemptInRepetitionRecovery\" will be defined as NOOP unless recovery is enabled\n this.attemptInRepetitionRecovery(this.repetitionSepSecondInternal, [\n prodOccurrence,\n separator,\n separatorLookAheadFunc,\n action,\n interpreter_1.NextTerminalAfterManySepWalker\n ], separatorLookAheadFunc, keys_1.MANY_SEP_IDX, prodOccurrence, interpreter_1.NextTerminalAfterManySepWalker);\n }\n };\n RecognizerEngine.prototype.repetitionSepSecondInternal = function (prodOccurrence, separator, separatorLookAheadFunc, action, nextTerminalAfterWalker) {\n while (separatorLookAheadFunc()) {\n // note that this CONSUME will never enter recovery because\n // the separatorLookAheadFunc checks that the separator really does exist.\n this.CONSUME(separator);\n action.call(this);\n }\n // we can only arrive to this function after an error\n // has occurred (hence the name 'second') so the following\n // IF will always be entered, its possible to remove it...\n // however it is kept to avoid confusion and be consistent.\n // Performance optimization: \"attemptInRepetitionRecovery\" will be defined as NOOP unless recovery is enabled\n /* istanbul ignore else */\n this.attemptInRepetitionRecovery(this.repetitionSepSecondInternal, [\n prodOccurrence,\n separator,\n separatorLookAheadFunc,\n action,\n nextTerminalAfterWalker\n ], separatorLookAheadFunc, keys_1.AT_LEAST_ONE_SEP_IDX, prodOccurrence, nextTerminalAfterWalker);\n };\n RecognizerEngine.prototype.doSingleRepetition = function (action) {\n var beforeIteration = this.getLexerPosition();\n action.call(this);\n var afterIteration = this.getLexerPosition();\n // This boolean will indicate if this repetition progressed\n // or if we are \"stuck\" (potential infinite loop in the repetition).\n return afterIteration > beforeIteration;\n };\n RecognizerEngine.prototype.orInternal = function (altsOrOpts, occurrence) {\n var laKey = this.getKeyForAutomaticLookahead(keys_1.OR_IDX, occurrence);\n var alts = (0, isArray_1.default)(altsOrOpts) ? altsOrOpts : altsOrOpts.DEF;\n var laFunc = this.getLaFuncFromCache(laKey);\n var altIdxToTake = laFunc.call(this, alts);\n if (altIdxToTake !== undefined) {\n var chosenAlternative = alts[altIdxToTake];\n return chosenAlternative.ALT.call(this);\n }\n this.raiseNoAltException(occurrence, altsOrOpts.ERR_MSG);\n };\n RecognizerEngine.prototype.ruleFinallyStateUpdate = function () {\n this.RULE_STACK.pop();\n this.RULE_OCCURRENCE_STACK.pop();\n // NOOP when cst is disabled\n this.cstFinallyStateUpdate();\n if (this.RULE_STACK.length === 0 && this.isAtEndOfInput() === false) {\n var firstRedundantTok = this.LA(1);\n var errMsg = this.errorMessageProvider.buildNotAllInputParsedMessage({\n firstRedundant: firstRedundantTok,\n ruleName: this.getCurrRuleFullName()\n });\n this.SAVE_ERROR(new exceptions_public_1.NotAllInputParsedException(errMsg, firstRedundantTok));\n }\n };\n RecognizerEngine.prototype.subruleInternal = function (ruleToCall, idx, options) {\n var ruleResult;\n try {\n var args = options !== undefined ? options.ARGS : undefined;\n this.subruleIdx = idx;\n ruleResult = ruleToCall.apply(this, args);\n this.cstPostNonTerminal(ruleResult, options !== undefined && options.LABEL !== undefined\n ? options.LABEL\n : ruleToCall.ruleName);\n return ruleResult;\n }\n catch (e) {\n throw this.subruleInternalError(e, options, ruleToCall.ruleName);\n }\n };\n RecognizerEngine.prototype.subruleInternalError = function (e, options, ruleName) {\n if ((0, exceptions_public_1.isRecognitionException)(e) && e.partialCstResult !== undefined) {\n this.cstPostNonTerminal(e.partialCstResult, options !== undefined && options.LABEL !== undefined\n ? options.LABEL\n : ruleName);\n delete e.partialCstResult;\n }\n throw e;\n };\n RecognizerEngine.prototype.consumeInternal = function (tokType, idx, options) {\n var consumedToken;\n try {\n var nextToken = this.LA(1);\n if (this.tokenMatcher(nextToken, tokType) === true) {\n this.consumeToken();\n consumedToken = nextToken;\n }\n else {\n this.consumeInternalError(tokType, nextToken, options);\n }\n }\n catch (eFromConsumption) {\n consumedToken = this.consumeInternalRecovery(tokType, idx, eFromConsumption);\n }\n this.cstPostTerminal(options !== undefined && options.LABEL !== undefined\n ? options.LABEL\n : tokType.name, consumedToken);\n return consumedToken;\n };\n RecognizerEngine.prototype.consumeInternalError = function (tokType, nextToken, options) {\n var msg;\n var previousToken = this.LA(0);\n if (options !== undefined && options.ERR_MSG) {\n msg = options.ERR_MSG;\n }\n else {\n msg = this.errorMessageProvider.buildMismatchTokenMessage({\n expected: tokType,\n actual: nextToken,\n previous: previousToken,\n ruleName: this.getCurrRuleFullName()\n });\n }\n throw this.SAVE_ERROR(new exceptions_public_1.MismatchedTokenException(msg, nextToken, previousToken));\n };\n RecognizerEngine.prototype.consumeInternalRecovery = function (tokType, idx, eFromConsumption) {\n // no recovery allowed during backtracking, otherwise backtracking may recover invalid syntax and accept it\n // but the original syntax could have been parsed successfully without any backtracking + recovery\n if (this.recoveryEnabled &&\n // TODO: more robust checking of the exception type. Perhaps Typescript extending expressions?\n eFromConsumption.name === \"MismatchedTokenException\" &&\n !this.isBackTracking()) {\n var follows = this.getFollowsForInRuleRecovery(tokType, idx);\n try {\n return this.tryInRuleRecovery(tokType, follows);\n }\n catch (eFromInRuleRecovery) {\n if (eFromInRuleRecovery.name === recoverable_1.IN_RULE_RECOVERY_EXCEPTION) {\n // failed in RuleRecovery.\n // throw the original error in order to trigger reSync error recovery\n throw eFromConsumption;\n }\n else {\n throw eFromInRuleRecovery;\n }\n }\n }\n else {\n throw eFromConsumption;\n }\n };\n RecognizerEngine.prototype.saveRecogState = function () {\n // errors is a getter which will clone the errors array\n var savedErrors = this.errors;\n var savedRuleStack = (0, clone_1.default)(this.RULE_STACK);\n return {\n errors: savedErrors,\n lexerState: this.exportLexerState(),\n RULE_STACK: savedRuleStack,\n CST_STACK: this.CST_STACK\n };\n };\n RecognizerEngine.prototype.reloadRecogState = function (newState) {\n this.errors = newState.errors;\n this.importLexerState(newState.lexerState);\n this.RULE_STACK = newState.RULE_STACK;\n };\n RecognizerEngine.prototype.ruleInvocationStateUpdate = function (shortName, fullName, idxInCallingRule) {\n this.RULE_OCCURRENCE_STACK.push(idxInCallingRule);\n this.RULE_STACK.push(shortName);\n // NOOP when cst is disabled\n this.cstInvocationStateUpdate(fullName);\n };\n RecognizerEngine.prototype.isBackTracking = function () {\n return this.isBackTrackingStack.length !== 0;\n };\n RecognizerEngine.prototype.getCurrRuleFullName = function () {\n var shortName = this.getLastExplicitRuleShortName();\n return this.shortRuleNameToFull[shortName];\n };\n RecognizerEngine.prototype.shortRuleNameToFullName = function (shortName) {\n return this.shortRuleNameToFull[shortName];\n };\n RecognizerEngine.prototype.isAtEndOfInput = function () {\n return this.tokenMatcher(this.LA(1), tokens_public_1.EOF);\n };\n RecognizerEngine.prototype.reset = function () {\n this.resetLexerState();\n this.subruleIdx = 0;\n this.isBackTrackingStack = [];\n this.errors = [];\n this.RULE_STACK = [];\n // TODO: extract a specific reset for TreeBuilder trait\n this.CST_STACK = [];\n this.RULE_OCCURRENCE_STACK = [];\n };\n return RecognizerEngine;\n}());\nexports.RecognizerEngine = RecognizerEngine;\n//# sourceMappingURL=recognizer_engine.js.map","var ListCache = require('./_ListCache'),\n stackClear = require('./_stackClear'),\n stackDelete = require('./_stackDelete'),\n stackGet = require('./_stackGet'),\n stackHas = require('./_stackHas'),\n stackSet = require('./_stackSet');\n\n/**\n * Creates a stack cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Stack(entries) {\n var data = this.__data__ = new ListCache(entries);\n this.size = data.size;\n}\n\n// Add methods to `Stack`.\nStack.prototype.clear = stackClear;\nStack.prototype['delete'] = stackDelete;\nStack.prototype.get = stackGet;\nStack.prototype.has = stackHas;\nStack.prototype.set = stackSet;\n\nmodule.exports = Stack;\n","/**\n * The base implementation of `_.property` without support for deep paths.\n *\n * @private\n * @param {string} key The key of the property to get.\n * @returns {Function} Returns the new accessor function.\n */\nfunction baseProperty(key) {\n return function(object) {\n return object == null ? undefined : object[key];\n };\n}\n\nmodule.exports = baseProperty;\n","var arrayLikeKeys = require('./_arrayLikeKeys'),\n baseKeysIn = require('./_baseKeysIn'),\n isArrayLike = require('./isArrayLike');\n\n/**\n * Creates an array of the own and inherited enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keysIn(new Foo);\n * // => ['a', 'b', 'c'] (iteration order is not guaranteed)\n */\nfunction keysIn(object) {\n return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object);\n}\n\nmodule.exports = keysIn;\n","var baseGet = require('./_baseGet');\n\n/**\n * A specialized version of `baseProperty` which supports deep paths.\n *\n * @private\n * @param {Array|string} path The path of the property to get.\n * @returns {Function} Returns the new accessor function.\n */\nfunction basePropertyDeep(path) {\n return function(object) {\n return baseGet(object, path);\n };\n}\n\nmodule.exports = basePropertyDeep;\n","/**\n * A specialized version of `_.every` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {boolean} Returns `true` if all elements pass the predicate check,\n * else `false`.\n */\nfunction arrayEvery(array, predicate) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n while (++index < length) {\n if (!predicate(array[index], index, array)) {\n return false;\n }\n }\n return true;\n}\n\nmodule.exports = arrayEvery;\n","var coreJsData = require('./_coreJsData');\n\n/** Used to detect methods masquerading as native. */\nvar maskSrcKey = (function() {\n var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');\n return uid ? ('Symbol(src)_1.' + uid) : '';\n}());\n\n/**\n * Checks if `func` has its source masked.\n *\n * @private\n * @param {Function} func The function to check.\n * @returns {boolean} Returns `true` if `func` is masked, else `false`.\n */\nfunction isMasked(func) {\n return !!maskSrcKey && (maskSrcKey in func);\n}\n\nmodule.exports = isMasked;\n","/**\n * The base implementation of `_.unary` without support for storing metadata.\n *\n * @private\n * @param {Function} func The function to cap arguments for.\n * @returns {Function} Returns the new capped function.\n */\nfunction baseUnary(func) {\n return function(value) {\n return func(value);\n };\n}\n\nmodule.exports = baseUnary;\n","var baseFlatten = require('./_baseFlatten'),\n map = require('./map');\n\n/**\n * Creates a flattened array of values by running each element in `collection`\n * thru `iteratee` and flattening the mapped results. The iteratee is invoked\n * with three arguments: (value, index|key, collection).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the new flattened array.\n * @example\n *\n * function duplicate(n) {\n * return [n, n];\n * }\n *\n * _.flatMap([1, 2], duplicate);\n * // => [1, 1, 2, 2]\n */\nfunction flatMap(collection, iteratee) {\n return baseFlatten(map(collection, iteratee), 1);\n}\n\nmodule.exports = flatMap;\n","var createFind = require('./_createFind'),\n findIndex = require('./findIndex');\n\n/**\n * Iterates over elements of `collection`, returning the first element\n * `predicate` returns truthy for. The predicate is invoked with three\n * arguments: (value, index|key, collection).\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to inspect.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @param {number} [fromIndex=0] The index to search from.\n * @returns {*} Returns the matched element, else `undefined`.\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'age': 36, 'active': true },\n * { 'user': 'fred', 'age': 40, 'active': false },\n * { 'user': 'pebbles', 'age': 1, 'active': true }\n * ];\n *\n * _.find(users, function(o) { return o.age < 40; });\n * // => object for 'barney'\n *\n * // The `_.matches` iteratee shorthand.\n * _.find(users, { 'age': 1, 'active': true });\n * // => object for 'pebbles'\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.find(users, ['active', false]);\n * // => object for 'fred'\n *\n * // The `_.property` iteratee shorthand.\n * _.find(users, 'active');\n * // => object for 'barney'\n */\nvar find = createFind(findIndex);\n\nmodule.exports = find;\n","/**\n * Creates a function that returns `value`.\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Util\n * @param {*} value The value to return from the new function.\n * @returns {Function} Returns the new constant function.\n * @example\n *\n * var objects = _.times(2, _.constant({ 'a': 1 }));\n *\n * console.log(objects);\n * // => [{ 'a': 1 }, { 'a': 1 }]\n *\n * console.log(objects[0] === objects[1]);\n * // => true\n */\nfunction constant(value) {\n return function() {\n return value;\n };\n}\n\nmodule.exports = constant;\n","var toNumber = require('./toNumber');\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0,\n MAX_INTEGER = 1.7976931348623157e+308;\n\n/**\n * Converts `value` to a finite number.\n *\n * @static\n * @memberOf _\n * @since 4.12.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {number} Returns the converted number.\n * @example\n *\n * _.toFinite(3.2);\n * // => 3.2\n *\n * _.toFinite(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toFinite(Infinity);\n * // => 1.7976931348623157e+308\n *\n * _.toFinite('3.2');\n * // => 3.2\n */\nfunction toFinite(value) {\n if (!value) {\n return value === 0 ? value : 0;\n }\n value = toNumber(value);\n if (value === INFINITY || value === -INFINITY) {\n var sign = (value < 0 ? -1 : 1);\n return sign * MAX_INTEGER;\n }\n return value === value ? value : 0;\n}\n\nmodule.exports = toFinite;\n","var baseGet = require('./_baseGet'),\n baseSet = require('./_baseSet'),\n castPath = require('./_castPath');\n\n/**\n * The base implementation of `_.pickBy` without support for iteratee shorthands.\n *\n * @private\n * @param {Object} object The source object.\n * @param {string[]} paths The property paths to pick.\n * @param {Function} predicate The function invoked per property.\n * @returns {Object} Returns the new object.\n */\nfunction basePickBy(object, paths, predicate) {\n var index = -1,\n length = paths.length,\n result = {};\n\n while (++index < length) {\n var path = paths[index],\n value = baseGet(object, path);\n\n if (predicate(value, path)) {\n baseSet(result, castPath(path, object), value);\n }\n }\n return result;\n}\n\nmodule.exports = basePickBy;\n","var castPath = require('./_castPath'),\n toKey = require('./_toKey');\n\n/**\n * The base implementation of `_.get` without support for default values.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @returns {*} Returns the resolved value.\n */\nfunction baseGet(object, path) {\n path = castPath(path, object);\n\n var index = 0,\n length = path.length;\n\n while (object != null && index < length) {\n object = object[toKey(path[index++])];\n }\n return (index && index == length) ? object : undefined;\n}\n\nmodule.exports = baseGet;\n","\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.TreeBuilder = void 0;\nvar cst_1 = require(\"../../cst/cst\");\nvar noop_1 = __importDefault(require(\"lodash/noop\"));\nvar has_1 = __importDefault(require(\"lodash/has\"));\nvar keys_1 = __importDefault(require(\"lodash/keys\"));\nvar isUndefined_1 = __importDefault(require(\"lodash/isUndefined\"));\nvar cst_visitor_1 = require(\"../../cst/cst_visitor\");\nvar parser_1 = require(\"../parser\");\n/**\n * This trait is responsible for the CST building logic.\n */\nvar TreeBuilder = /** @class */ (function () {\n function TreeBuilder() {\n }\n TreeBuilder.prototype.initTreeBuilder = function (config) {\n this.CST_STACK = [];\n // outputCst is no longer exposed/defined in the pubic API\n this.outputCst = config.outputCst;\n this.nodeLocationTracking = (0, has_1.default)(config, \"nodeLocationTracking\")\n ? config.nodeLocationTracking // assumes end user provides the correct config value/type\n : parser_1.DEFAULT_PARSER_CONFIG.nodeLocationTracking;\n if (!this.outputCst) {\n this.cstInvocationStateUpdate = noop_1.default;\n this.cstFinallyStateUpdate = noop_1.default;\n this.cstPostTerminal = noop_1.default;\n this.cstPostNonTerminal = noop_1.default;\n this.cstPostRule = noop_1.default;\n }\n else {\n if (/full/i.test(this.nodeLocationTracking)) {\n if (this.recoveryEnabled) {\n this.setNodeLocationFromToken = cst_1.setNodeLocationFull;\n this.setNodeLocationFromNode = cst_1.setNodeLocationFull;\n this.cstPostRule = noop_1.default;\n this.setInitialNodeLocation = this.setInitialNodeLocationFullRecovery;\n }\n else {\n this.setNodeLocationFromToken = noop_1.default;\n this.setNodeLocationFromNode = noop_1.default;\n this.cstPostRule = this.cstPostRuleFull;\n this.setInitialNodeLocation = this.setInitialNodeLocationFullRegular;\n }\n }\n else if (/onlyOffset/i.test(this.nodeLocationTracking)) {\n if (this.recoveryEnabled) {\n this.setNodeLocationFromToken = cst_1.setNodeLocationOnlyOffset;\n this.setNodeLocationFromNode = cst_1.setNodeLocationOnlyOffset;\n this.cstPostRule = noop_1.default;\n this.setInitialNodeLocation =\n this.setInitialNodeLocationOnlyOffsetRecovery;\n }\n else {\n this.setNodeLocationFromToken = noop_1.default;\n this.setNodeLocationFromNode = noop_1.default;\n this.cstPostRule = this.cstPostRuleOnlyOffset;\n this.setInitialNodeLocation =\n this.setInitialNodeLocationOnlyOffsetRegular;\n }\n }\n else if (/none/i.test(this.nodeLocationTracking)) {\n this.setNodeLocationFromToken = noop_1.default;\n this.setNodeLocationFromNode = noop_1.default;\n this.cstPostRule = noop_1.default;\n this.setInitialNodeLocation = noop_1.default;\n }\n else {\n throw Error(\"Invalid config option: \\\"\".concat(config.nodeLocationTracking, \"\\\"\"));\n }\n }\n };\n TreeBuilder.prototype.setInitialNodeLocationOnlyOffsetRecovery = function (cstNode) {\n cstNode.location = {\n startOffset: NaN,\n endOffset: NaN\n };\n };\n TreeBuilder.prototype.setInitialNodeLocationOnlyOffsetRegular = function (cstNode) {\n cstNode.location = {\n // without error recovery the starting Location of a new CstNode is guaranteed\n // To be the next Token's startOffset (for valid inputs).\n // For invalid inputs there won't be any CSTOutput so this potential\n // inaccuracy does not matter\n startOffset: this.LA(1).startOffset,\n endOffset: NaN\n };\n };\n TreeBuilder.prototype.setInitialNodeLocationFullRecovery = function (cstNode) {\n cstNode.location = {\n startOffset: NaN,\n startLine: NaN,\n startColumn: NaN,\n endOffset: NaN,\n endLine: NaN,\n endColumn: NaN\n };\n };\n /**\n * @see setInitialNodeLocationOnlyOffsetRegular for explanation why this work\n \n * @param cstNode\n */\n TreeBuilder.prototype.setInitialNodeLocationFullRegular = function (cstNode) {\n var nextToken = this.LA(1);\n cstNode.location = {\n startOffset: nextToken.startOffset,\n startLine: nextToken.startLine,\n startColumn: nextToken.startColumn,\n endOffset: NaN,\n endLine: NaN,\n endColumn: NaN\n };\n };\n TreeBuilder.prototype.cstInvocationStateUpdate = function (fullRuleName) {\n var cstNode = {\n name: fullRuleName,\n children: Object.create(null)\n };\n this.setInitialNodeLocation(cstNode);\n this.CST_STACK.push(cstNode);\n };\n TreeBuilder.prototype.cstFinallyStateUpdate = function () {\n this.CST_STACK.pop();\n };\n TreeBuilder.prototype.cstPostRuleFull = function (ruleCstNode) {\n // casts to `required` are safe because `cstPostRuleFull` should only be invoked when full location is enabled\n var prevToken = this.LA(0);\n var loc = ruleCstNode.location;\n // If this condition is true it means we consumed at least one Token\n // In this CstNode.\n if (loc.startOffset <= prevToken.startOffset === true) {\n loc.endOffset = prevToken.endOffset;\n loc.endLine = prevToken.endLine;\n loc.endColumn = prevToken.endColumn;\n }\n // \"empty\" CstNode edge case\n else {\n loc.startOffset = NaN;\n loc.startLine = NaN;\n loc.startColumn = NaN;\n }\n };\n TreeBuilder.prototype.cstPostRuleOnlyOffset = function (ruleCstNode) {\n var prevToken = this.LA(0);\n // `location' is not null because `cstPostRuleOnlyOffset` will only be invoked when location tracking is enabled.\n var loc = ruleCstNode.location;\n // If this condition is true it means we consumed at least one Token\n // In this CstNode.\n if (loc.startOffset <= prevToken.startOffset === true) {\n loc.endOffset = prevToken.endOffset;\n }\n // \"empty\" CstNode edge case\n else {\n loc.startOffset = NaN;\n }\n };\n TreeBuilder.prototype.cstPostTerminal = function (key, consumedToken) {\n var rootCst = this.CST_STACK[this.CST_STACK.length - 1];\n (0, cst_1.addTerminalToCst)(rootCst, consumedToken, key);\n // This is only used when **both** error recovery and CST Output are enabled.\n this.setNodeLocationFromToken(rootCst.location, consumedToken);\n };\n TreeBuilder.prototype.cstPostNonTerminal = function (ruleCstResult, ruleName) {\n var preCstNode = this.CST_STACK[this.CST_STACK.length - 1];\n (0, cst_1.addNoneTerminalToCst)(preCstNode, ruleName, ruleCstResult);\n // This is only used when **both** error recovery and CST Output are enabled.\n this.setNodeLocationFromNode(preCstNode.location, ruleCstResult.location);\n };\n TreeBuilder.prototype.getBaseCstVisitorConstructor = function () {\n if ((0, isUndefined_1.default)(this.baseCstVisitorConstructor)) {\n var newBaseCstVisitorConstructor = (0, cst_visitor_1.createBaseSemanticVisitorConstructor)(this.className, (0, keys_1.default)(this.gastProductionsCache));\n this.baseCstVisitorConstructor = newBaseCstVisitorConstructor;\n return newBaseCstVisitorConstructor;\n }\n return this.baseCstVisitorConstructor;\n };\n TreeBuilder.prototype.getBaseCstVisitorConstructorWithDefaults = function () {\n if ((0, isUndefined_1.default)(this.baseCstVisitorWithDefaultsConstructor)) {\n var newConstructor = (0, cst_visitor_1.createBaseVisitorConstructorWithDefaults)(this.className, (0, keys_1.default)(this.gastProductionsCache), this.getBaseCstVisitorConstructor());\n this.baseCstVisitorWithDefaultsConstructor = newConstructor;\n return newConstructor;\n }\n return this.baseCstVisitorWithDefaultsConstructor;\n };\n TreeBuilder.prototype.getLastExplicitRuleShortName = function () {\n var ruleStack = this.RULE_STACK;\n return ruleStack[ruleStack.length - 1];\n };\n TreeBuilder.prototype.getPreviousExplicitRuleShortName = function () {\n var ruleStack = this.RULE_STACK;\n return ruleStack[ruleStack.length - 2];\n };\n TreeBuilder.prototype.getLastExplicitRuleOccurrenceIndex = function () {\n var occurrenceStack = this.RULE_OCCURRENCE_STACK;\n return occurrenceStack[occurrenceStack.length - 1];\n };\n return TreeBuilder;\n}());\nexports.TreeBuilder = TreeBuilder;\n//# sourceMappingURL=tree_builder.js.map","/** Used for built-in method references. */\nvar funcProto = Function.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/**\n * Converts `func` to its source code.\n *\n * @private\n * @param {Function} func The function to convert.\n * @returns {string} Returns the source code.\n */\nfunction toSource(func) {\n if (func != null) {\n try {\n return funcToString.call(func);\n } catch (e) {}\n try {\n return (func + '');\n } catch (e) {}\n }\n return '';\n}\n\nmodule.exports = toSource;\n","var baseGetTag = require('./_baseGetTag'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]';\n\n/**\n * The base implementation of `_.isArguments`.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n */\nfunction baseIsArguments(value) {\n return isObjectLike(value) && baseGetTag(value) == argsTag;\n}\n\nmodule.exports = baseIsArguments;\n","var baseSlice = require('./_baseSlice'),\n toInteger = require('./toInteger');\n\n/**\n * Creates a slice of `array` with `n` elements dropped from the end.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Array\n * @param {Array} array The array to query.\n * @param {number} [n=1] The number of elements to drop.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {Array} Returns the slice of `array`.\n * @example\n *\n * _.dropRight([1, 2, 3]);\n * // => [1, 2]\n *\n * _.dropRight([1, 2, 3], 2);\n * // => [1]\n *\n * _.dropRight([1, 2, 3], 5);\n * // => []\n *\n * _.dropRight([1, 2, 3], 0);\n * // => [1, 2, 3]\n */\nfunction dropRight(array, n, guard) {\n var length = array == null ? 0 : array.length;\n if (!length) {\n return [];\n }\n n = (guard || n === undefined) ? 1 : toInteger(n);\n n = length - n;\n return baseSlice(array, 0, n < 0 ? 0 : n);\n}\n\nmodule.exports = dropRight;\n","var Symbol = require('./_Symbol'),\n arrayMap = require('./_arrayMap'),\n isArray = require('./isArray'),\n isSymbol = require('./isSymbol');\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0;\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n symbolToString = symbolProto ? symbolProto.toString : undefined;\n\n/**\n * The base implementation of `_.toString` which doesn't convert nullish\n * values to empty strings.\n *\n * @private\n * @param {*} value The value to process.\n * @returns {string} Returns the string.\n */\nfunction baseToString(value) {\n // Exit early for strings to avoid a performance hit in some environments.\n if (typeof value == 'string') {\n return value;\n }\n if (isArray(value)) {\n // Recursively convert values (susceptible to call stack limits).\n return arrayMap(value, baseToString) + '';\n }\n if (isSymbol(value)) {\n return symbolToString ? symbolToString.call(value) : '';\n }\n var result = (value + '');\n return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n}\n\nmodule.exports = baseToString;\n","var arrayFilter = require('./_arrayFilter'),\n baseFilter = require('./_baseFilter'),\n baseIteratee = require('./_baseIteratee'),\n isArray = require('./isArray');\n\n/**\n * Iterates over elements of `collection`, returning an array of all elements\n * `predicate` returns truthy for. The predicate is invoked with three\n * arguments: (value, index|key, collection).\n *\n * **Note:** Unlike `_.remove`, this method returns a new array.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the new filtered array.\n * @see _.reject\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'age': 36, 'active': true },\n * { 'user': 'fred', 'age': 40, 'active': false }\n * ];\n *\n * _.filter(users, function(o) { return !o.active; });\n * // => objects for ['fred']\n *\n * // The `_.matches` iteratee shorthand.\n * _.filter(users, { 'age': 36, 'active': true });\n * // => objects for ['barney']\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.filter(users, ['active', false]);\n * // => objects for ['fred']\n *\n * // The `_.property` iteratee shorthand.\n * _.filter(users, 'active');\n * // => objects for ['barney']\n *\n * // Combining several predicates using `_.overEvery` or `_.overSome`.\n * _.filter(users, _.overSome([{ 'age': 36 }, ['age', 40]]));\n * // => objects for ['fred', 'barney']\n */\nfunction filter(collection, predicate) {\n var func = isArray(collection) ? arrayFilter : baseFilter;\n return func(collection, baseIteratee(predicate, 3));\n}\n\nmodule.exports = filter;\n","var getMapData = require('./_getMapData');\n\n/**\n * Removes `key` and its value from the map.\n *\n * @private\n * @name delete\n * @memberOf MapCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction mapCacheDelete(key) {\n var result = getMapData(this, key)['delete'](key);\n this.size -= result ? 1 : 0;\n return result;\n}\n\nmodule.exports = mapCacheDelete;\n","var baseIsMap = require('./_baseIsMap'),\n baseUnary = require('./_baseUnary'),\n nodeUtil = require('./_nodeUtil');\n\n/* Node.js helper references. */\nvar nodeIsMap = nodeUtil && nodeUtil.isMap;\n\n/**\n * Checks if `value` is classified as a `Map` object.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a map, else `false`.\n * @example\n *\n * _.isMap(new Map);\n * // => true\n *\n * _.isMap(new WeakMap);\n * // => false\n */\nvar isMap = nodeIsMap ? baseUnary(nodeIsMap) : baseIsMap;\n\nmodule.exports = isMap;\n","\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ErrorHandler = void 0;\nvar exceptions_public_1 = require(\"../../exceptions_public\");\nvar has_1 = __importDefault(require(\"lodash/has\"));\nvar clone_1 = __importDefault(require(\"lodash/clone\"));\nvar lookahead_1 = require(\"../../grammar/lookahead\");\nvar parser_1 = require(\"../parser\");\n/**\n * Trait responsible for runtime parsing errors.\n */\nvar ErrorHandler = /** @class */ (function () {\n function ErrorHandler() {\n }\n ErrorHandler.prototype.initErrorHandler = function (config) {\n this._errors = [];\n this.errorMessageProvider = (0, has_1.default)(config, \"errorMessageProvider\")\n ? config.errorMessageProvider // assumes end user provides the correct config value/type\n : parser_1.DEFAULT_PARSER_CONFIG.errorMessageProvider;\n };\n ErrorHandler.prototype.SAVE_ERROR = function (error) {\n if ((0, exceptions_public_1.isRecognitionException)(error)) {\n error.context = {\n ruleStack: this.getHumanReadableRuleStack(),\n ruleOccurrenceStack: (0, clone_1.default)(this.RULE_OCCURRENCE_STACK)\n };\n this._errors.push(error);\n return error;\n }\n else {\n throw Error(\"Trying to save an Error which is not a RecognitionException\");\n }\n };\n Object.defineProperty(ErrorHandler.prototype, \"errors\", {\n get: function () {\n return (0, clone_1.default)(this._errors);\n },\n set: function (newErrors) {\n this._errors = newErrors;\n },\n enumerable: false,\n configurable: true\n });\n // TODO: consider caching the error message computed information\n ErrorHandler.prototype.raiseEarlyExitException = function (occurrence, prodType, userDefinedErrMsg) {\n var ruleName = this.getCurrRuleFullName();\n var ruleGrammar = this.getGAstProductions()[ruleName];\n var lookAheadPathsPerAlternative = (0, lookahead_1.getLookaheadPathsForOptionalProd)(occurrence, ruleGrammar, prodType, this.maxLookahead);\n var insideProdPaths = lookAheadPathsPerAlternative[0];\n var actualTokens = [];\n for (var i = 1; i <= this.maxLookahead; i++) {\n actualTokens.push(this.LA(i));\n }\n var msg = this.errorMessageProvider.buildEarlyExitMessage({\n expectedIterationPaths: insideProdPaths,\n actual: actualTokens,\n previous: this.LA(0),\n customUserDescription: userDefinedErrMsg,\n ruleName: ruleName\n });\n throw this.SAVE_ERROR(new exceptions_public_1.EarlyExitException(msg, this.LA(1), this.LA(0)));\n };\n // TODO: consider caching the error message computed information\n ErrorHandler.prototype.raiseNoAltException = function (occurrence, errMsgTypes) {\n var ruleName = this.getCurrRuleFullName();\n var ruleGrammar = this.getGAstProductions()[ruleName];\n // TODO: getLookaheadPathsForOr can be slow for large enough maxLookahead and certain grammars, consider caching ?\n var lookAheadPathsPerAlternative = (0, lookahead_1.getLookaheadPathsForOr)(occurrence, ruleGrammar, this.maxLookahead);\n var actualTokens = [];\n for (var i = 1; i <= this.maxLookahead; i++) {\n actualTokens.push(this.LA(i));\n }\n var previousToken = this.LA(0);\n var errMsg = this.errorMessageProvider.buildNoViableAltMessage({\n expectedPathsPerAlt: lookAheadPathsPerAlternative,\n actual: actualTokens,\n previous: previousToken,\n customUserDescription: errMsgTypes,\n ruleName: this.getCurrRuleFullName()\n });\n throw this.SAVE_ERROR(new exceptions_public_1.NoViableAltException(errMsg, this.LA(1), previousToken));\n };\n return ErrorHandler;\n}());\nexports.ErrorHandler = ErrorHandler;\n//# sourceMappingURL=error_handler.js.map","var isSymbol = require('./isSymbol');\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0;\n\n/**\n * Converts `value` to a string key if it's not a string or symbol.\n *\n * @private\n * @param {*} value The value to inspect.\n * @returns {string|symbol} Returns the key.\n */\nfunction toKey(value) {\n if (typeof value == 'string' || isSymbol(value)) {\n return value;\n }\n var result = (value + '');\n return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n}\n\nmodule.exports = toKey;\n","var root = require('./_root');\n\n/** Built-in value references. */\nvar Uint8Array = root.Uint8Array;\n\nmodule.exports = Uint8Array;\n","var baseIsEqual = require('./_baseIsEqual'),\n get = require('./get'),\n hasIn = require('./hasIn'),\n isKey = require('./_isKey'),\n isStrictComparable = require('./_isStrictComparable'),\n matchesStrictComparable = require('./_matchesStrictComparable'),\n toKey = require('./_toKey');\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1,\n COMPARE_UNORDERED_FLAG = 2;\n\n/**\n * The base implementation of `_.matchesProperty` which doesn't clone `srcValue`.\n *\n * @private\n * @param {string} path The path of the property to get.\n * @param {*} srcValue The value to match.\n * @returns {Function} Returns the new spec function.\n */\nfunction baseMatchesProperty(path, srcValue) {\n if (isKey(path) && isStrictComparable(srcValue)) {\n return matchesStrictComparable(toKey(path), srcValue);\n }\n return function(object) {\n var objValue = get(object, path);\n return (objValue === undefined && objValue === srcValue)\n ? hasIn(object, path)\n : baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG);\n };\n}\n\nmodule.exports = baseMatchesProperty;\n","/**\n * The base implementation of `_.hasIn` without support for deep paths.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {Array|string} key The key to check.\n * @returns {boolean} Returns `true` if `key` exists, else `false`.\n */\nfunction baseHasIn(object, key) {\n return object != null && key in Object(object);\n}\n\nmodule.exports = baseHasIn;\n","var arrayFilter = require('./_arrayFilter'),\n baseFilter = require('./_baseFilter'),\n baseIteratee = require('./_baseIteratee'),\n isArray = require('./isArray'),\n negate = require('./negate');\n\n/**\n * The opposite of `_.filter`; this method returns the elements of `collection`\n * that `predicate` does **not** return truthy for.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the new filtered array.\n * @see _.filter\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'age': 36, 'active': false },\n * { 'user': 'fred', 'age': 40, 'active': true }\n * ];\n *\n * _.reject(users, function(o) { return !o.active; });\n * // => objects for ['fred']\n *\n * // The `_.matches` iteratee shorthand.\n * _.reject(users, { 'age': 40, 'active': true });\n * // => objects for ['barney']\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.reject(users, ['active', false]);\n * // => objects for ['fred']\n *\n * // The `_.property` iteratee shorthand.\n * _.reject(users, 'active');\n * // => objects for ['barney']\n */\nfunction reject(collection, predicate) {\n var func = isArray(collection) ? arrayFilter : baseFilter;\n return func(collection, negate(baseIteratee(predicate, 3)));\n}\n\nmodule.exports = reject;\n","/**\n * Gets the last element of `array`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to query.\n * @returns {*} Returns the last element of `array`.\n * @example\n *\n * _.last([1, 2, 3]);\n * // => 3\n */\nfunction last(array) {\n var length = array == null ? 0 : array.length;\n return length ? array[length - 1] : undefined;\n}\n\nmodule.exports = last;\n","/**\n * The base implementation of `_.times` without support for iteratee shorthands\n * or max array length checks.\n *\n * @private\n * @param {number} n The number of times to invoke `iteratee`.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the array of results.\n */\nfunction baseTimes(n, iteratee) {\n var index = -1,\n result = Array(n);\n\n while (++index < n) {\n result[index] = iteratee(index);\n }\n return result;\n}\n\nmodule.exports = baseTimes;\n","var baseGet = require('./_baseGet');\n\n/**\n * Gets the value at `path` of `object`. If the resolved value is\n * `undefined`, the `defaultValue` is returned in its place.\n *\n * @static\n * @memberOf _\n * @since 3.7.0\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @param {*} [defaultValue] The value returned for `undefined` resolved values.\n * @returns {*} Returns the resolved value.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n *\n * _.get(object, 'a[0].b.c');\n * // => 3\n *\n * _.get(object, ['a', '0', 'b', 'c']);\n * // => 3\n *\n * _.get(object, 'a.b.c', 'default');\n * // => 'default'\n */\nfunction get(object, path, defaultValue) {\n var result = object == null ? undefined : baseGet(object, path);\n return result === undefined ? defaultValue : result;\n}\n\nmodule.exports = get;\n","\"use strict\";\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.attemptInRepetitionRecovery = exports.Recoverable = exports.InRuleRecoveryException = exports.IN_RULE_RECOVERY_EXCEPTION = exports.EOF_FOLLOW_KEY = void 0;\nvar tokens_public_1 = require(\"../../../scan/tokens_public\");\nvar isEmpty_1 = __importDefault(require(\"lodash/isEmpty\"));\nvar dropRight_1 = __importDefault(require(\"lodash/dropRight\"));\nvar flatten_1 = __importDefault(require(\"lodash/flatten\"));\nvar map_1 = __importDefault(require(\"lodash/map\"));\nvar find_1 = __importDefault(require(\"lodash/find\"));\nvar has_1 = __importDefault(require(\"lodash/has\"));\nvar includes_1 = __importDefault(require(\"lodash/includes\"));\nvar clone_1 = __importDefault(require(\"lodash/clone\"));\nvar exceptions_public_1 = require(\"../../exceptions_public\");\nvar constants_1 = require(\"../../constants\");\nvar parser_1 = require(\"../parser\");\nexports.EOF_FOLLOW_KEY = {};\nexports.IN_RULE_RECOVERY_EXCEPTION = \"InRuleRecoveryException\";\nvar InRuleRecoveryException = /** @class */ (function (_super) {\n __extends(InRuleRecoveryException, _super);\n function InRuleRecoveryException(message) {\n var _this = _super.call(this, message) || this;\n _this.name = exports.IN_RULE_RECOVERY_EXCEPTION;\n return _this;\n }\n return InRuleRecoveryException;\n}(Error));\nexports.InRuleRecoveryException = InRuleRecoveryException;\n/**\n * This trait is responsible for the error recovery and fault tolerant logic\n */\nvar Recoverable = /** @class */ (function () {\n function Recoverable() {\n }\n Recoverable.prototype.initRecoverable = function (config) {\n this.firstAfterRepMap = {};\n this.resyncFollows = {};\n this.recoveryEnabled = (0, has_1.default)(config, \"recoveryEnabled\")\n ? config.recoveryEnabled // assumes end user provides the correct config value/type\n : parser_1.DEFAULT_PARSER_CONFIG.recoveryEnabled;\n // performance optimization, NOOP will be inlined which\n // effectively means that this optional feature does not exist\n // when not used.\n if (this.recoveryEnabled) {\n this.attemptInRepetitionRecovery = attemptInRepetitionRecovery;\n }\n };\n Recoverable.prototype.getTokenToInsert = function (tokType) {\n var tokToInsert = (0, tokens_public_1.createTokenInstance)(tokType, \"\", NaN, NaN, NaN, NaN, NaN, NaN);\n tokToInsert.isInsertedInRecovery = true;\n return tokToInsert;\n };\n Recoverable.prototype.canTokenTypeBeInsertedInRecovery = function (tokType) {\n return true;\n };\n Recoverable.prototype.canTokenTypeBeDeletedInRecovery = function (tokType) {\n return true;\n };\n Recoverable.prototype.tryInRepetitionRecovery = function (grammarRule, grammarRuleArgs, lookAheadFunc, expectedTokType) {\n var _this = this;\n // TODO: can the resyncTokenType be cached?\n var reSyncTokType = this.findReSyncTokenType();\n var savedLexerState = this.exportLexerState();\n var resyncedTokens = [];\n var passedResyncPoint = false;\n var nextTokenWithoutResync = this.LA(1);\n var currToken = this.LA(1);\n var generateErrorMessage = function () {\n var previousToken = _this.LA(0);\n // we are preemptively re-syncing before an error has been detected, therefor we must reproduce\n // the error that would have been thrown\n var msg = _this.errorMessageProvider.buildMismatchTokenMessage({\n expected: expectedTokType,\n actual: nextTokenWithoutResync,\n previous: previousToken,\n ruleName: _this.getCurrRuleFullName()\n });\n var error = new exceptions_public_1.MismatchedTokenException(msg, nextTokenWithoutResync, _this.LA(0));\n // the first token here will be the original cause of the error, this is not part of the resyncedTokens property.\n error.resyncedTokens = (0, dropRight_1.default)(resyncedTokens);\n _this.SAVE_ERROR(error);\n };\n while (!passedResyncPoint) {\n // re-synced to a point where we can safely exit the repetition/\n if (this.tokenMatcher(currToken, expectedTokType)) {\n generateErrorMessage();\n return; // must return here to avoid reverting the inputIdx\n }\n else if (lookAheadFunc.call(this)) {\n // we skipped enough tokens so we can resync right back into another iteration of the repetition grammar rule\n generateErrorMessage();\n // recursive invocation in other to support multiple re-syncs in the same top level repetition grammar rule\n grammarRule.apply(this, grammarRuleArgs);\n return; // must return here to avoid reverting the inputIdx\n }\n else if (this.tokenMatcher(currToken, reSyncTokType)) {\n passedResyncPoint = true;\n }\n else {\n currToken = this.SKIP_TOKEN();\n this.addToResyncTokens(currToken, resyncedTokens);\n }\n }\n // we were unable to find a CLOSER point to resync inside the Repetition, reset the state.\n // The parsing exception we were trying to prevent will happen in the NEXT parsing step. it may be handled by\n // \"between rules\" resync recovery later in the flow.\n this.importLexerState(savedLexerState);\n };\n Recoverable.prototype.shouldInRepetitionRecoveryBeTried = function (expectTokAfterLastMatch, nextTokIdx, notStuck) {\n // Edge case of arriving from a MANY repetition which is stuck\n // Attempting recovery in this case could cause an infinite loop\n if (notStuck === false) {\n return false;\n }\n // no need to recover, next token is what we expect...\n if (this.tokenMatcher(this.LA(1), expectTokAfterLastMatch)) {\n return false;\n }\n // error recovery is disabled during backtracking as it can make the parser ignore a valid grammar path\n // and prefer some backtracking path that includes recovered errors.\n if (this.isBackTracking()) {\n return false;\n }\n // if we can perform inRule recovery (single token insertion or deletion) we always prefer that recovery algorithm\n // because if it works, it makes the least amount of changes to the input stream (greedy algorithm)\n //noinspection RedundantIfStatementJS\n if (this.canPerformInRuleRecovery(expectTokAfterLastMatch, this.getFollowsForInRuleRecovery(expectTokAfterLastMatch, nextTokIdx))) {\n return false;\n }\n return true;\n };\n // Error Recovery functionality\n Recoverable.prototype.getFollowsForInRuleRecovery = function (tokType, tokIdxInRule) {\n var grammarPath = this.getCurrentGrammarPath(tokType, tokIdxInRule);\n var follows = this.getNextPossibleTokenTypes(grammarPath);\n return follows;\n };\n Recoverable.prototype.tryInRuleRecovery = function (expectedTokType, follows) {\n if (this.canRecoverWithSingleTokenInsertion(expectedTokType, follows)) {\n var tokToInsert = this.getTokenToInsert(expectedTokType);\n return tokToInsert;\n }\n if (this.canRecoverWithSingleTokenDeletion(expectedTokType)) {\n var nextTok = this.SKIP_TOKEN();\n this.consumeToken();\n return nextTok;\n }\n throw new InRuleRecoveryException(\"sad sad panda\");\n };\n Recoverable.prototype.canPerformInRuleRecovery = function (expectedToken, follows) {\n return (this.canRecoverWithSingleTokenInsertion(expectedToken, follows) ||\n this.canRecoverWithSingleTokenDeletion(expectedToken));\n };\n Recoverable.prototype.canRecoverWithSingleTokenInsertion = function (expectedTokType, follows) {\n var _this = this;\n if (!this.canTokenTypeBeInsertedInRecovery(expectedTokType)) {\n return false;\n }\n // must know the possible following tokens to perform single token insertion\n if ((0, isEmpty_1.default)(follows)) {\n return false;\n }\n var mismatchedTok = this.LA(1);\n var isMisMatchedTokInFollows = (0, find_1.default)(follows, function (possibleFollowsTokType) {\n return _this.tokenMatcher(mismatchedTok, possibleFollowsTokType);\n }) !== undefined;\n return isMisMatchedTokInFollows;\n };\n Recoverable.prototype.canRecoverWithSingleTokenDeletion = function (expectedTokType) {\n if (!this.canTokenTypeBeDeletedInRecovery(expectedTokType)) {\n return false;\n }\n var isNextTokenWhatIsExpected = this.tokenMatcher(this.LA(2), expectedTokType);\n return isNextTokenWhatIsExpected;\n };\n Recoverable.prototype.isInCurrentRuleReSyncSet = function (tokenTypeIdx) {\n var followKey = this.getCurrFollowKey();\n var currentRuleReSyncSet = this.getFollowSetFromFollowKey(followKey);\n return (0, includes_1.default)(currentRuleReSyncSet, tokenTypeIdx);\n };\n Recoverable.prototype.findReSyncTokenType = function () {\n var allPossibleReSyncTokTypes = this.flattenFollowSet();\n // this loop will always terminate as EOF is always in the follow stack and also always (virtually) in the input\n var nextToken = this.LA(1);\n var k = 2;\n while (true) {\n var foundMatch = (0, find_1.default)(allPossibleReSyncTokTypes, function (resyncTokType) {\n var canMatch = (0, tokens_public_1.tokenMatcher)(nextToken, resyncTokType);\n return canMatch;\n });\n if (foundMatch !== undefined) {\n return foundMatch;\n }\n nextToken = this.LA(k);\n k++;\n }\n };\n Recoverable.prototype.getCurrFollowKey = function () {\n // the length is at least one as we always add the ruleName to the stack before invoking the rule.\n if (this.RULE_STACK.length === 1) {\n return exports.EOF_FOLLOW_KEY;\n }\n var currRuleShortName = this.getLastExplicitRuleShortName();\n var currRuleIdx = this.getLastExplicitRuleOccurrenceIndex();\n var prevRuleShortName = this.getPreviousExplicitRuleShortName();\n return {\n ruleName: this.shortRuleNameToFullName(currRuleShortName),\n idxInCallingRule: currRuleIdx,\n inRule: this.shortRuleNameToFullName(prevRuleShortName)\n };\n };\n Recoverable.prototype.buildFullFollowKeyStack = function () {\n var _this = this;\n var explicitRuleStack = this.RULE_STACK;\n var explicitOccurrenceStack = this.RULE_OCCURRENCE_STACK;\n return (0, map_1.default)(explicitRuleStack, function (ruleName, idx) {\n if (idx === 0) {\n return exports.EOF_FOLLOW_KEY;\n }\n return {\n ruleName: _this.shortRuleNameToFullName(ruleName),\n idxInCallingRule: explicitOccurrenceStack[idx],\n inRule: _this.shortRuleNameToFullName(explicitRuleStack[idx - 1])\n };\n });\n };\n Recoverable.prototype.flattenFollowSet = function () {\n var _this = this;\n var followStack = (0, map_1.default)(this.buildFullFollowKeyStack(), function (currKey) {\n return _this.getFollowSetFromFollowKey(currKey);\n });\n return (0, flatten_1.default)(followStack);\n };\n Recoverable.prototype.getFollowSetFromFollowKey = function (followKey) {\n if (followKey === exports.EOF_FOLLOW_KEY) {\n return [tokens_public_1.EOF];\n }\n var followName = followKey.ruleName + followKey.idxInCallingRule + constants_1.IN + followKey.inRule;\n return this.resyncFollows[followName];\n };\n // It does not make any sense to include a virtual EOF token in the list of resynced tokens\n // as EOF does not really exist and thus does not contain any useful information (line/column numbers)\n Recoverable.prototype.addToResyncTokens = function (token, resyncTokens) {\n if (!this.tokenMatcher(token, tokens_public_1.EOF)) {\n resyncTokens.push(token);\n }\n return resyncTokens;\n };\n Recoverable.prototype.reSyncTo = function (tokType) {\n var resyncedTokens = [];\n var nextTok = this.LA(1);\n while (this.tokenMatcher(nextTok, tokType) === false) {\n nextTok = this.SKIP_TOKEN();\n this.addToResyncTokens(nextTok, resyncedTokens);\n }\n // the last token is not part of the error.\n return (0, dropRight_1.default)(resyncedTokens);\n };\n Recoverable.prototype.attemptInRepetitionRecovery = function (prodFunc, args, lookaheadFunc, dslMethodIdx, prodOccurrence, nextToksWalker, notStuck) {\n // by default this is a NO-OP\n // The actual implementation is with the function(not method) below\n };\n Recoverable.prototype.getCurrentGrammarPath = function (tokType, tokIdxInRule) {\n var pathRuleStack = this.getHumanReadableRuleStack();\n var pathOccurrenceStack = (0, clone_1.default)(this.RULE_OCCURRENCE_STACK);\n var grammarPath = {\n ruleStack: pathRuleStack,\n occurrenceStack: pathOccurrenceStack,\n lastTok: tokType,\n lastTokOccurrence: tokIdxInRule\n };\n return grammarPath;\n };\n Recoverable.prototype.getHumanReadableRuleStack = function () {\n var _this = this;\n return (0, map_1.default)(this.RULE_STACK, function (currShortName) {\n return _this.shortRuleNameToFullName(currShortName);\n });\n };\n return Recoverable;\n}());\nexports.Recoverable = Recoverable;\nfunction attemptInRepetitionRecovery(prodFunc, args, lookaheadFunc, dslMethodIdx, prodOccurrence, nextToksWalker, notStuck) {\n var key = this.getKeyForAutomaticLookahead(dslMethodIdx, prodOccurrence);\n var firstAfterRepInfo = this.firstAfterRepMap[key];\n if (firstAfterRepInfo === undefined) {\n var currRuleName = this.getCurrRuleFullName();\n var ruleGrammar = this.getGAstProductions()[currRuleName];\n var walker = new nextToksWalker(ruleGrammar, prodOccurrence);\n firstAfterRepInfo = walker.startWalking();\n this.firstAfterRepMap[key] = firstAfterRepInfo;\n }\n var expectTokAfterLastMatch = firstAfterRepInfo.token;\n var nextTokIdx = firstAfterRepInfo.occurrence;\n var isEndOfRule = firstAfterRepInfo.isEndOfRule;\n // special edge case of a TOP most repetition after which the input should END.\n // this will force an attempt for inRule recovery in that scenario.\n if (this.RULE_STACK.length === 1 &&\n isEndOfRule &&\n expectTokAfterLastMatch === undefined) {\n expectTokAfterLastMatch = tokens_public_1.EOF;\n nextTokIdx = 1;\n }\n // We don't have anything to re-sync to...\n // this condition was extracted from `shouldInRepetitionRecoveryBeTried` to act as a type-guard\n if (expectTokAfterLastMatch === undefined || nextTokIdx === undefined) {\n return;\n }\n if (this.shouldInRepetitionRecoveryBeTried(expectTokAfterLastMatch, nextTokIdx, notStuck)) {\n // TODO: performance optimization: instead of passing the original args here, we modify\n // the args param (or create a new one) and make sure the lookahead func is explicitly provided\n // to avoid searching the cache for it once more.\n this.tryInRepetitionRecovery(prodFunc, args, lookaheadFunc, expectTokAfterLastMatch);\n }\n}\nexports.attemptInRepetitionRecovery = attemptInRepetitionRecovery;\n//# sourceMappingURL=recoverable.js.map","var getNative = require('./_getNative'),\n root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar Map = getNative(root, 'Map');\n\nmodule.exports = Map;\n","var getNative = require('./_getNative'),\n root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar WeakMap = getNative(root, 'WeakMap');\n\nmodule.exports = WeakMap;\n","var isArrayLike = require('./isArrayLike');\n\n/**\n * Creates a `baseEach` or `baseEachRight` function.\n *\n * @private\n * @param {Function} eachFunc The function to iterate over a collection.\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new base function.\n */\nfunction createBaseEach(eachFunc, fromRight) {\n return function(collection, iteratee) {\n if (collection == null) {\n return collection;\n }\n if (!isArrayLike(collection)) {\n return eachFunc(collection, iteratee);\n }\n var length = collection.length,\n index = fromRight ? length : -1,\n iterable = Object(collection);\n\n while ((fromRight ? index-- : ++index < length)) {\n if (iteratee(iterable[index], index, iterable) === false) {\n break;\n }\n }\n return collection;\n };\n}\n\nmodule.exports = createBaseEach;\n","import { Cell } from \"../Cell\";\nimport { CellEvent } from \"../Cell/CellEvent\";\nimport { EventDispatcher } from \"../Utility/EventDispatcher\";\nimport { DependencyBuilder } from \"./DependencyBuilder\";\nimport { CellRegistry } from \"../Sheet/CellRegistry\";\n\nexport class DependencyTree {\n\n protected depTree : Record = {};\n protected cellRegistry : CellRegistry;\n\n constructor(\n cellRegistry : CellRegistry,\n private dispatcher : EventDispatcher,\n private builder : DependencyBuilder\n ) {\n this.cellRegistry = cellRegistry;\n this.buildTree();\n this.dispatcher.listen(CellEvent.FORMULA_CHANGED, this._updateGraph.bind(this));\n }\n\n private buildTree() {\n // Build the dependency tree from cell registry\n this.cellRegistry.each((cell: Cell) => {\n if (cell.formula) {\n this.depTree[cell.address] = cell;\n }\n });\n }\n\n private _updateGraph(event: any)\n {\n // Rebuild the tree when a formula changes\n this.buildTree();\n }\n\n markAsDirty(cell : Cell) {\n if (this.depTree[cell.address]) {\n this.depTree[cell.address].markAsDirty();\n\n // Recursively mark dependents as dirty\n const dependents = this.depTree[cell.address].getDependents();\n for (const address in dependents) {\n this.markAsDirty(dependents[address]);\n }\n }\n }\n\n /**\n * Topologically sort object tree into array based on depth level\n *\n * a -\n * |- c -\n * b - | - e -\n * d - | - g\n * |\n * f -\n *\n * to\n *\n * a | c | e | g\n * b | d | f |\n */\n topologicalSort() : Array> {\n const levels: Array> = [];\n const visited = new Set();\n const cellLevels = new Map();\n\n // Calculate level for each cell based on its precedents\n const calculateLevel = (cell: Cell): number => {\n if (cellLevels.has(cell.address)) {\n return cellLevels.get(cell.address)!;\n }\n\n const precedents = cell.getPrecedents();\n if (!precedents || Object.keys(precedents).length === 0) {\n // No precedents, this is a leaf node (level 0)\n cellLevels.set(cell.address, 0);\n return 0;\n }\n\n // Find the maximum level among precedents\n let maxLevel = -1;\n for (const address in precedents) {\n const precedent = precedents[address];\n if (precedent) {\n const precedentLevel = calculateLevel(precedent);\n if (precedentLevel > maxLevel) {\n maxLevel = precedentLevel;\n }\n }\n }\n\n const level = maxLevel + 1;\n cellLevels.set(cell.address, level);\n return level;\n };\n\n // Calculate levels for all cells with formulas\n this.cellRegistry.each((cell: Cell) => {\n if (cell.formula && !visited.has(cell.address)) {\n calculateLevel(cell);\n }\n });\n\n // Group cells by level (only include cells with formulas)\n cellLevels.forEach((level, address) => {\n const cell = this.cellRegistry.get(address);\n // Only include cells that have formulas\n if (cell && cell.formula) {\n if (!levels[level]) {\n levels[level] = [];\n }\n levels[level].push(cell);\n }\n });\n\n return levels;\n }\n\n /**\n * Flatten dependency graph into a flat array in topological order\n * Returns cells in the order they should be calculated\n * @returns Array of cells in topological order\n */\n flattenToTopology(): Cell[] {\n const levels = this.topologicalSort();\n const result: Cell[] = [];\n\n // Flatten the 2D array of levels into a 1D array\n for (const level of levels) {\n if (level) { // Skip undefined levels\n result.push(...level);\n }\n }\n\n return result;\n }\n\n /**\n * Get the depth level of the tree\n */\n getDepth() : number {\n return this._getDepth(this.depTree);\n }\n\n private _getDepth(tree : Record) : number {\n let max = 0;\n\n for (const key in tree) {\n const cell = tree[key];\n\n if (cell.getDependents()) {\n const depth = this._getDepth(cell.getDependents());\n\n if (depth > max) {\n max = depth;\n }\n }\n }\n\n return max + 1;\n }\n\n}","import { Cell } from \"../Cell\";\nimport { CellRegistry } from \"../Sheet/CellRegistry\";\nimport { EventDispatcher } from \"../Utility/EventDispatcher\";\nimport { DependencyTree } from \"./DependencyTree\";\nimport { Workbook } from \"../Workbook\";\n\nexport class DependencyBuilder {\n private patterns : Record = {\n remoteColumnRange : /\\#?[A-Za-z0-9_]+\\s*!\\s*[A-Za-z]+\\s*:\\s*[A-Za-z]+/g,\n remoteRowRange : /\\#?[A-Za-z0-9_]+\\s*!\\s*[0-9]+\\s*:\\s*[0-9]+/g,\n remoteCellRange : /\\#?[A-Za-z0-9_]+\\s*!\\s*[A-Za-z]+[0-9]+\\s*:\\s*[A-Za-z]+[0-9]+/g,\n remoteCell : /\\#?[A-Za-z0-9_]+\\s*!\\s*[A-Za-z]+[0-9]+/g,\n columnRange : /[A-Za-z]+\\s*:\\s*[A-Za-z]+/g,\n rowRange : /[0-9]+\\s*:\\s*[0-9]+/g,\n cellRange : /[A-Za-z]+[0-9]+\\s*:\\s*[A-Za-z]+[0-9]+/g,\n cell : /[A-Z]+[0-9]+/g,\n namedRange : /[A-Za-z_][A-Za-z0-9_\\.]*/g\n };\n\n private workbook?: Workbook;\n\n constructor() {\n\n }\n\n setWorkbook(workbook: Workbook) {\n this.workbook = workbook;\n }\n\n build(cells : CellRegistry, sheet?: any) : DependencyTree {\n // Build dependencies for each cell\n cells.each((cell : Cell) => {\n if (cell.formula) {\n const { localDeps, remoteDeps } = this.getFormulaDependencies(cell.formula);\n\n // Resolve local addresses to actual Cell objects\n const dependencies: Record = {};\n for (const address in localDeps) {\n const precedentCell = cells.get(address);\n if (precedentCell) {\n dependencies[address] = precedentCell;\n }\n }\n\n // Set precedents for this cell\n cell.setPrecedents(dependencies);\n\n // Set this cell as dependent for each local precedent\n for (const address in dependencies) {\n const precedentCell = dependencies[address];\n if (precedentCell) {\n precedentCell.addDependent(cell);\n }\n }\n\n // Handle remote (cross-sheet) dependencies\n if (this.workbook) {\n for (const remoteRef in remoteDeps) {\n const { sheetName, cellAddress } = this.parseRemoteReference(remoteRef);\n try {\n const remoteSheet = this.workbook.getSheet(sheetName);\n if (remoteSheet) {\n const remoteCellObj = remoteSheet.getCellDirect(cellAddress);\n if (remoteCellObj) {\n // Add this cell as a remote dependent of the precedent cell\n remoteCellObj.addRemoteDependent(cell);\n }\n }\n } catch (e) {\n // Sheet might not exist yet\n }\n }\n }\n }\n });\n\n return new DependencyTree(cells, new EventDispatcher, this);\n }\n\n public parseRemoteReference(remoteRef: string): { sheetName: string, cellAddress: string } {\n // Remove # prefix if present\n const cleanRef = remoteRef.replace(/^#/, '').trim();\n const parts = cleanRef.split('!');\n return {\n sheetName: parts[0].trim(),\n cellAddress: parts[1].trim()\n };\n }\n\n public getFormulaDependencies(formula : string) : { localDeps: Record, remoteDeps: Record } {\n const localDeps: Record = {};\n const remoteDeps: Record = {};\n\n // Remove leading '=' if present\n let cleanFormula = formula.startsWith('=') ? formula.substring(1) : formula;\n\n // Process patterns in order, replacing matched portions to prevent overlapping matches\n // Order matters: match more specific patterns first (e.g., ranges before individual cells)\n\n // 1. Remote column ranges: #Sheet1!A:C\n const remoteColumnMatches = cleanFormula.match(this.patterns.remoteColumnRange);\n if (remoteColumnMatches) {\n remoteColumnMatches.forEach(match => {\n remoteDeps[match.trim()] = true;\n });\n cleanFormula = cleanFormula.replace(this.patterns.remoteColumnRange, '');\n }\n\n // 2. Remote row ranges: #Sheet1!1:3\n const remoteRowMatches = cleanFormula.match(this.patterns.remoteRowRange);\n if (remoteRowMatches) {\n remoteRowMatches.forEach(match => {\n remoteDeps[match.trim()] = true;\n });\n cleanFormula = cleanFormula.replace(this.patterns.remoteRowRange, '');\n }\n\n // 3. Remote cell ranges: #Sheet1!A1:B3\n const remoteCellRangeMatches = cleanFormula.match(this.patterns.remoteCellRange);\n if (remoteCellRangeMatches) {\n remoteCellRangeMatches.forEach(match => {\n const [sheetPart, rangePart] = match.split('!');\n // Expand range into individual cells and add with sheet name\n const addresses = this.expandCellRange(rangePart.trim());\n addresses.forEach(addr => {\n remoteDeps[sheetPart + '!' + addr] = true;\n });\n });\n cleanFormula = cleanFormula.replace(this.patterns.remoteCellRange, '');\n }\n\n // 4. Remote cells: #Sheet1!A1\n const remoteCellMatches = cleanFormula.match(this.patterns.remoteCell);\n if (remoteCellMatches) {\n remoteCellMatches.forEach(match => {\n remoteDeps[match.trim()] = true;\n });\n cleanFormula = cleanFormula.replace(this.patterns.remoteCell, '');\n }\n\n // 5. Cell ranges: A1:B3\n const cellRangeMatches = cleanFormula.match(this.patterns.cellRange);\n if (cellRangeMatches) {\n cellRangeMatches.forEach(match => {\n // Expand range into individual cells\n const addresses = this.expandCellRange(match);\n addresses.forEach(addr => {\n localDeps[addr] = true;\n });\n });\n cleanFormula = cleanFormula.replace(this.patterns.cellRange, '');\n }\n\n // 6. Individual cells: A1, B2, etc.\n const cellMatches = cleanFormula.match(this.patterns.cell);\n if (cellMatches) {\n cellMatches.forEach(match => {\n // Filter out function names and keywords\n if (!this.isFunctionOrKeyword(match)) {\n localDeps[match] = true;\n }\n });\n }\n\n // 7. Named ranges: Resolve named ranges to their underlying cell references\n // After removing all other patterns, check remaining identifiers against named ranges\n if (this.workbook) {\n // Extract potential named range identifiers (words that aren't functions)\n const identifierMatches = cleanFormula.match(/[A-Za-z_][A-Za-z0-9_\\.]*/g);\n if (identifierMatches) {\n identifierMatches.forEach(identifier => {\n // Skip if it's a function or keyword\n if (this.isFunctionOrKeyword(identifier)) {\n return;\n }\n\n // Check if it's a named range\n if (this.workbook!.nameManager.has(identifier)) {\n const reference = this.workbook!.nameManager.getReference(identifier);\n if (reference) {\n // Check if it's a remote reference (contains !)\n if (reference.includes('!')) {\n // It's a cross-sheet reference\n remoteDeps[reference] = true;\n } else {\n // Parse the reference to extract cell addresses\n if (reference.includes(':')) {\n // It's a range\n const addresses = this.expandCellRange(reference);\n addresses.forEach(addr => {\n localDeps[addr] = true;\n });\n } else if (/^[A-Z]+[0-9]+$/.test(reference)) {\n // It's a single cell\n localDeps[reference] = true;\n }\n }\n }\n }\n });\n }\n }\n\n // Note: Column ranges (A:A) and row ranges (1:1) are dynamic dependencies\n // and should be handled separately as they don't have fixed precedents\n\n return { localDeps, remoteDeps };\n }\n\n private isFunctionOrKeyword(text: string): boolean {\n const keywords = [\n 'SUM', 'AVERAGE', 'MAX', 'MIN', 'COUNT', 'IF', 'AND', 'OR',\n 'VLOOKUP', 'HLOOKUP', 'INDEX', 'MATCH', 'CONCATENATE',\n 'TRUE', 'FALSE', 'NULL'\n ];\n return keywords.includes(text.toUpperCase());\n }\n\n /**\n * Extract cell addresses from a cell range (e.g., \"A1:B3\")\n * Handles reverse ranges like \"B2:A1\" by normalizing them\n */\n private expandCellRange(range: string): string[] {\n const [start, end] = range.split(':');\n const addresses: string[] = [];\n\n const startColMatch = start.match(/[A-Z]+/);\n const startRowMatch = start.match(/\\d+/);\n const endColMatch = end.match(/[A-Z]+/);\n const endRowMatch = end.match(/\\d+/);\n\n if (!startColMatch || !startRowMatch || !endColMatch || !endRowMatch) {\n return [];\n }\n\n const startCol = startColMatch[0];\n const startRow = parseInt(startRowMatch[0]);\n const endCol = endColMatch[0];\n const endRow = parseInt(endRowMatch[0]);\n\n const colToNum = (col: string) => {\n let num = 0;\n for (let i = 0; i < col.length; i++) {\n num = num * 26 + (col.charCodeAt(i) - 64);\n }\n return num;\n };\n\n const numToCol = (num: number) => {\n let col = '';\n while (num > 0) {\n const remainder = (num - 1) % 26;\n col = String.fromCharCode(65 + remainder) + col;\n num = Math.floor((num - 1) / 26);\n }\n return col;\n };\n\n const startColNum = colToNum(startCol);\n const endColNum = colToNum(endCol);\n\n // Normalize range to handle reverse ranges (B2:A1 -> A1:B2)\n const minRow = Math.min(startRow, endRow);\n const maxRow = Math.max(startRow, endRow);\n const minCol = Math.min(startColNum, endColNum);\n const maxCol = Math.max(startColNum, endColNum);\n\n for (let row = minRow; row <= maxRow; row++) {\n for (let col = minCol; col <= maxCol; col++) {\n addresses.push(numToCol(col) + row);\n }\n }\n\n return addresses;\n }\n}","var baseIsSet = require('./_baseIsSet'),\n baseUnary = require('./_baseUnary'),\n nodeUtil = require('./_nodeUtil');\n\n/* Node.js helper references. */\nvar nodeIsSet = nodeUtil && nodeUtil.isSet;\n\n/**\n * Checks if `value` is classified as a `Set` object.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a set, else `false`.\n * @example\n *\n * _.isSet(new Set);\n * // => true\n *\n * _.isSet(new WeakSet);\n * // => false\n */\nvar isSet = nodeIsSet ? baseUnary(nodeIsSet) : baseIsSet;\n\nmodule.exports = isSet;\n","\"use strict\";\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.serializeProduction = exports.serializeGrammar = exports.Terminal = exports.Alternation = exports.RepetitionWithSeparator = exports.Repetition = exports.RepetitionMandatoryWithSeparator = exports.RepetitionMandatory = exports.Option = exports.Alternative = exports.Rule = exports.NonTerminal = exports.AbstractProduction = void 0;\nvar map_1 = __importDefault(require(\"lodash/map\"));\nvar forEach_1 = __importDefault(require(\"lodash/forEach\"));\nvar isString_1 = __importDefault(require(\"lodash/isString\"));\nvar isRegExp_1 = __importDefault(require(\"lodash/isRegExp\"));\nvar pickBy_1 = __importDefault(require(\"lodash/pickBy\"));\nvar assign_1 = __importDefault(require(\"lodash/assign\"));\n// TODO: duplicated code to avoid extracting another sub-package -- how to avoid?\nfunction tokenLabel(tokType) {\n if (hasTokenLabel(tokType)) {\n return tokType.LABEL;\n }\n else {\n return tokType.name;\n }\n}\n// TODO: duplicated code to avoid extracting another sub-package -- how to avoid?\nfunction hasTokenLabel(obj) {\n return (0, isString_1.default)(obj.LABEL) && obj.LABEL !== \"\";\n}\nvar AbstractProduction = /** @class */ (function () {\n function AbstractProduction(_definition) {\n this._definition = _definition;\n }\n Object.defineProperty(AbstractProduction.prototype, \"definition\", {\n get: function () {\n return this._definition;\n },\n set: function (value) {\n this._definition = value;\n },\n enumerable: false,\n configurable: true\n });\n AbstractProduction.prototype.accept = function (visitor) {\n visitor.visit(this);\n (0, forEach_1.default)(this.definition, function (prod) {\n prod.accept(visitor);\n });\n };\n return AbstractProduction;\n}());\nexports.AbstractProduction = AbstractProduction;\nvar NonTerminal = /** @class */ (function (_super) {\n __extends(NonTerminal, _super);\n function NonTerminal(options) {\n var _this = _super.call(this, []) || this;\n _this.idx = 1;\n (0, assign_1.default)(_this, (0, pickBy_1.default)(options, function (v) { return v !== undefined; }));\n return _this;\n }\n Object.defineProperty(NonTerminal.prototype, \"definition\", {\n get: function () {\n if (this.referencedRule !== undefined) {\n return this.referencedRule.definition;\n }\n return [];\n },\n set: function (definition) {\n // immutable\n },\n enumerable: false,\n configurable: true\n });\n NonTerminal.prototype.accept = function (visitor) {\n visitor.visit(this);\n // don't visit children of a reference, we will get cyclic infinite loops if we do so\n };\n return NonTerminal;\n}(AbstractProduction));\nexports.NonTerminal = NonTerminal;\nvar Rule = /** @class */ (function (_super) {\n __extends(Rule, _super);\n function Rule(options) {\n var _this = _super.call(this, options.definition) || this;\n _this.orgText = \"\";\n (0, assign_1.default)(_this, (0, pickBy_1.default)(options, function (v) { return v !== undefined; }));\n return _this;\n }\n return Rule;\n}(AbstractProduction));\nexports.Rule = Rule;\nvar Alternative = /** @class */ (function (_super) {\n __extends(Alternative, _super);\n function Alternative(options) {\n var _this = _super.call(this, options.definition) || this;\n _this.ignoreAmbiguities = false;\n (0, assign_1.default)(_this, (0, pickBy_1.default)(options, function (v) { return v !== undefined; }));\n return _this;\n }\n return Alternative;\n}(AbstractProduction));\nexports.Alternative = Alternative;\nvar Option = /** @class */ (function (_super) {\n __extends(Option, _super);\n function Option(options) {\n var _this = _super.call(this, options.definition) || this;\n _this.idx = 1;\n (0, assign_1.default)(_this, (0, pickBy_1.default)(options, function (v) { return v !== undefined; }));\n return _this;\n }\n return Option;\n}(AbstractProduction));\nexports.Option = Option;\nvar RepetitionMandatory = /** @class */ (function (_super) {\n __extends(RepetitionMandatory, _super);\n function RepetitionMandatory(options) {\n var _this = _super.call(this, options.definition) || this;\n _this.idx = 1;\n (0, assign_1.default)(_this, (0, pickBy_1.default)(options, function (v) { return v !== undefined; }));\n return _this;\n }\n return RepetitionMandatory;\n}(AbstractProduction));\nexports.RepetitionMandatory = RepetitionMandatory;\nvar RepetitionMandatoryWithSeparator = /** @class */ (function (_super) {\n __extends(RepetitionMandatoryWithSeparator, _super);\n function RepetitionMandatoryWithSeparator(options) {\n var _this = _super.call(this, options.definition) || this;\n _this.idx = 1;\n (0, assign_1.default)(_this, (0, pickBy_1.default)(options, function (v) { return v !== undefined; }));\n return _this;\n }\n return RepetitionMandatoryWithSeparator;\n}(AbstractProduction));\nexports.RepetitionMandatoryWithSeparator = RepetitionMandatoryWithSeparator;\nvar Repetition = /** @class */ (function (_super) {\n __extends(Repetition, _super);\n function Repetition(options) {\n var _this = _super.call(this, options.definition) || this;\n _this.idx = 1;\n (0, assign_1.default)(_this, (0, pickBy_1.default)(options, function (v) { return v !== undefined; }));\n return _this;\n }\n return Repetition;\n}(AbstractProduction));\nexports.Repetition = Repetition;\nvar RepetitionWithSeparator = /** @class */ (function (_super) {\n __extends(RepetitionWithSeparator, _super);\n function RepetitionWithSeparator(options) {\n var _this = _super.call(this, options.definition) || this;\n _this.idx = 1;\n (0, assign_1.default)(_this, (0, pickBy_1.default)(options, function (v) { return v !== undefined; }));\n return _this;\n }\n return RepetitionWithSeparator;\n}(AbstractProduction));\nexports.RepetitionWithSeparator = RepetitionWithSeparator;\nvar Alternation = /** @class */ (function (_super) {\n __extends(Alternation, _super);\n function Alternation(options) {\n var _this = _super.call(this, options.definition) || this;\n _this.idx = 1;\n _this.ignoreAmbiguities = false;\n _this.hasPredicates = false;\n (0, assign_1.default)(_this, (0, pickBy_1.default)(options, function (v) { return v !== undefined; }));\n return _this;\n }\n Object.defineProperty(Alternation.prototype, \"definition\", {\n get: function () {\n return this._definition;\n },\n set: function (value) {\n this._definition = value;\n },\n enumerable: false,\n configurable: true\n });\n return Alternation;\n}(AbstractProduction));\nexports.Alternation = Alternation;\nvar Terminal = /** @class */ (function () {\n function Terminal(options) {\n this.idx = 1;\n (0, assign_1.default)(this, (0, pickBy_1.default)(options, function (v) { return v !== undefined; }));\n }\n Terminal.prototype.accept = function (visitor) {\n visitor.visit(this);\n };\n return Terminal;\n}());\nexports.Terminal = Terminal;\nfunction serializeGrammar(topRules) {\n return (0, map_1.default)(topRules, serializeProduction);\n}\nexports.serializeGrammar = serializeGrammar;\nfunction serializeProduction(node) {\n function convertDefinition(definition) {\n return (0, map_1.default)(definition, serializeProduction);\n }\n /* istanbul ignore else */\n if (node instanceof NonTerminal) {\n var serializedNonTerminal = {\n type: \"NonTerminal\",\n name: node.nonTerminalName,\n idx: node.idx\n };\n if ((0, isString_1.default)(node.label)) {\n serializedNonTerminal.label = node.label;\n }\n return serializedNonTerminal;\n }\n else if (node instanceof Alternative) {\n return {\n type: \"Alternative\",\n definition: convertDefinition(node.definition)\n };\n }\n else if (node instanceof Option) {\n return {\n type: \"Option\",\n idx: node.idx,\n definition: convertDefinition(node.definition)\n };\n }\n else if (node instanceof RepetitionMandatory) {\n return {\n type: \"RepetitionMandatory\",\n idx: node.idx,\n definition: convertDefinition(node.definition)\n };\n }\n else if (node instanceof RepetitionMandatoryWithSeparator) {\n return {\n type: \"RepetitionMandatoryWithSeparator\",\n idx: node.idx,\n separator: (serializeProduction(new Terminal({ terminalType: node.separator }))),\n definition: convertDefinition(node.definition)\n };\n }\n else if (node instanceof RepetitionWithSeparator) {\n return {\n type: \"RepetitionWithSeparator\",\n idx: node.idx,\n separator: (serializeProduction(new Terminal({ terminalType: node.separator }))),\n definition: convertDefinition(node.definition)\n };\n }\n else if (node instanceof Repetition) {\n return {\n type: \"Repetition\",\n idx: node.idx,\n definition: convertDefinition(node.definition)\n };\n }\n else if (node instanceof Alternation) {\n return {\n type: \"Alternation\",\n idx: node.idx,\n definition: convertDefinition(node.definition)\n };\n }\n else if (node instanceof Terminal) {\n var serializedTerminal = {\n type: \"Terminal\",\n name: node.terminalType.name,\n label: tokenLabel(node.terminalType),\n idx: node.idx\n };\n if ((0, isString_1.default)(node.label)) {\n serializedTerminal.terminalLabel = node.label;\n }\n var pattern = node.terminalType.PATTERN;\n if (node.terminalType.PATTERN) {\n serializedTerminal.pattern = (0, isRegExp_1.default)(pattern)\n ? pattern.source\n : pattern;\n }\n return serializedTerminal;\n }\n else if (node instanceof Rule) {\n return {\n type: \"Rule\",\n name: node.name,\n orgText: node.orgText,\n definition: convertDefinition(node.definition)\n };\n }\n else {\n throw Error(\"non exhaustive match\");\n }\n}\nexports.serializeProduction = serializeProduction;\n//# sourceMappingURL=model.js.map","var isArray = require('./isArray'),\n isSymbol = require('./isSymbol');\n\n/** Used to match property names within property paths. */\nvar reIsDeepProp = /\\.|\\[(?:[^[\\]]*|([\"'])(?:(?!\\1)[^\\\\]|\\\\.)*?\\1)\\]/,\n reIsPlainProp = /^\\w*$/;\n\n/**\n * Checks if `value` is a property name and not a property path.\n *\n * @private\n * @param {*} value The value to check.\n * @param {Object} [object] The object to query keys on.\n * @returns {boolean} Returns `true` if `value` is a property name, else `false`.\n */\nfunction isKey(value, object) {\n if (isArray(value)) {\n return false;\n }\n var type = typeof value;\n if (type == 'number' || type == 'symbol' || type == 'boolean' ||\n value == null || isSymbol(value)) {\n return true;\n }\n return reIsPlainProp.test(value) || !reIsDeepProp.test(value) ||\n (object != null && value in Object(object));\n}\n\nmodule.exports = isKey;\n","var assocIndexOf = require('./_assocIndexOf');\n\n/**\n * Checks if a list cache value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf ListCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction listCacheHas(key) {\n return assocIndexOf(this.__data__, key) > -1;\n}\n\nmodule.exports = listCacheHas;\n","\"use strict\";\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.areTokenCategoriesNotUsed = exports.isStrictPrefixOfPath = exports.containsPath = exports.getLookaheadPathsForOptionalProd = exports.getLookaheadPathsForOr = exports.lookAheadSequenceFromAlternatives = exports.buildSingleAlternativeLookaheadFunction = exports.buildAlternativesLookAheadFunc = exports.buildLookaheadFuncForOptionalProd = exports.buildLookaheadFuncForOr = exports.getLookaheadPaths = exports.getProdType = exports.PROD_TYPE = void 0;\nvar isEmpty_1 = __importDefault(require(\"lodash/isEmpty\"));\nvar flatten_1 = __importDefault(require(\"lodash/flatten\"));\nvar every_1 = __importDefault(require(\"lodash/every\"));\nvar map_1 = __importDefault(require(\"lodash/map\"));\nvar forEach_1 = __importDefault(require(\"lodash/forEach\"));\nvar has_1 = __importDefault(require(\"lodash/has\"));\nvar reduce_1 = __importDefault(require(\"lodash/reduce\"));\nvar interpreter_1 = require(\"./interpreter\");\nvar rest_1 = require(\"./rest\");\nvar tokens_1 = require(\"../../scan/tokens\");\nvar gast_1 = require(\"@chevrotain/gast\");\nvar gast_2 = require(\"@chevrotain/gast\");\nvar PROD_TYPE;\n(function (PROD_TYPE) {\n PROD_TYPE[PROD_TYPE[\"OPTION\"] = 0] = \"OPTION\";\n PROD_TYPE[PROD_TYPE[\"REPETITION\"] = 1] = \"REPETITION\";\n PROD_TYPE[PROD_TYPE[\"REPETITION_MANDATORY\"] = 2] = \"REPETITION_MANDATORY\";\n PROD_TYPE[PROD_TYPE[\"REPETITION_MANDATORY_WITH_SEPARATOR\"] = 3] = \"REPETITION_MANDATORY_WITH_SEPARATOR\";\n PROD_TYPE[PROD_TYPE[\"REPETITION_WITH_SEPARATOR\"] = 4] = \"REPETITION_WITH_SEPARATOR\";\n PROD_TYPE[PROD_TYPE[\"ALTERNATION\"] = 5] = \"ALTERNATION\";\n})(PROD_TYPE = exports.PROD_TYPE || (exports.PROD_TYPE = {}));\nfunction getProdType(prod) {\n /* istanbul ignore else */\n if (prod instanceof gast_1.Option || prod === \"Option\") {\n return PROD_TYPE.OPTION;\n }\n else if (prod instanceof gast_1.Repetition || prod === \"Repetition\") {\n return PROD_TYPE.REPETITION;\n }\n else if (prod instanceof gast_1.RepetitionMandatory ||\n prod === \"RepetitionMandatory\") {\n return PROD_TYPE.REPETITION_MANDATORY;\n }\n else if (prod instanceof gast_1.RepetitionMandatoryWithSeparator ||\n prod === \"RepetitionMandatoryWithSeparator\") {\n return PROD_TYPE.REPETITION_MANDATORY_WITH_SEPARATOR;\n }\n else if (prod instanceof gast_1.RepetitionWithSeparator ||\n prod === \"RepetitionWithSeparator\") {\n return PROD_TYPE.REPETITION_WITH_SEPARATOR;\n }\n else if (prod instanceof gast_1.Alternation || prod === \"Alternation\") {\n return PROD_TYPE.ALTERNATION;\n }\n else {\n throw Error(\"non exhaustive match\");\n }\n}\nexports.getProdType = getProdType;\nfunction getLookaheadPaths(options) {\n var occurrence = options.occurrence, rule = options.rule, prodType = options.prodType, maxLookahead = options.maxLookahead;\n var type = getProdType(prodType);\n if (type === PROD_TYPE.ALTERNATION) {\n return getLookaheadPathsForOr(occurrence, rule, maxLookahead);\n }\n else {\n return getLookaheadPathsForOptionalProd(occurrence, rule, type, maxLookahead);\n }\n}\nexports.getLookaheadPaths = getLookaheadPaths;\nfunction buildLookaheadFuncForOr(occurrence, ruleGrammar, maxLookahead, hasPredicates, dynamicTokensEnabled, laFuncBuilder) {\n var lookAheadPaths = getLookaheadPathsForOr(occurrence, ruleGrammar, maxLookahead);\n var tokenMatcher = areTokenCategoriesNotUsed(lookAheadPaths)\n ? tokens_1.tokenStructuredMatcherNoCategories\n : tokens_1.tokenStructuredMatcher;\n return laFuncBuilder(lookAheadPaths, hasPredicates, tokenMatcher, dynamicTokensEnabled);\n}\nexports.buildLookaheadFuncForOr = buildLookaheadFuncForOr;\n/**\n * When dealing with an Optional production (OPTION/MANY/2nd iteration of AT_LEAST_ONE/...) we need to compare\n * the lookahead \"inside\" the production and the lookahead immediately \"after\" it in the same top level rule (context free).\n *\n * Example: given a production:\n * ABC(DE)?DF\n *\n * The optional '(DE)?' should only be entered if we see 'DE'. a single Token 'D' is not sufficient to distinguish between the two\n * alternatives.\n *\n * @returns A Lookahead function which will return true IFF the parser should parse the Optional production.\n */\nfunction buildLookaheadFuncForOptionalProd(occurrence, ruleGrammar, k, dynamicTokensEnabled, prodType, lookaheadBuilder) {\n var lookAheadPaths = getLookaheadPathsForOptionalProd(occurrence, ruleGrammar, prodType, k);\n var tokenMatcher = areTokenCategoriesNotUsed(lookAheadPaths)\n ? tokens_1.tokenStructuredMatcherNoCategories\n : tokens_1.tokenStructuredMatcher;\n return lookaheadBuilder(lookAheadPaths[0], tokenMatcher, dynamicTokensEnabled);\n}\nexports.buildLookaheadFuncForOptionalProd = buildLookaheadFuncForOptionalProd;\nfunction buildAlternativesLookAheadFunc(alts, hasPredicates, tokenMatcher, dynamicTokensEnabled) {\n var numOfAlts = alts.length;\n var areAllOneTokenLookahead = (0, every_1.default)(alts, function (currAlt) {\n return (0, every_1.default)(currAlt, function (currPath) {\n return currPath.length === 1;\n });\n });\n // This version takes into account the predicates as well.\n if (hasPredicates) {\n /**\n * @returns {number} - The chosen alternative index\n */\n return function (orAlts) {\n // unfortunately the predicates must be extracted every single time\n // as they cannot be cached due to references to parameters(vars) which are no longer valid.\n // note that in the common case of no predicates, no cpu time will be wasted on this (see else block)\n var predicates = (0, map_1.default)(orAlts, function (currAlt) { return currAlt.GATE; });\n for (var t = 0; t < numOfAlts; t++) {\n var currAlt = alts[t];\n var currNumOfPaths = currAlt.length;\n var currPredicate = predicates[t];\n if (currPredicate !== undefined && currPredicate.call(this) === false) {\n // if the predicate does not match there is no point in checking the paths\n continue;\n }\n nextPath: for (var j = 0; j < currNumOfPaths; j++) {\n var currPath = currAlt[j];\n var currPathLength = currPath.length;\n for (var i = 0; i < currPathLength; i++) {\n var nextToken = this.LA(i + 1);\n if (tokenMatcher(nextToken, currPath[i]) === false) {\n // mismatch in current path\n // try the next pth\n continue nextPath;\n }\n }\n // found a full path that matches.\n // this will also work for an empty ALT as the loop will be skipped\n return t;\n }\n // none of the paths for the current alternative matched\n // try the next alternative\n }\n // none of the alternatives could be matched\n return undefined;\n };\n }\n else if (areAllOneTokenLookahead && !dynamicTokensEnabled) {\n // optimized (common) case of all the lookaheads paths requiring only\n // a single token lookahead. These Optimizations cannot work if dynamically defined Tokens are used.\n var singleTokenAlts = (0, map_1.default)(alts, function (currAlt) {\n return (0, flatten_1.default)(currAlt);\n });\n var choiceToAlt_1 = (0, reduce_1.default)(singleTokenAlts, function (result, currAlt, idx) {\n (0, forEach_1.default)(currAlt, function (currTokType) {\n if (!(0, has_1.default)(result, currTokType.tokenTypeIdx)) {\n result[currTokType.tokenTypeIdx] = idx;\n }\n (0, forEach_1.default)(currTokType.categoryMatches, function (currExtendingType) {\n if (!(0, has_1.default)(result, currExtendingType)) {\n result[currExtendingType] = idx;\n }\n });\n });\n return result;\n }, {});\n /**\n * @returns {number} - The chosen alternative index\n */\n return function () {\n var nextToken = this.LA(1);\n return choiceToAlt_1[nextToken.tokenTypeIdx];\n };\n }\n else {\n // optimized lookahead without needing to check the predicates at all.\n // this causes code duplication which is intentional to improve performance.\n /**\n * @returns {number} - The chosen alternative index\n */\n return function () {\n for (var t = 0; t < numOfAlts; t++) {\n var currAlt = alts[t];\n var currNumOfPaths = currAlt.length;\n nextPath: for (var j = 0; j < currNumOfPaths; j++) {\n var currPath = currAlt[j];\n var currPathLength = currPath.length;\n for (var i = 0; i < currPathLength; i++) {\n var nextToken = this.LA(i + 1);\n if (tokenMatcher(nextToken, currPath[i]) === false) {\n // mismatch in current path\n // try the next pth\n continue nextPath;\n }\n }\n // found a full path that matches.\n // this will also work for an empty ALT as the loop will be skipped\n return t;\n }\n // none of the paths for the current alternative matched\n // try the next alternative\n }\n // none of the alternatives could be matched\n return undefined;\n };\n }\n}\nexports.buildAlternativesLookAheadFunc = buildAlternativesLookAheadFunc;\nfunction buildSingleAlternativeLookaheadFunction(alt, tokenMatcher, dynamicTokensEnabled) {\n var areAllOneTokenLookahead = (0, every_1.default)(alt, function (currPath) {\n return currPath.length === 1;\n });\n var numOfPaths = alt.length;\n // optimized (common) case of all the lookaheads paths requiring only\n // a single token lookahead.\n if (areAllOneTokenLookahead && !dynamicTokensEnabled) {\n var singleTokensTypes = (0, flatten_1.default)(alt);\n if (singleTokensTypes.length === 1 &&\n (0, isEmpty_1.default)(singleTokensTypes[0].categoryMatches)) {\n var expectedTokenType = singleTokensTypes[0];\n var expectedTokenUniqueKey_1 = expectedTokenType.tokenTypeIdx;\n return function () {\n return this.LA(1).tokenTypeIdx === expectedTokenUniqueKey_1;\n };\n }\n else {\n var choiceToAlt_2 = (0, reduce_1.default)(singleTokensTypes, function (result, currTokType, idx) {\n result[currTokType.tokenTypeIdx] = true;\n (0, forEach_1.default)(currTokType.categoryMatches, function (currExtendingType) {\n result[currExtendingType] = true;\n });\n return result;\n }, []);\n return function () {\n var nextToken = this.LA(1);\n return choiceToAlt_2[nextToken.tokenTypeIdx] === true;\n };\n }\n }\n else {\n return function () {\n nextPath: for (var j = 0; j < numOfPaths; j++) {\n var currPath = alt[j];\n var currPathLength = currPath.length;\n for (var i = 0; i < currPathLength; i++) {\n var nextToken = this.LA(i + 1);\n if (tokenMatcher(nextToken, currPath[i]) === false) {\n // mismatch in current path\n // try the next pth\n continue nextPath;\n }\n }\n // found a full path that matches.\n return true;\n }\n // none of the paths matched\n return false;\n };\n }\n}\nexports.buildSingleAlternativeLookaheadFunction = buildSingleAlternativeLookaheadFunction;\nvar RestDefinitionFinderWalker = /** @class */ (function (_super) {\n __extends(RestDefinitionFinderWalker, _super);\n function RestDefinitionFinderWalker(topProd, targetOccurrence, targetProdType) {\n var _this = _super.call(this) || this;\n _this.topProd = topProd;\n _this.targetOccurrence = targetOccurrence;\n _this.targetProdType = targetProdType;\n return _this;\n }\n RestDefinitionFinderWalker.prototype.startWalking = function () {\n this.walk(this.topProd);\n return this.restDef;\n };\n RestDefinitionFinderWalker.prototype.checkIsTarget = function (node, expectedProdType, currRest, prevRest) {\n if (node.idx === this.targetOccurrence &&\n this.targetProdType === expectedProdType) {\n this.restDef = currRest.concat(prevRest);\n return true;\n }\n // performance optimization, do not iterate over the entire Grammar ast after we have found the target\n return false;\n };\n RestDefinitionFinderWalker.prototype.walkOption = function (optionProd, currRest, prevRest) {\n if (!this.checkIsTarget(optionProd, PROD_TYPE.OPTION, currRest, prevRest)) {\n _super.prototype.walkOption.call(this, optionProd, currRest, prevRest);\n }\n };\n RestDefinitionFinderWalker.prototype.walkAtLeastOne = function (atLeastOneProd, currRest, prevRest) {\n if (!this.checkIsTarget(atLeastOneProd, PROD_TYPE.REPETITION_MANDATORY, currRest, prevRest)) {\n _super.prototype.walkOption.call(this, atLeastOneProd, currRest, prevRest);\n }\n };\n RestDefinitionFinderWalker.prototype.walkAtLeastOneSep = function (atLeastOneSepProd, currRest, prevRest) {\n if (!this.checkIsTarget(atLeastOneSepProd, PROD_TYPE.REPETITION_MANDATORY_WITH_SEPARATOR, currRest, prevRest)) {\n _super.prototype.walkOption.call(this, atLeastOneSepProd, currRest, prevRest);\n }\n };\n RestDefinitionFinderWalker.prototype.walkMany = function (manyProd, currRest, prevRest) {\n if (!this.checkIsTarget(manyProd, PROD_TYPE.REPETITION, currRest, prevRest)) {\n _super.prototype.walkOption.call(this, manyProd, currRest, prevRest);\n }\n };\n RestDefinitionFinderWalker.prototype.walkManySep = function (manySepProd, currRest, prevRest) {\n if (!this.checkIsTarget(manySepProd, PROD_TYPE.REPETITION_WITH_SEPARATOR, currRest, prevRest)) {\n _super.prototype.walkOption.call(this, manySepProd, currRest, prevRest);\n }\n };\n return RestDefinitionFinderWalker;\n}(rest_1.RestWalker));\n/**\n * Returns the definition of a target production in a top level level rule.\n */\nvar InsideDefinitionFinderVisitor = /** @class */ (function (_super) {\n __extends(InsideDefinitionFinderVisitor, _super);\n function InsideDefinitionFinderVisitor(targetOccurrence, targetProdType, targetRef) {\n var _this = _super.call(this) || this;\n _this.targetOccurrence = targetOccurrence;\n _this.targetProdType = targetProdType;\n _this.targetRef = targetRef;\n _this.result = [];\n return _this;\n }\n InsideDefinitionFinderVisitor.prototype.checkIsTarget = function (node, expectedProdName) {\n if (node.idx === this.targetOccurrence &&\n this.targetProdType === expectedProdName &&\n (this.targetRef === undefined || node === this.targetRef)) {\n this.result = node.definition;\n }\n };\n InsideDefinitionFinderVisitor.prototype.visitOption = function (node) {\n this.checkIsTarget(node, PROD_TYPE.OPTION);\n };\n InsideDefinitionFinderVisitor.prototype.visitRepetition = function (node) {\n this.checkIsTarget(node, PROD_TYPE.REPETITION);\n };\n InsideDefinitionFinderVisitor.prototype.visitRepetitionMandatory = function (node) {\n this.checkIsTarget(node, PROD_TYPE.REPETITION_MANDATORY);\n };\n InsideDefinitionFinderVisitor.prototype.visitRepetitionMandatoryWithSeparator = function (node) {\n this.checkIsTarget(node, PROD_TYPE.REPETITION_MANDATORY_WITH_SEPARATOR);\n };\n InsideDefinitionFinderVisitor.prototype.visitRepetitionWithSeparator = function (node) {\n this.checkIsTarget(node, PROD_TYPE.REPETITION_WITH_SEPARATOR);\n };\n InsideDefinitionFinderVisitor.prototype.visitAlternation = function (node) {\n this.checkIsTarget(node, PROD_TYPE.ALTERNATION);\n };\n return InsideDefinitionFinderVisitor;\n}(gast_2.GAstVisitor));\nfunction initializeArrayOfArrays(size) {\n var result = new Array(size);\n for (var i = 0; i < size; i++) {\n result[i] = [];\n }\n return result;\n}\n/**\n * A sort of hash function between a Path in the grammar and a string.\n * Note that this returns multiple \"hashes\" to support the scenario of token categories.\n * - A single path with categories may match multiple **actual** paths.\n */\nfunction pathToHashKeys(path) {\n var keys = [\"\"];\n for (var i = 0; i < path.length; i++) {\n var tokType = path[i];\n var longerKeys = [];\n for (var j = 0; j < keys.length; j++) {\n var currShorterKey = keys[j];\n longerKeys.push(currShorterKey + \"_\" + tokType.tokenTypeIdx);\n for (var t = 0; t < tokType.categoryMatches.length; t++) {\n var categoriesKeySuffix = \"_\" + tokType.categoryMatches[t];\n longerKeys.push(currShorterKey + categoriesKeySuffix);\n }\n }\n keys = longerKeys;\n }\n return keys;\n}\n/**\n * Imperative style due to being called from a hot spot\n */\nfunction isUniquePrefixHash(altKnownPathsKeys, searchPathKeys, idx) {\n for (var currAltIdx = 0; currAltIdx < altKnownPathsKeys.length; currAltIdx++) {\n // We only want to test vs the other alternatives\n if (currAltIdx === idx) {\n continue;\n }\n var otherAltKnownPathsKeys = altKnownPathsKeys[currAltIdx];\n for (var searchIdx = 0; searchIdx < searchPathKeys.length; searchIdx++) {\n var searchKey = searchPathKeys[searchIdx];\n if (otherAltKnownPathsKeys[searchKey] === true) {\n return false;\n }\n }\n }\n // None of the SearchPathKeys were found in any of the other alternatives\n return true;\n}\nfunction lookAheadSequenceFromAlternatives(altsDefs, k) {\n var partialAlts = (0, map_1.default)(altsDefs, function (currAlt) {\n return (0, interpreter_1.possiblePathsFrom)([currAlt], 1);\n });\n var finalResult = initializeArrayOfArrays(partialAlts.length);\n var altsHashes = (0, map_1.default)(partialAlts, function (currAltPaths) {\n var dict = {};\n (0, forEach_1.default)(currAltPaths, function (item) {\n var keys = pathToHashKeys(item.partialPath);\n (0, forEach_1.default)(keys, function (currKey) {\n dict[currKey] = true;\n });\n });\n return dict;\n });\n var newData = partialAlts;\n // maxLookahead loop\n for (var pathLength = 1; pathLength <= k; pathLength++) {\n var currDataset = newData;\n newData = initializeArrayOfArrays(currDataset.length);\n var _loop_1 = function (altIdx) {\n var currAltPathsAndSuffixes = currDataset[altIdx];\n // paths in current alternative loop\n for (var currPathIdx = 0; currPathIdx < currAltPathsAndSuffixes.length; currPathIdx++) {\n var currPathPrefix = currAltPathsAndSuffixes[currPathIdx].partialPath;\n var suffixDef = currAltPathsAndSuffixes[currPathIdx].suffixDef;\n var prefixKeys = pathToHashKeys(currPathPrefix);\n var isUnique = isUniquePrefixHash(altsHashes, prefixKeys, altIdx);\n // End of the line for this path.\n if (isUnique || (0, isEmpty_1.default)(suffixDef) || currPathPrefix.length === k) {\n var currAltResult = finalResult[altIdx];\n // TODO: Can we implement a containsPath using Maps/Dictionaries?\n if (containsPath(currAltResult, currPathPrefix) === false) {\n currAltResult.push(currPathPrefix);\n // Update all new keys for the current path.\n for (var j = 0; j < prefixKeys.length; j++) {\n var currKey = prefixKeys[j];\n altsHashes[altIdx][currKey] = true;\n }\n }\n }\n // Expand longer paths\n else {\n var newPartialPathsAndSuffixes = (0, interpreter_1.possiblePathsFrom)(suffixDef, pathLength + 1, currPathPrefix);\n newData[altIdx] = newData[altIdx].concat(newPartialPathsAndSuffixes);\n // Update keys for new known paths\n (0, forEach_1.default)(newPartialPathsAndSuffixes, function (item) {\n var prefixKeys = pathToHashKeys(item.partialPath);\n (0, forEach_1.default)(prefixKeys, function (key) {\n altsHashes[altIdx][key] = true;\n });\n });\n }\n }\n };\n // alternatives loop\n for (var altIdx = 0; altIdx < currDataset.length; altIdx++) {\n _loop_1(altIdx);\n }\n }\n return finalResult;\n}\nexports.lookAheadSequenceFromAlternatives = lookAheadSequenceFromAlternatives;\nfunction getLookaheadPathsForOr(occurrence, ruleGrammar, k, orProd) {\n var visitor = new InsideDefinitionFinderVisitor(occurrence, PROD_TYPE.ALTERNATION, orProd);\n ruleGrammar.accept(visitor);\n return lookAheadSequenceFromAlternatives(visitor.result, k);\n}\nexports.getLookaheadPathsForOr = getLookaheadPathsForOr;\nfunction getLookaheadPathsForOptionalProd(occurrence, ruleGrammar, prodType, k) {\n var insideDefVisitor = new InsideDefinitionFinderVisitor(occurrence, prodType);\n ruleGrammar.accept(insideDefVisitor);\n var insideDef = insideDefVisitor.result;\n var afterDefWalker = new RestDefinitionFinderWalker(ruleGrammar, occurrence, prodType);\n var afterDef = afterDefWalker.startWalking();\n var insideFlat = new gast_1.Alternative({ definition: insideDef });\n var afterFlat = new gast_1.Alternative({ definition: afterDef });\n return lookAheadSequenceFromAlternatives([insideFlat, afterFlat], k);\n}\nexports.getLookaheadPathsForOptionalProd = getLookaheadPathsForOptionalProd;\nfunction containsPath(alternative, searchPath) {\n compareOtherPath: for (var i = 0; i < alternative.length; i++) {\n var otherPath = alternative[i];\n if (otherPath.length !== searchPath.length) {\n continue;\n }\n for (var j = 0; j < otherPath.length; j++) {\n var searchTok = searchPath[j];\n var otherTok = otherPath[j];\n var matchingTokens = searchTok === otherTok ||\n otherTok.categoryMatchesMap[searchTok.tokenTypeIdx] !== undefined;\n if (matchingTokens === false) {\n continue compareOtherPath;\n }\n }\n return true;\n }\n return false;\n}\nexports.containsPath = containsPath;\nfunction isStrictPrefixOfPath(prefix, other) {\n return (prefix.length < other.length &&\n (0, every_1.default)(prefix, function (tokType, idx) {\n var otherTokType = other[idx];\n return (tokType === otherTokType ||\n otherTokType.categoryMatchesMap[tokType.tokenTypeIdx]);\n }));\n}\nexports.isStrictPrefixOfPath = isStrictPrefixOfPath;\nfunction areTokenCategoriesNotUsed(lookAheadPaths) {\n return (0, every_1.default)(lookAheadPaths, function (singleAltPaths) {\n return (0, every_1.default)(singleAltPaths, function (singlePath) {\n return (0, every_1.default)(singlePath, function (token) { return (0, isEmpty_1.default)(token.categoryMatches); });\n });\n });\n}\nexports.areTokenCategoriesNotUsed = areTokenCategoriesNotUsed;\n//# sourceMappingURL=lookahead.js.map","var baseSlice = require('./_baseSlice');\n\n/**\n * Casts `array` to a slice if it's needed.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {number} start The start position.\n * @param {number} [end=array.length] The end position.\n * @returns {Array} Returns the cast slice.\n */\nfunction castSlice(array, start, end) {\n var length = array.length;\n end = end === undefined ? length : end;\n return (!start && end >= length) ? array : baseSlice(array, start, end);\n}\n\nmodule.exports = castSlice;\n","var MapCache = require('./_MapCache'),\n setCacheAdd = require('./_setCacheAdd'),\n setCacheHas = require('./_setCacheHas');\n\n/**\n *\n * Creates an array cache object to store unique values.\n *\n * @private\n * @constructor\n * @param {Array} [values] The values to cache.\n */\nfunction SetCache(values) {\n var index = -1,\n length = values == null ? 0 : values.length;\n\n this.__data__ = new MapCache;\n while (++index < length) {\n this.add(values[index]);\n }\n}\n\n// Add methods to `SetCache`.\nSetCache.prototype.add = SetCache.prototype.push = setCacheAdd;\nSetCache.prototype.has = setCacheHas;\n\nmodule.exports = SetCache;\n","var overArg = require('./_overArg');\n\n/** Built-in value references. */\nvar getPrototype = overArg(Object.getPrototypeOf, Object);\n\nmodule.exports = getPrototype;\n","\nexport enum DataType {\n TEXT = 'text',\n NUMBER = 'number',\n DATE = 'date',\n TIME = 'time',\n DATETIME= 'datetime',\n BOOLEAN = 'boolean',\n ERROR = 'error',\n}\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.toFastProperties = exports.timer = exports.PRINT_ERROR = exports.PRINT_WARNING = void 0;\nvar print_1 = require(\"./print\");\nObject.defineProperty(exports, \"PRINT_WARNING\", { enumerable: true, get: function () { return print_1.PRINT_WARNING; } });\nObject.defineProperty(exports, \"PRINT_ERROR\", { enumerable: true, get: function () { return print_1.PRINT_ERROR; } });\nvar timer_1 = require(\"./timer\");\nObject.defineProperty(exports, \"timer\", { enumerable: true, get: function () { return timer_1.timer; } });\nvar to_fast_properties_1 = require(\"./to-fast-properties\");\nObject.defineProperty(exports, \"toFastProperties\", { enumerable: true, get: function () { return to_fast_properties_1.toFastProperties; } });\n//# sourceMappingURL=api.js.map","var copyObject = require('./_copyObject'),\n getSymbolsIn = require('./_getSymbolsIn');\n\n/**\n * Copies own and inherited symbols of `source` to `object`.\n *\n * @private\n * @param {Object} source The object to copy symbols from.\n * @param {Object} [object={}] The object to copy symbols to.\n * @returns {Object} Returns `object`.\n */\nfunction copySymbolsIn(source, object) {\n return copyObject(source, getSymbolsIn(source), object);\n}\n\nmodule.exports = copySymbolsIn;\n","var isPrototype = require('./_isPrototype'),\n nativeKeys = require('./_nativeKeys');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction baseKeys(object) {\n if (!isPrototype(object)) {\n return nativeKeys(object);\n }\n var result = [];\n for (var key in Object(object)) {\n if (hasOwnProperty.call(object, key) && key != 'constructor') {\n result.push(key);\n }\n }\n return result;\n}\n\nmodule.exports = baseKeys;\n","var getTag = require('./_getTag'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar mapTag = '[object Map]';\n\n/**\n * The base implementation of `_.isMap` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a map, else `false`.\n */\nfunction baseIsMap(value) {\n return isObjectLike(value) && getTag(value) == mapTag;\n}\n\nmodule.exports = baseIsMap;\n","/**\n * Checks if a `cache` value for `key` exists.\n *\n * @private\n * @param {Object} cache The cache to query.\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction cacheHas(cache, key) {\n return cache.has(key);\n}\n\nmodule.exports = cacheHas;\n","var identity = require('./identity'),\n overRest = require('./_overRest'),\n setToString = require('./_setToString');\n\n/**\n * The base implementation of `_.rest` which doesn't validate or coerce arguments.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @returns {Function} Returns the new function.\n */\nfunction baseRest(func, start) {\n return setToString(overRest(func, start, identity), func + '');\n}\n\nmodule.exports = baseRest;\n","var freeGlobal = require('./_freeGlobal');\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\nmodule.exports = root;\n","var castPath = require('./_castPath'),\n isArguments = require('./isArguments'),\n isArray = require('./isArray'),\n isIndex = require('./_isIndex'),\n isLength = require('./isLength'),\n toKey = require('./_toKey');\n\n/**\n * Checks if `path` exists on `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} path The path to check.\n * @param {Function} hasFunc The function to check properties.\n * @returns {boolean} Returns `true` if `path` exists, else `false`.\n */\nfunction hasPath(object, path, hasFunc) {\n path = castPath(path, object);\n\n var index = -1,\n length = path.length,\n result = false;\n\n while (++index < length) {\n var key = toKey(path[index]);\n if (!(result = object != null && hasFunc(object, key))) {\n break;\n }\n object = object[key];\n }\n if (result || ++index != length) {\n return result;\n }\n length = object == null ? 0 : object.length;\n return !!length && isLength(length) && isIndex(key, length) &&\n (isArray(object) || isArguments(object));\n}\n\nmodule.exports = hasPath;\n","var isObject = require('./isObject');\n\n/** Built-in value references. */\nvar objectCreate = Object.create;\n\n/**\n * The base implementation of `_.create` without support for assigning\n * properties to the created object.\n *\n * @private\n * @param {Object} proto The object to inherit from.\n * @returns {Object} Returns the new object.\n */\nvar baseCreate = (function() {\n function object() {}\n return function(proto) {\n if (!isObject(proto)) {\n return {};\n }\n if (objectCreate) {\n return objectCreate(proto);\n }\n object.prototype = proto;\n var result = new object;\n object.prototype = undefined;\n return result;\n };\n}());\n\nmodule.exports = baseCreate;\n","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/**\n * Converts `value` to a string using `Object.prototype.toString`.\n *\n * @private\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n */\nfunction objectToString(value) {\n return nativeObjectToString.call(value);\n}\n\nmodule.exports = objectToString;\n","var baseTrim = require('./_baseTrim'),\n isObject = require('./isObject'),\n isSymbol = require('./isSymbol');\n\n/** Used as references for various `Number` constants. */\nvar NAN = 0 / 0;\n\n/** Used to detect bad signed hexadecimal string values. */\nvar reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\n/** Used to detect binary string values. */\nvar reIsBinary = /^0b[01]+$/i;\n\n/** Used to detect octal string values. */\nvar reIsOctal = /^0o[0-7]+$/i;\n\n/** Built-in method references without a dependency on `root`. */\nvar freeParseInt = parseInt;\n\n/**\n * Converts `value` to a number.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to process.\n * @returns {number} Returns the number.\n * @example\n *\n * _.toNumber(3.2);\n * // => 3.2\n *\n * _.toNumber(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toNumber(Infinity);\n * // => Infinity\n *\n * _.toNumber('3.2');\n * // => 3.2\n */\nfunction toNumber(value) {\n if (typeof value == 'number') {\n return value;\n }\n if (isSymbol(value)) {\n return NAN;\n }\n if (isObject(value)) {\n var other = typeof value.valueOf == 'function' ? value.valueOf() : value;\n value = isObject(other) ? (other + '') : other;\n }\n if (typeof value != 'string') {\n return value === 0 ? value : +value;\n }\n value = baseTrim(value);\n var isBinary = reIsBinary.test(value);\n return (isBinary || reIsOctal.test(value))\n ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n : (reIsBadHex.test(value) ? NAN : +value);\n}\n\nmodule.exports = toNumber;\n","\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.tokenMatcher = exports.createTokenInstance = exports.EOF = exports.createToken = exports.hasTokenLabel = exports.tokenName = exports.tokenLabel = void 0;\nvar isString_1 = __importDefault(require(\"lodash/isString\"));\nvar has_1 = __importDefault(require(\"lodash/has\"));\nvar isUndefined_1 = __importDefault(require(\"lodash/isUndefined\"));\nvar lexer_public_1 = require(\"./lexer_public\");\nvar tokens_1 = require(\"./tokens\");\nfunction tokenLabel(tokType) {\n if (hasTokenLabel(tokType)) {\n return tokType.LABEL;\n }\n else {\n return tokType.name;\n }\n}\nexports.tokenLabel = tokenLabel;\nfunction tokenName(tokType) {\n return tokType.name;\n}\nexports.tokenName = tokenName;\nfunction hasTokenLabel(obj) {\n return (0, isString_1.default)(obj.LABEL) && obj.LABEL !== \"\";\n}\nexports.hasTokenLabel = hasTokenLabel;\nvar PARENT = \"parent\";\nvar CATEGORIES = \"categories\";\nvar LABEL = \"label\";\nvar GROUP = \"group\";\nvar PUSH_MODE = \"push_mode\";\nvar POP_MODE = \"pop_mode\";\nvar LONGER_ALT = \"longer_alt\";\nvar LINE_BREAKS = \"line_breaks\";\nvar START_CHARS_HINT = \"start_chars_hint\";\nfunction createToken(config) {\n return createTokenInternal(config);\n}\nexports.createToken = createToken;\nfunction createTokenInternal(config) {\n var pattern = config.pattern;\n var tokenType = {};\n tokenType.name = config.name;\n if (!(0, isUndefined_1.default)(pattern)) {\n tokenType.PATTERN = pattern;\n }\n if ((0, has_1.default)(config, PARENT)) {\n throw (\"The parent property is no longer supported.\\n\" +\n \"See: https://github.com/chevrotain/chevrotain/issues/564#issuecomment-349062346 for details.\");\n }\n if ((0, has_1.default)(config, CATEGORIES)) {\n // casting to ANY as this will be fixed inside `augmentTokenTypes``\n tokenType.CATEGORIES = config[CATEGORIES];\n }\n (0, tokens_1.augmentTokenTypes)([tokenType]);\n if ((0, has_1.default)(config, LABEL)) {\n tokenType.LABEL = config[LABEL];\n }\n if ((0, has_1.default)(config, GROUP)) {\n tokenType.GROUP = config[GROUP];\n }\n if ((0, has_1.default)(config, POP_MODE)) {\n tokenType.POP_MODE = config[POP_MODE];\n }\n if ((0, has_1.default)(config, PUSH_MODE)) {\n tokenType.PUSH_MODE = config[PUSH_MODE];\n }\n if ((0, has_1.default)(config, LONGER_ALT)) {\n tokenType.LONGER_ALT = config[LONGER_ALT];\n }\n if ((0, has_1.default)(config, LINE_BREAKS)) {\n tokenType.LINE_BREAKS = config[LINE_BREAKS];\n }\n if ((0, has_1.default)(config, START_CHARS_HINT)) {\n tokenType.START_CHARS_HINT = config[START_CHARS_HINT];\n }\n return tokenType;\n}\nexports.EOF = createToken({ name: \"EOF\", pattern: lexer_public_1.Lexer.NA });\n(0, tokens_1.augmentTokenTypes)([exports.EOF]);\nfunction createTokenInstance(tokType, image, startOffset, endOffset, startLine, endLine, startColumn, endColumn) {\n return {\n image: image,\n startOffset: startOffset,\n endOffset: endOffset,\n startLine: startLine,\n endLine: endLine,\n startColumn: startColumn,\n endColumn: endColumn,\n tokenTypeIdx: tokType.tokenTypeIdx,\n tokenType: tokType\n };\n}\nexports.createTokenInstance = createTokenInstance;\nfunction tokenMatcher(token, tokType) {\n return (0, tokens_1.tokenStructuredMatcher)(token, tokType);\n}\nexports.tokenMatcher = tokenMatcher;\n//# sourceMappingURL=tokens_public.js.map","var constant = require('./constant'),\n defineProperty = require('./_defineProperty'),\n identity = require('./identity');\n\n/**\n * The base implementation of `setToString` without support for hot loop shorting.\n *\n * @private\n * @param {Function} func The function to modify.\n * @param {Function} string The `toString` result.\n * @returns {Function} Returns `func`.\n */\nvar baseSetToString = !defineProperty ? identity : function(func, string) {\n return defineProperty(func, 'toString', {\n 'configurable': true,\n 'enumerable': false,\n 'value': constant(string),\n 'writable': true\n });\n};\n\nmodule.exports = baseSetToString;\n","var baseIsRegExp = require('./_baseIsRegExp'),\n baseUnary = require('./_baseUnary'),\n nodeUtil = require('./_nodeUtil');\n\n/* Node.js helper references. */\nvar nodeIsRegExp = nodeUtil && nodeUtil.isRegExp;\n\n/**\n * Checks if `value` is classified as a `RegExp` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a regexp, else `false`.\n * @example\n *\n * _.isRegExp(/abc/);\n * // => true\n *\n * _.isRegExp('/abc/');\n * // => false\n */\nvar isRegExp = nodeIsRegExp ? baseUnary(nodeIsRegExp) : baseIsRegExp;\n\nmodule.exports = isRegExp;\n","var Uint8Array = require('./_Uint8Array');\n\n/**\n * Creates a clone of `arrayBuffer`.\n *\n * @private\n * @param {ArrayBuffer} arrayBuffer The array buffer to clone.\n * @returns {ArrayBuffer} Returns the cloned array buffer.\n */\nfunction cloneArrayBuffer(arrayBuffer) {\n var result = new arrayBuffer.constructor(arrayBuffer.byteLength);\n new Uint8Array(result).set(new Uint8Array(arrayBuffer));\n return result;\n}\n\nmodule.exports = cloneArrayBuffer;\n","import mod from \"../lib/src/api.js\";\n\nexport default mod;\nexport const Alternation = mod.Alternation;\nexport const Alternative = mod.Alternative;\nexport const CstParser = mod.CstParser;\nexport const EMPTY_ALT = mod.EMPTY_ALT;\nexport const EOF = mod.EOF;\nexport const EarlyExitException = mod.EarlyExitException;\nexport const EmbeddedActionsParser = mod.EmbeddedActionsParser;\nexport const GAstVisitor = mod.GAstVisitor;\nexport const LLkLookaheadStrategy = mod.LLkLookaheadStrategy;\nexport const Lexer = mod.Lexer;\nexport const LexerDefinitionErrorType = mod.LexerDefinitionErrorType;\nexport const MismatchedTokenException = mod.MismatchedTokenException;\nexport const NoViableAltException = mod.NoViableAltException;\nexport const NonTerminal = mod.NonTerminal;\nexport const NotAllInputParsedException = mod.NotAllInputParsedException;\nexport const Option = mod.Option;\nexport const Parser = mod.Parser;\nexport const ParserDefinitionErrorType = mod.ParserDefinitionErrorType;\nexport const Repetition = mod.Repetition;\nexport const RepetitionMandatory = mod.RepetitionMandatory;\nexport const RepetitionMandatoryWithSeparator = mod.RepetitionMandatoryWithSeparator;\nexport const RepetitionWithSeparator = mod.RepetitionWithSeparator;\nexport const Rule = mod.Rule;\nexport const Terminal = mod.Terminal;\nexport const VERSION = mod.VERSION;\nexport const clearCache = mod.clearCache;\nexport const createSyntaxDiagramsCode = mod.createSyntaxDiagramsCode;\nexport const createToken = mod.createToken;\nexport const createTokenInstance = mod.createTokenInstance;\nexport const defaultLexerErrorProvider = mod.defaultLexerErrorProvider;\nexport const defaultParserErrorProvider = mod.defaultParserErrorProvider;\nexport const generateCstDts = mod.generateCstDts;\nexport const getLookaheadPaths = mod.getLookaheadPaths;\nexport const isRecognitionException = mod.isRecognitionException;\nexport const serializeGrammar = mod.serializeGrammar;\nexport const serializeProduction = mod.serializeProduction;\nexport const tokenLabel = mod.tokenLabel;\nexport const tokenMatcher = mod.tokenMatcher;\nexport const tokenName = mod.tokenName;\n","import { createToken, Lexer } from \"chevrotain\";\n\nconst Plus = createToken({ name: \"Plus\", pattern: /\\+/ });\nconst Minus = createToken({ name: \"Minus\", pattern: /-/ });\nconst Mult = createToken({ name: \"Mult\", pattern: /\\*/ });\nconst Div = createToken({ name: \"Div\", pattern: /\\// });\nconst LParen = createToken({ name: \"LParen\", pattern: /\\(/ });\nconst RParen = createToken({ name: \"RParen\", pattern: /\\)/ });\nconst Comma = createToken({ name: \"Comma\", pattern: /,/ });\n\nconst RowRange = createToken({\n name: \"RowRange\",\n pattern: /\\$?\\d+:\\$?\\d+/\n});\n\nconst NumberLiteral = createToken({\n name: \"NumberLiteral\",\n pattern: /\\d+(\\.\\d+)?/,\n longer_alt: RowRange // Add RowRange as longer alternative\n});\n\n// Update Variable token to exclude sheet name\nconst Variable = createToken({\n name: \"Variable\",\n pattern: /[A-Za-z_][A-Za-z0-9_]*/\n});\n\nconst SheetName = createToken({\n name: \"SheetName\",\n pattern: /[A-Za-z_][A-Za-z0-9_-]*!/\n});\n\nconst CellRange = createToken({\n name: \"CellRange\",\n pattern: /\\$?[A-Za-z]+\\$?\\d+:\\$?[A-Za-z]+\\$?\\d+/\n});\n\nconst CellRef = createToken({\n name: \"CellRef\",\n pattern: /\\$?[A-Za-z]+\\$?\\d+/\n});\n\nconst StringLiteral = createToken({\n name: \"StringLiteral\",\n pattern: /([\"'])(?:(?!\\1).)*\\1/ // Matches either quote style and captures everything between matching quotes\n});\n\nconst Concat = createToken({\n name: \"Concat\",\n pattern: /&/\n});\n\nconst FunctionName = createToken({\n name: \"FunctionName\",\n pattern: /[A-Za-z]+(?=\\()/i, // Added 'i' flag for case insensitive\n longer_alt: CellRef // In case the pattern matches a cell reference\n});\n\nconst WhiteSpace = createToken({ name: \"WhiteSpace\", pattern: /\\s+/, group: Lexer.SKIPPED });\n\n// Add new comparison operator tokens\nconst GreaterThan = createToken({ name: \"GreaterThan\", pattern: />/ });\nconst LessThan = createToken({ name: \"LessThan\", pattern: /=/ });\nconst LessThanEqual = createToken({ name: \"LessThanEqual\", pattern: /<=/ });\nconst Equal = createToken({ name: \"Equal\", pattern: /=/ });\nconst NotEqual = createToken({ name: \"NotEqual\", pattern: /<>/ });\n\n// Add special IF token before FunctionName\nconst IfFunction = createToken({\n name: \"IfFunction\",\n pattern: /IF(?=\\()/i, // Added 'i' flag for case insensitive\n longer_alt: Variable\n});\n\n// Add reserved keywords tokens\nconst TrueKeyword = createToken({\n name: \"TrueKeyword\",\n pattern: /TRUE/i, // Added 'i' flag for case insensitive\n longer_alt: Variable\n});\n\nconst FalseKeyword = createToken({\n name: \"FalseKeyword\",\n pattern: /FALSE/i, // Added 'i' flag for case insensitive\n longer_alt: Variable\n});\n\nconst NullKeyword = createToken({\n name: \"NullKeyword\",\n pattern: /NULL/i, // Added 'i' flag for case insensitive\n longer_alt: Variable\n});\n\n// Add array operators\nconst ArrayRowSep = createToken({ name: \"ArrayRowSep\", pattern: /;/ });\nconst RangeIntersect = createToken({ name: \"RangeIntersect\", pattern: / +/ }); // one or more spaces\n\n// Add error constants\nconst ErrorConstant = createToken({\n name: \"ErrorConstant\",\n pattern: /#(DIV\\/0!|N\\/A|NAME\\?|NULL!|NUM!|REF!|VALUE!|#SPILL!)/\n});\n\n// Add special function tokens\nconst IfErrorFunction = createToken({\n name: \"IfErrorFunction\",\n pattern: /IFERROR(?=\\()/i,\n longer_alt: Variable\n});\n\nconst IfsFunction = createToken({\n name: \"IfsFunction\",\n pattern: /IFS(?=\\()/i,\n longer_alt: Variable\n});\n\nconst SwitchFunction = createToken({\n name: \"SwitchFunction\",\n pattern: /SWITCH(?=\\()/i,\n longer_alt: Variable\n});\n\n// Add curly brace tokens for array formulas\nconst LCurly = createToken({ name: \"LCurly\", pattern: /{/ });\nconst RCurly = createToken({ name: \"RCurly\", pattern: /}/ });\n\n// Add new tokens for full column/row ranges\nconst ColumnRange = createToken({\n name: \"ColumnRange\",\n pattern: /\\$?[A-Za-z]+:\\$?[A-Za-z]+/\n});\n\nconst Power = createToken({ name: \"Power\", pattern: /\\*\\*|\\^/ });\n\nexport const allTokens = [\n WhiteSpace,\n // Comparison operators (order important)\n GreaterThanEqual, LessThanEqual, NotEqual,\n GreaterThan, LessThan, Equal,\n\n // Basic operators\n Plus, Minus, Concat,\n Power, // Add Power token here\n Mult, Div,\n\n // Brackets and delimiters\n LParen, RParen, LCurly, RCurly,\n Comma, ArrayRowSep, // Single instance of ArrayRowSep\n\n // References and ranges (order important for matching)\n SheetName, // Include SheetName token here\n ColumnRange, // Try column range first\n RowRange, // Then row range\n CellRange, // Then cell range\n CellRef, // Then cell reference\n RangeIntersect, // Then range intersection\n\n // Literals and constants (after ranges to avoid number conflicts)\n NumberLiteral, // Moved after RowRange\n StringLiteral,\n ErrorConstant,\n\n // Functions and keywords\n IfFunction, IfErrorFunction, IfsFunction, SwitchFunction,\n TrueKeyword, FalseKeyword, NullKeyword,\n FunctionName,\n\n // References and variables\n Variable\n];\n\nexport const CalxTokens = {\n Plus, Minus, Mult, Div, LParen, RParen, Comma,\n RowRange, NumberLiteral, Variable, SheetName,\n CellRange, CellRef, StringLiteral, Concat,\n FunctionName, WhiteSpace, GreaterThan, LessThan,\n GreaterThanEqual, LessThanEqual, Equal, NotEqual,\n IfFunction, TrueKeyword, FalseKeyword, NullKeyword,\n ArrayRowSep, RangeIntersect, ErrorConstant,\n IfErrorFunction, IfsFunction, SwitchFunction,\n LCurly, RCurly, ColumnRange, Power\n};","import { Lexer, CstParser, Rule, TokenType, ParserMethod, CstNode } from 'chevrotain';\nimport { allTokens, CalxTokens as token } from './Tokens';\n\nconst CalxLexer = new Lexer(allTokens);\n\nclass CalxParser extends CstParser {\n // Declare parser rules with type annotations\n public expression!: ParserMethod;\n public arrayFormula!: ParserMethod;\n public comparisonExpression!: ParserMethod;\n public additionExpression!: ParserMethod;\n public concatenationExpression!: ParserMethod;\n public multiplicationExpression!: ParserMethod;\n public exponentiationExpression!: ParserMethod;\n public unaryExpression!: ParserMethod;\n public atomicExpression!: ParserMethod;\n public ifFunctionCall!: ParserMethod;\n public functionCall!: ParserMethod;\n public ifErrorFunctionCall!: ParserMethod;\n public ifsFunctionCall!: ParserMethod;\n public switchFunctionCall!: ParserMethod;\n public arrayExpression!: ParserMethod;\n public arrayRow!: ParserMethod;\n\n cache: { comparisonExpression: boolean; atomicExpression: boolean; };\n\n constructor() {\n super(allTokens);\n\n this.cache = {\n comparisonExpression: false,\n atomicExpression: false\n };\n\n const $ = this;\n\n\n // Update the expression rule to start with comparison\n $.RULE(\"expression\", () => {\n $.OR([\n { ALT: () => $.SUBRULE($.arrayFormula) },\n { ALT: () => $.SUBRULE($.comparisonExpression) }\n ]);\n });\n\n // Add array formula rule\n $.RULE(\"arrayFormula\", () => {\n $.CONSUME(token.LCurly);\n $.OPTION(() => {\n $.CONSUME(token.Equal);\n });\n $.SUBRULE($.expression);\n $.MANY(() => {\n $.OR([\n { ALT: () => $.CONSUME(token.Comma) },\n { ALT: () => $.CONSUME(token.ArrayRowSep) }\n ]);\n $.SUBRULE2($.expression);\n });\n $.CONSUME(token.RCurly);\n });\n\n\n // Add new comparison expression rule\n $.RULE(\"comparisonExpression\", () => {\n $.SUBRULE($.additionExpression, { LABEL: \"lhs\" });\n $.OPTION(() => {\n $.cache.comparisonExpression || ($.OR([\n { ALT: () => $.CONSUME(token.GreaterThan) },\n { ALT: () => $.CONSUME(token.LessThan) },\n { ALT: () => $.CONSUME(token.GreaterThanEqual) },\n { ALT: () => $.CONSUME(token.LessThanEqual) },\n { ALT: () => $.CONSUME(token.Equal) },\n { ALT: () => $.CONSUME(token.NotEqual) }\n ]));\n $.SUBRULE2($.additionExpression, { LABEL: \"rhs\" });\n });\n });\n\n $.RULE(\"additionExpression\", () => {\n $.SUBRULE($.concatenationExpression, { LABEL: \"lhs\" });\n $.MANY(() => {\n $.OR([\n { ALT: () => $.CONSUME(token.Plus) },\n { ALT: () => $.CONSUME(token.Minus) }\n ]);\n $.SUBRULE2($.concatenationExpression, { LABEL: \"rhs\" });\n });\n });\n\n $.RULE(\"concatenationExpression\", () => {\n $.SUBRULE($.multiplicationExpression, { LABEL: \"lhs\" });\n $.MANY(() => {\n $.CONSUME(token.Concat);\n $.SUBRULE2($.multiplicationExpression, { LABEL: \"rhs\" });\n });\n });\n\n $.RULE(\"multiplicationExpression\", () => {\n $.SUBRULE($.exponentiationExpression, { LABEL: \"lhs\" });\n $.MANY(() => {\n $.OR([\n { ALT: () => $.CONSUME(token.Mult) },\n { ALT: () => $.CONSUME(token.Div) }\n ]);\n $.SUBRULE2($.exponentiationExpression, { LABEL: \"rhs\" });\n });\n });\n\n // Add new rule for exponentiationExpression\n $.RULE(\"exponentiationExpression\", () => {\n $.SUBRULE($.unaryExpression, { LABEL: \"lhs\" });\n $.MANY(() => {\n $.CONSUME(token.Power);\n $.SUBRULE2($.unaryExpression, { LABEL: \"rhs\" });\n });\n });\n\n // Add a new rule for unary expressions\n $.RULE(\"unaryExpression\", () => {\n $.OR([\n { ALT: () => {\n $.CONSUME(token.Minus); // Match unary minus\n $.SUBRULE($.unaryExpression); // Recursive unary expression\n }},\n { ALT: () => $.SUBRULE($.atomicExpression) }\n ]);\n });\n\n $.RULE(\"atomicExpression\", () => {\n $.cache.atomicExpression || ($.OR([\n { ALT: () => $.CONSUME(token.NumberLiteral) },\n { ALT: () => $.CONSUME(token.StringLiteral) },\n { ALT: () => $.CONSUME(token.TrueKeyword) }, // Add keywords\n { ALT: () => $.CONSUME(token.FalseKeyword) },\n { ALT: () => $.CONSUME(token.NullKeyword) },\n { ALT: () => {\n $.OPTION(() => {\n $.CONSUME(token.SheetName);\n });\n $.OR1([\n { ALT: () => $.CONSUME(token.Variable) },\n { ALT: () => $.CONSUME(token.CellRef) },\n { ALT: () => $.CONSUME(token.CellRange) },\n { ALT: () => $.CONSUME(token.RowRange) },\n { ALT: () => $.CONSUME(token.ColumnRange) }\n ]);\n }},\n { ALT: () => $.SUBRULE($.ifFunctionCall) }, // Try IF function first\n { ALT: () => $.SUBRULE($.functionCall) },\n { ALT: () => $.CONSUME(token.ErrorConstant) },\n { ALT: () => $.SUBRULE($.ifErrorFunctionCall) },\n { ALT: () => $.SUBRULE($.ifsFunctionCall) },\n { ALT: () => $.SUBRULE($.switchFunctionCall) },\n { ALT: () => {\n $.CONSUME(token.LParen);\n $.SUBRULE($.expression);\n $.CONSUME(token.RParen);\n }},\n ]));\n });\n\n // Update IF function rule to make false branch optional\n $.RULE(\"ifFunctionCall\", () => {\n $.CONSUME(token.IfFunction);\n $.CONSUME(token.LParen);\n // Condition expression\n $.SUBRULE($.expression, { LABEL: \"condition\" });\n $.CONSUME1(token.Comma);\n // True branch\n $.SUBRULE2($.expression, { LABEL: \"whenTrue\" });\n // Optional false branch\n $.OPTION(() => {\n $.CONSUME2(token.Comma);\n $.SUBRULE3($.expression, { LABEL: \"whenFalse\" });\n });\n $.CONSUME(token.RParen);\n });\n\n // Add special rules for IFERROR\n $.RULE(\"ifErrorFunctionCall\", () => {\n $.CONSUME(token.IfErrorFunction);\n $.CONSUME(token.LParen);\n $.SUBRULE($.expression, { LABEL: \"value\" });\n $.CONSUME1(token.Comma);\n $.SUBRULE2($.expression, { LABEL: \"valueIfError\" });\n $.CONSUME(token.RParen);\n });\n\n // Add rule for IFS function (multiple IF conditions)\n $.RULE(\"ifsFunctionCall\", () => {\n $.CONSUME(token.IfsFunction);\n $.CONSUME(token.LParen);\n $.AT_LEAST_ONE(() => {\n $.SUBRULE($.expression, { LABEL: \"condition\" });\n $.CONSUME1(token.Comma);\n $.SUBRULE2($.expression, { LABEL: \"value\" });\n $.OPTION(() => $.CONSUME2(token.Comma));\n });\n $.CONSUME(token.RParen);\n });\n\n // Add rule for SWITCH\n $.RULE(\"switchFunctionCall\", () => {\n $.CONSUME(token.SwitchFunction);\n $.CONSUME(token.LParen);\n $.SUBRULE($.expression, { LABEL: \"expression\" });\n $.CONSUME1(token.Comma);\n $.AT_LEAST_ONE(() => {\n $.SUBRULE2($.expression, { LABEL: \"value\" });\n $.CONSUME2(token.Comma);\n $.SUBRULE3($.expression, { LABEL: \"result\" });\n $.OPTION(() => $.CONSUME3(token.Comma));\n });\n // Optional default value\n $.OPTION2(() => {\n $.SUBRULE4($.expression, { LABEL: \"default\" });\n });\n $.CONSUME(token.RParen);\n });\n\n $.RULE(\"functionCall\", () => {\n $.CONSUME(token.FunctionName);\n $.CONSUME(token.LParen);\n $.OPTION(() => {\n $.SUBRULE($.expression);\n $.MANY(() => {\n $.CONSUME(token.Comma);\n $.SUBRULE2($.expression);\n });\n });\n $.CONSUME(token.RParen);\n });\n\n // Add array expression support\n $.RULE(\"arrayExpression\", () => {\n $.CONSUME(token.LParen);\n $.SUBRULE($.arrayRow);\n $.MANY(() => {\n $.CONSUME(token.ArrayRowSep);\n $.SUBRULE2($.arrayRow);\n });\n $.CONSUME(token.RParen);\n });\n\n $.RULE(\"arrayRow\", () => {\n $.SUBRULE($.expression);\n $.MANY(() => {\n $.CONSUME(token.Comma);\n $.SUBRULE2($.expression);\n });\n });\n\n this.performSelfAnalysis();\n }\n\n parse(inputText: string) {\n console.log(\"Parsing input:\", inputText);\n\n const lexResult = CalxLexer.tokenize(inputText);\n\n console.log(\"Lexer result:\", lexResult.tokens);\n\n if (lexResult.errors.length > 0) {\n console.error(lexResult.errors);\n\n throw new Error(\"Lexer errors detected\");\n }\n\n this.input = lexResult.tokens;\n const cst = this.expression();\n\n if (this.errors.length > 0) {\n console.error(this.errors);\n\n throw new Error(\"Parsing errors detected\");\n }\n\n return cst;\n }\n}\n\nexport { CalxLexer, CalxParser };","export enum ErrorType {\n DIV_BY_ZERO = '#DIV/0!',\n INVALID_NAME = '#NAME?',\n INVALID_REF = '#REF!',\n INVALID_VAL = '#VALUE!',\n INVALID_NUM = '#NUM!',\n NA = '#N/A!',\n NULL = '#NULL!',\n SPILL = '#SPILL!',\n ERROR = '#ERROR!'\n}\n","/**\n * Represents the result of an array formula evaluation\n * Array formulas can spill into multiple cells\n */\nexport class ArrayResult {\n /**\n * Creates an ArrayResult\n * @param values 2D array of values [row][col]\n * @param rows Number of rows\n * @param cols Number of columns\n */\n constructor(\n public values: any[][],\n public rows: number,\n public cols: number\n ) {}\n\n /**\n * Get value at specific position\n */\n getValue(row: number, col: number): any {\n if (row >= 0 && row < this.rows && col >= 0 && col < this.cols) {\n return this.values[row][col];\n }\n return undefined;\n }\n\n /**\n * Check if this is a single value (1x1 array)\n */\n isSingleValue(): boolean {\n return this.rows === 1 && this.cols === 1;\n }\n\n /**\n * Get the single value if this is a 1x1 array\n */\n getSingleValue(): any {\n if (this.isSingleValue()) {\n return this.values[0][0];\n }\n return undefined;\n }\n\n /**\n * Convert to flat array\n */\n toFlatArray(): any[] {\n const result: any[] = [];\n for (let row = 0; row < this.rows; row++) {\n for (let col = 0; col < this.cols; col++) {\n result.push(this.values[row][col]);\n }\n }\n return result;\n }\n\n /**\n * Create ArrayResult from 1D array (vertical)\n */\n static fromVerticalArray(values: any[]): ArrayResult {\n return new ArrayResult(\n values.map(v => [v]),\n values.length,\n 1\n );\n }\n\n /**\n * Create ArrayResult from 1D array (horizontal)\n */\n static fromHorizontalArray(values: any[]): ArrayResult {\n return new ArrayResult(\n [values],\n 1,\n values.length\n );\n }\n\n /**\n * Create ArrayResult from 2D array\n */\n static from2DArray(values: any[][]): ArrayResult {\n const rows = values.length;\n const cols = rows > 0 ? Math.max(...values.map(row => row.length)) : 0;\n\n // Normalize to ensure all rows have same length\n const normalized = values.map(row => {\n const newRow = [...row];\n while (newRow.length < cols) {\n newRow.push(undefined);\n }\n return newRow;\n });\n\n return new ArrayResult(normalized, rows, cols);\n }\n\n /**\n * Create ArrayResult from single value\n */\n static fromSingleValue(value: any): ArrayResult {\n return new ArrayResult([[value]], 1, 1);\n }\n}\n","import { CstNode } from 'chevrotain';\nimport { CalxLexer, CalxParser } from './Parser';\nimport { SharedContext } from '../SharedContext';\nimport { ErrorType } from '../../Cell/ErrorType';\nimport { ArrayResult } from '../../Cell/ArrayResult';\n\nconst parserInstance = new CalxParser();\n\nexport class CalxInterpreter extends parserInstance.getBaseCstVisitorConstructorWithDefaults() {\n private context?: SharedContext;\n public yy?: SharedContext;\n\n constructor() {\n super();\n this.validateVisitor();\n }\n\n setContext(context: SharedContext) {\n this.context = context;\n this.yy = context;\n }\n\n getContext(): SharedContext | undefined {\n return this.context;\n }\n\n expression(ctx: any) {\n if (ctx.arrayFormula && ctx.arrayFormula.length > 0) {\n return this.visit(ctx.arrayFormula[0]);\n }\n return this.visit(ctx.comparisonExpression[0]);\n }\n\n arrayFormula(ctx: any) {\n // Array formula with curly braces: {1,2,3} or {1;2;3} or {1,2;3,4}\n\n // Check if we have the ArrayRowSep (semicolon) which indicates multiple rows\n const hasRowSeparator = ctx.ArrayRowSep && ctx.ArrayRowSep.length > 0;\n\n if (hasRowSeparator) {\n // Multi-row array: {1,2;3,4} creates [[1,2],[3,4]]\n // Need to figure out which separator comes after each expression\n\n // Build a map of separator positions\n const separators: Array<{offset: number, type: 'comma' | 'semicolon'}> = [];\n\n if (ctx.Comma) {\n ctx.Comma.forEach((token: any) => {\n separators.push({ offset: token.startOffset, type: 'comma' });\n });\n }\n\n if (ctx.ArrayRowSep) {\n ctx.ArrayRowSep.forEach((token: any) => {\n separators.push({ offset: token.startOffset, type: 'semicolon' });\n });\n }\n\n // Sort separators by offset\n separators.sort((a, b) => a.offset - b.offset);\n\n // Build rows by grouping expressions based on separator types\n const rows: any[][] = [];\n let currentRow: any[] = [];\n\n for (let i = 0; i < ctx.expression.length; i++) {\n currentRow.push(this.visit(ctx.expression[i]));\n\n // Check what separator comes after this expression (if any)\n if (i < separators.length) {\n if (separators[i].type === 'semicolon') {\n // Semicolon means end of current row\n rows.push(currentRow);\n currentRow = [];\n }\n // Comma means continue in the same row, so do nothing\n }\n }\n\n // Add last row if not empty\n if (currentRow.length > 0) {\n rows.push(currentRow);\n }\n\n return ArrayResult.from2DArray(rows);\n }\n\n // Single row array: {1,2,3} or single value {5}\n const expressions = ctx.expression.map((exp: any) => this.visit(exp));\n\n if (expressions.length === 1) {\n const result = expressions[0];\n\n // If already an ArrayResult, return it\n if (result instanceof ArrayResult) {\n return result;\n }\n\n // If array, convert to ArrayResult\n if (Array.isArray(result)) {\n return ArrayResult.fromHorizontalArray(result);\n }\n\n // Single value\n return ArrayResult.fromSingleValue(result);\n }\n\n // Multiple expressions separated by commas = horizontal array\n return ArrayResult.fromHorizontalArray(expressions);\n }\n\n comparisonExpression(ctx: any) {\n const left = this.visit(ctx.lhs[0]);\n\n // If there's no comparison operator, just return the left value\n if (!ctx.rhs || ctx.rhs.length === 0) {\n return left;\n }\n\n const right = this.visit(ctx.rhs[0]);\n\n // Handle different comparison operators\n if (ctx.GreaterThan) {\n return left > right;\n } else if (ctx.LessThan) {\n return left < right;\n } else if (ctx.GreaterThanEqual) {\n return left >= right;\n } else if (ctx.LessThanEqual) {\n return left <= right;\n } else if (ctx.Equal) {\n return left === right;\n } else if (ctx.NotEqual) {\n return left !== right;\n }\n\n return left; // Fallback\n }\n\n additionExpression(ctx: any) {\n let result = this.visit(ctx.lhs[0]);\n\n // Process all additions/subtractions from left to right\n if (ctx.rhs && ctx.rhs.length > 0) {\n // Build array of operators in order they appear\n const operators: Array<{type: 'plus' | 'minus', offset: number}> = [];\n\n if (ctx.Plus) {\n ctx.Plus.forEach((token: any) => {\n operators.push({ type: 'plus', offset: token.startOffset });\n });\n }\n\n if (ctx.Minus) {\n ctx.Minus.forEach((token: any) => {\n operators.push({ type: 'minus', offset: token.startOffset });\n });\n }\n\n // Sort operators by offset to get correct order\n operators.sort((a, b) => a.offset - b.offset);\n\n for (let i = 0; i < ctx.rhs.length; i++) {\n const rightValue = this.visit(ctx.rhs[i]);\n const operator = operators[i];\n\n if (operator.type === 'plus') {\n result = this.arrayOperation(result, rightValue, (a, b) => a + b);\n } else if (operator.type === 'minus') {\n result = this.arrayOperation(result, rightValue, (a, b) => a - b);\n }\n }\n }\n\n return result;\n }\n\n /**\n * Perform array operation - applies operation element-wise if either operand is an array\n */\n private arrayOperation(left: any, right: any, operation: (a: any, b: any) => any): any {\n // Check for error values first\n if (this.isError(left)) return left;\n if (this.isError(right)) return right;\n\n // If neither is an array, just perform the operation\n if (!Array.isArray(left) && !Array.isArray(right)) {\n return operation(left, right);\n }\n\n // Convert to arrays if needed\n const leftArray = Array.isArray(left) ? left : [left];\n const rightArray = Array.isArray(right) ? right : [right];\n\n // Determine the result size\n const resultLength = Math.max(leftArray.length, rightArray.length);\n const result = [];\n\n for (let i = 0; i < resultLength; i++) {\n const leftVal = leftArray[Math.min(i, leftArray.length - 1)];\n const rightVal = rightArray[Math.min(i, rightArray.length - 1)];\n result.push(operation(leftVal, rightVal));\n }\n\n // Return as ArrayResult if it's an array\n return ArrayResult.fromVerticalArray(result);\n }\n\n /**\n * Check if a value is an Excel error\n */\n private isError(value: any): boolean {\n if (typeof value !== 'string') return false;\n return /^#[A-Z\\/!]+\\??$/.test(value); // Matches #NAME?, #REF!, #DIV/0!, etc.\n }\n\n concatenationExpression(ctx: any) {\n let result = this.visit(ctx.lhs[0]);\n\n // Process all concatenations from left to right\n if (ctx.rhs && ctx.rhs.length > 0) {\n for (let i = 0; i < ctx.rhs.length; i++) {\n const rightValue = this.visit(ctx.rhs[i]);\n // Convert both sides to strings for concatenation\n result = String(result) + String(rightValue);\n }\n }\n\n return result;\n }\n\n multiplicationExpression(ctx: any) {\n let result = this.visit(ctx.lhs[0]);\n\n // Process all multiplications/divisions from left to right\n if (ctx.rhs && ctx.rhs.length > 0) {\n // Build array of operators in order they appear\n const operators: Array<{type: 'mult' | 'div', offset: number}> = [];\n\n if (ctx.Mult) {\n ctx.Mult.forEach((token: any) => {\n operators.push({ type: 'mult', offset: token.startOffset });\n });\n }\n\n if (ctx.Div) {\n ctx.Div.forEach((token: any) => {\n operators.push({ type: 'div', offset: token.startOffset });\n });\n }\n\n // Sort operators by offset to get correct order\n operators.sort((a, b) => a.offset - b.offset);\n\n for (let i = 0; i < ctx.rhs.length; i++) {\n const rightValue = this.visit(ctx.rhs[i]);\n const operator = operators[i];\n\n if (operator.type === 'mult') {\n result = this.arrayOperation(result, rightValue, (a, b) => a * b);\n } else if (operator.type === 'div') {\n result = this.arrayOperation(result, rightValue, (a, b) => {\n // Check for division by zero\n if (b === 0) {\n return \"#DIV/0!\";\n }\n return a / b;\n });\n }\n }\n }\n\n return result;\n }\n\n exponentiationExpression(ctx: any) {\n let result = this.visit(ctx.lhs[0]);\n\n // Process all exponentiations from left to right\n if (ctx.rhs && ctx.rhs.length > 0) {\n for (let i = 0; i < ctx.rhs.length; i++) {\n const rightValue = this.visit(ctx.rhs[i]);\n result = this.arrayOperation(result, rightValue, (a, b) => Math.pow(a, b));\n }\n }\n\n return result;\n }\n\n unaryExpression(ctx: any) {\n if (ctx.Minus) {\n // Handle unary minus (negation)\n const value = this.visit(ctx.unaryExpression[0]);\n return -value;\n } else {\n // Otherwise, process the atomic expression\n return this.visit(ctx.atomicExpression[0]);\n }\n }\n\n atomicExpression(ctx: any) {\n // Handle literals\n if (ctx.NumberLiteral) {\n return Number(ctx.NumberLiteral[0].image);\n } else if (ctx.StringLiteral) {\n // Remove quotes from string literals\n const str = ctx.StringLiteral[0].image;\n return str.substring(1, str.length - 1);\n } else if (ctx.TrueKeyword) {\n return true;\n } else if (ctx.FalseKeyword) {\n return false;\n } else if (ctx.NullKeyword) {\n return null;\n } else if (ctx.ErrorConstant) {\n // Return error constants as is\n return ctx.ErrorConstant[0].image;\n }\n\n // Handle cell references and variables\n if (ctx.Variable || ctx.CellRef || ctx.CellRange || ctx.RowRange || ctx.ColumnRange) {\n let ref;\n let sheetName = '';\n\n // Extract sheet name if present\n if (ctx.SheetName && ctx.SheetName.length > 0) {\n sheetName = ctx.SheetName[0].image;\n // Remove the trailing '!'\n sheetName = sheetName.substring(0, sheetName.length - 1);\n }\n\n if (ctx.Variable && ctx.Variable.length > 0) {\n ref = ctx.Variable[0].image;\n return this.resolveVariable(ref, sheetName);\n } else if (ctx.CellRef && ctx.CellRef.length > 0) {\n ref = ctx.CellRef[0].image;\n return this.resolveCellReference(ref, sheetName);\n } else if (ctx.CellRange && ctx.CellRange.length > 0) {\n ref = ctx.CellRange[0].image;\n return this.resolveCellRange(ref, sheetName);\n } else if (ctx.RowRange && ctx.RowRange.length > 0) {\n ref = ctx.RowRange[0].image;\n return this.resolveRowRange(ref, sheetName);\n } else if (ctx.ColumnRange && ctx.ColumnRange.length > 0) {\n ref = ctx.ColumnRange[0].image;\n return this.resolveColumnRange(ref, sheetName);\n }\n }\n\n // Handle function calls\n if (ctx.ifFunctionCall) {\n return this.visit(ctx.ifFunctionCall[0]);\n } else if (ctx.functionCall) {\n return this.visit(ctx.functionCall[0]);\n } else if (ctx.ifErrorFunctionCall) {\n return this.visit(ctx.ifErrorFunctionCall[0]);\n } else if (ctx.ifsFunctionCall) {\n return this.visit(ctx.ifsFunctionCall[0]);\n } else if (ctx.switchFunctionCall) {\n return this.visit(ctx.switchFunctionCall[0]);\n }\n\n // Handle parenthesized expressions\n if (ctx.LParen) {\n return this.visit(ctx.expression[0]);\n }\n\n // Fallback\n console.warn(\"Unhandled atomic expression:\", ctx);\n return null;\n }\n\n ifFunctionCall(ctx: any) {\n const condition = this.visit(ctx.condition[0]);\n\n if (this.isTruthy(condition)) {\n return this.visit(ctx.whenTrue[0]);\n } else if (ctx.whenFalse && ctx.whenFalse.length > 0) {\n return this.visit(ctx.whenFalse[0]);\n }\n\n // If condition is false and no false branch, Excel returns FALSE\n return false;\n }\n\n functionCall(ctx: any) {\n const funcName = ctx.FunctionName[0].image.toUpperCase();\n const args = [];\n\n // Collect all arguments\n if (ctx.expression) {\n for (const expr of ctx.expression) {\n args.push(this.visit(expr));\n }\n }\n\n // Prioritize callFunction to ensure ArrayResult wrapping for dynamic arrays\n if (this.context && typeof this.context.callFunction === 'function') {\n try {\n let result = this.context.callFunction(funcName, args);\n\n // Handle Date objects - convert to Excel serial number\n if (result instanceof Date) {\n const excelEpoch = new Date(1899, 11, 30).getTime();\n const msPerDay = 24 * 60 * 60 * 1000;\n result = Math.floor((result.getTime() - excelEpoch) / msPerDay);\n }\n\n return result;\n } catch (e) {\n console.warn(`Function ${funcName} not found in callFunction, trying getFunction`);\n }\n }\n\n // Fallback to getFunction for custom/user-defined functions\n if (this.context && typeof this.context.getFunction === 'function') {\n const func = this.context.getFunction(funcName);\n if (typeof func === 'function') {\n try {\n let result = func(...args);\n\n // Handle Date objects - convert to Excel serial number\n if (result instanceof Date) {\n const excelEpoch = new Date(1899, 11, 30).getTime();\n const msPerDay = 24 * 60 * 60 * 1000;\n result = Math.floor((result.getTime() - excelEpoch) / msPerDay);\n }\n\n return result;\n } catch (e) {\n console.error(`Error executing function ${funcName}:`, e);\n return \"#ERROR!\";\n }\n }\n }\n\n // Handle common Excel functions directly as fallback\n return this.executeBuiltInFunction(funcName, args);\n }\n\n ifErrorFunctionCall(ctx: any) {\n try {\n const value = this.visit(ctx.value[0]);\n // Check if the result is an error value\n if (this.isErrorValue(value)) {\n return this.visit(ctx.valueIfError[0]);\n }\n return value;\n } catch (e) {\n // If any exception occurs during evaluation, return the valueIfError\n return this.visit(ctx.valueIfError[0]);\n }\n }\n\n ifsFunctionCall(ctx: any) {\n const conditions = ctx.condition;\n const values = ctx.value;\n\n for (let i = 0; i < conditions.length; i++) {\n const condition = this.visit(conditions[i]);\n if (this.isTruthy(condition)) {\n return this.visit(values[i]);\n }\n }\n\n // If no conditions are true, return #N/A\n return \"#N/A\";\n }\n\n switchFunctionCall(ctx: any) {\n const expression = this.visit(ctx.expression[0]);\n const values = ctx.value;\n const results = ctx.result;\n\n for (let i = 0; i < values.length; i++) {\n const value = this.visit(values[i]);\n if (expression === value) {\n return this.visit(results[i]);\n }\n }\n\n // If no match and default is provided, return default\n if (ctx.default && ctx.default.length > 0) {\n return this.visit(ctx.default[0]);\n }\n\n // If no match and no default, return #N/A\n return \"#N/A\";\n }\n\n arrayExpression(ctx: any) {\n // Process array expressions as 2D arrays\n const rows = [];\n rows.push(this.visit(ctx.arrayRow[0]));\n\n if (ctx.arrayRow.length > 1) {\n for (let i = 1; i < ctx.arrayRow.length; i++) {\n rows.push(this.visit(ctx.arrayRow[i]));\n }\n }\n\n return rows;\n }\n\n arrayRow(ctx: any) {\n // Process array rows as arrays\n const row = [];\n row.push(this.visit(ctx.expression[0]));\n\n if (ctx.expression.length > 1) {\n for (let i = 1; i < ctx.expression.length; i++) {\n row.push(this.visit(ctx.expression[i]));\n }\n }\n\n return row;\n }\n\n // Helper methods\n private resolveVariable(name: string, sheetName: string = ''): any {\n // First check if it's a named range (priority over sheet variables)\n if (this.context && typeof this.context.getNamedRange === 'function') {\n // Check if the workbook has this named range\n if (this.context.workbook?.nameManager.has(name)) {\n return this.context.getNamedRange(name);\n }\n }\n\n // Fall back to sheet variables\n if (this.context && typeof this.context.getVariable === 'function') {\n return this.context.getVariable(name, sheetName);\n }\n return \"#NAME?\"; // Excel's error for undefined names\n }\n\n private resolveCellReference(ref: string, sheetName: string = ''): any {\n if (this.context && typeof this.context.getCellValue === 'function') {\n return this.context.getCellValue(ref, sheetName);\n }\n return \"#REF!\"; // Excel's error for invalid cell references\n }\n\n private resolveCellRange(range: string, sheetName: string = ''): any {\n if (this.context && typeof this.context.getCellRange === 'function') {\n return this.context.getCellRange(range, sheetName);\n }\n return \"#REF!\";\n }\n\n private resolveRowRange(range: string, sheetName: string = ''): any {\n if (this.context && typeof this.context.getRowRange === 'function') {\n return this.context.getRowRange(range, sheetName);\n }\n return \"#REF!\";\n }\n\n private resolveColumnRange(range: string, sheetName: string = ''): any {\n if (this.context && typeof this.context.getColumnRange === 'function') {\n return this.context.getColumnRange(range, sheetName);\n }\n return \"#REF!\";\n }\n\n private isTruthy(value: any): boolean {\n if (typeof value === 'boolean') {\n return value;\n } else if (typeof value === 'number') {\n return value !== 0;\n } else if (typeof value === 'string') {\n // Excel treats non-empty strings as true except \"FALSE\"\n return value !== '' && value.toUpperCase() !== 'FALSE';\n } else {\n return value != null;\n }\n }\n\n private isErrorValue(value: any): boolean {\n if (typeof value !== 'string') return false;\n\n const errorValues = [\n \"#DIV/0!\", \"#N/A\", \"#NAME?\", \"#NULL!\",\n \"#NUM!\", \"#REF!\", \"#VALUE!\", \"#ERROR!\"\n ];\n\n return errorValues.includes(value);\n }\n\n private executeBuiltInFunction(name: string, args: any[]): any {\n // Implement common Excel functions\n let count = 0;\n\n switch (name) {\n case \"SUM\":\n return args.reduce((sum, val) => {\n if (Array.isArray(val)) {\n // Handle arrays/ranges\n return sum + this.flattenAndSum(val);\n } else if (!isNaN(val)) {\n return sum + Number(val);\n }\n return sum;\n }, 0);\n\n case \"AVERAGE\":\n let sum = 0;\n\n args.forEach(val => {\n if (Array.isArray(val)) {\n // Handle arrays/ranges\n const flattenedArray = this.flattenArray(val);\n sum += flattenedArray.reduce((s, v) => s + (isNaN(v) ? 0 : Number(v)), 0);\n count += flattenedArray.filter(v => !isNaN(v)).length;\n } else if (!isNaN(val)) {\n sum += Number(val);\n count++;\n }\n });\n\n return count > 0 ? sum / count : \"#DIV/0!\";\n\n case \"MAX\":\n let max = -Infinity;\n\n args.forEach(val => {\n if (Array.isArray(val)) {\n // Handle arrays/ranges\n const flattenedArray = this.flattenArray(val);\n const arrayMax = Math.max(...flattenedArray.filter(v => !isNaN(v)).map(Number));\n if (arrayMax > max) max = arrayMax;\n } else if (!isNaN(val) && Number(val) > max) {\n max = Number(val);\n }\n });\n\n return max === -Infinity ? 0 : max;\n\n case \"MIN\":\n let min = Infinity;\n\n args.forEach(val => {\n if (Array.isArray(val)) {\n // Handle arrays/ranges\n const flattenedArray = this.flattenArray(val);\n const arrayMin = Math.min(...flattenedArray.filter(v => !isNaN(v)).map(Number));\n if (arrayMin < min) min = arrayMin;\n } else if (!isNaN(val) && Number(val) < min) {\n min = Number(val);\n }\n });\n\n return min === Infinity ? 0 : min;\n\n case \"COUNT\":\n\n args.forEach(val => {\n if (Array.isArray(val)) {\n // Handle arrays/ranges\n const flattenedArray = this.flattenArray(val);\n count += flattenedArray.filter(v => !isNaN(v)).length;\n } else if (!isNaN(val)) {\n count++;\n }\n });\n\n return count;\n\n case \"CONCATENATE\":\n return args.reduce((result, val) => result + String(val), \"\");\n\n case \"AND\":\n return args.every(val => this.isTruthy(val));\n\n case \"OR\":\n return args.some(val => this.isTruthy(val));\n\n default:\n return \"#NAME?\"; // Unknown function\n }\n }\n\n private flattenAndSum(arr: any[]): number {\n if (!Array.isArray(arr)) return isNaN(arr) ? 0 : Number(arr);\n\n return arr.reduce((sum, val) => {\n if (Array.isArray(val)) {\n return sum + this.flattenAndSum(val);\n }\n return sum + (isNaN(val) ? 0 : Number(val));\n }, 0);\n }\n\n private flattenArray(arr: any[]): any[] {\n return arr.reduce((flat, val) => {\n if (Array.isArray(val)) {\n return flat.concat(this.flattenArray(val));\n } else {\n return flat.concat(val);\n }\n }, []);\n }\n\n parseInput(inputText: string) {\n // Strip leading '=' if present\n const cleanInput = inputText.startsWith('=') ? inputText.substring(1) : inputText;\n\n const lexResult = CalxLexer.tokenize(cleanInput);\n parserInstance.input = lexResult.tokens;\n\n const cst = parserInstance.expression();\n\n if (parserInstance.errors.length > 0) {\n console.error('Parser errors:', JSON.stringify(parserInstance.errors, null, 2));\n throw Error('Parsing errors detected');\n }\n\n return this.visit(cst);\n }\n\n parseCst(cst: CstNode) {\n return this.visit(cst);\n }\n\n parse(inputText: string) {\n try {\n const result = this.parseInput(inputText);\n return result;\n } catch (error) {\n console.error(\"Parsing error for input:\", inputText);\n console.error(\"Error details:\", error);\n if (error instanceof Error) {\n console.error(\"Stack trace:\", error.stack);\n }\n return ErrorType.ERROR; // Return a generic error type\n }\n }\n}\n","import { Cell } from './Cell';\nimport { Sheet } from './Sheet';\nimport { DataType } from './Cell/DataType';\n\n/**\n * Range class - Excel-like range that can contain one or more cells\n * This is the lowest unit of work in Calx, mimicking Excel's behavior\n *\n * Examples:\n * - Single cell: Range('A1') contains one cell\n * - Cell range: Range('A1:B10') contains multiple cells\n */\nexport class Range {\n private _cells: Cell[] = [];\n private _address: string;\n private _startAddress!: string;\n private _endAddress!: string;\n\n constructor(\n private sheet: Sheet,\n address: string\n ) {\n this._address = address;\n this.parseAddress(address);\n this.loadCells();\n }\n\n /**\n * Parse address and determine if single cell or range\n */\n private parseAddress(address: string) {\n // Remove $ signs (absolute reference markers) for cell lookup\n const cleanAddress = (addr: string) => addr.replace(/\\$/g, '');\n\n if (address.includes(':')) {\n // Range like \"A1:B10\" or \"$A$1:$B$10\"\n const [start, end] = address.split(':');\n this._startAddress = cleanAddress(start.trim());\n this._endAddress = cleanAddress(end.trim());\n } else {\n // Single cell like \"A1\" or \"$A$1\"\n this._startAddress = cleanAddress(address.trim());\n this._endAddress = cleanAddress(address.trim());\n }\n }\n\n /**\n * Load cells from the sheet\n */\n private loadCells() {\n if (this.isSingleCell()) {\n const cell = this.sheet.getCellDirect(this._startAddress);\n this._cells = [cell];\n } else {\n this._cells = this.expandRange();\n }\n }\n\n /**\n * Expand range address to array of cells\n */\n private expandRange(): Cell[] {\n const cells: Cell[] = [];\n\n const startCol = this._startAddress.match(/[A-Z]+/)?.[0] || 'A';\n const startRow = parseInt(this._startAddress.match(/\\d+/)?.[0] || '1');\n const endCol = this._endAddress.match(/[A-Z]+/)?.[0] || 'A';\n const endRow = parseInt(this._endAddress.match(/\\d+/)?.[0] || '1');\n\n const startColNum = this.colToNum(startCol);\n const endColNum = this.colToNum(endCol);\n\n // Normalize the range to handle reverse ranges (e.g., B2:A1 -> A1:B2)\n const minRow = Math.min(startRow, endRow);\n const maxRow = Math.max(startRow, endRow);\n const minCol = Math.min(startColNum, endColNum);\n const maxCol = Math.max(startColNum, endColNum);\n\n for (let row = minRow; row <= maxRow; row++) {\n for (let col = minCol; col <= maxCol; col++) {\n const address = this.numToCol(col) + row;\n cells.push(this.sheet.getCellDirect(address));\n }\n }\n\n return cells;\n }\n\n /**\n * Check if this is a single cell range\n */\n public isSingleCell(): boolean {\n return this._startAddress === this._endAddress;\n }\n\n /**\n * Get the address of this range\n */\n public get address(): string {\n return this._address;\n }\n\n /**\n * Get all cells in this range\n */\n public get cells(): Cell[] {\n return this._cells;\n }\n\n /**\n * Get the first cell in the range\n */\n public get cell(): Cell {\n return this._cells[0];\n }\n\n /**\n * Get value(s) from the range\n * - Single cell: returns single value\n * - Multiple cells: returns 2D array of values\n */\n public get value(): any {\n if (this.isSingleCell()) {\n return this._cells[0]?.value ?? null;\n }\n\n return this.getValues();\n }\n\n /**\n * Set value(s) to the range\n * - Single cell: sets the value\n * - Multiple cells: if value is array, distributes values; otherwise sets all to same value\n */\n public set value(val: any) {\n if (this.isSingleCell()) {\n this._cells[0].value = val;\n } else {\n if (Array.isArray(val)) {\n this.setValuesFromArray(val);\n } else {\n // Set all cells to same value\n this._cells.forEach(cell => cell.value = val);\n }\n }\n }\n\n /**\n * Get formula from the range (only for single cell)\n */\n public get formula(): string | null {\n if (this.isSingleCell()) {\n return this._cells[0].formula;\n }\n return null;\n }\n\n /**\n * Set formula to the range\n */\n public set formula(formula: string) {\n if (this.isSingleCell()) {\n this._cells[0].formula = formula;\n } else {\n // For range, set formula to all cells (adjusting relative references)\n // For now, set the same formula to all\n this._cells.forEach(cell => cell.formula = formula);\n }\n }\n\n /**\n * Get values as 2D array\n */\n public getValues(): any[][] {\n const startCol = this._startAddress.match(/[A-Z]+/)?.[0] || 'A';\n const startRow = parseInt(this._startAddress.match(/\\d+/)?.[0] || '1');\n const endCol = this._endAddress.match(/[A-Z]+/)?.[0] || 'A';\n const endRow = parseInt(this._endAddress.match(/\\d+/)?.[0] || '1');\n\n const startColNum = this.colToNum(startCol);\n const endColNum = this.colToNum(endCol);\n\n const result: any[][] = [];\n let cellIndex = 0;\n\n for (let row = startRow; row <= endRow; row++) {\n const rowData: any[] = [];\n for (let col = startColNum; col <= endColNum; col++) {\n rowData.push(this._cells[cellIndex++].value);\n }\n result.push(rowData);\n }\n\n return result;\n }\n\n /**\n * Set values from 2D array\n */\n public setValues(values: any[][]) {\n let cellIndex = 0;\n for (let row = 0; row < values.length; row++) {\n for (let col = 0; col < values[row].length; col++) {\n if (cellIndex < this._cells.length) {\n this._cells[cellIndex++].value = values[row][col];\n }\n }\n }\n }\n\n /**\n * Set values from flat array\n */\n private setValuesFromArray(values: any[]) {\n for (let i = 0; i < Math.min(values.length, this._cells.length); i++) {\n this._cells[i].value = values[i];\n }\n }\n\n /**\n * Get flat array of values\n */\n public toArray(): any[] {\n return this._cells.map(cell => cell.value);\n }\n\n /**\n * Calculate all cells in the range\n */\n public calculate() {\n this._cells.forEach(cell => {\n if (cell.formula) {\n cell.calculate();\n }\n });\n }\n\n /**\n * Get count of cells in range\n */\n public get count(): number {\n return this._cells.length;\n }\n\n /**\n * Get row count\n */\n public get rows(): number {\n const startRow = parseInt(this._startAddress.match(/\\d+/)?.[0] || '1');\n const endRow = parseInt(this._endAddress.match(/\\d+/)?.[0] || '1');\n return endRow - startRow + 1;\n }\n\n /**\n * Get column count\n */\n public get columns(): number {\n const startCol = this._startAddress.match(/[A-Z]+/)?.[0] || 'A';\n const endCol = this._endAddress.match(/[A-Z]+/)?.[0] || 'A';\n return this.colToNum(endCol) - this.colToNum(startCol) + 1;\n }\n\n /**\n * Iterate over each cell\n */\n public each(callback: (cell: Cell, index: number) => void) {\n this._cells.forEach((cell, index) => callback(cell, index));\n }\n\n /**\n * Map over cells\n */\n public map(callback: (cell: Cell, index: number) => T): T[] {\n return this._cells.map((cell, index) => callback(cell, index));\n }\n\n /**\n * Filter cells\n */\n public filter(callback: (cell: Cell, index: number) => boolean): Cell[] {\n return this._cells.filter((cell, index) => callback(cell, index));\n }\n\n /**\n * Find a cell\n */\n public find(callback: (cell: Cell, index: number) => boolean): Cell | undefined {\n return this._cells.find((cell, index) => callback(cell, index));\n }\n\n /**\n * Get cell at specific position in range (0-based index)\n */\n public getCellAt(index: number): Cell | undefined {\n return this._cells[index];\n }\n\n /**\n * Get cell at row, col position (0-based)\n */\n public getCellAtPosition(row: number, col: number): Cell | undefined {\n const colCount = this.columns;\n const index = row * colCount + col;\n return this._cells[index];\n }\n\n /**\n * Convert column letter to number (A=1, Z=26, AA=27)\n */\n private colToNum(col: string): number {\n let num = 0;\n for (let i = 0; i < col.length; i++) {\n num = num * 26 + (col.charCodeAt(i) - 64);\n }\n return num;\n }\n\n /**\n * Convert number to column letter (1=A, 26=Z, 27=AA)\n */\n private numToCol(num: number): string {\n let col = '';\n while (num > 0) {\n const remainder = (num - 1) % 26;\n col = String.fromCharCode(65 + remainder) + col;\n num = Math.floor((num - 1) / 26);\n }\n return col;\n }\n\n /**\n * Get a sub-range\n */\n public getRange(address: string): Range {\n return new Range(this.sheet, address);\n }\n\n /**\n * Clear all values in range\n */\n public clear() {\n this._cells.forEach(cell => {\n cell.value = null;\n cell.formula = '';\n });\n }\n\n /**\n * Get string representation\n */\n public toString(): string {\n if (this.isSingleCell()) {\n return `Range(${this._address})`;\n }\n return `Range(${this._address}) [${this.rows}x${this.columns}]`;\n }\n}\n","/**\n * Available sheet events.\n */\nexport enum SheetEvent {\n CALCULATION_STARTED = 'calculation.started',\n CALCULATION_PAUSED = 'calculation.paused',\n CALCULATION_RESUMED = 'calculation.resumed',\n CALCULATION_FINISHED = 'calculation.finished',\n\n CELL_ADDED = 'cell.added',\n CELL_REMOVED = 'cell.removed',\n CELL_CREATED = \"CELL_CREATED\",\n\n ELEMENT_ATTACHED = 'element.attached',\n ELEMENT_DETACHED = 'element.detached',\n}\n\nexport enum SheetState {\n CALCULATION_STARTED = 'calculation.started',\n CALCULATION_PAUSED = 'calculation.paused',\n CALCULATION_RESUMED = 'calculation.resumed',\n CALCULATION_FINISHED = 'calculation.finished',\n CALCULATION_IDLE = 'calculation.idle',\n}","/**\n * Utility class for converting between Excel serial dates and JavaScript Date objects\n */\nexport class DateUtil {\n /**\n * Excel epoch: December 30, 1899\n * Excel uses this as day 0 for date serial numbers\n */\n private static readonly EXCEL_EPOCH = new Date(1899, 11, 30).getTime();\n private static readonly MS_PER_DAY = 24 * 60 * 60 * 1000;\n\n /**\n * Convert Excel serial date number to JavaScript Date object\n * @param serialDate Excel serial date number (days since Dec 30, 1899)\n * @returns JavaScript Date object\n */\n static serialToDate(serialDate: number): Date {\n if (typeof serialDate !== 'number' || isNaN(serialDate)) {\n throw new Error('Invalid serial date: must be a number');\n }\n\n // Excel epoch: December 30, 1899 at midnight local time\n const epochDate = new Date(1899, 11, 30, 0, 0, 0, 0);\n const ms = serialDate * DateUtil.MS_PER_DAY;\n return new Date(epochDate.getTime() + ms);\n }\n\n /**\n * Convert JavaScript Date object to Excel serial date number\n * @param date JavaScript Date object\n * @returns Excel serial date number (days since Dec 30, 1899)\n */\n static dateToSerial(date: Date): number {\n if (!(date instanceof Date) || isNaN(date.getTime())) {\n throw new Error('Invalid date: must be a valid Date object');\n }\n\n // Excel epoch: December 30, 1899 at midnight local time\n const epochDate = new Date(1899, 11, 30, 0, 0, 0, 0);\n const ms = date.getTime() - epochDate.getTime();\n return Math.floor(ms / DateUtil.MS_PER_DAY);\n }\n\n /**\n * Check if a value is a valid Excel serial date\n * @param value Value to check\n * @returns True if value is a valid serial date number\n */\n static isValidSerialDate(value: any): boolean {\n if (typeof value !== 'number' || isNaN(value)) {\n return false;\n }\n\n // Excel dates are typically between 1 (Jan 1, 1900) and ~50000 (year 2036)\n // Allow negative for historical dates\n return value >= -36522 && value <= 2958465; // Years 1800-9999\n }\n\n /**\n * Create Excel serial date from date components\n * @param year Full year (e.g., 2024)\n * @param month Month (1-12)\n * @param day Day of month (1-31)\n * @returns Excel serial date number\n */\n static fromComponents(year: number, month: number, day: number): number {\n const date = new Date(year, month - 1, day);\n return DateUtil.dateToSerial(date);\n }\n\n /**\n * Get date components from Excel serial date\n * @param serialDate Excel serial date number\n * @returns Object with year, month (1-12), day, weekday (0-6, Sunday=0)\n */\n static toComponents(serialDate: number): {\n year: number;\n month: number;\n day: number;\n weekday: number;\n hours: number;\n minutes: number;\n seconds: number;\n } {\n const date = DateUtil.serialToDate(serialDate);\n return {\n year: date.getFullYear(),\n month: date.getMonth() + 1, // Convert to 1-based\n day: date.getDate(),\n weekday: date.getDay(),\n hours: date.getHours(),\n minutes: date.getMinutes(),\n seconds: date.getSeconds(),\n };\n }\n\n /**\n * Format Excel serial date as ISO string (YYYY-MM-DD)\n * @param serialDate Excel serial date number\n * @returns ISO date string\n */\n static toISOString(serialDate: number): string {\n const date = DateUtil.serialToDate(serialDate);\n return date.toISOString().split('T')[0];\n }\n\n /**\n * Parse ISO date string (YYYY-MM-DD) to Excel serial date\n * @param isoString ISO date string\n * @returns Excel serial date number\n */\n static fromISOString(isoString: string): number {\n const date = new Date(isoString);\n if (isNaN(date.getTime())) {\n throw new Error(`Invalid ISO date string: ${isoString}`);\n }\n return DateUtil.dateToSerial(date);\n }\n\n /**\n * Get current date as Excel serial date\n * @returns Excel serial date number for today\n */\n static today(): number {\n const now = new Date();\n now.setHours(0, 0, 0, 0); // Reset time to midnight\n return DateUtil.dateToSerial(now);\n }\n\n /**\n * Get current date and time as Excel serial date (with fractional day)\n * @returns Excel serial date number for now (includes time as fraction)\n */\n static now(): number {\n return DateUtil.dateToSerial(new Date());\n }\n}\n","import { Sheet } from './Sheet';\nimport { CellEvent } from './Cell/CellEvent';\nimport { DataType } from './Cell/DataType';\nimport { ErrorType } from './Cell/ErrorType';\nimport { FormatterInterface } from './Cell/Formatter';\nimport { ArrayResult } from './Cell/ArrayResult';\nimport { DateUtil } from './Utility/DateUtil';\n\n/**\n * Cell object, hold single value or formula\n */\nexport class Cell {\n private _value : any; //Cell original value\n private _address!: string; //Cell address\n private _formula!: string; //Cell formula\n private _computed : any; //Result of the computed formula\n private _rules : Record = {\n address : /^\\$?[A-Z]+\\$?[0-9]+$/, //Cell address validation rule (allows $ for absolute refs)\n };\n\n protected precedents : Record = {}; //Cells registry required by the formula\n protected dependents : Record = {}; //Cells registry that depend on this cell\n\n protected remotePrecedents : Record = {}; //Cells registry required by the formula from other sheets\n protected remoteDependents : Record = {}; //Cells registry that depend on this cell from other sheets\n\n /** Dynamic precedents (column/row ranges) */\n private dynamicPrecedents: {\n columnRanges?: string[]; // e.g., [\"A:A\", \"B:C\"]\n rowRanges?: string[]; // e.g., [\"1:1\", \"5:10\"]\n } = {};\n\n /** Flags */\n private _dirty : boolean = false;\n private _calculated : boolean = false;\n private _hasRemotePrecedents : boolean = false;\n private _hasRemoteDependents : boolean = false;\n private _hasDynamicPrecedents : boolean = false;\n\n /** Array formula properties */\n private _isArrayAnchor : boolean = false; // Is this the anchor cell of an array formula?\n private _arrayResult ?: ArrayResult; // Array result if this is anchor\n private _spillRange ?: string; // Range that this array spills into (e.g., \"A1:C3\")\n\n protected format!: string;\n protected formatter!: FormatterInterface;\n protected el ?: any;\n\n constructor(\n address : string,\n protected sheet : Sheet,\n protected _type : DataType = DataType.NUMBER\n ) {\n this.address = address;\n this.init();\n }\n\n public init() {\n\n }\n\n /** Mount cell object into specific element */\n public mount(el: any) {\n this.el = el;\n\n this.sheet.dispatcher.dispatch(CellEvent.ELEMENT_MOUNTED, {cell : this.address, el : el});\n }\n\n /** Check if cell has error value */\n public isError() {\n return Object.values(ErrorType).includes(this.value as ErrorType);\n }\n\n /** Check if cell has empty-able value, like null, empty string, undefined */\n public isEmpty() {\n // Check the raw value, not the processed value (which may convert null to 0 for NUMBER type)\n const rawValue = this.formula ? this._computed : this._value;\n return rawValue === null || rawValue === undefined || rawValue === '';\n }\n\n /**\n * Calculate the cell value based on its formula\n */\n public calculate() {\n // If no formula, nothing to calculate\n if (!this._formula) {\n this._calculated = true;\n this._dirty = false;\n return this._value;\n }\n\n try {\n // Use the sheet's eval method which sets the active sheet context\n const result = this.sheet.eval(this._formula);\n\n // Check if result is an ArrayResult\n if (result instanceof ArrayResult) {\n return this.handleArrayResult(result);\n }\n\n // Check if value changed to mark dependents as dirty\n const oldValue = this._computed;\n const valueChanged = oldValue !== result;\n\n this._computed = result;\n this._calculated = true;\n this._dirty = false;\n\n // Dispatch calculation complete event\n this.sheet.dispatcher.dispatch(CellEvent.CALCULATED, {\n cell : this.address,\n value : this._computed\n });\n\n // If value changed, mark dependents as dirty and recalculate if auto-calculate is enabled\n if (valueChanged) {\n this._markDependentsAsDirty();\n\n if (this.sheet.autoCalculate) {\n this._recalculateDependents();\n }\n }\n\n return this._computed;\n } catch (error) {\n console.error(`Error calculating cell ${this.address}:`, error);\n this._computed = ErrorType.ERROR;\n this._calculated = true;\n this._dirty = false;\n return this._computed;\n }\n }\n\n /**\n * Handle array formula result - spill into multiple cells\n */\n private handleArrayResult(arrayResult: ArrayResult): any {\n // Mark this as array anchor\n this._isArrayAnchor = true;\n this._arrayResult = arrayResult;\n\n // If single value, just return it\n if (arrayResult.isSingleValue()) {\n this._computed = arrayResult.getSingleValue();\n this._calculated = true;\n this._dirty = false;\n return this._computed;\n }\n\n // Check if we can spill\n const canSpill = this.checkSpillRange(arrayResult);\n\n if (!canSpill) {\n // Return SPILL error\n this._computed = ErrorType.SPILL;\n this._calculated = true;\n this._dirty = false;\n return this._computed;\n }\n\n // Spill the array into cells\n this.spillArray(arrayResult);\n\n // Return the value for this anchor cell\n this._computed = arrayResult.getValue(0, 0);\n this._calculated = true;\n this._dirty = false;\n\n return this._computed;\n }\n\n /**\n * Check if the array can spill without blocking\n */\n private checkSpillRange(arrayResult: ArrayResult): boolean {\n const {row: startRow, col: startCol} = this.getCellCoordinates(this.address);\n\n // Check each cell in the spill range\n for (let r = 0; r < arrayResult.rows; r++) {\n for (let c = 0; c < arrayResult.cols; c++) {\n // Skip the anchor cell\n if (r === 0 && c === 0) continue;\n\n const targetAddress = this.coordinatesToAddress(startRow + r, startCol + c);\n const targetCell = this.sheet.getCell(targetAddress);\n\n // If cell exists and has value or formula, it's blocking\n if (targetCell && (!targetCell.isEmpty() || targetCell.formula)) {\n return false;\n }\n }\n }\n\n return true;\n }\n\n /**\n * Spill array values into cells\n */\n private spillArray(arrayResult: ArrayResult): void {\n const {row: startRow, col: startCol} = this.getCellCoordinates(this.address);\n const endRow = startRow + arrayResult.rows - 1;\n const endCol = startCol + arrayResult.cols - 1;\n\n // Store spill range\n this._spillRange = `${this.address}:${this.coordinatesToAddress(endRow, endCol)}`;\n\n // Spill values into cells\n for (let r = 0; r < arrayResult.rows; r++) {\n for (let c = 0; c < arrayResult.cols; c++) {\n // Skip the anchor cell\n if (r === 0 && c === 0) continue;\n\n const targetAddress = this.coordinatesToAddress(startRow + r, startCol + c);\n const value = arrayResult.getValue(r, c);\n\n // Get or create the cell and set its value\n const cell = this.sheet.getCell(targetAddress);\n cell.value = value;\n }\n }\n }\n\n /**\n * Convert cell address to row/col coordinates\n */\n private getCellCoordinates(address: string): {row: number, col: number} {\n const match = address.match(/^([A-Z]+)(\\d+)$/);\n if (!match) throw new Error(`Invalid cell address: ${address}`);\n\n const colStr = match[1];\n const row = parseInt(match[2]);\n\n // Convert column letters to number\n let col = 0;\n for (let i = 0; i < colStr.length; i++) {\n col = col * 26 + (colStr.charCodeAt(i) - 64);\n }\n\n return {row, col};\n }\n\n /**\n * Convert row/col coordinates to cell address\n */\n private coordinatesToAddress(row: number, col: number): string {\n let colStr = '';\n let c = col;\n\n while (c > 0) {\n const remainder = (c - 1) % 26;\n colStr = String.fromCharCode(65 + remainder) + colStr;\n c = Math.floor((c - 1) / 26);\n }\n\n return colStr + row;\n }\n\n /**\n * Check if this cell is an array anchor\n */\n public isArrayAnchor(): boolean {\n return this._isArrayAnchor;\n }\n\n /**\n * Get the spill range if this is an array anchor\n */\n public getSpillRange(): string | undefined {\n return this._spillRange;\n }\n\n /**\n * Set cell format\n */\n public setFormat(format: string) {\n this.format = format;\n }\n\n /**\n * Set cell formatter\n */\n public setFormatter(formatter: any) {\n this.formatter = formatter;\n }\n\n /**\n * Get formatted value\n */\n public getFormattedValue(): string {\n if (this.formatter) {\n return this.formatter.format(this.value);\n }\n return this.value?.toString() || '';\n }\n\n /** Check if cell is calculated already */\n public isCalculated() : boolean {\n return this._calculated\n }\n\n /** Check if cell is affected by changes on other cells and need recalculation */\n public isDirty() : boolean {\n return this._dirty\n }\n\n public markAsDirty() {\n this._dirty = true;\n }\n\n /** Check if the current is numeric */\n public isNumeric() : boolean {\n return !isNaN(this.value - parseFloat(this.value));\n }\n\n public get address() : string {\n return this._address;\n }\n\n public set address(address : string) {\n if (address.match(this._rules.address)) {\n this._address = address;\n return;\n }\n\n throw new Error(\"Cell address should follow spreadsheet like address rule\");\n }\n\n /**\n * Get cell data type\n */\n public get type() : DataType {\n return this._type;\n }\n\n /**\n * Set cell data type\n */\n public set type(type : DataType) {\n this._type = type;\n }\n\n /**\n * Get cell formula\n */\n public get formula() : string {\n return this._formula;\n }\n\n /**\n * Set cell formula, and notify the parent sheet\n */\n public set formula(formula : string) {\n const oldFormula = this._formula;\n this._formula = formula;\n\n // Detect and store dynamic precedents (column/row ranges)\n this.updateDynamicPrecedents(formula);\n\n this.sheet.dispatcher.dispatch(\n CellEvent.FORMULA_CHANGED,\n {\n cell : this.address,\n oldFormula : oldFormula,\n newFormula : formula\n }\n );\n\n // When formula changes, we need to rebuild dependencies\n // Remove old precedents\n const oldPrecedents = this.getPrecedents();\n if (oldPrecedents) {\n for (const addr in oldPrecedents) {\n const precedent = oldPrecedents[addr];\n if (precedent) {\n precedent.removeDependent(this);\n }\n }\n }\n\n // Clear precedents - they will be rebuilt on next calculation\n this.precedents = {};\n\n // Mark as dirty so it recalculates and rebuilds dependencies on next calculate()\n this.markAsDirty();\n\n // Trigger immediate dependency rebuild if workbook has been built\n if (this.sheet.workbook && formula) {\n this.rebuildDependencies();\n }\n }\n\n /**\n * Rebuild dependencies for this cell based on current formula\n */\n private rebuildDependencies(): void {\n if (!this._formula) return;\n\n const builder = new (require('./Workbook/DependencyBuilder').DependencyBuilder)();\n builder.setWorkbook(this.sheet.workbook);\n\n const { localDeps, remoteDeps } = builder.getFormulaDependencies(this._formula);\n\n // Resolve local dependencies\n const dependencies: Record = {};\n for (const address in localDeps) {\n const precedentCell = this.sheet.getCellDirect(address);\n if (precedentCell) {\n dependencies[address] = precedentCell;\n precedentCell.addDependent(this);\n }\n }\n\n this.setPrecedents(dependencies);\n\n // Handle remote (cross-sheet) dependencies\n for (const remoteRef in remoteDeps) {\n try {\n const { sheetName, cellAddress } = builder.parseRemoteReference(remoteRef);\n const targetSheet = this.sheet.workbook.getSheet(sheetName);\n if (targetSheet) {\n const targetCell = targetSheet.getCellDirect(cellAddress);\n if (targetCell) {\n targetCell.addRemoteDependent(this);\n this.addRemotePrecedent(targetCell);\n }\n }\n } catch (e) {\n // Ignore errors for invalid references\n }\n }\n }\n\n /**\n * Get the value of the cell, if it has formula, return the computed value\n */\n public get value() : any | ErrorType {\n let value : any | ErrorType = this.formula ? this._computed : this._value;\n\n // Check if it's an error value first, return as-is\n if (typeof value === 'string' && Object.values(ErrorType).includes(value as ErrorType)) {\n return value;\n }\n\n switch (this._type) {\n case DataType.NUMBER:\n // Handle null, undefined, or empty string as 0 for calculations\n if (value === null || value === undefined || value === '') {\n return 0;\n }\n // Only parse as number if it's not already a number\n if (typeof value === 'number') {\n return value;\n }\n // Parse to number, but check if result is NaN\n const parsed = parseFloat(value);\n // Return the original value if it can't be parsed (like text)\n // This allows text values to remain text even in NUMBER cells\n return isNaN(parsed) ? value : parsed;\n case DataType.BOOLEAN:\n return !!value;\n case DataType.DATE:\n case DataType.DATETIME:\n case DataType.TIME:\n // For date types, return the Excel serial number (not converted to Date object)\n // Users can call getDateValue() to get a JavaScript Date object\n return value;\n case DataType.ERROR:\n return ErrorType[value as keyof typeof ErrorType];\n default:\n return value;\n }\n }\n\n /**\n * Set cell value, this will reset the formula\n */\n public set value(value : any) {\n // Convert boolean strings to actual booleans for BOOLEAN type cells\n if (this._type === DataType.BOOLEAN && typeof value === 'string') {\n const upperValue = value.trim().toUpperCase();\n if (upperValue === 'TRUE') {\n value = true;\n } else if (upperValue === 'FALSE') {\n value = false;\n }\n }\n\n // Convert date strings to Excel serial numbers for DATE type cells\n if (this._type === DataType.DATE || this._type === DataType.DATETIME) {\n if (typeof value === 'string' && value.trim() !== '') {\n try {\n // Try to parse as ISO date string (YYYY-MM-DD)\n // Use local date to avoid timezone issues\n const parts = value.match(/^(\\d{4})-(\\d{2})-(\\d{2})/);\n if (parts) {\n const year = parseInt(parts[1], 10);\n const month = parseInt(parts[2], 10) - 1; // Month is 0-based\n const day = parseInt(parts[3], 10);\n const date = new Date(year, month, day);\n const serial = DateUtil.dateToSerial(date);\n value = serial;\n } else {\n // Fallback to default Date parsing\n const date = new Date(value);\n if (!isNaN(date.getTime())) {\n value = DateUtil.dateToSerial(date);\n }\n }\n } catch (e) {\n // If parsing fails, keep original value\n }\n } else if (value instanceof Date) {\n value = DateUtil.dateToSerial(value);\n }\n }\n\n this._value = value;\n this._formula = '';\n\n this.sheet.dispatcher.dispatch(CellEvent.VALUE_CHANGED, {cell : this.address, value : value});\n\n // Mark dependents as dirty regardless of autoCalculate setting\n this._markDependentsAsDirty();\n\n // Also invalidate any formulas that reference this cell through column/row ranges\n this.sheet.invalidateDynamicDependents(this.address);\n\n // Auto-recalculate dependents if autoCalculate is enabled\n if (this.sheet.autoCalculate) {\n this._recalculateDependents();\n // After recalculating explicit dependents, recalculate cells with dynamic precedents\n this.sheet.recalculateDirtyCells();\n }\n }\n\n /**\n * Mark all dependent cells as dirty\n */\n private _markDependentsAsDirty() {\n const dependents = this.getDependents();\n for (const address in dependents) {\n const dependent = dependents[address];\n dependent.markAsDirty();\n // Recursively mark their dependents as dirty\n dependent._markDependentsAsDirty();\n }\n }\n\n /**\n * Recalculate all dependent cells\n */\n private _recalculateDependents() {\n const dependents = this.getDependents();\n for (const address in dependents) {\n const dependent = dependents[address];\n dependent.calculate();\n // Recursively recalculate their dependents\n dependent._recalculateDependents();\n }\n }\n\n public getStringValue() : string {\n return this.value.toString();\n }\n\n public getNumericValue() : number {\n return isNaN (parseFloat(this.value)) ? 0 : parseFloat(this.value);\n }\n\n /**\n * Get cell value as JavaScript Date object\n * Works for DATE, TIME, and DATETIME types\n * @returns JavaScript Date object if cell contains a date, null otherwise\n */\n public getDateValue(): Date | null {\n // Check if cell is a date type\n if (this._type !== DataType.DATE && this._type !== DataType.DATETIME && this._type !== DataType.TIME) {\n return null;\n }\n\n const val = this.value;\n\n // If already a Date object, return it\n if (val instanceof Date) {\n return val;\n }\n\n // If it's a number (Excel serial date), convert it\n if (typeof val === 'number' && DateUtil.isValidSerialDate(val)) {\n return DateUtil.serialToDate(val);\n }\n\n // Try parsing as date string\n if (typeof val === 'string') {\n const date = new Date(val);\n if (!isNaN(date.getTime())) {\n return date;\n }\n }\n\n return null;\n }\n\n /**\n * Get cell value as Excel serial date number\n * Works for DATE, TIME, and DATETIME types\n * @returns Excel serial date number if cell contains a date, null otherwise\n */\n public getSerialDateValue(): number | null {\n // Check if cell is a date type\n if (this._type !== DataType.DATE && this._type !== DataType.DATETIME && this._type !== DataType.TIME) {\n return null;\n }\n\n const val = this.value;\n\n // If it's already a number and valid, return it\n if (typeof val === 'number' && DateUtil.isValidSerialDate(val)) {\n return val;\n }\n\n // If it's a Date object, convert it\n if (val instanceof Date) {\n return DateUtil.dateToSerial(val);\n }\n\n // Try parsing as date string and converting\n if (typeof val === 'string') {\n try {\n return DateUtil.fromISOString(val);\n } catch {\n return null;\n }\n }\n\n return null;\n }\n\n /**\n * Set cell value from a JavaScript Date object\n * Automatically sets the cell type to DATE and stores as Excel serial number\n * @param date JavaScript Date object\n */\n public setDateValue(date: Date): void {\n if (!(date instanceof Date) || isNaN(date.getTime())) {\n throw new Error('Invalid date: must be a valid Date object');\n }\n\n this._type = DataType.DATE;\n this.value = DateUtil.dateToSerial(date);\n }\n\n /**\n * Set cell value from Excel serial date number\n * Automatically sets the cell type to DATE\n * @param serialDate Excel serial date number\n */\n public setSerialDateValue(serialDate: number): void {\n if (!DateUtil.isValidSerialDate(serialDate)) {\n throw new Error('Invalid serial date: must be a valid number');\n }\n\n this._type = DataType.DATE;\n this.value = serialDate;\n }\n\n /**\n * Get formatted date string (ISO format: YYYY-MM-DD)\n * @returns ISO date string if cell contains a date, null otherwise\n */\n public getFormattedDate(): string | null {\n const serialDate = this.getSerialDateValue();\n if (serialDate === null) {\n return null;\n }\n\n return DateUtil.toISOString(serialDate);\n }\n\n /**\n * Check if this cell contains a date value\n * @returns True if cell has DATE, TIME, or DATETIME type\n */\n public isDate(): boolean {\n return this._type === DataType.DATE ||\n this._type === DataType.DATETIME ||\n this._type === DataType.TIME;\n }\n\n public getPrecedents() : Record|null {\n if (this._hasDynamicPrecedents) {\n return null;\n } else {\n return this.precedents;\n }\n }\n\n public setPrecedents(precedents : Record) {\n this.precedents = precedents;\n }\n\n public addPrecedent(cell : Cell) {\n this.precedents[cell.address] = cell;\n }\n\n public getDependents() : Record {\n // Combine local and remote dependents\n return {...this.dependents, ...this.remoteDependents};\n }\n\n public setDependents(dependents : Record) {\n this.dependents = dependents;\n }\n\n public addDependent(cell : Cell) {\n this.dependents[cell.address] = cell;\n }\n\n public removeDependent(cell : Cell) {\n delete this.dependents[cell.address];\n }\n\n public addRemoteDependent(cell : Cell) {\n // Use sheet name + address as key to differentiate cells from different sheets\n const key = cell.sheet.name + '!' + cell.address;\n this.remoteDependents[key] = cell;\n this._hasRemoteDependents = true;\n }\n\n public addRemotePrecedent(cell : Cell) {\n // Use sheet name + address as key to differentiate cells from different sheets\n const key = cell.sheet.name + '!' + cell.address;\n this.remotePrecedents[key] = cell;\n }\n\n /**\n * Update dynamic precedents by parsing formula for column/row ranges\n */\n private updateDynamicPrecedents(formula: string): void {\n if (!formula) {\n this.dynamicPrecedents = {};\n this._hasDynamicPrecedents = false;\n return;\n }\n\n const columnRanges: string[] = [];\n const rowRanges: string[] = [];\n\n // Match column ranges: A:A, B:C, etc.\n const columnPattern = /\\b([A-Z]+)\\s*:\\s*([A-Z]+)\\b/g;\n let match;\n while ((match = columnPattern.exec(formula)) !== null) {\n columnRanges.push(match[0]);\n }\n\n // Match row ranges: 1:1, 5:10, etc. (but not cell ranges like A1:B2)\n const rowPattern = /\\b(\\d+)\\s*:\\s*(\\d+)\\b/g;\n while ((match = rowPattern.exec(formula)) !== null) {\n // Make sure it's not part of a cell range (no letter before the number)\n const beforeMatch = formula[match.index - 1];\n if (!beforeMatch || !/[A-Z]/i.test(beforeMatch)) {\n rowRanges.push(match[0]);\n }\n }\n\n this.dynamicPrecedents = {};\n if (columnRanges.length > 0) {\n this.dynamicPrecedents.columnRanges = columnRanges;\n }\n if (rowRanges.length > 0) {\n this.dynamicPrecedents.rowRanges = rowRanges;\n }\n\n this._hasDynamicPrecedents = columnRanges.length > 0 || rowRanges.length > 0;\n }\n\n /**\n * Check if this cell has dynamic precedents\n */\n public hasDynamicPrecedents(): boolean {\n return this._hasDynamicPrecedents;\n }\n\n /**\n * Check if this cell depends on a specific column\n */\n public dependsOnColumn(column: string): boolean {\n if (!this._hasDynamicPrecedents || !this.dynamicPrecedents.columnRanges) {\n return false;\n }\n\n const colNum = this.columnToNumber(column);\n return this.dynamicPrecedents.columnRanges.some(range => {\n const [start, end] = range.split(':').map(c => this.columnToNumber(c.trim()));\n return colNum >= start && colNum <= end;\n });\n }\n\n /**\n * Check if this cell depends on a specific row\n */\n public dependsOnRow(row: number): boolean {\n if (!this._hasDynamicPrecedents || !this.dynamicPrecedents.rowRanges) {\n return false;\n }\n\n return this.dynamicPrecedents.rowRanges.some(range => {\n const [start, end] = range.split(':').map(r => parseInt(r.trim()));\n return row >= start && row <= end;\n });\n }\n\n /**\n * Convert column letter to number (A=1, B=2, etc.)\n */\n private columnToNumber(col: string): number {\n let num = 0;\n for (let i = 0; i < col.length; i++) {\n num = num * 26 + (col.charCodeAt(i) - 64);\n }\n return num;\n }\n}\n","import { Cell } from \"../Cell\";\nimport { Sheet } from \"../Sheet\";\nimport { EventDispatcher } from \"../Utility/EventDispatcher\";\nimport { CellData } from \"../Workbook/Data\";\nimport { SheetEvent } from \"./SheetEvent\";\n\nexport class CellRegistry {\n private cells : Record = {};\n\n constructor(\n private sheet : Sheet,\n private event : EventDispatcher\n ) {\n\n }\n\n public add (cell : Cell) {\n this.cells[cell.address] = cell;\n\n this.event.dispatch(SheetEvent.CELL_ADDED, {cell : cell});\n }\n\n public remove (cell : Cell) {\n delete this.cells[cell.address];\n\n this.event.dispatch(SheetEvent.CELL_REMOVED, {cell : cell});\n }\n\n public get (address : string) : Cell {\n if (this.cells.hasOwnProperty(address)) {\n return this.cells[address];\n } else {\n // create new cell on-the-fly if it doesn't exist\n const cell = new Cell(address, this.sheet);\n this.cells[address] = cell;\n this.event.dispatch(SheetEvent.CELL_CREATED, {cell : cell});\n return cell;\n }\n }\n\n public has (address : string) : boolean {\n return this.cells.hasOwnProperty(address);\n }\n\n public create (address : string, data : CellData) : Cell {\n if (this.has(address)) {\n throw new Error(`Cell ${address} already exists`);\n }\n\n const cell = new Cell(address, this.sheet, data.type);\n\n // Set cell properties from data\n if (data.formula) {\n cell.formula = data.formula;\n } else if (data.value !== undefined) {\n cell.value = data.value;\n }\n\n if (data.format) {\n cell.setFormat(data.format);\n }\n\n if (data.formatter) {\n cell.setFormatter(data.formatter);\n }\n\n this.cells[cell.address] = cell;\n\n this.event.dispatch(SheetEvent.CELL_CREATED, {cell : cell});\n\n return cell;\n }\n\n public all () : Record {\n return this.cells;\n }\n\n public count () : number {\n return Object.keys(this.cells).length;\n }\n\n public clear () {\n this.cells = {};\n }\n\n public each (callback : (cell : Cell) => void) {\n for (const address in this.cells) {\n callback(this.cells[address]);\n }\n }\n\n public filter (callback : (cell : Cell) => boolean) : Record {\n const filtered : Record = {};\n\n for (const address in this.cells) {\n if (callback(this.cells[address])) {\n filtered[address] = this.cells[address];\n }\n }\n\n return filtered;\n }\n}","import { Workbook } from './Workbook';\nimport { Cell } from './Cell';\nimport { Range } from './Range';\nimport { EventDispatcher } from './Utility/EventDispatcher';\nimport { SheetEvent, SheetState } from './Sheet/SheetEvent';\nimport { CellRegistry } from './Sheet/CellRegistry';\nimport { DependencyTree } from './Workbook/DependencyTree';\nimport { DependencyBuilder } from './Workbook/DependencyBuilder';\nimport { CellData } from './Workbook/Data';\n\nexport class Sheet {\n private _el!: any;\n private _id : string;\n private _cells! : CellRegistry;\n private _states : Record = {\n calculation : SheetState.CALCULATION_IDLE,\n };\n private _variables : Record = {};\n private _depTree!: DependencyTree;\n private _autoCalculate : boolean = true;\n\n public needCalculate!: Array;\n public needRender!: Array;\n public workbook: Workbook;\n public name: string;\n public dispatcher: EventDispatcher;\n\n constructor(\n workbook : Workbook,\n name : string,\n dispatcher : EventDispatcher = new EventDispatcher()\n ) {\n this.workbook = workbook;\n this.name = name;\n this.dispatcher = dispatcher;\n this._id = this._generateId();\n this._cells = new CellRegistry(this, this.dispatcher);\n }\n\n /**\n * Generate unique id for sheet.\n *\n * @returns generated id\n */\n private _generateId() : string {\n return 'xxxx-xxxx-xxx-xxxx'.replace(/[x]/g, (c) => {\n const random = Math.floor(Math.random() * 16);\n return random.toString(16);\n });\n }\n\n /**\n * Get autoCalculate option\n */\n public get autoCalculate(): boolean {\n return this._autoCalculate;\n }\n\n /**\n * Set autoCalculate option\n * When true, changes to cell values automatically trigger recalculation of dependents\n * When false, manual calculation is required\n */\n public set autoCalculate(value: boolean) {\n this._autoCalculate = value;\n }\n\n /**\n * Recalculate all dirty cells (used for dynamic precedents)\n */\n public recalculateDirtyCells(): void {\n // Temporarily disable auto-calculate to avoid infinite recursion\n const wasAutoCalculate = this._autoCalculate;\n this._autoCalculate = false;\n\n this._cells.each((cell: Cell) => {\n if (cell.isDirty()) {\n cell.calculate();\n }\n });\n\n // Restore auto-calculate setting\n this._autoCalculate = wasAutoCalculate;\n }\n\n /**\n * Set element where sheet should be mounted (optional)\n */\n public set element(el : any) {\n el.setAttribute('data-calx-id', this.id);\n\n this._el = el;\n\n this.dispatcher.dispatch(SheetEvent.ELEMENT_ATTACHED, {sheet : this, el : el});\n }\n\n /**\n * Get element where sheet is mounted\n */\n public get element() : any {\n return this._el;\n }\n\n /**\n * Get sheet id\n */\n public get id() : string {\n return this._id;\n }\n\n /**\n * Get cells collection\n */\n public get cells() : Record {\n return this._cells.all();\n }\n\n /**\n * Listen to sheet events\n * Convenience method that delegates to the dispatcher\n */\n public listen(event: string, callback: (data: any) => void): void {\n this.dispatcher.listen(event, callback);\n }\n\n /**\n * Calculate the entire sheet\n *\n * @param options calculation option\n */\n public calculate(options : {withoutEvent : boolean} = {withoutEvent : false}) {\n if (options.withoutEvent) {\n this.dispatcher.pauseListener();\n }\n\n // Get calculation order from dependency tree\n if (this._depTree) {\n const calculationOrder = this._depTree.topologicalSort();\n\n // Calculate cells in order (level by level)\n for (const level of calculationOrder) {\n // Skip undefined levels\n if (!level) continue;\n\n for (const cell of level) {\n if (cell.isDirty() || !cell.isCalculated()) {\n cell.calculate();\n }\n }\n }\n\n // After dependency tree calculation, also calculate cells with dynamic precedents\n // that might not be in the tree (e.g., cells with only column/row references)\n this._cells.each((cell: Cell) => {\n if (cell.hasDynamicPrecedents() && (cell.isDirty() || !cell.isCalculated())) {\n cell.calculate();\n }\n });\n } else {\n // No dependency tree, calculate all cells\n for (const address in this.cells) {\n this.cells[address].calculate();\n }\n }\n\n this.dispatcher.resumeListener();\n }\n\n /**\n * Request particular cell to be calculated.\n *\n * @param address cell address\n */\n public requestCalculate(address : string) {\n const cell = this.getCell(address);\n if (cell) {\n cell.markAsDirty();\n cell.calculate();\n\n // Mark dependents as dirty\n const dependents = cell.getDependents();\n for (const depAddress in dependents) {\n dependents[depAddress].markAsDirty();\n }\n }\n }\n\n /**\n * Get range (Excel-like behavior)\n * - Single cell: getRange('A1') returns Range containing one cell\n * - Multiple cells: getRange('A1:B10') returns Range containing multiple cells\n */\n public getRange(address: string): Range {\n return new Range(this, address);\n }\n\n /**\n * Get cell object directly (internal use)\n * For external use, prefer getRange() which is more Excel-like\n */\n public getCellDirect(address: string): Cell {\n return this._cells.get(address);\n }\n\n /**\n * Alias for getRange (Excel-like)\n * @deprecated Use getRange() instead\n */\n public getCell(address: string): Cell {\n return this._cells.get(address);\n }\n\n public getCellValue(cellAddr: string): any {\n return this.getRange(cellAddr).value;\n }\n\n public createCell(address : string, data? : CellData) : Cell {\n const cell = this._cells.create(address, data || {});\n\n // Mark cells with dynamic precedents that might reference this new cell\n this.invalidateDynamicDependents(address);\n\n return cell;\n }\n\n /**\n * Evaluate the given formula.\n */\n public eval(formula : string) : any {\n this.workbook.setActiveSheet(this);\n\n return this.workbook.parser.parse(formula);\n }\n\n /**\n * Build dependency tree for all registered cells\n */\n public buildDependencyTree() : void {\n const builder = new DependencyBuilder();\n builder.setWorkbook(this.workbook);\n this._depTree = builder.build(this._cells);\n }\n\n /**\n * Mark cells with dynamic precedents (column/row ranges) as dirty\n * when a cell at the given address is created or modified\n */\n public invalidateDynamicDependents(address: string): void {\n // Parse the address to get column and row\n const match = address.match(/^([A-Z]+)(\\d+)$/);\n if (!match) return;\n\n const column = match[1];\n const row = parseInt(match[2]);\n\n // Check all cells in the sheet for dynamic dependencies\n this._cells.each((cell: Cell) => {\n if (cell.hasDynamicPrecedents()) {\n if (cell.dependsOnColumn(column) || cell.dependsOnRow(row)) {\n cell.markAsDirty();\n }\n }\n });\n }\n\n /**\n * Get variable value\n */\n public getVariable(name: string): any {\n return this._variables[name] !== undefined ? this._variables[name] : \"#NAME?\";\n }\n\n /**\n * Set variable value\n */\n public setVariable(name: string, value: any): void {\n this._variables[name] = value;\n }\n\n /**\n * Get values from a range of cells\n */\n public getCellRangeValues(start: string, end: string): any[] {\n // Implementation to get range of cells\n // This should parse cell addresses and return array of values\n const startColMatch = start.match(/[A-Z]+/);\n const startRowMatch = start.match(/\\d+/);\n const endColMatch = end.match(/[A-Z]+/);\n const endRowMatch = end.match(/\\d+/);\n\n if (!startColMatch || !startRowMatch || !endColMatch || !endRowMatch) {\n throw new Error(`Invalid cell range: ${start}:${end}`);\n }\n\n const startCol = startColMatch[0];\n const startRow = parseInt(startRowMatch[0]);\n const endCol = endColMatch[0];\n const endRow = parseInt(endRowMatch[0]);\n\n const result: any[] = [];\n\n // Convert column letters to numbers\n const colToNum = (col: string) => {\n let num = 0;\n for (let i = 0; i < col.length; i++) {\n num = num * 26 + (col.charCodeAt(i) - 64);\n }\n return num;\n };\n\n const numToCol = (num: number) => {\n let col = '';\n while (num > 0) {\n const remainder = (num - 1) % 26;\n col = String.fromCharCode(65 + remainder) + col;\n num = Math.floor((num - 1) / 26);\n }\n return col;\n };\n\n const startColNum = colToNum(startCol);\n const endColNum = colToNum(endCol);\n\n // Return as flat array for compatibility with functions\n for (let row = startRow; row <= endRow; row++) {\n for (let col = startColNum; col <= endColNum; col++) {\n const address = numToCol(col) + row;\n const cell = this._cells.get(address);\n result.push(cell ? cell.value : null);\n }\n }\n\n return result;\n }\n\n /**\n * Get values from a range of rows\n */\n public getRowRangeValues(range: string): any[] {\n // Parse range like \"1:3\" or \"2:2\"\n const parts = range.replace(/\\$/g, '').split(':');\n const startRow = parseInt(parts[0]);\n const endRow = parseInt(parts[1]);\n\n const result: any[] = [];\n const allCells = this._cells.all();\n\n // Find all cells in the row range\n for (const address in allCells) {\n const rowMatch = address.match(/(\\d+)$/);\n if (rowMatch) {\n const row = parseInt(rowMatch[1]);\n if (row >= startRow && row <= endRow) {\n result.push(allCells[address].value);\n }\n }\n }\n\n return result;\n }\n\n /**\n * Get values from a range of columns\n */\n public getColumnRangeValues(range: string): any[] {\n // Parse range like \"A:C\" or \"A:A\"\n const parts = range.replace(/\\$/g, '').split(':');\n const [startCol, endCol] = parts;\n\n const colToNum = (col: string) => {\n let num = 0;\n for (let i = 0; i < col.length; i++) {\n num = num * 26 + (col.charCodeAt(i) - 64);\n }\n return num;\n };\n\n const startColNum = colToNum(startCol);\n const endColNum = colToNum(endCol);\n\n const result: any[] = [];\n const allCells = this._cells.all();\n\n // Find all cells in the column range\n for (const address in allCells) {\n const colMatch = address.match(/^([A-Z]+)/);\n if (colMatch) {\n const colNum = colToNum(colMatch[1]);\n if (colNum >= startColNum && colNum <= endColNum) {\n result.push(allCells[address].value);\n }\n }\n }\n\n return result;\n }\n}\n","import bessel from 'bessel';\nimport jStat from 'jstat';\n\nconst nil = new Error('#NULL!');\nconst div0 = new Error('#DIV/0!');\nconst value = new Error('#VALUE!');\nconst ref = new Error('#REF!');\nconst name = new Error('#NAME?');\nconst num = new Error('#NUM!');\nconst na = new Error('#N/A');\nconst error = new Error('#ERROR!');\nconst data = new Error('#GETTING_DATA');\n\nfunction flattenShallow(array) {\n if (!array || !array.reduce) {\n return [array]\n }\n\n return array.reduce((a, b) => {\n const aIsArray = Array.isArray(a);\n const bIsArray = Array.isArray(b);\n\n if (aIsArray && bIsArray) {\n return a.concat(b)\n }\n\n if (aIsArray) {\n a.push(b);\n\n return a\n }\n\n if (bIsArray) {\n return [a].concat(b)\n }\n\n return [a, b]\n })\n}\n\nfunction isFlat(array) {\n if (!array) {\n return false\n }\n\n for (let i = 0; i < array.length; ++i) {\n if (Array.isArray(array[i])) {\n return false\n }\n }\n\n return true\n}\n\nfunction flatten() {\n let result;\n\n if (arguments.length === 1) {\n const argument = arguments[0];\n result = isArrayLike(argument) ? argsToArray.apply(null, arguments) : [argument];\n } else {\n result = Array.from(arguments);\n }\n\n while (!isFlat(result)) {\n result = flattenShallow(result);\n }\n\n return result\n}\n\nfunction isArrayLike(a) {\n return a != null && typeof a.length === 'number' && typeof a !== 'string'\n}\n\nfunction argsToArray(args) {\n const result = [];\n\n arrayEach(args, (value) => {\n result.push(value);\n });\n\n return result\n}\n\nfunction numbers() {\n const possibleNumbers = flatten.apply(null, arguments);\n\n return possibleNumbers.filter((el) => typeof el === 'number')\n}\n\nfunction cleanFloat(number) {\n const power = 1e14;\n\n return Math.round(number * power) / power\n}\n\nfunction parseBool(bool) {\n if (typeof bool === 'boolean') {\n return bool\n }\n\n if (bool instanceof Error) {\n return bool\n }\n\n if (typeof bool === 'number') {\n return bool !== 0\n }\n\n if (typeof bool === 'string') {\n const up = bool.toUpperCase();\n\n if (up === 'TRUE') {\n return true\n }\n\n if (up === 'FALSE') {\n return false\n }\n }\n\n if (bool instanceof Date && !isNaN(bool)) {\n return true\n }\n\n return value\n}\n\nfunction parseNumber(string) {\n if (string instanceof Error) {\n return string\n }\n\n if (string === undefined || string === null || string === '') {\n return 0\n }\n\n if (typeof string === 'boolean') {\n string = +string;\n }\n\n if (!isNaN(string)) {\n return parseFloat(string)\n }\n\n return value\n}\n\nfunction parseString(string) {\n if (string instanceof Error) {\n return string\n }\n\n if (string === undefined || string === null) {\n return ''\n }\n\n return string.toString()\n}\n\nfunction parseNumberArray(arr) {\n let len;\n\n if (!arr || (len = arr.length) === 0) {\n return value\n }\n\n let parsed;\n\n while (len--) {\n if (arr[len] instanceof Error) {\n return arr[len]\n }\n\n parsed = parseNumber(arr[len]);\n\n if (parsed instanceof Error) {\n return parsed\n }\n\n arr[len] = parsed;\n }\n\n return arr\n}\n\nfunction serialNumberToDate(serial) {\n if (serial < 60) {\n serial += 1;\n }\n\n const utc_days = Math.floor(serial - 25569);\n const utc_value = utc_days * 86400;\n const date_info = new Date(utc_value * 1000);\n const fractional_day = serial - Math.floor(serial) + 0.0000001;\n\n let total_seconds = Math.floor(86400 * fractional_day);\n\n const seconds = total_seconds % 60;\n\n total_seconds -= seconds;\n\n const hours = Math.floor(total_seconds / (60 * 60));\n const minutes = Math.floor(total_seconds / 60) % 60;\n let days = date_info.getUTCDate();\n let month = date_info.getUTCMonth();\n\n if (serial >= 60 && serial < 61) {\n days = 29;\n month = 1;\n }\n\n return new Date(date_info.getUTCFullYear(), month, days, hours, minutes, seconds)\n}\n\nfunction parseDate(date) {\n if (!isNaN(date)) {\n if (date instanceof Date) {\n return new Date(date)\n }\n\n const d = parseFloat(date);\n\n if (d < 0 || d >= 2958466) {\n return num\n }\n\n return serialNumberToDate(d)\n }\n\n if (typeof date === 'string') {\n date = /(\\d{4})-(\\d\\d?)-(\\d\\d?)$/.test(date) ? new Date(date + 'T00:00:00.000') : new Date(date);\n\n if (!isNaN(date)) {\n return date\n }\n }\n\n return value\n}\n\nfunction parseDateArray(arr) {\n let len = arr.length;\n let parsed;\n\n while (len--) {\n parsed = parseDate(arr[len]);\n\n if (parsed === value) {\n return parsed\n }\n\n arr[len] = parsed;\n }\n\n return arr\n}\n\nfunction anyError() {\n for (let n = 0; n < arguments.length; n++) {\n if (arguments[n] instanceof Error) {\n return arguments[n]\n }\n }\n\n return undefined\n}\n\nfunction isDefined(arg) {\n return arg !== undefined && arg !== null\n}\n\nfunction anyIsError() {\n let n = arguments.length;\n\n while (n--) {\n if (arguments[n] instanceof Error) {\n return true\n }\n }\n\n return false\n}\n\nfunction anyIsString() {\n let n = arguments.length;\n\n while (n--) {\n if (typeof arguments[n] === 'string') {\n return true\n }\n }\n\n return false\n}\n\nfunction arrayValuesToNumbers(arr) {\n let n = arr.length;\n let el;\n\n while (n--) {\n el = arr[n];\n\n if (typeof el === 'number') {\n continue\n }\n\n if (el === true) {\n arr[n] = 1;\n continue\n }\n\n if (el === false) {\n arr[n] = 0;\n continue\n }\n\n if (typeof el === 'string') {\n const number = parseNumber(el);\n\n arr[n] = number instanceof Error ? 0 : number;\n }\n }\n\n return arr\n}\n\nfunction rest(array, idx) {\n idx = idx || 1;\n\n if (!array || typeof array.slice !== 'function') {\n return array\n }\n\n return array.slice(idx)\n}\n\nfunction initial(array, idx) {\n idx = idx || 1;\n\n if (!array || typeof array.slice !== 'function') {\n return array\n }\n\n return array.slice(0, array.length - idx)\n}\n\nfunction arrayEach(array, iteratee) {\n let index = -1;\n const length = array.length;\n\n while (++index < length) {\n if (iteratee(array[index], index, array) === false) {\n break\n }\n }\n\n return array\n}\n\nfunction transpose(matrix) {\n if (!matrix) {\n return value\n }\n\n return matrix[0].map((col, i) => matrix.map((row) => row[i]))\n}\n\nconst d1900 = new Date(Date.UTC(1900, 0, 1));\nconst WEEK_STARTS = [\n undefined,\n 0,\n 1,\n undefined,\n undefined,\n undefined,\n undefined,\n undefined,\n undefined,\n undefined,\n undefined,\n undefined,\n 1,\n 2,\n 3,\n 4,\n 5,\n 6,\n 0\n];\nconst WEEK_TYPES = [\n [],\n [1, 2, 3, 4, 5, 6, 7],\n [7, 1, 2, 3, 4, 5, 6],\n [6, 0, 1, 2, 3, 4, 5],\n [],\n [],\n [],\n [],\n [],\n [],\n [],\n [7, 1, 2, 3, 4, 5, 6],\n [6, 7, 1, 2, 3, 4, 5],\n [5, 6, 7, 1, 2, 3, 4],\n [4, 5, 6, 7, 1, 2, 3],\n [3, 4, 5, 6, 7, 1, 2],\n [2, 3, 4, 5, 6, 7, 1],\n [1, 2, 3, 4, 5, 6, 7]\n];\nconst WEEKEND_TYPES = [\n [],\n [6, 0],\n [0, 1],\n [1, 2],\n [2, 3],\n [3, 4],\n [4, 5],\n [5, 6],\n undefined,\n undefined,\n undefined,\n [0, 0],\n [1, 1],\n [2, 2],\n [3, 3],\n [4, 4],\n [5, 5],\n [6, 6]\n];\n\n/**\n * Returns the serial number of a particular date.\n *\n * Category: Date and time\n *\n * @param {*} year Year\n * @param {*} month Month\n * @param {*} day Day\n * @returns\n */\nfunction DATE(year, month, day) {\n let result;\n\n year = parseNumber(year);\n month = parseNumber(month);\n day = parseNumber(day);\n\n if (anyIsError(year, month, day)) {\n result = value;\n } else {\n result = new Date(year, month - 1, day);\n\n if (result.getFullYear() < 0) {\n result = num;\n }\n }\n\n return result\n}\n\n/**\n * Calculates the number of days, months, or years between two dates. This function is useful in formulas where you need to calculate an age.\n *\n * Category: Date and time\n *\n * @param {*} start_date A date that represents the first, or starting date of a given period.\n * @param {*} end_date A date that represents the last, or ending, date of the period.\n * @param {*} unit The type of information that you want returned, where:\n - \"Y\": The number of complete years in the period.\n - \"M\": The number of complete months in the period.\n - \"D\": The number of days in the period.\n - \"MD\": The difference between the days in start_date and end_date. The months and years of the dates are ignored.\n - \"YM\": The difference between the months in start_date and end_date. The days and years of the dates are ignored\n - \"YD\": The difference between the days of start_date and end_date. The years of the dates are ignored.\n * @returns\n */\nfunction DATEDIF(start_date, end_date, unit) {\n unit = unit.toUpperCase();\n start_date = parseDate(start_date);\n end_date = parseDate(end_date);\n\n const start_date_year = start_date.getFullYear();\n const start_date_month = start_date.getMonth();\n const start_date_day = start_date.getDate();\n const end_date_year = end_date.getFullYear();\n const end_date_month = end_date.getMonth();\n const end_date_day = end_date.getDate();\n\n let result;\n\n switch (unit) {\n case 'Y':\n result = Math.floor(YEARFRAC(start_date, end_date));\n break\n case 'D':\n result = DAYS(end_date, start_date);\n break\n case 'M':\n result = end_date_month - start_date_month + 12 * (end_date_year - start_date_year);\n\n if (end_date_day < start_date_day) {\n result--;\n }\n\n break\n case 'MD':\n if (start_date_day <= end_date_day) {\n result = end_date_day - start_date_day;\n } else {\n if (end_date_month === 0) {\n start_date.setFullYear(end_date_year - 1);\n start_date.setMonth(12);\n } else {\n start_date.setFullYear(end_date_year);\n start_date.setMonth(end_date_month - 1);\n }\n\n result = DAYS(end_date, start_date);\n }\n\n break\n case 'YM':\n result = end_date_month - start_date_month + 12 * (end_date_year - start_date_year);\n\n if (end_date_day < start_date_day) {\n result--;\n }\n\n result = result % 12;\n break\n case 'YD':\n if (end_date_month > start_date_month || (end_date_month === start_date_month && end_date_day < start_date_day)) {\n start_date.setFullYear(end_date_year);\n } else {\n start_date.setFullYear(end_date_year - 1);\n }\n\n result = DAYS(end_date, start_date);\n break\n }\n\n return result\n}\n\n/**\n * Converts a date in the form of text to a serial number.\n *\n * Category: Date and time\n *\n * @param {*} date_text Text that represents a date in an Excel date format, or a reference to a value that contains text that represents a date in an Excel date format.\n * @returns\n */\nfunction DATEVALUE(date_text) {\n if (typeof date_text !== 'string') {\n return value\n }\n\n const date = Date.parse(date_text);\n\n if (isNaN(date)) {\n return value\n }\n\n return new Date(date_text)\n}\n\n/**\n * Converts a serial number to a day of the month.\n *\n * Category: Date and time\n *\n * @param {*} serial_number The date of the day you are trying to find.\n * @returns\n */\nfunction DAY(serial_number) {\n const date = parseDate(serial_number);\n\n if (date instanceof Error) {\n return date\n }\n\n return date.getDate()\n}\n\nfunction startOfDay(date) {\n const newDate = new Date(date);\n newDate.setHours(0, 0, 0, 0);\n\n return newDate\n}\n\n/**\n * Returns the number of days between two dates.\n *\n * Category: Date and time\n *\n * @param {*} end_date Start_date and End_date are the two dates between which you want to know the number of days.\n * @param {*} start_date Start_date and End_date are the two dates between which you want to know the number of days.\n * @returns\n */\nfunction DAYS(end_date, start_date) {\n end_date = parseDate(end_date);\n start_date = parseDate(start_date);\n\n if (end_date instanceof Error) {\n return end_date\n }\n\n if (start_date instanceof Error) {\n return start_date\n }\n\n return serial(startOfDay(end_date)) - serial(startOfDay(start_date))\n}\n\n/**\n * Calculates the number of days between two dates based on a 360-day year.\n *\n * Category: Date and time\n *\n * @param {*} start_date A date that represents the start date. If start_date occurs after end_date, the DAYS360 function returns a negative number.\n * @param {*} end_date A date that represents the end date.\n * @param {*} method Optional. A logical value that specifies whether to use the U.S. or European method in the calculation.\n * @returns\n */\nfunction DAYS360(start_date, end_date, method) {\n method = parseBool(method || 'false');\n start_date = parseDate(start_date);\n end_date = parseDate(end_date);\n\n if (start_date instanceof Error) {\n return start_date\n }\n\n if (end_date instanceof Error) {\n return end_date\n }\n\n if (method instanceof Error) {\n return method\n }\n\n const sm = start_date.getMonth();\n let em = end_date.getMonth();\n let sd, ed;\n\n if (method) {\n sd = start_date.getDate() === 31 ? 30 : start_date.getDate();\n ed = end_date.getDate() === 31 ? 30 : end_date.getDate();\n } else {\n const smd = new Date(start_date.getFullYear(), sm + 1, 0).getDate();\n const emd = new Date(end_date.getFullYear(), em + 1, 0).getDate();\n sd = start_date.getDate() === smd ? 30 : start_date.getDate();\n\n if (end_date.getDate() === emd) {\n if (sd < 30) {\n em++;\n ed = 1;\n } else {\n ed = 30;\n }\n } else {\n ed = end_date.getDate();\n }\n }\n\n return 360 * (end_date.getFullYear() - start_date.getFullYear()) + 30 * (em - sm) + (ed - sd)\n}\n\n/**\n * Returns the serial number of the date that is the indicated number of months before or after the start date.\n *\n * Category: Date and time\n *\n * @param {*} start_date A date that represents the start date.\n * @param {*} months The number of months before or after start_date. A positive value for months yields a future date; a negative value yields a past date.\n * @returns\n */\nfunction EDATE(start_date, months) {\n start_date = parseDate(start_date);\n\n if (start_date instanceof Error) {\n return start_date\n }\n\n if (isNaN(months)) {\n return value\n }\n\n months = parseInt(months, 10);\n start_date.setMonth(start_date.getMonth() + months);\n\n return start_date\n}\n\n/**\n * Returns the serial number of the last day of the month before or after a specified number of months.\n *\n * Category: Date and time\n *\n * @param {*} start_date A date that represents the starting date.\n * @param {*} months The number of months before or after start_date. A positive value for months yields a future date; a negative value yields a past date.\n * @returns\n */\nfunction EOMONTH(start_date, months) {\n start_date = parseDate(start_date);\n\n if (start_date instanceof Error) {\n return start_date\n }\n\n if (isNaN(months)) {\n return value\n }\n\n months = parseInt(months, 10);\n\n return new Date(start_date.getFullYear(), start_date.getMonth() + months + 1, 0)\n}\n\n/**\n * Converts a serial number to an hour.\n *\n * Category: Date and time\n *\n * @param {*} serial_number The time that contains the hour you want to find. Times may be entered as text strings within quotation marks (for example, \"6:45 PM\"), as decimal numbers (for example, 0.78125, which represents 6:45 PM), or as results of other formulas or functions (for example, TIMEVALUE(\"6:45 PM\")).\n * @returns\n */\nfunction HOUR(serial_number) {\n serial_number = parseDate(serial_number);\n\n if (serial_number instanceof Error) {\n return serial_number\n }\n\n return serial_number.getHours()\n}\n\n/**\n * Formula.js only\n *\n * @param {*} second\n * @returns\n */\nfunction INTERVAL(second) {\n if (typeof second !== 'number' && typeof second !== 'string') {\n return value\n } else {\n second = parseInt(second, 10);\n }\n\n let year = Math.floor(second / 946080000);\n second = second % 946080000;\n let month = Math.floor(second / 2592000);\n second = second % 2592000;\n let day = Math.floor(second / 86400);\n second = second % 86400;\n\n let hour = Math.floor(second / 3600);\n second = second % 3600;\n let min = Math.floor(second / 60);\n second = second % 60;\n let sec = second;\n\n year = year > 0 ? year + 'Y' : '';\n month = month > 0 ? month + 'M' : '';\n day = day > 0 ? day + 'D' : '';\n hour = hour > 0 ? hour + 'H' : '';\n min = min > 0 ? min + 'M' : '';\n sec = sec > 0 ? sec + 'S' : '';\n\n return 'P' + year + month + day + 'T' + hour + min + sec\n}\n\n/**\n * Returns the number of the ISO week number of the year for a given date.\n *\n * Category: Date and time\n *\n * @param {*} date Date is the date-time code used by Excel for date and time calculation.\n * @returns\n */\nfunction ISOWEEKNUM(date) {\n date = parseDate(date);\n\n if (date instanceof Error) {\n return date\n }\n\n date = startOfDay(date);\n date.setDate(date.getDate() + 4 - (date.getDay() || 7));\n const yearStart = new Date(date.getFullYear(), 0, 1);\n\n return Math.ceil(((date - yearStart) / 86400000 + 1) / 7)\n}\n\n/**\n * Converts a serial number to a minute.\n *\n * Category: Date and time\n *\n * @param {*} serial_number The time that contains the minute you want to find. Times may be entered as text strings within quotation marks (for example, \"6:45 PM\"), as decimal numbers (for example, 0.78125, which represents 6:45 PM), or as results of other formulas or functions (for example, TIMEVALUE(\"6:45 PM\")).\n * @returns\n */\nfunction MINUTE(serial_number) {\n serial_number = parseDate(serial_number);\n\n if (serial_number instanceof Error) {\n return serial_number\n }\n\n return serial_number.getMinutes()\n}\n\n/**\n * Converts a serial number to a month.\n *\n * Category: Date and time\n *\n * @param {*} serial_number The date of the month you are trying to find.\n * @returns\n */\nfunction MONTH(serial_number) {\n serial_number = parseDate(serial_number);\n\n if (serial_number instanceof Error) {\n return serial_number\n }\n\n return serial_number.getMonth() + 1\n}\n\n/**\n * Returns the number of whole workdays between two dates.\n *\n * Category: Date and time\n *\n * @param {*} start_date A date that represents the start date.\n * @param {*} end_date A date that represents the end date.\n * @param {*} holidays Optional. An optional range of one or more dates to exclude from the working calendar, such as state and federal holidays and floating holidays. The list can be either a range of values that contains the dates or an array constant of the serial numbers that represent the dates.\n * @returns\n */\nfunction NETWORKDAYS(start_date, end_date, holidays) {\n return NETWORKDAYS.INTL(start_date, end_date, 1, holidays)\n}\n\n/**\n * Returns the number of whole workdays between two dates using parameters to indicate which and how many days are weekend days.\n *\n * Category: Date and time\n *\n * @param {*} start_date The date for from which the difference is to be computed. The start_date can be earlier than, the same as, or later than the end_date.\n * @param {*} end_date The date for to which the difference is to be computed.\n * @param {*} weekend Optional. Indicates the days of the week that are weekend days and are not included in the number of whole working days between start_date and end_date. Weekend is a weekend number or string that specifies when weekends occur. Weekend number values indicate the following weekend days:\n * @param {*} holidays Optional. An optional set of one or more dates that are to be excluded from the working day calendar. holidays shall be a range of values that contain the dates, or an array constant of the serial values that represent those dates. The ordering of dates or serial values in holidays can be arbitrary.\n * @returns\n */\nNETWORKDAYS.INTL = (start_date, end_date, weekend, holidays) => {\n start_date = parseDate(start_date);\n\n if (start_date instanceof Error) {\n return start_date\n }\n\n end_date = parseDate(end_date);\n\n if (end_date instanceof Error) {\n return end_date\n }\n\n let isMask = false;\n const maskDays = [];\n const maskIndex = [1, 2, 3, 4, 5, 6, 0];\n const maskRegex = new RegExp('^[0|1]{7}$');\n\n if (weekend === undefined) {\n weekend = WEEKEND_TYPES[1];\n } else if (typeof weekend === 'string' && maskRegex.test(weekend)) {\n isMask = true;\n weekend = weekend.split('');\n\n for (let i = 0; i < weekend.length; i++) {\n if (weekend[i] === '1') {\n maskDays.push(maskIndex[i]);\n }\n }\n } else {\n weekend = WEEKEND_TYPES[weekend];\n }\n\n if (!(weekend instanceof Array)) {\n return value\n }\n\n if (holidays === undefined) {\n holidays = [];\n } else if (!(holidays instanceof Array)) {\n holidays = [holidays];\n }\n\n for (let i = 0; i < holidays.length; i++) {\n const h = parseDate(holidays[i]);\n\n if (h instanceof Error) {\n return h\n }\n\n holidays[i] = h;\n }\n\n const days = Math.round((end_date - start_date) / (1000 * 60 * 60 * 24)) + 1;\n let total = days;\n const day = start_date;\n\n for (let i = 0; i < days; i++) {\n const d = new Date().getTimezoneOffset() > 0 ? day.getUTCDay() : day.getDay();\n let dec = isMask ? maskDays.includes(d) : d === weekend[0] || d === weekend[1];\n\n for (let j = 0; j < holidays.length; j++) {\n const holiday = holidays[j];\n\n if (\n holiday.getDate() === day.getDate() &&\n holiday.getMonth() === day.getMonth() &&\n holiday.getFullYear() === day.getFullYear()\n ) {\n dec = true;\n break\n }\n }\n\n if (dec) {\n total--;\n }\n\n day.setDate(day.getDate() + 1);\n }\n\n return total\n};\n\n/**\n * Returns the serial number of the current date and time.\n *\n * Category: Date and time\n *\n * @returns\n */\nfunction NOW() {\n return new Date()\n}\n\n/**\n * Converts a serial number to a second.\n *\n * Category: Date and time\n *\n * @param {*} serial_number The time that contains the seconds you want to find. Times may be entered as text strings within quotation marks (for example, \"6:45 PM\"), as decimal numbers (for example, 0.78125, which represents 6:45 PM), or as results of other formulas or functions (for example, TIMEVALUE(\"6:45 PM\")).\n * @returns\n */\nfunction SECOND(serial_number) {\n serial_number = parseDate(serial_number);\n\n if (serial_number instanceof Error) {\n return serial_number\n }\n\n return serial_number.getSeconds()\n}\n\n/**\n * Returns the serial number of a particular time.\n *\n * Category: Date and time\n *\n * @param {*} hour A number from 0 (zero) to 32767 representing the hour. Any value greater than 23 will be divided by 24 and the remainder will be treated as the hour value. For example, TIME(27,0,0) = TIME(3,0,0) = .125 or 3:00 AM.\n * @param {*} minute A number from 0 to 32767 representing the minute. Any value greater than 59 will be converted to hours and minutes. For example, TIME(0,750,0) = TIME(12,30,0) = .520833 or 12:30 PM.\n * @param {*} second A number from 0 to 32767 representing the second. Any value greater than 59 will be converted to hours, minutes, and seconds. For example, TIME(0,0,2000) = TIME(0,33,22) = .023148 or 12:33:20 AM\n * @returns\n */\nfunction TIME(hour, minute, second) {\n hour = parseNumber(hour);\n minute = parseNumber(minute);\n second = parseNumber(second);\n\n if (anyIsError(hour, minute, second)) {\n return value\n }\n\n if (hour < 0 || minute < 0 || second < 0) {\n return num\n }\n\n return (3600 * hour + 60 * minute + second) / 86400\n}\n\n/**\n * Converts a time in the form of text to a serial number.\n *\n * Category: Date and time\n *\n * @param {*} time_text A text string that represents a time in any one of the Microsoft Excel time formats; for example, \"6:45 PM\" and \"18:45\" text strings within quotation marks that represent time.\n * @returns\n */\nfunction TIMEVALUE(time_text) {\n time_text = parseDate(time_text);\n\n if (time_text instanceof Error) {\n return time_text\n }\n\n return (3600 * time_text.getHours() + 60 * time_text.getMinutes() + time_text.getSeconds()) / 86400\n}\n\n/**\n * Returns the serial number of today's date.\n *\n * Category: Date and time\n *\n * @returns\n */\nfunction TODAY() {\n return startOfDay(new Date())\n}\n\n/**\n * Converts a serial number to a day of the week.\n *\n * Category: Date and time\n *\n * @param {*} serial_number A sequential number that represents the date of the day you are trying to find.\n * @param {*} return_type Optional. A number that determines the type of return value.\n * @returns\n */\nfunction WEEKDAY(serial_number, return_type) {\n serial_number = parseDate(serial_number);\n\n if (serial_number instanceof Error) {\n return serial_number\n }\n\n if (return_type === undefined) {\n return_type = 1;\n }\n\n const day = serial_number.getDay();\n\n return WEEK_TYPES[return_type][day]\n}\n\n/**\n * Converts a serial number to a number representing where the week falls numerically with a year.\n *\n * Category: Date and time\n *\n * @param {*} serial_number A date within the week.\n * @param {*} return_type Optional. A number that determines on which day the week begins. The default is 1.\n * @returns\n */\nfunction WEEKNUM(serial_number, return_type) {\n serial_number = parseDate(serial_number);\n\n if (serial_number instanceof Error) {\n return serial_number\n }\n\n if (return_type === undefined) {\n return_type = 1;\n }\n\n if (return_type === 21) {\n return ISOWEEKNUM(serial_number)\n }\n\n const week_start = WEEK_STARTS[return_type];\n let jan = new Date(serial_number.getFullYear(), 0, 1);\n const inc = jan.getDay() < week_start ? 1 : 0;\n jan -= Math.abs(jan.getDay() - week_start) * 24 * 60 * 60 * 1000;\n\n return Math.floor((serial_number - jan) / (1000 * 60 * 60 * 24) / 7 + 1) + inc\n}\n\n/**\n * Returns the serial number of the date before or after a specified number of workdays.\n *\n * Category: Date and time\n *\n * @param {*} start_date A date that represents the start date.\n * @param {*} days The number of nonweekend and nonholiday days before or after start_date. A positive value for days yields a future date; a negative value yields a past date.\n * @param {*} holidays Optional. An optional list of one or more dates to exclude from the working calendar, such as state and federal holidays and floating holidays. The list can be either a range of values that contain the dates or an array constant of the serial numbers that represent the dates.\n * @returns\n */\nfunction WORKDAY(start_date, days, holidays) {\n return WORKDAY.INTL(start_date, days, 1, holidays)\n}\n\n/**\n * Returns the serial number of the date before or after a specified number of workdays using parameters to indicate which and how many days are weekend days.\n *\n * Category: Date and time\n *\n * @param {*} start_date The start date, truncated to integer.\n * @param {*} days The number of workdays before or after the start_date. A positive value yields a future date; a negative value yields a past date; a zero value yields the start_date. Day-offset is truncated to an integer.\n * @param {*} weekend Optional. Indicates the days of the week that are weekend days and are not considered working days. Weekend is a weekend number or string that specifies when weekends occur. Weekend number values indicate the following weekend days:\n * @param {*} holidays Optional. An optional set of one or more dates that are to be excluded from the working day calendar. Holidays shall be a range of values that contain the dates, or an array constant of the serial values that represent those dates. The ordering of dates or serial values in holidays can be arbitrary.\n * @returns\n */\nWORKDAY.INTL = (start_date, days, weekend, holidays) => {\n start_date = parseDate(start_date);\n\n if (start_date instanceof Error) {\n return start_date\n }\n\n days = parseNumber(days);\n\n if (days instanceof Error) {\n return days\n }\n\n if (days < 0) {\n return num\n }\n\n if (weekend === undefined) {\n weekend = WEEKEND_TYPES[1];\n } else {\n weekend = WEEKEND_TYPES[weekend];\n }\n\n if (!(weekend instanceof Array)) {\n return value\n }\n\n if (holidays === undefined) {\n holidays = [];\n } else if (!(holidays instanceof Array)) {\n holidays = [holidays];\n }\n\n for (let i = 0; i < holidays.length; i++) {\n const h = parseDate(holidays[i]);\n\n if (h instanceof Error) {\n return h\n }\n\n holidays[i] = h;\n }\n\n let d = 0;\n\n while (d < days) {\n start_date.setDate(start_date.getDate() + 1);\n const day = start_date.getDay();\n\n if (day === weekend[0] || day === weekend[1]) {\n continue\n }\n\n for (let j = 0; j < holidays.length; j++) {\n const holiday = holidays[j];\n\n if (\n holiday.getDate() === start_date.getDate() &&\n holiday.getMonth() === start_date.getMonth() &&\n holiday.getFullYear() === start_date.getFullYear()\n ) {\n d--;\n break\n }\n }\n\n d++;\n }\n\n return start_date\n};\n\n/**\n * Converts a serial number to a year.\n *\n * Category: Date and time\n *\n * @param {*} serial_number The date of the year you want to find.\n * @returns\n */\nfunction YEAR(serial_number) {\n serial_number = parseDate(serial_number);\n\n if (serial_number instanceof Error) {\n return serial_number\n }\n\n return serial_number.getFullYear()\n}\n\nfunction isLeapYear(year) {\n return new Date(year, 1, 29).getMonth() === 1\n}\n\n// TODO : Use DAYS ?\nfunction daysBetween(start_date, end_date) {\n return Math.ceil((end_date - start_date) / 1000 / 60 / 60 / 24)\n}\n\n/**\n * Returns the year fraction representing the number of whole days between start_date and end_date.\n *\n * Category: Date and time\n *\n * @param {*} start_date A date that represents the start date.\n * @param {*} end_date A date that represents the end date.\n * @param {*} basis Optional. The type of day count basis to use.\n * @returns\n */\nfunction YEARFRAC(start_date, end_date, basis) {\n start_date = parseDate(start_date);\n\n if (start_date instanceof Error) {\n return start_date\n }\n\n end_date = parseDate(end_date);\n\n if (end_date instanceof Error) {\n return end_date\n }\n\n basis = basis || 0;\n let sd = start_date.getDate();\n const sm = start_date.getMonth() + 1;\n const sy = start_date.getFullYear();\n let ed = end_date.getDate();\n const em = end_date.getMonth() + 1;\n const ey = end_date.getFullYear();\n\n switch (basis) {\n case 0:\n // US (NASD) 30/360\n if (sd === 31 && ed === 31) {\n sd = 30;\n ed = 30;\n } else if (sd === 31) {\n sd = 30;\n } else if (sd === 30 && ed === 31) {\n ed = 30;\n }\n\n return (ed + em * 30 + ey * 360 - (sd + sm * 30 + sy * 360)) / 360\n case 1: {\n // Actual/actual\n const feb29Between = (date1, date2) => {\n const year1 = date1.getFullYear();\n const mar1year1 = new Date(year1, 2, 1);\n\n if (isLeapYear(year1) && date1 < mar1year1 && date2 >= mar1year1) {\n return true\n }\n\n const year2 = date2.getFullYear();\n const mar1year2 = new Date(year2, 2, 1);\n\n return isLeapYear(year2) && date2 >= mar1year2 && date1 < mar1year2\n };\n\n let ylength = 365;\n\n if (sy === ey || (sy + 1 === ey && (sm > em || (sm === em && sd >= ed)))) {\n if ((sy === ey && isLeapYear(sy)) || feb29Between(start_date, end_date) || (em === 1 && ed === 29)) {\n ylength = 366;\n }\n\n return daysBetween(start_date, end_date) / ylength\n }\n\n const years = ey - sy + 1;\n const days = (new Date(ey + 1, 0, 1) - new Date(sy, 0, 1)) / 1000 / 60 / 60 / 24;\n const average = days / years;\n\n return daysBetween(start_date, end_date) / average\n }\n\n case 2:\n // Actual/360\n\n return daysBetween(start_date, end_date) / 360\n case 3:\n // Actual/365\n\n return daysBetween(start_date, end_date) / 365\n case 4:\n // European 30/360\n\n return (ed + em * 30 + ey * 360 - (sd + sm * 30 + sy * 360)) / 360\n }\n}\n\nfunction serial(date) {\n const addOn = date > -2203891200000 ? 2 : 1;\n\n return Math.ceil((date - d1900) / 86400000) + addOn\n}\n\nconst defaultOperator = '=';\nconst validSymbols = ['>', '>=', '<', '<=', '=', '<>'];\nconst _TOKEN_TYPE_OPERATOR = 'operator';\nconst _TOKEN_TYPE_LITERAL = 'literal';\nconst SUPPORTED_TOKENS = [_TOKEN_TYPE_OPERATOR, _TOKEN_TYPE_LITERAL];\n\nconst TOKEN_TYPE_OPERATOR = _TOKEN_TYPE_OPERATOR;\nconst TOKEN_TYPE_LITERAL = _TOKEN_TYPE_LITERAL;\n\n/**\n * Create token which describe passed symbol/value.\n *\n * @param {String} value Value/Symbol to describe.\n * @param {String} type Type of the token 'operator' or 'literal'.\n * @return {Object}\n */\nfunction createToken(value, type) {\n if (SUPPORTED_TOKENS.indexOf(type) === -1) {\n throw new Error('Unsupported token type: ' + type)\n }\n\n return {\n value: value,\n type: type\n }\n}\n\n/**\n * Tries to cast numeric values to their type passed as a string.\n *\n * @param {*} value\n * @return {*}\n */\nfunction castValueToCorrectType(value) {\n if (typeof value !== 'string') {\n return value\n }\n\n if (/^\\d+(\\.\\d+)?$/.test(value)) {\n value = value.indexOf('.') === -1 ? parseInt(value, 10) : parseFloat(value);\n }\n\n return value\n}\n\n/**\n * Generate stream of tokens from passed expression.\n *\n * @param {String} expression\n * @return {String[]}\n */\nfunction tokenizeExpression(expression) {\n const expressionLength = expression.length;\n const tokens = [];\n let cursorIndex = 0;\n let processedValue = '';\n let processedSymbol = '';\n\n while (cursorIndex < expressionLength) {\n const char = expression.charAt(cursorIndex);\n\n switch (char) {\n case '>':\n case '<':\n case '=':\n processedSymbol = processedSymbol + char;\n\n if (processedValue.length > 0) {\n tokens.push(processedValue);\n processedValue = '';\n }\n\n break\n default:\n if (processedSymbol.length > 0) {\n tokens.push(processedSymbol);\n processedSymbol = '';\n }\n\n processedValue = processedValue + char;\n break\n }\n\n cursorIndex++;\n }\n\n if (processedValue.length > 0) {\n tokens.push(processedValue);\n }\n\n if (processedSymbol.length > 0) {\n tokens.push(processedSymbol);\n }\n\n return tokens\n}\n\n/**\n * Analyze and convert tokens to an object which describes their meaning.\n *\n * @param {String[]} tokens\n * @return {Object[]}\n */\nfunction analyzeTokens(tokens) {\n let literalValue = '';\n const analyzedTokens = [];\n\n for (let i = 0; i < tokens.length; i++) {\n const token = tokens[i];\n\n if (i === 0 && validSymbols.indexOf(token) >= 0) {\n analyzedTokens.push(createToken(token, TOKEN_TYPE_OPERATOR));\n } else {\n literalValue += token;\n }\n }\n\n if (literalValue.length > 0) {\n analyzedTokens.push(createToken(castValueToCorrectType(literalValue), TOKEN_TYPE_LITERAL));\n }\n\n if (analyzedTokens.length > 0 && analyzedTokens[0].type !== TOKEN_TYPE_OPERATOR) {\n analyzedTokens.unshift(createToken(defaultOperator, TOKEN_TYPE_OPERATOR));\n }\n\n return analyzedTokens\n}\n\n/**\n * Compute/Evaluate an expression passed as an array of tokens.\n *\n * @param {Object[]} tokens\n * @return {Boolean}\n */\nfunction computeExpression(tokens) {\n const values = [];\n let operator;\n\n for (let i = 0; i < tokens.length; i++) {\n const token = tokens[i];\n\n switch (token.type) {\n case TOKEN_TYPE_OPERATOR:\n operator = token.value;\n break\n case TOKEN_TYPE_LITERAL:\n values.push(token.value);\n break\n }\n }\n\n return evaluate(values, operator)\n}\n\n/**\n * Evaluate values based on passed math operator.\n *\n * @param {*} values\n * @param {String} operator\n * @return {Boolean}\n */\nfunction evaluate(values, operator) {\n let result = false;\n\n switch (operator) {\n case '>':\n result = values[0] > values[1];\n break\n case '>=':\n result = values[0] >= values[1];\n break\n case '<':\n result = values[0] < values[1];\n break\n case '<=':\n result = values[0] <= values[1];\n break\n case '=':\n result = values[0] == values[1];\n break\n case '<>':\n result = values[0] != values[1];\n break\n }\n\n return result\n}\n\nfunction parse(expression) {\n return analyzeTokens(tokenizeExpression(expression))\n}\n\nconst compute = computeExpression;\n\n// TODO\n/**\n * -- Not implemented --\n *\n * Returns information about the formatting, location, or contents of a value.\n *\n * Category: Information\n *\n * @returns\n */\nfunction CELL() {\n throw new Error('CELL is not implemented')\n}\n\nconst ERROR = {};\n\nERROR.TYPE = (error_val) => {\n switch (error_val) {\n case nil:\n return 1\n case div0:\n return 2\n case value:\n return 3\n case ref:\n return 4\n case name:\n return 5\n case num:\n return 6\n case na:\n return 7\n case data:\n return 8\n }\n\n return na\n};\n\n// TODO\n/**\n * -- Not implemented --\n *\n * Returns information about the current operating environment.\n *\n * Category: Information\n *\n * @returns\n */\nfunction INFO() {\n throw new Error('INFO is not implemented')\n}\n\n/**\n * Returns TRUE if the value is blank.\n *\n * Category: Information\n *\n * @param {*} value The value that you want tested. The value argument can be a blank (empty value), error, logical value, text, number, or reference value, or a name referring to any of these.\n * @returns\n */\nfunction ISBLANK(value) {\n return value === null\n}\n\n/**\n * Formula.js only\n *\n * @param {*} number\n * @returns\n */\nfunction ISBINARY(number) {\n return /^[01]{1,10}$/.test(number)\n}\n\n/**\n * Returns TRUE if the value is any error value except #N/A.\n *\n * Category: Information\n *\n * @param {*} value The value that you want tested. The value argument can be a blank (empty value), error, logical value, text, number, or reference value, or a name referring to any of these.\n * @returns\n */\nfunction ISERR(value$1) {\n return (\n [value, ref, div0, num, name, nil].indexOf(value$1) >= 0 ||\n (typeof value$1 === 'number' && (isNaN(value$1) || !isFinite(value$1)))\n )\n}\n\n/**\n * Returns TRUE if the value is any error value.\n *\n * Category: Information\n *\n * @param {*} value The value that you want tested. The value argument can be a blank (empty value), error, logical value, text, number, or reference value, or a name referring to any of these.\n * @returns\n */\nfunction ISERROR(value) {\n return ISERR(value) || value === na\n}\n\n/**\n * Returns TRUE if the number is even.\n *\n * Category: Information\n *\n * @param {*} number The value to test. If number is not an integer, it is truncated.\n * @returns\n */\nfunction ISEVEN(number) {\n return !(Math.floor(Math.abs(number)) & 1)\n}\n\n// TODO\n/**\n * -- Not implemented --\n *\n * Returns TRUE if there is a reference to a value that contains a formula.\n *\n * Category: Information\n *\n * @param {*} reference Reference is a reference to the value you want to test. Reference can be a value reference, a formula, or a name that refers to a value.\n * @returns\n */\nfunction ISFORMULA() {\n throw new Error('ISFORMULA is not implemented')\n}\n\n/**\n * Returns TRUE if the value is a logical value.\n *\n * Category: Information\n *\n * @param {*} value The value that you want tested. The value argument can be a blank (empty value), error, logical value, text, number, or reference value, or a name referring to any of these.\n * @returns\n */\nfunction ISLOGICAL(value) {\n return value === true || value === false\n}\n\n/**\n * Returns TRUE if the value is the #N/A error value.\n *\n * Category: Information\n *\n * @param {*} value The value that you want tested. The value argument can be a blank (empty value), error, logical value, text, number, or reference value, or a name referring to any of these.\n * @returns\n */\nfunction ISNA(value) {\n return value === na\n}\n\n/**\n * Returns TRUE if the value is not text.\n *\n * Category: Information\n *\n * @param {*} value The value that you want tested. The value argument can be a blank (empty value), error, logical value, text, number, or reference value, or a name referring to any of these.\n * @returns\n */\nfunction ISNONTEXT(value) {\n return typeof value !== 'string'\n}\n\n/**\n * Returns TRUE if the value is a number.\n *\n * Category: Information\n *\n * @param {*} value The value that you want tested. The value argument can be a blank (empty value), error, logical value, text, number, or reference value, or a name referring to any of these.\n * @returns\n */\nfunction ISNUMBER(value) {\n return typeof value === 'number' && !isNaN(value) && isFinite(value)\n}\n\n/**\n * Returns TRUE if the number is odd.\n *\n * Category: Information\n *\n * @param {*} value The value that you want tested. The value argument can be a blank (empty value), error, logical value, text, number, or reference value, or a name referring to any of these.\n * @returns\n */\nfunction ISODD(value) {\n return !!(Math.floor(Math.abs(value)) & 1)\n}\n\n// TODO\n/**\n * -- Not implemented --\n *\n * Returns TRUE if the value is a reference.\n *\n * Category: Information\n *\n * @param {*} value The value that you want tested. The value argument can be a blank (empty value), error, logical value, text, number, or reference value, or a name referring to any of these.\n * @returns\n */\nfunction ISREF() {\n throw new Error('ISREF is not implemented')\n}\n\n/**\n * Returns TRUE if the value is text.\n *\n * Category: Information\n *\n * @param {*} value The value that you want tested. The value argument can be a blank (empty value), error, logical value, text, number, or reference value, or a name referring to any of these.\n * @returns\n */\nfunction ISTEXT(value) {\n return typeof value === 'string'\n}\n\n/**\n * Returns a value converted to a number.\n *\n * Category: Information\n *\n * @param {*} value The value you want converted. N converts values listed in the following table.\n * @returns\n */\nfunction N(value) {\n if (ISNUMBER(value)) {\n return value\n }\n\n if (value instanceof Date) {\n return value.getTime()\n }\n\n if (value === true) {\n return 1\n }\n\n if (value === false) {\n return 0\n }\n\n if (ISERROR(value)) {\n return value\n }\n\n return 0\n}\n\n/**\n * Returns the error value #N/A.\n *\n * Category: Information\n *\n * @returns\n */\nfunction NA() {\n return na\n}\n\n// TODO\n/**\n * -- Not implemented --\n *\n * Returns the sheet number of the referenced sheet.\n *\n * Category: Information\n *\n * @param {*} value Optional. Value is the name of a sheet or a reference for which you want the sheet number. If value is omitted, SHEET returns the number of the sheet that contains the function.\n * @returns\n */\nfunction SHEET() {\n throw new Error('SHEET is not implemented')\n}\n\n// TODO\n/**\n * -- Not implemented --\n *\n * Returns the number of sheets in a reference.\n *\n * Category: Information\n *\n * @param {*} reference Optional. Reference is a reference for which you want to know the number of sheets it contains. If Reference is omitted, SHEETS returns the number of sheets in the workbook that contains the function.\n * @returns\n */\nfunction SHEETS() {\n throw new Error('SHEETS is not implemented')\n}\n\n/**\n * Returns a number indicating the data type of a value.\n *\n * Category: Information\n *\n * @param {*} value Can be any Microsoft Excel value, such as a number, text, logical value, and so on.\n * @returns\n */\nfunction TYPE(value) {\n if (ISNUMBER(value)) {\n return 1\n }\n\n if (ISTEXT(value)) {\n return 2\n }\n\n if (ISLOGICAL(value)) {\n return 4\n }\n\n if (ISERROR(value)) {\n return 16\n }\n\n if (Array.isArray(value)) {\n return 64\n }\n}\n\n/**\n * Chooses a value from a list of values.\n *\n * Category: Lookup and reference\n *\n * @param {*} index_num Specifies which value argument is selected. Index_num must be a number between 1 and 254, or a formula or reference to a value containing a number between 1 and 254. If index_num is 1, CHOOSE returns value1; if it is 2, CHOOSE returns value2; and so on. If index_num is less than 1 or greater than the number of the last value in the list, CHOOSE returns the #VALUE! error value. If index_num is a fraction, it is truncated to the lowest integer before being used.\n - If index_num is 1, CHOOSE returns value1; if it is 2, CHOOSE returns value2; and so on.\n - If index_num is less than 1 or greater than the number of the last value in the list, CHOOSE returns the #VALUE! error value.\n - If index_num is a fraction, it is truncated to the lowest integer before being used.\n * @param {*} args value1, value2, ... Value 1 is required, subsequent values are optional. 1 to 254 value arguments from which CHOOSE selects a value or an action to perform based on index_num. The arguments can be numbers, value references, defined names, formulas, functions, or text.\n * @returns\n */\nfunction CHOOSE() {\n if (arguments.length < 2) {\n return na\n }\n\n const index = arguments[0];\n\n if (index < 1 || index > 254) {\n return value\n }\n\n if (arguments.length < index + 1) {\n return value\n }\n\n return arguments[index]\n}\n\n/**\n * Returns the column number of a reference.\n *\n * Category: Lookup and reference\n *\n * @param {*} reference the value or range of values for which you want to return the column number.\n * @param {*} index\n * @returns\n */\nfunction COLUMN(reference, index) {\n if (arguments.length !== 2) {\n return na\n }\n\n if (index < 0) {\n return num\n }\n\n if (!(reference instanceof Array) || typeof index !== 'number') {\n return value\n }\n\n if (reference.length === 0) {\n return undefined\n }\n\n return jStat.col(reference, index)\n}\n\n/**\n * Returns the number of columns in a reference.\n *\n * Category: Lookup and reference\n *\n * @param {*} array An array or array formula, or a reference to a range of values for which you want the number of columns.\n * @returns\n */\nfunction COLUMNS(array) {\n if (arguments.length !== 1) {\n return na\n }\n\n if (!(array instanceof Array)) {\n return value\n }\n\n if (array.length === 0) {\n return 0\n }\n\n return jStat.cols(array)\n}\n\n/**\n * Looks in the top row of an array and returns the value of the indicated value.\n *\n * Category: Lookup and reference\n *\n * @param {*} lookup_value The value to be found in the first row of the table. Lookup_value can be a value, a reference, or a text string.\n * @param {*} table_array A table of information in which data is looked up. Use a reference to a range or a range name.\n * @param {*} row_index_num The row number in table_array from which the matching value will be returned. A row_index_num of 1 returns the first row value in table_array, a row_index_num of 2 returns the second row value in table_array, and so on. If row_index_num is less than 1, HLOOKUP returns the #VALUE! error value; if row_index_num is greater than the number of rows on table_array, HLOOKUP returns the #REF! error value.\n * @param {*} range_lookup Optional. A logical value that specifies whether you want HLOOKUP to find an exact match or an approximate match. If TRUE or omitted, an approximate match is returned. In other words, if an exact match is not found, the next largest value that is less than lookup_value is returned. If FALSE, HLOOKUP will find an exact match. If one is not found, the error value #N/A is returned.\n * @returns\n */\nfunction HLOOKUP(lookup_value, table_array, row_index_num, range_lookup) {\n return VLOOKUP(lookup_value, transpose(table_array), row_index_num, range_lookup)\n}\n\n/**\n * Uses an index to choose a value from a reference or array.\n *\n * Category: Lookup and reference\n *\n * @param {*} array A range of values or an array constant.\n - If array contains only one row or column, the corresponding row_num or column_num argument is optional.\n - If array has more than one row and more than one column, and only row_num or column_num is used, INDEX returns an array of the entire row or column in array.\n * @param {*} row_num Required, unless column_num is present. Selects the row in array from which to return a value. If row_num is omitted, column_num is required.\n * @param {*} column_num Optional. Selects the column in array from which to return a value. If column_num is omitted, row_num is required.\n * @returns\n */\nfunction INDEX(array, row_num, column_num) {\n const someError = anyError(array, row_num, column_num);\n\n if (someError) {\n return someError\n }\n\n if (!Array.isArray(array)) {\n return value\n }\n\n const isOneDimensionRange = array.length > 0 && !Array.isArray(array[0]);\n\n if (isOneDimensionRange && !column_num) {\n column_num = row_num;\n row_num = 1;\n } else {\n column_num = column_num || 1;\n row_num = row_num || 1;\n }\n\n if (column_num < 0 || row_num < 0) {\n return value\n }\n\n if (isOneDimensionRange && row_num === 1 && column_num <= array.length) {\n return array[column_num - 1]\n } else if (row_num <= array.length && column_num <= array[row_num - 1].length) {\n return array[row_num - 1][column_num - 1]\n }\n\n return ref\n}\n\n/**\n * Looks up values in a vector or array.\n *\n * Category: Lookup and reference\n *\n * @param {*} lookup_value A value that LOOKUP searches for in an array. The lookup_value argument can be a number, text, a logical value, or a name or reference that refers to a value.\n - If LOOKUP can't find the value of lookup_value, it uses the largest value in the array that is less than or equal to lookup_value.\n - If the value of lookup_value is smaller than the smallest value in the first row or column (depending on the array dimensions), LOOKUP returns the #N/A error value.\n * @param {*} array A range of values that contains text, numbers, or logical values that you want to compare with lookup_value. The array form of LOOKUP is very similar to the HLOOKUP and VLOOKUP functions. The difference is that HLOOKUP searches for the value of lookup_value in the first row, VLOOKUP searches in the first column, and LOOKUP searches according to the dimensions of array.\n* @param {*} result_array Optional. A range that contains only one row or column. The result_array argument must be the same size as lookup_value. It has to be the same size.\n * @returns\n */\nfunction LOOKUP(lookup_value, array, result_array) {\n array = flatten(array);\n result_array = result_array ? flatten(result_array) : array;\n\n const isNumberLookup = typeof lookup_value === 'number';\n let result = na;\n\n for (let i = 0; i < array.length; i++) {\n if (array[i] === lookup_value) {\n return result_array[i]\n } else if (\n (isNumberLookup && array[i] <= lookup_value) ||\n (typeof array[i] === 'string' && array[i].localeCompare(lookup_value) < 0)\n ) {\n result = result_array[i];\n } else if (isNumberLookup && array[i] > lookup_value) {\n return result\n }\n }\n\n return result\n}\n\n/**\n * Looks up values in a reference or array.\n *\n * Category: Lookup and reference\n *\n * @param {*} lookup_value The value that you want to match in lookup_array. For example, when you look up someone's number in a telephone book, you are using the person's name as the lookup value, but the telephone number is the value you want.The lookup_value argument can be a value (number, text, or logical value) or a value reference to a number, text, or logical value.\n * @param {*} lookup_array The range of values being searched.\n * @param {*} match_type Optional. The number -1, 0, or 1. The match_type argument specifies how Excel matches lookup_value with values in lookup_array. The default value for this argument is 1.\n * @returns\n */\nfunction MATCH(lookup_value, lookup_array, match_type) {\n if (!lookup_value || !lookup_array) {\n return na\n }\n\n if (arguments.length === 2) {\n match_type = 1;\n }\n\n lookup_array = flatten(lookup_array);\n\n if (!(lookup_array instanceof Array)) {\n return na\n }\n\n if (match_type !== -1 && match_type !== 0 && match_type !== 1) {\n return na\n }\n\n let index;\n let indexValue;\n\n for (let idx = 0; idx < lookup_array.length; idx++) {\n if (match_type === 1) {\n if (lookup_array[idx] === lookup_value) {\n return idx + 1\n } else if (lookup_array[idx] < lookup_value) {\n if (!indexValue) {\n index = idx + 1;\n indexValue = lookup_array[idx];\n } else if (lookup_array[idx] > indexValue) {\n index = idx + 1;\n indexValue = lookup_array[idx];\n }\n }\n } else if (match_type === 0) {\n if (typeof lookup_value === 'string' && typeof lookup_array[idx] === 'string') {\n const lookupValueStr = lookup_value.toLowerCase().replace(/\\?/g, '.').replace(/\\*/g, '.*').replace(/~/g, '\\\\');\n const regex = new RegExp('^' + lookupValueStr + '$');\n\n if (regex.test(lookup_array[idx].toLowerCase())) {\n return idx + 1\n }\n } else {\n if (lookup_array[idx] === lookup_value) {\n return idx + 1\n }\n }\n } else if (match_type === -1) {\n if (lookup_array[idx] === lookup_value) {\n return idx + 1\n } else if (lookup_array[idx] > lookup_value) {\n if (!indexValue) {\n index = idx + 1;\n indexValue = lookup_array[idx];\n } else if (lookup_array[idx] < indexValue) {\n index = idx + 1;\n indexValue = lookup_array[idx];\n }\n }\n }\n }\n\n return index || na\n}\n\n/**\n * Returns the number of rows in a reference.\n *\n * Category: Lookup and reference\n *\n * @param {*} array An array, an array formula, or a reference to a range of values for which you want the number of rows.\n * @returns\n */\nfunction ROWS(array) {\n if (arguments.length !== 1) {\n return na\n }\n\n if (!(array instanceof Array)) {\n return value\n }\n\n if (array.length === 0) {\n return 0\n }\n\n return jStat.rows(array)\n}\n\n/**\n * Returns the transpose of an array.\n *\n * Category: Lookup and reference\n *\n * @param {*} array An array or range of values on a worksheet that you want to transpose. The transpose of an array is created by using the first row of the array as the first column of the new array, the second row of the array as the second column of the new array, and so on. If you're not sure of how to enter an array formula, see Create an array formula.\n * @returns\n */\nfunction TRANSPOSE(array) {\n if (!array) {\n return na\n }\n\n return jStat.transpose(array)\n}\n\n/**\n * Returns a list of unique values in a list or range.\n *\n * Category: Lookup and reference\n *\n * @returns\n */\nfunction UNIQUE() {\n const result = [];\n\n for (let i = 0; i < arguments.length; ++i) {\n let hasElement = false;\n const element = arguments[i];\n\n // Check if we've already seen this element.\n\n for (let j = 0; j < result.length; ++j) {\n hasElement = result[j] === element;\n\n if (hasElement) {\n break\n }\n }\n\n // If we did not find it, add it to the result.\n if (!hasElement) {\n result.push(element);\n }\n }\n\n return result\n}\n\n/**\n * Looks in the first column of an array and moves across the row to return the value of a value.\n *\n * Category: Lookup and reference\n *\n * @param {*} lookup_value The value to be found in the first row of the table. Lookup_value can be a value, a reference, or a text string.\n * @param {*} table_array A table of information in which data is looked up. Use a reference to a range or a range name.\n * @param {*} col_index_num The row number in table_array from which the matching value will be returned. A row_index_num of 1 returns the first row value in table_array, a row_index_num of 2 returns the second row value in table_array, and so on. If row_index_num is less than 1, HLOOKUP returns the #VALUE! error value; if row_index_num is greater than the number of rows on table_array, HLOOKUP returns the #REF! error value.\n * @param {*} range_lookup Optional. A logical value that specifies whether you want HLOOKUP to find an exact match or an approximate match. If TRUE or omitted, an approximate match is returned. In other words, if an exact match is not found, the next largest value that is less than lookup_value is returned. If FALSE, HLOOKUP will find an exact match. If one is not found, the error value #N/A is returned.\n * @returns\n */\nfunction VLOOKUP(lookup_value, table_array, col_index_num, range_lookup) {\n if (!table_array || !col_index_num) {\n return na\n }\n\n range_lookup = !(range_lookup === 0 || range_lookup === false);\n let result = na;\n const isNumberLookup = typeof lookup_value === 'number';\n let exactMatchOnly = false;\n\n for (let i = 0; i < table_array.length; i++) {\n const row = table_array[i];\n\n if (row[0] === lookup_value) {\n result = col_index_num < row.length + 1 ? row[col_index_num - 1] : ref;\n break\n } else if (\n !exactMatchOnly &&\n ((isNumberLookup && range_lookup && row[0] <= lookup_value) ||\n (range_lookup && typeof row[0] === 'string' && row[0].localeCompare(lookup_value) < 0))\n ) {\n result = col_index_num < row.length + 1 ? row[col_index_num - 1] : ref;\n }\n\n if (isNumberLookup && row[0] > lookup_value) {\n exactMatchOnly = true;\n }\n }\n\n return result\n}\n\nconst SQRT2PI = 2.5066282746310002;\n\n/**\n * Returns the average of the absolute deviations of data points from their mean.\n *\n * Category: Statistical\n *\n * @param {*} args number1, number2, ... Number1 is required, subsequent numbers are optional. 1 to 255 arguments for which you want the average of the absolute deviations. You can also use a single array or a reference to an array instead of arguments separated by commas.\n * @returns\n */\nfunction AVEDEV() {\n const flatArguments = flatten(arguments);\n const flatArgumentsDefined = flatArguments.filter(isDefined);\n\n if (flatArgumentsDefined.length === 0) {\n return num\n }\n\n const range = parseNumberArray(flatArgumentsDefined);\n\n if (range instanceof Error) {\n return range\n }\n\n return jStat.sum(jStat(range).subtract(jStat.mean(range)).abs()[0]) / range.length\n}\n\n/**\n * Returns the average of its arguments.\n *\n * Category: Statistical\n *\n * @param {*} args number1, number2, ...Numbers, value references or ranges for which you want the average.\n * @returns\n */\nfunction AVERAGE() {\n const flatArguments = flatten(arguments);\n const flatArgumentsDefined = flatArguments.filter(isDefined);\n\n if (flatArgumentsDefined.length === 0) {\n return div0\n }\n\n const someError = anyError.apply(undefined, flatArgumentsDefined);\n\n if (someError) {\n return someError\n }\n\n const range = numbers(flatArgumentsDefined);\n const n = range.length;\n let sum = 0;\n let count = 0;\n let result;\n\n for (let i = 0; i < n; i++) {\n sum += range[i];\n count += 1;\n }\n\n result = sum / count;\n\n if (isNaN(result)) {\n result = num;\n }\n\n return result\n}\n\n/**\n * Returns the average of its arguments, including numbers, text, and logical values.\n *\n * Category: Statistical\n *\n * @param {*} args value1, value2, ... Value1 is required, subsequent values are optional. 1 to 255 values, ranges of values, or values for which you want the average.\n * @returns\n */\nfunction AVERAGEA() {\n const flatArguments = flatten(arguments);\n const flatArgumentsDefined = flatArguments.filter(isDefined);\n\n if (flatArgumentsDefined.length === 0) {\n return div0\n }\n\n const someError = anyError.apply(undefined, flatArgumentsDefined);\n\n if (someError) {\n return someError\n }\n\n const range = flatArgumentsDefined;\n const n = range.length;\n let sum = 0;\n let count = 0;\n let result;\n\n for (let i = 0; i < n; i++) {\n const el = range[i];\n\n if (typeof el === 'number') {\n sum += el;\n }\n\n if (el === true) {\n sum++;\n }\n\n if (el !== null) {\n count++;\n }\n }\n\n result = sum / count;\n\n if (isNaN(result)) {\n result = num;\n }\n\n return result\n}\n\n/**\n * Returns the average (arithmetic mean) of all the values in a range that meet a given criteria.\n *\n * Category: Statistical\n *\n * @param {*} range One or more values to average, including numbers or names, arrays, or references that contain numbers.\n * @param {*} criteria The criteria in the form of a number, expression, value reference, or text that defines which values are averaged.\n * @param {*} average_range Optional. The actual set of values to average. If omitted, range is used.\n * @returns\n */\nfunction AVERAGEIF(range, criteria, average_range) {\n if (arguments.length <= 1) {\n return na\n }\n\n average_range = average_range || range;\n const flatAverageRange = flatten(average_range);\n const flatAverageRangeDefined = flatAverageRange.filter(isDefined);\n average_range = parseNumberArray(flatAverageRangeDefined);\n\n range = flatten(range);\n\n if (average_range instanceof Error) {\n return average_range\n }\n\n let average_count = 0;\n let result = 0;\n const isWildcard = criteria === void 0 || criteria === '*';\n const tokenizedCriteria = isWildcard ? null : parse(criteria + '');\n\n for (let i = 0; i < range.length; i++) {\n const value = range[i];\n\n if (isWildcard) {\n result += average_range[i];\n average_count++;\n } else {\n const tokens = [createToken(value, TOKEN_TYPE_LITERAL)].concat(tokenizedCriteria);\n\n if (compute(tokens)) {\n result += average_range[i];\n average_count++;\n }\n }\n }\n\n return result / average_count\n}\n\n/**\n * Returns the average (arithmetic mean) of all values that meet multiple criteria.\n *\n * Category: Statistical\n *\n * @param {*} args One or more values to average, including numbers or names, arrays, or references that contain numbers.\n * @returns\n */\nfunction AVERAGEIFS() {\n // Does not work with multi dimensional ranges yet!\n // http://office.microsoft.com/en-001/excel-help/averageifs-function-HA010047493.aspx\n const args = argsToArray(arguments);\n const criteriaLength = (args.length - 1) / 2;\n const range = flatten(args[0]);\n let count = 0;\n let result = 0;\n\n for (let i = 0; i < range.length; i++) {\n let isMeetCondition = false;\n\n for (let j = 0; j < criteriaLength; j++) {\n const value = args[2 * j + 1][i];\n const criteria = args[2 * j + 2];\n const isWildcard = criteria === void 0 || criteria === '*';\n let computedResult = false;\n\n if (isWildcard) {\n computedResult = true;\n } else {\n const tokenizedCriteria = parse(criteria + '');\n const tokens = [createToken(value, TOKEN_TYPE_LITERAL)].concat(tokenizedCriteria);\n\n computedResult = compute(tokens);\n }\n\n // Criterias are calculated as AND so any `false` breakes the loop as unmeet condition\n if (!computedResult) {\n isMeetCondition = false;\n break\n }\n\n isMeetCondition = true;\n }\n\n if (isMeetCondition) {\n result += range[i];\n count++;\n }\n }\n\n const average = result / count;\n\n return isNaN(average) ? 0 : average\n}\n\nconst BETA = {};\n\n/**\n * Returns the beta cumulative distribution function.\n *\n * Category: Statistical\n *\n * @param {*} x The value between A and B at which to evaluate the function\n * @param {*} alpha A parameter of the distribution.\n * @param {*} beta A parameter of the distribution.\n * @param {*} cumulative A logical value that determines the form of the function. If cumulative is TRUE, BETA.DIST returns the cumulative distribution function; if FALSE, it returns the probability density function.\n * @param {*} a Optional. A lower bound to the interval of x.\n * @param {*} b Optional. An upper bound to the interval of x.\n * @returns\n */\nBETA.DIST = function (x, alpha, beta, cumulative, a, b) {\n if (arguments.length < 4) {\n return value\n }\n\n a = a === undefined ? 0 : a;\n b = b === undefined ? 1 : b;\n\n x = parseNumber(x);\n alpha = parseNumber(alpha);\n beta = parseNumber(beta);\n a = parseNumber(a);\n b = parseNumber(b);\n\n if (anyIsError(x, alpha, beta, a, b)) {\n return value\n }\n\n x = (x - a) / (b - a);\n\n return cumulative ? jStat.beta.cdf(x, alpha, beta) : jStat.beta.pdf(x, alpha, beta)\n};\n\n/**\n * Returns the inverse of the cumulative distribution function for a specified beta distribution.\n *\n * Category: Statistical\n *\n * @param {*} probability A probability associated with the beta distribution.\n * @param {*} alpha A parameter of the distribution.\n * @param {*} beta A parameter the distribution.\n * @param {*} a Optional. A lower bound to the interval of x.\n * @param {*} b Optional. An upper bound to the interval of x.\n * @returns\n */\nBETA.INV = (probability, alpha, beta, a, b) => {\n a = a === undefined ? 0 : a;\n b = b === undefined ? 1 : b;\n probability = parseNumber(probability);\n alpha = parseNumber(alpha);\n beta = parseNumber(beta);\n a = parseNumber(a);\n b = parseNumber(b);\n\n if (anyIsError(probability, alpha, beta, a, b)) {\n return value\n }\n\n return jStat.beta.inv(probability, alpha, beta) * (b - a) + a\n};\n\nconst BINOM = {};\n\n/**\n * Returns the individual term binomial distribution probability.\n *\n * Category: Statistical\n *\n * @param {*} number_s The number of successes in trials.\n * @param {*} trials The number of independent trials.\n * @param {*} probability_s The probability of success on each trial.\n * @param {*} cumulative A logical value that determines the form of the function. If cumulative is TRUE, then BINOM.DIST returns the cumulative distribution function, which is the probability that there are at most number_s successes; if FALSE, it returns the probability mass function, which is the probability that there are number_s successes.\n * @returns\n */\nBINOM.DIST = (number_s, trials, probability_s, cumulative) => {\n number_s = parseNumber(number_s);\n trials = parseNumber(trials);\n probability_s = parseNumber(probability_s);\n cumulative = parseNumber(cumulative);\n\n if (anyIsError(number_s, trials, probability_s, cumulative)) {\n return value\n }\n\n return cumulative\n ? jStat.binomial.cdf(number_s, trials, probability_s)\n : jStat.binomial.pdf(number_s, trials, probability_s)\n};\n\n/**\n * Returns the probability of a trial result using a binomial distribution.\n *\n * Category: Statistical\n *\n * @param {*} trials The number of independent trials. Must be greater than or equal to 0.\n * @param {*} probability_s The probability of success in each trial. Must be greater than or equal to 0 and less than or equal to 1.\n * @param {*} number_s The number of successes in trials. Must be greater than or equal to 0 and less than or equal to Trials.\n * @param {*} number_s2 Optional. If provided, returns the probability that the number of successful trials will fall between Number_s and number_s2. Must be greater than or equal to Number_s and less than or equal to Trials.\n * @returns\n */\nBINOM.DIST.RANGE = (trials, probability_s, number_s, number_s2) => {\n number_s2 = number_s2 === undefined ? number_s : number_s2;\n\n trials = parseNumber(trials);\n probability_s = parseNumber(probability_s);\n number_s = parseNumber(number_s);\n number_s2 = parseNumber(number_s2);\n\n if (anyIsError(trials, probability_s, number_s, number_s2)) {\n return value\n }\n\n let result = 0;\n\n for (let i = number_s; i <= number_s2; i++) {\n result += COMBIN(trials, i) * Math.pow(probability_s, i) * Math.pow(1 - probability_s, trials - i);\n }\n\n return result\n};\n\n/**\n * Returns the smallest value for which the cumulative binomial distribution is less than or equal to a criterion value.\n *\n * Category: Statistical\n *\n * @param {*} trials The number of Bernoulli trials.\n * @param {*} probability_s The probability of a success on each trial.\n * @param {*} alpha The criterion value.\n * @returns\n */\nBINOM.INV = (trials, probability_s, alpha) => {\n trials = parseNumber(trials);\n probability_s = parseNumber(probability_s);\n alpha = parseNumber(alpha);\n\n if (anyIsError(trials, probability_s, alpha)) {\n return value\n }\n\n let x = 0;\n\n while (x <= trials) {\n if (jStat.binomial.cdf(x, trials, probability_s) >= alpha) {\n return x\n }\n\n x++;\n }\n};\n\nconst CHISQ = {};\n\n/**\n * Returns the cumulative beta probability density function.\n *\n * Category: Statistical\n *\n * @param {*} x The value at which you want to evaluate the distribution.\n * @param {*} deg_freedom The number of degrees of freedom.\n * @param {*} cumulative A logical value that determines the form of the function. If cumulative is TRUE, CHISQ.DIST returns the cumulative distribution function; if FALSE, it returns the probability density function.\n * @returns\n */\nCHISQ.DIST = (x, deg_freedom, cumulative) => {\n x = parseNumber(x);\n deg_freedom = parseNumber(deg_freedom);\n\n if (anyIsError(x, deg_freedom)) {\n return value\n }\n\n return cumulative ? jStat.chisquare.cdf(x, deg_freedom) : jStat.chisquare.pdf(x, deg_freedom)\n};\n\n/**\n * Returns the one-tailed probability of the chi-squared distribution.\n *\n * Category: Statistical\n *\n * @param {*} x The value at which you want to evaluate the distribution.\n * @param {*} deg_freedom The number of degrees of freedom.\n * @returns\n */\nCHISQ.DIST.RT = (x, deg_freedom) => {\n if (!x | !deg_freedom) {\n return na\n }\n\n if (x < 1 || deg_freedom > Math.pow(10, 10)) {\n return num\n }\n\n if (typeof x !== 'number' || typeof deg_freedom !== 'number') {\n return value\n }\n\n return 1 - jStat.chisquare.cdf(x, deg_freedom)\n};\n\n/**\n * Returns the cumulative beta probability density function.\n *\n * Category: Statistical\n *\n * @param {*} probability A probability associated with the chi-squared distribution.\n * @param {*} deg_freedom The number of degrees of freedom.\n * @returns\n */\nCHISQ.INV = (probability, deg_freedom) => {\n probability = parseNumber(probability);\n deg_freedom = parseNumber(deg_freedom);\n\n if (anyIsError(probability, deg_freedom)) {\n return value\n }\n\n return jStat.chisquare.inv(probability, deg_freedom)\n};\n\n/**\n * Returns the inverse of the one-tailed probability of the chi-squared distribution.\n *\n * Category: Statistical\n *\n * @param {*} probability A probability associated with the chi-squared distribution.\n * @param {*} deg_freedom The number of degrees of freedom.\n * @returns\n */\nCHISQ.INV.RT = (probability, deg_freedom) => {\n if (!probability | !deg_freedom) {\n return na\n }\n\n if (probability < 0 || probability > 1 || deg_freedom < 1 || deg_freedom > Math.pow(10, 10)) {\n return num\n }\n\n if (typeof probability !== 'number' || typeof deg_freedom !== 'number') {\n return value\n }\n\n return jStat.chisquare.inv(1.0 - probability, deg_freedom)\n};\n\n/**\n * Returns the test for independence.\n *\n * Category: Statistical\n *\n * @param {*} actual_range The range of data that contains observations to test against expected values.\n * @param {*} expected_range The range of data that contains the ratio of the product of row totals and column totals to the grand total.\n * @returns\n */\nCHISQ.TEST = function (actual_range, expected_range) {\n if (arguments.length !== 2) {\n return na\n }\n\n if (!(actual_range instanceof Array) || !(expected_range instanceof Array)) {\n return value\n }\n\n if (actual_range.length !== expected_range.length) {\n return value\n }\n\n if (actual_range[0] && expected_range[0] && actual_range[0].length !== expected_range[0].length) {\n return value\n }\n\n const row = actual_range.length;\n let tmp, i, j;\n\n // Convert single-dimension array into two-dimension array\n\n for (i = 0; i < row; i++) {\n if (!(actual_range[i] instanceof Array)) {\n tmp = actual_range[i];\n actual_range[i] = [];\n actual_range[i].push(tmp);\n }\n\n if (!(expected_range[i] instanceof Array)) {\n tmp = expected_range[i];\n expected_range[i] = [];\n expected_range[i].push(tmp);\n }\n }\n\n const col = actual_range[0].length;\n const dof = col === 1 ? row - 1 : (row - 1) * (col - 1);\n let xsqr = 0;\n const Pi = Math.PI;\n\n for (i = 0; i < row; i++) {\n for (j = 0; j < col; j++) {\n xsqr += Math.pow(actual_range[i][j] - expected_range[i][j], 2) / expected_range[i][j];\n }\n }\n\n // Get independency by X square and its degree of freedom\n function ChiSq(xsqr, dof) {\n let p = Math.exp(-0.5 * xsqr);\n\n if (dof % 2 === 1) {\n p = p * Math.sqrt((2 * xsqr) / Pi);\n }\n\n let k = dof;\n\n while (k >= 2) {\n p = (p * xsqr) / k;\n k = k - 2;\n }\n\n let t = p;\n let a = dof;\n\n while (t > 0.0000000001 * p) {\n a = a + 2;\n t = (t * xsqr) / a;\n p = p + t;\n }\n\n return 1 - p\n }\n\n return Math.round(ChiSq(xsqr, dof) * 1000000) / 1000000\n};\n\nconst CONFIDENCE = {};\n\n/**\n * Returns the confidence interval for a population mean.\n *\n * Category: Statistical\n *\n * @param {*} alpha The significance level used to compute the confidence level. The confidence level equals 100*(1 - alpha)%, or in other words, an alpha of 0.05 indicates a 95 percent confidence level.\n * @param {*} standard_dev The population standard deviation for the data range and is assumed to be known.\n * @param {*} size The sample size.\n * @returns\n */\nCONFIDENCE.NORM = (alpha, standard_dev, size) => {\n alpha = parseNumber(alpha);\n standard_dev = parseNumber(standard_dev);\n size = parseNumber(size);\n\n if (anyIsError(alpha, standard_dev, size)) {\n return value\n }\n\n return jStat.normalci(1, alpha, standard_dev, size)[1] - 1\n};\n\n/**\n * Returns the confidence interval for a population mean, using a Student's t distribution.\n *\n * Category: Statistical\n *\n * @param {*} alpha The significance level used to compute the confidence level. The confidence level equals 100*(1 - alpha)%, or in other words, an alpha of 0.05 indicates a 95 percent confidence level.\n * @param {*} standard_dev The population standard deviation for the data range and is assumed to be known.\n * @param {*} size The sample size.\n * @returns\n */\nCONFIDENCE.T = (alpha, standard_dev, size) => {\n alpha = parseNumber(alpha);\n standard_dev = parseNumber(standard_dev);\n size = parseNumber(size);\n\n if (anyIsError(alpha, standard_dev, size)) {\n return value\n }\n\n return jStat.tci(1, alpha, standard_dev, size)[1] - 1\n};\n\n/**\n * Returns the correlation coefficient between two data sets.\n *\n * Category: Statistical\n *\n * @param {*} array1 A range of value values.\n * @param {*} array2 A second range of value values.\n * @returns\n */\nfunction CORREL(array1, array2) {\n array1 = parseNumberArray(flatten(array1));\n array2 = parseNumberArray(flatten(array2));\n\n if (anyIsError(array1, array2)) {\n return value\n }\n\n return jStat.corrcoeff(array1, array2)\n}\n\n/**\n * Counts how many numbers are in the list of arguments.\n *\n * Category: Statistical\n *\n * @param {*} args Cell reference, or range within which you want to count numbers.count numbers.\n * @returns\n */\nfunction COUNT() {\n const flatArguments = flatten(arguments);\n\n return numbers(flatArguments).length\n}\n\n/**\n * Counts how many values are in the list of arguments.\n *\n * Category: Statistical\n *\n * @param {*} args Arguments representing the values that you want to count.\n * @returns\n */\nfunction COUNTA() {\n const flatArguments = flatten(arguments);\n\n return flatArguments.length - COUNTBLANK(flatArguments)\n}\n\n/**\n * Formula.js only\n *\n * @param {*} range\n * @param {*} value\n * @returns\n */\nfunction COUNTIN(range, value) {\n let result = 0;\n\n range = flatten(range);\n\n for (let i = 0; i < range.length; i++) {\n if (range[i] === value) {\n result++;\n }\n }\n\n return result\n}\n\n/**\n * Counts the number of blank values within a range.\n *\n * Category: Statistical\n *\n * @param {*} args The range from which you want to count the blank values.\n * @returns\n */\nfunction COUNTBLANK() {\n const range = flatten(arguments);\n let blanks = 0;\n let element;\n\n for (let i = 0; i < range.length; i++) {\n element = range[i];\n\n if (element === undefined || element === null || element === '') {\n blanks++;\n }\n }\n\n return blanks\n}\n\n/**\n * Counts the number of values within a range that meet the given criteria.\n *\n * Category: Statistical\n *\n * @returns\n */\nfunction COUNTIF(range, criteria) {\n range = flatten(range);\n\n const isWildcard = criteria === void 0 || criteria === '*';\n\n if (isWildcard) {\n return range.length\n }\n\n let matches = 0;\n const tokenizedCriteria = parse(criteria + '');\n\n for (let i = 0; i < range.length; i++) {\n const value = range[i];\n const tokens = [createToken(value, TOKEN_TYPE_LITERAL)].concat(tokenizedCriteria);\n\n if (compute(tokens)) {\n matches++;\n }\n }\n\n return matches\n}\n\n/**\n * Counts the number of values within a range that meet multiple criteria.\n *\n * Category: Statistical\n *\n * @param {*} args Range in which to evaluate the associated criteria.\n * @returns\n */\nfunction COUNTIFS() {\n const args = argsToArray(arguments);\n const results = new Array(flatten(args[0]).length);\n\n for (let i = 0; i < results.length; i++) {\n results[i] = true;\n }\n\n for (let i = 0; i < args.length; i += 2) {\n const range = flatten(args[i]);\n const criteria = args[i + 1];\n const isWildcard = criteria === void 0 || criteria === '*';\n\n if (!isWildcard) {\n const tokenizedCriteria = parse(criteria + '');\n\n for (let j = 0; j < range.length; j++) {\n const value = range[j];\n const tokens = [createToken(value, TOKEN_TYPE_LITERAL)].concat(tokenizedCriteria);\n\n results[j] = results[j] && compute(tokens);\n }\n }\n }\n\n let result = 0;\n\n for (let i = 0; i < results.length; i++) {\n if (results[i]) {\n result++;\n }\n }\n\n return result\n}\n\n/**\n * Formula.js only\n *\n * @returns\n */\nfunction COUNTUNIQUE() {\n return UNIQUE.apply(null, flatten(arguments)).length\n}\n\nconst COVARIANCE = {};\n\n/**\n * Returns covariance, the average of the products of paired deviations.\n *\n * Category: Statistical\n *\n * @param {*} array1 The first value range of integers.\n * @param {*} array2 The second value range of integers.\n * @returns\n */\nCOVARIANCE.P = (array1, array2) => {\n array1 = parseNumberArray(flatten(array1));\n array2 = parseNumberArray(flatten(array2));\n\n if (anyIsError(array1, array2)) {\n return value\n }\n\n const mean1 = jStat.mean(array1);\n const mean2 = jStat.mean(array2);\n let result = 0;\n const n = array1.length;\n\n for (let i = 0; i < n; i++) {\n result += (array1[i] - mean1) * (array2[i] - mean2);\n }\n\n return result / n\n};\n\n/**\n * Returns the sample covariance, the average of the products deviations for each data point pair in two data sets.\n *\n * Category: Statistical\n *\n * @param {*} array1 The first value range of integers.\n * @param {*} array2 The second value range of integers.\n * @returns\n */\nCOVARIANCE.S = (array1, array2) => {\n array1 = parseNumberArray(flatten(array1));\n array2 = parseNumberArray(flatten(array2));\n\n if (anyIsError(array1, array2)) {\n return value\n }\n\n return jStat.covariance(array1, array2)\n};\n\n/**\n * Returns the sum of squares of deviations.\n *\n * Category: Statistical\n *\n * @param {*} args number1, number2, ... Number1 is required, subsequent numbers are optional. 1 to 255 arguments for which you want to calculate the sum of squared deviations. You can also use a single array or a reference to an array instead of arguments separated by commas.\n * @returns\n */\nfunction DEVSQ() {\n const range = parseNumberArray(flatten(arguments));\n\n if (range instanceof Error) {\n return range\n }\n\n const mean = jStat.mean(range);\n let result = 0;\n\n for (let i = 0; i < range.length; i++) {\n result += Math.pow(range[i] - mean, 2);\n }\n\n return result\n}\n\nconst EXPON = {};\n\n/**\n * Returns the exponential distribution.\n *\n * Category: Statistical\n *\n * @param {*} x The value of the function.\n * @param {*} lambda The parameter value.\n * @param {*} cumulative A logical value that indicates which form of the exponential function to provide. If cumulative is TRUE, EXPON.DIST returns the cumulative distribution function; if FALSE, it returns the probability density function.\n * @returns\n */\nEXPON.DIST = (x, lambda, cumulative) => {\n x = parseNumber(x);\n lambda = parseNumber(lambda);\n\n if (anyIsError(x, lambda)) {\n return value\n }\n\n return cumulative ? jStat.exponential.cdf(x, lambda) : jStat.exponential.pdf(x, lambda)\n};\n\nconst F = {};\n\n/**\n * Returns the F probability distribution.\n *\n * Category: Statistical\n *\n * @param {*} x The value at which to evaluate the function.\n * @param {*} deg_freedom1 The numerator degrees of freedom.\n * @param {*} deg_freedom2 The denominator degrees of freedom.\n * @param {*} cumulative A logical value that determines the form of the function. If cumulative is TRUE, F.DIST returns the cumulative distribution function; if FALSE, it returns the probability density function.\n * @returns\n */\nF.DIST = (x, deg_freedom1, deg_freedom2, cumulative) => {\n x = parseNumber(x);\n deg_freedom1 = parseNumber(deg_freedom1);\n deg_freedom2 = parseNumber(deg_freedom2);\n\n if (anyIsError(x, deg_freedom1, deg_freedom2)) {\n return value\n }\n\n return cumulative\n ? jStat.centralF.cdf(x, deg_freedom1, deg_freedom2)\n : jStat.centralF.pdf(x, deg_freedom1, deg_freedom2)\n};\n\n/**\n * Returns the F probability distribution.\n *\n * Category: Statistical\n *\n * @param {*} x The value at which to evaluate the function.\n * @param {*} deg_freedom1 The numerator degrees of freedom.\n * @param {*} deg_freedom2 The denominator degrees of freedom.\n * @returns\n */\nF.DIST.RT = function (x, deg_freedom1, deg_freedom2) {\n if (arguments.length !== 3) {\n return na\n }\n\n if (x < 0 || deg_freedom1 < 1 || deg_freedom2 < 1) {\n return num\n }\n\n if (typeof x !== 'number' || typeof deg_freedom1 !== 'number' || typeof deg_freedom2 !== 'number') {\n return value\n }\n\n return 1 - jStat.centralF.cdf(x, deg_freedom1, deg_freedom2)\n};\n\n/**\n * Returns the inverse of the F probability distribution.\n *\n * Category: Statistical\n *\n * @param {*} probability A probability associated with the F cumulative distribution.\n * @param {*} deg_freedom1 The numerator degrees of freedom.\n * @param {*} deg_freedom2 The denominator degrees of freedom.\n * @returns\n */\nF.INV = (probability, deg_freedom1, deg_freedom2) => {\n probability = parseNumber(probability);\n deg_freedom1 = parseNumber(deg_freedom1);\n deg_freedom2 = parseNumber(deg_freedom2);\n\n if (anyIsError(probability, deg_freedom1, deg_freedom2)) {\n return value\n }\n\n if (probability <= 0.0 || probability > 1.0) {\n return num\n }\n\n return jStat.centralF.inv(probability, deg_freedom1, deg_freedom2)\n};\n\n/**\n * Returns the inverse of the F probability distribution.\n *\n * Category: Statistical\n *\n * @param {*} probability A probability associated with the F cumulative distribution.\n * @param {*} deg_freedom1 The numerator degrees of freedom.\n * @param {*} deg_freedom2 The denominator degrees of freedom.\n * @returns\n */\nF.INV.RT = function (probability, deg_freedom1, deg_freedom2) {\n if (arguments.length !== 3) {\n return na\n }\n\n if (\n probability < 0 ||\n probability > 1 ||\n deg_freedom1 < 1 ||\n deg_freedom1 > Math.pow(10, 10) ||\n deg_freedom2 < 1 ||\n deg_freedom2 > Math.pow(10, 10)\n ) {\n return num\n }\n\n if (typeof probability !== 'number' || typeof deg_freedom1 !== 'number' || typeof deg_freedom2 !== 'number') {\n return value\n }\n\n return jStat.centralF.inv(1.0 - probability, deg_freedom1, deg_freedom2)\n};\n\n/**\n * Returns the result of an F-test.\n *\n * Category: Statistical\n *\n * @param {*} array1 The first array or range of data.\n * @param {*} array2 The second array or range of data.\n * @returns\n */\nF.TEST = (array1, array2) => {\n if (!array1 || !array2) {\n return na\n }\n\n if (!(array1 instanceof Array) || !(array2 instanceof Array)) {\n return na\n }\n\n if (array1.length < 2 || array2.length < 2) {\n return div0\n }\n\n const sumOfSquares = (values, x1) => {\n let sum = 0;\n\n for (let i = 0; i < values.length; i++) {\n sum += Math.pow(values[i] - x1, 2);\n }\n\n return sum\n };\n\n const x1 = SUM(array1) / array1.length;\n const x2 = SUM(array2) / array2.length;\n const sum1 = sumOfSquares(array1, x1) / (array1.length - 1);\n const sum2 = sumOfSquares(array2, x2) / (array2.length - 1);\n\n return sum1 / sum2\n};\n\n/**\n * Returns the Fisher transformation.\n *\n * Category: Statistical\n *\n * @param {*} x A numeric value for which you want the transformation.\n * @returns\n */\nfunction FISHER(x) {\n x = parseNumber(x);\n\n if (x instanceof Error) {\n return x\n }\n\n return Math.log((1 + x) / (1 - x)) / 2\n}\n\n/**\n * Returns the inverse of the Fisher transformation.\n *\n * Category: Statistical\n *\n * @param {*} y The value for which you want to perform the inverse of the transformation.\n * @returns\n */\nfunction FISHERINV(y) {\n y = parseNumber(y);\n\n if (y instanceof Error) {\n return y\n }\n\n const e2y = Math.exp(2 * y);\n\n return (e2y - 1) / (e2y + 1)\n}\n\n/**\n * Returns a value along a linear trend.\n *\n * Category: Statistical\n *\n * @param {*} x The data point for which you want to predict a value.\n * @param {*} known_ys The dependent array or range of data.\n * @param {*} known_xs The independent array or range of data.\n * @returns\n */\nfunction FORECAST(x, known_ys, known_xs) {\n x = parseNumber(x);\n known_ys = parseNumberArray(flatten(known_ys));\n known_xs = parseNumberArray(flatten(known_xs));\n\n if (anyIsError(x, known_ys, known_xs)) {\n return value\n }\n\n const xmean = jStat.mean(known_xs);\n const ymean = jStat.mean(known_ys);\n const n = known_xs.length;\n let num = 0;\n let den = 0;\n\n for (let i = 0; i < n; i++) {\n num += (known_xs[i] - xmean) * (known_ys[i] - ymean);\n den += Math.pow(known_xs[i] - xmean, 2);\n }\n\n const b = num / den;\n const a = ymean - b * xmean;\n\n return a + b * x\n}\n\n/**\n * Returns a frequency distribution as a vertical array.\n *\n * Category: Statistical\n *\n * @param {*} data_array An array of or reference to a set of values for which you want to count frequencies. If data_array contains no values, FREQUENCY returns an array of zeros.\n * @param {*} bins_array An array of or reference to intervals into which you want to group the values in data_array. If bins_array contains no values, FREQUENCY returns the number of elements in data_array.\n * @returns\n */\nfunction FREQUENCY(data_array, bins_array) {\n data_array = parseNumberArray(flatten(data_array));\n bins_array = parseNumberArray(flatten(bins_array));\n\n if (anyIsError(data_array, bins_array)) {\n return value\n }\n\n const n = data_array.length;\n const b = bins_array.length;\n const r = [];\n\n for (let i = 0; i <= b; i++) {\n r[i] = 0;\n\n for (let j = 0; j < n; j++) {\n if (i === 0) {\n if (data_array[j] <= bins_array[0]) {\n r[0] += 1;\n }\n } else if (i < b) {\n if (data_array[j] > bins_array[i - 1] && data_array[j] <= bins_array[i]) {\n r[i] += 1;\n }\n } else if (i === b) {\n if (data_array[j] > bins_array[b - 1]) {\n r[b] += 1;\n }\n }\n }\n }\n\n return r\n}\n\n/**\n * Returns the Gamma function value.\n *\n * Category: Statistical\n *\n * @param {*} number Returns a number.\n * @returns\n */\nfunction GAMMA(number) {\n number = parseNumber(number);\n\n if (number instanceof Error) {\n return number\n }\n\n if (number === 0) {\n return num\n }\n\n if (parseInt(number, 10) === number && number < 0) {\n return num\n }\n\n return jStat.gammafn(number)\n}\n\n/**\n * Returns the gamma distribution.\n *\n * Category: Statistical\n *\n * @param {*} x The value at which you want to evaluate the distribution.\n * @param {*} alpha A parameter to the distribution.\n * @param {*} beta A parameter to the distribution. If beta = 1, GAMMA.DIST returns the standard gamma distribution.\n * @param {*} cumulative A logical value that determines the form of the function. If cumulative is TRUE, GAMMA.DIST returns the cumulative distribution function; if FALSE, it returns the probability density function.\n * @returns\n */\nGAMMA.DIST = function (value$1, alpha, beta, cumulative) {\n if (arguments.length !== 4) {\n return na\n }\n\n if (value$1 < 0 || alpha <= 0 || beta <= 0) {\n return value\n }\n\n if (typeof value$1 !== 'number' || typeof alpha !== 'number' || typeof beta !== 'number') {\n return value\n }\n\n return cumulative ? jStat.gamma.cdf(value$1, alpha, beta, true) : jStat.gamma.pdf(value$1, alpha, beta, false)\n};\n\n/**\n * Returns the inverse of the gamma cumulative distribution.\n *\n * Category: Statistical\n *\n * @param {*} probability The probability associated with the gamma distribution.\n * @param {*} alpha A parameter to the distribution.\n * @param {*} beta A parameter to the distribution. If beta = 1, GAMMA.INV returns the standard gamma distribution.\n * @returns\n */\nGAMMA.INV = function (probability, alpha, beta) {\n if (arguments.length !== 3) {\n return na\n }\n\n if (probability < 0 || probability > 1 || alpha <= 0 || beta <= 0) {\n return num\n }\n\n if (typeof probability !== 'number' || typeof alpha !== 'number' || typeof beta !== 'number') {\n return value\n }\n\n return jStat.gamma.inv(probability, alpha, beta)\n};\n\n/**\n * Returns the natural logarithm of the gamma function, Γ(x).\n *\n * Category: Statistical\n *\n * @param {*} x The value for which you want to calculate GAMMALN.\n * @returns\n */\nfunction GAMMALN(x) {\n x = parseNumber(x);\n\n if (x instanceof Error) {\n return x\n }\n\n return jStat.gammaln(x)\n}\n\n/**\n * Returns the natural logarithm of the gamma function, Γ(x).\n *\n * Category: Statistical\n *\n * @param {*} x The value for which you want to calculate GAMMALN.PRECISE.\n * @returns\n */\nGAMMALN.PRECISE = function (x) {\n if (arguments.length !== 1) {\n return na\n }\n\n if (x <= 0) {\n return num\n }\n\n if (typeof x !== 'number') {\n return value\n }\n\n return jStat.gammaln(x)\n};\n\n/**\n * Returns 0.5 less than the standard normal cumulative distribution.\n *\n * Category: Statistical\n *\n * @param {*} z Returns a number.\n * @returns\n */\nfunction GAUSS(z) {\n z = parseNumber(z);\n\n if (z instanceof Error) {\n return z\n }\n\n return jStat.normal.cdf(z, 0, 1) - 0.5\n}\n\n/**\n * Returns the geometric mean.\n *\n * Category: Statistical\n *\n * @param {*} args number1, number2, ... Number1 is required, subsequent numbers are optional. 1 to 255 arguments for which you want to calculate the mean. You can also use a single array or a reference to an array instead of arguments separated by commas.\n * @returns\n */\nfunction GEOMEAN() {\n const args = parseNumberArray(flatten(arguments));\n\n if (args instanceof Error) {\n return args\n }\n\n return jStat.geomean(args)\n}\n\n/**\n * Returns values along an exponential trend.\n *\n * Category: Statistical\n *\n * @param {*} known_y The set of y-values you already know in the relationship y = b*m^x.\n - If the array known_y's is in a single column, then each column of known_x's is interpreted as a separate variable.\n - If the array known_y's is in a single row, then each row of known_x's is interpreted as a separate variable.\n - If any of the numbers in known_y's is 0 or negative, GROWTH returns the #NUM! error value.\n * @param {*} known_x Optional. An optional set of x-values that you may already know in the relationship y = b*m^x.\n - The array known_x's can include one or more sets of variables. If only one variable is used, known_y's and known_x's can be ranges of any shape, as long as they have equal dimensions. If more than one variable is used, known_y's must be a vector (that is, a range with a height of one row or a width of one column).\n - If known_x's is omitted, it is assumed to be the array {1,2,3,...} that is the same size as known_y's.\n * @param {*} new_x Optional. Are new x-values for which you want GROWTH to return corresponding y-values.\n - new_x's must include a column (or row) for each independent variable, just as known_x's does. So, if known_y's is in a single column, known_x's and new_x's must have the same number of columns. If known_y's is in a single row, known_x's and new_x's must have the same number of rows.\n - If new_x's is omitted, it is assumed to be the same as known_x's.\n - If both known_x's and new_x's are omitted, they are assumed to be the array {1,2,3,...} that is the same size as known_y's.\n * @param {*} use_const Optional. A logical value specifying whether to force the constant b to equal 1. If const is TRUE or omitted, b is calculated normally. If const is FALSE, b is set equal to 1 and the m-values are adjusted so that y = m^x.\n - If const is TRUE or omitted, b is calculated normally.\n - If const is FALSE, b is set equal to 1 and the m-values are adjusted so that y = m^x.\n * @returns\n */\nfunction GROWTH(known_y, known_x, new_x, use_const) {\n // Credits: Ilmari Karonen (http://stackoverflow.com/questions/14161990/how-to-implement-growth-function-in-javascript)\n known_y = parseNumberArray(known_y);\n\n if (known_y instanceof Error) {\n return known_y\n }\n\n // Default values for optional parameters:\n let i;\n\n if (known_x === undefined) {\n known_x = [];\n\n for (i = 1; i <= known_y.length; i++) {\n known_x.push(i);\n }\n }\n\n if (new_x === undefined) {\n new_x = [];\n\n for (i = 1; i <= known_y.length; i++) {\n new_x.push(i);\n }\n }\n\n known_x = parseNumberArray(known_x);\n new_x = parseNumberArray(new_x);\n\n if (anyIsError(known_x, new_x)) {\n return value\n }\n\n if (use_const === undefined) {\n use_const = true;\n }\n\n // Calculate sums over the data:\n const n = known_y.length;\n let avg_x = 0;\n let avg_y = 0;\n let avg_xy = 0;\n let avg_xx = 0;\n\n for (i = 0; i < n; i++) {\n const x = known_x[i];\n const y = Math.log(known_y[i]);\n avg_x += x;\n avg_y += y;\n avg_xy += x * y;\n avg_xx += x * x;\n }\n\n avg_x /= n;\n avg_y /= n;\n avg_xy /= n;\n avg_xx /= n;\n\n // Compute linear regression coefficients:\n let beta;\n let alpha;\n\n if (use_const) {\n beta = (avg_xy - avg_x * avg_y) / (avg_xx - avg_x * avg_x);\n alpha = avg_y - beta * avg_x;\n } else {\n beta = avg_xy / avg_xx;\n alpha = 0;\n }\n\n // Compute and return result array:\n const new_y = [];\n\n for (i = 0; i < new_x.length; i++) {\n new_y.push(Math.exp(alpha + beta * new_x[i]));\n }\n\n return new_y\n}\n\n/**\n * Returns the harmonic mean.\n *\n * Category: Statistical\n *\n * @param {*} args number1, number2, ... Number1 is required, subsequent numbers are optional. 1 to 255 arguments for which you want to calculate the mean. You can also use a single array or a reference to an array instead of arguments separated by commas.\n * @returns\n */\nfunction HARMEAN() {\n const range = parseNumberArray(flatten(arguments));\n\n if (range instanceof Error) {\n return range\n }\n\n const n = range.length;\n let den = 0;\n\n for (let i = 0; i < n; i++) {\n den += 1 / range[i];\n }\n\n return n / den\n}\n\nconst HYPGEOM = {};\n\n/**\n * Returns the hypergeometric distribution.\n *\n * Category: Statistical\n *\n * @param {*} sample_s The number of successes in the sample.\n * @param {*} number_sample The size of the sample.\n * @param {*} population_s The number of successes in the population.\n * @param {*} number_pop The population size.\n * @param {*} cumulative A logical value that determines the form of the function. If cumulative is TRUE, then HYPGEOM.DIST returns the cumulative distribution function; if FALSE, it returns the probability mass function.\n * @returns\n */\nHYPGEOM.DIST = (sample_s, number_sample, population_s, number_pop, cumulative) => {\n sample_s = parseNumber(sample_s);\n number_sample = parseNumber(number_sample);\n population_s = parseNumber(population_s);\n number_pop = parseNumber(number_pop);\n\n if (anyIsError(sample_s, number_sample, population_s, number_pop)) {\n return value\n }\n\n function pdf(x, n, M, N) {\n return (COMBIN(M, x) * COMBIN(N - M, n - x)) / COMBIN(N, n)\n }\n\n function cdf(x, n, M, N) {\n let result = 0;\n\n for (let i = 0; i <= x; i++) {\n result += pdf(i, n, M, N);\n }\n\n return result\n }\n\n return cumulative\n ? cdf(sample_s, number_sample, population_s, number_pop)\n : pdf(sample_s, number_sample, population_s, number_pop)\n};\n\n/**\n * Returns the intercept of the linear regression line.\n *\n * Category: Statistical\n *\n * @param {*} known_y The dependent set of observations or data.\n * @param {*} known_x The independent set of observations or data.\n * @returns\n */\nfunction INTERCEPT(known_y, known_x) {\n known_y = parseNumberArray(known_y);\n known_x = parseNumberArray(known_x);\n\n if (anyIsError(known_y, known_x)) {\n return value\n }\n\n if (known_y.length !== known_x.length) {\n return na\n }\n\n return FORECAST(0, known_y, known_x)\n}\n\n/**\n * Returns the kurtosis of a data set.\n *\n * Category: Statistical\n *\n * @param {*} args number1, number2, ... Number1 is required, subsequent numbers are optional. 1 to 255 arguments for which you want to calculate kurtosis. You can also use a single array or a reference to an array instead of arguments separated by commas.\n * @returns\n */\nfunction KURT() {\n const range = parseNumberArray(flatten(arguments));\n\n if (range instanceof Error) {\n return range\n }\n\n const mean = jStat.mean(range);\n const n = range.length;\n let sigma = 0;\n\n for (let i = 0; i < n; i++) {\n sigma += Math.pow(range[i] - mean, 4);\n }\n\n sigma = sigma / Math.pow(jStat.stdev(range, true), 4);\n\n return ((n * (n + 1)) / ((n - 1) * (n - 2) * (n - 3))) * sigma - (3 * (n - 1) * (n - 1)) / ((n - 2) * (n - 3))\n}\n\n/**\n * Returns the k-th largest value in a data set.\n *\n * Category: Statistical\n *\n * @param {*} array The array or range of data for which you want to determine the k-th largest value.\n * @param {*} k The position (from the largest) in the array or value range of data to return.\n * @returns\n */\nfunction LARGE(array, k) {\n array = parseNumberArray(flatten(array));\n k = parseNumber(k);\n\n if (anyIsError(array, k)) {\n return array\n }\n\n if (k < 0 || array.length < k) {\n return value\n }\n\n return array.sort((a, b) => b - a)[k - 1]\n}\n\n/**\n * Returns the parameters of a linear trend.\n *\n * Category: Statistical\n *\n * @param {*} known_y The set of y-values that you already know in the relationship y = mx + b.\n - If the range of known_y's is in a single column, each column of known_x's is interpreted as a separate variable.\n - If the range of known_y's is contained in a single row, each row of known_x's is interpreted as a separate variable.\n * @param {*} known_x Optional. A set of x-values that you may already know in the relationship y = mx + b.\n - The range of known_x's can include one or more sets of variables. If only one variable is used, known_y's and known_x's can be ranges of any shape, as long as they have equal dimensions. If more than one variable is used, known_y's must be a vector (that is, a range with a height of one row or a width of one column).\n - If known_x's is omitted, it is assumed to be the array {1,2,3,...} that is the same size as known_y's.\n * @returns\n */\nfunction LINEST(known_y, known_x) {\n known_y = parseNumberArray(flatten(known_y));\n known_x = parseNumberArray(flatten(known_x));\n\n if (anyIsError(known_y, known_x)) {\n return value\n }\n\n const ymean = jStat.mean(known_y);\n const xmean = jStat.mean(known_x);\n const n = known_x.length;\n let num = 0;\n let den = 0;\n\n for (let i = 0; i < n; i++) {\n num += (known_x[i] - xmean) * (known_y[i] - ymean);\n den += Math.pow(known_x[i] - xmean, 2);\n }\n\n const m = num / den;\n const b = ymean - m * xmean;\n\n return [m, b]\n}\n\n// According to Microsoft:\n// http://office.microsoft.com/en-us/starter-help/logest-function-HP010342665.aspx\n// LOGEST returns are based on the following linear model:\n// ln y = x1 ln m1 + ... + xn ln mn + ln b\n/**\n * Returns the parameters of an exponential trend.\n *\n * Category: Statistical\n *\n * @param {*} known_y The set of y-values you already know in the relationship y = b*m^x.\n - If the array known_y's is in a single column, then each column of known_x's is interpreted as a separate variable.\n - If the array known_y's is in a single row, then each row of known_x's is interpreted as a separate variable.\n * @param {*} known_x Optional. An optional set of x-values that you may already know in the relationship y = b*m^x.\n - The array known_x's can include one or more sets of variables. If only one variable is used, known_y's and known_x's can be ranges of any shape, as long as they have equal dimensions. If more than one variable is used, known_y's must be a range of values with a height of one row or a width of one column (which is also known as a vector).\n - If known_x's is omitted, it is assumed to be the array {1,2,3,...} that is the same size as known_y's.\n * @returns\n */\nfunction LOGEST(known_y, known_x) {\n known_y = parseNumberArray(flatten(known_y));\n known_x = parseNumberArray(flatten(known_x));\n\n if (anyIsError(known_y, known_x)) {\n return value\n }\n\n if (known_y.length !== known_x.length) {\n return value\n }\n\n for (let i = 0; i < known_y.length; i++) {\n known_y[i] = Math.log(known_y[i]);\n }\n\n const result = LINEST(known_y, known_x);\n result[0] = Math.round(Math.exp(result[0]) * 1000000) / 1000000;\n result[1] = Math.round(Math.exp(result[1]) * 1000000) / 1000000;\n\n return result\n}\n\nconst LOGNORM = {};\n\n/**\n * Returns the cumulative lognormal distribution.\n *\n * Category: Statistical\n *\n * @param {*} x The value at which to evaluate the function.\n * @param {*} mean The mean of ln(x).\n * @param {*} standard_dev The standard deviation of ln(x).\n * @param {*} cumulative A logical value that determines the form of the function. If cumulative is TRUE, LOGNORM.DIST returns the cumulative distribution function; if FALSE, it returns the probability density function.\n * @returns\n */\nLOGNORM.DIST = (x, mean, standard_dev, cumulative) => {\n x = parseNumber(x);\n mean = parseNumber(mean);\n standard_dev = parseNumber(standard_dev);\n\n if (anyIsError(x, mean, standard_dev)) {\n return value\n }\n\n return cumulative ? jStat.lognormal.cdf(x, mean, standard_dev) : jStat.lognormal.pdf(x, mean, standard_dev)\n};\n\n/**\n * Returns the inverse of the lognormal cumulative distribution.\n *\n * Category: Statistical\n *\n * @param {*} probability A probability associated with the lognormal distribution.\n * @param {*} mean The mean of ln(x).\n * @param {*} standard_dev The standard deviation of ln(x).\n * @returns\n */\nLOGNORM.INV = (probability, mean, standard_dev) => {\n probability = parseNumber(probability);\n mean = parseNumber(mean);\n standard_dev = parseNumber(standard_dev);\n\n if (anyIsError(probability, mean, standard_dev)) {\n return value\n }\n\n return jStat.lognormal.inv(probability, mean, standard_dev)\n};\n\n/**\n * Returns the maximum value in a list of arguments.\n *\n * Category: Statistical\n *\n * @param {*} args number1, number2, ... Number1 is required, subsequent numbers are optional. 1 to 255 numbers for which you want to find the maximum value.\n * @returns\n */\nfunction MAX() {\n const flatArguments = flatten(arguments);\n const someError = anyError.apply(undefined, flatArguments);\n\n if (someError) {\n return someError\n }\n\n const range = numbers(flatArguments);\n\n return range.length === 0 ? 0 : Math.max.apply(Math, range)\n}\n\n/**\n * Returns the maximum value in a list of arguments, including numbers, text, and logical values.\n *\n * Category: Statistical\n *\n * @param {*} args value1, value2,... Number arguments 2 to 255 for which you want to find the largest value.\n * @returns\n */\nfunction MAXA() {\n const flatArguments = flatten(arguments);\n const someError = anyError.apply(undefined, flatArguments);\n\n if (someError) {\n return someError\n }\n\n let range = arrayValuesToNumbers(flatArguments);\n range = range.map((value) => (value === undefined || value === null ? 0 : value));\n\n return range.length === 0 ? 0 : Math.max.apply(Math, range)\n}\n\n/**\n * Returns the median of the given numbers.\n *\n * Category: Statistical\n *\n * @param {*} args number1, number2, ... Number1 is required, subsequent numbers are optional. 1 to 255 numbers for which you want the median.\n * @returns\n */\nfunction MEDIAN() {\n const flatArguments = flatten(arguments);\n const someError = anyError.apply(undefined, flatArguments);\n\n if (someError) {\n return someError\n }\n\n const range = arrayValuesToNumbers(flatArguments);\n let result = jStat.median(range);\n\n if (isNaN(result)) {\n result = num;\n }\n\n return result\n}\n\n/**\n * Returns the minimum value in a list of arguments.\n *\n * Category: Statistical\n *\n * @param {*} args number1, number2, ... Number1 is optional, subsequent numbers are optional. 1 to 255 numbers for which you want to find the minimum value.\n * @returns\n */\nfunction MIN() {\n const flatArguments = flatten(arguments);\n const someError = anyError.apply(undefined, flatArguments);\n\n if (someError) {\n return someError\n }\n\n const range = numbers(flatArguments);\n\n return range.length === 0 ? 0 : Math.min.apply(Math, range)\n}\n\n/**\n * Returns the smallest value in a list of arguments, including numbers, text, and logical values.\n *\n * Category: Statistical\n *\n * @param {*} args value1, value2, ... Value1 is required, subsequent values are optional. 1 to 255 values for which you want to find the smallest value.\n * @returns\n */\nfunction MINA() {\n const flatArguments = flatten(arguments);\n const someError = anyError.apply(undefined, flatArguments);\n\n if (someError) {\n return someError\n }\n\n let range = arrayValuesToNumbers(flatArguments);\n range = range.map((value) => (value === undefined || value === null ? 0 : value));\n\n return range.length === 0 ? 0 : Math.min.apply(Math, range)\n}\n\nconst MODE = {};\n\n/**\n * Returns a vertical array of the most frequently occurring, or repetitive values in an array or range of data.\n *\n * Category: Statistical\n *\n * @param {*} args number1, number2, ... Number arguments 2 to 254 for which you want to calculate the mode. You can also use a single array or a reference to an array instead of arguments separated by commas.\n * @returns\n */\nMODE.MULT = function () {\n // Credits: Roönaän\n const range = parseNumberArray(flatten(arguments));\n\n if (range instanceof Error) {\n return range\n }\n\n const n = range.length;\n const count = {};\n let maxItems = [];\n let max = 0;\n let currentItem;\n\n for (let i = 0; i < n; i++) {\n currentItem = range[i];\n count[currentItem] = count[currentItem] ? count[currentItem] + 1 : 1;\n\n if (count[currentItem] > max) {\n max = count[currentItem];\n maxItems = [];\n }\n\n if (count[currentItem] === max) {\n maxItems[maxItems.length] = currentItem;\n }\n }\n\n return maxItems\n};\n\n/**\n * Returns the most common value in a data set.\n *\n * Category: Statistical\n *\n * @param {*} args number1, number2, ... Arguments 2 to 254 for which you want to calculate the mode. You can also use a single array or a reference to an array instead of arguments separated by commas.\n * @returns\n */\nMODE.SNGL = function () {\n const range = parseNumberArray(flatten(arguments));\n\n if (range instanceof Error) {\n return range\n }\n\n return MODE.MULT(range).sort((a, b) => a - b)[0]\n};\n\nconst NEGBINOM = {};\n\n/**\n * Returns the negative binomial distribution.\n *\n * Category: Statistical\n *\n * @param {*} number_f The number of failures.\n * @param {*} number_s The threshold number of successes.\n * @param {*} probability_s The probability of a success.\n * @param {*} cumulative A logical value that determines the form of the function. If cumulative is TRUE, NEGBINOM.DIST returns the cumulative distribution function; if FALSE, it returns the probability density function.\n * @returns\n */\nNEGBINOM.DIST = (number_f, number_s, probability_s, cumulative) => {\n number_f = parseNumber(number_f);\n number_s = parseNumber(number_s);\n probability_s = parseNumber(probability_s);\n\n if (anyIsError(number_f, number_s, probability_s)) {\n return value\n }\n\n return cumulative\n ? jStat.negbin.cdf(number_f, number_s, probability_s)\n : jStat.negbin.pdf(number_f, number_s, probability_s)\n};\n\nconst NORM = {};\n\n/**\n * Returns the normal cumulative distribution.\n *\n * Category: Statistical\n *\n * @param {*} x The value for which you want the distribution.\n * @param {*} mean The arithmetic mean of the distribution.\n * @param {*} standard_dev The standard deviation of the distribution.\n * @param {*} cumulative A logical value that determines the form of the function. If cumulative is TRUE, NORM.DIST returns the cumulative distribution function; if FALSE, it returns the probability density function.\n * @returns\n */\nNORM.DIST = (x, mean, standard_dev, cumulative) => {\n x = parseNumber(x);\n mean = parseNumber(mean);\n standard_dev = parseNumber(standard_dev);\n\n if (anyIsError(x, mean, standard_dev)) {\n return value\n }\n\n if (standard_dev <= 0) {\n return num\n }\n\n // Return normal distribution computed by jStat [http://jstat.org]\n return cumulative ? jStat.normal.cdf(x, mean, standard_dev) : jStat.normal.pdf(x, mean, standard_dev)\n};\n\n/**\n * Returns the inverse of the normal cumulative distribution.\n *\n * Category: Statistical\n *\n * @param {*} probability A probability corresponding to the normal distribution.\n * @param {*} mean The arithmetic mean of the distribution.\n * @param {*} standard_dev The standard deviation of the distribution.\n * @returns\n */\nNORM.INV = (probability, mean, standard_dev) => {\n probability = parseNumber(probability);\n mean = parseNumber(mean);\n standard_dev = parseNumber(standard_dev);\n\n if (anyIsError(probability, mean, standard_dev)) {\n return value\n }\n\n return jStat.normal.inv(probability, mean, standard_dev)\n};\n\nNORM.S = {};\n\n/**\n * Returns the standard normal cumulative distribution.\n *\n * Category: Statistical\n *\n * @param {*} z The value for which you want the distribution.\n * @param {*} cumulative Cumulative is a logical value that determines the form of the function. If cumulative is TRUE, NORMS.DIST returns the cumulative distribution function; if FALSE, it returns the probability mass function.\n * @returns\n */\nNORM.S.DIST = (z, cumulative) => {\n z = parseNumber(z);\n\n if (z instanceof Error) {\n return value\n }\n\n return cumulative ? jStat.normal.cdf(z, 0, 1) : jStat.normal.pdf(z, 0, 1)\n};\n\n/**\n * Returns the inverse of the standard normal cumulative distribution.\n *\n * Category: Statistical\n *\n * @param {*} probability A probability corresponding to the normal distribution.\n * @returns\n */\nNORM.S.INV = (probability) => {\n probability = parseNumber(probability);\n\n if (probability instanceof Error) {\n return value\n }\n\n return jStat.normal.inv(probability, 0, 1)\n};\n\n/**\n * Returns the Pearson product moment correlation coefficient.\n *\n * Category: Statistical\n *\n * @param {*} array1 A set of independent values.\n * @param {*} array2 A set of dependent values.\n * @returns\n */\nfunction PEARSON(array1, array2) {\n array2 = parseNumberArray(flatten(array2));\n array1 = parseNumberArray(flatten(array1));\n\n if (anyIsError(array2, array1)) {\n return value\n }\n\n const xmean = jStat.mean(array1);\n const ymean = jStat.mean(array2);\n const n = array1.length;\n let num = 0;\n let den1 = 0;\n let den2 = 0;\n\n for (let i = 0; i < n; i++) {\n num += (array1[i] - xmean) * (array2[i] - ymean);\n den1 += Math.pow(array1[i] - xmean, 2);\n den2 += Math.pow(array2[i] - ymean, 2);\n }\n\n return num / Math.sqrt(den1 * den2)\n}\n\nconst PERCENTILE = {};\n\n/**\n * Returns the k-th percentile of values in a range, where k is in the range 0..1, exclusive.\n *\n * Category: Statistical\n *\n * @returns\n */\nPERCENTILE.EXC = (array, k) => {\n array = parseNumberArray(flatten(array));\n k = parseNumber(k);\n\n if (anyIsError(array, k)) {\n return value\n }\n\n array = array.sort((a, b) => a - b);\n const n = array.length;\n\n if (k < 1 / (n + 1) || k > 1 - 1 / (n + 1)) {\n return num\n }\n\n const l = k * (n + 1) - 1;\n const fl = Math.floor(l);\n\n return cleanFloat(l === fl ? array[l] : array[fl] + (l - fl) * (array[fl + 1] - array[fl]))\n};\n\n/**\n * Returns the k-th percentile of values in a range.\n *\n * Category: Statistical\n *\n * @param {*} array The array or range of data that defines relative standing.\n * @param {*} k The percentile value in the range 0..1, inclusive.\n * @returns\n */\nPERCENTILE.INC = (array, k) => {\n array = parseNumberArray(flatten(array));\n k = parseNumber(k);\n\n if (anyIsError(array, k)) {\n return value\n }\n\n array = array.sort((a, b) => a - b);\n const n = array.length;\n const l = k * (n - 1);\n const fl = Math.floor(l);\n\n return cleanFloat(l === fl ? array[l] : array[fl] + (l - fl) * (array[fl + 1] - array[fl]))\n};\n\nconst PERCENTRANK = {};\n\n/**\n * Returns the rank of a value in a data set as a percentage (0..1, exclusive) of the data set.\n *\n * Category: Statistical\n *\n * @param {*} array The array or range of data with numeric values that defines relative standing\n * @param {*} x The value for which you want to know the rank.\n * @param {*} significance Optional. A value that identifies the number of significant digits for the returned percentage value. If omitted, PERCENTRANK.EXC uses three digits (0.xxx).\n * @returns\n */\nPERCENTRANK.EXC = (array, x, significance) => {\n significance = significance === undefined ? 3 : significance;\n array = parseNumberArray(flatten(array));\n x = parseNumber(x);\n significance = parseNumber(significance);\n\n if (anyIsError(array, x, significance)) {\n return value\n }\n\n array = array.sort((a, b) => a - b);\n const uniques = UNIQUE.apply(null, array);\n const n = array.length;\n const m = uniques.length;\n const power = Math.pow(10, significance);\n let result = 0;\n let match = false;\n let i = 0;\n\n while (!match && i < m) {\n if (x === uniques[i]) {\n result = (array.indexOf(uniques[i]) + 1) / (n + 1);\n match = true;\n } else if (x >= uniques[i] && (x < uniques[i + 1] || i === m - 1)) {\n result = (array.indexOf(uniques[i]) + 1 + (x - uniques[i]) / (uniques[i + 1] - uniques[i])) / (n + 1);\n match = true;\n }\n\n i++;\n }\n\n return Math.floor(result * power) / power\n};\n\n/**\n * Returns the percentage rank of a value in a data set.\n *\n * Category: Statistical\n *\n * @param {*} array The array or range of data with numeric values that defines relative standing.\n * @param {*} x The value for which you want to know the rank.\n * @param {*} significance Optional. A value that identifies the number of significant digits for the returned percentage value. If omitted, PERCENTRANK.INC uses three digits (0.xxx).\n * @returns\n */\nPERCENTRANK.INC = (array, x, significance) => {\n significance = significance === undefined ? 3 : significance;\n array = parseNumberArray(flatten(array));\n x = parseNumber(x);\n significance = parseNumber(significance);\n\n if (anyIsError(array, x, significance)) {\n return value\n }\n\n array = array.sort((a, b) => a - b);\n const uniques = UNIQUE.apply(null, array);\n const n = array.length;\n const m = uniques.length;\n const power = Math.pow(10, significance);\n let result = 0;\n let match = false;\n let i = 0;\n\n while (!match && i < m) {\n if (x === uniques[i]) {\n result = array.indexOf(uniques[i]) / (n - 1);\n match = true;\n } else if (x >= uniques[i] && (x < uniques[i + 1] || i === m - 1)) {\n result = (array.indexOf(uniques[i]) + (x - uniques[i]) / (uniques[i + 1] - uniques[i])) / (n - 1);\n match = true;\n }\n\n i++;\n }\n\n return Math.floor(result * power) / power\n};\n\n/**\n * Returns the number of permutations for a given number of objects.\n *\n * Category: Statistical\n *\n * @param {*} number An integer that describes the number of objects.\n * @param {*} number_chosen An integer that describes the number of objects in each permutation.\n * @returns\n */\nfunction PERMUT(number, number_chosen) {\n number = parseNumber(number);\n number_chosen = parseNumber(number_chosen);\n\n if (anyIsError(number, number_chosen)) {\n return value\n }\n\n return FACT(number) / FACT(number - number_chosen)\n}\n\n/**\n * Returns the number of permutations for a given number of objects (with repetitions) that can be selected from the total objects.\n *\n * Category: Statistical\n *\n * @param {*} number An integer that describes the total number of objects.\n * @param {*} number_chosen An integer that describes the number of objects in each permutation.\n * @returns\n */\nfunction PERMUTATIONA(number, number_chosen) {\n number = parseNumber(number);\n number_chosen = parseNumber(number_chosen);\n\n if (anyIsError(number, number_chosen)) {\n return value\n }\n\n return Math.pow(number, number_chosen)\n}\n\n/**\n * Returns the value of the density function for a standard normal distribution.\n *\n * Category: Statistical\n *\n * @param {*} x X is the number for which you want the density of the standard normal distribution.\n * @returns\n */\nfunction PHI(x) {\n x = parseNumber(x);\n\n if (x instanceof Error) {\n return value\n }\n\n return Math.exp(-0.5 * x * x) / SQRT2PI\n}\n\nconst POISSON = {};\n\n/**\n * Returns the Poisson distribution.\n *\n * Category: Statistical\n *\n * @param {*} x The number of events.\n * @param {*} mean The expected numeric value.\n * @param {*} cumulative A logical value that determines the form of the probability distribution returned. If cumulative is TRUE, POISSON.DIST returns the cumulative Poisson probability that the number of random events occurring will be between zero and x inclusive; if FALSE, it returns the Poisson probability mass function that the number of events occurring will be exactly x.\n * @returns\n */\nPOISSON.DIST = (x, mean, cumulative) => {\n x = parseNumber(x);\n mean = parseNumber(mean);\n\n if (anyIsError(x, mean)) {\n return value\n }\n\n return cumulative ? jStat.poisson.cdf(x, mean) : jStat.poisson.pdf(x, mean)\n};\n\n/**\n * Returns the probability that values in a range are between two limits.\n *\n * Category: Statistical\n *\n * @param {*} x_range The range of numeric values of x with which there are associated probabilities.\n * @param {*} prob_range A set of probabilities associated with values in x_range.\n * @param {*} lower_limit Optional. The lower bound on the value for which you want a probability.\n * @param {*} upper_limit Optional. The optional upper bound on the value for which you want a probability.\n * @returns\n */\nfunction PROB(x_range, prob_range, lower_limit, upper_limit) {\n if (lower_limit === undefined) {\n return 0\n }\n\n upper_limit = upper_limit === undefined ? lower_limit : upper_limit;\n\n x_range = parseNumberArray(flatten(x_range));\n prob_range = parseNumberArray(flatten(prob_range));\n lower_limit = parseNumber(lower_limit);\n upper_limit = parseNumber(upper_limit);\n\n if (anyIsError(x_range, prob_range, lower_limit, upper_limit)) {\n return value\n }\n\n if (lower_limit === upper_limit) {\n return x_range.indexOf(lower_limit) >= 0 ? prob_range[x_range.indexOf(lower_limit)] : 0\n }\n\n const sorted = x_range.sort((a, b) => a - b);\n const n = sorted.length;\n let result = 0;\n\n for (let i = 0; i < n; i++) {\n if (sorted[i] >= lower_limit && sorted[i] <= upper_limit) {\n result += prob_range[x_range.indexOf(sorted[i])];\n }\n }\n\n return result\n}\n\nconst QUARTILE = {};\n\n/**\n * Returns the quartile of the data set, based on percentile values from 0..1, exclusive.\n *\n * Category: Statistical\n *\n * @param {*} array The array or value range of numeric values for which you want the quartile value.\n * @param {*} quart Indicates which value to return.\n * @returns\n */\nQUARTILE.EXC = (range, quart) => {\n range = parseNumberArray(flatten(range));\n quart = parseNumber(quart);\n\n if (anyIsError(range, quart)) {\n return value\n }\n\n switch (quart) {\n case 1:\n return PERCENTILE.EXC(range, 0.25)\n case 2:\n return PERCENTILE.EXC(range, 0.5)\n case 3:\n return PERCENTILE.EXC(range, 0.75)\n default:\n return num\n }\n};\n\n/**\n * Returns the quartile of a data set.\n *\n * Category: Statistical\n *\n * @param {*} array The array or value range of numeric values for which you want the quartile value.\n * @param {*} quart Indicates which value to return.\n * @returns\n */\nQUARTILE.INC = (range, quart) => {\n range = parseNumberArray(flatten(range));\n quart = parseNumber(quart);\n\n if (anyIsError(range, quart)) {\n return value\n }\n\n switch (quart) {\n case 1:\n return PERCENTILE.INC(range, 0.25)\n case 2:\n return PERCENTILE.INC(range, 0.5)\n case 3:\n return PERCENTILE.INC(range, 0.75)\n default:\n return num\n }\n};\n\nconst RANK = {};\n\n/**\n * Returns the rank of a number in a list of numbers.\n *\n * Category: Statistical\n *\n * @param {*} number The number whose rank you want to find.\n * @param {*} ref An array of, or a reference to, a list of numbers. Nonnumeric values in Ref are ignored.\n * @param {*} order Optional. A number specifying how to rank number.\n * @returns\n */\nRANK.AVG = (number, ref, order) => {\n number = parseNumber(number);\n ref = parseNumberArray(flatten(ref));\n\n if (anyIsError(number, ref)) {\n return value\n }\n\n ref = flatten(ref);\n order = order || false;\n const sort = order ? (a, b) => a - b : (a, b) => b - a;\n ref = ref.sort(sort);\n\n const length = ref.length;\n let count = 0;\n\n for (let i = 0; i < length; i++) {\n if (ref[i] === number) {\n count++;\n }\n }\n\n return count > 1 ? (2 * ref.indexOf(number) + count + 1) / 2 : ref.indexOf(number) + 1\n};\n\n/**\n * Returns the rank of a number in a list of numbers.\n *\n * Category: Statistical\n *\n * @param {*} number The number whose rank you want to find.\n * @param {*} ref An array of, or a reference to, a list of numbers. Non-numeric values in Ref are ignored.\n * @param {*} order Optional. A number specifying how to rank number.\n * @returns\n */\nRANK.EQ = (number, ref, order) => {\n number = parseNumber(number);\n ref = parseNumberArray(flatten(ref));\n\n if (anyIsError(number, ref)) {\n return value\n }\n\n order = order || false;\n const sort = order ? (a, b) => a - b : (a, b) => b - a;\n ref = ref.sort(sort);\n\n return ref.indexOf(number) + 1\n};\n\n/**\n * Returns the row number of a reference.\n *\n * Category: Lookup and reference\n *\n * @param {*} reference the value or range of values for which you want the row number.\n * @param {*} index\n * @returns\n */\nfunction ROW(reference, index) {\n if (arguments.length !== 2) {\n return na\n }\n\n if (index < 0) {\n return num\n }\n\n if (!(reference instanceof Array) || typeof index !== 'number') {\n return value\n }\n\n if (reference.length === 0) {\n return undefined\n }\n\n return jStat.row(reference, index)\n}\n\n/**\n * Returns the square of the Pearson product moment correlation coefficient.\n *\n * Category: Statistical\n *\n * @param {*} known_y An array or range of data points.\n * @param {*} known_x An array or range of data points.\n * @returns\n */\nfunction RSQ(known_y, known_x) {\n // no need to flatten here, PEARSON will take care of that\n known_y = parseNumberArray(flatten(known_y));\n known_x = parseNumberArray(flatten(known_x));\n\n if (anyIsError(known_y, known_x)) {\n return value\n }\n\n return Math.pow(PEARSON(known_y, known_x), 2)\n}\n\n/**\n * Returns the skewness of a distribution.\n *\n * Category: Statistical\n *\n * @param {*} args number1, number2, ... Number1 is required, subsequent numbers are optional. 1 to 255 arguments for which you want to calculate skewness. You can also use a single array or a reference to an array instead of arguments separated by commas.\n * @returns\n */\nfunction SKEW() {\n const range = parseNumberArray(flatten(arguments));\n\n if (range instanceof Error) {\n return range\n }\n\n const mean = jStat.mean(range);\n const n = range.length;\n let sigma = 0;\n\n for (let i = 0; i < n; i++) {\n sigma += Math.pow(range[i] - mean, 3);\n }\n\n return (n * sigma) / ((n - 1) * (n - 2) * Math.pow(jStat.stdev(range, true), 3))\n}\n\n/**\n * Returns the skewness of a distribution based on a population.\n *\n * Category: Statistical\n *\n * @returns\n */\nSKEW.P = function () {\n const range = parseNumberArray(flatten(arguments));\n\n if (range instanceof Error) {\n return range\n }\n\n const mean = jStat.mean(range);\n const n = range.length;\n let m2 = 0;\n let m3 = 0;\n\n for (let i = 0; i < n; i++) {\n m3 += Math.pow(range[i] - mean, 3);\n m2 += Math.pow(range[i] - mean, 2);\n }\n\n m3 = m3 / n;\n m2 = m2 / n;\n\n return m3 / Math.pow(m2, 3 / 2)\n};\n\n/**\n * Returns the slope of the linear regression line.\n *\n * Category: Statistical\n *\n * @param {*} known_y An array or value range of numeric dependent data points.\n * @param {*} known_x The set of independent data points.\n * @returns\n */\nfunction SLOPE(known_y, known_x) {\n known_y = parseNumberArray(flatten(known_y));\n known_x = parseNumberArray(flatten(known_x));\n\n if (anyIsError(known_y, known_x)) {\n return value\n }\n\n const xmean = jStat.mean(known_x);\n const ymean = jStat.mean(known_y);\n const n = known_x.length;\n let num = 0;\n let den = 0;\n\n for (let i = 0; i < n; i++) {\n num += (known_x[i] - xmean) * (known_y[i] - ymean);\n den += Math.pow(known_x[i] - xmean, 2);\n }\n\n return num / den\n}\n\n/**\n * Returns the k-th smallest value in a data set.\n *\n * Category: Statistical\n *\n * @param {*} array An array or range of numerical data for which you want to determine the k-th smallest value.\n * @param {*} k The position (from the smallest) in the array or range of data to return.\n * @returns\n */\nfunction SMALL(array, k) {\n array = parseNumberArray(flatten(array));\n k = parseNumber(k);\n\n if (anyIsError(array, k)) {\n return array\n }\n\n return array.sort((a, b) => a - b)[k - 1]\n}\n\n/**\n * Returns a normalized value.\n *\n * Category: Statistical\n *\n * @param {*} x The value you want to normalize.\n * @param {*} mean The arithmetic mean of the distribution.\n * @param {*} standard_dev The standard deviation of the distribution.\n * @returns\n */\nfunction STANDARDIZE(x, mean, standard_dev) {\n x = parseNumber(x);\n mean = parseNumber(mean);\n standard_dev = parseNumber(standard_dev);\n\n if (anyIsError(x, mean, standard_dev)) {\n return value\n }\n\n return (x - mean) / standard_dev\n}\n\nconst STDEV = {};\n\n/**\n * Calculates standard deviation based on the entire population.\n *\n * Category: Statistical\n *\n * @param {*} args number1, number2, ... Number arguments 2 to 254 corresponding to a population. You can also use a single array or a reference to an array instead of arguments separated by commas.\n * @returns\n */\nSTDEV.P = function () {\n const v = VAR.P.apply(this, arguments);\n let result = Math.sqrt(v);\n\n if (isNaN(result)) {\n result = num;\n }\n\n return result\n};\n\n/**\n * Estimates standard deviation based on a sample.\n *\n * Category: Statistical\n *\n * @param {*} args number1, number2, ... Number arguments 2 to 254 corresponding to a sample of a population. You can also use a single array or a reference to an array instead of arguments separated by commas.\n * @returns\n */\nSTDEV.S = function () {\n const v = VAR.S.apply(this, arguments);\n const result = Math.sqrt(v);\n\n return result\n};\n\n/**\n * Estimates standard deviation based on a sample, including numbers, text, and logical values.\n *\n * Category: Statistical\n *\n * @param {*} args value1, value2, ... Value1 is required, subsequent values are optional. 1 to 255 values corresponding to a sample of a population. You can also use a single array or a reference to an array instead of arguments separated by commas.\n * @returns\n */\nfunction STDEVA() {\n const v = VARA.apply(this, arguments);\n const result = Math.sqrt(v);\n\n return result\n}\n\n/**\n * Calculates standard deviation based on the entire population, including numbers, text, and logical values.\n *\n * Category: Statistical\n *\n * @param {*} args value1, value2, ... Value1 is required, subsequent values are optional. 1 to 255 values corresponding to a population. You can also use a single array or a reference to an array instead of arguments separated by commas.\n * @returns\n */\nfunction STDEVPA() {\n const v = VARPA.apply(this, arguments);\n let result = Math.sqrt(v);\n\n if (isNaN(result)) {\n result = num;\n }\n\n return result\n}\n\n/**\n * Returns the standard error of the predicted y-value for each x in the regression.\n *\n * Category: Statistical\n *\n * @param {*} known_y An array or range of dependent data points.\n * @param {*} known_x An array or range of independent data points.\n * @returns\n */\nfunction STEYX(known_y, known_x) {\n known_y = parseNumberArray(flatten(known_y));\n known_x = parseNumberArray(flatten(known_x));\n\n if (anyIsError(known_y, known_x)) {\n return value\n }\n\n const xmean = jStat.mean(known_x);\n const ymean = jStat.mean(known_y);\n const n = known_x.length;\n let lft = 0;\n let num = 0;\n let den = 0;\n\n for (let i = 0; i < n; i++) {\n lft += Math.pow(known_y[i] - ymean, 2);\n num += (known_x[i] - xmean) * (known_y[i] - ymean);\n den += Math.pow(known_x[i] - xmean, 2);\n }\n\n return Math.sqrt((lft - (num * num) / den) / (n - 2))\n}\n\nconst T$1 = {};\n\n/**\n * Returns the Percentage Points (probability) for the Student t-distribution.\n *\n * Category: Statistical\n *\n * @param {*} x The numeric value at which to evaluate the distribution\n * @param {*} deg_freedom An integer indicating the number of degrees of freedom.\n * @param {*} cumulative A logical value that determines the form of the function. If cumulative is TRUE, T.DIST returns the cumulative distribution function; if FALSE, it returns the probability density function.\n * @returns\n */\nT$1.DIST = (x, deg_freedom, cumulative) => {\n if (cumulative !== 1 && cumulative !== 2) {\n return num\n }\n\n return cumulative === 1 ? T$1.DIST.RT(x, deg_freedom) : T$1.DIST['2T'](x, deg_freedom)\n};\n\n/**\n * Returns the Percentage Points (probability) for the Student t-distribution\n *\n * Category: Statistical\n *\n * @param {*} x The numeric value at which to evaluate the distribution.\n * @param {*} deg_freedom An integer indicating the number of degrees of freedom.\n * @returns\n */\nT$1.DIST['2T'] = function (x, deg_freedom) {\n if (arguments.length !== 2) {\n return na\n }\n\n if (x < 0 || deg_freedom < 1) {\n return num\n }\n\n if (typeof x !== 'number' || typeof deg_freedom !== 'number') {\n return value\n }\n\n return (1 - jStat.studentt.cdf(x, deg_freedom)) * 2\n};\n\n/**\n * Returns the Student's t-distribution.\n *\n * Category: Statistical\n *\n * @param {*} x The numeric value at which to evaluate the distribution.\n * @param {*} deg_freedom An integer indicating the number of degrees of freedom.\n * @returns\n */\nT$1.DIST.RT = function (x, deg_freedom) {\n if (arguments.length !== 2) {\n return na\n }\n\n if (x < 0 || deg_freedom < 1) {\n return num\n }\n\n if (typeof x !== 'number' || typeof deg_freedom !== 'number') {\n return value\n }\n\n return 1 - jStat.studentt.cdf(x, deg_freedom)\n};\n\n/**\n * Returns the t-value of the Student's t-distribution as a function of the probability and the degrees of freedom.\n *\n * Category: Statistical\n *\n * @param {*} probability The probability associated with the Student's t-distribution.\n * @param {*} deg_freedom The number of degrees of freedom with which to characterize the distribution.\n * @returns\n */\nT$1.INV = (probability, deg_freedom) => {\n probability = parseNumber(probability);\n deg_freedom = parseNumber(deg_freedom);\n\n if (anyIsError(probability, deg_freedom)) {\n return value\n }\n\n return jStat.studentt.inv(probability, deg_freedom)\n};\n\n/**\n * Returns the inverse of the Student's t-distribution\n *\n * Category: Statistical\n *\n * @param {*} probability The probability associated with the Student's t-distribution.\n * @param {*} deg_freedom The number of degrees of freedom with which to characterize the distribution.\n * @returns\n */\nT$1.INV['2T'] = (probability, deg_freedom) => {\n probability = parseNumber(probability);\n deg_freedom = parseNumber(deg_freedom);\n\n if (probability <= 0 || probability > 1 || deg_freedom < 1) {\n return num\n }\n\n if (anyIsError(probability, deg_freedom)) {\n return value\n }\n\n return Math.abs(jStat.studentt.inv(probability / 2, deg_freedom))\n};\n\n// The algorithm can be found here:\n// http://www.chem.uoa.gr/applets/AppletTtest/Appl_Ttest2.html\n/**\n * Returns the probability associated with a Student's t-test.\n *\n * Category: Statistical\n *\n * @param {*} array1 The first data set.\n * @param {*} array2 The second data set.\n * @returns\n */\nT$1.TEST = (array1, array2) => {\n array1 = parseNumberArray(flatten(array1));\n array2 = parseNumberArray(flatten(array2));\n\n if (anyIsError(array1, array2)) {\n return value\n }\n\n const mean_x = jStat.mean(array1);\n const mean_y = jStat.mean(array2);\n let s_x = 0;\n let s_y = 0;\n let i;\n\n for (i = 0; i < array1.length; i++) {\n s_x += Math.pow(array1[i] - mean_x, 2);\n }\n\n for (i = 0; i < array2.length; i++) {\n s_y += Math.pow(array2[i] - mean_y, 2);\n }\n\n s_x = s_x / (array1.length - 1);\n s_y = s_y / (array2.length - 1);\n\n const t = Math.abs(mean_x - mean_y) / Math.sqrt(s_x / array1.length + s_y / array2.length);\n\n return T$1.DIST['2T'](t, array1.length + array2.length - 2)\n};\n\n/**\n * Returns values along a linear trend.\n *\n * Category: Statistical\n *\n * @param {*} known_ys The set of y-values you already know in the relationship y = mx + b\n * @param {*} known_xs An optional set of x-values that you may already know in the relationship y = mx + b\n * @param {*} new_xs Optional. New x-values for which you want TREND to return corresponding y-values.\n * @returns\n */\nfunction TREND(known_ys, known_xs, new_xs) {\n known_ys = parseNumberArray(flatten(known_ys));\n known_xs = parseNumberArray(flatten(known_xs));\n new_xs = parseNumberArray(flatten(new_xs));\n\n if (anyIsError(known_ys, known_xs, new_xs)) {\n return value\n }\n\n const linest = LINEST(known_ys, known_xs);\n const m = linest[0];\n const b = linest[1];\n const result = [];\n\n new_xs.forEach((x) => {\n result.push(m * x + b);\n });\n\n return result\n}\n\n/**\n * Returns the mean of the interior of a data set.\n *\n * Category: Statistical\n *\n * @param {*} array The array or range of values to trim and average.\n * @param {*} percent The fractional number of data points to exclude from the calculation. For example, if percent = 0.2, 4 points are trimmed from a data set of 20 points (20 x 0.2): 2 from the top and 2 from the bottom of the set.\n * @returns\n */\nfunction TRIMMEAN(range, percent) {\n range = parseNumberArray(flatten(range));\n percent = parseNumber(percent);\n\n if (anyIsError(range, percent)) {\n return value\n }\n\n const trim = FLOOR(range.length * percent, 2) / 2;\n\n return jStat.mean(\n initial(\n rest(\n range.sort((a, b) => a - b),\n trim\n ),\n trim\n )\n )\n}\n\nconst VAR = {};\n\n/**\n * Calculates variance based on the entire population.\n *\n * Category: Statistical\n *\n * @param {*} args number1, number2, ... Number arguments 2 to 254 corresponding to a population.\n * @returns\n */\nVAR.P = function () {\n const range = numbers(flatten(arguments));\n const n = range.length;\n let sigma = 0;\n const mean = AVERAGE(range);\n let result;\n\n for (let i = 0; i < n; i++) {\n sigma += Math.pow(range[i] - mean, 2);\n }\n\n result = sigma / n;\n\n if (isNaN(result)) {\n result = num;\n }\n\n return result\n};\n\n/**\n * Estimates variance based on a sample.\n *\n * Category: Statistical\n *\n * @param {*} args number1, number2, ... Number arguments 2 to 254 corresponding to a sample of a population.\n * @returns\n */\nVAR.S = function () {\n const range = numbers(flatten(arguments));\n const n = range.length;\n let sigma = 0;\n const mean = AVERAGE(range);\n\n for (let i = 0; i < n; i++) {\n sigma += Math.pow(range[i] - mean, 2);\n }\n\n return sigma / (n - 1)\n};\n\n/**\n * Estimates variance based on a sample, including numbers, text, and logical values.\n *\n * Category: Statistical\n *\n * @param {*} args value1, value2, ... Value1 is required, subsequent values are optional. 1 to 255 value arguments corresponding to a sample of a population.\n * @returns\n */\nfunction VARA() {\n const range = flatten(arguments);\n const n = range.length;\n let sigma = 0;\n let count = 0;\n const mean = AVERAGEA(range);\n\n for (let i = 0; i < n; i++) {\n const el = range[i];\n\n if (typeof el === 'number') {\n sigma += Math.pow(el - mean, 2);\n } else if (el === true) {\n sigma += Math.pow(1 - mean, 2);\n } else {\n sigma += Math.pow(0 - mean, 2);\n }\n\n if (el !== null) {\n count++;\n }\n }\n\n return sigma / (count - 1)\n}\n\n/**\n * Calculates variance based on the entire population, including numbers, text, and logical values.\n *\n * Category: Statistical\n *\n * @param {*} args value1, value2, ... Value1 is required, subsequent values are optional. 1 to 255 value arguments corresponding to a population.\n * @returns\n */\nfunction VARPA() {\n const range = flatten(arguments);\n const n = range.length;\n let sigma = 0;\n let count = 0;\n const mean = AVERAGEA(range);\n let result;\n\n for (let i = 0; i < n; i++) {\n const el = range[i];\n\n if (typeof el === 'number') {\n sigma += Math.pow(el - mean, 2);\n } else if (el === true) {\n sigma += Math.pow(1 - mean, 2);\n } else {\n sigma += Math.pow(0 - mean, 2);\n }\n\n if (el !== null) {\n count++;\n }\n }\n\n result = sigma / count;\n\n if (isNaN(result)) {\n result = num;\n }\n\n return result\n}\n\nconst WEIBULL = {};\n\n/**\n * Returns the Weibull distribution.\n *\n * Category: Statistical\n *\n * @param {*} x The value at which to evaluate the function.\n * @param {*} alpha A parameter to the distribution.\n * @param {*} beta A parameter to the distribution.\n * @param {*} cumulative Determines the form of the function.\n * @returns\n */\nWEIBULL.DIST = (x, alpha, beta, cumulative) => {\n x = parseNumber(x);\n alpha = parseNumber(alpha);\n beta = parseNumber(beta);\n\n if (anyIsError(x, alpha, beta)) {\n return value\n }\n\n return cumulative\n ? 1 - Math.exp(-Math.pow(x / beta, alpha))\n : (Math.pow(x, alpha - 1) * Math.exp(-Math.pow(x / beta, alpha)) * alpha) / Math.pow(beta, alpha)\n};\n\nconst Z = {};\n\n/**\n * Returns the one-tailed probability-value of a z-test.\n *\n * Category: Statistical\n *\n * @param {*} array The array or range of data against which to test x.\n * @param {*} x The value to test.\n * @param {*} sigma Optional. The population (known) standard deviation. If omitted, the sample standard deviation is used.\n * @returns\n */\nZ.TEST = (array, x, sigma) => {\n array = parseNumberArray(flatten(array));\n x = parseNumber(x);\n\n if (anyIsError(array, x)) {\n return value\n }\n\n sigma = sigma || STDEV.S(array);\n const n = array.length;\n\n return 1 - NORM.S.DIST((AVERAGE(array) - x) / (sigma / Math.sqrt(n)), true)\n};\n\n/**\n * Returns the absolute value of a number.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number The real number of which you want the absolute value.\n * @returns\n */\nfunction ABS(number) {\n number = parseNumber(number);\n\n if (number instanceof Error) {\n return number\n }\n\n const result = Math.abs(number);\n\n return result\n}\n\n/**\n * Returns the arccosine of a number.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number The cosine of the angle you want and must be from -1 to 1.\n * @returns\n */\nfunction ACOS(number) {\n number = parseNumber(number);\n\n if (number instanceof Error) {\n return number\n }\n\n let result = Math.acos(number);\n\n if (isNaN(result)) {\n result = num;\n }\n\n return result\n}\n\n/**\n * Returns the inverse hyperbolic cosine of a number.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number Any real number equal to or greater than 1.\n * @returns\n */\nfunction ACOSH(number) {\n number = parseNumber(number);\n\n if (number instanceof Error) {\n return number\n }\n\n let result = Math.log(number + Math.sqrt(number * number - 1));\n\n if (isNaN(result)) {\n result = num;\n }\n\n return result\n}\n\n/**\n * Returns the arccotangent of a number.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number Number is the cotangent of the angle you want. This must be a real number.\n * @returns\n */\nfunction ACOT(number) {\n number = parseNumber(number);\n\n if (number instanceof Error) {\n return number\n }\n\n const result = Math.atan(1 / number);\n\n return result\n}\n\n/**\n * Returns the hyperbolic arccotangent of a number.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number The absolute value of Number must be greater than 1.\n * @returns\n */\nfunction ACOTH(number) {\n number = parseNumber(number);\n\n if (number instanceof Error) {\n return number\n }\n\n let result = 0.5 * Math.log((number + 1) / (number - 1));\n\n if (isNaN(result)) {\n result = num;\n }\n\n return result\n}\n\n// TODO: use options\n/**\n * Returns an aggregate in a list or database.\n *\n * Category: Math and trigonometry\n *\n * @param {*} function_num A number 1 to 19 that specifies which function to use.\n * @param {*} options A numerical value that determines which values to ignore in the evaluation range for the function. Note: The function will not ignore hidden rows, nested subtotals or nested aggregates if the array argument includes a calculation, for example: =AGGREGATE(14,3,A1:A100*(A1:A100>0),1)\n * @param {*} ref1 The first numeric argument for functions that take multiple numeric arguments for which you want the aggregate value.\n * @param {*} ref2 Optional. Numeric arguments 2 to 253 for which you want the aggregate value. For functions that take an array, ref1 is an array, an array formula, or a reference to a range of values for which you want the aggregate value. Ref2 is a second argument that is required for certain functions.\n * @returns\n */\nfunction AGGREGATE(function_num, options, ref1, ref2) {\n function_num = parseNumber(function_num);\n options = parseNumber(function_num);\n\n if (anyIsError(function_num, options)) {\n return value\n }\n\n switch (function_num) {\n case 1:\n return AVERAGE(ref1)\n case 2:\n return COUNT(ref1)\n case 3:\n return COUNTA(ref1)\n case 4:\n return MAX(ref1)\n case 5:\n return MIN(ref1)\n case 6:\n return PRODUCT(ref1)\n case 7:\n return STDEV.S(ref1)\n case 8:\n return STDEV.P(ref1)\n case 9:\n return SUM(ref1)\n case 10:\n return VAR.S(ref1)\n case 11:\n return VAR.P(ref1)\n case 12:\n return MEDIAN(ref1)\n case 13:\n return MODE.SNGL(ref1)\n case 14:\n return LARGE(ref1, ref2)\n case 15:\n return SMALL(ref1, ref2)\n case 16:\n return PERCENTILE.INC(ref1, ref2)\n case 17:\n return QUARTILE.INC(ref1, ref2)\n case 18:\n return PERCENTILE.EXC(ref1, ref2)\n case 19:\n return QUARTILE.EXC(ref1, ref2)\n }\n}\n\n/**\n * Converts a Roman number to Arabic, as a number.\n *\n * Category: Math and trigonometry\n *\n * @param {*} text A string enclosed in quotation marks, an empty string (\"\"), or a reference to a value containing text.\n * @returns\n */\nfunction ARABIC(text) {\n if (text === undefined || text === null) {\n return 0\n }\n\n if (text instanceof Error) {\n return text\n }\n\n // Credits: Rafa? Kukawski\n if (!/^M*(?:D?C{0,3}|C[MD])(?:L?X{0,3}|X[CL])(?:V?I{0,3}|I[XV])$/.test(text)) {\n return value\n }\n\n let r = 0;\n text.replace(/[MDLV]|C[MD]?|X[CL]?|I[XV]?/g, (i) => {\n r += {\n M: 1000,\n CM: 900,\n D: 500,\n CD: 400,\n C: 100,\n XC: 90,\n L: 50,\n XL: 40,\n X: 10,\n IX: 9,\n V: 5,\n IV: 4,\n I: 1\n }[i];\n });\n\n return r\n}\n\n/**\n * Returns the arcsine of a number.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number The sine of the angle you want and must be from -1 to 1.\n * @returns\n */\nfunction ASIN(number) {\n number = parseNumber(number);\n\n if (number instanceof Error) {\n return number\n }\n\n let result = Math.asin(number);\n\n if (isNaN(result)) {\n result = num;\n }\n\n return result\n}\n\n/**\n * Returns the inverse hyperbolic sine of a number.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number Any real number.\n * @returns\n */\nfunction ASINH(number) {\n number = parseNumber(number);\n\n if (number instanceof Error) {\n return number\n }\n\n return Math.log(number + Math.sqrt(number * number + 1))\n}\n\n/**\n * Returns the arctangent of a number.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number The tangent of the angle you want.\n * @returns\n */\nfunction ATAN(number) {\n number = parseNumber(number);\n\n if (number instanceof Error) {\n return number\n }\n\n return Math.atan(number)\n}\n\n/**\n * Returns the arctangent from x- and y-coordinates.\n *\n * Category: Math and trigonometry\n *\n * @param {*} x_num The x-coordinate of the point.\n * @param {*} y_num The y-coordinate of the point.\n * @returns\n */\nfunction ATAN2(x_num, y_num) {\n x_num = parseNumber(x_num);\n y_num = parseNumber(y_num);\n const anyError$1 = anyError(x_num, y_num);\n\n if (anyError$1) {\n return anyError$1\n }\n\n return Math.atan2(x_num, y_num)\n}\n\n/**\n * Returns the inverse hyperbolic tangent of a number.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number Any real number between 1 and -1.\n * @returns\n */\nfunction ATANH(number) {\n number = parseNumber(number);\n\n if (number instanceof Error) {\n return number\n }\n\n let result = Math.log((1 + number) / (1 - number)) / 2;\n\n if (isNaN(result)) {\n result = num;\n }\n\n return result\n}\n\n/**\n * Converts a number into a text representation with the given radix (base).\n *\n * Category: Math and trigonometry\n *\n * @param {*} number The number that you want to convert. Must be an integer greater than or equal to 0 and less than 2^53.\n * @param {*} radix The base radix that you want to convert the number into. Must be an integer greater than or equal to 2 and less than or equal to 36.\n * @param {*} min_length Optional. The minimum length of the returned string. Must be an integer greater than or equal to 0.\n * @returns\n */\nfunction BASE(number, radix, min_length) {\n number = parseNumber(number);\n radix = parseNumber(radix);\n min_length = parseNumber(min_length);\n const anyError$1 = anyError(number, radix, min_length);\n\n if (anyError$1) {\n return anyError$1\n }\n\n if (radix === 0) {\n return num\n }\n\n const result = number.toString(radix);\n\n return new Array(Math.max(min_length + 1 - result.length, 0)).join('0') + result\n}\n\n/**\n * Rounds a number to the nearest integer or to the nearest multiple of significance.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number The value you want to round.\n * @param {*} significance The multiple to which you want to round.\n * @param {*} mode Optional. For negative numbers, controls whether Number is rounded toward or away from zero.\n * @returns\n */\nfunction CEILING(number, significance, mode) {\n number = parseNumber(number);\n significance = parseNumber(significance);\n mode = parseNumber(mode);\n const anyError$1 = anyError(number, significance, mode);\n\n if (anyError$1) {\n return anyError$1\n }\n\n if (significance === 0) {\n return 0\n }\n\n significance = Math.abs(significance);\n const precision = -Math.floor(Math.log(significance) / Math.log(10));\n\n if (number >= 0) {\n return ROUND(Math.ceil(number / significance) * significance, precision)\n } else {\n if (mode === 0) {\n return -ROUND(Math.floor(Math.abs(number) / significance) * significance, precision)\n } else {\n return -ROUND(Math.ceil(Math.abs(number) / significance) * significance, precision)\n }\n }\n}\n\nCEILING.MATH = CEILING;\n\nCEILING.PRECISE = CEILING;\n\n/**\n * Returns the number of combinations for a given number of objects.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number The number of items.\n * @param {*} number_chosen The number of items in each combination.\n * @returns\n */\nfunction COMBIN(number, number_chosen) {\n number = parseNumber(number);\n number_chosen = parseNumber(number_chosen);\n const anyError$1 = anyError(number, number_chosen);\n\n if (anyError$1) {\n return anyError$1\n }\n\n if (number < number_chosen) {\n return num\n }\n\n return FACT(number) / (FACT(number_chosen) * FACT(number - number_chosen))\n}\n\n/**\n * Returns the number of combinations with repetitions for a given number of items.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number Must be greater than or equal to 0, and greater than or equal to Number_chosen. Non-integer values are truncated.\n * @param {*} number_chosen Must be greater than or equal to 0. Non-integer values are truncated.\n * @returns\n */\nfunction COMBINA(number, number_chosen) {\n number = parseNumber(number);\n number_chosen = parseNumber(number_chosen);\n const anyError$1 = anyError(number, number_chosen);\n\n if (anyError$1) {\n return anyError$1\n }\n\n if (number < number_chosen) {\n return num\n }\n\n return number === 0 && number_chosen === 0 ? 1 : COMBIN(number + number_chosen - 1, number - 1)\n}\n\n/**\n * Returns the cosine of a number.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number The angle in radians for which you want the cosine.\n * @returns\n */\nfunction COS(number) {\n number = parseNumber(number);\n\n if (number instanceof Error) {\n return number\n }\n\n return Math.cos(number)\n}\n\n/**\n * Returns the hyperbolic cosine of a number.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number Any real number for which you want to find the hyperbolic cosine.\n * @returns\n */\nfunction COSH(number) {\n number = parseNumber(number);\n\n if (number instanceof Error) {\n return number\n }\n\n return (Math.exp(number) + Math.exp(-number)) / 2\n}\n\n/**\n * Returns the hyperbolic cosine of a number.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number The angle in radians for which you want the cotangent.\n * @returns\n */\nfunction COT(number) {\n number = parseNumber(number);\n\n if (number instanceof Error) {\n return number\n }\n\n if (number === 0) {\n return div0\n }\n\n return 1 / Math.tan(number)\n}\n\n/**\n * Returns the cotangent of an angle.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number\n * @returns\n */\nfunction COTH(number) {\n number = parseNumber(number);\n\n if (number instanceof Error) {\n return number\n }\n\n if (number === 0) {\n return div0\n }\n\n const e2 = Math.exp(2 * number);\n\n return (e2 + 1) / (e2 - 1)\n}\n\n/**\n * Returns the cosecant of an angle.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number\n * @returns\n */\nfunction CSC(number) {\n number = parseNumber(number);\n\n if (number instanceof Error) {\n return number\n }\n\n if (number === 0) {\n return div0\n }\n\n return 1 / Math.sin(number)\n}\n\n/**\n * Returns the hyperbolic cosecant of an angle.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number\n * @returns\n */\nfunction CSCH(number) {\n number = parseNumber(number);\n\n if (number instanceof Error) {\n return number\n }\n\n if (number === 0) {\n return div0\n }\n\n return 2 / (Math.exp(number) - Math.exp(-number))\n}\n\n/**\n * Converts a text representation of a number in a given base into a decimal number.\n *\n * Category: Math and trigonometry\n *\n * @param {*} text\n * @param {*} radix Radix must be an integer.\n * @returns\n */\nfunction DECIMAL(text, radix) {\n if (arguments.length < 1) {\n return value\n }\n\n text = parseNumber(text);\n radix = parseNumber(radix);\n const anyError$1 = anyError(text, radix);\n\n if (anyError$1) {\n return anyError$1\n }\n\n if (radix === 0) {\n return num\n }\n\n return parseInt(text, radix)\n}\n\n/**\n * Converts radians to degrees.\n *\n * Category: Math and trigonometry\n *\n * @param {*} angle The angle in radians that you want to convert.\n * @returns\n */\nfunction DEGREES(angle) {\n angle = parseNumber(angle);\n\n if (angle instanceof Error) {\n return angle\n }\n\n return (angle * 180) / Math.PI\n}\n\n/**\n * Rounds a number up to the nearest even integer.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number The value to round.\n * @returns\n */\nfunction EVEN(number) {\n number = parseNumber(number);\n\n if (number instanceof Error) {\n return number\n }\n\n return CEILING(number, -2, -1)\n}\n\n/**\n * Returns e raised to the power of a given number.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number The exponent applied to the base e.\n * @returns\n */\nfunction EXP(number) {\n if (arguments.length < 1) {\n return na\n }\n\n if (arguments.length > 1) {\n return error\n }\n\n number = parseNumber(number);\n\n if (number instanceof Error) {\n return number\n }\n\n number = Math.exp(number);\n\n return number\n}\n\nconst MEMOIZED_FACT = [];\n/**\n * Returns the factorial of a number.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number The nonnegative number for which you want the factorial. If number is not an integer, it is truncated.\n * @returns\n */\nfunction FACT(number) {\n number = parseNumber(number);\n\n if (number instanceof Error) {\n return number\n }\n\n const n = Math.floor(number);\n\n if (n === 0 || n === 1) {\n return 1\n } else if (MEMOIZED_FACT[n] > 0) {\n return MEMOIZED_FACT[n]\n } else {\n MEMOIZED_FACT[n] = FACT(n - 1) * n;\n\n return MEMOIZED_FACT[n]\n }\n}\n\n/**\n * Returns the double factorial of a number.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number The value for which to return the double factorial. If number is not an integer, it is truncated.\n * @returns\n */\nfunction FACTDOUBLE(number) {\n number = parseNumber(number);\n\n if (number instanceof Error) {\n return number\n }\n\n const n = Math.floor(number);\n\n return n <= 0 ? 1 : n * FACTDOUBLE(n - 2)\n}\n\n/**\n * Rounds a number down, toward zero.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number The numeric value you want to round.\n * @param {*} significance The multiple to which you want to round.\n * @returns\n */\nfunction FLOOR(number, significance) {\n number = parseNumber(number);\n significance = parseNumber(significance);\n const anyError$1 = anyError(number, significance);\n\n if (anyError$1) {\n return anyError$1\n }\n\n if (significance === 0) {\n return 0\n }\n\n if (!(number >= 0 && significance > 0) && !(number <= 0 && significance < 0)) {\n return num\n }\n\n significance = Math.abs(significance);\n const precision = -Math.floor(Math.log(significance) / Math.log(10));\n\n return number >= 0\n ? ROUND(Math.floor(number / significance) * significance, precision)\n : -ROUND(Math.ceil(Math.abs(number) / significance), precision)\n}\n\n// TODO: Verify\n\n/**\n * Rounds a number down, to the nearest integer or to the nearest multiple of significance.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number The number to be rounded down.\n * @param {*} significance Optional. The multiple to which you want to round.\n * @param {*} mode Optional. The direction (toward or away from 0) to round negative numbers.\n * @returns\n */\nFLOOR.MATH = (number, significance, mode) => {\n if (significance instanceof Error) {\n return significance\n }\n\n significance = significance === undefined ? 0 : significance;\n\n number = parseNumber(number);\n significance = parseNumber(significance);\n mode = parseNumber(mode);\n const anyError$1 = anyError(number, significance, mode);\n\n if (anyError$1) {\n return anyError$1\n }\n\n if (significance === 0) {\n return 0\n }\n\n significance = significance ? Math.abs(significance) : 1;\n const precision = -Math.floor(Math.log(significance) / Math.log(10));\n\n if (number >= 0) {\n return ROUND(Math.floor(number / significance) * significance, precision)\n } else if (mode === 0 || mode === undefined) {\n return -ROUND(Math.ceil(Math.abs(number) / significance) * significance, precision)\n }\n\n return -ROUND(Math.floor(Math.abs(number) / significance) * significance, precision)\n};\n\n// Deprecated\n\n/**\n * Rounds a number the nearest integer or to the nearest multiple of significance. Regardless of the sign of the number, the number is rounded up.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number The value to be rounded.\n * @param {*} significance Optional. The multiple to which number is to be rounded. If significance is omitted, its default value is 1.\n * @returns\n */\nFLOOR.PRECISE = FLOOR['MATH'];\n\n// adapted http://rosettacode.org/wiki/Greatest_common_divisor#JavaScript\n/**\n * Returns the greatest common divisor.\n *\n * Category: Math and trigonometry\n *\n * @param {*} args number1, number2, ... Number1 is required, subsequent numbers are optional. 1 to 255 values. If any value is not an integer, it is truncated.\n * @returns\n */\nfunction GCD() {\n const range = parseNumberArray(flatten(arguments));\n\n if (range instanceof Error) {\n return range\n }\n\n const n = range.length;\n const r0 = range[0];\n let x = r0 < 0 ? -r0 : r0;\n\n for (let i = 1; i < n; i++) {\n const ri = range[i];\n let y = ri < 0 ? -ri : ri;\n\n while (x && y) {\n if (x > y) {\n x %= y;\n } else {\n y %= x;\n }\n }\n\n x += y;\n }\n\n return x\n}\n\n/**\n * Rounds a number down to the nearest integer.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number The real number you want to round down to an integer.\n * @returns\n */\nfunction INT(number) {\n number = parseNumber(number);\n\n if (number instanceof Error) {\n return number\n }\n\n return Math.floor(number)\n}\n\n// TODO: verify\nconst ISO = {\n CEILING: CEILING\n};\n\n/**\n * Returns the least common multiple.\n *\n * Category: Math and trigonometry\n *\n * @param {*} args number1, number2,... Number1 is required, subsequent numbers are optional. 1 to 255 values for which you want the least common multiple. If value is not an integer, it is truncated.\n * @returns\n */\nfunction LCM() {\n // Credits: Jonas Raoni Soares Silva\n const o = parseNumberArray(flatten(arguments));\n\n if (o instanceof Error) {\n return o\n }\n\n for (var i, j, n, d, r = 1; (n = o.pop()) !== undefined; ) {\n if (n === 0) {\n return 0\n }\n\n while (n > 1) {\n if (n % 2) {\n for (i = 3, j = Math.floor(Math.sqrt(n)); i <= j && n % i; i += 2) {\n // empty\n }\n\n d = i <= j ? i : n;\n } else {\n d = 2;\n }\n\n for (n /= d, r *= d, i = o.length; i; o[--i] % d === 0 && (o[i] /= d) === 1 && o.splice(i, 1)) {\n // empty\n }\n }\n }\n\n return r\n}\n\n/**\n * Returns the natural logarithm of a number.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number The positive real number for which you want the natural logarithm.\n * @returns\n */\nfunction LN(number) {\n number = parseNumber(number);\n\n if (number instanceof Error) {\n return number\n }\n\n if (number === 0) {\n return num\n }\n\n return Math.log(number)\n}\n\n/**\n * Formula.js only\n *\n * @returns\n */\nfunction LN10() {\n return Math.log(10)\n}\n\n/**\n * Formula.js only\n *\n * @returns\n */\nfunction LN2() {\n return Math.log(2)\n}\n\n/**\n * Formula.js only\n *\n * @returns\n */\nfunction LOG10E() {\n return Math.LOG10E\n}\n\n/**\n * Formula.js only\n *\n * @returns\n */\nfunction LOG2E() {\n return Math.LOG2E\n}\n\n/**\n * Returns the logarithm of a number to a specified base.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number The positive real number for which you want the logarithm.\n * @param {*} base Optional. The base of the logarithm. If base is omitted, it is assumed to be 10.\n * @returns\n */\nfunction LOG(number, base) {\n number = parseNumber(number);\n base = parseNumber(base);\n const anyError$1 = anyError(number, base);\n\n if (anyError$1) {\n return anyError$1\n }\n\n if (number === 0 || base === 0) {\n return num\n }\n\n return Math.log(number) / Math.log(base)\n}\n\n/**\n * Returns the base-10 logarithm of a number.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number The positive real number for which you want the base-10 logarithm.\n * @returns\n */\nfunction LOG10(number) {\n number = parseNumber(number);\n\n if (number instanceof Error) {\n return number\n }\n\n if (number === 0) {\n return num\n }\n\n return Math.log(number) / Math.log(10)\n}\n\n/**\n * Returns the remainder from division.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number The number for which you want to find the remainder.\n * @param {*} divisor The number by which you want to divide number.\n * @returns\n */\nfunction MOD(number, divisor) {\n number = parseNumber(number);\n divisor = parseNumber(divisor);\n const anyError$1 = anyError(number, divisor);\n\n if (anyError$1) {\n return anyError$1\n }\n\n if (divisor === 0) {\n return div0\n }\n\n let modulus = Math.abs(number % divisor);\n modulus = number < 0 ? divisor - modulus : modulus;\n\n return divisor > 0 ? modulus : -modulus\n}\n\n/**\n * Returns a number rounded to the desired multiple.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number The value to round.\n * @param {*} multiple The multiple to which you want to round number.\n * @returns\n */\nfunction MROUND(number, multiple) {\n number = parseNumber(number);\n multiple = parseNumber(multiple);\n const anyError$1 = anyError(number, multiple);\n\n if (anyError$1) {\n return anyError$1\n }\n\n if (number * multiple === 0) {\n return 0\n }\n\n if (number * multiple < 0) {\n return num\n }\n\n return Math.round(number / multiple) * multiple\n}\n\n/**\n * Returns the multinomial of a set of numbers.\n *\n * Category: Math and trigonometry\n *\n * @param {*} args number1, number2, ... Number1 is required, subsequent numbers are optional. 1 to 255 values for which you want the multinomial.\n * @returns\n */\nfunction MULTINOMIAL() {\n const args = parseNumberArray(flatten(arguments));\n\n if (args instanceof Error) {\n return args\n }\n\n let sum = 0;\n let divisor = 1;\n\n for (let i = 0; i < args.length; i++) {\n sum += args[i];\n divisor *= FACT(args[i]);\n }\n\n return FACT(sum) / divisor\n}\n\n/**\n * Rounds a number up to the nearest odd integer.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number: The value to round.\n * @returns\n */\nfunction ODD(number) {\n number = parseNumber(number);\n\n if (number instanceof Error) {\n return number\n }\n\n let temp = Math.ceil(Math.abs(number));\n temp = temp & 1 ? temp : temp + 1;\n\n return number >= 0 ? temp : -temp\n}\n\n/**\n * Returns the value of pi.\n *\n * Category: Math and trigonometry\n *\n * @returns\n */\nfunction PI() {\n return Math.PI\n}\n\n/**\n * Formula.js only\n *\n * @returns\n */\nfunction E() {\n return Math.E\n}\n\n/**\n * Returns the result of a number raised to a power.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number The base number. It can be any real number.\n * @param {*} power The exponent to which the base number is raised.\n * @returns\n */\nfunction POWER(number, power) {\n number = parseNumber(number);\n power = parseNumber(power);\n const anyError$1 = anyError(number, power);\n\n if (anyError$1) {\n return anyError$1\n }\n\n if (number === 0 && power === 0) {\n return num\n }\n\n const result = Math.pow(number, power);\n\n if (isNaN(result)) {\n return num\n }\n\n return result\n}\n\n/**\n * Multiplies its arguments.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number1 The first number or range that you want to multiply.\n * @param {*} args number2, ... Optional. Additional numbers or ranges that you want to multiply, up to a maximum of 255 arguments.\n * @returns\n */\nfunction PRODUCT() {\n const flatArguments = flatten(arguments);\n const flatArgumentsDefined = flatArguments.filter((arg) => arg !== undefined && arg !== null);\n\n if (flatArgumentsDefined.length === 0) {\n return 0\n }\n\n const args = parseNumberArray(flatArgumentsDefined);\n\n if (args instanceof Error) {\n return args\n }\n\n let result = 1;\n\n for (let i = 0; i < args.length; i++) {\n result *= args[i];\n }\n\n return result\n}\n\n/**\n * Returns the integer portion of a division.\n *\n * Category: Math and trigonometry\n *\n * @param {*} numerator The dividend.\n * @param {*} denominator The divisor.\n * @returns\n */\nfunction QUOTIENT(numerator, denominator) {\n numerator = parseNumber(numerator);\n denominator = parseNumber(denominator);\n const anyError$1 = anyError(numerator, denominator);\n\n if (anyError$1) {\n return anyError$1\n }\n\n return parseInt(numerator / denominator, 10)\n}\n\n/**\n * Converts degrees to radians.\n *\n * Category: Math and trigonometry\n *\n * @param {*} angle An angle in degrees that you want to convert.\n * @returns\n */\nfunction RADIANS(angle) {\n angle = parseNumber(angle);\n\n if (angle instanceof Error) {\n return angle\n }\n\n return (angle * Math.PI) / 180\n}\n\n/**\n * Returns a random number between 0 and 1.\n *\n * Category: Math and trigonometry\n *\n * @returns\n */\nfunction RAND() {\n return Math.random()\n}\n\n/**\n * Returns a random number between the numbers you specify.\n *\n * Category: Math and trigonometry\n *\n * @param {*} bottom The smallest integer RANDBETWEEN will return.\n * @param {*} top The largest integer RANDBETWEEN will return.\n * @returns\n */\nfunction RANDBETWEEN(bottom, top) {\n bottom = parseNumber(bottom);\n top = parseNumber(top);\n const anyError$1 = anyError(bottom, top);\n\n if (anyError$1) {\n return anyError$1\n }\n // Creative Commons Attribution 3.0 License\n // Copyright (c) 2012 eqcode\n\n return bottom + Math.ceil((top - bottom + 1) * Math.random()) - 1\n}\n\n// TODO\n/**\n * Converts an arabic numeral to roman, as text.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number The Arabic numeral you want converted.\n * @returns\n */\nfunction ROMAN(number) {\n number = parseNumber(number);\n\n if (number instanceof Error) {\n return number\n }\n\n // The MIT License\n // Copyright (c) 2008 Steven Levithan\n const digits = String(number).split('');\n const key = [\n '',\n 'C',\n 'CC',\n 'CCC',\n 'CD',\n 'D',\n 'DC',\n 'DCC',\n 'DCCC',\n 'CM',\n '',\n 'X',\n 'XX',\n 'XXX',\n 'XL',\n 'L',\n 'LX',\n 'LXX',\n 'LXXX',\n 'XC',\n '',\n 'I',\n 'II',\n 'III',\n 'IV',\n 'V',\n 'VI',\n 'VII',\n 'VIII',\n 'IX'\n ];\n let roman = '';\n let i = 3;\n\n while (i--) {\n roman = (key[+digits.pop() + i * 10] || '') + roman;\n }\n\n return new Array(+digits.join('') + 1).join('M') + roman\n}\n\n/**\n * Rounds a number to a specified number of digits.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number The number that you want to round.\n * @param {*} num_digits The number of digits to which you want to round the number argument.\n * @returns\n */\nfunction ROUND(number, num_digits) {\n number = parseNumber(number);\n num_digits = parseNumber(num_digits);\n const anyError$1 = anyError(number, num_digits);\n\n if (anyError$1) {\n return anyError$1\n }\n\n return Number(Math.round(Number(number + 'e' + num_digits)) + 'e' + num_digits * -1)\n}\n\n/**\n * Rounds a number down, toward zero.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number Any real number that you want rounded down.\n * @param {*} num_digits The number of digits to which you want to round number.\n * @returns\n */\nfunction ROUNDDOWN(number, num_digits) {\n number = parseNumber(number);\n num_digits = parseNumber(num_digits);\n const anyError$1 = anyError(number, num_digits);\n\n if (anyError$1) {\n return anyError$1\n }\n\n const sign = number > 0 ? 1 : -1;\n\n return (sign * Math.floor(Math.abs(number) * Math.pow(10, num_digits))) / Math.pow(10, num_digits)\n}\n\n/**\n * Rounds a number up, away from zero.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number Any real number that you want rounded up.\n * @param {*} num_digits The number of digits to which you want to round number.\n * @returns\n */\nfunction ROUNDUP(number, num_digits) {\n number = parseNumber(number);\n num_digits = parseNumber(num_digits);\n const anyError$1 = anyError(number, num_digits);\n\n if (anyError$1) {\n return anyError$1\n }\n\n const sign = number > 0 ? 1 : -1;\n\n return (sign * Math.ceil(Math.abs(number) * Math.pow(10, num_digits))) / Math.pow(10, num_digits)\n}\n\n/**\n * Returns the secant of an angle.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number The angle in radians for which you want the secant.\n * @returns\n */\nfunction SEC(number) {\n number = parseNumber(number);\n\n if (number instanceof Error) {\n return number\n }\n\n return 1 / Math.cos(number)\n}\n\n/**\n * Returns the hyperbolic secant of an angle.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number The angle in radians for which you want the hyperbolic secant.\n * @returns\n */\nfunction SECH(number) {\n number = parseNumber(number);\n\n if (number instanceof Error) {\n return number\n }\n\n return 2 / (Math.exp(number) + Math.exp(-number))\n}\n\n/**\n * Returns the sum of a power series based on the formula.\n *\n * Category: Math and trigonometry\n *\n * @param {*} x The input value to the power series.\n * @param {*} n The initial power to which you want to raise x.\n * @param {*} m The step by which to increase n for each term in the series.\n * @param {*} coefficients A set of coefficients by which each successive power of x is multiplied. The number of values in coefficients determines the number of terms in the power series. For example, if there are three values in coefficients, then there will be three terms in the power series.\n * @returns\n */\nfunction SERIESSUM(x, n, m, coefficients) {\n x = parseNumber(x);\n n = parseNumber(n);\n m = parseNumber(m);\n coefficients = parseNumberArray(coefficients);\n\n if (anyIsError(x, n, m, coefficients)) {\n return value\n }\n\n let result = coefficients[0] * Math.pow(x, n);\n\n for (let i = 1; i < coefficients.length; i++) {\n result += coefficients[i] * Math.pow(x, n + i * m);\n }\n\n return result\n}\n\n/**\n * Returns the sign of a number.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number Any real number.\n * @returns\n */\nfunction SIGN(number) {\n number = parseNumber(number);\n\n if (number instanceof Error) {\n return number\n }\n\n if (number < 0) {\n return -1\n } else if (number === 0) {\n return 0\n } else {\n return 1\n }\n}\n\n/**\n * Returns the sine of the given angle.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number The angle in radians for which you want the sine.\n * @returns\n */\nfunction SIN(number) {\n number = parseNumber(number);\n\n if (number instanceof Error) {\n return number\n }\n\n return Math.sin(number)\n}\n\n/**\n * Returns the hyperbolic sine of a number.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number Any real number.\n * @returns\n */\nfunction SINH(number) {\n number = parseNumber(number);\n\n if (number instanceof Error) {\n return number\n }\n\n return (Math.exp(number) - Math.exp(-number)) / 2\n}\n\n/**\n * Returns a positive square root.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number The number for which you want the square root.\n * @returns\n */\nfunction SQRT(number) {\n number = parseNumber(number);\n\n if (number instanceof Error) {\n return number\n }\n\n if (number < 0) {\n return num\n }\n\n return Math.sqrt(number)\n}\n\n/**\n * Returns the square root of (number * pi).\n *\n * Category: Math and trigonometry\n *\n * @param {*} number The number by which pi is multiplied.\n * @returns\n */\nfunction SQRTPI(number) {\n number = parseNumber(number);\n\n if (number instanceof Error) {\n return number\n }\n\n return Math.sqrt(number * Math.PI)\n}\n\n/**\n * Formula.js only\n *\n * @returns\n */\nfunction SQRT1_2() {\n return 1 / Math.sqrt(2)\n}\n\n/**\n * Formula.js only\n *\n * @returns\n */\nfunction SQRT2() {\n return Math.sqrt(2)\n}\n\n/**\n * Returns a subtotal in a list or database.\n *\n * Category: Math and trigonometry\n *\n * @param {*} function_num The number 1-11 or 101-111 that specifies the function to use for the subtotal. 1-11 includes manually-hidden rows, while 101-111 excludes them; filtered-out values are always excluded.\n * @param {*} ref1 The first named range or reference for which you want the subtotal.\n * @returns\n */\nfunction SUBTOTAL(function_num, ref1) {\n function_num = parseNumber(function_num);\n\n if (function_num instanceof Error) {\n return function_num\n }\n\n switch (function_num) {\n case 1:\n return AVERAGE(ref1)\n case 2:\n return COUNT(ref1)\n case 3:\n return COUNTA(ref1)\n case 4:\n return MAX(ref1)\n case 5:\n return MIN(ref1)\n case 6:\n return PRODUCT(ref1)\n case 7:\n return STDEV.S(ref1)\n case 8:\n return STDEV.P(ref1)\n case 9:\n return SUM(ref1)\n case 10:\n return VAR.S(ref1)\n case 11:\n return VAR.P(ref1)\n // no hidden values for us\n case 101:\n return AVERAGE(ref1)\n case 102:\n return COUNT(ref1)\n case 103:\n return COUNTA(ref1)\n case 104:\n return MAX(ref1)\n case 105:\n return MIN(ref1)\n case 106:\n return PRODUCT(ref1)\n case 107:\n return STDEV.S(ref1)\n case 108:\n return STDEV.P(ref1)\n case 109:\n return SUM(ref1)\n case 110:\n return VAR.S(ref1)\n case 111:\n return VAR.P(ref1)\n }\n}\n\n/**\n * Formula.js only\n *\n * @param {*} num1\n * @param {*} num2\n * @returns\n */\nfunction ADD(num1, num2) {\n if (arguments.length !== 2) {\n return na\n }\n\n num1 = parseNumber(num1);\n num2 = parseNumber(num2);\n const anyError$1 = anyError(num1, num2);\n\n if (anyError$1) {\n return anyError$1\n }\n\n return num1 + num2\n}\n\n/**\n * Formula.js only\n *\n * @param {*} num1\n * @param {*} num2\n * @returns\n */\nfunction MINUS(num1, num2) {\n if (arguments.length !== 2) {\n return na\n }\n\n num1 = parseNumber(num1);\n num2 = parseNumber(num2);\n const anyError$1 = anyError(num1, num2);\n\n if (anyError$1) {\n return anyError$1\n }\n\n return num1 - num2\n}\n\n/**\n * Formula.js only\n *\n * @param {*} dividend\n * @param {*} divisor\n * @returns\n */\nfunction DIVIDE(dividend, divisor) {\n if (arguments.length !== 2) {\n return na\n }\n\n dividend = parseNumber(dividend);\n divisor = parseNumber(divisor);\n const anyError$1 = anyError(dividend, divisor);\n\n if (anyError$1) {\n return anyError$1\n }\n\n if (divisor === 0) {\n return div0\n }\n\n return dividend / divisor\n}\n\n/**\n * Formula.js only\n *\n * @param {*} factor1\n * @param {*} factor2\n * @returns\n */\nfunction MULTIPLY(factor1, factor2) {\n if (arguments.length !== 2) {\n return na\n }\n\n factor1 = parseNumber(factor1);\n factor2 = parseNumber(factor2);\n const anyError$1 = anyError(factor1, factor2);\n\n if (anyError$1) {\n return anyError$1\n }\n\n return factor1 * factor2\n}\n\n/**\n * Formula.js only\n *\n * @param {*} num1\n * @param {*} num2\n * @returns\n */\nfunction GT(num1, num2) {\n if (arguments.length !== 2) {\n return na\n }\n\n if (num1 instanceof Error) {\n return num1\n }\n\n if (num2 instanceof Error) {\n return num2\n }\n\n if (anyIsString(num1, num2)) {\n num1 = parseString(num1);\n num2 = parseString(num2);\n } else {\n num1 = parseNumber(num1);\n num2 = parseNumber(num2);\n }\n\n const anyError$1 = anyError(num1, num2);\n\n if (anyError$1) {\n return anyError$1\n }\n\n return num1 > num2\n}\n\n/**\n * Formula.js only\n *\n * @param {*} num1\n * @param {*} num2\n * @returns\n */\nfunction GTE(num1, num2) {\n if (arguments.length !== 2) {\n return na\n }\n\n if (anyIsString(num1, num2)) {\n num1 = parseString(num1);\n num2 = parseString(num2);\n } else {\n num1 = parseNumber(num1);\n num2 = parseNumber(num2);\n }\n\n const anyError$1 = anyError(num1, num2);\n\n if (anyError$1) {\n return anyError$1\n }\n\n return num1 >= num2\n}\n\n/**\n * Formula.js only\n *\n * @param {*} num1\n * @param {*} num2\n * @returns\n */\nfunction LT(num1, num2) {\n if (arguments.length !== 2) {\n return na\n }\n\n if (anyIsString(num1, num2)) {\n num1 = parseString(num1);\n num2 = parseString(num2);\n } else {\n num1 = parseNumber(num1);\n num2 = parseNumber(num2);\n }\n\n const anyError$1 = anyError(num1, num2);\n\n if (anyError$1) {\n return anyError$1\n }\n\n return num1 < num2\n}\n\n/**\n * Formula.js only\n *\n * @param {*} num1\n * @param {*} num2\n * @returns\n */\nfunction LTE(num1, num2) {\n if (arguments.length !== 2) {\n return na\n }\n\n if (anyIsString(num1, num2)) {\n num1 = parseString(num1);\n num2 = parseString(num2);\n } else {\n num1 = parseNumber(num1);\n num2 = parseNumber(num2);\n }\n\n const anyError$1 = anyError(num1, num2);\n\n if (anyError$1) {\n return anyError$1\n }\n\n return num1 <= num2\n}\n\n/**\n * Formula.js only\n *\n * @param {*} value1\n * @param {*} value2\n * @returns\n */\nfunction EQ(value1, value2) {\n if (arguments.length !== 2) {\n return na\n }\n\n if (value1 instanceof Error) {\n return value1\n }\n\n if (value2 instanceof Error) {\n return value2\n }\n\n if (value1 === null) {\n value1 = undefined;\n }\n\n if (value2 === null) {\n value2 = undefined;\n }\n\n return value1 === value2\n}\n\n/**\n * Formula.js only\n *\n * @param {*} value1\n * @param {*} value2\n * @returns\n */\nfunction NE(value1, value2) {\n if (arguments.length !== 2) {\n return na\n }\n\n if (value1 instanceof Error) {\n return value1\n }\n\n if (value2 instanceof Error) {\n return value2\n }\n\n if (value1 === null) {\n value1 = undefined;\n }\n\n if (value2 === null) {\n value2 = undefined;\n }\n\n return value1 !== value2\n}\n\n/**\n * Formula.js only\n *\n * @param {*} base\n * @param {*} exponent\n * @returns\n */\nfunction POW(base, exponent) {\n if (arguments.length !== 2) {\n return na\n }\n\n return POWER(base, exponent)\n}\n\n/**\n * Adds its arguments.\n *\n * Category: Math and trigonometry\n *\n * @returns\n */\nfunction SUM() {\n let result = 0;\n\n arrayEach(argsToArray(arguments), (value) => {\n if (result instanceof Error) {\n return false\n } else if (value instanceof Error) {\n result = value;\n } else if (typeof value === 'number') {\n result += value;\n } else if (typeof value === 'string') {\n const parsed = parseFloat(value);\n\n !isNaN(parsed) && (result += parsed);\n } else if (Array.isArray(value)) {\n const inner_result = SUM.apply(null, value);\n\n if (inner_result instanceof Error) {\n result = inner_result;\n } else {\n result += inner_result;\n }\n }\n });\n\n return result\n}\n\n/**\n * Adds the values specified by a given criteria.\n *\n * Category: Math and trigonometry\n *\n * @param {*} range The range of values that you want evaluated by criteria. Cells in each range must be numbers or names, arrays, or references that contain numbers. Blank and text values are ignored.\n * @param {*} criteria The criteria in the form of a number, expression, a value reference, text, or a function that defines which values will be added.\n * @param {*} sum_range Optional. The actual values to add, if you want to add values other than those specified in the range argument. If the sum_range argument is omitted, Excel adds the values that are specified in the range argument (the same values to which the criteria is applied). Sum_range should be the same size and shape as range. If it isn't, performance may suffer, and the formula will sum a range of values that starts with the first value in sum_range but has the same dimensions as range.\n * @returns\n */\nfunction SUMIF(range, criteria, sum_range) {\n range = flatten(range);\n\n sum_range = sum_range ? flatten(sum_range) : range;\n\n if (range instanceof Error) {\n return range\n }\n\n if (criteria === undefined || criteria === null || criteria instanceof Error) {\n return 0\n }\n\n let result = 0;\n const isWildcard = criteria === '*';\n const tokenizedCriteria = isWildcard ? null : parse(criteria + '');\n\n for (let i = 0; i < range.length; i++) {\n const value = range[i];\n const sumValue = sum_range[i];\n\n if (isWildcard) {\n result += value;\n } else {\n const tokens = [createToken(value, TOKEN_TYPE_LITERAL)].concat(tokenizedCriteria);\n\n result += compute(tokens) ? sumValue : 0;\n }\n }\n\n return result\n}\n\n/**\n * Adds the values in a range that meet multiple criteria.\n *\n * Category: Math and trigonometry\n *\n * @returns\n */\nfunction SUMIFS() {\n const args = argsToArray(arguments);\n const range = parseNumberArray(flatten(args.shift()));\n\n if (range instanceof Error) {\n return range\n }\n\n const criterias = args;\n const criteriaLength = criterias.length / 2;\n\n for (let i = 0; i < criteriaLength; i++) {\n criterias[i * 2] = flatten(criterias[i * 2]);\n }\n\n let result = 0;\n\n for (let i = 0; i < range.length; i++) {\n let isMeetCondition = false;\n\n for (let j = 0; j < criteriaLength; j++) {\n const valueToTest = criterias[j * 2][i];\n const criteria = criterias[j * 2 + 1];\n const isWildcard = criteria === void 0 || criteria === '*';\n let computedResult = false;\n\n if (isWildcard) {\n computedResult = true;\n } else {\n const tokenizedCriteria = parse(criteria + '');\n const tokens = [createToken(valueToTest, TOKEN_TYPE_LITERAL)].concat(\n tokenizedCriteria\n );\n\n computedResult = compute(tokens);\n }\n\n // Criterias are calculated as AND so any `false` breakes the loop as unmeet condition\n if (!computedResult) {\n isMeetCondition = false;\n break\n }\n\n isMeetCondition = true;\n }\n\n if (isMeetCondition) {\n result += range[i];\n }\n }\n\n return result\n}\n\n/**\n * Returns the sum of the products of corresponding array components.\n *\n * Category: Math and trigonometry\n *\n * @returns\n */\nfunction SUMPRODUCT() {\n if (!arguments || arguments.length === 0) {\n return value\n }\n\n const arrays = arguments.length + 1;\n let result = 0;\n let product;\n let k;\n let _i;\n let _ij;\n\n for (let i = 0; i < arguments[0].length; i++) {\n if (!(arguments[0][i] instanceof Array)) {\n product = 1;\n\n for (k = 1; k < arrays; k++) {\n const _i_arg = arguments[k - 1][i];\n\n if (_i_arg instanceof Error) {\n return _i_arg\n }\n\n _i = parseNumber(_i_arg);\n\n if (_i instanceof Error) {\n return _i\n }\n\n product *= _i;\n }\n\n result += product;\n } else {\n for (let j = 0; j < arguments[0][i].length; j++) {\n product = 1;\n\n for (k = 1; k < arrays; k++) {\n const _ij_arg = arguments[k - 1][i][j];\n\n if (_ij_arg instanceof Error) {\n return _ij_arg\n }\n\n _ij = parseNumber(_ij_arg);\n\n if (_ij instanceof Error) {\n return _ij\n }\n\n product *= _ij;\n }\n\n result += product;\n }\n }\n }\n\n return result\n}\n\n/**\n * Returns the sum of the squares of the arguments.\n *\n * Category: Math and trigonometry\n *\n * @param {*} args number1, number2, ... Number1 is required, subsequent numbers are optional. 1 to 255 arguments for which you want the sum of the squares. You can also use a single array or a reference to an array instead of arguments separated by commas.\n * @returns\n */\nfunction SUMSQ() {\n const numbers = parseNumberArray(flatten(arguments));\n\n if (numbers instanceof Error) {\n return numbers\n }\n\n let result = 0;\n const length = numbers.length;\n\n for (let i = 0; i < length; i++) {\n result += ISNUMBER(numbers[i]) ? numbers[i] * numbers[i] : 0;\n }\n\n return result\n}\n\n/**\n * Returns the sum of the difference of squares of corresponding values in two arrays.\n *\n * Category: Math and trigonometry\n *\n * @param {*} array_x The first array or range of values.\n * @param {*} array_y The second array or range of values.\n * @returns\n */\nfunction SUMX2MY2(array_x, array_y) {\n array_x = parseNumberArray(flatten(array_x));\n array_y = parseNumberArray(flatten(array_y));\n\n if (anyIsError(array_x, array_y)) {\n return value\n }\n\n let result = 0;\n\n for (let i = 0; i < array_x.length; i++) {\n result += array_x[i] * array_x[i] - array_y[i] * array_y[i];\n }\n\n return result\n}\n\n/**\n * Returns the sum of the sum of squares of corresponding values in two arrays.\n *\n * Category: Math and trigonometry\n *\n * @param {*} array_x The first array or range of values.\n * @param {*} array_y The second array or range of values.\n * @returns\n */\nfunction SUMX2PY2(array_x, array_y) {\n array_x = parseNumberArray(flatten(array_x));\n array_y = parseNumberArray(flatten(array_y));\n\n if (anyIsError(array_x, array_y)) {\n return value\n }\n\n let result = 0;\n array_x = parseNumberArray(flatten(array_x));\n array_y = parseNumberArray(flatten(array_y));\n\n for (let i = 0; i < array_x.length; i++) {\n result += array_x[i] * array_x[i] + array_y[i] * array_y[i];\n }\n\n return result\n}\n\n/**\n * Returns the sum of squares of differences of corresponding values in two arrays.\n *\n * Category: Math and trigonometry\n *\n * @param {*} array_x The first array or range of values.\n * @param {*} array_y The second array or range of values.\n * @returns\n */\nfunction SUMXMY2(array_x, array_y) {\n array_x = parseNumberArray(flatten(array_x));\n array_y = parseNumberArray(flatten(array_y));\n\n if (anyIsError(array_x, array_y)) {\n return value\n }\n\n let result = 0;\n array_x = flatten(array_x);\n array_y = flatten(array_y);\n\n for (let i = 0; i < array_x.length; i++) {\n result += Math.pow(array_x[i] - array_y[i], 2);\n }\n\n return result\n}\n\n/**\n * Returns the tangent of a number.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number The angle in radians for which you want the tangent.\n * @returns\n */\nfunction TAN(number) {\n number = parseNumber(number);\n\n if (number instanceof Error) {\n return number\n }\n\n return Math.tan(number)\n}\n\n/**\n * Returns the hyperbolic tangent of a number.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number Any real number.\n * @returns\n */\nfunction TANH(number) {\n number = parseNumber(number);\n\n if (number instanceof Error) {\n return number\n }\n\n const e2 = Math.exp(2 * number);\n\n return (e2 - 1) / (e2 + 1)\n}\n\n/**\n * Truncates a number to an integer.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number The number you want to truncate.\n * @param {*} num_digits Optional. A number specifying the precision of the truncation. The default value for num_digits is 0 (zero).\n * @returns\n */\nfunction TRUNC(number, num_digits) {\n number = parseNumber(number);\n num_digits = parseNumber(num_digits);\n const anyError$1 = anyError(number, num_digits);\n\n if (anyError$1) {\n return anyError$1\n }\n\n const sign = number > 0 ? 1 : -1;\n\n return (sign * Math.floor(Math.abs(number) * Math.pow(10, num_digits))) / Math.pow(10, num_digits)\n}\n\n// TODO\n/**\n * -- Not implemented --\n *\n * Changes full-width (double-byte) English letters or katakana within a character string to half-width (single-byte) characters.\n *\n * Category: Text\n *\n * @param {*} text The text or a reference to a value that contains the text you want to change. If text does not contain any full-width letters, text is not changed.\n * @returns\n */\nfunction ASC() {\n throw new Error('ASC is not implemented')\n}\n\n// TODO\n/**\n * -- Not implemented --\n *\n * Converts a number to text, using the ß (baht) currency format.\n *\n * Category: Text\n *\n * @param {*} number A number you want to convert to text, or a reference to a value containing a number, or a formula that evaluates to a number.\n * @returns\n */\nfunction BAHTTEXT() {\n throw new Error('BAHTTEXT is not implemented')\n}\n\n/**\n * Returns the character specified by the code number.\n *\n * Category: Text\n *\n * @param {*} number A number between 1 and 255 specifying which character you want. The character is from the character set used by your computer. Note: Excel for the web supports only CHAR(9), CHAR(10), CHAR(13), and CHAR(32) and above.\n * @returns\n */\nfunction CHAR(number) {\n number = parseNumber(number);\n\n if (number === 0) {\n return value\n }\n\n if (number instanceof Error) {\n return number\n }\n\n return String.fromCharCode(number)\n}\n\n/**\n * Removes all nonprintable characters from text.\n *\n * Category: Text\n *\n * @param {*} text Any worksheet information from which you want to remove nonprintable characters.\n * @returns\n */\nfunction CLEAN(text) {\n if (anyIsError(text)) {\n return text\n }\n\n text = text || '';\n const re = /[\\0-\\x1F]/g;\n\n return text.replace(re, '')\n}\n\n/**\n * Returns a numeric code for the first character in a text string.\n *\n * Category: Text\n *\n * @param {*} text The text for which you want the code of the first character.\n * @returns\n */\nfunction CODE(text) {\n if (anyIsError(text)) {\n return text\n }\n\n text = text || '';\n let result = text.charCodeAt(0);\n\n if (isNaN(result)) {\n result = value;\n }\n\n return result\n}\n\n/**\n * Joins several text items into one text item.\n *\n * Category: Text\n *\n * @returns\n */\nfunction CONCATENATE() {\n const args = flatten(arguments);\n const someError = anyError.apply(undefined, args);\n\n if (someError) {\n return someError\n }\n\n let trueFound = 0;\n\n while ((trueFound = args.indexOf(true)) > -1) {\n args[trueFound] = 'TRUE';\n }\n\n let falseFound = 0;\n\n while ((falseFound = args.indexOf(false)) > -1) {\n args[falseFound] = 'FALSE';\n }\n\n return args.join('')\n}\n\nconst CONCAT = CONCATENATE;\n\n// TODO\n/**\n * -- Not implemented --\n *\n * Changes half-width (single-byte) English letters or katakana within a character string to full-width (double-byte) characters.\n *\n * Category: Text\n *\n * @param {*} text The text or a reference to a value that contains the text you want to change. If text does not contain any half-width English letters or katakana, text is not changed.\n * @returns\n */\nfunction DBCS() {\n throw new Error('DBCS is not implemented')\n}\n\n/**\n * Converts a number to text, using the $ (dollar) currency format.\n *\n * Category: Text\n *\n * @param {*} number A number, a reference to a value containing a number, or a formula that evaluates to a number.\n * @param {*} decimals Optional. The number of digits to the right of the decimal point. If this is negative, the number is rounded to the left of the decimal point. If you omit decimals, it is assumed to be 2.\n * @returns\n */\nfunction DOLLAR(number, decimals = 2) {\n number = parseNumber(number);\n if (isNaN(number)) {\n return value\n }\n\n number = ROUND(number, decimals);\n\n const options = {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: decimals >= 0 ? decimals : 0,\n maximumFractionDigits: decimals >= 0 ? decimals : 0\n };\n\n const formattedNumber = number.toLocaleString('en-US', options);\n\n if (number < 0) {\n return '$(' + formattedNumber.slice(2) + ')'\n }\n\n return formattedNumber\n}\n\n/**\n * Checks to see if two text values are identical.\n *\n * Category: Text\n *\n * @param {*} text1 The first text string.\n * @param {*} text2 The second text string.\n * @returns\n */\nfunction EXACT(text1, text2) {\n if (arguments.length !== 2) {\n return na\n }\n\n const someError = anyError(text1, text2);\n\n if (someError) {\n return someError\n }\n\n text1 = parseString(text1);\n text2 = parseString(text2);\n\n return text1 === text2\n}\n\n/**\n * Locate one text string within a second text string, and return the number of the starting position of the first text string from the first character of the second text string.\n *\n * Category: Text\n *\n * @param {*} find_text The text you want to find.\n * @param {*} within_text The text containing the text you want to find.\n * @param {*} start_num Optional. Specifies the character at which to start the search. The first character in within_text is character number 1. If you omit start_num, it is assumed to be 1.\n * @returns\n */\nfunction FIND(find_text, within_text, start_num) {\n if (arguments.length < 2) {\n return na\n }\n\n find_text = parseString(find_text);\n within_text = parseString(within_text);\n start_num = start_num === undefined ? 0 : start_num;\n const found_index = within_text.indexOf(find_text, start_num - 1);\n\n if (found_index === -1) {\n return value\n }\n\n return found_index + 1\n}\n\n/**\n * Formats a number as text with a fixed number of decimals.\n *\n * Category: Text\n *\n * @param {*} number The number you want to round and convert to text.\n * @param {*} decimals Optional. The number of digits to the right of the decimal point.\n * @param {*} no_commas Optional. A logical value that, if TRUE, prevents FIXED from including commas in the returned text.\n * @returns\n */\nfunction FIXED(number, decimals = 2, no_commas = false) {\n number = parseNumber(number);\n if (isNaN(number)) {\n return value\n }\n\n decimals = parseNumber(decimals);\n if (isNaN(decimals)) {\n return value\n }\n\n if (decimals < 0) {\n const factor = Math.pow(10, -decimals);\n number = Math.round(number / factor) * factor;\n } else {\n number = number.toFixed(decimals);\n }\n\n if (no_commas) {\n number = number.toString().replace(/,/g, '');\n } else {\n const parts = number.toString().split('.');\n parts[0] = parts[0].replace(/\\B(?=(\\d{3})+$)/g, ',');\n number = parts.join('.');\n }\n\n return number\n}\n\n/**\n * Formula.js only\n *\n * @param {*} value\n * @returns\n */\nfunction HTML2TEXT(value) {\n if (anyIsError(value)) {\n return value\n }\n\n let result = '';\n\n if (value) {\n if (value instanceof Array) {\n value.forEach((line) => {\n if (result !== '') {\n result += '\\n';\n }\n\n result += line.replace(/<(?:.|\\n)*?>/gm, '');\n });\n } else {\n result = value.replace(/<(?:.|\\n)*?>/gm, '');\n }\n }\n\n return result\n}\n\n/**\n * Returns the leftmost characters from a text value.\n *\n * Category: Text\n *\n * @param {*} text The text string that contains the characters you want to extract.\n * @param {*} num_chars Optional. Specifies the number of characters you want LEFT to extract.\n * @returns\n */\nfunction LEFT(text, num_chars) {\n const someError = anyError(text, num_chars);\n\n if (someError) {\n return someError\n }\n\n text = parseString(text);\n num_chars = num_chars === undefined ? 1 : num_chars;\n num_chars = parseNumber(num_chars);\n\n if (num_chars instanceof Error || typeof text !== 'string') {\n return value\n }\n\n return text.substring(0, num_chars)\n}\n\n/**\n * Returns the number of characters in a text string\n *\n * Category: Text\n *\n * @param {*} text The text whose length you want to find. Spaces count as characters.\n * @returns\n */\nfunction LEN(text) {\n if (arguments.length === 0) {\n return error\n }\n\n if (text instanceof Error) {\n return text\n }\n\n if (Array.isArray(text)) {\n return value\n }\n\n const textAsString = parseString(text);\n\n return textAsString.length\n}\n\n/**\n * Converts text to lowercase.\n *\n * Category: Text\n *\n * @param {*} text The text you want to convert to lowercase. LOWER does not change characters in text that are not letters.\n * @returns\n */\nfunction LOWER(text) {\n if (arguments.length !== 1) {\n return value\n }\n\n text = parseString(text);\n\n if (anyIsError(text)) {\n return text\n }\n\n return text.toLowerCase()\n}\n\n/**\n * Returns a specific number of characters from a text string starting at the position you specify\n *\n * Category: Text\n *\n * @param {*} text The text string containing the characters you want to extract.\n * @param {*} start_num The position of the first character you want to extract in text. The first character in text has start_num 1, and so on.\n * @param {*} num_chars Specifies the number of characters you want MID to return from text.\n * @returns\n */\nfunction MID(text, start_num, num_chars) {\n if (start_num === undefined || start_num === null) {\n return value\n }\n\n start_num = parseNumber(start_num);\n num_chars = parseNumber(num_chars);\n\n if (anyIsError(start_num, num_chars) || typeof text !== 'string') {\n return num_chars\n }\n\n const begin = start_num - 1;\n const end = begin + num_chars;\n\n return text.substring(begin, end)\n}\n\n// TODO\n/**\n * Converts text to number in a locale-independent manner.\n *\n * Category: Text\n *\n * @param {*} text The text to convert to a number.\n * @param {*} decimal_separator Optional. The character used to separate the integer and fractional part of the result.\n * @param {*} group_separator Optional. The character used to separate groupings of numbers, such as thousands from hundreds and millions from thousands.\n * @returns\n */\nfunction NUMBERVALUE(text, decimal_separator, group_separator) {\n text = isDefined(text) ? text : '';\n\n if (typeof text === 'number') {\n return text\n }\n\n if (typeof text !== 'string') {\n return na\n }\n\n decimal_separator = typeof decimal_separator === 'undefined' ? '.' : decimal_separator;\n group_separator = typeof group_separator === 'undefined' ? ',' : group_separator;\n\n return Number(text.replace(decimal_separator, '.').replace(group_separator, ''))\n}\n\n// TODO\n/**\n * -- Not implemented --\n */\nfunction PRONETIC() {\n throw new Error('PRONETIC is not implemented')\n}\n\n/**\n * Capitalizes the first letter in each word of a text value.\n *\n * Category: Text\n *\n * @param {*} text Text enclosed in quotation marks, a formula that returns text, or a reference to a value containing the text you want to partially capitalize.\n * @returns\n */\nfunction PROPER(text) {\n if (anyIsError(text)) {\n return text\n }\n\n if (isNaN(text) && typeof text === 'number') {\n return value\n }\n\n text = parseString(text);\n\n return text.replace(/\\w\\S*/g, (txt) => txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase())\n}\n\n/**\n * Formula.js only\n *\n * @param {*} text\n * @param {*} regular_expression\n * @returns\n */\nfunction REGEXEXTRACT(text, regular_expression) {\n if (arguments.length < 2) {\n return na\n }\n\n const match = text.match(new RegExp(regular_expression));\n\n return match ? match[match.length > 1 ? match.length - 1 : 0] : null\n}\n\n/**\n * Formula.js only\n *\n * @param {*} text\n * @param {*} regular_expression\n * @param {*} full\n * @returns\n */\nfunction REGEXMATCH(text, regular_expression, full) {\n if (arguments.length < 2) {\n return na\n }\n\n const match = text.match(new RegExp(regular_expression));\n\n return full ? match : !!match\n}\n\n/**\n * Formula.js only\n *\n * @param {*} text\n * @param {*} regular_expression\n * @param {*} replacement\n * @returns\n */\nfunction REGEXREPLACE(text, regular_expression, replacement) {\n if (arguments.length < 3) {\n return na\n }\n\n return text.replace(new RegExp(regular_expression), replacement)\n}\n\n/**\n * Replaces characters within text\n *\n * Category: Text\n *\n * @param {*} old_text Text in which you want to replace some characters.\n * @param {*} num_chars The number of characters in old_text that you want REPLACE to replace with new_text.\n * @param {*} length he number of characters in old_text that you want REPLACEB to replace with new_text.\n * @param {*} new_text he text that will replace characters in old_text.\n * @returns\n */\nfunction REPLACE(old_text, num_chars, length, new_text) {\n num_chars = parseNumber(num_chars);\n length = parseNumber(length);\n\n if (anyIsError(num_chars, length) || typeof old_text !== 'string' || typeof new_text !== 'string') {\n return value\n }\n\n return old_text.substr(0, num_chars - 1) + new_text + old_text.substr(num_chars - 1 + length)\n}\n\n/**\n * Repeats text a given number of times.\n *\n * Category: Text\n *\n * @param {*} text The text you want to repeat.\n * @param {*} number_times A positive number specifying the number of times to repeat text.\n * @returns\n */\nfunction REPT(text, number_times) {\n const someError = anyError(text, number_times);\n\n if (someError) {\n return someError\n }\n\n text = parseString(text);\n number_times = parseNumber(number_times);\n\n if (number_times instanceof Error) {\n return number_times\n }\n\n return new Array(number_times + 1).join(text)\n}\n\n/**\n * Returns the rightmost characters from a text value\n *\n * Category: Text\n *\n * @param {*} text The text string containing the characters you want to extract.\n * @param {*} num_chars Optional. Specifies the number of characters you want RIGHT to extract.\n * @returns\n */\nfunction RIGHT(text, num_chars) {\n const someError = anyError(text, num_chars);\n\n if (someError) {\n return someError\n }\n\n text = parseString(text);\n num_chars = num_chars === undefined ? 1 : num_chars;\n num_chars = parseNumber(num_chars);\n\n if (num_chars instanceof Error) {\n return num_chars\n }\n\n return text.substring(text.length - num_chars)\n}\n\n/**\n * Finds one text value within another (not case-sensitive)\n *\n * Category: Text\n *\n * @param {*} find_text The text that you want to find.\n * @param {*} within_text The text in which you want to search for the value of the find_text argument.\n * @param {*} start_num Optional. The character number in the within_text argument at which you want to start searching.\n * @returns\n */\nfunction SEARCH(find_text, within_text, start_num) {\n let foundAt;\n\n if (typeof find_text !== 'string' || typeof within_text !== 'string') {\n return value\n }\n\n start_num = start_num === undefined ? 0 : start_num;\n foundAt = within_text.toLowerCase().indexOf(find_text.toLowerCase(), start_num - 1) + 1;\n\n return foundAt === 0 ? value : foundAt\n}\n\n/**\n * Formula.js only\n *\n * @param {*} text\n * @param {*} separator\n * @returns\n */\nfunction SPLIT(text, separator) {\n return text.split(separator)\n}\n\n/**\n * Substitutes new text for old text in a text string.\n *\n * Category: Text\n *\n * @param {*} text The text or the reference to a value containing text for which you want to substitute characters.\n * @param {*} old_text The text you want to replace.\n * @param {*} new_text The text you want to replace old_text with.\n * @param {*} instance_num Optional. Specifies which occurrence of old_text you want to replace with new_text. If you specify instance_num, only that instance of old_text is replaced. Otherwise, every occurrence of old_text in text is changed to new_text.\n * @returns\n */\nfunction SUBSTITUTE(text, old_text, new_text, instance_num) {\n if (arguments.length < 3) {\n return na\n }\n\n if (!text || !old_text) {\n return text\n } else if (instance_num === undefined) {\n return text.split(old_text).join(new_text)\n } else {\n instance_num = Math.floor(Number(instance_num));\n\n if (Number.isNaN(instance_num) || instance_num <= 0) {\n return value\n }\n\n let index = 0;\n let i = 0;\n\n while (index > -1 && text.indexOf(old_text, index) > -1) {\n index = text.indexOf(old_text, index + 1);\n i++;\n\n if (index > -1 && i === instance_num) {\n return text.substring(0, index) + new_text + text.substring(index + old_text.length)\n }\n }\n\n return text\n }\n}\n\n/**\n * Converts its arguments to text.\n *\n * Category: Text\n *\n * @param {*} value The value you want to test.\n * @returns\n */\nfunction T(value) {\n if (value instanceof Error) {\n return value\n }\n\n return typeof value === 'string' ? value : ''\n}\n\n/**\n * Formats a number and converts it to text.\n *\n * Category: Text\n *\n * @param {*} number The number you want to format.\n * @param {*} format The format you want to use.\n * @returns\n */\nfunction TEXT(number, format) {\n if (number === undefined || format === undefined) return na\n\n const currencySymbol = format.startsWith('$') ? '$' : '';\n const isPercent = format.endsWith('%');\n format = format.replace(/%/g, '').replace(/\\$/g, '');\n\n // count all 0s after the decimal point\n const decimalPlaces = format.split('.')[1].match(/0/g).length;\n\n const noCommas = !format.includes(',');\n\n if (isPercent) {\n number = number * 100;\n }\n\n number = FIXED(number, decimalPlaces, noCommas);\n\n if (number.startsWith('-')) {\n number = number.replace('-', '');\n number = '-' + currencySymbol + number;\n } else {\n number = currencySymbol + number;\n }\n\n if (isPercent) {\n number = number + '%';\n }\n\n return number\n}\n\n/**\n * Combines the text from multiple ranges and/or strings.\n *\n * Category: Text\n * @param {*} delimiter A text string, either empty, or one or more characters enclosed by double quotes, or a reference to a valid text string. If a number is supplied, it will be treated as text.\n * @param {*} ignore_empty If TRUE, ignores empty values.\n * @param {*} args Text item to be joined. A text string, or array of strings, such as a range of values.\n * @returns\n */\nfunction TEXTJOIN(delimiter, ignore_empty, ...args) {\n if (typeof ignore_empty !== 'boolean') {\n ignore_empty = parseBool(ignore_empty);\n }\n\n if (arguments.length < 3) {\n return na\n }\n\n delimiter = delimiter !== null && delimiter !== undefined ? delimiter : '';\n\n let flatArgs = flatten(args);\n let textToJoin = ignore_empty ? flatArgs.filter((text) => text) : flatArgs;\n\n if (Array.isArray(delimiter)) {\n delimiter = flatten(delimiter);\n\n let chunks = textToJoin.map((item) => [item]);\n let index = 0;\n\n for (let i = 0; i < chunks.length - 1; i++) {\n chunks[i].push(delimiter[index]);\n index++;\n\n if (index === delimiter.length) {\n index = 0;\n }\n }\n\n textToJoin = flatten(chunks);\n\n return textToJoin.join('')\n }\n\n return textToJoin.join(delimiter)\n}\n\n/**\n * Removes spaces from text.\n *\n * Category: Text\n *\n * @param {*} text The text from which you want spaces removed.\n * @returns\n */\nfunction TRIM(text) {\n text = parseString(text);\n\n if (text instanceof Error) {\n return text\n }\n\n return text.replace(/\\s+/g, ' ').trim()\n}\n\nconst UNICHAR = CHAR;\n\nconst UNICODE = CODE;\n\n/**\n * Converts text to uppercase.\n *\n * Category: Text\n *\n * @param {*} text The text you want converted to uppercase. Text can be a reference or text string.\n * @returns\n */\nfunction UPPER(text) {\n text = parseString(text);\n\n if (text instanceof Error) {\n return text\n }\n\n return text.toUpperCase()\n}\n\n/**\n * Converts a text argument to a number.\n *\n * Category: Text\n *\n * @param {*} text The text enclosed in quotation marks or a reference to a value containing the text you want to convert.\n * @returns\n */\nfunction VALUE(text) {\n const anyError$1 = anyError(text);\n\n if (anyError$1) {\n return anyError$1\n }\n\n if (typeof text === 'number') {\n return text\n }\n\n if (!isDefined(text)) {\n text = '';\n }\n\n if (typeof text !== 'string') {\n return value\n }\n\n const isPercent = /(%)$/.test(text) || /^(%)/.test(text);\n text = text.replace(/^[^0-9-]{0,3}/, '');\n text = text.replace(/[^0-9]{0,3}$/, '');\n text = text.replace(/[ ,]/g, '');\n\n if (text === '') {\n return 0\n }\n\n let output = Number(text);\n\n if (isNaN(output)) {\n return value\n }\n\n output = output || 0;\n\n if (isPercent) {\n output = output * 0.01;\n }\n\n return output\n}\n\nfunction isValidBinaryNumber(number) {\n return /^[01]{1,10}$/.test(number)\n}\n\n/**\n * Returns the modified Bessel function In(x).\n *\n * Category: Engineering\n *\n * @param {*} x The value at which to evaluate the function.\n * @param {*} n The order of the Bessel function. If n is not an integer, it is truncated.\n * @returns\n */\nfunction BESSELI(x, n) {\n x = parseNumber(x);\n n = parseNumber(n);\n\n if (anyIsError(x, n)) {\n return value\n }\n\n return bessel.besseli(x, n)\n}\n\n/**\n * Returns the Bessel function Jn(x).\n *\n * Category: Engineering\n *\n * @param {*} x The value at which to evaluate the function.\n * @param {*} n The order of the Bessel function. If n is not an integer, it is truncated.\n * @returns\n */\nfunction BESSELJ(x, n) {\n x = parseNumber(x);\n n = parseNumber(n);\n\n if (anyIsError(x, n)) {\n return value\n }\n\n return bessel.besselj(x, n)\n}\n\n/**\n * Returns the modified Bessel function Kn(x).\n *\n * Category: Engineering\n *\n * @param {*} x The value at which to evaluate the function.\n * @param {*} n The order of the function. If n is not an integer, it is truncated.\n * @returns\n */\nfunction BESSELK(x, n) {\n x = parseNumber(x);\n n = parseNumber(n);\n\n if (anyIsError(x, n)) {\n return value\n }\n\n return bessel.besselk(x, n)\n}\n\n/**\n * Returns the Bessel function Yn(x).\n *\n * Category: Engineering\n *\n * @param {*} x The value at which to evaluate the function.\n * @param {*} n The order of the function. If n is not an integer, it is truncated.\n * @returns\n */\nfunction BESSELY(x, n) {\n x = parseNumber(x);\n n = parseNumber(n);\n\n if (anyIsError(x, n)) {\n return value\n }\n\n return bessel.bessely(x, n)\n}\n\n/**\n * Converts a binary number to decimal.\n *\n * Category: Engineering\n *\n * @param {*} number The binary number you want to convert. Number cannot contain more than 10 characters (10 bits). The most significant bit of number is the sign bit. The remaining 9 bits are magnitude bits. Negative numbers are represented using two's-complement notation.\n * @returns\n */\nfunction BIN2DEC(number) {\n // Return error if number is not binary or contains more than 10 characters (10 digits)\n if (!isValidBinaryNumber(number)) {\n return num\n }\n\n // Convert binary number to decimal\n const result = parseInt(number, 2);\n\n // Handle negative numbers\n const stringified = number.toString();\n\n if (stringified.length === 10 && stringified.substring(0, 1) === '1') {\n return parseInt(stringified.substring(1), 2) - 512\n } else {\n return result\n }\n}\n\n/**\n * Converts a binary number to hexadecimal.\n *\n * Category: Engineering\n *\n * @param {*} number The binary number you want to convert. Number cannot contain more than 10 characters (10 bits). The most significant bit of number is the sign bit. The remaining 9 bits are magnitude bits. Negative numbers are represented using two's-complement notation.\n * @param {*} places Optional. The number of characters to use. If places is omitted, BIN2HEX uses the minimum number of characters necessary. Places is useful for padding the return value with leading 0s (zeros).\n * @returns\n */\nfunction BIN2HEX(number, places) {\n // Return error if number is not binary or contains more than 10 characters (10 digits)\n if (!isValidBinaryNumber(number)) {\n return num\n }\n\n // Ignore places and return a 10-character hexadecimal number if number is negative\n const stringified = number.toString();\n\n if (stringified.length === 10 && stringified.substring(0, 1) === '1') {\n return (1099511627264 + parseInt(stringified.substring(1), 2)).toString(16)\n }\n\n // Convert binary number to hexadecimal\n const result = parseInt(number, 2).toString(16);\n\n // Return hexadecimal number using the minimum number of characters necessary if places is undefined\n if (places === undefined) {\n return result\n } else {\n // Return error if places is nonnumeric\n if (isNaN(places)) {\n return value\n }\n\n // Return error if places is negative\n if (places < 0) {\n return num\n }\n\n // Truncate places in case it is not an integer\n places = Math.floor(places);\n\n // Pad return value with leading 0s (zeros) if necessary (using Underscore.string)\n return places >= result.length ? REPT('0', places - result.length) + result : num\n }\n}\n\n/**\n * Converts a binary number to octal.\n *\n * Category: Engineering\n *\n * @param {*} number The binary number you want to convert. Number cannot contain more than 10 characters (10 bits). The most significant bit of number is the sign bit. The remaining 9 bits are magnitude bits. Negative numbers are represented using two's-complement notation.\n * @param {*} places Optional. The number of characters to use. If places is omitted, BIN2OCT uses the minimum number of characters necessary. Places is useful for padding the return value with leading 0s (zeros).\n * @returns\n */\nfunction BIN2OCT(number, places) {\n // Return error if number is not binary or contains more than 10 characters (10 digits)\n if (!isValidBinaryNumber(number)) {\n return num\n }\n\n // Ignore places and return a 10-character octal number if number is negative\n const stringified = number.toString();\n\n if (stringified.length === 10 && stringified.substring(0, 1) === '1') {\n return (1073741312 + parseInt(stringified.substring(1), 2)).toString(8)\n }\n\n // Convert binary number to octal\n const result = parseInt(number, 2).toString(8);\n\n // Return octal number using the minimum number of characters necessary if places is undefined\n if (places === undefined) {\n return result\n } else {\n // Return error if places is nonnumeric\n if (isNaN(places)) {\n return value\n }\n\n // Return error if places is negative\n if (places < 0) {\n return num\n }\n\n // Truncate places in case it is not an integer\n places = Math.floor(places);\n\n // Pad return value with leading 0s (zeros) if necessary (using Underscore.string)\n return places >= result.length ? REPT('0', places - result.length) + result : num\n }\n}\n\n/**\n * Returns a 'Bitwise And' of two numbers.\n *\n * Category: Engineering\n *\n * @param {*} number1 Must be in decimal form and greater than or equal to 0.\n * @param {*} number2 Must be in decimal form and greater than or equal to 0.\n * @returns\n */\nfunction BITAND(number1, number2) {\n // Return error if either number is a non-numeric value\n number1 = parseNumber(number1);\n number2 = parseNumber(number2);\n\n if (anyIsError(number1, number2)) {\n return value\n }\n\n // Return error if either number is less than 0\n if (number1 < 0 || number2 < 0) {\n return num\n }\n\n // Return error if either number is a non-integer\n if (Math.floor(number1) !== number1 || Math.floor(number2) !== number2) {\n return num\n }\n\n // Return error if either number is greater than (2^48)-1\n if (number1 > 281474976710655 || number2 > 281474976710655) {\n return num\n }\n\n // Return bitwise AND of two numbers\n return number1 & number2\n}\n\n/**\n * Returns a value number shifted left by shift_amount bits.\n *\n * Category: Engineering\n *\n * @param {*} number Number must be an integer greater than or equal to 0.\n * @param {*} shift_amount Shift_amount must be an integer.\n * @returns\n */\nfunction BITLSHIFT(number, shift_amount) {\n number = parseNumber(number);\n shift_amount = parseNumber(shift_amount);\n\n if (anyIsError(number, shift_amount)) {\n return value\n }\n\n // Return error if number is less than 0\n if (number < 0) {\n return num\n }\n\n // Return error if number is a non-integer\n if (Math.floor(number) !== number) {\n return num\n }\n\n // Return error if number is greater than (2^48)-1\n if (number > 281474976710655) {\n return num\n }\n\n // Return error if the absolute value of shift is greater than 53\n if (Math.abs(shift_amount) > 53) {\n return num\n }\n\n // Return number shifted by shift bits to the left or to the right if shift is negative\n return shift_amount >= 0 ? number << shift_amount : number >> -shift_amount\n}\n\n/**\n * Returns a bitwise OR of 2 numbers.\n *\n * Category: Engineering\n *\n * @param {*} number1 Must be in decimal form and greater than or equal to 0.\n * @param {*} number2 Must be in decimal form and greater than or equal to 0.\n * @returns\n */\nfunction BITOR(number1, number2) {\n number1 = parseNumber(number1);\n number2 = parseNumber(number2);\n\n if (anyIsError(number1, number2)) {\n return value\n }\n\n // Return error if either number is less than 0\n if (number1 < 0 || number2 < 0) {\n return num\n }\n\n // Return error if either number is a non-integer\n if (Math.floor(number1) !== number1 || Math.floor(number2) !== number2) {\n return num\n }\n\n // Return error if either number is greater than (2^48)-1\n if (number1 > 281474976710655 || number2 > 281474976710655) {\n return num\n }\n\n // Return bitwise OR of two numbers\n return number1 | number2\n}\n\n/**\n * Returns a value number shifted right by shift_amount bits.\n *\n * Category: Engineering\n *\n * @param {*} number Must be an integer greater than or equal to 0.\n * @param {*} shift_amount Must be an integer.\n * @returns\n */\nfunction BITRSHIFT(number, shift_amount) {\n number = parseNumber(number);\n shift_amount = parseNumber(shift_amount);\n\n if (anyIsError(number, shift_amount)) {\n return value\n }\n\n // Return error if number is less than 0\n if (number < 0) {\n return num\n }\n\n // Return error if number is a non-integer\n if (Math.floor(number) !== number) {\n return num\n }\n\n // Return error if number is greater than (2^48)-1\n if (number > 281474976710655) {\n return num\n }\n\n // Return error if the absolute value of shift is greater than 53\n if (Math.abs(shift_amount) > 53) {\n return num\n }\n\n // Return number shifted by shift bits to the right or to the left if shift is negative\n return shift_amount >= 0 ? number >> shift_amount : number << -shift_amount\n}\n\n/**\n * Returns a bitwise 'Exclusive Or' of two numbers.\n *\n * Category: Engineering\n *\n * @param {*} number1 Must be greater than or equal to 0.\n * @param {*} number2 Must be greater than or equal to 0.\n * @returns\n */\nfunction BITXOR(number1, number2) {\n number1 = parseNumber(number1);\n number2 = parseNumber(number2);\n\n if (anyIsError(number1, number2)) {\n return value\n }\n\n // Return error if either number is less than 0\n if (number1 < 0 || number2 < 0) {\n return num\n }\n\n // Return error if either number is a non-integer\n if (Math.floor(number1) !== number1 || Math.floor(number2) !== number2) {\n return num\n }\n\n // Return error if either number is greater than (2^48)-1\n if (number1 > 281474976710655 || number2 > 281474976710655) {\n return num\n }\n\n // Return bitwise XOR of two numbers\n return number1 ^ number2\n}\n\n/**\n * Converts real and imaginary coefficients into a complex number.\n *\n * Category: Engineering\n *\n * @param {*} real_num The real coefficient of the complex number.\n * @param {*} i_num The imaginary coefficient of the complex number.\n * @param {*} suffix Optional. The suffix for the imaginary component of the complex number. If omitted, suffix is assumed to be \"i\".\n * @returns\n */\nfunction COMPLEX(real_num, i_num, suffix) {\n real_num = parseNumber(real_num);\n i_num = parseNumber(i_num);\n\n if (anyIsError(real_num, i_num)) {\n return real_num\n }\n\n // Set suffix\n suffix = suffix === undefined ? 'i' : suffix;\n\n // Return error if suffix is neither \"i\" nor \"j\"\n if (suffix !== 'i' && suffix !== 'j') {\n return value\n }\n\n // Return complex number\n if (real_num === 0 && i_num === 0) {\n return 0\n } else if (real_num === 0) {\n return i_num === 1 ? suffix : i_num.toString() + suffix\n } else if (i_num === 0) {\n return real_num.toString()\n } else {\n const sign = i_num > 0 ? '+' : '';\n return real_num.toString() + sign + (i_num === 1 ? suffix : i_num.toString() + suffix)\n }\n}\n\n/**\n * Converts a number from one measurement system to another.\n *\n * Category: Engineering\n *\n * @param {*} number is the value in from_units to convert.\n * @param {*} from_unit is the units for number.\n * @param {*} to_unit is the units for the result. CONVERT accepts the following text values (in quotation marks) for from_unit and to_unit.\n * @returns\n */\nfunction CONVERT(number, from_unit, to_unit) {\n number = parseNumber(number);\n\n if (number instanceof Error) {\n return number\n }\n\n // List of units supported by CONVERT and units defined by the International System of Units\n // [Name, Symbol, Alternate symbols, Quantity, ISU, CONVERT, Conversion ratio]\n const units = [\n ['a.u. of action', '?', null, 'action', false, false, 1.05457168181818e-34],\n ['a.u. of charge', 'e', null, 'electric_charge', false, false, 1.60217653141414e-19],\n ['a.u. of energy', 'Eh', null, 'energy', false, false, 4.35974417757576e-18],\n ['a.u. of length', 'a?', null, 'length', false, false, 5.29177210818182e-11],\n ['a.u. of mass', 'm?', null, 'mass', false, false, 9.10938261616162e-31],\n ['a.u. of time', '?/Eh', null, 'time', false, false, 2.41888432650516e-17],\n ['admiralty knot', 'admkn', null, 'speed', false, true, 0.514773333],\n ['ampere', 'A', null, 'electric_current', true, false, 1],\n ['ampere per meter', 'A/m', null, 'magnetic_field_intensity', true, false, 1],\n ['ångström', 'Å', ['ang'], 'length', false, true, 1e-10],\n ['are', 'ar', null, 'area', false, true, 100],\n ['astronomical unit', 'ua', null, 'length', false, false, 1.49597870691667e-11],\n ['bar', 'bar', null, 'pressure', false, false, 100000],\n ['barn', 'b', null, 'area', false, false, 1e-28],\n ['becquerel', 'Bq', null, 'radioactivity', true, false, 1],\n ['bit', 'bit', ['b'], 'information', false, true, 1],\n ['btu', 'BTU', ['btu'], 'energy', false, true, 1055.05585262],\n ['byte', 'byte', null, 'information', false, true, 8],\n ['candela', 'cd', null, 'luminous_intensity', true, false, 1],\n ['candela per square metre', 'cd/m?', null, 'luminance', true, false, 1],\n ['coulomb', 'C', null, 'electric_charge', true, false, 1],\n ['cubic ångström', 'ang3', ['ang^3'], 'volume', false, true, 1e-30],\n ['cubic foot', 'ft3', ['ft^3'], 'volume', false, true, 0.028316846592],\n ['cubic inch', 'in3', ['in^3'], 'volume', false, true, 0.000016387064],\n ['cubic light-year', 'ly3', ['ly^3'], 'volume', false, true, 8.46786664623715e-47],\n ['cubic metre', 'm?', null, 'volume', true, true, 1],\n ['cubic mile', 'mi3', ['mi^3'], 'volume', false, true, 4168181825.44058],\n ['cubic nautical mile', 'Nmi3', ['Nmi^3'], 'volume', false, true, 6352182208],\n ['cubic Pica', 'Pica3', ['Picapt3', 'Pica^3', 'Picapt^3'], 'volume', false, true, 7.58660370370369e-8],\n ['cubic yard', 'yd3', ['yd^3'], 'volume', false, true, 0.764554857984],\n ['cup', 'cup', null, 'volume', false, true, 0.0002365882365],\n ['dalton', 'Da', ['u'], 'mass', false, false, 1.66053886282828e-27],\n ['day', 'd', ['day'], 'time', false, true, 86400],\n ['degree', '°', null, 'angle', false, false, 0.0174532925199433],\n ['degrees Rankine', 'Rank', null, 'temperature', false, true, 0.555555555555556],\n ['dyne', 'dyn', ['dy'], 'force', false, true, 0.00001],\n ['electronvolt', 'eV', ['ev'], 'energy', false, true, 1.60217656514141],\n ['ell', 'ell', null, 'length', false, true, 1.143],\n ['erg', 'erg', ['e'], 'energy', false, true, 1e-7],\n ['farad', 'F', null, 'electric_capacitance', true, false, 1],\n ['fluid ounce', 'oz', null, 'volume', false, true, 0.0000295735295625],\n ['foot', 'ft', null, 'length', false, true, 0.3048],\n ['foot-pound', 'flb', null, 'energy', false, true, 1.3558179483314],\n ['gal', 'Gal', null, 'acceleration', false, false, 0.01],\n ['gallon', 'gal', null, 'volume', false, true, 0.003785411784],\n ['gauss', 'G', ['ga'], 'magnetic_flux_density', false, true, 1],\n ['grain', 'grain', null, 'mass', false, true, 0.0000647989],\n ['gram', 'g', null, 'mass', false, true, 0.001],\n ['gray', 'Gy', null, 'absorbed_dose', true, false, 1],\n ['gross registered ton', 'GRT', ['regton'], 'volume', false, true, 2.8316846592],\n ['hectare', 'ha', null, 'area', false, true, 10000],\n ['henry', 'H', null, 'inductance', true, false, 1],\n ['hertz', 'Hz', null, 'frequency', true, false, 1],\n ['horsepower', 'HP', ['h'], 'power', false, true, 745.69987158227],\n ['horsepower-hour', 'HPh', ['hh', 'hph'], 'energy', false, true, 2684519.538],\n ['hour', 'h', ['hr'], 'time', false, true, 3600],\n ['imperial gallon (U.K.)', 'uk_gal', null, 'volume', false, true, 0.00454609],\n ['imperial hundredweight', 'lcwt', ['uk_cwt', 'hweight'], 'mass', false, true, 50.802345],\n ['imperial quart (U.K)', 'uk_qt', null, 'volume', false, true, 0.0011365225],\n ['imperial ton', 'brton', ['uk_ton', 'LTON'], 'mass', false, true, 1016.046909],\n ['inch', 'in', null, 'length', false, true, 0.0254],\n ['international acre', 'uk_acre', null, 'area', false, true, 4046.8564224],\n ['IT calorie', 'cal', null, 'energy', false, true, 4.1868],\n ['joule', 'J', null, 'energy', true, true, 1],\n ['katal', 'kat', null, 'catalytic_activity', true, false, 1],\n ['kelvin', 'K', ['kel'], 'temperature', true, true, 1],\n ['kilogram', 'kg', null, 'mass', true, true, 1],\n ['knot', 'kn', null, 'speed', false, true, 0.514444444444444],\n ['light-year', 'ly', null, 'length', false, true, 9460730472580800],\n ['litre', 'L', ['l', 'lt'], 'volume', false, true, 0.001],\n ['lumen', 'lm', null, 'luminous_flux', true, false, 1],\n ['lux', 'lx', null, 'illuminance', true, false, 1],\n ['maxwell', 'Mx', null, 'magnetic_flux', false, false, 1e-18],\n ['measurement ton', 'MTON', null, 'volume', false, true, 1.13267386368],\n ['meter per hour', 'm/h', ['m/hr'], 'speed', false, true, 0.00027777777777778],\n ['meter per second', 'm/s', ['m/sec'], 'speed', true, true, 1],\n ['meter per second squared', 'm?s??', null, 'acceleration', true, false, 1],\n ['parsec', 'pc', ['parsec'], 'length', false, true, 30856775814671900],\n ['meter squared per second', 'm?/s', null, 'kinematic_viscosity', true, false, 1],\n ['metre', 'm', null, 'length', true, true, 1],\n ['miles per hour', 'mph', null, 'speed', false, true, 0.44704],\n ['millimetre of mercury', 'mmHg', null, 'pressure', false, false, 133.322],\n ['minute', '?', null, 'angle', false, false, 0.000290888208665722],\n ['minute', 'min', ['mn'], 'time', false, true, 60],\n ['modern teaspoon', 'tspm', null, 'volume', false, true, 0.000005],\n ['mole', 'mol', null, 'amount_of_substance', true, false, 1],\n ['morgen', 'Morgen', null, 'area', false, true, 2500],\n ['n.u. of action', '?', null, 'action', false, false, 1.05457168181818e-34],\n ['n.u. of mass', 'm?', null, 'mass', false, false, 9.10938261616162e-31],\n ['n.u. of speed', 'c?', null, 'speed', false, false, 299792458],\n ['n.u. of time', '?/(me?c??)', null, 'time', false, false, 1.28808866778687e-21],\n ['nautical mile', 'M', ['Nmi'], 'length', false, true, 1852],\n ['newton', 'N', null, 'force', true, true, 1],\n ['œrsted', 'Oe ', null, 'magnetic_field_intensity', false, false, 79.5774715459477],\n ['ohm', 'Ω', null, 'electric_resistance', true, false, 1],\n ['ounce mass', 'ozm', null, 'mass', false, true, 0.028349523125],\n ['pascal', 'Pa', null, 'pressure', true, false, 1],\n ['pascal second', 'Pa?s', null, 'dynamic_viscosity', true, false, 1],\n ['pferdestärke', 'PS', null, 'power', false, true, 735.49875],\n ['phot', 'ph', null, 'illuminance', false, false, 0.0001],\n ['pica (1/6 inch)', 'pica', null, 'length', false, true, 0.00035277777777778],\n ['pica (1/72 inch)', 'Pica', ['Picapt'], 'length', false, true, 0.00423333333333333],\n ['poise', 'P', null, 'dynamic_viscosity', false, false, 0.1],\n ['pond', 'pond', null, 'force', false, true, 0.00980665],\n ['pound force', 'lbf', null, 'force', false, true, 4.4482216152605],\n ['pound mass', 'lbm', null, 'mass', false, true, 0.45359237],\n ['quart', 'qt', null, 'volume', false, true, 0.000946352946],\n ['radian', 'rad', null, 'angle', true, false, 1],\n ['second', '?', null, 'angle', false, false, 0.00000484813681109536],\n ['second', 's', ['sec'], 'time', true, true, 1],\n ['short hundredweight', 'cwt', ['shweight'], 'mass', false, true, 45.359237],\n ['siemens', 'S', null, 'electrical_conductance', true, false, 1],\n ['sievert', 'Sv', null, 'equivalent_dose', true, false, 1],\n ['slug', 'sg', null, 'mass', false, true, 14.59390294],\n ['square ångström', 'ang2', ['ang^2'], 'area', false, true, 1e-20],\n ['square foot', 'ft2', ['ft^2'], 'area', false, true, 0.09290304],\n ['square inch', 'in2', ['in^2'], 'area', false, true, 0.00064516],\n ['square light-year', 'ly2', ['ly^2'], 'area', false, true, 8.95054210748189e31],\n ['square meter', 'm?', null, 'area', true, true, 1],\n ['square mile', 'mi2', ['mi^2'], 'area', false, true, 2589988.110336],\n ['square nautical mile', 'Nmi2', ['Nmi^2'], 'area', false, true, 3429904],\n ['square Pica', 'Pica2', ['Picapt2', 'Pica^2', 'Picapt^2'], 'area', false, true, 0.00001792111111111],\n ['square yard', 'yd2', ['yd^2'], 'area', false, true, 0.83612736],\n ['statute mile', 'mi', null, 'length', false, true, 1609.344],\n ['steradian', 'sr', null, 'solid_angle', true, false, 1],\n ['stilb', 'sb', null, 'luminance', false, false, 0.0001],\n ['stokes', 'St', null, 'kinematic_viscosity', false, false, 0.0001],\n ['stone', 'stone', null, 'mass', false, true, 6.35029318],\n ['tablespoon', 'tbs', null, 'volume', false, true, 0.0000147868],\n ['teaspoon', 'tsp', null, 'volume', false, true, 0.00000492892],\n ['tesla', 'T', null, 'magnetic_flux_density', true, true, 1],\n ['thermodynamic calorie', 'c', null, 'energy', false, true, 4.184],\n ['ton', 'ton', null, 'mass', false, true, 907.18474],\n ['tonne', 't', null, 'mass', false, false, 1000],\n ['U.K. pint', 'uk_pt', null, 'volume', false, true, 0.00056826125],\n ['U.S. bushel', 'bushel', null, 'volume', false, true, 0.03523907],\n ['U.S. oil barrel', 'barrel', null, 'volume', false, true, 0.158987295],\n ['U.S. pint', 'pt', ['us_pt'], 'volume', false, true, 0.000473176473],\n ['U.S. survey mile', 'survey_mi', null, 'length', false, true, 1609.347219],\n ['U.S. survey/statute acre', 'us_acre', null, 'area', false, true, 4046.87261],\n ['volt', 'V', null, 'voltage', true, false, 1],\n ['watt', 'W', null, 'power', true, true, 1],\n ['watt-hour', 'Wh', ['wh'], 'energy', false, true, 3600],\n ['weber', 'Wb', null, 'magnetic_flux', true, false, 1],\n ['yard', 'yd', null, 'length', false, true, 0.9144],\n ['year', 'yr', null, 'time', false, true, 31557600]\n ];\n\n // Binary prefixes\n // [Name, Prefix power of 2 value, Previx value, Abbreviation, Derived from]\n const binary_prefixes = {\n Yi: ['yobi', 80, 1208925819614629174706176, 'Yi', 'yotta'],\n Zi: ['zebi', 70, 1180591620717411303424, 'Zi', 'zetta'],\n Ei: ['exbi', 60, 1152921504606846976, 'Ei', 'exa'],\n Pi: ['pebi', 50, 1125899906842624, 'Pi', 'peta'],\n Ti: ['tebi', 40, 1099511627776, 'Ti', 'tera'],\n Gi: ['gibi', 30, 1073741824, 'Gi', 'giga'],\n Mi: ['mebi', 20, 1048576, 'Mi', 'mega'],\n ki: ['kibi', 10, 1024, 'ki', 'kilo']\n };\n\n // Unit prefixes\n // [Name, Multiplier, Abbreviation]\n const unit_prefixes = {\n Y: ['yotta', 1e24, 'Y'],\n Z: ['zetta', 1e21, 'Z'],\n E: ['exa', 1e18, 'E'],\n P: ['peta', 1e15, 'P'],\n T: ['tera', 1e12, 'T'],\n G: ['giga', 1e9, 'G'],\n M: ['mega', 1e6, 'M'],\n k: ['kilo', 1e3, 'k'],\n h: ['hecto', 1e2, 'h'],\n e: ['dekao', 1e1, 'e'],\n d: ['deci', 1e-1, 'd'],\n c: ['centi', 1e-2, 'c'],\n m: ['milli', 1e-3, 'm'],\n u: ['micro', 1e-6, 'u'],\n n: ['nano', 1e-9, 'n'],\n p: ['pico', 1e-12, 'p'],\n f: ['femto', 1e-15, 'f'],\n a: ['atto', 1e-18, 'a'],\n z: ['zepto', 1e-21, 'z'],\n y: ['yocto', 1e-24, 'y']\n };\n\n // Initialize units and multipliers\n let from = null;\n let to = null;\n let base_from_unit = from_unit;\n let base_to_unit = to_unit;\n let from_multiplier = 1;\n let to_multiplier = 1;\n let alt;\n\n // Lookup from and to units\n for (let i = 0; i < units.length; i++) {\n alt = units[i][2] === null ? [] : units[i][2];\n\n if (units[i][1] === base_from_unit || alt.indexOf(base_from_unit) >= 0) {\n from = units[i];\n }\n\n if (units[i][1] === base_to_unit || alt.indexOf(base_to_unit) >= 0) {\n to = units[i];\n }\n }\n\n // Lookup from prefix\n if (from === null) {\n const from_binary_prefix = binary_prefixes[from_unit.substring(0, 2)];\n let from_unit_prefix = unit_prefixes[from_unit.substring(0, 1)];\n\n // Handle dekao unit prefix (only unit prefix with two characters)\n if (from_unit.substring(0, 2) === 'da') {\n from_unit_prefix = ['dekao', 1e1, 'da'];\n }\n\n // Handle binary prefixes first (so that 'Yi' is processed before 'Y')\n if (from_binary_prefix) {\n from_multiplier = from_binary_prefix[2];\n base_from_unit = from_unit.substring(2);\n } else if (from_unit_prefix) {\n from_multiplier = from_unit_prefix[1];\n base_from_unit = from_unit.substring(from_unit_prefix[2].length);\n }\n\n // Lookup from unit\n for (let j = 0; j < units.length; j++) {\n alt = units[j][2] === null ? [] : units[j][2];\n\n if (units[j][1] === base_from_unit || alt.indexOf(base_from_unit) >= 0) {\n from = units[j];\n }\n }\n }\n\n // Lookup to prefix\n if (to === null) {\n const to_binary_prefix = binary_prefixes[to_unit.substring(0, 2)];\n let to_unit_prefix = unit_prefixes[to_unit.substring(0, 1)];\n\n // Handle dekao unit prefix (only unit prefix with two characters)\n if (to_unit.substring(0, 2) === 'da') {\n to_unit_prefix = ['dekao', 1e1, 'da'];\n }\n\n // Handle binary prefixes first (so that 'Yi' is processed before 'Y')\n if (to_binary_prefix) {\n to_multiplier = to_binary_prefix[2];\n base_to_unit = to_unit.substring(2);\n } else if (to_unit_prefix) {\n to_multiplier = to_unit_prefix[1];\n base_to_unit = to_unit.substring(to_unit_prefix[2].length);\n }\n\n // Lookup to unit\n for (let k = 0; k < units.length; k++) {\n alt = units[k][2] === null ? [] : units[k][2];\n\n if (units[k][1] === base_to_unit || alt.indexOf(base_to_unit) >= 0) {\n to = units[k];\n }\n }\n }\n\n // Return error if a unit does not exist\n if (from === null || to === null) {\n return na\n }\n\n // Return error if units represent different quantities\n if (from[3] !== to[3]) {\n return na\n }\n\n // Return converted number\n return (number * from[6] * from_multiplier) / (to[6] * to_multiplier)\n}\n\n/**\n * Converts a decimal number to binary.\n *\n * Category: Engineering\n *\n * @param {*} number The decimal integer you want to convert. If number is negative, valid place values are ignored and DEC2BIN returns a 10-character (10-bit) binary number in which the most significant bit is the sign bit. The remaining 9 bits are magnitude bits. Negative numbers are represented using two's-complement notation.\n * @param {*} places Optional. The number of characters to use. If places is omitted, DEC2BIN uses the minimum number of characters necessary. Places is useful for padding the return value with leading 0s (zeros).\n * @returns\n */\nfunction DEC2BIN(number, places) {\n number = parseNumber(number);\n\n if (number instanceof Error) {\n return number\n }\n\n // Return error if number is not decimal, is lower than -512, or is greater than 511\n if (!/^-?[0-9]{1,3}$/.test(number) || number < -512 || number > 511) {\n return num\n }\n\n // Ignore places and return a 10-character binary number if number is negative\n if (number < 0) {\n return '1' + REPT('0', 9 - (512 + number).toString(2).length) + (512 + number).toString(2)\n }\n\n // Convert decimal number to binary\n const result = parseInt(number, 10).toString(2);\n\n // Return binary number using the minimum number of characters necessary if places is undefined\n if (typeof places === 'undefined') {\n return result\n } else {\n // Return error if places is nonnumeric\n if (isNaN(places)) {\n return value\n }\n\n // Return error if places is negative\n if (places < 0) {\n return num\n }\n\n // Truncate places in case it is not an integer\n places = Math.floor(places);\n\n // Pad return value with leading 0s (zeros) if necessary (using Underscore.string)\n return places >= result.length ? REPT('0', places - result.length) + result : num\n }\n}\n\n/**\n * Converts a decimal number to hexadecimal.\n *\n * Category: Engineering\n *\n * @param {*} number The decimal integer you want to convert. If number is negative, places is ignored and DEC2HEX returns a 10-character (40-bit) hexadecimal number in which the most significant bit is the sign bit. The remaining 39 bits are magnitude bits. Negative numbers are represented using two's-complement notation.\n * @param {*} places Optional. The number of characters to use. If places is omitted, DEC2HEX uses the minimum number of characters necessary. Places is useful for padding the return value with leading 0s (zeros).\n * @returns\n */\nfunction DEC2HEX(number, places) {\n number = parseNumber(number);\n\n if (number instanceof Error) {\n return number\n }\n\n // Return error if number is not decimal, is lower than -549755813888, or is greater than 549755813887\n if (!/^-?[0-9]{1,12}$/.test(number) || number < -549755813888 || number > 549755813887) {\n return num\n }\n\n // Ignore places and return a 10-character hexadecimal number if number is negative\n if (number < 0) {\n return (1099511627776 + number).toString(16)\n }\n\n // Convert decimal number to hexadecimal\n const result = parseInt(number, 10).toString(16);\n\n // Return hexadecimal number using the minimum number of characters necessary if places is undefined\n if (typeof places === 'undefined') {\n return result\n } else {\n // Return error if places is nonnumeric\n if (isNaN(places)) {\n return value\n }\n\n // Return error if places is negative\n if (places < 0) {\n return num\n }\n\n // Truncate places in case it is not an integer\n places = Math.floor(places);\n\n // Pad return value with leading 0s (zeros) if necessary (using Underscore.string)\n return places >= result.length ? REPT('0', places - result.length) + result : num\n }\n}\n\n/**\n * Converts a decimal number to octal.\n *\n * Category: Engineering\n *\n * @param {*} number The decimal integer you want to convert. If number is negative, places is ignored and DEC2OCT returns a 10-character (30-bit) octal number in which the most significant bit is the sign bit. The remaining 29 bits are magnitude bits. Negative numbers are represented using two's-complement notation.\n * @param {*} places Optional. The number of characters to use. If places is omitted, DEC2OCT uses the minimum number of characters necessary. Places is useful for padding the return value with leading 0s (zeros).\n * @returns\n */\nfunction DEC2OCT(number, places) {\n number = parseNumber(number);\n\n if (number instanceof Error) {\n return number\n }\n\n // Return error if number is not decimal, is lower than -549755813888, or is greater than 549755813887\n if (!/^-?[0-9]{1,9}$/.test(number) || number < -536870912 || number > 536870911) {\n return num\n }\n\n // Ignore places and return a 10-character octal number if number is negative\n if (number < 0) {\n return (1073741824 + number).toString(8)\n }\n\n // Convert decimal number to octal\n const result = parseInt(number, 10).toString(8);\n\n // Return octal number using the minimum number of characters necessary if places is undefined\n if (typeof places === 'undefined') {\n return result\n } else {\n // Return error if places is nonnumeric\n if (isNaN(places)) {\n return value\n }\n\n // Return error if places is negative\n if (places < 0) {\n return num\n }\n\n // Truncate places in case it is not an integer\n places = Math.floor(places);\n\n // Pad return value with leading 0s (zeros) if necessary (using Underscore.string)\n return places >= result.length ? REPT('0', places - result.length) + result : num\n }\n}\n\n/**\n * Tests whether two values are equal.\n *\n * Category: Engineering\n *\n * @param {*} number1 The first number.\n * @param {*} number2 Optional. The second number. If omitted, number2 is assumed to be zero.\n * @returns\n */\nfunction DELTA(number1, number2) {\n // Set number2 to zero if undefined\n number2 = number2 === undefined ? 0 : number2;\n number1 = parseNumber(number1);\n number2 = parseNumber(number2);\n\n if (anyIsError(number1, number2)) {\n return value\n }\n\n // Return delta\n return number1 === number2 ? 1 : 0\n}\n\n// TODO: why is upper_bound not used ? The excel documentation has no examples with upper_bound\n/**\n * Returns the error function.\n *\n * Category: Engineering\n *\n * @param {*} lower_limit The lower bound for integrating ERF.\n * @param {*} upper_limit Optional. The upper bound for integrating ERF. If omitted, ERF integrates between zero and lower_limit.\n * @returns\n */\nfunction ERF(lower_limit, upper_limit) {\n // Set number2 to zero if undefined\n upper_limit = upper_limit === undefined ? 0 : upper_limit;\n\n lower_limit = parseNumber(lower_limit);\n upper_limit = parseNumber(upper_limit);\n\n if (anyIsError(lower_limit, upper_limit)) {\n return value\n }\n\n return jStat.erf(lower_limit)\n}\n\n// TODO\n\n/**\n * -- Not implemented --\n *\n * Returns the error function.\n *\n * Category: Engineering\n *\n * @param {*} x The lower bound for integrating ERF.PRECISE.\n * @returns\n */\nERF.PRECISE = () => {\n throw new Error('ERF.PRECISE is not implemented')\n};\n\n/**\n * Returns the complementary error function.\n *\n * Category: Engineering\n *\n * @param {*} x The lower bound for integrating ERFC.\n * @returns\n */\nfunction ERFC(x) {\n // Return error if x is not a number\n if (isNaN(x)) {\n return value\n }\n\n return jStat.erfc(x)\n}\n\n// TODO\n\n/**\n * -- Not implemented --\n *\n * Returns the complementary ERF function integrated between x and infinity.\n *\n * Category: Engineering\n *\n * @param {*} x The lower bound for integrating ERFC.PRECISE.\n * @returns\n */\nERFC.PRECISE = () => {\n throw new Error('ERFC.PRECISE is not implemented')\n};\n\n/**\n * Tests whether a number is greater than a threshold value.\n *\n * Category: Engineering\n *\n * @param {*} number The value to test against step.\n * @param {*} step Optional. The threshold value. If you omit a value for step, GESTEP uses zero.\n * @returns\n */\nfunction GESTEP(number, step) {\n step = step || 0;\n number = parseNumber(number);\n\n if (anyIsError(step, number)) {\n return number\n }\n\n // Return delta\n return number >= step ? 1 : 0\n}\n\n/**\n * Converts a hexadecimal number to binary.\n *\n * Category: Engineering\n *\n * @param {*} number The hexadecimal number you want to convert. Number cannot contain more than 10 characters. The most significant bit of number is the sign bit (40th bit from the right). The remaining 9 bits are magnitude bits. Negative numbers are represented using two's-complement notation.\n * @param {*} places Optional. The number of characters to use. If places is omitted, HEX2BIN uses the minimum number of characters necessary. Places is useful for padding the return value with leading 0s (zeros).\n * @returns\n */\nfunction HEX2BIN(number, places) {\n // Return error if number is not hexadecimal or contains more than ten characters (10 digits)\n if (!/^[0-9A-Fa-f]{1,10}$/.test(number)) {\n return num\n }\n\n // Check if number is negative\n const negative = !!(number.length === 10 && number.substring(0, 1).toLowerCase() === 'f');\n\n // Convert hexadecimal number to decimal\n const decimal = negative ? parseInt(number, 16) - 1099511627776 : parseInt(number, 16);\n\n // Return error if number is lower than -512 or greater than 511\n if (decimal < -512 || decimal > 511) {\n return num\n }\n\n // Ignore places and return a 10-character binary number if number is negative\n if (negative) {\n return '1' + REPT('0', 9 - (512 + decimal).toString(2).length) + (512 + decimal).toString(2)\n }\n\n // Convert decimal number to binary\n const result = decimal.toString(2);\n\n // Return binary number using the minimum number of characters necessary if places is undefined\n if (places === undefined) {\n return result\n } else {\n // Return error if places is nonnumeric\n if (isNaN(places)) {\n return value\n }\n\n // Return error if places is negative\n if (places < 0) {\n return num\n }\n\n // Truncate places in case it is not an integer\n places = Math.floor(places);\n\n // Pad return value with leading 0s (zeros) if necessary (using Underscore.string)\n return places >= result.length ? REPT('0', places - result.length) + result : num\n }\n}\n\n/**\n * Converts a hexadecimal number to decimal.\n *\n * Category: Engineering\n *\n * @param {*} number The hexadecimal number you want to convert. Number cannot contain more than 10 characters (40 bits). The most significant bit of number is the sign bit. The remaining 39 bits are magnitude bits. Negative numbers are represented using two's-complement notation.\n * @returns\n */\nfunction HEX2DEC(number) {\n // Return error if number is not hexadecimal or contains more than ten characters (10 digits)\n if (!/^[0-9A-Fa-f]{1,10}$/.test(number)) {\n return num\n }\n\n // Convert hexadecimal number to decimal\n const decimal = parseInt(number, 16);\n\n // Return decimal number\n return decimal >= 549755813888 ? decimal - 1099511627776 : decimal\n}\n\n/**\n * Converts a hexadecimal number to octal.\n *\n * Category: Engineering\n *\n * @param {*} number The hexadecimal number you want to convert. Number cannot contain more than 10 characters. The most significant bit of number is the sign bit. The remaining 39 bits are magnitude bits. Negative numbers are represented using two's-complement notation.\n * @param {*} places Optional. The number of characters to use. If places is omitted, HEX2OCT uses the minimum number of characters necessary. Places is useful for padding the return value with leading 0s (zeros).\n * @returns\n */\nfunction HEX2OCT(number, places) {\n // Return error if number is not hexadecimal or contains more than ten characters (10 digits)\n if (!/^[0-9A-Fa-f]{1,10}$/.test(number)) {\n return num\n }\n\n // Convert hexadecimal number to decimal\n const decimal = parseInt(number, 16);\n\n // Return error if number is positive and greater than 0x1fffffff (536870911)\n if (decimal > 536870911 && decimal < 1098974756864) {\n return num\n }\n\n // Ignore places and return a 10-character octal number if number is negative\n if (decimal >= 1098974756864) {\n return (decimal - 1098437885952).toString(8)\n }\n\n // Convert decimal number to octal\n const result = decimal.toString(8);\n\n // Return octal number using the minimum number of characters necessary if places is undefined\n if (places === undefined) {\n return result\n } else {\n // Return error if places is nonnumeric\n if (isNaN(places)) {\n return value\n }\n\n // Return error if places is negative\n if (places < 0) {\n return num\n }\n\n // Truncate places in case it is not an integer\n places = Math.floor(places);\n\n // Pad return value with leading 0s (zeros) if necessary (using Underscore.string)\n return places >= result.length ? REPT('0', places - result.length) + result : num\n }\n}\n\n/**\n * Returns the absolute value (modulus) of a complex number.\n *\n * Category: Engineering\n *\n * @param {*} inumber A complex number for which you want the absolute value.\n * @returns\n */\nfunction IMABS(inumber) {\n // Lookup real and imaginary coefficients using exports.js [http://formulajs.org]\n const x = IMREAL(inumber);\n const y = IMAGINARY(inumber);\n\n // Return error if either coefficient is not a number\n if (anyIsError(x, y)) {\n return value\n }\n\n // Return absolute value of complex number\n return Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2))\n}\n\n/**\n * Returns the imaginary coefficient of a complex number.\n *\n * Category: Engineering\n *\n * @param {*} inumber A complex number for which you want the imaginary coefficient.\n * @returns\n */\nfunction IMAGINARY(inumber) {\n if (inumber === undefined || inumber === true || inumber === false) {\n return value\n }\n\n // Return 0 if inumber is equal to 0\n if (inumber === 0 || inumber === '0') {\n return 0\n }\n\n // Handle special cases\n if (['i', 'j'].indexOf(inumber) >= 0) {\n return 1\n }\n\n // Force string type\n inumber = inumber + '';\n\n // Normalize imaginary coefficient\n inumber = inumber.replace('+i', '+1i').replace('-i', '-1i').replace('+j', '+1j').replace('-j', '-1j');\n\n // Lookup sign\n let plus = inumber.indexOf('+');\n let minus = inumber.indexOf('-');\n\n if (plus === 0) {\n plus = inumber.indexOf('+', 1);\n }\n\n if (minus === 0) {\n minus = inumber.indexOf('-', 1);\n }\n\n // Lookup imaginary unit\n const last = inumber.substring(inumber.length - 1, inumber.length);\n const unit = last === 'i' || last === 'j';\n\n if (plus >= 0 || minus >= 0) {\n // Return error if imaginary unit is neither i nor j\n if (!unit) {\n return num\n }\n\n // Return imaginary coefficient of complex number\n if (plus >= 0) {\n return isNaN(inumber.substring(0, plus)) || isNaN(inumber.substring(plus + 1, inumber.length - 1))\n ? num\n : Number(inumber.substring(plus + 1, inumber.length - 1))\n } else {\n return isNaN(inumber.substring(0, minus)) || isNaN(inumber.substring(minus + 1, inumber.length - 1))\n ? num\n : -Number(inumber.substring(minus + 1, inumber.length - 1))\n }\n } else {\n if (unit) {\n return isNaN(inumber.substring(0, inumber.length - 1)) ? num : inumber.substring(0, inumber.length - 1)\n } else {\n return isNaN(inumber) ? num : 0\n }\n }\n}\n\n/**\n * Returns the argument theta, an angle expressed in radians.\n *\n * Category: Engineering\n *\n * @param {*} inumber A complex number for which you want the argument .\n * @returns\n */\nfunction IMARGUMENT(inumber) {\n // Lookup real and imaginary coefficients using exports.js [http://formulajs.org]\n const x = IMREAL(inumber);\n const y = IMAGINARY(inumber);\n\n // Return error if either coefficient is not a number\n if (anyIsError(x, y)) {\n return value\n }\n\n // Return error if inumber is equal to zero\n if (x === 0 && y === 0) {\n return div0\n }\n\n // Return PI/2 if x is equal to zero and y is positive\n if (x === 0 && y > 0) {\n return Math.PI / 2\n }\n\n // Return -PI/2 if x is equal to zero and y is negative\n if (x === 0 && y < 0) {\n return -Math.PI / 2\n }\n\n // Return zero if x is negative and y is equal to zero\n if (y === 0 && x > 0) {\n return 0\n }\n\n // Return zero if x is negative and y is equal to zero\n if (y === 0 && x < 0) {\n return -Math.PI\n }\n\n // Return argument of complex number\n if (x > 0) {\n return Math.atan(y / x)\n } else if (x < 0 && y >= 0) {\n return Math.atan(y / x) + Math.PI\n } else {\n return Math.atan(y / x) - Math.PI\n }\n}\n\n/**\n * Returns the complex conjugate of a complex number.\n *\n * Category: Engineering\n *\n * @param {*} inumber A complex number for which you want the conjugate.\n * @returns\n */\nfunction IMCONJUGATE(inumber) {\n // Lookup real and imaginary coefficients using exports.js [http://formulajs.org]\n const x = IMREAL(inumber);\n const y = IMAGINARY(inumber);\n\n if (anyIsError(x, y)) {\n return value\n }\n\n // Lookup imaginary unit\n let unit = inumber.substring(inumber.length - 1);\n unit = unit === 'i' || unit === 'j' ? unit : 'i';\n\n // Return conjugate of complex number\n return y !== 0 ? COMPLEX(x, -y, unit) : inumber\n}\n\n/**\n * Returns the cosine of a complex number.\n *\n * Category: Engineering\n *\n * @param {*} inumber A complex number for which you want the cosine.\n * @returns\n */\nfunction IMCOS(inumber) {\n // Lookup real and imaginary coefficients using exports.js [http://formulajs.org]\n const x = IMREAL(inumber);\n const y = IMAGINARY(inumber);\n\n if (anyIsError(x, y)) {\n return value\n }\n\n // Lookup imaginary unit\n let unit = inumber.substring(inumber.length - 1);\n unit = unit === 'i' || unit === 'j' ? unit : 'i';\n\n // Return cosine of complex number\n return COMPLEX(\n (Math.cos(x) * (Math.exp(y) + Math.exp(-y))) / 2,\n (-Math.sin(x) * (Math.exp(y) - Math.exp(-y))) / 2,\n unit\n )\n}\n\n/**\n * Returns the hyperbolic cosine of a complex number.\n *\n * Category: Engineering\n *\n * @param {*} inumber A complex number for which you want the hyperbolic cosine.\n * @returns\n */\nfunction IMCOSH(inumber) {\n // Lookup real and imaginary coefficients using exports.js [http://formulajs.org]\n const x = IMREAL(inumber);\n const y = IMAGINARY(inumber);\n\n if (anyIsError(x, y)) {\n return value\n }\n\n // Lookup imaginary unit\n let unit = inumber.substring(inumber.length - 1);\n unit = unit === 'i' || unit === 'j' ? unit : 'i';\n\n // Return hyperbolic cosine of complex number\n return COMPLEX(\n (Math.cos(y) * (Math.exp(x) + Math.exp(-x))) / 2,\n (Math.sin(y) * (Math.exp(x) - Math.exp(-x))) / 2,\n unit\n )\n}\n\n/**\n * Returns the cotangent of a complex number.\n *\n * Category: Engineering\n *\n * @param {*} inumber A complex number for which you want the cotangent.\n * @returns\n */\nfunction IMCOT(inumber) {\n // Lookup real and imaginary coefficients using Formula.js [http://formulajs.org]\n const x = IMREAL(inumber);\n const y = IMAGINARY(inumber);\n\n if (anyIsError(x, y)) {\n return value\n }\n\n // Return cotangent of complex number\n return IMDIV(IMCOS(inumber), IMSIN(inumber))\n}\n\n/**\n * Returns the quotient of two complex numbers.\n *\n * Category: Engineering\n *\n * @param {*} inumber1 The complex numerator or dividend.\n * @param {*} inumber2 The complex denominator or divisor.\n * @returns\n */\nfunction IMDIV(inumber1, inumber2) {\n // Lookup real and imaginary coefficients using Formula.js [http://formulajs.org]\n const a = IMREAL(inumber1);\n const b = IMAGINARY(inumber1);\n const c = IMREAL(inumber2);\n const d = IMAGINARY(inumber2);\n\n if (anyIsError(a, b, c, d)) {\n return value\n }\n\n // Lookup imaginary unit\n const unit1 = inumber1.substring(inumber1.length - 1);\n const unit2 = inumber2.substring(inumber2.length - 1);\n let unit = 'i';\n\n if (unit1 === 'j') {\n unit = 'j';\n } else if (unit2 === 'j') {\n unit = 'j';\n }\n\n // Return error if inumber2 is null\n if (c === 0 && d === 0) {\n return num\n }\n\n // Return exponential of complex number\n const den = c * c + d * d;\n return COMPLEX((a * c + b * d) / den, (b * c - a * d) / den, unit)\n}\n\n/**\n * Returns the exponential of a complex number.\n *\n * Category: Engineering\n *\n * @param {*} inumber A complex number for which you want the exponential.\n * @returns\n */\nfunction IMEXP(inumber) {\n // Lookup real and imaginary coefficients using Formula.js [http://formulajs.org]\n const x = IMREAL(inumber);\n const y = IMAGINARY(inumber);\n\n if (anyIsError(x, y)) {\n return value\n }\n\n // Lookup imaginary unit\n let unit = inumber.substring(inumber.length - 1);\n unit = unit === 'i' || unit === 'j' ? unit : 'i';\n\n // Return exponential of complex number\n const e = Math.exp(x);\n return COMPLEX(e * Math.cos(y), e * Math.sin(y), unit)\n}\n\n/**\n * Returns the natural logarithm of a complex number.\n *\n * Category: Engineering\n *\n * @param {*} inumber A complex number for which you want the natural logarithm.\n * @returns\n */\nfunction IMLN(inumber) {\n // Lookup real and imaginary coefficients using Formula.js [http://formulajs.org]\n const x = IMREAL(inumber);\n const y = IMAGINARY(inumber);\n\n if (anyIsError(x, y)) {\n return value\n }\n\n // Lookup imaginary unit\n let unit = inumber.substring(inumber.length - 1);\n unit = unit === 'i' || unit === 'j' ? unit : 'i';\n\n // Return exponential of complex number\n return COMPLEX(Math.log(Math.sqrt(x * x + y * y)), Math.atan(y / x), unit)\n}\n\n/**\n * Returns the base-10 logarithm of a complex number.\n *\n * Category: Engineering\n *\n * @param {*} inumber A complex number for which you want the common logarithm.\n * @returns\n */\nfunction IMLOG10(inumber) {\n // Lookup real and imaginary coefficients using Formula.js [http://formulajs.org]\n const x = IMREAL(inumber);\n const y = IMAGINARY(inumber);\n\n if (anyIsError(x, y)) {\n return value\n }\n\n // Lookup imaginary unit\n let unit = inumber.substring(inumber.length - 1);\n unit = unit === 'i' || unit === 'j' ? unit : 'i';\n\n // Return exponential of complex number\n return COMPLEX(Math.log(Math.sqrt(x * x + y * y)) / Math.log(10), Math.atan(y / x) / Math.log(10), unit)\n}\n\n/**\n * Returns the base-2 logarithm of a complex number.\n *\n * Category: Engineering\n *\n * @param {*} inumber A complex number for which you want the base-2 logarithm.\n * @returns\n */\nfunction IMLOG2(inumber) {\n // Lookup real and imaginary coefficients using Formula.js [http://formulajs.org]\n const x = IMREAL(inumber);\n const y = IMAGINARY(inumber);\n\n if (anyIsError(x, y)) {\n return value\n }\n\n // Lookup imaginary unit\n let unit = inumber.substring(inumber.length - 1);\n unit = unit === 'i' || unit === 'j' ? unit : 'i';\n\n // Return exponential of complex number\n return COMPLEX(Math.log(Math.sqrt(x * x + y * y)) / Math.log(2), Math.atan(y / x) / Math.log(2), unit)\n}\n\n/**\n * Returns a complex number raised to an integer power.\n *\n * Category: Engineering\n *\n * @param {*} inumber A complex number you want to raise to a power.\n * @param {*} number The power to which you want to raise the complex number.\n * @returns\n */\nfunction IMPOWER(inumber, number) {\n number = parseNumber(number);\n const x = IMREAL(inumber);\n const y = IMAGINARY(inumber);\n\n if (anyIsError(number, x, y)) {\n return value\n }\n\n // Lookup imaginary unit\n let unit = inumber.substring(inumber.length - 1);\n unit = unit === 'i' || unit === 'j' ? unit : 'i';\n\n // Calculate power of modulus\n const p = Math.pow(IMABS(inumber), number);\n\n // Calculate argument\n const t = IMARGUMENT(inumber);\n\n // Return exponential of complex number\n return COMPLEX(p * Math.cos(number * t), p * Math.sin(number * t), unit)\n}\n\n/**\n * Returns the product of complex numbers.\n *\n * Category: Engineering\n *\n * @param {*} args inumber1, [inumber2], … Inumber1 is required, subsequent inumbers are not. 1 to 255 complex numbers to multiply.\n * @returns\n */\nfunction IMPRODUCT() {\n // Initialize result\n let result = arguments[0];\n\n if (!arguments.length) {\n return value\n }\n\n // Loop on all numbers\n for (let i = 1; i < arguments.length; i++) {\n // Lookup coefficients of two complex numbers\n const a = IMREAL(result);\n const b = IMAGINARY(result);\n const c = IMREAL(arguments[i]);\n const d = IMAGINARY(arguments[i]);\n\n if (anyIsError(a, b, c, d)) {\n return value\n }\n\n // Complute product of two complex numbers\n result = COMPLEX(a * c - b * d, a * d + b * c);\n }\n\n // Return product of complex numbers\n return result\n}\n\n/**\n * Returns the real coefficient of a complex number.\n *\n * Category: Engineering\n *\n * @param {*} inumber A complex number for which you want the real coefficient.\n * @returns\n */\nfunction IMREAL(inumber) {\n if (inumber === undefined || inumber === true || inumber === false) {\n return value\n }\n\n // Return 0 if inumber is equal to 0\n if (inumber === 0 || inumber === '0') {\n return 0\n }\n\n // Handle special cases\n if (['i', '+i', '1i', '+1i', '-i', '-1i', 'j', '+j', '1j', '+1j', '-j', '-1j'].indexOf(inumber) >= 0) {\n return 0\n }\n\n // Force String type\n inumber = inumber + '';\n\n // Lookup sign\n let plus = inumber.indexOf('+');\n let minus = inumber.indexOf('-');\n\n if (plus === 0) {\n plus = inumber.indexOf('+', 1);\n }\n\n if (minus === 0) {\n minus = inumber.indexOf('-', 1);\n }\n\n // Lookup imaginary unit\n const last = inumber.substring(inumber.length - 1, inumber.length);\n const unit = last === 'i' || last === 'j';\n\n if (plus >= 0 || minus >= 0) {\n // Return error if imaginary unit is neither i nor j\n if (!unit) {\n return num\n }\n\n // Return real coefficient of complex number\n if (plus >= 0) {\n return isNaN(inumber.substring(0, plus)) || isNaN(inumber.substring(plus + 1, inumber.length - 1))\n ? num\n : Number(inumber.substring(0, plus))\n } else {\n return isNaN(inumber.substring(0, minus)) || isNaN(inumber.substring(minus + 1, inumber.length - 1))\n ? num\n : Number(inumber.substring(0, minus))\n }\n } else {\n if (unit) {\n return isNaN(inumber.substring(0, inumber.length - 1)) ? num : 0\n } else {\n return isNaN(inumber) ? num : inumber\n }\n }\n}\n\n/**\n * Returns the secant of a complex number.\n *\n * Category: Engineering\n *\n * @param {*} inumber A complex number for which you want the secant.\n * @returns\n */\nfunction IMSEC(inumber) {\n // Return error if inumber is a logical value\n if (inumber === true || inumber === false) {\n return value\n }\n\n // Lookup real and imaginary coefficients using Formula.js [http://formulajs.org]\n const x = IMREAL(inumber);\n const y = IMAGINARY(inumber);\n\n if (anyIsError(x, y)) {\n return value\n }\n\n // Return secant of complex number\n return IMDIV('1', IMCOS(inumber))\n}\n\n/**\n * Returns the hyperbolic secant of a complex number.\n *\n * Category: Engineering\n *\n * @param {*} inumber A complex number for which you want the hyperbolic secant.\n * @returns\n */\nfunction IMSECH(inumber) {\n // Lookup real and imaginary coefficients using Formula.js [http://formulajs.org]\n const x = IMREAL(inumber);\n const y = IMAGINARY(inumber);\n\n if (anyIsError(x, y)) {\n return value\n }\n\n // Return hyperbolic secant of complex number\n return IMDIV('1', IMCOSH(inumber))\n}\n\n/**\n * Returns the sine of a complex number.\n *\n * Category: Engineering\n *\n * @param {*} inumber A complex number for which you want the sine.\n * @returns\n */\nfunction IMSIN(inumber) {\n // Lookup real and imaginary coefficients using Formula.js [http://formulajs.org]\n const x = IMREAL(inumber);\n const y = IMAGINARY(inumber);\n\n if (anyIsError(x, y)) {\n return value\n }\n\n // Lookup imaginary unit\n let unit = inumber.substring(inumber.length - 1);\n unit = unit === 'i' || unit === 'j' ? unit : 'i';\n\n // Return sine of complex number\n return COMPLEX(\n (Math.sin(x) * (Math.exp(y) + Math.exp(-y))) / 2,\n (Math.cos(x) * (Math.exp(y) - Math.exp(-y))) / 2,\n unit\n )\n}\n\n/**\n * Returns the hyperbolic sine of a complex number.\n *\n * Category: Engineering\n *\n * @param {*} inumber A complex number for which you want the hyperbolic sine.\n * @returns\n */\nfunction IMSINH(inumber) {\n // Lookup real and imaginary coefficients using Formula.js [http://formulajs.org]\n const x = IMREAL(inumber);\n const y = IMAGINARY(inumber);\n\n if (anyIsError(x, y)) {\n return value\n }\n\n // Lookup imaginary unit\n let unit = inumber.substring(inumber.length - 1);\n unit = unit === 'i' || unit === 'j' ? unit : 'i';\n\n // Return hyperbolic sine of complex number\n return COMPLEX(\n (Math.cos(y) * (Math.exp(x) - Math.exp(-x))) / 2,\n (Math.sin(y) * (Math.exp(x) + Math.exp(-x))) / 2,\n unit\n )\n}\n\n/**\n * Returns the square root of a complex number.\n *\n * Category: Engineering\n *\n * @param {*} inumber A complex number for which you want the square root.\n * @returns\n */\nfunction IMSQRT(inumber) {\n // Lookup real and imaginary coefficients using Formula.js [http://formulajs.org]\n const x = IMREAL(inumber);\n const y = IMAGINARY(inumber);\n\n if (anyIsError(x, y)) {\n return value\n }\n\n // Lookup imaginary unit\n let unit = inumber.substring(inumber.length - 1);\n unit = unit === 'i' || unit === 'j' ? unit : 'i';\n\n // Calculate power of modulus\n const s = Math.sqrt(IMABS(inumber));\n\n // Calculate argument\n const t = IMARGUMENT(inumber);\n\n // Return exponential of complex number\n return COMPLEX(s * Math.cos(t / 2), s * Math.sin(t / 2), unit)\n}\n\n/**\n * Returns the cosecant of a complex number.\n *\n * Category: Engineering\n *\n * @param {*} inumber A complex number for which you want the cosecant.\n * @returns\n */\nfunction IMCSC(inumber) {\n // Return error if inumber is a logical value\n if (inumber === true || inumber === false) {\n return value\n }\n\n // Lookup real and imaginary coefficients using Formula.js [http://formulajs.org]\n const x = IMREAL(inumber);\n const y = IMAGINARY(inumber);\n\n // Return error if either coefficient is not a number\n if (anyIsError(x, y)) {\n return num\n }\n\n // Return cosecant of complex number\n return IMDIV('1', IMSIN(inumber))\n}\n\n/**\n * Returns the hyperbolic cosecant of a complex number.\n *\n * Category: Engineering\n *\n * @param {*} inumber A complex number for which you want the hyperbolic cosecant.\n * @returns\n */\nfunction IMCSCH(inumber) {\n // Return error if inumber is a logical value\n if (inumber === true || inumber === false) {\n return value\n }\n\n // Lookup real and imaginary coefficients using Formula.js [http://formulajs.org]\n const x = IMREAL(inumber);\n const y = IMAGINARY(inumber);\n\n // Return error if either coefficient is not a number\n if (anyIsError(x, y)) {\n return num\n }\n\n // Return hyperbolic cosecant of complex number\n return IMDIV('1', IMSINH(inumber))\n}\n\n/**\n * Returns the difference between two complex numbers.\n *\n * Category: Engineering\n *\n * @param {*} inumber1 The complex number from which to subtract inumber2.\n * @param {*} inumber2 The complex number to subtract from inumber1.\n * @returns\n */\nfunction IMSUB(inumber1, inumber2) {\n // Lookup real and imaginary coefficients using Formula.js [http://formulajs.org]\n const a = IMREAL(inumber1);\n const b = IMAGINARY(inumber1);\n const c = IMREAL(inumber2);\n const d = IMAGINARY(inumber2);\n\n if (anyIsError(a, b, c, d)) {\n return value\n }\n\n // Lookup imaginary unit\n const unit1 = inumber1.substring(inumber1.length - 1);\n const unit2 = inumber2.substring(inumber2.length - 1);\n let unit = 'i';\n\n if (unit1 === 'j') {\n unit = 'j';\n } else if (unit2 === 'j') {\n unit = 'j';\n }\n\n // Return _ of two complex numbers\n return COMPLEX(a - c, b - d, unit)\n}\n\n/**\n * Returns the sum of complex numbers.\n *\n * Category: Engineering\n *\n * @param {*} args inumber1, [inumber2], ... Inumber1 is required, subsequent numbers are not. 1 to 255 complex numbers to add.\n * @returns\n */\nfunction IMSUM() {\n if (!arguments.length) {\n return value\n }\n\n const args = flatten(arguments);\n\n // Initialize result\n let result = args[0];\n\n // Loop on all numbers\n for (let i = 1; i < args.length; i++) {\n // Lookup coefficients of two complex numbers\n const a = IMREAL(result);\n const b = IMAGINARY(result);\n const c = IMREAL(args[i]);\n const d = IMAGINARY(args[i]);\n\n if (anyIsError(a, b, c, d)) {\n return value\n }\n\n // Complute product of two complex numbers\n result = COMPLEX(a + c, b + d);\n }\n\n // Return sum of complex numbers\n return result\n}\n\n/**\n * Returns the tangent of a complex number.\n *\n * Category: Engineering\n *\n * @param {*} inumber A complex number for which you want the tangent.\n * @returns\n */\nfunction IMTAN(inumber) {\n // Return error if inumber is a logical value\n if (inumber === true || inumber === false) {\n return value\n }\n\n // Lookup real and imaginary coefficients using Formula.js [http://formulajs.org]\n const x = IMREAL(inumber);\n const y = IMAGINARY(inumber);\n\n if (anyIsError(x, y)) {\n return value\n }\n\n // Return tangent of complex number\n return IMDIV(IMSIN(inumber), IMCOS(inumber))\n}\n\n/**\n * Converts an octal number to binary.\n *\n * Category: Engineering\n *\n * @param {*} number The octal number you want to convert. Number may not contain more than 10 characters. The most significant bit of number is the sign bit. The remaining 29 bits are magnitude bits. Negative numbers are represented using two's-complement notation.\n * @param {*} places Optional. The number of characters to use. If places is omitted, OCT2BIN uses the minimum number of characters necessary. Places is useful for padding the return value with leading 0s (zeros).\n * @returns\n */\nfunction OCT2BIN(number, places) {\n // Return error if number is not hexadecimal or contains more than ten characters (10 digits)\n if (!/^[0-7]{1,10}$/.test(number)) {\n return num\n }\n\n // Check if number is negative\n const negative = !!(number.length === 10 && number.substring(0, 1) === '7');\n\n // Convert octal number to decimal\n const decimal = negative ? parseInt(number, 8) - 1073741824 : parseInt(number, 8);\n\n // Return error if number is lower than -512 or greater than 511\n if (decimal < -512 || decimal > 511) {\n return num\n }\n\n // Ignore places and return a 10-character binary number if number is negative\n if (negative) {\n return '1' + REPT('0', 9 - (512 + decimal).toString(2).length) + (512 + decimal).toString(2)\n }\n\n // Convert decimal number to binary\n const result = decimal.toString(2);\n\n // Return binary number using the minimum number of characters necessary if places is undefined\n if (typeof places === 'undefined') {\n return result\n } else {\n // Return error if places is nonnumeric\n if (isNaN(places)) {\n return value\n }\n\n // Return error if places is negative\n if (places < 0) {\n return num\n }\n\n // Truncate places in case it is not an integer\n places = Math.floor(places);\n\n // Pad return value with leading 0s (zeros) if necessary (using Underscore.string)\n return places >= result.length ? REPT('0', places - result.length) + result : num\n }\n}\n\n/**\n * Converts an octal number to decimal.\n *\n * Category: Engineering\n *\n * @param {*} number The octal number you want to convert. Number may not contain more than 10 octal characters (30 bits). The most significant bit of number is the sign bit. The remaining 29 bits are magnitude bits. Negative numbers are represented using two's-complement notation.\n * @returns\n */\nfunction OCT2DEC(number) {\n // Return error if number is not octal or contains more than ten characters (10 digits)\n if (!/^[0-7]{1,10}$/.test(number)) {\n return num\n }\n\n // Convert octal number to decimal\n const decimal = parseInt(number, 8);\n\n // Return decimal number\n return decimal >= 536870912 ? decimal - 1073741824 : decimal\n}\n\n/**\n * Converts an octal number to hexadecimal.\n *\n * Category: Engineering\n *\n * @param {*} number The octal number you want to convert. Number may not contain more than 10 octal characters (30 bits). The most significant bit of number is the sign bit. The remaining 29 bits are magnitude bits. Negative numbers are represented using two's-complement notation.\n * @param {*} places Optional. The number of characters to use. If places is omitted, OCT2HEX uses the minimum number of characters necessary. Places is useful for padding the return value with leading 0s (zeros).\n * @returns\n */\nfunction OCT2HEX(number, places) {\n // Return error if number is not octal or contains more than ten characters (10 digits)\n if (!/^[0-7]{1,10}$/.test(number)) {\n return num\n }\n\n // Convert octal number to decimal\n const decimal = parseInt(number, 8);\n\n // Ignore places and return a 10-character octal number if number is negative\n if (decimal >= 536870912) {\n return 'ff' + (decimal + 3221225472).toString(16)\n }\n\n // Convert decimal number to hexadecimal\n const result = decimal.toString(16);\n\n // Return hexadecimal number using the minimum number of characters necessary if places is undefined\n if (places === undefined) {\n return result\n } else {\n // Return error if places is nonnumeric\n if (isNaN(places)) {\n return value\n }\n\n // Return error if places is negative\n if (places < 0) {\n return num\n }\n\n // Truncate places in case it is not an integer\n places = Math.floor(places);\n\n // Pad return value with leading 0s (zeros) if necessary (using Underscore.string)\n return places >= result.length ? REPT('0', places - result.length) + result : num\n }\n}\n\nconst BETADIST = BETA.DIST;\nconst BETAINV = BETA.INV;\nconst BINOMDIST = BINOM.DIST;\nconst CEILINGMATH = CEILING.MATH;\nconst CEILINGPRECISE = CEILING.PRECISE;\nconst CHIDIST = CHISQ.DIST;\nconst CHIDISTRT = CHISQ.DIST.RT;\nconst CHIINV = CHISQ.INV;\nconst CHIINVRT = CHISQ.INV.RT;\nconst CHITEST = CHISQ.TEST;\nconst COVAR = COVARIANCE.P;\nconst COVARIANCEP = COVARIANCE.P;\nconst COVARIANCES = COVARIANCE.S;\nconst CRITBINOM = BINOM.INV;\nconst ERFCPRECISE = ERFC.PRECISE;\nconst ERFPRECISE = ERF.PRECISE;\nconst EXPONDIST = EXPON.DIST;\nconst FDIST = F.DIST;\nconst FDISTRT = F.DIST.RT;\nconst FINV = F.INV;\nconst FINVRT = F.INV.RT;\nconst FLOORMATH = FLOOR.MATH;\nconst FLOORPRECISE = FLOOR.PRECISE;\nconst FTEST = F.TEST;\nconst GAMMADIST = GAMMA.DIST;\nconst GAMMAINV = GAMMA.INV;\nconst GAMMALNPRECISE = GAMMALN.PRECISE;\nconst HYPGEOMDIST = HYPGEOM.DIST;\nconst LOGINV = LOGNORM.INV;\nconst LOGNORMDIST = LOGNORM.DIST;\nconst LOGNORMINV = LOGNORM.INV;\nconst MODEMULT = MODE.MULT;\nconst MODESNGL = MODE.SNGL;\nconst NEGBINOMDIST = NEGBINOM.DIST;\nconst NETWORKDAYSINTL = NETWORKDAYS.INTL;\nconst NORMDIST = NORM.DIST;\nconst NORMINV = NORM.INV;\nconst NORMSDIST = NORM.S.DIST;\nconst NORMSINV = NORM.S.INV;\nconst PERCENTILEEXC = PERCENTILE.EXC;\nconst PERCENTILEINC = PERCENTILE.INC;\nconst PERCENTRANKEXC = PERCENTRANK.EXC;\nconst PERCENTRANKINC = PERCENTRANK.INC;\nconst POISSONDIST = POISSON.DIST;\nconst QUARTILEEXC = QUARTILE.EXC;\nconst QUARTILEINC = QUARTILE.INC;\nconst RANKAVG = RANK.AVG;\nconst RANKEQ = RANK.EQ;\nconst SKEWP = SKEW.P;\nconst STDEVP = STDEV.P;\nconst STDEVS = STDEV.S;\nconst TDIST = T$1.DIST;\nconst TDISTRT = T$1.DIST.RT;\nconst TINV = T$1.INV;\nconst TTEST = T$1.TEST;\nconst VARP = VAR.P;\nconst VARS = VAR.S;\nconst WEIBULLDIST = WEIBULL.DIST;\nconst WORKDAYINTL = WORKDAY.INTL;\nconst ZTEST = Z.TEST;\n\nfunction compact(array) {\n const result = [];\n\n arrayEach(array, (value) => {\n if (value) {\n result.push(value);\n }\n });\n\n return result\n}\n\n/**\n * Formula.js only\n *\n * @param {*} database\n * @param {*} title\n * @returns\n */\nfunction FINDFIELD(database, title) {\n let index = null;\n\n arrayEach(database, (value, i) => {\n if (value[0] === title) {\n index = i;\n\n return false\n }\n });\n\n // Return error if the input field title is incorrect\n if (index == null) {\n return value\n }\n\n return index\n}\n\nfunction findResultIndex(database, criterias) {\n const matches = {};\n\n for (let i = 1; i < database[0].length; ++i) {\n matches[i] = true;\n }\n\n let maxCriteriaLength = criterias[0].length;\n\n for (let i = 1; i < criterias.length; ++i) {\n if (criterias[i].length > maxCriteriaLength) {\n maxCriteriaLength = criterias[i].length;\n }\n }\n\n for (let k = 1; k < database.length; ++k) {\n for (let l = 1; l < database[k].length; ++l) {\n let currentCriteriaResult = false;\n let hasMatchingCriteria = false;\n\n for (let j = 0; j < criterias.length; ++j) {\n const criteria = criterias[j];\n\n if (criteria.length < maxCriteriaLength) {\n continue\n }\n\n const criteriaField = criteria[0];\n\n if (database[k][0] !== criteriaField) {\n continue\n }\n\n hasMatchingCriteria = true;\n\n for (let p = 1; p < criteria.length; ++p) {\n if (!currentCriteriaResult) {\n const isWildcard = criteria[p] === void 0 || criteria[p] === '*';\n\n if (isWildcard) {\n currentCriteriaResult = true;\n } else {\n const tokenizedCriteria = parse(criteria[p] + '');\n const tokens = [createToken(database[k][l], TOKEN_TYPE_LITERAL)].concat(\n tokenizedCriteria\n );\n\n currentCriteriaResult = compute(tokens);\n }\n }\n }\n }\n\n if (hasMatchingCriteria) {\n matches[l] = matches[l] && currentCriteriaResult;\n }\n }\n }\n\n const result = [];\n\n for (let n = 0; n < database[0].length; ++n) {\n if (matches[n]) {\n result.push(n - 1);\n }\n }\n\n return result\n}\n\n// Database functions\n/**\n * Returns the average of selected database entries.\n *\n * Category: Database\n *\n * @param {*} database Range of values that makes up the list or database. A database is a list of related data in which rows of related information are records, and columns of data are fields. The first row of the list contains labels for each column.\n * @param {*} field Indicates which column is used in the function. Enter the column label enclosed between double quotation marks, such as \"Age\" or \"Yield,\" or a number (without quotation marks) that represents the position of the column within the list: 1 for the first column, 2 for the second column, and so on.\n * @param {*} criteria Range of values that contains the conditions you specify. You can use any range for the criteria argument, as long as it includes at least one column label and at least one value below the column label in which you specify a condition for the column.\n * @returns\n */\nfunction DAVERAGE(database, field, criteria) {\n // Return error if field is not a number and not a string\n if (isNaN(field) && typeof field !== 'string') {\n return value\n }\n\n const resultIndexes = findResultIndex(database, criteria);\n let targetFields = [];\n\n if (typeof field === 'string') {\n const index = FINDFIELD(database, field);\n targetFields = rest(database[index]);\n } else {\n targetFields = rest(database[field]);\n }\n\n let sum = 0;\n\n arrayEach(resultIndexes, (value) => {\n sum += targetFields[value];\n });\n\n return resultIndexes.length === 0 ? div0 : sum / resultIndexes.length\n}\n\n/**\n * Counts the values that contain numbers in a database.\n *\n * Category: Database\n *\n * @param {*} database The range of values that makes up the list or database. A database is a list of related data in which rows of related information are records, and columns of data are fields. The first row of the list contains labels for each column.\n * @param {*} field Indicates which column is used in the function. Enter the column label enclosed between double quotation marks, such as \"Age\" or \"Yield,\" or a number (without quotation marks) that represents the position of the column within the list: 1 for the first column, 2 for the second column, and so on.\n * @param {*} criteria The range of values that contains the conditions that you specify. You can use any range for the criteria argument, as long as the argument includes at least one column label and at least one value below the column label in which you specify a condition for the column.\n * @returns\n */\nfunction DCOUNT(database, field, criteria) {\n // Return error if field is not a number and not a string\n if (isNaN(field) && typeof field !== 'string') {\n return value\n }\n\n const resultIndexes = findResultIndex(database, criteria);\n let targetFields = [];\n\n if (typeof field === 'string') {\n const index = FINDFIELD(database, field);\n targetFields = rest(database[index]);\n } else {\n targetFields = rest(database[field]);\n }\n\n const targetValues = [];\n\n arrayEach(resultIndexes, (value) => {\n targetValues.push(targetFields[value]);\n });\n\n return COUNT(targetValues)\n}\n\n/**\n * Counts nonblank values in a database.\n *\n * Category: Database\n *\n * @param {*} database The range of values that makes up the list or database. A database is a list of related data in which rows of related information are records, and columns of data are fields. The first row of the list contains labels for each column.\n * @param {*} field Optional. Indicates which column is used in the function. Enter the column label enclosed between double quotation marks, such as \"Age\" or \"Yield,\" or a number (without quotation marks) that represents the position of the column within the list: 1 for the first column, 2 for the second column, and so on.\n * @param {*} criteria The range of values that contains the conditions that you specify. You can use any range for the criteria argument, as long as it includes at least one column label and at least one value below the column label in which you specify a condition for the column.\n * @returns\n */\nfunction DCOUNTA(database, field, criteria) {\n // Return error if field is not a number and not a string\n if (isNaN(field) && typeof field !== 'string') {\n return value\n }\n\n const resultIndexes = findResultIndex(database, criteria);\n let targetFields = [];\n\n if (typeof field === 'string') {\n const index = FINDFIELD(database, field);\n targetFields = rest(database[index]);\n } else {\n targetFields = rest(database[field]);\n }\n\n const targetValues = [];\n\n arrayEach(resultIndexes, (value) => {\n targetValues.push(targetFields[value]);\n });\n\n return COUNTA(targetValues)\n}\n\n/**\n * Extracts from a database a single record that matches the specified criteria.\n *\n * Category: Database\n *\n * @param {*} database The range of values that makes up the list or database. A database is a list of related data in which rows of related information are records, and columns of data are fields. The first row of the list contains labels for each column.\n * @param {*} field Indicates which column is used in the function. Enter the column label enclosed between double quotation marks, such as \"Age\" or \"Yield,\" or a number (without quotation marks) that represents the position of the column within the list: 1 for the first column, 2 for the second column, and so on.\n * @param {*} criteria The range of values that contains the conditions that you specify. You can use any range for the criteria argument, as long as it includes at least one column label and at least one value below the column label in which you specify a condition for the column.\n * @returns\n */\nfunction DGET(database, field, criteria) {\n // Return error if field is not a number and not a string\n if (isNaN(field) && typeof field !== 'string') {\n return value\n }\n\n const resultIndexes = findResultIndex(database, criteria);\n let targetFields = [];\n\n if (typeof field === 'string') {\n const index = FINDFIELD(database, field);\n targetFields = rest(database[index]);\n } else {\n targetFields = rest(database[field]);\n }\n\n // Return error if no record meets the criteria\n if (resultIndexes.length === 0) {\n return value\n }\n // Returns the #NUM! error value because more than one record meets the\n // criteria\n if (resultIndexes.length > 1) {\n return num\n }\n\n return targetFields[resultIndexes[0]]\n}\n\n/**\n * Returns the maximum value from selected database entries.\n *\n * Category: Database\n *\n * @param {*} database The range of values that makes up the list or database. A database is a list of related data in which rows of related information are records, and columns of data are fields. The first row of the list contains labels for each column.\n * @param {*} field Indicates which column is used in the function. Enter the column label enclosed between double quotation marks, such as \"Age\" or \"Yield,\" or a number (without quotation marks) that represents the position of the column within the list: 1 for the first column, 2 for the second column, and so on.\n * @param {*} criteria The range of values that contains the conditions that you specify. You can use any range for the criteria argument, as long as it includes at least one column label and at least one value below the column label in which you specify a condition for the column.\n * @returns\n */\nfunction DMAX(database, field, criteria) {\n // Return error if field is not a number and not a string\n\n if (isNaN(field) && typeof field !== 'string') {\n return value\n }\n\n const resultIndexes = findResultIndex(database, criteria);\n let targetFields = [];\n\n if (typeof field === 'string') {\n const index = FINDFIELD(database, field);\n targetFields = rest(database[index]);\n } else {\n targetFields = rest(database[field]);\n }\n\n let maxValue = targetFields[resultIndexes[0]];\n\n arrayEach(resultIndexes, (value) => {\n if (maxValue < targetFields[value]) {\n maxValue = targetFields[value];\n }\n });\n\n return maxValue\n}\n\n/**\n * Returns the minimum value from selected database entries.\n *\n * Category: Database\n *\n * @param {*} database The range of values that makes up the list or database. A database is a list of related data in which rows of related information are records, and columns of data are fields. The first row of the list contains labels for each column.\n * @param {*} field Indicates which column is used in the function. Enter the column label enclosed between double quotation marks, such as \"Age\" or \"Yield,\" or a number (without quotation marks) that represents the position of the column within the list: 1 for the first column, 2 for the second column, and so on.\n * @param {*} criteria The range of values that contains the conditions that you specify. You can use any range for the criteria argument, as long as it includes at least one column label and at least one value below the column label in which you specify a condition for the column.\n * @returns\n */\nfunction DMIN(database, field, criteria) {\n // Return error if field is not a number and not a string\n if (isNaN(field) && typeof field !== 'string') {\n return value\n }\n\n const resultIndexes = findResultIndex(database, criteria);\n let targetFields = [];\n\n if (typeof field === 'string') {\n const index = FINDFIELD(database, field);\n targetFields = rest(database[index]);\n } else {\n targetFields = rest(database[field]);\n }\n\n let minValue = targetFields[resultIndexes[0]];\n\n arrayEach(resultIndexes, (value) => {\n if (minValue > targetFields[value]) {\n minValue = targetFields[value];\n }\n });\n\n return minValue\n}\n\n/**\n * Multiplies the values in a particular field of records that match the criteria in a database.\n *\n * Category: Database\n *\n * @param {*} database The range of values that makes up the list or database. A database is a list of related data in which rows of related information are records, and columns of data are fields. The first row of the list contains labels for each column.\n * @param {*} field Indicates which column is used in the function. Enter the column label enclosed between double quotation marks, such as \"Age\" or \"Yield,\" or a number (without quotation marks) that represents the position of the column within the list: 1 for the first column, 2 for the second column, and so on.\n * @param {*} criteria The range of values that contains the conditions that you specify. You can use any range for the criteria argument, as long as it includes at least one column label and at least one value below the column label in which you specify a condition for the column.\n * @returns\n */\nfunction DPRODUCT(database, field, criteria) {\n // Return error if field is not a number and not a string\n if (isNaN(field) && typeof field !== 'string') {\n return value\n }\n\n const resultIndexes = findResultIndex(database, criteria);\n let targetFields = [];\n\n if (typeof field === 'string') {\n const index = FINDFIELD(database, field);\n targetFields = rest(database[index]);\n } else {\n targetFields = rest(database[field]);\n }\n\n let targetValues = [];\n\n arrayEach(resultIndexes, (value) => {\n targetValues.push(targetFields[value]);\n });\n targetValues = compact(targetValues);\n\n let result = 1;\n\n arrayEach(targetValues, (value) => {\n result *= value;\n });\n\n return result\n}\n\n/**\n * Estimates the standard deviation based on a sample of selected database entries.\n *\n * Category: Database\n *\n * @param {*} database The range of values that makes up the list or database. A database is a list of related data in which rows of related information are records, and columns of data are fields. The first row of the list contains labels for each column.\n * @param {*} field Indicates which column is used in the function. Enter the column label enclosed between double quotation marks, such as \"Age\" or \"Yield,\" or a number (without quotation marks) that represents the position of the column within the list: 1 for the first column, 2 for the second column, and so on.\n * @param {*} criteria The range of values that contains the conditions that you specify. You can use any range for the criteria argument, as long as it includes at least one column label and at least one value below the column label in which you specify a condition for the column.\n * @returns\n */\nfunction DSTDEV(database, field, criteria) {\n // Return error if field is not a number and not a string\n if (isNaN(field) && typeof field !== 'string') {\n return value\n }\n\n const resultIndexes = findResultIndex(database, criteria);\n let targetFields = [];\n\n if (typeof field === 'string') {\n const index = FINDFIELD(database, field);\n targetFields = rest(database[index]);\n } else {\n targetFields = rest(database[field]);\n }\n\n let targetValues = [];\n\n arrayEach(resultIndexes, (value) => {\n targetValues.push(targetFields[value]);\n });\n\n targetValues = compact(targetValues);\n\n return STDEV.S(targetValues)\n}\n\n/**\n * Calculates the standard deviation based on the entire population of selected database entries.\n *\n * Category: Database\n *\n * @param {*} database The range of values that makes up the list or database. A database is a list of related data in which rows of related information are records, and columns of data are fields. The first row of the list contains labels for each column.\n * @param {*} field Indicates which column is used in the function. Enter the column label enclosed between double quotation marks, such as \"Age\" or \"Yield,\" or a number (without quotation marks) that represents the position of the column within the list: 1 for the first column, 2 for the second column, and so on.\n * @param {*} criteria The range of values that contains the conditions that you specify. You can use any range for the criteria argument, as long as it includes at least one column label and at least one value below the column label in which you specify a condition for the column.\n * @returns\n */\nfunction DSTDEVP(database, field, criteria) {\n // Return error if field is not a number and not a string\n if (isNaN(field) && typeof field !== 'string') {\n return value\n }\n\n const resultIndexes = findResultIndex(database, criteria);\n let targetFields = [];\n\n if (typeof field === 'string') {\n const index = FINDFIELD(database, field);\n targetFields = rest(database[index]);\n } else {\n targetFields = rest(database[field]);\n }\n\n let targetValues = [];\n\n arrayEach(resultIndexes, (value) => {\n targetValues.push(targetFields[value]);\n });\n\n targetValues = compact(targetValues);\n\n return STDEV.P(targetValues)\n}\n\n/**\n * Adds the numbers in the field column of records in the database that match the criteria.\n *\n * Category: Database\n *\n * @param {*} database The range of values that makes up the list or database. A database is a list of related data in which rows of related information are records, and columns of data are fields. The first row of the list contains labels for each column.\n * @param {*} field Indicates which column is used in the function. Enter the column label enclosed between double quotation marks, such as \"Age\" or \"Yield,\" or a number (without quotation marks) that represents the position of the column within the list: 1 for the first column, 2 for the second column, and so on.\n * @param {*} criteria Is the range of values that contains the conditions that you specify. You can use any range for the criteria argument, as long as it includes at least one column label and at least one value below the column label in which you specify a condition for the column.\n * @returns\n */\nfunction DSUM(database, field, criteria) {\n // Return error if field is not a number and not a string\n if (isNaN(field) && typeof field !== 'string') {\n return value\n }\n\n const resultIndexes = findResultIndex(database, criteria);\n let targetFields = [];\n\n if (typeof field === 'string') {\n const index = FINDFIELD(database, field);\n targetFields = rest(database[index]);\n } else {\n targetFields = rest(database[field]);\n }\n\n const targetValues = [];\n\n arrayEach(resultIndexes, (value) => {\n targetValues.push(targetFields[value]);\n });\n\n return SUM(targetValues)\n}\n\n/**\n * Estimates variance based on a sample from selected database entries.\n *\n * Category: Database\n *\n * @param {*} database The range of values that makes up the list or database. A database is a list of related data in which rows of related information are records, and columns of data are fields. The first row of the list contains labels for each column.\n * @param {*} field Indicates which column is used in the function. Enter the column label enclosed between double quotation marks, such as \"Age\" or \"Yield,\" or a number (without quotation marks) that represents the position of the column within the list: 1 for the first column, 2 for the second column, and so on.\n * @param {*} criteria The range of values that contains the conditions that you specify. You can use any range for the criteria argument, as long as it includes at least one column label and at least one value below the column label in which you specify a condition for the column.\n * @returns\n */\nfunction DVAR(database, field, criteria) {\n // Return error if field is not a number and not a string\n if (isNaN(field) && typeof field !== 'string') {\n return value\n }\n\n const resultIndexes = findResultIndex(database, criteria);\n let targetFields = [];\n\n if (typeof field === 'string') {\n const index = FINDFIELD(database, field);\n targetFields = rest(database[index]);\n } else {\n targetFields = rest(database[field]);\n }\n\n const targetValues = [];\n\n arrayEach(resultIndexes, (value) => {\n targetValues.push(targetFields[value]);\n });\n\n return VAR.S(targetValues)\n}\n\n/**\n * Calculates variance based on the entire population of selected database entries.\n *\n * Category: Database\n *\n * @param {*} database The range of values that makes up the list or database. A database is a list of related data in which rows of related information are records, and columns of data are fields. The first row of the list contains labels for each column.\n * @param {*} field Indicates which column is used in the function. Enter the column label enclosed between double quotation marks, such as \"Age\" or \"Yield,\" or a number (without quotation marks) that represents the position of the column within the list: 1 for the first column, 2 for the second column, and so on.\n * @param {*} criteria The range of values that contains the conditions that you specify. You can use any range for the criteria argument, as long as it includes at least one column label and at least one value below the column label in which you specify a condition for the column.\n * @returns\n */\nfunction DVARP(database, field, criteria) {\n // Return error if field is not a number and not a string\n\n if (isNaN(field) && typeof field !== 'string') {\n return value\n }\n\n const resultIndexes = findResultIndex(database, criteria);\n let targetFields = [];\n\n if (typeof field === 'string') {\n const index = FINDFIELD(database, field);\n targetFields = rest(database[index]);\n } else {\n targetFields = rest(database[field]);\n }\n\n const targetValues = [];\n\n arrayEach(resultIndexes, (value) => {\n targetValues.push(targetFields[value]);\n });\n\n return VAR.P(targetValues)\n}\n\nfunction validDate(d) {\n return d && d.getTime && !isNaN(d.getTime())\n}\n\nfunction ensureDate(d) {\n return d instanceof Date ? d : new Date(d)\n}\n\n/**\n * Returns the accrued interest for a security that pays periodic interest.\n *\n * Category: Financial\n *\n * @param {*} issue The security's issue date.\n * @param {*} first_interest The security's first interest date.\n * @param {*} settlement The security's settlement date. The security settlement date is the date after the issue date when the security is traded to the buyer.\n * @param {*} rate The security's annual coupon rate.\n * @param {*} par The security's par value. If you omit par, ACCRINT uses $1,000.\n * @param {*} frequency The number of coupon payments per year. For annual payments, frequency = 1; for semiannual, frequency = 2; for quarterly, frequency = 4.\n * @param {*} basis Optional. The type of day count basis to use.\n * @param {*} calc_method Optional. Not implemented in formulajs. A logical value that specifies the way to calculate the total accrued interest when the date of settlement is later than the date of first_interest. A value of TRUE (1) returns the total accrued interest from issue to settlement. A value of FALSE (0) returns the accrued interest from first_interest to settlement. If you do not enter the argument, it defaults to TRUE.\n * @returns\n */\nfunction ACCRINT(issue, first_interest, settlement, rate, par, frequency, basis) {\n // Return error if either date is invalid\n issue = ensureDate(issue);\n first_interest = ensureDate(first_interest);\n settlement = ensureDate(settlement);\n\n if (!validDate(issue) || !validDate(first_interest) || !validDate(settlement)) {\n return value\n }\n\n // Return error if either rate or par are lower than or equal to zero\n if (rate <= 0 || par <= 0) {\n return num\n }\n\n // Return error if frequency is neither 1, 2, or 4\n if ([1, 2, 4].indexOf(frequency) === -1) {\n return num\n }\n\n // Return error if basis is neither 0, 1, 2, 3, or 4\n if ([0, 1, 2, 3, 4].indexOf(basis) === -1) {\n return num\n }\n\n // Return error if settlement is before or equal to issue\n if (settlement <= issue) {\n return num\n }\n\n // Set default values\n par = par || 0;\n basis = basis || 0;\n\n // Compute accrued interest\n return par * rate * YEARFRAC(issue, settlement, basis)\n}\n\n// TODO\n/**\n * -- Not implemented --\n *\n * Returns the accrued interest for a security that pays interest at maturity.\n *\n * Category: Financial\n *\n * @param {*} issue The security's issue date.\n * @param {*} settlement The security's maturity date.\n * @param {*} rate The security's annual coupon rate.\n * @param {*} par The security's par value. If you omit par, ACCRINTM uses $1,000.\n * @param {*} basis Optional. The type of day count basis to use.\n * @returns\n */\nfunction ACCRINTM() {\n throw new Error('ACCRINTM is not implemented')\n}\n\n// TODO\n/**\n * -- Not implemented --\n *\n * Returns the depreciation for each accounting period by using a depreciation coefficient.\n *\n * Category: Financial\n *\n * @param {*} cost The cost of the asset.\n * @param {*} date_purchased The date of the purchase of the asset.\n * @param {*} first_period The date of the end of the first period.\n * @param {*} salvage The salvage value at the end of the life of the asset.\n * @param {*} period The period.\n * @param {*} rate The rate of depreciation.\n * @param {*} basis Optional. The year basis to be used.\n * @returns\n */\nfunction AMORDEGRC() {\n throw new Error('AMORDEGRC is not implemented')\n}\n\n// TODO\n/**\n * -- Not implemented --\n *\n * Returns the depreciation for each accounting period.\n *\n * Category: Financial\n *\n * @param {*} cost The cost of the asset.\n * @param {*} date_purchased The date of the purchase of the asset.\n * @param {*} first_period The date of the end of the first period.\n * @param {*} salvage The salvage value at the end of the life of the asset.\n * @param {*} period The period.\n * @param {*} rate The rate of depreciation.\n * @param {*} basis Optional. The year basis to be used.\n * @returns\n */\nfunction AMORLINC() {\n throw new Error('AMORLINC is not implemented')\n}\n\n// TODO\n/**\n * -- Not implemented --\n *\n * Returns the number of days from the beginning of the coupon period to the settlement date.\n *\n * Category: Financial\n *\n * @param {*} settlement The security's settlement date. The security settlement date is the date after the issue date when the security is traded to the buyer.\n * @param {*} maturity The security's maturity date. The maturity date is the date when the security expires.\n * @param {*} frequency The number of coupon payments per year. For annual payments, frequency = 1; for semiannual, frequency = 2; for quarterly, frequency = 4.\n * @param {*} basis Optional. The type of day count basis to use.\n * @returns\n */\nfunction COUPDAYBS() {\n throw new Error('COUPDAYBS is not implemented')\n}\n\n// TODO\n/**\n * -- Not implemented --\n *\n * Returns the number of days in the coupon period that contains the settlement date.\n *\n * Category: Financial\n *\n * @param {*} settlement The security's settlement date. The security settlement date is the date after the issue date when the security is traded to the buyer.\n * @param {*} maturity The security's maturity date. The maturity date is the date when the security expires.\n * @param {*} frequency The number of coupon payments per year. For annual payments, frequency = 1; for semiannual, frequency = 2; for quarterly, frequency = 4.\n * @param {*} basis Optional. The type of day count basis to use.\n * @returns\n */\nfunction COUPDAYS() {\n throw new Error('COUPDAYS is not implemented')\n}\n\n// TODO\n/**\n * -- Not implemented --\n *\n * Returns the number of days from the settlement date to the next coupon date.\n *\n * Category: Financial\n *\n * @param {*} settlement The security's settlement date. The security settlement date is the date after the issue date when the security is traded to the buyer.\n * @param {*} maturity The security's maturity date. The maturity date is the date when the security expires.\n * @param {*} frequency The number of coupon payments per year. For annual payments, frequency = 1; for semiannual, frequency = 2; for quarterly, frequency = 4.\n * @param {*} basis Optional. The type of day count basis to use.\n * @returns\n */\nfunction COUPDAYSNC() {\n throw new Error('COUPDAYSNC is not implemented')\n}\n\n// TODO\n/**\n * -- Not implemented --\n *\n * Returns the next coupon date after the settlement date.\n *\n * Category: Financial\n *\n * @param {*} settlement The security's settlement date. The security settlement date is the date after the issue date when the security is traded to the buyer.\n * @param {*} maturity The security's maturity date. The maturity date is the date when the security expires.\n * @param {*} frequency The number of coupon payments per year. For annual payments, frequency = 1; for semiannual, frequency = 2; for quarterly, frequency = 4.\n * @param {*} basis Optional. The type of day count basis to use.\n * @returns\n */\nfunction COUPNCD() {\n throw new Error('COUPNCD is not implemented')\n}\n\n// TODO\n/**\n * -- Not implemented --\n *\n * Returns the number of coupons payable between the settlement date and maturity date.\n *\n * Category: Financial\n *\n * @param {*} settlement The security's settlement date. The security settlement date is the date after the issue date when the security is traded to the buyer.\n * @param {*} maturity The security's maturity date. The maturity date is the date when the security expires.\n * @param {*} frequency The number of coupon payments per year. For annual payments, frequency = 1; for semiannual, frequency = 2; for quarterly, frequency = 4.\n * @param {*} basis Optional. The type of day count basis to use.\n * @returns\n */\nfunction COUPNUM() {\n throw new Error('COUPNUM is not implemented')\n}\n\n// TODO\n/**\n * -- Not implemented --\n *\n * Returns the previous coupon date before the settlement date.\n *\n * Category: Financial\n *\n * @param {*} settlement The security's settlement date. The security settlement date is the date after the issue date when the security is traded to the buyer.\n * @param {*} maturity The security's maturity date. The maturity date is the date when the security expires.\n * @param {*} frequency The number of coupon payments per year. For annual payments, frequency = 1; for semiannual, frequency = 2; for quarterly, frequency = 4.\n * @param {*} basis Optional. The type of day count basis to use.\n * @returns\n */\nfunction COUPPCD() {\n throw new Error('COUPPCD is not implemented')\n}\n\n/**\n * Returns the cumulative interest paid between two periods.\n *\n * Category: Financial\n *\n * @param {*} rate The interest rate.\n * @param {*} nper The total number of payment periods.\n * @param {*} pv The present value.\n * @param {*} start_period The first period in the calculation. Payment periods are numbered beginning with 1.\n * @param {*} end_period The last period in the calculation.\n * @param {*} type The timing of the payment.\n * @returns\n */\nfunction CUMIPMT(rate, nper, pv, start_period, end_period, type) {\n rate = parseNumber(rate);\n nper = parseNumber(nper);\n pv = parseNumber(pv);\n\n if (anyIsError(rate, nper, pv)) {\n return value\n }\n\n if (rate <= 0 || nper <= 0 || pv <= 0) {\n return num\n }\n\n if (start_period < 1 || end_period < 1 || start_period > end_period) {\n return num\n }\n\n if (type !== 0 && type !== 1) {\n return num\n }\n\n const payment = PMT(rate, nper, pv, 0, type);\n let interest = 0;\n\n if (start_period === 1) {\n if (type === 0) {\n interest = -pv;\n }\n\n start_period++;\n }\n\n for (let i = start_period; i <= end_period; i++) {\n interest += type === 1 ? FV(rate, i - 2, payment, pv, 1) - payment : FV(rate, i - 1, payment, pv, 0);\n }\n\n interest *= rate;\n\n return interest\n}\n\n/**\n * Returns the cumulative principal paid on a loan between two periods.\n *\n * Category: Financial\n *\n * @param {*} rate The interest rate.\n * @param {*} nper The total number of payment periods.\n * @param {*} pv The present value.\n * @param {*} start_period The first period in the calculation. Payment periods are numbered beginning with 1.\n * @param {*} end_period The last period in the calculation.\n * @param {*} type The timing of the payment.\n * @returns\n */\nfunction CUMPRINC(rate, nper, pv, start_period, end, type) {\n // Credits: algorithm inspired by Apache OpenOffice\n // Credits: Hannes Stiebitzhofer for the translations of function and variable names\n rate = parseNumber(rate);\n nper = parseNumber(nper);\n pv = parseNumber(pv);\n\n if (anyIsError(rate, nper, pv)) {\n return value\n }\n\n // Return error if either rate, nper, or value are lower than or equal to zero\n if (rate <= 0 || nper <= 0 || pv <= 0) {\n return num\n }\n\n // Return error if start < 1, end < 1, or start > end\n if (start_period < 1 || end < 1 || start_period > end) {\n return num\n }\n\n // Return error if type is neither 0 nor 1\n if (type !== 0 && type !== 1) {\n return num\n }\n\n // Compute cumulative principal\n const payment = PMT(rate, nper, pv, 0, type);\n let principal = 0;\n\n if (start_period === 1) {\n principal = type === 0 ? payment + pv * rate : payment;\n\n start_period++;\n }\n\n for (let i = start_period; i <= end; i++) {\n principal +=\n type > 0\n ? payment - (FV(rate, i - 2, payment, pv, 1) - payment) * rate\n : payment - FV(rate, i - 1, payment, pv, 0) * rate;\n }\n\n // Return cumulative principal\n return principal\n}\n\n/**\n * Returns the depreciation of an asset for a specified period by using the fixed-declining balance method.\n *\n * Category: Financial\n *\n * @param {*} cost The initial cost of the asset.\n * @param {*} salvage The value at the end of the depreciation (sometimes called the salvage value of the asset).\n * @param {*} life The number of periods over which the asset is being depreciated (sometimes called the useful life of the asset).\n * @param {*} period The period for which you want to calculate the depreciation. Period must use the same units as life.\n * @param {*} month Optional. The number of months in the first year. If month is omitted, it is assumed to be 12.\n * @returns\n */\nfunction DB(cost, salvage, life, period, month) {\n // Initialize month\n month = month === undefined ? 12 : month;\n\n cost = parseNumber(cost);\n salvage = parseNumber(salvage);\n life = parseNumber(life);\n period = parseNumber(period);\n month = parseNumber(month);\n\n if (anyIsError(cost, salvage, life, period, month)) {\n return value\n }\n\n // Return error if any of the parameters is negative\n if (cost < 0 || salvage < 0 || life < 0 || period < 0) {\n return num\n }\n\n // Return error if month is not an integer between 1 and 12\n if ([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12].indexOf(month) === -1) {\n return num\n }\n\n // Return error if period is greater than life\n if (period > life) {\n return num\n }\n\n // Return 0 (zero) if salvage is greater than or equal to cost\n if (salvage >= cost) {\n return 0\n }\n\n // Rate is rounded to three decimals places\n const rate = (1 - Math.pow(salvage / cost, 1 / life)).toFixed(3);\n\n // Compute initial depreciation\n const initial = (cost * rate * month) / 12;\n\n // Compute total depreciation\n let total = initial;\n let current = 0;\n const ceiling = period === life ? life - 1 : period;\n\n for (let i = 2; i <= ceiling; i++) {\n current = (cost - total) * rate;\n total += current;\n }\n\n // Depreciation for the first and last periods are special cases\n if (period === 1) {\n // First period\n return initial\n } else if (period === life) {\n // Last period\n\n return (cost - total) * rate\n } else {\n return current\n }\n}\n\n/**\n * Returns the depreciation of an asset for a specified period by using the double-declining balance method or some other method that you specify.\n *\n * Category: Financial\n *\n * @param {*} cost The initial cost of the asset.\n * @param {*} salvage The value at the end of the depreciation (sometimes called the salvage value of the asset). This value can be 0.\n * @param {*} life The number of periods over which the asset is being depreciated (sometimes called the useful life of the asset).\n * @param {*} period The period for which you want to calculate the depreciation. Period must use the same units as life.\n * @param {*} factor Optional. The rate at which the balance declines. If factor is omitted, it is assumed to be 2 (the double-declining balance method).\n * @returns\n */\nfunction DDB(cost, salvage, life, period, factor) {\n // Initialize factor\n factor = factor === undefined ? 2 : factor;\n\n cost = parseNumber(cost);\n salvage = parseNumber(salvage);\n life = parseNumber(life);\n period = parseNumber(period);\n factor = parseNumber(factor);\n\n if (anyIsError(cost, salvage, life, period, factor)) {\n return value\n }\n\n // Return error if any of the parameters is negative or if factor is null\n if (cost < 0 || salvage < 0 || life < 0 || period < 0 || factor <= 0) {\n return num\n }\n\n // Return error if period is greater than life\n if (period > life) {\n return num\n }\n\n // Return 0 (zero) if salvage is greater than or equal to cost\n if (salvage >= cost) {\n return 0\n }\n\n // Compute depreciation\n let total = 0;\n let current = 0;\n\n for (let i = 1; i <= period; i++) {\n current = Math.min((cost - total) * (factor / life), cost - salvage - total);\n total += current;\n }\n\n // Return depreciation\n return current\n}\n\n// TODO\n/**\n * -- Not implemented --\n *\n * Returns the discount rate for a security.\n *\n * Category: Financial\n *\n * @param {*} settlement The security's settlement date. The security settlement date is the date after the issue date when the security is traded to the buyer.\n * @param {*} maturity The security's maturity date. The maturity date is the date when the security expires.\n * @param {*} pr The security's price per $100 face value.\n * @param {*} redemption The security's redemption value per $100 face value.\n * @param {*} basis Optional. The type of day count basis to use.\n * @returns\n */\nfunction DISC() {\n throw new Error('DISC is not implemented')\n}\n\n/**\n * Converts a dollar price, expressed as a fraction, into a dollar price, expressed as a decimal number.\n *\n * Category: Financial\n *\n * @param {*} fractional_dollar A number expressed as an integer part and a fraction part, separated by a decimal symbol.\n * @param {*} fraction The integer to use in the denominator of the fraction.\n * @returns\n */\nfunction DOLLARDE(fractional_dollar, fraction) {\n // Credits: algorithm inspired by Apache OpenOffice\n fractional_dollar = parseNumber(fractional_dollar);\n fraction = parseNumber(fraction);\n\n if (anyIsError(fractional_dollar, fraction)) {\n return value\n }\n\n // Return error if fraction is negative\n if (fraction < 0) {\n return num\n }\n\n // Return error if fraction is greater than or equal to 0 and less than 1\n if (fraction >= 0 && fraction < 1) {\n return div0\n }\n\n // Truncate fraction if it is not an integer\n fraction = parseInt(fraction, 10);\n\n // Compute integer part\n let result = parseInt(fractional_dollar, 10);\n\n // Add decimal part\n result += ((fractional_dollar % 1) * Math.pow(10, Math.ceil(Math.log(fraction) / Math.LN10))) / fraction;\n\n // Round result\n const power = Math.pow(10, Math.ceil(Math.log(fraction) / Math.LN2) + 1);\n result = Math.round(result * power) / power;\n\n // Return converted dollar price\n return result\n}\n\n/**\n * Converts a dollar price, expressed as a decimal number, into a dollar price, expressed as a fraction.\n *\n * Category: Financial\n *\n * @param {*} decimal_dollar A decimal number.\n * @param {*} fraction The integer to use in the denominator of a fraction.\n * @returns\n */\nfunction DOLLARFR(decimal_dollar, fraction) {\n // Credits: algorithm inspired by Apache OpenOffice\n decimal_dollar = parseNumber(decimal_dollar);\n fraction = parseNumber(fraction);\n\n if (anyIsError(decimal_dollar, fraction)) {\n return value\n }\n\n // Return error if fraction is negative\n if (fraction < 0) {\n return num\n }\n\n // Return error if fraction is greater than or equal to 0 and less than 1\n if (fraction >= 0 && fraction < 1) {\n return div0\n }\n\n // Truncate fraction if it is not an integer\n fraction = parseInt(fraction, 10);\n\n // Compute integer part\n let result = parseInt(decimal_dollar, 10);\n\n // Add decimal part\n result += (decimal_dollar % 1) * Math.pow(10, -Math.ceil(Math.log(fraction) / Math.LN10)) * fraction;\n\n // Return converted dollar price\n return result\n}\n\n// TODO\n/**\n * -- Not implemented --\n *\n * Returns the annual duration of a security with periodic interest payments.\n *\n * Category: Financial\n *\n * @param {*} settlement The security's settlement date. The security settlement date is the date after the issue date when the security is traded to the buyer.\n * @param {*} maturity The security's maturity date. The maturity date is the date when the security expires.\n * @param {*} coupon The security's annual coupon rate.\n * @param {*} yld The security's annual yield.\n * @param {*} frequency The number of coupon payments per year. For annual payments, frequency = 1; for semiannual, frequency = 2; for quarterly, frequency = 4.\n * @param {*} basis Optional. The type of day count basis to use.\n * @returns\n */\nfunction DURATION() {\n throw new Error('DURATION is not implemented')\n}\n\n/**\n * Returns the effective annual interest rate.\n *\n * Category: Financial\n *\n * @param {*} nominal_rate The nominal interest rate.\n * @param {*} npery The number of compounding periods per year.\n * @returns\n */\nfunction EFFECT(nominal_rate, npery) {\n nominal_rate = parseNumber(nominal_rate);\n npery = parseNumber(npery);\n\n if (anyIsError(nominal_rate, npery)) {\n return value\n }\n\n // Return error if rate <=0 or periods < 1\n if (nominal_rate <= 0 || npery < 1) {\n return num\n }\n\n // Truncate periods if it is not an integer\n npery = parseInt(npery, 10);\n\n // Return effective annual interest rate\n return Math.pow(1 + nominal_rate / npery, npery) - 1\n}\n\n/**\n * Returns the future value of an investment.\n *\n * Category: Financial\n *\n * @param {*} rate The interest rate per period.\n * @param {*} nper The total number of payment periods in an annuity.\n * @param {*} pmt The payment made each period; it cannot change over the life of the annuity. Typically, pmt contains principal and interest but no other fees or taxes. If pmt is omitted, you must include the pv argument.\n * @param {*} pv Optional. The present value, or the lump-sum amount that a series of future payments is worth right now. If pv is omitted, it is assumed to be 0 (zero), and you must include the pmt argument.\n * @param {*} type Optional. The number 0 or 1 and indicates when payments are due. If type is omitted, it is assumed to be 0.\n * @returns\n */\nfunction FV(rate, nper, payment, value$1, type) {\n // Credits: algorithm inspired by Apache OpenOffice\n value$1 = value$1 || 0;\n type = type || 0;\n\n rate = parseNumber(rate);\n nper = parseNumber(nper);\n payment = parseNumber(payment);\n value$1 = parseNumber(value$1);\n type = parseNumber(type);\n\n if (anyIsError(rate, nper, payment, value$1, type)) {\n return value\n }\n\n // Return future value\n let result;\n\n if (rate === 0) {\n result = value$1 + payment * nper;\n } else {\n const term = Math.pow(1 + rate, nper);\n\n result =\n type === 1\n ? value$1 * term + (payment * (1 + rate) * (term - 1)) / rate\n : value$1 * term + (payment * (term - 1)) / rate;\n }\n\n return -result\n}\n\n/**\n * Returns the future value of an initial principal after applying a series of compound interest rates.\n *\n * Category: Financial\n *\n * @param {*} principal The present value.\n * @param {*} schedule An array of interest rates to apply.\n * @returns\n */\nfunction FVSCHEDULE(principal, schedule) {\n principal = parseNumber(principal);\n schedule = parseNumberArray(flatten(schedule));\n\n if (anyIsError(principal, schedule)) {\n return value\n }\n\n const n = schedule.length;\n let future = principal;\n\n // Apply all interests in schedule\n\n for (let i = 0; i < n; i++) {\n // Apply scheduled interest\n future *= 1 + schedule[i];\n }\n\n // Return future value\n return future\n}\n\n// TODO\n/**\n * -- Not implemented --\n *\n * Returns the interest rate for a fully invested security.\n *\n * Category: Financial\n *\n * @param {*} settlement The security's settlement date. The security settlement date is the date after the issue date when the security is traded to the buyer.\n * @param {*} maturity The security's maturity date. The maturity date is the date when the security expires.\n * @param {*} investment The amount invested in the security.\n * @param {*} redemption The amount to be received at maturity.\n * @param {*} basis Optional. The type of day count basis to use.\n * @returns\n */\nfunction INTRATE() {\n throw new Error('INTRATE is not implemented')\n}\n\n/**\n * Returns the interest payment for an investment for a given period.\n *\n * Category: Financial\n *\n * @param {*} rate The interest rate per period.\n * @param {*} per The period for which you want to find the interest and must be in the range 1 to nper.\n * @param {*} nper The total number of payment periods in an annuity.\n * @param {*} pv The present value, or the lump-sum amount that a series of future payments is worth right now.\n * @param {*} fv Optional. The future value, or a cash balance you want to attain after the last payment is made. If fv is omitted, it is assumed to be 0 (the future value of a loan, for example, is 0).\n * @param {*} type Optional. The number 0 or 1 and indicates when payments are due. If type is omitted, it is assumed to be 0.\n * @returns\n */\nfunction IPMT(rate, per, nper, pv, fv, type) {\n // Credits: algorithm inspired by Apache OpenOffice\n fv = fv || 0;\n type = type || 0;\n\n rate = parseNumber(rate);\n per = parseNumber(per);\n nper = parseNumber(nper);\n pv = parseNumber(pv);\n fv = parseNumber(fv);\n type = parseNumber(type);\n\n if (anyIsError(rate, per, nper, pv, fv, type)) {\n return value\n }\n\n // Compute payment\n const payment = PMT(rate, nper, pv, fv, type);\n\n // Compute interest\n let interest =\n per === 1\n ? type === 1\n ? 0\n : -pv\n : type === 1\n ? FV(rate, per - 2, payment, pv, 1) - payment\n : FV(rate, per - 1, payment, pv, 0);\n\n // Return interest\n return interest * rate\n}\n\n/**\n * Returns the internal rate of return for a series of cash flows.\n *\n * Category: Financial\n *\n * @param {*} values An array or a reference to values that contain numbers for which you want to calculate the internal rate of return.\n - Values must contain at least one positive value and one negative value to calculate the internal rate of return.\n - IRR uses the order of values to interpret the order of cash flows. Be sure to enter your payment and income values in the sequence you want.\n - If an array or reference argument contains text, logical values, or empty values, those values are ignored.\n * @param {*} guess Optional. A number that you guess is close to the result of IRR.\n - Microsoft Excel uses an iterative technique for calculating IRR. Starting with guess, IRR cycles through the calculation until the result is accurate within 0.00001 percent. If IRR can't find a result that works after 20 tries, the #NUM! error value is returned.\n - In most cases you do not need to provide guess for the IRR calculation. If guess is omitted, it is assumed to be 0.1 (10 percent).\n - If IRR gives the #NUM! error value, or if the result is not close to what you expected, try again with a different value for guess.\n * @returns\n */\nfunction IRR(values, guess) {\n // Credits: algorithm inspired by Apache OpenOffice\n guess = guess || 0;\n\n values = parseNumberArray(flatten(values));\n guess = parseNumber(guess);\n\n if (anyIsError(values, guess)) {\n return value\n }\n\n // Calculates the resulting amount\n const irrResult = (values, dates, rate) => {\n const r = rate + 1;\n let result = values[0];\n\n for (let i = 1; i < values.length; i++) {\n result += values[i] / Math.pow(r, (dates[i] - dates[0]) / 365);\n }\n\n return result\n };\n\n // Calculates the first derivation\n const irrResultDeriv = (values, dates, rate) => {\n const r = rate + 1;\n let result = 0;\n\n for (let i = 1; i < values.length; i++) {\n const frac = (dates[i] - dates[0]) / 365;\n result -= (frac * values[i]) / Math.pow(r, frac + 1);\n }\n\n return result\n };\n\n // Initialize dates and check that values contains at least one positive value and one negative value\n const dates = [];\n let positive = false;\n let negative = false;\n\n for (let i = 0; i < values.length; i++) {\n dates[i] = i === 0 ? 0 : dates[i - 1] + 365;\n\n if (values[i] > 0) {\n positive = true;\n }\n\n if (values[i] < 0) {\n negative = true;\n }\n }\n\n // Return error if values does not contain at least one positive value and one negative value\n if (!positive || !negative) {\n return num\n }\n\n // Initialize guess and resultRate\n guess = guess === undefined ? 0.1 : guess;\n let resultRate = guess;\n\n // Set maximum epsilon for end of iteration\n const epsMax = 1e-10;\n\n // Implement Newton's method\n let newRate, epsRate, resultValue;\n let contLoop = true;\n do {\n resultValue = irrResult(values, dates, resultRate);\n newRate = resultRate - resultValue / irrResultDeriv(values, dates, resultRate);\n epsRate = Math.abs(newRate - resultRate);\n resultRate = newRate;\n contLoop = epsRate > epsMax && Math.abs(resultValue) > epsMax;\n } while (contLoop)\n\n // Return internal rate of return\n return resultRate\n}\n\n/**\n * Calculates the interest paid during a specific period of an investment.\n *\n * Category: Financial\n *\n * @param {*} rate The interest rate for the investment.\n * @param {*} per The period for which you want to find the interest, and must be between 1 and Nper.\n * @param {*} nper The total number of payment periods for the investment.\n * @param {*} pv The present value of the investment. For a loan, Pv is the loan amount.\n *\n * @returns\n */\nfunction ISPMT(rate, per, nper, pv) {\n rate = parseNumber(rate);\n per = parseNumber(per);\n nper = parseNumber(nper);\n pv = parseNumber(pv);\n\n if (anyIsError(rate, per, nper, pv)) {\n return value\n }\n\n // Return interest\n return pv * rate * (per / nper - 1)\n}\n\n// TODO\n/**\n * -- Not implemented --\n *\n * Returns the Macauley modified duration for a security with an assumed par value of $100.\n *\n * Category: Financial\n *\n * @param {*} settlement The security's settlement date. The security settlement date is the date after the issue date when the security is traded to the buyer.\n * @param {*} maturity The security's maturity date. The maturity date is the date when the security expires.\n * @param {*} coupon The security's annual coupon rate.\n * @param {*} yld The security's annual yield.\n * @param {*} frequency The number of coupon payments per year. For annual payments, frequency = 1; for semiannual, frequency = 2; for quarterly, frequency = 4.\n * @param {*} basis Optional. The type of day count basis to use.\n * @returns\n */\nfunction MDURATION() {\n throw new Error('MDURATION is not implemented')\n}\n\n/**\n * Returns the internal rate of return where positive and negative cash flows are financed at different rates.\n *\n * Category: Financial\n *\n * @param {*} values An array or a reference to values that contain numbers. These numbers represent a series of payments (negative values) and income (positive values) occurring at regular periods.\n - Values must contain at least one positive value and one negative value to calculate the modified internal rate of return. Otherwise, MIRR returns the #DIV/0! error value.\n - If an array or reference argument contains text, logical values, or empty values, those values are ignored; however, values with the value zero are included.\n * @param {*} finance_rate The interest rate you pay on the money used in the cash flows.\n * @param {*} reinvest_rate The interest rate you receive on the cash flows as you reinvest them.\n * @returns\n */\nfunction MIRR(values, finance_rate, reinvest_rate) {\n values = parseNumberArray(flatten(values));\n finance_rate = parseNumber(finance_rate);\n reinvest_rate = parseNumber(reinvest_rate);\n\n if (anyIsError(values, finance_rate, reinvest_rate)) {\n return value\n }\n\n // Initialize number of values\n const n = values.length;\n\n // Lookup payments (negative values) and incomes (positive values)\n const payments = [];\n const incomes = [];\n\n for (let i = 0; i < n; i++) {\n if (values[i] < 0) {\n payments.push(values[i]);\n } else {\n incomes.push(values[i]);\n }\n }\n\n // Return modified internal rate of return\n const num = -NPV(reinvest_rate, incomes) * Math.pow(1 + reinvest_rate, n - 1);\n const den = NPV(finance_rate, payments) * (1 + finance_rate);\n\n return Math.pow(num / den, 1 / (n - 1)) - 1\n}\n\n/**\n * Returns the annual nominal interest rate.\n *\n * Category: Financial\n *\n * @param {*} effect_rate The effective interest rate.\n * @param {*} npery The number of compounding periods per year.\n * @returns\n */\nfunction NOMINAL(effect_rate, npery) {\n effect_rate = parseNumber(effect_rate);\n npery = parseNumber(npery);\n\n if (anyIsError(effect_rate, npery)) {\n return value\n }\n\n // Return error if rate <=0 or periods < 1\n if (effect_rate <= 0 || npery < 1) {\n return num\n }\n\n // Truncate periods if it is not an integer\n npery = parseInt(npery, 10);\n\n // Return nominal annual interest rate\n return (Math.pow(effect_rate + 1, 1 / npery) - 1) * npery\n}\n\n/**\n * Returns the number of periods for an investment.\n *\n * Category: Financial\n *\n * @param {*} rate The interest rate per period.\n * @param {*} pmt The payment made each period; it cannot change over the life of the annuity. Typically, pmt contains principal and interest but no other fees or taxes.\n * @param {*} pv The present value, or the lump-sum amount that a series of future payments is worth right now.\n * @param {*} fv Optional. The future value, or a cash balance you want to attain after the last payment is made. If fv is omitted, it is assumed to be 0 (the future value of a loan, for example, is 0).\n * @param {*} type Optional. The number 0 or 1 and indicates when payments are due.\n * @returns\n */\nfunction NPER(rate, pmt, pv, fv, type) {\n type = type === undefined ? 0 : type;\n fv = fv === undefined ? 0 : fv;\n\n rate = parseNumber(rate);\n pmt = parseNumber(pmt);\n pv = parseNumber(pv);\n fv = parseNumber(fv);\n type = parseNumber(type);\n\n if (anyIsError(rate, pmt, pv, fv, type)) {\n return value\n }\n\n if (rate === 0) {\n return -(pv + fv) / pmt\n } else {\n const num = pmt * (1 + rate * type) - fv * rate;\n const den = pv * rate + pmt * (1 + rate * type);\n\n return Math.log(num / den) / Math.log(1 + rate)\n }\n}\n\n/**\n * Returns the net present value of an investment based on a series of periodic cash flows and a discount rate.\n *\n * Category: Financial\n *\n * @param {*} rate The rate of discount over the length of one period.\n * @param {*} args value1, value2, ... Value1 is required, subsequent values are optional. 1 to 254 arguments representing the payments and income.\n - value1, value2, ... must be equally spaced in time and occur at the end of each period.\n - NPV uses the order of value1, value2, ... to interpret the order of cash flows. Be sure to enter your payment and income values in the correct sequence.\n - Arguments that are empty values, logical values, or text representations of numbers, error values, or text that cannot be translated into numbers are ignored.\n - If an argument is an array or reference, only numbers in that array or reference are counted. Empty values, logical values, text, or error values in the array or reference are ignored.\n * @returns\n */\nfunction NPV() {\n const args = parseNumberArray(flatten(arguments));\n\n if (args instanceof Error) {\n return args\n }\n\n // Lookup rate\n const rate = args[0];\n\n // Initialize net present value\n let value = 0;\n\n // Loop on all values\n for (let j = 1; j < args.length; j++) {\n value += args[j] / Math.pow(1 + rate, j);\n }\n\n // Return net present value\n return value\n}\n\n// TODO\n/**\n * -- Not implemented --\n *\n * Returns the price per $100 face value of a security with an odd first period.\n *\n * Category: Financial\n *\n * @param {*} settlement The security's settlement date. The security settlement date is the date after the issue date when the security is traded to the buyer.\n * @param {*} maturity The security's maturity date. The maturity date is the date when the security expires.\n * @param {*} issue The security's issue date.\n * @param {*} first_coupon The security's first coupon date.\n * @param {*} rate The security's interest rate.\n * @param {*} yld The security's annual yield.\n * @param {*} redemption The security's redemption value per $100 face value.\n * @param {*} frequency The number of coupon payments per year. For annual payments, frequency = 1; for semiannual, frequency = 2; for quarterly, frequency = 4.\n * @param {*} basis Optional. The type of day count basis to use.\n * @returns\n */\nfunction ODDFPRICE() {\n throw new Error('ODDFPRICE is not implemented')\n}\n\n// TODO\n/**\n * -- Not implemented --\n *\n * Returns the yield of a security with an odd first period.\n *\n * Category: Financial\n *\n * @param {*} settlement The security's settlement date. The security settlement date is the date after the issue date when the security is traded to the buyer.\n * @param {*} maturity The security's maturity date. The maturity date is the date when the security expires.\n * @param {*} issue The security's issue date.\n * @param {*} first_coupon The security's first coupon date.\n * @param {*} rate The security's interest rate.\n * @param {*} pr The security's price.\n * @param {*} redemption The security's redemption value per $100 face value.\n * @param {*} frequency The number of coupon payments per year. For annual payments, frequency = 1; for semiannual, frequency = 2; for quarterly, frequency = 4.\n * @param {*} basis Optional. The type of day count basis to use.\n * @returns\n */\nfunction ODDFYIELD() {\n throw new Error('ODDFYIELD is not implemented')\n}\n\n// TODO\n/**\n * -- Not implemented --\n *\n * Returns the price per $100 face value of a security with an odd last period.\n *\n * Category: Financial\n *\n * @param {*} settlement The security's settlement date. The security settlement date is the date after the issue date when the security is traded to the buyer.\n * @param {*} maturity The security's maturity date. The maturity date is the date when the security expires.\n * @param {*} last_interest The security's last coupon date.\n * @param {*} rate The security's interest rate.\n * @param {*} yld The security's annual yield.\n * @param {*} redemption The security's redemption value per $100 face value.\n * @param {*} frequency The number of coupon payments per year. For annual payments, frequency = 1; for semiannual, frequency = 2; for quarterly, frequency = 4.\n * @param {*} basis Optional. The type of day count basis to use.\n * @returns\n */\nfunction ODDLPRICE() {\n throw new Error('ODDLPRICE is not implemented')\n}\n\n// TODO\n/**\n * -- Not implemented --\n *\n * Returns the yield of a security with an odd last period.\n *\n * Category: Financial\n *\n * @param {*} settlement The security's settlement date. The security settlement date is the date after the issue date when the security is traded to the buyer.\n * @param {*} maturity The security's maturity date. The maturity date is the date when the security expires.\n * @param {*} last_interest The security's last coupon date.\n * @param {*} rate The security's interest rate\n * @param {*} pr The security's price.\n * @param {*} redemption The security's redemption value per $100 face value.\n * @param {*} frequency The number of coupon payments per year. For annual payments, frequency = 1; for semiannual, frequency = 2; for quarterly, frequency = 4.\n * @param {*} basis Optional. The type of day count basis to use.\n * @returns\n */\nfunction ODDLYIELD() {\n throw new Error('ODDLYIELD is not implemented')\n}\n\n/**\n * Returns the number of periods required by an investment to reach a specified value.\n *\n * Category: Financial\n *\n * @param {*} rate Rate is the interest rate per period.\n * @param {*} pv Pv is the present value of the investment.\n * @param {*} fv Fv is the desired future value of the investment.\n * @returns\n */\nfunction PDURATION(rate, pv, fv) {\n rate = parseNumber(rate);\n pv = parseNumber(pv);\n fv = parseNumber(fv);\n\n if (anyIsError(rate, pv, fv)) {\n return value\n }\n\n // Return error if rate <=0\n if (rate <= 0) {\n return num\n }\n\n // Return number of periods\n return (Math.log(fv) - Math.log(pv)) / Math.log(1 + rate)\n}\n\n/**\n * Returns the periodic payment for an annuity.\n *\n * Category: Financial\n *\n * @param {*} rate The interest rate for the loan.\n * @param {*} nper The total number of payments for the loan.\n * @param {*} pv The present value, or the total amount that a series of future payments is worth now; also known as the principal.\n * @param {*} fv Optional. The future value, or a cash balance you want to attain after the last payment is made. If fv is omitted, it is assumed to be 0 (zero), that is, the future value of a loan is 0.\n * @param {*} type Optional. The number 0 (zero) or 1 and indicates when payments are due.\n * @returns\n */\nfunction PMT(rate, nper, pv, fv, type) {\n // Credits: algorithm inspired by Apache OpenOffice\n fv = fv || 0;\n type = type || 0;\n\n rate = parseNumber(rate);\n nper = parseNumber(nper);\n pv = parseNumber(pv);\n fv = parseNumber(fv);\n type = parseNumber(type);\n\n if (anyIsError(rate, nper, pv, fv, type)) {\n return value\n }\n\n // Return payment\n let result;\n\n if (rate === 0) {\n result = (pv + fv) / nper;\n } else {\n const term = Math.pow(1 + rate, nper);\n\n result =\n type === 1\n ? ((fv * rate) / (term - 1) + (pv * rate) / (1 - 1 / term)) / (1 + rate)\n : (fv * rate) / (term - 1) + (pv * rate) / (1 - 1 / term);\n }\n\n return -result\n}\n\n/**\n * Returns the payment on the principal for an investment for a given period.\n *\n * Category: Financial\n *\n * @param {*} rate The interest rate per period.\n * @param {*} per Specifies the period and must be in the range 1 to nper.\n * @param {*} nper The total number of payment periods in an annuity.\n * @param {*} pv The present value — the total amount that a series of future payments is worth now.\n * @param {*} fv Optional. The future value, or a cash balance you want to attain after the last payment is made. If fv is omitted, it is assumed to be 0 (zero), that is, the future value of a loan is 0.\n * @param {*} type Optional. The number 0 or 1 and indicates when payments are due.\n * @returns\n */\nfunction PPMT(rate, per, nper, pv, fv, type) {\n fv = fv || 0;\n type = type || 0;\n\n rate = parseNumber(rate);\n nper = parseNumber(nper);\n pv = parseNumber(pv);\n fv = parseNumber(fv);\n type = parseNumber(type);\n\n if (anyIsError(rate, nper, pv, fv, type)) {\n return value\n }\n\n return PMT(rate, nper, pv, fv, type) - IPMT(rate, per, nper, pv, fv, type)\n}\n\n// TODO\n/**\n * -- Not implemented --\n *\n * Returns the price per $100 face value of a security that pays periodic interest.\n *\n * Category: Financial\n *\n * @param {*} settlement The security's settlement date. The security settlement date is the date after the issue date when the security is traded to the buyer.\n * @param {*} maturity The security's maturity date. The maturity date is the date when the security expires.\n * @param {*} rate The security's annual coupon rate.\n * @param {*} yld The security's annual yield.\n * @param {*} redemption The security's redemption value per $100 face value.\n * @param {*} frequency The number of coupon payments per year. For annual payments, frequency = 1; for semiannual, frequency = 2; for quarterly, frequency = 4.\n * @param {*} basis Optional. The type of day count basis to use.\n * @returns\n */\nfunction PRICE() {\n throw new Error('PRICE is not implemented')\n}\n\n// TODO\n/**\n * -- Not implemented --\n *\n * Returns the price per $100 face value of a discounted security.\n *\n * Category: Financial\n *\n * @param {*} settlement The security's settlement date. The security settlement date is the date after the issue date when the security is traded to the buyer.\n * @param {*} maturity The security's maturity date. The maturity date is the date when the security expires.\n * @param {*} discount The security's discount rate.\n * @param {*} redemption The security's redemption value per $100 face value.\n * @param {*} basis Optional. The type of day count basis to use.\n * @returns\n */\nfunction PRICEDISC() {\n throw new Error('PRICEDISC is not implemented')\n}\n\n// TODO\n/**\n * -- Not implemented --\n *\n * Returns the price per $100 face value of a security that pays interest at maturity.\n *\n * Category: Financial\n *\n * @param {*} settlement The security's settlement date. The security settlement date is the date after the issue date when the security is traded to the buyer.\n * @param {*} maturity The security's maturity date. The maturity date is the date when the security expires.\n * @param {*} issue The security's issue date, expressed as a serial date number.\n * @param {*} rate The security's interest rate at date of issue.\n * @param {*} yld The security's annual yield.\n * @param {*} basis Optional. The type of day count basis to use.\n * @returns\n */\nfunction PRICEMAT() {\n throw new Error('PRICEMAT is not implemented')\n}\n\n/**\n * Returns the present value of an investment.\n *\n * Category: Financial\n *\n * @param {*} rate The interest rate per period. For example, if you obtain an automobile loan at a 10 percent annual interest rate and make monthly payments, your interest rate per month is 10%/12, or 0.83%. You would enter 10%/12, or 0.83%, or 0.0083, into the formula as the rate.\n * @param {*} nper The total number of payment periods in an annuity. For example, if you get a four-year car loan and make monthly payments, your loan has 4*12 (or 48) periods. You would enter 48 into the formula for nper.\n * @param {*} pmt The payment made each period and cannot change over the life of the annuity. Typically, pmt includes principal and interest but no other fees or taxes. For example, the monthly payments on a $10,000, four-year car loan at 12 percent are $263.33. You would enter -263.33 into the formula as the pmt. If pmt is omitted, you must include the fv argument.\n * @param {*} fv Optional. The future value, or a cash balance you want to attain after the last payment is made. If fv is omitted, it is assumed to be 0 (the future value of a loan, for example, is 0). For example, if you want to save $50,000 to pay for a special project in 18 years, then $50,000 is the future value. You could then make a conservative guess at an interest rate and determine how much you must save each month. If fv is omitted, you must include the pmt argument.\n * @param {*} type Optional. The number 0 or 1 and indicates when payments are due.\n * @returns\n */\nfunction PV(rate, per, pmt, fv, type) {\n fv = fv || 0;\n type = type || 0;\n\n rate = parseNumber(rate);\n per = parseNumber(per);\n pmt = parseNumber(pmt);\n fv = parseNumber(fv);\n type = parseNumber(type);\n\n if (anyIsError(rate, per, pmt, fv, type)) {\n return value\n }\n\n // Return present value\n return rate === 0\n ? -pmt * per - fv\n : (((1 - Math.pow(1 + rate, per)) / rate) * pmt * (1 + rate * type) - fv) / Math.pow(1 + rate, per)\n}\n\n/**\n * Returns the interest rate per period of an annuity.\n *\n * Category: Financial\n *\n * @param {*} nper The total number of payment periods in an annuity.\n * @param {*} pmt The payment made each period and cannot change over the life of the annuity. Typically, pmt includes principal and interest but no other fees or taxes. If pmt is omitted, you must include the fv argument.\n * @param {*} pv The present value — the total amount that a series of future payments is worth now.\n * @param {*} fv Optional. The future value, or a cash balance you want to attain after the last payment is made. If fv is omitted, it is assumed to be 0 (the future value of a loan, for example, is 0). If fv is omitted, you must include the pmt argument.\n * @param {*} type Optional. The number 0 or 1 and indicates when payments are due.\n * @param {*} guess Optional. Your guess for what the rate will be. If you omit guess, it is assumed to be 10 percent. If RATE does not converge, try different values for guess. RATE usually converges if guess is between 0 and 1.\n - If you omit guess, it is assumed to be 10 percent.\n - If RATE does not converge, try different values for guess. RATE usually converges if guess is between 0 and 1.\n * @returns\n */\nfunction RATE(nper, pmt, pv, fv, type, guess) {\n guess = guess === undefined ? 0.01 : guess;\n fv = fv === undefined ? 0 : fv;\n type = type === undefined ? 0 : type;\n\n nper = parseNumber(nper);\n pmt = parseNumber(pmt);\n pv = parseNumber(pv);\n fv = parseNumber(fv);\n type = parseNumber(type);\n guess = parseNumber(guess);\n\n if (anyIsError(nper, pmt, pv, fv, type, guess)) {\n return value\n }\n\n const epsMax = 1e-10;\n const iterMax = 20;\n let rate = guess;\n\n type = type ? 1 : 0;\n\n for (let i = 0; i < iterMax; i++) {\n if (rate <= -1) {\n return num\n }\n\n let y, f;\n\n if (Math.abs(rate) < epsMax) {\n y = pv * (1 + nper * rate) + pmt * (1 + rate * type) * nper + fv;\n } else {\n f = Math.pow(1 + rate, nper);\n y = pv * f + pmt * (1 / rate + type) * (f - 1) + fv;\n }\n\n if (Math.abs(y) < epsMax) {\n return rate\n }\n\n let dy;\n\n if (Math.abs(rate) < epsMax) {\n dy = pv * nper + pmt * type * nper;\n } else {\n f = Math.pow(1 + rate, nper);\n const df = nper * Math.pow(1 + rate, nper - 1);\n dy = pv * df + pmt * (1 / rate + type) * df + pmt * (-1 / (rate * rate)) * (f - 1);\n }\n\n rate -= y / dy;\n }\n\n return rate\n}\n\n// TODO\n/**\n * -- Not implemented --\n *\n * Returns the amount received at maturity for a fully invested security.\n *\n * Category: Financial\n *\n * @param {*} settlement The security's settlement date. The security settlement date is the date after the issue date when the security is traded to the buyer.\n * @param {*} maturity The security's maturity date. The maturity date is the date when the security expires.\n * @param {*} investment The amount invested in the security.\n * @param {*} discount The security's discount rate.\n * @param {*} basis Optional. The type of day count basis to use.\n * @returns\n */\nfunction RECEIVED() {\n throw new Error('RECEIVED is not implemented')\n}\n\n/**\n * Returns an equivalent interest rate for the growth of an investment.\n *\n * Category: Financial\n *\n * @param {*} nper Nper is the number of periods for the investment.\n * @param {*} pv Pv is the present value of the investment.\n * @param {*} fv Fv is the future value of the investment.\n * @returns\n */\nfunction RRI(nper, pv, fv) {\n nper = parseNumber(nper);\n pv = parseNumber(pv);\n fv = parseNumber(fv);\n\n if (anyIsError(nper, pv, fv)) {\n return value\n }\n\n // Return error if nper or present is equal to 0 (zero)\n if (nper === 0 || pv === 0) {\n return num\n }\n\n // Return equivalent interest rate\n return Math.pow(fv / pv, 1 / nper) - 1\n}\n\n/**\n * Returns the straight-line depreciation of an asset for one period.\n *\n * Category: Financial\n *\n * @param {*} cost The initial cost of the asset.\n * @param {*} salvage The value at the end of the depreciation (sometimes called the salvage value of the asset).\n * @param {*} life The number of periods over which the asset is depreciated (sometimes called the useful life of the asset).\n * @returns\n */\nfunction SLN(cost, salvage, life) {\n cost = parseNumber(cost);\n salvage = parseNumber(salvage);\n life = parseNumber(life);\n\n if (anyIsError(cost, salvage, life)) {\n return value\n }\n\n // Return error if life equal to 0 (zero)\n if (life === 0) {\n return num\n }\n\n // Return straight-line depreciation\n return (cost - salvage) / life\n}\n\n/**\n * Returns the sum-of-years' digits depreciation of an asset for a specified period.\n *\n * Category: Financial\n *\n * @param {*} cost The initial cost of the asset.\n * @param {*} salvage The value at the end of the depreciation (sometimes called the salvage value of the asset).\n * @param {*} life The number of periods over which the asset is depreciated (sometimes called the useful life of the asset).\n * @param {*} per The period and must use the same units as life.\n * @returns\n */\nfunction SYD(cost, salvage, life, per) {\n // Return error if any of the parameters is not a number\n cost = parseNumber(cost);\n salvage = parseNumber(salvage);\n life = parseNumber(life);\n per = parseNumber(per);\n\n if (anyIsError(cost, salvage, life, per)) {\n return value\n }\n\n // Return error if life equal to 0 (zero)\n if (life === 0) {\n return num\n }\n\n // Return error if period is lower than 1 or greater than life\n if (per < 1 || per > life) {\n return num\n }\n\n // Truncate period if it is not an integer\n per = parseInt(per, 10);\n\n // Return straight-line depreciation\n return ((cost - salvage) * (life - per + 1) * 2) / (life * (life + 1))\n}\n\n/**\n * Returns the bond-equivalent yield for a Treasury bill.\n *\n * Category: Financial\n *\n * @param {*} settlement The Treasury bill's settlement date. The security settlement date is the date after the issue date when the Treasury bill is traded to the buyer.\n * @param {*} maturity The Treasury bill's maturity date. The maturity date is the date when the Treasury bill expires.\n * @param {*} discount The Treasury bill's discount rate.\n * @returns\n */\nfunction TBILLEQ(settlement, maturity, discount) {\n settlement = parseDate(settlement);\n maturity = parseDate(maturity);\n discount = parseNumber(discount);\n\n if (anyIsError(settlement, maturity, discount)) {\n return value\n }\n\n // Return error if discount is lower than or equal to zero\n if (discount <= 0) {\n return num\n }\n\n // Return error if settlement is greater than maturity\n if (settlement > maturity) {\n return num\n }\n\n // Return error if maturity is more than one year after settlement\n if (maturity - settlement > 365 * 24 * 60 * 60 * 1000) {\n return num\n }\n\n // Return bond-equivalent yield\n return (365 * discount) / (360 - discount * DAYS360(settlement, maturity, false))\n}\n\n/**\n * Returns the price per $100 face value for a Treasury bill.\n *\n * Category: Financial\n *\n * @param {*} settlement The Treasury bill's settlement date. The security settlement date is the date after the issue date when the Treasury bill is traded to the buyer.\n * @param {*} maturity The Treasury bill's maturity date. The maturity date is the date when the Treasury bill expires.\n * @param {*} discount The Treasury bill's discount rate.\n * @returns\n */\nfunction TBILLPRICE(settlement, maturity, discount) {\n settlement = parseDate(settlement);\n maturity = parseDate(maturity);\n discount = parseNumber(discount);\n\n if (anyIsError(settlement, maturity, discount)) {\n return value\n }\n\n // Return error if discount is lower than or equal to zero\n if (discount <= 0) {\n return num\n }\n\n // Return error if settlement is greater than maturity\n if (settlement > maturity) {\n return num\n }\n\n // Return error if maturity is more than one year after settlement\n if (maturity - settlement > 365 * 24 * 60 * 60 * 1000) {\n return num\n }\n\n // Return bond-equivalent yield\n return 100 * (1 - (discount * DAYS360(settlement, maturity, false)) / 360)\n}\n\n/**\n * Returns the yield for a Treasury bill.\n *\n * Category: Financial\n *\n * @param {*} settlement The Treasury bill's settlement date. The security settlement date is the date after the issue date when the Treasury bill is traded to the buyer.\n * @param {*} maturity The Treasury bill's maturity date. The maturity date is the date when the Treasury bill expires.\n * @param {*} pr The Treasury bill's price per $100 face value.\n * @returns\n */\nfunction TBILLYIELD(settlement, maturity, pr) {\n settlement = parseDate(settlement);\n maturity = parseDate(maturity);\n pr = parseNumber(pr);\n\n if (anyIsError(settlement, maturity, pr)) {\n return value\n }\n\n // Return error if price is lower than or equal to zero\n if (pr <= 0) {\n return num\n }\n\n // Return error if settlement is greater than maturity\n if (settlement > maturity) {\n return num\n }\n\n // Return error if maturity is more than one year after settlement\n if (maturity - settlement > 365 * 24 * 60 * 60 * 1000) {\n return num\n }\n\n // Return bond-equivalent yield\n return ((100 - pr) * 360) / (pr * DAYS360(settlement, maturity, false))\n}\n\n// TODO\n/**\n * -- Not implemented --\n * \n * Returns the depreciation of an asset for a specified or partial period by using a declining balance method.\n *\n * Category: Financial\n *\n * @param {*} cost The initial cost of the asset.\n * @param {*} salvage The value at the end of the depreciation (sometimes called the salvage value of the asset). This value can be 0.\n * @param {*} life The number of periods over which the asset is depreciated (sometimes called the useful life of the asset).\n * @param {*} start_period The starting period for which you want to calculate the depreciation. Start_period must use the same units as life.\n * @param {*} end_period The ending period for which you want to calculate the depreciation. End_period must use the same units as life.\n * @param {*} factor Optional. The rate at which the balance declines. If factor is omitted, it is assumed to be 2 (the double-declining balance method). Change factor if you do not want to use the double-declining balance method. For a description of the double-declining balance method, see DDB.\n * @param {*} no_switch Optional. A logical value specifying whether to switch to straight-line depreciation when depreciation is greater than the declining balance calculation.\n - If no_switch is TRUE, Microsoft Excel does not switch to straight-line depreciation even when the depreciation is greater than the declining balance calculation.\n - If no_switch is FALSE or omitted, Excel switches to straight-line depreciation when depreciation is greater than the declining balance calculation.\n * @returns\n */\nfunction VDB() {\n throw new Error('VDB is not implemented')\n}\n\n/**\n * Returns the internal rate of return for a schedule of cash flows that is not necessarily periodic.\n *\n * Category: Financial\n *\n * @param {*} values A series of cash flows that corresponds to a schedule of payments in dates. The first payment is optional and corresponds to a cost or payment that occurs at the beginning of the investment. If the first value is a cost or payment, it must be a negative value. All succeeding payments are discounted based on a 365-day year. The series of values must contain at least one positive and one negative value.\n * @param {*} dates A schedule of payment dates that corresponds to the cash flow payments. Dates may occur in any order. Dates should be entered by using the DATE function, or as results of other formulas or functions. For example, use DATE(2008,5,23) for the 23rd day of May, 2008. Problems can occur if dates are entered as text. .\n * @param {*} guess Optional. A number that you guess is close to the result of XIRR.\n * @returns\n */\nfunction XIRR(values, dates, guess) {\n // Credits: algorithm inspired by Apache OpenOffice\n values = parseNumberArray(flatten(values));\n dates = parseDateArray(flatten(dates));\n guess = parseNumber(guess);\n\n if (anyIsError(values, dates, guess)) {\n return value\n }\n\n // Calculates the resulting amount\n const irrResult = (values, dates, rate) => {\n const r = rate + 1;\n let result = values[0];\n\n for (let i = 1; i < values.length; i++) {\n result += values[i] / Math.pow(r, DAYS(dates[i], dates[0]) / 365);\n }\n\n return result\n };\n\n // Calculates the first derivation\n const irrResultDeriv = (values, dates, rate) => {\n const r = rate + 1;\n let result = 0;\n\n for (let i = 1; i < values.length; i++) {\n const frac = DAYS(dates[i], dates[0]) / 365;\n result -= (frac * values[i]) / Math.pow(r, frac + 1);\n }\n\n return result\n };\n\n // Check that values contains at least one positive value and one negative value\n let positive = false;\n let negative = false;\n\n for (let i = 0; i < values.length; i++) {\n if (values[i] > 0) {\n positive = true;\n }\n\n if (values[i] < 0) {\n negative = true;\n }\n }\n\n // Return error if values does not contain at least one positive value and one negative value\n if (!positive || !negative) {\n return num\n }\n\n // Initialize guess and resultRate\n guess = guess || 0.1;\n let resultRate = guess;\n\n // Set maximum epsilon for end of iteration\n const epsMax = 1e-10;\n\n // Implement Newton's method\n let newRate, epsRate, resultValue;\n let contLoop = true;\n\n do {\n resultValue = irrResult(values, dates, resultRate);\n newRate = resultRate - resultValue / irrResultDeriv(values, dates, resultRate);\n epsRate = Math.abs(newRate - resultRate);\n resultRate = newRate;\n contLoop = epsRate > epsMax && Math.abs(resultValue) > epsMax;\n } while (contLoop)\n\n // Return internal rate of return\n return resultRate\n}\n\n/**\n * Returns the net present value for a schedule of cash flows that is not necessarily periodic.\n *\n * Category: Financial\n *\n * @param {*} rate The discount rate to apply to the cash flows.\n * @param {*} values A series of cash flows that corresponds to a schedule of payments in dates. The first payment is optional and corresponds to a cost or payment that occurs at the beginning of the investment. If the first value is a cost or payment, it must be a negative value. All succeeding payments are discounted based on a 365-day year. The series of values must contain at least one positive value and one negative value.\n * @param {*} dates A schedule of payment dates that corresponds to the cash flow payments. The first payment date indicates the beginning of the schedule of payments. All other dates must be later than this date, but they may occur in any order.\n * @returns\n */\nfunction XNPV(rate, values, dates) {\n rate = parseNumber(rate);\n values = parseNumberArray(flatten(values));\n dates = parseDateArray(flatten(dates));\n\n if (anyIsError(rate, values, dates)) {\n return value\n }\n\n let result = 0;\n\n for (let i = 0; i < values.length; i++) {\n result += values[i] / Math.pow(1 + rate, DAYS(dates[i], dates[0]) / 365);\n }\n\n return result\n}\n\n// TODO\n/**\n * -- Not implemented --\n *\n * Returns the yield on a security that pays periodic interest.\n *\n * Category: Financial\n *\n * @param {*} settlement The security's settlement date. The security settlement date is the date after the issue date when the security is traded to the buyer.\n * @param {*} maturity The security's maturity date. The maturity date is the date when the security expires.\n * @param {*} rate The security's annual coupon rate.\n * @param {*} pr The security's price per $100 face value.\n * @param {*} redemption The security's redemption value per $100 face value.\n * @param {*} frequency The number of coupon payments per year. For annual payments, frequency = 1; for semiannual, frequency = 2; for quarterly, frequency = 4.\n * @param {*} basis Optional. The type of day count basis to use.\n * @returns\n */\nfunction YIELD() {\n throw new Error('YIELD is not implemented')\n}\n\n// TODO\n/**\n * -- Not implemented --\n *\n * Returns the annual yield for a discounted security; for example, a Treasury bill.\n *\n * Category: Financial\n *\n * @param {*} settlement The security's settlement date. The security settlement date is the date after the issue date when the security is traded to the buyer.\n * @param {*} maturity The security's maturity date. The maturity date is the date when the security expires.\n * @param {*} pr The security's price per $100 face value.\n * @param {*} redemption The security's redemption value per $100 face value.\n * @param {*} basis Optional. The type of day count basis to use.\n * @returns\n */\nfunction YIELDDISC() {\n throw new Error('YIELDDISC is not implemented')\n}\n\n// TODO\n/**\n * -- Not implemented --\n *\n * Returns the annual yield of a security that pays interest at maturity.\n *\n * Category: Financial\n *\n * @param {*} settlement The security's settlement date. The security settlement date is the date after the issue date when the security is traded to the buyer.\n * @param {*} maturity The security's maturity date. The maturity date is the date when the security expires.\n * @param {*} issue The security's issue date, expressed as a serial date number.\n * @param {*} rate The security's interest rate at date of issue.\n * @param {*} pr The security's price per $100 face value.\n * @param {*} basis Optional. The type of day count basis to use.\n * @returns\n */\nfunction YIELDMAT() {\n throw new Error('YIELDMAT is not implemented')\n}\n\n/**\n * Returns TRUE if all of its arguments are TRUE.\n *\n * Category: Logical\n *\n * @returns\n */\nfunction AND() {\n const args = flatten(arguments);\n let result = value;\n\n for (let i = 0; i < args.length; i++) {\n if (args[i] instanceof Error) {\n return args[i]\n }\n\n if (args[i] === undefined || args[i] === null || typeof args[i] === 'string') {\n continue\n }\n\n if (result === value) {\n result = true;\n }\n\n if (!args[i]) {\n result = false;\n }\n }\n\n return result\n}\n\n/**\n * Returns the logical value FALSE.\n *\n * Category: Logical\n *\n * @returns\n */\nfunction FALSE() {\n return false\n}\n\n/**\n * Specifies a logical test to perform.\n *\n * Category: Logical\n *\n * @param {*} logical_test\n * @param {*} value_if_true\n * @param {*} value_if_false\n *\n * @returns\n */\nfunction IF(logical_test, value_if_true, value_if_false) {\n if (logical_test instanceof Error) {\n return logical_test\n }\n\n value_if_true = arguments.length >= 2 ? value_if_true : true;\n\n if (value_if_true === undefined || value_if_true === null) {\n value_if_true = 0;\n }\n\n value_if_false = arguments.length === 3 ? value_if_false : false;\n\n if (value_if_false === undefined || value_if_false === null) {\n value_if_false = 0;\n }\n\n return logical_test ? value_if_true : value_if_false\n}\n\n/**\n * Checks whether one or more conditions are met and returns a value that corresponds to the first TRUE condition.\n *\n * Category: Logical\n *\n * @returns\n */\nfunction IFS() {\n for (let i = 0; i < arguments.length / 2; i++) {\n if (arguments[i * 2]) {\n return arguments[i * 2 + 1]\n }\n }\n\n return na\n}\n\n/**\n * Returns a value you specify if a formula evaluates to an error; otherwise, returns the result of the formula.\n *\n * Category: Logical\n *\n * @param {*} value The argument that is checked for an error.\n * @param {*} value_if_error The value to return if the formula evaluates to an error. The following error types are evaluated: #N/A, #VALUE!, #REF!, #DIV/0!, #NUM!, #NAME?, or #NULL!.\n * @returns\n */\nfunction IFERROR(value, value_if_error) {\n if (ISERROR(value)) {\n return value_if_error\n }\n\n return value\n}\n\n/**\n * Returns the value you specify if the expression resolves to #N/A, otherwise returns the result of the expression.\n *\n * Category: Logical\n *\n * @returns\n */\nfunction IFNA(value, value_if_na) {\n return value === na ? value_if_na : value\n}\n\n/**\n * Reverses the logic of its argument.\n *\n * Category: Logical\n *\n * @returns\n */\nfunction NOT(logical) {\n if (typeof logical === 'string') {\n return value\n }\n\n if (logical instanceof Error) {\n return logical\n }\n\n return !logical\n}\n\n/**\n * Returns TRUE if any argument is TRUE.\n *\n * Category: Logical\n *\n * @returns\n */\nfunction OR() {\n const args = flatten(arguments);\n let result = value;\n\n for (let i = 0; i < args.length; i++) {\n if (args[i] instanceof Error) {\n return args[i]\n }\n\n if (args[i] === undefined || args[i] === null || typeof args[i] === 'string') {\n continue\n }\n\n if (result === value) {\n result = false;\n }\n\n if (args[i]) {\n result = true;\n }\n }\n\n return result\n}\n\n/**\n * Returns the logical value TRUE.\n *\n * Category: Logical\n *\n * @returns\n */\nfunction TRUE() {\n return true\n}\n\n/**\n * Returns a logical exclusive OR of all arguments.\n *\n * Category: Logical\n *\n * @param {*} args logical1, logical2,… Logical 1 is required, subsequent logical values are optional. 1 to 254 conditions you want to test that can be either TRUE or FALSE, and can be logical values, arrays, or references.\n * @returns\n */\nfunction XOR() {\n const args = flatten(arguments);\n let result = value;\n\n for (let i = 0; i < args.length; i++) {\n if (args[i] instanceof Error) {\n return args[i]\n }\n\n if (args[i] === undefined || args[i] === null || typeof args[i] === 'string') {\n continue\n }\n\n if (result === value) {\n result = 0;\n }\n\n if (args[i]) {\n result++;\n }\n }\n\n if (result === value) {\n return result\n }\n\n return !!(Math.floor(Math.abs(result)) & 1)\n}\n\n/**\n * Evaluates an expression against a list of values and returns the result corresponding to the first matching value. If there is no match, an optional default value may be returned.\n *\n * Category: Logical\n *\n * @returns\n */\nfunction SWITCH() {\n let result;\n\n if (arguments.length > 0) {\n const targetValue = arguments[0];\n const argc = arguments.length - 1;\n const switchCount = Math.floor(argc / 2);\n let switchSatisfied = false;\n const hasDefaultClause = argc % 2 !== 0;\n const defaultClause = argc % 2 === 0 ? null : arguments[arguments.length - 1];\n\n if (switchCount) {\n for (let index = 0; index < switchCount; index++) {\n if (targetValue === arguments[index * 2 + 1]) {\n result = arguments[index * 2 + 2];\n switchSatisfied = true;\n break\n }\n }\n }\n\n if (!switchSatisfied) {\n result = hasDefaultClause ? defaultClause : na;\n }\n } else {\n result = value;\n }\n\n return result\n}\n\nconst FLATTEN = flatten;\n\nfunction ARGS2ARRAY() {\n return Array.prototype.slice.call(arguments, 0)\n}\n\n/**\n * Formula.js only\n *\n * @param {*} context\n * @param {*} reference\n * @returns\n */\nfunction REFERENCE(context, reference) {\n if (!arguments.length) {\n return error\n }\n\n try {\n const path = reference.split('.');\n let result = context;\n\n for (let i = 0; i < path.length; ++i) {\n const step = path[i];\n\n if (step[step.length - 1] === ']') {\n const opening = step.indexOf('[');\n const index = step.substring(opening + 1, step.length - 1);\n result = result[step.substring(0, opening)][index];\n } else {\n result = result[step];\n }\n }\n\n return result\n } catch (error) {}\n}\n\n/**\n * Formula.js only\n *\n * @param {*} array\n * @param {*} separator\n * @returns\n */\nfunction JOIN(array, separator) {\n return array.join(separator)\n}\n\n/**\n * Formula.js only\n *\n * @returns\n */\nfunction NUMBERS() {\n const possibleNumbers = flatten(arguments);\n\n return possibleNumbers.filter((el) => typeof el === 'number')\n}\n\nexport { ABS, ACCRINT, ACCRINTM, ACOS, ACOSH, ACOT, ACOTH, ADD, AGGREGATE, AMORDEGRC, AMORLINC, AND, ARABIC, ARGS2ARRAY, ASC, ASIN, ASINH, ATAN, ATAN2, ATANH, AVEDEV, AVERAGE, AVERAGEA, AVERAGEIF, AVERAGEIFS, BAHTTEXT, BASE, BESSELI, BESSELJ, BESSELK, BESSELY, BETA, BETADIST, BETAINV, BIN2DEC, BIN2HEX, BIN2OCT, BINOM, BINOMDIST, BITAND, BITLSHIFT, BITOR, BITRSHIFT, BITXOR, CEILING, CEILINGMATH, CEILINGPRECISE, CELL, CHAR, CHIDIST, CHIDISTRT, CHIINV, CHIINVRT, CHISQ, CHITEST, CHOOSE, CLEAN, CODE, COLUMN, COLUMNS, COMBIN, COMBINA, COMPLEX, CONCAT, CONCATENATE, CONFIDENCE, CONVERT, CORREL, COS, COSH, COT, COTH, COUNT, COUNTA, COUNTBLANK, COUNTIF, COUNTIFS, COUNTIN, COUNTUNIQUE, COUPDAYBS, COUPDAYS, COUPDAYSNC, COUPNCD, COUPNUM, COUPPCD, COVAR, COVARIANCE, COVARIANCEP, COVARIANCES, CRITBINOM, CSC, CSCH, CUMIPMT, CUMPRINC, DATE, DATEDIF, DATEVALUE, DAVERAGE, DAY, DAYS, DAYS360, DB, DBCS, DCOUNT, DCOUNTA, DDB, DEC2BIN, DEC2HEX, DEC2OCT, DECIMAL, DEGREES, DELTA, DEVSQ, DGET, DISC, DIVIDE, DMAX, DMIN, DOLLAR, DOLLARDE, DOLLARFR, DPRODUCT, DSTDEV, DSTDEVP, DSUM, DURATION, DVAR, DVARP, E, EDATE, EFFECT, EOMONTH, EQ, ERF, ERFC, ERFCPRECISE, ERFPRECISE, ERROR, EVEN, EXACT, EXP, EXPON, EXPONDIST, F, FACT, FACTDOUBLE, FALSE, FDIST, FDISTRT, FIND, FINDFIELD, FINV, FINVRT, FISHER, FISHERINV, FIXED, FLATTEN, FLOOR, FLOORMATH, FLOORPRECISE, FORECAST, FREQUENCY, FTEST, FV, FVSCHEDULE, GAMMA, GAMMADIST, GAMMAINV, GAMMALN, GAMMALNPRECISE, GAUSS, GCD, GEOMEAN, GESTEP, GROWTH, GT, GTE, HARMEAN, HEX2BIN, HEX2DEC, HEX2OCT, HLOOKUP, HOUR, HTML2TEXT, HYPGEOM, HYPGEOMDIST, IF, IFERROR, IFNA, IFS, IMABS, IMAGINARY, IMARGUMENT, IMCONJUGATE, IMCOS, IMCOSH, IMCOT, IMCSC, IMCSCH, IMDIV, IMEXP, IMLN, IMLOG10, IMLOG2, IMPOWER, IMPRODUCT, IMREAL, IMSEC, IMSECH, IMSIN, IMSINH, IMSQRT, IMSUB, IMSUM, IMTAN, INDEX, INFO, INT, INTERCEPT, INTERVAL, INTRATE, IPMT, IRR, ISBINARY, ISBLANK, ISERR, ISERROR, ISEVEN, ISFORMULA, ISLOGICAL, ISNA, ISNONTEXT, ISNUMBER, ISO, ISODD, ISOWEEKNUM, ISPMT, ISREF, ISTEXT, JOIN, KURT, LARGE, LCM, LEFT, LEN, LINEST, LN, LN10, LN2, LOG, LOG10, LOG10E, LOG2E, LOGEST, LOGINV, LOGNORM, LOGNORMDIST, LOGNORMINV, LOOKUP, LOWER, LT, LTE, MATCH, MAX, MAXA, MDURATION, MEDIAN, MID, MIN, MINA, MINUS, MINUTE, MIRR, MOD, MODE, MODEMULT, MODESNGL, MONTH, MROUND, MULTINOMIAL, MULTIPLY, N, NA, NE, NEGBINOM, NEGBINOMDIST, NETWORKDAYS, NETWORKDAYSINTL, NOMINAL, NORM, NORMDIST, NORMINV, NORMSDIST, NORMSINV, NOT, NOW, NPER, NPV, NUMBERS, NUMBERVALUE, OCT2BIN, OCT2DEC, OCT2HEX, ODD, ODDFPRICE, ODDFYIELD, ODDLPRICE, ODDLYIELD, OR, PDURATION, PEARSON, PERCENTILE, PERCENTILEEXC, PERCENTILEINC, PERCENTRANK, PERCENTRANKEXC, PERCENTRANKINC, PERMUT, PERMUTATIONA, PHI, PI, PMT, POISSON, POISSONDIST, POW, POWER, PPMT, PRICE, PRICEDISC, PRICEMAT, PROB, PRODUCT, PRONETIC, PROPER, PV, QUARTILE, QUARTILEEXC, QUARTILEINC, QUOTIENT, RADIANS, RAND, RANDBETWEEN, RANK, RANKAVG, RANKEQ, RATE, RECEIVED, REFERENCE, REGEXEXTRACT, REGEXMATCH, REGEXREPLACE, REPLACE, REPT, RIGHT, ROMAN, ROUND, ROUNDDOWN, ROUNDUP, ROW, ROWS, RRI, RSQ, SEARCH, SEC, SECH, SECOND, SERIESSUM, SHEET, SHEETS, SIGN, SIN, SINH, SKEW, SKEWP, SLN, SLOPE, SMALL, SPLIT, SQRT, SQRT1_2, SQRT2, SQRTPI, STANDARDIZE, STDEV, STDEVA, STDEVP, STDEVPA, STDEVS, STEYX, SUBSTITUTE, SUBTOTAL, SUM, SUMIF, SUMIFS, SUMPRODUCT, SUMSQ, SUMX2MY2, SUMX2PY2, SUMXMY2, SWITCH, SYD, T, TAN, TANH, TBILLEQ, TBILLPRICE, TBILLYIELD, TDIST, TDISTRT, TEXT, TEXTJOIN, TIME, TIMEVALUE, TINV, TODAY, TRANSPOSE, TREND, TRIM, TRIMMEAN, TRUE, TRUNC, TTEST, TYPE, UNICHAR, UNICODE, UNIQUE, UPPER, VALUE, VAR, VARA, VARP, VARPA, VARS, VDB, VLOOKUP, WEEKDAY, WEEKNUM, WEIBULL, WEIBULLDIST, WORKDAY, WORKDAYINTL, XIRR, XNPV, XOR, YEAR, YEARFRAC, YIELD, YIELDDISC, YIELDMAT, Z, ZTEST };\n","import * as formulajs from '@formulajs/formulajs';\nimport { SharedContext } from '../Parser/SharedContext';\nimport { ArrayResult } from '../Cell/ArrayResult';\n\n/**\n * FormulaJS Wrapper for Calx Environment\n *\n * This wrapper provides access to FormulaJS functions in the Calx context.\n * It handles type conversions and provides a consistent interface.\n */\nexport class FormulaJSWrapper {\n private context: SharedContext;\n\n constructor(context: SharedContext) {\n this.context = context;\n }\n\n /**\n * Get a FormulaJS function by name\n */\n getFunction(name: string): Function | undefined {\n const upperName = name.toUpperCase();\n\n // Check for custom user functions first (registered via Calx.setFormula)\n // Access via require to avoid circular dependency\n try {\n const { Calx } = require('../../Calx');\n if (Calx.formulae && Calx.formulae[upperName]) {\n return Calx.formulae[upperName];\n }\n } catch (e) {\n // Ignore if Calx is not available yet\n }\n\n // Check for custom implementations\n if (upperName === 'SEQUENCE') {\n return this.sequenceFunction.bind(this);\n }\n if (upperName === 'SORT') {\n return this.sortFunction.bind(this);\n }\n if (upperName === 'FILTER') {\n return this.filterFunction.bind(this);\n }\n if (upperName === 'UNIQUE') {\n return this.uniqueFunction.bind(this);\n }\n\n // Check if function exists in formulajs\n let fn = (formulajs as any)[upperName];\n\n // Some functions like STDEV are objects with sub-functions (STDEV.S, STDEV.P)\n // For backward compatibility, use STDEV.S as default\n if (fn && typeof fn === 'object' && !Array.isArray(fn)) {\n // Try .S first (sample standard deviation, most common)\n if (typeof fn.S === 'function') {\n fn = fn.S;\n }\n // Then try .P (population standard deviation)\n else if (typeof fn.P === 'function') {\n fn = fn.P;\n }\n }\n\n if (typeof fn === 'function') {\n return fn;\n }\n\n return undefined;\n }\n\n /**\n * Custom SEQUENCE function (Excel 365 dynamic array function)\n * SEQUENCE(rows, [columns], [start], [step])\n */\n private sequenceFunction(rows: number, columns: number = 1, start: number = 1, step: number = 1): any {\n const result: number[][] = [];\n let value = start;\n\n for (let r = 0; r < rows; r++) {\n const row: number[] = [];\n for (let c = 0; c < columns; c++) {\n row.push(value);\n value += step;\n }\n result.push(row);\n }\n\n // If single column, return as 1D array\n if (columns === 1) {\n return result.map(row => row[0]);\n }\n\n return result;\n }\n\n /**\n * Custom SORT function (Excel 365 dynamic array function)\n * SORT(array, [sort_index], [sort_order], [by_col])\n */\n private sortFunction(array: any, sortIndex: number = 1, sortOrder: number = 1, byCol: boolean = false): any {\n // Convert array to 2D if needed\n let arr2D: any[][];\n if (!Array.isArray(array)) {\n arr2D = [[array]];\n } else if (!Array.isArray(array[0])) {\n // 1D array - convert to column\n arr2D = array.map(val => [val]);\n } else {\n arr2D = array;\n }\n\n // Make a copy to avoid mutating original\n const sorted = arr2D.map(row => [...row]);\n\n // Sort by column (default) or by row\n if (!byCol) {\n // Sort rows based on the specified column index (1-based)\n const colIdx = sortIndex - 1;\n sorted.sort((a, b) => {\n const aVal = a[colIdx];\n const bVal = b[colIdx];\n\n // Handle nulls/undefined\n if (aVal == null && bVal == null) return 0;\n if (aVal == null) return sortOrder === 1 ? 1 : -1;\n if (bVal == null) return sortOrder === 1 ? -1 : 1;\n\n // Compare values\n if (aVal < bVal) return sortOrder === 1 ? -1 : 1;\n if (aVal > bVal) return sortOrder === 1 ? 1 : -1;\n return 0;\n });\n }\n\n // Return as 1D array if it was originally 1D\n if (!Array.isArray(array[0])) {\n return sorted.map(row => row[0]);\n }\n\n return sorted;\n }\n\n /**\n * Custom FILTER function (Excel 365 dynamic array function)\n * FILTER(array, include, [if_empty])\n */\n private filterFunction(array: any, include: any, ifEmpty: any = '#N/A'): any {\n // Convert arrays to 2D if needed\n let arr2D: any[][];\n if (!Array.isArray(array)) {\n arr2D = [[array]];\n } else if (!Array.isArray(array[0])) {\n arr2D = array.map(val => [val]);\n } else {\n arr2D = array;\n }\n\n let include1D: any[];\n if (!Array.isArray(include)) {\n include1D = [include];\n } else if (Array.isArray(include[0])) {\n // 2D include array - flatten to 1D\n include1D = include.map(row => row[0]);\n } else {\n include1D = include;\n }\n\n // Filter rows based on include array\n const filtered = arr2D.filter((row, idx) => {\n const includeVal = include1D[idx];\n // In Excel, any non-zero/non-false value is truthy\n return includeVal !== false && includeVal !== 0 && includeVal != null;\n });\n\n // Return if_empty if no matches\n if (filtered.length === 0) {\n return ifEmpty;\n }\n\n // Return as 1D array if original was 1D\n if (!Array.isArray(array[0])) {\n return filtered.map(row => row[0]);\n }\n\n return filtered;\n }\n\n /**\n * Custom UNIQUE function (Excel 365 dynamic array function)\n * UNIQUE(array, [by_col], [exactly_once])\n */\n private uniqueFunction(array: any, byCol: boolean = false, exactlyOnce: boolean = false): any {\n // Convert to 2D array if needed\n let arr2D: any[][];\n let was1D = false;\n\n if (!Array.isArray(array)) {\n arr2D = [[array]];\n was1D = true;\n } else if (!Array.isArray(array[0])) {\n arr2D = array.map(val => [val]);\n was1D = true;\n } else {\n arr2D = array;\n }\n\n const unique: any[][] = [];\n const seen = new Map();\n\n // Process each row\n for (const row of arr2D) {\n const key = JSON.stringify(row);\n const count = seen.get(key) || 0;\n seen.set(key, count + 1);\n\n if (count === 0) {\n unique.push(row);\n }\n }\n\n // If exactly_once is true, filter to only values that appear once\n if (exactlyOnce) {\n const result = unique.filter(row => {\n const key = JSON.stringify(row);\n return seen.get(key) === 1;\n });\n\n if (result.length === 0) {\n return '#N/A';\n }\n\n return was1D ? result.map(row => row[0]) : result;\n }\n\n // Return as 1D array if original was 1D\n return was1D ? unique.map(row => row[0]) : unique;\n }\n\n /**\n * Call a FormulaJS function with arguments\n */\n callFunction(name: string, args: any[]): any {\n const fn = this.getFunction(name);\n\n if (!fn) {\n throw new Error(`Function ${name} not found`);\n }\n\n try {\n // Convert Range objects to arrays if needed\n const convertedArgs = args.map(arg => this.convertArg(arg));\n\n // Call the function\n let result = fn(...convertedArgs);\n\n // Handle Date objects - convert to Excel serial number\n if (result instanceof Date) {\n // Excel's epoch is December 30, 1899\n const excelEpoch = new Date(1899, 11, 30).getTime();\n const msPerDay = 24 * 60 * 60 * 1000;\n result = Math.floor((result.getTime() - excelEpoch) / msPerDay);\n }\n\n // Handle array results from dynamic array functions (SEQUENCE, SORT, UNIQUE, etc.)\n // Convert to ArrayResult for spilling behavior\n if (Array.isArray(result) && this.isDynamicArrayFunction(name)) {\n // Check if it's a 2D array\n if (result.length > 0 && Array.isArray(result[0])) {\n return ArrayResult.from2DArray(result);\n } else {\n // 1D array - return as vertical array for spilling\n return ArrayResult.fromVerticalArray(result);\n }\n }\n\n // Handle error results\n if (result && typeof result === 'object' && result.error) {\n return '#ERROR!';\n }\n\n return result;\n } catch (error) {\n console.error(`Error calling function ${name}:`, error);\n return '#ERROR!';\n }\n }\n\n /**\n * Check if a function is a dynamic array function that should spill\n */\n private isDynamicArrayFunction(name: string): boolean {\n const dynamicArrayFunctions = [\n 'SEQUENCE', 'SORT', 'UNIQUE', 'FILTER', 'RANDARRAY',\n 'SORTBY', 'XLOOKUP', 'XMATCH'\n ];\n return dynamicArrayFunctions.includes(name.toUpperCase());\n }\n\n /**\n * Convert argument to appropriate type for FormulaJS\n */\n private convertArg(arg: any): any {\n // If it's null or undefined, return as-is\n if (arg == null) {\n return arg;\n }\n\n // If it's an array, recursively convert elements\n if (Array.isArray(arg)) {\n return arg.map(item => this.convertArg(item));\n }\n\n // If it's a Range object, convert to value or array\n if (arg && typeof arg === 'object' && typeof arg.toArray === 'function') {\n const values = arg.toArray();\n // If single cell, return single value\n return values.length === 1 ? values[0] : values;\n }\n\n // If it's a Cell object, return its value\n if (arg && typeof arg === 'object' && 'value' in arg) {\n return arg.value;\n }\n\n // Return as-is for primitives\n return arg;\n }\n\n /**\n * Get all available FormulaJS functions\n */\n getAvailableFunctions(): string[] {\n return Object.keys(formulajs).filter(key => {\n return typeof (formulajs as any)[key] === 'function';\n });\n }\n\n /**\n * Check if a function exists\n */\n hasFunction(name: string): boolean {\n return this.getFunction(name) !== undefined;\n }\n}\n\n/**\n * Create a FormulaJS wrapper instance\n */\nexport function createFormulaJSWrapper(context: SharedContext): FormulaJSWrapper {\n return new FormulaJSWrapper(context);\n}\n\n/**\n * Export commonly used FormulaJS functions for convenience\n */\nexport const FormulaJSFunctions = {\n // Math functions\n SUM: formulajs.SUM,\n AVERAGE: formulajs.AVERAGE,\n MIN: formulajs.MIN,\n MAX: formulajs.MAX,\n COUNT: formulajs.COUNT,\n COUNTA: formulajs.COUNTA,\n ROUND: formulajs.ROUND,\n ROUNDUP: formulajs.ROUNDUP,\n ROUNDDOWN: formulajs.ROUNDDOWN,\n ABS: formulajs.ABS,\n SQRT: formulajs.SQRT,\n POWER: formulajs.POWER,\n MOD: formulajs.MOD,\n\n // Statistical functions\n MEDIAN: formulajs.MEDIAN,\n MODE: formulajs.MODE,\n STDEV: formulajs.STDEV,\n VAR: formulajs.VAR,\n\n // Logical functions\n IF: formulajs.IF,\n AND: formulajs.AND,\n OR: formulajs.OR,\n NOT: formulajs.NOT,\n XOR: formulajs.XOR,\n\n // Text functions\n CONCATENATE: formulajs.CONCATENATE,\n LEFT: formulajs.LEFT,\n RIGHT: formulajs.RIGHT,\n MID: formulajs.MID,\n LEN: formulajs.LEN,\n LOWER: formulajs.LOWER,\n UPPER: formulajs.UPPER,\n TRIM: formulajs.TRIM,\n TEXT: formulajs.TEXT,\n\n // Lookup functions\n VLOOKUP: formulajs.VLOOKUP,\n HLOOKUP: formulajs.HLOOKUP,\n MATCH: formulajs.MATCH,\n INDEX: formulajs.INDEX,\n\n // Date functions\n DATE: formulajs.DATE,\n TODAY: formulajs.TODAY,\n NOW: formulajs.NOW,\n YEAR: formulajs.YEAR,\n MONTH: formulajs.MONTH,\n DAY: formulajs.DAY,\n\n // Financial functions\n PMT: formulajs.PMT,\n FV: formulajs.FV,\n PV: formulajs.PV,\n RATE: formulajs.RATE,\n NPV: formulajs.NPV,\n IRR: formulajs.IRR,\n};\n","import { Sheet } from \"../Sheet\"\nimport { Workbook } from \"../Workbook\"\nimport { FormulaJSWrapper, createFormulaJSWrapper } from \"../Formula/FormulaJSWrapper\";\n\nexport type SharedContextInterface = {\n /**\n * The workbook as main context of the parser\n */\n workbook ?: Workbook,\n\n /**\n * Collection of sheets in the workbook\n */\n sheets : Record,\n\n /**\n * Current active sheet which the parser will refer to when parsing formula\n */\n activeSheet ?: Sheet,\n\n /**\n * Utility that can be used inside the parser\n */\n utility : object,\n\n /**\n * Default comparator for comparing cell and value\n */\n comparator ?: {\n equal : (a : any, b : any) => boolean,\n notEqual : (a : any, b : any) => boolean,\n lessThan : (a : any, b : any) => boolean,\n greaterThan : (a : any, b : any) => boolean,\n lessEqualThan : (a : any, b : any) => boolean,\n greaterEqualThan : (a : any, b : any) => boolean,\n }\n\n /**\n * Methods for getting values from the workbook\n */\n getFunction?: (name: string) => Function | undefined;\n getVariable?: (name: string, sheetName?: string) => any;\n getCellValue?: (ref: string, sheetName?: string) => any;\n getCellRange?: (range: string, sheetName?: string) => any[];\n getRowRange?: (range: string, sheetName?: string) => any[];\n getColumnRange?: (range: string, sheetName?: string) => any[];\n getNamedRange?: (name: string) => any;\n}\n\nexport class SharedContext implements SharedContextInterface {\n\n public workbook ?: Workbook;\n\n public sheets : Record = {};\n\n public activeSheet ?: Sheet;\n\n public utility!: object;\n\n private _formulaJSWrapper?: FormulaJSWrapper;\n\n public comparator ?: {\n equal : (a : any, b : any) => boolean,\n notEqual : (a : any, b : any) => boolean,\n lessThan : (a : any, b : any) => boolean,\n greaterThan : (a : any, b : any) => boolean,\n lessEqualThan : (a : any, b : any) => boolean,\n greaterEqualThan : (a : any, b : any) => boolean,\n };\n\n constructor(init ?: Partial) {\n Object.assign(this, init);\n this._formulaJSWrapper = createFormulaJSWrapper(this);\n }\n\n setActiveSheet(sheet : Sheet) {\n this.activeSheet = sheet;\n }\n\n setWorkbook(workbook : Workbook) {\n this.workbook = workbook;\n }\n\n addSheet(sheet : Sheet) {\n this.sheets[sheet.id] = sheet;\n }\n\n callFunction(name : string, args : any[]) : any {\n // Use FormulaJS wrapper\n if (this._formulaJSWrapper) {\n return this._formulaJSWrapper.callFunction(name, args);\n }\n return '#NAME?';\n }\n\n getFunction(name: string): Function | undefined {\n // Check FormulaJS first (workbook custom functions can be added later)\n if (this._formulaJSWrapper) {\n return this._formulaJSWrapper.getFunction(name);\n }\n\n return undefined;\n }\n\n getVariable(name: string, sheetName?: string): any {\n const sheet = sheetName ? this.sheets[sheetName] : this.activeSheet;\n if (sheet) {\n // Variables are managed by the sheet\n return sheet.getVariable(name);\n }\n return \"#NAME?\";\n }\n\n getCellValue(ref: string, sheetName?: string): any {\n let sheet = this.activeSheet;\n\n if (sheetName) {\n // Try to find sheet by name or id\n sheet = this.sheets[sheetName] || Object.values(this.sheets).find(s => s.name === sheetName);\n }\n\n if (sheet) {\n return sheet.getCellValue(ref);\n }\n return \"#REF!\";\n }\n\n getCellRange(range: string, sheetName?: string): any[] {\n const sheet = sheetName ? this.sheets[sheetName] : this.activeSheet;\n if (sheet) {\n // Parse range like \"A1:B2\"\n const [start, end] = range.split(':');\n return sheet.getCellRangeValues(start, end);\n }\n return [];\n }\n\n getRowRange(range: string, sheetName?: string): any[] {\n const sheet = sheetName ? this.sheets[sheetName] : this.activeSheet;\n if (sheet) {\n // Parse range like \"1:3\" (rows 1 to 3)\n return sheet.getRowRangeValues(range);\n }\n return [];\n }\n\n getColumnRange(range: string, sheetName?: string): any[] {\n const sheet = sheetName ? this.sheets[sheetName] : this.activeSheet;\n if (sheet) {\n // Parse range like \"A:C\" (columns A to C)\n return sheet.getColumnRangeValues(range);\n }\n return [];\n }\n\n getNamedRange(name: string): any {\n if (this.workbook) {\n return this.workbook.nameManager.resolve(name);\n }\n return \"#NAME?\";\n }\n}","import { Cell } from \"../Cell\";\n\n/**\n * translate numeric to alphabet, like 1 => A, 27 => AA\n * @param {integer} num numeric value translated to alphabet\n * @return {string} alphabet representation of the value\n */\nexport function numToStr(num: number): string {\n var s = \"\";\n num = Math.round(num - 1);\n while (num >= 0) {\n s = String.fromCharCode(num % 26 + 97) + s;\n num = Math.floor(num / 26) - 1;\n }\n return s.toUpperCase();\n}\n\n/**\n * translate alphabet to numeric, A => 1, B => 2, Z => 26, AA => 27 etc\n * @param {string} char Alphabet [A-Z]\n * @return {integer} Integer representation of the alphabet\n */\nexport function strToNum(char: string): number {\n const chars = char.toUpperCase().split('');\n const base = \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\".split('');\n let i, j, result = 0;\n\n for (i = 0, j = chars.length - 1; i < chars.length; i += 1, j -= 1) {\n result += Math.pow(base.length, j) * (base.indexOf(chars[i]) + 1);\n }\n\n return result;\n}\n\n/**\n * translate cellStart:cellStop to array containing all cell in range\n * e.g A1:B3 => [A1, A2, A3, B1, B2, B3]\n * @return {array} array containing all address in range\n */\nexport function getCellsInRange(range : string) {\n range = range.toUpperCase();\n const regex = {\n alpha : /[A-Z]+/,\n num : /[0-9]+/,\n cellRange : /^[A-Za-z]+[0-9]+\\s*:\\s*[A-Za-z]+[0-9]+$/,\n };\n\n if (!range.match(regex.cellRange)) {\n throw new Error(\"Invalid range syntax!\");\n }\n\n const rangeStart = range.split(':')[0],\n rangeEnd = range.split(':')[1],\n boundaries = {\n start : {\n col : strToNum(rangeStart.match(regex.alpha)[0]), //alpha part\n row : parseInt(rangeStart.match(regex.num)[0]), //numeric part\n },\n end : {\n col : strToNum(rangeEnd.match(regex.alpha)[0]), //alpha part\n row : parseInt(rangeEnd.match(regex.num)[0]), //numeric part\n }\n },\n cellRange = [];\n\n for (\n let col = Math.min(boundaries.start.col, boundaries.end.col) ;\n col <= Math.max(boundaries.start.col, boundaries.end.col);\n col++\n ) {\n for (\n let row = Math.min(boundaries.start.row, boundaries.end.row);\n row <= Math.max(boundaries.start.row, boundaries.end.row);\n row++\n ) {\n cellRange.push(numToStr(col) + row + '');\n }\n }\n\n return cellRange;\n}\n\n/**\n * taken from Formula.VALIDBIN of stoic's formula.js (http://www.stoic.com/pages/formula)\n * check if number is in valid binary format\n * @param {string} number [the binary number]\n * @return {Boolean} [true if valid, false if invalid]\n */\nexport function isValidBinary(number: string) {\n return (/^[01]{1,10}$/).test(number);\n}\n\n/**\n * String repeater, taken from underscore string (https://github.com/epeli/underscore.string)\n * @param {[type]} str [description]\n * @param {[type]} qty [description]\n * @return {[type]} [description]\n */\nexport function strRepeat(str: string, qty: number) {\n if (qty < 1) return '';\n var result = '';\n while (qty > 0) {\n if (qty & 1) result += str;\n qty >>= 1, str += str;\n }\n return result;\n}\n\nexport function repeat(str: string, qty: number, separator: string) {\n if (str == null) {\n return '';\n }\n\n qty = ~~qty;\n\n // using faster implementation if separator is not needed;\n if (separator == null) {\n return strRepeat(String(str), qty);\n }\n\n // this one is about 300x slower in Google Chrome\n for (var repeat = []; qty > 0; repeat[--qty] = str) { }\n return repeat.join(separator);\n}\n\nexport function unique(array: Array) {\n return array.reduce(function (p, c) {\n if (p.indexOf(c) < 0) p.push(c);\n return p;\n }, []);\n}\n\nexport function initial(array: Array, n : any, guard : any) {\n return Array.prototype.slice.call(array, 0, Math.max(0, array.length - (n == null || guard ? 1 : n)));\n}\n\nexport function rest(array : Array, n : any, guard : any) {\n return Array.prototype.slice.call(array, n == null || guard ? 1 : n);\n}\n\n/** end of underscore func */\n\nexport function arrayMerge(args : any) {\n let result : Array = [];\n\n for (let i = 0; i < args.length; i++) {\n if (typeof (args[i]) == 'object') {\n for (let a in args[i]) {\n if (args[i][a].trim() !== '') {\n result = result.concat(args[i][a]);\n }\n }\n } else {\n if (result.concat(args[i]).join().trim() !== '') {\n result = result.concat(args[i]);\n }\n }\n }\n\n return result;\n}\n\nexport function toArray(args : any) {\n return Array.prototype.slice.call(args, 0);\n}\n\n/**\n * Converting object into plain array\n * @param {object} obj Object need to be converted\n * @return {array} Plain array\n */\nexport function objectToArray(obj: any) {\n return Object.values(obj);\n}\n\n/**\n * remove empty cell from cell range collection\n * @param {object} cellRange\n * @return {object} trimmed cellRange\n */\nexport function trimEmptyCell(cellRange : Record) {\n var result : Record = {};\n\n for (var a in cellRange) {\n if (cellRange[a].trim() !== '') {\n result[a] = cellRange[a];\n }\n }\n\n return result;\n}\n\n/**\n * convert range {A1: val1, A2: val2, B1: val3, B2: val4} into 2 dimensional table array\n * [\n * [val1, val2],\n * [val3, val4]\n * ]\n *\n * @param {object} cellRange [description]\n * @return {array} [description]\n */\nexport function rangeToTable(cellRange: Array>): Array> {\n var cell, col,\n row = 0,\n alphaPattern = /[A-Z]+/,\n numPattern = /[0-9]+/,\n arrayTable = [],\n resultTable = [];\n\n for (cell in cellRange) {\n\n col = strToNum(cell.match(alphaPattern)[0]) - 1;\n row = parseInt(cell.match(numPattern)[0], 10) - 1;\n\n if (typeof arrayTable[row] == 'undefined') {\n arrayTable[row] = [];\n }\n\n arrayTable[row][col] = cellRange[cell];\n }\n\n var resultRow = 0, rowLength = arrayTable.length, colLength;\n for (row = 0; row < rowLength; row++) {\n if (typeof (arrayTable[row]) != 'undefined') {\n colLength = arrayTable[row].length;\n\n if (typeof (resultTable[resultRow]) == 'undefined') {\n resultTable[resultRow] = [];\n }\n\n for (col = 0; col < colLength; col++) {\n if (typeof (arrayTable[row][col]) != 'undefined') {\n resultTable[resultRow].push(arrayTable[row][col]);\n }\n }\n\n resultRow++;\n }\n }\n\n return resultTable;\n};\n\n/**\n * transpose horizontal table to be vertical table, or vice-versa\n * e.g\n * [\n * [1,2,3,4],\n * [1,2,3,4],\n * ]\n *\n * to be\n * [\n * [1,1],\n * [2,2],\n * [3,3],\n * [4,4],\n * ]\n */\nexport function transposeTable(table: Array>): Array> {\n var row, col, rowLength, colLength, newTable;\n\n rowLength = table.length;\n newTable = [];\n\n for (row = 0; row < rowLength; row++) {\n colLength = table[row].length;\n\n for (col = 0; col < colLength; col++) {\n if (typeof (newTable[col]) == 'undefined') {\n newTable[col] = [];\n }\n\n newTable[col].push(table[row][col]);\n }\n }\n\n return newTable;\n}\n","import { Workbook } from \"../Workbook\";\n\n/**\n * Named range definition\n */\nexport interface NamedRange {\n name: string;\n reference: string;\n sheetName?: string;\n comment?: string;\n}\n\n/**\n * Manage named cell or cell range\n */\nexport class NameManager {\n private _workbook : Workbook\n private _nameRegistry : Record = {};\n\n public setContext(workbook : Workbook) {\n this._workbook = workbook;\n }\n\n /**\n * Define named cell or cell range.\n *\n * @param name the alias name (e.g., \"SalesData\", \"TaxRate\")\n * @param reference the cell or cell range to be aliased (e.g., \"A1\", \"A1:B10\", \"Sheet1!A1:B10\")\n * @param sheetName optional sheet name to scope this name to a specific sheet\n * @param comment optional comment describing the named range\n * @returns true if defined successfully, false if name is invalid\n */\n public define(name : string, reference : string, sheetName?: string, comment?: string): boolean {\n // Validate name: must start with letter or underscore, can contain letters, numbers, underscores\n // Cannot be a cell reference (e.g., \"A1\")\n if (!this.isValidName(name)) {\n return false;\n }\n\n this._nameRegistry[name] = {\n name,\n reference,\n sheetName,\n comment\n };\n return true;\n }\n\n /**\n * Check if a name is valid for a named range\n * - Must start with letter or underscore\n * - Can contain letters, numbers, underscores, dots\n * - Cannot be a cell reference (A1, B2, etc.)\n * - Cannot be a reserved keyword\n */\n private isValidName(name: string): boolean {\n // Must start with letter or underscore\n if (!/^[a-zA-Z_]/.test(name)) {\n return false;\n }\n\n // Can only contain letters, numbers, underscores, dots\n if (!/^[a-zA-Z_][a-zA-Z0-9_\\.]*$/.test(name)) {\n return false;\n }\n\n // Cannot be a cell reference\n if (/^[A-Z]+[0-9]+$/.test(name)) {\n return false;\n }\n\n // Reserved keywords\n const reserved = ['TRUE', 'FALSE', 'NULL'];\n if (reserved.includes(name.toUpperCase())) {\n return false;\n }\n\n return true;\n }\n\n /**\n * Get the reference string for a named range\n *\n * @param name the alias name\n * @returns the reference string or undefined if not found\n */\n public getReference(name: string): string | undefined {\n const namedRange = this._nameRegistry[name];\n return namedRange?.reference;\n }\n\n /**\n * Resolve a named range to its value(s)\n *\n * @param name the alias name\n * @returns target cell value or array of values\n */\n public resolve(name : string) {\n const namedRange = this._nameRegistry[name];\n if (!namedRange) {\n return '#NAME?';\n }\n\n // Find the first sheet to use as context if no active sheet\n let targetSheet = this._workbook.getActiveSheet();\n if (!targetSheet) {\n const sheets = this._workbook.getSheets();\n const sheetNames = Object.keys(sheets);\n if (sheetNames.length > 0) {\n targetSheet = sheets[sheetNames[0]];\n }\n }\n\n // Set active sheet temporarily\n if (targetSheet) {\n this._workbook.setActiveSheet(targetSheet);\n }\n\n // If the reference includes sheet name, parse it as-is\n // Otherwise, prepend with \"=\" to make it a formula\n const formula = namedRange.reference.startsWith('=')\n ? namedRange.reference\n : `=${namedRange.reference}`;\n\n return this._workbook.parser.parse(formula);\n }\n\n /**\n * Check if a named range exists\n *\n * @param name the alias name\n * @returns true if the named range exists\n */\n public has(name: string): boolean {\n return name in this._nameRegistry;\n }\n\n /**\n * Get all named ranges\n *\n * @returns array of all named range definitions\n */\n public getAll(): NamedRange[] {\n return Object.values(this._nameRegistry);\n }\n\n /**\n * Get a named range definition\n *\n * @param name the alias name\n * @returns the named range definition or undefined\n */\n public get(name: string): NamedRange | undefined {\n return this._nameRegistry[name];\n }\n\n /**\n * Remove the alias\n *\n * @param name the alias name\n * @returns true if removed, false if not found\n */\n public remove(name : string): boolean {\n if (name in this._nameRegistry) {\n delete this._nameRegistry[name];\n return true;\n }\n return false;\n }\n\n /**\n * Clear all named ranges\n */\n public clear(): void {\n this._nameRegistry = {};\n }\n}","export const Comparator = {\n equal(a : any, b : any) : boolean {\n /** ignore case as excel does */\n if (typeof a == 'string') {\n return a.toLowerCase() == ('' + b).toLowerCase();\n }\n\n return a == b;\n },\n\n notEqual(a : any, b : any) : boolean {\n /** ignore case as excel does */\n if (typeof a == 'string') {\n return a.toLowerCase() != ('' + b).toLowerCase();\n }\n\n return a != b;\n },\n\n lessThan(a : any, b : any) : boolean {\n return a < b;\n },\n\n greaterThan(a : any, b : any) : boolean {\n return a > b;\n },\n\n lessEqualThan(a : any, b : any) : boolean {\n return a <= b;\n },\n\n greaterEqualThan(a : any, b : any) : boolean {\n return a >= b;\n }\n}","import { Sheet } from \"./Sheet\";\nimport { CalxInterpreter } from \"./Parser/Chevrotain/Interpreter\";\nimport { CalxParser } from \"./Parser/Chevrotain/Parser\";\nimport { SharedContext } from \"./Parser/SharedContext\";\nimport * as Utility from './Utility/Utility';\nimport { EventDispatcher } from \"./Utility/EventDispatcher\";\nimport { NameManager } from \"./Workbook/NameManager\";\nimport { CellData, Data } from \"./Workbook/Data\";\nimport { Comparator } from \"./Utility/Comparator\";\nimport { DependencyTree } from \"./Workbook/DependencyTree\";\nimport { DependencyBuilder } from \"./Workbook/DependencyBuilder\";\n\n/**\n * Create parser instance with shared context\n */\nfunction createParser(context: SharedContext): CalxInterpreter {\n const interpreter = new CalxInterpreter();\n interpreter.setContext(context);\n return interpreter;\n}\n\nexport class Workbook {\n private _sheets : Record;\n private _functions!: Record;\n private _parser : CalxInterpreter;\n private _dispatcher : EventDispatcher;\n private _nameManager : NameManager\n private _autoCalculate : boolean = true;\n\n private _deps!: DependencyTree;\n private _depsBuilder!: DependencyBuilder;\n\n private constructor(\n parser : CalxInterpreter,\n nameManager : NameManager,\n dispatcher : EventDispatcher,\n ) {\n this._sheets = {};\n this._parser = parser;\n this._dispatcher = dispatcher;\n this._nameManager = nameManager;\n\n this._nameManager.setContext(this);\n }\n\n public get parser() {\n return this._parser;\n }\n\n public get dispatcher() {\n return this._dispatcher;\n }\n\n /**\n * Get the name manager for managing named ranges\n */\n public get nameManager(): NameManager {\n return this._nameManager;\n }\n\n /**\n * Get autoCalculate option\n */\n public get autoCalculate(): boolean {\n return this._autoCalculate;\n }\n\n /**\n * Set autoCalculate option\n * When true, changes to cell values automatically trigger recalculation of all sheets\n * When false, manual calculation is required\n * This also updates all sheets' autoCalculate settings\n */\n public set autoCalculate(value: boolean) {\n this._autoCalculate = value;\n // Propagate to all sheets\n for (const sheetName in this._sheets) {\n this._sheets[sheetName].autoCalculate = value;\n }\n }\n\n public setActiveSheet(sheet : Sheet) {\n if (this._parser) {\n const context = this._parser.getContext();\n if (context) {\n context.activeSheet = sheet;\n context.setActiveSheet(sheet);\n }\n }\n }\n\n public getActiveSheet() {\n return this._parser.yy?.activeSheet;\n }\n\n public isValidCellAddress(address : string) {\n return address.match(/^[A-Z]+\\d+$/);\n }\n\n /**\n * Calculate the whole workbook\n */\n public calculate() {\n // Build dependency tree if not already built\n if (!this._deps) {\n this.build();\n }\n\n // Calculate all sheets in dependency order\n for (const sheetName in this._sheets) {\n this._sheets[sheetName].calculate();\n }\n }\n\n /**\n * Build the workbook, create dependency tree, and other necessary things\n */\n public build() {\n // Initialize dependency builder\n this._depsBuilder = new DependencyBuilder();\n\n // Build dependency trees for each sheet\n for (const sheetName in this._sheets) {\n this._sheets[sheetName].buildDependencyTree();\n }\n\n // Build workbook-level dependency tree (for cross-sheet dependencies)\n // This will be implemented when we have a complete cell registry\n }\n\n /**\n * Hydrate object using data from the workbook recusively\n *\n * {\n * someKey : '#sheet1!A1',\n * anotherKey : '#sheet2!B2',\n * nested : {\n * key : '#sheet3!C3'\n * }\n * }\n *\n * @param obj\n */\n public hydrateObj(obj : any) {\n for (const key in obj) {\n if (typeof obj[key] === 'object') {\n this.hydrateObj(obj[key]);\n } else {\n if (typeof obj[key] === 'string' && obj[key].startsWith('#')) {\n const [sheetName, address] = obj[key].split('!');\n\n if (sheetName in this._sheets) {\n obj[key] = this._sheets[sheetName].getCell(address).value;\n }\n }\n }\n }\n }\n\n /**\n * Create new sheet object and register it to workbook sheet registry and parser shared context.\n */\n public createSheet(name: string, element ?: any) :Sheet\n {\n if (!name) {\n throw new Error('Sheet should have a name');\n }\n\n if (this._sheets[name]) {\n throw new Error(`Sheet with the name \"${name}\" is already exists`);\n }\n\n const sheet = new Sheet(this, name);\n\n // Inherit workbook's autoCalculate setting\n sheet.autoCalculate = this._autoCalculate;\n\n if (element) {\n sheet.element = element;\n }\n\n this._sheets[name] = sheet;\n if (this._parser && this._parser.yy) {\n this._parser.yy.sheets[name] = sheet;\n }\n\n return sheet;\n }\n\n /**\n * Get sheets collection from the workbook\n */\n public getSheets() : Record {\n return this._sheets;\n }\n\n /**\n * Get particular sheet in the workbook sheet registry\n */\n public getSheet(name : string) : Sheet | void {\n if (name in this._sheets) {\n return this._sheets[name];\n }\n\n throw Error(`Sheet not found with name ${name}`);\n }\n\n\n /**\n * Load configuration to workbook\n */\n public loadData(data : Data) {\n for (const sheetName in data.sheets) {\n const sheet = this.createSheet(sheetName, data.sheets[sheetName]?.element);\n\n for (const cellKey in data.sheets[sheetName].cells) {\n const cellData = data.sheets[sheetName].cells[cellKey];\n sheet.createCell(cellKey, cellData);\n }\n }\n }\n\n /**\n * Create workbook object from given config\n */\n public static createFromData(data : Data) {\n const sharedContext = new SharedContext({\n sheets : {},\n utility : Utility,\n comparator : Comparator,\n });\n\n const parser = createParser(sharedContext);\n const dispatcher = new EventDispatcher();\n const nameManager = new NameManager();\n\n const workbook = new Workbook(parser, nameManager, dispatcher);\n\n sharedContext.workbook = workbook;\n\n /** TODO : read the configuration and configure the workbook */\n workbook.loadData(data);\n\n return workbook;\n }\n\n /**\n * Create workbook object from given element, and parse related data-tag\n */\n public static createFromElement(element : any, data ?: Data) {\n const parser = createParser(new SharedContext({\n sheets : {},\n utility : Utility,\n comparator : null,\n }));\n\n const dispatcher = new EventDispatcher();\n const nameManager = new NameManager();\n const workbook = new Workbook(parser, nameManager, dispatcher);\n\n /** TODO : traverse element and read the configuration and configure the workbook */\n\n if (data) {\n workbook.loadData(data);\n }\n\n return workbook;\n }\n}\n","import { CalxInterpreter } from \"./Calx/Parser/Chevrotain/Interpreter\";\nimport { CalxParser } from \"./Calx/Parser/Chevrotain/Parser\";\nimport { Workbook } from \"./Calx/Workbook\";\nimport { Data } from \"./Calx/Workbook/Data\";\nimport { DateUtil } from \"./Calx/Utility/DateUtil\";\n\n// Export utilities\nexport { DateUtil };\n\nexport class Calx {\n\n static formulae : Record = {};\n\n static setFormula(name : string, formula : Function) {\n Calx.formulae[name] = formula;\n }\n\n static setFormulae(formulae : Record) {\n Calx.formulae = {\n ...Calx.formulae,\n ...formulae,\n };\n }\n\n static createWorkbook() {\n const data : Data = {\n sheets : {},\n }\n\n return Calx.createWorkbookFromData(data);\n }\n\n static createWorkbookFromData(data : Data) {\n return Workbook.createFromData(data);\n }\n\n static createWorkbookFromElement(element : any, data ?: Data) {\n return Workbook.createFromElement(element, data);\n }\n\n static createParser() {\n return new CalxParser();\n }\n\n static createInterpreter() {\n return new CalxInterpreter();\n }\n}","\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.validateMissingCstMethods = exports.validateVisitor = exports.CstVisitorDefinitionError = exports.createBaseVisitorConstructorWithDefaults = exports.createBaseSemanticVisitorConstructor = exports.defaultVisit = void 0;\nvar isEmpty_1 = __importDefault(require(\"lodash/isEmpty\"));\nvar compact_1 = __importDefault(require(\"lodash/compact\"));\nvar isArray_1 = __importDefault(require(\"lodash/isArray\"));\nvar map_1 = __importDefault(require(\"lodash/map\"));\nvar forEach_1 = __importDefault(require(\"lodash/forEach\"));\nvar filter_1 = __importDefault(require(\"lodash/filter\"));\nvar keys_1 = __importDefault(require(\"lodash/keys\"));\nvar isFunction_1 = __importDefault(require(\"lodash/isFunction\"));\nvar isUndefined_1 = __importDefault(require(\"lodash/isUndefined\"));\nvar lang_extensions_1 = require(\"../../lang/lang_extensions\");\nfunction defaultVisit(ctx, param) {\n var childrenNames = (0, keys_1.default)(ctx);\n var childrenNamesLength = childrenNames.length;\n for (var i = 0; i < childrenNamesLength; i++) {\n var currChildName = childrenNames[i];\n var currChildArray = ctx[currChildName];\n var currChildArrayLength = currChildArray.length;\n for (var j = 0; j < currChildArrayLength; j++) {\n var currChild = currChildArray[j];\n // distinction between Tokens Children and CstNode children\n if (currChild.tokenTypeIdx === undefined) {\n this[currChild.name](currChild.children, param);\n }\n }\n }\n // defaultVisit does not support generic out param\n}\nexports.defaultVisit = defaultVisit;\nfunction createBaseSemanticVisitorConstructor(grammarName, ruleNames) {\n var derivedConstructor = function () { };\n // can be overwritten according to:\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/\n // name?redirectlocale=en-US&redirectslug=JavaScript%2FReference%2FGlobal_Objects%2FFunction%2Fname\n (0, lang_extensions_1.defineNameProp)(derivedConstructor, grammarName + \"BaseSemantics\");\n var semanticProto = {\n visit: function (cstNode, param) {\n // enables writing more concise visitor methods when CstNode has only a single child\n if ((0, isArray_1.default)(cstNode)) {\n // A CST Node's children dictionary can never have empty arrays as values\n // If a key is defined there will be at least one element in the corresponding value array.\n cstNode = cstNode[0];\n }\n // enables passing optional CstNodes concisely.\n if ((0, isUndefined_1.default)(cstNode)) {\n return undefined;\n }\n return this[cstNode.name](cstNode.children, param);\n },\n validateVisitor: function () {\n var semanticDefinitionErrors = validateVisitor(this, ruleNames);\n if (!(0, isEmpty_1.default)(semanticDefinitionErrors)) {\n var errorMessages = (0, map_1.default)(semanticDefinitionErrors, function (currDefError) { return currDefError.msg; });\n throw Error(\"Errors Detected in CST Visitor <\".concat(this.constructor.name, \">:\\n\\t\") +\n \"\".concat(errorMessages.join(\"\\n\\n\").replace(/\\n/g, \"\\n\\t\")));\n }\n }\n };\n derivedConstructor.prototype = semanticProto;\n derivedConstructor.prototype.constructor = derivedConstructor;\n derivedConstructor._RULE_NAMES = ruleNames;\n return derivedConstructor;\n}\nexports.createBaseSemanticVisitorConstructor = createBaseSemanticVisitorConstructor;\nfunction createBaseVisitorConstructorWithDefaults(grammarName, ruleNames, baseConstructor) {\n var derivedConstructor = function () { };\n // can be overwritten according to:\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/\n // name?redirectlocale=en-US&redirectslug=JavaScript%2FReference%2FGlobal_Objects%2FFunction%2Fname\n (0, lang_extensions_1.defineNameProp)(derivedConstructor, grammarName + \"BaseSemanticsWithDefaults\");\n var withDefaultsProto = Object.create(baseConstructor.prototype);\n (0, forEach_1.default)(ruleNames, function (ruleName) {\n withDefaultsProto[ruleName] = defaultVisit;\n });\n derivedConstructor.prototype = withDefaultsProto;\n derivedConstructor.prototype.constructor = derivedConstructor;\n return derivedConstructor;\n}\nexports.createBaseVisitorConstructorWithDefaults = createBaseVisitorConstructorWithDefaults;\nvar CstVisitorDefinitionError;\n(function (CstVisitorDefinitionError) {\n CstVisitorDefinitionError[CstVisitorDefinitionError[\"REDUNDANT_METHOD\"] = 0] = \"REDUNDANT_METHOD\";\n CstVisitorDefinitionError[CstVisitorDefinitionError[\"MISSING_METHOD\"] = 1] = \"MISSING_METHOD\";\n})(CstVisitorDefinitionError = exports.CstVisitorDefinitionError || (exports.CstVisitorDefinitionError = {}));\nfunction validateVisitor(visitorInstance, ruleNames) {\n var missingErrors = validateMissingCstMethods(visitorInstance, ruleNames);\n return missingErrors;\n}\nexports.validateVisitor = validateVisitor;\nfunction validateMissingCstMethods(visitorInstance, ruleNames) {\n var missingRuleNames = (0, filter_1.default)(ruleNames, function (currRuleName) {\n return (0, isFunction_1.default)(visitorInstance[currRuleName]) === false;\n });\n var errors = (0, map_1.default)(missingRuleNames, function (currRuleName) {\n return {\n msg: \"Missing visitor method: <\".concat(currRuleName, \"> on \").concat((visitorInstance.constructor.name), \" CST Visitor.\"),\n type: CstVisitorDefinitionError.MISSING_METHOD,\n methodName: currRuleName\n };\n });\n return (0, compact_1.default)(errors);\n}\nexports.validateMissingCstMethods = validateMissingCstMethods;\n//# sourceMappingURL=cst_visitor.js.map","/** Used to compose unicode character classes. */\nvar rsAstralRange = '\\\\ud800-\\\\udfff',\n rsComboMarksRange = '\\\\u0300-\\\\u036f',\n reComboHalfMarksRange = '\\\\ufe20-\\\\ufe2f',\n rsComboSymbolsRange = '\\\\u20d0-\\\\u20ff',\n rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange,\n rsVarRange = '\\\\ufe0e\\\\ufe0f';\n\n/** Used to compose unicode capture groups. */\nvar rsZWJ = '\\\\u200d';\n\n/** Used to detect strings with [zero-width joiners or code points from the astral planes](http://eev.ee/blog/2015/09/12/dark-corners-of-unicode/). */\nvar reHasUnicode = RegExp('[' + rsZWJ + rsAstralRange + rsComboRange + rsVarRange + ']');\n\n/**\n * Checks if `string` contains Unicode symbols.\n *\n * @private\n * @param {string} string The string to inspect.\n * @returns {boolean} Returns `true` if a symbol is found, else `false`.\n */\nfunction hasUnicode(string) {\n return reHasUnicode.test(string);\n}\n\nmodule.exports = hasUnicode;\n","var arrayEvery = require('./_arrayEvery'),\n baseEvery = require('./_baseEvery'),\n baseIteratee = require('./_baseIteratee'),\n isArray = require('./isArray'),\n isIterateeCall = require('./_isIterateeCall');\n\n/**\n * Checks if `predicate` returns truthy for **all** elements of `collection`.\n * Iteration is stopped once `predicate` returns falsey. The predicate is\n * invoked with three arguments: (value, index|key, collection).\n *\n * **Note:** This method returns `true` for\n * [empty collections](https://en.wikipedia.org/wiki/Empty_set) because\n * [everything is true](https://en.wikipedia.org/wiki/Vacuous_truth) of\n * elements of empty collections.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {boolean} Returns `true` if all elements pass the predicate check,\n * else `false`.\n * @example\n *\n * _.every([true, 1, null, 'yes'], Boolean);\n * // => false\n *\n * var users = [\n * { 'user': 'barney', 'age': 36, 'active': false },\n * { 'user': 'fred', 'age': 40, 'active': false }\n * ];\n *\n * // The `_.matches` iteratee shorthand.\n * _.every(users, { 'user': 'barney', 'active': false });\n * // => false\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.every(users, ['active', false]);\n * // => true\n *\n * // The `_.property` iteratee shorthand.\n * _.every(users, 'active');\n * // => false\n */\nfunction every(collection, predicate, guard) {\n var func = isArray(collection) ? arrayEvery : baseEvery;\n if (guard && isIterateeCall(collection, predicate, guard)) {\n predicate = undefined;\n }\n return func(collection, baseIteratee(predicate, 3));\n}\n\nmodule.exports = every;\n","var arrayEach = require('./_arrayEach'),\n baseEach = require('./_baseEach'),\n castFunction = require('./_castFunction'),\n isArray = require('./isArray');\n\n/**\n * Iterates over elements of `collection` and invokes `iteratee` for each element.\n * The iteratee is invoked with three arguments: (value, index|key, collection).\n * Iteratee functions may exit iteration early by explicitly returning `false`.\n *\n * **Note:** As with other \"Collections\" methods, objects with a \"length\"\n * property are iterated like arrays. To avoid this behavior use `_.forIn`\n * or `_.forOwn` for object iteration.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @alias each\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Array|Object} Returns `collection`.\n * @see _.forEachRight\n * @example\n *\n * _.forEach([1, 2], function(value) {\n * console.log(value);\n * });\n * // => Logs `1` then `2`.\n *\n * _.forEach({ 'a': 1, 'b': 2 }, function(value, key) {\n * console.log(key);\n * });\n * // => Logs 'a' then 'b' (iteration order is not guaranteed).\n */\nfunction forEach(collection, iteratee) {\n var func = isArray(collection) ? arrayEach : baseEach;\n return func(collection, castFunction(iteratee));\n}\n\nmodule.exports = forEach;\n","/**\n * A specialized version of `_.filter` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {Array} Returns the new filtered array.\n */\nfunction arrayFilter(array, predicate) {\n var index = -1,\n length = array == null ? 0 : array.length,\n resIndex = 0,\n result = [];\n\n while (++index < length) {\n var value = array[index];\n if (predicate(value, index, array)) {\n result[resIndex++] = value;\n }\n }\n return result;\n}\n\nmodule.exports = arrayFilter;\n","/**\n * Checks if a stack value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Stack\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction stackHas(key) {\n return this.__data__.has(key);\n}\n\nmodule.exports = stackHas;\n","var baseIndexOf = require('./_baseIndexOf'),\n isArrayLike = require('./isArrayLike'),\n isString = require('./isString'),\n toInteger = require('./toInteger'),\n values = require('./values');\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max;\n\n/**\n * Checks if `value` is in `collection`. If `collection` is a string, it's\n * checked for a substring of `value`, otherwise\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * is used for equality comparisons. If `fromIndex` is negative, it's used as\n * the offset from the end of `collection`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object|string} collection The collection to inspect.\n * @param {*} value The value to search for.\n * @param {number} [fromIndex=0] The index to search from.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`.\n * @returns {boolean} Returns `true` if `value` is found, else `false`.\n * @example\n *\n * _.includes([1, 2, 3], 1);\n * // => true\n *\n * _.includes([1, 2, 3], 1, 2);\n * // => false\n *\n * _.includes({ 'a': 1, 'b': 2 }, 1);\n * // => true\n *\n * _.includes('abcd', 'bc');\n * // => true\n */\nfunction includes(collection, value, fromIndex, guard) {\n collection = isArrayLike(collection) ? collection : values(collection);\n fromIndex = (fromIndex && !guard) ? toInteger(fromIndex) : 0;\n\n var length = collection.length;\n if (fromIndex < 0) {\n fromIndex = nativeMax(length + fromIndex, 0);\n }\n return isString(collection)\n ? (fromIndex <= length && collection.indexOf(value, fromIndex) > -1)\n : (!!length && baseIndexOf(collection, value, fromIndex) > -1);\n}\n\nmodule.exports = includes;\n","/**\n * This function is like `arrayIncludes` except that it accepts a comparator.\n *\n * @private\n * @param {Array} [array] The array to inspect.\n * @param {*} target The value to search for.\n * @param {Function} comparator The comparator invoked per element.\n * @returns {boolean} Returns `true` if `target` is found, else `false`.\n */\nfunction arrayIncludesWith(array, value, comparator) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n while (++index < length) {\n if (comparator(value, array[index])) {\n return true;\n }\n }\n return false;\n}\n\nmodule.exports = arrayIncludesWith;\n","\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.validateGrammar = exports.resolveGrammar = void 0;\nvar forEach_1 = __importDefault(require(\"lodash/forEach\"));\nvar defaults_1 = __importDefault(require(\"lodash/defaults\"));\nvar resolver_1 = require(\"../resolver\");\nvar checks_1 = require(\"../checks\");\nvar errors_public_1 = require(\"../../errors_public\");\nfunction resolveGrammar(options) {\n var actualOptions = (0, defaults_1.default)(options, {\n errMsgProvider: errors_public_1.defaultGrammarResolverErrorProvider\n });\n var topRulesTable = {};\n (0, forEach_1.default)(options.rules, function (rule) {\n topRulesTable[rule.name] = rule;\n });\n return (0, resolver_1.resolveGrammar)(topRulesTable, actualOptions.errMsgProvider);\n}\nexports.resolveGrammar = resolveGrammar;\nfunction validateGrammar(options) {\n options = (0, defaults_1.default)(options, {\n errMsgProvider: errors_public_1.defaultGrammarValidatorErrorProvider\n });\n return (0, checks_1.validateGrammar)(options.rules, options.tokenTypes, options.errMsgProvider, options.grammarName);\n}\nexports.validateGrammar = validateGrammar;\n//# sourceMappingURL=gast_resolver_public.js.map","/**\n * This method returns `false`.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {boolean} Returns `false`.\n * @example\n *\n * _.times(2, _.stubFalse);\n * // => [false, false]\n */\nfunction stubFalse() {\n return false;\n}\n\nmodule.exports = stubFalse;\n","var Stack = require('./_Stack'),\n arrayEach = require('./_arrayEach'),\n assignValue = require('./_assignValue'),\n baseAssign = require('./_baseAssign'),\n baseAssignIn = require('./_baseAssignIn'),\n cloneBuffer = require('./_cloneBuffer'),\n copyArray = require('./_copyArray'),\n copySymbols = require('./_copySymbols'),\n copySymbolsIn = require('./_copySymbolsIn'),\n getAllKeys = require('./_getAllKeys'),\n getAllKeysIn = require('./_getAllKeysIn'),\n getTag = require('./_getTag'),\n initCloneArray = require('./_initCloneArray'),\n initCloneByTag = require('./_initCloneByTag'),\n initCloneObject = require('./_initCloneObject'),\n isArray = require('./isArray'),\n isBuffer = require('./isBuffer'),\n isMap = require('./isMap'),\n isObject = require('./isObject'),\n isSet = require('./isSet'),\n keys = require('./keys'),\n keysIn = require('./keysIn');\n\n/** Used to compose bitmasks for cloning. */\nvar CLONE_DEEP_FLAG = 1,\n CLONE_FLAT_FLAG = 2,\n CLONE_SYMBOLS_FLAG = 4;\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n arrayTag = '[object Array]',\n boolTag = '[object Boolean]',\n dateTag = '[object Date]',\n errorTag = '[object Error]',\n funcTag = '[object Function]',\n genTag = '[object GeneratorFunction]',\n mapTag = '[object Map]',\n numberTag = '[object Number]',\n objectTag = '[object Object]',\n regexpTag = '[object RegExp]',\n setTag = '[object Set]',\n stringTag = '[object String]',\n symbolTag = '[object Symbol]',\n weakMapTag = '[object WeakMap]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n dataViewTag = '[object DataView]',\n float32Tag = '[object Float32Array]',\n float64Tag = '[object Float64Array]',\n int8Tag = '[object Int8Array]',\n int16Tag = '[object Int16Array]',\n int32Tag = '[object Int32Array]',\n uint8Tag = '[object Uint8Array]',\n uint8ClampedTag = '[object Uint8ClampedArray]',\n uint16Tag = '[object Uint16Array]',\n uint32Tag = '[object Uint32Array]';\n\n/** Used to identify `toStringTag` values supported by `_.clone`. */\nvar cloneableTags = {};\ncloneableTags[argsTag] = cloneableTags[arrayTag] =\ncloneableTags[arrayBufferTag] = cloneableTags[dataViewTag] =\ncloneableTags[boolTag] = cloneableTags[dateTag] =\ncloneableTags[float32Tag] = cloneableTags[float64Tag] =\ncloneableTags[int8Tag] = cloneableTags[int16Tag] =\ncloneableTags[int32Tag] = cloneableTags[mapTag] =\ncloneableTags[numberTag] = cloneableTags[objectTag] =\ncloneableTags[regexpTag] = cloneableTags[setTag] =\ncloneableTags[stringTag] = cloneableTags[symbolTag] =\ncloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] =\ncloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true;\ncloneableTags[errorTag] = cloneableTags[funcTag] =\ncloneableTags[weakMapTag] = false;\n\n/**\n * The base implementation of `_.clone` and `_.cloneDeep` which tracks\n * traversed objects.\n *\n * @private\n * @param {*} value The value to clone.\n * @param {boolean} bitmask The bitmask flags.\n * 1 - Deep clone\n * 2 - Flatten inherited properties\n * 4 - Clone symbols\n * @param {Function} [customizer] The function to customize cloning.\n * @param {string} [key] The key of `value`.\n * @param {Object} [object] The parent object of `value`.\n * @param {Object} [stack] Tracks traversed objects and their clone counterparts.\n * @returns {*} Returns the cloned value.\n */\nfunction baseClone(value, bitmask, customizer, key, object, stack) {\n var result,\n isDeep = bitmask & CLONE_DEEP_FLAG,\n isFlat = bitmask & CLONE_FLAT_FLAG,\n isFull = bitmask & CLONE_SYMBOLS_FLAG;\n\n if (customizer) {\n result = object ? customizer(value, key, object, stack) : customizer(value);\n }\n if (result !== undefined) {\n return result;\n }\n if (!isObject(value)) {\n return value;\n }\n var isArr = isArray(value);\n if (isArr) {\n result = initCloneArray(value);\n if (!isDeep) {\n return copyArray(value, result);\n }\n } else {\n var tag = getTag(value),\n isFunc = tag == funcTag || tag == genTag;\n\n if (isBuffer(value)) {\n return cloneBuffer(value, isDeep);\n }\n if (tag == objectTag || tag == argsTag || (isFunc && !object)) {\n result = (isFlat || isFunc) ? {} : initCloneObject(value);\n if (!isDeep) {\n return isFlat\n ? copySymbolsIn(value, baseAssignIn(result, value))\n : copySymbols(value, baseAssign(result, value));\n }\n } else {\n if (!cloneableTags[tag]) {\n return object ? value : {};\n }\n result = initCloneByTag(value, tag, isDeep);\n }\n }\n // Check for circular references and return its corresponding clone.\n stack || (stack = new Stack);\n var stacked = stack.get(value);\n if (stacked) {\n return stacked;\n }\n stack.set(value, result);\n\n if (isSet(value)) {\n value.forEach(function(subValue) {\n result.add(baseClone(subValue, bitmask, customizer, subValue, value, stack));\n });\n } else if (isMap(value)) {\n value.forEach(function(subValue, key) {\n result.set(key, baseClone(subValue, bitmask, customizer, key, value, stack));\n });\n }\n\n var keysFunc = isFull\n ? (isFlat ? getAllKeysIn : getAllKeys)\n : (isFlat ? keysIn : keys);\n\n var props = isArr ? undefined : keysFunc(value);\n arrayEach(props || value, function(subValue, key) {\n if (props) {\n key = subValue;\n subValue = value[key];\n }\n // Recursively populate clone (susceptible to call stack limits).\n assignValue(result, key, baseClone(subValue, bitmask, customizer, key, value, stack));\n });\n return result;\n}\n\nmodule.exports = baseClone;\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\tid: moduleId,\n\t\tloaded: false,\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Flag the module as loaded\n\tmodule.loaded = true;\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.nmd = (module) => {\n\tmodule.paths = [];\n\tif (!module.children) module.children = [];\n\treturn module;\n};","/**\n * jQuery Calx Plugin - Backward Compatibility Wrapper\n * Wraps the modern Calx.js implementation with jQuery plugin API\n */\n\nimport { Calx } from './Calx';\nimport { Workbook } from './Calx/Workbook';\nimport { Sheet } from './Calx/Sheet';\nimport { DataType } from './Calx/Cell/DataType';\nimport { FormatterInterface } from './Calx/Cell/Formatter';\n\ninterface JQueryCalxOptions {\n data?: Record;\n autoCalculate?: boolean;\n variables?: Record;\n functions?: Record;\n formatters?: Record;\n styleFormatters?: Record;\n}\n\ninterface SheetData {\n [cellAddress: string]: CellConfig;\n}\n\ninterface CellConfig {\n value?: any;\n formula?: string;\n format?: string;\n type?: DataType;\n styleFormatter?: StyleFormatterFunction;\n}\n\ntype StyleFormatterFunction = (value: any, $element: any) => Record | void;\n\ninterface JQuery {\n calx(options?: JQueryCalxOptions | string, ...args: any[]): any;\n}\n\n// Extend jQuery\n(function($: any) {\n if (!$) {\n console.warn('jQuery not found. The Calx jQuery plugin requires jQuery to be loaded first.');\n return;\n }\n\n // Store workbook instances per element group\n const workbooks = new WeakMap();\n\n // Global formatter registry with predefined formatters\n // Each formatter has format() and parse() methods for input-mask behavior\n const formatterRegistry: Record = {\n currency: {\n format: (value: any): string => {\n if (value == null || isNaN(value)) return '';\n return '$' + Number(value).toFixed(2).replace(/\\B(?=(\\d{3})+(?!\\d))/g, ',');\n },\n parse: (input: string): any => {\n // Strip currency symbols, commas, spaces\n const cleaned = String(input).replace(/[$,\\s]/g, '');\n const num = parseFloat(cleaned);\n return isNaN(num) ? null : num;\n }\n },\n percent: {\n format: (value: any): string => {\n if (value == null || isNaN(value)) return '';\n return (Number(value) * 100).toFixed(2) + '%';\n },\n parse: (input: string): any => {\n const inputStr = String(input).trim();\n // Check if input already contains % symbol\n const hasPercent = inputStr.includes('%');\n // Strip % symbol and spaces\n const cleaned = inputStr.replace(/[%\\s]/g, '');\n const num = parseFloat(cleaned);\n if (isNaN(num)) return null;\n // If user typed \"30%\", interpret as 30% (store as 0.30)\n // If user typed \"30\", interpret as raw value 30 (displays as 3000%)\n return hasPercent ? num / 100 : num;\n }\n },\n number: {\n format: (value: any): string => {\n if (value == null || isNaN(value)) return '';\n return Number(value).toFixed(2);\n },\n parse: (input: string): any => {\n const num = parseFloat(String(input));\n return isNaN(num) ? null : num;\n }\n },\n integer: {\n format: (value: any): string => {\n if (value == null || isNaN(value)) return '';\n return Math.round(Number(value)).toString();\n },\n parse: (input: string): any => {\n const num = parseFloat(String(input));\n return isNaN(num) ? null : Math.round(num);\n }\n },\n text: {\n format: (value: any): string => {\n return value != null ? String(value) : '';\n },\n parse: (input: string): any => {\n return input;\n }\n }\n };\n\n // Global function registry\n const functionRegistry: Record = {};\n\n // Global style formatter registry\n const styleFormatterRegistry: Record = {\n negative: (value: any, $element: any) => {\n if (value < 0) {\n return { color: 'red' };\n }\n return { color: '' }; // Reset color\n },\n positive: (value: any, $element: any) => {\n if (value > 0) {\n return { color: 'green' };\n }\n return { color: '' }; // Reset color\n },\n zero: (value: any, $element: any) => {\n if (value === 0) {\n return { color: 'gray' };\n }\n return { color: '' }; // Reset color\n }\n };\n\n /**\n * Register a custom formatter\n */\n $.calx = {\n registerFormatter: function(name: string, formatter: FormatterInterface) {\n formatterRegistry[name] = formatter;\n },\n\n registerFunction: function(name: string, func: Function) {\n functionRegistry[name.toUpperCase()] = func;\n // Also register with Calx core\n Calx.setFormula(name.toUpperCase(), func);\n },\n\n registerStyleFormatter: function(name: string, formatter: StyleFormatterFunction) {\n styleFormatterRegistry[name] = formatter;\n },\n\n getFormatter: function(name: string): FormatterInterface | undefined {\n return formatterRegistry[name];\n }\n };\n\n $.fn.calx = function(this: any, options?: JQueryCalxOptions | string, ...args: any[]) {\n // Handle method calls\n if (typeof options === 'string') {\n const method = options;\n const element = this[0];\n const workbook = workbooks.get(element);\n\n if (!workbook) {\n console.error('Calx not initialized on this element');\n return this;\n }\n\n return handleMethodCall(workbook, element, method, args);\n }\n\n // Initialize options with defaults\n const opts = $.extend(true, {\n data: {},\n autoCalculate: true,\n variables: {},\n functions: {},\n formatters: {},\n styleFormatters: {}\n }, options);\n\n // Register custom functions\n if (opts.functions) {\n Object.keys(opts.functions).forEach(name => {\n $.calx.registerFunction(name, opts.functions[name]);\n });\n }\n\n // Register custom formatters\n if (opts.formatters) {\n Object.keys(opts.formatters).forEach(name => {\n $.calx.registerFormatter(name, opts.formatters[name]);\n });\n }\n\n // Register custom style formatters\n if (opts.styleFormatters) {\n Object.keys(opts.styleFormatters).forEach(name => {\n styleFormatterRegistry[name] = opts.styleFormatters[name];\n });\n }\n\n // Determine if data has sheet structure or flat cell structure\n const hasSheetStructure = opts.data && Object.keys(opts.data).some(key => {\n const value = opts.data[key];\n return typeof value === 'object' && !('value' in value || 'formula' in value);\n });\n\n // Create one workbook for all selected elements\n const workbook = Calx.createWorkbook();\n\n // Process variables via NameManager\n if (opts.variables) {\n Object.keys(opts.variables).forEach(varName => {\n const reference = opts.variables[varName];\n workbook.nameManager.define(varName, reference);\n });\n }\n\n // First pass: Create all sheets to avoid race conditions with cross-sheet references\n const sheetElements: Array<{element: any, sheetName: string, sheetData: SheetData}> = [];\n\n this.each(function(this: HTMLElement, index: number) {\n const $element = $(this);\n\n // Determine sheet name from element ID or data-sheet attribute\n let sheetName = $element.attr('id') || $element.attr('data-sheet') || `Sheet${index + 1}`;\n\n // Get sheet-specific data from config if it exists\n const sheetData = hasSheetStructure && opts.data[sheetName]\n ? opts.data[sheetName] as SheetData\n : (hasSheetStructure ? {} : opts.data as SheetData);\n\n // Try to get existing sheet, create if it doesn't exist\n let sheet;\n try {\n sheet = workbook.getSheet(sheetName);\n } catch (e) {\n sheet = workbook.createSheet(sheetName);\n sheet.autoCalculate = opts.autoCalculate !== false; // Enable by default\n }\n\n // Store for second pass\n sheetElements.push({\n element: $element,\n sheetName: sheetName,\n sheetData: sheetData\n });\n\n // Store workbook reference on ALL elements\n workbooks.set(this, workbook);\n });\n\n // Second pass: Process all sheet data now that all sheets exist\n sheetElements.forEach(({element, sheetName, sheetData}) => {\n const sheet = workbook.getSheet(sheetName);\n if (sheet) {\n processSheetData(workbook, element, sheet, sheetData, opts);\n }\n });\n\n // Build and calculate\n workbook.build();\n\n // Mark all cells as dirty to ensure proper calculation on first load\n // This is important for cross-sheet references that may not have been resolved during cell creation\n sheetElements.forEach(({sheetName}) => {\n const sheet = workbook.getSheet(sheetName);\n if (sheet) {\n const cells = sheet.cells;\n for (const address in cells) {\n const cell = cells[address];\n if (cell.formula) {\n cell.markAsDirty();\n }\n }\n }\n });\n\n workbook.calculate();\n\n // Update all cells in all sheets\n this.each(function(this: HTMLElement, index: number) {\n const $element = $(this);\n const sheetName = $element.attr('id') || $element.attr('data-sheet') || `Sheet${index + 1}`;\n const sheet = workbook.getSheet(sheetName);\n if (sheet) {\n updateAllCells(sheet, $element);\n }\n });\n\n return this;\n };\n\n /**\n * Process sheet data (cells and formulas) after sheet is created\n */\n function processSheetData(\n workbook: Workbook,\n $element: any,\n sheet: Sheet,\n sheetData: SheetData,\n opts: JQueryCalxOptions\n ): void {\n // Process HTML elements with data-cell/data-formula attributes first\n // This will auto-assign CALX addresses to elements with data-formula but no data-cell\n processDataAttributes($element, sheet);\n\n // Process data configuration from arguments and merge with HTML attributes\n // Data from arguments takes precedence over HTML attributes\n if (sheetData) {\n Object.keys(sheetData).forEach(cellRef => {\n const config = sheetData[cellRef];\n const cell = sheet.getCell(cellRef);\n\n // Merge: data from arguments overrides HTML attributes\n if (config.value !== undefined) {\n cell.value = config.value;\n }\n if (config.formula) {\n cell.formula = config.formula;\n }\n if (config.format) {\n cell.format = config.format;\n }\n if (config.type) {\n cell.type = config.type;\n }\n });\n }\n\n // Listen to cell value changes to update DOM\n sheet.listen('VALUE_CHANGED', (event: any) => {\n const { address } = event;\n const $cell = $element.find(`[data-cell=\"${address}\"]`);\n if ($cell.length) {\n const cell = sheet.getCell(address);\n const value = cell.value;\n\n // Skip updating focused inputs (user is typing)\n if ($cell.is('input, textarea') && $cell.is(':focus')) {\n return;\n }\n\n // Apply formatter: data-format attribute > cell.format property > raw value\n const dataFormat = $cell.attr('data-format');\n const cellFormat = cell.format;\n let formattedValue: string;\n\n if (dataFormat && formatterRegistry[dataFormat]) {\n formattedValue = formatterRegistry[dataFormat].format(value);\n } else if (cellFormat && formatterRegistry[cellFormat]) {\n formattedValue = formatterRegistry[cellFormat].format(value);\n } else {\n // Render as-is fallback\n formattedValue = value != null ? String(value) : '';\n }\n\n if ($cell.is('input, select, textarea')) {\n $cell.val(formattedValue);\n } else {\n $cell.text(formattedValue);\n }\n\n // Apply conditional styling (style formatter)\n applyStyleFormatter(value, $cell);\n }\n });\n\n // Handle focus on formatted inputs: show raw value for editing\n $element.on('focus', 'input[data-format], textarea[data-format]', function() {\n const $input = $(this);\n const cellAddress = $input.attr('data-cell') || $input.attr('data-formula');\n\n if (cellAddress) {\n const cell = sheet.getCellDirect(cellAddress);\n if (cell) {\n const rawValue = cell.value;\n $input.val(rawValue != null ? String(rawValue) : '');\n }\n }\n });\n\n // Handle blur on formatted inputs: parse and format value (input-mask behavior)\n $element.on('blur', 'input[data-format], textarea[data-format]', function(e) {\n const $input = $(this);\n let cellAddress = $input.attr('data-cell') || $input.attr('data-formula');\n\n if (cellAddress) {\n const cell = sheet.getCellDirect(cellAddress);\n if (cell) {\n const dataFormat = $input.attr('data-format');\n const cellFormat = cell.format;\n\n // Determine which formatter to use\n const formatter = (dataFormat && formatterRegistry[dataFormat])\n || (cellFormat && formatterRegistry[cellFormat]);\n\n if (formatter) {\n // Format for display immediately (legacy calx approach)\n const formattedValue = formatter.format(cell.value);\n $input.val(formattedValue);\n }\n }\n }\n });\n\n // Handle change on formatted inputs: parse and calculate\n $element.on('change', 'input[data-format], textarea[data-format]', function(e) {\n const $input = $(this);\n let cellAddress = $input.attr('data-cell') || $input.attr('data-formula');\n\n if (cellAddress) {\n const cell = sheet.getCellDirect(cellAddress);\n if (cell) {\n // Get the raw input value\n const rawInput = $input.val();\n const dataFormat = $input.attr('data-format');\n const cellFormat = cell.format;\n\n // Determine which formatter to use\n const formatter = (dataFormat && formatterRegistry[dataFormat])\n || (cellFormat && formatterRegistry[cellFormat]);\n\n if (formatter && formatter.parse) {\n // Parse the input (handles $2, 2, $2.00, etc.) - only for editable cells\n const isReadonly = $input.prop('readonly');\n const hasFormula = !!$input.attr('data-formula');\n\n if (!isReadonly && !hasFormula) {\n const parsedValue = formatter.parse(rawInput);\n\n // Update the cell value with parsed value\n if (parsedValue !== null && parsedValue !== cell.value) {\n cell.value = parsedValue;\n\n // Trigger calculation if auto-calculate is enabled\n if (opts.autoCalculate) {\n workbook.calculate();\n // Update all cells in workbook\n const allElements: HTMLElement[] = [];\n $('body').find('*').each(function(this: HTMLElement) {\n if (workbooks.get(this) === workbook) {\n allElements.push(this);\n }\n });\n updateAllCellsInWorkbook(workbook, $(allElements));\n }\n }\n }\n }\n }\n }\n });\n\n // Setup auto-calculation on input changes\n if (opts.autoCalculate) {\n $element.on('input change', '[data-cell], [data-formula]', function() {\n const $input = $(this);\n let cellRef = $input.attr('data-cell') || $input.attr('data-formula');\n\n if (cellRef) {\n // Skip inputs with data-format - let blur handler parse them\n const hasFormat = $input.attr('data-format');\n if (hasFormat) {\n return;\n }\n\n const cell = sheet.getCellDirect(cellRef);\n if (cell) {\n const newValue = $input.val();\n if (typeof newValue === 'string' || typeof newValue === 'number') {\n cell.value = newValue;\n }\n\n workbook.calculate();\n\n // Update all sheets in the workbook by finding all elements that share this workbook\n const allElements: HTMLElement[] = [];\n $('body').find('*').each(function(this: HTMLElement) {\n if (workbooks.get(this) === workbook) {\n allElements.push(this);\n }\n });\n updateAllCellsInWorkbook(workbook, $(allElements));\n }\n }\n });\n }\n }\n\n /**\n * Process data attributes on HTML elements\n */\n function processDataAttributes($element: any, sheet: Sheet): void {\n let calxCounter = 1;\n\n // First pass: Process elements with data-formula but no data-cell (auto-assign addresses)\n $element.find('[data-formula]:not([data-cell])').each(function(this: HTMLElement) {\n const $el = $(this);\n const autoAddress = `CALX${calxCounter}`;\n $el.attr('data-cell', autoAddress);\n calxCounter++;\n });\n\n // Second pass: Process all elements with data-cell (including auto-assigned ones)\n $element.find('[data-cell]').each(function(this: HTMLElement) {\n const $cell = $(this);\n const cellAddress = $cell.attr('data-cell');\n\n if (!cellAddress) return;\n\n // Register named variable if data-var is specified\n const varName = $cell.attr('data-var');\n if (varName) {\n const workbook = sheet.workbook;\n workbook.nameManager.define(varName, cellAddress);\n }\n\n // Get cell configuration from attributes\n const formula = $cell.attr('data-formula');\n const format = $cell.attr('data-format');\n const dataType = $cell.attr('data-type');\n\n // Get initial value from input/element\n const tagName = $cell.prop('tagName').toLowerCase();\n let initialValue: any = null;\n\n if (tagName === 'input' || tagName === 'textarea' || tagName === 'select') {\n initialValue = $cell.val();\n } else {\n initialValue = $cell.text().trim();\n }\n\n // Parse initial value if formatter is present (for values like \"25%\" or \"$1000\")\n if (initialValue && format && formatterRegistry[format] && formatterRegistry[format].parse) {\n initialValue = formatterRegistry[format].parse(initialValue);\n }\n\n // Get or create cell\n const cell = sheet.getCell(cellAddress);\n\n // Set type FIRST if specified (before setting value)\n if (dataType) {\n switch (dataType.toLowerCase()) {\n case 'number':\n cell.type = DataType.NUMBER;\n break;\n case 'text':\n cell.type = DataType.TEXT;\n break;\n case 'boolean':\n cell.type = DataType.BOOLEAN;\n break;\n case 'date':\n cell.type = DataType.DATE;\n break;\n }\n }\n\n // Set formula if specified\n if (formula) {\n cell.formula = formula;\n } else if (initialValue !== null) {\n cell.value = initialValue;\n }\n\n // Set format if specified\n if (format) {\n cell.format = format;\n }\n });\n }\n\n /**\n * Update all cells in all sheets of a workbook\n */\n function updateAllCellsInWorkbook(workbook: Workbook, $elements: any): void {\n $elements.each(function(this: HTMLElement) {\n const $element = $(this);\n const sheetName = $element.attr('id') || $element.attr('data-sheet');\n if (sheetName) {\n try {\n const sheet = workbook.getSheet(sheetName);\n if (sheet) {\n updateAllCells(sheet, $element);\n }\n } catch (e) {\n // Sheet might not exist, skip it\n }\n }\n });\n }\n\n /**\n * Update all cell elements with their current values\n */\n function updateAllCells(sheet: Sheet, $element: any): void {\n $element.find('[data-cell]').each(function(this: HTMLElement) {\n const $cell = $(this);\n const cellAddress = $cell.attr('data-cell');\n\n if (!cellAddress) return;\n\n const cell = sheet.getCellDirect(cellAddress);\n if (!cell) return;\n\n const value = cell.value;\n\n // Apply formatter: data-format attribute > cell.format property > raw value\n const dataFormat = $cell.attr('data-format');\n const cellFormat = cell.format;\n let formattedValue: string;\n\n if (dataFormat && formatterRegistry[dataFormat]) {\n formattedValue = formatterRegistry[dataFormat].format(value);\n } else if (cellFormat && formatterRegistry[cellFormat]) {\n formattedValue = formatterRegistry[cellFormat].format(value);\n } else {\n // Render as-is fallback\n formattedValue = value != null ? String(value) : '';\n }\n\n const tagName = $cell.prop('tagName').toLowerCase();\n\n // Don't update if this is the active/focused element (user is typing)\n if (document.activeElement === this) {\n return;\n }\n\n if (tagName === 'input' || tagName === 'textarea' || tagName === 'select') {\n // Only update if value has changed to avoid cursor jumping\n if ($cell.val() !== formattedValue) {\n $cell.val(formattedValue);\n }\n } else {\n $cell.text(formattedValue);\n }\n\n // Apply conditional styling (style formatter)\n applyStyleFormatter(value, $cell);\n });\n }\n\n /**\n * Apply conditional styling to a cell element\n */\n function applyStyleFormatter(value: any, $element: any): void {\n const styleFormatterName = $element.attr('data-style-if');\n\n if (styleFormatterName && styleFormatterRegistry[styleFormatterName]) {\n const css = styleFormatterRegistry[styleFormatterName](value, $element);\n if (css && typeof css === 'object') {\n // Always apply CSS to allow resetting styles\n $element.css(css);\n }\n }\n }\n\n /**\n * Handle method calls on initialized Calx instances\n */\n function handleMethodCall(workbook: Workbook, element: HTMLElement, method: string, args: any[]): any {\n // Determine the sheet name from the element or from the cell address\n let sheetName: string;\n\n if (args[0] && typeof args[0] === 'string' && args[0].includes('!')) {\n // Cell address includes sheet name (e.g., \"Sheet1!A1\")\n sheetName = args[0].split('!')[0].replace('#', '');\n } else {\n // Use element's ID or data-sheet attribute as sheet name\n const $element = $(element);\n sheetName = $element.attr('id') || $element.attr('data-sheet') || 'Sheet1';\n }\n\n const sheet = workbook.getSheet(sheetName);\n\n if (!sheet) {\n console.error(`Sheet '${sheetName}' not found`);\n return null;\n }\n\n switch (method) {\n case 'getCell':\n const address = args[0];\n return sheet.getCellDirect(address);\n\n case 'getCellValue':\n return sheet.getCellValue(args[0]);\n\n case 'setCellValue':\n const cellToSet = sheet.getCellDirect(args[0]);\n cellToSet.value = args[1];\n workbook.calculate();\n return workbook;\n\n case 'setCellFormula':\n const cellToSetFormula = sheet.getCellDirect(args[0]);\n cellToSetFormula.formula = args[1];\n workbook.build();\n workbook.calculate();\n return workbook;\n\n case 'calculate':\n workbook.calculate();\n return workbook;\n\n case 'build':\n workbook.build();\n return workbook;\n\n case 'getWorkbook':\n return workbook;\n\n case 'getSheet':\n const requestedSheet = args[0] ? workbook.getSheet(args[0]) : sheet;\n return requestedSheet;\n\n case 'destroy':\n // Clean up event listeners and references\n workbooks.delete(element);\n return null;\n\n default:\n console.warn(`Method '${method}' not found`);\n return workbook;\n }\n }\n\n})(typeof jQuery !== 'undefined' ? jQuery : typeof $ !== 'undefined' ? $ : null);\n\n// Export for module systems\nexport {};\n"],"names":["root","factory","exports","module","define","amd","a","i","this","baseGetAllKeys","getSymbols","keys","object","listCacheClear","listCacheDelete","listCacheGet","listCacheHas","listCacheSet","ListCache","entries","index","length","clear","entry","set","prototype","get","has","assocIndexOf","splice","Array","key","data","__data__","pop","call","size","MapCache","memoize","func","resolver","TypeError","memoized","args","arguments","apply","cache","result","Cache","extendStatics","__extends","d","b","Object","setPrototypeOf","__proto__","p","hasOwnProperty","String","__","constructor","create","__importDefault","mod","__esModule","defineProperty","value","EarlyExitException","NotAllInputParsedException","NoViableAltException","MismatchedTokenException","isRecognitionException","includes_1","MISMATCHED_TOKEN_EXCEPTION","NO_VIABLE_ALT_EXCEPTION","EARLY_EXIT_EXCEPTION","NOT_ALL_INPUT_PARSED_EXCEPTION","RECOGNITION_EXCEPTION_NAMES","freeze","error","default","name","RecognitionException","_super","message","token","_newTarget","_this","resyncedTokens","Error","captureStackTrace","previousToken","Lexer","LexerDefinitionErrorType","lexer_1","noop_1","isEmpty_1","isArray_1","last_1","reject_1","map_1","forEach_1","keys_1","isUndefined_1","identity_1","assign_1","reduce_1","clone_1","utils_1","tokens_1","lexer_errors_public_1","reg_exp_parser_1","DEFAULT_LEXER_CONFIG","deferDefinitionErrorsHandling","positionTracking","lineTerminatorsPattern","lineTerminatorCharacters","ensureOptimizations","safeMode","errorMessageProvider","defaultLexerErrorProvider","traceInitPerf","skipValidations","recoveryEnabled","lexerDefinition","config","lexerDefinitionErrors","lexerDefinitionWarning","patternIdxToConfig","charCodeToPatternIdxToConfig","modes","emptyGroups","trackStartLines","trackEndLines","hasCustom","canModeBeOptimized","TRACE_INIT","phaseDesc","phaseImpl","traceInitIndent","indent","join","traceInitMaxIdent","console","log","concat","_a","timer","time","traceMethod","warn","traceInitVal","Infinity","actualDefinition","hasOnlySingleMode","LineTerminatorOptimizedTester","test","defaultMode","DEFAULT_MODE","performRuntimeChecks","performWarningRuntimeChecks","currModeValue","currModeName","currTokType","allModeNames","currModDef","currModName","currAnalyzeResult_1","push","validatePatterns","augmentTokenTypes","analyzeTokenTypes","tracer","canBeOptimized","allErrMessagesString","warningDescriptor","PRINT_WARNING","SUPPORT_STICKY","chopInput","match","matchWithTest","updateLastIndex","matchWithExec","handleModes","computeNewColumn","updateTokenEndLineColumnLocation","createTokenInstance","createFullToken","createStartOnlyToken","createOffsetOnlyToken","addToken","addTokenUsingPush","handlePayload","handlePayloadWithCustom","addTokenUsingMemberAccess","handlePayloadNoCustom","unOptimizedModes","cannotBeOptimized","modeName","clearRegExpParserCache","toFastProperties","tokenize","text","initialMode","tokenizeInternal","j","k","matchAltImage","longerAlt","matchedImage","payload","altPayload","imageLength","group","tokType","newToken","errLength","msg","getPossiblePatterns","orgText","orgLength","offset","matchedTokensIndex","guessedNumberOfTokens","Math","floor","matchedTokens","errors","line","undefined","column","groups","cloneEmptyGroups","trackLines","lineTerminatorPattern","currModePatternsLength","currCharCodeToPatternIdxToConfig","modeStack","emptyArray","getPossiblePatternsSlow","getPossiblePatternsOptimized","charCode","optimizedCharIdx","charCodeToOptimizedIndex","possiblePatterns","currConfig","pop_mode","popToken","tokenType","PUSH_MODE","msg_1","buildUnableToPopLexerModeMessage","startOffset","startLine","startColumn","image","newMode","modeCanBeOptimized","push_mode","nextCharCode","charCodeAt","chosenPatternIdxToConfig","chosenPatternsLength","currPattern","pattern","singleCharCode","short","isCustom","exec","longerAltLength","longerAltConfig","longerAltPattern","tokenTypeIdx","canLineTerminator","numOfLTsInMatch","foundTerminator","lastLTEndOffset","lastIndex","errorStartOffset","errorLine","errorColumn","foundResyncPoint","currConfig_1","buildUnexpectedCharactersMessage","tokens","pushMode","substring","regExp","newLastIndex","lastLTIdx","lastCharIsLT","fixForEndingInLT","endLine","endColumn","oldColumn","endOffset","tokenVector","tokenToAdd","regExpArray","SKIPPED","NA","baseIsEqualDeep","isObjectLike","baseIsEqual","other","bitmask","customizer","stack","getMapData","map","forEach","reIsUint","type","getRegExpAst","regexp_to_ast_1","regExpAstCache","regExpParser","RegExpParser","regExpStr","toString","regExpAst","fullText","charAt","__assign","assign","t","s","n","checkPrefixAlternativesAmbiguities","validateSomeNonEmptyLookaheadPath","validateTooManyAlts","RepetitionCollector","validateAmbiguousAlternationAlternatives","validateEmptyOrAlternative","getFirstNoneTerminal","validateNoLeftRecursion","validateRuleIsOverridden","validateRuleDoesNotAlreadyExist","OccurrenceValidationCollector","identifyProductionForDuplicates","validateGrammar","validateLookahead","first_1","drop_1","flatten_1","filter_1","difference_1","groupBy_1","pickBy_1","values_1","flatMap_1","parser_1","gast_1","lookahead_1","interpreter_1","gast_2","gast_3","dropRight_1","compact_1","prod","getProductionDslName","idx","getExtraProductionArgument","Terminal","terminalType","NonTerminal","nonTerminalName","options","lookaheadValidationErrorMessages","lookaheadStrategy","validate","rules","tokenTypes","grammarName","errorMessage","ParserDefinitionErrorType","CUSTOM_LOOKAHEAD_VALIDATION","topLevels","errMsgProvider","duplicateErrors","currTopLevel","topLevelRule","collectorVisitor","accept","allRuleProductions","allProductions","productionGroups","duplicates","currGroup","currDuplicates","firstProd","buildDuplicateFoundError","dslName","defError","DUPLICATE_PRODUCTIONS","ruleName","occurrence","param","parameter","validateDuplicateProductions","termsNamespaceConflictErrors","tokenNames","currToken","currRule","currRuleName","errMsg","buildNamespaceConflictError","CONFLICT_TOKENS_RULES_NAMESPACE","checkTerminalAndNoneTerminalsNameSpace","tooManyAltsErrors","curRule","duplicateRulesError","visitNonTerminal","subrule","visitOption","option","visitRepetitionWithSeparator","manySep","visitRepetitionMandatory","atLeastOne","visitRepetitionMandatoryWithSeparator","atLeastOneSep","visitRepetition","many","visitAlternation","or","visitTerminal","terminal","GAstVisitor","rule","allRules","className","buildDuplicateRuleNameError","DUPLICATE_RULE_NAME","definition","referencedRule","Alternative","Option","RepetitionMandatory","RepetitionMandatoryWithSeparator","RepetitionWithSeparator","Repetition","Alternation","currSubDef","isFirstOptional","isOptionalProd","hasMore","rest","definedRulesNames","INVALID_RULE_OVERRIDE","topRule","path","nextNonTerminals","buildLeftRecursionError","leftRecursionPath","LEFT_RECURSION","validNextSteps","errorsFromNextSteps","currRefRule","newPath","OrCollector","alternations","node","orCollector","ors","currOr","exceptLast","currAlternative","currAltIdx","possibleFirstInAlt","nextPossibleTokensAfter","tokenStructuredMatcher","buildEmptyAlternationError","alternation","emptyChoiceIdx","NONE_LAST_EMPTY_ALT","alternative","globalMaxLookahead","ignoreAmbiguities","currOccurrence","actualMaxLookahead","maxLookahead","alternatives","getLookaheadPathsForOr","altsAmbiguityErrors","foundAmbiguousPaths","identicalAmbiguities","currAlt","currPath","altsCurrPathAppearsIn","currOtherAlt","currOtherAltIdx","containsPath","alts","currAmbDescriptor","ambgIndices","buildAlternationAmbiguityError","ambiguityIndices","prefixPath","AMBIGUOUS_ALTS","checkAlternativesAmbiguities","altsPrefixAmbiguityErrors","buildTooManyAlternativesError","TOO_MANY_ALTS","pathsAndIndices","currPathsAndIdx","currPathAndIdx","targetIdx","targetPath","prefixAmbiguitiesPathsAndIndices","searchPathAndIdx","isStrictPrefixOfPath","currAmbPathAndIdx","buildAlternationPrefixAmbiguityError","AMBIGUOUS_PREFIX_ALTS","topLevelRules","currTopRule","currProd","prodType","getProdType","pathsInsideProduction","getLookaheadPathsForOptionalProd","buildEmptyRepetitionError","repetition","NO_NON_EMPTY_LOOKAHEAD","arrayMap","props","baseProperty","basePropertyDeep","isKey","toKey","ContentAssist","initContentAssist","computeContentAssist","startRuleName","precedingInput","startRuleGast","gastProductionsCache","tokenMatcher","getNextPossibleTokenTypes","grammarPath","topRuleName","ruleStack","topProduction","getGAstProductions","NextAfterTokenWalker","startWalking","baseHasIn","hasPath","baseFor","iteratee","Symbol","objectProto","nativeObjectToString","symToStringTag","toStringTag","isOwn","tag","unmasked","e","getAllKeys","equalFunc","isPartial","objProps","objLength","objStacked","othStacked","skipCtor","objValue","othValue","compared","objCtor","othCtor","baseTimes","isArguments","isArray","isBuffer","isIndex","isTypedArray","inherited","isArr","isArg","isBuff","isType","skipIndexes","isObject","isStrictComparable","arrayReduce","baseEach","baseIteratee","baseReduce","collection","accumulator","initAccum","defaultGrammarValidatorErrorProvider","defaultGrammarResolverErrorProvider","defaultParserErrorProvider","tokens_public_1","buildMismatchTokenMessage","expected","actual","expectedMsg","previous","hasTokenLabel","tokenLabel","buildNotAllInputParsedMessage","firstRedundant","buildNoViableAltMessage","expectedPathsPerAlt","customUserDescription","errPrefix","errSuffix","allLookAheadPaths","currAltPaths","nextValidTokenSequences","currTokenType","nextValidSequenceItems","itemMsg","buildEarlyExitMessage","expectedIterationPaths","buildRuleNotFoundError","undefinedRule","duplicateProds","topLevelName","duplicateProd","extraArgument","hasExplicitIndex","replace","pathMsg","currTok","currtok","currMessage","buildTokenNameError","pathNames","leftRecursivePath","buildInvalidRuleNameError","Rule","array","baseForOwn","createBaseEach","predicate","LexerAdapter","initLexerAdapter","tokVector","tokVectorLength","currIdx","newInput","selfAnalysisDone","reset","enumerable","configurable","SKIP_TOKEN","consumeToken","LA","END_OF_FILE","howMuch","soughtIdx","exportLexerState","importLexerState","newState","resetLexerState","moveToTerminatedState","getLexerPosition","Map","pairs","LARGE_ARRAY_SIZE","baseRest","isIterateeCall","assigner","sources","guard","source","thisArg","nativeCreate","getNative","string","split","basePickBy","getAllKeysIn","prop","RecognizerApi","exceptions_public_1","errors_public_1","checks_1","ACTION","impl","consume","consumeInternal","ruleToCall","subruleInternal","actionORMethodDef","optionInternal","altsOrOpts","orInternal","manyInternal","atLeastOneInternal","CONSUME","CONSUME1","CONSUME2","CONSUME3","CONSUME4","CONSUME5","CONSUME6","CONSUME7","CONSUME8","CONSUME9","SUBRULE","SUBRULE1","SUBRULE2","SUBRULE3","SUBRULE4","SUBRULE5","SUBRULE6","SUBRULE7","SUBRULE8","SUBRULE9","OPTION","OPTION1","OPTION2","OPTION3","OPTION4","OPTION5","OPTION6","OPTION7","OPTION8","OPTION9","OR","OR1","OR2","OR3","OR4","OR5","OR6","OR7","OR8","OR9","MANY","MANY1","MANY2","MANY3","MANY4","MANY5","MANY6","MANY7","MANY8","MANY9","MANY_SEP","manySepFirstInternal","MANY_SEP1","MANY_SEP2","MANY_SEP3","MANY_SEP4","MANY_SEP5","MANY_SEP6","MANY_SEP7","MANY_SEP8","MANY_SEP9","AT_LEAST_ONE","AT_LEAST_ONE1","AT_LEAST_ONE2","AT_LEAST_ONE3","AT_LEAST_ONE4","AT_LEAST_ONE5","AT_LEAST_ONE6","AT_LEAST_ONE7","AT_LEAST_ONE8","AT_LEAST_ONE9","AT_LEAST_ONE_SEP","atLeastOneSepFirstInternal","AT_LEAST_ONE_SEP1","AT_LEAST_ONE_SEP2","AT_LEAST_ONE_SEP3","AT_LEAST_ONE_SEP4","AT_LEAST_ONE_SEP5","AT_LEAST_ONE_SEP6","AT_LEAST_ONE_SEP7","AT_LEAST_ONE_SEP8","AT_LEAST_ONE_SEP9","RULE","implementation","DEFAULT_RULE_CONFIG","definitionErrors","ruleImplementation","defineRule","OVERRIDE_RULE","ruleErrors","BACKTRACK","grammarRule","isBackTrackingStack","orgState","saveRecogState","reloadRecogState","getSerializedGastProductions","serializeGrammar","version_1","VERSION","CstParser","EmbeddedActionsParser","EMPTY_ALT","lexer_public_1","createToken","EOF","tokenName","getLookaheadPaths","llk_lookahead_1","LLkLookaheadStrategy","serializeProduction","cst_dts_gen_1","generateCstDts","render_public_1","createSyntaxDiagramsCode","baseGetTag","baseHas","toFinite","remainder","hashClear","hashDelete","hashGet","hashHas","hashSet","Hash","start","Date","getTime","val","baseIndexOf","toInteger","nativeMax","max","fromIndex","stringToPath","assignValue","baseAssignValue","isNew","newValue","Stack","matchData","noCustomizer","srcValue","COMPARE_PARTIAL_FLAG","reWhitespace","memoizeCapped","rePropName","reEscapeChar","number","quote","subString","nativeNow","now","count","lastCalled","stamp","remaining","CellEvent","cloneArrayBuffer","typedArray","isDeep","buffer","byteOffset","Uint8Array","eq","equalArrays","mapToArray","setToArray","symbolProto","symbolValueOf","valueOf","byteLength","convert","stacked","arrayAggregator","baseAggregator","setter","initializer","isArrayLike","findIndexFunc","iterable","createAggregator","groupBy","rsAstralRange","rsAstral","rsCombo","rsFitz","rsNonAstral","rsRegional","rsSurrPair","reOptMod","rsModifier","rsOptVar","rsSeq","rsSymbol","reUnicode","RegExp","collectMethods","LooksAhead","has_1","initLooksAhead","dynamicTokensEnabled","DEFAULT_PARSER_CONFIG","lookAheadFuncsCache","preComputeLookaheadFunctions","repetitionMandatory","repetitionMandatoryWithSeparator","repetitionWithSeparator","prodIdx","laFunc","buildLookaheadForAlternation","prodOccurrence","hasPredicates","getKeyForAutomaticLookahead","fullRuleNameToShort","OR_IDX","setLaFuncCache","computeLookaheadFunc","MANY_IDX","OPTION_IDX","AT_LEAST_ONE_IDX","AT_LEAST_ONE_SEP_IDX","MANY_SEP_IDX","prodKey","prodMaxLookahead","dslMethodName","buildLookaheadForOptional","dslMethodIdx","currRuleShortName","getLastExplicitRuleShortName","getLaFuncFromCache","DslMethodsCollectorVisitor","dslMethods","PerformanceTracer","initPerformanceTracer","userTraceInitPerf","traceIsNumber","baseKeys","getTag","isPrototype","firstForTerminal","firstForBranching","firstForSequence","first","uniq_1","isSequenceProd","isBranchingProd","currSubProd","firstSet","seq","nextSubProdIdx","hasInnerProdsRemaining","isLastInnerProdOptional","allAlternativesFirsts","innerProd","arrayPush","keysFunc","symbolsFunc","copyObject","PRINT_ERROR","GastRecorder","some_1","isFunction_1","RECORDING_NULL_OBJECT","description","HANDLE_SEPARATOR","MAX_METHOD_IDX","pow","BITS_FOR_OCCURRENCE_IDX","RFT","RECORDING_PHASE_TOKEN","RECORDING_PHASE_CSTNODE","children","initGastRecorder","recordingProdStack","RECORDING_PHASE","enableRecording","_loop_1","arg1","arg2","consumeInternalRecord","subruleInternalRecord","optionInternalRecord","orInternalRecord","manyInternalRecord","manySepFirstInternalRecord","atLeastOneInternalRecord","atLeastOneSepFirstInternalRecord","ACTION_RECORD","BACKTRACK_RECORD","LA_RECORD","disableRecording","that","topLevelRuleRecord","def","newTopLevelRule","originalError","KNOWN_RECORDER_ERROR","mutabilityError","recordProd","recordOrProd","assertMethodIdxIsValid","getIdxSuffix","JSON","stringify","prevProd","newNoneTerminal","label","LABEL","outputCst","hasShortKeyProperty","prodConstructor","mainProdArg","handleSep","grammarAction","DEF","newProd","separator","SEP","MAX_LOOKAHEAD","hasOptions","newOrProd","IGNORE_AMBIGUITIES","GATE","currAltFlat","ALT","arraySome","baseSome","baseIsArguments","propertyIsEnumerable","self","saveState","input","groupIdx","restoreState","consumeChar","disjunction","flags","loc","begin","end","global","ignoreCase","multiLine","unicode","sticky","isRegExpFlag","popChar","addFlag","peekChar","terms","isTerm","term","isAssertion","assertion","atom","ASSERT_EXISTS","ASSERT_NEVER_REACH_HERE","quantifier","isBacktracking","range","atLeast","atMost","integerIncludingZero","isDigit","greedy","dotAll","atomEscape","characterClass","isPatternCharacter","patternCharacter","isQuantifier","complement","cc","decimalEscapeAtom","characterClassEscape","controlEscapeAtom","controlLetterEscapeAtom","nulCharacterAtom","hexEscapeSequenceAtom","regExpUnicodeEscapeSequenceAtom","identityEscapeAtom","positiveInteger","digitsCharCodes","whitespaceCodes","wordCharCodes","escapeCode","letter","toUpperCase","parseHexDigits","classPatternCharacterAtom","isClassAtom","from","classAtom","isRangeDash","to","insertToSet","classEscape","capturing","groupAst","decimalPatternNoZero","decimalPattern","parseInt","nextChar","isAtom","prevState","howMany","hexString","hexChar","hexDigitPattern","char","item","subItem","flagObj","flagKey","obj","BaseRegExpVisitor","visitChildren","child","visit","subChild","visitPattern","visitFlags","visitDisjunction","visitAlternative","visitStartAnchor","visitEndAnchor","visitWordBoundary","visitNonWordBoundary","visitLookahead","visitNegativeLookahead","visitCharacter","visitSet","visitGroup","visitGroupBackReference","visitQuantifier","castSlice","hasUnicode","stringToArray","methodName","strSymbols","chr","trailing","slice","fromRight","getRawTag","objectToString","baseClone","isKeyable","Promise","baseSetToString","setToString","shortOut","nativeKeysIn","isProto","isTokenType","hasExtendingTokensTypesMapProperty","hasExtendingTokensTypesProperty","hasCategoriesProperty","singleAssignCategoriesToksMap","assignCategoriesMapProp","assignCategoriesTokensProp","assignTokenDefaultProps","expandCategories","tokenIdxToClass","tokenShortNameIdx","tokenStructuredMatcherNoCategories","categories","searching","CATEGORIES","newCategories","categoryMatches","categoryMatchesMap","nextNode","pathNode","nextCategory","tokInstance","tokConstructor","instanceType","isParent","tokenTypesAndParents","isFlattenable","baseFlatten","depth","isStrict","RestWalker","walk","prevRest","subProd","currRest","walkProdRef","walkTerminal","walkFlat","walkOption","walkAtLeastOne","walkAtLeastOneSep","walkManySep","walkMany","walkOr","refProd","flatProd","fullOrRest","optionProd","atLeastOneProd","fullAtLeastOneRest","atLeastOneSepProd","fullAtLeastOneSepRest","restForRepetitionWithSeparator","manyProd","fullManyRest","manySepProd","fullManySepRest","orProd","alt","prodWrapper","repSepProd","castPath","nested","reFlags","regexp","baseToString","model_1","generate_1","defaultOptions","includeVisitorInterface","visitorInterfaceName","productions","effectiveOptions","model","buildModel","genDts","freeExports","nodeType","freeModule","Buffer","allocUnsafe","copy","getSymbolsIn","keysIn","baseUniq","visitor_1","helpers_1","every_1","alreadyVisited","AbstractProduction","nativeKeys","overArg","stubFalse","mapCacheClear","mapCacheDelete","mapCacheGet","mapCacheHas","mapCacheSet","baseIsMatch","getMatchData","matchesStrictComparable","resIndex","symbol","baseSlice","asciiToArray","unicodeToArray","SetCache","arrayIncludes","arrayIncludesWith","baseUnary","cacheHas","values","comparator","includes","isCommon","valuesLength","outer","computed","valuesIndex","GastRefResolverVisitor","resolveGrammar","refResolver","resolveRefs","nameToTopRule","ref","UNRESOLVED_SUBRULE_REF","unresolvedRefName","identity","nodeAny","visitRule","trimmedEndIndex","reTrimStart","transform","arg","possiblePathsFrom","NextTerminalAfterAtLeastOneSepWalker","NextTerminalAfterAtLeastOneWalker","NextTerminalAfterManySepWalker","NextTerminalAfterManyWalker","AbstractNextTerminalAfterProductionWalker","AbstractNextPossibleTokensWalker","rest_1","first_2","topProd","possibleTokTypes","nextProductionName","nextProductionOccurrence","found","isAtEndOfPath","reverse","occurrenceStack","updateExpectedNext","fullRest","nextTerminalName","nextTerminalOccurrence","lastTok","lastTokOccurrence","restProd","isEndOfRule","firstAfterMany","firstAfterManySep","firstAfterAtLeastOne","atleastOneSepProd","firstAfterfirstAfterAtLeastOneSep","expandTopLevelRule","currRuleStack","currOccurrenceStack","newRuleStack","newCurrOccurrenceStack","targetDef","maxLength","getAlternativesForProd","newDef","partialPath","suffixDef","initialDef","tokMatcher","maxLookAhead","EXIT_NON_TERMINAL","EXIT_NON_TERMINAL_ARR","EXIT_ALTERNATIVE","foundCompletePath","tokenVectorLength","minimalAlternativesIndex","possiblePaths","currDef","nextPath","nextIdx","nextTokenType","nextTokenOccurrence","newOccurrenceStack","nextPathWithout","nextPathWith","secondIteration","separatorGast","nthRepetition","currAltPath","Set","noop","createSet","defineNameProp","nameValue","writable","arrayFilter","stubArray","nativeGetSymbols","getOwnPropertySymbols","defaults","propsIndex","propsLength","baseFindIndex","BESSEL","version","M","_horner","arr","v","z","_bessel_iter","x","f0","f1","sign","tdx","f2","o","_bessel_wrap","bessel0","bessel1","nonzero","NaN","W","b0_a1a","b0_a2a","b0_a1b","b0_a2b","b1_a1a","b1_a2a","b1_a1b","b1_a2b","b0_a","b0_b","b1_a","b1_b","besselj","a1","a2","y","xx","sqrt","cos","sin","abs","round","isFinite","isNaN","ret","jsum","bjp","sum","bj","bjm","tox","bessely","besseli","exp","bip","bi","bim","besselk","DO_NOT_EXPORT_BESSEL","freeGlobal","g","isFunction","isLength","typedArrayTags","IN","minOptimizationVal","buildLineBreakIssueMessage","isShortPattern","isCustomPattern","addStickyFlag","addStartOfInput","findUnreachablePatterns","findModesThatDoNotExist","findInvalidGroupType","findDuplicatePatterns","findUnsupportedFlags","findStartOfInputAnchor","findEmptyMatchRegExps","findEndOfInputAnchor","findInvalidPatterns","findMissingPatterns","enableSticky","disableSticky","MODES","indexOf_1","isString_1","find_1","isRegExp_1","defaults_1","reg_exp_1","PATTERN","tokenTypesWithMissingPattern","currType","MISSING_PATTERN","valid","tokenTypesWithInvalidPattern","INVALID_PATTERN","onlyRelevantTypes","useSticky","debug","action","charCodeToOptimizedIdxMap","initCharCodeToOptimizedIndexMap","allTransformedPatterns","patternIdxToType","patternIdxToGroup","patternIdxToLongerAltIdxArr","patternIdxToPushMode","patternIdxToPopMode","patternIdxToCanLineTerminator","patternIdxToIsCustom","patternIdxToShort","regExpSource","escapedRegExpString","wrappedRegExp","clazz","groupName","GROUP","longerAltType","LONGER_ALT","lineTerminatorCharCodes","getCharCodes","LINE_BREAKS","checkLineBreaksIssues","canMatchCharCode","acc","optimizedIdx","addToMapOfArrays","START_CHARS_HINT","lastOptimizedIdx_1","charOrInt","currOptimizedIdx","failedOptimizationPrefixMsg","optimizedCodes","getOptimizedStartCodesIndices","code","validModesNames","missingResult","invalidResult","validTokenTypes","withRegExpPatterns","validateRegExpPattern","end_of_input","EndAnchorFinder","invalidRegex","regexpAst","endAnchorVisitor","EOI_ANCHOR_FOUND","matchesEmptyString","EMPTY_MATCH_PATTERN","start_of_input","StartAnchorFinder","startAnchorVisitor","SOI_ANCHOR_FOUND","invalidFlags","multiline","UNSUPPORTED_FLAGS_FOUND","identicalPatterns","outerType","innerType","duplicatePatterns","currIdenticalSet","setOfIdentical","tokenTypeNames","dupPatternSrc","DUPLICATE_PATTERNS_FOUND","invalidTypes","INVALID_GROUP_TYPE_FOUND","validModes","invalidModes","PUSH_MODE_DOES_NOT_EXIST","canBeTested","metaChars","str","indexOf","testIdx","testTokenType","UNREACHABLE_PATTERN","issue","IDENTIFY_TERMINATOR","CUSTOM_LINE_BREAK","details","charsOrCodes","numOrString","MULTI_MODE_LEXER_WITHOUT_DEFAULT_MODE","MULTI_MODE_LEXER_WITHOUT_MODES_PROPERTY","MULTI_MODE_LEXER_DEFAULT_MODE_VALUE_DOES_NOT_EXIST","LEXER_DEFINITION_CANNOT_CONTAIN_UNDEFINED","currLongerAlt","MULTI_MODE_LEXER_LONGER_ALT_NOT_IN_CURRENT_MODE","warnings","hasAnyLineBreak","allTokenTypes","concreteTokenTypes","terminatorCharCodes","currIssue","NO_LINE_BREAKS_FLAGS","clonedResult","groupKeys","currKey","currGroupValue","len","c","isMasked","toSource","reIsHostCtor","funcProto","Function","funcToString","reIsNative","baseMap","baseMatches","baseMatchesProperty","property","coreJsData","Ctor","baseCreate","getPrototype","eachFunc","DataView","EventDispatcher","_listeners","_isEventPaused","listen","listener","listeners","addListener","hasListener","removeListener","listenerArray","dispatch","eventName","eventData","target","l","pauseListener","resumeListener","__spreadArray","pack","ar","leftRecursionErrors","emptyAltErrors","validateEmptyOrAlternatives","ambiguousAltsErrors","emptyRepetitionErrors","buildLookaheadFuncForOr","buildAlternativesLookAheadFunc","buildLookaheadFuncForOptionalProd","buildSingleAlternativeLookaheadFunction","seen","seenIndex","upperFirst","createCaseFirst","WeakMap","mapTag","promiseTag","setTag","weakMapTag","dataViewTag","dataViewCtorString","mapCtorString","promiseCtorString","setCtorString","weakMapCtorString","ArrayBuffer","resolve","ctorString","baseValues","spreadableSymbol","isConcatSpreadable","arrLength","othLength","arrStacked","arrValue","othIndex","arrayLikeKeys","grammar","_b","_c","resourceBase","_d","css","freeProcess","process","nodeUtil","require","types","binding","generator","CstNodeDefinitionGenerator","rawElements","visitEach","grouped","el","propertyName","properties","allNullable","canBeNull","propertyType","optional","visitEachAndOverrideWith","getType","override","production","kind","baseIsNative","getValue","baseIsNaN","strictIndexOf","createAssigner","dataView","buildInProdFollowPrefix","buildBetweenProdsFollowPrefix","computeAllProdsFollows","ResyncFollowsWalker","constants_1","follows","followName","t_in_topProd_follows","inner","occurenceInParent","topProductions","reSyncFollows","currRefsFollow","firstCharOptimizedIndices","complementErrorMessage","ast","addOptimizedIdxToResult","rangeCode","minUnOptVal","maxUnOptVal","minOptIdx","maxOptIdx","currOptIdx","isOptionalQuantifier","isWholeOptional","fromCharCode","upperChar","lowerChar","toLowerCase","handleIgnoreCase","findCode","setNode","targetCharCodes","codeOrRange","range_1","targetCode","msgSuffix","CharCodeFinder","charCodes","charCodeFinder","baseDifference","isArrayLikeObject","difference","toBecomeFast","FakeConstructor","fakeInstance","fakeAccess","bar","Parser","follow_1","gast_resolver_public_1","recoverable_1","looksahead_1","tree_builder_1","lexer_adapter_1","recognizer_api_1","recognizer_engine_1","error_handler_1","context_assist_1","gast_recorder_1","perf_tracer_1","apply_mixins_1","nodeLocationTracking","recoveryValueFunc","resyncEnabled","tokenVocabulary","initErrorHandler","initRecognizerEngine","initRecoverable","initTreeBuilder","performSelfAnalysis","parserInstance","defErrorsMsgs","recordedRuleGast","originalGrammarAction","resolverErrors","validationErrors","tokensMap","lookaheadValidationErrors","allFollows","resyncFollows","initialize","DEFER_DEFINITION_ERRORS_HANDLING","applyMixins","Recoverable","TreeBuilder","RecognizerEngine","ErrorHandler","configClone","upperFirst_1","getTypeString","getNodeInterfaceName","getNodeChildrenTypeName","nodes","contentParts","nodeCstInterface","nodeInterfaceName","childrenTypeName","genNodeInterface","nodeChildrenInterface","typeName","typeNames","buildTypeString","genChildProperty","genNodeChildrenType","genCstNodeTypes","genVisitorFunction","jStat","calcRdx","m","LOG10E","isNumber","num","_init","retZero","retOne","retIdent","fn","toArray","utils","toVector","_random_fn","random","setRandom","extend","rows","cols","dimensions","row","rowa","col","submat","arange","ind","cola","diag","nrow","res","antidiag","transpose","objArr","toAlter","ncol","cumreduce","alter","zeros","ones","rand","symmetric","min","cnt","hival","step","current","rl","_slice","list","rcSlice","colSlice","rowSlice","sliceAssign","A","B","nl","ml","diagonal","diagArray","mat","jProto","sort","funcs","passfunc","results","setTimeout","ascNum","clip","sumsqrd","sumsqerr","tmp","mean","sumrow","product","low","high","unique","hash","_arr","meansqerr","geomean","logs","meanOfLogs","median","arrlen","cumsum","cumprod","diff","diffs","arrLen","rank","distinctNumbers","numberCounts","sortedDistinctNumbers","numberRanks","currentRank","mode","maxCount","numMaxCount","mode_arr","variance","flag","pooledvariance","reduce","samples","deviation","dev","stdev","pooledstdev","meandev","meddev","coeffvar","quartiles","quantiles","quantilesArray","alphap","betap","aleph","gamma","sortedArray","quantileVals","percentile","exclusive","realIndex","frac","percentileOfScore","score","counter","strict","histogram","binCnt","binWidth","bins","covariance","arr1","arr2","u","arr1Len","sq_dev","corrcoeff","spearmancoeff","stanMoment","mu","sigma","skewSum","skewness","kurtosis","fullbool","tmpthis","callbackFunction","argsToPass","curriedFunction","vector","gammaln","cof","ser","loggam","x0","x2","xp","gl","gl0","PI","gammafn","yi","q","fact","xden","xnum","gammap","lowRegGamma","an","aln","ap","del","h","ITMAX","factorialln","factorial","combination","combinationln","permutation","betafn","betaln","betacf","m2","aa","fpmin","qab","qap","qam","gammapinv","pp","lna1","afac","gln","erf","ty","isneg","dd","erfc","erfcinv","err","ibetainv","lna","lnb","al","w","b1","ibeta","bt","randn","randg","shape","oalph","betinc","eps","c9","a0","b0","m9","tukeyWprob","rr","xleg","aleg","qsqz","wincr","pr_w","normal","cdf","blb","binc","bub","einsum","cc1","wi","elsum","jj","ac","qexpo","rinsum","f","newthis","sample","vals","fnfunc","beta","pdf","alpha","inv","centralF","df1","df2","binomial","cauchy","local","scale","atan","tan","chisquare","dof","exponential","rate","invgamma","kumaraswamy","lognormal","noncentralt","ncp","studentt","tol","flip","prob","lastvalue","std","pareto","SQRT2","dof2","weibull","uniform","betacdf","negbin","r","hypgeom","N","scaledPDF","samplesDone","scaledCDF","factor","poisson","sumarr","sampleSmall","L","sampleLarge","U","V","slam","loglam","invalpha","vr","us","lam","triangular","arcsine","asin","laplace","tukey","nmeans","df","xlegq","alegq","Number","ulen","f2lf","f21","ff4","ans","otsum","twa1","t1","x1","ps","tukeyQinv","valx0","valx1","iter","isUsable","add","subtract","divide","multiply","nrescols","rescols","dot","left","right","norm","nnorm","angle","acos","aug","newarr","gauss_jordan","det","determinant","submatrix","gauss_elimination","maug","pivot","temp","y2","maxrow","triaUpSolve","parts","matrix_mode","triaLowSolve","lu","R","cholesky","T","gauss_jacobi","xv","xk","gauss_seidel","SOR","householder","QR","lstsq","array_mode","Q","attrs","Q1","RI","I","Aj","cAi","Ij","cIi","R_I","Q2","jacobi","maxim","theta","condition","ev","rungekutta","t_j","u_j","order","k1","k2","k3","romberg","h1","richardson","X","pos","y1","h_min","simpson","hermite","F","dF","dl","lagrange","cubic_spline","sq","gauss_quadrature","PCA","temp1","Bt","D","temp2","Y","C","Vt","differenceOfProportions","p1","n1","p2","n2","pooled","zscore","ztest","sides","tscore","ttest","anovafscore","expVar","sampMean","sampSampMean","tmpargs","unexpVar","anovaftest","ftest","fscore","anovaftes","qscore","mean1","mean2","sd","qtest","tukeyhsd","arrays","means","normalci","change","tci","significant","pvalue","oneSidedDifferenceOfProportions","twoSidedDifferenceOfProportions","models","ols","endog","exog","nobs","df_model","df_resid","coef","predict","resid","ybar","SSE","SSR","SST","R2","t_test","var_count","subModelList","endog_index","exog_index","filter","sigmaHat","seBetaHat","tStatistic","pValue","leftppf","interval95","se","F_statistic","F_test","adjust_R2","buildxmatrix","matrixRows","builddxmatrix","buildjxmatrix","jMat","pass","buildymatrix","buildjymatrix","matrixmult","regress","jMatX","jMatY","innerinv","xtranspxinv","xtransp","next","regresst","compile","jMatYBar","yBar","yAverage","anova","residuals","ssr","msr","sse","mse","sst","mst","r2","fratio","rmse","r2adj","stats","sds","ts","covar","xtranspx","matrixsubtract","createBaseFor","otherArgs","addNoneTerminalToCst","addTerminalToCst","setNodeLocationFull","setNodeLocationOnlyOffset","currNodeLocation","newLocationInfo","tokenTypeName","ruleResult","BITS_FOR_ALT_IDX","BITS_FOR_RULE_IDX","BITS_FOR_METHOD_TYPE","ruleIdx","equalByTag","equalObjects","argsTag","arrayTag","objectTag","objIsArr","othIsArr","objTag","othTag","objIsObj","othIsObj","isSameTag","objIsWrapped","othIsWrapped","objUnwrapped","othUnwrapped","baseIsTypedArray","nodeIsTypedArray","derivedCtor","baseCtors","baseCtor","baseProto","getOwnPropertyNames","propName","basePropDescriptor","getOwnPropertyDescriptor","cloneDataView","cloneRegExp","cloneSymbol","cloneTypedArray","isObject_1","shortRuleNameToFull","ruleShortNameIdx","subruleIdx","RULE_STACK","RULE_OCCURRENCE_STACK","allTokenTypes_1","uniqueTokens","noTokenCategoriesUsed","tokenConstructor","invokeRuleWithTry","shortName","_i","ruleInvocationStateUpdate","cst","CST_STACK","cstPostRule","invokeRuleCatch","ruleFinallyStateUpdate","resyncEnabledConfig","isFirstInvokedRule","reSyncEnabled","isBackTracking","recogError","partialCstResult","reSyncTokType","findReSyncTokenType","isInCurrentRuleReSyncSet","reSyncTo","recoveredNode","optionInternalLogic","lookAheadFunc","predicate_1","orgLookaheadFunction_1","laKey","atLeastOneInternalLogic","predicate_2","orgLookaheadFunction_2","raiseEarlyExitException","PROD_TYPE","REPETITION_MANDATORY","ERR_MSG","notStuck","doSingleRepetition","attemptInRepetitionRecovery","atLeastOneSepFirstInternalLogic","REPETITION_MANDATORY_WITH_SEPARATOR","separatorLookAheadFunc","repetitionSepSecondInternal","manyInternalLogic","lookaheadFunction","predicate_3","orgLookaheadFunction_3","manySepFirstInternalLogic","nextTerminalAfterWalker","beforeIteration","altIdxToTake","raiseNoAltException","cstFinallyStateUpdate","isAtEndOfInput","firstRedundantTok","getCurrRuleFullName","SAVE_ERROR","ARGS","cstPostNonTerminal","subruleInternalError","consumedToken","nextToken","consumeInternalError","eFromConsumption","consumeInternalRecovery","cstPostTerminal","getFollowsForInRuleRecovery","tryInRuleRecovery","eFromInRuleRecovery","IN_RULE_RECOVERY_EXCEPTION","savedErrors","savedRuleStack","lexerState","fullName","idxInCallingRule","cstInvocationStateUpdate","shortRuleNameToFullName","stackClear","stackDelete","stackGet","stackHas","stackSet","baseKeysIn","baseGet","uid","maskSrcKey","IE_PROTO","find","createFind","toNumber","INFINITY","baseSet","paths","cst_1","cst_visitor_1","setNodeLocationFromToken","setNodeLocationFromNode","setInitialNodeLocation","setInitialNodeLocationFullRecovery","cstPostRuleFull","setInitialNodeLocationFullRegular","setInitialNodeLocationOnlyOffsetRecovery","cstPostRuleOnlyOffset","setInitialNodeLocationOnlyOffsetRegular","cstNode","location","fullRuleName","ruleCstNode","prevToken","rootCst","ruleCstResult","preCstNode","getBaseCstVisitorConstructor","baseCstVisitorConstructor","newBaseCstVisitorConstructor","createBaseSemanticVisitorConstructor","getBaseCstVisitorConstructorWithDefaults","baseCstVisitorWithDefaultsConstructor","newConstructor","createBaseVisitorConstructorWithDefaults","getPreviousExplicitRuleShortName","getLastExplicitRuleOccurrenceIndex","isSymbol","symbolToString","baseFilter","baseIsMap","nodeIsMap","isMap","_errors","context","getHumanReadableRuleStack","ruleOccurrenceStack","newErrors","userDefinedErrMsg","ruleGrammar","insideProdPaths","actualTokens","errMsgTypes","lookAheadPathsPerAlternative","hasIn","negate","defaultValue","InRuleRecoveryException","EOF_FOLLOW_KEY","firstAfterRepMap","getTokenToInsert","tokToInsert","isInsertedInRecovery","canTokenTypeBeInsertedInRecovery","canTokenTypeBeDeletedInRecovery","tryInRepetitionRecovery","grammarRuleArgs","expectedTokType","savedLexerState","passedResyncPoint","nextTokenWithoutResync","generateErrorMessage","addToResyncTokens","shouldInRepetitionRecoveryBeTried","expectTokAfterLastMatch","nextTokIdx","canPerformInRuleRecovery","tokIdxInRule","getCurrentGrammarPath","canRecoverWithSingleTokenInsertion","canRecoverWithSingleTokenDeletion","nextTok","expectedToken","mismatchedTok","possibleFollowsTokType","followKey","getCurrFollowKey","currentRuleReSyncSet","getFollowSetFromFollowKey","allPossibleReSyncTokTypes","flattenFollowSet","foundMatch","resyncTokType","currRuleIdx","prevRuleShortName","inRule","buildFullFollowKeyStack","explicitRuleStack","explicitOccurrenceStack","followStack","resyncTokens","prodFunc","lookaheadFunc","nextToksWalker","currShortName","firstAfterRepInfo","DependencyTree","cellRegistry","dispatcher","builder","depTree","buildTree","FORMULA_CHANGED","_updateGraph","bind","each","cell","formula","address","event","markAsDirty","dependents","getDependents","topologicalSort","levels","visited","cellLevels","calculateLevel","precedents","getPrecedents","maxLevel","precedent","precedentLevel","level","flattenToTopology","getDepth","_getDepth","tree","DependencyBuilder","patterns","remoteColumnRange","remoteRowRange","remoteCellRange","remoteCell","columnRange","rowRange","cellRange","namedRange","setWorkbook","workbook","build","cells","sheet","localDeps","remoteDeps","getFormulaDependencies","dependencies","precedentCell","setPrecedents","addDependent","remoteRef","sheetName","cellAddress","parseRemoteReference","remoteSheet","getSheet","remoteCellObj","getCellDirect","addRemoteDependent","trim","cleanFormula","startsWith","remoteColumnMatches","remoteRowMatches","remoteCellRangeMatches","sheetPart","rangePart","expandCellRange","addr","remoteCellMatches","cellRangeMatches","cellMatches","isFunctionOrKeyword","identifierMatches","identifier","nameManager","reference","getReference","addresses","startColMatch","startRowMatch","endColMatch","endRowMatch","startCol","startRow","endCol","endRow","colToNum","numToCol","startColNum","endColNum","minRow","maxRow","minCol","maxCol","baseIsSet","nodeIsSet","isSet","_definition","visitor","convertDefinition","serializedNonTerminal","serializedTerminal","terminalLabel","topRules","reIsDeepProp","reIsPlainProp","areTokenCategoriesNotUsed","lookAheadSequenceFromAlternatives","REPETITION","REPETITION_WITH_SEPARATOR","ALTERNATION","laFuncBuilder","lookAheadPaths","lookaheadBuilder","numOfAlts","areAllOneTokenLookahead","orAlts","predicates","currNumOfPaths","currPredicate","currPathLength","singleTokenAlts","choiceToAlt_1","currExtendingType","numOfPaths","singleTokensTypes","expectedTokenUniqueKey_1","choiceToAlt_2","RestDefinitionFinderWalker","targetOccurrence","targetProdType","restDef","checkIsTarget","expectedProdType","InsideDefinitionFinderVisitor","targetRef","expectedProdName","initializeArrayOfArrays","pathToHashKeys","longerKeys","currShorterKey","categoriesKeySuffix","isUniquePrefixHash","altKnownPathsKeys","searchPathKeys","otherAltKnownPathsKeys","searchIdx","altsDefs","partialAlts","finalResult","altsHashes","dict","newData","pathLength","currDataset","altIdx","currAltPathsAndSuffixes","currPathIdx","currPathPrefix","prefixKeys","currAltResult","newPartialPathsAndSuffixes","insideDefVisitor","insideDef","afterDef","searchPath","compareOtherPath","otherPath","searchTok","otherTok","singleAltPaths","singlePath","prefix","otherTokType","setCacheAdd","setCacheHas","getPrototypeOf","DataType","print_1","timer_1","to_fast_properties_1","overRest","freeSelf","hasFunc","objectCreate","proto","baseTrim","reIsBadHex","reIsBinary","reIsOctal","freeParseInt","isBinary","POP_MODE","createTokenInternal","constant","baseIsRegExp","nodeIsRegExp","isRegExp","arrayBuffer","Plus","Minus","Mult","Div","LParen","RParen","Comma","RowRange","NumberLiteral","longer_alt","Variable","SheetName","CellRange","CellRef","StringLiteral","Concat","FunctionName","WhiteSpace","GreaterThan","LessThan","GreaterThanEqual","LessThanEqual","Equal","NotEqual","IfFunction","TrueKeyword","FalseKeyword","NullKeyword","ArrayRowSep","RangeIntersect","ErrorConstant","IfErrorFunction","IfsFunction","SwitchFunction","LCurly","RCurly","ColumnRange","Power","allTokens","CalxTokens","CalxLexer","CalxParser","super","comparisonExpression","atomicExpression","$","arrayFormula","expression","additionExpression","concatenationExpression","multiplicationExpression","exponentiationExpression","unaryExpression","ifFunctionCall","functionCall","ifErrorFunctionCall","ifsFunctionCall","switchFunctionCall","arrayRow","parse","inputText","lexResult","ErrorType","ArrayResult","isSingleValue","getSingleValue","toFlatArray","fromVerticalArray","fromHorizontalArray","from2DArray","normalized","newRow","fromSingleValue","CalxInterpreter","validateVisitor","setContext","yy","getContext","ctx","separators","currentRow","expressions","lhs","rhs","operators","rightValue","operator","arrayOperation","operation","isError","leftArray","rightArray","resultLength","leftVal","rightVal","resolveVariable","resolveCellReference","resolveCellRange","resolveRowRange","resolveColumnRange","isTruthy","whenTrue","whenFalse","funcName","expr","callFunction","excelEpoch","msPerDay","getFunction","executeBuiltInFunction","isErrorValue","valueIfError","conditions","arrayExpression","getNamedRange","getVariable","getCellValue","getCellRange","getRowRange","getColumnRange","flattenAndSum","flattenedArray","flattenArray","arrayMax","arrayMin","every","some","flat","parseInput","cleanInput","parseCst","ERROR","Range","_cells","_address","parseAddress","loadCells","cleanAddress","_startAddress","_endAddress","isSingleCell","expandRange","getValues","setValuesFromArray","cellIndex","rowData","setValues","calculate","columns","callback","getCellAt","getCellAtPosition","getRange","SheetEvent","SheetState","DateUtil","serialToDate","serialDate","epochDate","ms","MS_PER_DAY","dateToSerial","date","isValidSerialDate","fromComponents","year","month","day","toComponents","getFullYear","getMonth","getDate","weekday","getDay","hours","getHours","minutes","getMinutes","seconds","getSeconds","toISOString","fromISOString","isoString","today","setHours","EXCEL_EPOCH","Cell","_type","NUMBER","_rules","remotePrecedents","remoteDependents","dynamicPrecedents","_dirty","_calculated","_hasRemotePrecedents","_hasRemoteDependents","_hasDynamicPrecedents","_isArrayAnchor","init","mount","ELEMENT_MOUNTED","isEmpty","rawValue","_computed","_value","_formula","eval","handleArrayResult","valueChanged","CALCULATED","_markDependentsAsDirty","autoCalculate","_recalculateDependents","arrayResult","_arrayResult","checkSpillRange","spillArray","SPILL","getCellCoordinates","targetAddress","coordinatesToAddress","targetCell","getCell","_spillRange","colStr","isArrayAnchor","getSpillRange","setFormat","format","setFormatter","formatter","getFormattedValue","isCalculated","isDirty","isNumeric","parseFloat","oldFormula","updateDynamicPrecedents","newFormula","oldPrecedents","removeDependent","rebuildDependencies","targetSheet","addRemotePrecedent","parsed","BOOLEAN","DATE","DATETIME","TIME","upperValue","VALUE_CHANGED","invalidateDynamicDependents","recalculateDirtyCells","dependent","getStringValue","getNumericValue","getDateValue","getSerialDateValue","setDateValue","setSerialDateValue","getFormattedDate","isDate","addPrecedent","setDependents","columnRanges","rowRanges","columnPattern","rowPattern","beforeMatch","hasDynamicPrecedents","dependsOnColumn","colNum","columnToNumber","dependsOnRow","CellRegistry","CELL_ADDED","remove","CELL_REMOVED","CELL_CREATED","all","filtered","Sheet","_states","calculation","CALCULATION_IDLE","_variables","_autoCalculate","_id","_generateId","wasAutoCalculate","element","setAttribute","id","_el","ELEMENT_ATTACHED","withoutEvent","_depTree","calculationOrder","requestCalculate","depAddress","cellAddr","createCell","setActiveSheet","parser","buildDependencyTree","setVariable","getCellRangeValues","getRowRangeValues","allCells","rowMatch","getColumnRangeValues","colMatch","nil","div0","na","flattenShallow","aIsArray","bIsArray","isFlat","flatten","argument","argsToArray","arrayEach","numbers","cleanFloat","power","parseBool","bool","up","parseNumber","parseString","parseNumberArray","parseDate","serial","utc_days","date_info","fractional_day","total_seconds","days","getUTCDate","getUTCMonth","getUTCFullYear","serialNumberToDate","parseDateArray","anyError","isDefined","anyIsError","anyIsString","arrayValuesToNumbers","d1900","UTC","WEEK_STARTS","WEEK_TYPES","WEEKEND_TYPES","DATEDIF","start_date","end_date","unit","start_date_year","start_date_month","start_date_day","end_date_year","end_date_month","end_date_day","YEARFRAC","DAYS","setFullYear","setMonth","DATEVALUE","date_text","DAY","serial_number","startOfDay","newDate","DAYS360","method","sm","ed","em","smd","emd","EDATE","months","EOMONTH","HOUR","INTERVAL","second","hour","sec","ISOWEEKNUM","setDate","yearStart","ceil","MINUTE","MONTH","NETWORKDAYS","holidays","INTL","NOW","SECOND","minute","TIMEVALUE","time_text","TODAY","WEEKDAY","return_type","WEEKNUM","week_start","jan","inc","WORKDAY","YEAR","isLeapYear","daysBetween","basis","sy","ey","feb29Between","date1","date2","year1","mar1year1","year2","mar1year2","ylength","years","average","addOn","weekend","isMask","maskDays","maskIndex","maskRegex","total","getTimezoneOffset","getUTCDay","dec","holiday","defaultOperator","validSymbols","_TOKEN_TYPE_OPERATOR","_TOKEN_TYPE_LITERAL","SUPPORTED_TOKENS","TOKEN_TYPE_OPERATOR","TOKEN_TYPE_LITERAL","literalValue","analyzedTokens","castValueToCorrectType","unshift","analyzeTokens","expressionLength","cursorIndex","processedValue","processedSymbol","tokenizeExpression","compute","evaluate","CELL","INFO","ISBLANK","ISBINARY","ISERR","value$1","ISERROR","ISEVEN","ISFORMULA","ISLOGICAL","ISNA","ISNONTEXT","ISNUMBER","ISODD","ISREF","ISTEXT","SHEET","SHEETS","TYPE","CHOOSE","COLUMN","COLUMNS","HLOOKUP","lookup_value","table_array","row_index_num","range_lookup","VLOOKUP","matrix","INDEX","row_num","column_num","someError","isOneDimensionRange","LOOKUP","result_array","isNumberLookup","localeCompare","MATCH","lookup_array","match_type","indexValue","lookupValueStr","ROWS","TRANSPOSE","UNIQUE","hasElement","col_index_num","exactMatchOnly","error_val","SQRT2PI","AVEDEV","flatArgumentsDefined","AVERAGE","AVERAGEA","AVERAGEIF","criteria","average_range","average_count","isWildcard","tokenizedCriteria","AVERAGEIFS","criteriaLength","isMeetCondition","computedResult","BETA","cumulative","probability","BINOM","number_s","trials","probability_s","DIST","RANGE","number_s2","COMBIN","INV","CHISQ","deg_freedom","RT","TEST","actual_range","expected_range","xsqr","Pi","ChiSq","CONFIDENCE","CORREL","array1","array2","COUNT","COUNTA","flatArguments","COUNTBLANK","COUNTIN","blanks","COUNTIF","matches","COUNTIFS","COUNTUNIQUE","NORM","standard_dev","COVARIANCE","DEVSQ","P","S","EXPON","lambda","FISHER","FISHERINV","e2y","FORECAST","known_ys","known_xs","xmean","ymean","den","FREQUENCY","data_array","bins_array","GAMMA","GAMMALN","GAUSS","GEOMEAN","GROWTH","known_y","known_x","new_x","use_const","avg_x","avg_y","avg_xy","avg_xx","new_y","HARMEAN","deg_freedom1","deg_freedom2","sumOfSquares","SUM","PRECISE","HYPGEOM","INTERCEPT","KURT","LARGE","LINEST","LOGEST","sample_s","number_sample","population_s","number_pop","LOGNORM","MAX","MAXA","MEDIAN","MIN","MINA","MODE","currentItem","maxItems","MULT","NEGBINOM","number_f","PEARSON","den1","den2","PERCENTILE","fl","PERCENTRANK","PERMUT","number_chosen","FACT","PERMUTATIONA","PHI","EXC","significance","uniques","INC","POISSON","PROB","x_range","prob_range","lower_limit","upper_limit","sorted","QUARTILE","quart","RANK","ROW","RSQ","SKEW","SLOPE","SMALL","STANDARDIZE","AVG","EQ","m3","STDEV","STDEVA","VARA","STDEVPA","VARPA","STEYX","lft","VAR","T$1","TREND","new_xs","linest","TRIMMEAN","percent","FLOOR","mean_x","mean_y","s_x","s_y","WEIBULL","Z","ABS","ACOS","ACOSH","ACOT","ACOTH","AGGREGATE","function_num","ref1","ref2","PRODUCT","SNGL","ARABIC","CM","CD","XC","XL","IX","IV","ASIN","ASINH","ATAN","ATAN2","x_num","y_num","atan2","ATANH","BASE","radix","min_length","anyError$1","CEILING","precision","ROUND","COMBINA","COS","COSH","COT","COTH","e2","CSC","CSCH","DECIMAL","DEGREES","EVEN","EXP","MATH","MEMOIZED_FACT","FACTDOUBLE","GCD","r0","ri","INT","ISO","LCM","LN","LN10","LN2","LOG2E","LOG","base","LOG10","MOD","divisor","modulus","MROUND","multiple","MULTINOMIAL","ODD","E","POWER","QUOTIENT","numerator","denominator","RADIANS","RAND","RANDBETWEEN","bottom","top","ROMAN","digits","roman","num_digits","ROUNDDOWN","ROUNDUP","SEC","SECH","SERIESSUM","coefficients","SIGN","SIN","SINH","SQRT","SQRTPI","SQRT1_2","SUBTOTAL","ADD","num1","num2","MINUS","DIVIDE","dividend","MULTIPLY","factor1","factor2","GT","GTE","LT","LTE","value1","value2","NE","POW","exponent","inner_result","SUMIF","sum_range","sumValue","SUMIFS","shift","criterias","valueToTest","SUMPRODUCT","_ij","_ij_arg","_i_arg","SUMSQ","SUMX2MY2","array_x","array_y","SUMX2PY2","SUMXMY2","TAN","TANH","TRUNC","ASC","BAHTTEXT","CHAR","CLEAN","CODE","CONCATENATE","trueFound","falseFound","CONCAT","DBCS","DOLLAR","decimals","style","currency","minimumFractionDigits","maximumFractionDigits","formattedNumber","toLocaleString","EXACT","text1","text2","FIND","find_text","within_text","start_num","found_index","FIXED","no_commas","toFixed","HTML2TEXT","LEFT","num_chars","LEN","LOWER","MID","NUMBERVALUE","decimal_separator","group_separator","PRONETIC","PROPER","txt","substr","REGEXEXTRACT","regular_expression","REGEXMATCH","full","REGEXREPLACE","replacement","REPLACE","old_text","new_text","REPT","number_times","RIGHT","SEARCH","foundAt","SPLIT","SUBSTITUTE","instance_num","TEXT","currencySymbol","isPercent","endsWith","TEXTJOIN","delimiter","ignore_empty","flatArgs","textToJoin","chunks","TRIM","UNICHAR","UNICODE","UPPER","VALUE","output","isValidBinaryNumber","BESSELI","bessel","BESSELJ","BESSELK","BESSELY","BIN2DEC","stringified","BIN2HEX","places","BIN2OCT","BITAND","number1","number2","BITLSHIFT","shift_amount","BITOR","BITRSHIFT","BITXOR","COMPLEX","real_num","i_num","suffix","CONVERT","from_unit","to_unit","units","binary_prefixes","Yi","Zi","Ei","Ti","Gi","Mi","ki","unit_prefixes","G","base_from_unit","base_to_unit","from_multiplier","to_multiplier","from_binary_prefix","from_unit_prefix","to_binary_prefix","to_unit_prefix","DEC2BIN","DEC2HEX","DEC2OCT","DELTA","ERF","ERFC","GESTEP","HEX2BIN","negative","decimal","HEX2DEC","HEX2OCT","IMABS","inumber","IMREAL","IMAGINARY","plus","minus","last","IMARGUMENT","IMCONJUGATE","IMCOS","IMCOSH","IMCOT","IMDIV","IMSIN","inumber1","inumber2","unit1","unit2","IMEXP","IMLN","IMLOG10","IMLOG2","IMPOWER","IMPRODUCT","IMSEC","IMSECH","IMSINH","IMSQRT","IMCSC","IMCSCH","IMSUB","IMSUM","IMTAN","OCT2BIN","OCT2DEC","OCT2HEX","BETADIST","BETAINV","BINOMDIST","CEILINGMATH","CEILINGPRECISE","CHIDIST","CHIDISTRT","CHIINV","CHIINVRT","CHITEST","COVAR","COVARIANCEP","COVARIANCES","CRITBINOM","ERFCPRECISE","ERFPRECISE","EXPONDIST","FDIST","FDISTRT","FINV","FINVRT","FLOORMATH","FLOORPRECISE","FTEST","GAMMADIST","GAMMAINV","GAMMALNPRECISE","HYPGEOMDIST","LOGINV","LOGNORMDIST","LOGNORMINV","MODEMULT","MODESNGL","NEGBINOMDIST","NETWORKDAYSINTL","NORMDIST","NORMINV","NORMSDIST","NORMSINV","PERCENTILEEXC","PERCENTILEINC","PERCENTRANKEXC","PERCENTRANKINC","POISSONDIST","QUARTILEEXC","QUARTILEINC","RANKAVG","RANKEQ","SKEWP","STDEVP","STDEVS","TDIST","TDISTRT","TINV","TTEST","VARP","VARS","WEIBULLDIST","WORKDAYINTL","ZTEST","compact","FINDFIELD","database","title","findResultIndex","maxCriteriaLength","currentCriteriaResult","hasMatchingCriteria","criteriaField","DAVERAGE","field","resultIndexes","targetFields","DCOUNT","targetValues","DCOUNTA","DGET","DMAX","maxValue","DMIN","minValue","DPRODUCT","DSTDEV","DSTDEVP","DSUM","DVAR","DVARP","validDate","ensureDate","ACCRINT","first_interest","settlement","par","frequency","ACCRINTM","AMORDEGRC","AMORLINC","COUPDAYBS","COUPDAYS","COUPDAYSNC","COUPNCD","COUPNUM","COUPPCD","CUMIPMT","nper","pv","start_period","end_period","payment","PMT","interest","FV","CUMPRINC","principal","DB","cost","salvage","life","period","initial","ceiling","DDB","DISC","DOLLARDE","fractional_dollar","fraction","DOLLARFR","decimal_dollar","DURATION","EFFECT","nominal_rate","npery","FVSCHEDULE","schedule","future","INTRATE","IPMT","per","fv","IRR","guess","irrResult","dates","irrResultDeriv","positive","newRate","epsRate","resultValue","resultRate","contLoop","ISPMT","MDURATION","MIRR","finance_rate","reinvest_rate","payments","incomes","NPV","NOMINAL","effect_rate","NPER","pmt","ODDFPRICE","ODDFYIELD","ODDLPRICE","ODDLYIELD","PDURATION","PPMT","PRICE","PRICEDISC","PRICEMAT","PV","RATE","epsMax","dy","RECEIVED","RRI","SLN","SYD","TBILLEQ","maturity","discount","TBILLPRICE","TBILLYIELD","pr","VDB","XIRR","XNPV","YIELD","YIELDDISC","YIELDMAT","AND","FALSE","IF","logical_test","value_if_true","value_if_false","IFS","IFERROR","value_if_error","IFNA","value_if_na","NOT","logical","TRUE","XOR","SWITCH","targetValue","argc","switchCount","switchSatisfied","hasDefaultClause","defaultClause","FLATTEN","ARGS2ARRAY","REFERENCE","opening","JOIN","NUMBERS","FormulaJSWrapper","upperName","Calx","formulae","sequenceFunction","sortFunction","filterFunction","uniqueFunction","sortIndex","sortOrder","byCol","arr2D","colIdx","aVal","bVal","include","ifEmpty","include1D","includeVal","exactlyOnce","was1D","convertArg","isDynamicArrayFunction","getAvailableFunctions","hasFunction","SharedContext","sheets","_formulaJSWrapper","activeSheet","addSheet","numToStr","strToNum","chars","getCellsInRange","regex","rangeStart","rangeEnd","boundaries","isValidBinary","strRepeat","qty","repeat","arrayMerge","objectToArray","trimEmptyCell","rangeToTable","alphaPattern","numPattern","arrayTable","resultTable","colLength","resultRow","rowLength","transposeTable","table","newTable","NameManager","_nameRegistry","_workbook","comment","isValidName","getActiveSheet","getSheets","sheetNames","getAll","Comparator","equal","notEqual","lessThan","greaterThan","lessEqualThan","greaterEqualThan","createParser","interpreter","Workbook","_sheets","_parser","_dispatcher","_nameManager","isValidCellAddress","_deps","_depsBuilder","hydrateObj","createSheet","loadData","cellKey","cellData","createFromData","sharedContext","utility","createFromElement","setFormula","setFormulae","createWorkbook","createWorkbookFromData","createWorkbookFromElement","createInterpreter","validateMissingCstMethods","CstVisitorDefinitionError","defaultVisit","lang_extensions_1","childrenNames","childrenNamesLength","currChildArray","currChildArrayLength","currChild","visitorInstance","ruleNames","missingRuleNames","MISSING_METHOD","derivedConstructor","semanticDefinitionErrors","errorMessages","currDefError","_RULE_NAMES","baseConstructor","withDefaultsProto","reHasUnicode","arrayEvery","baseEvery","castFunction","isString","resolver_1","actualOptions","topRulesTable","baseAssign","baseAssignIn","cloneBuffer","copyArray","copySymbols","copySymbolsIn","initCloneArray","initCloneByTag","initCloneObject","funcTag","cloneableTags","isFull","isFunc","subValue","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","loaded","__webpack_modules__","globalThis","window","nmd","workbooks","formatterRegistry","cleaned","inputStr","hasPercent","integer","functionRegistry","styleFormatterRegistry","$element","color","zero","updateAllCellsInWorkbook","$elements","attr","updateAllCells","$cell","dataFormat","cellFormat","formattedValue","tagName","document","activeElement","applyStyleFormatter","styleFormatterName","calx","registerFormatter","registerFunction","registerStyleFormatter","getFormatter","delete","handleMethodCall","opts","variables","functions","formatters","styleFormatters","hasSheetStructure","varName","sheetElements","sheetData","calxCounter","$el","autoAddress","dataType","initialValue","processDataAttributes","cellRef","is","on","$input","rawInput","isReadonly","hasFormula","parsedValue","allElements","processSheetData","jQuery"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"jquery.calx.js","mappings":"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","sources":["webpack:///webpack/universalModuleDefinition","webpack:///./node_modules/lodash/_getAllKeys.js","webpack:///./node_modules/lodash/_ListCache.js","webpack:///./node_modules/lodash/_listCacheDelete.js","webpack:///./node_modules/lodash/memoize.js","webpack:///./node_modules/chevrotain/lib/src/parse/exceptions_public.js","webpack:///./node_modules/chevrotain/lib/src/scan/lexer_public.js","webpack:///./node_modules/lodash/_nativeKeysIn.js","webpack:///./node_modules/lodash/_baseIsEqual.js","webpack:///./node_modules/lodash/_mapCacheGet.js","webpack:///./node_modules/lodash/isLength.js","webpack:///./node_modules/lodash/_mapToArray.js","webpack:///./node_modules/lodash/isObjectLike.js","webpack:///./node_modules/lodash/_isIndex.js","webpack:///./node_modules/lodash/_getValue.js","webpack:///./node_modules/chevrotain/lib/src/scan/reg_exp_parser.js","webpack:///./node_modules/lodash/_baseHas.js","webpack:///./node_modules/chevrotain/lib/src/scan/lexer_errors_public.js","webpack:///./node_modules/chevrotain/lib/src/parse/grammar/checks.js","webpack:///./node_modules/lodash/_baseValues.js","webpack:///./node_modules/lodash/property.js","webpack:///./node_modules/chevrotain/lib/src/parse/parser/traits/context_assist.js","webpack:///./node_modules/lodash/hasIn.js","webpack:///./node_modules/lodash/_baseForOwn.js","webpack:///./node_modules/lodash/_getRawTag.js","webpack:///./node_modules/lodash/_equalObjects.js","webpack:///./node_modules/lodash/_arrayLikeKeys.js","webpack:///./node_modules/lodash/_isStrictComparable.js","webpack:///./node_modules/lodash/_getMatchData.js","webpack:///./node_modules/lodash/reduce.js","webpack:///./node_modules/chevrotain/lib/src/parse/errors_public.js","webpack:///./node_modules/lodash/_arrayReduce.js","webpack:///./node_modules/lodash/_baseEach.js","webpack:///./node_modules/lodash/head.js","webpack:///./node_modules/lodash/_baseSome.js","webpack:///./node_modules/chevrotain/lib/src/parse/parser/traits/lexer_adapter.js","webpack:///./node_modules/lodash/_stackDelete.js","webpack:///./node_modules/lodash/_stackSet.js","webpack:///./node_modules/lodash/_createAssigner.js","webpack:///./node_modules/lodash/_apply.js","webpack:///./node_modules/lodash/_nativeCreate.js","webpack:///./node_modules/lodash/_asciiToArray.js","webpack:///./node_modules/lodash/pickBy.js","webpack:///./node_modules/chevrotain/lib/src/parse/parser/traits/recognizer_api.js","webpack:///./node_modules/lodash/_listCacheSet.js","webpack:///./node_modules/lodash/_setCacheAdd.js","webpack:///./node_modules/chevrotain/lib/src/api.js","webpack:///./node_modules/lodash/_stackClear.js","webpack:///./node_modules/lodash/_baseIsRegExp.js","webpack:///./node_modules/lodash/has.js","webpack:///./node_modules/lodash/_setCacheHas.js","webpack:///./node_modules/lodash/toInteger.js","webpack:///./node_modules/lodash/_Hash.js","webpack:///./node_modules/@chevrotain/utils/lib/src/timer.js","webpack:///./node_modules/lodash/indexOf.js","webpack:///./node_modules/lodash/_castPath.js","webpack:///./node_modules/lodash/_copyObject.js","webpack:///./node_modules/lodash/_baseIsMatch.js","webpack:///./node_modules/lodash/_trimmedEndIndex.js","webpack:///./node_modules/lodash/_stringToPath.js","webpack:///./node_modules/lodash/_shortOut.js","webpack:///./node_modules/lodash/_Symbol.js","webpack:///./node_modules/lodash/isFunction.js","webpack:///./src/Calx/Cell/CellEvent.ts","webpack:///./node_modules/lodash/_cloneTypedArray.js","webpack:///./node_modules/lodash/_equalByTag.js","webpack:///./node_modules/lodash/_createAggregator.js","webpack:///./node_modules/lodash/_createFind.js","webpack:///./node_modules/lodash/groupBy.js","webpack:///./node_modules/lodash/_hashClear.js","webpack:///./node_modules/lodash/_unicodeToArray.js","webpack:///./node_modules/chevrotain/lib/src/parse/parser/traits/looksahead.js","webpack:///./node_modules/chevrotain/lib/src/parse/parser/traits/perf_tracer.js","webpack:///./node_modules/lodash/isEmpty.js","webpack:///./node_modules/chevrotain/lib/src/parse/grammar/first.js","webpack:///./node_modules/lodash/_baseGetAllKeys.js","webpack:///./node_modules/lodash/isUndefined.js","webpack:///./node_modules/lodash/_memoizeCapped.js","webpack:///./node_modules/lodash/_copySymbols.js","webpack:///./node_modules/@chevrotain/utils/lib/src/print.js","webpack:///./node_modules/chevrotain/lib/src/parse/parser/traits/gast_recorder.js","webpack:///./node_modules/lodash/some.js","webpack:///./node_modules/lodash/isArguments.js","webpack:///./node_modules/lodash/_baseAggregator.js","webpack:///./node_modules/regexp-to-ast/lib/regexp-to-ast.js","webpack:///./node_modules/lodash/_createCaseFirst.js","webpack:///./node_modules/lodash/_baseFindIndex.js","webpack:///./node_modules/lodash/_baseGetTag.js","webpack:///./node_modules/lodash/clone.js","webpack:///./node_modules/lodash/_getMapData.js","webpack:///./node_modules/lodash/_hashHas.js","webpack:///./node_modules/lodash/_Promise.js","webpack:///./node_modules/lodash/_setToString.js","webpack:///./node_modules/lodash/_baseKeysIn.js","webpack:///./node_modules/lodash/_mapCacheSet.js","webpack:///./node_modules/lodash/_copyArray.js","webpack:///./node_modules/lodash/_mapCacheClear.js","webpack:///./node_modules/chevrotain/lib/src/scan/tokens.js","webpack:///./node_modules/lodash/_baseFlatten.js","webpack:///./node_modules/chevrotain/lib/src/parse/grammar/rest.js","webpack:///./node_modules/lodash/_baseSet.js","webpack:///./node_modules/lodash/_cloneRegExp.js","webpack:///./node_modules/lodash/_createBaseFor.js","webpack:///./node_modules/lodash/toString.js","webpack:///./node_modules/lodash/_defineProperty.js","webpack:///./node_modules/@chevrotain/cst-dts-gen/lib/src/api.js","webpack:///./node_modules/lodash/_cloneBuffer.js","webpack:///./node_modules/lodash/stubArray.js","webpack:///./node_modules/lodash/_getAllKeysIn.js","webpack:///./node_modules/lodash/_baseAssignValue.js","webpack:///./node_modules/lodash/uniq.js","webpack:///./node_modules/@chevrotain/gast/lib/src/api.js","webpack:///./node_modules/lodash/identity.js","webpack:///./node_modules/@chevrotain/gast/lib/src/helpers.js","webpack:///./node_modules/lodash/_stackGet.js","webpack:///./node_modules/lodash/_nativeKeys.js","webpack:///./node_modules/lodash/isBuffer.js","webpack:///./node_modules/lodash/_MapCache.js","webpack:///./node_modules/lodash/_baseMatches.js","webpack:///./node_modules/lodash/compact.js","webpack:///./node_modules/lodash/isArrayLikeObject.js","webpack:///./node_modules/lodash/_listCacheClear.js","webpack:///./node_modules/lodash/_arrayEach.js","webpack:///./node_modules/lodash/_cloneSymbol.js","webpack:///./node_modules/lodash/drop.js","webpack:///./node_modules/lodash/_baseEvery.js","webpack:///./node_modules/lodash/isObject.js","webpack:///./node_modules/lodash/_baseAssignIn.js","webpack:///./node_modules/lodash/_hashDelete.js","webpack:///./node_modules/lodash/_stringToArray.js","webpack:///./node_modules/lodash/_baseDifference.js","webpack:///./node_modules/chevrotain/lib/src/parse/grammar/resolver.js","webpack:///./node_modules/lodash/_arrayAggregator.js","webpack:///./node_modules/lodash/noop.js","webpack:///./node_modules/lodash/_castFunction.js","webpack:///./node_modules/@chevrotain/gast/lib/src/visitor.js","webpack:///./node_modules/lodash/_baseTrim.js","webpack:///./node_modules/lodash/_isKeyable.js","webpack:///./node_modules/lodash/_setToArray.js","webpack:///./node_modules/lodash/_arraySome.js","webpack:///./node_modules/lodash/_overArg.js","webpack:///./node_modules/lodash/isSymbol.js","webpack:///./node_modules/chevrotain/lib/src/parse/grammar/interpreter.js","webpack:///./node_modules/lodash/_mapCacheHas.js","webpack:///./node_modules/lodash/_createSet.js","webpack:///./node_modules/lodash/_arrayPush.js","webpack:///./node_modules/chevrotain/lib/src/lang/lang_extensions.js","webpack:///./node_modules/lodash/_getSymbols.js","webpack:///./node_modules/lodash/defaults.js","webpack:///./node_modules/lodash/findIndex.js","webpack:///./node_modules/lodash/_baseAssign.js","webpack:///./node_modules/lodash/_listCacheGet.js","webpack:///./node_modules/bessel/bessel.js","webpack:///./node_modules/lodash/_freeGlobal.js","webpack:///./node_modules/lodash/isArrayLike.js","webpack:///./node_modules/lodash/_baseIsTypedArray.js","webpack:///./node_modules/chevrotain/lib/src/version.js","webpack:///./node_modules/lodash/_arrayMap.js","webpack:///./node_modules/chevrotain/lib/src/parse/constants.js","webpack:///./node_modules/lodash/isString.js","webpack:///./node_modules/chevrotain/lib/src/scan/lexer.js","webpack:///./node_modules/lodash/_baseIsNative.js","webpack:///./node_modules/lodash/_baseMap.js","webpack:///./node_modules/lodash/_baseSlice.js","webpack:///./node_modules/lodash/eq.js","webpack:///./node_modules/lodash/_arrayIncludes.js","webpack:///./node_modules/lodash/map.js","webpack:///./node_modules/lodash/_baseIteratee.js","webpack:///./node_modules/lodash/_baseIsNaN.js","webpack:///./node_modules/lodash/_coreJsData.js","webpack:///./node_modules/lodash/_isPrototype.js","webpack:///./node_modules/lodash/_initCloneObject.js","webpack:///./node_modules/lodash/_baseReduce.js","webpack:///./node_modules/lodash/_DataView.js","webpack:///./src/Calx/Utility/EventDispatcher.ts","webpack:///./node_modules/chevrotain/lib/src/parse/grammar/llk_lookahead.js","webpack:///./node_modules/lodash/_hashSet.js","webpack:///./node_modules/lodash/_baseUniq.js","webpack:///./node_modules/lodash/upperFirst.js","webpack:///./node_modules/lodash/_getTag.js","webpack:///./node_modules/lodash/values.js","webpack:///./node_modules/lodash/_isFlattenable.js","webpack:///./node_modules/lodash/_equalArrays.js","webpack:///./node_modules/lodash/keys.js","webpack:///./node_modules/lodash/flatten.js","webpack:///./node_modules/chevrotain/lib/src/diagrams/render_public.js","webpack:///./node_modules/lodash/_nodeUtil.js","webpack:///./node_modules/lodash/_assocIndexOf.js","webpack:///./node_modules/lodash/_baseIsSet.js","webpack:///./node_modules/@chevrotain/cst-dts-gen/lib/src/model.js","webpack:///./node_modules/lodash/negate.js","webpack:///./node_modules/lodash/_getNative.js","webpack:///./node_modules/lodash/_baseIndexOf.js","webpack:///./node_modules/lodash/assign.js","webpack:///./node_modules/lodash/_cloneDataView.js","webpack:///./node_modules/lodash/first.js","webpack:///./node_modules/chevrotain/lib/src/parse/grammar/follow.js","webpack:///./node_modules/lodash/_initCloneArray.js","webpack:///./node_modules/chevrotain/lib/src/scan/reg_exp.js","webpack:///./node_modules/lodash/difference.js","webpack:///./node_modules/@chevrotain/utils/lib/src/to-fast-properties.js","webpack:///./node_modules/chevrotain/lib/src/parse/parser/parser.js","webpack:///./node_modules/lodash/_getSymbolsIn.js","webpack:///./node_modules/@chevrotain/cst-dts-gen/lib/src/generate.js","webpack:///./node_modules/lodash/isArray.js","webpack:///./node_modules/lodash/_Set.js","webpack:///./node_modules/lodash/_assignValue.js","webpack:///./node_modules/jstat/dist/jstat.js","webpack:///./node_modules/lodash/_baseFilter.js","webpack:///./node_modules/lodash/_baseFor.js","webpack:///./node_modules/lodash/_hashGet.js","webpack:///./node_modules/lodash/_overRest.js","webpack:///./node_modules/lodash/_isIterateeCall.js","webpack:///./node_modules/lodash/_strictIndexOf.js","webpack:///./node_modules/chevrotain/lib/src/parse/cst/cst.js","webpack:///./node_modules/chevrotain/lib/src/parse/grammar/keys.js","webpack:///./node_modules/lodash/_baseIsEqualDeep.js","webpack:///./node_modules/lodash/isTypedArray.js","webpack:///./node_modules/chevrotain/lib/src/parse/parser/utils/apply_mixins.js","webpack:///./node_modules/lodash/_matchesStrictComparable.js","webpack:///./node_modules/lodash/_initCloneByTag.js","webpack:///./node_modules/chevrotain/lib/src/parse/parser/traits/recognizer_engine.js","webpack:///./node_modules/lodash/_Stack.js","webpack:///./node_modules/lodash/_baseProperty.js","webpack:///./node_modules/lodash/keysIn.js","webpack:///./node_modules/lodash/_basePropertyDeep.js","webpack:///./node_modules/lodash/_arrayEvery.js","webpack:///./node_modules/lodash/_isMasked.js","webpack:///./node_modules/lodash/_baseUnary.js","webpack:///./node_modules/lodash/flatMap.js","webpack:///./node_modules/lodash/find.js","webpack:///./node_modules/lodash/constant.js","webpack:///./node_modules/lodash/toFinite.js","webpack:///./node_modules/lodash/_basePickBy.js","webpack:///./node_modules/lodash/_baseGet.js","webpack:///./node_modules/chevrotain/lib/src/parse/parser/traits/tree_builder.js","webpack:///./node_modules/lodash/_toSource.js","webpack:///./node_modules/lodash/_baseIsArguments.js","webpack:///./node_modules/lodash/dropRight.js","webpack:///./node_modules/lodash/_baseToString.js","webpack:///./node_modules/lodash/filter.js","webpack:///./node_modules/lodash/_mapCacheDelete.js","webpack:///./node_modules/lodash/isMap.js","webpack:///./node_modules/chevrotain/lib/src/parse/parser/traits/error_handler.js","webpack:///./node_modules/lodash/_toKey.js","webpack:///./node_modules/lodash/_Uint8Array.js","webpack:///./node_modules/lodash/_baseMatchesProperty.js","webpack:///./node_modules/lodash/_baseHasIn.js","webpack:///./node_modules/lodash/reject.js","webpack:///./node_modules/lodash/last.js","webpack:///./node_modules/lodash/_baseTimes.js","webpack:///./node_modules/lodash/get.js","webpack:///./node_modules/chevrotain/lib/src/parse/parser/traits/recoverable.js","webpack:///./node_modules/lodash/_Map.js","webpack:///./node_modules/lodash/_WeakMap.js","webpack:///./node_modules/lodash/_createBaseEach.js","webpack:///./src/Calx/Workbook/DependencyTree.ts","webpack:///./src/Calx/Workbook/DependencyBuilder.ts","webpack:///./node_modules/lodash/isSet.js","webpack:///./node_modules/@chevrotain/gast/lib/src/model.js","webpack:///./node_modules/lodash/_isKey.js","webpack:///./node_modules/lodash/_listCacheHas.js","webpack:///./node_modules/chevrotain/lib/src/parse/grammar/lookahead.js","webpack:///./node_modules/lodash/_castSlice.js","webpack:///./node_modules/lodash/_SetCache.js","webpack:///./node_modules/lodash/_getPrototype.js","webpack:///./src/Calx/Cell/DataType.ts","webpack:///./node_modules/@chevrotain/utils/lib/src/api.js","webpack:///./node_modules/lodash/_copySymbolsIn.js","webpack:///./node_modules/lodash/_baseKeys.js","webpack:///./node_modules/lodash/_baseIsMap.js","webpack:///./node_modules/lodash/_cacheHas.js","webpack:///./node_modules/lodash/_baseRest.js","webpack:///./node_modules/lodash/_root.js","webpack:///./node_modules/lodash/_hasPath.js","webpack:///./node_modules/lodash/_baseCreate.js","webpack:///./node_modules/lodash/_objectToString.js","webpack:///./node_modules/lodash/toNumber.js","webpack:///./node_modules/chevrotain/lib/src/scan/tokens_public.js","webpack:///./node_modules/lodash/_baseSetToString.js","webpack:///./node_modules/lodash/isRegExp.js","webpack:///./node_modules/lodash/_cloneArrayBuffer.js","webpack:///./node_modules/chevrotain/lib_esm/api_esm.mjs","webpack:///./src/Calx/Parser/Chevrotain/Tokens.ts","webpack:///./src/Calx/Parser/Chevrotain/Parser.ts","webpack:///./src/Calx/Cell/ErrorType.ts","webpack:///./src/Calx/Cell/ArrayResult.ts","webpack:///./src/Calx/Parser/Chevrotain/Interpreter.ts","webpack:///./src/Calx/Range.ts","webpack:///./src/Calx/Sheet/SheetEvent.ts","webpack:///./src/Calx/Utility/DateUtil.ts","webpack:///./src/Calx/Cell.ts","webpack:///./src/Calx/Sheet/CellRegistry.ts","webpack:///./src/Calx/Utility/Utility.ts","webpack:///./src/Calx/Sheet.ts","webpack:///./node_modules/@formulajs/formulajs/lib/esm/index.mjs","webpack:///./src/Calx/Formula/FormulaJSWrapper.ts","webpack:///./src/Calx/Parser/SharedContext.ts","webpack:///./src/Calx/Workbook/NameManager.ts","webpack:///./src/Calx/Utility/Comparator.ts","webpack:///./src/Calx/Workbook.ts","webpack:///./src/Calx.ts","webpack:///./node_modules/chevrotain/lib/src/parse/cst/cst_visitor.js","webpack:///./node_modules/lodash/_hasUnicode.js","webpack:///./node_modules/lodash/every.js","webpack:///./node_modules/lodash/forEach.js","webpack:///./node_modules/lodash/_arrayFilter.js","webpack:///./node_modules/lodash/_stackHas.js","webpack:///./node_modules/lodash/includes.js","webpack:///./node_modules/lodash/_arrayIncludesWith.js","webpack:///./node_modules/chevrotain/lib/src/parse/grammar/gast/gast_resolver_public.js","webpack:///./node_modules/lodash/stubFalse.js","webpack:///./node_modules/lodash/_baseClone.js","webpack:///webpack/bootstrap","webpack:///webpack/runtime/define property getters","webpack:///webpack/runtime/global","webpack:///webpack/runtime/hasOwnProperty shorthand","webpack:///webpack/runtime/make namespace object","webpack:///webpack/runtime/node module decorator","webpack:///./src/jquery.calx.ts"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse {\n\t\tvar a = factory();\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(this, () => {\nreturn ","var baseGetAllKeys = require('./_baseGetAllKeys'),\n getSymbols = require('./_getSymbols'),\n keys = require('./keys');\n\n/**\n * Creates an array of own enumerable property names and symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names and symbols.\n */\nfunction getAllKeys(object) {\n return baseGetAllKeys(object, keys, getSymbols);\n}\n\nmodule.exports = getAllKeys;\n","var listCacheClear = require('./_listCacheClear'),\n listCacheDelete = require('./_listCacheDelete'),\n listCacheGet = require('./_listCacheGet'),\n listCacheHas = require('./_listCacheHas'),\n listCacheSet = require('./_listCacheSet');\n\n/**\n * Creates an list cache object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction ListCache(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n// Add methods to `ListCache`.\nListCache.prototype.clear = listCacheClear;\nListCache.prototype['delete'] = listCacheDelete;\nListCache.prototype.get = listCacheGet;\nListCache.prototype.has = listCacheHas;\nListCache.prototype.set = listCacheSet;\n\nmodule.exports = ListCache;\n","var assocIndexOf = require('./_assocIndexOf');\n\n/** Used for built-in method references. */\nvar arrayProto = Array.prototype;\n\n/** Built-in value references. */\nvar splice = arrayProto.splice;\n\n/**\n * Removes `key` and its value from the list cache.\n *\n * @private\n * @name delete\n * @memberOf ListCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction listCacheDelete(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n return false;\n }\n var lastIndex = data.length - 1;\n if (index == lastIndex) {\n data.pop();\n } else {\n splice.call(data, index, 1);\n }\n --this.size;\n return true;\n}\n\nmodule.exports = listCacheDelete;\n","var MapCache = require('./_MapCache');\n\n/** Error message constants. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/**\n * Creates a function that memoizes the result of `func`. If `resolver` is\n * provided, it determines the cache key for storing the result based on the\n * arguments provided to the memoized function. By default, the first argument\n * provided to the memoized function is used as the map cache key. The `func`\n * is invoked with the `this` binding of the memoized function.\n *\n * **Note:** The cache is exposed as the `cache` property on the memoized\n * function. Its creation may be customized by replacing the `_.memoize.Cache`\n * constructor with one whose instances implement the\n * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)\n * method interface of `clear`, `delete`, `get`, `has`, and `set`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to have its output memoized.\n * @param {Function} [resolver] The function to resolve the cache key.\n * @returns {Function} Returns the new memoized function.\n * @example\n *\n * var object = { 'a': 1, 'b': 2 };\n * var other = { 'c': 3, 'd': 4 };\n *\n * var values = _.memoize(_.values);\n * values(object);\n * // => [1, 2]\n *\n * values(other);\n * // => [3, 4]\n *\n * object.a = 2;\n * values(object);\n * // => [1, 2]\n *\n * // Modify the result cache.\n * values.cache.set(object, ['a', 'b']);\n * values(object);\n * // => ['a', 'b']\n *\n * // Replace `_.memoize.Cache`.\n * _.memoize.Cache = WeakMap;\n */\nfunction memoize(func, resolver) {\n if (typeof func != 'function' || (resolver != null && typeof resolver != 'function')) {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n var memoized = function() {\n var args = arguments,\n key = resolver ? resolver.apply(this, args) : args[0],\n cache = memoized.cache;\n\n if (cache.has(key)) {\n return cache.get(key);\n }\n var result = func.apply(this, args);\n memoized.cache = cache.set(key, result) || cache;\n return result;\n };\n memoized.cache = new (memoize.Cache || MapCache);\n return memoized;\n}\n\n// Expose `MapCache`.\nmemoize.Cache = MapCache;\n\nmodule.exports = memoize;\n","\"use strict\";\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.EarlyExitException = exports.NotAllInputParsedException = exports.NoViableAltException = exports.MismatchedTokenException = exports.isRecognitionException = void 0;\nvar includes_1 = __importDefault(require(\"lodash/includes\"));\nvar MISMATCHED_TOKEN_EXCEPTION = \"MismatchedTokenException\";\nvar NO_VIABLE_ALT_EXCEPTION = \"NoViableAltException\";\nvar EARLY_EXIT_EXCEPTION = \"EarlyExitException\";\nvar NOT_ALL_INPUT_PARSED_EXCEPTION = \"NotAllInputParsedException\";\nvar RECOGNITION_EXCEPTION_NAMES = [\n MISMATCHED_TOKEN_EXCEPTION,\n NO_VIABLE_ALT_EXCEPTION,\n EARLY_EXIT_EXCEPTION,\n NOT_ALL_INPUT_PARSED_EXCEPTION\n];\nObject.freeze(RECOGNITION_EXCEPTION_NAMES);\n// hacks to bypass no support for custom Errors in javascript/typescript\nfunction isRecognitionException(error) {\n // can't do instanceof on hacked custom js exceptions\n return (0, includes_1.default)(RECOGNITION_EXCEPTION_NAMES, error.name);\n}\nexports.isRecognitionException = isRecognitionException;\nvar RecognitionException = /** @class */ (function (_super) {\n __extends(RecognitionException, _super);\n function RecognitionException(message, token) {\n var _newTarget = this.constructor;\n var _this = _super.call(this, message) || this;\n _this.token = token;\n _this.resyncedTokens = [];\n // fix prototype chain when typescript target is ES5\n Object.setPrototypeOf(_this, _newTarget.prototype);\n /* istanbul ignore next - V8 workaround to remove constructor from stacktrace when typescript target is ES5 */\n if (Error.captureStackTrace) {\n Error.captureStackTrace(_this, _this.constructor);\n }\n return _this;\n }\n return RecognitionException;\n}(Error));\nvar MismatchedTokenException = /** @class */ (function (_super) {\n __extends(MismatchedTokenException, _super);\n function MismatchedTokenException(message, token, previousToken) {\n var _this = _super.call(this, message, token) || this;\n _this.previousToken = previousToken;\n _this.name = MISMATCHED_TOKEN_EXCEPTION;\n return _this;\n }\n return MismatchedTokenException;\n}(RecognitionException));\nexports.MismatchedTokenException = MismatchedTokenException;\nvar NoViableAltException = /** @class */ (function (_super) {\n __extends(NoViableAltException, _super);\n function NoViableAltException(message, token, previousToken) {\n var _this = _super.call(this, message, token) || this;\n _this.previousToken = previousToken;\n _this.name = NO_VIABLE_ALT_EXCEPTION;\n return _this;\n }\n return NoViableAltException;\n}(RecognitionException));\nexports.NoViableAltException = NoViableAltException;\nvar NotAllInputParsedException = /** @class */ (function (_super) {\n __extends(NotAllInputParsedException, _super);\n function NotAllInputParsedException(message, token) {\n var _this = _super.call(this, message, token) || this;\n _this.name = NOT_ALL_INPUT_PARSED_EXCEPTION;\n return _this;\n }\n return NotAllInputParsedException;\n}(RecognitionException));\nexports.NotAllInputParsedException = NotAllInputParsedException;\nvar EarlyExitException = /** @class */ (function (_super) {\n __extends(EarlyExitException, _super);\n function EarlyExitException(message, token, previousToken) {\n var _this = _super.call(this, message, token) || this;\n _this.previousToken = previousToken;\n _this.name = EARLY_EXIT_EXCEPTION;\n return _this;\n }\n return EarlyExitException;\n}(RecognitionException));\nexports.EarlyExitException = EarlyExitException;\n//# sourceMappingURL=exceptions_public.js.map","\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Lexer = exports.LexerDefinitionErrorType = void 0;\nvar lexer_1 = require(\"./lexer\");\nvar noop_1 = __importDefault(require(\"lodash/noop\"));\nvar isEmpty_1 = __importDefault(require(\"lodash/isEmpty\"));\nvar isArray_1 = __importDefault(require(\"lodash/isArray\"));\nvar last_1 = __importDefault(require(\"lodash/last\"));\nvar reject_1 = __importDefault(require(\"lodash/reject\"));\nvar map_1 = __importDefault(require(\"lodash/map\"));\nvar forEach_1 = __importDefault(require(\"lodash/forEach\"));\nvar keys_1 = __importDefault(require(\"lodash/keys\"));\nvar isUndefined_1 = __importDefault(require(\"lodash/isUndefined\"));\nvar identity_1 = __importDefault(require(\"lodash/identity\"));\nvar assign_1 = __importDefault(require(\"lodash/assign\"));\nvar reduce_1 = __importDefault(require(\"lodash/reduce\"));\nvar clone_1 = __importDefault(require(\"lodash/clone\"));\nvar utils_1 = require(\"@chevrotain/utils\");\nvar tokens_1 = require(\"./tokens\");\nvar lexer_errors_public_1 = require(\"./lexer_errors_public\");\nvar reg_exp_parser_1 = require(\"./reg_exp_parser\");\nvar LexerDefinitionErrorType;\n(function (LexerDefinitionErrorType) {\n LexerDefinitionErrorType[LexerDefinitionErrorType[\"MISSING_PATTERN\"] = 0] = \"MISSING_PATTERN\";\n LexerDefinitionErrorType[LexerDefinitionErrorType[\"INVALID_PATTERN\"] = 1] = \"INVALID_PATTERN\";\n LexerDefinitionErrorType[LexerDefinitionErrorType[\"EOI_ANCHOR_FOUND\"] = 2] = \"EOI_ANCHOR_FOUND\";\n LexerDefinitionErrorType[LexerDefinitionErrorType[\"UNSUPPORTED_FLAGS_FOUND\"] = 3] = \"UNSUPPORTED_FLAGS_FOUND\";\n LexerDefinitionErrorType[LexerDefinitionErrorType[\"DUPLICATE_PATTERNS_FOUND\"] = 4] = \"DUPLICATE_PATTERNS_FOUND\";\n LexerDefinitionErrorType[LexerDefinitionErrorType[\"INVALID_GROUP_TYPE_FOUND\"] = 5] = \"INVALID_GROUP_TYPE_FOUND\";\n LexerDefinitionErrorType[LexerDefinitionErrorType[\"PUSH_MODE_DOES_NOT_EXIST\"] = 6] = \"PUSH_MODE_DOES_NOT_EXIST\";\n LexerDefinitionErrorType[LexerDefinitionErrorType[\"MULTI_MODE_LEXER_WITHOUT_DEFAULT_MODE\"] = 7] = \"MULTI_MODE_LEXER_WITHOUT_DEFAULT_MODE\";\n LexerDefinitionErrorType[LexerDefinitionErrorType[\"MULTI_MODE_LEXER_WITHOUT_MODES_PROPERTY\"] = 8] = \"MULTI_MODE_LEXER_WITHOUT_MODES_PROPERTY\";\n LexerDefinitionErrorType[LexerDefinitionErrorType[\"MULTI_MODE_LEXER_DEFAULT_MODE_VALUE_DOES_NOT_EXIST\"] = 9] = \"MULTI_MODE_LEXER_DEFAULT_MODE_VALUE_DOES_NOT_EXIST\";\n LexerDefinitionErrorType[LexerDefinitionErrorType[\"LEXER_DEFINITION_CANNOT_CONTAIN_UNDEFINED\"] = 10] = \"LEXER_DEFINITION_CANNOT_CONTAIN_UNDEFINED\";\n LexerDefinitionErrorType[LexerDefinitionErrorType[\"SOI_ANCHOR_FOUND\"] = 11] = \"SOI_ANCHOR_FOUND\";\n LexerDefinitionErrorType[LexerDefinitionErrorType[\"EMPTY_MATCH_PATTERN\"] = 12] = \"EMPTY_MATCH_PATTERN\";\n LexerDefinitionErrorType[LexerDefinitionErrorType[\"NO_LINE_BREAKS_FLAGS\"] = 13] = \"NO_LINE_BREAKS_FLAGS\";\n LexerDefinitionErrorType[LexerDefinitionErrorType[\"UNREACHABLE_PATTERN\"] = 14] = \"UNREACHABLE_PATTERN\";\n LexerDefinitionErrorType[LexerDefinitionErrorType[\"IDENTIFY_TERMINATOR\"] = 15] = \"IDENTIFY_TERMINATOR\";\n LexerDefinitionErrorType[LexerDefinitionErrorType[\"CUSTOM_LINE_BREAK\"] = 16] = \"CUSTOM_LINE_BREAK\";\n LexerDefinitionErrorType[LexerDefinitionErrorType[\"MULTI_MODE_LEXER_LONGER_ALT_NOT_IN_CURRENT_MODE\"] = 17] = \"MULTI_MODE_LEXER_LONGER_ALT_NOT_IN_CURRENT_MODE\";\n})(LexerDefinitionErrorType = exports.LexerDefinitionErrorType || (exports.LexerDefinitionErrorType = {}));\nvar DEFAULT_LEXER_CONFIG = {\n deferDefinitionErrorsHandling: false,\n positionTracking: \"full\",\n lineTerminatorsPattern: /\\n|\\r\\n?/g,\n lineTerminatorCharacters: [\"\\n\", \"\\r\"],\n ensureOptimizations: false,\n safeMode: false,\n errorMessageProvider: lexer_errors_public_1.defaultLexerErrorProvider,\n traceInitPerf: false,\n skipValidations: false,\n recoveryEnabled: true\n};\nObject.freeze(DEFAULT_LEXER_CONFIG);\nvar Lexer = /** @class */ (function () {\n function Lexer(lexerDefinition, config) {\n if (config === void 0) { config = DEFAULT_LEXER_CONFIG; }\n var _this = this;\n this.lexerDefinition = lexerDefinition;\n this.lexerDefinitionErrors = [];\n this.lexerDefinitionWarning = [];\n this.patternIdxToConfig = {};\n this.charCodeToPatternIdxToConfig = {};\n this.modes = [];\n this.emptyGroups = {};\n this.trackStartLines = true;\n this.trackEndLines = true;\n this.hasCustom = false;\n this.canModeBeOptimized = {};\n // Duplicated from the parser's perf trace trait to allow future extraction\n // of the lexer to a separate package.\n this.TRACE_INIT = function (phaseDesc, phaseImpl) {\n // No need to optimize this using NOOP pattern because\n // It is not called in a hot spot...\n if (_this.traceInitPerf === true) {\n _this.traceInitIndent++;\n var indent = new Array(_this.traceInitIndent + 1).join(\"\\t\");\n if (_this.traceInitIndent < _this.traceInitMaxIdent) {\n console.log(\"\".concat(indent, \"--> <\").concat(phaseDesc, \">\"));\n }\n var _a = (0, utils_1.timer)(phaseImpl), time = _a.time, value = _a.value;\n /* istanbul ignore next - Difficult to reproduce specific performance behavior (>10ms) in tests */\n var traceMethod = time > 10 ? console.warn : console.log;\n if (_this.traceInitIndent < _this.traceInitMaxIdent) {\n traceMethod(\"\".concat(indent, \"<-- <\").concat(phaseDesc, \"> time: \").concat(time, \"ms\"));\n }\n _this.traceInitIndent--;\n return value;\n }\n else {\n return phaseImpl();\n }\n };\n if (typeof config === \"boolean\") {\n throw Error(\"The second argument to the Lexer constructor is now an ILexerConfig Object.\\n\" +\n \"a boolean 2nd argument is no longer supported\");\n }\n // todo: defaults func?\n this.config = (0, assign_1.default)({}, DEFAULT_LEXER_CONFIG, config);\n var traceInitVal = this.config.traceInitPerf;\n if (traceInitVal === true) {\n this.traceInitMaxIdent = Infinity;\n this.traceInitPerf = true;\n }\n else if (typeof traceInitVal === \"number\") {\n this.traceInitMaxIdent = traceInitVal;\n this.traceInitPerf = true;\n }\n this.traceInitIndent = -1;\n this.TRACE_INIT(\"Lexer Constructor\", function () {\n var actualDefinition;\n var hasOnlySingleMode = true;\n _this.TRACE_INIT(\"Lexer Config handling\", function () {\n if (_this.config.lineTerminatorsPattern ===\n DEFAULT_LEXER_CONFIG.lineTerminatorsPattern) {\n // optimized built-in implementation for the defaults definition of lineTerminators\n _this.config.lineTerminatorsPattern = lexer_1.LineTerminatorOptimizedTester;\n }\n else {\n if (_this.config.lineTerminatorCharacters ===\n DEFAULT_LEXER_CONFIG.lineTerminatorCharacters) {\n throw Error(\"Error: Missing property on the Lexer config.\\n\" +\n \"\\tFor details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#MISSING_LINE_TERM_CHARS\");\n }\n }\n if (config.safeMode && config.ensureOptimizations) {\n throw Error('\"safeMode\" and \"ensureOptimizations\" flags are mutually exclusive.');\n }\n _this.trackStartLines = /full|onlyStart/i.test(_this.config.positionTracking);\n _this.trackEndLines = /full/i.test(_this.config.positionTracking);\n // Convert SingleModeLexerDefinition into a IMultiModeLexerDefinition.\n if ((0, isArray_1.default)(lexerDefinition)) {\n actualDefinition = {\n modes: { defaultMode: (0, clone_1.default)(lexerDefinition) },\n defaultMode: lexer_1.DEFAULT_MODE\n };\n }\n else {\n // no conversion needed, input should already be a IMultiModeLexerDefinition\n hasOnlySingleMode = false;\n actualDefinition = (0, clone_1.default)(lexerDefinition);\n }\n });\n if (_this.config.skipValidations === false) {\n _this.TRACE_INIT(\"performRuntimeChecks\", function () {\n _this.lexerDefinitionErrors = _this.lexerDefinitionErrors.concat((0, lexer_1.performRuntimeChecks)(actualDefinition, _this.trackStartLines, _this.config.lineTerminatorCharacters));\n });\n _this.TRACE_INIT(\"performWarningRuntimeChecks\", function () {\n _this.lexerDefinitionWarning = _this.lexerDefinitionWarning.concat((0, lexer_1.performWarningRuntimeChecks)(actualDefinition, _this.trackStartLines, _this.config.lineTerminatorCharacters));\n });\n }\n // for extra robustness to avoid throwing an none informative error message\n actualDefinition.modes = actualDefinition.modes\n ? actualDefinition.modes\n : {};\n // an error of undefined TokenTypes will be detected in \"performRuntimeChecks\" above.\n // this transformation is to increase robustness in the case of partially invalid lexer definition.\n (0, forEach_1.default)(actualDefinition.modes, function (currModeValue, currModeName) {\n actualDefinition.modes[currModeName] = (0, reject_1.default)(currModeValue, function (currTokType) { return (0, isUndefined_1.default)(currTokType); });\n });\n var allModeNames = (0, keys_1.default)(actualDefinition.modes);\n (0, forEach_1.default)(actualDefinition.modes, function (currModDef, currModName) {\n _this.TRACE_INIT(\"Mode: <\".concat(currModName, \"> processing\"), function () {\n _this.modes.push(currModName);\n if (_this.config.skipValidations === false) {\n _this.TRACE_INIT(\"validatePatterns\", function () {\n _this.lexerDefinitionErrors = _this.lexerDefinitionErrors.concat((0, lexer_1.validatePatterns)(currModDef, allModeNames));\n });\n }\n // If definition errors were encountered, the analysis phase may fail unexpectedly/\n // Considering a lexer with definition errors may never be used, there is no point\n // to performing the analysis anyhow...\n if ((0, isEmpty_1.default)(_this.lexerDefinitionErrors)) {\n (0, tokens_1.augmentTokenTypes)(currModDef);\n var currAnalyzeResult_1;\n _this.TRACE_INIT(\"analyzeTokenTypes\", function () {\n currAnalyzeResult_1 = (0, lexer_1.analyzeTokenTypes)(currModDef, {\n lineTerminatorCharacters: _this.config.lineTerminatorCharacters,\n positionTracking: config.positionTracking,\n ensureOptimizations: config.ensureOptimizations,\n safeMode: config.safeMode,\n tracer: _this.TRACE_INIT\n });\n });\n _this.patternIdxToConfig[currModName] =\n currAnalyzeResult_1.patternIdxToConfig;\n _this.charCodeToPatternIdxToConfig[currModName] =\n currAnalyzeResult_1.charCodeToPatternIdxToConfig;\n _this.emptyGroups = (0, assign_1.default)({}, _this.emptyGroups, currAnalyzeResult_1.emptyGroups);\n _this.hasCustom = currAnalyzeResult_1.hasCustom || _this.hasCustom;\n _this.canModeBeOptimized[currModName] =\n currAnalyzeResult_1.canBeOptimized;\n }\n });\n });\n _this.defaultMode = actualDefinition.defaultMode;\n if (!(0, isEmpty_1.default)(_this.lexerDefinitionErrors) &&\n !_this.config.deferDefinitionErrorsHandling) {\n var allErrMessages = (0, map_1.default)(_this.lexerDefinitionErrors, function (error) {\n return error.message;\n });\n var allErrMessagesString = allErrMessages.join(\"-----------------------\\n\");\n throw new Error(\"Errors detected in definition of Lexer:\\n\" + allErrMessagesString);\n }\n // Only print warning if there are no errors, This will avoid pl\n (0, forEach_1.default)(_this.lexerDefinitionWarning, function (warningDescriptor) {\n (0, utils_1.PRINT_WARNING)(warningDescriptor.message);\n });\n _this.TRACE_INIT(\"Choosing sub-methods implementations\", function () {\n // Choose the relevant internal implementations for this specific parser.\n // These implementations should be in-lined by the JavaScript engine\n // to provide optimal performance in each scenario.\n if (lexer_1.SUPPORT_STICKY) {\n _this.chopInput = identity_1.default;\n _this.match = _this.matchWithTest;\n }\n else {\n _this.updateLastIndex = noop_1.default;\n _this.match = _this.matchWithExec;\n }\n if (hasOnlySingleMode) {\n _this.handleModes = noop_1.default;\n }\n if (_this.trackStartLines === false) {\n _this.computeNewColumn = identity_1.default;\n }\n if (_this.trackEndLines === false) {\n _this.updateTokenEndLineColumnLocation = noop_1.default;\n }\n if (/full/i.test(_this.config.positionTracking)) {\n _this.createTokenInstance = _this.createFullToken;\n }\n else if (/onlyStart/i.test(_this.config.positionTracking)) {\n _this.createTokenInstance = _this.createStartOnlyToken;\n }\n else if (/onlyOffset/i.test(_this.config.positionTracking)) {\n _this.createTokenInstance = _this.createOffsetOnlyToken;\n }\n else {\n throw Error(\"Invalid config option: \\\"\".concat(_this.config.positionTracking, \"\\\"\"));\n }\n if (_this.hasCustom) {\n _this.addToken = _this.addTokenUsingPush;\n _this.handlePayload = _this.handlePayloadWithCustom;\n }\n else {\n _this.addToken = _this.addTokenUsingMemberAccess;\n _this.handlePayload = _this.handlePayloadNoCustom;\n }\n });\n _this.TRACE_INIT(\"Failed Optimization Warnings\", function () {\n var unOptimizedModes = (0, reduce_1.default)(_this.canModeBeOptimized, function (cannotBeOptimized, canBeOptimized, modeName) {\n if (canBeOptimized === false) {\n cannotBeOptimized.push(modeName);\n }\n return cannotBeOptimized;\n }, []);\n if (config.ensureOptimizations && !(0, isEmpty_1.default)(unOptimizedModes)) {\n throw Error(\"Lexer Modes: < \".concat(unOptimizedModes.join(\", \"), \" > cannot be optimized.\\n\") +\n '\\t Disable the \"ensureOptimizations\" lexer config flag to silently ignore this and run the lexer in an un-optimized mode.\\n' +\n \"\\t Or inspect the console log for details on how to resolve these issues.\");\n }\n });\n _this.TRACE_INIT(\"clearRegExpParserCache\", function () {\n (0, reg_exp_parser_1.clearRegExpParserCache)();\n });\n _this.TRACE_INIT(\"toFastProperties\", function () {\n (0, utils_1.toFastProperties)(_this);\n });\n });\n }\n Lexer.prototype.tokenize = function (text, initialMode) {\n if (initialMode === void 0) { initialMode = this.defaultMode; }\n if (!(0, isEmpty_1.default)(this.lexerDefinitionErrors)) {\n var allErrMessages = (0, map_1.default)(this.lexerDefinitionErrors, function (error) {\n return error.message;\n });\n var allErrMessagesString = allErrMessages.join(\"-----------------------\\n\");\n throw new Error(\"Unable to Tokenize because Errors detected in definition of Lexer:\\n\" +\n allErrMessagesString);\n }\n return this.tokenizeInternal(text, initialMode);\n };\n // There is quite a bit of duplication between this and \"tokenizeInternalLazy\"\n // This is intentional due to performance considerations.\n // this method also used quite a bit of `!` none null assertions because it is too optimized\n // for `tsc` to always understand it is \"safe\"\n Lexer.prototype.tokenizeInternal = function (text, initialMode) {\n var _this = this;\n var i, j, k, matchAltImage, longerAlt, matchedImage, payload, altPayload, imageLength, group, tokType, newToken, errLength, droppedChar, msg, match;\n var orgText = text;\n var orgLength = orgText.length;\n var offset = 0;\n var matchedTokensIndex = 0;\n // initializing the tokensArray to the \"guessed\" size.\n // guessing too little will still reduce the number of array re-sizes on pushes.\n // guessing too large (Tested by guessing x4 too large) may cost a bit more of memory\n // but would still have a faster runtime by avoiding (All but one) array resizing.\n var guessedNumberOfTokens = this.hasCustom\n ? 0 // will break custom token pattern APIs the matchedTokens array will contain undefined elements.\n : Math.floor(text.length / 10);\n var matchedTokens = new Array(guessedNumberOfTokens);\n var errors = [];\n var line = this.trackStartLines ? 1 : undefined;\n var column = this.trackStartLines ? 1 : undefined;\n var groups = (0, lexer_1.cloneEmptyGroups)(this.emptyGroups);\n var trackLines = this.trackStartLines;\n var lineTerminatorPattern = this.config.lineTerminatorsPattern;\n var currModePatternsLength = 0;\n var patternIdxToConfig = [];\n var currCharCodeToPatternIdxToConfig = [];\n var modeStack = [];\n var emptyArray = [];\n Object.freeze(emptyArray);\n var getPossiblePatterns;\n function getPossiblePatternsSlow() {\n return patternIdxToConfig;\n }\n function getPossiblePatternsOptimized(charCode) {\n var optimizedCharIdx = (0, lexer_1.charCodeToOptimizedIndex)(charCode);\n var possiblePatterns = currCharCodeToPatternIdxToConfig[optimizedCharIdx];\n if (possiblePatterns === undefined) {\n return emptyArray;\n }\n else {\n return possiblePatterns;\n }\n }\n var pop_mode = function (popToken) {\n // TODO: perhaps avoid this error in the edge case there is no more input?\n if (modeStack.length === 1 &&\n // if we have both a POP_MODE and a PUSH_MODE this is in-fact a \"transition\"\n // So no error should occur.\n popToken.tokenType.PUSH_MODE === undefined) {\n // if we try to pop the last mode there lexer will no longer have ANY mode.\n // thus the pop is ignored, an error will be created and the lexer will continue parsing in the previous mode.\n var msg_1 = _this.config.errorMessageProvider.buildUnableToPopLexerModeMessage(popToken);\n errors.push({\n offset: popToken.startOffset,\n line: popToken.startLine,\n column: popToken.startColumn,\n length: popToken.image.length,\n message: msg_1\n });\n }\n else {\n modeStack.pop();\n var newMode = (0, last_1.default)(modeStack);\n patternIdxToConfig = _this.patternIdxToConfig[newMode];\n currCharCodeToPatternIdxToConfig =\n _this.charCodeToPatternIdxToConfig[newMode];\n currModePatternsLength = patternIdxToConfig.length;\n var modeCanBeOptimized = _this.canModeBeOptimized[newMode] && _this.config.safeMode === false;\n if (currCharCodeToPatternIdxToConfig && modeCanBeOptimized) {\n getPossiblePatterns = getPossiblePatternsOptimized;\n }\n else {\n getPossiblePatterns = getPossiblePatternsSlow;\n }\n }\n };\n function push_mode(newMode) {\n modeStack.push(newMode);\n currCharCodeToPatternIdxToConfig =\n this.charCodeToPatternIdxToConfig[newMode];\n patternIdxToConfig = this.patternIdxToConfig[newMode];\n currModePatternsLength = patternIdxToConfig.length;\n currModePatternsLength = patternIdxToConfig.length;\n var modeCanBeOptimized = this.canModeBeOptimized[newMode] && this.config.safeMode === false;\n if (currCharCodeToPatternIdxToConfig && modeCanBeOptimized) {\n getPossiblePatterns = getPossiblePatternsOptimized;\n }\n else {\n getPossiblePatterns = getPossiblePatternsSlow;\n }\n }\n // this pattern seems to avoid a V8 de-optimization, although that de-optimization does not\n // seem to matter performance wise.\n push_mode.call(this, initialMode);\n var currConfig;\n var recoveryEnabled = this.config.recoveryEnabled;\n while (offset < orgLength) {\n matchedImage = null;\n var nextCharCode = orgText.charCodeAt(offset);\n var chosenPatternIdxToConfig = getPossiblePatterns(nextCharCode);\n var chosenPatternsLength = chosenPatternIdxToConfig.length;\n for (i = 0; i < chosenPatternsLength; i++) {\n currConfig = chosenPatternIdxToConfig[i];\n var currPattern = currConfig.pattern;\n payload = null;\n // manually in-lined because > 600 chars won't be in-lined in V8\n var singleCharCode = currConfig.short;\n if (singleCharCode !== false) {\n if (nextCharCode === singleCharCode) {\n // single character string\n matchedImage = currPattern;\n }\n }\n else if (currConfig.isCustom === true) {\n match = currPattern.exec(orgText, offset, matchedTokens, groups);\n if (match !== null) {\n matchedImage = match[0];\n if (match.payload !== undefined) {\n payload = match.payload;\n }\n }\n else {\n matchedImage = null;\n }\n }\n else {\n this.updateLastIndex(currPattern, offset);\n matchedImage = this.match(currPattern, text, offset);\n }\n if (matchedImage !== null) {\n // even though this pattern matched we must try a another longer alternative.\n // this can be used to prioritize keywords over identifiers\n longerAlt = currConfig.longerAlt;\n if (longerAlt !== undefined) {\n // TODO: micro optimize, avoid extra prop access\n // by saving/linking longerAlt on the original config?\n var longerAltLength = longerAlt.length;\n for (k = 0; k < longerAltLength; k++) {\n var longerAltConfig = patternIdxToConfig[longerAlt[k]];\n var longerAltPattern = longerAltConfig.pattern;\n altPayload = null;\n // single Char can never be a longer alt so no need to test it.\n // manually in-lined because > 600 chars won't be in-lined in V8\n if (longerAltConfig.isCustom === true) {\n match = longerAltPattern.exec(orgText, offset, matchedTokens, groups);\n if (match !== null) {\n matchAltImage = match[0];\n if (match.payload !== undefined) {\n altPayload = match.payload;\n }\n }\n else {\n matchAltImage = null;\n }\n }\n else {\n this.updateLastIndex(longerAltPattern, offset);\n matchAltImage = this.match(longerAltPattern, text, offset);\n }\n if (matchAltImage && matchAltImage.length > matchedImage.length) {\n matchedImage = matchAltImage;\n payload = altPayload;\n currConfig = longerAltConfig;\n // Exit the loop early after matching one of the longer alternatives\n // The first matched alternative takes precedence\n break;\n }\n }\n }\n break;\n }\n }\n // successful match\n if (matchedImage !== null) {\n imageLength = matchedImage.length;\n group = currConfig.group;\n if (group !== undefined) {\n tokType = currConfig.tokenTypeIdx;\n // TODO: \"offset + imageLength\" and the new column may be computed twice in case of \"full\" location information inside\n // createFullToken method\n newToken = this.createTokenInstance(matchedImage, offset, tokType, currConfig.tokenType, line, column, imageLength);\n this.handlePayload(newToken, payload);\n // TODO: optimize NOOP in case there are no special groups?\n if (group === false) {\n matchedTokensIndex = this.addToken(matchedTokens, matchedTokensIndex, newToken);\n }\n else {\n groups[group].push(newToken);\n }\n }\n text = this.chopInput(text, imageLength);\n offset = offset + imageLength;\n // TODO: with newlines the column may be assigned twice\n column = this.computeNewColumn(column, imageLength);\n if (trackLines === true && currConfig.canLineTerminator === true) {\n var numOfLTsInMatch = 0;\n var foundTerminator = void 0;\n var lastLTEndOffset = void 0;\n lineTerminatorPattern.lastIndex = 0;\n do {\n foundTerminator = lineTerminatorPattern.test(matchedImage);\n if (foundTerminator === true) {\n lastLTEndOffset = lineTerminatorPattern.lastIndex - 1;\n numOfLTsInMatch++;\n }\n } while (foundTerminator === true);\n if (numOfLTsInMatch !== 0) {\n line = line + numOfLTsInMatch;\n column = imageLength - lastLTEndOffset;\n this.updateTokenEndLineColumnLocation(newToken, group, lastLTEndOffset, numOfLTsInMatch, line, column, imageLength);\n }\n }\n // will be NOOP if no modes present\n this.handleModes(currConfig, pop_mode, push_mode, newToken);\n }\n else {\n // error recovery, drop characters until we identify a valid token's start point\n var errorStartOffset = offset;\n var errorLine = line;\n var errorColumn = column;\n var foundResyncPoint = recoveryEnabled === false;\n while (foundResyncPoint === false && offset < orgLength) {\n // Identity Func (when sticky flag is enabled)\n text = this.chopInput(text, 1);\n offset++;\n for (j = 0; j < currModePatternsLength; j++) {\n var currConfig_1 = patternIdxToConfig[j];\n var currPattern = currConfig_1.pattern;\n // manually in-lined because > 600 chars won't be in-lined in V8\n var singleCharCode = currConfig_1.short;\n if (singleCharCode !== false) {\n if (orgText.charCodeAt(offset) === singleCharCode) {\n // single character string\n foundResyncPoint = true;\n }\n }\n else if (currConfig_1.isCustom === true) {\n foundResyncPoint =\n currPattern.exec(orgText, offset, matchedTokens, groups) !== null;\n }\n else {\n this.updateLastIndex(currPattern, offset);\n foundResyncPoint = currPattern.exec(text) !== null;\n }\n if (foundResyncPoint === true) {\n break;\n }\n }\n }\n errLength = offset - errorStartOffset;\n // at this point we either re-synced or reached the end of the input text\n msg = this.config.errorMessageProvider.buildUnexpectedCharactersMessage(orgText, errorStartOffset, errLength, errorLine, errorColumn);\n errors.push({\n offset: errorStartOffset,\n line: errorLine,\n column: errorColumn,\n length: errLength,\n message: msg\n });\n if (recoveryEnabled === false) {\n break;\n }\n }\n }\n // if we do have custom patterns which push directly into the\n // TODO: custom tokens should not push directly??\n if (!this.hasCustom) {\n // if we guessed a too large size for the tokens array this will shrink it to the right size.\n matchedTokens.length = matchedTokensIndex;\n }\n return {\n tokens: matchedTokens,\n groups: groups,\n errors: errors\n };\n };\n Lexer.prototype.handleModes = function (config, pop_mode, push_mode, newToken) {\n if (config.pop === true) {\n // need to save the PUSH_MODE property as if the mode is popped\n // patternIdxToPopMode is updated to reflect the new mode after popping the stack\n var pushMode = config.push;\n pop_mode(newToken);\n if (pushMode !== undefined) {\n push_mode.call(this, pushMode);\n }\n }\n else if (config.push !== undefined) {\n push_mode.call(this, config.push);\n }\n };\n Lexer.prototype.chopInput = function (text, length) {\n return text.substring(length);\n };\n Lexer.prototype.updateLastIndex = function (regExp, newLastIndex) {\n regExp.lastIndex = newLastIndex;\n };\n // TODO: decrease this under 600 characters? inspect stripping comments option in TSC compiler\n Lexer.prototype.updateTokenEndLineColumnLocation = function (newToken, group, lastLTIdx, numOfLTsInMatch, line, column, imageLength) {\n var lastCharIsLT, fixForEndingInLT;\n if (group !== undefined) {\n // a none skipped multi line Token, need to update endLine/endColumn\n lastCharIsLT = lastLTIdx === imageLength - 1;\n fixForEndingInLT = lastCharIsLT ? -1 : 0;\n if (!(numOfLTsInMatch === 1 && lastCharIsLT === true)) {\n // if a token ends in a LT that last LT only affects the line numbering of following Tokens\n newToken.endLine = line + fixForEndingInLT;\n // the last LT in a token does not affect the endColumn either as the [columnStart ... columnEnd)\n // inclusive to exclusive range.\n newToken.endColumn = column - 1 + -fixForEndingInLT;\n }\n // else single LT in the last character of a token, no need to modify the endLine/EndColumn\n }\n };\n Lexer.prototype.computeNewColumn = function (oldColumn, imageLength) {\n return oldColumn + imageLength;\n };\n Lexer.prototype.createOffsetOnlyToken = function (image, startOffset, tokenTypeIdx, tokenType) {\n return {\n image: image,\n startOffset: startOffset,\n tokenTypeIdx: tokenTypeIdx,\n tokenType: tokenType\n };\n };\n Lexer.prototype.createStartOnlyToken = function (image, startOffset, tokenTypeIdx, tokenType, startLine, startColumn) {\n return {\n image: image,\n startOffset: startOffset,\n startLine: startLine,\n startColumn: startColumn,\n tokenTypeIdx: tokenTypeIdx,\n tokenType: tokenType\n };\n };\n Lexer.prototype.createFullToken = function (image, startOffset, tokenTypeIdx, tokenType, startLine, startColumn, imageLength) {\n return {\n image: image,\n startOffset: startOffset,\n endOffset: startOffset + imageLength - 1,\n startLine: startLine,\n endLine: startLine,\n startColumn: startColumn,\n endColumn: startColumn + imageLength - 1,\n tokenTypeIdx: tokenTypeIdx,\n tokenType: tokenType\n };\n };\n Lexer.prototype.addTokenUsingPush = function (tokenVector, index, tokenToAdd) {\n tokenVector.push(tokenToAdd);\n return index;\n };\n Lexer.prototype.addTokenUsingMemberAccess = function (tokenVector, index, tokenToAdd) {\n tokenVector[index] = tokenToAdd;\n index++;\n return index;\n };\n Lexer.prototype.handlePayloadNoCustom = function (token, payload) { };\n Lexer.prototype.handlePayloadWithCustom = function (token, payload) {\n if (payload !== null) {\n token.payload = payload;\n }\n };\n Lexer.prototype.matchWithTest = function (pattern, text, offset) {\n var found = pattern.test(text);\n if (found === true) {\n return text.substring(offset, pattern.lastIndex);\n }\n return null;\n };\n Lexer.prototype.matchWithExec = function (pattern, text) {\n var regExpArray = pattern.exec(text);\n return regExpArray !== null ? regExpArray[0] : null;\n };\n Lexer.SKIPPED = \"This marks a skipped Token pattern, this means each token identified by it will\" +\n \"be consumed and then thrown into oblivion, this can be used to for example to completely ignore whitespace.\";\n Lexer.NA = /NOT_APPLICABLE/;\n return Lexer;\n}());\nexports.Lexer = Lexer;\n//# sourceMappingURL=lexer_public.js.map","/**\n * This function is like\n * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n * except that it includes inherited enumerable properties.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction nativeKeysIn(object) {\n var result = [];\n if (object != null) {\n for (var key in Object(object)) {\n result.push(key);\n }\n }\n return result;\n}\n\nmodule.exports = nativeKeysIn;\n","var baseIsEqualDeep = require('./_baseIsEqualDeep'),\n isObjectLike = require('./isObjectLike');\n\n/**\n * The base implementation of `_.isEqual` which supports partial comparisons\n * and tracks traversed objects.\n *\n * @private\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @param {boolean} bitmask The bitmask flags.\n * 1 - Unordered comparison\n * 2 - Partial comparison\n * @param {Function} [customizer] The function to customize comparisons.\n * @param {Object} [stack] Tracks traversed `value` and `other` objects.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n */\nfunction baseIsEqual(value, other, bitmask, customizer, stack) {\n if (value === other) {\n return true;\n }\n if (value == null || other == null || (!isObjectLike(value) && !isObjectLike(other))) {\n return value !== value && other !== other;\n }\n return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack);\n}\n\nmodule.exports = baseIsEqual;\n","var getMapData = require('./_getMapData');\n\n/**\n * Gets the map value for `key`.\n *\n * @private\n * @name get\n * @memberOf MapCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction mapCacheGet(key) {\n return getMapData(this, key).get(key);\n}\n\nmodule.exports = mapCacheGet;\n","/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/**\n * Checks if `value` is a valid array-like length.\n *\n * **Note:** This method is loosely based on\n * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n * @example\n *\n * _.isLength(3);\n * // => true\n *\n * _.isLength(Number.MIN_VALUE);\n * // => false\n *\n * _.isLength(Infinity);\n * // => false\n *\n * _.isLength('3');\n * // => false\n */\nfunction isLength(value) {\n return typeof value == 'number' &&\n value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n}\n\nmodule.exports = isLength;\n","/**\n * Converts `map` to its key-value pairs.\n *\n * @private\n * @param {Object} map The map to convert.\n * @returns {Array} Returns the key-value pairs.\n */\nfunction mapToArray(map) {\n var index = -1,\n result = Array(map.size);\n\n map.forEach(function(value, key) {\n result[++index] = [key, value];\n });\n return result;\n}\n\nmodule.exports = mapToArray;\n","/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return value != null && typeof value == 'object';\n}\n\nmodule.exports = isObjectLike;\n","/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/** Used to detect unsigned integer values. */\nvar reIsUint = /^(?:0|[1-9]\\d*)$/;\n\n/**\n * Checks if `value` is a valid array-like index.\n *\n * @private\n * @param {*} value The value to check.\n * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n */\nfunction isIndex(value, length) {\n var type = typeof value;\n length = length == null ? MAX_SAFE_INTEGER : length;\n\n return !!length &&\n (type == 'number' ||\n (type != 'symbol' && reIsUint.test(value))) &&\n (value > -1 && value % 1 == 0 && value < length);\n}\n\nmodule.exports = isIndex;\n","/**\n * Gets the value at `key` of `object`.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {string} key The key of the property to get.\n * @returns {*} Returns the property value.\n */\nfunction getValue(object, key) {\n return object == null ? undefined : object[key];\n}\n\nmodule.exports = getValue;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.clearRegExpParserCache = exports.getRegExpAst = void 0;\nvar regexp_to_ast_1 = require(\"regexp-to-ast\");\nvar regExpAstCache = {};\nvar regExpParser = new regexp_to_ast_1.RegExpParser();\nfunction getRegExpAst(regExp) {\n var regExpStr = regExp.toString();\n if (regExpAstCache.hasOwnProperty(regExpStr)) {\n return regExpAstCache[regExpStr];\n }\n else {\n var regExpAst = regExpParser.pattern(regExpStr);\n regExpAstCache[regExpStr] = regExpAst;\n return regExpAst;\n }\n}\nexports.getRegExpAst = getRegExpAst;\nfunction clearRegExpParserCache() {\n regExpAstCache = {};\n}\nexports.clearRegExpParserCache = clearRegExpParserCache;\n//# sourceMappingURL=reg_exp_parser.js.map","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * The base implementation of `_.has` without support for deep paths.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {Array|string} key The key to check.\n * @returns {boolean} Returns `true` if `key` exists, else `false`.\n */\nfunction baseHas(object, key) {\n return object != null && hasOwnProperty.call(object, key);\n}\n\nmodule.exports = baseHas;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.defaultLexerErrorProvider = void 0;\nexports.defaultLexerErrorProvider = {\n buildUnableToPopLexerModeMessage: function (token) {\n return \"Unable to pop Lexer Mode after encountering Token ->\".concat(token.image, \"<- The Mode Stack is empty\");\n },\n buildUnexpectedCharactersMessage: function (fullText, startOffset, length, line, column) {\n return (\"unexpected character: ->\".concat(fullText.charAt(startOffset), \"<- at offset: \").concat(startOffset, \",\") + \" skipped \".concat(length, \" characters.\"));\n }\n};\n//# sourceMappingURL=lexer_errors_public.js.map","\"use strict\";\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __assign = (this && this.__assign) || function () {\n __assign = Object.assign || function(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\n t[p] = s[p];\n }\n return t;\n };\n return __assign.apply(this, arguments);\n};\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.checkPrefixAlternativesAmbiguities = exports.validateSomeNonEmptyLookaheadPath = exports.validateTooManyAlts = exports.RepetitionCollector = exports.validateAmbiguousAlternationAlternatives = exports.validateEmptyOrAlternative = exports.getFirstNoneTerminal = exports.validateNoLeftRecursion = exports.validateRuleIsOverridden = exports.validateRuleDoesNotAlreadyExist = exports.OccurrenceValidationCollector = exports.identifyProductionForDuplicates = exports.validateGrammar = exports.validateLookahead = void 0;\nvar first_1 = __importDefault(require(\"lodash/first\"));\nvar isEmpty_1 = __importDefault(require(\"lodash/isEmpty\"));\nvar drop_1 = __importDefault(require(\"lodash/drop\"));\nvar flatten_1 = __importDefault(require(\"lodash/flatten\"));\nvar filter_1 = __importDefault(require(\"lodash/filter\"));\nvar reject_1 = __importDefault(require(\"lodash/reject\"));\nvar difference_1 = __importDefault(require(\"lodash/difference\"));\nvar map_1 = __importDefault(require(\"lodash/map\"));\nvar forEach_1 = __importDefault(require(\"lodash/forEach\"));\nvar groupBy_1 = __importDefault(require(\"lodash/groupBy\"));\nvar reduce_1 = __importDefault(require(\"lodash/reduce\"));\nvar pickBy_1 = __importDefault(require(\"lodash/pickBy\"));\nvar values_1 = __importDefault(require(\"lodash/values\"));\nvar includes_1 = __importDefault(require(\"lodash/includes\"));\nvar flatMap_1 = __importDefault(require(\"lodash/flatMap\"));\nvar clone_1 = __importDefault(require(\"lodash/clone\"));\nvar parser_1 = require(\"../parser/parser\");\nvar gast_1 = require(\"@chevrotain/gast\");\nvar lookahead_1 = require(\"./lookahead\");\nvar interpreter_1 = require(\"./interpreter\");\nvar gast_2 = require(\"@chevrotain/gast\");\nvar gast_3 = require(\"@chevrotain/gast\");\nvar dropRight_1 = __importDefault(require(\"lodash/dropRight\"));\nvar compact_1 = __importDefault(require(\"lodash/compact\"));\nvar tokens_1 = require(\"../../scan/tokens\");\nfunction validateLookahead(options) {\n var lookaheadValidationErrorMessages = options.lookaheadStrategy.validate({\n rules: options.rules,\n tokenTypes: options.tokenTypes,\n grammarName: options.grammarName\n });\n return (0, map_1.default)(lookaheadValidationErrorMessages, function (errorMessage) { return (__assign({ type: parser_1.ParserDefinitionErrorType.CUSTOM_LOOKAHEAD_VALIDATION }, errorMessage)); });\n}\nexports.validateLookahead = validateLookahead;\nfunction validateGrammar(topLevels, tokenTypes, errMsgProvider, grammarName) {\n var duplicateErrors = (0, flatMap_1.default)(topLevels, function (currTopLevel) { return validateDuplicateProductions(currTopLevel, errMsgProvider); });\n var termsNamespaceConflictErrors = checkTerminalAndNoneTerminalsNameSpace(topLevels, tokenTypes, errMsgProvider);\n var tooManyAltsErrors = (0, flatMap_1.default)(topLevels, function (curRule) {\n return validateTooManyAlts(curRule, errMsgProvider);\n });\n var duplicateRulesError = (0, flatMap_1.default)(topLevels, function (curRule) {\n return validateRuleDoesNotAlreadyExist(curRule, topLevels, grammarName, errMsgProvider);\n });\n return duplicateErrors.concat(termsNamespaceConflictErrors, tooManyAltsErrors, duplicateRulesError);\n}\nexports.validateGrammar = validateGrammar;\nfunction validateDuplicateProductions(topLevelRule, errMsgProvider) {\n var collectorVisitor = new OccurrenceValidationCollector();\n topLevelRule.accept(collectorVisitor);\n var allRuleProductions = collectorVisitor.allProductions;\n var productionGroups = (0, groupBy_1.default)(allRuleProductions, identifyProductionForDuplicates);\n var duplicates = (0, pickBy_1.default)(productionGroups, function (currGroup) {\n return currGroup.length > 1;\n });\n var errors = (0, map_1.default)((0, values_1.default)(duplicates), function (currDuplicates) {\n var firstProd = (0, first_1.default)(currDuplicates);\n var msg = errMsgProvider.buildDuplicateFoundError(topLevelRule, currDuplicates);\n var dslName = (0, gast_1.getProductionDslName)(firstProd);\n var defError = {\n message: msg,\n type: parser_1.ParserDefinitionErrorType.DUPLICATE_PRODUCTIONS,\n ruleName: topLevelRule.name,\n dslName: dslName,\n occurrence: firstProd.idx\n };\n var param = getExtraProductionArgument(firstProd);\n if (param) {\n defError.parameter = param;\n }\n return defError;\n });\n return errors;\n}\nfunction identifyProductionForDuplicates(prod) {\n return \"\".concat((0, gast_1.getProductionDslName)(prod), \"_#_\").concat(prod.idx, \"_#_\").concat(getExtraProductionArgument(prod));\n}\nexports.identifyProductionForDuplicates = identifyProductionForDuplicates;\nfunction getExtraProductionArgument(prod) {\n if (prod instanceof gast_2.Terminal) {\n return prod.terminalType.name;\n }\n else if (prod instanceof gast_2.NonTerminal) {\n return prod.nonTerminalName;\n }\n else {\n return \"\";\n }\n}\nvar OccurrenceValidationCollector = /** @class */ (function (_super) {\n __extends(OccurrenceValidationCollector, _super);\n function OccurrenceValidationCollector() {\n var _this = _super !== null && _super.apply(this, arguments) || this;\n _this.allProductions = [];\n return _this;\n }\n OccurrenceValidationCollector.prototype.visitNonTerminal = function (subrule) {\n this.allProductions.push(subrule);\n };\n OccurrenceValidationCollector.prototype.visitOption = function (option) {\n this.allProductions.push(option);\n };\n OccurrenceValidationCollector.prototype.visitRepetitionWithSeparator = function (manySep) {\n this.allProductions.push(manySep);\n };\n OccurrenceValidationCollector.prototype.visitRepetitionMandatory = function (atLeastOne) {\n this.allProductions.push(atLeastOne);\n };\n OccurrenceValidationCollector.prototype.visitRepetitionMandatoryWithSeparator = function (atLeastOneSep) {\n this.allProductions.push(atLeastOneSep);\n };\n OccurrenceValidationCollector.prototype.visitRepetition = function (many) {\n this.allProductions.push(many);\n };\n OccurrenceValidationCollector.prototype.visitAlternation = function (or) {\n this.allProductions.push(or);\n };\n OccurrenceValidationCollector.prototype.visitTerminal = function (terminal) {\n this.allProductions.push(terminal);\n };\n return OccurrenceValidationCollector;\n}(gast_3.GAstVisitor));\nexports.OccurrenceValidationCollector = OccurrenceValidationCollector;\nfunction validateRuleDoesNotAlreadyExist(rule, allRules, className, errMsgProvider) {\n var errors = [];\n var occurrences = (0, reduce_1.default)(allRules, function (result, curRule) {\n if (curRule.name === rule.name) {\n return result + 1;\n }\n return result;\n }, 0);\n if (occurrences > 1) {\n var errMsg = errMsgProvider.buildDuplicateRuleNameError({\n topLevelRule: rule,\n grammarName: className\n });\n errors.push({\n message: errMsg,\n type: parser_1.ParserDefinitionErrorType.DUPLICATE_RULE_NAME,\n ruleName: rule.name\n });\n }\n return errors;\n}\nexports.validateRuleDoesNotAlreadyExist = validateRuleDoesNotAlreadyExist;\n// TODO: is there anyway to get only the rule names of rules inherited from the super grammars?\n// This is not part of the IGrammarErrorProvider because the validation cannot be performed on\n// The grammar structure, only at runtime.\nfunction validateRuleIsOverridden(ruleName, definedRulesNames, className) {\n var errors = [];\n var errMsg;\n if (!(0, includes_1.default)(definedRulesNames, ruleName)) {\n errMsg =\n \"Invalid rule override, rule: ->\".concat(ruleName, \"<- cannot be overridden in the grammar: ->\").concat(className, \"<-\") +\n \"as it is not defined in any of the super grammars \";\n errors.push({\n message: errMsg,\n type: parser_1.ParserDefinitionErrorType.INVALID_RULE_OVERRIDE,\n ruleName: ruleName\n });\n }\n return errors;\n}\nexports.validateRuleIsOverridden = validateRuleIsOverridden;\nfunction validateNoLeftRecursion(topRule, currRule, errMsgProvider, path) {\n if (path === void 0) { path = []; }\n var errors = [];\n var nextNonTerminals = getFirstNoneTerminal(currRule.definition);\n if ((0, isEmpty_1.default)(nextNonTerminals)) {\n return [];\n }\n else {\n var ruleName = topRule.name;\n var foundLeftRecursion = (0, includes_1.default)(nextNonTerminals, topRule);\n if (foundLeftRecursion) {\n errors.push({\n message: errMsgProvider.buildLeftRecursionError({\n topLevelRule: topRule,\n leftRecursionPath: path\n }),\n type: parser_1.ParserDefinitionErrorType.LEFT_RECURSION,\n ruleName: ruleName\n });\n }\n // we are only looking for cyclic paths leading back to the specific topRule\n // other cyclic paths are ignored, we still need this difference to avoid infinite loops...\n var validNextSteps = (0, difference_1.default)(nextNonTerminals, path.concat([topRule]));\n var errorsFromNextSteps = (0, flatMap_1.default)(validNextSteps, function (currRefRule) {\n var newPath = (0, clone_1.default)(path);\n newPath.push(currRefRule);\n return validateNoLeftRecursion(topRule, currRefRule, errMsgProvider, newPath);\n });\n return errors.concat(errorsFromNextSteps);\n }\n}\nexports.validateNoLeftRecursion = validateNoLeftRecursion;\nfunction getFirstNoneTerminal(definition) {\n var result = [];\n if ((0, isEmpty_1.default)(definition)) {\n return result;\n }\n var firstProd = (0, first_1.default)(definition);\n /* istanbul ignore else */\n if (firstProd instanceof gast_2.NonTerminal) {\n result.push(firstProd.referencedRule);\n }\n else if (firstProd instanceof gast_2.Alternative ||\n firstProd instanceof gast_2.Option ||\n firstProd instanceof gast_2.RepetitionMandatory ||\n firstProd instanceof gast_2.RepetitionMandatoryWithSeparator ||\n firstProd instanceof gast_2.RepetitionWithSeparator ||\n firstProd instanceof gast_2.Repetition) {\n result = result.concat(getFirstNoneTerminal(firstProd.definition));\n }\n else if (firstProd instanceof gast_2.Alternation) {\n // each sub definition in alternation is a FLAT\n result = (0, flatten_1.default)((0, map_1.default)(firstProd.definition, function (currSubDef) {\n return getFirstNoneTerminal(currSubDef.definition);\n }));\n }\n else if (firstProd instanceof gast_2.Terminal) {\n // nothing to see, move along\n }\n else {\n throw Error(\"non exhaustive match\");\n }\n var isFirstOptional = (0, gast_1.isOptionalProd)(firstProd);\n var hasMore = definition.length > 1;\n if (isFirstOptional && hasMore) {\n var rest = (0, drop_1.default)(definition);\n return result.concat(getFirstNoneTerminal(rest));\n }\n else {\n return result;\n }\n}\nexports.getFirstNoneTerminal = getFirstNoneTerminal;\nvar OrCollector = /** @class */ (function (_super) {\n __extends(OrCollector, _super);\n function OrCollector() {\n var _this = _super !== null && _super.apply(this, arguments) || this;\n _this.alternations = [];\n return _this;\n }\n OrCollector.prototype.visitAlternation = function (node) {\n this.alternations.push(node);\n };\n return OrCollector;\n}(gast_3.GAstVisitor));\nfunction validateEmptyOrAlternative(topLevelRule, errMsgProvider) {\n var orCollector = new OrCollector();\n topLevelRule.accept(orCollector);\n var ors = orCollector.alternations;\n var errors = (0, flatMap_1.default)(ors, function (currOr) {\n var exceptLast = (0, dropRight_1.default)(currOr.definition);\n return (0, flatMap_1.default)(exceptLast, function (currAlternative, currAltIdx) {\n var possibleFirstInAlt = (0, interpreter_1.nextPossibleTokensAfter)([currAlternative], [], tokens_1.tokenStructuredMatcher, 1);\n if ((0, isEmpty_1.default)(possibleFirstInAlt)) {\n return [\n {\n message: errMsgProvider.buildEmptyAlternationError({\n topLevelRule: topLevelRule,\n alternation: currOr,\n emptyChoiceIdx: currAltIdx\n }),\n type: parser_1.ParserDefinitionErrorType.NONE_LAST_EMPTY_ALT,\n ruleName: topLevelRule.name,\n occurrence: currOr.idx,\n alternative: currAltIdx + 1\n }\n ];\n }\n else {\n return [];\n }\n });\n });\n return errors;\n}\nexports.validateEmptyOrAlternative = validateEmptyOrAlternative;\nfunction validateAmbiguousAlternationAlternatives(topLevelRule, globalMaxLookahead, errMsgProvider) {\n var orCollector = new OrCollector();\n topLevelRule.accept(orCollector);\n var ors = orCollector.alternations;\n // New Handling of ignoring ambiguities\n // - https://github.com/chevrotain/chevrotain/issues/869\n ors = (0, reject_1.default)(ors, function (currOr) { return currOr.ignoreAmbiguities === true; });\n var errors = (0, flatMap_1.default)(ors, function (currOr) {\n var currOccurrence = currOr.idx;\n var actualMaxLookahead = currOr.maxLookahead || globalMaxLookahead;\n var alternatives = (0, lookahead_1.getLookaheadPathsForOr)(currOccurrence, topLevelRule, actualMaxLookahead, currOr);\n var altsAmbiguityErrors = checkAlternativesAmbiguities(alternatives, currOr, topLevelRule, errMsgProvider);\n var altsPrefixAmbiguityErrors = checkPrefixAlternativesAmbiguities(alternatives, currOr, topLevelRule, errMsgProvider);\n return altsAmbiguityErrors.concat(altsPrefixAmbiguityErrors);\n });\n return errors;\n}\nexports.validateAmbiguousAlternationAlternatives = validateAmbiguousAlternationAlternatives;\nvar RepetitionCollector = /** @class */ (function (_super) {\n __extends(RepetitionCollector, _super);\n function RepetitionCollector() {\n var _this = _super !== null && _super.apply(this, arguments) || this;\n _this.allProductions = [];\n return _this;\n }\n RepetitionCollector.prototype.visitRepetitionWithSeparator = function (manySep) {\n this.allProductions.push(manySep);\n };\n RepetitionCollector.prototype.visitRepetitionMandatory = function (atLeastOne) {\n this.allProductions.push(atLeastOne);\n };\n RepetitionCollector.prototype.visitRepetitionMandatoryWithSeparator = function (atLeastOneSep) {\n this.allProductions.push(atLeastOneSep);\n };\n RepetitionCollector.prototype.visitRepetition = function (many) {\n this.allProductions.push(many);\n };\n return RepetitionCollector;\n}(gast_3.GAstVisitor));\nexports.RepetitionCollector = RepetitionCollector;\nfunction validateTooManyAlts(topLevelRule, errMsgProvider) {\n var orCollector = new OrCollector();\n topLevelRule.accept(orCollector);\n var ors = orCollector.alternations;\n var errors = (0, flatMap_1.default)(ors, function (currOr) {\n if (currOr.definition.length > 255) {\n return [\n {\n message: errMsgProvider.buildTooManyAlternativesError({\n topLevelRule: topLevelRule,\n alternation: currOr\n }),\n type: parser_1.ParserDefinitionErrorType.TOO_MANY_ALTS,\n ruleName: topLevelRule.name,\n occurrence: currOr.idx\n }\n ];\n }\n else {\n return [];\n }\n });\n return errors;\n}\nexports.validateTooManyAlts = validateTooManyAlts;\nfunction validateSomeNonEmptyLookaheadPath(topLevelRules, maxLookahead, errMsgProvider) {\n var errors = [];\n (0, forEach_1.default)(topLevelRules, function (currTopRule) {\n var collectorVisitor = new RepetitionCollector();\n currTopRule.accept(collectorVisitor);\n var allRuleProductions = collectorVisitor.allProductions;\n (0, forEach_1.default)(allRuleProductions, function (currProd) {\n var prodType = (0, lookahead_1.getProdType)(currProd);\n var actualMaxLookahead = currProd.maxLookahead || maxLookahead;\n var currOccurrence = currProd.idx;\n var paths = (0, lookahead_1.getLookaheadPathsForOptionalProd)(currOccurrence, currTopRule, prodType, actualMaxLookahead);\n var pathsInsideProduction = paths[0];\n if ((0, isEmpty_1.default)((0, flatten_1.default)(pathsInsideProduction))) {\n var errMsg = errMsgProvider.buildEmptyRepetitionError({\n topLevelRule: currTopRule,\n repetition: currProd\n });\n errors.push({\n message: errMsg,\n type: parser_1.ParserDefinitionErrorType.NO_NON_EMPTY_LOOKAHEAD,\n ruleName: currTopRule.name\n });\n }\n });\n });\n return errors;\n}\nexports.validateSomeNonEmptyLookaheadPath = validateSomeNonEmptyLookaheadPath;\nfunction checkAlternativesAmbiguities(alternatives, alternation, rule, errMsgProvider) {\n var foundAmbiguousPaths = [];\n var identicalAmbiguities = (0, reduce_1.default)(alternatives, function (result, currAlt, currAltIdx) {\n // ignore (skip) ambiguities with this alternative\n if (alternation.definition[currAltIdx].ignoreAmbiguities === true) {\n return result;\n }\n (0, forEach_1.default)(currAlt, function (currPath) {\n var altsCurrPathAppearsIn = [currAltIdx];\n (0, forEach_1.default)(alternatives, function (currOtherAlt, currOtherAltIdx) {\n if (currAltIdx !== currOtherAltIdx &&\n (0, lookahead_1.containsPath)(currOtherAlt, currPath) &&\n // ignore (skip) ambiguities with this \"other\" alternative\n alternation.definition[currOtherAltIdx].ignoreAmbiguities !== true) {\n altsCurrPathAppearsIn.push(currOtherAltIdx);\n }\n });\n if (altsCurrPathAppearsIn.length > 1 &&\n !(0, lookahead_1.containsPath)(foundAmbiguousPaths, currPath)) {\n foundAmbiguousPaths.push(currPath);\n result.push({\n alts: altsCurrPathAppearsIn,\n path: currPath\n });\n }\n });\n return result;\n }, []);\n var currErrors = (0, map_1.default)(identicalAmbiguities, function (currAmbDescriptor) {\n var ambgIndices = (0, map_1.default)(currAmbDescriptor.alts, function (currAltIdx) { return currAltIdx + 1; });\n var currMessage = errMsgProvider.buildAlternationAmbiguityError({\n topLevelRule: rule,\n alternation: alternation,\n ambiguityIndices: ambgIndices,\n prefixPath: currAmbDescriptor.path\n });\n return {\n message: currMessage,\n type: parser_1.ParserDefinitionErrorType.AMBIGUOUS_ALTS,\n ruleName: rule.name,\n occurrence: alternation.idx,\n alternatives: currAmbDescriptor.alts\n };\n });\n return currErrors;\n}\nfunction checkPrefixAlternativesAmbiguities(alternatives, alternation, rule, errMsgProvider) {\n // flatten\n var pathsAndIndices = (0, reduce_1.default)(alternatives, function (result, currAlt, idx) {\n var currPathsAndIdx = (0, map_1.default)(currAlt, function (currPath) {\n return { idx: idx, path: currPath };\n });\n return result.concat(currPathsAndIdx);\n }, []);\n var errors = (0, compact_1.default)((0, flatMap_1.default)(pathsAndIndices, function (currPathAndIdx) {\n var alternativeGast = alternation.definition[currPathAndIdx.idx];\n // ignore (skip) ambiguities with this alternative\n if (alternativeGast.ignoreAmbiguities === true) {\n return [];\n }\n var targetIdx = currPathAndIdx.idx;\n var targetPath = currPathAndIdx.path;\n var prefixAmbiguitiesPathsAndIndices = (0, filter_1.default)(pathsAndIndices, function (searchPathAndIdx) {\n // prefix ambiguity can only be created from lower idx (higher priority) path\n return (\n // ignore (skip) ambiguities with this \"other\" alternative\n alternation.definition[searchPathAndIdx.idx].ignoreAmbiguities !==\n true &&\n searchPathAndIdx.idx < targetIdx &&\n // checking for strict prefix because identical lookaheads\n // will be be detected using a different validation.\n (0, lookahead_1.isStrictPrefixOfPath)(searchPathAndIdx.path, targetPath));\n });\n var currPathPrefixErrors = (0, map_1.default)(prefixAmbiguitiesPathsAndIndices, function (currAmbPathAndIdx) {\n var ambgIndices = [currAmbPathAndIdx.idx + 1, targetIdx + 1];\n var occurrence = alternation.idx === 0 ? \"\" : alternation.idx;\n var message = errMsgProvider.buildAlternationPrefixAmbiguityError({\n topLevelRule: rule,\n alternation: alternation,\n ambiguityIndices: ambgIndices,\n prefixPath: currAmbPathAndIdx.path\n });\n return {\n message: message,\n type: parser_1.ParserDefinitionErrorType.AMBIGUOUS_PREFIX_ALTS,\n ruleName: rule.name,\n occurrence: occurrence,\n alternatives: ambgIndices\n };\n });\n return currPathPrefixErrors;\n }));\n return errors;\n}\nexports.checkPrefixAlternativesAmbiguities = checkPrefixAlternativesAmbiguities;\nfunction checkTerminalAndNoneTerminalsNameSpace(topLevels, tokenTypes, errMsgProvider) {\n var errors = [];\n var tokenNames = (0, map_1.default)(tokenTypes, function (currToken) { return currToken.name; });\n (0, forEach_1.default)(topLevels, function (currRule) {\n var currRuleName = currRule.name;\n if ((0, includes_1.default)(tokenNames, currRuleName)) {\n var errMsg = errMsgProvider.buildNamespaceConflictError(currRule);\n errors.push({\n message: errMsg,\n type: parser_1.ParserDefinitionErrorType.CONFLICT_TOKENS_RULES_NAMESPACE,\n ruleName: currRuleName\n });\n }\n });\n return errors;\n}\n//# sourceMappingURL=checks.js.map","var arrayMap = require('./_arrayMap');\n\n/**\n * The base implementation of `_.values` and `_.valuesIn` which creates an\n * array of `object` property values corresponding to the property names\n * of `props`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array} props The property names to get values for.\n * @returns {Object} Returns the array of property values.\n */\nfunction baseValues(object, props) {\n return arrayMap(props, function(key) {\n return object[key];\n });\n}\n\nmodule.exports = baseValues;\n","var baseProperty = require('./_baseProperty'),\n basePropertyDeep = require('./_basePropertyDeep'),\n isKey = require('./_isKey'),\n toKey = require('./_toKey');\n\n/**\n * Creates a function that returns the value at `path` of a given object.\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Util\n * @param {Array|string} path The path of the property to get.\n * @returns {Function} Returns the new accessor function.\n * @example\n *\n * var objects = [\n * { 'a': { 'b': 2 } },\n * { 'a': { 'b': 1 } }\n * ];\n *\n * _.map(objects, _.property('a.b'));\n * // => [2, 1]\n *\n * _.map(_.sortBy(objects, _.property(['a', 'b'])), 'a.b');\n * // => [1, 2]\n */\nfunction property(path) {\n return isKey(path) ? baseProperty(toKey(path)) : basePropertyDeep(path);\n}\n\nmodule.exports = property;\n","\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ContentAssist = void 0;\nvar interpreter_1 = require(\"../../grammar/interpreter\");\nvar first_1 = __importDefault(require(\"lodash/first\"));\nvar isUndefined_1 = __importDefault(require(\"lodash/isUndefined\"));\nvar ContentAssist = /** @class */ (function () {\n function ContentAssist() {\n }\n ContentAssist.prototype.initContentAssist = function () { };\n ContentAssist.prototype.computeContentAssist = function (startRuleName, precedingInput) {\n var startRuleGast = this.gastProductionsCache[startRuleName];\n if ((0, isUndefined_1.default)(startRuleGast)) {\n throw Error(\"Rule ->\".concat(startRuleName, \"<- does not exist in this grammar.\"));\n }\n return (0, interpreter_1.nextPossibleTokensAfter)([startRuleGast], precedingInput, this.tokenMatcher, this.maxLookahead);\n };\n // TODO: should this be a member method or a utility? it does not have any state or usage of 'this'...\n // TODO: should this be more explicitly part of the public API?\n ContentAssist.prototype.getNextPossibleTokenTypes = function (grammarPath) {\n var topRuleName = (0, first_1.default)(grammarPath.ruleStack);\n var gastProductions = this.getGAstProductions();\n var topProduction = gastProductions[topRuleName];\n var nextPossibleTokenTypes = new interpreter_1.NextAfterTokenWalker(topProduction, grammarPath).startWalking();\n return nextPossibleTokenTypes;\n };\n return ContentAssist;\n}());\nexports.ContentAssist = ContentAssist;\n//# sourceMappingURL=context_assist.js.map","var baseHasIn = require('./_baseHasIn'),\n hasPath = require('./_hasPath');\n\n/**\n * Checks if `path` is a direct or inherited property of `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path to check.\n * @returns {boolean} Returns `true` if `path` exists, else `false`.\n * @example\n *\n * var object = _.create({ 'a': _.create({ 'b': 2 }) });\n *\n * _.hasIn(object, 'a');\n * // => true\n *\n * _.hasIn(object, 'a.b');\n * // => true\n *\n * _.hasIn(object, ['a', 'b']);\n * // => true\n *\n * _.hasIn(object, 'b');\n * // => false\n */\nfunction hasIn(object, path) {\n return object != null && hasPath(object, path, baseHasIn);\n}\n\nmodule.exports = hasIn;\n","var baseFor = require('./_baseFor'),\n keys = require('./keys');\n\n/**\n * The base implementation of `_.forOwn` without support for iteratee shorthands.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Object} Returns `object`.\n */\nfunction baseForOwn(object, iteratee) {\n return object && baseFor(object, iteratee, keys);\n}\n\nmodule.exports = baseForOwn;\n","var Symbol = require('./_Symbol');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the raw `toStringTag`.\n */\nfunction getRawTag(value) {\n var isOwn = hasOwnProperty.call(value, symToStringTag),\n tag = value[symToStringTag];\n\n try {\n value[symToStringTag] = undefined;\n var unmasked = true;\n } catch (e) {}\n\n var result = nativeObjectToString.call(value);\n if (unmasked) {\n if (isOwn) {\n value[symToStringTag] = tag;\n } else {\n delete value[symToStringTag];\n }\n }\n return result;\n}\n\nmodule.exports = getRawTag;\n","var getAllKeys = require('./_getAllKeys');\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1;\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * A specialized version of `baseIsEqualDeep` for objects with support for\n * partial deep comparisons.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction equalObjects(object, other, bitmask, customizer, equalFunc, stack) {\n var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\n objProps = getAllKeys(object),\n objLength = objProps.length,\n othProps = getAllKeys(other),\n othLength = othProps.length;\n\n if (objLength != othLength && !isPartial) {\n return false;\n }\n var index = objLength;\n while (index--) {\n var key = objProps[index];\n if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) {\n return false;\n }\n }\n // Check that cyclic values are equal.\n var objStacked = stack.get(object);\n var othStacked = stack.get(other);\n if (objStacked && othStacked) {\n return objStacked == other && othStacked == object;\n }\n var result = true;\n stack.set(object, other);\n stack.set(other, object);\n\n var skipCtor = isPartial;\n while (++index < objLength) {\n key = objProps[index];\n var objValue = object[key],\n othValue = other[key];\n\n if (customizer) {\n var compared = isPartial\n ? customizer(othValue, objValue, key, other, object, stack)\n : customizer(objValue, othValue, key, object, other, stack);\n }\n // Recursively compare objects (susceptible to call stack limits).\n if (!(compared === undefined\n ? (objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack))\n : compared\n )) {\n result = false;\n break;\n }\n skipCtor || (skipCtor = key == 'constructor');\n }\n if (result && !skipCtor) {\n var objCtor = object.constructor,\n othCtor = other.constructor;\n\n // Non `Object` object instances with different constructors are not equal.\n if (objCtor != othCtor &&\n ('constructor' in object && 'constructor' in other) &&\n !(typeof objCtor == 'function' && objCtor instanceof objCtor &&\n typeof othCtor == 'function' && othCtor instanceof othCtor)) {\n result = false;\n }\n }\n stack['delete'](object);\n stack['delete'](other);\n return result;\n}\n\nmodule.exports = equalObjects;\n","var baseTimes = require('./_baseTimes'),\n isArguments = require('./isArguments'),\n isArray = require('./isArray'),\n isBuffer = require('./isBuffer'),\n isIndex = require('./_isIndex'),\n isTypedArray = require('./isTypedArray');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Creates an array of the enumerable property names of the array-like `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @param {boolean} inherited Specify returning inherited property names.\n * @returns {Array} Returns the array of property names.\n */\nfunction arrayLikeKeys(value, inherited) {\n var isArr = isArray(value),\n isArg = !isArr && isArguments(value),\n isBuff = !isArr && !isArg && isBuffer(value),\n isType = !isArr && !isArg && !isBuff && isTypedArray(value),\n skipIndexes = isArr || isArg || isBuff || isType,\n result = skipIndexes ? baseTimes(value.length, String) : [],\n length = result.length;\n\n for (var key in value) {\n if ((inherited || hasOwnProperty.call(value, key)) &&\n !(skipIndexes && (\n // Safari 9 has enumerable `arguments.length` in strict mode.\n key == 'length' ||\n // Node.js 0.10 has enumerable non-index properties on buffers.\n (isBuff && (key == 'offset' || key == 'parent')) ||\n // PhantomJS 2 has enumerable non-index properties on typed arrays.\n (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) ||\n // Skip index properties.\n isIndex(key, length)\n ))) {\n result.push(key);\n }\n }\n return result;\n}\n\nmodule.exports = arrayLikeKeys;\n","var isObject = require('./isObject');\n\n/**\n * Checks if `value` is suitable for strict equality comparisons, i.e. `===`.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` if suitable for strict\n * equality comparisons, else `false`.\n */\nfunction isStrictComparable(value) {\n return value === value && !isObject(value);\n}\n\nmodule.exports = isStrictComparable;\n","var isStrictComparable = require('./_isStrictComparable'),\n keys = require('./keys');\n\n/**\n * Gets the property names, values, and compare flags of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the match data of `object`.\n */\nfunction getMatchData(object) {\n var result = keys(object),\n length = result.length;\n\n while (length--) {\n var key = result[length],\n value = object[key];\n\n result[length] = [key, value, isStrictComparable(value)];\n }\n return result;\n}\n\nmodule.exports = getMatchData;\n","var arrayReduce = require('./_arrayReduce'),\n baseEach = require('./_baseEach'),\n baseIteratee = require('./_baseIteratee'),\n baseReduce = require('./_baseReduce'),\n isArray = require('./isArray');\n\n/**\n * Reduces `collection` to a value which is the accumulated result of running\n * each element in `collection` thru `iteratee`, where each successive\n * invocation is supplied the return value of the previous. If `accumulator`\n * is not given, the first element of `collection` is used as the initial\n * value. The iteratee is invoked with four arguments:\n * (accumulator, value, index|key, collection).\n *\n * Many lodash methods are guarded to work as iteratees for methods like\n * `_.reduce`, `_.reduceRight`, and `_.transform`.\n *\n * The guarded methods are:\n * `assign`, `defaults`, `defaultsDeep`, `includes`, `merge`, `orderBy`,\n * and `sortBy`\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @param {*} [accumulator] The initial value.\n * @returns {*} Returns the accumulated value.\n * @see _.reduceRight\n * @example\n *\n * _.reduce([1, 2], function(sum, n) {\n * return sum + n;\n * }, 0);\n * // => 3\n *\n * _.reduce({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {\n * (result[value] || (result[value] = [])).push(key);\n * return result;\n * }, {});\n * // => { '1': ['a', 'c'], '2': ['b'] } (iteration order is not guaranteed)\n */\nfunction reduce(collection, iteratee, accumulator) {\n var func = isArray(collection) ? arrayReduce : baseReduce,\n initAccum = arguments.length < 3;\n\n return func(collection, baseIteratee(iteratee, 4), accumulator, initAccum, baseEach);\n}\n\nmodule.exports = reduce;\n","\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.defaultGrammarValidatorErrorProvider = exports.defaultGrammarResolverErrorProvider = exports.defaultParserErrorProvider = void 0;\nvar tokens_public_1 = require(\"../scan/tokens_public\");\nvar first_1 = __importDefault(require(\"lodash/first\"));\nvar map_1 = __importDefault(require(\"lodash/map\"));\nvar reduce_1 = __importDefault(require(\"lodash/reduce\"));\nvar gast_1 = require(\"@chevrotain/gast\");\nvar gast_2 = require(\"@chevrotain/gast\");\nexports.defaultParserErrorProvider = {\n buildMismatchTokenMessage: function (_a) {\n var expected = _a.expected, actual = _a.actual, previous = _a.previous, ruleName = _a.ruleName;\n var hasLabel = (0, tokens_public_1.hasTokenLabel)(expected);\n var expectedMsg = hasLabel\n ? \"--> \".concat((0, tokens_public_1.tokenLabel)(expected), \" <--\")\n : \"token of type --> \".concat(expected.name, \" <--\");\n var msg = \"Expecting \".concat(expectedMsg, \" but found --> '\").concat(actual.image, \"' <--\");\n return msg;\n },\n buildNotAllInputParsedMessage: function (_a) {\n var firstRedundant = _a.firstRedundant, ruleName = _a.ruleName;\n return \"Redundant input, expecting EOF but found: \" + firstRedundant.image;\n },\n buildNoViableAltMessage: function (_a) {\n var expectedPathsPerAlt = _a.expectedPathsPerAlt, actual = _a.actual, previous = _a.previous, customUserDescription = _a.customUserDescription, ruleName = _a.ruleName;\n var errPrefix = \"Expecting: \";\n // TODO: issue: No Viable Alternative Error may have incomplete details. #502\n var actualText = (0, first_1.default)(actual).image;\n var errSuffix = \"\\nbut found: '\" + actualText + \"'\";\n if (customUserDescription) {\n return errPrefix + customUserDescription + errSuffix;\n }\n else {\n var allLookAheadPaths = (0, reduce_1.default)(expectedPathsPerAlt, function (result, currAltPaths) { return result.concat(currAltPaths); }, []);\n var nextValidTokenSequences = (0, map_1.default)(allLookAheadPaths, function (currPath) {\n return \"[\".concat((0, map_1.default)(currPath, function (currTokenType) { return (0, tokens_public_1.tokenLabel)(currTokenType); }).join(\", \"), \"]\");\n });\n var nextValidSequenceItems = (0, map_1.default)(nextValidTokenSequences, function (itemMsg, idx) { return \" \".concat(idx + 1, \". \").concat(itemMsg); });\n var calculatedDescription = \"one of these possible Token sequences:\\n\".concat(nextValidSequenceItems.join(\"\\n\"));\n return errPrefix + calculatedDescription + errSuffix;\n }\n },\n buildEarlyExitMessage: function (_a) {\n var expectedIterationPaths = _a.expectedIterationPaths, actual = _a.actual, customUserDescription = _a.customUserDescription, ruleName = _a.ruleName;\n var errPrefix = \"Expecting: \";\n // TODO: issue: No Viable Alternative Error may have incomplete details. #502\n var actualText = (0, first_1.default)(actual).image;\n var errSuffix = \"\\nbut found: '\" + actualText + \"'\";\n if (customUserDescription) {\n return errPrefix + customUserDescription + errSuffix;\n }\n else {\n var nextValidTokenSequences = (0, map_1.default)(expectedIterationPaths, function (currPath) {\n return \"[\".concat((0, map_1.default)(currPath, function (currTokenType) { return (0, tokens_public_1.tokenLabel)(currTokenType); }).join(\",\"), \"]\");\n });\n var calculatedDescription = \"expecting at least one iteration which starts with one of these possible Token sequences::\\n \" +\n \"<\".concat(nextValidTokenSequences.join(\" ,\"), \">\");\n return errPrefix + calculatedDescription + errSuffix;\n }\n }\n};\nObject.freeze(exports.defaultParserErrorProvider);\nexports.defaultGrammarResolverErrorProvider = {\n buildRuleNotFoundError: function (topLevelRule, undefinedRule) {\n var msg = \"Invalid grammar, reference to a rule which is not defined: ->\" +\n undefinedRule.nonTerminalName +\n \"<-\\n\" +\n \"inside top level rule: ->\" +\n topLevelRule.name +\n \"<-\";\n return msg;\n }\n};\nexports.defaultGrammarValidatorErrorProvider = {\n buildDuplicateFoundError: function (topLevelRule, duplicateProds) {\n function getExtraProductionArgument(prod) {\n if (prod instanceof gast_1.Terminal) {\n return prod.terminalType.name;\n }\n else if (prod instanceof gast_1.NonTerminal) {\n return prod.nonTerminalName;\n }\n else {\n return \"\";\n }\n }\n var topLevelName = topLevelRule.name;\n var duplicateProd = (0, first_1.default)(duplicateProds);\n var index = duplicateProd.idx;\n var dslName = (0, gast_2.getProductionDslName)(duplicateProd);\n var extraArgument = getExtraProductionArgument(duplicateProd);\n var hasExplicitIndex = index > 0;\n var msg = \"->\".concat(dslName).concat(hasExplicitIndex ? index : \"\", \"<- \").concat(extraArgument ? \"with argument: ->\".concat(extraArgument, \"<-\") : \"\", \"\\n appears more than once (\").concat(duplicateProds.length, \" times) in the top level rule: ->\").concat(topLevelName, \"<-. \\n For further details see: https://chevrotain.io/docs/FAQ.html#NUMERICAL_SUFFIXES \\n \");\n // white space trimming time! better to trim afterwards as it allows to use WELL formatted multi line template strings...\n msg = msg.replace(/[ \\t]+/g, \" \");\n msg = msg.replace(/\\s\\s+/g, \"\\n\");\n return msg;\n },\n buildNamespaceConflictError: function (rule) {\n var errMsg = \"Namespace conflict found in grammar.\\n\" +\n \"The grammar has both a Terminal(Token) and a Non-Terminal(Rule) named: <\".concat(rule.name, \">.\\n\") +\n \"To resolve this make sure each Terminal and Non-Terminal names are unique\\n\" +\n \"This is easy to accomplish by using the convention that Terminal names start with an uppercase letter\\n\" +\n \"and Non-Terminal names start with a lower case letter.\";\n return errMsg;\n },\n buildAlternationPrefixAmbiguityError: function (options) {\n var pathMsg = (0, map_1.default)(options.prefixPath, function (currTok) {\n return (0, tokens_public_1.tokenLabel)(currTok);\n }).join(\", \");\n var occurrence = options.alternation.idx === 0 ? \"\" : options.alternation.idx;\n var errMsg = \"Ambiguous alternatives: <\".concat(options.ambiguityIndices.join(\" ,\"), \"> due to common lookahead prefix\\n\") +\n \"in inside <\").concat(options.topLevelRule.name, \"> Rule,\\n\") +\n \"<\".concat(pathMsg, \"> may appears as a prefix path in all these alternatives.\\n\") +\n \"See: https://chevrotain.io/docs/guide/resolving_grammar_errors.html#COMMON_PREFIX\\n\" +\n \"For Further details.\";\n return errMsg;\n },\n buildAlternationAmbiguityError: function (options) {\n var pathMsg = (0, map_1.default)(options.prefixPath, function (currtok) {\n return (0, tokens_public_1.tokenLabel)(currtok);\n }).join(\", \");\n var occurrence = options.alternation.idx === 0 ? \"\" : options.alternation.idx;\n var currMessage = \"Ambiguous Alternatives Detected: <\".concat(options.ambiguityIndices.join(\" ,\"), \"> in \") +\n \" inside <\".concat(options.topLevelRule.name, \"> Rule,\\n\") +\n \"<\".concat(pathMsg, \"> may appears as a prefix path in all these alternatives.\\n\");\n currMessage =\n currMessage +\n \"See: https://chevrotain.io/docs/guide/resolving_grammar_errors.html#AMBIGUOUS_ALTERNATIVES\\n\" +\n \"For Further details.\";\n return currMessage;\n },\n buildEmptyRepetitionError: function (options) {\n var dslName = (0, gast_2.getProductionDslName)(options.repetition);\n if (options.repetition.idx !== 0) {\n dslName += options.repetition.idx;\n }\n var errMsg = \"The repetition <\".concat(dslName, \"> within Rule <\").concat(options.topLevelRule.name, \"> can never consume any tokens.\\n\") +\n \"This could lead to an infinite loop.\";\n return errMsg;\n },\n // TODO: remove - `errors_public` from nyc.config.js exclude\n // once this method is fully removed from this file\n buildTokenNameError: function (options) {\n /* istanbul ignore next */\n return \"deprecated\";\n },\n buildEmptyAlternationError: function (options) {\n var errMsg = \"Ambiguous empty alternative: <\".concat(options.emptyChoiceIdx + 1, \">\") +\n \" in inside <\").concat(options.topLevelRule.name, \"> Rule.\\n\") +\n \"Only the last alternative may be an empty alternative.\";\n return errMsg;\n },\n buildTooManyAlternativesError: function (options) {\n var errMsg = \"An Alternation cannot have more than 256 alternatives:\\n\" +\n \" inside <\").concat(options.topLevelRule.name, \"> Rule.\\n has \").concat(options.alternation.definition.length + 1, \" alternatives.\");\n return errMsg;\n },\n buildLeftRecursionError: function (options) {\n var ruleName = options.topLevelRule.name;\n var pathNames = (0, map_1.default)(options.leftRecursionPath, function (currRule) { return currRule.name; });\n var leftRecursivePath = \"\".concat(ruleName, \" --> \").concat(pathNames\n .concat([ruleName])\n .join(\" --> \"));\n var errMsg = \"Left Recursion found in grammar.\\n\" +\n \"rule: <\".concat(ruleName, \"> can be invoked from itself (directly or indirectly)\\n\") +\n \"without consuming any Tokens. The grammar path that causes this is: \\n \".concat(leftRecursivePath, \"\\n\") +\n \" To fix this refactor your grammar to remove the left recursion.\\n\" +\n \"see: https://en.wikipedia.org/wiki/LL_parser#Left_factoring.\";\n return errMsg;\n },\n // TODO: remove - `errors_public` from nyc.config.js exclude\n // once this method is fully removed from this file\n buildInvalidRuleNameError: function (options) {\n /* istanbul ignore next */\n return \"deprecated\";\n },\n buildDuplicateRuleNameError: function (options) {\n var ruleName;\n if (options.topLevelRule instanceof gast_1.Rule) {\n ruleName = options.topLevelRule.name;\n }\n else {\n ruleName = options.topLevelRule;\n }\n var errMsg = \"Duplicate definition, rule: ->\".concat(ruleName, \"<- is already defined in the grammar: ->\").concat(options.grammarName, \"<-\");\n return errMsg;\n }\n};\n//# sourceMappingURL=errors_public.js.map","/**\n * A specialized version of `_.reduce` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {*} [accumulator] The initial value.\n * @param {boolean} [initAccum] Specify using the first element of `array` as\n * the initial value.\n * @returns {*} Returns the accumulated value.\n */\nfunction arrayReduce(array, iteratee, accumulator, initAccum) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n if (initAccum && length) {\n accumulator = array[++index];\n }\n while (++index < length) {\n accumulator = iteratee(accumulator, array[index], index, array);\n }\n return accumulator;\n}\n\nmodule.exports = arrayReduce;\n","var baseForOwn = require('./_baseForOwn'),\n createBaseEach = require('./_createBaseEach');\n\n/**\n * The base implementation of `_.forEach` without support for iteratee shorthands.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array|Object} Returns `collection`.\n */\nvar baseEach = createBaseEach(baseForOwn);\n\nmodule.exports = baseEach;\n","/**\n * Gets the first element of `array`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @alias first\n * @category Array\n * @param {Array} array The array to query.\n * @returns {*} Returns the first element of `array`.\n * @example\n *\n * _.head([1, 2, 3]);\n * // => 1\n *\n * _.head([]);\n * // => undefined\n */\nfunction head(array) {\n return (array && array.length) ? array[0] : undefined;\n}\n\nmodule.exports = head;\n","var baseEach = require('./_baseEach');\n\n/**\n * The base implementation of `_.some` without support for iteratee shorthands.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {boolean} Returns `true` if any element passes the predicate check,\n * else `false`.\n */\nfunction baseSome(collection, predicate) {\n var result;\n\n baseEach(collection, function(value, index, collection) {\n result = predicate(value, index, collection);\n return !result;\n });\n return !!result;\n}\n\nmodule.exports = baseSome;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.LexerAdapter = void 0;\nvar parser_1 = require(\"../parser\");\n/**\n * Trait responsible abstracting over the interaction with Lexer output (Token vector).\n *\n * This could be generalized to support other kinds of lexers, e.g.\n * - Just in Time Lexing / Lexer-Less parsing.\n * - Streaming Lexer.\n */\nvar LexerAdapter = /** @class */ (function () {\n function LexerAdapter() {\n }\n LexerAdapter.prototype.initLexerAdapter = function () {\n this.tokVector = [];\n this.tokVectorLength = 0;\n this.currIdx = -1;\n };\n Object.defineProperty(LexerAdapter.prototype, \"input\", {\n get: function () {\n return this.tokVector;\n },\n set: function (newInput) {\n // @ts-ignore - `this parameter` not supported in setters/getters\n // - https://www.typescriptlang.org/docs/handbook/functions.html#this-parameters\n if (this.selfAnalysisDone !== true) {\n throw Error(\"Missing invocation at the end of the Parser's constructor.\");\n }\n // @ts-ignore - `this parameter` not supported in setters/getters\n // - https://www.typescriptlang.org/docs/handbook/functions.html#this-parameters\n this.reset();\n this.tokVector = newInput;\n this.tokVectorLength = newInput.length;\n },\n enumerable: false,\n configurable: true\n });\n // skips a token and returns the next token\n LexerAdapter.prototype.SKIP_TOKEN = function () {\n if (this.currIdx <= this.tokVector.length - 2) {\n this.consumeToken();\n return this.LA(1);\n }\n else {\n return parser_1.END_OF_FILE;\n }\n };\n // Lexer (accessing Token vector) related methods which can be overridden to implement lazy lexers\n // or lexers dependent on parser context.\n LexerAdapter.prototype.LA = function (howMuch) {\n var soughtIdx = this.currIdx + howMuch;\n if (soughtIdx < 0 || this.tokVectorLength <= soughtIdx) {\n return parser_1.END_OF_FILE;\n }\n else {\n return this.tokVector[soughtIdx];\n }\n };\n LexerAdapter.prototype.consumeToken = function () {\n this.currIdx++;\n };\n LexerAdapter.prototype.exportLexerState = function () {\n return this.currIdx;\n };\n LexerAdapter.prototype.importLexerState = function (newState) {\n this.currIdx = newState;\n };\n LexerAdapter.prototype.resetLexerState = function () {\n this.currIdx = -1;\n };\n LexerAdapter.prototype.moveToTerminatedState = function () {\n this.currIdx = this.tokVector.length - 1;\n };\n LexerAdapter.prototype.getLexerPosition = function () {\n return this.exportLexerState();\n };\n return LexerAdapter;\n}());\nexports.LexerAdapter = LexerAdapter;\n//# sourceMappingURL=lexer_adapter.js.map","/**\n * Removes `key` and its value from the stack.\n *\n * @private\n * @name delete\n * @memberOf Stack\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction stackDelete(key) {\n var data = this.__data__,\n result = data['delete'](key);\n\n this.size = data.size;\n return result;\n}\n\nmodule.exports = stackDelete;\n","var ListCache = require('./_ListCache'),\n Map = require('./_Map'),\n MapCache = require('./_MapCache');\n\n/** Used as the size to enable large array optimizations. */\nvar LARGE_ARRAY_SIZE = 200;\n\n/**\n * Sets the stack `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Stack\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the stack cache instance.\n */\nfunction stackSet(key, value) {\n var data = this.__data__;\n if (data instanceof ListCache) {\n var pairs = data.__data__;\n if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) {\n pairs.push([key, value]);\n this.size = ++data.size;\n return this;\n }\n data = this.__data__ = new MapCache(pairs);\n }\n data.set(key, value);\n this.size = data.size;\n return this;\n}\n\nmodule.exports = stackSet;\n","var baseRest = require('./_baseRest'),\n isIterateeCall = require('./_isIterateeCall');\n\n/**\n * Creates a function like `_.assign`.\n *\n * @private\n * @param {Function} assigner The function to assign values.\n * @returns {Function} Returns the new assigner function.\n */\nfunction createAssigner(assigner) {\n return baseRest(function(object, sources) {\n var index = -1,\n length = sources.length,\n customizer = length > 1 ? sources[length - 1] : undefined,\n guard = length > 2 ? sources[2] : undefined;\n\n customizer = (assigner.length > 3 && typeof customizer == 'function')\n ? (length--, customizer)\n : undefined;\n\n if (guard && isIterateeCall(sources[0], sources[1], guard)) {\n customizer = length < 3 ? undefined : customizer;\n length = 1;\n }\n object = Object(object);\n while (++index < length) {\n var source = sources[index];\n if (source) {\n assigner(object, source, index, customizer);\n }\n }\n return object;\n });\n}\n\nmodule.exports = createAssigner;\n","/**\n * A faster alternative to `Function#apply`, this function invokes `func`\n * with the `this` binding of `thisArg` and the arguments of `args`.\n *\n * @private\n * @param {Function} func The function to invoke.\n * @param {*} thisArg The `this` binding of `func`.\n * @param {Array} args The arguments to invoke `func` with.\n * @returns {*} Returns the result of `func`.\n */\nfunction apply(func, thisArg, args) {\n switch (args.length) {\n case 0: return func.call(thisArg);\n case 1: return func.call(thisArg, args[0]);\n case 2: return func.call(thisArg, args[0], args[1]);\n case 3: return func.call(thisArg, args[0], args[1], args[2]);\n }\n return func.apply(thisArg, args);\n}\n\nmodule.exports = apply;\n","var getNative = require('./_getNative');\n\n/* Built-in method references that are verified to be native. */\nvar nativeCreate = getNative(Object, 'create');\n\nmodule.exports = nativeCreate;\n","/**\n * Converts an ASCII `string` to an array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the converted array.\n */\nfunction asciiToArray(string) {\n return string.split('');\n}\n\nmodule.exports = asciiToArray;\n","var arrayMap = require('./_arrayMap'),\n baseIteratee = require('./_baseIteratee'),\n basePickBy = require('./_basePickBy'),\n getAllKeysIn = require('./_getAllKeysIn');\n\n/**\n * Creates an object composed of the `object` properties `predicate` returns\n * truthy for. The predicate is invoked with two arguments: (value, key).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The source object.\n * @param {Function} [predicate=_.identity] The function invoked per property.\n * @returns {Object} Returns the new object.\n * @example\n *\n * var object = { 'a': 1, 'b': '2', 'c': 3 };\n *\n * _.pickBy(object, _.isNumber);\n * // => { 'a': 1, 'c': 3 }\n */\nfunction pickBy(object, predicate) {\n if (object == null) {\n return {};\n }\n var props = arrayMap(getAllKeysIn(object), function(prop) {\n return [prop];\n });\n predicate = baseIteratee(predicate);\n return basePickBy(object, props, function(value, path) {\n return predicate(value, path[0]);\n });\n}\n\nmodule.exports = pickBy;\n","\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.RecognizerApi = void 0;\nvar values_1 = __importDefault(require(\"lodash/values\"));\nvar includes_1 = __importDefault(require(\"lodash/includes\"));\nvar exceptions_public_1 = require(\"../../exceptions_public\");\nvar parser_1 = require(\"../parser\");\nvar errors_public_1 = require(\"../../errors_public\");\nvar checks_1 = require(\"../../grammar/checks\");\nvar gast_1 = require(\"@chevrotain/gast\");\n/**\n * This trait is responsible for implementing the public API\n * for defining Chevrotain parsers, i.e:\n * - CONSUME\n * - RULE\n * - OPTION\n * - ...\n */\nvar RecognizerApi = /** @class */ (function () {\n function RecognizerApi() {\n }\n RecognizerApi.prototype.ACTION = function (impl) {\n return impl.call(this);\n };\n RecognizerApi.prototype.consume = function (idx, tokType, options) {\n return this.consumeInternal(tokType, idx, options);\n };\n RecognizerApi.prototype.subrule = function (idx, ruleToCall, options) {\n return this.subruleInternal(ruleToCall, idx, options);\n };\n RecognizerApi.prototype.option = function (idx, actionORMethodDef) {\n return this.optionInternal(actionORMethodDef, idx);\n };\n RecognizerApi.prototype.or = function (idx, altsOrOpts) {\n return this.orInternal(altsOrOpts, idx);\n };\n RecognizerApi.prototype.many = function (idx, actionORMethodDef) {\n return this.manyInternal(idx, actionORMethodDef);\n };\n RecognizerApi.prototype.atLeastOne = function (idx, actionORMethodDef) {\n return this.atLeastOneInternal(idx, actionORMethodDef);\n };\n RecognizerApi.prototype.CONSUME = function (tokType, options) {\n return this.consumeInternal(tokType, 0, options);\n };\n RecognizerApi.prototype.CONSUME1 = function (tokType, options) {\n return this.consumeInternal(tokType, 1, options);\n };\n RecognizerApi.prototype.CONSUME2 = function (tokType, options) {\n return this.consumeInternal(tokType, 2, options);\n };\n RecognizerApi.prototype.CONSUME3 = function (tokType, options) {\n return this.consumeInternal(tokType, 3, options);\n };\n RecognizerApi.prototype.CONSUME4 = function (tokType, options) {\n return this.consumeInternal(tokType, 4, options);\n };\n RecognizerApi.prototype.CONSUME5 = function (tokType, options) {\n return this.consumeInternal(tokType, 5, options);\n };\n RecognizerApi.prototype.CONSUME6 = function (tokType, options) {\n return this.consumeInternal(tokType, 6, options);\n };\n RecognizerApi.prototype.CONSUME7 = function (tokType, options) {\n return this.consumeInternal(tokType, 7, options);\n };\n RecognizerApi.prototype.CONSUME8 = function (tokType, options) {\n return this.consumeInternal(tokType, 8, options);\n };\n RecognizerApi.prototype.CONSUME9 = function (tokType, options) {\n return this.consumeInternal(tokType, 9, options);\n };\n RecognizerApi.prototype.SUBRULE = function (ruleToCall, options) {\n return this.subruleInternal(ruleToCall, 0, options);\n };\n RecognizerApi.prototype.SUBRULE1 = function (ruleToCall, options) {\n return this.subruleInternal(ruleToCall, 1, options);\n };\n RecognizerApi.prototype.SUBRULE2 = function (ruleToCall, options) {\n return this.subruleInternal(ruleToCall, 2, options);\n };\n RecognizerApi.prototype.SUBRULE3 = function (ruleToCall, options) {\n return this.subruleInternal(ruleToCall, 3, options);\n };\n RecognizerApi.prototype.SUBRULE4 = function (ruleToCall, options) {\n return this.subruleInternal(ruleToCall, 4, options);\n };\n RecognizerApi.prototype.SUBRULE5 = function (ruleToCall, options) {\n return this.subruleInternal(ruleToCall, 5, options);\n };\n RecognizerApi.prototype.SUBRULE6 = function (ruleToCall, options) {\n return this.subruleInternal(ruleToCall, 6, options);\n };\n RecognizerApi.prototype.SUBRULE7 = function (ruleToCall, options) {\n return this.subruleInternal(ruleToCall, 7, options);\n };\n RecognizerApi.prototype.SUBRULE8 = function (ruleToCall, options) {\n return this.subruleInternal(ruleToCall, 8, options);\n };\n RecognizerApi.prototype.SUBRULE9 = function (ruleToCall, options) {\n return this.subruleInternal(ruleToCall, 9, options);\n };\n RecognizerApi.prototype.OPTION = function (actionORMethodDef) {\n return this.optionInternal(actionORMethodDef, 0);\n };\n RecognizerApi.prototype.OPTION1 = function (actionORMethodDef) {\n return this.optionInternal(actionORMethodDef, 1);\n };\n RecognizerApi.prototype.OPTION2 = function (actionORMethodDef) {\n return this.optionInternal(actionORMethodDef, 2);\n };\n RecognizerApi.prototype.OPTION3 = function (actionORMethodDef) {\n return this.optionInternal(actionORMethodDef, 3);\n };\n RecognizerApi.prototype.OPTION4 = function (actionORMethodDef) {\n return this.optionInternal(actionORMethodDef, 4);\n };\n RecognizerApi.prototype.OPTION5 = function (actionORMethodDef) {\n return this.optionInternal(actionORMethodDef, 5);\n };\n RecognizerApi.prototype.OPTION6 = function (actionORMethodDef) {\n return this.optionInternal(actionORMethodDef, 6);\n };\n RecognizerApi.prototype.OPTION7 = function (actionORMethodDef) {\n return this.optionInternal(actionORMethodDef, 7);\n };\n RecognizerApi.prototype.OPTION8 = function (actionORMethodDef) {\n return this.optionInternal(actionORMethodDef, 8);\n };\n RecognizerApi.prototype.OPTION9 = function (actionORMethodDef) {\n return this.optionInternal(actionORMethodDef, 9);\n };\n RecognizerApi.prototype.OR = function (altsOrOpts) {\n return this.orInternal(altsOrOpts, 0);\n };\n RecognizerApi.prototype.OR1 = function (altsOrOpts) {\n return this.orInternal(altsOrOpts, 1);\n };\n RecognizerApi.prototype.OR2 = function (altsOrOpts) {\n return this.orInternal(altsOrOpts, 2);\n };\n RecognizerApi.prototype.OR3 = function (altsOrOpts) {\n return this.orInternal(altsOrOpts, 3);\n };\n RecognizerApi.prototype.OR4 = function (altsOrOpts) {\n return this.orInternal(altsOrOpts, 4);\n };\n RecognizerApi.prototype.OR5 = function (altsOrOpts) {\n return this.orInternal(altsOrOpts, 5);\n };\n RecognizerApi.prototype.OR6 = function (altsOrOpts) {\n return this.orInternal(altsOrOpts, 6);\n };\n RecognizerApi.prototype.OR7 = function (altsOrOpts) {\n return this.orInternal(altsOrOpts, 7);\n };\n RecognizerApi.prototype.OR8 = function (altsOrOpts) {\n return this.orInternal(altsOrOpts, 8);\n };\n RecognizerApi.prototype.OR9 = function (altsOrOpts) {\n return this.orInternal(altsOrOpts, 9);\n };\n RecognizerApi.prototype.MANY = function (actionORMethodDef) {\n this.manyInternal(0, actionORMethodDef);\n };\n RecognizerApi.prototype.MANY1 = function (actionORMethodDef) {\n this.manyInternal(1, actionORMethodDef);\n };\n RecognizerApi.prototype.MANY2 = function (actionORMethodDef) {\n this.manyInternal(2, actionORMethodDef);\n };\n RecognizerApi.prototype.MANY3 = function (actionORMethodDef) {\n this.manyInternal(3, actionORMethodDef);\n };\n RecognizerApi.prototype.MANY4 = function (actionORMethodDef) {\n this.manyInternal(4, actionORMethodDef);\n };\n RecognizerApi.prototype.MANY5 = function (actionORMethodDef) {\n this.manyInternal(5, actionORMethodDef);\n };\n RecognizerApi.prototype.MANY6 = function (actionORMethodDef) {\n this.manyInternal(6, actionORMethodDef);\n };\n RecognizerApi.prototype.MANY7 = function (actionORMethodDef) {\n this.manyInternal(7, actionORMethodDef);\n };\n RecognizerApi.prototype.MANY8 = function (actionORMethodDef) {\n this.manyInternal(8, actionORMethodDef);\n };\n RecognizerApi.prototype.MANY9 = function (actionORMethodDef) {\n this.manyInternal(9, actionORMethodDef);\n };\n RecognizerApi.prototype.MANY_SEP = function (options) {\n this.manySepFirstInternal(0, options);\n };\n RecognizerApi.prototype.MANY_SEP1 = function (options) {\n this.manySepFirstInternal(1, options);\n };\n RecognizerApi.prototype.MANY_SEP2 = function (options) {\n this.manySepFirstInternal(2, options);\n };\n RecognizerApi.prototype.MANY_SEP3 = function (options) {\n this.manySepFirstInternal(3, options);\n };\n RecognizerApi.prototype.MANY_SEP4 = function (options) {\n this.manySepFirstInternal(4, options);\n };\n RecognizerApi.prototype.MANY_SEP5 = function (options) {\n this.manySepFirstInternal(5, options);\n };\n RecognizerApi.prototype.MANY_SEP6 = function (options) {\n this.manySepFirstInternal(6, options);\n };\n RecognizerApi.prototype.MANY_SEP7 = function (options) {\n this.manySepFirstInternal(7, options);\n };\n RecognizerApi.prototype.MANY_SEP8 = function (options) {\n this.manySepFirstInternal(8, options);\n };\n RecognizerApi.prototype.MANY_SEP9 = function (options) {\n this.manySepFirstInternal(9, options);\n };\n RecognizerApi.prototype.AT_LEAST_ONE = function (actionORMethodDef) {\n this.atLeastOneInternal(0, actionORMethodDef);\n };\n RecognizerApi.prototype.AT_LEAST_ONE1 = function (actionORMethodDef) {\n return this.atLeastOneInternal(1, actionORMethodDef);\n };\n RecognizerApi.prototype.AT_LEAST_ONE2 = function (actionORMethodDef) {\n this.atLeastOneInternal(2, actionORMethodDef);\n };\n RecognizerApi.prototype.AT_LEAST_ONE3 = function (actionORMethodDef) {\n this.atLeastOneInternal(3, actionORMethodDef);\n };\n RecognizerApi.prototype.AT_LEAST_ONE4 = function (actionORMethodDef) {\n this.atLeastOneInternal(4, actionORMethodDef);\n };\n RecognizerApi.prototype.AT_LEAST_ONE5 = function (actionORMethodDef) {\n this.atLeastOneInternal(5, actionORMethodDef);\n };\n RecognizerApi.prototype.AT_LEAST_ONE6 = function (actionORMethodDef) {\n this.atLeastOneInternal(6, actionORMethodDef);\n };\n RecognizerApi.prototype.AT_LEAST_ONE7 = function (actionORMethodDef) {\n this.atLeastOneInternal(7, actionORMethodDef);\n };\n RecognizerApi.prototype.AT_LEAST_ONE8 = function (actionORMethodDef) {\n this.atLeastOneInternal(8, actionORMethodDef);\n };\n RecognizerApi.prototype.AT_LEAST_ONE9 = function (actionORMethodDef) {\n this.atLeastOneInternal(9, actionORMethodDef);\n };\n RecognizerApi.prototype.AT_LEAST_ONE_SEP = function (options) {\n this.atLeastOneSepFirstInternal(0, options);\n };\n RecognizerApi.prototype.AT_LEAST_ONE_SEP1 = function (options) {\n this.atLeastOneSepFirstInternal(1, options);\n };\n RecognizerApi.prototype.AT_LEAST_ONE_SEP2 = function (options) {\n this.atLeastOneSepFirstInternal(2, options);\n };\n RecognizerApi.prototype.AT_LEAST_ONE_SEP3 = function (options) {\n this.atLeastOneSepFirstInternal(3, options);\n };\n RecognizerApi.prototype.AT_LEAST_ONE_SEP4 = function (options) {\n this.atLeastOneSepFirstInternal(4, options);\n };\n RecognizerApi.prototype.AT_LEAST_ONE_SEP5 = function (options) {\n this.atLeastOneSepFirstInternal(5, options);\n };\n RecognizerApi.prototype.AT_LEAST_ONE_SEP6 = function (options) {\n this.atLeastOneSepFirstInternal(6, options);\n };\n RecognizerApi.prototype.AT_LEAST_ONE_SEP7 = function (options) {\n this.atLeastOneSepFirstInternal(7, options);\n };\n RecognizerApi.prototype.AT_LEAST_ONE_SEP8 = function (options) {\n this.atLeastOneSepFirstInternal(8, options);\n };\n RecognizerApi.prototype.AT_LEAST_ONE_SEP9 = function (options) {\n this.atLeastOneSepFirstInternal(9, options);\n };\n RecognizerApi.prototype.RULE = function (name, implementation, config) {\n if (config === void 0) { config = parser_1.DEFAULT_RULE_CONFIG; }\n if ((0, includes_1.default)(this.definedRulesNames, name)) {\n var errMsg = errors_public_1.defaultGrammarValidatorErrorProvider.buildDuplicateRuleNameError({\n topLevelRule: name,\n grammarName: this.className\n });\n var error = {\n message: errMsg,\n type: parser_1.ParserDefinitionErrorType.DUPLICATE_RULE_NAME,\n ruleName: name\n };\n this.definitionErrors.push(error);\n }\n this.definedRulesNames.push(name);\n var ruleImplementation = this.defineRule(name, implementation, config);\n this[name] = ruleImplementation;\n return ruleImplementation;\n };\n RecognizerApi.prototype.OVERRIDE_RULE = function (name, impl, config) {\n if (config === void 0) { config = parser_1.DEFAULT_RULE_CONFIG; }\n var ruleErrors = (0, checks_1.validateRuleIsOverridden)(name, this.definedRulesNames, this.className);\n this.definitionErrors = this.definitionErrors.concat(ruleErrors);\n var ruleImplementation = this.defineRule(name, impl, config);\n this[name] = ruleImplementation;\n return ruleImplementation;\n };\n RecognizerApi.prototype.BACKTRACK = function (grammarRule, args) {\n return function () {\n // save org state\n this.isBackTrackingStack.push(1);\n var orgState = this.saveRecogState();\n try {\n grammarRule.apply(this, args);\n // if no exception was thrown we have succeed parsing the rule.\n return true;\n }\n catch (e) {\n if ((0, exceptions_public_1.isRecognitionException)(e)) {\n return false;\n }\n else {\n throw e;\n }\n }\n finally {\n this.reloadRecogState(orgState);\n this.isBackTrackingStack.pop();\n }\n };\n };\n // GAST export APIs\n RecognizerApi.prototype.getGAstProductions = function () {\n return this.gastProductionsCache;\n };\n RecognizerApi.prototype.getSerializedGastProductions = function () {\n return (0, gast_1.serializeGrammar)((0, values_1.default)(this.gastProductionsCache));\n };\n return RecognizerApi;\n}());\nexports.RecognizerApi = RecognizerApi;\n//# sourceMappingURL=recognizer_api.js.map","var assocIndexOf = require('./_assocIndexOf');\n\n/**\n * Sets the list cache `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf ListCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the list cache instance.\n */\nfunction listCacheSet(key, value) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n ++this.size;\n data.push([key, value]);\n } else {\n data[index][1] = value;\n }\n return this;\n}\n\nmodule.exports = listCacheSet;\n","/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/**\n * Adds `value` to the array cache.\n *\n * @private\n * @name add\n * @memberOf SetCache\n * @alias push\n * @param {*} value The value to cache.\n * @returns {Object} Returns the cache instance.\n */\nfunction setCacheAdd(value) {\n this.__data__.set(value, HASH_UNDEFINED);\n return this;\n}\n\nmodule.exports = setCacheAdd;\n","\"use strict\";\n/* istanbul ignore file - tricky to import some things from this module during testing */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Parser = exports.createSyntaxDiagramsCode = exports.clearCache = exports.generateCstDts = exports.GAstVisitor = exports.serializeProduction = exports.serializeGrammar = exports.Terminal = exports.Rule = exports.RepetitionWithSeparator = exports.RepetitionMandatoryWithSeparator = exports.RepetitionMandatory = exports.Repetition = exports.Option = exports.NonTerminal = exports.Alternative = exports.Alternation = exports.defaultLexerErrorProvider = exports.NoViableAltException = exports.NotAllInputParsedException = exports.MismatchedTokenException = exports.isRecognitionException = exports.EarlyExitException = exports.defaultParserErrorProvider = exports.LLkLookaheadStrategy = exports.getLookaheadPaths = exports.tokenName = exports.tokenMatcher = exports.tokenLabel = exports.EOF = exports.createTokenInstance = exports.createToken = exports.LexerDefinitionErrorType = exports.Lexer = exports.EMPTY_ALT = exports.ParserDefinitionErrorType = exports.EmbeddedActionsParser = exports.CstParser = exports.VERSION = void 0;\n// semantic version\nvar version_1 = require(\"./version\");\nObject.defineProperty(exports, \"VERSION\", { enumerable: true, get: function () { return version_1.VERSION; } });\nvar parser_1 = require(\"./parse/parser/parser\");\nObject.defineProperty(exports, \"CstParser\", { enumerable: true, get: function () { return parser_1.CstParser; } });\nObject.defineProperty(exports, \"EmbeddedActionsParser\", { enumerable: true, get: function () { return parser_1.EmbeddedActionsParser; } });\nObject.defineProperty(exports, \"ParserDefinitionErrorType\", { enumerable: true, get: function () { return parser_1.ParserDefinitionErrorType; } });\nObject.defineProperty(exports, \"EMPTY_ALT\", { enumerable: true, get: function () { return parser_1.EMPTY_ALT; } });\nvar lexer_public_1 = require(\"./scan/lexer_public\");\nObject.defineProperty(exports, \"Lexer\", { enumerable: true, get: function () { return lexer_public_1.Lexer; } });\nObject.defineProperty(exports, \"LexerDefinitionErrorType\", { enumerable: true, get: function () { return lexer_public_1.LexerDefinitionErrorType; } });\n// Tokens utilities\nvar tokens_public_1 = require(\"./scan/tokens_public\");\nObject.defineProperty(exports, \"createToken\", { enumerable: true, get: function () { return tokens_public_1.createToken; } });\nObject.defineProperty(exports, \"createTokenInstance\", { enumerable: true, get: function () { return tokens_public_1.createTokenInstance; } });\nObject.defineProperty(exports, \"EOF\", { enumerable: true, get: function () { return tokens_public_1.EOF; } });\nObject.defineProperty(exports, \"tokenLabel\", { enumerable: true, get: function () { return tokens_public_1.tokenLabel; } });\nObject.defineProperty(exports, \"tokenMatcher\", { enumerable: true, get: function () { return tokens_public_1.tokenMatcher; } });\nObject.defineProperty(exports, \"tokenName\", { enumerable: true, get: function () { return tokens_public_1.tokenName; } });\n// Lookahead\nvar lookahead_1 = require(\"./parse/grammar/lookahead\");\nObject.defineProperty(exports, \"getLookaheadPaths\", { enumerable: true, get: function () { return lookahead_1.getLookaheadPaths; } });\nvar llk_lookahead_1 = require(\"./parse/grammar/llk_lookahead\");\nObject.defineProperty(exports, \"LLkLookaheadStrategy\", { enumerable: true, get: function () { return llk_lookahead_1.LLkLookaheadStrategy; } });\n// Other Utilities\nvar errors_public_1 = require(\"./parse/errors_public\");\nObject.defineProperty(exports, \"defaultParserErrorProvider\", { enumerable: true, get: function () { return errors_public_1.defaultParserErrorProvider; } });\nvar exceptions_public_1 = require(\"./parse/exceptions_public\");\nObject.defineProperty(exports, \"EarlyExitException\", { enumerable: true, get: function () { return exceptions_public_1.EarlyExitException; } });\nObject.defineProperty(exports, \"isRecognitionException\", { enumerable: true, get: function () { return exceptions_public_1.isRecognitionException; } });\nObject.defineProperty(exports, \"MismatchedTokenException\", { enumerable: true, get: function () { return exceptions_public_1.MismatchedTokenException; } });\nObject.defineProperty(exports, \"NotAllInputParsedException\", { enumerable: true, get: function () { return exceptions_public_1.NotAllInputParsedException; } });\nObject.defineProperty(exports, \"NoViableAltException\", { enumerable: true, get: function () { return exceptions_public_1.NoViableAltException; } });\nvar lexer_errors_public_1 = require(\"./scan/lexer_errors_public\");\nObject.defineProperty(exports, \"defaultLexerErrorProvider\", { enumerable: true, get: function () { return lexer_errors_public_1.defaultLexerErrorProvider; } });\n// grammar reflection API\nvar gast_1 = require(\"@chevrotain/gast\");\nObject.defineProperty(exports, \"Alternation\", { enumerable: true, get: function () { return gast_1.Alternation; } });\nObject.defineProperty(exports, \"Alternative\", { enumerable: true, get: function () { return gast_1.Alternative; } });\nObject.defineProperty(exports, \"NonTerminal\", { enumerable: true, get: function () { return gast_1.NonTerminal; } });\nObject.defineProperty(exports, \"Option\", { enumerable: true, get: function () { return gast_1.Option; } });\nObject.defineProperty(exports, \"Repetition\", { enumerable: true, get: function () { return gast_1.Repetition; } });\nObject.defineProperty(exports, \"RepetitionMandatory\", { enumerable: true, get: function () { return gast_1.RepetitionMandatory; } });\nObject.defineProperty(exports, \"RepetitionMandatoryWithSeparator\", { enumerable: true, get: function () { return gast_1.RepetitionMandatoryWithSeparator; } });\nObject.defineProperty(exports, \"RepetitionWithSeparator\", { enumerable: true, get: function () { return gast_1.RepetitionWithSeparator; } });\nObject.defineProperty(exports, \"Rule\", { enumerable: true, get: function () { return gast_1.Rule; } });\nObject.defineProperty(exports, \"Terminal\", { enumerable: true, get: function () { return gast_1.Terminal; } });\n// GAST Utilities\nvar gast_2 = require(\"@chevrotain/gast\");\nObject.defineProperty(exports, \"serializeGrammar\", { enumerable: true, get: function () { return gast_2.serializeGrammar; } });\nObject.defineProperty(exports, \"serializeProduction\", { enumerable: true, get: function () { return gast_2.serializeProduction; } });\nObject.defineProperty(exports, \"GAstVisitor\", { enumerable: true, get: function () { return gast_2.GAstVisitor; } });\nvar cst_dts_gen_1 = require(\"@chevrotain/cst-dts-gen\");\nObject.defineProperty(exports, \"generateCstDts\", { enumerable: true, get: function () { return cst_dts_gen_1.generateCstDts; } });\n/* istanbul ignore next */\nfunction clearCache() {\n console.warn(\"The clearCache function was 'soft' removed from the Chevrotain API.\" +\n \"\\n\\t It performs no action other than printing this message.\" +\n \"\\n\\t Please avoid using it as it will be completely removed in the future\");\n}\nexports.clearCache = clearCache;\nvar render_public_1 = require(\"./diagrams/render_public\");\nObject.defineProperty(exports, \"createSyntaxDiagramsCode\", { enumerable: true, get: function () { return render_public_1.createSyntaxDiagramsCode; } });\nvar Parser = /** @class */ (function () {\n function Parser() {\n throw new Error(\"The Parser class has been deprecated, use CstParser or EmbeddedActionsParser instead.\\t\\n\" +\n \"See: https://chevrotain.io/docs/changes/BREAKING_CHANGES.html#_7-0-0\");\n }\n return Parser;\n}());\nexports.Parser = Parser;\n//# sourceMappingURL=api.js.map","var ListCache = require('./_ListCache');\n\n/**\n * Removes all key-value entries from the stack.\n *\n * @private\n * @name clear\n * @memberOf Stack\n */\nfunction stackClear() {\n this.__data__ = new ListCache;\n this.size = 0;\n}\n\nmodule.exports = stackClear;\n","var baseGetTag = require('./_baseGetTag'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar regexpTag = '[object RegExp]';\n\n/**\n * The base implementation of `_.isRegExp` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a regexp, else `false`.\n */\nfunction baseIsRegExp(value) {\n return isObjectLike(value) && baseGetTag(value) == regexpTag;\n}\n\nmodule.exports = baseIsRegExp;\n","var baseHas = require('./_baseHas'),\n hasPath = require('./_hasPath');\n\n/**\n * Checks if `path` is a direct property of `object`.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path to check.\n * @returns {boolean} Returns `true` if `path` exists, else `false`.\n * @example\n *\n * var object = { 'a': { 'b': 2 } };\n * var other = _.create({ 'a': _.create({ 'b': 2 }) });\n *\n * _.has(object, 'a');\n * // => true\n *\n * _.has(object, 'a.b');\n * // => true\n *\n * _.has(object, ['a', 'b']);\n * // => true\n *\n * _.has(other, 'a');\n * // => false\n */\nfunction has(object, path) {\n return object != null && hasPath(object, path, baseHas);\n}\n\nmodule.exports = has;\n","/**\n * Checks if `value` is in the array cache.\n *\n * @private\n * @name has\n * @memberOf SetCache\n * @param {*} value The value to search for.\n * @returns {number} Returns `true` if `value` is found, else `false`.\n */\nfunction setCacheHas(value) {\n return this.__data__.has(value);\n}\n\nmodule.exports = setCacheHas;\n","var toFinite = require('./toFinite');\n\n/**\n * Converts `value` to an integer.\n *\n * **Note:** This method is loosely based on\n * [`ToInteger`](http://www.ecma-international.org/ecma-262/7.0/#sec-tointeger).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {number} Returns the converted integer.\n * @example\n *\n * _.toInteger(3.2);\n * // => 3\n *\n * _.toInteger(Number.MIN_VALUE);\n * // => 0\n *\n * _.toInteger(Infinity);\n * // => 1.7976931348623157e+308\n *\n * _.toInteger('3.2');\n * // => 3\n */\nfunction toInteger(value) {\n var result = toFinite(value),\n remainder = result % 1;\n\n return result === result ? (remainder ? result - remainder : result) : 0;\n}\n\nmodule.exports = toInteger;\n","var hashClear = require('./_hashClear'),\n hashDelete = require('./_hashDelete'),\n hashGet = require('./_hashGet'),\n hashHas = require('./_hashHas'),\n hashSet = require('./_hashSet');\n\n/**\n * Creates a hash object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Hash(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n// Add methods to `Hash`.\nHash.prototype.clear = hashClear;\nHash.prototype['delete'] = hashDelete;\nHash.prototype.get = hashGet;\nHash.prototype.has = hashHas;\nHash.prototype.set = hashSet;\n\nmodule.exports = Hash;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.timer = void 0;\nfunction timer(func) {\n var start = new Date().getTime();\n var val = func();\n var end = new Date().getTime();\n var total = end - start;\n return { time: total, value: val };\n}\nexports.timer = timer;\n//# sourceMappingURL=timer.js.map","var baseIndexOf = require('./_baseIndexOf'),\n toInteger = require('./toInteger');\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max;\n\n/**\n * Gets the index at which the first occurrence of `value` is found in `array`\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons. If `fromIndex` is negative, it's used as the\n * offset from the end of `array`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @param {number} [fromIndex=0] The index to search from.\n * @returns {number} Returns the index of the matched value, else `-1`.\n * @example\n *\n * _.indexOf([1, 2, 1, 2], 2);\n * // => 1\n *\n * // Search from the `fromIndex`.\n * _.indexOf([1, 2, 1, 2], 2, 2);\n * // => 3\n */\nfunction indexOf(array, value, fromIndex) {\n var length = array == null ? 0 : array.length;\n if (!length) {\n return -1;\n }\n var index = fromIndex == null ? 0 : toInteger(fromIndex);\n if (index < 0) {\n index = nativeMax(length + index, 0);\n }\n return baseIndexOf(array, value, index);\n}\n\nmodule.exports = indexOf;\n","var isArray = require('./isArray'),\n isKey = require('./_isKey'),\n stringToPath = require('./_stringToPath'),\n toString = require('./toString');\n\n/**\n * Casts `value` to a path array if it's not one.\n *\n * @private\n * @param {*} value The value to inspect.\n * @param {Object} [object] The object to query keys on.\n * @returns {Array} Returns the cast property path array.\n */\nfunction castPath(value, object) {\n if (isArray(value)) {\n return value;\n }\n return isKey(value, object) ? [value] : stringToPath(toString(value));\n}\n\nmodule.exports = castPath;\n","var assignValue = require('./_assignValue'),\n baseAssignValue = require('./_baseAssignValue');\n\n/**\n * Copies properties of `source` to `object`.\n *\n * @private\n * @param {Object} source The object to copy properties from.\n * @param {Array} props The property identifiers to copy.\n * @param {Object} [object={}] The object to copy properties to.\n * @param {Function} [customizer] The function to customize copied values.\n * @returns {Object} Returns `object`.\n */\nfunction copyObject(source, props, object, customizer) {\n var isNew = !object;\n object || (object = {});\n\n var index = -1,\n length = props.length;\n\n while (++index < length) {\n var key = props[index];\n\n var newValue = customizer\n ? customizer(object[key], source[key], key, object, source)\n : undefined;\n\n if (newValue === undefined) {\n newValue = source[key];\n }\n if (isNew) {\n baseAssignValue(object, key, newValue);\n } else {\n assignValue(object, key, newValue);\n }\n }\n return object;\n}\n\nmodule.exports = copyObject;\n","var Stack = require('./_Stack'),\n baseIsEqual = require('./_baseIsEqual');\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1,\n COMPARE_UNORDERED_FLAG = 2;\n\n/**\n * The base implementation of `_.isMatch` without support for iteratee shorthands.\n *\n * @private\n * @param {Object} object The object to inspect.\n * @param {Object} source The object of property values to match.\n * @param {Array} matchData The property names, values, and compare flags to match.\n * @param {Function} [customizer] The function to customize comparisons.\n * @returns {boolean} Returns `true` if `object` is a match, else `false`.\n */\nfunction baseIsMatch(object, source, matchData, customizer) {\n var index = matchData.length,\n length = index,\n noCustomizer = !customizer;\n\n if (object == null) {\n return !length;\n }\n object = Object(object);\n while (index--) {\n var data = matchData[index];\n if ((noCustomizer && data[2])\n ? data[1] !== object[data[0]]\n : !(data[0] in object)\n ) {\n return false;\n }\n }\n while (++index < length) {\n data = matchData[index];\n var key = data[0],\n objValue = object[key],\n srcValue = data[1];\n\n if (noCustomizer && data[2]) {\n if (objValue === undefined && !(key in object)) {\n return false;\n }\n } else {\n var stack = new Stack;\n if (customizer) {\n var result = customizer(objValue, srcValue, key, object, source, stack);\n }\n if (!(result === undefined\n ? baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG, customizer, stack)\n : result\n )) {\n return false;\n }\n }\n }\n return true;\n}\n\nmodule.exports = baseIsMatch;\n","/** Used to match a single whitespace character. */\nvar reWhitespace = /\\s/;\n\n/**\n * Used by `_.trim` and `_.trimEnd` to get the index of the last non-whitespace\n * character of `string`.\n *\n * @private\n * @param {string} string The string to inspect.\n * @returns {number} Returns the index of the last non-whitespace character.\n */\nfunction trimmedEndIndex(string) {\n var index = string.length;\n\n while (index-- && reWhitespace.test(string.charAt(index))) {}\n return index;\n}\n\nmodule.exports = trimmedEndIndex;\n","var memoizeCapped = require('./_memoizeCapped');\n\n/** Used to match property names within property paths. */\nvar rePropName = /[^.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2)\\]|(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|$))/g;\n\n/** Used to match backslashes in property paths. */\nvar reEscapeChar = /\\\\(\\\\)?/g;\n\n/**\n * Converts `string` to a property path array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the property path array.\n */\nvar stringToPath = memoizeCapped(function(string) {\n var result = [];\n if (string.charCodeAt(0) === 46 /* . */) {\n result.push('');\n }\n string.replace(rePropName, function(match, number, quote, subString) {\n result.push(quote ? subString.replace(reEscapeChar, '$1') : (number || match));\n });\n return result;\n});\n\nmodule.exports = stringToPath;\n","/** Used to detect hot functions by number of calls within a span of milliseconds. */\nvar HOT_COUNT = 800,\n HOT_SPAN = 16;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeNow = Date.now;\n\n/**\n * Creates a function that'll short out and invoke `identity` instead\n * of `func` when it's called `HOT_COUNT` or more times in `HOT_SPAN`\n * milliseconds.\n *\n * @private\n * @param {Function} func The function to restrict.\n * @returns {Function} Returns the new shortable function.\n */\nfunction shortOut(func) {\n var count = 0,\n lastCalled = 0;\n\n return function() {\n var stamp = nativeNow(),\n remaining = HOT_SPAN - (stamp - lastCalled);\n\n lastCalled = stamp;\n if (remaining > 0) {\n if (++count >= HOT_COUNT) {\n return arguments[0];\n }\n } else {\n count = 0;\n }\n return func.apply(undefined, arguments);\n };\n}\n\nmodule.exports = shortOut;\n","var root = require('./_root');\n\n/** Built-in value references. */\nvar Symbol = root.Symbol;\n\nmodule.exports = Symbol;\n","var baseGetTag = require('./_baseGetTag'),\n isObject = require('./isObject');\n\n/** `Object#toString` result references. */\nvar asyncTag = '[object AsyncFunction]',\n funcTag = '[object Function]',\n genTag = '[object GeneratorFunction]',\n proxyTag = '[object Proxy]';\n\n/**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\nfunction isFunction(value) {\n if (!isObject(value)) {\n return false;\n }\n // The use of `Object#toString` avoids issues with the `typeof` operator\n // in Safari 9 which returns 'object' for typed arrays and other constructors.\n var tag = baseGetTag(value);\n return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;\n}\n\nmodule.exports = isFunction;\n","/**\n * Available cell events.\n */\nexport enum CellEvent {\n VALUE_CHANGED = 'value.changed',\n FORMULA_CHANGED = 'fomula.changed',\n FORMULA_CALCULATED = 'formula.calculated',\n CALCULATED = 'calculated',\n\n ELEMENT_MOUNTED = 'element.mounted',\n}\n","var cloneArrayBuffer = require('./_cloneArrayBuffer');\n\n/**\n * Creates a clone of `typedArray`.\n *\n * @private\n * @param {Object} typedArray The typed array to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the cloned typed array.\n */\nfunction cloneTypedArray(typedArray, isDeep) {\n var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer;\n return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length);\n}\n\nmodule.exports = cloneTypedArray;\n","var Symbol = require('./_Symbol'),\n Uint8Array = require('./_Uint8Array'),\n eq = require('./eq'),\n equalArrays = require('./_equalArrays'),\n mapToArray = require('./_mapToArray'),\n setToArray = require('./_setToArray');\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1,\n COMPARE_UNORDERED_FLAG = 2;\n\n/** `Object#toString` result references. */\nvar boolTag = '[object Boolean]',\n dateTag = '[object Date]',\n errorTag = '[object Error]',\n mapTag = '[object Map]',\n numberTag = '[object Number]',\n regexpTag = '[object RegExp]',\n setTag = '[object Set]',\n stringTag = '[object String]',\n symbolTag = '[object Symbol]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n dataViewTag = '[object DataView]';\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n symbolValueOf = symbolProto ? symbolProto.valueOf : undefined;\n\n/**\n * A specialized version of `baseIsEqualDeep` for comparing objects of\n * the same `toStringTag`.\n *\n * **Note:** This function only supports comparing values with tags of\n * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {string} tag The `toStringTag` of the objects to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) {\n switch (tag) {\n case dataViewTag:\n if ((object.byteLength != other.byteLength) ||\n (object.byteOffset != other.byteOffset)) {\n return false;\n }\n object = object.buffer;\n other = other.buffer;\n\n case arrayBufferTag:\n if ((object.byteLength != other.byteLength) ||\n !equalFunc(new Uint8Array(object), new Uint8Array(other))) {\n return false;\n }\n return true;\n\n case boolTag:\n case dateTag:\n case numberTag:\n // Coerce booleans to `1` or `0` and dates to milliseconds.\n // Invalid dates are coerced to `NaN`.\n return eq(+object, +other);\n\n case errorTag:\n return object.name == other.name && object.message == other.message;\n\n case regexpTag:\n case stringTag:\n // Coerce regexes to strings and treat strings, primitives and objects,\n // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring\n // for more details.\n return object == (other + '');\n\n case mapTag:\n var convert = mapToArray;\n\n case setTag:\n var isPartial = bitmask & COMPARE_PARTIAL_FLAG;\n convert || (convert = setToArray);\n\n if (object.size != other.size && !isPartial) {\n return false;\n }\n // Assume cyclic values are equal.\n var stacked = stack.get(object);\n if (stacked) {\n return stacked == other;\n }\n bitmask |= COMPARE_UNORDERED_FLAG;\n\n // Recursively compare objects (susceptible to call stack limits).\n stack.set(object, other);\n var result = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack);\n stack['delete'](object);\n return result;\n\n case symbolTag:\n if (symbolValueOf) {\n return symbolValueOf.call(object) == symbolValueOf.call(other);\n }\n }\n return false;\n}\n\nmodule.exports = equalByTag;\n","var arrayAggregator = require('./_arrayAggregator'),\n baseAggregator = require('./_baseAggregator'),\n baseIteratee = require('./_baseIteratee'),\n isArray = require('./isArray');\n\n/**\n * Creates a function like `_.groupBy`.\n *\n * @private\n * @param {Function} setter The function to set accumulator values.\n * @param {Function} [initializer] The accumulator object initializer.\n * @returns {Function} Returns the new aggregator function.\n */\nfunction createAggregator(setter, initializer) {\n return function(collection, iteratee) {\n var func = isArray(collection) ? arrayAggregator : baseAggregator,\n accumulator = initializer ? initializer() : {};\n\n return func(collection, setter, baseIteratee(iteratee, 2), accumulator);\n };\n}\n\nmodule.exports = createAggregator;\n","var baseIteratee = require('./_baseIteratee'),\n isArrayLike = require('./isArrayLike'),\n keys = require('./keys');\n\n/**\n * Creates a `_.find` or `_.findLast` function.\n *\n * @private\n * @param {Function} findIndexFunc The function to find the collection index.\n * @returns {Function} Returns the new find function.\n */\nfunction createFind(findIndexFunc) {\n return function(collection, predicate, fromIndex) {\n var iterable = Object(collection);\n if (!isArrayLike(collection)) {\n var iteratee = baseIteratee(predicate, 3);\n collection = keys(collection);\n predicate = function(key) { return iteratee(iterable[key], key, iterable); };\n }\n var index = findIndexFunc(collection, predicate, fromIndex);\n return index > -1 ? iterable[iteratee ? collection[index] : index] : undefined;\n };\n}\n\nmodule.exports = createFind;\n","var baseAssignValue = require('./_baseAssignValue'),\n createAggregator = require('./_createAggregator');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Creates an object composed of keys generated from the results of running\n * each element of `collection` thru `iteratee`. The order of grouped values\n * is determined by the order they occur in `collection`. The corresponding\n * value of each key is an array of elements responsible for generating the\n * key. The iteratee is invoked with one argument: (value).\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The iteratee to transform keys.\n * @returns {Object} Returns the composed aggregate object.\n * @example\n *\n * _.groupBy([6.1, 4.2, 6.3], Math.floor);\n * // => { '4': [4.2], '6': [6.1, 6.3] }\n *\n * // The `_.property` iteratee shorthand.\n * _.groupBy(['one', 'two', 'three'], 'length');\n * // => { '3': ['one', 'two'], '5': ['three'] }\n */\nvar groupBy = createAggregator(function(result, value, key) {\n if (hasOwnProperty.call(result, key)) {\n result[key].push(value);\n } else {\n baseAssignValue(result, key, [value]);\n }\n});\n\nmodule.exports = groupBy;\n","var nativeCreate = require('./_nativeCreate');\n\n/**\n * Removes all key-value entries from the hash.\n *\n * @private\n * @name clear\n * @memberOf Hash\n */\nfunction hashClear() {\n this.__data__ = nativeCreate ? nativeCreate(null) : {};\n this.size = 0;\n}\n\nmodule.exports = hashClear;\n","/** Used to compose unicode character classes. */\nvar rsAstralRange = '\\\\ud800-\\\\udfff',\n rsComboMarksRange = '\\\\u0300-\\\\u036f',\n reComboHalfMarksRange = '\\\\ufe20-\\\\ufe2f',\n rsComboSymbolsRange = '\\\\u20d0-\\\\u20ff',\n rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange,\n rsVarRange = '\\\\ufe0e\\\\ufe0f';\n\n/** Used to compose unicode capture groups. */\nvar rsAstral = '[' + rsAstralRange + ']',\n rsCombo = '[' + rsComboRange + ']',\n rsFitz = '\\\\ud83c[\\\\udffb-\\\\udfff]',\n rsModifier = '(?:' + rsCombo + '|' + rsFitz + ')',\n rsNonAstral = '[^' + rsAstralRange + ']',\n rsRegional = '(?:\\\\ud83c[\\\\udde6-\\\\uddff]){2}',\n rsSurrPair = '[\\\\ud800-\\\\udbff][\\\\udc00-\\\\udfff]',\n rsZWJ = '\\\\u200d';\n\n/** Used to compose unicode regexes. */\nvar reOptMod = rsModifier + '?',\n rsOptVar = '[' + rsVarRange + ']?',\n rsOptJoin = '(?:' + rsZWJ + '(?:' + [rsNonAstral, rsRegional, rsSurrPair].join('|') + ')' + rsOptVar + reOptMod + ')*',\n rsSeq = rsOptVar + reOptMod + rsOptJoin,\n rsSymbol = '(?:' + [rsNonAstral + rsCombo + '?', rsCombo, rsRegional, rsSurrPair, rsAstral].join('|') + ')';\n\n/** Used to match [string symbols](https://mathiasbynens.be/notes/javascript-unicode). */\nvar reUnicode = RegExp(rsFitz + '(?=' + rsFitz + ')|' + rsSymbol + rsSeq, 'g');\n\n/**\n * Converts a Unicode `string` to an array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the converted array.\n */\nfunction unicodeToArray(string) {\n return string.match(reUnicode) || [];\n}\n\nmodule.exports = unicodeToArray;\n","\"use strict\";\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.collectMethods = exports.LooksAhead = void 0;\nvar forEach_1 = __importDefault(require(\"lodash/forEach\"));\nvar has_1 = __importDefault(require(\"lodash/has\"));\nvar parser_1 = require(\"../parser\");\nvar keys_1 = require(\"../../grammar/keys\");\nvar gast_1 = require(\"@chevrotain/gast\");\nvar gast_2 = require(\"@chevrotain/gast\");\nvar llk_lookahead_1 = require(\"../../grammar/llk_lookahead\");\n/**\n * Trait responsible for the lookahead related utilities and optimizations.\n */\nvar LooksAhead = /** @class */ (function () {\n function LooksAhead() {\n }\n LooksAhead.prototype.initLooksAhead = function (config) {\n this.dynamicTokensEnabled = (0, has_1.default)(config, \"dynamicTokensEnabled\")\n ? config.dynamicTokensEnabled // assumes end user provides the correct config value/type\n : parser_1.DEFAULT_PARSER_CONFIG.dynamicTokensEnabled;\n this.maxLookahead = (0, has_1.default)(config, \"maxLookahead\")\n ? config.maxLookahead // assumes end user provides the correct config value/type\n : parser_1.DEFAULT_PARSER_CONFIG.maxLookahead;\n this.lookaheadStrategy = (0, has_1.default)(config, \"lookaheadStrategy\")\n ? config.lookaheadStrategy // assumes end user provides the correct config value/type\n : new llk_lookahead_1.LLkLookaheadStrategy({ maxLookahead: this.maxLookahead });\n this.lookAheadFuncsCache = new Map();\n };\n LooksAhead.prototype.preComputeLookaheadFunctions = function (rules) {\n var _this = this;\n (0, forEach_1.default)(rules, function (currRule) {\n _this.TRACE_INIT(\"\".concat(currRule.name, \" Rule Lookahead\"), function () {\n var _a = collectMethods(currRule), alternation = _a.alternation, repetition = _a.repetition, option = _a.option, repetitionMandatory = _a.repetitionMandatory, repetitionMandatoryWithSeparator = _a.repetitionMandatoryWithSeparator, repetitionWithSeparator = _a.repetitionWithSeparator;\n (0, forEach_1.default)(alternation, function (currProd) {\n var prodIdx = currProd.idx === 0 ? \"\" : currProd.idx;\n _this.TRACE_INIT(\"\".concat((0, gast_2.getProductionDslName)(currProd)).concat(prodIdx), function () {\n var laFunc = _this.lookaheadStrategy.buildLookaheadForAlternation({\n prodOccurrence: currProd.idx,\n rule: currRule,\n maxLookahead: currProd.maxLookahead || _this.maxLookahead,\n hasPredicates: currProd.hasPredicates,\n dynamicTokensEnabled: _this.dynamicTokensEnabled\n });\n var key = (0, keys_1.getKeyForAutomaticLookahead)(_this.fullRuleNameToShort[currRule.name], keys_1.OR_IDX, currProd.idx);\n _this.setLaFuncCache(key, laFunc);\n });\n });\n (0, forEach_1.default)(repetition, function (currProd) {\n _this.computeLookaheadFunc(currRule, currProd.idx, keys_1.MANY_IDX, \"Repetition\", currProd.maxLookahead, (0, gast_2.getProductionDslName)(currProd));\n });\n (0, forEach_1.default)(option, function (currProd) {\n _this.computeLookaheadFunc(currRule, currProd.idx, keys_1.OPTION_IDX, \"Option\", currProd.maxLookahead, (0, gast_2.getProductionDslName)(currProd));\n });\n (0, forEach_1.default)(repetitionMandatory, function (currProd) {\n _this.computeLookaheadFunc(currRule, currProd.idx, keys_1.AT_LEAST_ONE_IDX, \"RepetitionMandatory\", currProd.maxLookahead, (0, gast_2.getProductionDslName)(currProd));\n });\n (0, forEach_1.default)(repetitionMandatoryWithSeparator, function (currProd) {\n _this.computeLookaheadFunc(currRule, currProd.idx, keys_1.AT_LEAST_ONE_SEP_IDX, \"RepetitionMandatoryWithSeparator\", currProd.maxLookahead, (0, gast_2.getProductionDslName)(currProd));\n });\n (0, forEach_1.default)(repetitionWithSeparator, function (currProd) {\n _this.computeLookaheadFunc(currRule, currProd.idx, keys_1.MANY_SEP_IDX, \"RepetitionWithSeparator\", currProd.maxLookahead, (0, gast_2.getProductionDslName)(currProd));\n });\n });\n });\n };\n LooksAhead.prototype.computeLookaheadFunc = function (rule, prodOccurrence, prodKey, prodType, prodMaxLookahead, dslMethodName) {\n var _this = this;\n this.TRACE_INIT(\"\".concat(dslMethodName).concat(prodOccurrence === 0 ? \"\" : prodOccurrence), function () {\n var laFunc = _this.lookaheadStrategy.buildLookaheadForOptional({\n prodOccurrence: prodOccurrence,\n rule: rule,\n maxLookahead: prodMaxLookahead || _this.maxLookahead,\n dynamicTokensEnabled: _this.dynamicTokensEnabled,\n prodType: prodType\n });\n var key = (0, keys_1.getKeyForAutomaticLookahead)(_this.fullRuleNameToShort[rule.name], prodKey, prodOccurrence);\n _this.setLaFuncCache(key, laFunc);\n });\n };\n // this actually returns a number, but it is always used as a string (object prop key)\n LooksAhead.prototype.getKeyForAutomaticLookahead = function (dslMethodIdx, occurrence) {\n var currRuleShortName = this.getLastExplicitRuleShortName();\n return (0, keys_1.getKeyForAutomaticLookahead)(currRuleShortName, dslMethodIdx, occurrence);\n };\n LooksAhead.prototype.getLaFuncFromCache = function (key) {\n return this.lookAheadFuncsCache.get(key);\n };\n /* istanbul ignore next */\n LooksAhead.prototype.setLaFuncCache = function (key, value) {\n this.lookAheadFuncsCache.set(key, value);\n };\n return LooksAhead;\n}());\nexports.LooksAhead = LooksAhead;\nvar DslMethodsCollectorVisitor = /** @class */ (function (_super) {\n __extends(DslMethodsCollectorVisitor, _super);\n function DslMethodsCollectorVisitor() {\n var _this = _super !== null && _super.apply(this, arguments) || this;\n _this.dslMethods = {\n option: [],\n alternation: [],\n repetition: [],\n repetitionWithSeparator: [],\n repetitionMandatory: [],\n repetitionMandatoryWithSeparator: []\n };\n return _this;\n }\n DslMethodsCollectorVisitor.prototype.reset = function () {\n this.dslMethods = {\n option: [],\n alternation: [],\n repetition: [],\n repetitionWithSeparator: [],\n repetitionMandatory: [],\n repetitionMandatoryWithSeparator: []\n };\n };\n DslMethodsCollectorVisitor.prototype.visitOption = function (option) {\n this.dslMethods.option.push(option);\n };\n DslMethodsCollectorVisitor.prototype.visitRepetitionWithSeparator = function (manySep) {\n this.dslMethods.repetitionWithSeparator.push(manySep);\n };\n DslMethodsCollectorVisitor.prototype.visitRepetitionMandatory = function (atLeastOne) {\n this.dslMethods.repetitionMandatory.push(atLeastOne);\n };\n DslMethodsCollectorVisitor.prototype.visitRepetitionMandatoryWithSeparator = function (atLeastOneSep) {\n this.dslMethods.repetitionMandatoryWithSeparator.push(atLeastOneSep);\n };\n DslMethodsCollectorVisitor.prototype.visitRepetition = function (many) {\n this.dslMethods.repetition.push(many);\n };\n DslMethodsCollectorVisitor.prototype.visitAlternation = function (or) {\n this.dslMethods.alternation.push(or);\n };\n return DslMethodsCollectorVisitor;\n}(gast_1.GAstVisitor));\nvar collectorVisitor = new DslMethodsCollectorVisitor();\nfunction collectMethods(rule) {\n collectorVisitor.reset();\n rule.accept(collectorVisitor);\n var dslMethods = collectorVisitor.dslMethods;\n // avoid uncleaned references\n collectorVisitor.reset();\n return dslMethods;\n}\nexports.collectMethods = collectMethods;\n//# sourceMappingURL=looksahead.js.map","\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.PerformanceTracer = void 0;\nvar has_1 = __importDefault(require(\"lodash/has\"));\nvar utils_1 = require(\"@chevrotain/utils\");\nvar parser_1 = require(\"../parser\");\n/**\n * Trait responsible for runtime parsing errors.\n */\nvar PerformanceTracer = /** @class */ (function () {\n function PerformanceTracer() {\n }\n PerformanceTracer.prototype.initPerformanceTracer = function (config) {\n if ((0, has_1.default)(config, \"traceInitPerf\")) {\n var userTraceInitPerf = config.traceInitPerf;\n var traceIsNumber = typeof userTraceInitPerf === \"number\";\n this.traceInitMaxIdent = traceIsNumber\n ? userTraceInitPerf\n : Infinity;\n this.traceInitPerf = traceIsNumber\n ? userTraceInitPerf > 0\n : userTraceInitPerf; // assumes end user provides the correct config value/type\n }\n else {\n this.traceInitMaxIdent = 0;\n this.traceInitPerf = parser_1.DEFAULT_PARSER_CONFIG.traceInitPerf;\n }\n this.traceInitIndent = -1;\n };\n PerformanceTracer.prototype.TRACE_INIT = function (phaseDesc, phaseImpl) {\n // No need to optimize this using NOOP pattern because\n // It is not called in a hot spot...\n if (this.traceInitPerf === true) {\n this.traceInitIndent++;\n var indent = new Array(this.traceInitIndent + 1).join(\"\\t\");\n if (this.traceInitIndent < this.traceInitMaxIdent) {\n console.log(\"\".concat(indent, \"--> <\").concat(phaseDesc, \">\"));\n }\n var _a = (0, utils_1.timer)(phaseImpl), time = _a.time, value = _a.value;\n /* istanbul ignore next - Difficult to reproduce specific performance behavior (>10ms) in tests */\n var traceMethod = time > 10 ? console.warn : console.log;\n if (this.traceInitIndent < this.traceInitMaxIdent) {\n traceMethod(\"\".concat(indent, \"<-- <\").concat(phaseDesc, \"> time: \").concat(time, \"ms\"));\n }\n this.traceInitIndent--;\n return value;\n }\n else {\n return phaseImpl();\n }\n };\n return PerformanceTracer;\n}());\nexports.PerformanceTracer = PerformanceTracer;\n//# sourceMappingURL=perf_tracer.js.map","var baseKeys = require('./_baseKeys'),\n getTag = require('./_getTag'),\n isArguments = require('./isArguments'),\n isArray = require('./isArray'),\n isArrayLike = require('./isArrayLike'),\n isBuffer = require('./isBuffer'),\n isPrototype = require('./_isPrototype'),\n isTypedArray = require('./isTypedArray');\n\n/** `Object#toString` result references. */\nvar mapTag = '[object Map]',\n setTag = '[object Set]';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Checks if `value` is an empty object, collection, map, or set.\n *\n * Objects are considered empty if they have no own enumerable string keyed\n * properties.\n *\n * Array-like values such as `arguments` objects, arrays, buffers, strings, or\n * jQuery-like collections are considered empty if they have a `length` of `0`.\n * Similarly, maps and sets are considered empty if they have a `size` of `0`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is empty, else `false`.\n * @example\n *\n * _.isEmpty(null);\n * // => true\n *\n * _.isEmpty(true);\n * // => true\n *\n * _.isEmpty(1);\n * // => true\n *\n * _.isEmpty([1, 2, 3]);\n * // => false\n *\n * _.isEmpty({ 'a': 1 });\n * // => false\n */\nfunction isEmpty(value) {\n if (value == null) {\n return true;\n }\n if (isArrayLike(value) &&\n (isArray(value) || typeof value == 'string' || typeof value.splice == 'function' ||\n isBuffer(value) || isTypedArray(value) || isArguments(value))) {\n return !value.length;\n }\n var tag = getTag(value);\n if (tag == mapTag || tag == setTag) {\n return !value.size;\n }\n if (isPrototype(value)) {\n return !baseKeys(value).length;\n }\n for (var key in value) {\n if (hasOwnProperty.call(value, key)) {\n return false;\n }\n }\n return true;\n}\n\nmodule.exports = isEmpty;\n","\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.firstForTerminal = exports.firstForBranching = exports.firstForSequence = exports.first = void 0;\nvar flatten_1 = __importDefault(require(\"lodash/flatten\"));\nvar uniq_1 = __importDefault(require(\"lodash/uniq\"));\nvar map_1 = __importDefault(require(\"lodash/map\"));\nvar gast_1 = require(\"@chevrotain/gast\");\nvar gast_2 = require(\"@chevrotain/gast\");\nfunction first(prod) {\n /* istanbul ignore else */\n if (prod instanceof gast_1.NonTerminal) {\n // this could in theory cause infinite loops if\n // (1) prod A refs prod B.\n // (2) prod B refs prod A\n // (3) AB can match the empty set\n // in other words a cycle where everything is optional so the first will keep\n // looking ahead for the next optional part and will never exit\n // currently there is no safeguard for this unique edge case because\n // (1) not sure a grammar in which this can happen is useful for anything (productive)\n return first(prod.referencedRule);\n }\n else if (prod instanceof gast_1.Terminal) {\n return firstForTerminal(prod);\n }\n else if ((0, gast_2.isSequenceProd)(prod)) {\n return firstForSequence(prod);\n }\n else if ((0, gast_2.isBranchingProd)(prod)) {\n return firstForBranching(prod);\n }\n else {\n throw Error(\"non exhaustive match\");\n }\n}\nexports.first = first;\nfunction firstForSequence(prod) {\n var firstSet = [];\n var seq = prod.definition;\n var nextSubProdIdx = 0;\n var hasInnerProdsRemaining = seq.length > nextSubProdIdx;\n var currSubProd;\n // so we enter the loop at least once (if the definition is not empty\n var isLastInnerProdOptional = true;\n // scan a sequence until it's end or until we have found a NONE optional production in it\n while (hasInnerProdsRemaining && isLastInnerProdOptional) {\n currSubProd = seq[nextSubProdIdx];\n isLastInnerProdOptional = (0, gast_2.isOptionalProd)(currSubProd);\n firstSet = firstSet.concat(first(currSubProd));\n nextSubProdIdx = nextSubProdIdx + 1;\n hasInnerProdsRemaining = seq.length > nextSubProdIdx;\n }\n return (0, uniq_1.default)(firstSet);\n}\nexports.firstForSequence = firstForSequence;\nfunction firstForBranching(prod) {\n var allAlternativesFirsts = (0, map_1.default)(prod.definition, function (innerProd) {\n return first(innerProd);\n });\n return (0, uniq_1.default)((0, flatten_1.default)(allAlternativesFirsts));\n}\nexports.firstForBranching = firstForBranching;\nfunction firstForTerminal(terminal) {\n return [terminal.terminalType];\n}\nexports.firstForTerminal = firstForTerminal;\n//# sourceMappingURL=first.js.map","var arrayPush = require('./_arrayPush'),\n isArray = require('./isArray');\n\n/**\n * The base implementation of `getAllKeys` and `getAllKeysIn` which uses\n * `keysFunc` and `symbolsFunc` to get the enumerable property names and\n * symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Function} keysFunc The function to get the keys of `object`.\n * @param {Function} symbolsFunc The function to get the symbols of `object`.\n * @returns {Array} Returns the array of property names and symbols.\n */\nfunction baseGetAllKeys(object, keysFunc, symbolsFunc) {\n var result = keysFunc(object);\n return isArray(object) ? result : arrayPush(result, symbolsFunc(object));\n}\n\nmodule.exports = baseGetAllKeys;\n","/**\n * Checks if `value` is `undefined`.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is `undefined`, else `false`.\n * @example\n *\n * _.isUndefined(void 0);\n * // => true\n *\n * _.isUndefined(null);\n * // => false\n */\nfunction isUndefined(value) {\n return value === undefined;\n}\n\nmodule.exports = isUndefined;\n","var memoize = require('./memoize');\n\n/** Used as the maximum memoize cache size. */\nvar MAX_MEMOIZE_SIZE = 500;\n\n/**\n * A specialized version of `_.memoize` which clears the memoized function's\n * cache when it exceeds `MAX_MEMOIZE_SIZE`.\n *\n * @private\n * @param {Function} func The function to have its output memoized.\n * @returns {Function} Returns the new memoized function.\n */\nfunction memoizeCapped(func) {\n var result = memoize(func, function(key) {\n if (cache.size === MAX_MEMOIZE_SIZE) {\n cache.clear();\n }\n return key;\n });\n\n var cache = result.cache;\n return result;\n}\n\nmodule.exports = memoizeCapped;\n","var copyObject = require('./_copyObject'),\n getSymbols = require('./_getSymbols');\n\n/**\n * Copies own symbols of `source` to `object`.\n *\n * @private\n * @param {Object} source The object to copy symbols from.\n * @param {Object} [object={}] The object to copy symbols to.\n * @returns {Object} Returns `object`.\n */\nfunction copySymbols(source, object) {\n return copyObject(source, getSymbols(source), object);\n}\n\nmodule.exports = copySymbols;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.PRINT_WARNING = exports.PRINT_ERROR = void 0;\nfunction PRINT_ERROR(msg) {\n /* istanbul ignore else - can't override global.console in node.js */\n if (console && console.error) {\n console.error(\"Error: \".concat(msg));\n }\n}\nexports.PRINT_ERROR = PRINT_ERROR;\nfunction PRINT_WARNING(msg) {\n /* istanbul ignore else - can't override global.console in node.js*/\n if (console && console.warn) {\n // TODO: modify docs accordingly\n console.warn(\"Warning: \".concat(msg));\n }\n}\nexports.PRINT_WARNING = PRINT_WARNING;\n//# sourceMappingURL=print.js.map","\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.GastRecorder = void 0;\nvar last_1 = __importDefault(require(\"lodash/last\"));\nvar isArray_1 = __importDefault(require(\"lodash/isArray\"));\nvar some_1 = __importDefault(require(\"lodash/some\"));\nvar forEach_1 = __importDefault(require(\"lodash/forEach\"));\nvar isFunction_1 = __importDefault(require(\"lodash/isFunction\"));\nvar has_1 = __importDefault(require(\"lodash/has\"));\nvar gast_1 = require(\"@chevrotain/gast\");\nvar lexer_public_1 = require(\"../../../scan/lexer_public\");\nvar tokens_1 = require(\"../../../scan/tokens\");\nvar tokens_public_1 = require(\"../../../scan/tokens_public\");\nvar parser_1 = require(\"../parser\");\nvar keys_1 = require(\"../../grammar/keys\");\nvar RECORDING_NULL_OBJECT = {\n description: \"This Object indicates the Parser is during Recording Phase\"\n};\nObject.freeze(RECORDING_NULL_OBJECT);\nvar HANDLE_SEPARATOR = true;\nvar MAX_METHOD_IDX = Math.pow(2, keys_1.BITS_FOR_OCCURRENCE_IDX) - 1;\nvar RFT = (0, tokens_public_1.createToken)({ name: \"RECORDING_PHASE_TOKEN\", pattern: lexer_public_1.Lexer.NA });\n(0, tokens_1.augmentTokenTypes)([RFT]);\nvar RECORDING_PHASE_TOKEN = (0, tokens_public_1.createTokenInstance)(RFT, \"This IToken indicates the Parser is in Recording Phase\\n\\t\" +\n \"\" +\n \"See: https://chevrotain.io/docs/guide/internals.html#grammar-recording for details\", \n// Using \"-1\" instead of NaN (as in EOF) because an actual number is less likely to\n// cause errors if the output of LA or CONSUME would be (incorrectly) used during the recording phase.\n-1, -1, -1, -1, -1, -1);\nObject.freeze(RECORDING_PHASE_TOKEN);\nvar RECORDING_PHASE_CSTNODE = {\n name: \"This CSTNode indicates the Parser is in Recording Phase\\n\\t\" +\n \"See: https://chevrotain.io/docs/guide/internals.html#grammar-recording for details\",\n children: {}\n};\n/**\n * This trait handles the creation of the GAST structure for Chevrotain Grammars\n */\nvar GastRecorder = /** @class */ (function () {\n function GastRecorder() {\n }\n GastRecorder.prototype.initGastRecorder = function (config) {\n this.recordingProdStack = [];\n this.RECORDING_PHASE = false;\n };\n GastRecorder.prototype.enableRecording = function () {\n var _this = this;\n this.RECORDING_PHASE = true;\n this.TRACE_INIT(\"Enable Recording\", function () {\n var _loop_1 = function (i) {\n var idx = i > 0 ? i : \"\";\n _this[\"CONSUME\".concat(idx)] = function (arg1, arg2) {\n return this.consumeInternalRecord(arg1, i, arg2);\n };\n _this[\"SUBRULE\".concat(idx)] = function (arg1, arg2) {\n return this.subruleInternalRecord(arg1, i, arg2);\n };\n _this[\"OPTION\".concat(idx)] = function (arg1) {\n return this.optionInternalRecord(arg1, i);\n };\n _this[\"OR\".concat(idx)] = function (arg1) {\n return this.orInternalRecord(arg1, i);\n };\n _this[\"MANY\".concat(idx)] = function (arg1) {\n this.manyInternalRecord(i, arg1);\n };\n _this[\"MANY_SEP\".concat(idx)] = function (arg1) {\n this.manySepFirstInternalRecord(i, arg1);\n };\n _this[\"AT_LEAST_ONE\".concat(idx)] = function (arg1) {\n this.atLeastOneInternalRecord(i, arg1);\n };\n _this[\"AT_LEAST_ONE_SEP\".concat(idx)] = function (arg1) {\n this.atLeastOneSepFirstInternalRecord(i, arg1);\n };\n };\n /**\n * Warning Dark Voodoo Magic upcoming!\n * We are \"replacing\" the public parsing DSL methods API\n * With **new** alternative implementations on the Parser **instance**\n *\n * So far this is the only way I've found to avoid performance regressions during parsing time.\n * - Approx 30% performance regression was measured on Chrome 75 Canary when attempting to replace the \"internal\"\n * implementations directly instead.\n */\n for (var i = 0; i < 10; i++) {\n _loop_1(i);\n }\n // DSL methods with the idx(suffix) as an argument\n _this[\"consume\"] = function (idx, arg1, arg2) {\n return this.consumeInternalRecord(arg1, idx, arg2);\n };\n _this[\"subrule\"] = function (idx, arg1, arg2) {\n return this.subruleInternalRecord(arg1, idx, arg2);\n };\n _this[\"option\"] = function (idx, arg1) {\n return this.optionInternalRecord(arg1, idx);\n };\n _this[\"or\"] = function (idx, arg1) {\n return this.orInternalRecord(arg1, idx);\n };\n _this[\"many\"] = function (idx, arg1) {\n this.manyInternalRecord(idx, arg1);\n };\n _this[\"atLeastOne\"] = function (idx, arg1) {\n this.atLeastOneInternalRecord(idx, arg1);\n };\n _this.ACTION = _this.ACTION_RECORD;\n _this.BACKTRACK = _this.BACKTRACK_RECORD;\n _this.LA = _this.LA_RECORD;\n });\n };\n GastRecorder.prototype.disableRecording = function () {\n var _this = this;\n this.RECORDING_PHASE = false;\n // By deleting these **instance** properties, any future invocation\n // will be deferred to the original methods on the **prototype** object\n // This seems to get rid of any incorrect optimizations that V8 may\n // do during the recording phase.\n this.TRACE_INIT(\"Deleting Recording methods\", function () {\n var that = _this;\n for (var i = 0; i < 10; i++) {\n var idx = i > 0 ? i : \"\";\n delete that[\"CONSUME\".concat(idx)];\n delete that[\"SUBRULE\".concat(idx)];\n delete that[\"OPTION\".concat(idx)];\n delete that[\"OR\".concat(idx)];\n delete that[\"MANY\".concat(idx)];\n delete that[\"MANY_SEP\".concat(idx)];\n delete that[\"AT_LEAST_ONE\".concat(idx)];\n delete that[\"AT_LEAST_ONE_SEP\".concat(idx)];\n }\n delete that[\"consume\"];\n delete that[\"subrule\"];\n delete that[\"option\"];\n delete that[\"or\"];\n delete that[\"many\"];\n delete that[\"atLeastOne\"];\n delete that.ACTION;\n delete that.BACKTRACK;\n delete that.LA;\n });\n };\n // Parser methods are called inside an ACTION?\n // Maybe try/catch/finally on ACTIONS while disabling the recorders state changes?\n // @ts-expect-error -- noop place holder\n GastRecorder.prototype.ACTION_RECORD = function (impl) {\n // NO-OP during recording\n };\n // Executing backtracking logic will break our recording logic assumptions\n GastRecorder.prototype.BACKTRACK_RECORD = function (grammarRule, args) {\n return function () { return true; };\n };\n // LA is part of the official API and may be used for custom lookahead logic\n // by end users who may forget to wrap it in ACTION or inside a GATE\n GastRecorder.prototype.LA_RECORD = function (howMuch) {\n // We cannot use the RECORD_PHASE_TOKEN here because someone may depend\n // On LA return EOF at the end of the input so an infinite loop may occur.\n return parser_1.END_OF_FILE;\n };\n GastRecorder.prototype.topLevelRuleRecord = function (name, def) {\n try {\n var newTopLevelRule = new gast_1.Rule({ definition: [], name: name });\n newTopLevelRule.name = name;\n this.recordingProdStack.push(newTopLevelRule);\n def.call(this);\n this.recordingProdStack.pop();\n return newTopLevelRule;\n }\n catch (originalError) {\n if (originalError.KNOWN_RECORDER_ERROR !== true) {\n try {\n originalError.message =\n originalError.message +\n '\\n\\t This error was thrown during the \"grammar recording phase\" For more info see:\\n\\t' +\n \"https://chevrotain.io/docs/guide/internals.html#grammar-recording\";\n }\n catch (mutabilityError) {\n // We may not be able to modify the original error object\n throw originalError;\n }\n }\n throw originalError;\n }\n };\n // Implementation of parsing DSL\n GastRecorder.prototype.optionInternalRecord = function (actionORMethodDef, occurrence) {\n return recordProd.call(this, gast_1.Option, actionORMethodDef, occurrence);\n };\n GastRecorder.prototype.atLeastOneInternalRecord = function (occurrence, actionORMethodDef) {\n recordProd.call(this, gast_1.RepetitionMandatory, actionORMethodDef, occurrence);\n };\n GastRecorder.prototype.atLeastOneSepFirstInternalRecord = function (occurrence, options) {\n recordProd.call(this, gast_1.RepetitionMandatoryWithSeparator, options, occurrence, HANDLE_SEPARATOR);\n };\n GastRecorder.prototype.manyInternalRecord = function (occurrence, actionORMethodDef) {\n recordProd.call(this, gast_1.Repetition, actionORMethodDef, occurrence);\n };\n GastRecorder.prototype.manySepFirstInternalRecord = function (occurrence, options) {\n recordProd.call(this, gast_1.RepetitionWithSeparator, options, occurrence, HANDLE_SEPARATOR);\n };\n GastRecorder.prototype.orInternalRecord = function (altsOrOpts, occurrence) {\n return recordOrProd.call(this, altsOrOpts, occurrence);\n };\n GastRecorder.prototype.subruleInternalRecord = function (ruleToCall, occurrence, options) {\n assertMethodIdxIsValid(occurrence);\n if (!ruleToCall || (0, has_1.default)(ruleToCall, \"ruleName\") === false) {\n var error = new Error(\" argument is invalid\") +\n \" expecting a Parser method reference but got: <\".concat(JSON.stringify(ruleToCall), \">\") +\n \"\\n inside top level rule: <\".concat(this.recordingProdStack[0].name, \">\"));\n error.KNOWN_RECORDER_ERROR = true;\n throw error;\n }\n var prevProd = (0, last_1.default)(this.recordingProdStack);\n var ruleName = ruleToCall.ruleName;\n var newNoneTerminal = new gast_1.NonTerminal({\n idx: occurrence,\n nonTerminalName: ruleName,\n label: options === null || options === void 0 ? void 0 : options.LABEL,\n // The resolving of the `referencedRule` property will be done once all the Rule's GASTs have been created\n referencedRule: undefined\n });\n prevProd.definition.push(newNoneTerminal);\n return this.outputCst ? RECORDING_PHASE_CSTNODE : RECORDING_NULL_OBJECT;\n };\n GastRecorder.prototype.consumeInternalRecord = function (tokType, occurrence, options) {\n assertMethodIdxIsValid(occurrence);\n if (!(0, tokens_1.hasShortKeyProperty)(tokType)) {\n var error = new Error(\" argument is invalid\") +\n \" expecting a TokenType reference but got: <\".concat(JSON.stringify(tokType), \">\") +\n \"\\n inside top level rule: <\".concat(this.recordingProdStack[0].name, \">\"));\n error.KNOWN_RECORDER_ERROR = true;\n throw error;\n }\n var prevProd = (0, last_1.default)(this.recordingProdStack);\n var newNoneTerminal = new gast_1.Terminal({\n idx: occurrence,\n terminalType: tokType,\n label: options === null || options === void 0 ? void 0 : options.LABEL\n });\n prevProd.definition.push(newNoneTerminal);\n return RECORDING_PHASE_TOKEN;\n };\n return GastRecorder;\n}());\nexports.GastRecorder = GastRecorder;\nfunction recordProd(prodConstructor, mainProdArg, occurrence, handleSep) {\n if (handleSep === void 0) { handleSep = false; }\n assertMethodIdxIsValid(occurrence);\n var prevProd = (0, last_1.default)(this.recordingProdStack);\n var grammarAction = (0, isFunction_1.default)(mainProdArg) ? mainProdArg : mainProdArg.DEF;\n var newProd = new prodConstructor({ definition: [], idx: occurrence });\n if (handleSep) {\n newProd.separator = mainProdArg.SEP;\n }\n if ((0, has_1.default)(mainProdArg, \"MAX_LOOKAHEAD\")) {\n newProd.maxLookahead = mainProdArg.MAX_LOOKAHEAD;\n }\n this.recordingProdStack.push(newProd);\n grammarAction.call(this);\n prevProd.definition.push(newProd);\n this.recordingProdStack.pop();\n return RECORDING_NULL_OBJECT;\n}\nfunction recordOrProd(mainProdArg, occurrence) {\n var _this = this;\n assertMethodIdxIsValid(occurrence);\n var prevProd = (0, last_1.default)(this.recordingProdStack);\n // Only an array of alternatives\n var hasOptions = (0, isArray_1.default)(mainProdArg) === false;\n var alts = hasOptions === false ? mainProdArg : mainProdArg.DEF;\n var newOrProd = new gast_1.Alternation({\n definition: [],\n idx: occurrence,\n ignoreAmbiguities: hasOptions && mainProdArg.IGNORE_AMBIGUITIES === true\n });\n if ((0, has_1.default)(mainProdArg, \"MAX_LOOKAHEAD\")) {\n newOrProd.maxLookahead = mainProdArg.MAX_LOOKAHEAD;\n }\n var hasPredicates = (0, some_1.default)(alts, function (currAlt) { return (0, isFunction_1.default)(currAlt.GATE); });\n newOrProd.hasPredicates = hasPredicates;\n prevProd.definition.push(newOrProd);\n (0, forEach_1.default)(alts, function (currAlt) {\n var currAltFlat = new gast_1.Alternative({ definition: [] });\n newOrProd.definition.push(currAltFlat);\n if ((0, has_1.default)(currAlt, \"IGNORE_AMBIGUITIES\")) {\n currAltFlat.ignoreAmbiguities = currAlt.IGNORE_AMBIGUITIES; // assumes end user provides the correct config value/type\n }\n // **implicit** ignoreAmbiguities due to usage of gate\n else if ((0, has_1.default)(currAlt, \"GATE\")) {\n currAltFlat.ignoreAmbiguities = true;\n }\n _this.recordingProdStack.push(currAltFlat);\n currAlt.ALT.call(_this);\n _this.recordingProdStack.pop();\n });\n return RECORDING_NULL_OBJECT;\n}\nfunction getIdxSuffix(idx) {\n return idx === 0 ? \"\" : \"\".concat(idx);\n}\nfunction assertMethodIdxIsValid(idx) {\n if (idx < 0 || idx > MAX_METHOD_IDX) {\n var error = new Error(\n // The stack trace will contain all the needed details\n \"Invalid DSL Method idx value: <\".concat(idx, \">\\n\\t\") +\n \"Idx value must be a none negative value smaller than \".concat(MAX_METHOD_IDX + 1));\n error.KNOWN_RECORDER_ERROR = true;\n throw error;\n }\n}\n//# sourceMappingURL=gast_recorder.js.map","var arraySome = require('./_arraySome'),\n baseIteratee = require('./_baseIteratee'),\n baseSome = require('./_baseSome'),\n isArray = require('./isArray'),\n isIterateeCall = require('./_isIterateeCall');\n\n/**\n * Checks if `predicate` returns truthy for **any** element of `collection`.\n * Iteration is stopped once `predicate` returns truthy. The predicate is\n * invoked with three arguments: (value, index|key, collection).\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {boolean} Returns `true` if any element passes the predicate check,\n * else `false`.\n * @example\n *\n * _.some([null, 0, 'yes', false], Boolean);\n * // => true\n *\n * var users = [\n * { 'user': 'barney', 'active': true },\n * { 'user': 'fred', 'active': false }\n * ];\n *\n * // The `_.matches` iteratee shorthand.\n * _.some(users, { 'user': 'barney', 'active': false });\n * // => false\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.some(users, ['active', false]);\n * // => true\n *\n * // The `_.property` iteratee shorthand.\n * _.some(users, 'active');\n * // => true\n */\nfunction some(collection, predicate, guard) {\n var func = isArray(collection) ? arraySome : baseSome;\n if (guard && isIterateeCall(collection, predicate, guard)) {\n predicate = undefined;\n }\n return func(collection, baseIteratee(predicate, 3));\n}\n\nmodule.exports = some;\n","var baseIsArguments = require('./_baseIsArguments'),\n isObjectLike = require('./isObjectLike');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Built-in value references. */\nvar propertyIsEnumerable = objectProto.propertyIsEnumerable;\n\n/**\n * Checks if `value` is likely an `arguments` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n * else `false`.\n * @example\n *\n * _.isArguments(function() { return arguments; }());\n * // => true\n *\n * _.isArguments([1, 2, 3]);\n * // => false\n */\nvar isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {\n return isObjectLike(value) && hasOwnProperty.call(value, 'callee') &&\n !propertyIsEnumerable.call(value, 'callee');\n};\n\nmodule.exports = isArguments;\n","var baseEach = require('./_baseEach');\n\n/**\n * Aggregates elements of `collection` on `accumulator` with keys transformed\n * by `iteratee` and values set by `setter`.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} setter The function to set `accumulator` values.\n * @param {Function} iteratee The iteratee to transform keys.\n * @param {Object} accumulator The initial aggregated object.\n * @returns {Function} Returns `accumulator`.\n */\nfunction baseAggregator(collection, setter, iteratee, accumulator) {\n baseEach(collection, function(value, key, collection) {\n setter(accumulator, value, iteratee(value), collection);\n });\n return accumulator;\n}\n\nmodule.exports = baseAggregator;\n",";(function(root, factory) {\n // istanbul ignore next\n if (typeof define === \"function\" && define.amd) {\n // istanbul ignore next\n define([], factory)\n } else if (typeof module === \"object\" && module.exports) {\n module.exports = factory()\n } else {\n // istanbul ignore next\n root.regexpToAst = factory()\n }\n})(\n typeof self !== \"undefined\"\n ? // istanbul ignore next\n self\n : this,\n function() {\n // references\n // https://hackernoon.com/the-madness-of-parsing-real-world-javascript-regexps-d9ee336df983\n // https://www.ecma-international.org/ecma-262/8.0/index.html#prod-Pattern\n function RegExpParser() {}\n\n RegExpParser.prototype.saveState = function() {\n return {\n idx: this.idx,\n input: this.input,\n groupIdx: this.groupIdx\n }\n }\n\n RegExpParser.prototype.restoreState = function(newState) {\n this.idx = newState.idx\n this.input = newState.input\n this.groupIdx = newState.groupIdx\n }\n\n RegExpParser.prototype.pattern = function(input) {\n // parser state\n this.idx = 0\n this.input = input\n this.groupIdx = 0\n\n this.consumeChar(\"/\")\n var value = this.disjunction()\n this.consumeChar(\"/\")\n\n var flags = {\n type: \"Flags\",\n loc: { begin: this.idx, end: input.length },\n global: false,\n ignoreCase: false,\n multiLine: false,\n unicode: false,\n sticky: false\n }\n\n while (this.isRegExpFlag()) {\n switch (this.popChar()) {\n case \"g\":\n addFlag(flags, \"global\")\n break\n case \"i\":\n addFlag(flags, \"ignoreCase\")\n break\n case \"m\":\n addFlag(flags, \"multiLine\")\n break\n case \"u\":\n addFlag(flags, \"unicode\")\n break\n case \"y\":\n addFlag(flags, \"sticky\")\n break\n }\n }\n\n if (this.idx !== this.input.length) {\n throw Error(\n \"Redundant input: \" + this.input.substring(this.idx)\n )\n }\n return {\n type: \"Pattern\",\n flags: flags,\n value: value,\n loc: this.loc(0)\n }\n }\n\n RegExpParser.prototype.disjunction = function() {\n var alts = []\n var begin = this.idx\n\n alts.push(this.alternative())\n\n while (this.peekChar() === \"|\") {\n this.consumeChar(\"|\")\n alts.push(this.alternative())\n }\n\n return { type: \"Disjunction\", value: alts, loc: this.loc(begin) }\n }\n\n RegExpParser.prototype.alternative = function() {\n var terms = []\n var begin = this.idx\n\n while (this.isTerm()) {\n terms.push(this.term())\n }\n\n return { type: \"Alternative\", value: terms, loc: this.loc(begin) }\n }\n\n RegExpParser.prototype.term = function() {\n if (this.isAssertion()) {\n return this.assertion()\n } else {\n return this.atom()\n }\n }\n\n RegExpParser.prototype.assertion = function() {\n var begin = this.idx\n switch (this.popChar()) {\n case \"^\":\n return {\n type: \"StartAnchor\",\n loc: this.loc(begin)\n }\n case \"$\":\n return { type: \"EndAnchor\", loc: this.loc(begin) }\n // '\\b' or '\\B'\n case \"\\\\\":\n switch (this.popChar()) {\n case \"b\":\n return {\n type: \"WordBoundary\",\n loc: this.loc(begin)\n }\n case \"B\":\n return {\n type: \"NonWordBoundary\",\n loc: this.loc(begin)\n }\n }\n // istanbul ignore next\n throw Error(\"Invalid Assertion Escape\")\n // '(?=' or '(?!'\n case \"(\":\n this.consumeChar(\"?\")\n\n var type\n switch (this.popChar()) {\n case \"=\":\n type = \"Lookahead\"\n break\n case \"!\":\n type = \"NegativeLookahead\"\n break\n }\n ASSERT_EXISTS(type)\n\n var disjunction = this.disjunction()\n\n this.consumeChar(\")\")\n\n return {\n type: type,\n value: disjunction,\n loc: this.loc(begin)\n }\n }\n // istanbul ignore next\n ASSERT_NEVER_REACH_HERE()\n }\n\n RegExpParser.prototype.quantifier = function(isBacktracking) {\n var range\n var begin = this.idx\n switch (this.popChar()) {\n case \"*\":\n range = {\n atLeast: 0,\n atMost: Infinity\n }\n break\n case \"+\":\n range = {\n atLeast: 1,\n atMost: Infinity\n }\n break\n case \"?\":\n range = {\n atLeast: 0,\n atMost: 1\n }\n break\n case \"{\":\n var atLeast = this.integerIncludingZero()\n switch (this.popChar()) {\n case \"}\":\n range = {\n atLeast: atLeast,\n atMost: atLeast\n }\n break\n case \",\":\n var atMost\n if (this.isDigit()) {\n atMost = this.integerIncludingZero()\n range = {\n atLeast: atLeast,\n atMost: atMost\n }\n } else {\n range = {\n atLeast: atLeast,\n atMost: Infinity\n }\n }\n this.consumeChar(\"}\")\n break\n }\n // throwing exceptions from \"ASSERT_EXISTS\" during backtracking\n // causes severe performance degradations\n if (isBacktracking === true && range === undefined) {\n return undefined\n }\n ASSERT_EXISTS(range)\n break\n }\n\n // throwing exceptions from \"ASSERT_EXISTS\" during backtracking\n // causes severe performance degradations\n if (isBacktracking === true && range === undefined) {\n return undefined\n }\n\n ASSERT_EXISTS(range)\n\n if (this.peekChar(0) === \"?\") {\n this.consumeChar(\"?\")\n range.greedy = false\n } else {\n range.greedy = true\n }\n\n range.type = \"Quantifier\"\n range.loc = this.loc(begin)\n return range\n }\n\n RegExpParser.prototype.atom = function() {\n var atom\n var begin = this.idx\n switch (this.peekChar()) {\n case \".\":\n atom = this.dotAll()\n break\n case \"\\\\\":\n atom = this.atomEscape()\n break\n case \"[\":\n atom = this.characterClass()\n break\n case \"(\":\n atom = this.group()\n break\n }\n\n if (atom === undefined && this.isPatternCharacter()) {\n atom = this.patternCharacter()\n }\n\n ASSERT_EXISTS(atom)\n\n atom.loc = this.loc(begin)\n\n if (this.isQuantifier()) {\n atom.quantifier = this.quantifier()\n }\n\n return atom\n }\n\n RegExpParser.prototype.dotAll = function() {\n this.consumeChar(\".\")\n return {\n type: \"Set\",\n complement: true,\n value: [cc(\"\\n\"), cc(\"\\r\"), cc(\"\\u2028\"), cc(\"\\u2029\")]\n }\n }\n\n RegExpParser.prototype.atomEscape = function() {\n this.consumeChar(\"\\\\\")\n\n switch (this.peekChar()) {\n case \"1\":\n case \"2\":\n case \"3\":\n case \"4\":\n case \"5\":\n case \"6\":\n case \"7\":\n case \"8\":\n case \"9\":\n return this.decimalEscapeAtom()\n case \"d\":\n case \"D\":\n case \"s\":\n case \"S\":\n case \"w\":\n case \"W\":\n return this.characterClassEscape()\n case \"f\":\n case \"n\":\n case \"r\":\n case \"t\":\n case \"v\":\n return this.controlEscapeAtom()\n case \"c\":\n return this.controlLetterEscapeAtom()\n case \"0\":\n return this.nulCharacterAtom()\n case \"x\":\n return this.hexEscapeSequenceAtom()\n case \"u\":\n return this.regExpUnicodeEscapeSequenceAtom()\n default:\n return this.identityEscapeAtom()\n }\n }\n\n RegExpParser.prototype.decimalEscapeAtom = function() {\n var value = this.positiveInteger()\n\n return { type: \"GroupBackReference\", value: value }\n }\n\n RegExpParser.prototype.characterClassEscape = function() {\n var set\n var complement = false\n switch (this.popChar()) {\n case \"d\":\n set = digitsCharCodes\n break\n case \"D\":\n set = digitsCharCodes\n complement = true\n break\n case \"s\":\n set = whitespaceCodes\n break\n case \"S\":\n set = whitespaceCodes\n complement = true\n break\n case \"w\":\n set = wordCharCodes\n break\n case \"W\":\n set = wordCharCodes\n complement = true\n break\n }\n\n ASSERT_EXISTS(set)\n\n return { type: \"Set\", value: set, complement: complement }\n }\n\n RegExpParser.prototype.controlEscapeAtom = function() {\n var escapeCode\n switch (this.popChar()) {\n case \"f\":\n escapeCode = cc(\"\\f\")\n break\n case \"n\":\n escapeCode = cc(\"\\n\")\n break\n case \"r\":\n escapeCode = cc(\"\\r\")\n break\n case \"t\":\n escapeCode = cc(\"\\t\")\n break\n case \"v\":\n escapeCode = cc(\"\\v\")\n break\n }\n ASSERT_EXISTS(escapeCode)\n\n return { type: \"Character\", value: escapeCode }\n }\n\n RegExpParser.prototype.controlLetterEscapeAtom = function() {\n this.consumeChar(\"c\")\n var letter = this.popChar()\n if (/[a-zA-Z]/.test(letter) === false) {\n throw Error(\"Invalid \")\n }\n\n var letterCode = letter.toUpperCase().charCodeAt(0) - 64\n return { type: \"Character\", value: letterCode }\n }\n\n RegExpParser.prototype.nulCharacterAtom = function() {\n // TODO implement '[lookahead ∉ DecimalDigit]'\n // TODO: for the deprecated octal escape sequence\n this.consumeChar(\"0\")\n return { type: \"Character\", value: cc(\"\\0\") }\n }\n\n RegExpParser.prototype.hexEscapeSequenceAtom = function() {\n this.consumeChar(\"x\")\n return this.parseHexDigits(2)\n }\n\n RegExpParser.prototype.regExpUnicodeEscapeSequenceAtom = function() {\n this.consumeChar(\"u\")\n return this.parseHexDigits(4)\n }\n\n RegExpParser.prototype.identityEscapeAtom = function() {\n // TODO: implement \"SourceCharacter but not UnicodeIDContinue\"\n // // http://unicode.org/reports/tr31/#Specific_Character_Adjustments\n var escapedChar = this.popChar()\n return { type: \"Character\", value: cc(escapedChar) }\n }\n\n RegExpParser.prototype.classPatternCharacterAtom = function() {\n switch (this.peekChar()) {\n // istanbul ignore next\n case \"\\n\":\n // istanbul ignore next\n case \"\\r\":\n // istanbul ignore next\n case \"\\u2028\":\n // istanbul ignore next\n case \"\\u2029\":\n // istanbul ignore next\n case \"\\\\\":\n // istanbul ignore next\n case \"]\":\n throw Error(\"TBD\")\n default:\n var nextChar = this.popChar()\n return { type: \"Character\", value: cc(nextChar) }\n }\n }\n\n RegExpParser.prototype.characterClass = function() {\n var set = []\n var complement = false\n this.consumeChar(\"[\")\n if (this.peekChar(0) === \"^\") {\n this.consumeChar(\"^\")\n complement = true\n }\n\n while (this.isClassAtom()) {\n var from = this.classAtom()\n var isFromSingleChar = from.type === \"Character\"\n if (isFromSingleChar && this.isRangeDash()) {\n this.consumeChar(\"-\")\n var to = this.classAtom()\n var isToSingleChar = to.type === \"Character\"\n\n // a range can only be used when both sides are single characters\n if (isToSingleChar) {\n if (to.value < from.value) {\n throw Error(\"Range out of order in character class\")\n }\n set.push({ from: from.value, to: to.value })\n } else {\n // literal dash\n insertToSet(from.value, set)\n set.push(cc(\"-\"))\n insertToSet(to.value, set)\n }\n } else {\n insertToSet(from.value, set)\n }\n }\n\n this.consumeChar(\"]\")\n\n return { type: \"Set\", complement: complement, value: set }\n }\n\n RegExpParser.prototype.classAtom = function() {\n switch (this.peekChar()) {\n // istanbul ignore next\n case \"]\":\n // istanbul ignore next\n case \"\\n\":\n // istanbul ignore next\n case \"\\r\":\n // istanbul ignore next\n case \"\\u2028\":\n // istanbul ignore next\n case \"\\u2029\":\n throw Error(\"TBD\")\n case \"\\\\\":\n return this.classEscape()\n default:\n return this.classPatternCharacterAtom()\n }\n }\n\n RegExpParser.prototype.classEscape = function() {\n this.consumeChar(\"\\\\\")\n switch (this.peekChar()) {\n // Matches a backspace.\n // (Not to be confused with \\b word boundary outside characterClass)\n case \"b\":\n this.consumeChar(\"b\")\n return { type: \"Character\", value: cc(\"\\u0008\") }\n case \"d\":\n case \"D\":\n case \"s\":\n case \"S\":\n case \"w\":\n case \"W\":\n return this.characterClassEscape()\n case \"f\":\n case \"n\":\n case \"r\":\n case \"t\":\n case \"v\":\n return this.controlEscapeAtom()\n case \"c\":\n return this.controlLetterEscapeAtom()\n case \"0\":\n return this.nulCharacterAtom()\n case \"x\":\n return this.hexEscapeSequenceAtom()\n case \"u\":\n return this.regExpUnicodeEscapeSequenceAtom()\n default:\n return this.identityEscapeAtom()\n }\n }\n\n RegExpParser.prototype.group = function() {\n var capturing = true\n this.consumeChar(\"(\")\n switch (this.peekChar(0)) {\n case \"?\":\n this.consumeChar(\"?\")\n this.consumeChar(\":\")\n capturing = false\n break\n default:\n this.groupIdx++\n break\n }\n var value = this.disjunction()\n this.consumeChar(\")\")\n\n var groupAst = {\n type: \"Group\",\n capturing: capturing,\n value: value\n }\n\n if (capturing) {\n groupAst.idx = this.groupIdx\n }\n\n return groupAst\n }\n\n RegExpParser.prototype.positiveInteger = function() {\n var number = this.popChar()\n\n // istanbul ignore next - can't ever get here due to previous lookahead checks\n // still implementing this error checking in case this ever changes.\n if (decimalPatternNoZero.test(number) === false) {\n throw Error(\"Expecting a positive integer\")\n }\n\n while (decimalPattern.test(this.peekChar(0))) {\n number += this.popChar()\n }\n\n return parseInt(number, 10)\n }\n\n RegExpParser.prototype.integerIncludingZero = function() {\n var number = this.popChar()\n if (decimalPattern.test(number) === false) {\n throw Error(\"Expecting an integer\")\n }\n\n while (decimalPattern.test(this.peekChar(0))) {\n number += this.popChar()\n }\n\n return parseInt(number, 10)\n }\n\n RegExpParser.prototype.patternCharacter = function() {\n var nextChar = this.popChar()\n switch (nextChar) {\n // istanbul ignore next\n case \"\\n\":\n // istanbul ignore next\n case \"\\r\":\n // istanbul ignore next\n case \"\\u2028\":\n // istanbul ignore next\n case \"\\u2029\":\n // istanbul ignore next\n case \"^\":\n // istanbul ignore next\n case \"$\":\n // istanbul ignore next\n case \"\\\\\":\n // istanbul ignore next\n case \".\":\n // istanbul ignore next\n case \"*\":\n // istanbul ignore next\n case \"+\":\n // istanbul ignore next\n case \"?\":\n // istanbul ignore next\n case \"(\":\n // istanbul ignore next\n case \")\":\n // istanbul ignore next\n case \"[\":\n // istanbul ignore next\n case \"|\":\n // istanbul ignore next\n throw Error(\"TBD\")\n default:\n return { type: \"Character\", value: cc(nextChar) }\n }\n }\n RegExpParser.prototype.isRegExpFlag = function() {\n switch (this.peekChar(0)) {\n case \"g\":\n case \"i\":\n case \"m\":\n case \"u\":\n case \"y\":\n return true\n default:\n return false\n }\n }\n\n RegExpParser.prototype.isRangeDash = function() {\n return this.peekChar() === \"-\" && this.isClassAtom(1)\n }\n\n RegExpParser.prototype.isDigit = function() {\n return decimalPattern.test(this.peekChar(0))\n }\n\n RegExpParser.prototype.isClassAtom = function(howMuch) {\n if (howMuch === undefined) {\n howMuch = 0\n }\n\n switch (this.peekChar(howMuch)) {\n case \"]\":\n case \"\\n\":\n case \"\\r\":\n case \"\\u2028\":\n case \"\\u2029\":\n return false\n default:\n return true\n }\n }\n\n RegExpParser.prototype.isTerm = function() {\n return this.isAtom() || this.isAssertion()\n }\n\n RegExpParser.prototype.isAtom = function() {\n if (this.isPatternCharacter()) {\n return true\n }\n\n switch (this.peekChar(0)) {\n case \".\":\n case \"\\\\\": // atomEscape\n case \"[\": // characterClass\n // TODO: isAtom must be called before isAssertion - disambiguate\n case \"(\": // group\n return true\n default:\n return false\n }\n }\n\n RegExpParser.prototype.isAssertion = function() {\n switch (this.peekChar(0)) {\n case \"^\":\n case \"$\":\n return true\n // '\\b' or '\\B'\n case \"\\\\\":\n switch (this.peekChar(1)) {\n case \"b\":\n case \"B\":\n return true\n default:\n return false\n }\n // '(?=' or '(?!'\n case \"(\":\n return (\n this.peekChar(1) === \"?\" &&\n (this.peekChar(2) === \"=\" || this.peekChar(2) === \"!\")\n )\n default:\n return false\n }\n }\n\n RegExpParser.prototype.isQuantifier = function() {\n var prevState = this.saveState()\n try {\n return this.quantifier(true) !== undefined\n } catch (e) {\n return false\n } finally {\n this.restoreState(prevState)\n }\n }\n\n RegExpParser.prototype.isPatternCharacter = function() {\n switch (this.peekChar()) {\n case \"^\":\n case \"$\":\n case \"\\\\\":\n case \".\":\n case \"*\":\n case \"+\":\n case \"?\":\n case \"(\":\n case \")\":\n case \"[\":\n case \"|\":\n case \"/\":\n case \"\\n\":\n case \"\\r\":\n case \"\\u2028\":\n case \"\\u2029\":\n return false\n default:\n return true\n }\n }\n\n RegExpParser.prototype.parseHexDigits = function(howMany) {\n var hexString = \"\"\n for (var i = 0; i < howMany; i++) {\n var hexChar = this.popChar()\n if (hexDigitPattern.test(hexChar) === false) {\n throw Error(\"Expecting a HexDecimal digits\")\n }\n hexString += hexChar\n }\n var charCode = parseInt(hexString, 16)\n return { type: \"Character\", value: charCode }\n }\n\n RegExpParser.prototype.peekChar = function(howMuch) {\n if (howMuch === undefined) {\n howMuch = 0\n }\n return this.input[this.idx + howMuch]\n }\n\n RegExpParser.prototype.popChar = function() {\n var nextChar = this.peekChar(0)\n this.consumeChar()\n return nextChar\n }\n\n RegExpParser.prototype.consumeChar = function(char) {\n if (char !== undefined && this.input[this.idx] !== char) {\n throw Error(\n \"Expected: '\" +\n char +\n \"' but found: '\" +\n this.input[this.idx] +\n \"' at offset: \" +\n this.idx\n )\n }\n\n if (this.idx >= this.input.length) {\n throw Error(\"Unexpected end of input\")\n }\n this.idx++\n }\n\n RegExpParser.prototype.loc = function(begin) {\n return { begin: begin, end: this.idx }\n }\n\n // consts and utilities\n var hexDigitPattern = /[0-9a-fA-F]/\n var decimalPattern = /[0-9]/\n var decimalPatternNoZero = /[1-9]/\n\n function cc(char) {\n return char.charCodeAt(0)\n }\n\n function insertToSet(item, set) {\n if (item.length !== undefined) {\n item.forEach(function(subItem) {\n set.push(subItem)\n })\n } else {\n set.push(item)\n }\n }\n\n function addFlag(flagObj, flagKey) {\n if (flagObj[flagKey] === true) {\n throw \"duplicate flag \" + flagKey\n }\n\n flagObj[flagKey] = true\n }\n\n function ASSERT_EXISTS(obj) {\n // istanbul ignore next\n if (obj === undefined) {\n throw Error(\"Internal Error - Should never get here!\")\n }\n }\n\n // istanbul ignore next\n function ASSERT_NEVER_REACH_HERE() {\n throw Error(\"Internal Error - Should never get here!\")\n }\n\n var i\n var digitsCharCodes = []\n for (i = cc(\"0\"); i <= cc(\"9\"); i++) {\n digitsCharCodes.push(i)\n }\n\n var wordCharCodes = [cc(\"_\")].concat(digitsCharCodes)\n for (i = cc(\"a\"); i <= cc(\"z\"); i++) {\n wordCharCodes.push(i)\n }\n\n for (i = cc(\"A\"); i <= cc(\"Z\"); i++) {\n wordCharCodes.push(i)\n }\n\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp#character-classes\n var whitespaceCodes = [\n cc(\" \"),\n cc(\"\\f\"),\n cc(\"\\n\"),\n cc(\"\\r\"),\n cc(\"\\t\"),\n cc(\"\\v\"),\n cc(\"\\t\"),\n cc(\"\\u00a0\"),\n cc(\"\\u1680\"),\n cc(\"\\u2000\"),\n cc(\"\\u2001\"),\n cc(\"\\u2002\"),\n cc(\"\\u2003\"),\n cc(\"\\u2004\"),\n cc(\"\\u2005\"),\n cc(\"\\u2006\"),\n cc(\"\\u2007\"),\n cc(\"\\u2008\"),\n cc(\"\\u2009\"),\n cc(\"\\u200a\"),\n cc(\"\\u2028\"),\n cc(\"\\u2029\"),\n cc(\"\\u202f\"),\n cc(\"\\u205f\"),\n cc(\"\\u3000\"),\n cc(\"\\ufeff\")\n ]\n\n function BaseRegExpVisitor() {}\n\n BaseRegExpVisitor.prototype.visitChildren = function(node) {\n for (var key in node) {\n var child = node[key]\n /* istanbul ignore else */\n if (node.hasOwnProperty(key)) {\n if (child.type !== undefined) {\n this.visit(child)\n } else if (Array.isArray(child)) {\n child.forEach(function(subChild) {\n this.visit(subChild)\n }, this)\n }\n }\n }\n }\n\n BaseRegExpVisitor.prototype.visit = function(node) {\n switch (node.type) {\n case \"Pattern\":\n this.visitPattern(node)\n break\n case \"Flags\":\n this.visitFlags(node)\n break\n case \"Disjunction\":\n this.visitDisjunction(node)\n break\n case \"Alternative\":\n this.visitAlternative(node)\n break\n case \"StartAnchor\":\n this.visitStartAnchor(node)\n break\n case \"EndAnchor\":\n this.visitEndAnchor(node)\n break\n case \"WordBoundary\":\n this.visitWordBoundary(node)\n break\n case \"NonWordBoundary\":\n this.visitNonWordBoundary(node)\n break\n case \"Lookahead\":\n this.visitLookahead(node)\n break\n case \"NegativeLookahead\":\n this.visitNegativeLookahead(node)\n break\n case \"Character\":\n this.visitCharacter(node)\n break\n case \"Set\":\n this.visitSet(node)\n break\n case \"Group\":\n this.visitGroup(node)\n break\n case \"GroupBackReference\":\n this.visitGroupBackReference(node)\n break\n case \"Quantifier\":\n this.visitQuantifier(node)\n break\n }\n\n this.visitChildren(node)\n }\n\n BaseRegExpVisitor.prototype.visitPattern = function(node) {}\n\n BaseRegExpVisitor.prototype.visitFlags = function(node) {}\n\n BaseRegExpVisitor.prototype.visitDisjunction = function(node) {}\n\n BaseRegExpVisitor.prototype.visitAlternative = function(node) {}\n\n // Assertion\n BaseRegExpVisitor.prototype.visitStartAnchor = function(node) {}\n\n BaseRegExpVisitor.prototype.visitEndAnchor = function(node) {}\n\n BaseRegExpVisitor.prototype.visitWordBoundary = function(node) {}\n\n BaseRegExpVisitor.prototype.visitNonWordBoundary = function(node) {}\n\n BaseRegExpVisitor.prototype.visitLookahead = function(node) {}\n\n BaseRegExpVisitor.prototype.visitNegativeLookahead = function(node) {}\n\n // atoms\n BaseRegExpVisitor.prototype.visitCharacter = function(node) {}\n\n BaseRegExpVisitor.prototype.visitSet = function(node) {}\n\n BaseRegExpVisitor.prototype.visitGroup = function(node) {}\n\n BaseRegExpVisitor.prototype.visitGroupBackReference = function(node) {}\n\n BaseRegExpVisitor.prototype.visitQuantifier = function(node) {}\n\n return {\n RegExpParser: RegExpParser,\n BaseRegExpVisitor: BaseRegExpVisitor,\n VERSION: \"0.5.0\"\n }\n }\n)\n","var castSlice = require('./_castSlice'),\n hasUnicode = require('./_hasUnicode'),\n stringToArray = require('./_stringToArray'),\n toString = require('./toString');\n\n/**\n * Creates a function like `_.lowerFirst`.\n *\n * @private\n * @param {string} methodName The name of the `String` case method to use.\n * @returns {Function} Returns the new case function.\n */\nfunction createCaseFirst(methodName) {\n return function(string) {\n string = toString(string);\n\n var strSymbols = hasUnicode(string)\n ? stringToArray(string)\n : undefined;\n\n var chr = strSymbols\n ? strSymbols[0]\n : string.charAt(0);\n\n var trailing = strSymbols\n ? castSlice(strSymbols, 1).join('')\n : string.slice(1);\n\n return chr[methodName]() + trailing;\n };\n}\n\nmodule.exports = createCaseFirst;\n","/**\n * The base implementation of `_.findIndex` and `_.findLastIndex` without\n * support for iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {Function} predicate The function invoked per iteration.\n * @param {number} fromIndex The index to search from.\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction baseFindIndex(array, predicate, fromIndex, fromRight) {\n var length = array.length,\n index = fromIndex + (fromRight ? 1 : -1);\n\n while ((fromRight ? index-- : ++index < length)) {\n if (predicate(array[index], index, array)) {\n return index;\n }\n }\n return -1;\n}\n\nmodule.exports = baseFindIndex;\n","var Symbol = require('./_Symbol'),\n getRawTag = require('./_getRawTag'),\n objectToString = require('./_objectToString');\n\n/** `Object#toString` result references. */\nvar nullTag = '[object Null]',\n undefinedTag = '[object Undefined]';\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * The base implementation of `getTag` without fallbacks for buggy environments.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nfunction baseGetTag(value) {\n if (value == null) {\n return value === undefined ? undefinedTag : nullTag;\n }\n return (symToStringTag && symToStringTag in Object(value))\n ? getRawTag(value)\n : objectToString(value);\n}\n\nmodule.exports = baseGetTag;\n","var baseClone = require('./_baseClone');\n\n/** Used to compose bitmasks for cloning. */\nvar CLONE_SYMBOLS_FLAG = 4;\n\n/**\n * Creates a shallow clone of `value`.\n *\n * **Note:** This method is loosely based on the\n * [structured clone algorithm](https://mdn.io/Structured_clone_algorithm)\n * and supports cloning arrays, array buffers, booleans, date objects, maps,\n * numbers, `Object` objects, regexes, sets, strings, symbols, and typed\n * arrays. The own enumerable properties of `arguments` objects are cloned\n * as plain objects. An empty object is returned for uncloneable values such\n * as error objects, functions, DOM nodes, and WeakMaps.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to clone.\n * @returns {*} Returns the cloned value.\n * @see _.cloneDeep\n * @example\n *\n * var objects = [{ 'a': 1 }, { 'b': 2 }];\n *\n * var shallow = _.clone(objects);\n * console.log(shallow[0] === objects[0]);\n * // => true\n */\nfunction clone(value) {\n return baseClone(value, CLONE_SYMBOLS_FLAG);\n}\n\nmodule.exports = clone;\n","var isKeyable = require('./_isKeyable');\n\n/**\n * Gets the data for `map`.\n *\n * @private\n * @param {Object} map The map to query.\n * @param {string} key The reference key.\n * @returns {*} Returns the map data.\n */\nfunction getMapData(map, key) {\n var data = map.__data__;\n return isKeyable(key)\n ? data[typeof key == 'string' ? 'string' : 'hash']\n : data.map;\n}\n\nmodule.exports = getMapData;\n","var nativeCreate = require('./_nativeCreate');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Checks if a hash value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Hash\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction hashHas(key) {\n var data = this.__data__;\n return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key);\n}\n\nmodule.exports = hashHas;\n","var getNative = require('./_getNative'),\n root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar Promise = getNative(root, 'Promise');\n\nmodule.exports = Promise;\n","var baseSetToString = require('./_baseSetToString'),\n shortOut = require('./_shortOut');\n\n/**\n * Sets the `toString` method of `func` to return `string`.\n *\n * @private\n * @param {Function} func The function to modify.\n * @param {Function} string The `toString` result.\n * @returns {Function} Returns `func`.\n */\nvar setToString = shortOut(baseSetToString);\n\nmodule.exports = setToString;\n","var isObject = require('./isObject'),\n isPrototype = require('./_isPrototype'),\n nativeKeysIn = require('./_nativeKeysIn');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * The base implementation of `_.keysIn` which doesn't treat sparse arrays as dense.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction baseKeysIn(object) {\n if (!isObject(object)) {\n return nativeKeysIn(object);\n }\n var isProto = isPrototype(object),\n result = [];\n\n for (var key in object) {\n if (!(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) {\n result.push(key);\n }\n }\n return result;\n}\n\nmodule.exports = baseKeysIn;\n","var getMapData = require('./_getMapData');\n\n/**\n * Sets the map `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf MapCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the map cache instance.\n */\nfunction mapCacheSet(key, value) {\n var data = getMapData(this, key),\n size = data.size;\n\n data.set(key, value);\n this.size += data.size == size ? 0 : 1;\n return this;\n}\n\nmodule.exports = mapCacheSet;\n","/**\n * Copies the values of `source` to `array`.\n *\n * @private\n * @param {Array} source The array to copy values from.\n * @param {Array} [array=[]] The array to copy values to.\n * @returns {Array} Returns `array`.\n */\nfunction copyArray(source, array) {\n var index = -1,\n length = source.length;\n\n array || (array = Array(length));\n while (++index < length) {\n array[index] = source[index];\n }\n return array;\n}\n\nmodule.exports = copyArray;\n","var Hash = require('./_Hash'),\n ListCache = require('./_ListCache'),\n Map = require('./_Map');\n\n/**\n * Removes all key-value entries from the map.\n *\n * @private\n * @name clear\n * @memberOf MapCache\n */\nfunction mapCacheClear() {\n this.size = 0;\n this.__data__ = {\n 'hash': new Hash,\n 'map': new (Map || ListCache),\n 'string': new Hash\n };\n}\n\nmodule.exports = mapCacheClear;\n","\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.isTokenType = exports.hasExtendingTokensTypesMapProperty = exports.hasExtendingTokensTypesProperty = exports.hasCategoriesProperty = exports.hasShortKeyProperty = exports.singleAssignCategoriesToksMap = exports.assignCategoriesMapProp = exports.assignCategoriesTokensProp = exports.assignTokenDefaultProps = exports.expandCategories = exports.augmentTokenTypes = exports.tokenIdxToClass = exports.tokenShortNameIdx = exports.tokenStructuredMatcherNoCategories = exports.tokenStructuredMatcher = void 0;\nvar isEmpty_1 = __importDefault(require(\"lodash/isEmpty\"));\nvar compact_1 = __importDefault(require(\"lodash/compact\"));\nvar isArray_1 = __importDefault(require(\"lodash/isArray\"));\nvar flatten_1 = __importDefault(require(\"lodash/flatten\"));\nvar difference_1 = __importDefault(require(\"lodash/difference\"));\nvar map_1 = __importDefault(require(\"lodash/map\"));\nvar forEach_1 = __importDefault(require(\"lodash/forEach\"));\nvar has_1 = __importDefault(require(\"lodash/has\"));\nvar includes_1 = __importDefault(require(\"lodash/includes\"));\nvar clone_1 = __importDefault(require(\"lodash/clone\"));\nfunction tokenStructuredMatcher(tokInstance, tokConstructor) {\n var instanceType = tokInstance.tokenTypeIdx;\n if (instanceType === tokConstructor.tokenTypeIdx) {\n return true;\n }\n else {\n return (tokConstructor.isParent === true &&\n tokConstructor.categoryMatchesMap[instanceType] === true);\n }\n}\nexports.tokenStructuredMatcher = tokenStructuredMatcher;\n// Optimized tokenMatcher in case our grammar does not use token categories\n// Being so tiny it is much more likely to be in-lined and this avoid the function call overhead\nfunction tokenStructuredMatcherNoCategories(token, tokType) {\n return token.tokenTypeIdx === tokType.tokenTypeIdx;\n}\nexports.tokenStructuredMatcherNoCategories = tokenStructuredMatcherNoCategories;\nexports.tokenShortNameIdx = 1;\nexports.tokenIdxToClass = {};\nfunction augmentTokenTypes(tokenTypes) {\n // collect the parent Token Types as well.\n var tokenTypesAndParents = expandCategories(tokenTypes);\n // add required tokenType and categoryMatches properties\n assignTokenDefaultProps(tokenTypesAndParents);\n // fill up the categoryMatches\n assignCategoriesMapProp(tokenTypesAndParents);\n assignCategoriesTokensProp(tokenTypesAndParents);\n (0, forEach_1.default)(tokenTypesAndParents, function (tokType) {\n tokType.isParent = tokType.categoryMatches.length > 0;\n });\n}\nexports.augmentTokenTypes = augmentTokenTypes;\nfunction expandCategories(tokenTypes) {\n var result = (0, clone_1.default)(tokenTypes);\n var categories = tokenTypes;\n var searching = true;\n while (searching) {\n categories = (0, compact_1.default)((0, flatten_1.default)((0, map_1.default)(categories, function (currTokType) { return currTokType.CATEGORIES; })));\n var newCategories = (0, difference_1.default)(categories, result);\n result = result.concat(newCategories);\n if ((0, isEmpty_1.default)(newCategories)) {\n searching = false;\n }\n else {\n categories = newCategories;\n }\n }\n return result;\n}\nexports.expandCategories = expandCategories;\nfunction assignTokenDefaultProps(tokenTypes) {\n (0, forEach_1.default)(tokenTypes, function (currTokType) {\n if (!hasShortKeyProperty(currTokType)) {\n exports.tokenIdxToClass[exports.tokenShortNameIdx] = currTokType;\n currTokType.tokenTypeIdx = exports.tokenShortNameIdx++;\n }\n // CATEGORIES? : TokenType | TokenType[]\n if (hasCategoriesProperty(currTokType) &&\n !(0, isArray_1.default)(currTokType.CATEGORIES)\n // &&\n // !isUndefined(currTokType.CATEGORIES.PATTERN)\n ) {\n currTokType.CATEGORIES = [currTokType.CATEGORIES];\n }\n if (!hasCategoriesProperty(currTokType)) {\n currTokType.CATEGORIES = [];\n }\n if (!hasExtendingTokensTypesProperty(currTokType)) {\n currTokType.categoryMatches = [];\n }\n if (!hasExtendingTokensTypesMapProperty(currTokType)) {\n currTokType.categoryMatchesMap = {};\n }\n });\n}\nexports.assignTokenDefaultProps = assignTokenDefaultProps;\nfunction assignCategoriesTokensProp(tokenTypes) {\n (0, forEach_1.default)(tokenTypes, function (currTokType) {\n // avoid duplications\n currTokType.categoryMatches = [];\n (0, forEach_1.default)(currTokType.categoryMatchesMap, function (val, key) {\n currTokType.categoryMatches.push(exports.tokenIdxToClass[key].tokenTypeIdx);\n });\n });\n}\nexports.assignCategoriesTokensProp = assignCategoriesTokensProp;\nfunction assignCategoriesMapProp(tokenTypes) {\n (0, forEach_1.default)(tokenTypes, function (currTokType) {\n singleAssignCategoriesToksMap([], currTokType);\n });\n}\nexports.assignCategoriesMapProp = assignCategoriesMapProp;\nfunction singleAssignCategoriesToksMap(path, nextNode) {\n (0, forEach_1.default)(path, function (pathNode) {\n nextNode.categoryMatchesMap[pathNode.tokenTypeIdx] = true;\n });\n (0, forEach_1.default)(nextNode.CATEGORIES, function (nextCategory) {\n var newPath = path.concat(nextNode);\n // avoids infinite loops due to cyclic categories.\n if (!(0, includes_1.default)(newPath, nextCategory)) {\n singleAssignCategoriesToksMap(newPath, nextCategory);\n }\n });\n}\nexports.singleAssignCategoriesToksMap = singleAssignCategoriesToksMap;\nfunction hasShortKeyProperty(tokType) {\n return (0, has_1.default)(tokType, \"tokenTypeIdx\");\n}\nexports.hasShortKeyProperty = hasShortKeyProperty;\nfunction hasCategoriesProperty(tokType) {\n return (0, has_1.default)(tokType, \"CATEGORIES\");\n}\nexports.hasCategoriesProperty = hasCategoriesProperty;\nfunction hasExtendingTokensTypesProperty(tokType) {\n return (0, has_1.default)(tokType, \"categoryMatches\");\n}\nexports.hasExtendingTokensTypesProperty = hasExtendingTokensTypesProperty;\nfunction hasExtendingTokensTypesMapProperty(tokType) {\n return (0, has_1.default)(tokType, \"categoryMatchesMap\");\n}\nexports.hasExtendingTokensTypesMapProperty = hasExtendingTokensTypesMapProperty;\nfunction isTokenType(tokType) {\n return (0, has_1.default)(tokType, \"tokenTypeIdx\");\n}\nexports.isTokenType = isTokenType;\n//# sourceMappingURL=tokens.js.map","var arrayPush = require('./_arrayPush'),\n isFlattenable = require('./_isFlattenable');\n\n/**\n * The base implementation of `_.flatten` with support for restricting flattening.\n *\n * @private\n * @param {Array} array The array to flatten.\n * @param {number} depth The maximum recursion depth.\n * @param {boolean} [predicate=isFlattenable] The function invoked per iteration.\n * @param {boolean} [isStrict] Restrict to values that pass `predicate` checks.\n * @param {Array} [result=[]] The initial result value.\n * @returns {Array} Returns the new flattened array.\n */\nfunction baseFlatten(array, depth, predicate, isStrict, result) {\n var index = -1,\n length = array.length;\n\n predicate || (predicate = isFlattenable);\n result || (result = []);\n\n while (++index < length) {\n var value = array[index];\n if (depth > 0 && predicate(value)) {\n if (depth > 1) {\n // Recursively flatten arrays (susceptible to call stack limits).\n baseFlatten(value, depth - 1, predicate, isStrict, result);\n } else {\n arrayPush(result, value);\n }\n } else if (!isStrict) {\n result[result.length] = value;\n }\n }\n return result;\n}\n\nmodule.exports = baseFlatten;\n","\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.RestWalker = void 0;\nvar drop_1 = __importDefault(require(\"lodash/drop\"));\nvar forEach_1 = __importDefault(require(\"lodash/forEach\"));\nvar gast_1 = require(\"@chevrotain/gast\");\n/**\n * A Grammar Walker that computes the \"remaining\" grammar \"after\" a productions in the grammar.\n */\nvar RestWalker = /** @class */ (function () {\n function RestWalker() {\n }\n RestWalker.prototype.walk = function (prod, prevRest) {\n var _this = this;\n if (prevRest === void 0) { prevRest = []; }\n (0, forEach_1.default)(prod.definition, function (subProd, index) {\n var currRest = (0, drop_1.default)(prod.definition, index + 1);\n /* istanbul ignore else */\n if (subProd instanceof gast_1.NonTerminal) {\n _this.walkProdRef(subProd, currRest, prevRest);\n }\n else if (subProd instanceof gast_1.Terminal) {\n _this.walkTerminal(subProd, currRest, prevRest);\n }\n else if (subProd instanceof gast_1.Alternative) {\n _this.walkFlat(subProd, currRest, prevRest);\n }\n else if (subProd instanceof gast_1.Option) {\n _this.walkOption(subProd, currRest, prevRest);\n }\n else if (subProd instanceof gast_1.RepetitionMandatory) {\n _this.walkAtLeastOne(subProd, currRest, prevRest);\n }\n else if (subProd instanceof gast_1.RepetitionMandatoryWithSeparator) {\n _this.walkAtLeastOneSep(subProd, currRest, prevRest);\n }\n else if (subProd instanceof gast_1.RepetitionWithSeparator) {\n _this.walkManySep(subProd, currRest, prevRest);\n }\n else if (subProd instanceof gast_1.Repetition) {\n _this.walkMany(subProd, currRest, prevRest);\n }\n else if (subProd instanceof gast_1.Alternation) {\n _this.walkOr(subProd, currRest, prevRest);\n }\n else {\n throw Error(\"non exhaustive match\");\n }\n });\n };\n RestWalker.prototype.walkTerminal = function (terminal, currRest, prevRest) { };\n RestWalker.prototype.walkProdRef = function (refProd, currRest, prevRest) { };\n RestWalker.prototype.walkFlat = function (flatProd, currRest, prevRest) {\n // ABCDEF => after the D the rest is EF\n var fullOrRest = currRest.concat(prevRest);\n this.walk(flatProd, fullOrRest);\n };\n RestWalker.prototype.walkOption = function (optionProd, currRest, prevRest) {\n // ABC(DE)?F => after the (DE)? the rest is F\n var fullOrRest = currRest.concat(prevRest);\n this.walk(optionProd, fullOrRest);\n };\n RestWalker.prototype.walkAtLeastOne = function (atLeastOneProd, currRest, prevRest) {\n // ABC(DE)+F => after the (DE)+ the rest is (DE)?F\n var fullAtLeastOneRest = [\n new gast_1.Option({ definition: atLeastOneProd.definition })\n ].concat(currRest, prevRest);\n this.walk(atLeastOneProd, fullAtLeastOneRest);\n };\n RestWalker.prototype.walkAtLeastOneSep = function (atLeastOneSepProd, currRest, prevRest) {\n // ABC DE(,DE)* F => after the (,DE)+ the rest is (,DE)?F\n var fullAtLeastOneSepRest = restForRepetitionWithSeparator(atLeastOneSepProd, currRest, prevRest);\n this.walk(atLeastOneSepProd, fullAtLeastOneSepRest);\n };\n RestWalker.prototype.walkMany = function (manyProd, currRest, prevRest) {\n // ABC(DE)*F => after the (DE)* the rest is (DE)?F\n var fullManyRest = [\n new gast_1.Option({ definition: manyProd.definition })\n ].concat(currRest, prevRest);\n this.walk(manyProd, fullManyRest);\n };\n RestWalker.prototype.walkManySep = function (manySepProd, currRest, prevRest) {\n // ABC (DE(,DE)*)? F => after the (,DE)* the rest is (,DE)?F\n var fullManySepRest = restForRepetitionWithSeparator(manySepProd, currRest, prevRest);\n this.walk(manySepProd, fullManySepRest);\n };\n RestWalker.prototype.walkOr = function (orProd, currRest, prevRest) {\n var _this = this;\n // ABC(D|E|F)G => when finding the (D|E|F) the rest is G\n var fullOrRest = currRest.concat(prevRest);\n // walk all different alternatives\n (0, forEach_1.default)(orProd.definition, function (alt) {\n // wrapping each alternative in a single definition wrapper\n // to avoid errors in computing the rest of that alternative in the invocation to computeInProdFollows\n // (otherwise for OR([alt1,alt2]) alt2 will be considered in 'rest' of alt1\n var prodWrapper = new gast_1.Alternative({ definition: [alt] });\n _this.walk(prodWrapper, fullOrRest);\n });\n };\n return RestWalker;\n}());\nexports.RestWalker = RestWalker;\nfunction restForRepetitionWithSeparator(repSepProd, currRest, prevRest) {\n var repSepRest = [\n new gast_1.Option({\n definition: [\n new gast_1.Terminal({ terminalType: repSepProd.separator })\n ].concat(repSepProd.definition)\n })\n ];\n var fullRepSepRest = repSepRest.concat(currRest, prevRest);\n return fullRepSepRest;\n}\n//# sourceMappingURL=rest.js.map","var assignValue = require('./_assignValue'),\n castPath = require('./_castPath'),\n isIndex = require('./_isIndex'),\n isObject = require('./isObject'),\n toKey = require('./_toKey');\n\n/**\n * The base implementation of `_.set`.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {Array|string} path The path of the property to set.\n * @param {*} value The value to set.\n * @param {Function} [customizer] The function to customize path creation.\n * @returns {Object} Returns `object`.\n */\nfunction baseSet(object, path, value, customizer) {\n if (!isObject(object)) {\n return object;\n }\n path = castPath(path, object);\n\n var index = -1,\n length = path.length,\n lastIndex = length - 1,\n nested = object;\n\n while (nested != null && ++index < length) {\n var key = toKey(path[index]),\n newValue = value;\n\n if (key === '__proto__' || key === 'constructor' || key === 'prototype') {\n return object;\n }\n\n if (index != lastIndex) {\n var objValue = nested[key];\n newValue = customizer ? customizer(objValue, key, nested) : undefined;\n if (newValue === undefined) {\n newValue = isObject(objValue)\n ? objValue\n : (isIndex(path[index + 1]) ? [] : {});\n }\n }\n assignValue(nested, key, newValue);\n nested = nested[key];\n }\n return object;\n}\n\nmodule.exports = baseSet;\n","/** Used to match `RegExp` flags from their coerced string values. */\nvar reFlags = /\\w*$/;\n\n/**\n * Creates a clone of `regexp`.\n *\n * @private\n * @param {Object} regexp The regexp to clone.\n * @returns {Object} Returns the cloned regexp.\n */\nfunction cloneRegExp(regexp) {\n var result = new regexp.constructor(regexp.source, reFlags.exec(regexp));\n result.lastIndex = regexp.lastIndex;\n return result;\n}\n\nmodule.exports = cloneRegExp;\n","/**\n * Creates a base function for methods like `_.forIn` and `_.forOwn`.\n *\n * @private\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new base function.\n */\nfunction createBaseFor(fromRight) {\n return function(object, iteratee, keysFunc) {\n var index = -1,\n iterable = Object(object),\n props = keysFunc(object),\n length = props.length;\n\n while (length--) {\n var key = props[fromRight ? length : ++index];\n if (iteratee(iterable[key], key, iterable) === false) {\n break;\n }\n }\n return object;\n };\n}\n\nmodule.exports = createBaseFor;\n","var baseToString = require('./_baseToString');\n\n/**\n * Converts `value` to a string. An empty string is returned for `null`\n * and `undefined` values. The sign of `-0` is preserved.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n * @example\n *\n * _.toString(null);\n * // => ''\n *\n * _.toString(-0);\n * // => '-0'\n *\n * _.toString([1, 2, 3]);\n * // => '1,2,3'\n */\nfunction toString(value) {\n return value == null ? '' : baseToString(value);\n}\n\nmodule.exports = toString;\n","var getNative = require('./_getNative');\n\nvar defineProperty = (function() {\n try {\n var func = getNative(Object, 'defineProperty');\n func({}, '', {});\n return func;\n } catch (e) {}\n}());\n\nmodule.exports = defineProperty;\n","\"use strict\";\nvar __assign = (this && this.__assign) || function () {\n __assign = Object.assign || function(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\n t[p] = s[p];\n }\n return t;\n };\n return __assign.apply(this, arguments);\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.generateCstDts = void 0;\nvar model_1 = require(\"./model\");\nvar generate_1 = require(\"./generate\");\nvar defaultOptions = {\n includeVisitorInterface: true,\n visitorInterfaceName: \"ICstNodeVisitor\"\n};\nfunction generateCstDts(productions, options) {\n var effectiveOptions = __assign(__assign({}, defaultOptions), options);\n var model = (0, model_1.buildModel)(productions);\n return (0, generate_1.genDts)(model, effectiveOptions);\n}\nexports.generateCstDts = generateCstDts;\n//# sourceMappingURL=api.js.map","var root = require('./_root');\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Built-in value references. */\nvar Buffer = moduleExports ? root.Buffer : undefined,\n allocUnsafe = Buffer ? Buffer.allocUnsafe : undefined;\n\n/**\n * Creates a clone of `buffer`.\n *\n * @private\n * @param {Buffer} buffer The buffer to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Buffer} Returns the cloned buffer.\n */\nfunction cloneBuffer(buffer, isDeep) {\n if (isDeep) {\n return buffer.slice();\n }\n var length = buffer.length,\n result = allocUnsafe ? allocUnsafe(length) : new buffer.constructor(length);\n\n buffer.copy(result);\n return result;\n}\n\nmodule.exports = cloneBuffer;\n","/**\n * This method returns a new empty array.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {Array} Returns the new empty array.\n * @example\n *\n * var arrays = _.times(2, _.stubArray);\n *\n * console.log(arrays);\n * // => [[], []]\n *\n * console.log(arrays[0] === arrays[1]);\n * // => false\n */\nfunction stubArray() {\n return [];\n}\n\nmodule.exports = stubArray;\n","var baseGetAllKeys = require('./_baseGetAllKeys'),\n getSymbolsIn = require('./_getSymbolsIn'),\n keysIn = require('./keysIn');\n\n/**\n * Creates an array of own and inherited enumerable property names and\n * symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names and symbols.\n */\nfunction getAllKeysIn(object) {\n return baseGetAllKeys(object, keysIn, getSymbolsIn);\n}\n\nmodule.exports = getAllKeysIn;\n","var defineProperty = require('./_defineProperty');\n\n/**\n * The base implementation of `assignValue` and `assignMergeValue` without\n * value checks.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\nfunction baseAssignValue(object, key, value) {\n if (key == '__proto__' && defineProperty) {\n defineProperty(object, key, {\n 'configurable': true,\n 'enumerable': true,\n 'value': value,\n 'writable': true\n });\n } else {\n object[key] = value;\n }\n}\n\nmodule.exports = baseAssignValue;\n","var baseUniq = require('./_baseUniq');\n\n/**\n * Creates a duplicate-free version of an array, using\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons, in which only the first occurrence of each element\n * is kept. The order of result values is determined by the order they occur\n * in the array.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @returns {Array} Returns the new duplicate free array.\n * @example\n *\n * _.uniq([2, 1, 2]);\n * // => [2, 1]\n */\nfunction uniq(array) {\n return (array && array.length) ? baseUniq(array) : [];\n}\n\nmodule.exports = uniq;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.isSequenceProd = exports.isBranchingProd = exports.isOptionalProd = exports.getProductionDslName = exports.GAstVisitor = exports.serializeProduction = exports.serializeGrammar = exports.Alternative = exports.Alternation = exports.RepetitionWithSeparator = exports.RepetitionMandatoryWithSeparator = exports.RepetitionMandatory = exports.Repetition = exports.Option = exports.NonTerminal = exports.Terminal = exports.Rule = void 0;\nvar model_1 = require(\"./model\");\nObject.defineProperty(exports, \"Rule\", { enumerable: true, get: function () { return model_1.Rule; } });\nObject.defineProperty(exports, \"Terminal\", { enumerable: true, get: function () { return model_1.Terminal; } });\nObject.defineProperty(exports, \"NonTerminal\", { enumerable: true, get: function () { return model_1.NonTerminal; } });\nObject.defineProperty(exports, \"Option\", { enumerable: true, get: function () { return model_1.Option; } });\nObject.defineProperty(exports, \"Repetition\", { enumerable: true, get: function () { return model_1.Repetition; } });\nObject.defineProperty(exports, \"RepetitionMandatory\", { enumerable: true, get: function () { return model_1.RepetitionMandatory; } });\nObject.defineProperty(exports, \"RepetitionMandatoryWithSeparator\", { enumerable: true, get: function () { return model_1.RepetitionMandatoryWithSeparator; } });\nObject.defineProperty(exports, \"RepetitionWithSeparator\", { enumerable: true, get: function () { return model_1.RepetitionWithSeparator; } });\nObject.defineProperty(exports, \"Alternation\", { enumerable: true, get: function () { return model_1.Alternation; } });\nObject.defineProperty(exports, \"Alternative\", { enumerable: true, get: function () { return model_1.Alternative; } });\nObject.defineProperty(exports, \"serializeGrammar\", { enumerable: true, get: function () { return model_1.serializeGrammar; } });\nObject.defineProperty(exports, \"serializeProduction\", { enumerable: true, get: function () { return model_1.serializeProduction; } });\nvar visitor_1 = require(\"./visitor\");\nObject.defineProperty(exports, \"GAstVisitor\", { enumerable: true, get: function () { return visitor_1.GAstVisitor; } });\nvar helpers_1 = require(\"./helpers\");\nObject.defineProperty(exports, \"getProductionDslName\", { enumerable: true, get: function () { return helpers_1.getProductionDslName; } });\nObject.defineProperty(exports, \"isOptionalProd\", { enumerable: true, get: function () { return helpers_1.isOptionalProd; } });\nObject.defineProperty(exports, \"isBranchingProd\", { enumerable: true, get: function () { return helpers_1.isBranchingProd; } });\nObject.defineProperty(exports, \"isSequenceProd\", { enumerable: true, get: function () { return helpers_1.isSequenceProd; } });\n//# sourceMappingURL=api.js.map","/**\n * This method returns the first argument it receives.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Util\n * @param {*} value Any value.\n * @returns {*} Returns `value`.\n * @example\n *\n * var object = { 'a': 1 };\n *\n * console.log(_.identity(object) === object);\n * // => true\n */\nfunction identity(value) {\n return value;\n}\n\nmodule.exports = identity;\n","\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getProductionDslName = exports.isBranchingProd = exports.isOptionalProd = exports.isSequenceProd = void 0;\nvar some_1 = __importDefault(require(\"lodash/some\"));\nvar every_1 = __importDefault(require(\"lodash/every\"));\nvar includes_1 = __importDefault(require(\"lodash/includes\"));\nvar model_1 = require(\"./model\");\nfunction isSequenceProd(prod) {\n return (prod instanceof model_1.Alternative ||\n prod instanceof model_1.Option ||\n prod instanceof model_1.Repetition ||\n prod instanceof model_1.RepetitionMandatory ||\n prod instanceof model_1.RepetitionMandatoryWithSeparator ||\n prod instanceof model_1.RepetitionWithSeparator ||\n prod instanceof model_1.Terminal ||\n prod instanceof model_1.Rule);\n}\nexports.isSequenceProd = isSequenceProd;\nfunction isOptionalProd(prod, alreadyVisited) {\n if (alreadyVisited === void 0) { alreadyVisited = []; }\n var isDirectlyOptional = prod instanceof model_1.Option ||\n prod instanceof model_1.Repetition ||\n prod instanceof model_1.RepetitionWithSeparator;\n if (isDirectlyOptional) {\n return true;\n }\n // note that this can cause infinite loop if one optional empty TOP production has a cyclic dependency with another\n // empty optional top rule\n // may be indirectly optional ((A?B?C?) | (D?E?F?))\n if (prod instanceof model_1.Alternation) {\n // for OR its enough for just one of the alternatives to be optional\n return (0, some_1.default)(prod.definition, function (subProd) {\n return isOptionalProd(subProd, alreadyVisited);\n });\n }\n else if (prod instanceof model_1.NonTerminal && (0, includes_1.default)(alreadyVisited, prod)) {\n // avoiding stack overflow due to infinite recursion\n return false;\n }\n else if (prod instanceof model_1.AbstractProduction) {\n if (prod instanceof model_1.NonTerminal) {\n alreadyVisited.push(prod);\n }\n return (0, every_1.default)(prod.definition, function (subProd) {\n return isOptionalProd(subProd, alreadyVisited);\n });\n }\n else {\n return false;\n }\n}\nexports.isOptionalProd = isOptionalProd;\nfunction isBranchingProd(prod) {\n return prod instanceof model_1.Alternation;\n}\nexports.isBranchingProd = isBranchingProd;\nfunction getProductionDslName(prod) {\n /* istanbul ignore else */\n if (prod instanceof model_1.NonTerminal) {\n return \"SUBRULE\";\n }\n else if (prod instanceof model_1.Option) {\n return \"OPTION\";\n }\n else if (prod instanceof model_1.Alternation) {\n return \"OR\";\n }\n else if (prod instanceof model_1.RepetitionMandatory) {\n return \"AT_LEAST_ONE\";\n }\n else if (prod instanceof model_1.RepetitionMandatoryWithSeparator) {\n return \"AT_LEAST_ONE_SEP\";\n }\n else if (prod instanceof model_1.RepetitionWithSeparator) {\n return \"MANY_SEP\";\n }\n else if (prod instanceof model_1.Repetition) {\n return \"MANY\";\n }\n else if (prod instanceof model_1.Terminal) {\n return \"CONSUME\";\n }\n else {\n throw Error(\"non exhaustive match\");\n }\n}\nexports.getProductionDslName = getProductionDslName;\n//# sourceMappingURL=helpers.js.map","/**\n * Gets the stack value for `key`.\n *\n * @private\n * @name get\n * @memberOf Stack\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction stackGet(key) {\n return this.__data__.get(key);\n}\n\nmodule.exports = stackGet;\n","var overArg = require('./_overArg');\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeKeys = overArg(Object.keys, Object);\n\nmodule.exports = nativeKeys;\n","var root = require('./_root'),\n stubFalse = require('./stubFalse');\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Built-in value references. */\nvar Buffer = moduleExports ? root.Buffer : undefined;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined;\n\n/**\n * Checks if `value` is a buffer.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.\n * @example\n *\n * _.isBuffer(new Buffer(2));\n * // => true\n *\n * _.isBuffer(new Uint8Array(2));\n * // => false\n */\nvar isBuffer = nativeIsBuffer || stubFalse;\n\nmodule.exports = isBuffer;\n","var mapCacheClear = require('./_mapCacheClear'),\n mapCacheDelete = require('./_mapCacheDelete'),\n mapCacheGet = require('./_mapCacheGet'),\n mapCacheHas = require('./_mapCacheHas'),\n mapCacheSet = require('./_mapCacheSet');\n\n/**\n * Creates a map cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction MapCache(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n// Add methods to `MapCache`.\nMapCache.prototype.clear = mapCacheClear;\nMapCache.prototype['delete'] = mapCacheDelete;\nMapCache.prototype.get = mapCacheGet;\nMapCache.prototype.has = mapCacheHas;\nMapCache.prototype.set = mapCacheSet;\n\nmodule.exports = MapCache;\n","var baseIsMatch = require('./_baseIsMatch'),\n getMatchData = require('./_getMatchData'),\n matchesStrictComparable = require('./_matchesStrictComparable');\n\n/**\n * The base implementation of `_.matches` which doesn't clone `source`.\n *\n * @private\n * @param {Object} source The object of property values to match.\n * @returns {Function} Returns the new spec function.\n */\nfunction baseMatches(source) {\n var matchData = getMatchData(source);\n if (matchData.length == 1 && matchData[0][2]) {\n return matchesStrictComparable(matchData[0][0], matchData[0][1]);\n }\n return function(object) {\n return object === source || baseIsMatch(object, source, matchData);\n };\n}\n\nmodule.exports = baseMatches;\n","/**\n * Creates an array with all falsey values removed. The values `false`, `null`,\n * `0`, `\"\"`, `undefined`, and `NaN` are falsey.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to compact.\n * @returns {Array} Returns the new array of filtered values.\n * @example\n *\n * _.compact([0, 1, false, 2, '', 3]);\n * // => [1, 2, 3]\n */\nfunction compact(array) {\n var index = -1,\n length = array == null ? 0 : array.length,\n resIndex = 0,\n result = [];\n\n while (++index < length) {\n var value = array[index];\n if (value) {\n result[resIndex++] = value;\n }\n }\n return result;\n}\n\nmodule.exports = compact;\n","var isArrayLike = require('./isArrayLike'),\n isObjectLike = require('./isObjectLike');\n\n/**\n * This method is like `_.isArrayLike` except that it also checks if `value`\n * is an object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array-like object,\n * else `false`.\n * @example\n *\n * _.isArrayLikeObject([1, 2, 3]);\n * // => true\n *\n * _.isArrayLikeObject(document.body.children);\n * // => true\n *\n * _.isArrayLikeObject('abc');\n * // => false\n *\n * _.isArrayLikeObject(_.noop);\n * // => false\n */\nfunction isArrayLikeObject(value) {\n return isObjectLike(value) && isArrayLike(value);\n}\n\nmodule.exports = isArrayLikeObject;\n","/**\n * Removes all key-value entries from the list cache.\n *\n * @private\n * @name clear\n * @memberOf ListCache\n */\nfunction listCacheClear() {\n this.__data__ = [];\n this.size = 0;\n}\n\nmodule.exports = listCacheClear;\n","/**\n * A specialized version of `_.forEach` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns `array`.\n */\nfunction arrayEach(array, iteratee) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n while (++index < length) {\n if (iteratee(array[index], index, array) === false) {\n break;\n }\n }\n return array;\n}\n\nmodule.exports = arrayEach;\n","var Symbol = require('./_Symbol');\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n symbolValueOf = symbolProto ? symbolProto.valueOf : undefined;\n\n/**\n * Creates a clone of the `symbol` object.\n *\n * @private\n * @param {Object} symbol The symbol object to clone.\n * @returns {Object} Returns the cloned symbol object.\n */\nfunction cloneSymbol(symbol) {\n return symbolValueOf ? Object(symbolValueOf.call(symbol)) : {};\n}\n\nmodule.exports = cloneSymbol;\n","var baseSlice = require('./_baseSlice'),\n toInteger = require('./toInteger');\n\n/**\n * Creates a slice of `array` with `n` elements dropped from the beginning.\n *\n * @static\n * @memberOf _\n * @since 0.5.0\n * @category Array\n * @param {Array} array The array to query.\n * @param {number} [n=1] The number of elements to drop.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {Array} Returns the slice of `array`.\n * @example\n *\n * _.drop([1, 2, 3]);\n * // => [2, 3]\n *\n * _.drop([1, 2, 3], 2);\n * // => [3]\n *\n * _.drop([1, 2, 3], 5);\n * // => []\n *\n * _.drop([1, 2, 3], 0);\n * // => [1, 2, 3]\n */\nfunction drop(array, n, guard) {\n var length = array == null ? 0 : array.length;\n if (!length) {\n return [];\n }\n n = (guard || n === undefined) ? 1 : toInteger(n);\n return baseSlice(array, n < 0 ? 0 : n, length);\n}\n\nmodule.exports = drop;\n","var baseEach = require('./_baseEach');\n\n/**\n * The base implementation of `_.every` without support for iteratee shorthands.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {boolean} Returns `true` if all elements pass the predicate check,\n * else `false`\n */\nfunction baseEvery(collection, predicate) {\n var result = true;\n baseEach(collection, function(value, index, collection) {\n result = !!predicate(value, index, collection);\n return result;\n });\n return result;\n}\n\nmodule.exports = baseEvery;\n","/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return value != null && (type == 'object' || type == 'function');\n}\n\nmodule.exports = isObject;\n","var copyObject = require('./_copyObject'),\n keysIn = require('./keysIn');\n\n/**\n * The base implementation of `_.assignIn` without support for multiple sources\n * or `customizer` functions.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @returns {Object} Returns `object`.\n */\nfunction baseAssignIn(object, source) {\n return object && copyObject(source, keysIn(source), object);\n}\n\nmodule.exports = baseAssignIn;\n","/**\n * Removes `key` and its value from the hash.\n *\n * @private\n * @name delete\n * @memberOf Hash\n * @param {Object} hash The hash to modify.\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction hashDelete(key) {\n var result = this.has(key) && delete this.__data__[key];\n this.size -= result ? 1 : 0;\n return result;\n}\n\nmodule.exports = hashDelete;\n","var asciiToArray = require('./_asciiToArray'),\n hasUnicode = require('./_hasUnicode'),\n unicodeToArray = require('./_unicodeToArray');\n\n/**\n * Converts `string` to an array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the converted array.\n */\nfunction stringToArray(string) {\n return hasUnicode(string)\n ? unicodeToArray(string)\n : asciiToArray(string);\n}\n\nmodule.exports = stringToArray;\n","var SetCache = require('./_SetCache'),\n arrayIncludes = require('./_arrayIncludes'),\n arrayIncludesWith = require('./_arrayIncludesWith'),\n arrayMap = require('./_arrayMap'),\n baseUnary = require('./_baseUnary'),\n cacheHas = require('./_cacheHas');\n\n/** Used as the size to enable large array optimizations. */\nvar LARGE_ARRAY_SIZE = 200;\n\n/**\n * The base implementation of methods like `_.difference` without support\n * for excluding multiple arrays or iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {Array} values The values to exclude.\n * @param {Function} [iteratee] The iteratee invoked per element.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new array of filtered values.\n */\nfunction baseDifference(array, values, iteratee, comparator) {\n var index = -1,\n includes = arrayIncludes,\n isCommon = true,\n length = array.length,\n result = [],\n valuesLength = values.length;\n\n if (!length) {\n return result;\n }\n if (iteratee) {\n values = arrayMap(values, baseUnary(iteratee));\n }\n if (comparator) {\n includes = arrayIncludesWith;\n isCommon = false;\n }\n else if (values.length >= LARGE_ARRAY_SIZE) {\n includes = cacheHas;\n isCommon = false;\n values = new SetCache(values);\n }\n outer:\n while (++index < length) {\n var value = array[index],\n computed = iteratee == null ? value : iteratee(value);\n\n value = (comparator || value !== 0) ? value : 0;\n if (isCommon && computed === computed) {\n var valuesIndex = valuesLength;\n while (valuesIndex--) {\n if (values[valuesIndex] === computed) {\n continue outer;\n }\n }\n result.push(value);\n }\n else if (!includes(values, computed, comparator)) {\n result.push(value);\n }\n }\n return result;\n}\n\nmodule.exports = baseDifference;\n","\"use strict\";\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.GastRefResolverVisitor = exports.resolveGrammar = void 0;\nvar parser_1 = require(\"../parser/parser\");\nvar forEach_1 = __importDefault(require(\"lodash/forEach\"));\nvar values_1 = __importDefault(require(\"lodash/values\"));\nvar gast_1 = require(\"@chevrotain/gast\");\nfunction resolveGrammar(topLevels, errMsgProvider) {\n var refResolver = new GastRefResolverVisitor(topLevels, errMsgProvider);\n refResolver.resolveRefs();\n return refResolver.errors;\n}\nexports.resolveGrammar = resolveGrammar;\nvar GastRefResolverVisitor = /** @class */ (function (_super) {\n __extends(GastRefResolverVisitor, _super);\n function GastRefResolverVisitor(nameToTopRule, errMsgProvider) {\n var _this = _super.call(this) || this;\n _this.nameToTopRule = nameToTopRule;\n _this.errMsgProvider = errMsgProvider;\n _this.errors = [];\n return _this;\n }\n GastRefResolverVisitor.prototype.resolveRefs = function () {\n var _this = this;\n (0, forEach_1.default)((0, values_1.default)(this.nameToTopRule), function (prod) {\n _this.currTopLevel = prod;\n prod.accept(_this);\n });\n };\n GastRefResolverVisitor.prototype.visitNonTerminal = function (node) {\n var ref = this.nameToTopRule[node.nonTerminalName];\n if (!ref) {\n var msg = this.errMsgProvider.buildRuleNotFoundError(this.currTopLevel, node);\n this.errors.push({\n message: msg,\n type: parser_1.ParserDefinitionErrorType.UNRESOLVED_SUBRULE_REF,\n ruleName: this.currTopLevel.name,\n unresolvedRefName: node.nonTerminalName\n });\n }\n else {\n node.referencedRule = ref;\n }\n };\n return GastRefResolverVisitor;\n}(gast_1.GAstVisitor));\nexports.GastRefResolverVisitor = GastRefResolverVisitor;\n//# sourceMappingURL=resolver.js.map","/**\n * A specialized version of `baseAggregator` for arrays.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} setter The function to set `accumulator` values.\n * @param {Function} iteratee The iteratee to transform keys.\n * @param {Object} accumulator The initial aggregated object.\n * @returns {Function} Returns `accumulator`.\n */\nfunction arrayAggregator(array, setter, iteratee, accumulator) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n while (++index < length) {\n var value = array[index];\n setter(accumulator, value, iteratee(value), array);\n }\n return accumulator;\n}\n\nmodule.exports = arrayAggregator;\n","/**\n * This method returns `undefined`.\n *\n * @static\n * @memberOf _\n * @since 2.3.0\n * @category Util\n * @example\n *\n * _.times(2, _.noop);\n * // => [undefined, undefined]\n */\nfunction noop() {\n // No operation performed.\n}\n\nmodule.exports = noop;\n","var identity = require('./identity');\n\n/**\n * Casts `value` to `identity` if it's not a function.\n *\n * @private\n * @param {*} value The value to inspect.\n * @returns {Function} Returns cast function.\n */\nfunction castFunction(value) {\n return typeof value == 'function' ? value : identity;\n}\n\nmodule.exports = castFunction;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.GAstVisitor = void 0;\nvar model_1 = require(\"./model\");\nvar GAstVisitor = /** @class */ (function () {\n function GAstVisitor() {\n }\n GAstVisitor.prototype.visit = function (node) {\n var nodeAny = node;\n switch (nodeAny.constructor) {\n case model_1.NonTerminal:\n return this.visitNonTerminal(nodeAny);\n case model_1.Alternative:\n return this.visitAlternative(nodeAny);\n case model_1.Option:\n return this.visitOption(nodeAny);\n case model_1.RepetitionMandatory:\n return this.visitRepetitionMandatory(nodeAny);\n case model_1.RepetitionMandatoryWithSeparator:\n return this.visitRepetitionMandatoryWithSeparator(nodeAny);\n case model_1.RepetitionWithSeparator:\n return this.visitRepetitionWithSeparator(nodeAny);\n case model_1.Repetition:\n return this.visitRepetition(nodeAny);\n case model_1.Alternation:\n return this.visitAlternation(nodeAny);\n case model_1.Terminal:\n return this.visitTerminal(nodeAny);\n case model_1.Rule:\n return this.visitRule(nodeAny);\n /* istanbul ignore next */\n default:\n throw Error(\"non exhaustive match\");\n }\n };\n /* istanbul ignore next - testing the fact a NOOP function exists is non-trivial */\n GAstVisitor.prototype.visitNonTerminal = function (node) { };\n /* istanbul ignore next - testing the fact a NOOP function exists is non-trivial */\n GAstVisitor.prototype.visitAlternative = function (node) { };\n /* istanbul ignore next - testing the fact a NOOP function exists is non-trivial */\n GAstVisitor.prototype.visitOption = function (node) { };\n /* istanbul ignore next - testing the fact a NOOP function exists is non-trivial */\n GAstVisitor.prototype.visitRepetition = function (node) { };\n /* istanbul ignore next - testing the fact a NOOP function exists is non-trivial */\n GAstVisitor.prototype.visitRepetitionMandatory = function (node) { };\n /* istanbul ignore next - testing the fact a NOOP function exists is non-trivial */\n GAstVisitor.prototype.visitRepetitionMandatoryWithSeparator = function (node) { };\n /* istanbul ignore next - testing the fact a NOOP function exists is non-trivial */\n GAstVisitor.prototype.visitRepetitionWithSeparator = function (node) { };\n /* istanbul ignore next - testing the fact a NOOP function exists is non-trivial */\n GAstVisitor.prototype.visitAlternation = function (node) { };\n /* istanbul ignore next - testing the fact a NOOP function exists is non-trivial */\n GAstVisitor.prototype.visitTerminal = function (node) { };\n /* istanbul ignore next - testing the fact a NOOP function exists is non-trivial */\n GAstVisitor.prototype.visitRule = function (node) { };\n return GAstVisitor;\n}());\nexports.GAstVisitor = GAstVisitor;\n//# sourceMappingURL=visitor.js.map","var trimmedEndIndex = require('./_trimmedEndIndex');\n\n/** Used to match leading whitespace. */\nvar reTrimStart = /^\\s+/;\n\n/**\n * The base implementation of `_.trim`.\n *\n * @private\n * @param {string} string The string to trim.\n * @returns {string} Returns the trimmed string.\n */\nfunction baseTrim(string) {\n return string\n ? string.slice(0, trimmedEndIndex(string) + 1).replace(reTrimStart, '')\n : string;\n}\n\nmodule.exports = baseTrim;\n","/**\n * Checks if `value` is suitable for use as unique object key.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is suitable, else `false`.\n */\nfunction isKeyable(value) {\n var type = typeof value;\n return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')\n ? (value !== '__proto__')\n : (value === null);\n}\n\nmodule.exports = isKeyable;\n","/**\n * Converts `set` to an array of its values.\n *\n * @private\n * @param {Object} set The set to convert.\n * @returns {Array} Returns the values.\n */\nfunction setToArray(set) {\n var index = -1,\n result = Array(set.size);\n\n set.forEach(function(value) {\n result[++index] = value;\n });\n return result;\n}\n\nmodule.exports = setToArray;\n","/**\n * A specialized version of `_.some` for arrays without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {boolean} Returns `true` if any element passes the predicate check,\n * else `false`.\n */\nfunction arraySome(array, predicate) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n while (++index < length) {\n if (predicate(array[index], index, array)) {\n return true;\n }\n }\n return false;\n}\n\nmodule.exports = arraySome;\n","/**\n * Creates a unary function that invokes `func` with its argument transformed.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {Function} transform The argument transform.\n * @returns {Function} Returns the new function.\n */\nfunction overArg(func, transform) {\n return function(arg) {\n return func(transform(arg));\n };\n}\n\nmodule.exports = overArg;\n","var baseGetTag = require('./_baseGetTag'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar symbolTag = '[object Symbol]';\n\n/**\n * Checks if `value` is classified as a `Symbol` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\nfunction isSymbol(value) {\n return typeof value == 'symbol' ||\n (isObjectLike(value) && baseGetTag(value) == symbolTag);\n}\n\nmodule.exports = isSymbol;\n","\"use strict\";\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.nextPossibleTokensAfter = exports.possiblePathsFrom = exports.NextTerminalAfterAtLeastOneSepWalker = exports.NextTerminalAfterAtLeastOneWalker = exports.NextTerminalAfterManySepWalker = exports.NextTerminalAfterManyWalker = exports.AbstractNextTerminalAfterProductionWalker = exports.NextAfterTokenWalker = exports.AbstractNextPossibleTokensWalker = void 0;\nvar rest_1 = require(\"./rest\");\nvar first_1 = __importDefault(require(\"lodash/first\"));\nvar isEmpty_1 = __importDefault(require(\"lodash/isEmpty\"));\nvar dropRight_1 = __importDefault(require(\"lodash/dropRight\"));\nvar drop_1 = __importDefault(require(\"lodash/drop\"));\nvar last_1 = __importDefault(require(\"lodash/last\"));\nvar forEach_1 = __importDefault(require(\"lodash/forEach\"));\nvar clone_1 = __importDefault(require(\"lodash/clone\"));\nvar first_2 = require(\"./first\");\nvar gast_1 = require(\"@chevrotain/gast\");\nvar AbstractNextPossibleTokensWalker = /** @class */ (function (_super) {\n __extends(AbstractNextPossibleTokensWalker, _super);\n function AbstractNextPossibleTokensWalker(topProd, path) {\n var _this = _super.call(this) || this;\n _this.topProd = topProd;\n _this.path = path;\n _this.possibleTokTypes = [];\n _this.nextProductionName = \"\";\n _this.nextProductionOccurrence = 0;\n _this.found = false;\n _this.isAtEndOfPath = false;\n return _this;\n }\n AbstractNextPossibleTokensWalker.prototype.startWalking = function () {\n this.found = false;\n if (this.path.ruleStack[0] !== this.topProd.name) {\n throw Error(\"The path does not start with the walker's top Rule!\");\n }\n // immutable for the win\n this.ruleStack = (0, clone_1.default)(this.path.ruleStack).reverse(); // intelij bug requires assertion\n this.occurrenceStack = (0, clone_1.default)(this.path.occurrenceStack).reverse(); // intelij bug requires assertion\n // already verified that the first production is valid, we now seek the 2nd production\n this.ruleStack.pop();\n this.occurrenceStack.pop();\n this.updateExpectedNext();\n this.walk(this.topProd);\n return this.possibleTokTypes;\n };\n AbstractNextPossibleTokensWalker.prototype.walk = function (prod, prevRest) {\n if (prevRest === void 0) { prevRest = []; }\n // stop scanning once we found the path\n if (!this.found) {\n _super.prototype.walk.call(this, prod, prevRest);\n }\n };\n AbstractNextPossibleTokensWalker.prototype.walkProdRef = function (refProd, currRest, prevRest) {\n // found the next production, need to keep walking in it\n if (refProd.referencedRule.name === this.nextProductionName &&\n refProd.idx === this.nextProductionOccurrence) {\n var fullRest = currRest.concat(prevRest);\n this.updateExpectedNext();\n this.walk(refProd.referencedRule, fullRest);\n }\n };\n AbstractNextPossibleTokensWalker.prototype.updateExpectedNext = function () {\n // need to consume the Terminal\n if ((0, isEmpty_1.default)(this.ruleStack)) {\n // must reset nextProductionXXX to avoid walking down another Top Level production while what we are\n // really seeking is the last Terminal...\n this.nextProductionName = \"\";\n this.nextProductionOccurrence = 0;\n this.isAtEndOfPath = true;\n }\n else {\n this.nextProductionName = this.ruleStack.pop();\n this.nextProductionOccurrence = this.occurrenceStack.pop();\n }\n };\n return AbstractNextPossibleTokensWalker;\n}(rest_1.RestWalker));\nexports.AbstractNextPossibleTokensWalker = AbstractNextPossibleTokensWalker;\nvar NextAfterTokenWalker = /** @class */ (function (_super) {\n __extends(NextAfterTokenWalker, _super);\n function NextAfterTokenWalker(topProd, path) {\n var _this = _super.call(this, topProd, path) || this;\n _this.path = path;\n _this.nextTerminalName = \"\";\n _this.nextTerminalOccurrence = 0;\n _this.nextTerminalName = _this.path.lastTok.name;\n _this.nextTerminalOccurrence = _this.path.lastTokOccurrence;\n return _this;\n }\n NextAfterTokenWalker.prototype.walkTerminal = function (terminal, currRest, prevRest) {\n if (this.isAtEndOfPath &&\n terminal.terminalType.name === this.nextTerminalName &&\n terminal.idx === this.nextTerminalOccurrence &&\n !this.found) {\n var fullRest = currRest.concat(prevRest);\n var restProd = new gast_1.Alternative({ definition: fullRest });\n this.possibleTokTypes = (0, first_2.first)(restProd);\n this.found = true;\n }\n };\n return NextAfterTokenWalker;\n}(AbstractNextPossibleTokensWalker));\nexports.NextAfterTokenWalker = NextAfterTokenWalker;\n/**\n * This walker only \"walks\" a single \"TOP\" level in the Grammar Ast, this means\n * it never \"follows\" production refs\n */\nvar AbstractNextTerminalAfterProductionWalker = /** @class */ (function (_super) {\n __extends(AbstractNextTerminalAfterProductionWalker, _super);\n function AbstractNextTerminalAfterProductionWalker(topRule, occurrence) {\n var _this = _super.call(this) || this;\n _this.topRule = topRule;\n _this.occurrence = occurrence;\n _this.result = {\n token: undefined,\n occurrence: undefined,\n isEndOfRule: undefined\n };\n return _this;\n }\n AbstractNextTerminalAfterProductionWalker.prototype.startWalking = function () {\n this.walk(this.topRule);\n return this.result;\n };\n return AbstractNextTerminalAfterProductionWalker;\n}(rest_1.RestWalker));\nexports.AbstractNextTerminalAfterProductionWalker = AbstractNextTerminalAfterProductionWalker;\nvar NextTerminalAfterManyWalker = /** @class */ (function (_super) {\n __extends(NextTerminalAfterManyWalker, _super);\n function NextTerminalAfterManyWalker() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n NextTerminalAfterManyWalker.prototype.walkMany = function (manyProd, currRest, prevRest) {\n if (manyProd.idx === this.occurrence) {\n var firstAfterMany = (0, first_1.default)(currRest.concat(prevRest));\n this.result.isEndOfRule = firstAfterMany === undefined;\n if (firstAfterMany instanceof gast_1.Terminal) {\n this.result.token = firstAfterMany.terminalType;\n this.result.occurrence = firstAfterMany.idx;\n }\n }\n else {\n _super.prototype.walkMany.call(this, manyProd, currRest, prevRest);\n }\n };\n return NextTerminalAfterManyWalker;\n}(AbstractNextTerminalAfterProductionWalker));\nexports.NextTerminalAfterManyWalker = NextTerminalAfterManyWalker;\nvar NextTerminalAfterManySepWalker = /** @class */ (function (_super) {\n __extends(NextTerminalAfterManySepWalker, _super);\n function NextTerminalAfterManySepWalker() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n NextTerminalAfterManySepWalker.prototype.walkManySep = function (manySepProd, currRest, prevRest) {\n if (manySepProd.idx === this.occurrence) {\n var firstAfterManySep = (0, first_1.default)(currRest.concat(prevRest));\n this.result.isEndOfRule = firstAfterManySep === undefined;\n if (firstAfterManySep instanceof gast_1.Terminal) {\n this.result.token = firstAfterManySep.terminalType;\n this.result.occurrence = firstAfterManySep.idx;\n }\n }\n else {\n _super.prototype.walkManySep.call(this, manySepProd, currRest, prevRest);\n }\n };\n return NextTerminalAfterManySepWalker;\n}(AbstractNextTerminalAfterProductionWalker));\nexports.NextTerminalAfterManySepWalker = NextTerminalAfterManySepWalker;\nvar NextTerminalAfterAtLeastOneWalker = /** @class */ (function (_super) {\n __extends(NextTerminalAfterAtLeastOneWalker, _super);\n function NextTerminalAfterAtLeastOneWalker() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n NextTerminalAfterAtLeastOneWalker.prototype.walkAtLeastOne = function (atLeastOneProd, currRest, prevRest) {\n if (atLeastOneProd.idx === this.occurrence) {\n var firstAfterAtLeastOne = (0, first_1.default)(currRest.concat(prevRest));\n this.result.isEndOfRule = firstAfterAtLeastOne === undefined;\n if (firstAfterAtLeastOne instanceof gast_1.Terminal) {\n this.result.token = firstAfterAtLeastOne.terminalType;\n this.result.occurrence = firstAfterAtLeastOne.idx;\n }\n }\n else {\n _super.prototype.walkAtLeastOne.call(this, atLeastOneProd, currRest, prevRest);\n }\n };\n return NextTerminalAfterAtLeastOneWalker;\n}(AbstractNextTerminalAfterProductionWalker));\nexports.NextTerminalAfterAtLeastOneWalker = NextTerminalAfterAtLeastOneWalker;\n// TODO: reduce code duplication in the AfterWalkers\nvar NextTerminalAfterAtLeastOneSepWalker = /** @class */ (function (_super) {\n __extends(NextTerminalAfterAtLeastOneSepWalker, _super);\n function NextTerminalAfterAtLeastOneSepWalker() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n NextTerminalAfterAtLeastOneSepWalker.prototype.walkAtLeastOneSep = function (atleastOneSepProd, currRest, prevRest) {\n if (atleastOneSepProd.idx === this.occurrence) {\n var firstAfterfirstAfterAtLeastOneSep = (0, first_1.default)(currRest.concat(prevRest));\n this.result.isEndOfRule = firstAfterfirstAfterAtLeastOneSep === undefined;\n if (firstAfterfirstAfterAtLeastOneSep instanceof gast_1.Terminal) {\n this.result.token = firstAfterfirstAfterAtLeastOneSep.terminalType;\n this.result.occurrence = firstAfterfirstAfterAtLeastOneSep.idx;\n }\n }\n else {\n _super.prototype.walkAtLeastOneSep.call(this, atleastOneSepProd, currRest, prevRest);\n }\n };\n return NextTerminalAfterAtLeastOneSepWalker;\n}(AbstractNextTerminalAfterProductionWalker));\nexports.NextTerminalAfterAtLeastOneSepWalker = NextTerminalAfterAtLeastOneSepWalker;\nfunction possiblePathsFrom(targetDef, maxLength, currPath) {\n if (currPath === void 0) { currPath = []; }\n // avoid side effects\n currPath = (0, clone_1.default)(currPath);\n var result = [];\n var i = 0;\n // TODO: avoid inner funcs\n function remainingPathWith(nextDef) {\n return nextDef.concat((0, drop_1.default)(targetDef, i + 1));\n }\n // TODO: avoid inner funcs\n function getAlternativesForProd(definition) {\n var alternatives = possiblePathsFrom(remainingPathWith(definition), maxLength, currPath);\n return result.concat(alternatives);\n }\n /**\n * Mandatory productions will halt the loop as the paths computed from their recursive calls will already contain the\n * following (rest) of the targetDef.\n *\n * For optional productions (Option/Repetition/...) the loop will continue to represent the paths that do not include the\n * the optional production.\n */\n while (currPath.length < maxLength && i < targetDef.length) {\n var prod = targetDef[i];\n /* istanbul ignore else */\n if (prod instanceof gast_1.Alternative) {\n return getAlternativesForProd(prod.definition);\n }\n else if (prod instanceof gast_1.NonTerminal) {\n return getAlternativesForProd(prod.definition);\n }\n else if (prod instanceof gast_1.Option) {\n result = getAlternativesForProd(prod.definition);\n }\n else if (prod instanceof gast_1.RepetitionMandatory) {\n var newDef = prod.definition.concat([\n new gast_1.Repetition({\n definition: prod.definition\n })\n ]);\n return getAlternativesForProd(newDef);\n }\n else if (prod instanceof gast_1.RepetitionMandatoryWithSeparator) {\n var newDef = [\n new gast_1.Alternative({ definition: prod.definition }),\n new gast_1.Repetition({\n definition: [new gast_1.Terminal({ terminalType: prod.separator })].concat(prod.definition)\n })\n ];\n return getAlternativesForProd(newDef);\n }\n else if (prod instanceof gast_1.RepetitionWithSeparator) {\n var newDef = prod.definition.concat([\n new gast_1.Repetition({\n definition: [new gast_1.Terminal({ terminalType: prod.separator })].concat(prod.definition)\n })\n ]);\n result = getAlternativesForProd(newDef);\n }\n else if (prod instanceof gast_1.Repetition) {\n var newDef = prod.definition.concat([\n new gast_1.Repetition({\n definition: prod.definition\n })\n ]);\n result = getAlternativesForProd(newDef);\n }\n else if (prod instanceof gast_1.Alternation) {\n (0, forEach_1.default)(prod.definition, function (currAlt) {\n // TODO: this is a limited check for empty alternatives\n // It would prevent a common case of infinite loops during parser initialization.\n // However **in-directly** empty alternatives may still cause issues.\n if ((0, isEmpty_1.default)(currAlt.definition) === false) {\n result = getAlternativesForProd(currAlt.definition);\n }\n });\n return result;\n }\n else if (prod instanceof gast_1.Terminal) {\n currPath.push(prod.terminalType);\n }\n else {\n throw Error(\"non exhaustive match\");\n }\n i++;\n }\n result.push({\n partialPath: currPath,\n suffixDef: (0, drop_1.default)(targetDef, i)\n });\n return result;\n}\nexports.possiblePathsFrom = possiblePathsFrom;\nfunction nextPossibleTokensAfter(initialDef, tokenVector, tokMatcher, maxLookAhead) {\n var EXIT_NON_TERMINAL = \"EXIT_NONE_TERMINAL\";\n // to avoid creating a new Array each time.\n var EXIT_NON_TERMINAL_ARR = [EXIT_NON_TERMINAL];\n var EXIT_ALTERNATIVE = \"EXIT_ALTERNATIVE\";\n var foundCompletePath = false;\n var tokenVectorLength = tokenVector.length;\n var minimalAlternativesIndex = tokenVectorLength - maxLookAhead - 1;\n var result = [];\n var possiblePaths = [];\n possiblePaths.push({\n idx: -1,\n def: initialDef,\n ruleStack: [],\n occurrenceStack: []\n });\n while (!(0, isEmpty_1.default)(possiblePaths)) {\n var currPath = possiblePaths.pop();\n // skip alternatives if no more results can be found (assuming deterministic grammar with fixed lookahead)\n if (currPath === EXIT_ALTERNATIVE) {\n if (foundCompletePath &&\n (0, last_1.default)(possiblePaths).idx <= minimalAlternativesIndex) {\n // remove irrelevant alternative\n possiblePaths.pop();\n }\n continue;\n }\n var currDef = currPath.def;\n var currIdx = currPath.idx;\n var currRuleStack = currPath.ruleStack;\n var currOccurrenceStack = currPath.occurrenceStack;\n // For Example: an empty path could exist in a valid grammar in the case of an EMPTY_ALT\n if ((0, isEmpty_1.default)(currDef)) {\n continue;\n }\n var prod = currDef[0];\n /* istanbul ignore else */\n if (prod === EXIT_NON_TERMINAL) {\n var nextPath = {\n idx: currIdx,\n def: (0, drop_1.default)(currDef),\n ruleStack: (0, dropRight_1.default)(currRuleStack),\n occurrenceStack: (0, dropRight_1.default)(currOccurrenceStack)\n };\n possiblePaths.push(nextPath);\n }\n else if (prod instanceof gast_1.Terminal) {\n /* istanbul ignore else */\n if (currIdx < tokenVectorLength - 1) {\n var nextIdx = currIdx + 1;\n var actualToken = tokenVector[nextIdx];\n if (tokMatcher(actualToken, prod.terminalType)) {\n var nextPath = {\n idx: nextIdx,\n def: (0, drop_1.default)(currDef),\n ruleStack: currRuleStack,\n occurrenceStack: currOccurrenceStack\n };\n possiblePaths.push(nextPath);\n }\n // end of the line\n }\n else if (currIdx === tokenVectorLength - 1) {\n // IGNORE ABOVE ELSE\n result.push({\n nextTokenType: prod.terminalType,\n nextTokenOccurrence: prod.idx,\n ruleStack: currRuleStack,\n occurrenceStack: currOccurrenceStack\n });\n foundCompletePath = true;\n }\n else {\n throw Error(\"non exhaustive match\");\n }\n }\n else if (prod instanceof gast_1.NonTerminal) {\n var newRuleStack = (0, clone_1.default)(currRuleStack);\n newRuleStack.push(prod.nonTerminalName);\n var newOccurrenceStack = (0, clone_1.default)(currOccurrenceStack);\n newOccurrenceStack.push(prod.idx);\n var nextPath = {\n idx: currIdx,\n def: prod.definition.concat(EXIT_NON_TERMINAL_ARR, (0, drop_1.default)(currDef)),\n ruleStack: newRuleStack,\n occurrenceStack: newOccurrenceStack\n };\n possiblePaths.push(nextPath);\n }\n else if (prod instanceof gast_1.Option) {\n // the order of alternatives is meaningful, FILO (Last path will be traversed first).\n var nextPathWithout = {\n idx: currIdx,\n def: (0, drop_1.default)(currDef),\n ruleStack: currRuleStack,\n occurrenceStack: currOccurrenceStack\n };\n possiblePaths.push(nextPathWithout);\n // required marker to avoid backtracking paths whose higher priority alternatives already matched\n possiblePaths.push(EXIT_ALTERNATIVE);\n var nextPathWith = {\n idx: currIdx,\n def: prod.definition.concat((0, drop_1.default)(currDef)),\n ruleStack: currRuleStack,\n occurrenceStack: currOccurrenceStack\n };\n possiblePaths.push(nextPathWith);\n }\n else if (prod instanceof gast_1.RepetitionMandatory) {\n // TODO:(THE NEW operators here take a while...) (convert once?)\n var secondIteration = new gast_1.Repetition({\n definition: prod.definition,\n idx: prod.idx\n });\n var nextDef = prod.definition.concat([secondIteration], (0, drop_1.default)(currDef));\n var nextPath = {\n idx: currIdx,\n def: nextDef,\n ruleStack: currRuleStack,\n occurrenceStack: currOccurrenceStack\n };\n possiblePaths.push(nextPath);\n }\n else if (prod instanceof gast_1.RepetitionMandatoryWithSeparator) {\n // TODO:(THE NEW operators here take a while...) (convert once?)\n var separatorGast = new gast_1.Terminal({\n terminalType: prod.separator\n });\n var secondIteration = new gast_1.Repetition({\n definition: [separatorGast].concat(prod.definition),\n idx: prod.idx\n });\n var nextDef = prod.definition.concat([secondIteration], (0, drop_1.default)(currDef));\n var nextPath = {\n idx: currIdx,\n def: nextDef,\n ruleStack: currRuleStack,\n occurrenceStack: currOccurrenceStack\n };\n possiblePaths.push(nextPath);\n }\n else if (prod instanceof gast_1.RepetitionWithSeparator) {\n // the order of alternatives is meaningful, FILO (Last path will be traversed first).\n var nextPathWithout = {\n idx: currIdx,\n def: (0, drop_1.default)(currDef),\n ruleStack: currRuleStack,\n occurrenceStack: currOccurrenceStack\n };\n possiblePaths.push(nextPathWithout);\n // required marker to avoid backtracking paths whose higher priority alternatives already matched\n possiblePaths.push(EXIT_ALTERNATIVE);\n var separatorGast = new gast_1.Terminal({\n terminalType: prod.separator\n });\n var nthRepetition = new gast_1.Repetition({\n definition: [separatorGast].concat(prod.definition),\n idx: prod.idx\n });\n var nextDef = prod.definition.concat([nthRepetition], (0, drop_1.default)(currDef));\n var nextPathWith = {\n idx: currIdx,\n def: nextDef,\n ruleStack: currRuleStack,\n occurrenceStack: currOccurrenceStack\n };\n possiblePaths.push(nextPathWith);\n }\n else if (prod instanceof gast_1.Repetition) {\n // the order of alternatives is meaningful, FILO (Last path will be traversed first).\n var nextPathWithout = {\n idx: currIdx,\n def: (0, drop_1.default)(currDef),\n ruleStack: currRuleStack,\n occurrenceStack: currOccurrenceStack\n };\n possiblePaths.push(nextPathWithout);\n // required marker to avoid backtracking paths whose higher priority alternatives already matched\n possiblePaths.push(EXIT_ALTERNATIVE);\n // TODO: an empty repetition will cause infinite loops here, will the parser detect this in selfAnalysis?\n var nthRepetition = new gast_1.Repetition({\n definition: prod.definition,\n idx: prod.idx\n });\n var nextDef = prod.definition.concat([nthRepetition], (0, drop_1.default)(currDef));\n var nextPathWith = {\n idx: currIdx,\n def: nextDef,\n ruleStack: currRuleStack,\n occurrenceStack: currOccurrenceStack\n };\n possiblePaths.push(nextPathWith);\n }\n else if (prod instanceof gast_1.Alternation) {\n // the order of alternatives is meaningful, FILO (Last path will be traversed first).\n for (var i = prod.definition.length - 1; i >= 0; i--) {\n var currAlt = prod.definition[i];\n var currAltPath = {\n idx: currIdx,\n def: currAlt.definition.concat((0, drop_1.default)(currDef)),\n ruleStack: currRuleStack,\n occurrenceStack: currOccurrenceStack\n };\n possiblePaths.push(currAltPath);\n possiblePaths.push(EXIT_ALTERNATIVE);\n }\n }\n else if (prod instanceof gast_1.Alternative) {\n possiblePaths.push({\n idx: currIdx,\n def: prod.definition.concat((0, drop_1.default)(currDef)),\n ruleStack: currRuleStack,\n occurrenceStack: currOccurrenceStack\n });\n }\n else if (prod instanceof gast_1.Rule) {\n // last because we should only encounter at most a single one of these per invocation.\n possiblePaths.push(expandTopLevelRule(prod, currIdx, currRuleStack, currOccurrenceStack));\n }\n else {\n throw Error(\"non exhaustive match\");\n }\n }\n return result;\n}\nexports.nextPossibleTokensAfter = nextPossibleTokensAfter;\nfunction expandTopLevelRule(topRule, currIdx, currRuleStack, currOccurrenceStack) {\n var newRuleStack = (0, clone_1.default)(currRuleStack);\n newRuleStack.push(topRule.name);\n var newCurrOccurrenceStack = (0, clone_1.default)(currOccurrenceStack);\n // top rule is always assumed to have been called with occurrence index 1\n newCurrOccurrenceStack.push(1);\n return {\n idx: currIdx,\n def: topRule.definition,\n ruleStack: newRuleStack,\n occurrenceStack: newCurrOccurrenceStack\n };\n}\n//# sourceMappingURL=interpreter.js.map","var getMapData = require('./_getMapData');\n\n/**\n * Checks if a map value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf MapCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction mapCacheHas(key) {\n return getMapData(this, key).has(key);\n}\n\nmodule.exports = mapCacheHas;\n","var Set = require('./_Set'),\n noop = require('./noop'),\n setToArray = require('./_setToArray');\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0;\n\n/**\n * Creates a set object of `values`.\n *\n * @private\n * @param {Array} values The values to add to the set.\n * @returns {Object} Returns the new set.\n */\nvar createSet = !(Set && (1 / setToArray(new Set([,-0]))[1]) == INFINITY) ? noop : function(values) {\n return new Set(values);\n};\n\nmodule.exports = createSet;\n","/**\n * Appends the elements of `values` to `array`.\n *\n * @private\n * @param {Array} array The array to modify.\n * @param {Array} values The values to append.\n * @returns {Array} Returns `array`.\n */\nfunction arrayPush(array, values) {\n var index = -1,\n length = values.length,\n offset = array.length;\n\n while (++index < length) {\n array[offset + index] = values[index];\n }\n return array;\n}\n\nmodule.exports = arrayPush;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.defineNameProp = void 0;\nvar NAME = \"name\";\nfunction defineNameProp(obj, nameValue) {\n Object.defineProperty(obj, NAME, {\n enumerable: false,\n configurable: true,\n writable: false,\n value: nameValue\n });\n}\nexports.defineNameProp = defineNameProp;\n//# sourceMappingURL=lang_extensions.js.map","var arrayFilter = require('./_arrayFilter'),\n stubArray = require('./stubArray');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Built-in value references. */\nvar propertyIsEnumerable = objectProto.propertyIsEnumerable;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeGetSymbols = Object.getOwnPropertySymbols;\n\n/**\n * Creates an array of the own enumerable symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of symbols.\n */\nvar getSymbols = !nativeGetSymbols ? stubArray : function(object) {\n if (object == null) {\n return [];\n }\n object = Object(object);\n return arrayFilter(nativeGetSymbols(object), function(symbol) {\n return propertyIsEnumerable.call(object, symbol);\n });\n};\n\nmodule.exports = getSymbols;\n","var baseRest = require('./_baseRest'),\n eq = require('./eq'),\n isIterateeCall = require('./_isIterateeCall'),\n keysIn = require('./keysIn');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Assigns own and inherited enumerable string keyed properties of source\n * objects to the destination object for all destination properties that\n * resolve to `undefined`. Source objects are applied from left to right.\n * Once a property is set, additional values of the same property are ignored.\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} [sources] The source objects.\n * @returns {Object} Returns `object`.\n * @see _.defaultsDeep\n * @example\n *\n * _.defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });\n * // => { 'a': 1, 'b': 2 }\n */\nvar defaults = baseRest(function(object, sources) {\n object = Object(object);\n\n var index = -1;\n var length = sources.length;\n var guard = length > 2 ? sources[2] : undefined;\n\n if (guard && isIterateeCall(sources[0], sources[1], guard)) {\n length = 1;\n }\n\n while (++index < length) {\n var source = sources[index];\n var props = keysIn(source);\n var propsIndex = -1;\n var propsLength = props.length;\n\n while (++propsIndex < propsLength) {\n var key = props[propsIndex];\n var value = object[key];\n\n if (value === undefined ||\n (eq(value, objectProto[key]) && !hasOwnProperty.call(object, key))) {\n object[key] = source[key];\n }\n }\n }\n\n return object;\n});\n\nmodule.exports = defaults;\n","var baseFindIndex = require('./_baseFindIndex'),\n baseIteratee = require('./_baseIteratee'),\n toInteger = require('./toInteger');\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max;\n\n/**\n * This method is like `_.find` except that it returns the index of the first\n * element `predicate` returns truthy for instead of the element itself.\n *\n * @static\n * @memberOf _\n * @since 1.1.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @param {number} [fromIndex=0] The index to search from.\n * @returns {number} Returns the index of the found element, else `-1`.\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'active': false },\n * { 'user': 'fred', 'active': false },\n * { 'user': 'pebbles', 'active': true }\n * ];\n *\n * _.findIndex(users, function(o) { return o.user == 'barney'; });\n * // => 0\n *\n * // The `_.matches` iteratee shorthand.\n * _.findIndex(users, { 'user': 'fred', 'active': false });\n * // => 1\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.findIndex(users, ['active', false]);\n * // => 0\n *\n * // The `_.property` iteratee shorthand.\n * _.findIndex(users, 'active');\n * // => 2\n */\nfunction findIndex(array, predicate, fromIndex) {\n var length = array == null ? 0 : array.length;\n if (!length) {\n return -1;\n }\n var index = fromIndex == null ? 0 : toInteger(fromIndex);\n if (index < 0) {\n index = nativeMax(length + index, 0);\n }\n return baseFindIndex(array, baseIteratee(predicate, 3), index);\n}\n\nmodule.exports = findIndex;\n","var copyObject = require('./_copyObject'),\n keys = require('./keys');\n\n/**\n * The base implementation of `_.assign` without support for multiple sources\n * or `customizer` functions.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @returns {Object} Returns `object`.\n */\nfunction baseAssign(object, source) {\n return object && copyObject(source, keys(source), object);\n}\n\nmodule.exports = baseAssign;\n","var assocIndexOf = require('./_assocIndexOf');\n\n/**\n * Gets the list cache value for `key`.\n *\n * @private\n * @name get\n * @memberOf ListCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction listCacheGet(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n return index < 0 ? undefined : data[index][1];\n}\n\nmodule.exports = listCacheGet;\n","/* bessel.js (C) 2013-present SheetJS -- http://sheetjs.com */\n/* vim: set ts=2: */\n/*exported BESSEL */\nvar BESSEL;\n(function (factory) {\n /*jshint ignore:start */\n if(typeof DO_NOT_EXPORT_BESSEL === 'undefined') {\n if('object' === typeof exports) {\n factory(exports);\n } else if ('function' === typeof define && define.amd) {\n define(function () {\n var module = {};\n factory(module);\n return module;\n });\n } else {\n factory(BESSEL = {});\n }\n } else {\n factory(BESSEL = {});\n }\n /*jshint ignore:end */\n}(function(BESSEL) {\nBESSEL.version = '1.0.2';\nvar M = Math;\n\nfunction _horner(arr, v) { for(var i = 0, z = 0; i < arr.length; ++i) z = v * z + arr[i]; return z; }\nfunction _bessel_iter(x, n, f0, f1, sign) {\n if(n === 0) return f0;\n if(n === 1) return f1;\n var tdx = 2 / x, f2 = f1;\n for(var o = 1; o < n; ++o) {\n f2 = f1 * o * tdx + sign * f0;\n f0 = f1; f1 = f2;\n }\n return f2;\n}\nfunction _bessel_wrap(bessel0, bessel1, name, nonzero, sign) {\n return function bessel(x,n) {\n if(nonzero) {\n if(x === 0) return (nonzero == 1 ? -Infinity : Infinity);\n else if(x < 0) return NaN;\n }\n if(n === 0) return bessel0(x);\n if(n === 1) return bessel1(x);\n if(n < 0) return NaN;\n n|=0;\n var b0 = bessel0(x), b1 = bessel1(x);\n return _bessel_iter(x, n, b0, b1, sign);\n };\n}\nvar besselj = (function() {\n var W = 0.636619772; // 2 / Math.PI\n\n var b0_a1a = [57568490574.0, -13362590354.0, 651619640.7, -11214424.18, 77392.33017, -184.9052456].reverse();\n var b0_a2a = [57568490411.0, 1029532985.0, 9494680.718, 59272.64853, 267.8532712, 1.0].reverse();\n var b0_a1b = [1.0, -0.1098628627e-2, 0.2734510407e-4, -0.2073370639e-5, 0.2093887211e-6].reverse();\n var b0_a2b = [-0.1562499995e-1, 0.1430488765e-3, -0.6911147651e-5, 0.7621095161e-6, -0.934935152e-7].reverse();\n\n function bessel0(x) {\n var a=0, a1=0, a2=0, y = x * x;\n if(x < 8) {\n a1 = _horner(b0_a1a, y);\n a2 = _horner(b0_a2a, y);\n a = a1 / a2;\n } else {\n var xx = x - 0.785398164;\n y = 64 / y;\n a1 = _horner(b0_a1b, y);\n a2 = _horner(b0_a2b, y);\n a = M.sqrt(W/x)*(M.cos(xx)*a1-M.sin(xx)*a2*8/x);\n }\n return a;\n }\n\n var b1_a1a = [72362614232.0, -7895059235.0, 242396853.1, -2972611.439, 15704.48260, -30.16036606].reverse();\n var b1_a2a = [144725228442.0, 2300535178.0, 18583304.74, 99447.43394, 376.9991397, 1.0].reverse();\n var b1_a1b = [1.0, 0.183105e-2, -0.3516396496e-4, 0.2457520174e-5, -0.240337019e-6].reverse();\n var b1_a2b = [0.04687499995, -0.2002690873e-3, 0.8449199096e-5, -0.88228987e-6, 0.105787412e-6].reverse();\n\n function bessel1(x) {\n var a=0, a1=0, a2=0, y = x*x, xx = M.abs(x) - 2.356194491;\n if(Math.abs(x)< 8) {\n a1 = x*_horner(b1_a1a, y);\n a2 = _horner(b1_a2a, y);\n a = a1 / a2;\n } else {\n y = 64 / y;\n a1=_horner(b1_a1b, y);\n a2=_horner(b1_a2b, y);\n a=M.sqrt(W/M.abs(x))*(M.cos(xx)*a1-M.sin(xx)*a2*8/M.abs(x));\n if(x < 0) a = -a;\n }\n return a;\n }\n\n return function besselj(x, n) {\n n = Math.round(n);\n if(!isFinite(x)) return isNaN(x) ? x : 0;\n if(n < 0) return ((n%2)?-1:1)*besselj(x, -n);\n if(x < 0) return ((n%2)?-1:1)*besselj(-x, n);\n if(n === 0) return bessel0(x);\n if(n === 1) return bessel1(x);\n if(x === 0) return 0;\n\n var ret=0.0;\n if(x > n) {\n ret = _bessel_iter(x, n, bessel0(x), bessel1(x),-1);\n } else {\n var m=2*M.floor((n+M.floor(M.sqrt(40*n)))/2);\n var jsum=false;\n var bjp=0.0, sum=0.0;\n var bj=1.0, bjm = 0.0;\n var tox = 2 / x;\n for (var j=m;j>0;j--) {\n bjm=j*tox*bj-bjp;\n bjp=bj;\n bj=bjm;\n if (M.abs(bj) > 1E10) {\n bj *= 1E-10;\n bjp *= 1E-10;\n ret *= 1E-10;\n sum *= 1E-10;\n }\n if (jsum) sum += bj;\n jsum=!jsum;\n if (j == n) ret=bjp;\n }\n sum=2.0*sum-bj;\n ret /= sum;\n }\n return ret;\n };\n})();\nvar bessely = (function() {\n var W = 0.636619772;\n\n var b0_a1a = [-2957821389.0, 7062834065.0, -512359803.6, 10879881.29, -86327.92757, 228.4622733].reverse();\n var b0_a2a = [40076544269.0, 745249964.8, 7189466.438, 47447.26470, 226.1030244, 1.0].reverse();\n var b0_a1b = [1.0, -0.1098628627e-2, 0.2734510407e-4, -0.2073370639e-5, 0.2093887211e-6].reverse();\n var b0_a2b = [-0.1562499995e-1, 0.1430488765e-3, -0.6911147651e-5, 0.7621095161e-6, -0.934945152e-7].reverse();\n\n function bessel0(x) {\n var a=0, a1=0, a2=0, y = x * x, xx = x - 0.785398164;\n if(x < 8) {\n a1 = _horner(b0_a1a, y);\n a2 = _horner(b0_a2a, y);\n a = a1/a2 + W * besselj(x,0) * M.log(x);\n } else {\n y = 64 / y;\n a1 = _horner(b0_a1b, y);\n a2 = _horner(b0_a2b, y);\n a = M.sqrt(W/x)*(M.sin(xx)*a1+M.cos(xx)*a2*8/x);\n }\n return a;\n }\n\n var b1_a1a = [-0.4900604943e13, 0.1275274390e13, -0.5153438139e11, 0.7349264551e9, -0.4237922726e7, 0.8511937935e4].reverse();\n var b1_a2a = [0.2499580570e14, 0.4244419664e12, 0.3733650367e10, 0.2245904002e8, 0.1020426050e6, 0.3549632885e3, 1].reverse();\n var b1_a1b = [1.0, 0.183105e-2, -0.3516396496e-4, 0.2457520174e-5, -0.240337019e-6].reverse();\n var b1_a2b = [0.04687499995, -0.2002690873e-3, 0.8449199096e-5, -0.88228987e-6, 0.105787412e-6].reverse();\n\n function bessel1(x) {\n var a=0, a1=0, a2=0, y = x*x, xx = x - 2.356194491;\n if(x < 8) {\n a1 = x*_horner(b1_a1a, y);\n a2 = _horner(b1_a2a, y);\n a = a1/a2 + W * (besselj(x,1) * M.log(x) - 1 / x);\n } else {\n y = 64 / y;\n a1=_horner(b1_a1b, y);\n a2=_horner(b1_a2b, y);\n a=M.sqrt(W/x)*(M.sin(xx)*a1+M.cos(xx)*a2*8/x);\n }\n return a;\n }\n\n return _bessel_wrap(bessel0, bessel1, 'BESSELY', 1, -1);\n})();\nvar besseli = (function() {\n var b0_a = [1.0, 3.5156229, 3.0899424, 1.2067492, 0.2659732, 0.360768e-1, 0.45813e-2].reverse();\n var b0_b = [0.39894228, 0.1328592e-1, 0.225319e-2, -0.157565e-2, 0.916281e-2, -0.2057706e-1, 0.2635537e-1, -0.1647633e-1, 0.392377e-2].reverse();\n\n function bessel0(x) {\n if(x <= 3.75) return _horner(b0_a, x*x/(3.75*3.75));\n return M.exp(M.abs(x))/M.sqrt(M.abs(x))*_horner(b0_b, 3.75/M.abs(x));\n }\n\n var b1_a = [0.5, 0.87890594, 0.51498869, 0.15084934, 0.2658733e-1, 0.301532e-2, 0.32411e-3].reverse();\n var b1_b = [0.39894228, -0.3988024e-1, -0.362018e-2, 0.163801e-2, -0.1031555e-1, 0.2282967e-1, -0.2895312e-1, 0.1787654e-1, -0.420059e-2].reverse();\n\n function bessel1(x) {\n if(x < 3.75) return x * _horner(b1_a, x*x/(3.75*3.75));\n return (x < 0 ? -1 : 1) * M.exp(M.abs(x))/M.sqrt(M.abs(x))*_horner(b1_b, 3.75/M.abs(x));\n }\n\n return function besseli(x, n) {\n n = Math.round(n);\n if(n === 0) return bessel0(x);\n if(n === 1) return bessel1(x);\n if(n < 0) return NaN;\n if(M.abs(x) === 0) return 0;\n if(x == Infinity) return Infinity;\n\n var ret = 0.0, j, tox = 2 / M.abs(x), bip = 0.0, bi=1.0, bim=0.0;\n var m=2*M.round((n+M.round(M.sqrt(40*n)))/2);\n for (j=m;j>0;j--) {\n bim=j*tox*bi + bip;\n bip=bi; bi=bim;\n if (M.abs(bi) > 1E10) {\n bi *= 1E-10;\n bip *= 1E-10;\n ret *= 1E-10;\n }\n if(j == n) ret = bip;\n }\n ret *= besseli(x, 0) / bi;\n return x < 0 && (n%2) ? -ret : ret;\n };\n\n})();\n\nvar besselk = (function() {\n var b0_a = [-0.57721566, 0.42278420, 0.23069756, 0.3488590e-1, 0.262698e-2, 0.10750e-3, 0.74e-5].reverse();\n var b0_b = [1.25331414, -0.7832358e-1, 0.2189568e-1, -0.1062446e-1, 0.587872e-2, -0.251540e-2, 0.53208e-3].reverse();\n\n function bessel0(x) {\n if(x <= 2) return -M.log(x/2) * besseli(x,0) + _horner(b0_a, x*x/4);\n return M.exp(-x) / M.sqrt(x) * _horner(b0_b, 2/x);\n }\n\n var b1_a = [1.0, 0.15443144, -0.67278579, -0.18156897, -0.1919402e-1, -0.110404e-2, -0.4686e-4].reverse();\n var b1_b = [1.25331414, 0.23498619, -0.3655620e-1, 0.1504268e-1, -0.780353e-2, 0.325614e-2, -0.68245e-3].reverse();\n\n function bessel1(x) {\n if(x <= 2) return M.log(x/2) * besseli(x,1) + (1/x) * _horner(b1_a, x*x/4);\n return M.exp(-x)/M.sqrt(x)*_horner(b1_b, 2/x);\n }\n\n return _bessel_wrap(bessel0, bessel1, 'BESSELK', 2, 1);\n})();\nBESSEL.besselj = besselj;\nBESSEL.bessely = bessely;\nBESSEL.besseli = besseli;\nBESSEL.besselk = besselk;\n}));\n","/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\nmodule.exports = freeGlobal;\n","var isFunction = require('./isFunction'),\n isLength = require('./isLength');\n\n/**\n * Checks if `value` is array-like. A value is considered array-like if it's\n * not a function and has a `value.length` that's an integer greater than or\n * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n * @example\n *\n * _.isArrayLike([1, 2, 3]);\n * // => true\n *\n * _.isArrayLike(document.body.children);\n * // => true\n *\n * _.isArrayLike('abc');\n * // => true\n *\n * _.isArrayLike(_.noop);\n * // => false\n */\nfunction isArrayLike(value) {\n return value != null && isLength(value.length) && !isFunction(value);\n}\n\nmodule.exports = isArrayLike;\n","var baseGetTag = require('./_baseGetTag'),\n isLength = require('./isLength'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n arrayTag = '[object Array]',\n boolTag = '[object Boolean]',\n dateTag = '[object Date]',\n errorTag = '[object Error]',\n funcTag = '[object Function]',\n mapTag = '[object Map]',\n numberTag = '[object Number]',\n objectTag = '[object Object]',\n regexpTag = '[object RegExp]',\n setTag = '[object Set]',\n stringTag = '[object String]',\n weakMapTag = '[object WeakMap]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n dataViewTag = '[object DataView]',\n float32Tag = '[object Float32Array]',\n float64Tag = '[object Float64Array]',\n int8Tag = '[object Int8Array]',\n int16Tag = '[object Int16Array]',\n int32Tag = '[object Int32Array]',\n uint8Tag = '[object Uint8Array]',\n uint8ClampedTag = '[object Uint8ClampedArray]',\n uint16Tag = '[object Uint16Array]',\n uint32Tag = '[object Uint32Array]';\n\n/** Used to identify `toStringTag` values of typed arrays. */\nvar typedArrayTags = {};\ntypedArrayTags[float32Tag] = typedArrayTags[float64Tag] =\ntypedArrayTags[int8Tag] = typedArrayTags[int16Tag] =\ntypedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =\ntypedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =\ntypedArrayTags[uint32Tag] = true;\ntypedArrayTags[argsTag] = typedArrayTags[arrayTag] =\ntypedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =\ntypedArrayTags[dataViewTag] = typedArrayTags[dateTag] =\ntypedArrayTags[errorTag] = typedArrayTags[funcTag] =\ntypedArrayTags[mapTag] = typedArrayTags[numberTag] =\ntypedArrayTags[objectTag] = typedArrayTags[regexpTag] =\ntypedArrayTags[setTag] = typedArrayTags[stringTag] =\ntypedArrayTags[weakMapTag] = false;\n\n/**\n * The base implementation of `_.isTypedArray` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n */\nfunction baseIsTypedArray(value) {\n return isObjectLike(value) &&\n isLength(value.length) && !!typedArrayTags[baseGetTag(value)];\n}\n\nmodule.exports = baseIsTypedArray;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.VERSION = void 0;\n// needs a separate module as this is required inside chevrotain productive code\n// and also in the entry point for webpack(api.ts).\n// A separate file avoids cyclic dependencies and webpack errors.\nexports.VERSION = \"10.5.0\";\n//# sourceMappingURL=version.js.map","/**\n * A specialized version of `_.map` for arrays without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n */\nfunction arrayMap(array, iteratee) {\n var index = -1,\n length = array == null ? 0 : array.length,\n result = Array(length);\n\n while (++index < length) {\n result[index] = iteratee(array[index], index, array);\n }\n return result;\n}\n\nmodule.exports = arrayMap;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.IN = void 0;\n// TODO: can this be removed? where is it used?\nexports.IN = \"_~IN~_\";\n//# sourceMappingURL=constants.js.map","var baseGetTag = require('./_baseGetTag'),\n isArray = require('./isArray'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar stringTag = '[object String]';\n\n/**\n * Checks if `value` is classified as a `String` primitive or object.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a string, else `false`.\n * @example\n *\n * _.isString('abc');\n * // => true\n *\n * _.isString(1);\n * // => false\n */\nfunction isString(value) {\n return typeof value == 'string' ||\n (!isArray(value) && isObjectLike(value) && baseGetTag(value) == stringTag);\n}\n\nmodule.exports = isString;\n","\"use strict\";\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.charCodeToOptimizedIndex = exports.minOptimizationVal = exports.buildLineBreakIssueMessage = exports.LineTerminatorOptimizedTester = exports.isShortPattern = exports.isCustomPattern = exports.cloneEmptyGroups = exports.performWarningRuntimeChecks = exports.performRuntimeChecks = exports.addStickyFlag = exports.addStartOfInput = exports.findUnreachablePatterns = exports.findModesThatDoNotExist = exports.findInvalidGroupType = exports.findDuplicatePatterns = exports.findUnsupportedFlags = exports.findStartOfInputAnchor = exports.findEmptyMatchRegExps = exports.findEndOfInputAnchor = exports.findInvalidPatterns = exports.findMissingPatterns = exports.validatePatterns = exports.analyzeTokenTypes = exports.enableSticky = exports.disableSticky = exports.SUPPORT_STICKY = exports.MODES = exports.DEFAULT_MODE = void 0;\nvar regexp_to_ast_1 = require(\"regexp-to-ast\");\nvar lexer_public_1 = require(\"./lexer_public\");\nvar first_1 = __importDefault(require(\"lodash/first\"));\nvar isEmpty_1 = __importDefault(require(\"lodash/isEmpty\"));\nvar compact_1 = __importDefault(require(\"lodash/compact\"));\nvar isArray_1 = __importDefault(require(\"lodash/isArray\"));\nvar values_1 = __importDefault(require(\"lodash/values\"));\nvar flatten_1 = __importDefault(require(\"lodash/flatten\"));\nvar reject_1 = __importDefault(require(\"lodash/reject\"));\nvar difference_1 = __importDefault(require(\"lodash/difference\"));\nvar indexOf_1 = __importDefault(require(\"lodash/indexOf\"));\nvar map_1 = __importDefault(require(\"lodash/map\"));\nvar forEach_1 = __importDefault(require(\"lodash/forEach\"));\nvar isString_1 = __importDefault(require(\"lodash/isString\"));\nvar isFunction_1 = __importDefault(require(\"lodash/isFunction\"));\nvar isUndefined_1 = __importDefault(require(\"lodash/isUndefined\"));\nvar find_1 = __importDefault(require(\"lodash/find\"));\nvar has_1 = __importDefault(require(\"lodash/has\"));\nvar keys_1 = __importDefault(require(\"lodash/keys\"));\nvar isRegExp_1 = __importDefault(require(\"lodash/isRegExp\"));\nvar filter_1 = __importDefault(require(\"lodash/filter\"));\nvar defaults_1 = __importDefault(require(\"lodash/defaults\"));\nvar reduce_1 = __importDefault(require(\"lodash/reduce\"));\nvar includes_1 = __importDefault(require(\"lodash/includes\"));\nvar utils_1 = require(\"@chevrotain/utils\");\nvar reg_exp_1 = require(\"./reg_exp\");\nvar reg_exp_parser_1 = require(\"./reg_exp_parser\");\nvar PATTERN = \"PATTERN\";\nexports.DEFAULT_MODE = \"defaultMode\";\nexports.MODES = \"modes\";\nexports.SUPPORT_STICKY = typeof new RegExp(\"(?:)\").sticky === \"boolean\";\nfunction disableSticky() {\n exports.SUPPORT_STICKY = false;\n}\nexports.disableSticky = disableSticky;\nfunction enableSticky() {\n exports.SUPPORT_STICKY = true;\n}\nexports.enableSticky = enableSticky;\nfunction analyzeTokenTypes(tokenTypes, options) {\n options = (0, defaults_1.default)(options, {\n useSticky: exports.SUPPORT_STICKY,\n debug: false,\n safeMode: false,\n positionTracking: \"full\",\n lineTerminatorCharacters: [\"\\r\", \"\\n\"],\n tracer: function (msg, action) { return action(); }\n });\n var tracer = options.tracer;\n tracer(\"initCharCodeToOptimizedIndexMap\", function () {\n initCharCodeToOptimizedIndexMap();\n });\n var onlyRelevantTypes;\n tracer(\"Reject Lexer.NA\", function () {\n onlyRelevantTypes = (0, reject_1.default)(tokenTypes, function (currType) {\n return currType[PATTERN] === lexer_public_1.Lexer.NA;\n });\n });\n var hasCustom = false;\n var allTransformedPatterns;\n tracer(\"Transform Patterns\", function () {\n hasCustom = false;\n allTransformedPatterns = (0, map_1.default)(onlyRelevantTypes, function (currType) {\n var currPattern = currType[PATTERN];\n /* istanbul ignore else */\n if ((0, isRegExp_1.default)(currPattern)) {\n var regExpSource = currPattern.source;\n if (regExpSource.length === 1 &&\n // only these regExp meta characters which can appear in a length one regExp\n regExpSource !== \"^\" &&\n regExpSource !== \"$\" &&\n regExpSource !== \".\" &&\n !currPattern.ignoreCase) {\n return regExpSource;\n }\n else if (regExpSource.length === 2 &&\n regExpSource[0] === \"\\\\\" &&\n // not a meta character\n !(0, includes_1.default)([\n \"d\",\n \"D\",\n \"s\",\n \"S\",\n \"t\",\n \"r\",\n \"n\",\n \"t\",\n \"0\",\n \"c\",\n \"b\",\n \"B\",\n \"f\",\n \"v\",\n \"w\",\n \"W\"\n ], regExpSource[1])) {\n // escaped meta Characters: /\\+/ /\\[/\n // or redundant escaping: /\\a/\n // without the escaping \"\\\"\n return regExpSource[1];\n }\n else {\n return options.useSticky\n ? addStickyFlag(currPattern)\n : addStartOfInput(currPattern);\n }\n }\n else if ((0, isFunction_1.default)(currPattern)) {\n hasCustom = true;\n // CustomPatternMatcherFunc - custom patterns do not require any transformations, only wrapping in a RegExp Like object\n return { exec: currPattern };\n }\n else if (typeof currPattern === \"object\") {\n hasCustom = true;\n // ICustomPattern\n return currPattern;\n }\n else if (typeof currPattern === \"string\") {\n if (currPattern.length === 1) {\n return currPattern;\n }\n else {\n var escapedRegExpString = currPattern.replace(/[\\\\^$.*+?()[\\]{}|]/g, \"\\\\$&\");\n var wrappedRegExp = new RegExp(escapedRegExpString);\n return options.useSticky\n ? addStickyFlag(wrappedRegExp)\n : addStartOfInput(wrappedRegExp);\n }\n }\n else {\n throw Error(\"non exhaustive match\");\n }\n });\n });\n var patternIdxToType;\n var patternIdxToGroup;\n var patternIdxToLongerAltIdxArr;\n var patternIdxToPushMode;\n var patternIdxToPopMode;\n tracer(\"misc mapping\", function () {\n patternIdxToType = (0, map_1.default)(onlyRelevantTypes, function (currType) { return currType.tokenTypeIdx; });\n patternIdxToGroup = (0, map_1.default)(onlyRelevantTypes, function (clazz) {\n var groupName = clazz.GROUP;\n /* istanbul ignore next */\n if (groupName === lexer_public_1.Lexer.SKIPPED) {\n return undefined;\n }\n else if ((0, isString_1.default)(groupName)) {\n return groupName;\n }\n else if ((0, isUndefined_1.default)(groupName)) {\n return false;\n }\n else {\n throw Error(\"non exhaustive match\");\n }\n });\n patternIdxToLongerAltIdxArr = (0, map_1.default)(onlyRelevantTypes, function (clazz) {\n var longerAltType = clazz.LONGER_ALT;\n if (longerAltType) {\n var longerAltIdxArr = (0, isArray_1.default)(longerAltType)\n ? (0, map_1.default)(longerAltType, function (type) { return (0, indexOf_1.default)(onlyRelevantTypes, type); })\n : [(0, indexOf_1.default)(onlyRelevantTypes, longerAltType)];\n return longerAltIdxArr;\n }\n });\n patternIdxToPushMode = (0, map_1.default)(onlyRelevantTypes, function (clazz) { return clazz.PUSH_MODE; });\n patternIdxToPopMode = (0, map_1.default)(onlyRelevantTypes, function (clazz) {\n return (0, has_1.default)(clazz, \"POP_MODE\");\n });\n });\n var patternIdxToCanLineTerminator;\n tracer(\"Line Terminator Handling\", function () {\n var lineTerminatorCharCodes = getCharCodes(options.lineTerminatorCharacters);\n patternIdxToCanLineTerminator = (0, map_1.default)(onlyRelevantTypes, function (tokType) { return false; });\n if (options.positionTracking !== \"onlyOffset\") {\n patternIdxToCanLineTerminator = (0, map_1.default)(onlyRelevantTypes, function (tokType) {\n if ((0, has_1.default)(tokType, \"LINE_BREAKS\")) {\n return !!tokType.LINE_BREAKS;\n }\n else {\n return (checkLineBreaksIssues(tokType, lineTerminatorCharCodes) === false &&\n (0, reg_exp_1.canMatchCharCode)(lineTerminatorCharCodes, tokType.PATTERN));\n }\n });\n }\n });\n var patternIdxToIsCustom;\n var patternIdxToShort;\n var emptyGroups;\n var patternIdxToConfig;\n tracer(\"Misc Mapping #2\", function () {\n patternIdxToIsCustom = (0, map_1.default)(onlyRelevantTypes, isCustomPattern);\n patternIdxToShort = (0, map_1.default)(allTransformedPatterns, isShortPattern);\n emptyGroups = (0, reduce_1.default)(onlyRelevantTypes, function (acc, clazz) {\n var groupName = clazz.GROUP;\n if ((0, isString_1.default)(groupName) && !(groupName === lexer_public_1.Lexer.SKIPPED)) {\n acc[groupName] = [];\n }\n return acc;\n }, {});\n patternIdxToConfig = (0, map_1.default)(allTransformedPatterns, function (x, idx) {\n return {\n pattern: allTransformedPatterns[idx],\n longerAlt: patternIdxToLongerAltIdxArr[idx],\n canLineTerminator: patternIdxToCanLineTerminator[idx],\n isCustom: patternIdxToIsCustom[idx],\n short: patternIdxToShort[idx],\n group: patternIdxToGroup[idx],\n push: patternIdxToPushMode[idx],\n pop: patternIdxToPopMode[idx],\n tokenTypeIdx: patternIdxToType[idx],\n tokenType: onlyRelevantTypes[idx]\n };\n });\n });\n var canBeOptimized = true;\n var charCodeToPatternIdxToConfig = [];\n if (!options.safeMode) {\n tracer(\"First Char Optimization\", function () {\n charCodeToPatternIdxToConfig = (0, reduce_1.default)(onlyRelevantTypes, function (result, currTokType, idx) {\n if (typeof currTokType.PATTERN === \"string\") {\n var charCode = currTokType.PATTERN.charCodeAt(0);\n var optimizedIdx = charCodeToOptimizedIndex(charCode);\n addToMapOfArrays(result, optimizedIdx, patternIdxToConfig[idx]);\n }\n else if ((0, isArray_1.default)(currTokType.START_CHARS_HINT)) {\n var lastOptimizedIdx_1;\n (0, forEach_1.default)(currTokType.START_CHARS_HINT, function (charOrInt) {\n var charCode = typeof charOrInt === \"string\"\n ? charOrInt.charCodeAt(0)\n : charOrInt;\n var currOptimizedIdx = charCodeToOptimizedIndex(charCode);\n // Avoid adding the config multiple times\n /* istanbul ignore else */\n // - Difficult to check this scenario effects as it is only a performance\n // optimization that does not change correctness\n if (lastOptimizedIdx_1 !== currOptimizedIdx) {\n lastOptimizedIdx_1 = currOptimizedIdx;\n addToMapOfArrays(result, currOptimizedIdx, patternIdxToConfig[idx]);\n }\n });\n }\n else if ((0, isRegExp_1.default)(currTokType.PATTERN)) {\n if (currTokType.PATTERN.unicode) {\n canBeOptimized = false;\n if (options.ensureOptimizations) {\n (0, utils_1.PRINT_ERROR)(\"\".concat(reg_exp_1.failedOptimizationPrefixMsg) +\n \"\\tUnable to analyze < \".concat(currTokType.PATTERN.toString(), \" > pattern.\\n\") +\n \"\\tThe regexp unicode flag is not currently supported by the regexp-to-ast library.\\n\" +\n \"\\tThis will disable the lexer's first char optimizations.\\n\" +\n \"\\tFor details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#UNICODE_OPTIMIZE\");\n }\n }\n else {\n var optimizedCodes = (0, reg_exp_1.getOptimizedStartCodesIndices)(currTokType.PATTERN, options.ensureOptimizations);\n /* istanbul ignore if */\n // start code will only be empty given an empty regExp or failure of regexp-to-ast library\n // the first should be a different validation and the second cannot be tested.\n if ((0, isEmpty_1.default)(optimizedCodes)) {\n // we cannot understand what codes may start possible matches\n // The optimization correctness requires knowing start codes for ALL patterns.\n // Not actually sure this is an error, no debug message\n canBeOptimized = false;\n }\n (0, forEach_1.default)(optimizedCodes, function (code) {\n addToMapOfArrays(result, code, patternIdxToConfig[idx]);\n });\n }\n }\n else {\n if (options.ensureOptimizations) {\n (0, utils_1.PRINT_ERROR)(\"\".concat(reg_exp_1.failedOptimizationPrefixMsg) +\n \"\\tTokenType: <\".concat(currTokType.name, \"> is using a custom token pattern without providing parameter.\\n\") +\n \"\\tThis will disable the lexer's first char optimizations.\\n\" +\n \"\\tFor details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#CUSTOM_OPTIMIZE\");\n }\n canBeOptimized = false;\n }\n return result;\n }, []);\n });\n }\n return {\n emptyGroups: emptyGroups,\n patternIdxToConfig: patternIdxToConfig,\n charCodeToPatternIdxToConfig: charCodeToPatternIdxToConfig,\n hasCustom: hasCustom,\n canBeOptimized: canBeOptimized\n };\n}\nexports.analyzeTokenTypes = analyzeTokenTypes;\nfunction validatePatterns(tokenTypes, validModesNames) {\n var errors = [];\n var missingResult = findMissingPatterns(tokenTypes);\n errors = errors.concat(missingResult.errors);\n var invalidResult = findInvalidPatterns(missingResult.valid);\n var validTokenTypes = invalidResult.valid;\n errors = errors.concat(invalidResult.errors);\n errors = errors.concat(validateRegExpPattern(validTokenTypes));\n errors = errors.concat(findInvalidGroupType(validTokenTypes));\n errors = errors.concat(findModesThatDoNotExist(validTokenTypes, validModesNames));\n errors = errors.concat(findUnreachablePatterns(validTokenTypes));\n return errors;\n}\nexports.validatePatterns = validatePatterns;\nfunction validateRegExpPattern(tokenTypes) {\n var errors = [];\n var withRegExpPatterns = (0, filter_1.default)(tokenTypes, function (currTokType) {\n return (0, isRegExp_1.default)(currTokType[PATTERN]);\n });\n errors = errors.concat(findEndOfInputAnchor(withRegExpPatterns));\n errors = errors.concat(findStartOfInputAnchor(withRegExpPatterns));\n errors = errors.concat(findUnsupportedFlags(withRegExpPatterns));\n errors = errors.concat(findDuplicatePatterns(withRegExpPatterns));\n errors = errors.concat(findEmptyMatchRegExps(withRegExpPatterns));\n return errors;\n}\nfunction findMissingPatterns(tokenTypes) {\n var tokenTypesWithMissingPattern = (0, filter_1.default)(tokenTypes, function (currType) {\n return !(0, has_1.default)(currType, PATTERN);\n });\n var errors = (0, map_1.default)(tokenTypesWithMissingPattern, function (currType) {\n return {\n message: \"Token Type: ->\" +\n currType.name +\n \"<- missing static 'PATTERN' property\",\n type: lexer_public_1.LexerDefinitionErrorType.MISSING_PATTERN,\n tokenTypes: [currType]\n };\n });\n var valid = (0, difference_1.default)(tokenTypes, tokenTypesWithMissingPattern);\n return { errors: errors, valid: valid };\n}\nexports.findMissingPatterns = findMissingPatterns;\nfunction findInvalidPatterns(tokenTypes) {\n var tokenTypesWithInvalidPattern = (0, filter_1.default)(tokenTypes, function (currType) {\n var pattern = currType[PATTERN];\n return (!(0, isRegExp_1.default)(pattern) &&\n !(0, isFunction_1.default)(pattern) &&\n !(0, has_1.default)(pattern, \"exec\") &&\n !(0, isString_1.default)(pattern));\n });\n var errors = (0, map_1.default)(tokenTypesWithInvalidPattern, function (currType) {\n return {\n message: \"Token Type: ->\" +\n currType.name +\n \"<- static 'PATTERN' can only be a RegExp, a\" +\n \" Function matching the {CustomPatternMatcherFunc} type or an Object matching the {ICustomPattern} interface.\",\n type: lexer_public_1.LexerDefinitionErrorType.INVALID_PATTERN,\n tokenTypes: [currType]\n };\n });\n var valid = (0, difference_1.default)(tokenTypes, tokenTypesWithInvalidPattern);\n return { errors: errors, valid: valid };\n}\nexports.findInvalidPatterns = findInvalidPatterns;\nvar end_of_input = /[^\\\\][$]/;\nfunction findEndOfInputAnchor(tokenTypes) {\n var EndAnchorFinder = /** @class */ (function (_super) {\n __extends(EndAnchorFinder, _super);\n function EndAnchorFinder() {\n var _this = _super !== null && _super.apply(this, arguments) || this;\n _this.found = false;\n return _this;\n }\n EndAnchorFinder.prototype.visitEndAnchor = function (node) {\n this.found = true;\n };\n return EndAnchorFinder;\n }(regexp_to_ast_1.BaseRegExpVisitor));\n var invalidRegex = (0, filter_1.default)(tokenTypes, function (currType) {\n var pattern = currType.PATTERN;\n try {\n var regexpAst = (0, reg_exp_parser_1.getRegExpAst)(pattern);\n var endAnchorVisitor = new EndAnchorFinder();\n endAnchorVisitor.visit(regexpAst);\n return endAnchorVisitor.found;\n }\n catch (e) {\n // old behavior in case of runtime exceptions with regexp-to-ast.\n /* istanbul ignore next - cannot ensure an error in regexp-to-ast*/\n return end_of_input.test(pattern.source);\n }\n });\n var errors = (0, map_1.default)(invalidRegex, function (currType) {\n return {\n message: \"Unexpected RegExp Anchor Error:\\n\" +\n \"\\tToken Type: ->\" +\n currType.name +\n \"<- static 'PATTERN' cannot contain end of input anchor '$'\\n\" +\n \"\\tSee chevrotain.io/docs/guide/resolving_lexer_errors.html#ANCHORS\" +\n \"\\tfor details.\",\n type: lexer_public_1.LexerDefinitionErrorType.EOI_ANCHOR_FOUND,\n tokenTypes: [currType]\n };\n });\n return errors;\n}\nexports.findEndOfInputAnchor = findEndOfInputAnchor;\nfunction findEmptyMatchRegExps(tokenTypes) {\n var matchesEmptyString = (0, filter_1.default)(tokenTypes, function (currType) {\n var pattern = currType.PATTERN;\n return pattern.test(\"\");\n });\n var errors = (0, map_1.default)(matchesEmptyString, function (currType) {\n return {\n message: \"Token Type: ->\" +\n currType.name +\n \"<- static 'PATTERN' must not match an empty string\",\n type: lexer_public_1.LexerDefinitionErrorType.EMPTY_MATCH_PATTERN,\n tokenTypes: [currType]\n };\n });\n return errors;\n}\nexports.findEmptyMatchRegExps = findEmptyMatchRegExps;\nvar start_of_input = /[^\\\\[][\\^]|^\\^/;\nfunction findStartOfInputAnchor(tokenTypes) {\n var StartAnchorFinder = /** @class */ (function (_super) {\n __extends(StartAnchorFinder, _super);\n function StartAnchorFinder() {\n var _this = _super !== null && _super.apply(this, arguments) || this;\n _this.found = false;\n return _this;\n }\n StartAnchorFinder.prototype.visitStartAnchor = function (node) {\n this.found = true;\n };\n return StartAnchorFinder;\n }(regexp_to_ast_1.BaseRegExpVisitor));\n var invalidRegex = (0, filter_1.default)(tokenTypes, function (currType) {\n var pattern = currType.PATTERN;\n try {\n var regexpAst = (0, reg_exp_parser_1.getRegExpAst)(pattern);\n var startAnchorVisitor = new StartAnchorFinder();\n startAnchorVisitor.visit(regexpAst);\n return startAnchorVisitor.found;\n }\n catch (e) {\n // old behavior in case of runtime exceptions with regexp-to-ast.\n /* istanbul ignore next - cannot ensure an error in regexp-to-ast*/\n return start_of_input.test(pattern.source);\n }\n });\n var errors = (0, map_1.default)(invalidRegex, function (currType) {\n return {\n message: \"Unexpected RegExp Anchor Error:\\n\" +\n \"\\tToken Type: ->\" +\n currType.name +\n \"<- static 'PATTERN' cannot contain start of input anchor '^'\\n\" +\n \"\\tSee https://chevrotain.io/docs/guide/resolving_lexer_errors.html#ANCHORS\" +\n \"\\tfor details.\",\n type: lexer_public_1.LexerDefinitionErrorType.SOI_ANCHOR_FOUND,\n tokenTypes: [currType]\n };\n });\n return errors;\n}\nexports.findStartOfInputAnchor = findStartOfInputAnchor;\nfunction findUnsupportedFlags(tokenTypes) {\n var invalidFlags = (0, filter_1.default)(tokenTypes, function (currType) {\n var pattern = currType[PATTERN];\n return pattern instanceof RegExp && (pattern.multiline || pattern.global);\n });\n var errors = (0, map_1.default)(invalidFlags, function (currType) {\n return {\n message: \"Token Type: ->\" +\n currType.name +\n \"<- static 'PATTERN' may NOT contain global('g') or multiline('m')\",\n type: lexer_public_1.LexerDefinitionErrorType.UNSUPPORTED_FLAGS_FOUND,\n tokenTypes: [currType]\n };\n });\n return errors;\n}\nexports.findUnsupportedFlags = findUnsupportedFlags;\n// This can only test for identical duplicate RegExps, not semantically equivalent ones.\nfunction findDuplicatePatterns(tokenTypes) {\n var found = [];\n var identicalPatterns = (0, map_1.default)(tokenTypes, function (outerType) {\n return (0, reduce_1.default)(tokenTypes, function (result, innerType) {\n if (outerType.PATTERN.source === innerType.PATTERN.source &&\n !(0, includes_1.default)(found, innerType) &&\n innerType.PATTERN !== lexer_public_1.Lexer.NA) {\n // this avoids duplicates in the result, each Token Type may only appear in one \"set\"\n // in essence we are creating Equivalence classes on equality relation.\n found.push(innerType);\n result.push(innerType);\n return result;\n }\n return result;\n }, []);\n });\n identicalPatterns = (0, compact_1.default)(identicalPatterns);\n var duplicatePatterns = (0, filter_1.default)(identicalPatterns, function (currIdenticalSet) {\n return currIdenticalSet.length > 1;\n });\n var errors = (0, map_1.default)(duplicatePatterns, function (setOfIdentical) {\n var tokenTypeNames = (0, map_1.default)(setOfIdentical, function (currType) {\n return currType.name;\n });\n var dupPatternSrc = (0, first_1.default)(setOfIdentical).PATTERN;\n return {\n message: \"The same RegExp pattern ->\".concat(dupPatternSrc, \"<-\") +\n \"has been used in all of the following Token Types: \".concat(tokenTypeNames.join(\", \"), \" <-\"),\n type: lexer_public_1.LexerDefinitionErrorType.DUPLICATE_PATTERNS_FOUND,\n tokenTypes: setOfIdentical\n };\n });\n return errors;\n}\nexports.findDuplicatePatterns = findDuplicatePatterns;\nfunction findInvalidGroupType(tokenTypes) {\n var invalidTypes = (0, filter_1.default)(tokenTypes, function (clazz) {\n if (!(0, has_1.default)(clazz, \"GROUP\")) {\n return false;\n }\n var group = clazz.GROUP;\n return group !== lexer_public_1.Lexer.SKIPPED && group !== lexer_public_1.Lexer.NA && !(0, isString_1.default)(group);\n });\n var errors = (0, map_1.default)(invalidTypes, function (currType) {\n return {\n message: \"Token Type: ->\" +\n currType.name +\n \"<- static 'GROUP' can only be Lexer.SKIPPED/Lexer.NA/A String\",\n type: lexer_public_1.LexerDefinitionErrorType.INVALID_GROUP_TYPE_FOUND,\n tokenTypes: [currType]\n };\n });\n return errors;\n}\nexports.findInvalidGroupType = findInvalidGroupType;\nfunction findModesThatDoNotExist(tokenTypes, validModes) {\n var invalidModes = (0, filter_1.default)(tokenTypes, function (clazz) {\n return (clazz.PUSH_MODE !== undefined && !(0, includes_1.default)(validModes, clazz.PUSH_MODE));\n });\n var errors = (0, map_1.default)(invalidModes, function (tokType) {\n var msg = \"Token Type: ->\".concat(tokType.name, \"<- static 'PUSH_MODE' value cannot refer to a Lexer Mode ->\").concat(tokType.PUSH_MODE, \"<-\") +\n \"which does not exist\";\n return {\n message: msg,\n type: lexer_public_1.LexerDefinitionErrorType.PUSH_MODE_DOES_NOT_EXIST,\n tokenTypes: [tokType]\n };\n });\n return errors;\n}\nexports.findModesThatDoNotExist = findModesThatDoNotExist;\nfunction findUnreachablePatterns(tokenTypes) {\n var errors = [];\n var canBeTested = (0, reduce_1.default)(tokenTypes, function (result, tokType, idx) {\n var pattern = tokType.PATTERN;\n if (pattern === lexer_public_1.Lexer.NA) {\n return result;\n }\n // a more comprehensive validation for all forms of regExps would require\n // deeper regExp analysis capabilities\n if ((0, isString_1.default)(pattern)) {\n result.push({ str: pattern, idx: idx, tokenType: tokType });\n }\n else if ((0, isRegExp_1.default)(pattern) && noMetaChar(pattern)) {\n result.push({ str: pattern.source, idx: idx, tokenType: tokType });\n }\n return result;\n }, []);\n (0, forEach_1.default)(tokenTypes, function (tokType, testIdx) {\n (0, forEach_1.default)(canBeTested, function (_a) {\n var str = _a.str, idx = _a.idx, tokenType = _a.tokenType;\n if (testIdx < idx && testTokenType(str, tokType.PATTERN)) {\n var msg = \"Token: ->\".concat(tokenType.name, \"<- can never be matched.\\n\") +\n \"Because it appears AFTER the Token Type ->\".concat(tokType.name, \"<-\") +\n \"in the lexer's definition.\\n\" +\n \"See https://chevrotain.io/docs/guide/resolving_lexer_errors.html#UNREACHABLE\";\n errors.push({\n message: msg,\n type: lexer_public_1.LexerDefinitionErrorType.UNREACHABLE_PATTERN,\n tokenTypes: [tokType, tokenType]\n });\n }\n });\n });\n return errors;\n}\nexports.findUnreachablePatterns = findUnreachablePatterns;\nfunction testTokenType(str, pattern) {\n /* istanbul ignore else */\n if ((0, isRegExp_1.default)(pattern)) {\n var regExpArray = pattern.exec(str);\n return regExpArray !== null && regExpArray.index === 0;\n }\n else if ((0, isFunction_1.default)(pattern)) {\n // maintain the API of custom patterns\n return pattern(str, 0, [], {});\n }\n else if ((0, has_1.default)(pattern, \"exec\")) {\n // maintain the API of custom patterns\n return pattern.exec(str, 0, [], {});\n }\n else if (typeof pattern === \"string\") {\n return pattern === str;\n }\n else {\n throw Error(\"non exhaustive match\");\n }\n}\nfunction noMetaChar(regExp) {\n //https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp\n var metaChars = [\n \".\",\n \"\\\\\",\n \"[\",\n \"]\",\n \"|\",\n \"^\",\n \"$\",\n \"(\",\n \")\",\n \"?\",\n \"*\",\n \"+\",\n \"{\"\n ];\n return ((0, find_1.default)(metaChars, function (char) { return regExp.source.indexOf(char) !== -1; }) === undefined);\n}\nfunction addStartOfInput(pattern) {\n var flags = pattern.ignoreCase ? \"i\" : \"\";\n // always wrapping in a none capturing group preceded by '^' to make sure matching can only work on start of input.\n // duplicate/redundant start of input markers have no meaning (/^^^^A/ === /^A/)\n return new RegExp(\"^(?:\".concat(pattern.source, \")\"), flags);\n}\nexports.addStartOfInput = addStartOfInput;\nfunction addStickyFlag(pattern) {\n var flags = pattern.ignoreCase ? \"iy\" : \"y\";\n // always wrapping in a none capturing group preceded by '^' to make sure matching can only work on start of input.\n // duplicate/redundant start of input markers have no meaning (/^^^^A/ === /^A/)\n return new RegExp(\"\".concat(pattern.source), flags);\n}\nexports.addStickyFlag = addStickyFlag;\nfunction performRuntimeChecks(lexerDefinition, trackLines, lineTerminatorCharacters) {\n var errors = [];\n // some run time checks to help the end users.\n if (!(0, has_1.default)(lexerDefinition, exports.DEFAULT_MODE)) {\n errors.push({\n message: \"A MultiMode Lexer cannot be initialized without a <\" +\n exports.DEFAULT_MODE +\n \"> property in its definition\\n\",\n type: lexer_public_1.LexerDefinitionErrorType.MULTI_MODE_LEXER_WITHOUT_DEFAULT_MODE\n });\n }\n if (!(0, has_1.default)(lexerDefinition, exports.MODES)) {\n errors.push({\n message: \"A MultiMode Lexer cannot be initialized without a <\" +\n exports.MODES +\n \"> property in its definition\\n\",\n type: lexer_public_1.LexerDefinitionErrorType.MULTI_MODE_LEXER_WITHOUT_MODES_PROPERTY\n });\n }\n if ((0, has_1.default)(lexerDefinition, exports.MODES) &&\n (0, has_1.default)(lexerDefinition, exports.DEFAULT_MODE) &&\n !(0, has_1.default)(lexerDefinition.modes, lexerDefinition.defaultMode)) {\n errors.push({\n message: \"A MultiMode Lexer cannot be initialized with a \".concat(exports.DEFAULT_MODE, \": <\").concat(lexerDefinition.defaultMode, \">\") +\n \"which does not exist\\n\",\n type: lexer_public_1.LexerDefinitionErrorType.MULTI_MODE_LEXER_DEFAULT_MODE_VALUE_DOES_NOT_EXIST\n });\n }\n if ((0, has_1.default)(lexerDefinition, exports.MODES)) {\n (0, forEach_1.default)(lexerDefinition.modes, function (currModeValue, currModeName) {\n (0, forEach_1.default)(currModeValue, function (currTokType, currIdx) {\n if ((0, isUndefined_1.default)(currTokType)) {\n errors.push({\n message: \"A Lexer cannot be initialized using an undefined Token Type. Mode:\" +\n \"<\".concat(currModeName, \"> at index: <\").concat(currIdx, \">\\n\"),\n type: lexer_public_1.LexerDefinitionErrorType.LEXER_DEFINITION_CANNOT_CONTAIN_UNDEFINED\n });\n }\n else if ((0, has_1.default)(currTokType, \"LONGER_ALT\")) {\n var longerAlt = (0, isArray_1.default)(currTokType.LONGER_ALT)\n ? currTokType.LONGER_ALT\n : [currTokType.LONGER_ALT];\n (0, forEach_1.default)(longerAlt, function (currLongerAlt) {\n if (!(0, isUndefined_1.default)(currLongerAlt) &&\n !(0, includes_1.default)(currModeValue, currLongerAlt)) {\n errors.push({\n message: \"A MultiMode Lexer cannot be initialized with a longer_alt <\".concat(currLongerAlt.name, \"> on token <\").concat(currTokType.name, \"> outside of mode <\").concat(currModeName, \">\\n\"),\n type: lexer_public_1.LexerDefinitionErrorType.MULTI_MODE_LEXER_LONGER_ALT_NOT_IN_CURRENT_MODE\n });\n }\n });\n }\n });\n });\n }\n return errors;\n}\nexports.performRuntimeChecks = performRuntimeChecks;\nfunction performWarningRuntimeChecks(lexerDefinition, trackLines, lineTerminatorCharacters) {\n var warnings = [];\n var hasAnyLineBreak = false;\n var allTokenTypes = (0, compact_1.default)((0, flatten_1.default)((0, values_1.default)(lexerDefinition.modes)));\n var concreteTokenTypes = (0, reject_1.default)(allTokenTypes, function (currType) { return currType[PATTERN] === lexer_public_1.Lexer.NA; });\n var terminatorCharCodes = getCharCodes(lineTerminatorCharacters);\n if (trackLines) {\n (0, forEach_1.default)(concreteTokenTypes, function (tokType) {\n var currIssue = checkLineBreaksIssues(tokType, terminatorCharCodes);\n if (currIssue !== false) {\n var message = buildLineBreakIssueMessage(tokType, currIssue);\n var warningDescriptor = {\n message: message,\n type: currIssue.issue,\n tokenType: tokType\n };\n warnings.push(warningDescriptor);\n }\n else {\n // we don't want to attempt to scan if the user explicitly specified the line_breaks option.\n if ((0, has_1.default)(tokType, \"LINE_BREAKS\")) {\n if (tokType.LINE_BREAKS === true) {\n hasAnyLineBreak = true;\n }\n }\n else {\n if ((0, reg_exp_1.canMatchCharCode)(terminatorCharCodes, tokType.PATTERN)) {\n hasAnyLineBreak = true;\n }\n }\n }\n });\n }\n if (trackLines && !hasAnyLineBreak) {\n warnings.push({\n message: \"Warning: No LINE_BREAKS Found.\\n\" +\n \"\\tThis Lexer has been defined to track line and column information,\\n\" +\n \"\\tBut none of the Token Types can be identified as matching a line terminator.\\n\" +\n \"\\tSee https://chevrotain.io/docs/guide/resolving_lexer_errors.html#LINE_BREAKS \\n\" +\n \"\\tfor details.\",\n type: lexer_public_1.LexerDefinitionErrorType.NO_LINE_BREAKS_FLAGS\n });\n }\n return warnings;\n}\nexports.performWarningRuntimeChecks = performWarningRuntimeChecks;\nfunction cloneEmptyGroups(emptyGroups) {\n var clonedResult = {};\n var groupKeys = (0, keys_1.default)(emptyGroups);\n (0, forEach_1.default)(groupKeys, function (currKey) {\n var currGroupValue = emptyGroups[currKey];\n /* istanbul ignore else */\n if ((0, isArray_1.default)(currGroupValue)) {\n clonedResult[currKey] = [];\n }\n else {\n throw Error(\"non exhaustive match\");\n }\n });\n return clonedResult;\n}\nexports.cloneEmptyGroups = cloneEmptyGroups;\n// TODO: refactor to avoid duplication\nfunction isCustomPattern(tokenType) {\n var pattern = tokenType.PATTERN;\n /* istanbul ignore else */\n if ((0, isRegExp_1.default)(pattern)) {\n return false;\n }\n else if ((0, isFunction_1.default)(pattern)) {\n // CustomPatternMatcherFunc - custom patterns do not require any transformations, only wrapping in a RegExp Like object\n return true;\n }\n else if ((0, has_1.default)(pattern, \"exec\")) {\n // ICustomPattern\n return true;\n }\n else if ((0, isString_1.default)(pattern)) {\n return false;\n }\n else {\n throw Error(\"non exhaustive match\");\n }\n}\nexports.isCustomPattern = isCustomPattern;\nfunction isShortPattern(pattern) {\n if ((0, isString_1.default)(pattern) && pattern.length === 1) {\n return pattern.charCodeAt(0);\n }\n else {\n return false;\n }\n}\nexports.isShortPattern = isShortPattern;\n/**\n * Faster than using a RegExp for default newline detection during lexing.\n */\nexports.LineTerminatorOptimizedTester = {\n // implements /\\n|\\r\\n?/g.test\n test: function (text) {\n var len = text.length;\n for (var i = this.lastIndex; i < len; i++) {\n var c = text.charCodeAt(i);\n if (c === 10) {\n this.lastIndex = i + 1;\n return true;\n }\n else if (c === 13) {\n if (text.charCodeAt(i + 1) === 10) {\n this.lastIndex = i + 2;\n }\n else {\n this.lastIndex = i + 1;\n }\n return true;\n }\n }\n return false;\n },\n lastIndex: 0\n};\nfunction checkLineBreaksIssues(tokType, lineTerminatorCharCodes) {\n if ((0, has_1.default)(tokType, \"LINE_BREAKS\")) {\n // if the user explicitly declared the line_breaks option we will respect their choice\n // and assume it is correct.\n return false;\n }\n else {\n /* istanbul ignore else */\n if ((0, isRegExp_1.default)(tokType.PATTERN)) {\n try {\n // TODO: why is the casting suddenly needed?\n (0, reg_exp_1.canMatchCharCode)(lineTerminatorCharCodes, tokType.PATTERN);\n }\n catch (e) {\n /* istanbul ignore next - to test this we would have to mock to throw an error */\n return {\n issue: lexer_public_1.LexerDefinitionErrorType.IDENTIFY_TERMINATOR,\n errMsg: e.message\n };\n }\n return false;\n }\n else if ((0, isString_1.default)(tokType.PATTERN)) {\n // string literal patterns can always be analyzed to detect line terminator usage\n return false;\n }\n else if (isCustomPattern(tokType)) {\n // custom token types\n return { issue: lexer_public_1.LexerDefinitionErrorType.CUSTOM_LINE_BREAK };\n }\n else {\n throw Error(\"non exhaustive match\");\n }\n }\n}\nfunction buildLineBreakIssueMessage(tokType, details) {\n /* istanbul ignore else */\n if (details.issue === lexer_public_1.LexerDefinitionErrorType.IDENTIFY_TERMINATOR) {\n return (\"Warning: unable to identify line terminator usage in pattern.\\n\" +\n \"\\tThe problem is in the <\".concat(tokType.name, \"> Token Type\\n\") +\n \"\\t Root cause: \".concat(details.errMsg, \".\\n\") +\n \"\\tFor details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#IDENTIFY_TERMINATOR\");\n }\n else if (details.issue === lexer_public_1.LexerDefinitionErrorType.CUSTOM_LINE_BREAK) {\n return (\"Warning: A Custom Token Pattern should specify the option.\\n\" +\n \"\\tThe problem is in the <\".concat(tokType.name, \"> Token Type\\n\") +\n \"\\tFor details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#CUSTOM_LINE_BREAK\");\n }\n else {\n throw Error(\"non exhaustive match\");\n }\n}\nexports.buildLineBreakIssueMessage = buildLineBreakIssueMessage;\nfunction getCharCodes(charsOrCodes) {\n var charCodes = (0, map_1.default)(charsOrCodes, function (numOrString) {\n if ((0, isString_1.default)(numOrString)) {\n return numOrString.charCodeAt(0);\n }\n else {\n return numOrString;\n }\n });\n return charCodes;\n}\nfunction addToMapOfArrays(map, key, value) {\n if (map[key] === undefined) {\n map[key] = [value];\n }\n else {\n map[key].push(value);\n }\n}\nexports.minOptimizationVal = 256;\n/**\n * We are mapping charCode above ASCI (256) into buckets each in the size of 256.\n * This is because ASCI are the most common start chars so each one of those will get its own\n * possible token configs vector.\n *\n * Tokens starting with charCodes \"above\" ASCI are uncommon, so we can \"afford\"\n * to place these into buckets of possible token configs, What we gain from\n * this is avoiding the case of creating an optimization 'charCodeToPatternIdxToConfig'\n * which would contain 10,000+ arrays of small size (e.g unicode Identifiers scenario).\n * Our 'charCodeToPatternIdxToConfig' max size will now be:\n * 256 + (2^16 / 2^8) - 1 === 511\n *\n * note the hack for fast division integer part extraction\n * See: https://stackoverflow.com/a/4228528\n */\nvar charCodeToOptimizedIdxMap = [];\nfunction charCodeToOptimizedIndex(charCode) {\n return charCode < exports.minOptimizationVal\n ? charCode\n : charCodeToOptimizedIdxMap[charCode];\n}\nexports.charCodeToOptimizedIndex = charCodeToOptimizedIndex;\n/**\n * This is a compromise between cold start / hot running performance\n * Creating this array takes ~3ms on a modern machine,\n * But if we perform the computation at runtime as needed the CSS Lexer benchmark\n * performance degrades by ~10%\n *\n * TODO: Perhaps it should be lazy initialized only if a charCode > 255 is used.\n */\nfunction initCharCodeToOptimizedIndexMap() {\n if ((0, isEmpty_1.default)(charCodeToOptimizedIdxMap)) {\n charCodeToOptimizedIdxMap = new Array(65536);\n for (var i = 0; i < 65536; i++) {\n charCodeToOptimizedIdxMap[i] = i > 255 ? 255 + ~~(i / 255) : i;\n }\n }\n}\n//# sourceMappingURL=lexer.js.map","var isFunction = require('./isFunction'),\n isMasked = require('./_isMasked'),\n isObject = require('./isObject'),\n toSource = require('./_toSource');\n\n/**\n * Used to match `RegExp`\n * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).\n */\nvar reRegExpChar = /[\\\\^$.*+?()[\\]{}|]/g;\n\n/** Used to detect host constructors (Safari). */\nvar reIsHostCtor = /^\\[object .+?Constructor\\]$/;\n\n/** Used for built-in method references. */\nvar funcProto = Function.prototype,\n objectProto = Object.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Used to detect if a method is native. */\nvar reIsNative = RegExp('^' +\n funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\\\$&')\n .replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$'\n);\n\n/**\n * The base implementation of `_.isNative` without bad shim checks.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a native function,\n * else `false`.\n */\nfunction baseIsNative(value) {\n if (!isObject(value) || isMasked(value)) {\n return false;\n }\n var pattern = isFunction(value) ? reIsNative : reIsHostCtor;\n return pattern.test(toSource(value));\n}\n\nmodule.exports = baseIsNative;\n","var baseEach = require('./_baseEach'),\n isArrayLike = require('./isArrayLike');\n\n/**\n * The base implementation of `_.map` without support for iteratee shorthands.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n */\nfunction baseMap(collection, iteratee) {\n var index = -1,\n result = isArrayLike(collection) ? Array(collection.length) : [];\n\n baseEach(collection, function(value, key, collection) {\n result[++index] = iteratee(value, key, collection);\n });\n return result;\n}\n\nmodule.exports = baseMap;\n","/**\n * The base implementation of `_.slice` without an iteratee call guard.\n *\n * @private\n * @param {Array} array The array to slice.\n * @param {number} [start=0] The start position.\n * @param {number} [end=array.length] The end position.\n * @returns {Array} Returns the slice of `array`.\n */\nfunction baseSlice(array, start, end) {\n var index = -1,\n length = array.length;\n\n if (start < 0) {\n start = -start > length ? 0 : (length + start);\n }\n end = end > length ? length : end;\n if (end < 0) {\n end += length;\n }\n length = start > end ? 0 : ((end - start) >>> 0);\n start >>>= 0;\n\n var result = Array(length);\n while (++index < length) {\n result[index] = array[index + start];\n }\n return result;\n}\n\nmodule.exports = baseSlice;\n","/**\n * Performs a\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * comparison between two values to determine if they are equivalent.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * _.eq(object, object);\n * // => true\n *\n * _.eq(object, other);\n * // => false\n *\n * _.eq('a', 'a');\n * // => true\n *\n * _.eq('a', Object('a'));\n * // => false\n *\n * _.eq(NaN, NaN);\n * // => true\n */\nfunction eq(value, other) {\n return value === other || (value !== value && other !== other);\n}\n\nmodule.exports = eq;\n","var baseIndexOf = require('./_baseIndexOf');\n\n/**\n * A specialized version of `_.includes` for arrays without support for\n * specifying an index to search from.\n *\n * @private\n * @param {Array} [array] The array to inspect.\n * @param {*} target The value to search for.\n * @returns {boolean} Returns `true` if `target` is found, else `false`.\n */\nfunction arrayIncludes(array, value) {\n var length = array == null ? 0 : array.length;\n return !!length && baseIndexOf(array, value, 0) > -1;\n}\n\nmodule.exports = arrayIncludes;\n","var arrayMap = require('./_arrayMap'),\n baseIteratee = require('./_baseIteratee'),\n baseMap = require('./_baseMap'),\n isArray = require('./isArray');\n\n/**\n * Creates an array of values by running each element in `collection` thru\n * `iteratee`. The iteratee is invoked with three arguments:\n * (value, index|key, collection).\n *\n * Many lodash methods are guarded to work as iteratees for methods like\n * `_.every`, `_.filter`, `_.map`, `_.mapValues`, `_.reject`, and `_.some`.\n *\n * The guarded methods are:\n * `ary`, `chunk`, `curry`, `curryRight`, `drop`, `dropRight`, `every`,\n * `fill`, `invert`, `parseInt`, `random`, `range`, `rangeRight`, `repeat`,\n * `sampleSize`, `slice`, `some`, `sortBy`, `split`, `take`, `takeRight`,\n * `template`, `trim`, `trimEnd`, `trimStart`, and `words`\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n * @example\n *\n * function square(n) {\n * return n * n;\n * }\n *\n * _.map([4, 8], square);\n * // => [16, 64]\n *\n * _.map({ 'a': 4, 'b': 8 }, square);\n * // => [16, 64] (iteration order is not guaranteed)\n *\n * var users = [\n * { 'user': 'barney' },\n * { 'user': 'fred' }\n * ];\n *\n * // The `_.property` iteratee shorthand.\n * _.map(users, 'user');\n * // => ['barney', 'fred']\n */\nfunction map(collection, iteratee) {\n var func = isArray(collection) ? arrayMap : baseMap;\n return func(collection, baseIteratee(iteratee, 3));\n}\n\nmodule.exports = map;\n","var baseMatches = require('./_baseMatches'),\n baseMatchesProperty = require('./_baseMatchesProperty'),\n identity = require('./identity'),\n isArray = require('./isArray'),\n property = require('./property');\n\n/**\n * The base implementation of `_.iteratee`.\n *\n * @private\n * @param {*} [value=_.identity] The value to convert to an iteratee.\n * @returns {Function} Returns the iteratee.\n */\nfunction baseIteratee(value) {\n // Don't store the `typeof` result in a variable to avoid a JIT bug in Safari 9.\n // See https://bugs.webkit.org/show_bug.cgi?id=156034 for more details.\n if (typeof value == 'function') {\n return value;\n }\n if (value == null) {\n return identity;\n }\n if (typeof value == 'object') {\n return isArray(value)\n ? baseMatchesProperty(value[0], value[1])\n : baseMatches(value);\n }\n return property(value);\n}\n\nmodule.exports = baseIteratee;\n","/**\n * The base implementation of `_.isNaN` without support for number objects.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.\n */\nfunction baseIsNaN(value) {\n return value !== value;\n}\n\nmodule.exports = baseIsNaN;\n","var root = require('./_root');\n\n/** Used to detect overreaching core-js shims. */\nvar coreJsData = root['__core-js_shared__'];\n\nmodule.exports = coreJsData;\n","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Checks if `value` is likely a prototype object.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.\n */\nfunction isPrototype(value) {\n var Ctor = value && value.constructor,\n proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;\n\n return value === proto;\n}\n\nmodule.exports = isPrototype;\n","var baseCreate = require('./_baseCreate'),\n getPrototype = require('./_getPrototype'),\n isPrototype = require('./_isPrototype');\n\n/**\n * Initializes an object clone.\n *\n * @private\n * @param {Object} object The object to clone.\n * @returns {Object} Returns the initialized clone.\n */\nfunction initCloneObject(object) {\n return (typeof object.constructor == 'function' && !isPrototype(object))\n ? baseCreate(getPrototype(object))\n : {};\n}\n\nmodule.exports = initCloneObject;\n","/**\n * The base implementation of `_.reduce` and `_.reduceRight`, without support\n * for iteratee shorthands, which iterates over `collection` using `eachFunc`.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {*} accumulator The initial value.\n * @param {boolean} initAccum Specify using the first or last element of\n * `collection` as the initial value.\n * @param {Function} eachFunc The function to iterate over `collection`.\n * @returns {*} Returns the accumulated value.\n */\nfunction baseReduce(collection, iteratee, accumulator, initAccum, eachFunc) {\n eachFunc(collection, function(value, index, collection) {\n accumulator = initAccum\n ? (initAccum = false, value)\n : iteratee(accumulator, value, index, collection);\n });\n return accumulator;\n}\n\nmodule.exports = baseReduce;\n","var getNative = require('./_getNative'),\n root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar DataView = getNative(root, 'DataView');\n\nmodule.exports = DataView;\n","/**\n * Simple event dispatcher with pause and resume.\n *\n */\nexport class EventDispatcher {\n private _listeners : Record = {};\n private _isEventPaused : boolean = false;\n\n public listen (type : string, listener : Function) {\n if (this._listeners === undefined) this._listeners = {};\n\n var listeners = this._listeners;\n if (listeners[type] === undefined) {\n listeners[type] = [];\n }\n\n if (listeners[type].indexOf(listener) === - 1) {\n listeners[type].push(listener);\n }\n }\n\n public addListener (type : string, listener : Function) {\n this.listen(type, listener);\n }\n\n public hasListener (type : string, listener : Function) {\n if (this._listeners === undefined) return false;\n\n return this._listeners[type] !== undefined && this._listeners[type].indexOf(listener) !== - 1;\n }\n\n public removeListener (type : string, listener : Function) {\n if (this._listeners === undefined) return;\n\n var listenerArray = this._listeners[type];\n\n if (listenerArray !== undefined) {\n var index = listenerArray.indexOf(listener);\n\n if (index !== - 1) {\n listenerArray.splice(index, 1);\n }\n }\n }\n\n public dispatch (eventName : string, eventData : Record = {}) {\n if (this._isEventPaused) return;\n\n if (this._listeners === undefined) return;\n\n var listeners = this._listeners[eventName];\n\n if (listeners !== undefined) {\n eventData.target = this;\n\n var listeners = listeners.slice(0);\n\n for (var i = 0, l = listeners.length; i < l; i ++) {\n listeners[i].call(this, eventData);\n }\n }\n }\n\n public pauseListener () {\n this._isEventPaused = true;\n }\n\n public resumeListener () {\n this._isEventPaused = false;\n }\n}\n","\"use strict\";\nvar __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\n if (ar || !(i in from)) {\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\n ar[i] = from[i];\n }\n }\n return to.concat(ar || Array.prototype.slice.call(from));\n};\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.LLkLookaheadStrategy = void 0;\nvar flatMap_1 = __importDefault(require(\"lodash/flatMap\"));\nvar isEmpty_1 = __importDefault(require(\"lodash/isEmpty\"));\nvar errors_public_1 = require(\"../errors_public\");\nvar parser_1 = require(\"../parser/parser\");\nvar checks_1 = require(\"./checks\");\nvar lookahead_1 = require(\"./lookahead\");\nvar LLkLookaheadStrategy = /** @class */ (function () {\n function LLkLookaheadStrategy(options) {\n var _a;\n this.maxLookahead =\n (_a = options === null || options === void 0 ? void 0 : options.maxLookahead) !== null && _a !== void 0 ? _a : parser_1.DEFAULT_PARSER_CONFIG.maxLookahead;\n }\n LLkLookaheadStrategy.prototype.validate = function (options) {\n var leftRecursionErrors = this.validateNoLeftRecursion(options.rules);\n if ((0, isEmpty_1.default)(leftRecursionErrors)) {\n var emptyAltErrors = this.validateEmptyOrAlternatives(options.rules);\n var ambiguousAltsErrors = this.validateAmbiguousAlternationAlternatives(options.rules, this.maxLookahead);\n var emptyRepetitionErrors = this.validateSomeNonEmptyLookaheadPath(options.rules, this.maxLookahead);\n var allErrors = __spreadArray(__spreadArray(__spreadArray(__spreadArray([], leftRecursionErrors, true), emptyAltErrors, true), ambiguousAltsErrors, true), emptyRepetitionErrors, true);\n return allErrors;\n }\n return leftRecursionErrors;\n };\n LLkLookaheadStrategy.prototype.validateNoLeftRecursion = function (rules) {\n return (0, flatMap_1.default)(rules, function (currTopRule) {\n return (0, checks_1.validateNoLeftRecursion)(currTopRule, currTopRule, errors_public_1.defaultGrammarValidatorErrorProvider);\n });\n };\n LLkLookaheadStrategy.prototype.validateEmptyOrAlternatives = function (rules) {\n return (0, flatMap_1.default)(rules, function (currTopRule) {\n return (0, checks_1.validateEmptyOrAlternative)(currTopRule, errors_public_1.defaultGrammarValidatorErrorProvider);\n });\n };\n LLkLookaheadStrategy.prototype.validateAmbiguousAlternationAlternatives = function (rules, maxLookahead) {\n return (0, flatMap_1.default)(rules, function (currTopRule) {\n return (0, checks_1.validateAmbiguousAlternationAlternatives)(currTopRule, maxLookahead, errors_public_1.defaultGrammarValidatorErrorProvider);\n });\n };\n LLkLookaheadStrategy.prototype.validateSomeNonEmptyLookaheadPath = function (rules, maxLookahead) {\n return (0, checks_1.validateSomeNonEmptyLookaheadPath)(rules, maxLookahead, errors_public_1.defaultGrammarValidatorErrorProvider);\n };\n LLkLookaheadStrategy.prototype.buildLookaheadForAlternation = function (options) {\n return (0, lookahead_1.buildLookaheadFuncForOr)(options.prodOccurrence, options.rule, options.maxLookahead, options.hasPredicates, options.dynamicTokensEnabled, lookahead_1.buildAlternativesLookAheadFunc);\n };\n LLkLookaheadStrategy.prototype.buildLookaheadForOptional = function (options) {\n return (0, lookahead_1.buildLookaheadFuncForOptionalProd)(options.prodOccurrence, options.rule, options.maxLookahead, options.dynamicTokensEnabled, (0, lookahead_1.getProdType)(options.prodType), lookahead_1.buildSingleAlternativeLookaheadFunction);\n };\n return LLkLookaheadStrategy;\n}());\nexports.LLkLookaheadStrategy = LLkLookaheadStrategy;\n//# sourceMappingURL=llk_lookahead.js.map","var nativeCreate = require('./_nativeCreate');\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/**\n * Sets the hash `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Hash\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the hash instance.\n */\nfunction hashSet(key, value) {\n var data = this.__data__;\n this.size += this.has(key) ? 0 : 1;\n data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;\n return this;\n}\n\nmodule.exports = hashSet;\n","var SetCache = require('./_SetCache'),\n arrayIncludes = require('./_arrayIncludes'),\n arrayIncludesWith = require('./_arrayIncludesWith'),\n cacheHas = require('./_cacheHas'),\n createSet = require('./_createSet'),\n setToArray = require('./_setToArray');\n\n/** Used as the size to enable large array optimizations. */\nvar LARGE_ARRAY_SIZE = 200;\n\n/**\n * The base implementation of `_.uniqBy` without support for iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {Function} [iteratee] The iteratee invoked per element.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new duplicate free array.\n */\nfunction baseUniq(array, iteratee, comparator) {\n var index = -1,\n includes = arrayIncludes,\n length = array.length,\n isCommon = true,\n result = [],\n seen = result;\n\n if (comparator) {\n isCommon = false;\n includes = arrayIncludesWith;\n }\n else if (length >= LARGE_ARRAY_SIZE) {\n var set = iteratee ? null : createSet(array);\n if (set) {\n return setToArray(set);\n }\n isCommon = false;\n includes = cacheHas;\n seen = new SetCache;\n }\n else {\n seen = iteratee ? [] : result;\n }\n outer:\n while (++index < length) {\n var value = array[index],\n computed = iteratee ? iteratee(value) : value;\n\n value = (comparator || value !== 0) ? value : 0;\n if (isCommon && computed === computed) {\n var seenIndex = seen.length;\n while (seenIndex--) {\n if (seen[seenIndex] === computed) {\n continue outer;\n }\n }\n if (iteratee) {\n seen.push(computed);\n }\n result.push(value);\n }\n else if (!includes(seen, computed, comparator)) {\n if (seen !== result) {\n seen.push(computed);\n }\n result.push(value);\n }\n }\n return result;\n}\n\nmodule.exports = baseUniq;\n","var createCaseFirst = require('./_createCaseFirst');\n\n/**\n * Converts the first character of `string` to upper case.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category String\n * @param {string} [string=''] The string to convert.\n * @returns {string} Returns the converted string.\n * @example\n *\n * _.upperFirst('fred');\n * // => 'Fred'\n *\n * _.upperFirst('FRED');\n * // => 'FRED'\n */\nvar upperFirst = createCaseFirst('toUpperCase');\n\nmodule.exports = upperFirst;\n","var DataView = require('./_DataView'),\n Map = require('./_Map'),\n Promise = require('./_Promise'),\n Set = require('./_Set'),\n WeakMap = require('./_WeakMap'),\n baseGetTag = require('./_baseGetTag'),\n toSource = require('./_toSource');\n\n/** `Object#toString` result references. */\nvar mapTag = '[object Map]',\n objectTag = '[object Object]',\n promiseTag = '[object Promise]',\n setTag = '[object Set]',\n weakMapTag = '[object WeakMap]';\n\nvar dataViewTag = '[object DataView]';\n\n/** Used to detect maps, sets, and weakmaps. */\nvar dataViewCtorString = toSource(DataView),\n mapCtorString = toSource(Map),\n promiseCtorString = toSource(Promise),\n setCtorString = toSource(Set),\n weakMapCtorString = toSource(WeakMap);\n\n/**\n * Gets the `toStringTag` of `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nvar getTag = baseGetTag;\n\n// Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6.\nif ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) ||\n (Map && getTag(new Map) != mapTag) ||\n (Promise && getTag(Promise.resolve()) != promiseTag) ||\n (Set && getTag(new Set) != setTag) ||\n (WeakMap && getTag(new WeakMap) != weakMapTag)) {\n getTag = function(value) {\n var result = baseGetTag(value),\n Ctor = result == objectTag ? value.constructor : undefined,\n ctorString = Ctor ? toSource(Ctor) : '';\n\n if (ctorString) {\n switch (ctorString) {\n case dataViewCtorString: return dataViewTag;\n case mapCtorString: return mapTag;\n case promiseCtorString: return promiseTag;\n case setCtorString: return setTag;\n case weakMapCtorString: return weakMapTag;\n }\n }\n return result;\n };\n}\n\nmodule.exports = getTag;\n","var baseValues = require('./_baseValues'),\n keys = require('./keys');\n\n/**\n * Creates an array of the own enumerable string keyed property values of `object`.\n *\n * **Note:** Non-object values are coerced to objects.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property values.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.values(new Foo);\n * // => [1, 2] (iteration order is not guaranteed)\n *\n * _.values('hi');\n * // => ['h', 'i']\n */\nfunction values(object) {\n return object == null ? [] : baseValues(object, keys(object));\n}\n\nmodule.exports = values;\n","var Symbol = require('./_Symbol'),\n isArguments = require('./isArguments'),\n isArray = require('./isArray');\n\n/** Built-in value references. */\nvar spreadableSymbol = Symbol ? Symbol.isConcatSpreadable : undefined;\n\n/**\n * Checks if `value` is a flattenable `arguments` object or array.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is flattenable, else `false`.\n */\nfunction isFlattenable(value) {\n return isArray(value) || isArguments(value) ||\n !!(spreadableSymbol && value && value[spreadableSymbol]);\n}\n\nmodule.exports = isFlattenable;\n","var SetCache = require('./_SetCache'),\n arraySome = require('./_arraySome'),\n cacheHas = require('./_cacheHas');\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1,\n COMPARE_UNORDERED_FLAG = 2;\n\n/**\n * A specialized version of `baseIsEqualDeep` for arrays with support for\n * partial deep comparisons.\n *\n * @private\n * @param {Array} array The array to compare.\n * @param {Array} other The other array to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `array` and `other` objects.\n * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.\n */\nfunction equalArrays(array, other, bitmask, customizer, equalFunc, stack) {\n var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\n arrLength = array.length,\n othLength = other.length;\n\n if (arrLength != othLength && !(isPartial && othLength > arrLength)) {\n return false;\n }\n // Check that cyclic values are equal.\n var arrStacked = stack.get(array);\n var othStacked = stack.get(other);\n if (arrStacked && othStacked) {\n return arrStacked == other && othStacked == array;\n }\n var index = -1,\n result = true,\n seen = (bitmask & COMPARE_UNORDERED_FLAG) ? new SetCache : undefined;\n\n stack.set(array, other);\n stack.set(other, array);\n\n // Ignore non-index properties.\n while (++index < arrLength) {\n var arrValue = array[index],\n othValue = other[index];\n\n if (customizer) {\n var compared = isPartial\n ? customizer(othValue, arrValue, index, other, array, stack)\n : customizer(arrValue, othValue, index, array, other, stack);\n }\n if (compared !== undefined) {\n if (compared) {\n continue;\n }\n result = false;\n break;\n }\n // Recursively compare arrays (susceptible to call stack limits).\n if (seen) {\n if (!arraySome(other, function(othValue, othIndex) {\n if (!cacheHas(seen, othIndex) &&\n (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) {\n return seen.push(othIndex);\n }\n })) {\n result = false;\n break;\n }\n } else if (!(\n arrValue === othValue ||\n equalFunc(arrValue, othValue, bitmask, customizer, stack)\n )) {\n result = false;\n break;\n }\n }\n stack['delete'](array);\n stack['delete'](other);\n return result;\n}\n\nmodule.exports = equalArrays;\n","var arrayLikeKeys = require('./_arrayLikeKeys'),\n baseKeys = require('./_baseKeys'),\n isArrayLike = require('./isArrayLike');\n\n/**\n * Creates an array of the own enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects. See the\n * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n * for more details.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keys(new Foo);\n * // => ['a', 'b'] (iteration order is not guaranteed)\n *\n * _.keys('hi');\n * // => ['0', '1']\n */\nfunction keys(object) {\n return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);\n}\n\nmodule.exports = keys;\n","var baseFlatten = require('./_baseFlatten');\n\n/**\n * Flattens `array` a single level deep.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to flatten.\n * @returns {Array} Returns the new flattened array.\n * @example\n *\n * _.flatten([1, [2, [3, [4]], 5]]);\n * // => [1, 2, [3, [4]], 5]\n */\nfunction flatten(array) {\n var length = array == null ? 0 : array.length;\n return length ? baseFlatten(array, 1) : [];\n}\n\nmodule.exports = flatten;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.createSyntaxDiagramsCode = void 0;\nvar version_1 = require(\"../version\");\nfunction createSyntaxDiagramsCode(grammar, _a) {\n var _b = _a === void 0 ? {} : _a, _c = _b.resourceBase, resourceBase = _c === void 0 ? \"https://unpkg.com/chevrotain@\".concat(version_1.VERSION, \"/diagrams/\") : _c, _d = _b.css, css = _d === void 0 ? \"https://unpkg.com/chevrotain@\".concat(version_1.VERSION, \"/diagrams/diagrams.css\") : _d;\n var header = \"\\n\\n\\n\\n\\n\\n\";\n var cssHtml = \"\\n\\n\");\n var scripts = \"\\n\\n\\n\\n\\n\");\n var diagramsDiv = \"\\n
\\n\";\n var serializedGrammar = \"\\n\\n\");\n var initLogic = \"\\n\\n\";\n return (header + cssHtml + scripts + diagramsDiv + serializedGrammar + initLogic);\n}\nexports.createSyntaxDiagramsCode = createSyntaxDiagramsCode;\n//# sourceMappingURL=render_public.js.map","var freeGlobal = require('./_freeGlobal');\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Detect free variable `process` from Node.js. */\nvar freeProcess = moduleExports && freeGlobal.process;\n\n/** Used to access faster Node.js helpers. */\nvar nodeUtil = (function() {\n try {\n // Use `util.types` for Node.js 10+.\n var types = freeModule && freeModule.require && freeModule.require('util').types;\n\n if (types) {\n return types;\n }\n\n // Legacy `process.binding('util')` for Node.js < 10.\n return freeProcess && freeProcess.binding && freeProcess.binding('util');\n } catch (e) {}\n}());\n\nmodule.exports = nodeUtil;\n","var eq = require('./eq');\n\n/**\n * Gets the index at which the `key` is found in `array` of key-value pairs.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} key The key to search for.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction assocIndexOf(array, key) {\n var length = array.length;\n while (length--) {\n if (eq(array[length][0], key)) {\n return length;\n }\n }\n return -1;\n}\n\nmodule.exports = assocIndexOf;\n","var getTag = require('./_getTag'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar setTag = '[object Set]';\n\n/**\n * The base implementation of `_.isSet` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a set, else `false`.\n */\nfunction baseIsSet(value) {\n return isObjectLike(value) && getTag(value) == setTag;\n}\n\nmodule.exports = baseIsSet;\n","\"use strict\";\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.buildModel = void 0;\nvar gast_1 = require(\"@chevrotain/gast\");\nvar map_1 = __importDefault(require(\"lodash/map\"));\nvar flatten_1 = __importDefault(require(\"lodash/flatten\"));\nvar values_1 = __importDefault(require(\"lodash/values\"));\nvar some_1 = __importDefault(require(\"lodash/some\"));\nvar groupBy_1 = __importDefault(require(\"lodash/groupBy\"));\nvar assign_1 = __importDefault(require(\"lodash/assign\"));\nfunction buildModel(productions) {\n var generator = new CstNodeDefinitionGenerator();\n var allRules = (0, values_1.default)(productions);\n return (0, map_1.default)(allRules, function (rule) { return generator.visitRule(rule); });\n}\nexports.buildModel = buildModel;\nvar CstNodeDefinitionGenerator = /** @class */ (function (_super) {\n __extends(CstNodeDefinitionGenerator, _super);\n function CstNodeDefinitionGenerator() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n CstNodeDefinitionGenerator.prototype.visitRule = function (node) {\n var rawElements = this.visitEach(node.definition);\n var grouped = (0, groupBy_1.default)(rawElements, function (el) { return el.propertyName; });\n var properties = (0, map_1.default)(grouped, function (group, propertyName) {\n var allNullable = !(0, some_1.default)(group, function (el) { return !el.canBeNull; });\n // In an alternation with a label a property name can have\n // multiple types.\n var propertyType = group[0].type;\n if (group.length > 1) {\n propertyType = (0, map_1.default)(group, function (g) { return g.type; });\n }\n return {\n name: propertyName,\n type: propertyType,\n optional: allNullable\n };\n });\n return {\n name: node.name,\n properties: properties\n };\n };\n CstNodeDefinitionGenerator.prototype.visitAlternative = function (node) {\n return this.visitEachAndOverrideWith(node.definition, { canBeNull: true });\n };\n CstNodeDefinitionGenerator.prototype.visitOption = function (node) {\n return this.visitEachAndOverrideWith(node.definition, { canBeNull: true });\n };\n CstNodeDefinitionGenerator.prototype.visitRepetition = function (node) {\n return this.visitEachAndOverrideWith(node.definition, { canBeNull: true });\n };\n CstNodeDefinitionGenerator.prototype.visitRepetitionMandatory = function (node) {\n return this.visitEach(node.definition);\n };\n CstNodeDefinitionGenerator.prototype.visitRepetitionMandatoryWithSeparator = function (node) {\n return this.visitEach(node.definition).concat({\n propertyName: node.separator.name,\n canBeNull: true,\n type: getType(node.separator)\n });\n };\n CstNodeDefinitionGenerator.prototype.visitRepetitionWithSeparator = function (node) {\n return this.visitEachAndOverrideWith(node.definition, {\n canBeNull: true\n }).concat({\n propertyName: node.separator.name,\n canBeNull: true,\n type: getType(node.separator)\n });\n };\n CstNodeDefinitionGenerator.prototype.visitAlternation = function (node) {\n return this.visitEachAndOverrideWith(node.definition, { canBeNull: true });\n };\n CstNodeDefinitionGenerator.prototype.visitTerminal = function (node) {\n return [\n {\n propertyName: node.label || node.terminalType.name,\n canBeNull: false,\n type: getType(node)\n }\n ];\n };\n CstNodeDefinitionGenerator.prototype.visitNonTerminal = function (node) {\n return [\n {\n propertyName: node.label || node.nonTerminalName,\n canBeNull: false,\n type: getType(node)\n }\n ];\n };\n CstNodeDefinitionGenerator.prototype.visitEachAndOverrideWith = function (definition, override) {\n return (0, map_1.default)(this.visitEach(definition), function (definition) { return (0, assign_1.default)({}, definition, override); });\n };\n CstNodeDefinitionGenerator.prototype.visitEach = function (definition) {\n var _this = this;\n return (0, flatten_1.default)((0, map_1.default)(definition, function (definition) { return _this.visit(definition); }));\n };\n return CstNodeDefinitionGenerator;\n}(gast_1.GAstVisitor));\nfunction getType(production) {\n if (production instanceof gast_1.NonTerminal) {\n return {\n kind: \"rule\",\n name: production.referencedRule.name\n };\n }\n return { kind: \"token\" };\n}\n//# sourceMappingURL=model.js.map","/** Error message constants. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/**\n * Creates a function that negates the result of the predicate `func`. The\n * `func` predicate is invoked with the `this` binding and arguments of the\n * created function.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Function\n * @param {Function} predicate The predicate to negate.\n * @returns {Function} Returns the new negated function.\n * @example\n *\n * function isEven(n) {\n * return n % 2 == 0;\n * }\n *\n * _.filter([1, 2, 3, 4, 5, 6], _.negate(isEven));\n * // => [1, 3, 5]\n */\nfunction negate(predicate) {\n if (typeof predicate != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n return function() {\n var args = arguments;\n switch (args.length) {\n case 0: return !predicate.call(this);\n case 1: return !predicate.call(this, args[0]);\n case 2: return !predicate.call(this, args[0], args[1]);\n case 3: return !predicate.call(this, args[0], args[1], args[2]);\n }\n return !predicate.apply(this, args);\n };\n}\n\nmodule.exports = negate;\n","var baseIsNative = require('./_baseIsNative'),\n getValue = require('./_getValue');\n\n/**\n * Gets the native function at `key` of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the method to get.\n * @returns {*} Returns the function if it's native, else `undefined`.\n */\nfunction getNative(object, key) {\n var value = getValue(object, key);\n return baseIsNative(value) ? value : undefined;\n}\n\nmodule.exports = getNative;\n","var baseFindIndex = require('./_baseFindIndex'),\n baseIsNaN = require('./_baseIsNaN'),\n strictIndexOf = require('./_strictIndexOf');\n\n/**\n * The base implementation of `_.indexOf` without `fromIndex` bounds checks.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @param {number} fromIndex The index to search from.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction baseIndexOf(array, value, fromIndex) {\n return value === value\n ? strictIndexOf(array, value, fromIndex)\n : baseFindIndex(array, baseIsNaN, fromIndex);\n}\n\nmodule.exports = baseIndexOf;\n","var assignValue = require('./_assignValue'),\n copyObject = require('./_copyObject'),\n createAssigner = require('./_createAssigner'),\n isArrayLike = require('./isArrayLike'),\n isPrototype = require('./_isPrototype'),\n keys = require('./keys');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Assigns own enumerable string keyed properties of source objects to the\n * destination object. Source objects are applied from left to right.\n * Subsequent sources overwrite property assignments of previous sources.\n *\n * **Note:** This method mutates `object` and is loosely based on\n * [`Object.assign`](https://mdn.io/Object/assign).\n *\n * @static\n * @memberOf _\n * @since 0.10.0\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} [sources] The source objects.\n * @returns {Object} Returns `object`.\n * @see _.assignIn\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * }\n *\n * function Bar() {\n * this.c = 3;\n * }\n *\n * Foo.prototype.b = 2;\n * Bar.prototype.d = 4;\n *\n * _.assign({ 'a': 0 }, new Foo, new Bar);\n * // => { 'a': 1, 'c': 3 }\n */\nvar assign = createAssigner(function(object, source) {\n if (isPrototype(source) || isArrayLike(source)) {\n copyObject(source, keys(source), object);\n return;\n }\n for (var key in source) {\n if (hasOwnProperty.call(source, key)) {\n assignValue(object, key, source[key]);\n }\n }\n});\n\nmodule.exports = assign;\n","var cloneArrayBuffer = require('./_cloneArrayBuffer');\n\n/**\n * Creates a clone of `dataView`.\n *\n * @private\n * @param {Object} dataView The data view to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the cloned data view.\n */\nfunction cloneDataView(dataView, isDeep) {\n var buffer = isDeep ? cloneArrayBuffer(dataView.buffer) : dataView.buffer;\n return new dataView.constructor(buffer, dataView.byteOffset, dataView.byteLength);\n}\n\nmodule.exports = cloneDataView;\n","module.exports = require('./head');\n","\"use strict\";\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.buildInProdFollowPrefix = exports.buildBetweenProdsFollowPrefix = exports.computeAllProdsFollows = exports.ResyncFollowsWalker = void 0;\nvar rest_1 = require(\"./rest\");\nvar first_1 = require(\"./first\");\nvar forEach_1 = __importDefault(require(\"lodash/forEach\"));\nvar assign_1 = __importDefault(require(\"lodash/assign\"));\nvar constants_1 = require(\"../constants\");\nvar gast_1 = require(\"@chevrotain/gast\");\n// This ResyncFollowsWalker computes all of the follows required for RESYNC\n// (skipping reference production).\nvar ResyncFollowsWalker = /** @class */ (function (_super) {\n __extends(ResyncFollowsWalker, _super);\n function ResyncFollowsWalker(topProd) {\n var _this = _super.call(this) || this;\n _this.topProd = topProd;\n _this.follows = {};\n return _this;\n }\n ResyncFollowsWalker.prototype.startWalking = function () {\n this.walk(this.topProd);\n return this.follows;\n };\n ResyncFollowsWalker.prototype.walkTerminal = function (terminal, currRest, prevRest) {\n // do nothing! just like in the public sector after 13:00\n };\n ResyncFollowsWalker.prototype.walkProdRef = function (refProd, currRest, prevRest) {\n var followName = buildBetweenProdsFollowPrefix(refProd.referencedRule, refProd.idx) +\n this.topProd.name;\n var fullRest = currRest.concat(prevRest);\n var restProd = new gast_1.Alternative({ definition: fullRest });\n var t_in_topProd_follows = (0, first_1.first)(restProd);\n this.follows[followName] = t_in_topProd_follows;\n };\n return ResyncFollowsWalker;\n}(rest_1.RestWalker));\nexports.ResyncFollowsWalker = ResyncFollowsWalker;\nfunction computeAllProdsFollows(topProductions) {\n var reSyncFollows = {};\n (0, forEach_1.default)(topProductions, function (topProd) {\n var currRefsFollow = new ResyncFollowsWalker(topProd).startWalking();\n (0, assign_1.default)(reSyncFollows, currRefsFollow);\n });\n return reSyncFollows;\n}\nexports.computeAllProdsFollows = computeAllProdsFollows;\nfunction buildBetweenProdsFollowPrefix(inner, occurenceInParent) {\n return inner.name + occurenceInParent + constants_1.IN;\n}\nexports.buildBetweenProdsFollowPrefix = buildBetweenProdsFollowPrefix;\nfunction buildInProdFollowPrefix(terminal) {\n var terminalName = terminal.terminalType.name;\n return terminalName + terminal.idx + constants_1.IN;\n}\nexports.buildInProdFollowPrefix = buildInProdFollowPrefix;\n//# sourceMappingURL=follow.js.map","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Initializes an array clone.\n *\n * @private\n * @param {Array} array The array to clone.\n * @returns {Array} Returns the initialized clone.\n */\nfunction initCloneArray(array) {\n var length = array.length,\n result = new array.constructor(length);\n\n // Add properties assigned by `RegExp#exec`.\n if (length && typeof array[0] == 'string' && hasOwnProperty.call(array, 'index')) {\n result.index = array.index;\n result.input = array.input;\n }\n return result;\n}\n\nmodule.exports = initCloneArray;\n","\"use strict\";\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.canMatchCharCode = exports.firstCharOptimizedIndices = exports.getOptimizedStartCodesIndices = exports.failedOptimizationPrefixMsg = void 0;\nvar regexp_to_ast_1 = require(\"regexp-to-ast\");\nvar isArray_1 = __importDefault(require(\"lodash/isArray\"));\nvar every_1 = __importDefault(require(\"lodash/every\"));\nvar forEach_1 = __importDefault(require(\"lodash/forEach\"));\nvar find_1 = __importDefault(require(\"lodash/find\"));\nvar values_1 = __importDefault(require(\"lodash/values\"));\nvar includes_1 = __importDefault(require(\"lodash/includes\"));\nvar utils_1 = require(\"@chevrotain/utils\");\nvar reg_exp_parser_1 = require(\"./reg_exp_parser\");\nvar lexer_1 = require(\"./lexer\");\nvar complementErrorMessage = \"Complement Sets are not supported for first char optimization\";\nexports.failedOptimizationPrefixMsg = 'Unable to use \"first char\" lexer optimizations:\\n';\nfunction getOptimizedStartCodesIndices(regExp, ensureOptimizations) {\n if (ensureOptimizations === void 0) { ensureOptimizations = false; }\n try {\n var ast = (0, reg_exp_parser_1.getRegExpAst)(regExp);\n var firstChars = firstCharOptimizedIndices(ast.value, {}, ast.flags.ignoreCase);\n return firstChars;\n }\n catch (e) {\n /* istanbul ignore next */\n // Testing this relies on the regexp-to-ast library having a bug... */\n // TODO: only the else branch needs to be ignored, try to fix with newer prettier / tsc\n if (e.message === complementErrorMessage) {\n if (ensureOptimizations) {\n (0, utils_1.PRINT_WARNING)(\"\".concat(exports.failedOptimizationPrefixMsg) +\n \"\\tUnable to optimize: < \".concat(regExp.toString(), \" >\\n\") +\n \"\\tComplement Sets cannot be automatically optimized.\\n\" +\n \"\\tThis will disable the lexer's first char optimizations.\\n\" +\n \"\\tSee: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#COMPLEMENT for details.\");\n }\n }\n else {\n var msgSuffix = \"\";\n if (ensureOptimizations) {\n msgSuffix =\n \"\\n\\tThis will disable the lexer's first char optimizations.\\n\" +\n \"\\tSee: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#REGEXP_PARSING for details.\";\n }\n (0, utils_1.PRINT_ERROR)(\"\".concat(exports.failedOptimizationPrefixMsg, \"\\n\") +\n \"\\tFailed parsing: < \".concat(regExp.toString(), \" >\\n\") +\n \"\\tUsing the regexp-to-ast library version: \".concat(regexp_to_ast_1.VERSION, \"\\n\") +\n \"\\tPlease open an issue at: https://github.com/bd82/regexp-to-ast/issues\" +\n msgSuffix);\n }\n }\n return [];\n}\nexports.getOptimizedStartCodesIndices = getOptimizedStartCodesIndices;\nfunction firstCharOptimizedIndices(ast, result, ignoreCase) {\n switch (ast.type) {\n case \"Disjunction\":\n for (var i = 0; i < ast.value.length; i++) {\n firstCharOptimizedIndices(ast.value[i], result, ignoreCase);\n }\n break;\n case \"Alternative\":\n var terms = ast.value;\n for (var i = 0; i < terms.length; i++) {\n var term = terms[i];\n // skip terms that cannot effect the first char results\n switch (term.type) {\n case \"EndAnchor\":\n // A group back reference cannot affect potential starting char.\n // because if a back reference is the first production than automatically\n // the group being referenced has had to come BEFORE so its codes have already been added\n case \"GroupBackReference\":\n // assertions do not affect potential starting codes\n case \"Lookahead\":\n case \"NegativeLookahead\":\n case \"StartAnchor\":\n case \"WordBoundary\":\n case \"NonWordBoundary\":\n continue;\n }\n var atom = term;\n switch (atom.type) {\n case \"Character\":\n addOptimizedIdxToResult(atom.value, result, ignoreCase);\n break;\n case \"Set\":\n if (atom.complement === true) {\n throw Error(complementErrorMessage);\n }\n (0, forEach_1.default)(atom.value, function (code) {\n if (typeof code === \"number\") {\n addOptimizedIdxToResult(code, result, ignoreCase);\n }\n else {\n // range\n var range = code;\n // cannot optimize when ignoreCase is\n if (ignoreCase === true) {\n for (var rangeCode = range.from; rangeCode <= range.to; rangeCode++) {\n addOptimizedIdxToResult(rangeCode, result, ignoreCase);\n }\n }\n // Optimization (2 orders of magnitude less work for very large ranges)\n else {\n // handle unoptimized values\n for (var rangeCode = range.from; rangeCode <= range.to && rangeCode < lexer_1.minOptimizationVal; rangeCode++) {\n addOptimizedIdxToResult(rangeCode, result, ignoreCase);\n }\n // Less common charCode where we optimize for faster init time, by using larger \"buckets\"\n if (range.to >= lexer_1.minOptimizationVal) {\n var minUnOptVal = range.from >= lexer_1.minOptimizationVal\n ? range.from\n : lexer_1.minOptimizationVal;\n var maxUnOptVal = range.to;\n var minOptIdx = (0, lexer_1.charCodeToOptimizedIndex)(minUnOptVal);\n var maxOptIdx = (0, lexer_1.charCodeToOptimizedIndex)(maxUnOptVal);\n for (var currOptIdx = minOptIdx; currOptIdx <= maxOptIdx; currOptIdx++) {\n result[currOptIdx] = currOptIdx;\n }\n }\n }\n }\n });\n break;\n case \"Group\":\n firstCharOptimizedIndices(atom.value, result, ignoreCase);\n break;\n /* istanbul ignore next */\n default:\n throw Error(\"Non Exhaustive Match\");\n }\n // reached a mandatory production, no more **start** codes can be found on this alternative\n var isOptionalQuantifier = atom.quantifier !== undefined && atom.quantifier.atLeast === 0;\n if (\n // A group may be optional due to empty contents /(?:)/\n // or if everything inside it is optional /((a)?)/\n (atom.type === \"Group\" && isWholeOptional(atom) === false) ||\n // If this term is not a group it may only be optional if it has an optional quantifier\n (atom.type !== \"Group\" && isOptionalQuantifier === false)) {\n break;\n }\n }\n break;\n /* istanbul ignore next */\n default:\n throw Error(\"non exhaustive match!\");\n }\n // console.log(Object.keys(result).length)\n return (0, values_1.default)(result);\n}\nexports.firstCharOptimizedIndices = firstCharOptimizedIndices;\nfunction addOptimizedIdxToResult(code, result, ignoreCase) {\n var optimizedCharIdx = (0, lexer_1.charCodeToOptimizedIndex)(code);\n result[optimizedCharIdx] = optimizedCharIdx;\n if (ignoreCase === true) {\n handleIgnoreCase(code, result);\n }\n}\nfunction handleIgnoreCase(code, result) {\n var char = String.fromCharCode(code);\n var upperChar = char.toUpperCase();\n /* istanbul ignore else */\n if (upperChar !== char) {\n var optimizedCharIdx = (0, lexer_1.charCodeToOptimizedIndex)(upperChar.charCodeAt(0));\n result[optimizedCharIdx] = optimizedCharIdx;\n }\n else {\n var lowerChar = char.toLowerCase();\n if (lowerChar !== char) {\n var optimizedCharIdx = (0, lexer_1.charCodeToOptimizedIndex)(lowerChar.charCodeAt(0));\n result[optimizedCharIdx] = optimizedCharIdx;\n }\n }\n}\nfunction findCode(setNode, targetCharCodes) {\n return (0, find_1.default)(setNode.value, function (codeOrRange) {\n if (typeof codeOrRange === \"number\") {\n return (0, includes_1.default)(targetCharCodes, codeOrRange);\n }\n else {\n // range\n var range_1 = codeOrRange;\n return ((0, find_1.default)(targetCharCodes, function (targetCode) { return range_1.from <= targetCode && targetCode <= range_1.to; }) !== undefined);\n }\n });\n}\nfunction isWholeOptional(ast) {\n var quantifier = ast.quantifier;\n if (quantifier && quantifier.atLeast === 0) {\n return true;\n }\n if (!ast.value) {\n return false;\n }\n return (0, isArray_1.default)(ast.value)\n ? (0, every_1.default)(ast.value, isWholeOptional)\n : isWholeOptional(ast.value);\n}\nvar CharCodeFinder = /** @class */ (function (_super) {\n __extends(CharCodeFinder, _super);\n function CharCodeFinder(targetCharCodes) {\n var _this = _super.call(this) || this;\n _this.targetCharCodes = targetCharCodes;\n _this.found = false;\n return _this;\n }\n CharCodeFinder.prototype.visitChildren = function (node) {\n // No need to keep looking...\n if (this.found === true) {\n return;\n }\n // switch lookaheads as they do not actually consume any characters thus\n // finding a charCode at lookahead context does not mean that regexp can actually contain it in a match.\n switch (node.type) {\n case \"Lookahead\":\n this.visitLookahead(node);\n return;\n case \"NegativeLookahead\":\n this.visitNegativeLookahead(node);\n return;\n }\n _super.prototype.visitChildren.call(this, node);\n };\n CharCodeFinder.prototype.visitCharacter = function (node) {\n if ((0, includes_1.default)(this.targetCharCodes, node.value)) {\n this.found = true;\n }\n };\n CharCodeFinder.prototype.visitSet = function (node) {\n if (node.complement) {\n if (findCode(node, this.targetCharCodes) === undefined) {\n this.found = true;\n }\n }\n else {\n if (findCode(node, this.targetCharCodes) !== undefined) {\n this.found = true;\n }\n }\n };\n return CharCodeFinder;\n}(regexp_to_ast_1.BaseRegExpVisitor));\nfunction canMatchCharCode(charCodes, pattern) {\n if (pattern instanceof RegExp) {\n var ast = (0, reg_exp_parser_1.getRegExpAst)(pattern);\n var charCodeFinder = new CharCodeFinder(charCodes);\n charCodeFinder.visit(ast);\n return charCodeFinder.found;\n }\n else {\n return ((0, find_1.default)(pattern, function (char) {\n return (0, includes_1.default)(charCodes, char.charCodeAt(0));\n }) !== undefined);\n }\n}\nexports.canMatchCharCode = canMatchCharCode;\n//# sourceMappingURL=reg_exp.js.map","var baseDifference = require('./_baseDifference'),\n baseFlatten = require('./_baseFlatten'),\n baseRest = require('./_baseRest'),\n isArrayLikeObject = require('./isArrayLikeObject');\n\n/**\n * Creates an array of `array` values not included in the other given arrays\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons. The order and references of result values are\n * determined by the first array.\n *\n * **Note:** Unlike `_.pullAll`, this method returns a new array.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {...Array} [values] The values to exclude.\n * @returns {Array} Returns the new array of filtered values.\n * @see _.without, _.xor\n * @example\n *\n * _.difference([2, 1], [2, 3]);\n * // => [1]\n */\nvar difference = baseRest(function(array, values) {\n return isArrayLikeObject(array)\n ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true))\n : [];\n});\n\nmodule.exports = difference;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.toFastProperties = void 0;\n// based on: https://github.com/petkaantonov/bluebird/blob/b97c0d2d487e8c5076e8bd897e0dcd4622d31846/src/util.js#L201-L216\nfunction toFastProperties(toBecomeFast) {\n function FakeConstructor() { }\n // If our object is used as a constructor it would receive\n FakeConstructor.prototype = toBecomeFast;\n var fakeInstance = new FakeConstructor();\n function fakeAccess() {\n return typeof fakeInstance.bar;\n }\n // help V8 understand this is a \"real\" prototype by actually using\n // the fake instance.\n fakeAccess();\n fakeAccess();\n // Always true condition to suppress the Firefox warning of unreachable\n // code after a return statement.\n if (1)\n return toBecomeFast;\n // Eval prevents optimization of this method (even though this is dead code)\n /* istanbul ignore next */\n // tslint:disable-next-line\n eval(toBecomeFast);\n}\nexports.toFastProperties = toFastProperties;\n//# sourceMappingURL=to-fast-properties.js.map","\"use strict\";\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.EmbeddedActionsParser = exports.CstParser = exports.Parser = exports.EMPTY_ALT = exports.ParserDefinitionErrorType = exports.DEFAULT_RULE_CONFIG = exports.DEFAULT_PARSER_CONFIG = exports.END_OF_FILE = void 0;\nvar isEmpty_1 = __importDefault(require(\"lodash/isEmpty\"));\nvar map_1 = __importDefault(require(\"lodash/map\"));\nvar forEach_1 = __importDefault(require(\"lodash/forEach\"));\nvar values_1 = __importDefault(require(\"lodash/values\"));\nvar has_1 = __importDefault(require(\"lodash/has\"));\nvar clone_1 = __importDefault(require(\"lodash/clone\"));\nvar utils_1 = require(\"@chevrotain/utils\");\nvar follow_1 = require(\"../grammar/follow\");\nvar tokens_public_1 = require(\"../../scan/tokens_public\");\nvar errors_public_1 = require(\"../errors_public\");\nvar gast_resolver_public_1 = require(\"../grammar/gast/gast_resolver_public\");\nvar recoverable_1 = require(\"./traits/recoverable\");\nvar looksahead_1 = require(\"./traits/looksahead\");\nvar tree_builder_1 = require(\"./traits/tree_builder\");\nvar lexer_adapter_1 = require(\"./traits/lexer_adapter\");\nvar recognizer_api_1 = require(\"./traits/recognizer_api\");\nvar recognizer_engine_1 = require(\"./traits/recognizer_engine\");\nvar error_handler_1 = require(\"./traits/error_handler\");\nvar context_assist_1 = require(\"./traits/context_assist\");\nvar gast_recorder_1 = require(\"./traits/gast_recorder\");\nvar perf_tracer_1 = require(\"./traits/perf_tracer\");\nvar apply_mixins_1 = require(\"./utils/apply_mixins\");\nvar checks_1 = require(\"../grammar/checks\");\nexports.END_OF_FILE = (0, tokens_public_1.createTokenInstance)(tokens_public_1.EOF, \"\", NaN, NaN, NaN, NaN, NaN, NaN);\nObject.freeze(exports.END_OF_FILE);\nexports.DEFAULT_PARSER_CONFIG = Object.freeze({\n recoveryEnabled: false,\n maxLookahead: 3,\n dynamicTokensEnabled: false,\n outputCst: true,\n errorMessageProvider: errors_public_1.defaultParserErrorProvider,\n nodeLocationTracking: \"none\",\n traceInitPerf: false,\n skipValidations: false\n});\nexports.DEFAULT_RULE_CONFIG = Object.freeze({\n recoveryValueFunc: function () { return undefined; },\n resyncEnabled: true\n});\nvar ParserDefinitionErrorType;\n(function (ParserDefinitionErrorType) {\n ParserDefinitionErrorType[ParserDefinitionErrorType[\"INVALID_RULE_NAME\"] = 0] = \"INVALID_RULE_NAME\";\n ParserDefinitionErrorType[ParserDefinitionErrorType[\"DUPLICATE_RULE_NAME\"] = 1] = \"DUPLICATE_RULE_NAME\";\n ParserDefinitionErrorType[ParserDefinitionErrorType[\"INVALID_RULE_OVERRIDE\"] = 2] = \"INVALID_RULE_OVERRIDE\";\n ParserDefinitionErrorType[ParserDefinitionErrorType[\"DUPLICATE_PRODUCTIONS\"] = 3] = \"DUPLICATE_PRODUCTIONS\";\n ParserDefinitionErrorType[ParserDefinitionErrorType[\"UNRESOLVED_SUBRULE_REF\"] = 4] = \"UNRESOLVED_SUBRULE_REF\";\n ParserDefinitionErrorType[ParserDefinitionErrorType[\"LEFT_RECURSION\"] = 5] = \"LEFT_RECURSION\";\n ParserDefinitionErrorType[ParserDefinitionErrorType[\"NONE_LAST_EMPTY_ALT\"] = 6] = \"NONE_LAST_EMPTY_ALT\";\n ParserDefinitionErrorType[ParserDefinitionErrorType[\"AMBIGUOUS_ALTS\"] = 7] = \"AMBIGUOUS_ALTS\";\n ParserDefinitionErrorType[ParserDefinitionErrorType[\"CONFLICT_TOKENS_RULES_NAMESPACE\"] = 8] = \"CONFLICT_TOKENS_RULES_NAMESPACE\";\n ParserDefinitionErrorType[ParserDefinitionErrorType[\"INVALID_TOKEN_NAME\"] = 9] = \"INVALID_TOKEN_NAME\";\n ParserDefinitionErrorType[ParserDefinitionErrorType[\"NO_NON_EMPTY_LOOKAHEAD\"] = 10] = \"NO_NON_EMPTY_LOOKAHEAD\";\n ParserDefinitionErrorType[ParserDefinitionErrorType[\"AMBIGUOUS_PREFIX_ALTS\"] = 11] = \"AMBIGUOUS_PREFIX_ALTS\";\n ParserDefinitionErrorType[ParserDefinitionErrorType[\"TOO_MANY_ALTS\"] = 12] = \"TOO_MANY_ALTS\";\n ParserDefinitionErrorType[ParserDefinitionErrorType[\"CUSTOM_LOOKAHEAD_VALIDATION\"] = 13] = \"CUSTOM_LOOKAHEAD_VALIDATION\";\n})(ParserDefinitionErrorType = exports.ParserDefinitionErrorType || (exports.ParserDefinitionErrorType = {}));\nfunction EMPTY_ALT(value) {\n if (value === void 0) { value = undefined; }\n return function () {\n return value;\n };\n}\nexports.EMPTY_ALT = EMPTY_ALT;\nvar Parser = /** @class */ (function () {\n function Parser(tokenVocabulary, config) {\n this.definitionErrors = [];\n this.selfAnalysisDone = false;\n var that = this;\n that.initErrorHandler(config);\n that.initLexerAdapter();\n that.initLooksAhead(config);\n that.initRecognizerEngine(tokenVocabulary, config);\n that.initRecoverable(config);\n that.initTreeBuilder(config);\n that.initContentAssist();\n that.initGastRecorder(config);\n that.initPerformanceTracer(config);\n if ((0, has_1.default)(config, \"ignoredIssues\")) {\n throw new Error(\"The IParserConfig property has been deprecated.\\n\\t\" +\n \"Please use the flag on the relevant DSL method instead.\\n\\t\" +\n \"See: https://chevrotain.io/docs/guide/resolving_grammar_errors.html#IGNORING_AMBIGUITIES\\n\\t\" +\n \"For further details.\");\n }\n this.skipValidations = (0, has_1.default)(config, \"skipValidations\")\n ? config.skipValidations // casting assumes the end user passing the correct type\n : exports.DEFAULT_PARSER_CONFIG.skipValidations;\n }\n /**\n * @deprecated use the **instance** method with the same name instead\n */\n Parser.performSelfAnalysis = function (parserInstance) {\n throw Error(\"The **static** `performSelfAnalysis` method has been deprecated.\" +\n \"\\t\\nUse the **instance** method with the same name instead.\");\n };\n Parser.prototype.performSelfAnalysis = function () {\n var _this = this;\n this.TRACE_INIT(\"performSelfAnalysis\", function () {\n var defErrorsMsgs;\n _this.selfAnalysisDone = true;\n var className = _this.className;\n _this.TRACE_INIT(\"toFastProps\", function () {\n // Without this voodoo magic the parser would be x3-x4 slower\n // It seems it is better to invoke `toFastProperties` **before**\n // Any manipulations of the `this` object done during the recording phase.\n (0, utils_1.toFastProperties)(_this);\n });\n _this.TRACE_INIT(\"Grammar Recording\", function () {\n try {\n _this.enableRecording();\n // Building the GAST\n (0, forEach_1.default)(_this.definedRulesNames, function (currRuleName) {\n var wrappedRule = _this[currRuleName];\n var originalGrammarAction = wrappedRule[\"originalGrammarAction\"];\n var recordedRuleGast;\n _this.TRACE_INIT(\"\".concat(currRuleName, \" Rule\"), function () {\n recordedRuleGast = _this.topLevelRuleRecord(currRuleName, originalGrammarAction);\n });\n _this.gastProductionsCache[currRuleName] = recordedRuleGast;\n });\n }\n finally {\n _this.disableRecording();\n }\n });\n var resolverErrors = [];\n _this.TRACE_INIT(\"Grammar Resolving\", function () {\n resolverErrors = (0, gast_resolver_public_1.resolveGrammar)({\n rules: (0, values_1.default)(_this.gastProductionsCache)\n });\n _this.definitionErrors = _this.definitionErrors.concat(resolverErrors);\n });\n _this.TRACE_INIT(\"Grammar Validations\", function () {\n // only perform additional grammar validations IFF no resolving errors have occurred.\n // as unresolved grammar may lead to unhandled runtime exceptions in the follow up validations.\n if ((0, isEmpty_1.default)(resolverErrors) && _this.skipValidations === false) {\n var validationErrors = (0, gast_resolver_public_1.validateGrammar)({\n rules: (0, values_1.default)(_this.gastProductionsCache),\n tokenTypes: (0, values_1.default)(_this.tokensMap),\n errMsgProvider: errors_public_1.defaultGrammarValidatorErrorProvider,\n grammarName: className\n });\n var lookaheadValidationErrors = (0, checks_1.validateLookahead)({\n lookaheadStrategy: _this.lookaheadStrategy,\n rules: (0, values_1.default)(_this.gastProductionsCache),\n tokenTypes: (0, values_1.default)(_this.tokensMap),\n grammarName: className\n });\n _this.definitionErrors = _this.definitionErrors.concat(validationErrors, lookaheadValidationErrors);\n }\n });\n // this analysis may fail if the grammar is not perfectly valid\n if ((0, isEmpty_1.default)(_this.definitionErrors)) {\n // The results of these computations are not needed unless error recovery is enabled.\n if (_this.recoveryEnabled) {\n _this.TRACE_INIT(\"computeAllProdsFollows\", function () {\n var allFollows = (0, follow_1.computeAllProdsFollows)((0, values_1.default)(_this.gastProductionsCache));\n _this.resyncFollows = allFollows;\n });\n }\n _this.TRACE_INIT(\"ComputeLookaheadFunctions\", function () {\n var _a, _b;\n (_b = (_a = _this.lookaheadStrategy).initialize) === null || _b === void 0 ? void 0 : _b.call(_a, {\n rules: (0, values_1.default)(_this.gastProductionsCache)\n });\n _this.preComputeLookaheadFunctions((0, values_1.default)(_this.gastProductionsCache));\n });\n }\n if (!Parser.DEFER_DEFINITION_ERRORS_HANDLING &&\n !(0, isEmpty_1.default)(_this.definitionErrors)) {\n defErrorsMsgs = (0, map_1.default)(_this.definitionErrors, function (defError) { return defError.message; });\n throw new Error(\"Parser Definition Errors detected:\\n \".concat(defErrorsMsgs.join(\"\\n-------------------------------\\n\")));\n }\n });\n };\n // Set this flag to true if you don't want the Parser to throw error when problems in it's definition are detected.\n // (normally during the parser's constructor).\n // This is a design time flag, it will not affect the runtime error handling of the parser, just design time errors,\n // for example: duplicate rule names, referencing an unresolved subrule, ect...\n // This flag should not be enabled during normal usage, it is used in special situations, for example when\n // needing to display the parser definition errors in some GUI(online playground).\n Parser.DEFER_DEFINITION_ERRORS_HANDLING = false;\n return Parser;\n}());\nexports.Parser = Parser;\n(0, apply_mixins_1.applyMixins)(Parser, [\n recoverable_1.Recoverable,\n looksahead_1.LooksAhead,\n tree_builder_1.TreeBuilder,\n lexer_adapter_1.LexerAdapter,\n recognizer_engine_1.RecognizerEngine,\n recognizer_api_1.RecognizerApi,\n error_handler_1.ErrorHandler,\n context_assist_1.ContentAssist,\n gast_recorder_1.GastRecorder,\n perf_tracer_1.PerformanceTracer\n]);\nvar CstParser = /** @class */ (function (_super) {\n __extends(CstParser, _super);\n function CstParser(tokenVocabulary, config) {\n if (config === void 0) { config = exports.DEFAULT_PARSER_CONFIG; }\n var configClone = (0, clone_1.default)(config);\n configClone.outputCst = true;\n return _super.call(this, tokenVocabulary, configClone) || this;\n }\n return CstParser;\n}(Parser));\nexports.CstParser = CstParser;\nvar EmbeddedActionsParser = /** @class */ (function (_super) {\n __extends(EmbeddedActionsParser, _super);\n function EmbeddedActionsParser(tokenVocabulary, config) {\n if (config === void 0) { config = exports.DEFAULT_PARSER_CONFIG; }\n var configClone = (0, clone_1.default)(config);\n configClone.outputCst = false;\n return _super.call(this, tokenVocabulary, configClone) || this;\n }\n return EmbeddedActionsParser;\n}(Parser));\nexports.EmbeddedActionsParser = EmbeddedActionsParser;\n//# sourceMappingURL=parser.js.map","var arrayPush = require('./_arrayPush'),\n getPrototype = require('./_getPrototype'),\n getSymbols = require('./_getSymbols'),\n stubArray = require('./stubArray');\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeGetSymbols = Object.getOwnPropertySymbols;\n\n/**\n * Creates an array of the own and inherited enumerable symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of symbols.\n */\nvar getSymbolsIn = !nativeGetSymbols ? stubArray : function(object) {\n var result = [];\n while (object) {\n arrayPush(result, getSymbols(object));\n object = getPrototype(object);\n }\n return result;\n};\n\nmodule.exports = getSymbolsIn;\n","\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.genDts = void 0;\nvar flatten_1 = __importDefault(require(\"lodash/flatten\"));\nvar isArray_1 = __importDefault(require(\"lodash/isArray\"));\nvar map_1 = __importDefault(require(\"lodash/map\"));\nvar reduce_1 = __importDefault(require(\"lodash/reduce\"));\nvar uniq_1 = __importDefault(require(\"lodash/uniq\"));\nvar upperFirst_1 = __importDefault(require(\"lodash/upperFirst\"));\nfunction genDts(model, options) {\n var contentParts = [];\n contentParts = contentParts.concat(\"import type { CstNode, ICstVisitor, IToken } from \\\"chevrotain\\\";\");\n contentParts = contentParts.concat((0, flatten_1.default)((0, map_1.default)(model, function (node) { return genCstNodeTypes(node); })));\n if (options.includeVisitorInterface) {\n contentParts = contentParts.concat(genVisitor(options.visitorInterfaceName, model));\n }\n return contentParts.join(\"\\n\\n\") + \"\\n\";\n}\nexports.genDts = genDts;\nfunction genCstNodeTypes(node) {\n var nodeCstInterface = genNodeInterface(node);\n var nodeChildrenInterface = genNodeChildrenType(node);\n return [nodeCstInterface, nodeChildrenInterface];\n}\nfunction genNodeInterface(node) {\n var nodeInterfaceName = getNodeInterfaceName(node.name);\n var childrenTypeName = getNodeChildrenTypeName(node.name);\n return \"export interface \".concat(nodeInterfaceName, \" extends CstNode {\\n name: \\\"\").concat(node.name, \"\\\";\\n children: \").concat(childrenTypeName, \";\\n}\");\n}\nfunction genNodeChildrenType(node) {\n var typeName = getNodeChildrenTypeName(node.name);\n return \"export type \".concat(typeName, \" = {\\n \").concat((0, map_1.default)(node.properties, function (property) { return genChildProperty(property); }).join(\"\\n \"), \"\\n};\");\n}\nfunction genChildProperty(prop) {\n var typeName = buildTypeString(prop.type);\n return \"\".concat(prop.name).concat(prop.optional ? \"?\" : \"\", \": \").concat(typeName, \"[];\");\n}\nfunction genVisitor(name, nodes) {\n return \"export interface \".concat(name, \" extends ICstVisitor {\\n \").concat((0, map_1.default)(nodes, function (node) { return genVisitorFunction(node); }).join(\"\\n \"), \"\\n}\");\n}\nfunction genVisitorFunction(node) {\n var childrenTypeName = getNodeChildrenTypeName(node.name);\n return \"\".concat(node.name, \"(children: \").concat(childrenTypeName, \", param?: IN): OUT;\");\n}\nfunction buildTypeString(type) {\n if ((0, isArray_1.default)(type)) {\n var typeNames = (0, uniq_1.default)((0, map_1.default)(type, function (t) { return getTypeString(t); }));\n var typeString = (0, reduce_1.default)(typeNames, function (sum, t) { return sum + \" | \" + t; });\n return \"(\" + typeString + \")\";\n }\n else {\n return getTypeString(type);\n }\n}\nfunction getTypeString(type) {\n if (type.kind === \"token\") {\n return \"IToken\";\n }\n return getNodeInterfaceName(type.name);\n}\nfunction getNodeInterfaceName(ruleName) {\n return (0, upperFirst_1.default)(ruleName) + \"CstNode\";\n}\nfunction getNodeChildrenTypeName(ruleName) {\n return (0, upperFirst_1.default)(ruleName) + \"CstChildren\";\n}\n//# sourceMappingURL=generate.js.map","/**\n * Checks if `value` is classified as an `Array` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(document.body.children);\n * // => false\n *\n * _.isArray('abc');\n * // => false\n *\n * _.isArray(_.noop);\n * // => false\n */\nvar isArray = Array.isArray;\n\nmodule.exports = isArray;\n","var getNative = require('./_getNative'),\n root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar Set = getNative(root, 'Set');\n\nmodule.exports = Set;\n","var baseAssignValue = require('./_baseAssignValue'),\n eq = require('./eq');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Assigns `value` to `key` of `object` if the existing value is not equivalent\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\nfunction assignValue(object, key, value) {\n var objValue = object[key];\n if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) ||\n (value === undefined && !(key in object))) {\n baseAssignValue(object, key, value);\n }\n}\n\nmodule.exports = assignValue;\n","(function (window, factory) {\n if (typeof exports === 'object') {\n module.exports = factory();\n } else if (typeof define === 'function' && define.amd) {\n define(factory);\n } else {\n window.jStat = factory();\n }\n})(this, function () {\nvar jStat = (function(Math, undefined) {\n\n// For quick reference.\nvar concat = Array.prototype.concat;\nvar slice = Array.prototype.slice;\nvar toString = Object.prototype.toString;\n\n// Calculate correction for IEEE error\n// TODO: This calculation can be improved.\nfunction calcRdx(n, m) {\n var val = n > m ? n : m;\n return Math.pow(10,\n 17 - ~~(Math.log(((val > 0) ? val : -val)) * Math.LOG10E));\n}\n\n\nvar isArray = Array.isArray || function isArray(arg) {\n return toString.call(arg) === '[object Array]';\n};\n\n\nfunction isFunction(arg) {\n return toString.call(arg) === '[object Function]';\n}\n\n\nfunction isNumber(num) {\n return (typeof num === 'number') ? num - num === 0 : false;\n}\n\n\n// Converts the jStat matrix to vector.\nfunction toVector(arr) {\n return concat.apply([], arr);\n}\n\n\n// The one and only jStat constructor.\nfunction jStat() {\n return new jStat._init(arguments);\n}\n\n\n// TODO: Remove after all references in src files have been removed.\njStat.fn = jStat.prototype;\n\n\n// By separating the initializer from the constructor it's easier to handle\n// always returning a new instance whether \"new\" was used or not.\njStat._init = function _init(args) {\n // If first argument is an array, must be vector or matrix.\n if (isArray(args[0])) {\n // Check if matrix.\n if (isArray(args[0][0])) {\n // See if a mapping function was also passed.\n if (isFunction(args[1]))\n args[0] = jStat.map(args[0], args[1]);\n // Iterate over each is faster than this.push.apply(this, args[0].\n for (var i = 0; i < args[0].length; i++)\n this[i] = args[0][i];\n this.length = args[0].length;\n\n // Otherwise must be a vector.\n } else {\n this[0] = isFunction(args[1]) ? jStat.map(args[0], args[1]) : args[0];\n this.length = 1;\n }\n\n // If first argument is number, assume creation of sequence.\n } else if (isNumber(args[0])) {\n this[0] = jStat.seq.apply(null, args);\n this.length = 1;\n\n // Handle case when jStat object is passed to jStat.\n } else if (args[0] instanceof jStat) {\n // Duplicate the object and pass it back.\n return jStat(args[0].toArray());\n\n // Unexpected argument value, return empty jStat object.\n // TODO: This is strange behavior. Shouldn't this throw or some such to let\n // the user know they had bad arguments?\n } else {\n this[0] = [];\n this.length = 1;\n }\n\n return this;\n};\njStat._init.prototype = jStat.prototype;\njStat._init.constructor = jStat;\n\n\n// Utility functions.\n// TODO: for internal use only?\njStat.utils = {\n calcRdx: calcRdx,\n isArray: isArray,\n isFunction: isFunction,\n isNumber: isNumber,\n toVector: toVector\n};\n\n\njStat._random_fn = Math.random;\njStat.setRandom = function setRandom(fn) {\n if (typeof fn !== 'function')\n throw new TypeError('fn is not a function');\n jStat._random_fn = fn;\n};\n\n\n// Easily extend the jStat object.\n// TODO: is this seriously necessary?\njStat.extend = function extend(obj) {\n var i, j;\n\n if (arguments.length === 1) {\n for (j in obj)\n jStat[j] = obj[j];\n return this;\n }\n\n for (i = 1; i < arguments.length; i++) {\n for (j in arguments[i])\n obj[j] = arguments[i][j];\n }\n\n return obj;\n};\n\n\n// Returns the number of rows in the matrix.\njStat.rows = function rows(arr) {\n return arr.length || 1;\n};\n\n\n// Returns the number of columns in the matrix.\njStat.cols = function cols(arr) {\n return arr[0].length || 1;\n};\n\n\n// Returns the dimensions of the object { rows: i, cols: j }\njStat.dimensions = function dimensions(arr) {\n return {\n rows: jStat.rows(arr),\n cols: jStat.cols(arr)\n };\n};\n\n\n// Returns a specified row as a vector or return a sub matrix by pick some rows\njStat.row = function row(arr, index) {\n if (isArray(index)) {\n return index.map(function(i) {\n return jStat.row(arr, i);\n })\n }\n return arr[index];\n};\n\n\n// return row as array\n// rowa([[1,2],[3,4]],0) -> [1,2]\njStat.rowa = function rowa(arr, i) {\n return jStat.row(arr, i);\n};\n\n\n// Returns the specified column as a vector or return a sub matrix by pick some\n// columns\njStat.col = function col(arr, index) {\n if (isArray(index)) {\n var submat = jStat.arange(arr.length).map(function() {\n return new Array(index.length);\n });\n index.forEach(function(ind, i){\n jStat.arange(arr.length).forEach(function(j) {\n submat[j][i] = arr[j][ind];\n });\n });\n return submat;\n }\n var column = new Array(arr.length);\n for (var i = 0; i < arr.length; i++)\n column[i] = [arr[i][index]];\n return column;\n};\n\n\n// return column as array\n// cola([[1,2],[3,4]],0) -> [1,3]\njStat.cola = function cola(arr, i) {\n return jStat.col(arr, i).map(function(a){ return a[0] });\n};\n\n\n// Returns the diagonal of the matrix\njStat.diag = function diag(arr) {\n var nrow = jStat.rows(arr);\n var res = new Array(nrow);\n for (var row = 0; row < nrow; row++)\n res[row] = [arr[row][row]];\n return res;\n};\n\n\n// Returns the anti-diagonal of the matrix\njStat.antidiag = function antidiag(arr) {\n var nrow = jStat.rows(arr) - 1;\n var res = new Array(nrow);\n for (var i = 0; nrow >= 0; nrow--, i++)\n res[i] = [arr[i][nrow]];\n return res;\n};\n\n// Transpose a matrix or array.\njStat.transpose = function transpose(arr) {\n var obj = [];\n var objArr, rows, cols, j, i;\n\n // Make sure arr is in matrix format.\n if (!isArray(arr[0]))\n arr = [arr];\n\n rows = arr.length;\n cols = arr[0].length;\n\n for (i = 0; i < cols; i++) {\n objArr = new Array(rows);\n for (j = 0; j < rows; j++)\n objArr[j] = arr[j][i];\n obj.push(objArr);\n }\n\n // If obj is vector, return only single array.\n return obj.length === 1 ? obj[0] : obj;\n};\n\n\n// Map a function to an array or array of arrays.\n// \"toAlter\" is an internal variable.\njStat.map = function map(arr, func, toAlter) {\n var row, nrow, ncol, res, col;\n\n if (!isArray(arr[0]))\n arr = [arr];\n\n nrow = arr.length;\n ncol = arr[0].length;\n res = toAlter ? arr : new Array(nrow);\n\n for (row = 0; row < nrow; row++) {\n // if the row doesn't exist, create it\n if (!res[row])\n res[row] = new Array(ncol);\n for (col = 0; col < ncol; col++)\n res[row][col] = func(arr[row][col], row, col);\n }\n\n return res.length === 1 ? res[0] : res;\n};\n\n\n// Cumulatively combine the elements of an array or array of arrays using a function.\njStat.cumreduce = function cumreduce(arr, func, toAlter) {\n var row, nrow, ncol, res, col;\n\n if (!isArray(arr[0]))\n arr = [arr];\n\n nrow = arr.length;\n ncol = arr[0].length;\n res = toAlter ? arr : new Array(nrow);\n\n for (row = 0; row < nrow; row++) {\n // if the row doesn't exist, create it\n if (!res[row])\n res[row] = new Array(ncol);\n if (ncol > 0)\n res[row][0] = arr[row][0];\n for (col = 1; col < ncol; col++)\n res[row][col] = func(res[row][col-1], arr[row][col]);\n }\n return res.length === 1 ? res[0] : res;\n};\n\n\n// Destructively alter an array.\njStat.alter = function alter(arr, func) {\n return jStat.map(arr, func, true);\n};\n\n\n// Generate a rows x cols matrix according to the supplied function.\njStat.create = function create(rows, cols, func) {\n var res = new Array(rows);\n var i, j;\n\n if (isFunction(cols)) {\n func = cols;\n cols = rows;\n }\n\n for (i = 0; i < rows; i++) {\n res[i] = new Array(cols);\n for (j = 0; j < cols; j++)\n res[i][j] = func(i, j);\n }\n\n return res;\n};\n\n\nfunction retZero() { return 0; }\n\n\n// Generate a rows x cols matrix of zeros.\njStat.zeros = function zeros(rows, cols) {\n if (!isNumber(cols))\n cols = rows;\n return jStat.create(rows, cols, retZero);\n};\n\n\nfunction retOne() { return 1; }\n\n\n// Generate a rows x cols matrix of ones.\njStat.ones = function ones(rows, cols) {\n if (!isNumber(cols))\n cols = rows;\n return jStat.create(rows, cols, retOne);\n};\n\n\n// Generate a rows x cols matrix of uniformly random numbers.\njStat.rand = function rand(rows, cols) {\n if (!isNumber(cols))\n cols = rows;\n return jStat.create(rows, cols, jStat._random_fn);\n};\n\n\nfunction retIdent(i, j) { return i === j ? 1 : 0; }\n\n\n// Generate an identity matrix of size row x cols.\njStat.identity = function identity(rows, cols) {\n if (!isNumber(cols))\n cols = rows;\n return jStat.create(rows, cols, retIdent);\n};\n\n\n// Tests whether a matrix is symmetric\njStat.symmetric = function symmetric(arr) {\n var size = arr.length;\n var row, col;\n\n if (arr.length !== arr[0].length)\n return false;\n\n for (row = 0; row < size; row++) {\n for (col = 0; col < size; col++)\n if (arr[col][row] !== arr[row][col])\n return false;\n }\n\n return true;\n};\n\n\n// Set all values to zero.\njStat.clear = function clear(arr) {\n return jStat.alter(arr, retZero);\n};\n\n\n// Generate sequence.\njStat.seq = function seq(min, max, length, func) {\n if (!isFunction(func))\n func = false;\n\n var arr = [];\n var hival = calcRdx(min, max);\n var step = (max * hival - min * hival) / ((length - 1) * hival);\n var current = min;\n var cnt;\n\n // Current is assigned using a technique to compensate for IEEE error.\n // TODO: Needs better implementation.\n for (cnt = 0;\n current <= max && cnt < length;\n cnt++, current = (min * hival + step * hival * cnt) / hival) {\n arr.push((func ? func(current, cnt) : current));\n }\n\n return arr;\n};\n\n\n// arange(5) -> [0,1,2,3,4]\n// arange(1,5) -> [1,2,3,4]\n// arange(5,1,-1) -> [5,4,3,2]\njStat.arange = function arange(start, end, step) {\n var rl = [];\n var i;\n step = step || 1;\n if (end === undefined) {\n end = start;\n start = 0;\n }\n if (start === end || step === 0) {\n return [];\n }\n if (start < end && step < 0) {\n return [];\n }\n if (start > end && step > 0) {\n return [];\n }\n if (step > 0) {\n for (i = start; i < end; i += step) {\n rl.push(i);\n }\n } else {\n for (i = start; i > end; i += step) {\n rl.push(i);\n }\n }\n return rl;\n};\n\n\n// A=[[1,2,3],[4,5,6],[7,8,9]]\n// slice(A,{row:{end:2},col:{start:1}}) -> [[2,3],[5,6]]\n// slice(A,1,{start:1}) -> [5,6]\n// as numpy code A[:2,1:]\njStat.slice = (function(){\n function _slice(list, start, end, step) {\n // note it's not equal to range.map mode it's a bug\n var i;\n var rl = [];\n var length = list.length;\n if (start === undefined && end === undefined && step === undefined) {\n return jStat.copy(list);\n }\n\n start = start || 0;\n end = end || list.length;\n start = start >= 0 ? start : length + start;\n end = end >= 0 ? end : length + end;\n step = step || 1;\n if (start === end || step === 0) {\n return [];\n }\n if (start < end && step < 0) {\n return [];\n }\n if (start > end && step > 0) {\n return [];\n }\n if (step > 0) {\n for (i = start; i < end; i += step) {\n rl.push(list[i]);\n }\n } else {\n for (i = start; i > end;i += step) {\n rl.push(list[i]);\n }\n }\n return rl;\n }\n\n function slice(list, rcSlice) {\n var colSlice, rowSlice;\n rcSlice = rcSlice || {};\n if (isNumber(rcSlice.row)) {\n if (isNumber(rcSlice.col))\n return list[rcSlice.row][rcSlice.col];\n var row = jStat.rowa(list, rcSlice.row);\n colSlice = rcSlice.col || {};\n return _slice(row, colSlice.start, colSlice.end, colSlice.step);\n }\n\n if (isNumber(rcSlice.col)) {\n var col = jStat.cola(list, rcSlice.col);\n rowSlice = rcSlice.row || {};\n return _slice(col, rowSlice.start, rowSlice.end, rowSlice.step);\n }\n\n rowSlice = rcSlice.row || {};\n colSlice = rcSlice.col || {};\n var rows = _slice(list, rowSlice.start, rowSlice.end, rowSlice.step);\n return rows.map(function(row) {\n return _slice(row, colSlice.start, colSlice.end, colSlice.step);\n });\n }\n\n return slice;\n}());\n\n\n// A=[[1,2,3],[4,5,6],[7,8,9]]\n// sliceAssign(A,{row:{start:1},col:{start:1}},[[0,0],[0,0]])\n// A=[[1,2,3],[4,0,0],[7,0,0]]\njStat.sliceAssign = function sliceAssign(A, rcSlice, B) {\n var nl, ml;\n if (isNumber(rcSlice.row)) {\n if (isNumber(rcSlice.col))\n return A[rcSlice.row][rcSlice.col] = B;\n rcSlice.col = rcSlice.col || {};\n rcSlice.col.start = rcSlice.col.start || 0;\n rcSlice.col.end = rcSlice.col.end || A[0].length;\n rcSlice.col.step = rcSlice.col.step || 1;\n nl = jStat.arange(rcSlice.col.start,\n Math.min(A.length, rcSlice.col.end),\n rcSlice.col.step);\n var m = rcSlice.row;\n nl.forEach(function(n, i) {\n A[m][n] = B[i];\n });\n return A;\n }\n\n if (isNumber(rcSlice.col)) {\n rcSlice.row = rcSlice.row || {};\n rcSlice.row.start = rcSlice.row.start || 0;\n rcSlice.row.end = rcSlice.row.end || A.length;\n rcSlice.row.step = rcSlice.row.step || 1;\n ml = jStat.arange(rcSlice.row.start,\n Math.min(A[0].length, rcSlice.row.end),\n rcSlice.row.step);\n var n = rcSlice.col;\n ml.forEach(function(m, j) {\n A[m][n] = B[j];\n });\n return A;\n }\n\n if (B[0].length === undefined) {\n B = [B];\n }\n rcSlice.row.start = rcSlice.row.start || 0;\n rcSlice.row.end = rcSlice.row.end || A.length;\n rcSlice.row.step = rcSlice.row.step || 1;\n rcSlice.col.start = rcSlice.col.start || 0;\n rcSlice.col.end = rcSlice.col.end || A[0].length;\n rcSlice.col.step = rcSlice.col.step || 1;\n ml = jStat.arange(rcSlice.row.start,\n Math.min(A.length, rcSlice.row.end),\n rcSlice.row.step);\n nl = jStat.arange(rcSlice.col.start,\n Math.min(A[0].length, rcSlice.col.end),\n rcSlice.col.step);\n ml.forEach(function(m, i) {\n nl.forEach(function(n, j) {\n A[m][n] = B[i][j];\n });\n });\n return A;\n};\n\n\n// [1,2,3] ->\n// [[1,0,0],[0,2,0],[0,0,3]]\njStat.diagonal = function diagonal(diagArray) {\n var mat = jStat.zeros(diagArray.length, diagArray.length);\n diagArray.forEach(function(t, i) {\n mat[i][i] = t;\n });\n return mat;\n};\n\n\n// return copy of A\njStat.copy = function copy(A) {\n return A.map(function(row) {\n if (isNumber(row))\n return row;\n return row.map(function(t) {\n return t;\n });\n });\n};\n\n\n// TODO: Go over this entire implementation. Seems a tragic waste of resources\n// doing all this work. Instead, and while ugly, use new Function() to generate\n// a custom function for each static method.\n\n// Quick reference.\nvar jProto = jStat.prototype;\n\n// Default length.\njProto.length = 0;\n\n// For internal use only.\n// TODO: Check if they're actually used, and if they are then rename them\n// to _*\njProto.push = Array.prototype.push;\njProto.sort = Array.prototype.sort;\njProto.splice = Array.prototype.splice;\njProto.slice = Array.prototype.slice;\n\n\n// Return a clean array.\njProto.toArray = function toArray() {\n return this.length > 1 ? slice.call(this) : slice.call(this)[0];\n};\n\n\n// Map a function to a matrix or vector.\njProto.map = function map(func, toAlter) {\n return jStat(jStat.map(this, func, toAlter));\n};\n\n\n// Cumulatively combine the elements of a matrix or vector using a function.\njProto.cumreduce = function cumreduce(func, toAlter) {\n return jStat(jStat.cumreduce(this, func, toAlter));\n};\n\n\n// Destructively alter an array.\njProto.alter = function alter(func) {\n jStat.alter(this, func);\n return this;\n};\n\n\n// Extend prototype with methods that have no argument.\n(function(funcs) {\n for (var i = 0; i < funcs.length; i++) (function(passfunc) {\n jProto[passfunc] = function(func) {\n var self = this,\n results;\n // Check for callback.\n if (func) {\n setTimeout(function() {\n func.call(self, jProto[passfunc].call(self));\n });\n return this;\n }\n results = jStat[passfunc](this);\n return isArray(results) ? jStat(results) : results;\n };\n })(funcs[i]);\n})('transpose clear symmetric rows cols dimensions diag antidiag'.split(' '));\n\n\n// Extend prototype with methods that have one argument.\n(function(funcs) {\n for (var i = 0; i < funcs.length; i++) (function(passfunc) {\n jProto[passfunc] = function(index, func) {\n var self = this;\n // check for callback\n if (func) {\n setTimeout(function() {\n func.call(self, jProto[passfunc].call(self, index));\n });\n return this;\n }\n return jStat(jStat[passfunc](this, index));\n };\n })(funcs[i]);\n})('row col'.split(' '));\n\n\n// Extend prototype with simple shortcut methods.\n(function(funcs) {\n for (var i = 0; i < funcs.length; i++) (function(passfunc) {\n jProto[passfunc] = function() {\n return jStat(jStat[passfunc].apply(null, arguments));\n };\n })(funcs[i]);\n})('create zeros ones rand identity'.split(' '));\n\n\n// Exposing jStat.\nreturn jStat;\n\n}(Math));\n(function(jStat, Math) {\n\nvar isFunction = jStat.utils.isFunction;\n\n// Ascending functions for sort\nfunction ascNum(a, b) { return a - b; }\n\nfunction clip(arg, min, max) {\n return Math.max(min, Math.min(arg, max));\n}\n\n\n// sum of an array\njStat.sum = function sum(arr) {\n var sum = 0;\n var i = arr.length;\n while (--i >= 0)\n sum += arr[i];\n return sum;\n};\n\n\n// sum squared\njStat.sumsqrd = function sumsqrd(arr) {\n var sum = 0;\n var i = arr.length;\n while (--i >= 0)\n sum += arr[i] * arr[i];\n return sum;\n};\n\n\n// sum of squared errors of prediction (SSE)\njStat.sumsqerr = function sumsqerr(arr) {\n var mean = jStat.mean(arr);\n var sum = 0;\n var i = arr.length;\n var tmp;\n while (--i >= 0) {\n tmp = arr[i] - mean;\n sum += tmp * tmp;\n }\n return sum;\n};\n\n// sum of an array in each row\njStat.sumrow = function sumrow(arr) {\n var sum = 0;\n var i = arr.length;\n while (--i >= 0)\n sum += arr[i];\n return sum;\n};\n\n// product of an array\njStat.product = function product(arr) {\n var prod = 1;\n var i = arr.length;\n while (--i >= 0)\n prod *= arr[i];\n return prod;\n};\n\n\n// minimum value of an array\njStat.min = function min(arr) {\n var low = arr[0];\n var i = 0;\n while (++i < arr.length)\n if (arr[i] < low)\n low = arr[i];\n return low;\n};\n\n\n// maximum value of an array\njStat.max = function max(arr) {\n var high = arr[0];\n var i = 0;\n while (++i < arr.length)\n if (arr[i] > high)\n high = arr[i];\n return high;\n};\n\n\n// unique values of an array\njStat.unique = function unique(arr) {\n var hash = {}, _arr = [];\n for(var i = 0; i < arr.length; i++) {\n if (!hash[arr[i]]) {\n hash[arr[i]] = true;\n _arr.push(arr[i]);\n }\n }\n return _arr;\n};\n\n\n// mean value of an array\njStat.mean = function mean(arr) {\n return jStat.sum(arr) / arr.length;\n};\n\n\n// mean squared error (MSE)\njStat.meansqerr = function meansqerr(arr) {\n return jStat.sumsqerr(arr) / arr.length;\n};\n\n\n// geometric mean of an array\njStat.geomean = function geomean(arr) {\n var logs = arr.map(Math.log)\n var meanOfLogs = jStat.mean(logs)\n return Math.exp(meanOfLogs)\n};\n\n\n// median of an array\njStat.median = function median(arr) {\n var arrlen = arr.length;\n var _arr = arr.slice().sort(ascNum);\n // check if array is even or odd, then return the appropriate\n return !(arrlen & 1)\n ? (_arr[(arrlen / 2) - 1 ] + _arr[(arrlen / 2)]) / 2\n : _arr[(arrlen / 2) | 0 ];\n};\n\n\n// cumulative sum of an array\njStat.cumsum = function cumsum(arr) {\n return jStat.cumreduce(arr, function (a, b) { return a + b; });\n};\n\n\n// cumulative product of an array\njStat.cumprod = function cumprod(arr) {\n return jStat.cumreduce(arr, function (a, b) { return a * b; });\n};\n\n\n// successive differences of a sequence\njStat.diff = function diff(arr) {\n var diffs = [];\n var arrLen = arr.length;\n var i;\n for (i = 1; i < arrLen; i++)\n diffs.push(arr[i] - arr[i - 1]);\n return diffs;\n};\n\n\n// ranks of an array\njStat.rank = function (arr) {\n var i;\n var distinctNumbers = [];\n var numberCounts = {};\n for (i = 0; i < arr.length; i++) {\n var number = arr[i];\n if (numberCounts[number]) {\n numberCounts[number]++;\n } else {\n numberCounts[number] = 1;\n distinctNumbers.push(number);\n }\n }\n\n var sortedDistinctNumbers = distinctNumbers.sort(ascNum);\n var numberRanks = {};\n var currentRank = 1;\n for (i = 0; i < sortedDistinctNumbers.length; i++) {\n var number = sortedDistinctNumbers[i];\n var count = numberCounts[number];\n var first = currentRank;\n var last = currentRank + count - 1;\n var rank = (first + last) / 2;\n numberRanks[number] = rank;\n currentRank += count;\n }\n\n return arr.map(function (number) {\n return numberRanks[number];\n });\n};\n\n\n// mode of an array\n// if there are multiple modes of an array, return all of them\n// is this the appropriate way of handling it?\njStat.mode = function mode(arr) {\n var arrLen = arr.length;\n var _arr = arr.slice().sort(ascNum);\n var count = 1;\n var maxCount = 0;\n var numMaxCount = 0;\n var mode_arr = [];\n var i;\n\n for (i = 0; i < arrLen; i++) {\n if (_arr[i] === _arr[i + 1]) {\n count++;\n } else {\n if (count > maxCount) {\n mode_arr = [_arr[i]];\n maxCount = count;\n numMaxCount = 0;\n }\n // are there multiple max counts\n else if (count === maxCount) {\n mode_arr.push(_arr[i]);\n numMaxCount++;\n }\n // resetting count for new value in array\n count = 1;\n }\n }\n\n return numMaxCount === 0 ? mode_arr[0] : mode_arr;\n};\n\n\n// range of an array\njStat.range = function range(arr) {\n return jStat.max(arr) - jStat.min(arr);\n};\n\n// variance of an array\n// flag = true indicates sample instead of population\njStat.variance = function variance(arr, flag) {\n return jStat.sumsqerr(arr) / (arr.length - (flag ? 1 : 0));\n};\n\n// pooled variance of an array of arrays\njStat.pooledvariance = function pooledvariance(arr) {\n var sumsqerr = arr.reduce(function (a, samples) {return a + jStat.sumsqerr(samples);}, 0);\n var count = arr.reduce(function (a, samples) {return a + samples.length;}, 0);\n return sumsqerr / (count - arr.length);\n};\n\n// deviation of an array\njStat.deviation = function (arr) {\n var mean = jStat.mean(arr);\n var arrlen = arr.length;\n var dev = new Array(arrlen);\n for (var i = 0; i < arrlen; i++) {\n dev[i] = arr[i] - mean;\n }\n return dev;\n};\n\n// standard deviation of an array\n// flag = true indicates sample instead of population\njStat.stdev = function stdev(arr, flag) {\n return Math.sqrt(jStat.variance(arr, flag));\n};\n\n// pooled standard deviation of an array of arrays\njStat.pooledstdev = function pooledstdev(arr) {\n return Math.sqrt(jStat.pooledvariance(arr));\n};\n\n// mean deviation (mean absolute deviation) of an array\njStat.meandev = function meandev(arr) {\n var mean = jStat.mean(arr);\n var a = [];\n for (var i = arr.length - 1; i >= 0; i--) {\n a.push(Math.abs(arr[i] - mean));\n }\n return jStat.mean(a);\n};\n\n\n// median deviation (median absolute deviation) of an array\njStat.meddev = function meddev(arr) {\n var median = jStat.median(arr);\n var a = [];\n for (var i = arr.length - 1; i >= 0; i--) {\n a.push(Math.abs(arr[i] - median));\n }\n return jStat.median(a);\n};\n\n\n// coefficient of variation\njStat.coeffvar = function coeffvar(arr) {\n return jStat.stdev(arr) / jStat.mean(arr);\n};\n\n\n// quartiles of an array\njStat.quartiles = function quartiles(arr) {\n var arrlen = arr.length;\n var _arr = arr.slice().sort(ascNum);\n return [\n _arr[ Math.round((arrlen) / 4) - 1 ],\n _arr[ Math.round((arrlen) / 2) - 1 ],\n _arr[ Math.round((arrlen) * 3 / 4) - 1 ]\n ];\n};\n\n\n// Arbitary quantiles of an array. Direct port of the scipy.stats\n// implementation by Pierre GF Gerard-Marchant.\njStat.quantiles = function quantiles(arr, quantilesArray, alphap, betap) {\n var sortedArray = arr.slice().sort(ascNum);\n var quantileVals = [quantilesArray.length];\n var n = arr.length;\n var i, p, m, aleph, k, gamma;\n\n if (typeof alphap === 'undefined')\n alphap = 3 / 8;\n if (typeof betap === 'undefined')\n betap = 3 / 8;\n\n for (i = 0; i < quantilesArray.length; i++) {\n p = quantilesArray[i];\n m = alphap + p * (1 - alphap - betap);\n aleph = n * p + m;\n k = Math.floor(clip(aleph, 1, n - 1));\n gamma = clip(aleph - k, 0, 1);\n quantileVals[i] = (1 - gamma) * sortedArray[k - 1] + gamma * sortedArray[k];\n }\n\n return quantileVals;\n};\n\n// Return the k-th percentile of values in a range, where k is in the range 0..1, inclusive.\n// Passing true for the exclusive parameter excludes both endpoints of the range.\njStat.percentile = function percentile(arr, k, exclusive) {\n var _arr = arr.slice().sort(ascNum);\n var realIndex = k * (_arr.length + (exclusive ? 1 : -1)) + (exclusive ? 0 : 1);\n var index = parseInt(realIndex);\n var frac = realIndex - index;\n if (index + 1 < _arr.length) {\n return _arr[index - 1] + frac * (_arr[index] - _arr[index - 1]);\n } else {\n return _arr[index - 1];\n }\n}\n\n// The percentile rank of score in a given array. Returns the percentage\n// of all values in the input array that are less than (kind='strict') or\n// less or equal than (kind='weak') score. Default is weak.\njStat.percentileOfScore = function percentileOfScore(arr, score, kind) {\n var counter = 0;\n var len = arr.length;\n var strict = false;\n var value, i;\n\n if (kind === 'strict')\n strict = true;\n\n for (i = 0; i < len; i++) {\n value = arr[i];\n if ((strict && value < score) ||\n (!strict && value <= score)) {\n counter++;\n }\n }\n\n return counter / len;\n};\n\n\n// Histogram (bin count) data\njStat.histogram = function histogram(arr, binCnt) {\n binCnt = binCnt || 4;\n var first = jStat.min(arr);\n var binWidth = (jStat.max(arr) - first) / binCnt;\n var len = arr.length;\n var bins = [];\n var i;\n\n for (i = 0; i < binCnt; i++)\n bins[i] = 0;\n for (i = 0; i < len; i++)\n bins[Math.min(Math.floor(((arr[i] - first) / binWidth)), binCnt - 1)] += 1;\n\n return bins;\n};\n\n\n// covariance of two arrays\njStat.covariance = function covariance(arr1, arr2) {\n var u = jStat.mean(arr1);\n var v = jStat.mean(arr2);\n var arr1Len = arr1.length;\n var sq_dev = new Array(arr1Len);\n var i;\n\n for (i = 0; i < arr1Len; i++)\n sq_dev[i] = (arr1[i] - u) * (arr2[i] - v);\n\n return jStat.sum(sq_dev) / (arr1Len - 1);\n};\n\n\n// (pearson's) population correlation coefficient, rho\njStat.corrcoeff = function corrcoeff(arr1, arr2) {\n return jStat.covariance(arr1, arr2) /\n jStat.stdev(arr1, 1) /\n jStat.stdev(arr2, 1);\n};\n\n // (spearman's) rank correlation coefficient, sp\njStat.spearmancoeff = function (arr1, arr2) {\n arr1 = jStat.rank(arr1);\n arr2 = jStat.rank(arr2);\n //return pearson's correlation of the ranks:\n return jStat.corrcoeff(arr1, arr2);\n}\n\n\n// statistical standardized moments (general form of skew/kurt)\njStat.stanMoment = function stanMoment(arr, n) {\n var mu = jStat.mean(arr);\n var sigma = jStat.stdev(arr);\n var len = arr.length;\n var skewSum = 0;\n\n for (var i = 0; i < len; i++)\n skewSum += Math.pow((arr[i] - mu) / sigma, n);\n\n return skewSum / arr.length;\n};\n\n// (pearson's) moment coefficient of skewness\njStat.skewness = function skewness(arr) {\n return jStat.stanMoment(arr, 3);\n};\n\n// (pearson's) (excess) kurtosis\njStat.kurtosis = function kurtosis(arr) {\n return jStat.stanMoment(arr, 4) - 3;\n};\n\n\nvar jProto = jStat.prototype;\n\n\n// Extend jProto with method for calculating cumulative sums and products.\n// This differs from the similar extension below as cumsum and cumprod should\n// not be run again in the case fullbool === true.\n// If a matrix is passed, automatically assume operation should be done on the\n// columns.\n(function(funcs) {\n for (var i = 0; i < funcs.length; i++) (function(passfunc) {\n // If a matrix is passed, automatically assume operation should be done on\n // the columns.\n jProto[passfunc] = function(fullbool, func) {\n var arr = [];\n var i = 0;\n var tmpthis = this;\n // Assignment reassignation depending on how parameters were passed in.\n if (isFunction(fullbool)) {\n func = fullbool;\n fullbool = false;\n }\n // Check if a callback was passed with the function.\n if (func) {\n setTimeout(function() {\n func.call(tmpthis, jProto[passfunc].call(tmpthis, fullbool));\n });\n return this;\n }\n // Check if matrix and run calculations.\n if (this.length > 1) {\n tmpthis = fullbool === true ? this : this.transpose();\n for (; i < tmpthis.length; i++)\n arr[i] = jStat[passfunc](tmpthis[i]);\n return arr;\n }\n // Pass fullbool if only vector, not a matrix. for variance and stdev.\n return jStat[passfunc](this[0], fullbool);\n };\n })(funcs[i]);\n})(('cumsum cumprod').split(' '));\n\n\n// Extend jProto with methods which don't require arguments and work on columns.\n(function(funcs) {\n for (var i = 0; i < funcs.length; i++) (function(passfunc) {\n // If a matrix is passed, automatically assume operation should be done on\n // the columns.\n jProto[passfunc] = function(fullbool, func) {\n var arr = [];\n var i = 0;\n var tmpthis = this;\n // Assignment reassignation depending on how parameters were passed in.\n if (isFunction(fullbool)) {\n func = fullbool;\n fullbool = false;\n }\n // Check if a callback was passed with the function.\n if (func) {\n setTimeout(function() {\n func.call(tmpthis, jProto[passfunc].call(tmpthis, fullbool));\n });\n return this;\n }\n // Check if matrix and run calculations.\n if (this.length > 1) {\n if (passfunc !== 'sumrow')\n tmpthis = fullbool === true ? this : this.transpose();\n for (; i < tmpthis.length; i++)\n arr[i] = jStat[passfunc](tmpthis[i]);\n return fullbool === true\n ? jStat[passfunc](jStat.utils.toVector(arr))\n : arr;\n }\n // Pass fullbool if only vector, not a matrix. for variance and stdev.\n return jStat[passfunc](this[0], fullbool);\n };\n })(funcs[i]);\n})(('sum sumsqrd sumsqerr sumrow product min max unique mean meansqerr ' +\n 'geomean median diff rank mode range variance deviation stdev meandev ' +\n 'meddev coeffvar quartiles histogram skewness kurtosis').split(' '));\n\n\n// Extend jProto with functions that take arguments. Operations on matrices are\n// done on columns.\n(function(funcs) {\n for (var i = 0; i < funcs.length; i++) (function(passfunc) {\n jProto[passfunc] = function() {\n var arr = [];\n var i = 0;\n var tmpthis = this;\n var args = Array.prototype.slice.call(arguments);\n var callbackFunction;\n\n // If the last argument is a function, we assume it's a callback; we\n // strip the callback out and call the function again.\n if (isFunction(args[args.length - 1])) {\n callbackFunction = args[args.length - 1];\n var argsToPass = args.slice(0, args.length - 1);\n\n setTimeout(function() {\n callbackFunction.call(tmpthis,\n jProto[passfunc].apply(tmpthis, argsToPass));\n });\n return this;\n\n // Otherwise we curry the function args and call normally.\n } else {\n callbackFunction = undefined;\n var curriedFunction = function curriedFunction(vector) {\n return jStat[passfunc].apply(tmpthis, [vector].concat(args));\n }\n }\n\n // If this is a matrix, run column-by-column.\n if (this.length > 1) {\n tmpthis = tmpthis.transpose();\n for (; i < tmpthis.length; i++)\n arr[i] = curriedFunction(tmpthis[i]);\n return arr;\n }\n\n // Otherwise run on the vector.\n return curriedFunction(this[0]);\n };\n })(funcs[i]);\n})('quantiles percentileOfScore'.split(' '));\n\n}(jStat, Math));\n// Special functions //\n(function(jStat, Math) {\n\n// Log-gamma function\njStat.gammaln = function gammaln(x) {\n var j = 0;\n var cof = [\n 76.18009172947146, -86.50532032941677, 24.01409824083091,\n -1.231739572450155, 0.1208650973866179e-2, -0.5395239384953e-5\n ];\n var ser = 1.000000000190015;\n var xx, y, tmp;\n tmp = (y = xx = x) + 5.5;\n tmp -= (xx + 0.5) * Math.log(tmp);\n for (; j < 6; j++)\n ser += cof[j] / ++y;\n return Math.log(2.5066282746310005 * ser / xx) - tmp;\n};\n\n/*\n * log-gamma function to support poisson distribution sampling. The\n * algorithm comes from SPECFUN by Shanjie Zhang and Jianming Jin and their\n * book \"Computation of Special Functions\", 1996, John Wiley & Sons, Inc.\n */\njStat.loggam = function loggam(x) {\n var x0, x2, xp, gl, gl0;\n var k, n;\n\n var a = [8.333333333333333e-02, -2.777777777777778e-03,\n 7.936507936507937e-04, -5.952380952380952e-04,\n 8.417508417508418e-04, -1.917526917526918e-03,\n 6.410256410256410e-03, -2.955065359477124e-02,\n 1.796443723688307e-01, -1.39243221690590e+00];\n x0 = x;\n n = 0;\n if ((x == 1.0) || (x == 2.0)) {\n return 0.0;\n }\n if (x <= 7.0) {\n n = Math.floor(7 - x);\n x0 = x + n;\n }\n x2 = 1.0 / (x0 * x0);\n xp = 2 * Math.PI;\n gl0 = a[9];\n for (k = 8; k >= 0; k--) {\n gl0 *= x2;\n gl0 += a[k];\n }\n gl = gl0 / x0 + 0.5 * Math.log(xp) + (x0 - 0.5) * Math.log(x0) - x0;\n if (x <= 7.0) {\n for (k = 1; k <= n; k++) {\n gl -= Math.log(x0 - 1.0);\n x0 -= 1.0;\n }\n }\n return gl;\n}\n\n// gamma of x\njStat.gammafn = function gammafn(x) {\n var p = [-1.716185138865495, 24.76565080557592, -379.80425647094563,\n 629.3311553128184, 866.9662027904133, -31451.272968848367,\n -36144.413418691176, 66456.14382024054\n ];\n var q = [-30.8402300119739, 315.35062697960416, -1015.1563674902192,\n -3107.771671572311, 22538.118420980151, 4755.8462775278811,\n -134659.9598649693, -115132.2596755535];\n var fact = false;\n var n = 0;\n var xden = 0;\n var xnum = 0;\n var y = x;\n var i, z, yi, res;\n if (x > 171.6243769536076) {\n return Infinity;\n }\n if (y <= 0) {\n res = y % 1 + 3.6e-16;\n if (res) {\n fact = (!(y & 1) ? 1 : -1) * Math.PI / Math.sin(Math.PI * res);\n y = 1 - y;\n } else {\n return Infinity;\n }\n }\n yi = y;\n if (y < 1) {\n z = y++;\n } else {\n z = (y -= n = (y | 0) - 1) - 1;\n }\n for (i = 0; i < 8; ++i) {\n xnum = (xnum + p[i]) * z;\n xden = xden * z + q[i];\n }\n res = xnum / xden + 1;\n if (yi < y) {\n res /= yi;\n } else if (yi > y) {\n for (i = 0; i < n; ++i) {\n res *= y;\n y++;\n }\n }\n if (fact) {\n res = fact / res;\n }\n return res;\n};\n\n\n// lower incomplete gamma function, which is usually typeset with a\n// lower-case greek gamma as the function symbol\njStat.gammap = function gammap(a, x) {\n return jStat.lowRegGamma(a, x) * jStat.gammafn(a);\n};\n\n\n// The lower regularized incomplete gamma function, usually written P(a,x)\njStat.lowRegGamma = function lowRegGamma(a, x) {\n var aln = jStat.gammaln(a);\n var ap = a;\n var sum = 1 / a;\n var del = sum;\n var b = x + 1 - a;\n var c = 1 / 1.0e-30;\n var d = 1 / b;\n var h = d;\n var i = 1;\n // calculate maximum number of itterations required for a\n var ITMAX = -~(Math.log((a >= 1) ? a : 1 / a) * 8.5 + a * 0.4 + 17);\n var an;\n\n if (x < 0 || a <= 0) {\n return NaN;\n } else if (x < a + 1) {\n for (; i <= ITMAX; i++) {\n sum += del *= x / ++ap;\n }\n return (sum * Math.exp(-x + a * Math.log(x) - (aln)));\n }\n\n for (; i <= ITMAX; i++) {\n an = -i * (i - a);\n b += 2;\n d = an * d + b;\n c = b + an / c;\n d = 1 / d;\n h *= d * c;\n }\n\n return (1 - h * Math.exp(-x + a * Math.log(x) - (aln)));\n};\n\n// natural log factorial of n\njStat.factorialln = function factorialln(n) {\n return n < 0 ? NaN : jStat.gammaln(n + 1);\n};\n\n// factorial of n\njStat.factorial = function factorial(n) {\n return n < 0 ? NaN : jStat.gammafn(n + 1);\n};\n\n// combinations of n, m\njStat.combination = function combination(n, m) {\n // make sure n or m don't exceed the upper limit of usable values\n return (n > 170 || m > 170)\n ? Math.exp(jStat.combinationln(n, m))\n : (jStat.factorial(n) / jStat.factorial(m)) / jStat.factorial(n - m);\n};\n\n\njStat.combinationln = function combinationln(n, m){\n return jStat.factorialln(n) - jStat.factorialln(m) - jStat.factorialln(n - m);\n};\n\n\n// permutations of n, m\njStat.permutation = function permutation(n, m) {\n return jStat.factorial(n) / jStat.factorial(n - m);\n};\n\n\n// beta function\njStat.betafn = function betafn(x, y) {\n // ensure arguments are positive\n if (x <= 0 || y <= 0)\n return undefined;\n // make sure x + y doesn't exceed the upper limit of usable values\n return (x + y > 170)\n ? Math.exp(jStat.betaln(x, y))\n : jStat.gammafn(x) * jStat.gammafn(y) / jStat.gammafn(x + y);\n};\n\n\n// natural logarithm of beta function\njStat.betaln = function betaln(x, y) {\n return jStat.gammaln(x) + jStat.gammaln(y) - jStat.gammaln(x + y);\n};\n\n\n// Evaluates the continued fraction for incomplete beta function by modified\n// Lentz's method.\njStat.betacf = function betacf(x, a, b) {\n var fpmin = 1e-30;\n var m = 1;\n var qab = a + b;\n var qap = a + 1;\n var qam = a - 1;\n var c = 1;\n var d = 1 - qab * x / qap;\n var m2, aa, del, h;\n\n // These q's will be used in factors that occur in the coefficients\n if (Math.abs(d) < fpmin)\n d = fpmin;\n d = 1 / d;\n h = d;\n\n for (; m <= 100; m++) {\n m2 = 2 * m;\n aa = m * (b - m) * x / ((qam + m2) * (a + m2));\n // One step (the even one) of the recurrence\n d = 1 + aa * d;\n if (Math.abs(d) < fpmin)\n d = fpmin;\n c = 1 + aa / c;\n if (Math.abs(c) < fpmin)\n c = fpmin;\n d = 1 / d;\n h *= d * c;\n aa = -(a + m) * (qab + m) * x / ((a + m2) * (qap + m2));\n // Next step of the recurrence (the odd one)\n d = 1 + aa * d;\n if (Math.abs(d) < fpmin)\n d = fpmin;\n c = 1 + aa / c;\n if (Math.abs(c) < fpmin)\n c = fpmin;\n d = 1 / d;\n del = d * c;\n h *= del;\n if (Math.abs(del - 1.0) < 3e-7)\n break;\n }\n\n return h;\n};\n\n\n// Returns the inverse of the lower regularized inomplete gamma function\njStat.gammapinv = function gammapinv(p, a) {\n var j = 0;\n var a1 = a - 1;\n var EPS = 1e-8;\n var gln = jStat.gammaln(a);\n var x, err, t, u, pp, lna1, afac;\n\n if (p >= 1)\n return Math.max(100, a + 100 * Math.sqrt(a));\n if (p <= 0)\n return 0;\n if (a > 1) {\n lna1 = Math.log(a1);\n afac = Math.exp(a1 * (lna1 - 1) - gln);\n pp = (p < 0.5) ? p : 1 - p;\n t = Math.sqrt(-2 * Math.log(pp));\n x = (2.30753 + t * 0.27061) / (1 + t * (0.99229 + t * 0.04481)) - t;\n if (p < 0.5)\n x = -x;\n x = Math.max(1e-3,\n a * Math.pow(1 - 1 / (9 * a) - x / (3 * Math.sqrt(a)), 3));\n } else {\n t = 1 - a * (0.253 + a * 0.12);\n if (p < t)\n x = Math.pow(p / t, 1 / a);\n else\n x = 1 - Math.log(1 - (p - t) / (1 - t));\n }\n\n for(; j < 12; j++) {\n if (x <= 0)\n return 0;\n err = jStat.lowRegGamma(a, x) - p;\n if (a > 1)\n t = afac * Math.exp(-(x - a1) + a1 * (Math.log(x) - lna1));\n else\n t = Math.exp(-x + a1 * Math.log(x) - gln);\n u = err / t;\n x -= (t = u / (1 - 0.5 * Math.min(1, u * ((a - 1) / x - 1))));\n if (x <= 0)\n x = 0.5 * (x + t);\n if (Math.abs(t) < EPS * x)\n break;\n }\n\n return x;\n};\n\n\n// Returns the error function erf(x)\njStat.erf = function erf(x) {\n var cof = [-1.3026537197817094, 6.4196979235649026e-1, 1.9476473204185836e-2,\n -9.561514786808631e-3, -9.46595344482036e-4, 3.66839497852761e-4,\n 4.2523324806907e-5, -2.0278578112534e-5, -1.624290004647e-6,\n 1.303655835580e-6, 1.5626441722e-8, -8.5238095915e-8,\n 6.529054439e-9, 5.059343495e-9, -9.91364156e-10,\n -2.27365122e-10, 9.6467911e-11, 2.394038e-12,\n -6.886027e-12, 8.94487e-13, 3.13092e-13,\n -1.12708e-13, 3.81e-16, 7.106e-15,\n -1.523e-15, -9.4e-17, 1.21e-16,\n -2.8e-17];\n var j = cof.length - 1;\n var isneg = false;\n var d = 0;\n var dd = 0;\n var t, ty, tmp, res;\n\n if (x < 0) {\n x = -x;\n isneg = true;\n }\n\n t = 2 / (2 + x);\n ty = 4 * t - 2;\n\n for(; j > 0; j--) {\n tmp = d;\n d = ty * d - dd + cof[j];\n dd = tmp;\n }\n\n res = t * Math.exp(-x * x + 0.5 * (cof[0] + ty * d) - dd);\n return isneg ? res - 1 : 1 - res;\n};\n\n\n// Returns the complmentary error function erfc(x)\njStat.erfc = function erfc(x) {\n return 1 - jStat.erf(x);\n};\n\n\n// Returns the inverse of the complementary error function\njStat.erfcinv = function erfcinv(p) {\n var j = 0;\n var x, err, t, pp;\n if (p >= 2)\n return -100;\n if (p <= 0)\n return 100;\n pp = (p < 1) ? p : 2 - p;\n t = Math.sqrt(-2 * Math.log(pp / 2));\n x = -0.70711 * ((2.30753 + t * 0.27061) /\n (1 + t * (0.99229 + t * 0.04481)) - t);\n for (; j < 2; j++) {\n err = jStat.erfc(x) - pp;\n x += err / (1.12837916709551257 * Math.exp(-x * x) - x * err);\n }\n return (p < 1) ? x : -x;\n};\n\n\n// Returns the inverse of the incomplete beta function\njStat.ibetainv = function ibetainv(p, a, b) {\n var EPS = 1e-8;\n var a1 = a - 1;\n var b1 = b - 1;\n var j = 0;\n var lna, lnb, pp, t, u, err, x, al, h, w, afac;\n if (p <= 0)\n return 0;\n if (p >= 1)\n return 1;\n if (a >= 1 && b >= 1) {\n pp = (p < 0.5) ? p : 1 - p;\n t = Math.sqrt(-2 * Math.log(pp));\n x = (2.30753 + t * 0.27061) / (1 + t* (0.99229 + t * 0.04481)) - t;\n if (p < 0.5)\n x = -x;\n al = (x * x - 3) / 6;\n h = 2 / (1 / (2 * a - 1) + 1 / (2 * b - 1));\n w = (x * Math.sqrt(al + h) / h) - (1 / (2 * b - 1) - 1 / (2 * a - 1)) *\n (al + 5 / 6 - 2 / (3 * h));\n x = a / (a + b * Math.exp(2 * w));\n } else {\n lna = Math.log(a / (a + b));\n lnb = Math.log(b / (a + b));\n t = Math.exp(a * lna) / a;\n u = Math.exp(b * lnb) / b;\n w = t + u;\n if (p < t / w)\n x = Math.pow(a * w * p, 1 / a);\n else\n x = 1 - Math.pow(b * w * (1 - p), 1 / b);\n }\n afac = -jStat.gammaln(a) - jStat.gammaln(b) + jStat.gammaln(a + b);\n for(; j < 10; j++) {\n if (x === 0 || x === 1)\n return x;\n err = jStat.ibeta(x, a, b) - p;\n t = Math.exp(a1 * Math.log(x) + b1 * Math.log(1 - x) + afac);\n u = err / t;\n x -= (t = u / (1 - 0.5 * Math.min(1, u * (a1 / x - b1 / (1 - x)))));\n if (x <= 0)\n x = 0.5 * (x + t);\n if (x >= 1)\n x = 0.5 * (x + t + 1);\n if (Math.abs(t) < EPS * x && j > 0)\n break;\n }\n return x;\n};\n\n\n// Returns the incomplete beta function I_x(a,b)\njStat.ibeta = function ibeta(x, a, b) {\n // Factors in front of the continued fraction.\n var bt = (x === 0 || x === 1) ? 0 :\n Math.exp(jStat.gammaln(a + b) - jStat.gammaln(a) -\n jStat.gammaln(b) + a * Math.log(x) + b *\n Math.log(1 - x));\n if (x < 0 || x > 1)\n return false;\n if (x < (a + 1) / (a + b + 2))\n // Use continued fraction directly.\n return bt * jStat.betacf(x, a, b) / a;\n // else use continued fraction after making the symmetry transformation.\n return 1 - bt * jStat.betacf(1 - x, b, a) / b;\n};\n\n\n// Returns a normal deviate (mu=0, sigma=1).\n// If n and m are specified it returns a object of normal deviates.\njStat.randn = function randn(n, m) {\n var u, v, x, y, q;\n if (!m)\n m = n;\n if (n)\n return jStat.create(n, m, function() { return jStat.randn(); });\n do {\n u = jStat._random_fn();\n v = 1.7156 * (jStat._random_fn() - 0.5);\n x = u - 0.449871;\n y = Math.abs(v) + 0.386595;\n q = x * x + y * (0.19600 * y - 0.25472 * x);\n } while (q > 0.27597 && (q > 0.27846 || v * v > -4 * Math.log(u) * u * u));\n return v / u;\n};\n\n\n// Returns a gamma deviate by the method of Marsaglia and Tsang.\njStat.randg = function randg(shape, n, m) {\n var oalph = shape;\n var a1, a2, u, v, x, mat;\n if (!m)\n m = n;\n if (!shape)\n shape = 1;\n if (n) {\n mat = jStat.zeros(n,m);\n mat.alter(function() { return jStat.randg(shape); });\n return mat;\n }\n if (shape < 1)\n shape += 1;\n a1 = shape - 1 / 3;\n a2 = 1 / Math.sqrt(9 * a1);\n do {\n do {\n x = jStat.randn();\n v = 1 + a2 * x;\n } while(v <= 0);\n v = v * v * v;\n u = jStat._random_fn();\n } while(u > 1 - 0.331 * Math.pow(x, 4) &&\n Math.log(u) > 0.5 * x*x + a1 * (1 - v + Math.log(v)));\n // alpha > 1\n if (shape == oalph)\n return a1 * v;\n // alpha < 1\n do {\n u = jStat._random_fn();\n } while(u === 0);\n return Math.pow(u, 1 / oalph) * a1 * v;\n};\n\n\n// making use of static methods on the instance\n(function(funcs) {\n for (var i = 0; i < funcs.length; i++) (function(passfunc) {\n jStat.fn[passfunc] = function() {\n return jStat(\n jStat.map(this, function(value) { return jStat[passfunc](value); }));\n }\n })(funcs[i]);\n})('gammaln gammafn factorial factorialln'.split(' '));\n\n\n(function(funcs) {\n for (var i = 0; i < funcs.length; i++) (function(passfunc) {\n jStat.fn[passfunc] = function() {\n return jStat(jStat[passfunc].apply(null, arguments));\n };\n })(funcs[i]);\n})('randn'.split(' '));\n\n}(jStat, Math));\n(function(jStat, Math) {\n\n// generate all distribution instance methods\n(function(list) {\n for (var i = 0; i < list.length; i++) (function(func) {\n // distribution instance method\n jStat[func] = function f(a, b, c) {\n if (!(this instanceof f))\n return new f(a, b, c);\n this._a = a;\n this._b = b;\n this._c = c;\n return this;\n };\n // distribution method to be used on a jStat instance\n jStat.fn[func] = function(a, b, c) {\n var newthis = jStat[func](a, b, c);\n newthis.data = this;\n return newthis;\n };\n // sample instance method\n jStat[func].prototype.sample = function(arr) {\n var a = this._a;\n var b = this._b;\n var c = this._c;\n if (arr)\n return jStat.alter(arr, function() {\n return jStat[func].sample(a, b, c);\n });\n else\n return jStat[func].sample(a, b, c);\n };\n // generate the pdf, cdf and inv instance methods\n (function(vals) {\n for (var i = 0; i < vals.length; i++) (function(fnfunc) {\n jStat[func].prototype[fnfunc] = function(x) {\n var a = this._a;\n var b = this._b;\n var c = this._c;\n if (!x && x !== 0)\n x = this.data;\n if (typeof x !== 'number') {\n return jStat.fn.map.call(x, function(x) {\n return jStat[func][fnfunc](x, a, b, c);\n });\n }\n return jStat[func][fnfunc](x, a, b, c);\n };\n })(vals[i]);\n })('pdf cdf inv'.split(' '));\n // generate the mean, median, mode and variance instance methods\n (function(vals) {\n for (var i = 0; i < vals.length; i++) (function(fnfunc) {\n jStat[func].prototype[fnfunc] = function() {\n return jStat[func][fnfunc](this._a, this._b, this._c);\n };\n })(vals[i]);\n })('mean median mode variance'.split(' '));\n })(list[i]);\n})((\n 'beta centralF cauchy chisquare exponential gamma invgamma kumaraswamy ' +\n 'laplace lognormal noncentralt normal pareto studentt weibull uniform ' +\n 'binomial negbin hypgeom poisson triangular tukey arcsine'\n).split(' '));\n\n\n\n// extend beta function with static methods\njStat.extend(jStat.beta, {\n pdf: function pdf(x, alpha, beta) {\n // PDF is zero outside the support\n if (x > 1 || x < 0)\n return 0;\n // PDF is one for the uniform case\n if (alpha == 1 && beta == 1)\n return 1;\n\n if (alpha < 512 && beta < 512) {\n return (Math.pow(x, alpha - 1) * Math.pow(1 - x, beta - 1)) /\n jStat.betafn(alpha, beta);\n } else {\n return Math.exp((alpha - 1) * Math.log(x) +\n (beta - 1) * Math.log(1 - x) -\n jStat.betaln(alpha, beta));\n }\n },\n\n cdf: function cdf(x, alpha, beta) {\n return (x > 1 || x < 0) ? (x > 1) * 1 : jStat.ibeta(x, alpha, beta);\n },\n\n inv: function inv(x, alpha, beta) {\n return jStat.ibetainv(x, alpha, beta);\n },\n\n mean: function mean(alpha, beta) {\n return alpha / (alpha + beta);\n },\n\n median: function median(alpha, beta) {\n return jStat.ibetainv(0.5, alpha, beta);\n },\n\n mode: function mode(alpha, beta) {\n return (alpha - 1 ) / ( alpha + beta - 2);\n },\n\n // return a random sample\n sample: function sample(alpha, beta) {\n var u = jStat.randg(alpha);\n return u / (u + jStat.randg(beta));\n },\n\n variance: function variance(alpha, beta) {\n return (alpha * beta) / (Math.pow(alpha + beta, 2) * (alpha + beta + 1));\n }\n});\n\n// extend F function with static methods\njStat.extend(jStat.centralF, {\n // This implementation of the pdf function avoids float overflow\n // See the way that R calculates this value:\n // https://svn.r-project.org/R/trunk/src/nmath/df.c\n pdf: function pdf(x, df1, df2) {\n var p, q, f;\n\n if (x < 0)\n return 0;\n\n if (df1 <= 2) {\n if (x === 0 && df1 < 2) {\n return Infinity;\n }\n if (x === 0 && df1 === 2) {\n return 1;\n }\n return (1 / jStat.betafn(df1 / 2, df2 / 2)) *\n Math.pow(df1 / df2, df1 / 2) *\n Math.pow(x, (df1/2) - 1) *\n Math.pow((1 + (df1 / df2) * x), -(df1 + df2) / 2);\n }\n\n p = (df1 * x) / (df2 + x * df1);\n q = df2 / (df2 + x * df1);\n f = df1 * q / 2.0;\n return f * jStat.binomial.pdf((df1 - 2) / 2, (df1 + df2 - 2) / 2, p);\n },\n\n cdf: function cdf(x, df1, df2) {\n if (x < 0)\n return 0;\n return jStat.ibeta((df1 * x) / (df1 * x + df2), df1 / 2, df2 / 2);\n },\n\n inv: function inv(x, df1, df2) {\n return df2 / (df1 * (1 / jStat.ibetainv(x, df1 / 2, df2 / 2) - 1));\n },\n\n mean: function mean(df1, df2) {\n return (df2 > 2) ? df2 / (df2 - 2) : undefined;\n },\n\n mode: function mode(df1, df2) {\n return (df1 > 2) ? (df2 * (df1 - 2)) / (df1 * (df2 + 2)) : undefined;\n },\n\n // return a random sample\n sample: function sample(df1, df2) {\n var x1 = jStat.randg(df1 / 2) * 2;\n var x2 = jStat.randg(df2 / 2) * 2;\n return (x1 / df1) / (x2 / df2);\n },\n\n variance: function variance(df1, df2) {\n if (df2 <= 4)\n return undefined;\n return 2 * df2 * df2 * (df1 + df2 - 2) /\n (df1 * (df2 - 2) * (df2 - 2) * (df2 - 4));\n }\n});\n\n\n// extend cauchy function with static methods\njStat.extend(jStat.cauchy, {\n pdf: function pdf(x, local, scale) {\n if (scale < 0) { return 0; }\n\n return (scale / (Math.pow(x - local, 2) + Math.pow(scale, 2))) / Math.PI;\n },\n\n cdf: function cdf(x, local, scale) {\n return Math.atan((x - local) / scale) / Math.PI + 0.5;\n },\n\n inv: function(p, local, scale) {\n return local + scale * Math.tan(Math.PI * (p - 0.5));\n },\n\n median: function median(local/*, scale*/) {\n return local;\n },\n\n mode: function mode(local/*, scale*/) {\n return local;\n },\n\n sample: function sample(local, scale) {\n return jStat.randn() *\n Math.sqrt(1 / (2 * jStat.randg(0.5))) * scale + local;\n }\n});\n\n\n\n// extend chisquare function with static methods\njStat.extend(jStat.chisquare, {\n pdf: function pdf(x, dof) {\n if (x < 0)\n return 0;\n return (x === 0 && dof === 2) ? 0.5 :\n Math.exp((dof / 2 - 1) * Math.log(x) - x / 2 - (dof / 2) *\n Math.log(2) - jStat.gammaln(dof / 2));\n },\n\n cdf: function cdf(x, dof) {\n if (x < 0)\n return 0;\n return jStat.lowRegGamma(dof / 2, x / 2);\n },\n\n inv: function(p, dof) {\n return 2 * jStat.gammapinv(p, 0.5 * dof);\n },\n\n mean : function(dof) {\n return dof;\n },\n\n // TODO: this is an approximation (is there a better way?)\n median: function median(dof) {\n return dof * Math.pow(1 - (2 / (9 * dof)), 3);\n },\n\n mode: function mode(dof) {\n return (dof - 2 > 0) ? dof - 2 : 0;\n },\n\n sample: function sample(dof) {\n return jStat.randg(dof / 2) * 2;\n },\n\n variance: function variance(dof) {\n return 2 * dof;\n }\n});\n\n\n\n// extend exponential function with static methods\njStat.extend(jStat.exponential, {\n pdf: function pdf(x, rate) {\n return x < 0 ? 0 : rate * Math.exp(-rate * x);\n },\n\n cdf: function cdf(x, rate) {\n return x < 0 ? 0 : 1 - Math.exp(-rate * x);\n },\n\n inv: function(p, rate) {\n return -Math.log(1 - p) / rate;\n },\n\n mean : function(rate) {\n return 1 / rate;\n },\n\n median: function (rate) {\n return (1 / rate) * Math.log(2);\n },\n\n mode: function mode(/*rate*/) {\n return 0;\n },\n\n sample: function sample(rate) {\n return -1 / rate * Math.log(jStat._random_fn());\n },\n\n variance : function(rate) {\n return Math.pow(rate, -2);\n }\n});\n\n\n\n// extend gamma function with static methods\njStat.extend(jStat.gamma, {\n pdf: function pdf(x, shape, scale) {\n if (x < 0)\n return 0;\n return (x === 0 && shape === 1) ? 1 / scale :\n Math.exp((shape - 1) * Math.log(x) - x / scale -\n jStat.gammaln(shape) - shape * Math.log(scale));\n },\n\n cdf: function cdf(x, shape, scale) {\n if (x < 0)\n return 0;\n return jStat.lowRegGamma(shape, x / scale);\n },\n\n inv: function(p, shape, scale) {\n return jStat.gammapinv(p, shape) * scale;\n },\n\n mean : function(shape, scale) {\n return shape * scale;\n },\n\n mode: function mode(shape, scale) {\n if(shape > 1) return (shape - 1) * scale;\n return undefined;\n },\n\n sample: function sample(shape, scale) {\n return jStat.randg(shape) * scale;\n },\n\n variance: function variance(shape, scale) {\n return shape * scale * scale;\n }\n});\n\n// extend inverse gamma function with static methods\njStat.extend(jStat.invgamma, {\n pdf: function pdf(x, shape, scale) {\n if (x <= 0)\n return 0;\n return Math.exp(-(shape + 1) * Math.log(x) - scale / x -\n jStat.gammaln(shape) + shape * Math.log(scale));\n },\n\n cdf: function cdf(x, shape, scale) {\n if (x <= 0)\n return 0;\n return 1 - jStat.lowRegGamma(shape, scale / x);\n },\n\n inv: function(p, shape, scale) {\n return scale / jStat.gammapinv(1 - p, shape);\n },\n\n mean : function(shape, scale) {\n return (shape > 1) ? scale / (shape - 1) : undefined;\n },\n\n mode: function mode(shape, scale) {\n return scale / (shape + 1);\n },\n\n sample: function sample(shape, scale) {\n return scale / jStat.randg(shape);\n },\n\n variance: function variance(shape, scale) {\n if (shape <= 2)\n return undefined;\n return scale * scale / ((shape - 1) * (shape - 1) * (shape - 2));\n }\n});\n\n\n// extend kumaraswamy function with static methods\njStat.extend(jStat.kumaraswamy, {\n pdf: function pdf(x, alpha, beta) {\n if (x === 0 && alpha === 1)\n return beta;\n else if (x === 1 && beta === 1)\n return alpha;\n return Math.exp(Math.log(alpha) + Math.log(beta) + (alpha - 1) *\n Math.log(x) + (beta - 1) *\n Math.log(1 - Math.pow(x, alpha)));\n },\n\n cdf: function cdf(x, alpha, beta) {\n if (x < 0)\n return 0;\n else if (x > 1)\n return 1;\n return (1 - Math.pow(1 - Math.pow(x, alpha), beta));\n },\n\n inv: function inv(p, alpha, beta) {\n return Math.pow(1 - Math.pow(1 - p, 1 / beta), 1 / alpha);\n },\n\n mean : function(alpha, beta) {\n return (beta * jStat.gammafn(1 + 1 / alpha) *\n jStat.gammafn(beta)) / (jStat.gammafn(1 + 1 / alpha + beta));\n },\n\n median: function median(alpha, beta) {\n return Math.pow(1 - Math.pow(2, -1 / beta), 1 / alpha);\n },\n\n mode: function mode(alpha, beta) {\n if (!(alpha >= 1 && beta >= 1 && (alpha !== 1 && beta !== 1)))\n return undefined;\n return Math.pow((alpha - 1) / (alpha * beta - 1), 1 / alpha);\n },\n\n variance: function variance(/*alpha, beta*/) {\n throw new Error('variance not yet implemented');\n // TODO: complete this\n }\n});\n\n\n\n// extend lognormal function with static methods\njStat.extend(jStat.lognormal, {\n pdf: function pdf(x, mu, sigma) {\n if (x <= 0)\n return 0;\n return Math.exp(-Math.log(x) - 0.5 * Math.log(2 * Math.PI) -\n Math.log(sigma) - Math.pow(Math.log(x) - mu, 2) /\n (2 * sigma * sigma));\n },\n\n cdf: function cdf(x, mu, sigma) {\n if (x < 0)\n return 0;\n return 0.5 +\n (0.5 * jStat.erf((Math.log(x) - mu) / Math.sqrt(2 * sigma * sigma)));\n },\n\n inv: function(p, mu, sigma) {\n return Math.exp(-1.41421356237309505 * sigma * jStat.erfcinv(2 * p) + mu);\n },\n\n mean: function mean(mu, sigma) {\n return Math.exp(mu + sigma * sigma / 2);\n },\n\n median: function median(mu/*, sigma*/) {\n return Math.exp(mu);\n },\n\n mode: function mode(mu, sigma) {\n return Math.exp(mu - sigma * sigma);\n },\n\n sample: function sample(mu, sigma) {\n return Math.exp(jStat.randn() * sigma + mu);\n },\n\n variance: function variance(mu, sigma) {\n return (Math.exp(sigma * sigma) - 1) * Math.exp(2 * mu + sigma * sigma);\n }\n});\n\n\n\n// extend noncentralt function with static methods\njStat.extend(jStat.noncentralt, {\n pdf: function pdf(x, dof, ncp) {\n var tol = 1e-14;\n if (Math.abs(ncp) < tol) // ncp approx 0; use student-t\n return jStat.studentt.pdf(x, dof)\n\n if (Math.abs(x) < tol) { // different formula for x == 0\n return Math.exp(jStat.gammaln((dof + 1) / 2) - ncp * ncp / 2 -\n 0.5 * Math.log(Math.PI * dof) - jStat.gammaln(dof / 2));\n }\n\n // formula for x != 0\n return dof / x *\n (jStat.noncentralt.cdf(x * Math.sqrt(1 + 2 / dof), dof+2, ncp) -\n jStat.noncentralt.cdf(x, dof, ncp));\n },\n\n cdf: function cdf(x, dof, ncp) {\n var tol = 1e-14;\n var min_iterations = 200;\n\n if (Math.abs(ncp) < tol) // ncp approx 0; use student-t\n return jStat.studentt.cdf(x, dof);\n\n // turn negative x into positive and flip result afterwards\n var flip = false;\n if (x < 0) {\n flip = true;\n ncp = -ncp;\n }\n\n var prob = jStat.normal.cdf(-ncp, 0, 1);\n var value = tol + 1;\n // use value at last two steps to determine convergence\n var lastvalue = value;\n var y = x * x / (x * x + dof);\n var j = 0;\n var p = Math.exp(-ncp * ncp / 2);\n var q = Math.exp(-ncp * ncp / 2 - 0.5 * Math.log(2) -\n jStat.gammaln(3 / 2)) * ncp;\n while (j < min_iterations || lastvalue > tol || value > tol) {\n lastvalue = value;\n if (j > 0) {\n p *= (ncp * ncp) / (2 * j);\n q *= (ncp * ncp) / (2 * (j + 1 / 2));\n }\n value = p * jStat.beta.cdf(y, j + 0.5, dof / 2) +\n q * jStat.beta.cdf(y, j+1, dof/2);\n prob += 0.5 * value;\n j++;\n }\n\n return flip ? (1 - prob) : prob;\n }\n});\n\n\n// extend normal function with static methods\njStat.extend(jStat.normal, {\n pdf: function pdf(x, mean, std) {\n return Math.exp(-0.5 * Math.log(2 * Math.PI) -\n Math.log(std) - Math.pow(x - mean, 2) / (2 * std * std));\n },\n\n cdf: function cdf(x, mean, std) {\n return 0.5 * (1 + jStat.erf((x - mean) / Math.sqrt(2 * std * std)));\n },\n\n inv: function(p, mean, std) {\n return -1.41421356237309505 * std * jStat.erfcinv(2 * p) + mean;\n },\n\n mean : function(mean/*, std*/) {\n return mean;\n },\n\n median: function median(mean/*, std*/) {\n return mean;\n },\n\n mode: function (mean/*, std*/) {\n return mean;\n },\n\n sample: function sample(mean, std) {\n return jStat.randn() * std + mean;\n },\n\n variance : function(mean, std) {\n return std * std;\n }\n});\n\n\n\n// extend pareto function with static methods\njStat.extend(jStat.pareto, {\n pdf: function pdf(x, scale, shape) {\n if (x < scale)\n return 0;\n return (shape * Math.pow(scale, shape)) / Math.pow(x, shape + 1);\n },\n\n cdf: function cdf(x, scale, shape) {\n if (x < scale)\n return 0;\n return 1 - Math.pow(scale / x, shape);\n },\n\n inv: function inv(p, scale, shape) {\n return scale / Math.pow(1 - p, 1 / shape);\n },\n\n mean: function mean(scale, shape) {\n if (shape <= 1)\n return undefined;\n return (shape * Math.pow(scale, shape)) / (shape - 1);\n },\n\n median: function median(scale, shape) {\n return scale * (shape * Math.SQRT2);\n },\n\n mode: function mode(scale/*, shape*/) {\n return scale;\n },\n\n variance : function(scale, shape) {\n if (shape <= 2)\n return undefined;\n return (scale*scale * shape) / (Math.pow(shape - 1, 2) * (shape - 2));\n }\n});\n\n\n\n// extend studentt function with static methods\njStat.extend(jStat.studentt, {\n pdf: function pdf(x, dof) {\n dof = dof > 1e100 ? 1e100 : dof;\n return (1/(Math.sqrt(dof) * jStat.betafn(0.5, dof/2))) *\n Math.pow(1 + ((x * x) / dof), -((dof + 1) / 2));\n },\n\n cdf: function cdf(x, dof) {\n var dof2 = dof / 2;\n return jStat.ibeta((x + Math.sqrt(x * x + dof)) /\n (2 * Math.sqrt(x * x + dof)), dof2, dof2);\n },\n\n inv: function(p, dof) {\n var x = jStat.ibetainv(2 * Math.min(p, 1 - p), 0.5 * dof, 0.5);\n x = Math.sqrt(dof * (1 - x) / x);\n return (p > 0.5) ? x : -x;\n },\n\n mean: function mean(dof) {\n return (dof > 1) ? 0 : undefined;\n },\n\n median: function median(/*dof*/) {\n return 0;\n },\n\n mode: function mode(/*dof*/) {\n return 0;\n },\n\n sample: function sample(dof) {\n return jStat.randn() * Math.sqrt(dof / (2 * jStat.randg(dof / 2)));\n },\n\n variance: function variance(dof) {\n return (dof > 2) ? dof / (dof - 2) : (dof > 1) ? Infinity : undefined;\n }\n});\n\n\n\n// extend weibull function with static methods\njStat.extend(jStat.weibull, {\n pdf: function pdf(x, scale, shape) {\n if (x < 0 || scale < 0 || shape < 0)\n return 0;\n return (shape / scale) * Math.pow((x / scale), (shape - 1)) *\n Math.exp(-(Math.pow((x / scale), shape)));\n },\n\n cdf: function cdf(x, scale, shape) {\n return x < 0 ? 0 : 1 - Math.exp(-Math.pow((x / scale), shape));\n },\n\n inv: function(p, scale, shape) {\n return scale * Math.pow(-Math.log(1 - p), 1 / shape);\n },\n\n mean : function(scale, shape) {\n return scale * jStat.gammafn(1 + 1 / shape);\n },\n\n median: function median(scale, shape) {\n return scale * Math.pow(Math.log(2), 1 / shape);\n },\n\n mode: function mode(scale, shape) {\n if (shape <= 1)\n return 0;\n return scale * Math.pow((shape - 1) / shape, 1 / shape);\n },\n\n sample: function sample(scale, shape) {\n return scale * Math.pow(-Math.log(jStat._random_fn()), 1 / shape);\n },\n\n variance: function variance(scale, shape) {\n return scale * scale * jStat.gammafn(1 + 2 / shape) -\n Math.pow(jStat.weibull.mean(scale, shape), 2);\n }\n});\n\n\n\n// extend uniform function with static methods\njStat.extend(jStat.uniform, {\n pdf: function pdf(x, a, b) {\n return (x < a || x > b) ? 0 : 1 / (b - a);\n },\n\n cdf: function cdf(x, a, b) {\n if (x < a)\n return 0;\n else if (x < b)\n return (x - a) / (b - a);\n return 1;\n },\n\n inv: function(p, a, b) {\n return a + (p * (b - a));\n },\n\n mean: function mean(a, b) {\n return 0.5 * (a + b);\n },\n\n median: function median(a, b) {\n return jStat.mean(a, b);\n },\n\n mode: function mode(/*a, b*/) {\n throw new Error('mode is not yet implemented');\n },\n\n sample: function sample(a, b) {\n return (a / 2 + b / 2) + (b / 2 - a / 2) * (2 * jStat._random_fn() - 1);\n },\n\n variance: function variance(a, b) {\n return Math.pow(b - a, 2) / 12;\n }\n});\n\n\n// Got this from http://www.math.ucla.edu/~tom/distributions/binomial.html\nfunction betinc(x, a, b, eps) {\n var a0 = 0;\n var b0 = 1;\n var a1 = 1;\n var b1 = 1;\n var m9 = 0;\n var a2 = 0;\n var c9;\n\n while (Math.abs((a1 - a2) / a1) > eps) {\n a2 = a1;\n c9 = -(a + m9) * (a + b + m9) * x / (a + 2 * m9) / (a + 2 * m9 + 1);\n a0 = a1 + c9 * a0;\n b0 = b1 + c9 * b0;\n m9 = m9 + 1;\n c9 = m9 * (b - m9) * x / (a + 2 * m9 - 1) / (a + 2 * m9);\n a1 = a0 + c9 * a1;\n b1 = b0 + c9 * b1;\n a0 = a0 / b1;\n b0 = b0 / b1;\n a1 = a1 / b1;\n b1 = 1;\n }\n\n return a1 / a;\n}\n\n\n// extend uniform function with static methods\njStat.extend(jStat.binomial, {\n pdf: function pdf(k, n, p) {\n return (p === 0 || p === 1) ?\n ((n * p) === k ? 1 : 0) :\n jStat.combination(n, k) * Math.pow(p, k) * Math.pow(1 - p, n - k);\n },\n\n cdf: function cdf(x, n, p) {\n var betacdf;\n var eps = 1e-10;\n\n if (x < 0)\n return 0;\n if (x >= n)\n return 1;\n if (p < 0 || p > 1 || n <= 0)\n return NaN;\n\n x = Math.floor(x);\n var z = p;\n var a = x + 1;\n var b = n - x;\n var s = a + b;\n var bt = Math.exp(jStat.gammaln(s) - jStat.gammaln(b) -\n jStat.gammaln(a) + a * Math.log(z) + b * Math.log(1 - z));\n\n if (z < (a + 1) / (s + 2))\n betacdf = bt * betinc(z, a, b, eps);\n else\n betacdf = 1 - bt * betinc(1 - z, b, a, eps);\n\n return Math.round((1 - betacdf) * (1 / eps)) / (1 / eps);\n }\n});\n\n\n\n// extend uniform function with static methods\njStat.extend(jStat.negbin, {\n pdf: function pdf(k, r, p) {\n if (k !== k >>> 0)\n return false;\n if (k < 0)\n return 0;\n return jStat.combination(k + r - 1, r - 1) *\n Math.pow(1 - p, k) * Math.pow(p, r);\n },\n\n cdf: function cdf(x, r, p) {\n var sum = 0,\n k = 0;\n if (x < 0) return 0;\n for (; k <= x; k++) {\n sum += jStat.negbin.pdf(k, r, p);\n }\n return sum;\n }\n});\n\n\n\n// extend uniform function with static methods\njStat.extend(jStat.hypgeom, {\n pdf: function pdf(k, N, m, n) {\n // Hypergeometric PDF.\n\n // A simplification of the CDF algorithm below.\n\n // k = number of successes drawn\n // N = population size\n // m = number of successes in population\n // n = number of items drawn from population\n\n if(k !== k | 0) {\n return false;\n } else if(k < 0 || k < m - (N - n)) {\n // It's impossible to have this few successes drawn.\n return 0;\n } else if(k > n || k > m) {\n // It's impossible to have this many successes drawn.\n return 0;\n } else if (m * 2 > N) {\n // More than half the population is successes.\n\n if(n * 2 > N) {\n // More than half the population is sampled.\n\n return jStat.hypgeom.pdf(N - m - n + k, N, N - m, N - n)\n } else {\n // Half or less of the population is sampled.\n\n return jStat.hypgeom.pdf(n - k, N, N - m, n);\n }\n\n } else if(n * 2 > N) {\n // Half or less is successes.\n\n return jStat.hypgeom.pdf(m - k, N, m, N - n);\n\n } else if(m < n) {\n // We want to have the number of things sampled to be less than the\n // successes available. So swap the definitions of successful and sampled.\n return jStat.hypgeom.pdf(k, N, n, m);\n } else {\n // If we get here, half or less of the population was sampled, half or\n // less of it was successes, and we had fewer sampled things than\n // successes. Now we can do this complicated iterative algorithm in an\n // efficient way.\n\n // The basic premise of the algorithm is that we partially normalize our\n // intermediate product to keep it in a numerically good region, and then\n // finish the normalization at the end.\n\n // This variable holds the scaled probability of the current number of\n // successes.\n var scaledPDF = 1;\n\n // This keeps track of how much we have normalized.\n var samplesDone = 0;\n\n for(var i = 0; i < k; i++) {\n // For every possible number of successes up to that observed...\n\n while(scaledPDF > 1 && samplesDone < n) {\n // Intermediate result is growing too big. Apply some of the\n // normalization to shrink everything.\n\n scaledPDF *= 1 - (m / (N - samplesDone));\n\n // Say we've normalized by this sample already.\n samplesDone++;\n }\n\n // Work out the partially-normalized hypergeometric PDF for the next\n // number of successes\n scaledPDF *= (n - i) * (m - i) / ((i + 1) * (N - m - n + i + 1));\n }\n\n for(; samplesDone < n; samplesDone++) {\n // Apply all the rest of the normalization\n scaledPDF *= 1 - (m / (N - samplesDone));\n }\n\n // Bound answer sanely before returning.\n return Math.min(1, Math.max(0, scaledPDF));\n }\n },\n\n cdf: function cdf(x, N, m, n) {\n // Hypergeometric CDF.\n\n // This algorithm is due to Prof. Thomas S. Ferguson, ,\n // and comes from his hypergeometric test calculator at\n // .\n\n // x = number of successes drawn\n // N = population size\n // m = number of successes in population\n // n = number of items drawn from population\n\n if(x < 0 || x < m - (N - n)) {\n // It's impossible to have this few successes drawn or fewer.\n return 0;\n } else if(x >= n || x >= m) {\n // We will always have this many successes or fewer.\n return 1;\n } else if (m * 2 > N) {\n // More than half the population is successes.\n\n if(n * 2 > N) {\n // More than half the population is sampled.\n\n return jStat.hypgeom.cdf(N - m - n + x, N, N - m, N - n)\n } else {\n // Half or less of the population is sampled.\n\n return 1 - jStat.hypgeom.cdf(n - x - 1, N, N - m, n);\n }\n\n } else if(n * 2 > N) {\n // Half or less is successes.\n\n return 1 - jStat.hypgeom.cdf(m - x - 1, N, m, N - n);\n\n } else if(m < n) {\n // We want to have the number of things sampled to be less than the\n // successes available. So swap the definitions of successful and sampled.\n return jStat.hypgeom.cdf(x, N, n, m);\n } else {\n // If we get here, half or less of the population was sampled, half or\n // less of it was successes, and we had fewer sampled things than\n // successes. Now we can do this complicated iterative algorithm in an\n // efficient way.\n\n // The basic premise of the algorithm is that we partially normalize our\n // intermediate sum to keep it in a numerically good region, and then\n // finish the normalization at the end.\n\n // Holds the intermediate, scaled total CDF.\n var scaledCDF = 1;\n\n // This variable holds the scaled probability of the current number of\n // successes.\n var scaledPDF = 1;\n\n // This keeps track of how much we have normalized.\n var samplesDone = 0;\n\n for(var i = 0; i < x; i++) {\n // For every possible number of successes up to that observed...\n\n while(scaledCDF > 1 && samplesDone < n) {\n // Intermediate result is growing too big. Apply some of the\n // normalization to shrink everything.\n\n var factor = 1 - (m / (N - samplesDone));\n\n scaledPDF *= factor;\n scaledCDF *= factor;\n\n // Say we've normalized by this sample already.\n samplesDone++;\n }\n\n // Work out the partially-normalized hypergeometric PDF for the next\n // number of successes\n scaledPDF *= (n - i) * (m - i) / ((i + 1) * (N - m - n + i + 1));\n\n // Add to the CDF answer.\n scaledCDF += scaledPDF;\n }\n\n for(; samplesDone < n; samplesDone++) {\n // Apply all the rest of the normalization\n scaledCDF *= 1 - (m / (N - samplesDone));\n }\n\n // Bound answer sanely before returning.\n return Math.min(1, Math.max(0, scaledCDF));\n }\n }\n});\n\n\n\n// extend uniform function with static methods\njStat.extend(jStat.poisson, {\n pdf: function pdf(k, l) {\n if (l < 0 || (k % 1) !== 0 || k < 0) {\n return 0;\n }\n\n return Math.pow(l, k) * Math.exp(-l) / jStat.factorial(k);\n },\n\n cdf: function cdf(x, l) {\n var sumarr = [],\n k = 0;\n if (x < 0) return 0;\n for (; k <= x; k++) {\n sumarr.push(jStat.poisson.pdf(k, l));\n }\n return jStat.sum(sumarr);\n },\n\n mean : function(l) {\n return l;\n },\n\n variance : function(l) {\n return l;\n },\n\n sampleSmall: function sampleSmall(l) {\n var p = 1, k = 0, L = Math.exp(-l);\n do {\n k++;\n p *= jStat._random_fn();\n } while (p > L);\n return k - 1;\n },\n\n sampleLarge: function sampleLarge(l) {\n var lam = l;\n var k;\n var U, V, slam, loglam, a, b, invalpha, vr, us;\n\n slam = Math.sqrt(lam);\n loglam = Math.log(lam);\n b = 0.931 + 2.53 * slam;\n a = -0.059 + 0.02483 * b;\n invalpha = 1.1239 + 1.1328 / (b - 3.4);\n vr = 0.9277 - 3.6224 / (b - 2);\n\n while (1) {\n U = Math.random() - 0.5;\n V = Math.random();\n us = 0.5 - Math.abs(U);\n k = Math.floor((2 * a / us + b) * U + lam + 0.43);\n if ((us >= 0.07) && (V <= vr)) {\n return k;\n }\n if ((k < 0) || ((us < 0.013) && (V > us))) {\n continue;\n }\n /* log(V) == log(0.0) ok here */\n /* if U==0.0 so that us==0.0, log is ok since always returns */\n if ((Math.log(V) + Math.log(invalpha) - Math.log(a / (us * us) + b)) <= (-lam + k * loglam - jStat.loggam(k + 1))) {\n return k;\n }\n }\n },\n\n sample: function sample(l) {\n if (l < 10)\n return this.sampleSmall(l);\n else\n return this.sampleLarge(l);\n }\n});\n\n// extend triangular function with static methods\njStat.extend(jStat.triangular, {\n pdf: function pdf(x, a, b, c) {\n if (b <= a || c < a || c > b) {\n return NaN;\n } else {\n if (x < a || x > b) {\n return 0;\n } else if (x < c) {\n return (2 * (x - a)) / ((b - a) * (c - a));\n } else if (x === c) {\n return (2 / (b - a));\n } else { // x > c\n return (2 * (b - x)) / ((b - a) * (b - c));\n }\n }\n },\n\n cdf: function cdf(x, a, b, c) {\n if (b <= a || c < a || c > b)\n return NaN;\n if (x <= a)\n return 0;\n else if (x >= b)\n return 1;\n if (x <= c)\n return Math.pow(x - a, 2) / ((b - a) * (c - a));\n else // x > c\n return 1 - Math.pow(b - x, 2) / ((b - a) * (b - c));\n },\n\n inv: function inv(p, a, b, c) {\n if (b <= a || c < a || c > b) {\n return NaN;\n } else {\n if (p <= ((c - a) / (b - a))) {\n return a + (b - a) * Math.sqrt(p * ((c - a) / (b - a)));\n } else { // p > ((c - a) / (b - a))\n return a + (b - a) * (1 - Math.sqrt((1 - p) * (1 - ((c - a) / (b - a)))));\n }\n }\n },\n\n mean: function mean(a, b, c) {\n return (a + b + c) / 3;\n },\n\n median: function median(a, b, c) {\n if (c <= (a + b) / 2) {\n return b - Math.sqrt((b - a) * (b - c)) / Math.sqrt(2);\n } else if (c > (a + b) / 2) {\n return a + Math.sqrt((b - a) * (c - a)) / Math.sqrt(2);\n }\n },\n\n mode: function mode(a, b, c) {\n return c;\n },\n\n sample: function sample(a, b, c) {\n var u = jStat._random_fn();\n if (u < ((c - a) / (b - a)))\n return a + Math.sqrt(u * (b - a) * (c - a))\n return b - Math.sqrt((1 - u) * (b - a) * (b - c));\n },\n\n variance: function variance(a, b, c) {\n return (a * a + b * b + c * c - a * b - a * c - b * c) / 18;\n }\n});\n\n\n// extend arcsine function with static methods\njStat.extend(jStat.arcsine, {\n pdf: function pdf(x, a, b) {\n if (b <= a) return NaN;\n\n return (x <= a || x >= b) ? 0 :\n (2 / Math.PI) *\n Math.pow(Math.pow(b - a, 2) -\n Math.pow(2 * x - a - b, 2), -0.5);\n },\n\n cdf: function cdf(x, a, b) {\n if (x < a)\n return 0;\n else if (x < b)\n return (2 / Math.PI) * Math.asin(Math.sqrt((x - a)/(b - a)));\n return 1;\n },\n\n inv: function(p, a, b) {\n return a + (0.5 - 0.5 * Math.cos(Math.PI * p)) * (b - a);\n },\n\n mean: function mean(a, b) {\n if (b <= a) return NaN;\n return (a + b) / 2;\n },\n\n median: function median(a, b) {\n if (b <= a) return NaN;\n return (a + b) / 2;\n },\n\n mode: function mode(/*a, b*/) {\n throw new Error('mode is not yet implemented');\n },\n\n sample: function sample(a, b) {\n return ((a + b) / 2) + ((b - a) / 2) *\n Math.sin(2 * Math.PI * jStat.uniform.sample(0, 1));\n },\n\n variance: function variance(a, b) {\n if (b <= a) return NaN;\n return Math.pow(b - a, 2) / 8;\n }\n});\n\n\nfunction laplaceSign(x) { return x / Math.abs(x); }\n\njStat.extend(jStat.laplace, {\n pdf: function pdf(x, mu, b) {\n return (b <= 0) ? 0 : (Math.exp(-Math.abs(x - mu) / b)) / (2 * b);\n },\n\n cdf: function cdf(x, mu, b) {\n if (b <= 0) { return 0; }\n\n if(x < mu) {\n return 0.5 * Math.exp((x - mu) / b);\n } else {\n return 1 - 0.5 * Math.exp(- (x - mu) / b);\n }\n },\n\n mean: function(mu/*, b*/) {\n return mu;\n },\n\n median: function(mu/*, b*/) {\n return mu;\n },\n\n mode: function(mu/*, b*/) {\n return mu;\n },\n\n variance: function(mu, b) {\n return 2 * b * b;\n },\n\n sample: function sample(mu, b) {\n var u = jStat._random_fn() - 0.5;\n\n return mu - (b * laplaceSign(u) * Math.log(1 - (2 * Math.abs(u))));\n }\n});\n\nfunction tukeyWprob(w, rr, cc) {\n var nleg = 12;\n var ihalf = 6;\n\n var C1 = -30;\n var C2 = -50;\n var C3 = 60;\n var bb = 8;\n var wlar = 3;\n var wincr1 = 2;\n var wincr2 = 3;\n var xleg = [\n 0.981560634246719250690549090149,\n 0.904117256370474856678465866119,\n 0.769902674194304687036893833213,\n 0.587317954286617447296702418941,\n 0.367831498998180193752691536644,\n 0.125233408511468915472441369464\n ];\n var aleg = [\n 0.047175336386511827194615961485,\n 0.106939325995318430960254718194,\n 0.160078328543346226334652529543,\n 0.203167426723065921749064455810,\n 0.233492536538354808760849898925,\n 0.249147045813402785000562436043\n ];\n\n var qsqz = w * 0.5;\n\n // if w >= 16 then the integral lower bound (occurs for c=20)\n // is 0.99999999999995 so return a value of 1.\n\n if (qsqz >= bb)\n return 1.0;\n\n // find (f(w/2) - 1) ^ cc\n // (first term in integral of hartley's form).\n\n var pr_w = 2 * jStat.normal.cdf(qsqz, 0, 1, 1, 0) - 1; // erf(qsqz / M_SQRT2)\n // if pr_w ^ cc < 2e-22 then set pr_w = 0\n if (pr_w >= Math.exp(C2 / cc))\n pr_w = Math.pow(pr_w, cc);\n else\n pr_w = 0.0;\n\n // if w is large then the second component of the\n // integral is small, so fewer intervals are needed.\n\n var wincr;\n if (w > wlar)\n wincr = wincr1;\n else\n wincr = wincr2;\n\n // find the integral of second term of hartley's form\n // for the integral of the range for equal-length\n // intervals using legendre quadrature. limits of\n // integration are from (w/2, 8). two or three\n // equal-length intervals are used.\n\n // blb and bub are lower and upper limits of integration.\n\n var blb = qsqz;\n var binc = (bb - qsqz) / wincr;\n var bub = blb + binc;\n var einsum = 0.0;\n\n // integrate over each interval\n\n var cc1 = cc - 1.0;\n for (var wi = 1; wi <= wincr; wi++) {\n var elsum = 0.0;\n var a = 0.5 * (bub + blb);\n\n // legendre quadrature with order = nleg\n\n var b = 0.5 * (bub - blb);\n\n for (var jj = 1; jj <= nleg; jj++) {\n var j, xx;\n if (ihalf < jj) {\n j = (nleg - jj) + 1;\n xx = xleg[j-1];\n } else {\n j = jj;\n xx = -xleg[j-1];\n }\n var c = b * xx;\n var ac = a + c;\n\n // if exp(-qexpo/2) < 9e-14,\n // then doesn't contribute to integral\n\n var qexpo = ac * ac;\n if (qexpo > C3)\n break;\n\n var pplus = 2 * jStat.normal.cdf(ac, 0, 1, 1, 0);\n var pminus= 2 * jStat.normal.cdf(ac, w, 1, 1, 0);\n\n // if rinsum ^ (cc-1) < 9e-14,\n // then doesn't contribute to integral\n\n var rinsum = (pplus * 0.5) - (pminus * 0.5);\n if (rinsum >= Math.exp(C1 / cc1)) {\n rinsum = (aleg[j-1] * Math.exp(-(0.5 * qexpo))) * Math.pow(rinsum, cc1);\n elsum += rinsum;\n }\n }\n elsum *= (((2.0 * b) * cc) / Math.sqrt(2 * Math.PI));\n einsum += elsum;\n blb = bub;\n bub += binc;\n }\n\n // if pr_w ^ rr < 9e-14, then return 0\n pr_w += einsum;\n if (pr_w <= Math.exp(C1 / rr))\n return 0;\n\n pr_w = Math.pow(pr_w, rr);\n if (pr_w >= 1) // 1 was iMax was eps\n return 1;\n return pr_w;\n}\n\nfunction tukeyQinv(p, c, v) {\n var p0 = 0.322232421088;\n var q0 = 0.993484626060e-01;\n var p1 = -1.0;\n var q1 = 0.588581570495;\n var p2 = -0.342242088547;\n var q2 = 0.531103462366;\n var p3 = -0.204231210125;\n var q3 = 0.103537752850;\n var p4 = -0.453642210148e-04;\n var q4 = 0.38560700634e-02;\n var c1 = 0.8832;\n var c2 = 0.2368;\n var c3 = 1.214;\n var c4 = 1.208;\n var c5 = 1.4142;\n var vmax = 120.0;\n\n var ps = 0.5 - 0.5 * p;\n var yi = Math.sqrt(Math.log(1.0 / (ps * ps)));\n var t = yi + (((( yi * p4 + p3) * yi + p2) * yi + p1) * yi + p0)\n / (((( yi * q4 + q3) * yi + q2) * yi + q1) * yi + q0);\n if (v < vmax) t += (t * t * t + t) / v / 4.0;\n var q = c1 - c2 * t;\n if (v < vmax) q += -c3 / v + c4 * t / v;\n return t * (q * Math.log(c - 1.0) + c5);\n}\n\njStat.extend(jStat.tukey, {\n cdf: function cdf(q, nmeans, df) {\n // Identical implementation as the R ptukey() function as of commit 68947\n var rr = 1;\n var cc = nmeans;\n\n var nlegq = 16;\n var ihalfq = 8;\n\n var eps1 = -30.0;\n var eps2 = 1.0e-14;\n var dhaf = 100.0;\n var dquar = 800.0;\n var deigh = 5000.0;\n var dlarg = 25000.0;\n var ulen1 = 1.0;\n var ulen2 = 0.5;\n var ulen3 = 0.25;\n var ulen4 = 0.125;\n var xlegq = [\n 0.989400934991649932596154173450,\n 0.944575023073232576077988415535,\n 0.865631202387831743880467897712,\n 0.755404408355003033895101194847,\n 0.617876244402643748446671764049,\n 0.458016777657227386342419442984,\n 0.281603550779258913230460501460,\n 0.950125098376374401853193354250e-1\n ];\n var alegq = [\n 0.271524594117540948517805724560e-1,\n 0.622535239386478928628438369944e-1,\n 0.951585116824927848099251076022e-1,\n 0.124628971255533872052476282192,\n 0.149595988816576732081501730547,\n 0.169156519395002538189312079030,\n 0.182603415044923588866763667969,\n 0.189450610455068496285396723208\n ];\n\n if (q <= 0)\n return 0;\n\n // df must be > 1\n // there must be at least two values\n\n if (df < 2 || rr < 1 || cc < 2) return NaN;\n\n if (!Number.isFinite(q))\n return 1;\n\n if (df > dlarg)\n return tukeyWprob(q, rr, cc);\n\n // calculate leading constant\n\n var f2 = df * 0.5;\n var f2lf = ((f2 * Math.log(df)) - (df * Math.log(2))) - jStat.gammaln(f2);\n var f21 = f2 - 1.0;\n\n // integral is divided into unit, half-unit, quarter-unit, or\n // eighth-unit length intervals depending on the value of the\n // degrees of freedom.\n\n var ff4 = df * 0.25;\n var ulen;\n if (df <= dhaf) ulen = ulen1;\n else if (df <= dquar) ulen = ulen2;\n else if (df <= deigh) ulen = ulen3;\n else ulen = ulen4;\n\n f2lf += Math.log(ulen);\n\n // integrate over each subinterval\n\n var ans = 0.0;\n\n for (var i = 1; i <= 50; i++) {\n var otsum = 0.0;\n\n // legendre quadrature with order = nlegq\n // nodes (stored in xlegq) are symmetric around zero.\n\n var twa1 = (2 * i - 1) * ulen;\n\n for (var jj = 1; jj <= nlegq; jj++) {\n var j, t1;\n if (ihalfq < jj) {\n j = jj - ihalfq - 1;\n t1 = (f2lf + (f21 * Math.log(twa1 + (xlegq[j] * ulen))))\n - (((xlegq[j] * ulen) + twa1) * ff4);\n } else {\n j = jj - 1;\n t1 = (f2lf + (f21 * Math.log(twa1 - (xlegq[j] * ulen))))\n + (((xlegq[j] * ulen) - twa1) * ff4);\n }\n\n // if exp(t1) < 9e-14, then doesn't contribute to integral\n var qsqz;\n if (t1 >= eps1) {\n if (ihalfq < jj) {\n qsqz = q * Math.sqrt(((xlegq[j] * ulen) + twa1) * 0.5);\n } else {\n qsqz = q * Math.sqrt(((-(xlegq[j] * ulen)) + twa1) * 0.5);\n }\n\n // call wprob to find integral of range portion\n\n var wprb = tukeyWprob(qsqz, rr, cc);\n var rotsum = (wprb * alegq[j]) * Math.exp(t1);\n otsum += rotsum;\n }\n // end legendre integral for interval i\n // L200:\n }\n\n // if integral for interval i < 1e-14, then stop.\n // However, in order to avoid small area under left tail,\n // at least 1 / ulen intervals are calculated.\n if (i * ulen >= 1.0 && otsum <= eps2)\n break;\n\n // end of interval i\n // L330:\n\n ans += otsum;\n }\n\n if (otsum > eps2) { // not converged\n throw new Error('tukey.cdf failed to converge');\n }\n if (ans > 1)\n ans = 1;\n return ans;\n },\n\n inv: function(p, nmeans, df) {\n // Identical implementation as the R qtukey() function as of commit 68947\n var rr = 1;\n var cc = nmeans;\n\n var eps = 0.0001;\n var maxiter = 50;\n\n // df must be > 1 ; there must be at least two values\n if (df < 2 || rr < 1 || cc < 2) return NaN;\n\n if (p < 0 || p > 1) return NaN;\n if (p === 0) return 0;\n if (p === 1) return Infinity;\n\n // Initial value\n\n var x0 = tukeyQinv(p, cc, df);\n\n // Find prob(value < x0)\n\n var valx0 = jStat.tukey.cdf(x0, nmeans, df) - p;\n\n // Find the second iterate and prob(value < x1).\n // If the first iterate has probability value\n // exceeding p then second iterate is 1 less than\n // first iterate; otherwise it is 1 greater.\n\n var x1;\n if (valx0 > 0.0)\n x1 = Math.max(0.0, x0 - 1.0);\n else\n x1 = x0 + 1.0;\n var valx1 = jStat.tukey.cdf(x1, nmeans, df) - p;\n\n // Find new iterate\n\n var ans;\n for(var iter = 1; iter < maxiter; iter++) {\n ans = x1 - ((valx1 * (x1 - x0)) / (valx1 - valx0));\n valx0 = valx1;\n\n // New iterate must be >= 0\n\n x0 = x1;\n if (ans < 0.0) {\n ans = 0.0;\n valx1 = -p;\n }\n // Find prob(value < new iterate)\n\n valx1 = jStat.tukey.cdf(ans, nmeans, df) - p;\n x1 = ans;\n\n // If the difference between two successive\n // iterates is less than eps, stop\n\n var xabs = Math.abs(x1 - x0);\n if (xabs < eps)\n return ans;\n }\n\n throw new Error('tukey.inv failed to converge');\n }\n});\n\n}(jStat, Math));\n/* Provides functions for the solution of linear system of equations, integration, extrapolation,\n * interpolation, eigenvalue problems, differential equations and PCA analysis. */\n\n(function(jStat, Math) {\n\nvar push = Array.prototype.push;\nvar isArray = jStat.utils.isArray;\n\nfunction isUsable(arg) {\n return isArray(arg) || arg instanceof jStat;\n}\n\njStat.extend({\n\n // add a vector/matrix to a vector/matrix or scalar\n add: function add(arr, arg) {\n // check if arg is a vector or scalar\n if (isUsable(arg)) {\n if (!isUsable(arg[0])) arg = [ arg ];\n return jStat.map(arr, function(value, row, col) {\n return value + arg[row][col];\n });\n }\n return jStat.map(arr, function(value) { return value + arg; });\n },\n\n // subtract a vector or scalar from the vector\n subtract: function subtract(arr, arg) {\n // check if arg is a vector or scalar\n if (isUsable(arg)) {\n if (!isUsable(arg[0])) arg = [ arg ];\n return jStat.map(arr, function(value, row, col) {\n return value - arg[row][col] || 0;\n });\n }\n return jStat.map(arr, function(value) { return value - arg; });\n },\n\n // matrix division\n divide: function divide(arr, arg) {\n if (isUsable(arg)) {\n if (!isUsable(arg[0])) arg = [ arg ];\n return jStat.multiply(arr, jStat.inv(arg));\n }\n return jStat.map(arr, function(value) { return value / arg; });\n },\n\n // matrix multiplication\n multiply: function multiply(arr, arg) {\n var row, col, nrescols, sum, nrow, ncol, res, rescols;\n // eg: arr = 2 arg = 3 -> 6 for res[0][0] statement closure\n if (arr.length === undefined && arg.length === undefined) {\n return arr * arg;\n }\n nrow = arr.length,\n ncol = arr[0].length,\n res = jStat.zeros(nrow, nrescols = (isUsable(arg)) ? arg[0].length : ncol),\n rescols = 0;\n if (isUsable(arg)) {\n for (; rescols < nrescols; rescols++) {\n for (row = 0; row < nrow; row++) {\n sum = 0;\n for (col = 0; col < ncol; col++)\n sum += arr[row][col] * arg[col][rescols];\n res[row][rescols] = sum;\n }\n }\n return (nrow === 1 && rescols === 1) ? res[0][0] : res;\n }\n return jStat.map(arr, function(value) { return value * arg; });\n },\n\n // outer([1,2,3],[4,5,6])\n // ===\n // [[1],[2],[3]] times [[4,5,6]]\n // ->\n // [[4,5,6],[8,10,12],[12,15,18]]\n outer:function outer(A, B) {\n return jStat.multiply(A.map(function(t){ return [t] }), [B]);\n },\n\n\n // Returns the dot product of two matricies\n dot: function dot(arr, arg) {\n if (!isUsable(arr[0])) arr = [ arr ];\n if (!isUsable(arg[0])) arg = [ arg ];\n // convert column to row vector\n var left = (arr[0].length === 1 && arr.length !== 1) ? jStat.transpose(arr) : arr,\n right = (arg[0].length === 1 && arg.length !== 1) ? jStat.transpose(arg) : arg,\n res = [],\n row = 0,\n nrow = left.length,\n ncol = left[0].length,\n sum, col;\n for (; row < nrow; row++) {\n res[row] = [];\n sum = 0;\n for (col = 0; col < ncol; col++)\n sum += left[row][col] * right[row][col];\n res[row] = sum;\n }\n return (res.length === 1) ? res[0] : res;\n },\n\n // raise every element by a scalar\n pow: function pow(arr, arg) {\n return jStat.map(arr, function(value) { return Math.pow(value, arg); });\n },\n\n // exponentiate every element\n exp: function exp(arr) {\n return jStat.map(arr, function(value) { return Math.exp(value); });\n },\n\n // generate the natural log of every element\n log: function exp(arr) {\n return jStat.map(arr, function(value) { return Math.log(value); });\n },\n\n // generate the absolute values of the vector\n abs: function abs(arr) {\n return jStat.map(arr, function(value) { return Math.abs(value); });\n },\n\n // computes the p-norm of the vector\n // In the case that a matrix is passed, uses the first row as the vector\n norm: function norm(arr, p) {\n var nnorm = 0,\n i = 0;\n // check the p-value of the norm, and set for most common case\n if (isNaN(p)) p = 2;\n // check if multi-dimensional array, and make vector correction\n if (isUsable(arr[0])) arr = arr[0];\n // vector norm\n for (; i < arr.length; i++) {\n nnorm += Math.pow(Math.abs(arr[i]), p);\n }\n return Math.pow(nnorm, 1 / p);\n },\n\n // computes the angle between two vectors in rads\n // In case a matrix is passed, this uses the first row as the vector\n angle: function angle(arr, arg) {\n return Math.acos(jStat.dot(arr, arg) / (jStat.norm(arr) * jStat.norm(arg)));\n },\n\n // augment one matrix by another\n // Note: this function returns a matrix, not a jStat object\n aug: function aug(a, b) {\n var newarr = [];\n var i;\n for (i = 0; i < a.length; i++) {\n newarr.push(a[i].slice());\n }\n for (i = 0; i < newarr.length; i++) {\n push.apply(newarr[i], b[i]);\n }\n return newarr;\n },\n\n // The inv() function calculates the inverse of a matrix\n // Create the inverse by augmenting the matrix by the identity matrix of the\n // appropriate size, and then use G-J elimination on the augmented matrix.\n inv: function inv(a) {\n var rows = a.length;\n var cols = a[0].length;\n var b = jStat.identity(rows, cols);\n var c = jStat.gauss_jordan(a, b);\n var result = [];\n var i = 0;\n var j;\n\n //We need to copy the inverse portion to a new matrix to rid G-J artifacts\n for (; i < rows; i++) {\n result[i] = [];\n for (j = cols; j < c[0].length; j++)\n result[i][j - cols] = c[i][j];\n }\n return result;\n },\n\n // calculate the determinant of a matrix\n det: function det(a) {\n if (a.length === 2) {\n return a[0][0] * a[1][1] - a[0][1] * a[1][0];\n }\n\n var determinant = 0;\n for (var i = 0; i < a.length; i++) {\n // build a sub matrix without column `i`\n var submatrix = [];\n for (var row = 1; row < a.length; row++) {\n submatrix[row - 1] = [];\n for (var col = 0; col < a.length; col++) {\n if (col < i) {\n submatrix[row - 1][col] = a[row][col];\n } else if (col > i) {\n submatrix[row - 1][col - 1] = a[row][col];\n }\n }\n }\n\n // alternate between + and - between determinants\n var sign = i % 2 ? -1 : 1;\n determinant += det(submatrix) * a[0][i] * sign;\n }\n\n return determinant\n },\n\n gauss_elimination: function gauss_elimination(a, b) {\n var i = 0,\n j = 0,\n n = a.length,\n m = a[0].length,\n factor = 1,\n sum = 0,\n x = [],\n maug, pivot, temp, k;\n a = jStat.aug(a, b);\n maug = a[0].length;\n for(i = 0; i < n; i++) {\n pivot = a[i][i];\n j = i;\n for (k = i + 1; k < m; k++) {\n if (pivot < Math.abs(a[k][i])) {\n pivot = a[k][i];\n j = k;\n }\n }\n if (j != i) {\n for(k = 0; k < maug; k++) {\n temp = a[i][k];\n a[i][k] = a[j][k];\n a[j][k] = temp;\n }\n }\n for (j = i + 1; j < n; j++) {\n factor = a[j][i] / a[i][i];\n for(k = i; k < maug; k++) {\n a[j][k] = a[j][k] - factor * a[i][k];\n }\n }\n }\n for (i = n - 1; i >= 0; i--) {\n sum = 0;\n for (j = i + 1; j<= n - 1; j++) {\n sum = sum + x[j] * a[i][j];\n }\n x[i] =(a[i][maug - 1] - sum) / a[i][i];\n }\n return x;\n },\n\n gauss_jordan: function gauss_jordan(a, b) {\n var m = jStat.aug(a, b);\n var h = m.length;\n var w = m[0].length;\n var c = 0;\n var x, y, y2;\n // find max pivot\n for (y = 0; y < h; y++) {\n var maxrow = y;\n for (y2 = y+1; y2 < h; y2++) {\n if (Math.abs(m[y2][y]) > Math.abs(m[maxrow][y]))\n maxrow = y2;\n }\n var tmp = m[y];\n m[y] = m[maxrow];\n m[maxrow] = tmp\n for (y2 = y+1; y2 < h; y2++) {\n c = m[y2][y] / m[y][y];\n for (x = y; x < w; x++) {\n m[y2][x] -= m[y][x] * c;\n }\n }\n }\n // backsubstitute\n for (y = h-1; y >= 0; y--) {\n c = m[y][y];\n for (y2 = 0; y2 < y; y2++) {\n for (x = w-1; x > y-1; x--) {\n m[y2][x] -= m[y][x] * m[y2][y] / c;\n }\n }\n m[y][y] /= c;\n for (x = h; x < w; x++) {\n m[y][x] /= c;\n }\n }\n return m;\n },\n\n // solve equation\n // Ax=b\n // A is upper triangular matrix\n // A=[[1,2,3],[0,4,5],[0,6,7]]\n // b=[1,2,3]\n // triaUpSolve(A,b) // -> [2.666,0.1666,1.666]\n // if you use matrix style\n // A=[[1,2,3],[0,4,5],[0,6,7]]\n // b=[[1],[2],[3]]\n // will return [[2.666],[0.1666],[1.666]]\n triaUpSolve: function triaUpSolve(A, b) {\n var size = A[0].length;\n var x = jStat.zeros(1, size)[0];\n var parts;\n var matrix_mode = false;\n\n if (b[0].length != undefined) {\n b = b.map(function(i){ return i[0] });\n matrix_mode = true;\n }\n\n jStat.arange(size - 1, -1, -1).forEach(function(i) {\n parts = jStat.arange(i + 1, size).map(function(j) {\n return x[j] * A[i][j];\n });\n x[i] = (b[i] - jStat.sum(parts)) / A[i][i];\n });\n\n if (matrix_mode)\n return x.map(function(i){ return [i] });\n return x;\n },\n\n triaLowSolve: function triaLowSolve(A, b) {\n // like to triaUpSolve but A is lower triangular matrix\n var size = A[0].length;\n var x = jStat.zeros(1, size)[0];\n var parts;\n\n var matrix_mode=false;\n if (b[0].length != undefined) {\n b = b.map(function(i){ return i[0] });\n matrix_mode = true;\n }\n\n jStat.arange(size).forEach(function(i) {\n parts = jStat.arange(i).map(function(j) {\n return A[i][j] * x[j];\n });\n x[i] = (b[i] - jStat.sum(parts)) / A[i][i];\n })\n\n if (matrix_mode)\n return x.map(function(i){ return [i] });\n return x;\n },\n\n\n // A -> [L,U]\n // A=LU\n // L is lower triangular matrix\n // U is upper triangular matrix\n lu: function lu(A) {\n var size = A.length;\n //var L=jStat.diagonal(jStat.ones(1,size)[0]);\n var L = jStat.identity(size);\n var R = jStat.zeros(A.length, A[0].length);\n var parts;\n jStat.arange(size).forEach(function(t) {\n R[0][t] = A[0][t];\n });\n jStat.arange(1, size).forEach(function(l) {\n jStat.arange(l).forEach(function(i) {\n parts = jStat.arange(i).map(function(jj) {\n return L[l][jj] * R[jj][i];\n });\n L[l][i] = (A[l][i] - jStat.sum(parts)) / R[i][i];\n });\n jStat.arange(l, size).forEach(function(j) {\n parts = jStat.arange(l).map(function(jj) {\n return L[l][jj] * R[jj][j];\n });\n R[l][j] = A[parts.length][j] - jStat.sum(parts);\n });\n });\n return [L, R];\n },\n\n // A -> T\n // A=TT'\n // T is lower triangular matrix\n cholesky: function cholesky(A) {\n var size = A.length;\n var T = jStat.zeros(A.length, A[0].length);\n var parts;\n jStat.arange(size).forEach(function(i) {\n parts = jStat.arange(i).map(function(t) {\n return Math.pow(T[i][t],2);\n });\n T[i][i] = Math.sqrt(A[i][i] - jStat.sum(parts));\n jStat.arange(i + 1, size).forEach(function(j) {\n parts = jStat.arange(i).map(function(t) {\n return T[i][t] * T[j][t];\n });\n T[j][i] = (A[i][j] - jStat.sum(parts)) / T[i][i];\n });\n });\n return T;\n },\n\n\n gauss_jacobi: function gauss_jacobi(a, b, x, r) {\n var i = 0;\n var j = 0;\n var n = a.length;\n var l = [];\n var u = [];\n var d = [];\n var xv, c, h, xk;\n for (; i < n; i++) {\n l[i] = [];\n u[i] = [];\n d[i] = [];\n for (j = 0; j < n; j++) {\n if (i > j) {\n l[i][j] = a[i][j];\n u[i][j] = d[i][j] = 0;\n } else if (i < j) {\n u[i][j] = a[i][j];\n l[i][j] = d[i][j] = 0;\n } else {\n d[i][j] = a[i][j];\n l[i][j] = u[i][j] = 0;\n }\n }\n }\n h = jStat.multiply(jStat.multiply(jStat.inv(d), jStat.add(l, u)), -1);\n c = jStat.multiply(jStat.inv(d), b);\n xv = x;\n xk = jStat.add(jStat.multiply(h, x), c);\n i = 2;\n while (Math.abs(jStat.norm(jStat.subtract(xk,xv))) > r) {\n xv = xk;\n xk = jStat.add(jStat.multiply(h, xv), c);\n i++;\n }\n return xk;\n },\n\n gauss_seidel: function gauss_seidel(a, b, x, r) {\n var i = 0;\n var n = a.length;\n var l = [];\n var u = [];\n var d = [];\n var j, xv, c, h, xk;\n for (; i < n; i++) {\n l[i] = [];\n u[i] = [];\n d[i] = [];\n for (j = 0; j < n; j++) {\n if (i > j) {\n l[i][j] = a[i][j];\n u[i][j] = d[i][j] = 0;\n } else if (i < j) {\n u[i][j] = a[i][j];\n l[i][j] = d[i][j] = 0;\n } else {\n d[i][j] = a[i][j];\n l[i][j] = u[i][j] = 0;\n }\n }\n }\n h = jStat.multiply(jStat.multiply(jStat.inv(jStat.add(d, l)), u), -1);\n c = jStat.multiply(jStat.inv(jStat.add(d, l)), b);\n xv = x;\n xk = jStat.add(jStat.multiply(h, x), c);\n i = 2;\n while (Math.abs(jStat.norm(jStat.subtract(xk, xv))) > r) {\n xv = xk;\n xk = jStat.add(jStat.multiply(h, xv), c);\n i = i + 1;\n }\n return xk;\n },\n\n SOR: function SOR(a, b, x, r, w) {\n var i = 0;\n var n = a.length;\n var l = [];\n var u = [];\n var d = [];\n var j, xv, c, h, xk;\n for (; i < n; i++) {\n l[i] = [];\n u[i] = [];\n d[i] = [];\n for (j = 0; j < n; j++) {\n if (i > j) {\n l[i][j] = a[i][j];\n u[i][j] = d[i][j] = 0;\n } else if (i < j) {\n u[i][j] = a[i][j];\n l[i][j] = d[i][j] = 0;\n } else {\n d[i][j] = a[i][j];\n l[i][j] = u[i][j] = 0;\n }\n }\n }\n h = jStat.multiply(jStat.inv(jStat.add(d, jStat.multiply(l, w))),\n jStat.subtract(jStat.multiply(d, 1 - w),\n jStat.multiply(u, w)));\n c = jStat.multiply(jStat.multiply(jStat.inv(jStat.add(d,\n jStat.multiply(l, w))), b), w);\n xv = x;\n xk = jStat.add(jStat.multiply(h, x), c);\n i = 2;\n while (Math.abs(jStat.norm(jStat.subtract(xk, xv))) > r) {\n xv = xk;\n xk = jStat.add(jStat.multiply(h, xv), c);\n i++;\n }\n return xk;\n },\n\n householder: function householder(a) {\n var m = a.length;\n var n = a[0].length;\n var i = 0;\n var w = [];\n var p = [];\n var alpha, r, k, j, factor;\n for (; i < m - 1; i++) {\n alpha = 0;\n for (j = i + 1; j < n; j++)\n alpha += (a[j][i] * a[j][i]);\n factor = (a[i + 1][i] > 0) ? -1 : 1;\n alpha = factor * Math.sqrt(alpha);\n r = Math.sqrt((((alpha * alpha) - a[i + 1][i] * alpha) / 2));\n w = jStat.zeros(m, 1);\n w[i + 1][0] = (a[i + 1][i] - alpha) / (2 * r);\n for (k = i + 2; k < m; k++) w[k][0] = a[k][i] / (2 * r);\n p = jStat.subtract(jStat.identity(m, n),\n jStat.multiply(jStat.multiply(w, jStat.transpose(w)), 2));\n a = jStat.multiply(p, jStat.multiply(a, p));\n }\n return a;\n },\n\n // A -> [Q,R]\n // Q is orthogonal matrix\n // R is upper triangular\n QR: (function() {\n // x -> Q\n // find a orthogonal matrix Q st.\n // Qx=y\n // y is [||x||,0,0,...]\n\n // quick ref\n var sum = jStat.sum;\n var range = jStat.arange;\n\n function qr2(x) {\n // quick impletation\n // https://www.stat.wisc.edu/~larget/math496/qr.html\n\n var n = x.length;\n var p = x[0].length;\n\n var r = jStat.zeros(p, p);\n x = jStat.copy(x);\n\n var i,j,k;\n for(j = 0; j < p; j++){\n r[j][j] = Math.sqrt(sum(range(n).map(function(i){\n return x[i][j] * x[i][j];\n })));\n for(i = 0; i < n; i++){\n x[i][j] = x[i][j] / r[j][j];\n }\n for(k = j+1; k < p; k++){\n r[j][k] = sum(range(n).map(function(i){\n return x[i][j] * x[i][k];\n }));\n for(i = 0; i < n; i++){\n x[i][k] = x[i][k] - x[i][j]*r[j][k];\n }\n }\n }\n return [x, r];\n }\n\n return qr2;\n }()),\n\n lstsq: (function() {\n // solve least squard problem for Ax=b as QR decomposition way if b is\n // [[b1],[b2],[b3]] form will return [[x1],[x2],[x3]] array form solution\n // else b is [b1,b2,b3] form will return [x1,x2,x3] array form solution\n function R_I(A) {\n A = jStat.copy(A);\n var size = A.length;\n var I = jStat.identity(size);\n jStat.arange(size - 1, -1, -1).forEach(function(i) {\n jStat.sliceAssign(\n I, { row: i }, jStat.divide(jStat.slice(I, { row: i }), A[i][i]));\n jStat.sliceAssign(\n A, { row: i }, jStat.divide(jStat.slice(A, { row: i }), A[i][i]));\n jStat.arange(i).forEach(function(j) {\n var c = jStat.multiply(A[j][i], -1);\n var Aj = jStat.slice(A, { row: j });\n var cAi = jStat.multiply(jStat.slice(A, { row: i }), c);\n jStat.sliceAssign(A, { row: j }, jStat.add(Aj, cAi));\n var Ij = jStat.slice(I, { row: j });\n var cIi = jStat.multiply(jStat.slice(I, { row: i }), c);\n jStat.sliceAssign(I, { row: j }, jStat.add(Ij, cIi));\n })\n });\n return I;\n }\n\n function qr_solve(A, b){\n var array_mode = false;\n if (b[0].length === undefined) {\n // [c1,c2,c3] mode\n b = b.map(function(x){ return [x] });\n array_mode = true;\n }\n var QR = jStat.QR(A);\n var Q = QR[0];\n var R = QR[1];\n var attrs = A[0].length;\n var Q1 = jStat.slice(Q,{col:{end:attrs}});\n var R1 = jStat.slice(R,{row:{end:attrs}});\n var RI = R_I(R1);\n var Q2 = jStat.transpose(Q1);\n\n if(Q2[0].length === undefined){\n Q2 = [Q2]; // The confusing jStat.multifly implementation threat nature process again.\n }\n\n var x = jStat.multiply(jStat.multiply(RI, Q2), b);\n\n if(x.length === undefined){\n x = [[x]]; // The confusing jStat.multifly implementation threat nature process again.\n }\n\n\n if (array_mode)\n return x.map(function(i){ return i[0] });\n return x;\n }\n\n return qr_solve;\n }()),\n\n jacobi: function jacobi(a) {\n var condition = 1;\n var n = a.length;\n var e = jStat.identity(n, n);\n var ev = [];\n var b, i, j, p, q, maxim, theta, s;\n // condition === 1 only if tolerance is not reached\n while (condition === 1) {\n maxim = a[0][1];\n p = 0;\n q = 1;\n for (i = 0; i < n; i++) {\n for (j = 0; j < n; j++) {\n if (i != j) {\n if (maxim < Math.abs(a[i][j])) {\n maxim = Math.abs(a[i][j]);\n p = i;\n q = j;\n }\n }\n }\n }\n if (a[p][p] === a[q][q])\n theta = (a[p][q] > 0) ? Math.PI / 4 : -Math.PI / 4;\n else\n theta = Math.atan(2 * a[p][q] / (a[p][p] - a[q][q])) / 2;\n s = jStat.identity(n, n);\n s[p][p] = Math.cos(theta);\n s[p][q] = -Math.sin(theta);\n s[q][p] = Math.sin(theta);\n s[q][q] = Math.cos(theta);\n // eigen vector matrix\n e = jStat.multiply(e, s);\n b = jStat.multiply(jStat.multiply(jStat.inv(s), a), s);\n a = b;\n condition = 0;\n for (i = 1; i < n; i++) {\n for (j = 1; j < n; j++) {\n if (i != j && Math.abs(a[i][j]) > 0.001) {\n condition = 1;\n }\n }\n }\n }\n for (i = 0; i < n; i++) ev.push(a[i][i]);\n //returns both the eigenvalue and eigenmatrix\n return [e, ev];\n },\n\n rungekutta: function rungekutta(f, h, p, t_j, u_j, order) {\n var k1, k2, u_j1, k3, k4;\n if (order === 2) {\n while (t_j <= p) {\n k1 = h * f(t_j, u_j);\n k2 = h * f(t_j + h, u_j + k1);\n u_j1 = u_j + (k1 + k2) / 2;\n u_j = u_j1;\n t_j = t_j + h;\n }\n }\n if (order === 4) {\n while (t_j <= p) {\n k1 = h * f(t_j, u_j);\n k2 = h * f(t_j + h / 2, u_j + k1 / 2);\n k3 = h * f(t_j + h / 2, u_j + k2 / 2);\n k4 = h * f(t_j +h, u_j + k3);\n u_j1 = u_j + (k1 + 2 * k2 + 2 * k3 + k4) / 6;\n u_j = u_j1;\n t_j = t_j + h;\n }\n }\n return u_j;\n },\n\n romberg: function romberg(f, a, b, order) {\n var i = 0;\n var h = (b - a) / 2;\n var x = [];\n var h1 = [];\n var g = [];\n var m, a1, j, k, I;\n while (i < order / 2) {\n I = f(a);\n for (j = a, k = 0; j <= b; j = j + h, k++) x[k] = j;\n m = x.length;\n for (j = 1; j < m - 1; j++) {\n I += (((j % 2) !== 0) ? 4 : 2) * f(x[j]);\n }\n I = (h / 3) * (I + f(b));\n g[i] = I;\n h /= 2;\n i++;\n }\n a1 = g.length;\n m = 1;\n while (a1 !== 1) {\n for (j = 0; j < a1 - 1; j++)\n h1[j] = ((Math.pow(4, m)) * g[j + 1] - g[j]) / (Math.pow(4, m) - 1);\n a1 = h1.length;\n g = h1;\n h1 = [];\n m++;\n }\n return g;\n },\n\n richardson: function richardson(X, f, x, h) {\n function pos(X, x) {\n var i = 0;\n var n = X.length;\n var p;\n for (; i < n; i++)\n if (X[i] === x) p = i;\n return p;\n }\n var h_min = Math.abs(x - X[pos(X, x) + 1]);\n var i = 0;\n var g = [];\n var h1 = [];\n var y1, y2, m, a, j;\n while (h >= h_min) {\n y1 = pos(X, x + h);\n y2 = pos(X, x);\n g[i] = (f[y1] - 2 * f[y2] + f[2 * y2 - y1]) / (h * h);\n h /= 2;\n i++;\n }\n a = g.length;\n m = 1;\n while (a != 1) {\n for (j = 0; j < a - 1; j++)\n h1[j] = ((Math.pow(4, m)) * g[j + 1] - g[j]) / (Math.pow(4, m) - 1);\n a = h1.length;\n g = h1;\n h1 = [];\n m++;\n }\n return g;\n },\n\n simpson: function simpson(f, a, b, n) {\n var h = (b - a) / n;\n var I = f(a);\n var x = [];\n var j = a;\n var k = 0;\n var i = 1;\n var m;\n for (; j <= b; j = j + h, k++)\n x[k] = j;\n m = x.length;\n for (; i < m - 1; i++) {\n I += ((i % 2 !== 0) ? 4 : 2) * f(x[i]);\n }\n return (h / 3) * (I + f(b));\n },\n\n hermite: function hermite(X, F, dF, value) {\n var n = X.length;\n var p = 0;\n var i = 0;\n var l = [];\n var dl = [];\n var A = [];\n var B = [];\n var j;\n for (; i < n; i++) {\n l[i] = 1;\n for (j = 0; j < n; j++) {\n if (i != j) l[i] *= (value - X[j]) / (X[i] - X[j]);\n }\n dl[i] = 0;\n for (j = 0; j < n; j++) {\n if (i != j) dl[i] += 1 / (X [i] - X[j]);\n }\n A[i] = (1 - 2 * (value - X[i]) * dl[i]) * (l[i] * l[i]);\n B[i] = (value - X[i]) * (l[i] * l[i]);\n p += (A[i] * F[i] + B[i] * dF[i]);\n }\n return p;\n },\n\n lagrange: function lagrange(X, F, value) {\n var p = 0;\n var i = 0;\n var j, l;\n var n = X.length;\n for (; i < n; i++) {\n l = F[i];\n for (j = 0; j < n; j++) {\n // calculating the lagrange polynomial L_i\n if (i != j) l *= (value - X[j]) / (X[i] - X[j]);\n }\n // adding the lagrange polynomials found above\n p += l;\n }\n return p;\n },\n\n cubic_spline: function cubic_spline(X, F, value) {\n var n = X.length;\n var i = 0, j;\n var A = [];\n var B = [];\n var alpha = [];\n var c = [];\n var h = [];\n var b = [];\n var d = [];\n for (; i < n - 1; i++)\n h[i] = X[i + 1] - X[i];\n alpha[0] = 0;\n for (i = 1; i < n - 1; i++) {\n alpha[i] = (3 / h[i]) * (F[i + 1] - F[i]) -\n (3 / h[i-1]) * (F[i] - F[i-1]);\n }\n for (i = 1; i < n - 1; i++) {\n A[i] = [];\n B[i] = [];\n A[i][i-1] = h[i-1];\n A[i][i] = 2 * (h[i - 1] + h[i]);\n A[i][i+1] = h[i];\n B[i][0] = alpha[i];\n }\n c = jStat.multiply(jStat.inv(A), B);\n for (j = 0; j < n - 1; j++) {\n b[j] = (F[j + 1] - F[j]) / h[j] - h[j] * (c[j + 1][0] + 2 * c[j][0]) / 3;\n d[j] = (c[j + 1][0] - c[j][0]) / (3 * h[j]);\n }\n for (j = 0; j < n; j++) {\n if (X[j] > value) break;\n }\n j -= 1;\n return F[j] + (value - X[j]) * b[j] + jStat.sq(value-X[j]) *\n c[j] + (value - X[j]) * jStat.sq(value - X[j]) * d[j];\n },\n\n gauss_quadrature: function gauss_quadrature() {\n throw new Error('gauss_quadrature not yet implemented');\n },\n\n PCA: function PCA(X) {\n var m = X.length;\n var n = X[0].length;\n var i = 0;\n var j, temp1;\n var u = [];\n var D = [];\n var result = [];\n var temp2 = [];\n var Y = [];\n var Bt = [];\n var B = [];\n var C = [];\n var V = [];\n var Vt = [];\n for (i = 0; i < m; i++) {\n u[i] = jStat.sum(X[i]) / n;\n }\n for (i = 0; i < n; i++) {\n B[i] = [];\n for(j = 0; j < m; j++) {\n B[i][j] = X[j][i] - u[j];\n }\n }\n B = jStat.transpose(B);\n for (i = 0; i < m; i++) {\n C[i] = [];\n for (j = 0; j < m; j++) {\n C[i][j] = (jStat.dot([B[i]], [B[j]])) / (n - 1);\n }\n }\n result = jStat.jacobi(C);\n V = result[0];\n D = result[1];\n Vt = jStat.transpose(V);\n for (i = 0; i < D.length; i++) {\n for (j = i; j < D.length; j++) {\n if(D[i] < D[j]) {\n temp1 = D[i];\n D[i] = D[j];\n D[j] = temp1;\n temp2 = Vt[i];\n Vt[i] = Vt[j];\n Vt[j] = temp2;\n }\n }\n }\n Bt = jStat.transpose(B);\n for (i = 0; i < m; i++) {\n Y[i] = [];\n for (j = 0; j < Bt.length; j++) {\n Y[i][j] = jStat.dot([Vt[i]], [Bt[j]]);\n }\n }\n return [X, D, Vt, Y];\n }\n});\n\n// extend jStat.fn with methods that require one argument\n(function(funcs) {\n for (var i = 0; i < funcs.length; i++) (function(passfunc) {\n jStat.fn[passfunc] = function(arg, func) {\n var tmpthis = this;\n // check for callback\n if (func) {\n setTimeout(function() {\n func.call(tmpthis, jStat.fn[passfunc].call(tmpthis, arg));\n }, 15);\n return this;\n }\n if (typeof jStat[passfunc](this, arg) === 'number')\n return jStat[passfunc](this, arg);\n else\n return jStat(jStat[passfunc](this, arg));\n };\n }(funcs[i]));\n}('add divide multiply subtract dot pow exp log abs norm angle'.split(' ')));\n\n}(jStat, Math));\n(function(jStat, Math) {\n\nvar slice = [].slice;\nvar isNumber = jStat.utils.isNumber;\nvar isArray = jStat.utils.isArray;\n\n// flag==true denotes use of sample standard deviation\n// Z Statistics\njStat.extend({\n // 2 different parameter lists:\n // (value, mean, sd)\n // (value, array, flag)\n zscore: function zscore() {\n var args = slice.call(arguments);\n if (isNumber(args[1])) {\n return (args[0] - args[1]) / args[2];\n }\n return (args[0] - jStat.mean(args[1])) / jStat.stdev(args[1], args[2]);\n },\n\n // 3 different paramter lists:\n // (value, mean, sd, sides)\n // (zscore, sides)\n // (value, array, sides, flag)\n ztest: function ztest() {\n var args = slice.call(arguments);\n var z;\n if (isArray(args[1])) {\n // (value, array, sides, flag)\n z = jStat.zscore(args[0],args[1],args[3]);\n return (args[2] === 1) ?\n (jStat.normal.cdf(-Math.abs(z), 0, 1)) :\n (jStat.normal.cdf(-Math.abs(z), 0, 1)*2);\n } else {\n if (args.length > 2) {\n // (value, mean, sd, sides)\n z = jStat.zscore(args[0],args[1],args[2]);\n return (args[3] === 1) ?\n (jStat.normal.cdf(-Math.abs(z),0,1)) :\n (jStat.normal.cdf(-Math.abs(z),0,1)* 2);\n } else {\n // (zscore, sides)\n z = args[0];\n return (args[1] === 1) ?\n (jStat.normal.cdf(-Math.abs(z),0,1)) :\n (jStat.normal.cdf(-Math.abs(z),0,1)*2);\n }\n }\n }\n});\n\njStat.extend(jStat.fn, {\n zscore: function zscore(value, flag) {\n return (value - this.mean()) / this.stdev(flag);\n },\n\n ztest: function ztest(value, sides, flag) {\n var zscore = Math.abs(this.zscore(value, flag));\n return (sides === 1) ?\n (jStat.normal.cdf(-zscore, 0, 1)) :\n (jStat.normal.cdf(-zscore, 0, 1) * 2);\n }\n});\n\n// T Statistics\njStat.extend({\n // 2 parameter lists\n // (value, mean, sd, n)\n // (value, array)\n tscore: function tscore() {\n var args = slice.call(arguments);\n return (args.length === 4) ?\n ((args[0] - args[1]) / (args[2] / Math.sqrt(args[3]))) :\n ((args[0] - jStat.mean(args[1])) /\n (jStat.stdev(args[1], true) / Math.sqrt(args[1].length)));\n },\n\n // 3 different paramter lists:\n // (value, mean, sd, n, sides)\n // (tscore, n, sides)\n // (value, array, sides)\n ttest: function ttest() {\n var args = slice.call(arguments);\n var tscore;\n if (args.length === 5) {\n tscore = Math.abs(jStat.tscore(args[0], args[1], args[2], args[3]));\n return (args[4] === 1) ?\n (jStat.studentt.cdf(-tscore, args[3]-1)) :\n (jStat.studentt.cdf(-tscore, args[3]-1)*2);\n }\n if (isNumber(args[1])) {\n tscore = Math.abs(args[0])\n return (args[2] == 1) ?\n (jStat.studentt.cdf(-tscore, args[1]-1)) :\n (jStat.studentt.cdf(-tscore, args[1]-1) * 2);\n }\n tscore = Math.abs(jStat.tscore(args[0], args[1]))\n return (args[2] == 1) ?\n (jStat.studentt.cdf(-tscore, args[1].length-1)) :\n (jStat.studentt.cdf(-tscore, args[1].length-1) * 2);\n }\n});\n\njStat.extend(jStat.fn, {\n tscore: function tscore(value) {\n return (value - this.mean()) / (this.stdev(true) / Math.sqrt(this.cols()));\n },\n\n ttest: function ttest(value, sides) {\n return (sides === 1) ?\n (1 - jStat.studentt.cdf(Math.abs(this.tscore(value)), this.cols()-1)) :\n (jStat.studentt.cdf(-Math.abs(this.tscore(value)), this.cols()-1)*2);\n }\n});\n\n// F Statistics\njStat.extend({\n // Paramter list is as follows:\n // (array1, array2, array3, ...)\n // or it is an array of arrays\n // array of arrays conversion\n anovafscore: function anovafscore() {\n var args = slice.call(arguments),\n expVar, sample, sampMean, sampSampMean, tmpargs, unexpVar, i, j;\n if (args.length === 1) {\n tmpargs = new Array(args[0].length);\n for (i = 0; i < args[0].length; i++) {\n tmpargs[i] = args[0][i];\n }\n args = tmpargs;\n }\n // Builds sample array\n sample = new Array();\n for (i = 0; i < args.length; i++) {\n sample = sample.concat(args[i]);\n }\n sampMean = jStat.mean(sample);\n // Computes the explained variance\n expVar = 0;\n for (i = 0; i < args.length; i++) {\n expVar = expVar + args[i].length * Math.pow(jStat.mean(args[i]) - sampMean, 2);\n }\n expVar /= (args.length - 1);\n // Computes unexplained variance\n unexpVar = 0;\n for (i = 0; i < args.length; i++) {\n sampSampMean = jStat.mean(args[i]);\n for (j = 0; j < args[i].length; j++) {\n unexpVar += Math.pow(args[i][j] - sampSampMean, 2);\n }\n }\n unexpVar /= (sample.length - args.length);\n return expVar / unexpVar;\n },\n\n // 2 different paramter setups\n // (array1, array2, array3, ...)\n // (anovafscore, df1, df2)\n anovaftest: function anovaftest() {\n var args = slice.call(arguments),\n df1, df2, n, i;\n if (isNumber(args[0])) {\n return 1 - jStat.centralF.cdf(args[0], args[1], args[2]);\n }\n var anovafscore = jStat.anovafscore(args);\n df1 = args.length - 1;\n n = 0;\n for (i = 0; i < args.length; i++) {\n n = n + args[i].length;\n }\n df2 = n - df1 - 1;\n return 1 - jStat.centralF.cdf(anovafscore, df1, df2);\n },\n\n ftest: function ftest(fscore, df1, df2) {\n return 1 - jStat.centralF.cdf(fscore, df1, df2);\n }\n});\n\njStat.extend(jStat.fn, {\n anovafscore: function anovafscore() {\n return jStat.anovafscore(this.toArray());\n },\n\n anovaftes: function anovaftes() {\n var n = 0;\n var i;\n for (i = 0; i < this.length; i++) {\n n = n + this[i].length;\n }\n return jStat.ftest(this.anovafscore(), this.length - 1, n - this.length);\n }\n});\n\n// Tukey's range test\njStat.extend({\n // 2 parameter lists\n // (mean1, mean2, n1, n2, sd)\n // (array1, array2, sd)\n qscore: function qscore() {\n var args = slice.call(arguments);\n var mean1, mean2, n1, n2, sd;\n if (isNumber(args[0])) {\n mean1 = args[0];\n mean2 = args[1];\n n1 = args[2];\n n2 = args[3];\n sd = args[4];\n } else {\n mean1 = jStat.mean(args[0]);\n mean2 = jStat.mean(args[1]);\n n1 = args[0].length;\n n2 = args[1].length;\n sd = args[2];\n }\n return Math.abs(mean1 - mean2) / (sd * Math.sqrt((1 / n1 + 1 / n2) / 2));\n },\n\n // 3 different parameter lists:\n // (qscore, n, k)\n // (mean1, mean2, n1, n2, sd, n, k)\n // (array1, array2, sd, n, k)\n qtest: function qtest() {\n var args = slice.call(arguments);\n\n var qscore;\n if (args.length === 3) {\n qscore = args[0];\n args = args.slice(1);\n } else if (args.length === 7) {\n qscore = jStat.qscore(args[0], args[1], args[2], args[3], args[4]);\n args = args.slice(5);\n } else {\n qscore = jStat.qscore(args[0], args[1], args[2]);\n args = args.slice(3);\n }\n\n var n = args[0];\n var k = args[1];\n\n return 1 - jStat.tukey.cdf(qscore, k, n - k);\n },\n\n tukeyhsd: function tukeyhsd(arrays) {\n var sd = jStat.pooledstdev(arrays);\n var means = arrays.map(function (arr) {return jStat.mean(arr);});\n var n = arrays.reduce(function (n, arr) {return n + arr.length;}, 0);\n\n var results = [];\n for (var i = 0; i < arrays.length; ++i) {\n for (var j = i + 1; j < arrays.length; ++j) {\n var p = jStat.qtest(means[i], means[j], arrays[i].length, arrays[j].length, sd, n, arrays.length);\n results.push([[i, j], p]);\n }\n }\n\n return results;\n }\n});\n\n// Error Bounds\njStat.extend({\n // 2 different parameter setups\n // (value, alpha, sd, n)\n // (value, alpha, array)\n normalci: function normalci() {\n var args = slice.call(arguments),\n ans = new Array(2),\n change;\n if (args.length === 4) {\n change = Math.abs(jStat.normal.inv(args[1] / 2, 0, 1) *\n args[2] / Math.sqrt(args[3]));\n } else {\n change = Math.abs(jStat.normal.inv(args[1] / 2, 0, 1) *\n jStat.stdev(args[2]) / Math.sqrt(args[2].length));\n }\n ans[0] = args[0] - change;\n ans[1] = args[0] + change;\n return ans;\n },\n\n // 2 different parameter setups\n // (value, alpha, sd, n)\n // (value, alpha, array)\n tci: function tci() {\n var args = slice.call(arguments),\n ans = new Array(2),\n change;\n if (args.length === 4) {\n change = Math.abs(jStat.studentt.inv(args[1] / 2, args[3] - 1) *\n args[2] / Math.sqrt(args[3]));\n } else {\n change = Math.abs(jStat.studentt.inv(args[1] / 2, args[2].length - 1) *\n jStat.stdev(args[2], true) / Math.sqrt(args[2].length));\n }\n ans[0] = args[0] - change;\n ans[1] = args[0] + change;\n return ans;\n },\n\n significant: function significant(pvalue, alpha) {\n return pvalue < alpha;\n }\n});\n\njStat.extend(jStat.fn, {\n normalci: function normalci(value, alpha) {\n return jStat.normalci(value, alpha, this.toArray());\n },\n\n tci: function tci(value, alpha) {\n return jStat.tci(value, alpha, this.toArray());\n }\n});\n\n// internal method for calculating the z-score for a difference of proportions test\nfunction differenceOfProportions(p1, n1, p2, n2) {\n if (p1 > 1 || p2 > 1 || p1 <= 0 || p2 <= 0) {\n throw new Error(\"Proportions should be greater than 0 and less than 1\")\n }\n var pooled = (p1 * n1 + p2 * n2) / (n1 + n2);\n var se = Math.sqrt(pooled * (1 - pooled) * ((1/n1) + (1/n2)));\n return (p1 - p2) / se;\n}\n\n// Difference of Proportions\njStat.extend(jStat.fn, {\n oneSidedDifferenceOfProportions: function oneSidedDifferenceOfProportions(p1, n1, p2, n2) {\n var z = differenceOfProportions(p1, n1, p2, n2);\n return jStat.ztest(z, 1);\n },\n\n twoSidedDifferenceOfProportions: function twoSidedDifferenceOfProportions(p1, n1, p2, n2) {\n var z = differenceOfProportions(p1, n1, p2, n2);\n return jStat.ztest(z, 2);\n }\n});\n\n}(jStat, Math));\njStat.models = (function(){\n function sub_regress(exog) {\n var var_count = exog[0].length;\n var modelList = jStat.arange(var_count).map(function(endog_index) {\n var exog_index =\n jStat.arange(var_count).filter(function(i){return i!==endog_index});\n return ols(jStat.col(exog, endog_index).map(function(x){ return x[0] }),\n jStat.col(exog, exog_index))\n });\n return modelList;\n }\n\n // do OLS model regress\n // exog have include const columns ,it will not generate it .In fact, exog is\n // \"design matrix\" look at\n //https://en.wikipedia.org/wiki/Design_matrix\n function ols(endog, exog) {\n var nobs = endog.length;\n var df_model = exog[0].length - 1;\n var df_resid = nobs-df_model - 1;\n var coef = jStat.lstsq(exog, endog);\n var predict =\n jStat.multiply(exog, coef.map(function(x) { return [x] }))\n .map(function(p) { return p[0] });\n var resid = jStat.subtract(endog, predict);\n var ybar = jStat.mean(endog);\n // constant cause problem\n // var SST = jStat.sum(endog.map(function(y) {\n // return Math.pow(y-ybar,2);\n // }));\n var SSE = jStat.sum(predict.map(function(f) {\n return Math.pow(f - ybar, 2);\n }));\n var SSR = jStat.sum(endog.map(function(y, i) {\n return Math.pow(y - predict[i], 2);\n }));\n var SST = SSE + SSR;\n var R2 = (SSE / SST);\n return {\n exog:exog,\n endog:endog,\n nobs:nobs,\n df_model:df_model,\n df_resid:df_resid,\n coef:coef,\n predict:predict,\n resid:resid,\n ybar:ybar,\n SST:SST,\n SSE:SSE,\n SSR:SSR,\n R2:R2\n };\n }\n\n // H0: b_I=0\n // H1: b_I!=0\n function t_test(model) {\n var subModelList = sub_regress(model.exog);\n //var sigmaHat=jStat.stdev(model.resid);\n var sigmaHat = Math.sqrt(model.SSR / (model.df_resid));\n var seBetaHat = subModelList.map(function(mod) {\n var SST = mod.SST;\n var R2 = mod.R2;\n return sigmaHat / Math.sqrt(SST * (1 - R2));\n });\n var tStatistic = model.coef.map(function(coef, i) {\n return (coef - 0) / seBetaHat[i];\n });\n var pValue = tStatistic.map(function(t) {\n var leftppf = jStat.studentt.cdf(t, model.df_resid);\n return (leftppf > 0.5 ? 1 - leftppf : leftppf) * 2;\n });\n var c = jStat.studentt.inv(0.975, model.df_resid);\n var interval95 = model.coef.map(function(coef, i) {\n var d = c * seBetaHat[i];\n return [coef - d, coef + d];\n })\n return {\n se: seBetaHat,\n t: tStatistic,\n p: pValue,\n sigmaHat: sigmaHat,\n interval95: interval95\n };\n }\n\n function F_test(model) {\n var F_statistic =\n (model.R2 / model.df_model) / ((1 - model.R2) / model.df_resid);\n var fcdf = function(x, n1, n2) {\n return jStat.beta.cdf(x / (n2 / n1 + x), n1 / 2, n2 / 2)\n }\n var pvalue = 1 - fcdf(F_statistic, model.df_model, model.df_resid);\n return { F_statistic: F_statistic, pvalue: pvalue };\n }\n\n function ols_wrap(endog, exog) {\n var model = ols(endog,exog);\n var ttest = t_test(model);\n var ftest = F_test(model);\n // Provide the Wherry / Ezekiel / McNemar / Cohen Adjusted R^2\n // Which matches the 'adjusted R^2' provided by R's lm package\n var adjust_R2 =\n 1 - (1 - model.R2) * ((model.nobs - 1) / (model.df_resid));\n model.t = ttest;\n model.f = ftest;\n model.adjust_R2 = adjust_R2;\n return model;\n }\n\n return { ols: ols_wrap };\n})();\n//To regress, simply build X matrix\n//(append column of 1's) using\n//buildxmatrix and build the Y\n//matrix using buildymatrix\n//(simply the transpose)\n//and run regress.\n\n\n\n//Regressions\n\njStat.extend({\n buildxmatrix: function buildxmatrix(){\n //Parameters will be passed in as such\n //(array1,array2,array3,...)\n //as (x1,x2,x3,...)\n //needs to be (1,x1,x2,x3,...)\n var matrixRows = new Array(arguments.length);\n for(var i=0;i1){\n result = [];\n for (i = 0; i < A.rows(); i++) {\n result[i] = [];\n for (j = 0; j < B.cols(); j++) {\n sum = 0;\n for (k = 0; k < A.cols(); k++) {\n sum += A.toArray()[i][k] * B.toArray()[k][j];\n }\n result[i][j] = sum;\n }\n }\n return jStat(result);\n }\n result = [];\n for (i = 0; i < A.rows(); i++) {\n result[i] = [];\n for (j = 0; j < B.cols(); j++) {\n sum = 0;\n for (k = 0; k < A.cols(); k++) {\n sum += A.toArray()[i][k] * B.toArray()[j];\n }\n result[i][j] = sum;\n }\n }\n return jStat(result);\n }\n },\n\n //regress and regresst to be fixed\n\n regress: function regress(jMatX,jMatY){\n //print(\"regressin!\");\n //print(jMatX.toArray());\n var innerinv = jStat.xtranspxinv(jMatX);\n //print(innerinv);\n var xtransp = jMatX.transpose();\n var next = jStat.matrixmult(jStat(innerinv),xtransp);\n return jStat.matrixmult(next,jMatY);\n\n },\n\n regresst: function regresst(jMatX,jMatY,sides){\n var beta = jStat.regress(jMatX,jMatY);\n\n var compile = {};\n compile.anova = {};\n var jMatYBar = jStat.jMatYBar(jMatX, beta);\n compile.yBar = jMatYBar;\n var yAverage = jMatY.mean();\n compile.anova.residuals = jStat.residuals(jMatY, jMatYBar);\n\n compile.anova.ssr = jStat.ssr(jMatYBar, yAverage);\n compile.anova.msr = compile.anova.ssr / (jMatX[0].length - 1);\n\n compile.anova.sse = jStat.sse(jMatY, jMatYBar);\n compile.anova.mse =\n compile.anova.sse / (jMatY.length - (jMatX[0].length - 1) - 1);\n\n compile.anova.sst = jStat.sst(jMatY, yAverage);\n compile.anova.mst = compile.anova.sst / (jMatY.length - 1);\n\n compile.anova.r2 = 1 - (compile.anova.sse / compile.anova.sst);\n if (compile.anova.r2 < 0) compile.anova.r2 = 0;\n\n compile.anova.fratio = compile.anova.msr / compile.anova.mse;\n compile.anova.pvalue =\n jStat.anovaftest(compile.anova.fratio,\n jMatX[0].length - 1,\n jMatY.length - (jMatX[0].length - 1) - 1);\n\n compile.anova.rmse = Math.sqrt(compile.anova.mse);\n\n compile.anova.r2adj = 1 - (compile.anova.mse / compile.anova.mst);\n if (compile.anova.r2adj < 0) compile.anova.r2adj = 0;\n\n compile.stats = new Array(jMatX[0].length);\n var covar = jStat.xtranspxinv(jMatX);\n var sds, ts, ps;\n\n for(var i=0; i Occurrence Index bitmap.\n// YYYY -> DSL Method Type bitmap.\n// ZZZZZZZZZZZZZZZ -> Rule short Index bitmap.\n// TTTTTTTTT -> alternation alternative index bitmap\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getKeyForAutomaticLookahead = exports.AT_LEAST_ONE_SEP_IDX = exports.MANY_SEP_IDX = exports.AT_LEAST_ONE_IDX = exports.MANY_IDX = exports.OPTION_IDX = exports.OR_IDX = exports.BITS_FOR_ALT_IDX = exports.BITS_FOR_RULE_IDX = exports.BITS_FOR_OCCURRENCE_IDX = exports.BITS_FOR_METHOD_TYPE = void 0;\nexports.BITS_FOR_METHOD_TYPE = 4;\nexports.BITS_FOR_OCCURRENCE_IDX = 8;\nexports.BITS_FOR_RULE_IDX = 12;\n// TODO: validation, this means that there may at most 2^8 --> 256 alternatives for an alternation.\nexports.BITS_FOR_ALT_IDX = 8;\n// short string used as part of mapping keys.\n// being short improves the performance when composing KEYS for maps out of these\n// The 5 - 8 bits (16 possible values, are reserved for the DSL method indices)\nexports.OR_IDX = 1 << exports.BITS_FOR_OCCURRENCE_IDX;\nexports.OPTION_IDX = 2 << exports.BITS_FOR_OCCURRENCE_IDX;\nexports.MANY_IDX = 3 << exports.BITS_FOR_OCCURRENCE_IDX;\nexports.AT_LEAST_ONE_IDX = 4 << exports.BITS_FOR_OCCURRENCE_IDX;\nexports.MANY_SEP_IDX = 5 << exports.BITS_FOR_OCCURRENCE_IDX;\nexports.AT_LEAST_ONE_SEP_IDX = 6 << exports.BITS_FOR_OCCURRENCE_IDX;\n// this actually returns a number, but it is always used as a string (object prop key)\nfunction getKeyForAutomaticLookahead(ruleIdx, dslMethodIdx, occurrence) {\n return occurrence | dslMethodIdx | ruleIdx;\n}\nexports.getKeyForAutomaticLookahead = getKeyForAutomaticLookahead;\nvar BITS_START_FOR_ALT_IDX = 32 - exports.BITS_FOR_ALT_IDX;\n//# sourceMappingURL=keys.js.map","var Stack = require('./_Stack'),\n equalArrays = require('./_equalArrays'),\n equalByTag = require('./_equalByTag'),\n equalObjects = require('./_equalObjects'),\n getTag = require('./_getTag'),\n isArray = require('./isArray'),\n isBuffer = require('./isBuffer'),\n isTypedArray = require('./isTypedArray');\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1;\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n arrayTag = '[object Array]',\n objectTag = '[object Object]';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * A specialized version of `baseIsEqual` for arrays and objects which performs\n * deep comparisons and tracks traversed objects enabling objects with circular\n * references to be compared.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} [stack] Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) {\n var objIsArr = isArray(object),\n othIsArr = isArray(other),\n objTag = objIsArr ? arrayTag : getTag(object),\n othTag = othIsArr ? arrayTag : getTag(other);\n\n objTag = objTag == argsTag ? objectTag : objTag;\n othTag = othTag == argsTag ? objectTag : othTag;\n\n var objIsObj = objTag == objectTag,\n othIsObj = othTag == objectTag,\n isSameTag = objTag == othTag;\n\n if (isSameTag && isBuffer(object)) {\n if (!isBuffer(other)) {\n return false;\n }\n objIsArr = true;\n objIsObj = false;\n }\n if (isSameTag && !objIsObj) {\n stack || (stack = new Stack);\n return (objIsArr || isTypedArray(object))\n ? equalArrays(object, other, bitmask, customizer, equalFunc, stack)\n : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack);\n }\n if (!(bitmask & COMPARE_PARTIAL_FLAG)) {\n var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),\n othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');\n\n if (objIsWrapped || othIsWrapped) {\n var objUnwrapped = objIsWrapped ? object.value() : object,\n othUnwrapped = othIsWrapped ? other.value() : other;\n\n stack || (stack = new Stack);\n return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack);\n }\n }\n if (!isSameTag) {\n return false;\n }\n stack || (stack = new Stack);\n return equalObjects(object, other, bitmask, customizer, equalFunc, stack);\n}\n\nmodule.exports = baseIsEqualDeep;\n","var baseIsTypedArray = require('./_baseIsTypedArray'),\n baseUnary = require('./_baseUnary'),\n nodeUtil = require('./_nodeUtil');\n\n/* Node.js helper references. */\nvar nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;\n\n/**\n * Checks if `value` is classified as a typed array.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n * @example\n *\n * _.isTypedArray(new Uint8Array);\n * // => true\n *\n * _.isTypedArray([]);\n * // => false\n */\nvar isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;\n\nmodule.exports = isTypedArray;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.applyMixins = void 0;\nfunction applyMixins(derivedCtor, baseCtors) {\n baseCtors.forEach(function (baseCtor) {\n var baseProto = baseCtor.prototype;\n Object.getOwnPropertyNames(baseProto).forEach(function (propName) {\n if (propName === \"constructor\") {\n return;\n }\n var basePropDescriptor = Object.getOwnPropertyDescriptor(baseProto, propName);\n // Handle Accessors\n if (basePropDescriptor &&\n (basePropDescriptor.get || basePropDescriptor.set)) {\n Object.defineProperty(derivedCtor.prototype, propName, basePropDescriptor);\n }\n else {\n derivedCtor.prototype[propName] = baseCtor.prototype[propName];\n }\n });\n });\n}\nexports.applyMixins = applyMixins;\n//# sourceMappingURL=apply_mixins.js.map","/**\n * A specialized version of `matchesProperty` for source values suitable\n * for strict equality comparisons, i.e. `===`.\n *\n * @private\n * @param {string} key The key of the property to get.\n * @param {*} srcValue The value to match.\n * @returns {Function} Returns the new spec function.\n */\nfunction matchesStrictComparable(key, srcValue) {\n return function(object) {\n if (object == null) {\n return false;\n }\n return object[key] === srcValue &&\n (srcValue !== undefined || (key in Object(object)));\n };\n}\n\nmodule.exports = matchesStrictComparable;\n","var cloneArrayBuffer = require('./_cloneArrayBuffer'),\n cloneDataView = require('./_cloneDataView'),\n cloneRegExp = require('./_cloneRegExp'),\n cloneSymbol = require('./_cloneSymbol'),\n cloneTypedArray = require('./_cloneTypedArray');\n\n/** `Object#toString` result references. */\nvar boolTag = '[object Boolean]',\n dateTag = '[object Date]',\n mapTag = '[object Map]',\n numberTag = '[object Number]',\n regexpTag = '[object RegExp]',\n setTag = '[object Set]',\n stringTag = '[object String]',\n symbolTag = '[object Symbol]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n dataViewTag = '[object DataView]',\n float32Tag = '[object Float32Array]',\n float64Tag = '[object Float64Array]',\n int8Tag = '[object Int8Array]',\n int16Tag = '[object Int16Array]',\n int32Tag = '[object Int32Array]',\n uint8Tag = '[object Uint8Array]',\n uint8ClampedTag = '[object Uint8ClampedArray]',\n uint16Tag = '[object Uint16Array]',\n uint32Tag = '[object Uint32Array]';\n\n/**\n * Initializes an object clone based on its `toStringTag`.\n *\n * **Note:** This function only supports cloning values with tags of\n * `Boolean`, `Date`, `Error`, `Map`, `Number`, `RegExp`, `Set`, or `String`.\n *\n * @private\n * @param {Object} object The object to clone.\n * @param {string} tag The `toStringTag` of the object to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the initialized clone.\n */\nfunction initCloneByTag(object, tag, isDeep) {\n var Ctor = object.constructor;\n switch (tag) {\n case arrayBufferTag:\n return cloneArrayBuffer(object);\n\n case boolTag:\n case dateTag:\n return new Ctor(+object);\n\n case dataViewTag:\n return cloneDataView(object, isDeep);\n\n case float32Tag: case float64Tag:\n case int8Tag: case int16Tag: case int32Tag:\n case uint8Tag: case uint8ClampedTag: case uint16Tag: case uint32Tag:\n return cloneTypedArray(object, isDeep);\n\n case mapTag:\n return new Ctor;\n\n case numberTag:\n case stringTag:\n return new Ctor(object);\n\n case regexpTag:\n return cloneRegExp(object);\n\n case setTag:\n return new Ctor;\n\n case symbolTag:\n return cloneSymbol(object);\n }\n}\n\nmodule.exports = initCloneByTag;\n","\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.RecognizerEngine = void 0;\nvar isEmpty_1 = __importDefault(require(\"lodash/isEmpty\"));\nvar isArray_1 = __importDefault(require(\"lodash/isArray\"));\nvar flatten_1 = __importDefault(require(\"lodash/flatten\"));\nvar every_1 = __importDefault(require(\"lodash/every\"));\nvar uniq_1 = __importDefault(require(\"lodash/uniq\"));\nvar isObject_1 = __importDefault(require(\"lodash/isObject\"));\nvar has_1 = __importDefault(require(\"lodash/has\"));\nvar values_1 = __importDefault(require(\"lodash/values\"));\nvar reduce_1 = __importDefault(require(\"lodash/reduce\"));\nvar clone_1 = __importDefault(require(\"lodash/clone\"));\nvar keys_1 = require(\"../../grammar/keys\");\nvar exceptions_public_1 = require(\"../../exceptions_public\");\nvar lookahead_1 = require(\"../../grammar/lookahead\");\nvar interpreter_1 = require(\"../../grammar/interpreter\");\nvar parser_1 = require(\"../parser\");\nvar recoverable_1 = require(\"./recoverable\");\nvar tokens_public_1 = require(\"../../../scan/tokens_public\");\nvar tokens_1 = require(\"../../../scan/tokens\");\n/**\n * This trait is responsible for the runtime parsing engine\n * Used by the official API (recognizer_api.ts)\n */\nvar RecognizerEngine = /** @class */ (function () {\n function RecognizerEngine() {\n }\n RecognizerEngine.prototype.initRecognizerEngine = function (tokenVocabulary, config) {\n this.className = this.constructor.name;\n // TODO: would using an ES6 Map or plain object be faster (CST building scenario)\n this.shortRuleNameToFull = {};\n this.fullRuleNameToShort = {};\n this.ruleShortNameIdx = 256;\n this.tokenMatcher = tokens_1.tokenStructuredMatcherNoCategories;\n this.subruleIdx = 0;\n this.definedRulesNames = [];\n this.tokensMap = {};\n this.isBackTrackingStack = [];\n this.RULE_STACK = [];\n this.RULE_OCCURRENCE_STACK = [];\n this.gastProductionsCache = {};\n if ((0, has_1.default)(config, \"serializedGrammar\")) {\n throw Error(\"The Parser's configuration can no longer contain a property.\\n\" +\n \"\\tSee: https://chevrotain.io/docs/changes/BREAKING_CHANGES.html#_6-0-0\\n\" +\n \"\\tFor Further details.\");\n }\n if ((0, isArray_1.default)(tokenVocabulary)) {\n // This only checks for Token vocabularies provided as arrays.\n // That is good enough because the main objective is to detect users of pre-V4.0 APIs\n // rather than all edge cases of empty Token vocabularies.\n if ((0, isEmpty_1.default)(tokenVocabulary)) {\n throw Error(\"A Token Vocabulary cannot be empty.\\n\" +\n \"\\tNote that the first argument for the parser constructor\\n\" +\n \"\\tis no longer a Token vector (since v4.0).\");\n }\n if (typeof tokenVocabulary[0].startOffset === \"number\") {\n throw Error(\"The Parser constructor no longer accepts a token vector as the first argument.\\n\" +\n \"\\tSee: https://chevrotain.io/docs/changes/BREAKING_CHANGES.html#_4-0-0\\n\" +\n \"\\tFor Further details.\");\n }\n }\n if ((0, isArray_1.default)(tokenVocabulary)) {\n this.tokensMap = (0, reduce_1.default)(tokenVocabulary, function (acc, tokType) {\n acc[tokType.name] = tokType;\n return acc;\n }, {});\n }\n else if ((0, has_1.default)(tokenVocabulary, \"modes\") &&\n (0, every_1.default)((0, flatten_1.default)((0, values_1.default)(tokenVocabulary.modes)), tokens_1.isTokenType)) {\n var allTokenTypes_1 = (0, flatten_1.default)((0, values_1.default)(tokenVocabulary.modes));\n var uniqueTokens = (0, uniq_1.default)(allTokenTypes_1);\n this.tokensMap = (0, reduce_1.default)(uniqueTokens, function (acc, tokType) {\n acc[tokType.name] = tokType;\n return acc;\n }, {});\n }\n else if ((0, isObject_1.default)(tokenVocabulary)) {\n this.tokensMap = (0, clone_1.default)(tokenVocabulary);\n }\n else {\n throw new Error(\" argument must be An Array of Token constructors,\" +\n \" A dictionary of Token constructors or an IMultiModeLexerDefinition\");\n }\n // always add EOF to the tokenNames -> constructors map. it is useful to assure all the input has been\n // parsed with a clear error message (\"expecting EOF but found ...\")\n this.tokensMap[\"EOF\"] = tokens_public_1.EOF;\n var allTokenTypes = (0, has_1.default)(tokenVocabulary, \"modes\")\n ? (0, flatten_1.default)((0, values_1.default)(tokenVocabulary.modes))\n : (0, values_1.default)(tokenVocabulary);\n var noTokenCategoriesUsed = (0, every_1.default)(allTokenTypes, function (tokenConstructor) {\n return (0, isEmpty_1.default)(tokenConstructor.categoryMatches);\n });\n this.tokenMatcher = noTokenCategoriesUsed\n ? tokens_1.tokenStructuredMatcherNoCategories\n : tokens_1.tokenStructuredMatcher;\n // Because ES2015+ syntax should be supported for creating Token classes\n // We cannot assume that the Token classes were created using the \"extendToken\" utilities\n // Therefore we must augment the Token classes both on Lexer initialization and on Parser initialization\n (0, tokens_1.augmentTokenTypes)((0, values_1.default)(this.tokensMap));\n };\n RecognizerEngine.prototype.defineRule = function (ruleName, impl, config) {\n if (this.selfAnalysisDone) {\n throw Error(\"Grammar rule <\".concat(ruleName, \"> may not be defined after the 'performSelfAnalysis' method has been called'\\n\") +\n \"Make sure that all grammar rule definitions are done before 'performSelfAnalysis' is called.\");\n }\n var resyncEnabled = (0, has_1.default)(config, \"resyncEnabled\")\n ? config.resyncEnabled // assumes end user provides the correct config value/type\n : parser_1.DEFAULT_RULE_CONFIG.resyncEnabled;\n var recoveryValueFunc = (0, has_1.default)(config, \"recoveryValueFunc\")\n ? config.recoveryValueFunc // assumes end user provides the correct config value/type\n : parser_1.DEFAULT_RULE_CONFIG.recoveryValueFunc;\n // performance optimization: Use small integers as keys for the longer human readable \"full\" rule names.\n // this greatly improves Map access time (as much as 8% for some performance benchmarks).\n var shortName = this.ruleShortNameIdx << (keys_1.BITS_FOR_METHOD_TYPE + keys_1.BITS_FOR_OCCURRENCE_IDX);\n this.ruleShortNameIdx++;\n this.shortRuleNameToFull[shortName] = ruleName;\n this.fullRuleNameToShort[ruleName] = shortName;\n var invokeRuleWithTry;\n // Micro optimization, only check the condition **once** on rule definition\n // instead of **every single** rule invocation.\n if (this.outputCst === true) {\n invokeRuleWithTry = function invokeRuleWithTry() {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n try {\n this.ruleInvocationStateUpdate(shortName, ruleName, this.subruleIdx);\n impl.apply(this, args);\n var cst = this.CST_STACK[this.CST_STACK.length - 1];\n this.cstPostRule(cst);\n return cst;\n }\n catch (e) {\n return this.invokeRuleCatch(e, resyncEnabled, recoveryValueFunc);\n }\n finally {\n this.ruleFinallyStateUpdate();\n }\n };\n }\n else {\n invokeRuleWithTry = function invokeRuleWithTryCst() {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n try {\n this.ruleInvocationStateUpdate(shortName, ruleName, this.subruleIdx);\n return impl.apply(this, args);\n }\n catch (e) {\n return this.invokeRuleCatch(e, resyncEnabled, recoveryValueFunc);\n }\n finally {\n this.ruleFinallyStateUpdate();\n }\n };\n }\n var wrappedGrammarRule = Object.assign(invokeRuleWithTry, { ruleName: ruleName, originalGrammarAction: impl });\n return wrappedGrammarRule;\n };\n RecognizerEngine.prototype.invokeRuleCatch = function (e, resyncEnabledConfig, recoveryValueFunc) {\n var isFirstInvokedRule = this.RULE_STACK.length === 1;\n // note the reSync is always enabled for the first rule invocation, because we must always be able to\n // reSync with EOF and just output some INVALID ParseTree\n // during backtracking reSync recovery is disabled, otherwise we can't be certain the backtracking\n // path is really the most valid one\n var reSyncEnabled = resyncEnabledConfig && !this.isBackTracking() && this.recoveryEnabled;\n if ((0, exceptions_public_1.isRecognitionException)(e)) {\n var recogError = e;\n if (reSyncEnabled) {\n var reSyncTokType = this.findReSyncTokenType();\n if (this.isInCurrentRuleReSyncSet(reSyncTokType)) {\n recogError.resyncedTokens = this.reSyncTo(reSyncTokType);\n if (this.outputCst) {\n var partialCstResult = this.CST_STACK[this.CST_STACK.length - 1];\n partialCstResult.recoveredNode = true;\n return partialCstResult;\n }\n else {\n return recoveryValueFunc(e);\n }\n }\n else {\n if (this.outputCst) {\n var partialCstResult = this.CST_STACK[this.CST_STACK.length - 1];\n partialCstResult.recoveredNode = true;\n recogError.partialCstResult = partialCstResult;\n }\n // to be handled Further up the call stack\n throw recogError;\n }\n }\n else if (isFirstInvokedRule) {\n // otherwise a Redundant input error will be created as well and we cannot guarantee that this is indeed the case\n this.moveToTerminatedState();\n // the parser should never throw one of its own errors outside its flow.\n // even if error recovery is disabled\n return recoveryValueFunc(e);\n }\n else {\n // to be recovered Further up the call stack\n throw recogError;\n }\n }\n else {\n // some other Error type which we don't know how to handle (for example a built in JavaScript Error)\n throw e;\n }\n };\n // Implementation of parsing DSL\n RecognizerEngine.prototype.optionInternal = function (actionORMethodDef, occurrence) {\n var key = this.getKeyForAutomaticLookahead(keys_1.OPTION_IDX, occurrence);\n return this.optionInternalLogic(actionORMethodDef, occurrence, key);\n };\n RecognizerEngine.prototype.optionInternalLogic = function (actionORMethodDef, occurrence, key) {\n var _this = this;\n var lookAheadFunc = this.getLaFuncFromCache(key);\n var action;\n if (typeof actionORMethodDef !== \"function\") {\n action = actionORMethodDef.DEF;\n var predicate_1 = actionORMethodDef.GATE;\n // predicate present\n if (predicate_1 !== undefined) {\n var orgLookaheadFunction_1 = lookAheadFunc;\n lookAheadFunc = function () {\n return predicate_1.call(_this) && orgLookaheadFunction_1.call(_this);\n };\n }\n }\n else {\n action = actionORMethodDef;\n }\n if (lookAheadFunc.call(this) === true) {\n return action.call(this);\n }\n return undefined;\n };\n RecognizerEngine.prototype.atLeastOneInternal = function (prodOccurrence, actionORMethodDef) {\n var laKey = this.getKeyForAutomaticLookahead(keys_1.AT_LEAST_ONE_IDX, prodOccurrence);\n return this.atLeastOneInternalLogic(prodOccurrence, actionORMethodDef, laKey);\n };\n RecognizerEngine.prototype.atLeastOneInternalLogic = function (prodOccurrence, actionORMethodDef, key) {\n var _this = this;\n var lookAheadFunc = this.getLaFuncFromCache(key);\n var action;\n if (typeof actionORMethodDef !== \"function\") {\n action = actionORMethodDef.DEF;\n var predicate_2 = actionORMethodDef.GATE;\n // predicate present\n if (predicate_2 !== undefined) {\n var orgLookaheadFunction_2 = lookAheadFunc;\n lookAheadFunc = function () {\n return predicate_2.call(_this) && orgLookaheadFunction_2.call(_this);\n };\n }\n }\n else {\n action = actionORMethodDef;\n }\n if (lookAheadFunc.call(this) === true) {\n var notStuck = this.doSingleRepetition(action);\n while (lookAheadFunc.call(this) === true &&\n notStuck === true) {\n notStuck = this.doSingleRepetition(action);\n }\n }\n else {\n throw this.raiseEarlyExitException(prodOccurrence, lookahead_1.PROD_TYPE.REPETITION_MANDATORY, actionORMethodDef.ERR_MSG);\n }\n // note that while it may seem that this can cause an error because by using a recursive call to\n // AT_LEAST_ONE we change the grammar to AT_LEAST_TWO, AT_LEAST_THREE ... , the possible recursive call\n // from the tryInRepetitionRecovery(...) will only happen IFF there really are TWO/THREE/.... items.\n // Performance optimization: \"attemptInRepetitionRecovery\" will be defined as NOOP unless recovery is enabled\n this.attemptInRepetitionRecovery(this.atLeastOneInternal, [prodOccurrence, actionORMethodDef], lookAheadFunc, keys_1.AT_LEAST_ONE_IDX, prodOccurrence, interpreter_1.NextTerminalAfterAtLeastOneWalker);\n };\n RecognizerEngine.prototype.atLeastOneSepFirstInternal = function (prodOccurrence, options) {\n var laKey = this.getKeyForAutomaticLookahead(keys_1.AT_LEAST_ONE_SEP_IDX, prodOccurrence);\n this.atLeastOneSepFirstInternalLogic(prodOccurrence, options, laKey);\n };\n RecognizerEngine.prototype.atLeastOneSepFirstInternalLogic = function (prodOccurrence, options, key) {\n var _this = this;\n var action = options.DEF;\n var separator = options.SEP;\n var firstIterationLookaheadFunc = this.getLaFuncFromCache(key);\n // 1st iteration\n if (firstIterationLookaheadFunc.call(this) === true) {\n ;\n action.call(this);\n // TODO: Optimization can move this function construction into \"attemptInRepetitionRecovery\"\n // because it is only needed in error recovery scenarios.\n var separatorLookAheadFunc = function () {\n return _this.tokenMatcher(_this.LA(1), separator);\n };\n // 2nd..nth iterations\n while (this.tokenMatcher(this.LA(1), separator) === true) {\n // note that this CONSUME will never enter recovery because\n // the separatorLookAheadFunc checks that the separator really does exist.\n this.CONSUME(separator);\n action.call(this);\n }\n // Performance optimization: \"attemptInRepetitionRecovery\" will be defined as NOOP unless recovery is enabled\n this.attemptInRepetitionRecovery(this.repetitionSepSecondInternal, [\n prodOccurrence,\n separator,\n separatorLookAheadFunc,\n action,\n interpreter_1.NextTerminalAfterAtLeastOneSepWalker\n ], separatorLookAheadFunc, keys_1.AT_LEAST_ONE_SEP_IDX, prodOccurrence, interpreter_1.NextTerminalAfterAtLeastOneSepWalker);\n }\n else {\n throw this.raiseEarlyExitException(prodOccurrence, lookahead_1.PROD_TYPE.REPETITION_MANDATORY_WITH_SEPARATOR, options.ERR_MSG);\n }\n };\n RecognizerEngine.prototype.manyInternal = function (prodOccurrence, actionORMethodDef) {\n var laKey = this.getKeyForAutomaticLookahead(keys_1.MANY_IDX, prodOccurrence);\n return this.manyInternalLogic(prodOccurrence, actionORMethodDef, laKey);\n };\n RecognizerEngine.prototype.manyInternalLogic = function (prodOccurrence, actionORMethodDef, key) {\n var _this = this;\n var lookaheadFunction = this.getLaFuncFromCache(key);\n var action;\n if (typeof actionORMethodDef !== \"function\") {\n action = actionORMethodDef.DEF;\n var predicate_3 = actionORMethodDef.GATE;\n // predicate present\n if (predicate_3 !== undefined) {\n var orgLookaheadFunction_3 = lookaheadFunction;\n lookaheadFunction = function () {\n return predicate_3.call(_this) && orgLookaheadFunction_3.call(_this);\n };\n }\n }\n else {\n action = actionORMethodDef;\n }\n var notStuck = true;\n while (lookaheadFunction.call(this) === true && notStuck === true) {\n notStuck = this.doSingleRepetition(action);\n }\n // Performance optimization: \"attemptInRepetitionRecovery\" will be defined as NOOP unless recovery is enabled\n this.attemptInRepetitionRecovery(this.manyInternal, [prodOccurrence, actionORMethodDef], lookaheadFunction, keys_1.MANY_IDX, prodOccurrence, interpreter_1.NextTerminalAfterManyWalker, \n // The notStuck parameter is only relevant when \"attemptInRepetitionRecovery\"\n // is invoked from manyInternal, in the MANY_SEP case and AT_LEAST_ONE[_SEP]\n // An infinite loop cannot occur as:\n // - Either the lookahead is guaranteed to consume something (Single Token Separator)\n // - AT_LEAST_ONE by definition is guaranteed to consume something (or error out).\n notStuck);\n };\n RecognizerEngine.prototype.manySepFirstInternal = function (prodOccurrence, options) {\n var laKey = this.getKeyForAutomaticLookahead(keys_1.MANY_SEP_IDX, prodOccurrence);\n this.manySepFirstInternalLogic(prodOccurrence, options, laKey);\n };\n RecognizerEngine.prototype.manySepFirstInternalLogic = function (prodOccurrence, options, key) {\n var _this = this;\n var action = options.DEF;\n var separator = options.SEP;\n var firstIterationLaFunc = this.getLaFuncFromCache(key);\n // 1st iteration\n if (firstIterationLaFunc.call(this) === true) {\n action.call(this);\n var separatorLookAheadFunc = function () {\n return _this.tokenMatcher(_this.LA(1), separator);\n };\n // 2nd..nth iterations\n while (this.tokenMatcher(this.LA(1), separator) === true) {\n // note that this CONSUME will never enter recovery because\n // the separatorLookAheadFunc checks that the separator really does exist.\n this.CONSUME(separator);\n // No need for checking infinite loop here due to consuming the separator.\n action.call(this);\n }\n // Performance optimization: \"attemptInRepetitionRecovery\" will be defined as NOOP unless recovery is enabled\n this.attemptInRepetitionRecovery(this.repetitionSepSecondInternal, [\n prodOccurrence,\n separator,\n separatorLookAheadFunc,\n action,\n interpreter_1.NextTerminalAfterManySepWalker\n ], separatorLookAheadFunc, keys_1.MANY_SEP_IDX, prodOccurrence, interpreter_1.NextTerminalAfterManySepWalker);\n }\n };\n RecognizerEngine.prototype.repetitionSepSecondInternal = function (prodOccurrence, separator, separatorLookAheadFunc, action, nextTerminalAfterWalker) {\n while (separatorLookAheadFunc()) {\n // note that this CONSUME will never enter recovery because\n // the separatorLookAheadFunc checks that the separator really does exist.\n this.CONSUME(separator);\n action.call(this);\n }\n // we can only arrive to this function after an error\n // has occurred (hence the name 'second') so the following\n // IF will always be entered, its possible to remove it...\n // however it is kept to avoid confusion and be consistent.\n // Performance optimization: \"attemptInRepetitionRecovery\" will be defined as NOOP unless recovery is enabled\n /* istanbul ignore else */\n this.attemptInRepetitionRecovery(this.repetitionSepSecondInternal, [\n prodOccurrence,\n separator,\n separatorLookAheadFunc,\n action,\n nextTerminalAfterWalker\n ], separatorLookAheadFunc, keys_1.AT_LEAST_ONE_SEP_IDX, prodOccurrence, nextTerminalAfterWalker);\n };\n RecognizerEngine.prototype.doSingleRepetition = function (action) {\n var beforeIteration = this.getLexerPosition();\n action.call(this);\n var afterIteration = this.getLexerPosition();\n // This boolean will indicate if this repetition progressed\n // or if we are \"stuck\" (potential infinite loop in the repetition).\n return afterIteration > beforeIteration;\n };\n RecognizerEngine.prototype.orInternal = function (altsOrOpts, occurrence) {\n var laKey = this.getKeyForAutomaticLookahead(keys_1.OR_IDX, occurrence);\n var alts = (0, isArray_1.default)(altsOrOpts) ? altsOrOpts : altsOrOpts.DEF;\n var laFunc = this.getLaFuncFromCache(laKey);\n var altIdxToTake = laFunc.call(this, alts);\n if (altIdxToTake !== undefined) {\n var chosenAlternative = alts[altIdxToTake];\n return chosenAlternative.ALT.call(this);\n }\n this.raiseNoAltException(occurrence, altsOrOpts.ERR_MSG);\n };\n RecognizerEngine.prototype.ruleFinallyStateUpdate = function () {\n this.RULE_STACK.pop();\n this.RULE_OCCURRENCE_STACK.pop();\n // NOOP when cst is disabled\n this.cstFinallyStateUpdate();\n if (this.RULE_STACK.length === 0 && this.isAtEndOfInput() === false) {\n var firstRedundantTok = this.LA(1);\n var errMsg = this.errorMessageProvider.buildNotAllInputParsedMessage({\n firstRedundant: firstRedundantTok,\n ruleName: this.getCurrRuleFullName()\n });\n this.SAVE_ERROR(new exceptions_public_1.NotAllInputParsedException(errMsg, firstRedundantTok));\n }\n };\n RecognizerEngine.prototype.subruleInternal = function (ruleToCall, idx, options) {\n var ruleResult;\n try {\n var args = options !== undefined ? options.ARGS : undefined;\n this.subruleIdx = idx;\n ruleResult = ruleToCall.apply(this, args);\n this.cstPostNonTerminal(ruleResult, options !== undefined && options.LABEL !== undefined\n ? options.LABEL\n : ruleToCall.ruleName);\n return ruleResult;\n }\n catch (e) {\n throw this.subruleInternalError(e, options, ruleToCall.ruleName);\n }\n };\n RecognizerEngine.prototype.subruleInternalError = function (e, options, ruleName) {\n if ((0, exceptions_public_1.isRecognitionException)(e) && e.partialCstResult !== undefined) {\n this.cstPostNonTerminal(e.partialCstResult, options !== undefined && options.LABEL !== undefined\n ? options.LABEL\n : ruleName);\n delete e.partialCstResult;\n }\n throw e;\n };\n RecognizerEngine.prototype.consumeInternal = function (tokType, idx, options) {\n var consumedToken;\n try {\n var nextToken = this.LA(1);\n if (this.tokenMatcher(nextToken, tokType) === true) {\n this.consumeToken();\n consumedToken = nextToken;\n }\n else {\n this.consumeInternalError(tokType, nextToken, options);\n }\n }\n catch (eFromConsumption) {\n consumedToken = this.consumeInternalRecovery(tokType, idx, eFromConsumption);\n }\n this.cstPostTerminal(options !== undefined && options.LABEL !== undefined\n ? options.LABEL\n : tokType.name, consumedToken);\n return consumedToken;\n };\n RecognizerEngine.prototype.consumeInternalError = function (tokType, nextToken, options) {\n var msg;\n var previousToken = this.LA(0);\n if (options !== undefined && options.ERR_MSG) {\n msg = options.ERR_MSG;\n }\n else {\n msg = this.errorMessageProvider.buildMismatchTokenMessage({\n expected: tokType,\n actual: nextToken,\n previous: previousToken,\n ruleName: this.getCurrRuleFullName()\n });\n }\n throw this.SAVE_ERROR(new exceptions_public_1.MismatchedTokenException(msg, nextToken, previousToken));\n };\n RecognizerEngine.prototype.consumeInternalRecovery = function (tokType, idx, eFromConsumption) {\n // no recovery allowed during backtracking, otherwise backtracking may recover invalid syntax and accept it\n // but the original syntax could have been parsed successfully without any backtracking + recovery\n if (this.recoveryEnabled &&\n // TODO: more robust checking of the exception type. Perhaps Typescript extending expressions?\n eFromConsumption.name === \"MismatchedTokenException\" &&\n !this.isBackTracking()) {\n var follows = this.getFollowsForInRuleRecovery(tokType, idx);\n try {\n return this.tryInRuleRecovery(tokType, follows);\n }\n catch (eFromInRuleRecovery) {\n if (eFromInRuleRecovery.name === recoverable_1.IN_RULE_RECOVERY_EXCEPTION) {\n // failed in RuleRecovery.\n // throw the original error in order to trigger reSync error recovery\n throw eFromConsumption;\n }\n else {\n throw eFromInRuleRecovery;\n }\n }\n }\n else {\n throw eFromConsumption;\n }\n };\n RecognizerEngine.prototype.saveRecogState = function () {\n // errors is a getter which will clone the errors array\n var savedErrors = this.errors;\n var savedRuleStack = (0, clone_1.default)(this.RULE_STACK);\n return {\n errors: savedErrors,\n lexerState: this.exportLexerState(),\n RULE_STACK: savedRuleStack,\n CST_STACK: this.CST_STACK\n };\n };\n RecognizerEngine.prototype.reloadRecogState = function (newState) {\n this.errors = newState.errors;\n this.importLexerState(newState.lexerState);\n this.RULE_STACK = newState.RULE_STACK;\n };\n RecognizerEngine.prototype.ruleInvocationStateUpdate = function (shortName, fullName, idxInCallingRule) {\n this.RULE_OCCURRENCE_STACK.push(idxInCallingRule);\n this.RULE_STACK.push(shortName);\n // NOOP when cst is disabled\n this.cstInvocationStateUpdate(fullName);\n };\n RecognizerEngine.prototype.isBackTracking = function () {\n return this.isBackTrackingStack.length !== 0;\n };\n RecognizerEngine.prototype.getCurrRuleFullName = function () {\n var shortName = this.getLastExplicitRuleShortName();\n return this.shortRuleNameToFull[shortName];\n };\n RecognizerEngine.prototype.shortRuleNameToFullName = function (shortName) {\n return this.shortRuleNameToFull[shortName];\n };\n RecognizerEngine.prototype.isAtEndOfInput = function () {\n return this.tokenMatcher(this.LA(1), tokens_public_1.EOF);\n };\n RecognizerEngine.prototype.reset = function () {\n this.resetLexerState();\n this.subruleIdx = 0;\n this.isBackTrackingStack = [];\n this.errors = [];\n this.RULE_STACK = [];\n // TODO: extract a specific reset for TreeBuilder trait\n this.CST_STACK = [];\n this.RULE_OCCURRENCE_STACK = [];\n };\n return RecognizerEngine;\n}());\nexports.RecognizerEngine = RecognizerEngine;\n//# sourceMappingURL=recognizer_engine.js.map","var ListCache = require('./_ListCache'),\n stackClear = require('./_stackClear'),\n stackDelete = require('./_stackDelete'),\n stackGet = require('./_stackGet'),\n stackHas = require('./_stackHas'),\n stackSet = require('./_stackSet');\n\n/**\n * Creates a stack cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Stack(entries) {\n var data = this.__data__ = new ListCache(entries);\n this.size = data.size;\n}\n\n// Add methods to `Stack`.\nStack.prototype.clear = stackClear;\nStack.prototype['delete'] = stackDelete;\nStack.prototype.get = stackGet;\nStack.prototype.has = stackHas;\nStack.prototype.set = stackSet;\n\nmodule.exports = Stack;\n","/**\n * The base implementation of `_.property` without support for deep paths.\n *\n * @private\n * @param {string} key The key of the property to get.\n * @returns {Function} Returns the new accessor function.\n */\nfunction baseProperty(key) {\n return function(object) {\n return object == null ? undefined : object[key];\n };\n}\n\nmodule.exports = baseProperty;\n","var arrayLikeKeys = require('./_arrayLikeKeys'),\n baseKeysIn = require('./_baseKeysIn'),\n isArrayLike = require('./isArrayLike');\n\n/**\n * Creates an array of the own and inherited enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keysIn(new Foo);\n * // => ['a', 'b', 'c'] (iteration order is not guaranteed)\n */\nfunction keysIn(object) {\n return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object);\n}\n\nmodule.exports = keysIn;\n","var baseGet = require('./_baseGet');\n\n/**\n * A specialized version of `baseProperty` which supports deep paths.\n *\n * @private\n * @param {Array|string} path The path of the property to get.\n * @returns {Function} Returns the new accessor function.\n */\nfunction basePropertyDeep(path) {\n return function(object) {\n return baseGet(object, path);\n };\n}\n\nmodule.exports = basePropertyDeep;\n","/**\n * A specialized version of `_.every` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {boolean} Returns `true` if all elements pass the predicate check,\n * else `false`.\n */\nfunction arrayEvery(array, predicate) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n while (++index < length) {\n if (!predicate(array[index], index, array)) {\n return false;\n }\n }\n return true;\n}\n\nmodule.exports = arrayEvery;\n","var coreJsData = require('./_coreJsData');\n\n/** Used to detect methods masquerading as native. */\nvar maskSrcKey = (function() {\n var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');\n return uid ? ('Symbol(src)_1.' + uid) : '';\n}());\n\n/**\n * Checks if `func` has its source masked.\n *\n * @private\n * @param {Function} func The function to check.\n * @returns {boolean} Returns `true` if `func` is masked, else `false`.\n */\nfunction isMasked(func) {\n return !!maskSrcKey && (maskSrcKey in func);\n}\n\nmodule.exports = isMasked;\n","/**\n * The base implementation of `_.unary` without support for storing metadata.\n *\n * @private\n * @param {Function} func The function to cap arguments for.\n * @returns {Function} Returns the new capped function.\n */\nfunction baseUnary(func) {\n return function(value) {\n return func(value);\n };\n}\n\nmodule.exports = baseUnary;\n","var baseFlatten = require('./_baseFlatten'),\n map = require('./map');\n\n/**\n * Creates a flattened array of values by running each element in `collection`\n * thru `iteratee` and flattening the mapped results. The iteratee is invoked\n * with three arguments: (value, index|key, collection).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the new flattened array.\n * @example\n *\n * function duplicate(n) {\n * return [n, n];\n * }\n *\n * _.flatMap([1, 2], duplicate);\n * // => [1, 1, 2, 2]\n */\nfunction flatMap(collection, iteratee) {\n return baseFlatten(map(collection, iteratee), 1);\n}\n\nmodule.exports = flatMap;\n","var createFind = require('./_createFind'),\n findIndex = require('./findIndex');\n\n/**\n * Iterates over elements of `collection`, returning the first element\n * `predicate` returns truthy for. The predicate is invoked with three\n * arguments: (value, index|key, collection).\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to inspect.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @param {number} [fromIndex=0] The index to search from.\n * @returns {*} Returns the matched element, else `undefined`.\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'age': 36, 'active': true },\n * { 'user': 'fred', 'age': 40, 'active': false },\n * { 'user': 'pebbles', 'age': 1, 'active': true }\n * ];\n *\n * _.find(users, function(o) { return o.age < 40; });\n * // => object for 'barney'\n *\n * // The `_.matches` iteratee shorthand.\n * _.find(users, { 'age': 1, 'active': true });\n * // => object for 'pebbles'\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.find(users, ['active', false]);\n * // => object for 'fred'\n *\n * // The `_.property` iteratee shorthand.\n * _.find(users, 'active');\n * // => object for 'barney'\n */\nvar find = createFind(findIndex);\n\nmodule.exports = find;\n","/**\n * Creates a function that returns `value`.\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Util\n * @param {*} value The value to return from the new function.\n * @returns {Function} Returns the new constant function.\n * @example\n *\n * var objects = _.times(2, _.constant({ 'a': 1 }));\n *\n * console.log(objects);\n * // => [{ 'a': 1 }, { 'a': 1 }]\n *\n * console.log(objects[0] === objects[1]);\n * // => true\n */\nfunction constant(value) {\n return function() {\n return value;\n };\n}\n\nmodule.exports = constant;\n","var toNumber = require('./toNumber');\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0,\n MAX_INTEGER = 1.7976931348623157e+308;\n\n/**\n * Converts `value` to a finite number.\n *\n * @static\n * @memberOf _\n * @since 4.12.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {number} Returns the converted number.\n * @example\n *\n * _.toFinite(3.2);\n * // => 3.2\n *\n * _.toFinite(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toFinite(Infinity);\n * // => 1.7976931348623157e+308\n *\n * _.toFinite('3.2');\n * // => 3.2\n */\nfunction toFinite(value) {\n if (!value) {\n return value === 0 ? value : 0;\n }\n value = toNumber(value);\n if (value === INFINITY || value === -INFINITY) {\n var sign = (value < 0 ? -1 : 1);\n return sign * MAX_INTEGER;\n }\n return value === value ? value : 0;\n}\n\nmodule.exports = toFinite;\n","var baseGet = require('./_baseGet'),\n baseSet = require('./_baseSet'),\n castPath = require('./_castPath');\n\n/**\n * The base implementation of `_.pickBy` without support for iteratee shorthands.\n *\n * @private\n * @param {Object} object The source object.\n * @param {string[]} paths The property paths to pick.\n * @param {Function} predicate The function invoked per property.\n * @returns {Object} Returns the new object.\n */\nfunction basePickBy(object, paths, predicate) {\n var index = -1,\n length = paths.length,\n result = {};\n\n while (++index < length) {\n var path = paths[index],\n value = baseGet(object, path);\n\n if (predicate(value, path)) {\n baseSet(result, castPath(path, object), value);\n }\n }\n return result;\n}\n\nmodule.exports = basePickBy;\n","var castPath = require('./_castPath'),\n toKey = require('./_toKey');\n\n/**\n * The base implementation of `_.get` without support for default values.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @returns {*} Returns the resolved value.\n */\nfunction baseGet(object, path) {\n path = castPath(path, object);\n\n var index = 0,\n length = path.length;\n\n while (object != null && index < length) {\n object = object[toKey(path[index++])];\n }\n return (index && index == length) ? object : undefined;\n}\n\nmodule.exports = baseGet;\n","\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.TreeBuilder = void 0;\nvar cst_1 = require(\"../../cst/cst\");\nvar noop_1 = __importDefault(require(\"lodash/noop\"));\nvar has_1 = __importDefault(require(\"lodash/has\"));\nvar keys_1 = __importDefault(require(\"lodash/keys\"));\nvar isUndefined_1 = __importDefault(require(\"lodash/isUndefined\"));\nvar cst_visitor_1 = require(\"../../cst/cst_visitor\");\nvar parser_1 = require(\"../parser\");\n/**\n * This trait is responsible for the CST building logic.\n */\nvar TreeBuilder = /** @class */ (function () {\n function TreeBuilder() {\n }\n TreeBuilder.prototype.initTreeBuilder = function (config) {\n this.CST_STACK = [];\n // outputCst is no longer exposed/defined in the pubic API\n this.outputCst = config.outputCst;\n this.nodeLocationTracking = (0, has_1.default)(config, \"nodeLocationTracking\")\n ? config.nodeLocationTracking // assumes end user provides the correct config value/type\n : parser_1.DEFAULT_PARSER_CONFIG.nodeLocationTracking;\n if (!this.outputCst) {\n this.cstInvocationStateUpdate = noop_1.default;\n this.cstFinallyStateUpdate = noop_1.default;\n this.cstPostTerminal = noop_1.default;\n this.cstPostNonTerminal = noop_1.default;\n this.cstPostRule = noop_1.default;\n }\n else {\n if (/full/i.test(this.nodeLocationTracking)) {\n if (this.recoveryEnabled) {\n this.setNodeLocationFromToken = cst_1.setNodeLocationFull;\n this.setNodeLocationFromNode = cst_1.setNodeLocationFull;\n this.cstPostRule = noop_1.default;\n this.setInitialNodeLocation = this.setInitialNodeLocationFullRecovery;\n }\n else {\n this.setNodeLocationFromToken = noop_1.default;\n this.setNodeLocationFromNode = noop_1.default;\n this.cstPostRule = this.cstPostRuleFull;\n this.setInitialNodeLocation = this.setInitialNodeLocationFullRegular;\n }\n }\n else if (/onlyOffset/i.test(this.nodeLocationTracking)) {\n if (this.recoveryEnabled) {\n this.setNodeLocationFromToken = cst_1.setNodeLocationOnlyOffset;\n this.setNodeLocationFromNode = cst_1.setNodeLocationOnlyOffset;\n this.cstPostRule = noop_1.default;\n this.setInitialNodeLocation =\n this.setInitialNodeLocationOnlyOffsetRecovery;\n }\n else {\n this.setNodeLocationFromToken = noop_1.default;\n this.setNodeLocationFromNode = noop_1.default;\n this.cstPostRule = this.cstPostRuleOnlyOffset;\n this.setInitialNodeLocation =\n this.setInitialNodeLocationOnlyOffsetRegular;\n }\n }\n else if (/none/i.test(this.nodeLocationTracking)) {\n this.setNodeLocationFromToken = noop_1.default;\n this.setNodeLocationFromNode = noop_1.default;\n this.cstPostRule = noop_1.default;\n this.setInitialNodeLocation = noop_1.default;\n }\n else {\n throw Error(\"Invalid config option: \\\"\".concat(config.nodeLocationTracking, \"\\\"\"));\n }\n }\n };\n TreeBuilder.prototype.setInitialNodeLocationOnlyOffsetRecovery = function (cstNode) {\n cstNode.location = {\n startOffset: NaN,\n endOffset: NaN\n };\n };\n TreeBuilder.prototype.setInitialNodeLocationOnlyOffsetRegular = function (cstNode) {\n cstNode.location = {\n // without error recovery the starting Location of a new CstNode is guaranteed\n // To be the next Token's startOffset (for valid inputs).\n // For invalid inputs there won't be any CSTOutput so this potential\n // inaccuracy does not matter\n startOffset: this.LA(1).startOffset,\n endOffset: NaN\n };\n };\n TreeBuilder.prototype.setInitialNodeLocationFullRecovery = function (cstNode) {\n cstNode.location = {\n startOffset: NaN,\n startLine: NaN,\n startColumn: NaN,\n endOffset: NaN,\n endLine: NaN,\n endColumn: NaN\n };\n };\n /**\n * @see setInitialNodeLocationOnlyOffsetRegular for explanation why this work\n \n * @param cstNode\n */\n TreeBuilder.prototype.setInitialNodeLocationFullRegular = function (cstNode) {\n var nextToken = this.LA(1);\n cstNode.location = {\n startOffset: nextToken.startOffset,\n startLine: nextToken.startLine,\n startColumn: nextToken.startColumn,\n endOffset: NaN,\n endLine: NaN,\n endColumn: NaN\n };\n };\n TreeBuilder.prototype.cstInvocationStateUpdate = function (fullRuleName) {\n var cstNode = {\n name: fullRuleName,\n children: Object.create(null)\n };\n this.setInitialNodeLocation(cstNode);\n this.CST_STACK.push(cstNode);\n };\n TreeBuilder.prototype.cstFinallyStateUpdate = function () {\n this.CST_STACK.pop();\n };\n TreeBuilder.prototype.cstPostRuleFull = function (ruleCstNode) {\n // casts to `required` are safe because `cstPostRuleFull` should only be invoked when full location is enabled\n var prevToken = this.LA(0);\n var loc = ruleCstNode.location;\n // If this condition is true it means we consumed at least one Token\n // In this CstNode.\n if (loc.startOffset <= prevToken.startOffset === true) {\n loc.endOffset = prevToken.endOffset;\n loc.endLine = prevToken.endLine;\n loc.endColumn = prevToken.endColumn;\n }\n // \"empty\" CstNode edge case\n else {\n loc.startOffset = NaN;\n loc.startLine = NaN;\n loc.startColumn = NaN;\n }\n };\n TreeBuilder.prototype.cstPostRuleOnlyOffset = function (ruleCstNode) {\n var prevToken = this.LA(0);\n // `location' is not null because `cstPostRuleOnlyOffset` will only be invoked when location tracking is enabled.\n var loc = ruleCstNode.location;\n // If this condition is true it means we consumed at least one Token\n // In this CstNode.\n if (loc.startOffset <= prevToken.startOffset === true) {\n loc.endOffset = prevToken.endOffset;\n }\n // \"empty\" CstNode edge case\n else {\n loc.startOffset = NaN;\n }\n };\n TreeBuilder.prototype.cstPostTerminal = function (key, consumedToken) {\n var rootCst = this.CST_STACK[this.CST_STACK.length - 1];\n (0, cst_1.addTerminalToCst)(rootCst, consumedToken, key);\n // This is only used when **both** error recovery and CST Output are enabled.\n this.setNodeLocationFromToken(rootCst.location, consumedToken);\n };\n TreeBuilder.prototype.cstPostNonTerminal = function (ruleCstResult, ruleName) {\n var preCstNode = this.CST_STACK[this.CST_STACK.length - 1];\n (0, cst_1.addNoneTerminalToCst)(preCstNode, ruleName, ruleCstResult);\n // This is only used when **both** error recovery and CST Output are enabled.\n this.setNodeLocationFromNode(preCstNode.location, ruleCstResult.location);\n };\n TreeBuilder.prototype.getBaseCstVisitorConstructor = function () {\n if ((0, isUndefined_1.default)(this.baseCstVisitorConstructor)) {\n var newBaseCstVisitorConstructor = (0, cst_visitor_1.createBaseSemanticVisitorConstructor)(this.className, (0, keys_1.default)(this.gastProductionsCache));\n this.baseCstVisitorConstructor = newBaseCstVisitorConstructor;\n return newBaseCstVisitorConstructor;\n }\n return this.baseCstVisitorConstructor;\n };\n TreeBuilder.prototype.getBaseCstVisitorConstructorWithDefaults = function () {\n if ((0, isUndefined_1.default)(this.baseCstVisitorWithDefaultsConstructor)) {\n var newConstructor = (0, cst_visitor_1.createBaseVisitorConstructorWithDefaults)(this.className, (0, keys_1.default)(this.gastProductionsCache), this.getBaseCstVisitorConstructor());\n this.baseCstVisitorWithDefaultsConstructor = newConstructor;\n return newConstructor;\n }\n return this.baseCstVisitorWithDefaultsConstructor;\n };\n TreeBuilder.prototype.getLastExplicitRuleShortName = function () {\n var ruleStack = this.RULE_STACK;\n return ruleStack[ruleStack.length - 1];\n };\n TreeBuilder.prototype.getPreviousExplicitRuleShortName = function () {\n var ruleStack = this.RULE_STACK;\n return ruleStack[ruleStack.length - 2];\n };\n TreeBuilder.prototype.getLastExplicitRuleOccurrenceIndex = function () {\n var occurrenceStack = this.RULE_OCCURRENCE_STACK;\n return occurrenceStack[occurrenceStack.length - 1];\n };\n return TreeBuilder;\n}());\nexports.TreeBuilder = TreeBuilder;\n//# sourceMappingURL=tree_builder.js.map","/** Used for built-in method references. */\nvar funcProto = Function.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/**\n * Converts `func` to its source code.\n *\n * @private\n * @param {Function} func The function to convert.\n * @returns {string} Returns the source code.\n */\nfunction toSource(func) {\n if (func != null) {\n try {\n return funcToString.call(func);\n } catch (e) {}\n try {\n return (func + '');\n } catch (e) {}\n }\n return '';\n}\n\nmodule.exports = toSource;\n","var baseGetTag = require('./_baseGetTag'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]';\n\n/**\n * The base implementation of `_.isArguments`.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n */\nfunction baseIsArguments(value) {\n return isObjectLike(value) && baseGetTag(value) == argsTag;\n}\n\nmodule.exports = baseIsArguments;\n","var baseSlice = require('./_baseSlice'),\n toInteger = require('./toInteger');\n\n/**\n * Creates a slice of `array` with `n` elements dropped from the end.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Array\n * @param {Array} array The array to query.\n * @param {number} [n=1] The number of elements to drop.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {Array} Returns the slice of `array`.\n * @example\n *\n * _.dropRight([1, 2, 3]);\n * // => [1, 2]\n *\n * _.dropRight([1, 2, 3], 2);\n * // => [1]\n *\n * _.dropRight([1, 2, 3], 5);\n * // => []\n *\n * _.dropRight([1, 2, 3], 0);\n * // => [1, 2, 3]\n */\nfunction dropRight(array, n, guard) {\n var length = array == null ? 0 : array.length;\n if (!length) {\n return [];\n }\n n = (guard || n === undefined) ? 1 : toInteger(n);\n n = length - n;\n return baseSlice(array, 0, n < 0 ? 0 : n);\n}\n\nmodule.exports = dropRight;\n","var Symbol = require('./_Symbol'),\n arrayMap = require('./_arrayMap'),\n isArray = require('./isArray'),\n isSymbol = require('./isSymbol');\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0;\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n symbolToString = symbolProto ? symbolProto.toString : undefined;\n\n/**\n * The base implementation of `_.toString` which doesn't convert nullish\n * values to empty strings.\n *\n * @private\n * @param {*} value The value to process.\n * @returns {string} Returns the string.\n */\nfunction baseToString(value) {\n // Exit early for strings to avoid a performance hit in some environments.\n if (typeof value == 'string') {\n return value;\n }\n if (isArray(value)) {\n // Recursively convert values (susceptible to call stack limits).\n return arrayMap(value, baseToString) + '';\n }\n if (isSymbol(value)) {\n return symbolToString ? symbolToString.call(value) : '';\n }\n var result = (value + '');\n return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n}\n\nmodule.exports = baseToString;\n","var arrayFilter = require('./_arrayFilter'),\n baseFilter = require('./_baseFilter'),\n baseIteratee = require('./_baseIteratee'),\n isArray = require('./isArray');\n\n/**\n * Iterates over elements of `collection`, returning an array of all elements\n * `predicate` returns truthy for. The predicate is invoked with three\n * arguments: (value, index|key, collection).\n *\n * **Note:** Unlike `_.remove`, this method returns a new array.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the new filtered array.\n * @see _.reject\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'age': 36, 'active': true },\n * { 'user': 'fred', 'age': 40, 'active': false }\n * ];\n *\n * _.filter(users, function(o) { return !o.active; });\n * // => objects for ['fred']\n *\n * // The `_.matches` iteratee shorthand.\n * _.filter(users, { 'age': 36, 'active': true });\n * // => objects for ['barney']\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.filter(users, ['active', false]);\n * // => objects for ['fred']\n *\n * // The `_.property` iteratee shorthand.\n * _.filter(users, 'active');\n * // => objects for ['barney']\n *\n * // Combining several predicates using `_.overEvery` or `_.overSome`.\n * _.filter(users, _.overSome([{ 'age': 36 }, ['age', 40]]));\n * // => objects for ['fred', 'barney']\n */\nfunction filter(collection, predicate) {\n var func = isArray(collection) ? arrayFilter : baseFilter;\n return func(collection, baseIteratee(predicate, 3));\n}\n\nmodule.exports = filter;\n","var getMapData = require('./_getMapData');\n\n/**\n * Removes `key` and its value from the map.\n *\n * @private\n * @name delete\n * @memberOf MapCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction mapCacheDelete(key) {\n var result = getMapData(this, key)['delete'](key);\n this.size -= result ? 1 : 0;\n return result;\n}\n\nmodule.exports = mapCacheDelete;\n","var baseIsMap = require('./_baseIsMap'),\n baseUnary = require('./_baseUnary'),\n nodeUtil = require('./_nodeUtil');\n\n/* Node.js helper references. */\nvar nodeIsMap = nodeUtil && nodeUtil.isMap;\n\n/**\n * Checks if `value` is classified as a `Map` object.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a map, else `false`.\n * @example\n *\n * _.isMap(new Map);\n * // => true\n *\n * _.isMap(new WeakMap);\n * // => false\n */\nvar isMap = nodeIsMap ? baseUnary(nodeIsMap) : baseIsMap;\n\nmodule.exports = isMap;\n","\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ErrorHandler = void 0;\nvar exceptions_public_1 = require(\"../../exceptions_public\");\nvar has_1 = __importDefault(require(\"lodash/has\"));\nvar clone_1 = __importDefault(require(\"lodash/clone\"));\nvar lookahead_1 = require(\"../../grammar/lookahead\");\nvar parser_1 = require(\"../parser\");\n/**\n * Trait responsible for runtime parsing errors.\n */\nvar ErrorHandler = /** @class */ (function () {\n function ErrorHandler() {\n }\n ErrorHandler.prototype.initErrorHandler = function (config) {\n this._errors = [];\n this.errorMessageProvider = (0, has_1.default)(config, \"errorMessageProvider\")\n ? config.errorMessageProvider // assumes end user provides the correct config value/type\n : parser_1.DEFAULT_PARSER_CONFIG.errorMessageProvider;\n };\n ErrorHandler.prototype.SAVE_ERROR = function (error) {\n if ((0, exceptions_public_1.isRecognitionException)(error)) {\n error.context = {\n ruleStack: this.getHumanReadableRuleStack(),\n ruleOccurrenceStack: (0, clone_1.default)(this.RULE_OCCURRENCE_STACK)\n };\n this._errors.push(error);\n return error;\n }\n else {\n throw Error(\"Trying to save an Error which is not a RecognitionException\");\n }\n };\n Object.defineProperty(ErrorHandler.prototype, \"errors\", {\n get: function () {\n return (0, clone_1.default)(this._errors);\n },\n set: function (newErrors) {\n this._errors = newErrors;\n },\n enumerable: false,\n configurable: true\n });\n // TODO: consider caching the error message computed information\n ErrorHandler.prototype.raiseEarlyExitException = function (occurrence, prodType, userDefinedErrMsg) {\n var ruleName = this.getCurrRuleFullName();\n var ruleGrammar = this.getGAstProductions()[ruleName];\n var lookAheadPathsPerAlternative = (0, lookahead_1.getLookaheadPathsForOptionalProd)(occurrence, ruleGrammar, prodType, this.maxLookahead);\n var insideProdPaths = lookAheadPathsPerAlternative[0];\n var actualTokens = [];\n for (var i = 1; i <= this.maxLookahead; i++) {\n actualTokens.push(this.LA(i));\n }\n var msg = this.errorMessageProvider.buildEarlyExitMessage({\n expectedIterationPaths: insideProdPaths,\n actual: actualTokens,\n previous: this.LA(0),\n customUserDescription: userDefinedErrMsg,\n ruleName: ruleName\n });\n throw this.SAVE_ERROR(new exceptions_public_1.EarlyExitException(msg, this.LA(1), this.LA(0)));\n };\n // TODO: consider caching the error message computed information\n ErrorHandler.prototype.raiseNoAltException = function (occurrence, errMsgTypes) {\n var ruleName = this.getCurrRuleFullName();\n var ruleGrammar = this.getGAstProductions()[ruleName];\n // TODO: getLookaheadPathsForOr can be slow for large enough maxLookahead and certain grammars, consider caching ?\n var lookAheadPathsPerAlternative = (0, lookahead_1.getLookaheadPathsForOr)(occurrence, ruleGrammar, this.maxLookahead);\n var actualTokens = [];\n for (var i = 1; i <= this.maxLookahead; i++) {\n actualTokens.push(this.LA(i));\n }\n var previousToken = this.LA(0);\n var errMsg = this.errorMessageProvider.buildNoViableAltMessage({\n expectedPathsPerAlt: lookAheadPathsPerAlternative,\n actual: actualTokens,\n previous: previousToken,\n customUserDescription: errMsgTypes,\n ruleName: this.getCurrRuleFullName()\n });\n throw this.SAVE_ERROR(new exceptions_public_1.NoViableAltException(errMsg, this.LA(1), previousToken));\n };\n return ErrorHandler;\n}());\nexports.ErrorHandler = ErrorHandler;\n//# sourceMappingURL=error_handler.js.map","var isSymbol = require('./isSymbol');\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0;\n\n/**\n * Converts `value` to a string key if it's not a string or symbol.\n *\n * @private\n * @param {*} value The value to inspect.\n * @returns {string|symbol} Returns the key.\n */\nfunction toKey(value) {\n if (typeof value == 'string' || isSymbol(value)) {\n return value;\n }\n var result = (value + '');\n return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n}\n\nmodule.exports = toKey;\n","var root = require('./_root');\n\n/** Built-in value references. */\nvar Uint8Array = root.Uint8Array;\n\nmodule.exports = Uint8Array;\n","var baseIsEqual = require('./_baseIsEqual'),\n get = require('./get'),\n hasIn = require('./hasIn'),\n isKey = require('./_isKey'),\n isStrictComparable = require('./_isStrictComparable'),\n matchesStrictComparable = require('./_matchesStrictComparable'),\n toKey = require('./_toKey');\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1,\n COMPARE_UNORDERED_FLAG = 2;\n\n/**\n * The base implementation of `_.matchesProperty` which doesn't clone `srcValue`.\n *\n * @private\n * @param {string} path The path of the property to get.\n * @param {*} srcValue The value to match.\n * @returns {Function} Returns the new spec function.\n */\nfunction baseMatchesProperty(path, srcValue) {\n if (isKey(path) && isStrictComparable(srcValue)) {\n return matchesStrictComparable(toKey(path), srcValue);\n }\n return function(object) {\n var objValue = get(object, path);\n return (objValue === undefined && objValue === srcValue)\n ? hasIn(object, path)\n : baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG);\n };\n}\n\nmodule.exports = baseMatchesProperty;\n","/**\n * The base implementation of `_.hasIn` without support for deep paths.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {Array|string} key The key to check.\n * @returns {boolean} Returns `true` if `key` exists, else `false`.\n */\nfunction baseHasIn(object, key) {\n return object != null && key in Object(object);\n}\n\nmodule.exports = baseHasIn;\n","var arrayFilter = require('./_arrayFilter'),\n baseFilter = require('./_baseFilter'),\n baseIteratee = require('./_baseIteratee'),\n isArray = require('./isArray'),\n negate = require('./negate');\n\n/**\n * The opposite of `_.filter`; this method returns the elements of `collection`\n * that `predicate` does **not** return truthy for.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the new filtered array.\n * @see _.filter\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'age': 36, 'active': false },\n * { 'user': 'fred', 'age': 40, 'active': true }\n * ];\n *\n * _.reject(users, function(o) { return !o.active; });\n * // => objects for ['fred']\n *\n * // The `_.matches` iteratee shorthand.\n * _.reject(users, { 'age': 40, 'active': true });\n * // => objects for ['barney']\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.reject(users, ['active', false]);\n * // => objects for ['fred']\n *\n * // The `_.property` iteratee shorthand.\n * _.reject(users, 'active');\n * // => objects for ['barney']\n */\nfunction reject(collection, predicate) {\n var func = isArray(collection) ? arrayFilter : baseFilter;\n return func(collection, negate(baseIteratee(predicate, 3)));\n}\n\nmodule.exports = reject;\n","/**\n * Gets the last element of `array`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to query.\n * @returns {*} Returns the last element of `array`.\n * @example\n *\n * _.last([1, 2, 3]);\n * // => 3\n */\nfunction last(array) {\n var length = array == null ? 0 : array.length;\n return length ? array[length - 1] : undefined;\n}\n\nmodule.exports = last;\n","/**\n * The base implementation of `_.times` without support for iteratee shorthands\n * or max array length checks.\n *\n * @private\n * @param {number} n The number of times to invoke `iteratee`.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the array of results.\n */\nfunction baseTimes(n, iteratee) {\n var index = -1,\n result = Array(n);\n\n while (++index < n) {\n result[index] = iteratee(index);\n }\n return result;\n}\n\nmodule.exports = baseTimes;\n","var baseGet = require('./_baseGet');\n\n/**\n * Gets the value at `path` of `object`. If the resolved value is\n * `undefined`, the `defaultValue` is returned in its place.\n *\n * @static\n * @memberOf _\n * @since 3.7.0\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @param {*} [defaultValue] The value returned for `undefined` resolved values.\n * @returns {*} Returns the resolved value.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n *\n * _.get(object, 'a[0].b.c');\n * // => 3\n *\n * _.get(object, ['a', '0', 'b', 'c']);\n * // => 3\n *\n * _.get(object, 'a.b.c', 'default');\n * // => 'default'\n */\nfunction get(object, path, defaultValue) {\n var result = object == null ? undefined : baseGet(object, path);\n return result === undefined ? defaultValue : result;\n}\n\nmodule.exports = get;\n","\"use strict\";\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.attemptInRepetitionRecovery = exports.Recoverable = exports.InRuleRecoveryException = exports.IN_RULE_RECOVERY_EXCEPTION = exports.EOF_FOLLOW_KEY = void 0;\nvar tokens_public_1 = require(\"../../../scan/tokens_public\");\nvar isEmpty_1 = __importDefault(require(\"lodash/isEmpty\"));\nvar dropRight_1 = __importDefault(require(\"lodash/dropRight\"));\nvar flatten_1 = __importDefault(require(\"lodash/flatten\"));\nvar map_1 = __importDefault(require(\"lodash/map\"));\nvar find_1 = __importDefault(require(\"lodash/find\"));\nvar has_1 = __importDefault(require(\"lodash/has\"));\nvar includes_1 = __importDefault(require(\"lodash/includes\"));\nvar clone_1 = __importDefault(require(\"lodash/clone\"));\nvar exceptions_public_1 = require(\"../../exceptions_public\");\nvar constants_1 = require(\"../../constants\");\nvar parser_1 = require(\"../parser\");\nexports.EOF_FOLLOW_KEY = {};\nexports.IN_RULE_RECOVERY_EXCEPTION = \"InRuleRecoveryException\";\nvar InRuleRecoveryException = /** @class */ (function (_super) {\n __extends(InRuleRecoveryException, _super);\n function InRuleRecoveryException(message) {\n var _this = _super.call(this, message) || this;\n _this.name = exports.IN_RULE_RECOVERY_EXCEPTION;\n return _this;\n }\n return InRuleRecoveryException;\n}(Error));\nexports.InRuleRecoveryException = InRuleRecoveryException;\n/**\n * This trait is responsible for the error recovery and fault tolerant logic\n */\nvar Recoverable = /** @class */ (function () {\n function Recoverable() {\n }\n Recoverable.prototype.initRecoverable = function (config) {\n this.firstAfterRepMap = {};\n this.resyncFollows = {};\n this.recoveryEnabled = (0, has_1.default)(config, \"recoveryEnabled\")\n ? config.recoveryEnabled // assumes end user provides the correct config value/type\n : parser_1.DEFAULT_PARSER_CONFIG.recoveryEnabled;\n // performance optimization, NOOP will be inlined which\n // effectively means that this optional feature does not exist\n // when not used.\n if (this.recoveryEnabled) {\n this.attemptInRepetitionRecovery = attemptInRepetitionRecovery;\n }\n };\n Recoverable.prototype.getTokenToInsert = function (tokType) {\n var tokToInsert = (0, tokens_public_1.createTokenInstance)(tokType, \"\", NaN, NaN, NaN, NaN, NaN, NaN);\n tokToInsert.isInsertedInRecovery = true;\n return tokToInsert;\n };\n Recoverable.prototype.canTokenTypeBeInsertedInRecovery = function (tokType) {\n return true;\n };\n Recoverable.prototype.canTokenTypeBeDeletedInRecovery = function (tokType) {\n return true;\n };\n Recoverable.prototype.tryInRepetitionRecovery = function (grammarRule, grammarRuleArgs, lookAheadFunc, expectedTokType) {\n var _this = this;\n // TODO: can the resyncTokenType be cached?\n var reSyncTokType = this.findReSyncTokenType();\n var savedLexerState = this.exportLexerState();\n var resyncedTokens = [];\n var passedResyncPoint = false;\n var nextTokenWithoutResync = this.LA(1);\n var currToken = this.LA(1);\n var generateErrorMessage = function () {\n var previousToken = _this.LA(0);\n // we are preemptively re-syncing before an error has been detected, therefor we must reproduce\n // the error that would have been thrown\n var msg = _this.errorMessageProvider.buildMismatchTokenMessage({\n expected: expectedTokType,\n actual: nextTokenWithoutResync,\n previous: previousToken,\n ruleName: _this.getCurrRuleFullName()\n });\n var error = new exceptions_public_1.MismatchedTokenException(msg, nextTokenWithoutResync, _this.LA(0));\n // the first token here will be the original cause of the error, this is not part of the resyncedTokens property.\n error.resyncedTokens = (0, dropRight_1.default)(resyncedTokens);\n _this.SAVE_ERROR(error);\n };\n while (!passedResyncPoint) {\n // re-synced to a point where we can safely exit the repetition/\n if (this.tokenMatcher(currToken, expectedTokType)) {\n generateErrorMessage();\n return; // must return here to avoid reverting the inputIdx\n }\n else if (lookAheadFunc.call(this)) {\n // we skipped enough tokens so we can resync right back into another iteration of the repetition grammar rule\n generateErrorMessage();\n // recursive invocation in other to support multiple re-syncs in the same top level repetition grammar rule\n grammarRule.apply(this, grammarRuleArgs);\n return; // must return here to avoid reverting the inputIdx\n }\n else if (this.tokenMatcher(currToken, reSyncTokType)) {\n passedResyncPoint = true;\n }\n else {\n currToken = this.SKIP_TOKEN();\n this.addToResyncTokens(currToken, resyncedTokens);\n }\n }\n // we were unable to find a CLOSER point to resync inside the Repetition, reset the state.\n // The parsing exception we were trying to prevent will happen in the NEXT parsing step. it may be handled by\n // \"between rules\" resync recovery later in the flow.\n this.importLexerState(savedLexerState);\n };\n Recoverable.prototype.shouldInRepetitionRecoveryBeTried = function (expectTokAfterLastMatch, nextTokIdx, notStuck) {\n // Edge case of arriving from a MANY repetition which is stuck\n // Attempting recovery in this case could cause an infinite loop\n if (notStuck === false) {\n return false;\n }\n // no need to recover, next token is what we expect...\n if (this.tokenMatcher(this.LA(1), expectTokAfterLastMatch)) {\n return false;\n }\n // error recovery is disabled during backtracking as it can make the parser ignore a valid grammar path\n // and prefer some backtracking path that includes recovered errors.\n if (this.isBackTracking()) {\n return false;\n }\n // if we can perform inRule recovery (single token insertion or deletion) we always prefer that recovery algorithm\n // because if it works, it makes the least amount of changes to the input stream (greedy algorithm)\n //noinspection RedundantIfStatementJS\n if (this.canPerformInRuleRecovery(expectTokAfterLastMatch, this.getFollowsForInRuleRecovery(expectTokAfterLastMatch, nextTokIdx))) {\n return false;\n }\n return true;\n };\n // Error Recovery functionality\n Recoverable.prototype.getFollowsForInRuleRecovery = function (tokType, tokIdxInRule) {\n var grammarPath = this.getCurrentGrammarPath(tokType, tokIdxInRule);\n var follows = this.getNextPossibleTokenTypes(grammarPath);\n return follows;\n };\n Recoverable.prototype.tryInRuleRecovery = function (expectedTokType, follows) {\n if (this.canRecoverWithSingleTokenInsertion(expectedTokType, follows)) {\n var tokToInsert = this.getTokenToInsert(expectedTokType);\n return tokToInsert;\n }\n if (this.canRecoverWithSingleTokenDeletion(expectedTokType)) {\n var nextTok = this.SKIP_TOKEN();\n this.consumeToken();\n return nextTok;\n }\n throw new InRuleRecoveryException(\"sad sad panda\");\n };\n Recoverable.prototype.canPerformInRuleRecovery = function (expectedToken, follows) {\n return (this.canRecoverWithSingleTokenInsertion(expectedToken, follows) ||\n this.canRecoverWithSingleTokenDeletion(expectedToken));\n };\n Recoverable.prototype.canRecoverWithSingleTokenInsertion = function (expectedTokType, follows) {\n var _this = this;\n if (!this.canTokenTypeBeInsertedInRecovery(expectedTokType)) {\n return false;\n }\n // must know the possible following tokens to perform single token insertion\n if ((0, isEmpty_1.default)(follows)) {\n return false;\n }\n var mismatchedTok = this.LA(1);\n var isMisMatchedTokInFollows = (0, find_1.default)(follows, function (possibleFollowsTokType) {\n return _this.tokenMatcher(mismatchedTok, possibleFollowsTokType);\n }) !== undefined;\n return isMisMatchedTokInFollows;\n };\n Recoverable.prototype.canRecoverWithSingleTokenDeletion = function (expectedTokType) {\n if (!this.canTokenTypeBeDeletedInRecovery(expectedTokType)) {\n return false;\n }\n var isNextTokenWhatIsExpected = this.tokenMatcher(this.LA(2), expectedTokType);\n return isNextTokenWhatIsExpected;\n };\n Recoverable.prototype.isInCurrentRuleReSyncSet = function (tokenTypeIdx) {\n var followKey = this.getCurrFollowKey();\n var currentRuleReSyncSet = this.getFollowSetFromFollowKey(followKey);\n return (0, includes_1.default)(currentRuleReSyncSet, tokenTypeIdx);\n };\n Recoverable.prototype.findReSyncTokenType = function () {\n var allPossibleReSyncTokTypes = this.flattenFollowSet();\n // this loop will always terminate as EOF is always in the follow stack and also always (virtually) in the input\n var nextToken = this.LA(1);\n var k = 2;\n while (true) {\n var foundMatch = (0, find_1.default)(allPossibleReSyncTokTypes, function (resyncTokType) {\n var canMatch = (0, tokens_public_1.tokenMatcher)(nextToken, resyncTokType);\n return canMatch;\n });\n if (foundMatch !== undefined) {\n return foundMatch;\n }\n nextToken = this.LA(k);\n k++;\n }\n };\n Recoverable.prototype.getCurrFollowKey = function () {\n // the length is at least one as we always add the ruleName to the stack before invoking the rule.\n if (this.RULE_STACK.length === 1) {\n return exports.EOF_FOLLOW_KEY;\n }\n var currRuleShortName = this.getLastExplicitRuleShortName();\n var currRuleIdx = this.getLastExplicitRuleOccurrenceIndex();\n var prevRuleShortName = this.getPreviousExplicitRuleShortName();\n return {\n ruleName: this.shortRuleNameToFullName(currRuleShortName),\n idxInCallingRule: currRuleIdx,\n inRule: this.shortRuleNameToFullName(prevRuleShortName)\n };\n };\n Recoverable.prototype.buildFullFollowKeyStack = function () {\n var _this = this;\n var explicitRuleStack = this.RULE_STACK;\n var explicitOccurrenceStack = this.RULE_OCCURRENCE_STACK;\n return (0, map_1.default)(explicitRuleStack, function (ruleName, idx) {\n if (idx === 0) {\n return exports.EOF_FOLLOW_KEY;\n }\n return {\n ruleName: _this.shortRuleNameToFullName(ruleName),\n idxInCallingRule: explicitOccurrenceStack[idx],\n inRule: _this.shortRuleNameToFullName(explicitRuleStack[idx - 1])\n };\n });\n };\n Recoverable.prototype.flattenFollowSet = function () {\n var _this = this;\n var followStack = (0, map_1.default)(this.buildFullFollowKeyStack(), function (currKey) {\n return _this.getFollowSetFromFollowKey(currKey);\n });\n return (0, flatten_1.default)(followStack);\n };\n Recoverable.prototype.getFollowSetFromFollowKey = function (followKey) {\n if (followKey === exports.EOF_FOLLOW_KEY) {\n return [tokens_public_1.EOF];\n }\n var followName = followKey.ruleName + followKey.idxInCallingRule + constants_1.IN + followKey.inRule;\n return this.resyncFollows[followName];\n };\n // It does not make any sense to include a virtual EOF token in the list of resynced tokens\n // as EOF does not really exist and thus does not contain any useful information (line/column numbers)\n Recoverable.prototype.addToResyncTokens = function (token, resyncTokens) {\n if (!this.tokenMatcher(token, tokens_public_1.EOF)) {\n resyncTokens.push(token);\n }\n return resyncTokens;\n };\n Recoverable.prototype.reSyncTo = function (tokType) {\n var resyncedTokens = [];\n var nextTok = this.LA(1);\n while (this.tokenMatcher(nextTok, tokType) === false) {\n nextTok = this.SKIP_TOKEN();\n this.addToResyncTokens(nextTok, resyncedTokens);\n }\n // the last token is not part of the error.\n return (0, dropRight_1.default)(resyncedTokens);\n };\n Recoverable.prototype.attemptInRepetitionRecovery = function (prodFunc, args, lookaheadFunc, dslMethodIdx, prodOccurrence, nextToksWalker, notStuck) {\n // by default this is a NO-OP\n // The actual implementation is with the function(not method) below\n };\n Recoverable.prototype.getCurrentGrammarPath = function (tokType, tokIdxInRule) {\n var pathRuleStack = this.getHumanReadableRuleStack();\n var pathOccurrenceStack = (0, clone_1.default)(this.RULE_OCCURRENCE_STACK);\n var grammarPath = {\n ruleStack: pathRuleStack,\n occurrenceStack: pathOccurrenceStack,\n lastTok: tokType,\n lastTokOccurrence: tokIdxInRule\n };\n return grammarPath;\n };\n Recoverable.prototype.getHumanReadableRuleStack = function () {\n var _this = this;\n return (0, map_1.default)(this.RULE_STACK, function (currShortName) {\n return _this.shortRuleNameToFullName(currShortName);\n });\n };\n return Recoverable;\n}());\nexports.Recoverable = Recoverable;\nfunction attemptInRepetitionRecovery(prodFunc, args, lookaheadFunc, dslMethodIdx, prodOccurrence, nextToksWalker, notStuck) {\n var key = this.getKeyForAutomaticLookahead(dslMethodIdx, prodOccurrence);\n var firstAfterRepInfo = this.firstAfterRepMap[key];\n if (firstAfterRepInfo === undefined) {\n var currRuleName = this.getCurrRuleFullName();\n var ruleGrammar = this.getGAstProductions()[currRuleName];\n var walker = new nextToksWalker(ruleGrammar, prodOccurrence);\n firstAfterRepInfo = walker.startWalking();\n this.firstAfterRepMap[key] = firstAfterRepInfo;\n }\n var expectTokAfterLastMatch = firstAfterRepInfo.token;\n var nextTokIdx = firstAfterRepInfo.occurrence;\n var isEndOfRule = firstAfterRepInfo.isEndOfRule;\n // special edge case of a TOP most repetition after which the input should END.\n // this will force an attempt for inRule recovery in that scenario.\n if (this.RULE_STACK.length === 1 &&\n isEndOfRule &&\n expectTokAfterLastMatch === undefined) {\n expectTokAfterLastMatch = tokens_public_1.EOF;\n nextTokIdx = 1;\n }\n // We don't have anything to re-sync to...\n // this condition was extracted from `shouldInRepetitionRecoveryBeTried` to act as a type-guard\n if (expectTokAfterLastMatch === undefined || nextTokIdx === undefined) {\n return;\n }\n if (this.shouldInRepetitionRecoveryBeTried(expectTokAfterLastMatch, nextTokIdx, notStuck)) {\n // TODO: performance optimization: instead of passing the original args here, we modify\n // the args param (or create a new one) and make sure the lookahead func is explicitly provided\n // to avoid searching the cache for it once more.\n this.tryInRepetitionRecovery(prodFunc, args, lookaheadFunc, expectTokAfterLastMatch);\n }\n}\nexports.attemptInRepetitionRecovery = attemptInRepetitionRecovery;\n//# sourceMappingURL=recoverable.js.map","var getNative = require('./_getNative'),\n root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar Map = getNative(root, 'Map');\n\nmodule.exports = Map;\n","var getNative = require('./_getNative'),\n root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar WeakMap = getNative(root, 'WeakMap');\n\nmodule.exports = WeakMap;\n","var isArrayLike = require('./isArrayLike');\n\n/**\n * Creates a `baseEach` or `baseEachRight` function.\n *\n * @private\n * @param {Function} eachFunc The function to iterate over a collection.\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new base function.\n */\nfunction createBaseEach(eachFunc, fromRight) {\n return function(collection, iteratee) {\n if (collection == null) {\n return collection;\n }\n if (!isArrayLike(collection)) {\n return eachFunc(collection, iteratee);\n }\n var length = collection.length,\n index = fromRight ? length : -1,\n iterable = Object(collection);\n\n while ((fromRight ? index-- : ++index < length)) {\n if (iteratee(iterable[index], index, iterable) === false) {\n break;\n }\n }\n return collection;\n };\n}\n\nmodule.exports = createBaseEach;\n","import { Cell } from \"../Cell\";\nimport { CellEvent } from \"../Cell/CellEvent\";\nimport { EventDispatcher } from \"../Utility/EventDispatcher\";\nimport { DependencyBuilder } from \"./DependencyBuilder\";\nimport { CellRegistry } from \"../Sheet/CellRegistry\";\n\nexport class DependencyTree {\n\n protected depTree : Record = {};\n protected cellRegistry : CellRegistry;\n\n constructor(\n cellRegistry : CellRegistry,\n private dispatcher : EventDispatcher,\n private builder : DependencyBuilder\n ) {\n this.cellRegistry = cellRegistry;\n this.buildTree();\n this.dispatcher.listen(CellEvent.FORMULA_CHANGED, this._updateGraph.bind(this));\n }\n\n private buildTree() {\n // Build the dependency tree from cell registry\n this.cellRegistry.each((cell: Cell) => {\n if (cell.formula) {\n this.depTree[cell.address] = cell;\n }\n });\n }\n\n private _updateGraph(event: any)\n {\n // Rebuild the tree when a formula changes\n this.buildTree();\n }\n\n markAsDirty(cell : Cell) {\n if (this.depTree[cell.address]) {\n this.depTree[cell.address].markAsDirty();\n\n // Recursively mark dependents as dirty\n const dependents = this.depTree[cell.address].getDependents();\n for (const address in dependents) {\n this.markAsDirty(dependents[address]);\n }\n }\n }\n\n /**\n * Topologically sort object tree into array based on depth level\n *\n * a -\n * |- c -\n * b - | - e -\n * d - | - g\n * |\n * f -\n *\n * to\n *\n * a | c | e | g\n * b | d | f |\n */\n topologicalSort() : Array> {\n const levels: Array> = [];\n const visited = new Set();\n const cellLevels = new Map();\n\n // Calculate level for each cell based on its precedents\n const calculateLevel = (cell: Cell): number => {\n if (cellLevels.has(cell.address)) {\n return cellLevels.get(cell.address)!;\n }\n\n const precedents = cell.getPrecedents();\n if (!precedents || Object.keys(precedents).length === 0) {\n // No precedents, this is a leaf node (level 0)\n cellLevels.set(cell.address, 0);\n return 0;\n }\n\n // Find the maximum level among precedents\n let maxLevel = -1;\n for (const address in precedents) {\n const precedent = precedents[address];\n if (precedent) {\n const precedentLevel = calculateLevel(precedent);\n if (precedentLevel > maxLevel) {\n maxLevel = precedentLevel;\n }\n }\n }\n\n const level = maxLevel + 1;\n cellLevels.set(cell.address, level);\n return level;\n };\n\n // Calculate levels for all cells with formulas\n this.cellRegistry.each((cell: Cell) => {\n if (cell.formula && !visited.has(cell.address)) {\n calculateLevel(cell);\n }\n });\n\n // Group cells by level (only include cells with formulas)\n cellLevels.forEach((level, address) => {\n const cell = this.cellRegistry.get(address);\n // Only include cells that have formulas\n if (cell && cell.formula) {\n if (!levels[level]) {\n levels[level] = [];\n }\n levels[level].push(cell);\n }\n });\n\n return levels;\n }\n\n /**\n * Flatten dependency graph into a flat array in topological order\n * Returns cells in the order they should be calculated\n * @returns Array of cells in topological order\n */\n flattenToTopology(): Cell[] {\n const levels = this.topologicalSort();\n const result: Cell[] = [];\n\n // Flatten the 2D array of levels into a 1D array\n for (const level of levels) {\n if (level) { // Skip undefined levels\n result.push(...level);\n }\n }\n\n return result;\n }\n\n /**\n * Get the depth level of the tree\n */\n getDepth() : number {\n return this._getDepth(this.depTree);\n }\n\n private _getDepth(tree : Record) : number {\n let max = 0;\n\n for (const key in tree) {\n const cell = tree[key];\n\n if (cell.getDependents()) {\n const depth = this._getDepth(cell.getDependents());\n\n if (depth > max) {\n max = depth;\n }\n }\n }\n\n return max + 1;\n }\n\n}","import { Cell } from \"../Cell\";\nimport { CellRegistry } from \"../Sheet/CellRegistry\";\nimport { EventDispatcher } from \"../Utility/EventDispatcher\";\nimport { DependencyTree } from \"./DependencyTree\";\nimport { Workbook } from \"../Workbook\";\n\nexport class DependencyBuilder {\n private patterns : Record = {\n remoteColumnRange : /\\#?[A-Za-z0-9_]+\\s*!\\s*[A-Za-z]+\\s*:\\s*[A-Za-z]+/g,\n remoteRowRange : /\\#?[A-Za-z0-9_]+\\s*!\\s*[0-9]+\\s*:\\s*[0-9]+/g,\n remoteCellRange : /\\#?[A-Za-z0-9_]+\\s*!\\s*[A-Za-z]+[0-9]+\\s*:\\s*[A-Za-z]+[0-9]+/g,\n remoteCell : /\\#?[A-Za-z0-9_]+\\s*!\\s*[A-Za-z]+[0-9]+/g,\n columnRange : /[A-Za-z]+\\s*:\\s*[A-Za-z]+/g,\n rowRange : /[0-9]+\\s*:\\s*[0-9]+/g,\n cellRange : /[A-Za-z]+[0-9]+\\s*:\\s*[A-Za-z]+[0-9]+/g,\n cell : /[A-Z]+[0-9]+/g,\n namedRange : /[A-Za-z_][A-Za-z0-9_\\.]*/g\n };\n\n private workbook?: Workbook;\n\n constructor() {\n\n }\n\n setWorkbook(workbook: Workbook) {\n this.workbook = workbook;\n }\n\n build(cells : CellRegistry, sheet?: any) : DependencyTree {\n // Build dependencies for each cell\n cells.each((cell : Cell) => {\n if (cell.formula) {\n const { localDeps, remoteDeps } = this.getFormulaDependencies(cell.formula);\n\n // Resolve local addresses to actual Cell objects\n const dependencies: Record = {};\n for (const address in localDeps) {\n const precedentCell = cells.get(address);\n if (precedentCell) {\n dependencies[address] = precedentCell;\n }\n }\n\n // Set precedents for this cell\n cell.setPrecedents(dependencies);\n\n // Set this cell as dependent for each local precedent\n for (const address in dependencies) {\n const precedentCell = dependencies[address];\n if (precedentCell) {\n precedentCell.addDependent(cell);\n }\n }\n\n // Handle remote (cross-sheet) dependencies\n if (this.workbook) {\n for (const remoteRef in remoteDeps) {\n const { sheetName, cellAddress } = this.parseRemoteReference(remoteRef);\n try {\n const remoteSheet = this.workbook.getSheet(sheetName);\n if (remoteSheet) {\n const remoteCellObj = remoteSheet.getCellDirect(cellAddress);\n if (remoteCellObj) {\n // Add this cell as a remote dependent of the precedent cell\n remoteCellObj.addRemoteDependent(cell);\n }\n }\n } catch (e) {\n // Sheet might not exist yet\n }\n }\n }\n }\n });\n\n return new DependencyTree(cells, new EventDispatcher, this);\n }\n\n public parseRemoteReference(remoteRef: string): { sheetName: string, cellAddress: string } {\n // Remove # prefix if present\n const cleanRef = remoteRef.replace(/^#/, '').trim();\n const parts = cleanRef.split('!');\n return {\n sheetName: parts[0].trim(),\n cellAddress: parts[1].trim()\n };\n }\n\n public getFormulaDependencies(formula : string) : { localDeps: Record, remoteDeps: Record } {\n const localDeps: Record = {};\n const remoteDeps: Record = {};\n\n // Remove leading '=' if present\n let cleanFormula = formula.startsWith('=') ? formula.substring(1) : formula;\n\n // Process patterns in order, replacing matched portions to prevent overlapping matches\n // Order matters: match more specific patterns first (e.g., ranges before individual cells)\n\n // 1. Remote column ranges: #Sheet1!A:C\n const remoteColumnMatches = cleanFormula.match(this.patterns.remoteColumnRange);\n if (remoteColumnMatches) {\n remoteColumnMatches.forEach(match => {\n remoteDeps[match.trim()] = true;\n });\n cleanFormula = cleanFormula.replace(this.patterns.remoteColumnRange, '');\n }\n\n // 2. Remote row ranges: #Sheet1!1:3\n const remoteRowMatches = cleanFormula.match(this.patterns.remoteRowRange);\n if (remoteRowMatches) {\n remoteRowMatches.forEach(match => {\n remoteDeps[match.trim()] = true;\n });\n cleanFormula = cleanFormula.replace(this.patterns.remoteRowRange, '');\n }\n\n // 3. Remote cell ranges: #Sheet1!A1:B3\n const remoteCellRangeMatches = cleanFormula.match(this.patterns.remoteCellRange);\n if (remoteCellRangeMatches) {\n remoteCellRangeMatches.forEach(match => {\n const [sheetPart, rangePart] = match.split('!');\n // Expand range into individual cells and add with sheet name\n const addresses = this.expandCellRange(rangePart.trim());\n addresses.forEach(addr => {\n remoteDeps[sheetPart + '!' + addr] = true;\n });\n });\n cleanFormula = cleanFormula.replace(this.patterns.remoteCellRange, '');\n }\n\n // 4. Remote cells: #Sheet1!A1\n const remoteCellMatches = cleanFormula.match(this.patterns.remoteCell);\n if (remoteCellMatches) {\n remoteCellMatches.forEach(match => {\n remoteDeps[match.trim()] = true;\n });\n cleanFormula = cleanFormula.replace(this.patterns.remoteCell, '');\n }\n\n // 5. Cell ranges: A1:B3\n const cellRangeMatches = cleanFormula.match(this.patterns.cellRange);\n if (cellRangeMatches) {\n cellRangeMatches.forEach(match => {\n // Expand range into individual cells\n const addresses = this.expandCellRange(match);\n addresses.forEach(addr => {\n localDeps[addr] = true;\n });\n });\n cleanFormula = cleanFormula.replace(this.patterns.cellRange, '');\n }\n\n // 6. Individual cells: A1, B2, etc.\n const cellMatches = cleanFormula.match(this.patterns.cell);\n if (cellMatches) {\n cellMatches.forEach(match => {\n // Filter out function names and keywords\n if (!this.isFunctionOrKeyword(match)) {\n localDeps[match] = true;\n }\n });\n }\n\n // 7. Named ranges: Resolve named ranges to their underlying cell references\n // After removing all other patterns, check remaining identifiers against named ranges\n if (this.workbook) {\n // Extract potential named range identifiers (words that aren't functions)\n const identifierMatches = cleanFormula.match(/[A-Za-z_][A-Za-z0-9_\\.]*/g);\n if (identifierMatches) {\n identifierMatches.forEach(identifier => {\n // Skip if it's a function or keyword\n if (this.isFunctionOrKeyword(identifier)) {\n return;\n }\n\n // Check if it's a named range\n if (this.workbook!.nameManager.has(identifier)) {\n const reference = this.workbook!.nameManager.getReference(identifier);\n if (reference) {\n // Check if it's a remote reference (contains !)\n if (reference.includes('!')) {\n // It's a cross-sheet reference\n remoteDeps[reference] = true;\n } else {\n // Parse the reference to extract cell addresses\n if (reference.includes(':')) {\n // It's a range\n const addresses = this.expandCellRange(reference);\n addresses.forEach(addr => {\n localDeps[addr] = true;\n });\n } else if (/^[A-Z]+[0-9]+$/.test(reference)) {\n // It's a single cell\n localDeps[reference] = true;\n }\n }\n }\n }\n });\n }\n }\n\n // Note: Column ranges (A:A) and row ranges (1:1) are dynamic dependencies\n // and should be handled separately as they don't have fixed precedents\n\n return { localDeps, remoteDeps };\n }\n\n private isFunctionOrKeyword(text: string): boolean {\n const keywords = [\n 'SUM', 'AVERAGE', 'MAX', 'MIN', 'COUNT', 'IF', 'AND', 'OR',\n 'VLOOKUP', 'HLOOKUP', 'INDEX', 'MATCH', 'CONCATENATE',\n 'TRUE', 'FALSE', 'NULL'\n ];\n return keywords.includes(text.toUpperCase());\n }\n\n /**\n * Extract cell addresses from a cell range (e.g., \"A1:B3\")\n * Handles reverse ranges like \"B2:A1\" by normalizing them\n */\n private expandCellRange(range: string): string[] {\n const [start, end] = range.split(':');\n const addresses: string[] = [];\n\n const startColMatch = start.match(/[A-Z]+/);\n const startRowMatch = start.match(/\\d+/);\n const endColMatch = end.match(/[A-Z]+/);\n const endRowMatch = end.match(/\\d+/);\n\n if (!startColMatch || !startRowMatch || !endColMatch || !endRowMatch) {\n return [];\n }\n\n const startCol = startColMatch[0];\n const startRow = parseInt(startRowMatch[0]);\n const endCol = endColMatch[0];\n const endRow = parseInt(endRowMatch[0]);\n\n const colToNum = (col: string) => {\n let num = 0;\n for (let i = 0; i < col.length; i++) {\n num = num * 26 + (col.charCodeAt(i) - 64);\n }\n return num;\n };\n\n const numToCol = (num: number) => {\n let col = '';\n while (num > 0) {\n const remainder = (num - 1) % 26;\n col = String.fromCharCode(65 + remainder) + col;\n num = Math.floor((num - 1) / 26);\n }\n return col;\n };\n\n const startColNum = colToNum(startCol);\n const endColNum = colToNum(endCol);\n\n // Normalize range to handle reverse ranges (B2:A1 -> A1:B2)\n const minRow = Math.min(startRow, endRow);\n const maxRow = Math.max(startRow, endRow);\n const minCol = Math.min(startColNum, endColNum);\n const maxCol = Math.max(startColNum, endColNum);\n\n for (let row = minRow; row <= maxRow; row++) {\n for (let col = minCol; col <= maxCol; col++) {\n addresses.push(numToCol(col) + row);\n }\n }\n\n return addresses;\n }\n}","var baseIsSet = require('./_baseIsSet'),\n baseUnary = require('./_baseUnary'),\n nodeUtil = require('./_nodeUtil');\n\n/* Node.js helper references. */\nvar nodeIsSet = nodeUtil && nodeUtil.isSet;\n\n/**\n * Checks if `value` is classified as a `Set` object.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a set, else `false`.\n * @example\n *\n * _.isSet(new Set);\n * // => true\n *\n * _.isSet(new WeakSet);\n * // => false\n */\nvar isSet = nodeIsSet ? baseUnary(nodeIsSet) : baseIsSet;\n\nmodule.exports = isSet;\n","\"use strict\";\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.serializeProduction = exports.serializeGrammar = exports.Terminal = exports.Alternation = exports.RepetitionWithSeparator = exports.Repetition = exports.RepetitionMandatoryWithSeparator = exports.RepetitionMandatory = exports.Option = exports.Alternative = exports.Rule = exports.NonTerminal = exports.AbstractProduction = void 0;\nvar map_1 = __importDefault(require(\"lodash/map\"));\nvar forEach_1 = __importDefault(require(\"lodash/forEach\"));\nvar isString_1 = __importDefault(require(\"lodash/isString\"));\nvar isRegExp_1 = __importDefault(require(\"lodash/isRegExp\"));\nvar pickBy_1 = __importDefault(require(\"lodash/pickBy\"));\nvar assign_1 = __importDefault(require(\"lodash/assign\"));\n// TODO: duplicated code to avoid extracting another sub-package -- how to avoid?\nfunction tokenLabel(tokType) {\n if (hasTokenLabel(tokType)) {\n return tokType.LABEL;\n }\n else {\n return tokType.name;\n }\n}\n// TODO: duplicated code to avoid extracting another sub-package -- how to avoid?\nfunction hasTokenLabel(obj) {\n return (0, isString_1.default)(obj.LABEL) && obj.LABEL !== \"\";\n}\nvar AbstractProduction = /** @class */ (function () {\n function AbstractProduction(_definition) {\n this._definition = _definition;\n }\n Object.defineProperty(AbstractProduction.prototype, \"definition\", {\n get: function () {\n return this._definition;\n },\n set: function (value) {\n this._definition = value;\n },\n enumerable: false,\n configurable: true\n });\n AbstractProduction.prototype.accept = function (visitor) {\n visitor.visit(this);\n (0, forEach_1.default)(this.definition, function (prod) {\n prod.accept(visitor);\n });\n };\n return AbstractProduction;\n}());\nexports.AbstractProduction = AbstractProduction;\nvar NonTerminal = /** @class */ (function (_super) {\n __extends(NonTerminal, _super);\n function NonTerminal(options) {\n var _this = _super.call(this, []) || this;\n _this.idx = 1;\n (0, assign_1.default)(_this, (0, pickBy_1.default)(options, function (v) { return v !== undefined; }));\n return _this;\n }\n Object.defineProperty(NonTerminal.prototype, \"definition\", {\n get: function () {\n if (this.referencedRule !== undefined) {\n return this.referencedRule.definition;\n }\n return [];\n },\n set: function (definition) {\n // immutable\n },\n enumerable: false,\n configurable: true\n });\n NonTerminal.prototype.accept = function (visitor) {\n visitor.visit(this);\n // don't visit children of a reference, we will get cyclic infinite loops if we do so\n };\n return NonTerminal;\n}(AbstractProduction));\nexports.NonTerminal = NonTerminal;\nvar Rule = /** @class */ (function (_super) {\n __extends(Rule, _super);\n function Rule(options) {\n var _this = _super.call(this, options.definition) || this;\n _this.orgText = \"\";\n (0, assign_1.default)(_this, (0, pickBy_1.default)(options, function (v) { return v !== undefined; }));\n return _this;\n }\n return Rule;\n}(AbstractProduction));\nexports.Rule = Rule;\nvar Alternative = /** @class */ (function (_super) {\n __extends(Alternative, _super);\n function Alternative(options) {\n var _this = _super.call(this, options.definition) || this;\n _this.ignoreAmbiguities = false;\n (0, assign_1.default)(_this, (0, pickBy_1.default)(options, function (v) { return v !== undefined; }));\n return _this;\n }\n return Alternative;\n}(AbstractProduction));\nexports.Alternative = Alternative;\nvar Option = /** @class */ (function (_super) {\n __extends(Option, _super);\n function Option(options) {\n var _this = _super.call(this, options.definition) || this;\n _this.idx = 1;\n (0, assign_1.default)(_this, (0, pickBy_1.default)(options, function (v) { return v !== undefined; }));\n return _this;\n }\n return Option;\n}(AbstractProduction));\nexports.Option = Option;\nvar RepetitionMandatory = /** @class */ (function (_super) {\n __extends(RepetitionMandatory, _super);\n function RepetitionMandatory(options) {\n var _this = _super.call(this, options.definition) || this;\n _this.idx = 1;\n (0, assign_1.default)(_this, (0, pickBy_1.default)(options, function (v) { return v !== undefined; }));\n return _this;\n }\n return RepetitionMandatory;\n}(AbstractProduction));\nexports.RepetitionMandatory = RepetitionMandatory;\nvar RepetitionMandatoryWithSeparator = /** @class */ (function (_super) {\n __extends(RepetitionMandatoryWithSeparator, _super);\n function RepetitionMandatoryWithSeparator(options) {\n var _this = _super.call(this, options.definition) || this;\n _this.idx = 1;\n (0, assign_1.default)(_this, (0, pickBy_1.default)(options, function (v) { return v !== undefined; }));\n return _this;\n }\n return RepetitionMandatoryWithSeparator;\n}(AbstractProduction));\nexports.RepetitionMandatoryWithSeparator = RepetitionMandatoryWithSeparator;\nvar Repetition = /** @class */ (function (_super) {\n __extends(Repetition, _super);\n function Repetition(options) {\n var _this = _super.call(this, options.definition) || this;\n _this.idx = 1;\n (0, assign_1.default)(_this, (0, pickBy_1.default)(options, function (v) { return v !== undefined; }));\n return _this;\n }\n return Repetition;\n}(AbstractProduction));\nexports.Repetition = Repetition;\nvar RepetitionWithSeparator = /** @class */ (function (_super) {\n __extends(RepetitionWithSeparator, _super);\n function RepetitionWithSeparator(options) {\n var _this = _super.call(this, options.definition) || this;\n _this.idx = 1;\n (0, assign_1.default)(_this, (0, pickBy_1.default)(options, function (v) { return v !== undefined; }));\n return _this;\n }\n return RepetitionWithSeparator;\n}(AbstractProduction));\nexports.RepetitionWithSeparator = RepetitionWithSeparator;\nvar Alternation = /** @class */ (function (_super) {\n __extends(Alternation, _super);\n function Alternation(options) {\n var _this = _super.call(this, options.definition) || this;\n _this.idx = 1;\n _this.ignoreAmbiguities = false;\n _this.hasPredicates = false;\n (0, assign_1.default)(_this, (0, pickBy_1.default)(options, function (v) { return v !== undefined; }));\n return _this;\n }\n Object.defineProperty(Alternation.prototype, \"definition\", {\n get: function () {\n return this._definition;\n },\n set: function (value) {\n this._definition = value;\n },\n enumerable: false,\n configurable: true\n });\n return Alternation;\n}(AbstractProduction));\nexports.Alternation = Alternation;\nvar Terminal = /** @class */ (function () {\n function Terminal(options) {\n this.idx = 1;\n (0, assign_1.default)(this, (0, pickBy_1.default)(options, function (v) { return v !== undefined; }));\n }\n Terminal.prototype.accept = function (visitor) {\n visitor.visit(this);\n };\n return Terminal;\n}());\nexports.Terminal = Terminal;\nfunction serializeGrammar(topRules) {\n return (0, map_1.default)(topRules, serializeProduction);\n}\nexports.serializeGrammar = serializeGrammar;\nfunction serializeProduction(node) {\n function convertDefinition(definition) {\n return (0, map_1.default)(definition, serializeProduction);\n }\n /* istanbul ignore else */\n if (node instanceof NonTerminal) {\n var serializedNonTerminal = {\n type: \"NonTerminal\",\n name: node.nonTerminalName,\n idx: node.idx\n };\n if ((0, isString_1.default)(node.label)) {\n serializedNonTerminal.label = node.label;\n }\n return serializedNonTerminal;\n }\n else if (node instanceof Alternative) {\n return {\n type: \"Alternative\",\n definition: convertDefinition(node.definition)\n };\n }\n else if (node instanceof Option) {\n return {\n type: \"Option\",\n idx: node.idx,\n definition: convertDefinition(node.definition)\n };\n }\n else if (node instanceof RepetitionMandatory) {\n return {\n type: \"RepetitionMandatory\",\n idx: node.idx,\n definition: convertDefinition(node.definition)\n };\n }\n else if (node instanceof RepetitionMandatoryWithSeparator) {\n return {\n type: \"RepetitionMandatoryWithSeparator\",\n idx: node.idx,\n separator: (serializeProduction(new Terminal({ terminalType: node.separator }))),\n definition: convertDefinition(node.definition)\n };\n }\n else if (node instanceof RepetitionWithSeparator) {\n return {\n type: \"RepetitionWithSeparator\",\n idx: node.idx,\n separator: (serializeProduction(new Terminal({ terminalType: node.separator }))),\n definition: convertDefinition(node.definition)\n };\n }\n else if (node instanceof Repetition) {\n return {\n type: \"Repetition\",\n idx: node.idx,\n definition: convertDefinition(node.definition)\n };\n }\n else if (node instanceof Alternation) {\n return {\n type: \"Alternation\",\n idx: node.idx,\n definition: convertDefinition(node.definition)\n };\n }\n else if (node instanceof Terminal) {\n var serializedTerminal = {\n type: \"Terminal\",\n name: node.terminalType.name,\n label: tokenLabel(node.terminalType),\n idx: node.idx\n };\n if ((0, isString_1.default)(node.label)) {\n serializedTerminal.terminalLabel = node.label;\n }\n var pattern = node.terminalType.PATTERN;\n if (node.terminalType.PATTERN) {\n serializedTerminal.pattern = (0, isRegExp_1.default)(pattern)\n ? pattern.source\n : pattern;\n }\n return serializedTerminal;\n }\n else if (node instanceof Rule) {\n return {\n type: \"Rule\",\n name: node.name,\n orgText: node.orgText,\n definition: convertDefinition(node.definition)\n };\n }\n else {\n throw Error(\"non exhaustive match\");\n }\n}\nexports.serializeProduction = serializeProduction;\n//# sourceMappingURL=model.js.map","var isArray = require('./isArray'),\n isSymbol = require('./isSymbol');\n\n/** Used to match property names within property paths. */\nvar reIsDeepProp = /\\.|\\[(?:[^[\\]]*|([\"'])(?:(?!\\1)[^\\\\]|\\\\.)*?\\1)\\]/,\n reIsPlainProp = /^\\w*$/;\n\n/**\n * Checks if `value` is a property name and not a property path.\n *\n * @private\n * @param {*} value The value to check.\n * @param {Object} [object] The object to query keys on.\n * @returns {boolean} Returns `true` if `value` is a property name, else `false`.\n */\nfunction isKey(value, object) {\n if (isArray(value)) {\n return false;\n }\n var type = typeof value;\n if (type == 'number' || type == 'symbol' || type == 'boolean' ||\n value == null || isSymbol(value)) {\n return true;\n }\n return reIsPlainProp.test(value) || !reIsDeepProp.test(value) ||\n (object != null && value in Object(object));\n}\n\nmodule.exports = isKey;\n","var assocIndexOf = require('./_assocIndexOf');\n\n/**\n * Checks if a list cache value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf ListCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction listCacheHas(key) {\n return assocIndexOf(this.__data__, key) > -1;\n}\n\nmodule.exports = listCacheHas;\n","\"use strict\";\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.areTokenCategoriesNotUsed = exports.isStrictPrefixOfPath = exports.containsPath = exports.getLookaheadPathsForOptionalProd = exports.getLookaheadPathsForOr = exports.lookAheadSequenceFromAlternatives = exports.buildSingleAlternativeLookaheadFunction = exports.buildAlternativesLookAheadFunc = exports.buildLookaheadFuncForOptionalProd = exports.buildLookaheadFuncForOr = exports.getLookaheadPaths = exports.getProdType = exports.PROD_TYPE = void 0;\nvar isEmpty_1 = __importDefault(require(\"lodash/isEmpty\"));\nvar flatten_1 = __importDefault(require(\"lodash/flatten\"));\nvar every_1 = __importDefault(require(\"lodash/every\"));\nvar map_1 = __importDefault(require(\"lodash/map\"));\nvar forEach_1 = __importDefault(require(\"lodash/forEach\"));\nvar has_1 = __importDefault(require(\"lodash/has\"));\nvar reduce_1 = __importDefault(require(\"lodash/reduce\"));\nvar interpreter_1 = require(\"./interpreter\");\nvar rest_1 = require(\"./rest\");\nvar tokens_1 = require(\"../../scan/tokens\");\nvar gast_1 = require(\"@chevrotain/gast\");\nvar gast_2 = require(\"@chevrotain/gast\");\nvar PROD_TYPE;\n(function (PROD_TYPE) {\n PROD_TYPE[PROD_TYPE[\"OPTION\"] = 0] = \"OPTION\";\n PROD_TYPE[PROD_TYPE[\"REPETITION\"] = 1] = \"REPETITION\";\n PROD_TYPE[PROD_TYPE[\"REPETITION_MANDATORY\"] = 2] = \"REPETITION_MANDATORY\";\n PROD_TYPE[PROD_TYPE[\"REPETITION_MANDATORY_WITH_SEPARATOR\"] = 3] = \"REPETITION_MANDATORY_WITH_SEPARATOR\";\n PROD_TYPE[PROD_TYPE[\"REPETITION_WITH_SEPARATOR\"] = 4] = \"REPETITION_WITH_SEPARATOR\";\n PROD_TYPE[PROD_TYPE[\"ALTERNATION\"] = 5] = \"ALTERNATION\";\n})(PROD_TYPE = exports.PROD_TYPE || (exports.PROD_TYPE = {}));\nfunction getProdType(prod) {\n /* istanbul ignore else */\n if (prod instanceof gast_1.Option || prod === \"Option\") {\n return PROD_TYPE.OPTION;\n }\n else if (prod instanceof gast_1.Repetition || prod === \"Repetition\") {\n return PROD_TYPE.REPETITION;\n }\n else if (prod instanceof gast_1.RepetitionMandatory ||\n prod === \"RepetitionMandatory\") {\n return PROD_TYPE.REPETITION_MANDATORY;\n }\n else if (prod instanceof gast_1.RepetitionMandatoryWithSeparator ||\n prod === \"RepetitionMandatoryWithSeparator\") {\n return PROD_TYPE.REPETITION_MANDATORY_WITH_SEPARATOR;\n }\n else if (prod instanceof gast_1.RepetitionWithSeparator ||\n prod === \"RepetitionWithSeparator\") {\n return PROD_TYPE.REPETITION_WITH_SEPARATOR;\n }\n else if (prod instanceof gast_1.Alternation || prod === \"Alternation\") {\n return PROD_TYPE.ALTERNATION;\n }\n else {\n throw Error(\"non exhaustive match\");\n }\n}\nexports.getProdType = getProdType;\nfunction getLookaheadPaths(options) {\n var occurrence = options.occurrence, rule = options.rule, prodType = options.prodType, maxLookahead = options.maxLookahead;\n var type = getProdType(prodType);\n if (type === PROD_TYPE.ALTERNATION) {\n return getLookaheadPathsForOr(occurrence, rule, maxLookahead);\n }\n else {\n return getLookaheadPathsForOptionalProd(occurrence, rule, type, maxLookahead);\n }\n}\nexports.getLookaheadPaths = getLookaheadPaths;\nfunction buildLookaheadFuncForOr(occurrence, ruleGrammar, maxLookahead, hasPredicates, dynamicTokensEnabled, laFuncBuilder) {\n var lookAheadPaths = getLookaheadPathsForOr(occurrence, ruleGrammar, maxLookahead);\n var tokenMatcher = areTokenCategoriesNotUsed(lookAheadPaths)\n ? tokens_1.tokenStructuredMatcherNoCategories\n : tokens_1.tokenStructuredMatcher;\n return laFuncBuilder(lookAheadPaths, hasPredicates, tokenMatcher, dynamicTokensEnabled);\n}\nexports.buildLookaheadFuncForOr = buildLookaheadFuncForOr;\n/**\n * When dealing with an Optional production (OPTION/MANY/2nd iteration of AT_LEAST_ONE/...) we need to compare\n * the lookahead \"inside\" the production and the lookahead immediately \"after\" it in the same top level rule (context free).\n *\n * Example: given a production:\n * ABC(DE)?DF\n *\n * The optional '(DE)?' should only be entered if we see 'DE'. a single Token 'D' is not sufficient to distinguish between the two\n * alternatives.\n *\n * @returns A Lookahead function which will return true IFF the parser should parse the Optional production.\n */\nfunction buildLookaheadFuncForOptionalProd(occurrence, ruleGrammar, k, dynamicTokensEnabled, prodType, lookaheadBuilder) {\n var lookAheadPaths = getLookaheadPathsForOptionalProd(occurrence, ruleGrammar, prodType, k);\n var tokenMatcher = areTokenCategoriesNotUsed(lookAheadPaths)\n ? tokens_1.tokenStructuredMatcherNoCategories\n : tokens_1.tokenStructuredMatcher;\n return lookaheadBuilder(lookAheadPaths[0], tokenMatcher, dynamicTokensEnabled);\n}\nexports.buildLookaheadFuncForOptionalProd = buildLookaheadFuncForOptionalProd;\nfunction buildAlternativesLookAheadFunc(alts, hasPredicates, tokenMatcher, dynamicTokensEnabled) {\n var numOfAlts = alts.length;\n var areAllOneTokenLookahead = (0, every_1.default)(alts, function (currAlt) {\n return (0, every_1.default)(currAlt, function (currPath) {\n return currPath.length === 1;\n });\n });\n // This version takes into account the predicates as well.\n if (hasPredicates) {\n /**\n * @returns {number} - The chosen alternative index\n */\n return function (orAlts) {\n // unfortunately the predicates must be extracted every single time\n // as they cannot be cached due to references to parameters(vars) which are no longer valid.\n // note that in the common case of no predicates, no cpu time will be wasted on this (see else block)\n var predicates = (0, map_1.default)(orAlts, function (currAlt) { return currAlt.GATE; });\n for (var t = 0; t < numOfAlts; t++) {\n var currAlt = alts[t];\n var currNumOfPaths = currAlt.length;\n var currPredicate = predicates[t];\n if (currPredicate !== undefined && currPredicate.call(this) === false) {\n // if the predicate does not match there is no point in checking the paths\n continue;\n }\n nextPath: for (var j = 0; j < currNumOfPaths; j++) {\n var currPath = currAlt[j];\n var currPathLength = currPath.length;\n for (var i = 0; i < currPathLength; i++) {\n var nextToken = this.LA(i + 1);\n if (tokenMatcher(nextToken, currPath[i]) === false) {\n // mismatch in current path\n // try the next pth\n continue nextPath;\n }\n }\n // found a full path that matches.\n // this will also work for an empty ALT as the loop will be skipped\n return t;\n }\n // none of the paths for the current alternative matched\n // try the next alternative\n }\n // none of the alternatives could be matched\n return undefined;\n };\n }\n else if (areAllOneTokenLookahead && !dynamicTokensEnabled) {\n // optimized (common) case of all the lookaheads paths requiring only\n // a single token lookahead. These Optimizations cannot work if dynamically defined Tokens are used.\n var singleTokenAlts = (0, map_1.default)(alts, function (currAlt) {\n return (0, flatten_1.default)(currAlt);\n });\n var choiceToAlt_1 = (0, reduce_1.default)(singleTokenAlts, function (result, currAlt, idx) {\n (0, forEach_1.default)(currAlt, function (currTokType) {\n if (!(0, has_1.default)(result, currTokType.tokenTypeIdx)) {\n result[currTokType.tokenTypeIdx] = idx;\n }\n (0, forEach_1.default)(currTokType.categoryMatches, function (currExtendingType) {\n if (!(0, has_1.default)(result, currExtendingType)) {\n result[currExtendingType] = idx;\n }\n });\n });\n return result;\n }, {});\n /**\n * @returns {number} - The chosen alternative index\n */\n return function () {\n var nextToken = this.LA(1);\n return choiceToAlt_1[nextToken.tokenTypeIdx];\n };\n }\n else {\n // optimized lookahead without needing to check the predicates at all.\n // this causes code duplication which is intentional to improve performance.\n /**\n * @returns {number} - The chosen alternative index\n */\n return function () {\n for (var t = 0; t < numOfAlts; t++) {\n var currAlt = alts[t];\n var currNumOfPaths = currAlt.length;\n nextPath: for (var j = 0; j < currNumOfPaths; j++) {\n var currPath = currAlt[j];\n var currPathLength = currPath.length;\n for (var i = 0; i < currPathLength; i++) {\n var nextToken = this.LA(i + 1);\n if (tokenMatcher(nextToken, currPath[i]) === false) {\n // mismatch in current path\n // try the next pth\n continue nextPath;\n }\n }\n // found a full path that matches.\n // this will also work for an empty ALT as the loop will be skipped\n return t;\n }\n // none of the paths for the current alternative matched\n // try the next alternative\n }\n // none of the alternatives could be matched\n return undefined;\n };\n }\n}\nexports.buildAlternativesLookAheadFunc = buildAlternativesLookAheadFunc;\nfunction buildSingleAlternativeLookaheadFunction(alt, tokenMatcher, dynamicTokensEnabled) {\n var areAllOneTokenLookahead = (0, every_1.default)(alt, function (currPath) {\n return currPath.length === 1;\n });\n var numOfPaths = alt.length;\n // optimized (common) case of all the lookaheads paths requiring only\n // a single token lookahead.\n if (areAllOneTokenLookahead && !dynamicTokensEnabled) {\n var singleTokensTypes = (0, flatten_1.default)(alt);\n if (singleTokensTypes.length === 1 &&\n (0, isEmpty_1.default)(singleTokensTypes[0].categoryMatches)) {\n var expectedTokenType = singleTokensTypes[0];\n var expectedTokenUniqueKey_1 = expectedTokenType.tokenTypeIdx;\n return function () {\n return this.LA(1).tokenTypeIdx === expectedTokenUniqueKey_1;\n };\n }\n else {\n var choiceToAlt_2 = (0, reduce_1.default)(singleTokensTypes, function (result, currTokType, idx) {\n result[currTokType.tokenTypeIdx] = true;\n (0, forEach_1.default)(currTokType.categoryMatches, function (currExtendingType) {\n result[currExtendingType] = true;\n });\n return result;\n }, []);\n return function () {\n var nextToken = this.LA(1);\n return choiceToAlt_2[nextToken.tokenTypeIdx] === true;\n };\n }\n }\n else {\n return function () {\n nextPath: for (var j = 0; j < numOfPaths; j++) {\n var currPath = alt[j];\n var currPathLength = currPath.length;\n for (var i = 0; i < currPathLength; i++) {\n var nextToken = this.LA(i + 1);\n if (tokenMatcher(nextToken, currPath[i]) === false) {\n // mismatch in current path\n // try the next pth\n continue nextPath;\n }\n }\n // found a full path that matches.\n return true;\n }\n // none of the paths matched\n return false;\n };\n }\n}\nexports.buildSingleAlternativeLookaheadFunction = buildSingleAlternativeLookaheadFunction;\nvar RestDefinitionFinderWalker = /** @class */ (function (_super) {\n __extends(RestDefinitionFinderWalker, _super);\n function RestDefinitionFinderWalker(topProd, targetOccurrence, targetProdType) {\n var _this = _super.call(this) || this;\n _this.topProd = topProd;\n _this.targetOccurrence = targetOccurrence;\n _this.targetProdType = targetProdType;\n return _this;\n }\n RestDefinitionFinderWalker.prototype.startWalking = function () {\n this.walk(this.topProd);\n return this.restDef;\n };\n RestDefinitionFinderWalker.prototype.checkIsTarget = function (node, expectedProdType, currRest, prevRest) {\n if (node.idx === this.targetOccurrence &&\n this.targetProdType === expectedProdType) {\n this.restDef = currRest.concat(prevRest);\n return true;\n }\n // performance optimization, do not iterate over the entire Grammar ast after we have found the target\n return false;\n };\n RestDefinitionFinderWalker.prototype.walkOption = function (optionProd, currRest, prevRest) {\n if (!this.checkIsTarget(optionProd, PROD_TYPE.OPTION, currRest, prevRest)) {\n _super.prototype.walkOption.call(this, optionProd, currRest, prevRest);\n }\n };\n RestDefinitionFinderWalker.prototype.walkAtLeastOne = function (atLeastOneProd, currRest, prevRest) {\n if (!this.checkIsTarget(atLeastOneProd, PROD_TYPE.REPETITION_MANDATORY, currRest, prevRest)) {\n _super.prototype.walkOption.call(this, atLeastOneProd, currRest, prevRest);\n }\n };\n RestDefinitionFinderWalker.prototype.walkAtLeastOneSep = function (atLeastOneSepProd, currRest, prevRest) {\n if (!this.checkIsTarget(atLeastOneSepProd, PROD_TYPE.REPETITION_MANDATORY_WITH_SEPARATOR, currRest, prevRest)) {\n _super.prototype.walkOption.call(this, atLeastOneSepProd, currRest, prevRest);\n }\n };\n RestDefinitionFinderWalker.prototype.walkMany = function (manyProd, currRest, prevRest) {\n if (!this.checkIsTarget(manyProd, PROD_TYPE.REPETITION, currRest, prevRest)) {\n _super.prototype.walkOption.call(this, manyProd, currRest, prevRest);\n }\n };\n RestDefinitionFinderWalker.prototype.walkManySep = function (manySepProd, currRest, prevRest) {\n if (!this.checkIsTarget(manySepProd, PROD_TYPE.REPETITION_WITH_SEPARATOR, currRest, prevRest)) {\n _super.prototype.walkOption.call(this, manySepProd, currRest, prevRest);\n }\n };\n return RestDefinitionFinderWalker;\n}(rest_1.RestWalker));\n/**\n * Returns the definition of a target production in a top level level rule.\n */\nvar InsideDefinitionFinderVisitor = /** @class */ (function (_super) {\n __extends(InsideDefinitionFinderVisitor, _super);\n function InsideDefinitionFinderVisitor(targetOccurrence, targetProdType, targetRef) {\n var _this = _super.call(this) || this;\n _this.targetOccurrence = targetOccurrence;\n _this.targetProdType = targetProdType;\n _this.targetRef = targetRef;\n _this.result = [];\n return _this;\n }\n InsideDefinitionFinderVisitor.prototype.checkIsTarget = function (node, expectedProdName) {\n if (node.idx === this.targetOccurrence &&\n this.targetProdType === expectedProdName &&\n (this.targetRef === undefined || node === this.targetRef)) {\n this.result = node.definition;\n }\n };\n InsideDefinitionFinderVisitor.prototype.visitOption = function (node) {\n this.checkIsTarget(node, PROD_TYPE.OPTION);\n };\n InsideDefinitionFinderVisitor.prototype.visitRepetition = function (node) {\n this.checkIsTarget(node, PROD_TYPE.REPETITION);\n };\n InsideDefinitionFinderVisitor.prototype.visitRepetitionMandatory = function (node) {\n this.checkIsTarget(node, PROD_TYPE.REPETITION_MANDATORY);\n };\n InsideDefinitionFinderVisitor.prototype.visitRepetitionMandatoryWithSeparator = function (node) {\n this.checkIsTarget(node, PROD_TYPE.REPETITION_MANDATORY_WITH_SEPARATOR);\n };\n InsideDefinitionFinderVisitor.prototype.visitRepetitionWithSeparator = function (node) {\n this.checkIsTarget(node, PROD_TYPE.REPETITION_WITH_SEPARATOR);\n };\n InsideDefinitionFinderVisitor.prototype.visitAlternation = function (node) {\n this.checkIsTarget(node, PROD_TYPE.ALTERNATION);\n };\n return InsideDefinitionFinderVisitor;\n}(gast_2.GAstVisitor));\nfunction initializeArrayOfArrays(size) {\n var result = new Array(size);\n for (var i = 0; i < size; i++) {\n result[i] = [];\n }\n return result;\n}\n/**\n * A sort of hash function between a Path in the grammar and a string.\n * Note that this returns multiple \"hashes\" to support the scenario of token categories.\n * - A single path with categories may match multiple **actual** paths.\n */\nfunction pathToHashKeys(path) {\n var keys = [\"\"];\n for (var i = 0; i < path.length; i++) {\n var tokType = path[i];\n var longerKeys = [];\n for (var j = 0; j < keys.length; j++) {\n var currShorterKey = keys[j];\n longerKeys.push(currShorterKey + \"_\" + tokType.tokenTypeIdx);\n for (var t = 0; t < tokType.categoryMatches.length; t++) {\n var categoriesKeySuffix = \"_\" + tokType.categoryMatches[t];\n longerKeys.push(currShorterKey + categoriesKeySuffix);\n }\n }\n keys = longerKeys;\n }\n return keys;\n}\n/**\n * Imperative style due to being called from a hot spot\n */\nfunction isUniquePrefixHash(altKnownPathsKeys, searchPathKeys, idx) {\n for (var currAltIdx = 0; currAltIdx < altKnownPathsKeys.length; currAltIdx++) {\n // We only want to test vs the other alternatives\n if (currAltIdx === idx) {\n continue;\n }\n var otherAltKnownPathsKeys = altKnownPathsKeys[currAltIdx];\n for (var searchIdx = 0; searchIdx < searchPathKeys.length; searchIdx++) {\n var searchKey = searchPathKeys[searchIdx];\n if (otherAltKnownPathsKeys[searchKey] === true) {\n return false;\n }\n }\n }\n // None of the SearchPathKeys were found in any of the other alternatives\n return true;\n}\nfunction lookAheadSequenceFromAlternatives(altsDefs, k) {\n var partialAlts = (0, map_1.default)(altsDefs, function (currAlt) {\n return (0, interpreter_1.possiblePathsFrom)([currAlt], 1);\n });\n var finalResult = initializeArrayOfArrays(partialAlts.length);\n var altsHashes = (0, map_1.default)(partialAlts, function (currAltPaths) {\n var dict = {};\n (0, forEach_1.default)(currAltPaths, function (item) {\n var keys = pathToHashKeys(item.partialPath);\n (0, forEach_1.default)(keys, function (currKey) {\n dict[currKey] = true;\n });\n });\n return dict;\n });\n var newData = partialAlts;\n // maxLookahead loop\n for (var pathLength = 1; pathLength <= k; pathLength++) {\n var currDataset = newData;\n newData = initializeArrayOfArrays(currDataset.length);\n var _loop_1 = function (altIdx) {\n var currAltPathsAndSuffixes = currDataset[altIdx];\n // paths in current alternative loop\n for (var currPathIdx = 0; currPathIdx < currAltPathsAndSuffixes.length; currPathIdx++) {\n var currPathPrefix = currAltPathsAndSuffixes[currPathIdx].partialPath;\n var suffixDef = currAltPathsAndSuffixes[currPathIdx].suffixDef;\n var prefixKeys = pathToHashKeys(currPathPrefix);\n var isUnique = isUniquePrefixHash(altsHashes, prefixKeys, altIdx);\n // End of the line for this path.\n if (isUnique || (0, isEmpty_1.default)(suffixDef) || currPathPrefix.length === k) {\n var currAltResult = finalResult[altIdx];\n // TODO: Can we implement a containsPath using Maps/Dictionaries?\n if (containsPath(currAltResult, currPathPrefix) === false) {\n currAltResult.push(currPathPrefix);\n // Update all new keys for the current path.\n for (var j = 0; j < prefixKeys.length; j++) {\n var currKey = prefixKeys[j];\n altsHashes[altIdx][currKey] = true;\n }\n }\n }\n // Expand longer paths\n else {\n var newPartialPathsAndSuffixes = (0, interpreter_1.possiblePathsFrom)(suffixDef, pathLength + 1, currPathPrefix);\n newData[altIdx] = newData[altIdx].concat(newPartialPathsAndSuffixes);\n // Update keys for new known paths\n (0, forEach_1.default)(newPartialPathsAndSuffixes, function (item) {\n var prefixKeys = pathToHashKeys(item.partialPath);\n (0, forEach_1.default)(prefixKeys, function (key) {\n altsHashes[altIdx][key] = true;\n });\n });\n }\n }\n };\n // alternatives loop\n for (var altIdx = 0; altIdx < currDataset.length; altIdx++) {\n _loop_1(altIdx);\n }\n }\n return finalResult;\n}\nexports.lookAheadSequenceFromAlternatives = lookAheadSequenceFromAlternatives;\nfunction getLookaheadPathsForOr(occurrence, ruleGrammar, k, orProd) {\n var visitor = new InsideDefinitionFinderVisitor(occurrence, PROD_TYPE.ALTERNATION, orProd);\n ruleGrammar.accept(visitor);\n return lookAheadSequenceFromAlternatives(visitor.result, k);\n}\nexports.getLookaheadPathsForOr = getLookaheadPathsForOr;\nfunction getLookaheadPathsForOptionalProd(occurrence, ruleGrammar, prodType, k) {\n var insideDefVisitor = new InsideDefinitionFinderVisitor(occurrence, prodType);\n ruleGrammar.accept(insideDefVisitor);\n var insideDef = insideDefVisitor.result;\n var afterDefWalker = new RestDefinitionFinderWalker(ruleGrammar, occurrence, prodType);\n var afterDef = afterDefWalker.startWalking();\n var insideFlat = new gast_1.Alternative({ definition: insideDef });\n var afterFlat = new gast_1.Alternative({ definition: afterDef });\n return lookAheadSequenceFromAlternatives([insideFlat, afterFlat], k);\n}\nexports.getLookaheadPathsForOptionalProd = getLookaheadPathsForOptionalProd;\nfunction containsPath(alternative, searchPath) {\n compareOtherPath: for (var i = 0; i < alternative.length; i++) {\n var otherPath = alternative[i];\n if (otherPath.length !== searchPath.length) {\n continue;\n }\n for (var j = 0; j < otherPath.length; j++) {\n var searchTok = searchPath[j];\n var otherTok = otherPath[j];\n var matchingTokens = searchTok === otherTok ||\n otherTok.categoryMatchesMap[searchTok.tokenTypeIdx] !== undefined;\n if (matchingTokens === false) {\n continue compareOtherPath;\n }\n }\n return true;\n }\n return false;\n}\nexports.containsPath = containsPath;\nfunction isStrictPrefixOfPath(prefix, other) {\n return (prefix.length < other.length &&\n (0, every_1.default)(prefix, function (tokType, idx) {\n var otherTokType = other[idx];\n return (tokType === otherTokType ||\n otherTokType.categoryMatchesMap[tokType.tokenTypeIdx]);\n }));\n}\nexports.isStrictPrefixOfPath = isStrictPrefixOfPath;\nfunction areTokenCategoriesNotUsed(lookAheadPaths) {\n return (0, every_1.default)(lookAheadPaths, function (singleAltPaths) {\n return (0, every_1.default)(singleAltPaths, function (singlePath) {\n return (0, every_1.default)(singlePath, function (token) { return (0, isEmpty_1.default)(token.categoryMatches); });\n });\n });\n}\nexports.areTokenCategoriesNotUsed = areTokenCategoriesNotUsed;\n//# sourceMappingURL=lookahead.js.map","var baseSlice = require('./_baseSlice');\n\n/**\n * Casts `array` to a slice if it's needed.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {number} start The start position.\n * @param {number} [end=array.length] The end position.\n * @returns {Array} Returns the cast slice.\n */\nfunction castSlice(array, start, end) {\n var length = array.length;\n end = end === undefined ? length : end;\n return (!start && end >= length) ? array : baseSlice(array, start, end);\n}\n\nmodule.exports = castSlice;\n","var MapCache = require('./_MapCache'),\n setCacheAdd = require('./_setCacheAdd'),\n setCacheHas = require('./_setCacheHas');\n\n/**\n *\n * Creates an array cache object to store unique values.\n *\n * @private\n * @constructor\n * @param {Array} [values] The values to cache.\n */\nfunction SetCache(values) {\n var index = -1,\n length = values == null ? 0 : values.length;\n\n this.__data__ = new MapCache;\n while (++index < length) {\n this.add(values[index]);\n }\n}\n\n// Add methods to `SetCache`.\nSetCache.prototype.add = SetCache.prototype.push = setCacheAdd;\nSetCache.prototype.has = setCacheHas;\n\nmodule.exports = SetCache;\n","var overArg = require('./_overArg');\n\n/** Built-in value references. */\nvar getPrototype = overArg(Object.getPrototypeOf, Object);\n\nmodule.exports = getPrototype;\n","\nexport enum DataType {\n TEXT = 'text',\n NUMBER = 'number',\n DATE = 'date',\n TIME = 'time',\n DATETIME= 'datetime',\n BOOLEAN = 'boolean',\n ERROR = 'error',\n}\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.toFastProperties = exports.timer = exports.PRINT_ERROR = exports.PRINT_WARNING = void 0;\nvar print_1 = require(\"./print\");\nObject.defineProperty(exports, \"PRINT_WARNING\", { enumerable: true, get: function () { return print_1.PRINT_WARNING; } });\nObject.defineProperty(exports, \"PRINT_ERROR\", { enumerable: true, get: function () { return print_1.PRINT_ERROR; } });\nvar timer_1 = require(\"./timer\");\nObject.defineProperty(exports, \"timer\", { enumerable: true, get: function () { return timer_1.timer; } });\nvar to_fast_properties_1 = require(\"./to-fast-properties\");\nObject.defineProperty(exports, \"toFastProperties\", { enumerable: true, get: function () { return to_fast_properties_1.toFastProperties; } });\n//# sourceMappingURL=api.js.map","var copyObject = require('./_copyObject'),\n getSymbolsIn = require('./_getSymbolsIn');\n\n/**\n * Copies own and inherited symbols of `source` to `object`.\n *\n * @private\n * @param {Object} source The object to copy symbols from.\n * @param {Object} [object={}] The object to copy symbols to.\n * @returns {Object} Returns `object`.\n */\nfunction copySymbolsIn(source, object) {\n return copyObject(source, getSymbolsIn(source), object);\n}\n\nmodule.exports = copySymbolsIn;\n","var isPrototype = require('./_isPrototype'),\n nativeKeys = require('./_nativeKeys');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction baseKeys(object) {\n if (!isPrototype(object)) {\n return nativeKeys(object);\n }\n var result = [];\n for (var key in Object(object)) {\n if (hasOwnProperty.call(object, key) && key != 'constructor') {\n result.push(key);\n }\n }\n return result;\n}\n\nmodule.exports = baseKeys;\n","var getTag = require('./_getTag'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar mapTag = '[object Map]';\n\n/**\n * The base implementation of `_.isMap` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a map, else `false`.\n */\nfunction baseIsMap(value) {\n return isObjectLike(value) && getTag(value) == mapTag;\n}\n\nmodule.exports = baseIsMap;\n","/**\n * Checks if a `cache` value for `key` exists.\n *\n * @private\n * @param {Object} cache The cache to query.\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction cacheHas(cache, key) {\n return cache.has(key);\n}\n\nmodule.exports = cacheHas;\n","var identity = require('./identity'),\n overRest = require('./_overRest'),\n setToString = require('./_setToString');\n\n/**\n * The base implementation of `_.rest` which doesn't validate or coerce arguments.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @returns {Function} Returns the new function.\n */\nfunction baseRest(func, start) {\n return setToString(overRest(func, start, identity), func + '');\n}\n\nmodule.exports = baseRest;\n","var freeGlobal = require('./_freeGlobal');\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\nmodule.exports = root;\n","var castPath = require('./_castPath'),\n isArguments = require('./isArguments'),\n isArray = require('./isArray'),\n isIndex = require('./_isIndex'),\n isLength = require('./isLength'),\n toKey = require('./_toKey');\n\n/**\n * Checks if `path` exists on `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} path The path to check.\n * @param {Function} hasFunc The function to check properties.\n * @returns {boolean} Returns `true` if `path` exists, else `false`.\n */\nfunction hasPath(object, path, hasFunc) {\n path = castPath(path, object);\n\n var index = -1,\n length = path.length,\n result = false;\n\n while (++index < length) {\n var key = toKey(path[index]);\n if (!(result = object != null && hasFunc(object, key))) {\n break;\n }\n object = object[key];\n }\n if (result || ++index != length) {\n return result;\n }\n length = object == null ? 0 : object.length;\n return !!length && isLength(length) && isIndex(key, length) &&\n (isArray(object) || isArguments(object));\n}\n\nmodule.exports = hasPath;\n","var isObject = require('./isObject');\n\n/** Built-in value references. */\nvar objectCreate = Object.create;\n\n/**\n * The base implementation of `_.create` without support for assigning\n * properties to the created object.\n *\n * @private\n * @param {Object} proto The object to inherit from.\n * @returns {Object} Returns the new object.\n */\nvar baseCreate = (function() {\n function object() {}\n return function(proto) {\n if (!isObject(proto)) {\n return {};\n }\n if (objectCreate) {\n return objectCreate(proto);\n }\n object.prototype = proto;\n var result = new object;\n object.prototype = undefined;\n return result;\n };\n}());\n\nmodule.exports = baseCreate;\n","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/**\n * Converts `value` to a string using `Object.prototype.toString`.\n *\n * @private\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n */\nfunction objectToString(value) {\n return nativeObjectToString.call(value);\n}\n\nmodule.exports = objectToString;\n","var baseTrim = require('./_baseTrim'),\n isObject = require('./isObject'),\n isSymbol = require('./isSymbol');\n\n/** Used as references for various `Number` constants. */\nvar NAN = 0 / 0;\n\n/** Used to detect bad signed hexadecimal string values. */\nvar reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\n/** Used to detect binary string values. */\nvar reIsBinary = /^0b[01]+$/i;\n\n/** Used to detect octal string values. */\nvar reIsOctal = /^0o[0-7]+$/i;\n\n/** Built-in method references without a dependency on `root`. */\nvar freeParseInt = parseInt;\n\n/**\n * Converts `value` to a number.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to process.\n * @returns {number} Returns the number.\n * @example\n *\n * _.toNumber(3.2);\n * // => 3.2\n *\n * _.toNumber(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toNumber(Infinity);\n * // => Infinity\n *\n * _.toNumber('3.2');\n * // => 3.2\n */\nfunction toNumber(value) {\n if (typeof value == 'number') {\n return value;\n }\n if (isSymbol(value)) {\n return NAN;\n }\n if (isObject(value)) {\n var other = typeof value.valueOf == 'function' ? value.valueOf() : value;\n value = isObject(other) ? (other + '') : other;\n }\n if (typeof value != 'string') {\n return value === 0 ? value : +value;\n }\n value = baseTrim(value);\n var isBinary = reIsBinary.test(value);\n return (isBinary || reIsOctal.test(value))\n ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n : (reIsBadHex.test(value) ? NAN : +value);\n}\n\nmodule.exports = toNumber;\n","\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.tokenMatcher = exports.createTokenInstance = exports.EOF = exports.createToken = exports.hasTokenLabel = exports.tokenName = exports.tokenLabel = void 0;\nvar isString_1 = __importDefault(require(\"lodash/isString\"));\nvar has_1 = __importDefault(require(\"lodash/has\"));\nvar isUndefined_1 = __importDefault(require(\"lodash/isUndefined\"));\nvar lexer_public_1 = require(\"./lexer_public\");\nvar tokens_1 = require(\"./tokens\");\nfunction tokenLabel(tokType) {\n if (hasTokenLabel(tokType)) {\n return tokType.LABEL;\n }\n else {\n return tokType.name;\n }\n}\nexports.tokenLabel = tokenLabel;\nfunction tokenName(tokType) {\n return tokType.name;\n}\nexports.tokenName = tokenName;\nfunction hasTokenLabel(obj) {\n return (0, isString_1.default)(obj.LABEL) && obj.LABEL !== \"\";\n}\nexports.hasTokenLabel = hasTokenLabel;\nvar PARENT = \"parent\";\nvar CATEGORIES = \"categories\";\nvar LABEL = \"label\";\nvar GROUP = \"group\";\nvar PUSH_MODE = \"push_mode\";\nvar POP_MODE = \"pop_mode\";\nvar LONGER_ALT = \"longer_alt\";\nvar LINE_BREAKS = \"line_breaks\";\nvar START_CHARS_HINT = \"start_chars_hint\";\nfunction createToken(config) {\n return createTokenInternal(config);\n}\nexports.createToken = createToken;\nfunction createTokenInternal(config) {\n var pattern = config.pattern;\n var tokenType = {};\n tokenType.name = config.name;\n if (!(0, isUndefined_1.default)(pattern)) {\n tokenType.PATTERN = pattern;\n }\n if ((0, has_1.default)(config, PARENT)) {\n throw (\"The parent property is no longer supported.\\n\" +\n \"See: https://github.com/chevrotain/chevrotain/issues/564#issuecomment-349062346 for details.\");\n }\n if ((0, has_1.default)(config, CATEGORIES)) {\n // casting to ANY as this will be fixed inside `augmentTokenTypes``\n tokenType.CATEGORIES = config[CATEGORIES];\n }\n (0, tokens_1.augmentTokenTypes)([tokenType]);\n if ((0, has_1.default)(config, LABEL)) {\n tokenType.LABEL = config[LABEL];\n }\n if ((0, has_1.default)(config, GROUP)) {\n tokenType.GROUP = config[GROUP];\n }\n if ((0, has_1.default)(config, POP_MODE)) {\n tokenType.POP_MODE = config[POP_MODE];\n }\n if ((0, has_1.default)(config, PUSH_MODE)) {\n tokenType.PUSH_MODE = config[PUSH_MODE];\n }\n if ((0, has_1.default)(config, LONGER_ALT)) {\n tokenType.LONGER_ALT = config[LONGER_ALT];\n }\n if ((0, has_1.default)(config, LINE_BREAKS)) {\n tokenType.LINE_BREAKS = config[LINE_BREAKS];\n }\n if ((0, has_1.default)(config, START_CHARS_HINT)) {\n tokenType.START_CHARS_HINT = config[START_CHARS_HINT];\n }\n return tokenType;\n}\nexports.EOF = createToken({ name: \"EOF\", pattern: lexer_public_1.Lexer.NA });\n(0, tokens_1.augmentTokenTypes)([exports.EOF]);\nfunction createTokenInstance(tokType, image, startOffset, endOffset, startLine, endLine, startColumn, endColumn) {\n return {\n image: image,\n startOffset: startOffset,\n endOffset: endOffset,\n startLine: startLine,\n endLine: endLine,\n startColumn: startColumn,\n endColumn: endColumn,\n tokenTypeIdx: tokType.tokenTypeIdx,\n tokenType: tokType\n };\n}\nexports.createTokenInstance = createTokenInstance;\nfunction tokenMatcher(token, tokType) {\n return (0, tokens_1.tokenStructuredMatcher)(token, tokType);\n}\nexports.tokenMatcher = tokenMatcher;\n//# sourceMappingURL=tokens_public.js.map","var constant = require('./constant'),\n defineProperty = require('./_defineProperty'),\n identity = require('./identity');\n\n/**\n * The base implementation of `setToString` without support for hot loop shorting.\n *\n * @private\n * @param {Function} func The function to modify.\n * @param {Function} string The `toString` result.\n * @returns {Function} Returns `func`.\n */\nvar baseSetToString = !defineProperty ? identity : function(func, string) {\n return defineProperty(func, 'toString', {\n 'configurable': true,\n 'enumerable': false,\n 'value': constant(string),\n 'writable': true\n });\n};\n\nmodule.exports = baseSetToString;\n","var baseIsRegExp = require('./_baseIsRegExp'),\n baseUnary = require('./_baseUnary'),\n nodeUtil = require('./_nodeUtil');\n\n/* Node.js helper references. */\nvar nodeIsRegExp = nodeUtil && nodeUtil.isRegExp;\n\n/**\n * Checks if `value` is classified as a `RegExp` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a regexp, else `false`.\n * @example\n *\n * _.isRegExp(/abc/);\n * // => true\n *\n * _.isRegExp('/abc/');\n * // => false\n */\nvar isRegExp = nodeIsRegExp ? baseUnary(nodeIsRegExp) : baseIsRegExp;\n\nmodule.exports = isRegExp;\n","var Uint8Array = require('./_Uint8Array');\n\n/**\n * Creates a clone of `arrayBuffer`.\n *\n * @private\n * @param {ArrayBuffer} arrayBuffer The array buffer to clone.\n * @returns {ArrayBuffer} Returns the cloned array buffer.\n */\nfunction cloneArrayBuffer(arrayBuffer) {\n var result = new arrayBuffer.constructor(arrayBuffer.byteLength);\n new Uint8Array(result).set(new Uint8Array(arrayBuffer));\n return result;\n}\n\nmodule.exports = cloneArrayBuffer;\n","import mod from \"../lib/src/api.js\";\n\nexport default mod;\nexport const Alternation = mod.Alternation;\nexport const Alternative = mod.Alternative;\nexport const CstParser = mod.CstParser;\nexport const EMPTY_ALT = mod.EMPTY_ALT;\nexport const EOF = mod.EOF;\nexport const EarlyExitException = mod.EarlyExitException;\nexport const EmbeddedActionsParser = mod.EmbeddedActionsParser;\nexport const GAstVisitor = mod.GAstVisitor;\nexport const LLkLookaheadStrategy = mod.LLkLookaheadStrategy;\nexport const Lexer = mod.Lexer;\nexport const LexerDefinitionErrorType = mod.LexerDefinitionErrorType;\nexport const MismatchedTokenException = mod.MismatchedTokenException;\nexport const NoViableAltException = mod.NoViableAltException;\nexport const NonTerminal = mod.NonTerminal;\nexport const NotAllInputParsedException = mod.NotAllInputParsedException;\nexport const Option = mod.Option;\nexport const Parser = mod.Parser;\nexport const ParserDefinitionErrorType = mod.ParserDefinitionErrorType;\nexport const Repetition = mod.Repetition;\nexport const RepetitionMandatory = mod.RepetitionMandatory;\nexport const RepetitionMandatoryWithSeparator = mod.RepetitionMandatoryWithSeparator;\nexport const RepetitionWithSeparator = mod.RepetitionWithSeparator;\nexport const Rule = mod.Rule;\nexport const Terminal = mod.Terminal;\nexport const VERSION = mod.VERSION;\nexport const clearCache = mod.clearCache;\nexport const createSyntaxDiagramsCode = mod.createSyntaxDiagramsCode;\nexport const createToken = mod.createToken;\nexport const createTokenInstance = mod.createTokenInstance;\nexport const defaultLexerErrorProvider = mod.defaultLexerErrorProvider;\nexport const defaultParserErrorProvider = mod.defaultParserErrorProvider;\nexport const generateCstDts = mod.generateCstDts;\nexport const getLookaheadPaths = mod.getLookaheadPaths;\nexport const isRecognitionException = mod.isRecognitionException;\nexport const serializeGrammar = mod.serializeGrammar;\nexport const serializeProduction = mod.serializeProduction;\nexport const tokenLabel = mod.tokenLabel;\nexport const tokenMatcher = mod.tokenMatcher;\nexport const tokenName = mod.tokenName;\n","import { createToken, Lexer } from \"chevrotain\";\n\nconst Plus = createToken({ name: \"Plus\", pattern: /\\+/ });\nconst Minus = createToken({ name: \"Minus\", pattern: /-/ });\nconst Mult = createToken({ name: \"Mult\", pattern: /\\*/ });\nconst Div = createToken({ name: \"Div\", pattern: /\\// });\nconst LParen = createToken({ name: \"LParen\", pattern: /\\(/ });\nconst RParen = createToken({ name: \"RParen\", pattern: /\\)/ });\nconst Comma = createToken({ name: \"Comma\", pattern: /,/ });\n\nconst RowRange = createToken({\n name: \"RowRange\",\n pattern: /\\$?\\d+:\\$?\\d+/\n});\n\nconst NumberLiteral = createToken({\n name: \"NumberLiteral\",\n pattern: /\\d+(\\.\\d+)?/,\n longer_alt: RowRange // Add RowRange as longer alternative\n});\n\n// Update Variable token to exclude sheet name\nconst Variable = createToken({\n name: \"Variable\",\n pattern: /[A-Za-z_][A-Za-z0-9_]*/\n});\n\nconst SheetName = createToken({\n name: \"SheetName\",\n pattern: /[A-Za-z_][A-Za-z0-9_-]*!/\n});\n\nconst CellRange = createToken({\n name: \"CellRange\",\n pattern: /\\$?[A-Za-z]+\\$?\\d+:\\$?[A-Za-z]+\\$?\\d+/\n});\n\nconst CellRef = createToken({\n name: \"CellRef\",\n pattern: /\\$?[A-Za-z]+\\$?\\d+/\n});\n\nconst StringLiteral = createToken({\n name: \"StringLiteral\",\n pattern: /([\"'])(?:(?!\\1).)*\\1/ // Matches either quote style and captures everything between matching quotes\n});\n\nconst Concat = createToken({\n name: \"Concat\",\n pattern: /&/\n});\n\nconst FunctionName = createToken({\n name: \"FunctionName\",\n pattern: /[A-Za-z]+(?=\\()/i, // Added 'i' flag for case insensitive\n longer_alt: CellRef // In case the pattern matches a cell reference\n});\n\nconst WhiteSpace = createToken({ name: \"WhiteSpace\", pattern: /\\s+/, group: Lexer.SKIPPED });\n\n// Add new comparison operator tokens\nconst GreaterThan = createToken({ name: \"GreaterThan\", pattern: />/ });\nconst LessThan = createToken({ name: \"LessThan\", pattern: /=/ });\nconst LessThanEqual = createToken({ name: \"LessThanEqual\", pattern: /<=/ });\nconst Equal = createToken({ name: \"Equal\", pattern: /=/ });\nconst NotEqual = createToken({ name: \"NotEqual\", pattern: /<>/ });\n\n// Add special IF token before FunctionName\nconst IfFunction = createToken({\n name: \"IfFunction\",\n pattern: /IF(?=\\()/i, // Added 'i' flag for case insensitive\n longer_alt: Variable\n});\n\n// Add reserved keywords tokens\nconst TrueKeyword = createToken({\n name: \"TrueKeyword\",\n pattern: /TRUE/i, // Added 'i' flag for case insensitive\n longer_alt: Variable\n});\n\nconst FalseKeyword = createToken({\n name: \"FalseKeyword\",\n pattern: /FALSE/i, // Added 'i' flag for case insensitive\n longer_alt: Variable\n});\n\nconst NullKeyword = createToken({\n name: \"NullKeyword\",\n pattern: /NULL/i, // Added 'i' flag for case insensitive\n longer_alt: Variable\n});\n\n// Add array operators\nconst ArrayRowSep = createToken({ name: \"ArrayRowSep\", pattern: /;/ });\nconst RangeIntersect = createToken({ name: \"RangeIntersect\", pattern: / +/ }); // one or more spaces\n\n// Add error constants\nconst ErrorConstant = createToken({\n name: \"ErrorConstant\",\n pattern: /#(DIV\\/0!|N\\/A|NAME\\?|NULL!|NUM!|REF!|VALUE!|#SPILL!)/\n});\n\n// Add special function tokens\nconst IfErrorFunction = createToken({\n name: \"IfErrorFunction\",\n pattern: /IFERROR(?=\\()/i,\n longer_alt: Variable\n});\n\nconst IfsFunction = createToken({\n name: \"IfsFunction\",\n pattern: /IFS(?=\\()/i,\n longer_alt: Variable\n});\n\nconst SwitchFunction = createToken({\n name: \"SwitchFunction\",\n pattern: /SWITCH(?=\\()/i,\n longer_alt: Variable\n});\n\n// Add curly brace tokens for array formulas\nconst LCurly = createToken({ name: \"LCurly\", pattern: /{/ });\nconst RCurly = createToken({ name: \"RCurly\", pattern: /}/ });\n\n// Add new tokens for full column/row ranges\nconst ColumnRange = createToken({\n name: \"ColumnRange\",\n pattern: /\\$?[A-Za-z]+:\\$?[A-Za-z]+/\n});\n\nconst Power = createToken({ name: \"Power\", pattern: /\\*\\*|\\^/ });\n\nexport const allTokens = [\n WhiteSpace,\n // Comparison operators (order important)\n GreaterThanEqual, LessThanEqual, NotEqual,\n GreaterThan, LessThan, Equal,\n\n // Basic operators\n Plus, Minus, Concat,\n Power, // Add Power token here\n Mult, Div,\n\n // Brackets and delimiters\n LParen, RParen, LCurly, RCurly,\n Comma, ArrayRowSep, // Single instance of ArrayRowSep\n\n // References and ranges (order important for matching)\n SheetName, // Include SheetName token here\n ColumnRange, // Try column range first\n RowRange, // Then row range\n CellRange, // Then cell range\n CellRef, // Then cell reference\n RangeIntersect, // Then range intersection\n\n // Literals and constants (after ranges to avoid number conflicts)\n NumberLiteral, // Moved after RowRange\n StringLiteral,\n ErrorConstant,\n\n // Functions and keywords\n IfFunction, IfErrorFunction, IfsFunction, SwitchFunction,\n TrueKeyword, FalseKeyword, NullKeyword,\n FunctionName,\n\n // References and variables\n Variable\n];\n\nexport const CalxTokens = {\n Plus, Minus, Mult, Div, LParen, RParen, Comma,\n RowRange, NumberLiteral, Variable, SheetName,\n CellRange, CellRef, StringLiteral, Concat,\n FunctionName, WhiteSpace, GreaterThan, LessThan,\n GreaterThanEqual, LessThanEqual, Equal, NotEqual,\n IfFunction, TrueKeyword, FalseKeyword, NullKeyword,\n ArrayRowSep, RangeIntersect, ErrorConstant,\n IfErrorFunction, IfsFunction, SwitchFunction,\n LCurly, RCurly, ColumnRange, Power\n};","import { Lexer, CstParser, Rule, TokenType, ParserMethod, CstNode } from 'chevrotain';\nimport { allTokens, CalxTokens as token } from './Tokens';\n\nconst CalxLexer = new Lexer(allTokens);\n\nclass CalxParser extends CstParser {\n // Declare parser rules with type annotations\n public expression!: ParserMethod;\n public arrayFormula!: ParserMethod;\n public comparisonExpression!: ParserMethod;\n public additionExpression!: ParserMethod;\n public concatenationExpression!: ParserMethod;\n public multiplicationExpression!: ParserMethod;\n public exponentiationExpression!: ParserMethod;\n public unaryExpression!: ParserMethod;\n public atomicExpression!: ParserMethod;\n public ifFunctionCall!: ParserMethod;\n public functionCall!: ParserMethod;\n public ifErrorFunctionCall!: ParserMethod;\n public ifsFunctionCall!: ParserMethod;\n public switchFunctionCall!: ParserMethod;\n public arrayExpression!: ParserMethod;\n public arrayRow!: ParserMethod;\n\n cache: { comparisonExpression: boolean; atomicExpression: boolean; };\n\n constructor() {\n super(allTokens);\n\n this.cache = {\n comparisonExpression: false,\n atomicExpression: false\n };\n\n const $ = this;\n\n\n // Update the expression rule to start with comparison\n $.RULE(\"expression\", () => {\n $.OR([\n { ALT: () => $.SUBRULE($.arrayFormula) },\n { ALT: () => $.SUBRULE($.comparisonExpression) }\n ]);\n });\n\n // Add array formula rule\n $.RULE(\"arrayFormula\", () => {\n $.CONSUME(token.LCurly);\n $.OPTION(() => {\n $.CONSUME(token.Equal);\n });\n $.SUBRULE($.expression);\n $.MANY(() => {\n $.OR([\n { ALT: () => $.CONSUME(token.Comma) },\n { ALT: () => $.CONSUME(token.ArrayRowSep) }\n ]);\n $.SUBRULE2($.expression);\n });\n $.CONSUME(token.RCurly);\n });\n\n\n // Add new comparison expression rule\n $.RULE(\"comparisonExpression\", () => {\n $.SUBRULE($.additionExpression, { LABEL: \"lhs\" });\n $.OPTION(() => {\n $.cache.comparisonExpression || ($.OR([\n { ALT: () => $.CONSUME(token.GreaterThan) },\n { ALT: () => $.CONSUME(token.LessThan) },\n { ALT: () => $.CONSUME(token.GreaterThanEqual) },\n { ALT: () => $.CONSUME(token.LessThanEqual) },\n { ALT: () => $.CONSUME(token.Equal) },\n { ALT: () => $.CONSUME(token.NotEqual) }\n ]));\n $.SUBRULE2($.additionExpression, { LABEL: \"rhs\" });\n });\n });\n\n $.RULE(\"additionExpression\", () => {\n $.SUBRULE($.concatenationExpression, { LABEL: \"lhs\" });\n $.MANY(() => {\n $.OR([\n { ALT: () => $.CONSUME(token.Plus) },\n { ALT: () => $.CONSUME(token.Minus) }\n ]);\n $.SUBRULE2($.concatenationExpression, { LABEL: \"rhs\" });\n });\n });\n\n $.RULE(\"concatenationExpression\", () => {\n $.SUBRULE($.multiplicationExpression, { LABEL: \"lhs\" });\n $.MANY(() => {\n $.CONSUME(token.Concat);\n $.SUBRULE2($.multiplicationExpression, { LABEL: \"rhs\" });\n });\n });\n\n $.RULE(\"multiplicationExpression\", () => {\n $.SUBRULE($.exponentiationExpression, { LABEL: \"lhs\" });\n $.MANY(() => {\n $.OR([\n { ALT: () => $.CONSUME(token.Mult) },\n { ALT: () => $.CONSUME(token.Div) }\n ]);\n $.SUBRULE2($.exponentiationExpression, { LABEL: \"rhs\" });\n });\n });\n\n // Add new rule for exponentiationExpression\n $.RULE(\"exponentiationExpression\", () => {\n $.SUBRULE($.unaryExpression, { LABEL: \"lhs\" });\n $.MANY(() => {\n $.CONSUME(token.Power);\n $.SUBRULE2($.unaryExpression, { LABEL: \"rhs\" });\n });\n });\n\n // Add a new rule for unary expressions\n $.RULE(\"unaryExpression\", () => {\n $.OR([\n { ALT: () => {\n $.CONSUME(token.Minus); // Match unary minus\n $.SUBRULE($.unaryExpression); // Recursive unary expression\n }},\n { ALT: () => $.SUBRULE($.atomicExpression) }\n ]);\n });\n\n $.RULE(\"atomicExpression\", () => {\n $.cache.atomicExpression || ($.OR([\n { ALT: () => $.CONSUME(token.NumberLiteral) },\n { ALT: () => $.CONSUME(token.StringLiteral) },\n { ALT: () => $.CONSUME(token.TrueKeyword) }, // Add keywords\n { ALT: () => $.CONSUME(token.FalseKeyword) },\n { ALT: () => $.CONSUME(token.NullKeyword) },\n { ALT: () => {\n $.OPTION(() => {\n $.CONSUME(token.SheetName);\n });\n $.OR1([\n { ALT: () => $.CONSUME(token.Variable) },\n { ALT: () => $.CONSUME(token.CellRef) },\n { ALT: () => $.CONSUME(token.CellRange) },\n { ALT: () => $.CONSUME(token.RowRange) },\n { ALT: () => $.CONSUME(token.ColumnRange) }\n ]);\n }},\n { ALT: () => $.SUBRULE($.ifFunctionCall) }, // Try IF function first\n { ALT: () => $.SUBRULE($.functionCall) },\n { ALT: () => $.CONSUME(token.ErrorConstant) },\n { ALT: () => $.SUBRULE($.ifErrorFunctionCall) },\n { ALT: () => $.SUBRULE($.ifsFunctionCall) },\n { ALT: () => $.SUBRULE($.switchFunctionCall) },\n { ALT: () => {\n $.CONSUME(token.LParen);\n $.SUBRULE($.expression);\n $.CONSUME(token.RParen);\n }},\n ]));\n });\n\n // Update IF function rule to make false branch optional\n $.RULE(\"ifFunctionCall\", () => {\n $.CONSUME(token.IfFunction);\n $.CONSUME(token.LParen);\n // Condition expression\n $.SUBRULE($.expression, { LABEL: \"condition\" });\n $.CONSUME1(token.Comma);\n // True branch\n $.SUBRULE2($.expression, { LABEL: \"whenTrue\" });\n // Optional false branch\n $.OPTION(() => {\n $.CONSUME2(token.Comma);\n $.SUBRULE3($.expression, { LABEL: \"whenFalse\" });\n });\n $.CONSUME(token.RParen);\n });\n\n // Add special rules for IFERROR\n $.RULE(\"ifErrorFunctionCall\", () => {\n $.CONSUME(token.IfErrorFunction);\n $.CONSUME(token.LParen);\n $.SUBRULE($.expression, { LABEL: \"value\" });\n $.CONSUME1(token.Comma);\n $.SUBRULE2($.expression, { LABEL: \"valueIfError\" });\n $.CONSUME(token.RParen);\n });\n\n // Add rule for IFS function (multiple IF conditions)\n $.RULE(\"ifsFunctionCall\", () => {\n $.CONSUME(token.IfsFunction);\n $.CONSUME(token.LParen);\n $.AT_LEAST_ONE(() => {\n $.SUBRULE($.expression, { LABEL: \"condition\" });\n $.CONSUME1(token.Comma);\n $.SUBRULE2($.expression, { LABEL: \"value\" });\n $.OPTION(() => $.CONSUME2(token.Comma));\n });\n $.CONSUME(token.RParen);\n });\n\n // Add rule for SWITCH\n $.RULE(\"switchFunctionCall\", () => {\n $.CONSUME(token.SwitchFunction);\n $.CONSUME(token.LParen);\n $.SUBRULE($.expression, { LABEL: \"expression\" });\n $.CONSUME1(token.Comma);\n $.AT_LEAST_ONE(() => {\n $.SUBRULE2($.expression, { LABEL: \"value\" });\n $.CONSUME2(token.Comma);\n $.SUBRULE3($.expression, { LABEL: \"result\" });\n $.OPTION(() => $.CONSUME3(token.Comma));\n });\n // Optional default value\n $.OPTION2(() => {\n $.SUBRULE4($.expression, { LABEL: \"default\" });\n });\n $.CONSUME(token.RParen);\n });\n\n $.RULE(\"functionCall\", () => {\n $.CONSUME(token.FunctionName);\n $.CONSUME(token.LParen);\n $.OPTION(() => {\n $.SUBRULE($.expression);\n $.MANY(() => {\n $.CONSUME(token.Comma);\n $.SUBRULE2($.expression);\n });\n });\n $.CONSUME(token.RParen);\n });\n\n // Add array expression support\n $.RULE(\"arrayExpression\", () => {\n $.CONSUME(token.LParen);\n $.SUBRULE($.arrayRow);\n $.MANY(() => {\n $.CONSUME(token.ArrayRowSep);\n $.SUBRULE2($.arrayRow);\n });\n $.CONSUME(token.RParen);\n });\n\n $.RULE(\"arrayRow\", () => {\n $.SUBRULE($.expression);\n $.MANY(() => {\n $.CONSUME(token.Comma);\n $.SUBRULE2($.expression);\n });\n });\n\n this.performSelfAnalysis();\n }\n\n parse(inputText: string) {\n console.log(\"Parsing input:\", inputText);\n\n const lexResult = CalxLexer.tokenize(inputText);\n\n console.log(\"Lexer result:\", lexResult.tokens);\n\n if (lexResult.errors.length > 0) {\n console.error(lexResult.errors);\n\n throw new Error(\"Lexer errors detected\");\n }\n\n this.input = lexResult.tokens;\n const cst = this.expression();\n\n if (this.errors.length > 0) {\n console.error(this.errors);\n\n throw new Error(\"Parsing errors detected\");\n }\n\n return cst;\n }\n}\n\nexport { CalxLexer, CalxParser };","export enum ErrorType {\n DIV_BY_ZERO = '#DIV/0!',\n INVALID_NAME = '#NAME?',\n INVALID_REF = '#REF!',\n INVALID_VAL = '#VALUE!',\n INVALID_NUM = '#NUM!',\n NA = '#N/A!',\n NULL = '#NULL!',\n SPILL = '#SPILL!',\n ERROR = '#ERROR!'\n}\n","/**\n * Represents the result of an array formula evaluation\n * Array formulas can spill into multiple cells\n */\nexport class ArrayResult {\n /**\n * Creates an ArrayResult\n * @param values 2D array of values [row][col]\n * @param rows Number of rows\n * @param cols Number of columns\n */\n constructor(\n public values: any[][],\n public rows: number,\n public cols: number\n ) {}\n\n /**\n * Get value at specific position\n */\n getValue(row: number, col: number): any {\n if (row >= 0 && row < this.rows && col >= 0 && col < this.cols) {\n return this.values[row][col];\n }\n return undefined;\n }\n\n /**\n * Check if this is a single value (1x1 array)\n */\n isSingleValue(): boolean {\n return this.rows === 1 && this.cols === 1;\n }\n\n /**\n * Get the single value if this is a 1x1 array\n */\n getSingleValue(): any {\n if (this.isSingleValue()) {\n return this.values[0][0];\n }\n return undefined;\n }\n\n /**\n * Convert to flat array\n */\n toFlatArray(): any[] {\n const result: any[] = [];\n for (let row = 0; row < this.rows; row++) {\n for (let col = 0; col < this.cols; col++) {\n result.push(this.values[row][col]);\n }\n }\n return result;\n }\n\n /**\n * Create ArrayResult from 1D array (vertical)\n */\n static fromVerticalArray(values: any[]): ArrayResult {\n return new ArrayResult(\n values.map(v => [v]),\n values.length,\n 1\n );\n }\n\n /**\n * Create ArrayResult from 1D array (horizontal)\n */\n static fromHorizontalArray(values: any[]): ArrayResult {\n return new ArrayResult(\n [values],\n 1,\n values.length\n );\n }\n\n /**\n * Create ArrayResult from 2D array\n */\n static from2DArray(values: any[][]): ArrayResult {\n const rows = values.length;\n const cols = rows > 0 ? Math.max(...values.map(row => row.length)) : 0;\n\n // Normalize to ensure all rows have same length\n const normalized = values.map(row => {\n const newRow = [...row];\n while (newRow.length < cols) {\n newRow.push(undefined);\n }\n return newRow;\n });\n\n return new ArrayResult(normalized, rows, cols);\n }\n\n /**\n * Create ArrayResult from single value\n */\n static fromSingleValue(value: any): ArrayResult {\n return new ArrayResult([[value]], 1, 1);\n }\n}\n","import { CstNode } from 'chevrotain';\nimport { CalxLexer, CalxParser } from './Parser';\nimport { SharedContext } from '../SharedContext';\nimport { ErrorType } from '../../Cell/ErrorType';\nimport { ArrayResult } from '../../Cell/ArrayResult';\n\nconst parserInstance = new CalxParser();\n\nexport class CalxInterpreter extends parserInstance.getBaseCstVisitorConstructorWithDefaults() {\n private context?: SharedContext;\n public yy?: SharedContext;\n\n constructor() {\n super();\n this.validateVisitor();\n }\n\n setContext(context: SharedContext) {\n this.context = context;\n this.yy = context;\n }\n\n getContext(): SharedContext | undefined {\n return this.context;\n }\n\n expression(ctx: any) {\n if (ctx.arrayFormula && ctx.arrayFormula.length > 0) {\n return this.visit(ctx.arrayFormula[0]);\n }\n return this.visit(ctx.comparisonExpression[0]);\n }\n\n arrayFormula(ctx: any) {\n // Array formula with curly braces: {1,2,3} or {1;2;3} or {1,2;3,4}\n\n // Check if we have the ArrayRowSep (semicolon) which indicates multiple rows\n const hasRowSeparator = ctx.ArrayRowSep && ctx.ArrayRowSep.length > 0;\n\n if (hasRowSeparator) {\n // Multi-row array: {1,2;3,4} creates [[1,2],[3,4]]\n // Need to figure out which separator comes after each expression\n\n // Build a map of separator positions\n const separators: Array<{offset: number, type: 'comma' | 'semicolon'}> = [];\n\n if (ctx.Comma) {\n ctx.Comma.forEach((token: any) => {\n separators.push({ offset: token.startOffset, type: 'comma' });\n });\n }\n\n if (ctx.ArrayRowSep) {\n ctx.ArrayRowSep.forEach((token: any) => {\n separators.push({ offset: token.startOffset, type: 'semicolon' });\n });\n }\n\n // Sort separators by offset\n separators.sort((a, b) => a.offset - b.offset);\n\n // Build rows by grouping expressions based on separator types\n const rows: any[][] = [];\n let currentRow: any[] = [];\n\n for (let i = 0; i < ctx.expression.length; i++) {\n currentRow.push(this.visit(ctx.expression[i]));\n\n // Check what separator comes after this expression (if any)\n if (i < separators.length) {\n if (separators[i].type === 'semicolon') {\n // Semicolon means end of current row\n rows.push(currentRow);\n currentRow = [];\n }\n // Comma means continue in the same row, so do nothing\n }\n }\n\n // Add last row if not empty\n if (currentRow.length > 0) {\n rows.push(currentRow);\n }\n\n return ArrayResult.from2DArray(rows);\n }\n\n // Single row array: {1,2,3} or single value {5}\n const expressions = ctx.expression.map((exp: any) => this.visit(exp));\n\n if (expressions.length === 1) {\n const result = expressions[0];\n\n // If already an ArrayResult, return it\n if (result instanceof ArrayResult) {\n return result;\n }\n\n // If array, convert to ArrayResult\n if (Array.isArray(result)) {\n return ArrayResult.fromHorizontalArray(result);\n }\n\n // Single value\n return ArrayResult.fromSingleValue(result);\n }\n\n // Multiple expressions separated by commas = horizontal array\n return ArrayResult.fromHorizontalArray(expressions);\n }\n\n comparisonExpression(ctx: any) {\n const left = this.visit(ctx.lhs[0]);\n\n // If there's no comparison operator, just return the left value\n if (!ctx.rhs || ctx.rhs.length === 0) {\n return left;\n }\n\n const right = this.visit(ctx.rhs[0]);\n\n // Handle different comparison operators\n if (ctx.GreaterThan) {\n return left > right;\n } else if (ctx.LessThan) {\n return left < right;\n } else if (ctx.GreaterThanEqual) {\n return left >= right;\n } else if (ctx.LessThanEqual) {\n return left <= right;\n } else if (ctx.Equal) {\n return left === right;\n } else if (ctx.NotEqual) {\n return left !== right;\n }\n\n return left; // Fallback\n }\n\n additionExpression(ctx: any) {\n let result = this.visit(ctx.lhs[0]);\n\n // Process all additions/subtractions from left to right\n if (ctx.rhs && ctx.rhs.length > 0) {\n // Build array of operators in order they appear\n const operators: Array<{type: 'plus' | 'minus', offset: number}> = [];\n\n if (ctx.Plus) {\n ctx.Plus.forEach((token: any) => {\n operators.push({ type: 'plus', offset: token.startOffset });\n });\n }\n\n if (ctx.Minus) {\n ctx.Minus.forEach((token: any) => {\n operators.push({ type: 'minus', offset: token.startOffset });\n });\n }\n\n // Sort operators by offset to get correct order\n operators.sort((a, b) => a.offset - b.offset);\n\n for (let i = 0; i < ctx.rhs.length; i++) {\n const rightValue = this.visit(ctx.rhs[i]);\n const operator = operators[i];\n\n if (operator.type === 'plus') {\n result = this.arrayOperation(result, rightValue, (a, b) => a + b);\n } else if (operator.type === 'minus') {\n result = this.arrayOperation(result, rightValue, (a, b) => a - b);\n }\n }\n }\n\n return result;\n }\n\n /**\n * Perform array operation - applies operation element-wise if either operand is an array\n */\n private arrayOperation(left: any, right: any, operation: (a: any, b: any) => any): any {\n // Check for error values first\n if (this.isError(left)) return left;\n if (this.isError(right)) return right;\n\n // If neither is an array, just perform the operation\n if (!Array.isArray(left) && !Array.isArray(right)) {\n return operation(left, right);\n }\n\n // Convert to arrays if needed\n const leftArray = Array.isArray(left) ? left : [left];\n const rightArray = Array.isArray(right) ? right : [right];\n\n // Determine the result size\n const resultLength = Math.max(leftArray.length, rightArray.length);\n const result = [];\n\n for (let i = 0; i < resultLength; i++) {\n const leftVal = leftArray[Math.min(i, leftArray.length - 1)];\n const rightVal = rightArray[Math.min(i, rightArray.length - 1)];\n result.push(operation(leftVal, rightVal));\n }\n\n // Return as ArrayResult if it's an array\n return ArrayResult.fromVerticalArray(result);\n }\n\n /**\n * Check if a value is an Excel error\n */\n private isError(value: any): boolean {\n if (typeof value !== 'string') return false;\n return /^#[A-Z\\/!]+\\??$/.test(value); // Matches #NAME?, #REF!, #DIV/0!, etc.\n }\n\n concatenationExpression(ctx: any) {\n let result = this.visit(ctx.lhs[0]);\n\n // Process all concatenations from left to right\n if (ctx.rhs && ctx.rhs.length > 0) {\n for (let i = 0; i < ctx.rhs.length; i++) {\n const rightValue = this.visit(ctx.rhs[i]);\n // Convert both sides to strings for concatenation\n result = String(result) + String(rightValue);\n }\n }\n\n return result;\n }\n\n multiplicationExpression(ctx: any) {\n let result = this.visit(ctx.lhs[0]);\n\n // Process all multiplications/divisions from left to right\n if (ctx.rhs && ctx.rhs.length > 0) {\n // Build array of operators in order they appear\n const operators: Array<{type: 'mult' | 'div', offset: number}> = [];\n\n if (ctx.Mult) {\n ctx.Mult.forEach((token: any) => {\n operators.push({ type: 'mult', offset: token.startOffset });\n });\n }\n\n if (ctx.Div) {\n ctx.Div.forEach((token: any) => {\n operators.push({ type: 'div', offset: token.startOffset });\n });\n }\n\n // Sort operators by offset to get correct order\n operators.sort((a, b) => a.offset - b.offset);\n\n for (let i = 0; i < ctx.rhs.length; i++) {\n const rightValue = this.visit(ctx.rhs[i]);\n const operator = operators[i];\n\n if (operator.type === 'mult') {\n result = this.arrayOperation(result, rightValue, (a, b) => a * b);\n } else if (operator.type === 'div') {\n result = this.arrayOperation(result, rightValue, (a, b) => {\n // Check for division by zero\n if (b === 0) {\n return \"#DIV/0!\";\n }\n return a / b;\n });\n }\n }\n }\n\n return result;\n }\n\n exponentiationExpression(ctx: any) {\n let result = this.visit(ctx.lhs[0]);\n\n // Process all exponentiations from left to right\n if (ctx.rhs && ctx.rhs.length > 0) {\n for (let i = 0; i < ctx.rhs.length; i++) {\n const rightValue = this.visit(ctx.rhs[i]);\n result = this.arrayOperation(result, rightValue, (a, b) => Math.pow(a, b));\n }\n }\n\n return result;\n }\n\n unaryExpression(ctx: any) {\n if (ctx.Minus) {\n // Handle unary minus (negation)\n const value = this.visit(ctx.unaryExpression[0]);\n return -value;\n } else {\n // Otherwise, process the atomic expression\n return this.visit(ctx.atomicExpression[0]);\n }\n }\n\n atomicExpression(ctx: any) {\n // Handle literals\n if (ctx.NumberLiteral) {\n return Number(ctx.NumberLiteral[0].image);\n } else if (ctx.StringLiteral) {\n // Remove quotes from string literals\n const str = ctx.StringLiteral[0].image;\n return str.substring(1, str.length - 1);\n } else if (ctx.TrueKeyword) {\n return true;\n } else if (ctx.FalseKeyword) {\n return false;\n } else if (ctx.NullKeyword) {\n return null;\n } else if (ctx.ErrorConstant) {\n // Return error constants as is\n return ctx.ErrorConstant[0].image;\n }\n\n // Handle cell references and variables\n if (ctx.Variable || ctx.CellRef || ctx.CellRange || ctx.RowRange || ctx.ColumnRange) {\n let ref;\n let sheetName = '';\n\n // Extract sheet name if present\n if (ctx.SheetName && ctx.SheetName.length > 0) {\n sheetName = ctx.SheetName[0].image;\n // Remove the trailing '!'\n sheetName = sheetName.substring(0, sheetName.length - 1);\n }\n\n if (ctx.Variable && ctx.Variable.length > 0) {\n ref = ctx.Variable[0].image;\n return this.resolveVariable(ref, sheetName);\n } else if (ctx.CellRef && ctx.CellRef.length > 0) {\n ref = ctx.CellRef[0].image;\n return this.resolveCellReference(ref, sheetName);\n } else if (ctx.CellRange && ctx.CellRange.length > 0) {\n ref = ctx.CellRange[0].image;\n return this.resolveCellRange(ref, sheetName);\n } else if (ctx.RowRange && ctx.RowRange.length > 0) {\n ref = ctx.RowRange[0].image;\n return this.resolveRowRange(ref, sheetName);\n } else if (ctx.ColumnRange && ctx.ColumnRange.length > 0) {\n ref = ctx.ColumnRange[0].image;\n return this.resolveColumnRange(ref, sheetName);\n }\n }\n\n // Handle function calls\n if (ctx.ifFunctionCall) {\n return this.visit(ctx.ifFunctionCall[0]);\n } else if (ctx.functionCall) {\n return this.visit(ctx.functionCall[0]);\n } else if (ctx.ifErrorFunctionCall) {\n return this.visit(ctx.ifErrorFunctionCall[0]);\n } else if (ctx.ifsFunctionCall) {\n return this.visit(ctx.ifsFunctionCall[0]);\n } else if (ctx.switchFunctionCall) {\n return this.visit(ctx.switchFunctionCall[0]);\n }\n\n // Handle parenthesized expressions\n if (ctx.LParen) {\n return this.visit(ctx.expression[0]);\n }\n\n // Fallback\n console.warn(\"Unhandled atomic expression:\", ctx);\n return null;\n }\n\n ifFunctionCall(ctx: any) {\n const condition = this.visit(ctx.condition[0]);\n\n if (this.isTruthy(condition)) {\n return this.visit(ctx.whenTrue[0]);\n } else if (ctx.whenFalse && ctx.whenFalse.length > 0) {\n return this.visit(ctx.whenFalse[0]);\n }\n\n // If condition is false and no false branch, Excel returns FALSE\n return false;\n }\n\n functionCall(ctx: any) {\n const funcName = ctx.FunctionName[0].image.toUpperCase();\n const args = [];\n\n // Collect all arguments\n if (ctx.expression) {\n for (const expr of ctx.expression) {\n args.push(this.visit(expr));\n }\n }\n\n // Prioritize callFunction to ensure ArrayResult wrapping for dynamic arrays\n if (this.context && typeof this.context.callFunction === 'function') {\n try {\n let result = this.context.callFunction(funcName, args);\n\n // Handle Date objects - convert to Excel serial number\n if (result instanceof Date) {\n const excelEpoch = new Date(1899, 11, 30).getTime();\n const msPerDay = 24 * 60 * 60 * 1000;\n result = Math.floor((result.getTime() - excelEpoch) / msPerDay);\n }\n\n return result;\n } catch (e) {\n console.warn(`Function ${funcName} not found in callFunction, trying getFunction`);\n }\n }\n\n // Fallback to getFunction for custom/user-defined functions\n if (this.context && typeof this.context.getFunction === 'function') {\n const func = this.context.getFunction(funcName);\n if (typeof func === 'function') {\n try {\n let result = func(...args);\n\n // Handle Date objects - convert to Excel serial number\n if (result instanceof Date) {\n const excelEpoch = new Date(1899, 11, 30).getTime();\n const msPerDay = 24 * 60 * 60 * 1000;\n result = Math.floor((result.getTime() - excelEpoch) / msPerDay);\n }\n\n return result;\n } catch (e) {\n console.error(`Error executing function ${funcName}:`, e);\n return \"#ERROR!\";\n }\n }\n }\n\n // Handle common Excel functions directly as fallback\n return this.executeBuiltInFunction(funcName, args);\n }\n\n ifErrorFunctionCall(ctx: any) {\n try {\n const value = this.visit(ctx.value[0]);\n // Check if the result is an error value\n if (this.isErrorValue(value)) {\n return this.visit(ctx.valueIfError[0]);\n }\n return value;\n } catch (e) {\n // If any exception occurs during evaluation, return the valueIfError\n return this.visit(ctx.valueIfError[0]);\n }\n }\n\n ifsFunctionCall(ctx: any) {\n const conditions = ctx.condition;\n const values = ctx.value;\n\n for (let i = 0; i < conditions.length; i++) {\n const condition = this.visit(conditions[i]);\n if (this.isTruthy(condition)) {\n return this.visit(values[i]);\n }\n }\n\n // If no conditions are true, return #N/A\n return \"#N/A\";\n }\n\n switchFunctionCall(ctx: any) {\n const expression = this.visit(ctx.expression[0]);\n const values = ctx.value;\n const results = ctx.result;\n\n for (let i = 0; i < values.length; i++) {\n const value = this.visit(values[i]);\n if (expression === value) {\n return this.visit(results[i]);\n }\n }\n\n // If no match and default is provided, return default\n if (ctx.default && ctx.default.length > 0) {\n return this.visit(ctx.default[0]);\n }\n\n // If no match and no default, return #N/A\n return \"#N/A\";\n }\n\n arrayExpression(ctx: any) {\n // Process array expressions as 2D arrays\n const rows = [];\n rows.push(this.visit(ctx.arrayRow[0]));\n\n if (ctx.arrayRow.length > 1) {\n for (let i = 1; i < ctx.arrayRow.length; i++) {\n rows.push(this.visit(ctx.arrayRow[i]));\n }\n }\n\n return rows;\n }\n\n arrayRow(ctx: any) {\n // Process array rows as arrays\n const row = [];\n row.push(this.visit(ctx.expression[0]));\n\n if (ctx.expression.length > 1) {\n for (let i = 1; i < ctx.expression.length; i++) {\n row.push(this.visit(ctx.expression[i]));\n }\n }\n\n return row;\n }\n\n // Helper methods\n private resolveVariable(name: string, sheetName: string = ''): any {\n // First check if it's a named range (priority over sheet variables)\n if (this.context && typeof this.context.getNamedRange === 'function') {\n // Check if the workbook has this named range\n if (this.context.workbook?.nameManager.has(name)) {\n return this.context.getNamedRange(name);\n }\n }\n\n // Fall back to sheet variables\n if (this.context && typeof this.context.getVariable === 'function') {\n return this.context.getVariable(name, sheetName);\n }\n return \"#NAME?\"; // Excel's error for undefined names\n }\n\n private resolveCellReference(ref: string, sheetName: string = ''): any {\n if (this.context && typeof this.context.getCellValue === 'function') {\n return this.context.getCellValue(ref, sheetName);\n }\n return \"#REF!\"; // Excel's error for invalid cell references\n }\n\n private resolveCellRange(range: string, sheetName: string = ''): any {\n if (this.context && typeof this.context.getCellRange === 'function') {\n return this.context.getCellRange(range, sheetName);\n }\n return \"#REF!\";\n }\n\n private resolveRowRange(range: string, sheetName: string = ''): any {\n if (this.context && typeof this.context.getRowRange === 'function') {\n return this.context.getRowRange(range, sheetName);\n }\n return \"#REF!\";\n }\n\n private resolveColumnRange(range: string, sheetName: string = ''): any {\n if (this.context && typeof this.context.getColumnRange === 'function') {\n return this.context.getColumnRange(range, sheetName);\n }\n return \"#REF!\";\n }\n\n private isTruthy(value: any): boolean {\n if (typeof value === 'boolean') {\n return value;\n } else if (typeof value === 'number') {\n return value !== 0;\n } else if (typeof value === 'string') {\n // Excel treats non-empty strings as true except \"FALSE\"\n return value !== '' && value.toUpperCase() !== 'FALSE';\n } else {\n return value != null;\n }\n }\n\n private isErrorValue(value: any): boolean {\n if (typeof value !== 'string') return false;\n\n const errorValues = [\n \"#DIV/0!\", \"#N/A\", \"#NAME?\", \"#NULL!\",\n \"#NUM!\", \"#REF!\", \"#VALUE!\", \"#ERROR!\"\n ];\n\n return errorValues.includes(value);\n }\n\n private executeBuiltInFunction(name: string, args: any[]): any {\n // Implement common Excel functions\n let count = 0;\n\n switch (name) {\n case \"SUM\":\n return args.reduce((sum, val) => {\n if (Array.isArray(val)) {\n // Handle arrays/ranges\n return sum + this.flattenAndSum(val);\n } else if (!isNaN(val)) {\n return sum + Number(val);\n }\n return sum;\n }, 0);\n\n case \"AVERAGE\":\n let sum = 0;\n\n args.forEach(val => {\n if (Array.isArray(val)) {\n // Handle arrays/ranges\n const flattenedArray = this.flattenArray(val);\n sum += flattenedArray.reduce((s, v) => s + (isNaN(v) ? 0 : Number(v)), 0);\n count += flattenedArray.filter(v => !isNaN(v)).length;\n } else if (!isNaN(val)) {\n sum += Number(val);\n count++;\n }\n });\n\n return count > 0 ? sum / count : \"#DIV/0!\";\n\n case \"MAX\":\n let max = -Infinity;\n\n args.forEach(val => {\n if (Array.isArray(val)) {\n // Handle arrays/ranges\n const flattenedArray = this.flattenArray(val);\n const arrayMax = Math.max(...flattenedArray.filter(v => !isNaN(v)).map(Number));\n if (arrayMax > max) max = arrayMax;\n } else if (!isNaN(val) && Number(val) > max) {\n max = Number(val);\n }\n });\n\n return max === -Infinity ? 0 : max;\n\n case \"MIN\":\n let min = Infinity;\n\n args.forEach(val => {\n if (Array.isArray(val)) {\n // Handle arrays/ranges\n const flattenedArray = this.flattenArray(val);\n const arrayMin = Math.min(...flattenedArray.filter(v => !isNaN(v)).map(Number));\n if (arrayMin < min) min = arrayMin;\n } else if (!isNaN(val) && Number(val) < min) {\n min = Number(val);\n }\n });\n\n return min === Infinity ? 0 : min;\n\n case \"COUNT\":\n\n args.forEach(val => {\n if (Array.isArray(val)) {\n // Handle arrays/ranges\n const flattenedArray = this.flattenArray(val);\n count += flattenedArray.filter(v => !isNaN(v)).length;\n } else if (!isNaN(val)) {\n count++;\n }\n });\n\n return count;\n\n case \"CONCATENATE\":\n return args.reduce((result, val) => result + String(val), \"\");\n\n case \"AND\":\n return args.every(val => this.isTruthy(val));\n\n case \"OR\":\n return args.some(val => this.isTruthy(val));\n\n default:\n return \"#NAME?\"; // Unknown function\n }\n }\n\n private flattenAndSum(arr: any[]): number {\n if (!Array.isArray(arr)) return isNaN(arr) ? 0 : Number(arr);\n\n return arr.reduce((sum, val) => {\n if (Array.isArray(val)) {\n return sum + this.flattenAndSum(val);\n }\n return sum + (isNaN(val) ? 0 : Number(val));\n }, 0);\n }\n\n private flattenArray(arr: any[]): any[] {\n return arr.reduce((flat, val) => {\n if (Array.isArray(val)) {\n return flat.concat(this.flattenArray(val));\n } else {\n return flat.concat(val);\n }\n }, []);\n }\n\n parseInput(inputText: string) {\n // Strip leading '=' if present\n const cleanInput = inputText.startsWith('=') ? inputText.substring(1) : inputText;\n\n const lexResult = CalxLexer.tokenize(cleanInput);\n parserInstance.input = lexResult.tokens;\n\n const cst = parserInstance.expression();\n\n if (parserInstance.errors.length > 0) {\n console.error('Parser errors:', JSON.stringify(parserInstance.errors, null, 2));\n throw Error('Parsing errors detected');\n }\n\n return this.visit(cst);\n }\n\n parseCst(cst: CstNode) {\n return this.visit(cst);\n }\n\n parse(inputText: string) {\n try {\n const result = this.parseInput(inputText);\n return result;\n } catch (error) {\n console.error(\"Parsing error for input:\", inputText);\n console.error(\"Error details:\", error);\n if (error instanceof Error) {\n console.error(\"Stack trace:\", error.stack);\n }\n return ErrorType.ERROR; // Return a generic error type\n }\n }\n}\n","import { Cell } from './Cell';\nimport { Sheet } from './Sheet';\nimport { DataType } from './Cell/DataType';\n\n/**\n * Range class - Excel-like range that can contain one or more cells\n * This is the lowest unit of work in Calx, mimicking Excel's behavior\n *\n * Examples:\n * - Single cell: Range('A1') contains one cell\n * - Cell range: Range('A1:B10') contains multiple cells\n */\nexport class Range {\n private _cells: Cell[] = [];\n private _address: string;\n private _startAddress!: string;\n private _endAddress!: string;\n\n constructor(\n private sheet: Sheet,\n address: string\n ) {\n this._address = address;\n this.parseAddress(address);\n this.loadCells();\n }\n\n /**\n * Parse address and determine if single cell or range\n */\n private parseAddress(address: string) {\n // Remove $ signs (absolute reference markers) for cell lookup\n const cleanAddress = (addr: string) => addr.replace(/\\$/g, '');\n\n if (address.includes(':')) {\n // Range like \"A1:B10\" or \"$A$1:$B$10\"\n const [start, end] = address.split(':');\n this._startAddress = cleanAddress(start.trim());\n this._endAddress = cleanAddress(end.trim());\n } else {\n // Single cell like \"A1\" or \"$A$1\"\n this._startAddress = cleanAddress(address.trim());\n this._endAddress = cleanAddress(address.trim());\n }\n }\n\n /**\n * Load cells from the sheet\n */\n private loadCells() {\n if (this.isSingleCell()) {\n const cell = this.sheet.getCellDirect(this._startAddress);\n this._cells = [cell];\n } else {\n this._cells = this.expandRange();\n }\n }\n\n /**\n * Expand range address to array of cells\n */\n private expandRange(): Cell[] {\n const cells: Cell[] = [];\n\n const startCol = this._startAddress.match(/[A-Z]+/)?.[0] || 'A';\n const startRow = parseInt(this._startAddress.match(/\\d+/)?.[0] || '1');\n const endCol = this._endAddress.match(/[A-Z]+/)?.[0] || 'A';\n const endRow = parseInt(this._endAddress.match(/\\d+/)?.[0] || '1');\n\n const startColNum = this.colToNum(startCol);\n const endColNum = this.colToNum(endCol);\n\n // Normalize the range to handle reverse ranges (e.g., B2:A1 -> A1:B2)\n const minRow = Math.min(startRow, endRow);\n const maxRow = Math.max(startRow, endRow);\n const minCol = Math.min(startColNum, endColNum);\n const maxCol = Math.max(startColNum, endColNum);\n\n for (let row = minRow; row <= maxRow; row++) {\n for (let col = minCol; col <= maxCol; col++) {\n const address = this.numToCol(col) + row;\n cells.push(this.sheet.getCellDirect(address));\n }\n }\n\n return cells;\n }\n\n /**\n * Check if this is a single cell range\n */\n public isSingleCell(): boolean {\n return this._startAddress === this._endAddress;\n }\n\n /**\n * Get the address of this range\n */\n public get address(): string {\n return this._address;\n }\n\n /**\n * Get all cells in this range\n */\n public get cells(): Cell[] {\n return this._cells;\n }\n\n /**\n * Get the first cell in the range\n */\n public get cell(): Cell {\n return this._cells[0];\n }\n\n /**\n * Get value(s) from the range\n * - Single cell: returns single value\n * - Multiple cells: returns 2D array of values\n */\n public get value(): any {\n if (this.isSingleCell()) {\n return this._cells[0]?.value ?? null;\n }\n\n return this.getValues();\n }\n\n /**\n * Set value(s) to the range\n * - Single cell: sets the value\n * - Multiple cells: if value is array, distributes values; otherwise sets all to same value\n */\n public set value(val: any) {\n if (this.isSingleCell()) {\n this._cells[0].value = val;\n } else {\n if (Array.isArray(val)) {\n this.setValuesFromArray(val);\n } else {\n // Set all cells to same value\n this._cells.forEach(cell => cell.value = val);\n }\n }\n }\n\n /**\n * Get formula from the range (only for single cell)\n */\n public get formula(): string | null {\n if (this.isSingleCell()) {\n return this._cells[0].formula;\n }\n return null;\n }\n\n /**\n * Set formula to the range\n */\n public set formula(formula: string) {\n if (this.isSingleCell()) {\n this._cells[0].formula = formula;\n } else {\n // For range, set formula to all cells (adjusting relative references)\n // For now, set the same formula to all\n this._cells.forEach(cell => cell.formula = formula);\n }\n }\n\n /**\n * Get values as 2D array\n */\n public getValues(): any[][] {\n const startCol = this._startAddress.match(/[A-Z]+/)?.[0] || 'A';\n const startRow = parseInt(this._startAddress.match(/\\d+/)?.[0] || '1');\n const endCol = this._endAddress.match(/[A-Z]+/)?.[0] || 'A';\n const endRow = parseInt(this._endAddress.match(/\\d+/)?.[0] || '1');\n\n const startColNum = this.colToNum(startCol);\n const endColNum = this.colToNum(endCol);\n\n const result: any[][] = [];\n let cellIndex = 0;\n\n for (let row = startRow; row <= endRow; row++) {\n const rowData: any[] = [];\n for (let col = startColNum; col <= endColNum; col++) {\n rowData.push(this._cells[cellIndex++].value);\n }\n result.push(rowData);\n }\n\n return result;\n }\n\n /**\n * Set values from 2D array\n */\n public setValues(values: any[][]) {\n let cellIndex = 0;\n for (let row = 0; row < values.length; row++) {\n for (let col = 0; col < values[row].length; col++) {\n if (cellIndex < this._cells.length) {\n this._cells[cellIndex++].value = values[row][col];\n }\n }\n }\n }\n\n /**\n * Set values from flat array\n */\n private setValuesFromArray(values: any[]) {\n for (let i = 0; i < Math.min(values.length, this._cells.length); i++) {\n this._cells[i].value = values[i];\n }\n }\n\n /**\n * Get flat array of values\n */\n public toArray(): any[] {\n return this._cells.map(cell => cell.value);\n }\n\n /**\n * Calculate all cells in the range\n */\n public calculate() {\n this._cells.forEach(cell => {\n if (cell.formula) {\n cell.calculate();\n }\n });\n }\n\n /**\n * Get count of cells in range\n */\n public get count(): number {\n return this._cells.length;\n }\n\n /**\n * Get row count\n */\n public get rows(): number {\n const startRow = parseInt(this._startAddress.match(/\\d+/)?.[0] || '1');\n const endRow = parseInt(this._endAddress.match(/\\d+/)?.[0] || '1');\n return endRow - startRow + 1;\n }\n\n /**\n * Get column count\n */\n public get columns(): number {\n const startCol = this._startAddress.match(/[A-Z]+/)?.[0] || 'A';\n const endCol = this._endAddress.match(/[A-Z]+/)?.[0] || 'A';\n return this.colToNum(endCol) - this.colToNum(startCol) + 1;\n }\n\n /**\n * Iterate over each cell\n */\n public each(callback: (cell: Cell, index: number) => void) {\n this._cells.forEach((cell, index) => callback(cell, index));\n }\n\n /**\n * Map over cells\n */\n public map(callback: (cell: Cell, index: number) => T): T[] {\n return this._cells.map((cell, index) => callback(cell, index));\n }\n\n /**\n * Filter cells\n */\n public filter(callback: (cell: Cell, index: number) => boolean): Cell[] {\n return this._cells.filter((cell, index) => callback(cell, index));\n }\n\n /**\n * Find a cell\n */\n public find(callback: (cell: Cell, index: number) => boolean): Cell | undefined {\n return this._cells.find((cell, index) => callback(cell, index));\n }\n\n /**\n * Get cell at specific position in range (0-based index)\n */\n public getCellAt(index: number): Cell | undefined {\n return this._cells[index];\n }\n\n /**\n * Get cell at row, col position (0-based)\n */\n public getCellAtPosition(row: number, col: number): Cell | undefined {\n const colCount = this.columns;\n const index = row * colCount + col;\n return this._cells[index];\n }\n\n /**\n * Convert column letter to number (A=1, Z=26, AA=27)\n */\n private colToNum(col: string): number {\n let num = 0;\n for (let i = 0; i < col.length; i++) {\n num = num * 26 + (col.charCodeAt(i) - 64);\n }\n return num;\n }\n\n /**\n * Convert number to column letter (1=A, 26=Z, 27=AA)\n */\n private numToCol(num: number): string {\n let col = '';\n while (num > 0) {\n const remainder = (num - 1) % 26;\n col = String.fromCharCode(65 + remainder) + col;\n num = Math.floor((num - 1) / 26);\n }\n return col;\n }\n\n /**\n * Get a sub-range\n */\n public getRange(address: string): Range {\n return new Range(this.sheet, address);\n }\n\n /**\n * Clear all values in range\n */\n public clear() {\n this._cells.forEach(cell => {\n cell.value = null;\n cell.formula = '';\n });\n }\n\n /**\n * Get string representation\n */\n public toString(): string {\n if (this.isSingleCell()) {\n return `Range(${this._address})`;\n }\n return `Range(${this._address}) [${this.rows}x${this.columns}]`;\n }\n}\n","/**\n * Available sheet events.\n */\nexport enum SheetEvent {\n CALCULATION_STARTED = 'calculation.started',\n CALCULATION_PAUSED = 'calculation.paused',\n CALCULATION_RESUMED = 'calculation.resumed',\n CALCULATION_FINISHED = 'calculation.finished',\n\n CELL_ADDED = 'cell.added',\n CELL_REMOVED = 'cell.removed',\n CELL_CREATED = \"CELL_CREATED\",\n\n ELEMENT_ATTACHED = 'element.attached',\n ELEMENT_DETACHED = 'element.detached',\n}\n\nexport enum SheetState {\n CALCULATION_STARTED = 'calculation.started',\n CALCULATION_PAUSED = 'calculation.paused',\n CALCULATION_RESUMED = 'calculation.resumed',\n CALCULATION_FINISHED = 'calculation.finished',\n CALCULATION_IDLE = 'calculation.idle',\n}","/**\n * Utility class for converting between Excel serial dates and JavaScript Date objects\n */\nexport class DateUtil {\n /**\n * Excel epoch: December 30, 1899\n * Excel uses this as day 0 for date serial numbers\n */\n private static readonly EXCEL_EPOCH = new Date(1899, 11, 30).getTime();\n private static readonly MS_PER_DAY = 24 * 60 * 60 * 1000;\n\n /**\n * Convert Excel serial date number to JavaScript Date object\n * @param serialDate Excel serial date number (days since Dec 30, 1899)\n * @returns JavaScript Date object\n */\n static serialToDate(serialDate: number): Date {\n if (typeof serialDate !== 'number' || isNaN(serialDate)) {\n throw new Error('Invalid serial date: must be a number');\n }\n\n // Excel epoch: December 30, 1899 at midnight local time\n const epochDate = new Date(1899, 11, 30, 0, 0, 0, 0);\n const ms = serialDate * DateUtil.MS_PER_DAY;\n return new Date(epochDate.getTime() + ms);\n }\n\n /**\n * Convert JavaScript Date object to Excel serial date number\n * @param date JavaScript Date object\n * @returns Excel serial date number (days since Dec 30, 1899)\n */\n static dateToSerial(date: Date): number {\n if (!(date instanceof Date) || isNaN(date.getTime())) {\n throw new Error('Invalid date: must be a valid Date object');\n }\n\n // Excel epoch: December 30, 1899 at midnight local time\n const epochDate = new Date(1899, 11, 30, 0, 0, 0, 0);\n const ms = date.getTime() - epochDate.getTime();\n return Math.floor(ms / DateUtil.MS_PER_DAY);\n }\n\n /**\n * Check if a value is a valid Excel serial date\n * @param value Value to check\n * @returns True if value is a valid serial date number\n */\n static isValidSerialDate(value: any): boolean {\n if (typeof value !== 'number' || isNaN(value)) {\n return false;\n }\n\n // Excel dates are typically between 1 (Jan 1, 1900) and ~50000 (year 2036)\n // Allow negative for historical dates\n return value >= -36522 && value <= 2958465; // Years 1800-9999\n }\n\n /**\n * Create Excel serial date from date components\n * @param year Full year (e.g., 2024)\n * @param month Month (1-12)\n * @param day Day of month (1-31)\n * @returns Excel serial date number\n */\n static fromComponents(year: number, month: number, day: number): number {\n const date = new Date(year, month - 1, day);\n return DateUtil.dateToSerial(date);\n }\n\n /**\n * Get date components from Excel serial date\n * @param serialDate Excel serial date number\n * @returns Object with year, month (1-12), day, weekday (0-6, Sunday=0)\n */\n static toComponents(serialDate: number): {\n year: number;\n month: number;\n day: number;\n weekday: number;\n hours: number;\n minutes: number;\n seconds: number;\n } {\n const date = DateUtil.serialToDate(serialDate);\n return {\n year: date.getFullYear(),\n month: date.getMonth() + 1, // Convert to 1-based\n day: date.getDate(),\n weekday: date.getDay(),\n hours: date.getHours(),\n minutes: date.getMinutes(),\n seconds: date.getSeconds(),\n };\n }\n\n /**\n * Format Excel serial date as ISO string (YYYY-MM-DD)\n * @param serialDate Excel serial date number\n * @returns ISO date string\n */\n static toISOString(serialDate: number): string {\n const date = DateUtil.serialToDate(serialDate);\n return date.toISOString().split('T')[0];\n }\n\n /**\n * Parse ISO date string (YYYY-MM-DD) to Excel serial date\n * @param isoString ISO date string\n * @returns Excel serial date number\n */\n static fromISOString(isoString: string): number {\n const date = new Date(isoString);\n if (isNaN(date.getTime())) {\n throw new Error(`Invalid ISO date string: ${isoString}`);\n }\n return DateUtil.dateToSerial(date);\n }\n\n /**\n * Get current date as Excel serial date\n * @returns Excel serial date number for today\n */\n static today(): number {\n const now = new Date();\n now.setHours(0, 0, 0, 0); // Reset time to midnight\n return DateUtil.dateToSerial(now);\n }\n\n /**\n * Get current date and time as Excel serial date (with fractional day)\n * @returns Excel serial date number for now (includes time as fraction)\n */\n static now(): number {\n return DateUtil.dateToSerial(new Date());\n }\n}\n","import { Sheet } from './Sheet';\nimport { CellEvent } from './Cell/CellEvent';\nimport { DataType } from './Cell/DataType';\nimport { ErrorType } from './Cell/ErrorType';\nimport { FormatterInterface } from './Cell/Formatter';\nimport { ArrayResult } from './Cell/ArrayResult';\nimport { DateUtil } from './Utility/DateUtil';\n\n/**\n * Cell object, hold single value or formula\n */\nexport class Cell {\n private _value : any; //Cell original value\n private _address!: string; //Cell address\n private _formula!: string; //Cell formula\n private _computed : any; //Result of the computed formula\n private _rules : Record = {\n address : /^\\$?[A-Z]+\\$?[0-9]+$/, //Cell address validation rule (allows $ for absolute refs)\n };\n\n protected precedents : Record = {}; //Cells registry required by the formula\n protected dependents : Record = {}; //Cells registry that depend on this cell\n\n protected remotePrecedents : Record = {}; //Cells registry required by the formula from other sheets\n protected remoteDependents : Record = {}; //Cells registry that depend on this cell from other sheets\n\n /** Dynamic precedents (column/row ranges) */\n private dynamicPrecedents: {\n columnRanges?: string[]; // e.g., [\"A:A\", \"B:C\"]\n rowRanges?: string[]; // e.g., [\"1:1\", \"5:10\"]\n } = {};\n\n /** Flags */\n private _dirty : boolean = false;\n private _calculated : boolean = false;\n private _hasRemotePrecedents : boolean = false;\n private _hasRemoteDependents : boolean = false;\n private _hasDynamicPrecedents : boolean = false;\n\n /** Array formula properties */\n private _isArrayAnchor : boolean = false; // Is this the anchor cell of an array formula?\n private _arrayResult ?: ArrayResult; // Array result if this is anchor\n private _spillRange ?: string; // Range that this array spills into (e.g., \"A1:C3\")\n\n protected format!: string;\n protected formatter!: FormatterInterface;\n protected el ?: any;\n\n constructor(\n address : string,\n protected sheet : Sheet,\n protected _type : DataType = DataType.NUMBER\n ) {\n this.address = address;\n this.init();\n }\n\n public init() {\n\n }\n\n /** Mount cell object into specific element */\n public mount(el: any) {\n this.el = el;\n\n this.sheet.dispatcher.dispatch(CellEvent.ELEMENT_MOUNTED, {cell : this.address, el : el});\n }\n\n /** Check if cell has error value */\n public isError() {\n return Object.values(ErrorType).includes(this.value as ErrorType);\n }\n\n /** Check if cell has empty-able value, like null, empty string, undefined */\n public isEmpty() {\n // Check the raw value, not the processed value (which may convert null to 0 for NUMBER type)\n const rawValue = this.formula ? this._computed : this._value;\n return rawValue === null || rawValue === undefined || rawValue === '';\n }\n\n /**\n * Calculate the cell value based on its formula\n */\n public calculate() {\n // If no formula, nothing to calculate\n if (!this._formula) {\n this._calculated = true;\n this._dirty = false;\n return this._value;\n }\n\n try {\n // Use the sheet's eval method which sets the active sheet context\n const result = this.sheet.eval(this._formula);\n\n // Check if result is an ArrayResult\n if (result instanceof ArrayResult) {\n return this.handleArrayResult(result);\n }\n\n // Check if value changed to mark dependents as dirty\n const oldValue = this._computed;\n const valueChanged = oldValue !== result;\n\n this._computed = result;\n this._calculated = true;\n this._dirty = false;\n\n // Dispatch calculation complete event\n this.sheet.dispatcher.dispatch(CellEvent.CALCULATED, {\n cell : this.address,\n value : this._computed\n });\n\n // If value changed, mark dependents as dirty and recalculate if auto-calculate is enabled\n if (valueChanged) {\n this._markDependentsAsDirty();\n\n if (this.sheet.autoCalculate) {\n this._recalculateDependents();\n }\n }\n\n return this._computed;\n } catch (error) {\n console.error(`Error calculating cell ${this.address}:`, error);\n this._computed = ErrorType.ERROR;\n this._calculated = true;\n this._dirty = false;\n return this._computed;\n }\n }\n\n /**\n * Handle array formula result - spill into multiple cells\n */\n private handleArrayResult(arrayResult: ArrayResult): any {\n // Mark this as array anchor\n this._isArrayAnchor = true;\n this._arrayResult = arrayResult;\n\n // If single value, just return it\n if (arrayResult.isSingleValue()) {\n this._computed = arrayResult.getSingleValue();\n this._calculated = true;\n this._dirty = false;\n return this._computed;\n }\n\n // Check if we can spill\n const canSpill = this.checkSpillRange(arrayResult);\n\n if (!canSpill) {\n // Return SPILL error\n this._computed = ErrorType.SPILL;\n this._calculated = true;\n this._dirty = false;\n return this._computed;\n }\n\n // Spill the array into cells\n this.spillArray(arrayResult);\n\n // Return the value for this anchor cell\n this._computed = arrayResult.getValue(0, 0);\n this._calculated = true;\n this._dirty = false;\n\n return this._computed;\n }\n\n /**\n * Check if the array can spill without blocking\n */\n private checkSpillRange(arrayResult: ArrayResult): boolean {\n const {row: startRow, col: startCol} = this.getCellCoordinates(this.address);\n\n // Check each cell in the spill range\n for (let r = 0; r < arrayResult.rows; r++) {\n for (let c = 0; c < arrayResult.cols; c++) {\n // Skip the anchor cell\n if (r === 0 && c === 0) continue;\n\n const targetAddress = this.coordinatesToAddress(startRow + r, startCol + c);\n const targetCell = this.sheet.getCell(targetAddress);\n\n // If cell exists and has value or formula, it's blocking\n if (targetCell && (!targetCell.isEmpty() || targetCell.formula)) {\n return false;\n }\n }\n }\n\n return true;\n }\n\n /**\n * Spill array values into cells\n */\n private spillArray(arrayResult: ArrayResult): void {\n const {row: startRow, col: startCol} = this.getCellCoordinates(this.address);\n const endRow = startRow + arrayResult.rows - 1;\n const endCol = startCol + arrayResult.cols - 1;\n\n // Store spill range\n this._spillRange = `${this.address}:${this.coordinatesToAddress(endRow, endCol)}`;\n\n // Spill values into cells\n for (let r = 0; r < arrayResult.rows; r++) {\n for (let c = 0; c < arrayResult.cols; c++) {\n // Skip the anchor cell\n if (r === 0 && c === 0) continue;\n\n const targetAddress = this.coordinatesToAddress(startRow + r, startCol + c);\n const value = arrayResult.getValue(r, c);\n\n // Get or create the cell and set its value\n const cell = this.sheet.getCell(targetAddress);\n cell.value = value;\n }\n }\n }\n\n /**\n * Convert cell address to row/col coordinates\n */\n private getCellCoordinates(address: string): {row: number, col: number} {\n const match = address.match(/^([A-Z]+)(\\d+)$/);\n if (!match) throw new Error(`Invalid cell address: ${address}`);\n\n const colStr = match[1];\n const row = parseInt(match[2]);\n\n // Convert column letters to number\n let col = 0;\n for (let i = 0; i < colStr.length; i++) {\n col = col * 26 + (colStr.charCodeAt(i) - 64);\n }\n\n return {row, col};\n }\n\n /**\n * Convert row/col coordinates to cell address\n */\n private coordinatesToAddress(row: number, col: number): string {\n let colStr = '';\n let c = col;\n\n while (c > 0) {\n const remainder = (c - 1) % 26;\n colStr = String.fromCharCode(65 + remainder) + colStr;\n c = Math.floor((c - 1) / 26);\n }\n\n return colStr + row;\n }\n\n /**\n * Check if this cell is an array anchor\n */\n public isArrayAnchor(): boolean {\n return this._isArrayAnchor;\n }\n\n /**\n * Get the spill range if this is an array anchor\n */\n public getSpillRange(): string | undefined {\n return this._spillRange;\n }\n\n /**\n * Set cell format\n */\n public setFormat(format: string) {\n this.format = format;\n }\n\n /**\n * Set cell formatter\n */\n public setFormatter(formatter: any) {\n this.formatter = formatter;\n }\n\n /**\n * Get formatted value\n */\n public getFormattedValue(): string {\n if (this.formatter) {\n return this.formatter.format(this.value);\n }\n return this.value?.toString() || '';\n }\n\n /** Check if cell is calculated already */\n public isCalculated() : boolean {\n return this._calculated\n }\n\n /** Check if cell is affected by changes on other cells and need recalculation */\n public isDirty() : boolean {\n return this._dirty\n }\n\n public markAsDirty() {\n this._dirty = true;\n }\n\n /** Check if the current is numeric */\n public isNumeric() : boolean {\n return !isNaN(this.value - parseFloat(this.value));\n }\n\n public get address() : string {\n return this._address;\n }\n\n public set address(address : string) {\n if (address.match(this._rules.address)) {\n this._address = address;\n return;\n }\n\n throw new Error(\"Cell address should follow spreadsheet like address rule\");\n }\n\n /**\n * Get cell data type\n */\n public get type() : DataType {\n return this._type;\n }\n\n /**\n * Set cell data type\n */\n public set type(type : DataType) {\n this._type = type;\n }\n\n /**\n * Get cell formula\n */\n public get formula() : string {\n return this._formula;\n }\n\n /**\n * Set cell formula, and notify the parent sheet\n */\n public set formula(formula : string) {\n const oldFormula = this._formula;\n this._formula = formula;\n\n // Detect and store dynamic precedents (column/row ranges)\n this.updateDynamicPrecedents(formula);\n\n this.sheet.dispatcher.dispatch(\n CellEvent.FORMULA_CHANGED,\n {\n cell : this.address,\n oldFormula : oldFormula,\n newFormula : formula\n }\n );\n\n // When formula changes, we need to rebuild dependencies\n // Remove old precedents\n const oldPrecedents = this.getPrecedents();\n if (oldPrecedents) {\n for (const addr in oldPrecedents) {\n const precedent = oldPrecedents[addr];\n if (precedent) {\n precedent.removeDependent(this);\n }\n }\n }\n\n // Clear precedents - they will be rebuilt on next calculation\n this.precedents = {};\n\n // Mark as dirty so it recalculates and rebuilds dependencies on next calculate()\n this.markAsDirty();\n\n // Trigger immediate dependency rebuild if workbook has been built\n if (this.sheet.workbook && formula) {\n this.rebuildDependencies();\n }\n }\n\n /**\n * Rebuild dependencies for this cell based on current formula\n */\n private rebuildDependencies(): void {\n if (!this._formula) return;\n\n const builder = new (require('./Workbook/DependencyBuilder').DependencyBuilder)();\n builder.setWorkbook(this.sheet.workbook);\n\n const { localDeps, remoteDeps } = builder.getFormulaDependencies(this._formula);\n\n // Resolve local dependencies\n const dependencies: Record = {};\n for (const address in localDeps) {\n const precedentCell = this.sheet.getCellDirect(address);\n if (precedentCell) {\n dependencies[address] = precedentCell;\n precedentCell.addDependent(this);\n }\n }\n\n this.setPrecedents(dependencies);\n\n // Handle remote (cross-sheet) dependencies\n for (const remoteRef in remoteDeps) {\n try {\n const { sheetName, cellAddress } = builder.parseRemoteReference(remoteRef);\n const targetSheet = this.sheet.workbook.getSheet(sheetName);\n if (targetSheet) {\n const targetCell = targetSheet.getCellDirect(cellAddress);\n if (targetCell) {\n targetCell.addRemoteDependent(this);\n this.addRemotePrecedent(targetCell);\n }\n }\n } catch (e) {\n // Ignore errors for invalid references\n }\n }\n }\n\n /**\n * Get the value of the cell, if it has formula, return the computed value\n */\n public get value() : any | ErrorType {\n let value : any | ErrorType = this.formula ? this._computed : this._value;\n\n // Check if it's an error value first, return as-is\n if (typeof value === 'string' && Object.values(ErrorType).includes(value as ErrorType)) {\n return value;\n }\n\n switch (this._type) {\n case DataType.NUMBER:\n // Handle null, undefined, or empty string as 0 for calculations\n if (value === null || value === undefined || value === '') {\n return 0;\n }\n // Only parse as number if it's not already a number\n if (typeof value === 'number') {\n return value;\n }\n // Parse to number, but check if result is NaN\n const parsed = parseFloat(value);\n // Return the original value if it can't be parsed (like text)\n // This allows text values to remain text even in NUMBER cells\n return isNaN(parsed) ? value : parsed;\n case DataType.BOOLEAN:\n return !!value;\n case DataType.DATE:\n case DataType.DATETIME:\n case DataType.TIME:\n // For date types, return the Excel serial number (not converted to Date object)\n // Users can call getDateValue() to get a JavaScript Date object\n return value;\n case DataType.ERROR:\n return ErrorType[value as keyof typeof ErrorType];\n default:\n return value;\n }\n }\n\n /**\n * Set cell value, this will reset the formula\n */\n public set value(value : any) {\n // Convert boolean strings to actual booleans for BOOLEAN type cells\n if (this._type === DataType.BOOLEAN && typeof value === 'string') {\n const upperValue = value.trim().toUpperCase();\n if (upperValue === 'TRUE') {\n value = true;\n } else if (upperValue === 'FALSE') {\n value = false;\n }\n }\n\n // Convert date strings to Excel serial numbers for DATE type cells\n if (this._type === DataType.DATE || this._type === DataType.DATETIME) {\n if (typeof value === 'string' && value.trim() !== '') {\n try {\n // Try to parse as ISO date string (YYYY-MM-DD)\n // Use local date to avoid timezone issues\n const parts = value.match(/^(\\d{4})-(\\d{2})-(\\d{2})/);\n if (parts) {\n const year = parseInt(parts[1], 10);\n const month = parseInt(parts[2], 10) - 1; // Month is 0-based\n const day = parseInt(parts[3], 10);\n const date = new Date(year, month, day);\n const serial = DateUtil.dateToSerial(date);\n value = serial;\n } else {\n // Fallback to default Date parsing\n const date = new Date(value);\n if (!isNaN(date.getTime())) {\n value = DateUtil.dateToSerial(date);\n }\n }\n } catch (e) {\n // If parsing fails, keep original value\n }\n } else if (value instanceof Date) {\n value = DateUtil.dateToSerial(value);\n }\n }\n\n this._value = value;\n this._formula = '';\n\n this.sheet.dispatcher.dispatch(CellEvent.VALUE_CHANGED, {cell : this.address, value : value});\n\n // Mark dependents as dirty regardless of autoCalculate setting\n this._markDependentsAsDirty();\n\n // Also invalidate any formulas that reference this cell through column/row ranges\n this.sheet.invalidateDynamicDependents(this.address);\n\n // Auto-recalculate dependents if autoCalculate is enabled\n if (this.sheet.autoCalculate) {\n this._recalculateDependents();\n // After recalculating explicit dependents, recalculate cells with dynamic precedents\n this.sheet.recalculateDirtyCells();\n }\n }\n\n /**\n * Mark all dependent cells as dirty\n */\n private _markDependentsAsDirty() {\n const dependents = this.getDependents();\n for (const address in dependents) {\n const dependent = dependents[address];\n dependent.markAsDirty();\n // Recursively mark their dependents as dirty\n dependent._markDependentsAsDirty();\n }\n }\n\n /**\n * Recalculate all dependent cells\n */\n private _recalculateDependents() {\n const dependents = this.getDependents();\n for (const address in dependents) {\n const dependent = dependents[address];\n dependent.calculate();\n // Recursively recalculate their dependents\n dependent._recalculateDependents();\n }\n }\n\n public getStringValue() : string {\n return this.value.toString();\n }\n\n public getNumericValue() : number {\n return isNaN (parseFloat(this.value)) ? 0 : parseFloat(this.value);\n }\n\n /**\n * Get cell value as JavaScript Date object\n * Works for DATE, TIME, and DATETIME types\n * @returns JavaScript Date object if cell contains a date, null otherwise\n */\n public getDateValue(): Date | null {\n // Check if cell is a date type\n if (this._type !== DataType.DATE && this._type !== DataType.DATETIME && this._type !== DataType.TIME) {\n return null;\n }\n\n const val = this.value;\n\n // If already a Date object, return it\n if (val instanceof Date) {\n return val;\n }\n\n // If it's a number (Excel serial date), convert it\n if (typeof val === 'number' && DateUtil.isValidSerialDate(val)) {\n return DateUtil.serialToDate(val);\n }\n\n // Try parsing as date string\n if (typeof val === 'string') {\n const date = new Date(val);\n if (!isNaN(date.getTime())) {\n return date;\n }\n }\n\n return null;\n }\n\n /**\n * Get cell value as Excel serial date number\n * Works for DATE, TIME, and DATETIME types\n * @returns Excel serial date number if cell contains a date, null otherwise\n */\n public getSerialDateValue(): number | null {\n // Check if cell is a date type\n if (this._type !== DataType.DATE && this._type !== DataType.DATETIME && this._type !== DataType.TIME) {\n return null;\n }\n\n const val = this.value;\n\n // If it's already a number and valid, return it\n if (typeof val === 'number' && DateUtil.isValidSerialDate(val)) {\n return val;\n }\n\n // If it's a Date object, convert it\n if (val instanceof Date) {\n return DateUtil.dateToSerial(val);\n }\n\n // Try parsing as date string and converting\n if (typeof val === 'string') {\n try {\n return DateUtil.fromISOString(val);\n } catch {\n return null;\n }\n }\n\n return null;\n }\n\n /**\n * Set cell value from a JavaScript Date object\n * Automatically sets the cell type to DATE and stores as Excel serial number\n * @param date JavaScript Date object\n */\n public setDateValue(date: Date): void {\n if (!(date instanceof Date) || isNaN(date.getTime())) {\n throw new Error('Invalid date: must be a valid Date object');\n }\n\n this._type = DataType.DATE;\n this.value = DateUtil.dateToSerial(date);\n }\n\n /**\n * Set cell value from Excel serial date number\n * Automatically sets the cell type to DATE\n * @param serialDate Excel serial date number\n */\n public setSerialDateValue(serialDate: number): void {\n if (!DateUtil.isValidSerialDate(serialDate)) {\n throw new Error('Invalid serial date: must be a valid number');\n }\n\n this._type = DataType.DATE;\n this.value = serialDate;\n }\n\n /**\n * Get formatted date string (ISO format: YYYY-MM-DD)\n * @returns ISO date string if cell contains a date, null otherwise\n */\n public getFormattedDate(): string | null {\n const serialDate = this.getSerialDateValue();\n if (serialDate === null) {\n return null;\n }\n\n return DateUtil.toISOString(serialDate);\n }\n\n /**\n * Check if this cell contains a date value\n * @returns True if cell has DATE, TIME, or DATETIME type\n */\n public isDate(): boolean {\n return this._type === DataType.DATE ||\n this._type === DataType.DATETIME ||\n this._type === DataType.TIME;\n }\n\n public getPrecedents() : Record|null {\n if (this._hasDynamicPrecedents) {\n return null;\n } else {\n return this.precedents;\n }\n }\n\n public setPrecedents(precedents : Record) {\n this.precedents = precedents;\n }\n\n public addPrecedent(cell : Cell) {\n this.precedents[cell.address] = cell;\n }\n\n public getDependents() : Record {\n // Combine local and remote dependents\n return {...this.dependents, ...this.remoteDependents};\n }\n\n public setDependents(dependents : Record) {\n this.dependents = dependents;\n }\n\n public addDependent(cell : Cell) {\n this.dependents[cell.address] = cell;\n }\n\n public removeDependent(cell : Cell) {\n delete this.dependents[cell.address];\n }\n\n public addRemoteDependent(cell : Cell) {\n // Use sheet name + address as key to differentiate cells from different sheets\n const key = cell.sheet.name + '!' + cell.address;\n this.remoteDependents[key] = cell;\n this._hasRemoteDependents = true;\n }\n\n public addRemotePrecedent(cell : Cell) {\n // Use sheet name + address as key to differentiate cells from different sheets\n const key = cell.sheet.name + '!' + cell.address;\n this.remotePrecedents[key] = cell;\n }\n\n /**\n * Update dynamic precedents by parsing formula for column/row ranges\n */\n private updateDynamicPrecedents(formula: string): void {\n if (!formula) {\n this.dynamicPrecedents = {};\n this._hasDynamicPrecedents = false;\n return;\n }\n\n const columnRanges: string[] = [];\n const rowRanges: string[] = [];\n\n // Match column ranges: A:A, B:C, etc.\n const columnPattern = /\\b([A-Z]+)\\s*:\\s*([A-Z]+)\\b/g;\n let match;\n while ((match = columnPattern.exec(formula)) !== null) {\n columnRanges.push(match[0]);\n }\n\n // Match row ranges: 1:1, 5:10, etc. (but not cell ranges like A1:B2)\n const rowPattern = /\\b(\\d+)\\s*:\\s*(\\d+)\\b/g;\n while ((match = rowPattern.exec(formula)) !== null) {\n // Make sure it's not part of a cell range (no letter before the number)\n const beforeMatch = formula[match.index - 1];\n if (!beforeMatch || !/[A-Z]/i.test(beforeMatch)) {\n rowRanges.push(match[0]);\n }\n }\n\n this.dynamicPrecedents = {};\n if (columnRanges.length > 0) {\n this.dynamicPrecedents.columnRanges = columnRanges;\n }\n if (rowRanges.length > 0) {\n this.dynamicPrecedents.rowRanges = rowRanges;\n }\n\n this._hasDynamicPrecedents = columnRanges.length > 0 || rowRanges.length > 0;\n }\n\n /**\n * Check if this cell has dynamic precedents\n */\n public hasDynamicPrecedents(): boolean {\n return this._hasDynamicPrecedents;\n }\n\n /**\n * Check if this cell depends on a specific column\n */\n public dependsOnColumn(column: string): boolean {\n if (!this._hasDynamicPrecedents || !this.dynamicPrecedents.columnRanges) {\n return false;\n }\n\n const colNum = this.columnToNumber(column);\n return this.dynamicPrecedents.columnRanges.some(range => {\n const [start, end] = range.split(':').map(c => this.columnToNumber(c.trim()));\n return colNum >= start && colNum <= end;\n });\n }\n\n /**\n * Check if this cell depends on a specific row\n */\n public dependsOnRow(row: number): boolean {\n if (!this._hasDynamicPrecedents || !this.dynamicPrecedents.rowRanges) {\n return false;\n }\n\n return this.dynamicPrecedents.rowRanges.some(range => {\n const [start, end] = range.split(':').map(r => parseInt(r.trim()));\n return row >= start && row <= end;\n });\n }\n\n /**\n * Convert column letter to number (A=1, B=2, etc.)\n */\n private columnToNumber(col: string): number {\n let num = 0;\n for (let i = 0; i < col.length; i++) {\n num = num * 26 + (col.charCodeAt(i) - 64);\n }\n return num;\n }\n}\n","import { Cell } from \"../Cell\";\nimport { Sheet } from \"../Sheet\";\nimport { EventDispatcher } from \"../Utility/EventDispatcher\";\nimport { CellData } from \"../Workbook/Data\";\nimport { SheetEvent } from \"./SheetEvent\";\n\nexport class CellRegistry {\n private cells : Record = {};\n\n constructor(\n private sheet : Sheet,\n private event : EventDispatcher\n ) {\n\n }\n\n public add (cell : Cell) {\n this.cells[cell.address] = cell;\n\n this.event.dispatch(SheetEvent.CELL_ADDED, {cell : cell});\n }\n\n public remove (cell : Cell) {\n delete this.cells[cell.address];\n\n this.event.dispatch(SheetEvent.CELL_REMOVED, {cell : cell});\n }\n\n public get (address : string) : Cell {\n if (this.cells.hasOwnProperty(address)) {\n return this.cells[address];\n } else {\n // create new cell on-the-fly if it doesn't exist\n const cell = new Cell(address, this.sheet);\n this.cells[address] = cell;\n this.event.dispatch(SheetEvent.CELL_CREATED, {cell : cell});\n return cell;\n }\n }\n\n public has (address : string) : boolean {\n return this.cells.hasOwnProperty(address);\n }\n\n public create (address : string, data : CellData) : Cell {\n if (this.has(address)) {\n throw new Error(`Cell ${address} already exists`);\n }\n\n const cell = new Cell(address, this.sheet, data.type);\n\n // Set cell properties from data\n if (data.formula) {\n cell.formula = data.formula;\n } else if (data.value !== undefined) {\n cell.value = data.value;\n }\n\n if (data.format) {\n cell.setFormat(data.format);\n }\n\n if (data.formatter) {\n cell.setFormatter(data.formatter);\n }\n\n this.cells[cell.address] = cell;\n\n this.event.dispatch(SheetEvent.CELL_CREATED, {cell : cell});\n\n return cell;\n }\n\n public all () : Record {\n return this.cells;\n }\n\n public count () : number {\n return Object.keys(this.cells).length;\n }\n\n public clear () {\n this.cells = {};\n }\n\n public each (callback : (cell : Cell) => void) {\n for (const address in this.cells) {\n callback(this.cells[address]);\n }\n }\n\n public filter (callback : (cell : Cell) => boolean) : Record {\n const filtered : Record = {};\n\n for (const address in this.cells) {\n if (callback(this.cells[address])) {\n filtered[address] = this.cells[address];\n }\n }\n\n return filtered;\n }\n}","import { Cell } from \"../Cell\";\n\n/**\n * translate numeric to alphabet, like 1 => A, 27 => AA\n * @param {integer} num numeric value translated to alphabet\n * @return {string} alphabet representation of the value\n */\nexport function numToStr(num: number): string {\n var s = \"\";\n num = Math.round(num - 1);\n while (num >= 0) {\n s = String.fromCharCode(num % 26 + 97) + s;\n num = Math.floor(num / 26) - 1;\n }\n return s.toUpperCase();\n}\n\n/**\n * translate alphabet to numeric, A => 1, B => 2, Z => 26, AA => 27 etc\n * @param {string} char Alphabet [A-Z]\n * @return {integer} Integer representation of the alphabet\n */\nexport function strToNum(char: string): number {\n const chars = char.toUpperCase().split('');\n const base = \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\".split('');\n let i, j, result = 0;\n\n for (i = 0, j = chars.length - 1; i < chars.length; i += 1, j -= 1) {\n result += Math.pow(base.length, j) * (base.indexOf(chars[i]) + 1);\n }\n\n return result;\n}\n\n/**\n * translate cellStart:cellStop to array containing all cell in range\n * e.g A1:B3 => [A1, A2, A3, B1, B2, B3]\n * @return {array} array containing all address in range\n */\nexport function getCellsInRange(range : string) {\n range = range.toUpperCase();\n const regex = {\n alpha : /[A-Z]+/,\n num : /[0-9]+/,\n cellRange : /^[A-Za-z]+[0-9]+\\s*:\\s*[A-Za-z]+[0-9]+$/,\n };\n\n if (!range.match(regex.cellRange)) {\n throw new Error(\"Invalid range syntax!\");\n }\n\n const rangeStart = range.split(':')[0],\n rangeEnd = range.split(':')[1],\n boundaries = {\n start : {\n col : strToNum(rangeStart.match(regex.alpha)[0]), //alpha part\n row : parseInt(rangeStart.match(regex.num)[0]), //numeric part\n },\n end : {\n col : strToNum(rangeEnd.match(regex.alpha)[0]), //alpha part\n row : parseInt(rangeEnd.match(regex.num)[0]), //numeric part\n }\n },\n cellRange = [];\n\n for (\n let col = Math.min(boundaries.start.col, boundaries.end.col) ;\n col <= Math.max(boundaries.start.col, boundaries.end.col);\n col++\n ) {\n for (\n let row = Math.min(boundaries.start.row, boundaries.end.row);\n row <= Math.max(boundaries.start.row, boundaries.end.row);\n row++\n ) {\n cellRange.push(numToStr(col) + row + '');\n }\n }\n\n return cellRange;\n}\n\n/**\n * taken from Formula.VALIDBIN of stoic's formula.js (http://www.stoic.com/pages/formula)\n * check if number is in valid binary format\n * @param {string} number [the binary number]\n * @return {Boolean} [true if valid, false if invalid]\n */\nexport function isValidBinary(number: string) {\n return (/^[01]{1,10}$/).test(number);\n}\n\n/**\n * String repeater, taken from underscore string (https://github.com/epeli/underscore.string)\n * @param {[type]} str [description]\n * @param {[type]} qty [description]\n * @return {[type]} [description]\n */\nexport function strRepeat(str: string, qty: number) {\n if (qty < 1) return '';\n var result = '';\n while (qty > 0) {\n if (qty & 1) result += str;\n qty >>= 1, str += str;\n }\n return result;\n}\n\nexport function repeat(str: string, qty: number, separator: string) {\n if (str == null) {\n return '';\n }\n\n qty = ~~qty;\n\n // using faster implementation if separator is not needed;\n if (separator == null) {\n return strRepeat(String(str), qty);\n }\n\n // this one is about 300x slower in Google Chrome\n for (var repeat = []; qty > 0; repeat[--qty] = str) { }\n return repeat.join(separator);\n}\n\nexport function unique(array: Array) {\n return array.reduce(function (p, c) {\n if (p.indexOf(c) < 0) p.push(c);\n return p;\n }, []);\n}\n\nexport function initial(array: Array, n : any, guard : any) {\n return Array.prototype.slice.call(array, 0, Math.max(0, array.length - (n == null || guard ? 1 : n)));\n}\n\nexport function rest(array : Array, n : any, guard : any) {\n return Array.prototype.slice.call(array, n == null || guard ? 1 : n);\n}\n\n/** end of underscore func */\n\nexport function arrayMerge(args : any) {\n let result : Array = [];\n\n for (let i = 0; i < args.length; i++) {\n if (typeof (args[i]) == 'object') {\n for (let a in args[i]) {\n if (args[i][a].trim() !== '') {\n result = result.concat(args[i][a]);\n }\n }\n } else {\n if (result.concat(args[i]).join().trim() !== '') {\n result = result.concat(args[i]);\n }\n }\n }\n\n return result;\n}\n\nexport function toArray(args : any) {\n return Array.prototype.slice.call(args, 0);\n}\n\n/**\n * Converting object into plain array\n * @param {object} obj Object need to be converted\n * @return {array} Plain array\n */\nexport function objectToArray(obj: any) {\n return Object.values(obj);\n}\n\n/**\n * remove empty cell from cell range collection\n * @param {object} cellRange\n * @return {object} trimmed cellRange\n */\nexport function trimEmptyCell(cellRange : Record) {\n var result : Record = {};\n\n for (var a in cellRange) {\n if (cellRange[a].trim() !== '') {\n result[a] = cellRange[a];\n }\n }\n\n return result;\n}\n\n/**\n * convert range {A1: val1, A2: val2, B1: val3, B2: val4} into 2 dimensional table array\n * [\n * [val1, val2],\n * [val3, val4]\n * ]\n *\n * @param {object} cellRange [description]\n * @return {array} [description]\n */\nexport function rangeToTable(cellRange: Array>): Array> {\n var cell, col,\n row = 0,\n alphaPattern = /[A-Z]+/,\n numPattern = /[0-9]+/,\n arrayTable = [],\n resultTable = [];\n\n for (cell in cellRange) {\n\n col = strToNum(cell.match(alphaPattern)[0]) - 1;\n row = parseInt(cell.match(numPattern)[0], 10) - 1;\n\n if (typeof arrayTable[row] == 'undefined') {\n arrayTable[row] = [];\n }\n\n arrayTable[row][col] = cellRange[cell];\n }\n\n var resultRow = 0, rowLength = arrayTable.length, colLength;\n for (row = 0; row < rowLength; row++) {\n if (typeof (arrayTable[row]) != 'undefined') {\n colLength = arrayTable[row].length;\n\n if (typeof (resultTable[resultRow]) == 'undefined') {\n resultTable[resultRow] = [];\n }\n\n for (col = 0; col < colLength; col++) {\n if (typeof (arrayTable[row][col]) != 'undefined') {\n resultTable[resultRow].push(arrayTable[row][col]);\n }\n }\n\n resultRow++;\n }\n }\n\n return resultTable;\n};\n\n/**\n * transpose horizontal table to be vertical table, or vice-versa\n * e.g\n * [\n * [1,2,3,4],\n * [1,2,3,4],\n * ]\n *\n * to be\n * [\n * [1,1],\n * [2,2],\n * [3,3],\n * [4,4],\n * ]\n */\nexport function transposeTable(table: Array>): Array> {\n var row, col, rowLength, colLength, newTable;\n\n rowLength = table.length;\n newTable = [];\n\n for (row = 0; row < rowLength; row++) {\n colLength = table[row].length;\n\n for (col = 0; col < colLength; col++) {\n if (typeof (newTable[col]) == 'undefined') {\n newTable[col] = [];\n }\n\n newTable[col].push(table[row][col]);\n }\n }\n\n return newTable;\n}\n\n/**\n * Translate all cell references in a formula by applying row and column offsets.\n * Respects absolute references ($ markers) and translates both individual cells and ranges.\n *\n * @param formula The formula to translate (must start with =)\n * @param cellRowOffset The row offset to apply to relative row references\n * @param cellColOffset The column offset to apply to relative column references\n * @returns The translated formula\n *\n * @example\n * translateFormula('=A1', 1, 1) // Returns '=B2'\n * translateFormula('=SUM(A1:B2)', 1, 1) // Returns '=SUM(B2:C3)'\n * translateFormula('=$A$1', 1, 1) // Returns '=$A$1' (absolute reference unchanged)\n * translateFormula('=A$1', 1, 1) // Returns '=B$1' (absolute row unchanged)\n */\nexport function translateFormula(formula: string, cellRowOffset: number, cellColOffset: number): string {\n if (!formula.startsWith('=')) return formula;\n\n // Remove leading =\n let translated = formula.substring(1);\n\n // First, match and translate cell ranges (A1:B2)\n // We do this first to avoid double-processing individual cells in ranges\n translated = translated.replace(\n /(\\$?)([A-Z]+)(\\$?)(\\d+):(\\$?)([A-Z]+)(\\$?)(\\d+)/gi,\n (match, col1Abs, col1, row1Abs, row1, col2Abs, col2, row2Abs, row2) => {\n // Translate start of range\n const col1Num = strToNum(col1.toUpperCase());\n const row1Num = parseInt(row1);\n const newCol1Num = col1Abs === '$' ? col1Num : col1Num + cellColOffset;\n const newRow1Num = row1Abs === '$' ? row1Num : row1Num + cellRowOffset;\n const newStart = `${col1Abs}${numToStr(newCol1Num)}${row1Abs}${newRow1Num}`;\n\n // Translate end of range\n const col2Num = strToNum(col2.toUpperCase());\n const row2Num = parseInt(row2);\n const newCol2Num = col2Abs === '$' ? col2Num : col2Num + cellColOffset;\n const newRow2Num = row2Abs === '$' ? row2Num : row2Num + cellRowOffset;\n const newEnd = `${col2Abs}${numToStr(newCol2Num)}${row2Abs}${newRow2Num}`;\n\n return `${newStart}:${newEnd}`;\n }\n );\n\n // Then match individual cell references (A1, $A$1, A$1, $A1)\n // Use (? {\n const colNum = strToNum(col.toUpperCase());\n const rowNum = parseInt(row);\n\n const newColNum = colAbs === '$' ? colNum : colNum + cellColOffset;\n const newRowNum = rowAbs === '$' ? rowNum : rowNum + cellRowOffset;\n\n return `${colAbs}${numToStr(newColNum)}${rowAbs}${newRowNum}`;\n }\n );\n\n return '=' + translated;\n}\n\n/**\n * Update references to a moved range in a formula\n * When a range is moved from oldRange to newRange, all formulas that reference\n * cells in oldRange need to be updated to reference newRange instead\n *\n * @param formula The formula to update\n * @param oldStartCol The starting column of the old range (e.g., 'A')\n * @param oldStartRow The starting row of the old range (e.g., 1)\n * @param oldEndCol The ending column of the old range (e.g., 'B')\n * @param oldEndRow The ending row of the old range (e.g., 2)\n * @param newStartCol The starting column of the new range\n * @param newStartRow The starting row of the new range\n * @param newEndCol The ending column of the new range\n * @param newEndRow The ending row of the new range\n * @returns The updated formula\n *\n * @example\n * updateMovedReferences('=SUM(A1:B2)', 'A', 1, 'B', 2, 'C', 3, 'D', 4)\n * // Returns '=SUM(C3:D4)'\n *\n * updateMovedReferences('=A1+B1', 'A', 1, 'B', 2, 'C', 3, 'D', 4)\n * // Returns '=C3+D3'\n */\nexport function updateMovedReferences(\n formula: string,\n oldStartCol: string,\n oldStartRow: number,\n oldEndCol: string,\n oldEndRow: number,\n newStartCol: string,\n newStartRow: number,\n newEndCol: string,\n newEndRow: number\n): string {\n if (!formula.startsWith('=')) return formula;\n\n const oldStartColNum = strToNum(oldStartCol);\n const oldEndColNum = strToNum(oldEndCol);\n const newStartColNum = strToNum(newStartCol);\n const newEndColNum = strToNum(newEndCol);\n\n // Normalize ranges (ensure start <= end)\n const oldMinRow = Math.min(oldStartRow, oldEndRow);\n const oldMaxRow = Math.max(oldStartRow, oldEndRow);\n const oldMinCol = Math.min(oldStartColNum, oldEndColNum);\n const oldMaxCol = Math.max(oldStartColNum, oldEndColNum);\n\n const newMinRow = Math.min(newStartRow, newEndRow);\n const newMaxRow = Math.max(newStartRow, newEndRow);\n const newMinCol = Math.min(newStartColNum, newEndColNum);\n const newMaxCol = Math.max(newStartColNum, newEndColNum);\n\n let translated = formula.substring(1);\n\n // Update range references (A1:B2)\n translated = translated.replace(\n /(? {\n const col1Num = strToNum(col1.toUpperCase());\n const row1Num = parseInt(row1);\n const col2Num = strToNum(col2.toUpperCase());\n const row2Num = parseInt(row2);\n\n // Check if this range overlaps with the moved range\n const rangeMinCol = Math.min(col1Num, col2Num);\n const rangeMaxCol = Math.max(col1Num, col2Num);\n const rangeMinRow = Math.min(row1Num, row2Num);\n const rangeMaxRow = Math.max(row1Num, row2Num);\n\n // If the range matches the old range exactly, update it\n if (rangeMinCol === oldMinCol && rangeMaxCol === oldMaxCol &&\n rangeMinRow === oldMinRow && rangeMaxRow === oldMaxRow) {\n const newCol1 = numToStr(newMinCol);\n const newCol2 = numToStr(newMaxCol);\n return `${col1Abs}${newCol1}${row1Abs}${newMinRow}:${col2Abs}${newCol2}${row2Abs}${newMaxRow}`;\n }\n\n return match;\n }\n );\n\n // Update individual cell references\n translated = translated.replace(\n /(? {\n const colNum = strToNum(col.toUpperCase());\n const rowNum = parseInt(row);\n\n // Check if this cell is in the moved range\n if (colNum >= oldMinCol && colNum <= oldMaxCol &&\n rowNum >= oldMinRow && rowNum <= oldMaxRow) {\n // Calculate relative position within old range\n const relCol = colNum - oldMinCol;\n const relRow = rowNum - oldMinRow;\n\n // Apply to new range\n const newColNum = newMinCol + relCol;\n const newRowNum = newMinRow + relRow;\n\n return `${colAbs}${numToStr(newColNum)}${rowAbs}${newRowNum}`;\n }\n\n return match;\n }\n );\n\n return '=' + translated;\n}\n","import { Workbook } from './Workbook';\nimport { Cell } from './Cell';\nimport { Range } from './Range';\nimport { EventDispatcher } from './Utility/EventDispatcher';\nimport { SheetEvent, SheetState } from './Sheet/SheetEvent';\nimport { CellRegistry } from './Sheet/CellRegistry';\nimport { DependencyTree } from './Workbook/DependencyTree';\nimport { DependencyBuilder } from './Workbook/DependencyBuilder';\nimport { CellData } from './Workbook/Data';\nimport { strToNum, numToStr, translateFormula, updateMovedReferences, getCellsInRange } from './Utility/Utility';\n\nexport class Sheet {\n private _el!: any;\n private _id : string;\n private _cells! : CellRegistry;\n private _states : Record = {\n calculation : SheetState.CALCULATION_IDLE,\n };\n private _variables : Record = {};\n private _depTree!: DependencyTree;\n private _autoCalculate : boolean = true;\n\n public needCalculate!: Array;\n public needRender!: Array;\n public workbook: Workbook;\n public name: string;\n public dispatcher: EventDispatcher;\n\n constructor(\n workbook : Workbook,\n name : string,\n dispatcher : EventDispatcher = new EventDispatcher()\n ) {\n this.workbook = workbook;\n this.name = name;\n this.dispatcher = dispatcher;\n this._id = this._generateId();\n this._cells = new CellRegistry(this, this.dispatcher);\n }\n\n /**\n * Generate unique id for sheet.\n *\n * @returns generated id\n */\n private _generateId() : string {\n return 'xxxx-xxxx-xxx-xxxx'.replace(/[x]/g, (c) => {\n const random = Math.floor(Math.random() * 16);\n return random.toString(16);\n });\n }\n\n /**\n * Get autoCalculate option\n */\n public get autoCalculate(): boolean {\n return this._autoCalculate;\n }\n\n /**\n * Set autoCalculate option\n * When true, changes to cell values automatically trigger recalculation of dependents\n * When false, manual calculation is required\n */\n public set autoCalculate(value: boolean) {\n this._autoCalculate = value;\n }\n\n /**\n * Recalculate all dirty cells (used for dynamic precedents)\n */\n public recalculateDirtyCells(): void {\n // Temporarily disable auto-calculate to avoid infinite recursion\n const wasAutoCalculate = this._autoCalculate;\n this._autoCalculate = false;\n\n this._cells.each((cell: Cell) => {\n if (cell.isDirty()) {\n cell.calculate();\n }\n });\n\n // Restore auto-calculate setting\n this._autoCalculate = wasAutoCalculate;\n }\n\n /**\n * Set element where sheet should be mounted (optional)\n */\n public set element(el : any) {\n el.setAttribute('data-calx-id', this.id);\n\n this._el = el;\n\n this.dispatcher.dispatch(SheetEvent.ELEMENT_ATTACHED, {sheet : this, el : el});\n }\n\n /**\n * Get element where sheet is mounted\n */\n public get element() : any {\n return this._el;\n }\n\n /**\n * Get sheet id\n */\n public get id() : string {\n return this._id;\n }\n\n /**\n * Get cells collection\n */\n public get cells() : Record {\n return this._cells.all();\n }\n\n /**\n * Listen to sheet events\n * Convenience method that delegates to the dispatcher\n */\n public listen(event: string, callback: (data: any) => void): void {\n this.dispatcher.listen(event, callback);\n }\n\n /**\n * Calculate the entire sheet\n *\n * @param options calculation option\n */\n public calculate(options : {withoutEvent : boolean} = {withoutEvent : false}) {\n if (options.withoutEvent) {\n this.dispatcher.pauseListener();\n }\n\n // Get calculation order from dependency tree\n if (this._depTree) {\n const calculationOrder = this._depTree.topologicalSort();\n\n // Calculate cells in order (level by level)\n for (const level of calculationOrder) {\n // Skip undefined levels\n if (!level) continue;\n\n for (const cell of level) {\n if (cell.isDirty() || !cell.isCalculated()) {\n cell.calculate();\n }\n }\n }\n\n // After dependency tree calculation, also calculate cells with dynamic precedents\n // that might not be in the tree (e.g., cells with only column/row references)\n this._cells.each((cell: Cell) => {\n if (cell.hasDynamicPrecedents() && (cell.isDirty() || !cell.isCalculated())) {\n cell.calculate();\n }\n });\n } else {\n // No dependency tree, calculate all cells\n for (const address in this.cells) {\n this.cells[address].calculate();\n }\n }\n\n this.dispatcher.resumeListener();\n }\n\n /**\n * Request particular cell to be calculated.\n *\n * @param address cell address\n */\n public requestCalculate(address : string) {\n const cell = this.getCell(address);\n if (cell) {\n cell.markAsDirty();\n cell.calculate();\n\n // Mark dependents as dirty\n const dependents = cell.getDependents();\n for (const depAddress in dependents) {\n dependents[depAddress].markAsDirty();\n }\n }\n }\n\n /**\n * Get range (Excel-like behavior)\n * - Single cell: getRange('A1') returns Range containing one cell\n * - Multiple cells: getRange('A1:B10') returns Range containing multiple cells\n */\n public getRange(address: string): Range {\n return new Range(this, address);\n }\n\n /**\n * Get cell object directly (internal use)\n * For external use, prefer getRange() which is more Excel-like\n */\n public getCellDirect(address: string): Cell {\n return this._cells.get(address);\n }\n\n /**\n * Alias for getRange (Excel-like)\n * @deprecated Use getRange() instead\n */\n public getCell(address: string): Cell {\n return this._cells.get(address);\n }\n\n public getCellValue(cellAddr: string): any {\n return this.getRange(cellAddr).value;\n }\n\n public createCell(address : string, data? : CellData) : Cell {\n const cell = this._cells.create(address, data || {});\n\n // Mark cells with dynamic precedents that might reference this new cell\n this.invalidateDynamicDependents(address);\n\n return cell;\n }\n\n /**\n * Evaluate the given formula.\n */\n public eval(formula : string) : any {\n this.workbook.setActiveSheet(this);\n\n return this.workbook.parser.parse(formula);\n }\n\n /**\n * Build dependency tree for all registered cells\n */\n public buildDependencyTree() : void {\n const builder = new DependencyBuilder();\n builder.setWorkbook(this.workbook);\n this._depTree = builder.build(this._cells);\n }\n\n /**\n * Mark cells with dynamic precedents (column/row ranges) as dirty\n * when a cell at the given address is created or modified\n */\n public invalidateDynamicDependents(address: string): void {\n // Parse the address to get column and row\n const match = address.match(/^([A-Z]+)(\\d+)$/);\n if (!match) return;\n\n const column = match[1];\n const row = parseInt(match[2]);\n\n // Check all cells in the sheet for dynamic dependencies\n this._cells.each((cell: Cell) => {\n if (cell.hasDynamicPrecedents()) {\n if (cell.dependsOnColumn(column) || cell.dependsOnRow(row)) {\n cell.markAsDirty();\n }\n }\n });\n }\n\n /**\n * Get variable value\n */\n public getVariable(name: string): any {\n return this._variables[name] !== undefined ? this._variables[name] : \"#NAME?\";\n }\n\n /**\n * Set variable value\n */\n public setVariable(name: string, value: any): void {\n this._variables[name] = value;\n }\n\n /**\n * Get values from a range of cells\n */\n public getCellRangeValues(start: string, end: string): any[] {\n // Implementation to get range of cells\n // This should parse cell addresses and return array of values\n const startColMatch = start.match(/[A-Z]+/);\n const startRowMatch = start.match(/\\d+/);\n const endColMatch = end.match(/[A-Z]+/);\n const endRowMatch = end.match(/\\d+/);\n\n if (!startColMatch || !startRowMatch || !endColMatch || !endRowMatch) {\n throw new Error(`Invalid cell range: ${start}:${end}`);\n }\n\n const startCol = startColMatch[0];\n const startRow = parseInt(startRowMatch[0]);\n const endCol = endColMatch[0];\n const endRow = parseInt(endRowMatch[0]);\n\n const result: any[] = [];\n\n // Convert column letters to numbers\n const colToNum = (col: string) => {\n let num = 0;\n for (let i = 0; i < col.length; i++) {\n num = num * 26 + (col.charCodeAt(i) - 64);\n }\n return num;\n };\n\n const numToCol = (num: number) => {\n let col = '';\n while (num > 0) {\n const remainder = (num - 1) % 26;\n col = String.fromCharCode(65 + remainder) + col;\n num = Math.floor((num - 1) / 26);\n }\n return col;\n };\n\n const startColNum = colToNum(startCol);\n const endColNum = colToNum(endCol);\n\n // Return as flat array for compatibility with functions\n for (let row = startRow; row <= endRow; row++) {\n for (let col = startColNum; col <= endColNum; col++) {\n const address = numToCol(col) + row;\n const cell = this._cells.get(address);\n result.push(cell ? cell.value : null);\n }\n }\n\n return result;\n }\n\n /**\n * Get values from a range of rows\n */\n public getRowRangeValues(range: string): any[] {\n // Parse range like \"1:3\" or \"2:2\"\n const parts = range.replace(/\\$/g, '').split(':');\n const startRow = parseInt(parts[0]);\n const endRow = parseInt(parts[1]);\n\n const result: any[] = [];\n const allCells = this._cells.all();\n\n // Find all cells in the row range\n for (const address in allCells) {\n const rowMatch = address.match(/(\\d+)$/);\n if (rowMatch) {\n const row = parseInt(rowMatch[1]);\n if (row >= startRow && row <= endRow) {\n result.push(allCells[address].value);\n }\n }\n }\n\n return result;\n }\n\n /**\n * Get values from a range of columns\n */\n public getColumnRangeValues(range: string): any[] {\n // Parse range like \"A:C\" or \"A:A\"\n const parts = range.replace(/\\$/g, '').split(':');\n const [startCol, endCol] = parts;\n\n const colToNum = (col: string) => {\n let num = 0;\n for (let i = 0; i < col.length; i++) {\n num = num * 26 + (col.charCodeAt(i) - 64);\n }\n return num;\n };\n\n const startColNum = colToNum(startCol);\n const endColNum = colToNum(endCol);\n\n const result: any[] = [];\n const allCells = this._cells.all();\n\n // Find all cells in the column range\n for (const address in allCells) {\n const colMatch = address.match(/^([A-Z]+)/);\n if (colMatch) {\n const colNum = colToNum(colMatch[1]);\n if (colNum >= startColNum && colNum <= endColNum) {\n result.push(allCells[address].value);\n }\n }\n }\n\n return result;\n }\n\n /**\n * Load data from a 2D array into the sheet, starting at the anchor cell\n * Formulas are automatically translated to the correct cell addresses based on the anchor offset\n *\n * @param data 2D array of values (numbers, strings, or formulas starting with =)\n * @param anchor Cell address where the array should start (e.g., 'B2')\n *\n * @example\n * sheet.loadArray([\n * [100, 200, 300],\n * [400, 500, 600],\n * ['=SUM(A1:C1)', 0, 0]\n * ], 'B2');\n * // Creates cells at B2, C2, D2, B3, C3, D3, B4, C4, D4\n * // Formula '=SUM(A1:C1)' at array[2][0] becomes '=SUM(B2:D2)' at cell B4\n */\n public loadArray(data: any[][], anchor: string): void {\n if (!Array.isArray(data) || data.length === 0) {\n throw new Error('Data must be a non-empty 2D array');\n }\n\n // Parse anchor address to get column and row\n const anchorMatch = anchor.match(/^([A-Z]+)(\\d+)$/i);\n if (!anchorMatch) {\n throw new Error(`Invalid anchor address: ${anchor}`);\n }\n\n const anchorCol = anchorMatch[1].toUpperCase();\n const anchorRow = parseInt(anchorMatch[2]);\n const anchorColNum = strToNum(anchorCol);\n\n // Calculate the offset that applies to all formulas in the array\n // This is the offset from the theoretical position (A1) to the actual anchor\n const formulaRowOffset = anchorRow - 1;\n const formulaColOffset = anchorColNum - 1;\n\n // Iterate through the array and create cells\n for (let rowIdx = 0; rowIdx < data.length; rowIdx++) {\n const row = data[rowIdx];\n if (!Array.isArray(row)) {\n throw new Error(`Row ${rowIdx} is not an array`);\n }\n\n for (let colIdx = 0; colIdx < row.length; colIdx++) {\n const value = row[colIdx];\n const targetCol = numToStr(anchorColNum + colIdx);\n const targetRow = anchorRow + rowIdx;\n const targetAddress = `${targetCol}${targetRow}`;\n\n // Determine if it's a formula or a value\n if (typeof value === 'string' && value.startsWith('=')) {\n // Translate formula using the same offset for all cells\n const translatedFormula = translateFormula(value, formulaRowOffset, formulaColOffset);\n this.createCell(targetAddress, { formula: translatedFormula });\n } else {\n // Regular value\n this.createCell(targetAddress, { value });\n }\n }\n }\n }\n\n /**\n * Move a range of cells to a new location\n * - Moves cell values and formulas\n * - Translates formulas within the moved cells\n * - Updates references to moved cells in other formulas\n * - Rebuilds dependency tree\n *\n * @param srcRange Source range address (e.g., 'A1:B2' or 'A1')\n * @param dstAddress Destination starting address (e.g., 'C3')\n *\n * @example\n * sheet.moveRange('A1:B2', 'D5');\n * // Moves cells A1, A2, B1, B2 to D5, D6, E5, E6\n * // Formula =SUM(A1:B2) in moved cells becomes =SUM(D5:E6)\n * // Formula =A1+B1 in other cells becomes =D5+E5\n */\n public moveRange(srcRange: string, dstAddress: string): void {\n // Parse source range\n const srcParts = srcRange.includes(':') ? srcRange.split(':') : [srcRange, srcRange];\n const srcStart = srcParts[0].trim().replace(/\\$/g, '');\n const srcEnd = srcParts[1].trim().replace(/\\$/g, '');\n\n const srcStartCol = srcStart.match(/[A-Z]+/)?.[0] || 'A';\n const srcStartRow = parseInt(srcStart.match(/\\d+/)?.[0] || '1');\n const srcEndCol = srcEnd.match(/[A-Z]+/)?.[0] || srcStartCol;\n const srcEndRow = parseInt(srcEnd.match(/\\d+/)?.[0] || srcStartRow.toString());\n\n // Parse destination\n const dstCleaned = dstAddress.replace(/\\$/g, '');\n const dstStartCol = dstCleaned.match(/[A-Z]+/)?.[0] || 'A';\n const dstStartRow = parseInt(dstCleaned.match(/\\d+/)?.[0] || '1');\n\n // Calculate range dimensions\n const srcStartColNum = strToNum(srcStartCol);\n const srcEndColNum = strToNum(srcEndCol);\n const colCount = Math.abs(srcEndColNum - srcStartColNum) + 1;\n const rowCount = Math.abs(srcEndRow - srcStartRow) + 1;\n\n const dstStartColNum = strToNum(dstStartCol);\n const dstEndColNum = dstStartColNum + colCount - 1;\n const dstEndRow = dstStartRow + rowCount - 1;\n const dstEndCol = numToStr(dstEndColNum);\n\n // Calculate offset for translating formulas in moved cells\n const rowOffset = dstStartRow - srcStartRow;\n const colOffset = dstStartColNum - srcStartColNum;\n\n // Get all cells in source range\n const srcCellAddresses = getCellsInRange(\n srcStart === srcEnd ? `${srcStart}:${srcEnd}` : srcRange\n );\n\n // Store cell data before moving\n const cellData: Array<{ address: string; value: any; formula: string | null }> = [];\n srcCellAddresses.forEach(addr => {\n if (this._cells.has(addr)) {\n const cell = this._cells.get(addr);\n cellData.push({\n address: addr,\n value: cell.value,\n formula: cell.formula\n });\n }\n });\n\n // Remove source cells FIRST\n srcCellAddresses.forEach(addr => {\n if (this._cells.has(addr)) {\n const cell = this._cells.get(addr);\n this._cells.remove(cell);\n }\n });\n\n // Create cells at destination with translated formulas\n cellData.forEach((data) => {\n const srcAddr = data.address;\n const srcColMatch = srcAddr.match(/[A-Z]+/)?.[0] || 'A';\n const srcRowMatch = parseInt(srcAddr.match(/\\d+/)?.[0] || '1');\n const srcCol = strToNum(srcColMatch);\n const srcRow = srcRowMatch;\n\n // Calculate destination address\n const dstCol = srcCol + colOffset;\n const dstRow = srcRow + rowOffset;\n const dstAddr = `${numToStr(dstCol)}${dstRow}`;\n\n // Remove existing cell at destination if it exists\n if (this._cells.has(dstAddr)) {\n const existingCell = this._cells.get(dstAddr);\n this._cells.remove(existingCell);\n }\n\n // Translate formula if exists\n let newFormula = data.formula;\n if (newFormula) {\n newFormula = translateFormula(newFormula, rowOffset, colOffset);\n }\n\n // Create new cell\n if (newFormula) {\n this.createCell(dstAddr, { formula: newFormula });\n } else {\n this.createCell(dstAddr, { value: data.value });\n }\n });\n\n // Update all formulas in the sheet that reference the moved range\n // Do this AFTER creating destination cells so they exist when formulas are updated\n this._cells.each((cell: Cell) => {\n // Skip cells that are at the destination (just moved)\n if (cell.address >= numToStr(dstStartColNum) + dstStartRow &&\n cell.address <= numToStr(dstEndColNum) + dstEndRow) {\n // This is a rough check - could be improved\n return;\n }\n\n if (cell.formula) {\n const updatedFormula = updateMovedReferences(\n cell.formula,\n srcStartCol, srcStartRow, srcEndCol, srcEndRow,\n dstStartCol, dstStartRow, dstEndCol, dstEndRow\n );\n if (updatedFormula !== cell.formula) {\n cell.formula = updatedFormula;\n }\n }\n });\n\n // Rebuild dependency tree\n this.buildDependencyTree();\n }\n\n /**\n * Copy a range of cells to a new location\n * - Copies cell values and formulas\n * - Translates formulas within the copied cells\n * - Does NOT update references in other formulas (they still point to original)\n * - Rebuilds dependency tree\n *\n * @param srcRange Source range address (e.g., 'A1:B2' or 'A1')\n * @param dstAddress Destination starting address (e.g., 'C3')\n *\n * @example\n * sheet.copyRange('A1:B2', 'D5');\n * // Copies cells A1, A2, B1, B2 to D5, D6, E5, E6\n * // Formula =SUM(A1:B2) in copied cells becomes =SUM(D5:E6)\n * // Other formulas that reference A1:B2 remain unchanged\n */\n public copyRange(srcRange: string, dstAddress: string): void {\n // Parse source range\n const srcParts = srcRange.includes(':') ? srcRange.split(':') : [srcRange, srcRange];\n const srcStart = srcParts[0].trim().replace(/\\$/g, '');\n const srcEnd = srcParts[1].trim().replace(/\\$/g, '');\n\n const srcStartCol = srcStart.match(/[A-Z]+/)?.[0] || 'A';\n const srcStartRow = parseInt(srcStart.match(/\\d+/)?.[0] || '1');\n const srcEndCol = srcEnd.match(/[A-Z]+/)?.[0] || srcStartCol;\n const srcEndRow = parseInt(srcEnd.match(/\\d+/)?.[0] || srcStartRow.toString());\n\n // Parse destination\n const dstCleaned = dstAddress.replace(/\\$/g, '');\n const dstStartCol = dstCleaned.match(/[A-Z]+/)?.[0] || 'A';\n const dstStartRow = parseInt(dstCleaned.match(/\\d+/)?.[0] || '1');\n\n // Calculate offset for translating formulas\n const srcStartColNum = strToNum(srcStartCol);\n const dstStartColNum = strToNum(dstStartCol);\n const rowOffset = dstStartRow - srcStartRow;\n const colOffset = dstStartColNum - srcStartColNum;\n\n // Get all cells in source range\n const srcCellAddresses = getCellsInRange(\n srcStart === srcEnd ? `${srcStart}:${srcEnd}` : srcRange\n );\n\n // Collect all source cell data BEFORE writing (important for overlapping ranges)\n const cellData: { srcAddr: string; dstAddr: string; value: any; formula: string }[] = [];\n\n srcCellAddresses.forEach(srcAddr => {\n if (this._cells.has(srcAddr)) {\n const srcCell = this._cells.get(srcAddr);\n\n // Calculate destination address\n const srcColMatch = srcAddr.match(/[A-Z]+/)?.[0] || 'A';\n const srcRowMatch = parseInt(srcAddr.match(/\\d+/)?.[0] || '1');\n const srcCol = strToNum(srcColMatch);\n const srcRow = srcRowMatch;\n\n const dstCol = srcCol + colOffset;\n const dstRow = srcRow + rowOffset;\n const dstAddr = `${numToStr(dstCol)}${dstRow}`;\n\n cellData.push({\n srcAddr,\n dstAddr,\n value: srcCell.value,\n formula: srcCell.formula\n });\n }\n });\n\n // Now write all destination cells\n cellData.forEach(data => {\n // Remove existing cell at destination if it exists\n if (this._cells.has(data.dstAddr)) {\n const existingCell = this._cells.get(data.dstAddr);\n this._cells.remove(existingCell);\n }\n\n // Translate formula if exists\n let newFormula = data.formula;\n if (newFormula) {\n newFormula = translateFormula(newFormula, rowOffset, colOffset);\n }\n\n // Create new cell at destination\n if (newFormula) {\n this.createCell(data.dstAddr, { formula: newFormula });\n } else {\n this.createCell(data.dstAddr, { value: data.value });\n }\n });\n\n // Rebuild dependency tree\n this.buildDependencyTree();\n }\n}\n","import bessel from 'bessel';\nimport jStat from 'jstat';\n\nconst nil = new Error('#NULL!');\nconst div0 = new Error('#DIV/0!');\nconst value = new Error('#VALUE!');\nconst ref = new Error('#REF!');\nconst name = new Error('#NAME?');\nconst num = new Error('#NUM!');\nconst na = new Error('#N/A');\nconst error = new Error('#ERROR!');\nconst data = new Error('#GETTING_DATA');\n\nfunction flattenShallow(array) {\n if (!array || !array.reduce) {\n return [array]\n }\n\n return array.reduce((a, b) => {\n const aIsArray = Array.isArray(a);\n const bIsArray = Array.isArray(b);\n\n if (aIsArray && bIsArray) {\n return a.concat(b)\n }\n\n if (aIsArray) {\n a.push(b);\n\n return a\n }\n\n if (bIsArray) {\n return [a].concat(b)\n }\n\n return [a, b]\n })\n}\n\nfunction isFlat(array) {\n if (!array) {\n return false\n }\n\n for (let i = 0; i < array.length; ++i) {\n if (Array.isArray(array[i])) {\n return false\n }\n }\n\n return true\n}\n\nfunction flatten() {\n let result;\n\n if (arguments.length === 1) {\n const argument = arguments[0];\n result = isArrayLike(argument) ? argsToArray.apply(null, arguments) : [argument];\n } else {\n result = Array.from(arguments);\n }\n\n while (!isFlat(result)) {\n result = flattenShallow(result);\n }\n\n return result\n}\n\nfunction isArrayLike(a) {\n return a != null && typeof a.length === 'number' && typeof a !== 'string'\n}\n\nfunction argsToArray(args) {\n const result = [];\n\n arrayEach(args, (value) => {\n result.push(value);\n });\n\n return result\n}\n\nfunction numbers() {\n const possibleNumbers = flatten.apply(null, arguments);\n\n return possibleNumbers.filter((el) => typeof el === 'number')\n}\n\nfunction cleanFloat(number) {\n const power = 1e14;\n\n return Math.round(number * power) / power\n}\n\nfunction parseBool(bool) {\n if (typeof bool === 'boolean') {\n return bool\n }\n\n if (bool instanceof Error) {\n return bool\n }\n\n if (typeof bool === 'number') {\n return bool !== 0\n }\n\n if (typeof bool === 'string') {\n const up = bool.toUpperCase();\n\n if (up === 'TRUE') {\n return true\n }\n\n if (up === 'FALSE') {\n return false\n }\n }\n\n if (bool instanceof Date && !isNaN(bool)) {\n return true\n }\n\n return value\n}\n\nfunction parseNumber(string) {\n if (string instanceof Error) {\n return string\n }\n\n if (string === undefined || string === null || string === '') {\n return 0\n }\n\n if (typeof string === 'boolean') {\n string = +string;\n }\n\n if (!isNaN(string)) {\n return parseFloat(string)\n }\n\n return value\n}\n\nfunction parseString(string) {\n if (string instanceof Error) {\n return string\n }\n\n if (string === undefined || string === null) {\n return ''\n }\n\n return string.toString()\n}\n\nfunction parseNumberArray(arr) {\n let len;\n\n if (!arr || (len = arr.length) === 0) {\n return value\n }\n\n let parsed;\n\n while (len--) {\n if (arr[len] instanceof Error) {\n return arr[len]\n }\n\n parsed = parseNumber(arr[len]);\n\n if (parsed instanceof Error) {\n return parsed\n }\n\n arr[len] = parsed;\n }\n\n return arr\n}\n\nfunction serialNumberToDate(serial) {\n if (serial < 60) {\n serial += 1;\n }\n\n const utc_days = Math.floor(serial - 25569);\n const utc_value = utc_days * 86400;\n const date_info = new Date(utc_value * 1000);\n const fractional_day = serial - Math.floor(serial) + 0.0000001;\n\n let total_seconds = Math.floor(86400 * fractional_day);\n\n const seconds = total_seconds % 60;\n\n total_seconds -= seconds;\n\n const hours = Math.floor(total_seconds / (60 * 60));\n const minutes = Math.floor(total_seconds / 60) % 60;\n let days = date_info.getUTCDate();\n let month = date_info.getUTCMonth();\n\n if (serial >= 60 && serial < 61) {\n days = 29;\n month = 1;\n }\n\n return new Date(date_info.getUTCFullYear(), month, days, hours, minutes, seconds)\n}\n\nfunction parseDate(date) {\n if (!isNaN(date)) {\n if (date instanceof Date) {\n return new Date(date)\n }\n\n const d = parseFloat(date);\n\n if (d < 0 || d >= 2958466) {\n return num\n }\n\n return serialNumberToDate(d)\n }\n\n if (typeof date === 'string') {\n date = /(\\d{4})-(\\d\\d?)-(\\d\\d?)$/.test(date) ? new Date(date + 'T00:00:00.000') : new Date(date);\n\n if (!isNaN(date)) {\n return date\n }\n }\n\n return value\n}\n\nfunction parseDateArray(arr) {\n let len = arr.length;\n let parsed;\n\n while (len--) {\n parsed = parseDate(arr[len]);\n\n if (parsed === value) {\n return parsed\n }\n\n arr[len] = parsed;\n }\n\n return arr\n}\n\nfunction anyError() {\n for (let n = 0; n < arguments.length; n++) {\n if (arguments[n] instanceof Error) {\n return arguments[n]\n }\n }\n\n return undefined\n}\n\nfunction isDefined(arg) {\n return arg !== undefined && arg !== null\n}\n\nfunction anyIsError() {\n let n = arguments.length;\n\n while (n--) {\n if (arguments[n] instanceof Error) {\n return true\n }\n }\n\n return false\n}\n\nfunction anyIsString() {\n let n = arguments.length;\n\n while (n--) {\n if (typeof arguments[n] === 'string') {\n return true\n }\n }\n\n return false\n}\n\nfunction arrayValuesToNumbers(arr) {\n let n = arr.length;\n let el;\n\n while (n--) {\n el = arr[n];\n\n if (typeof el === 'number') {\n continue\n }\n\n if (el === true) {\n arr[n] = 1;\n continue\n }\n\n if (el === false) {\n arr[n] = 0;\n continue\n }\n\n if (typeof el === 'string') {\n const number = parseNumber(el);\n\n arr[n] = number instanceof Error ? 0 : number;\n }\n }\n\n return arr\n}\n\nfunction rest(array, idx) {\n idx = idx || 1;\n\n if (!array || typeof array.slice !== 'function') {\n return array\n }\n\n return array.slice(idx)\n}\n\nfunction initial(array, idx) {\n idx = idx || 1;\n\n if (!array || typeof array.slice !== 'function') {\n return array\n }\n\n return array.slice(0, array.length - idx)\n}\n\nfunction arrayEach(array, iteratee) {\n let index = -1;\n const length = array.length;\n\n while (++index < length) {\n if (iteratee(array[index], index, array) === false) {\n break\n }\n }\n\n return array\n}\n\nfunction transpose(matrix) {\n if (!matrix) {\n return value\n }\n\n return matrix[0].map((col, i) => matrix.map((row) => row[i]))\n}\n\nconst d1900 = new Date(Date.UTC(1900, 0, 1));\nconst WEEK_STARTS = [\n undefined,\n 0,\n 1,\n undefined,\n undefined,\n undefined,\n undefined,\n undefined,\n undefined,\n undefined,\n undefined,\n undefined,\n 1,\n 2,\n 3,\n 4,\n 5,\n 6,\n 0\n];\nconst WEEK_TYPES = [\n [],\n [1, 2, 3, 4, 5, 6, 7],\n [7, 1, 2, 3, 4, 5, 6],\n [6, 0, 1, 2, 3, 4, 5],\n [],\n [],\n [],\n [],\n [],\n [],\n [],\n [7, 1, 2, 3, 4, 5, 6],\n [6, 7, 1, 2, 3, 4, 5],\n [5, 6, 7, 1, 2, 3, 4],\n [4, 5, 6, 7, 1, 2, 3],\n [3, 4, 5, 6, 7, 1, 2],\n [2, 3, 4, 5, 6, 7, 1],\n [1, 2, 3, 4, 5, 6, 7]\n];\nconst WEEKEND_TYPES = [\n [],\n [6, 0],\n [0, 1],\n [1, 2],\n [2, 3],\n [3, 4],\n [4, 5],\n [5, 6],\n undefined,\n undefined,\n undefined,\n [0, 0],\n [1, 1],\n [2, 2],\n [3, 3],\n [4, 4],\n [5, 5],\n [6, 6]\n];\n\n/**\n * Returns the serial number of a particular date.\n *\n * Category: Date and time\n *\n * @param {*} year Year\n * @param {*} month Month\n * @param {*} day Day\n * @returns\n */\nfunction DATE(year, month, day) {\n let result;\n\n year = parseNumber(year);\n month = parseNumber(month);\n day = parseNumber(day);\n\n if (anyIsError(year, month, day)) {\n result = value;\n } else {\n result = new Date(year, month - 1, day);\n\n if (result.getFullYear() < 0) {\n result = num;\n }\n }\n\n return result\n}\n\n/**\n * Calculates the number of days, months, or years between two dates. This function is useful in formulas where you need to calculate an age.\n *\n * Category: Date and time\n *\n * @param {*} start_date A date that represents the first, or starting date of a given period.\n * @param {*} end_date A date that represents the last, or ending, date of the period.\n * @param {*} unit The type of information that you want returned, where:\n - \"Y\": The number of complete years in the period.\n - \"M\": The number of complete months in the period.\n - \"D\": The number of days in the period.\n - \"MD\": The difference between the days in start_date and end_date. The months and years of the dates are ignored.\n - \"YM\": The difference between the months in start_date and end_date. The days and years of the dates are ignored\n - \"YD\": The difference between the days of start_date and end_date. The years of the dates are ignored.\n * @returns\n */\nfunction DATEDIF(start_date, end_date, unit) {\n unit = unit.toUpperCase();\n start_date = parseDate(start_date);\n end_date = parseDate(end_date);\n\n const start_date_year = start_date.getFullYear();\n const start_date_month = start_date.getMonth();\n const start_date_day = start_date.getDate();\n const end_date_year = end_date.getFullYear();\n const end_date_month = end_date.getMonth();\n const end_date_day = end_date.getDate();\n\n let result;\n\n switch (unit) {\n case 'Y':\n result = Math.floor(YEARFRAC(start_date, end_date));\n break\n case 'D':\n result = DAYS(end_date, start_date);\n break\n case 'M':\n result = end_date_month - start_date_month + 12 * (end_date_year - start_date_year);\n\n if (end_date_day < start_date_day) {\n result--;\n }\n\n break\n case 'MD':\n if (start_date_day <= end_date_day) {\n result = end_date_day - start_date_day;\n } else {\n if (end_date_month === 0) {\n start_date.setFullYear(end_date_year - 1);\n start_date.setMonth(12);\n } else {\n start_date.setFullYear(end_date_year);\n start_date.setMonth(end_date_month - 1);\n }\n\n result = DAYS(end_date, start_date);\n }\n\n break\n case 'YM':\n result = end_date_month - start_date_month + 12 * (end_date_year - start_date_year);\n\n if (end_date_day < start_date_day) {\n result--;\n }\n\n result = result % 12;\n break\n case 'YD':\n if (end_date_month > start_date_month || (end_date_month === start_date_month && end_date_day < start_date_day)) {\n start_date.setFullYear(end_date_year);\n } else {\n start_date.setFullYear(end_date_year - 1);\n }\n\n result = DAYS(end_date, start_date);\n break\n }\n\n return result\n}\n\n/**\n * Converts a date in the form of text to a serial number.\n *\n * Category: Date and time\n *\n * @param {*} date_text Text that represents a date in an Excel date format, or a reference to a value that contains text that represents a date in an Excel date format.\n * @returns\n */\nfunction DATEVALUE(date_text) {\n if (typeof date_text !== 'string') {\n return value\n }\n\n const date = Date.parse(date_text);\n\n if (isNaN(date)) {\n return value\n }\n\n return new Date(date_text)\n}\n\n/**\n * Converts a serial number to a day of the month.\n *\n * Category: Date and time\n *\n * @param {*} serial_number The date of the day you are trying to find.\n * @returns\n */\nfunction DAY(serial_number) {\n const date = parseDate(serial_number);\n\n if (date instanceof Error) {\n return date\n }\n\n return date.getDate()\n}\n\nfunction startOfDay(date) {\n const newDate = new Date(date);\n newDate.setHours(0, 0, 0, 0);\n\n return newDate\n}\n\n/**\n * Returns the number of days between two dates.\n *\n * Category: Date and time\n *\n * @param {*} end_date Start_date and End_date are the two dates between which you want to know the number of days.\n * @param {*} start_date Start_date and End_date are the two dates between which you want to know the number of days.\n * @returns\n */\nfunction DAYS(end_date, start_date) {\n end_date = parseDate(end_date);\n start_date = parseDate(start_date);\n\n if (end_date instanceof Error) {\n return end_date\n }\n\n if (start_date instanceof Error) {\n return start_date\n }\n\n return serial(startOfDay(end_date)) - serial(startOfDay(start_date))\n}\n\n/**\n * Calculates the number of days between two dates based on a 360-day year.\n *\n * Category: Date and time\n *\n * @param {*} start_date A date that represents the start date. If start_date occurs after end_date, the DAYS360 function returns a negative number.\n * @param {*} end_date A date that represents the end date.\n * @param {*} method Optional. A logical value that specifies whether to use the U.S. or European method in the calculation.\n * @returns\n */\nfunction DAYS360(start_date, end_date, method) {\n method = parseBool(method || 'false');\n start_date = parseDate(start_date);\n end_date = parseDate(end_date);\n\n if (start_date instanceof Error) {\n return start_date\n }\n\n if (end_date instanceof Error) {\n return end_date\n }\n\n if (method instanceof Error) {\n return method\n }\n\n const sm = start_date.getMonth();\n let em = end_date.getMonth();\n let sd, ed;\n\n if (method) {\n sd = start_date.getDate() === 31 ? 30 : start_date.getDate();\n ed = end_date.getDate() === 31 ? 30 : end_date.getDate();\n } else {\n const smd = new Date(start_date.getFullYear(), sm + 1, 0).getDate();\n const emd = new Date(end_date.getFullYear(), em + 1, 0).getDate();\n sd = start_date.getDate() === smd ? 30 : start_date.getDate();\n\n if (end_date.getDate() === emd) {\n if (sd < 30) {\n em++;\n ed = 1;\n } else {\n ed = 30;\n }\n } else {\n ed = end_date.getDate();\n }\n }\n\n return 360 * (end_date.getFullYear() - start_date.getFullYear()) + 30 * (em - sm) + (ed - sd)\n}\n\n/**\n * Returns the serial number of the date that is the indicated number of months before or after the start date.\n *\n * Category: Date and time\n *\n * @param {*} start_date A date that represents the start date.\n * @param {*} months The number of months before or after start_date. A positive value for months yields a future date; a negative value yields a past date.\n * @returns\n */\nfunction EDATE(start_date, months) {\n start_date = parseDate(start_date);\n\n if (start_date instanceof Error) {\n return start_date\n }\n\n if (isNaN(months)) {\n return value\n }\n\n months = parseInt(months, 10);\n start_date.setMonth(start_date.getMonth() + months);\n\n return start_date\n}\n\n/**\n * Returns the serial number of the last day of the month before or after a specified number of months.\n *\n * Category: Date and time\n *\n * @param {*} start_date A date that represents the starting date.\n * @param {*} months The number of months before or after start_date. A positive value for months yields a future date; a negative value yields a past date.\n * @returns\n */\nfunction EOMONTH(start_date, months) {\n start_date = parseDate(start_date);\n\n if (start_date instanceof Error) {\n return start_date\n }\n\n if (isNaN(months)) {\n return value\n }\n\n months = parseInt(months, 10);\n\n return new Date(start_date.getFullYear(), start_date.getMonth() + months + 1, 0)\n}\n\n/**\n * Converts a serial number to an hour.\n *\n * Category: Date and time\n *\n * @param {*} serial_number The time that contains the hour you want to find. Times may be entered as text strings within quotation marks (for example, \"6:45 PM\"), as decimal numbers (for example, 0.78125, which represents 6:45 PM), or as results of other formulas or functions (for example, TIMEVALUE(\"6:45 PM\")).\n * @returns\n */\nfunction HOUR(serial_number) {\n serial_number = parseDate(serial_number);\n\n if (serial_number instanceof Error) {\n return serial_number\n }\n\n return serial_number.getHours()\n}\n\n/**\n * Formula.js only\n *\n * @param {*} second\n * @returns\n */\nfunction INTERVAL(second) {\n if (typeof second !== 'number' && typeof second !== 'string') {\n return value\n } else {\n second = parseInt(second, 10);\n }\n\n let year = Math.floor(second / 946080000);\n second = second % 946080000;\n let month = Math.floor(second / 2592000);\n second = second % 2592000;\n let day = Math.floor(second / 86400);\n second = second % 86400;\n\n let hour = Math.floor(second / 3600);\n second = second % 3600;\n let min = Math.floor(second / 60);\n second = second % 60;\n let sec = second;\n\n year = year > 0 ? year + 'Y' : '';\n month = month > 0 ? month + 'M' : '';\n day = day > 0 ? day + 'D' : '';\n hour = hour > 0 ? hour + 'H' : '';\n min = min > 0 ? min + 'M' : '';\n sec = sec > 0 ? sec + 'S' : '';\n\n return 'P' + year + month + day + 'T' + hour + min + sec\n}\n\n/**\n * Returns the number of the ISO week number of the year for a given date.\n *\n * Category: Date and time\n *\n * @param {*} date Date is the date-time code used by Excel for date and time calculation.\n * @returns\n */\nfunction ISOWEEKNUM(date) {\n date = parseDate(date);\n\n if (date instanceof Error) {\n return date\n }\n\n date = startOfDay(date);\n date.setDate(date.getDate() + 4 - (date.getDay() || 7));\n const yearStart = new Date(date.getFullYear(), 0, 1);\n\n return Math.ceil(((date - yearStart) / 86400000 + 1) / 7)\n}\n\n/**\n * Converts a serial number to a minute.\n *\n * Category: Date and time\n *\n * @param {*} serial_number The time that contains the minute you want to find. Times may be entered as text strings within quotation marks (for example, \"6:45 PM\"), as decimal numbers (for example, 0.78125, which represents 6:45 PM), or as results of other formulas or functions (for example, TIMEVALUE(\"6:45 PM\")).\n * @returns\n */\nfunction MINUTE(serial_number) {\n serial_number = parseDate(serial_number);\n\n if (serial_number instanceof Error) {\n return serial_number\n }\n\n return serial_number.getMinutes()\n}\n\n/**\n * Converts a serial number to a month.\n *\n * Category: Date and time\n *\n * @param {*} serial_number The date of the month you are trying to find.\n * @returns\n */\nfunction MONTH(serial_number) {\n serial_number = parseDate(serial_number);\n\n if (serial_number instanceof Error) {\n return serial_number\n }\n\n return serial_number.getMonth() + 1\n}\n\n/**\n * Returns the number of whole workdays between two dates.\n *\n * Category: Date and time\n *\n * @param {*} start_date A date that represents the start date.\n * @param {*} end_date A date that represents the end date.\n * @param {*} holidays Optional. An optional range of one or more dates to exclude from the working calendar, such as state and federal holidays and floating holidays. The list can be either a range of values that contains the dates or an array constant of the serial numbers that represent the dates.\n * @returns\n */\nfunction NETWORKDAYS(start_date, end_date, holidays) {\n return NETWORKDAYS.INTL(start_date, end_date, 1, holidays)\n}\n\n/**\n * Returns the number of whole workdays between two dates using parameters to indicate which and how many days are weekend days.\n *\n * Category: Date and time\n *\n * @param {*} start_date The date for from which the difference is to be computed. The start_date can be earlier than, the same as, or later than the end_date.\n * @param {*} end_date The date for to which the difference is to be computed.\n * @param {*} weekend Optional. Indicates the days of the week that are weekend days and are not included in the number of whole working days between start_date and end_date. Weekend is a weekend number or string that specifies when weekends occur. Weekend number values indicate the following weekend days:\n * @param {*} holidays Optional. An optional set of one or more dates that are to be excluded from the working day calendar. holidays shall be a range of values that contain the dates, or an array constant of the serial values that represent those dates. The ordering of dates or serial values in holidays can be arbitrary.\n * @returns\n */\nNETWORKDAYS.INTL = (start_date, end_date, weekend, holidays) => {\n start_date = parseDate(start_date);\n\n if (start_date instanceof Error) {\n return start_date\n }\n\n end_date = parseDate(end_date);\n\n if (end_date instanceof Error) {\n return end_date\n }\n\n let isMask = false;\n const maskDays = [];\n const maskIndex = [1, 2, 3, 4, 5, 6, 0];\n const maskRegex = new RegExp('^[0|1]{7}$');\n\n if (weekend === undefined) {\n weekend = WEEKEND_TYPES[1];\n } else if (typeof weekend === 'string' && maskRegex.test(weekend)) {\n isMask = true;\n weekend = weekend.split('');\n\n for (let i = 0; i < weekend.length; i++) {\n if (weekend[i] === '1') {\n maskDays.push(maskIndex[i]);\n }\n }\n } else {\n weekend = WEEKEND_TYPES[weekend];\n }\n\n if (!(weekend instanceof Array)) {\n return value\n }\n\n if (holidays === undefined) {\n holidays = [];\n } else if (!(holidays instanceof Array)) {\n holidays = [holidays];\n }\n\n for (let i = 0; i < holidays.length; i++) {\n const h = parseDate(holidays[i]);\n\n if (h instanceof Error) {\n return h\n }\n\n holidays[i] = h;\n }\n\n const days = Math.round((end_date - start_date) / (1000 * 60 * 60 * 24)) + 1;\n let total = days;\n const day = start_date;\n\n for (let i = 0; i < days; i++) {\n const d = new Date().getTimezoneOffset() > 0 ? day.getUTCDay() : day.getDay();\n let dec = isMask ? maskDays.includes(d) : d === weekend[0] || d === weekend[1];\n\n for (let j = 0; j < holidays.length; j++) {\n const holiday = holidays[j];\n\n if (\n holiday.getDate() === day.getDate() &&\n holiday.getMonth() === day.getMonth() &&\n holiday.getFullYear() === day.getFullYear()\n ) {\n dec = true;\n break\n }\n }\n\n if (dec) {\n total--;\n }\n\n day.setDate(day.getDate() + 1);\n }\n\n return total\n};\n\n/**\n * Returns the serial number of the current date and time.\n *\n * Category: Date and time\n *\n * @returns\n */\nfunction NOW() {\n return new Date()\n}\n\n/**\n * Converts a serial number to a second.\n *\n * Category: Date and time\n *\n * @param {*} serial_number The time that contains the seconds you want to find. Times may be entered as text strings within quotation marks (for example, \"6:45 PM\"), as decimal numbers (for example, 0.78125, which represents 6:45 PM), or as results of other formulas or functions (for example, TIMEVALUE(\"6:45 PM\")).\n * @returns\n */\nfunction SECOND(serial_number) {\n serial_number = parseDate(serial_number);\n\n if (serial_number instanceof Error) {\n return serial_number\n }\n\n return serial_number.getSeconds()\n}\n\n/**\n * Returns the serial number of a particular time.\n *\n * Category: Date and time\n *\n * @param {*} hour A number from 0 (zero) to 32767 representing the hour. Any value greater than 23 will be divided by 24 and the remainder will be treated as the hour value. For example, TIME(27,0,0) = TIME(3,0,0) = .125 or 3:00 AM.\n * @param {*} minute A number from 0 to 32767 representing the minute. Any value greater than 59 will be converted to hours and minutes. For example, TIME(0,750,0) = TIME(12,30,0) = .520833 or 12:30 PM.\n * @param {*} second A number from 0 to 32767 representing the second. Any value greater than 59 will be converted to hours, minutes, and seconds. For example, TIME(0,0,2000) = TIME(0,33,22) = .023148 or 12:33:20 AM\n * @returns\n */\nfunction TIME(hour, minute, second) {\n hour = parseNumber(hour);\n minute = parseNumber(minute);\n second = parseNumber(second);\n\n if (anyIsError(hour, minute, second)) {\n return value\n }\n\n if (hour < 0 || minute < 0 || second < 0) {\n return num\n }\n\n return (3600 * hour + 60 * minute + second) / 86400\n}\n\n/**\n * Converts a time in the form of text to a serial number.\n *\n * Category: Date and time\n *\n * @param {*} time_text A text string that represents a time in any one of the Microsoft Excel time formats; for example, \"6:45 PM\" and \"18:45\" text strings within quotation marks that represent time.\n * @returns\n */\nfunction TIMEVALUE(time_text) {\n time_text = parseDate(time_text);\n\n if (time_text instanceof Error) {\n return time_text\n }\n\n return (3600 * time_text.getHours() + 60 * time_text.getMinutes() + time_text.getSeconds()) / 86400\n}\n\n/**\n * Returns the serial number of today's date.\n *\n * Category: Date and time\n *\n * @returns\n */\nfunction TODAY() {\n return startOfDay(new Date())\n}\n\n/**\n * Converts a serial number to a day of the week.\n *\n * Category: Date and time\n *\n * @param {*} serial_number A sequential number that represents the date of the day you are trying to find.\n * @param {*} return_type Optional. A number that determines the type of return value.\n * @returns\n */\nfunction WEEKDAY(serial_number, return_type) {\n serial_number = parseDate(serial_number);\n\n if (serial_number instanceof Error) {\n return serial_number\n }\n\n if (return_type === undefined) {\n return_type = 1;\n }\n\n const day = serial_number.getDay();\n\n return WEEK_TYPES[return_type][day]\n}\n\n/**\n * Converts a serial number to a number representing where the week falls numerically with a year.\n *\n * Category: Date and time\n *\n * @param {*} serial_number A date within the week.\n * @param {*} return_type Optional. A number that determines on which day the week begins. The default is 1.\n * @returns\n */\nfunction WEEKNUM(serial_number, return_type) {\n serial_number = parseDate(serial_number);\n\n if (serial_number instanceof Error) {\n return serial_number\n }\n\n if (return_type === undefined) {\n return_type = 1;\n }\n\n if (return_type === 21) {\n return ISOWEEKNUM(serial_number)\n }\n\n const week_start = WEEK_STARTS[return_type];\n let jan = new Date(serial_number.getFullYear(), 0, 1);\n const inc = jan.getDay() < week_start ? 1 : 0;\n jan -= Math.abs(jan.getDay() - week_start) * 24 * 60 * 60 * 1000;\n\n return Math.floor((serial_number - jan) / (1000 * 60 * 60 * 24) / 7 + 1) + inc\n}\n\n/**\n * Returns the serial number of the date before or after a specified number of workdays.\n *\n * Category: Date and time\n *\n * @param {*} start_date A date that represents the start date.\n * @param {*} days The number of nonweekend and nonholiday days before or after start_date. A positive value for days yields a future date; a negative value yields a past date.\n * @param {*} holidays Optional. An optional list of one or more dates to exclude from the working calendar, such as state and federal holidays and floating holidays. The list can be either a range of values that contain the dates or an array constant of the serial numbers that represent the dates.\n * @returns\n */\nfunction WORKDAY(start_date, days, holidays) {\n return WORKDAY.INTL(start_date, days, 1, holidays)\n}\n\n/**\n * Returns the serial number of the date before or after a specified number of workdays using parameters to indicate which and how many days are weekend days.\n *\n * Category: Date and time\n *\n * @param {*} start_date The start date, truncated to integer.\n * @param {*} days The number of workdays before or after the start_date. A positive value yields a future date; a negative value yields a past date; a zero value yields the start_date. Day-offset is truncated to an integer.\n * @param {*} weekend Optional. Indicates the days of the week that are weekend days and are not considered working days. Weekend is a weekend number or string that specifies when weekends occur. Weekend number values indicate the following weekend days:\n * @param {*} holidays Optional. An optional set of one or more dates that are to be excluded from the working day calendar. Holidays shall be a range of values that contain the dates, or an array constant of the serial values that represent those dates. The ordering of dates or serial values in holidays can be arbitrary.\n * @returns\n */\nWORKDAY.INTL = (start_date, days, weekend, holidays) => {\n start_date = parseDate(start_date);\n\n if (start_date instanceof Error) {\n return start_date\n }\n\n days = parseNumber(days);\n\n if (days instanceof Error) {\n return days\n }\n\n if (days < 0) {\n return num\n }\n\n if (weekend === undefined) {\n weekend = WEEKEND_TYPES[1];\n } else {\n weekend = WEEKEND_TYPES[weekend];\n }\n\n if (!(weekend instanceof Array)) {\n return value\n }\n\n if (holidays === undefined) {\n holidays = [];\n } else if (!(holidays instanceof Array)) {\n holidays = [holidays];\n }\n\n for (let i = 0; i < holidays.length; i++) {\n const h = parseDate(holidays[i]);\n\n if (h instanceof Error) {\n return h\n }\n\n holidays[i] = h;\n }\n\n let d = 0;\n\n while (d < days) {\n start_date.setDate(start_date.getDate() + 1);\n const day = start_date.getDay();\n\n if (day === weekend[0] || day === weekend[1]) {\n continue\n }\n\n for (let j = 0; j < holidays.length; j++) {\n const holiday = holidays[j];\n\n if (\n holiday.getDate() === start_date.getDate() &&\n holiday.getMonth() === start_date.getMonth() &&\n holiday.getFullYear() === start_date.getFullYear()\n ) {\n d--;\n break\n }\n }\n\n d++;\n }\n\n return start_date\n};\n\n/**\n * Converts a serial number to a year.\n *\n * Category: Date and time\n *\n * @param {*} serial_number The date of the year you want to find.\n * @returns\n */\nfunction YEAR(serial_number) {\n serial_number = parseDate(serial_number);\n\n if (serial_number instanceof Error) {\n return serial_number\n }\n\n return serial_number.getFullYear()\n}\n\nfunction isLeapYear(year) {\n return new Date(year, 1, 29).getMonth() === 1\n}\n\n// TODO : Use DAYS ?\nfunction daysBetween(start_date, end_date) {\n return Math.ceil((end_date - start_date) / 1000 / 60 / 60 / 24)\n}\n\n/**\n * Returns the year fraction representing the number of whole days between start_date and end_date.\n *\n * Category: Date and time\n *\n * @param {*} start_date A date that represents the start date.\n * @param {*} end_date A date that represents the end date.\n * @param {*} basis Optional. The type of day count basis to use.\n * @returns\n */\nfunction YEARFRAC(start_date, end_date, basis) {\n start_date = parseDate(start_date);\n\n if (start_date instanceof Error) {\n return start_date\n }\n\n end_date = parseDate(end_date);\n\n if (end_date instanceof Error) {\n return end_date\n }\n\n basis = basis || 0;\n let sd = start_date.getDate();\n const sm = start_date.getMonth() + 1;\n const sy = start_date.getFullYear();\n let ed = end_date.getDate();\n const em = end_date.getMonth() + 1;\n const ey = end_date.getFullYear();\n\n switch (basis) {\n case 0:\n // US (NASD) 30/360\n if (sd === 31 && ed === 31) {\n sd = 30;\n ed = 30;\n } else if (sd === 31) {\n sd = 30;\n } else if (sd === 30 && ed === 31) {\n ed = 30;\n }\n\n return (ed + em * 30 + ey * 360 - (sd + sm * 30 + sy * 360)) / 360\n case 1: {\n // Actual/actual\n const feb29Between = (date1, date2) => {\n const year1 = date1.getFullYear();\n const mar1year1 = new Date(year1, 2, 1);\n\n if (isLeapYear(year1) && date1 < mar1year1 && date2 >= mar1year1) {\n return true\n }\n\n const year2 = date2.getFullYear();\n const mar1year2 = new Date(year2, 2, 1);\n\n return isLeapYear(year2) && date2 >= mar1year2 && date1 < mar1year2\n };\n\n let ylength = 365;\n\n if (sy === ey || (sy + 1 === ey && (sm > em || (sm === em && sd >= ed)))) {\n if ((sy === ey && isLeapYear(sy)) || feb29Between(start_date, end_date) || (em === 1 && ed === 29)) {\n ylength = 366;\n }\n\n return daysBetween(start_date, end_date) / ylength\n }\n\n const years = ey - sy + 1;\n const days = (new Date(ey + 1, 0, 1) - new Date(sy, 0, 1)) / 1000 / 60 / 60 / 24;\n const average = days / years;\n\n return daysBetween(start_date, end_date) / average\n }\n\n case 2:\n // Actual/360\n\n return daysBetween(start_date, end_date) / 360\n case 3:\n // Actual/365\n\n return daysBetween(start_date, end_date) / 365\n case 4:\n // European 30/360\n\n return (ed + em * 30 + ey * 360 - (sd + sm * 30 + sy * 360)) / 360\n }\n}\n\nfunction serial(date) {\n const addOn = date > -2203891200000 ? 2 : 1;\n\n return Math.ceil((date - d1900) / 86400000) + addOn\n}\n\nconst defaultOperator = '=';\nconst validSymbols = ['>', '>=', '<', '<=', '=', '<>'];\nconst _TOKEN_TYPE_OPERATOR = 'operator';\nconst _TOKEN_TYPE_LITERAL = 'literal';\nconst SUPPORTED_TOKENS = [_TOKEN_TYPE_OPERATOR, _TOKEN_TYPE_LITERAL];\n\nconst TOKEN_TYPE_OPERATOR = _TOKEN_TYPE_OPERATOR;\nconst TOKEN_TYPE_LITERAL = _TOKEN_TYPE_LITERAL;\n\n/**\n * Create token which describe passed symbol/value.\n *\n * @param {String} value Value/Symbol to describe.\n * @param {String} type Type of the token 'operator' or 'literal'.\n * @return {Object}\n */\nfunction createToken(value, type) {\n if (SUPPORTED_TOKENS.indexOf(type) === -1) {\n throw new Error('Unsupported token type: ' + type)\n }\n\n return {\n value: value,\n type: type\n }\n}\n\n/**\n * Tries to cast numeric values to their type passed as a string.\n *\n * @param {*} value\n * @return {*}\n */\nfunction castValueToCorrectType(value) {\n if (typeof value !== 'string') {\n return value\n }\n\n if (/^\\d+(\\.\\d+)?$/.test(value)) {\n value = value.indexOf('.') === -1 ? parseInt(value, 10) : parseFloat(value);\n }\n\n return value\n}\n\n/**\n * Generate stream of tokens from passed expression.\n *\n * @param {String} expression\n * @return {String[]}\n */\nfunction tokenizeExpression(expression) {\n const expressionLength = expression.length;\n const tokens = [];\n let cursorIndex = 0;\n let processedValue = '';\n let processedSymbol = '';\n\n while (cursorIndex < expressionLength) {\n const char = expression.charAt(cursorIndex);\n\n switch (char) {\n case '>':\n case '<':\n case '=':\n processedSymbol = processedSymbol + char;\n\n if (processedValue.length > 0) {\n tokens.push(processedValue);\n processedValue = '';\n }\n\n break\n default:\n if (processedSymbol.length > 0) {\n tokens.push(processedSymbol);\n processedSymbol = '';\n }\n\n processedValue = processedValue + char;\n break\n }\n\n cursorIndex++;\n }\n\n if (processedValue.length > 0) {\n tokens.push(processedValue);\n }\n\n if (processedSymbol.length > 0) {\n tokens.push(processedSymbol);\n }\n\n return tokens\n}\n\n/**\n * Analyze and convert tokens to an object which describes their meaning.\n *\n * @param {String[]} tokens\n * @return {Object[]}\n */\nfunction analyzeTokens(tokens) {\n let literalValue = '';\n const analyzedTokens = [];\n\n for (let i = 0; i < tokens.length; i++) {\n const token = tokens[i];\n\n if (i === 0 && validSymbols.indexOf(token) >= 0) {\n analyzedTokens.push(createToken(token, TOKEN_TYPE_OPERATOR));\n } else {\n literalValue += token;\n }\n }\n\n if (literalValue.length > 0) {\n analyzedTokens.push(createToken(castValueToCorrectType(literalValue), TOKEN_TYPE_LITERAL));\n }\n\n if (analyzedTokens.length > 0 && analyzedTokens[0].type !== TOKEN_TYPE_OPERATOR) {\n analyzedTokens.unshift(createToken(defaultOperator, TOKEN_TYPE_OPERATOR));\n }\n\n return analyzedTokens\n}\n\n/**\n * Compute/Evaluate an expression passed as an array of tokens.\n *\n * @param {Object[]} tokens\n * @return {Boolean}\n */\nfunction computeExpression(tokens) {\n const values = [];\n let operator;\n\n for (let i = 0; i < tokens.length; i++) {\n const token = tokens[i];\n\n switch (token.type) {\n case TOKEN_TYPE_OPERATOR:\n operator = token.value;\n break\n case TOKEN_TYPE_LITERAL:\n values.push(token.value);\n break\n }\n }\n\n return evaluate(values, operator)\n}\n\n/**\n * Evaluate values based on passed math operator.\n *\n * @param {*} values\n * @param {String} operator\n * @return {Boolean}\n */\nfunction evaluate(values, operator) {\n let result = false;\n\n switch (operator) {\n case '>':\n result = values[0] > values[1];\n break\n case '>=':\n result = values[0] >= values[1];\n break\n case '<':\n result = values[0] < values[1];\n break\n case '<=':\n result = values[0] <= values[1];\n break\n case '=':\n result = values[0] == values[1];\n break\n case '<>':\n result = values[0] != values[1];\n break\n }\n\n return result\n}\n\nfunction parse(expression) {\n return analyzeTokens(tokenizeExpression(expression))\n}\n\nconst compute = computeExpression;\n\n// TODO\n/**\n * -- Not implemented --\n *\n * Returns information about the formatting, location, or contents of a value.\n *\n * Category: Information\n *\n * @returns\n */\nfunction CELL() {\n throw new Error('CELL is not implemented')\n}\n\nconst ERROR = {};\n\nERROR.TYPE = (error_val) => {\n switch (error_val) {\n case nil:\n return 1\n case div0:\n return 2\n case value:\n return 3\n case ref:\n return 4\n case name:\n return 5\n case num:\n return 6\n case na:\n return 7\n case data:\n return 8\n }\n\n return na\n};\n\n// TODO\n/**\n * -- Not implemented --\n *\n * Returns information about the current operating environment.\n *\n * Category: Information\n *\n * @returns\n */\nfunction INFO() {\n throw new Error('INFO is not implemented')\n}\n\n/**\n * Returns TRUE if the value is blank.\n *\n * Category: Information\n *\n * @param {*} value The value that you want tested. The value argument can be a blank (empty value), error, logical value, text, number, or reference value, or a name referring to any of these.\n * @returns\n */\nfunction ISBLANK(value) {\n return value === null\n}\n\n/**\n * Formula.js only\n *\n * @param {*} number\n * @returns\n */\nfunction ISBINARY(number) {\n return /^[01]{1,10}$/.test(number)\n}\n\n/**\n * Returns TRUE if the value is any error value except #N/A.\n *\n * Category: Information\n *\n * @param {*} value The value that you want tested. The value argument can be a blank (empty value), error, logical value, text, number, or reference value, or a name referring to any of these.\n * @returns\n */\nfunction ISERR(value$1) {\n return (\n [value, ref, div0, num, name, nil].indexOf(value$1) >= 0 ||\n (typeof value$1 === 'number' && (isNaN(value$1) || !isFinite(value$1)))\n )\n}\n\n/**\n * Returns TRUE if the value is any error value.\n *\n * Category: Information\n *\n * @param {*} value The value that you want tested. The value argument can be a blank (empty value), error, logical value, text, number, or reference value, or a name referring to any of these.\n * @returns\n */\nfunction ISERROR(value) {\n return ISERR(value) || value === na\n}\n\n/**\n * Returns TRUE if the number is even.\n *\n * Category: Information\n *\n * @param {*} number The value to test. If number is not an integer, it is truncated.\n * @returns\n */\nfunction ISEVEN(number) {\n return !(Math.floor(Math.abs(number)) & 1)\n}\n\n// TODO\n/**\n * -- Not implemented --\n *\n * Returns TRUE if there is a reference to a value that contains a formula.\n *\n * Category: Information\n *\n * @param {*} reference Reference is a reference to the value you want to test. Reference can be a value reference, a formula, or a name that refers to a value.\n * @returns\n */\nfunction ISFORMULA() {\n throw new Error('ISFORMULA is not implemented')\n}\n\n/**\n * Returns TRUE if the value is a logical value.\n *\n * Category: Information\n *\n * @param {*} value The value that you want tested. The value argument can be a blank (empty value), error, logical value, text, number, or reference value, or a name referring to any of these.\n * @returns\n */\nfunction ISLOGICAL(value) {\n return value === true || value === false\n}\n\n/**\n * Returns TRUE if the value is the #N/A error value.\n *\n * Category: Information\n *\n * @param {*} value The value that you want tested. The value argument can be a blank (empty value), error, logical value, text, number, or reference value, or a name referring to any of these.\n * @returns\n */\nfunction ISNA(value) {\n return value === na\n}\n\n/**\n * Returns TRUE if the value is not text.\n *\n * Category: Information\n *\n * @param {*} value The value that you want tested. The value argument can be a blank (empty value), error, logical value, text, number, or reference value, or a name referring to any of these.\n * @returns\n */\nfunction ISNONTEXT(value) {\n return typeof value !== 'string'\n}\n\n/**\n * Returns TRUE if the value is a number.\n *\n * Category: Information\n *\n * @param {*} value The value that you want tested. The value argument can be a blank (empty value), error, logical value, text, number, or reference value, or a name referring to any of these.\n * @returns\n */\nfunction ISNUMBER(value) {\n return typeof value === 'number' && !isNaN(value) && isFinite(value)\n}\n\n/**\n * Returns TRUE if the number is odd.\n *\n * Category: Information\n *\n * @param {*} value The value that you want tested. The value argument can be a blank (empty value), error, logical value, text, number, or reference value, or a name referring to any of these.\n * @returns\n */\nfunction ISODD(value) {\n return !!(Math.floor(Math.abs(value)) & 1)\n}\n\n// TODO\n/**\n * -- Not implemented --\n *\n * Returns TRUE if the value is a reference.\n *\n * Category: Information\n *\n * @param {*} value The value that you want tested. The value argument can be a blank (empty value), error, logical value, text, number, or reference value, or a name referring to any of these.\n * @returns\n */\nfunction ISREF() {\n throw new Error('ISREF is not implemented')\n}\n\n/**\n * Returns TRUE if the value is text.\n *\n * Category: Information\n *\n * @param {*} value The value that you want tested. The value argument can be a blank (empty value), error, logical value, text, number, or reference value, or a name referring to any of these.\n * @returns\n */\nfunction ISTEXT(value) {\n return typeof value === 'string'\n}\n\n/**\n * Returns a value converted to a number.\n *\n * Category: Information\n *\n * @param {*} value The value you want converted. N converts values listed in the following table.\n * @returns\n */\nfunction N(value) {\n if (ISNUMBER(value)) {\n return value\n }\n\n if (value instanceof Date) {\n return value.getTime()\n }\n\n if (value === true) {\n return 1\n }\n\n if (value === false) {\n return 0\n }\n\n if (ISERROR(value)) {\n return value\n }\n\n return 0\n}\n\n/**\n * Returns the error value #N/A.\n *\n * Category: Information\n *\n * @returns\n */\nfunction NA() {\n return na\n}\n\n// TODO\n/**\n * -- Not implemented --\n *\n * Returns the sheet number of the referenced sheet.\n *\n * Category: Information\n *\n * @param {*} value Optional. Value is the name of a sheet or a reference for which you want the sheet number. If value is omitted, SHEET returns the number of the sheet that contains the function.\n * @returns\n */\nfunction SHEET() {\n throw new Error('SHEET is not implemented')\n}\n\n// TODO\n/**\n * -- Not implemented --\n *\n * Returns the number of sheets in a reference.\n *\n * Category: Information\n *\n * @param {*} reference Optional. Reference is a reference for which you want to know the number of sheets it contains. If Reference is omitted, SHEETS returns the number of sheets in the workbook that contains the function.\n * @returns\n */\nfunction SHEETS() {\n throw new Error('SHEETS is not implemented')\n}\n\n/**\n * Returns a number indicating the data type of a value.\n *\n * Category: Information\n *\n * @param {*} value Can be any Microsoft Excel value, such as a number, text, logical value, and so on.\n * @returns\n */\nfunction TYPE(value) {\n if (ISNUMBER(value)) {\n return 1\n }\n\n if (ISTEXT(value)) {\n return 2\n }\n\n if (ISLOGICAL(value)) {\n return 4\n }\n\n if (ISERROR(value)) {\n return 16\n }\n\n if (Array.isArray(value)) {\n return 64\n }\n}\n\n/**\n * Chooses a value from a list of values.\n *\n * Category: Lookup and reference\n *\n * @param {*} index_num Specifies which value argument is selected. Index_num must be a number between 1 and 254, or a formula or reference to a value containing a number between 1 and 254. If index_num is 1, CHOOSE returns value1; if it is 2, CHOOSE returns value2; and so on. If index_num is less than 1 or greater than the number of the last value in the list, CHOOSE returns the #VALUE! error value. If index_num is a fraction, it is truncated to the lowest integer before being used.\n - If index_num is 1, CHOOSE returns value1; if it is 2, CHOOSE returns value2; and so on.\n - If index_num is less than 1 or greater than the number of the last value in the list, CHOOSE returns the #VALUE! error value.\n - If index_num is a fraction, it is truncated to the lowest integer before being used.\n * @param {*} args value1, value2, ... Value 1 is required, subsequent values are optional. 1 to 254 value arguments from which CHOOSE selects a value or an action to perform based on index_num. The arguments can be numbers, value references, defined names, formulas, functions, or text.\n * @returns\n */\nfunction CHOOSE() {\n if (arguments.length < 2) {\n return na\n }\n\n const index = arguments[0];\n\n if (index < 1 || index > 254) {\n return value\n }\n\n if (arguments.length < index + 1) {\n return value\n }\n\n return arguments[index]\n}\n\n/**\n * Returns the column number of a reference.\n *\n * Category: Lookup and reference\n *\n * @param {*} reference the value or range of values for which you want to return the column number.\n * @param {*} index\n * @returns\n */\nfunction COLUMN(reference, index) {\n if (arguments.length !== 2) {\n return na\n }\n\n if (index < 0) {\n return num\n }\n\n if (!(reference instanceof Array) || typeof index !== 'number') {\n return value\n }\n\n if (reference.length === 0) {\n return undefined\n }\n\n return jStat.col(reference, index)\n}\n\n/**\n * Returns the number of columns in a reference.\n *\n * Category: Lookup and reference\n *\n * @param {*} array An array or array formula, or a reference to a range of values for which you want the number of columns.\n * @returns\n */\nfunction COLUMNS(array) {\n if (arguments.length !== 1) {\n return na\n }\n\n if (!(array instanceof Array)) {\n return value\n }\n\n if (array.length === 0) {\n return 0\n }\n\n return jStat.cols(array)\n}\n\n/**\n * Looks in the top row of an array and returns the value of the indicated value.\n *\n * Category: Lookup and reference\n *\n * @param {*} lookup_value The value to be found in the first row of the table. Lookup_value can be a value, a reference, or a text string.\n * @param {*} table_array A table of information in which data is looked up. Use a reference to a range or a range name.\n * @param {*} row_index_num The row number in table_array from which the matching value will be returned. A row_index_num of 1 returns the first row value in table_array, a row_index_num of 2 returns the second row value in table_array, and so on. If row_index_num is less than 1, HLOOKUP returns the #VALUE! error value; if row_index_num is greater than the number of rows on table_array, HLOOKUP returns the #REF! error value.\n * @param {*} range_lookup Optional. A logical value that specifies whether you want HLOOKUP to find an exact match or an approximate match. If TRUE or omitted, an approximate match is returned. In other words, if an exact match is not found, the next largest value that is less than lookup_value is returned. If FALSE, HLOOKUP will find an exact match. If one is not found, the error value #N/A is returned.\n * @returns\n */\nfunction HLOOKUP(lookup_value, table_array, row_index_num, range_lookup) {\n return VLOOKUP(lookup_value, transpose(table_array), row_index_num, range_lookup)\n}\n\n/**\n * Uses an index to choose a value from a reference or array.\n *\n * Category: Lookup and reference\n *\n * @param {*} array A range of values or an array constant.\n - If array contains only one row or column, the corresponding row_num or column_num argument is optional.\n - If array has more than one row and more than one column, and only row_num or column_num is used, INDEX returns an array of the entire row or column in array.\n * @param {*} row_num Required, unless column_num is present. Selects the row in array from which to return a value. If row_num is omitted, column_num is required.\n * @param {*} column_num Optional. Selects the column in array from which to return a value. If column_num is omitted, row_num is required.\n * @returns\n */\nfunction INDEX(array, row_num, column_num) {\n const someError = anyError(array, row_num, column_num);\n\n if (someError) {\n return someError\n }\n\n if (!Array.isArray(array)) {\n return value\n }\n\n const isOneDimensionRange = array.length > 0 && !Array.isArray(array[0]);\n\n if (isOneDimensionRange && !column_num) {\n column_num = row_num;\n row_num = 1;\n } else {\n column_num = column_num || 1;\n row_num = row_num || 1;\n }\n\n if (column_num < 0 || row_num < 0) {\n return value\n }\n\n if (isOneDimensionRange && row_num === 1 && column_num <= array.length) {\n return array[column_num - 1]\n } else if (row_num <= array.length && column_num <= array[row_num - 1].length) {\n return array[row_num - 1][column_num - 1]\n }\n\n return ref\n}\n\n/**\n * Looks up values in a vector or array.\n *\n * Category: Lookup and reference\n *\n * @param {*} lookup_value A value that LOOKUP searches for in an array. The lookup_value argument can be a number, text, a logical value, or a name or reference that refers to a value.\n - If LOOKUP can't find the value of lookup_value, it uses the largest value in the array that is less than or equal to lookup_value.\n - If the value of lookup_value is smaller than the smallest value in the first row or column (depending on the array dimensions), LOOKUP returns the #N/A error value.\n * @param {*} array A range of values that contains text, numbers, or logical values that you want to compare with lookup_value. The array form of LOOKUP is very similar to the HLOOKUP and VLOOKUP functions. The difference is that HLOOKUP searches for the value of lookup_value in the first row, VLOOKUP searches in the first column, and LOOKUP searches according to the dimensions of array.\n* @param {*} result_array Optional. A range that contains only one row or column. The result_array argument must be the same size as lookup_value. It has to be the same size.\n * @returns\n */\nfunction LOOKUP(lookup_value, array, result_array) {\n array = flatten(array);\n result_array = result_array ? flatten(result_array) : array;\n\n const isNumberLookup = typeof lookup_value === 'number';\n let result = na;\n\n for (let i = 0; i < array.length; i++) {\n if (array[i] === lookup_value) {\n return result_array[i]\n } else if (\n (isNumberLookup && array[i] <= lookup_value) ||\n (typeof array[i] === 'string' && array[i].localeCompare(lookup_value) < 0)\n ) {\n result = result_array[i];\n } else if (isNumberLookup && array[i] > lookup_value) {\n return result\n }\n }\n\n return result\n}\n\n/**\n * Looks up values in a reference or array.\n *\n * Category: Lookup and reference\n *\n * @param {*} lookup_value The value that you want to match in lookup_array. For example, when you look up someone's number in a telephone book, you are using the person's name as the lookup value, but the telephone number is the value you want.The lookup_value argument can be a value (number, text, or logical value) or a value reference to a number, text, or logical value.\n * @param {*} lookup_array The range of values being searched.\n * @param {*} match_type Optional. The number -1, 0, or 1. The match_type argument specifies how Excel matches lookup_value with values in lookup_array. The default value for this argument is 1.\n * @returns\n */\nfunction MATCH(lookup_value, lookup_array, match_type) {\n if (!lookup_value || !lookup_array) {\n return na\n }\n\n if (arguments.length === 2) {\n match_type = 1;\n }\n\n lookup_array = flatten(lookup_array);\n\n if (!(lookup_array instanceof Array)) {\n return na\n }\n\n if (match_type !== -1 && match_type !== 0 && match_type !== 1) {\n return na\n }\n\n let index;\n let indexValue;\n\n for (let idx = 0; idx < lookup_array.length; idx++) {\n if (match_type === 1) {\n if (lookup_array[idx] === lookup_value) {\n return idx + 1\n } else if (lookup_array[idx] < lookup_value) {\n if (!indexValue) {\n index = idx + 1;\n indexValue = lookup_array[idx];\n } else if (lookup_array[idx] > indexValue) {\n index = idx + 1;\n indexValue = lookup_array[idx];\n }\n }\n } else if (match_type === 0) {\n if (typeof lookup_value === 'string' && typeof lookup_array[idx] === 'string') {\n const lookupValueStr = lookup_value.toLowerCase().replace(/\\?/g, '.').replace(/\\*/g, '.*').replace(/~/g, '\\\\');\n const regex = new RegExp('^' + lookupValueStr + '$');\n\n if (regex.test(lookup_array[idx].toLowerCase())) {\n return idx + 1\n }\n } else {\n if (lookup_array[idx] === lookup_value) {\n return idx + 1\n }\n }\n } else if (match_type === -1) {\n if (lookup_array[idx] === lookup_value) {\n return idx + 1\n } else if (lookup_array[idx] > lookup_value) {\n if (!indexValue) {\n index = idx + 1;\n indexValue = lookup_array[idx];\n } else if (lookup_array[idx] < indexValue) {\n index = idx + 1;\n indexValue = lookup_array[idx];\n }\n }\n }\n }\n\n return index || na\n}\n\n/**\n * Returns the number of rows in a reference.\n *\n * Category: Lookup and reference\n *\n * @param {*} array An array, an array formula, or a reference to a range of values for which you want the number of rows.\n * @returns\n */\nfunction ROWS(array) {\n if (arguments.length !== 1) {\n return na\n }\n\n if (!(array instanceof Array)) {\n return value\n }\n\n if (array.length === 0) {\n return 0\n }\n\n return jStat.rows(array)\n}\n\n/**\n * Returns the transpose of an array.\n *\n * Category: Lookup and reference\n *\n * @param {*} array An array or range of values on a worksheet that you want to transpose. The transpose of an array is created by using the first row of the array as the first column of the new array, the second row of the array as the second column of the new array, and so on. If you're not sure of how to enter an array formula, see Create an array formula.\n * @returns\n */\nfunction TRANSPOSE(array) {\n if (!array) {\n return na\n }\n\n return jStat.transpose(array)\n}\n\n/**\n * Returns a list of unique values in a list or range.\n *\n * Category: Lookup and reference\n *\n * @returns\n */\nfunction UNIQUE() {\n const result = [];\n\n for (let i = 0; i < arguments.length; ++i) {\n let hasElement = false;\n const element = arguments[i];\n\n // Check if we've already seen this element.\n\n for (let j = 0; j < result.length; ++j) {\n hasElement = result[j] === element;\n\n if (hasElement) {\n break\n }\n }\n\n // If we did not find it, add it to the result.\n if (!hasElement) {\n result.push(element);\n }\n }\n\n return result\n}\n\n/**\n * Looks in the first column of an array and moves across the row to return the value of a value.\n *\n * Category: Lookup and reference\n *\n * @param {*} lookup_value The value to be found in the first row of the table. Lookup_value can be a value, a reference, or a text string.\n * @param {*} table_array A table of information in which data is looked up. Use a reference to a range or a range name.\n * @param {*} col_index_num The row number in table_array from which the matching value will be returned. A row_index_num of 1 returns the first row value in table_array, a row_index_num of 2 returns the second row value in table_array, and so on. If row_index_num is less than 1, HLOOKUP returns the #VALUE! error value; if row_index_num is greater than the number of rows on table_array, HLOOKUP returns the #REF! error value.\n * @param {*} range_lookup Optional. A logical value that specifies whether you want HLOOKUP to find an exact match or an approximate match. If TRUE or omitted, an approximate match is returned. In other words, if an exact match is not found, the next largest value that is less than lookup_value is returned. If FALSE, HLOOKUP will find an exact match. If one is not found, the error value #N/A is returned.\n * @returns\n */\nfunction VLOOKUP(lookup_value, table_array, col_index_num, range_lookup) {\n if (!table_array || !col_index_num) {\n return na\n }\n\n range_lookup = !(range_lookup === 0 || range_lookup === false);\n let result = na;\n const isNumberLookup = typeof lookup_value === 'number';\n let exactMatchOnly = false;\n\n for (let i = 0; i < table_array.length; i++) {\n const row = table_array[i];\n\n if (row[0] === lookup_value) {\n result = col_index_num < row.length + 1 ? row[col_index_num - 1] : ref;\n break\n } else if (\n !exactMatchOnly &&\n ((isNumberLookup && range_lookup && row[0] <= lookup_value) ||\n (range_lookup && typeof row[0] === 'string' && row[0].localeCompare(lookup_value) < 0))\n ) {\n result = col_index_num < row.length + 1 ? row[col_index_num - 1] : ref;\n }\n\n if (isNumberLookup && row[0] > lookup_value) {\n exactMatchOnly = true;\n }\n }\n\n return result\n}\n\nconst SQRT2PI = 2.5066282746310002;\n\n/**\n * Returns the average of the absolute deviations of data points from their mean.\n *\n * Category: Statistical\n *\n * @param {*} args number1, number2, ... Number1 is required, subsequent numbers are optional. 1 to 255 arguments for which you want the average of the absolute deviations. You can also use a single array or a reference to an array instead of arguments separated by commas.\n * @returns\n */\nfunction AVEDEV() {\n const flatArguments = flatten(arguments);\n const flatArgumentsDefined = flatArguments.filter(isDefined);\n\n if (flatArgumentsDefined.length === 0) {\n return num\n }\n\n const range = parseNumberArray(flatArgumentsDefined);\n\n if (range instanceof Error) {\n return range\n }\n\n return jStat.sum(jStat(range).subtract(jStat.mean(range)).abs()[0]) / range.length\n}\n\n/**\n * Returns the average of its arguments.\n *\n * Category: Statistical\n *\n * @param {*} args number1, number2, ...Numbers, value references or ranges for which you want the average.\n * @returns\n */\nfunction AVERAGE() {\n const flatArguments = flatten(arguments);\n const flatArgumentsDefined = flatArguments.filter(isDefined);\n\n if (flatArgumentsDefined.length === 0) {\n return div0\n }\n\n const someError = anyError.apply(undefined, flatArgumentsDefined);\n\n if (someError) {\n return someError\n }\n\n const range = numbers(flatArgumentsDefined);\n const n = range.length;\n let sum = 0;\n let count = 0;\n let result;\n\n for (let i = 0; i < n; i++) {\n sum += range[i];\n count += 1;\n }\n\n result = sum / count;\n\n if (isNaN(result)) {\n result = num;\n }\n\n return result\n}\n\n/**\n * Returns the average of its arguments, including numbers, text, and logical values.\n *\n * Category: Statistical\n *\n * @param {*} args value1, value2, ... Value1 is required, subsequent values are optional. 1 to 255 values, ranges of values, or values for which you want the average.\n * @returns\n */\nfunction AVERAGEA() {\n const flatArguments = flatten(arguments);\n const flatArgumentsDefined = flatArguments.filter(isDefined);\n\n if (flatArgumentsDefined.length === 0) {\n return div0\n }\n\n const someError = anyError.apply(undefined, flatArgumentsDefined);\n\n if (someError) {\n return someError\n }\n\n const range = flatArgumentsDefined;\n const n = range.length;\n let sum = 0;\n let count = 0;\n let result;\n\n for (let i = 0; i < n; i++) {\n const el = range[i];\n\n if (typeof el === 'number') {\n sum += el;\n }\n\n if (el === true) {\n sum++;\n }\n\n if (el !== null) {\n count++;\n }\n }\n\n result = sum / count;\n\n if (isNaN(result)) {\n result = num;\n }\n\n return result\n}\n\n/**\n * Returns the average (arithmetic mean) of all the values in a range that meet a given criteria.\n *\n * Category: Statistical\n *\n * @param {*} range One or more values to average, including numbers or names, arrays, or references that contain numbers.\n * @param {*} criteria The criteria in the form of a number, expression, value reference, or text that defines which values are averaged.\n * @param {*} average_range Optional. The actual set of values to average. If omitted, range is used.\n * @returns\n */\nfunction AVERAGEIF(range, criteria, average_range) {\n if (arguments.length <= 1) {\n return na\n }\n\n average_range = average_range || range;\n const flatAverageRange = flatten(average_range);\n const flatAverageRangeDefined = flatAverageRange.filter(isDefined);\n average_range = parseNumberArray(flatAverageRangeDefined);\n\n range = flatten(range);\n\n if (average_range instanceof Error) {\n return average_range\n }\n\n let average_count = 0;\n let result = 0;\n const isWildcard = criteria === void 0 || criteria === '*';\n const tokenizedCriteria = isWildcard ? null : parse(criteria + '');\n\n for (let i = 0; i < range.length; i++) {\n const value = range[i];\n\n if (isWildcard) {\n result += average_range[i];\n average_count++;\n } else {\n const tokens = [createToken(value, TOKEN_TYPE_LITERAL)].concat(tokenizedCriteria);\n\n if (compute(tokens)) {\n result += average_range[i];\n average_count++;\n }\n }\n }\n\n return result / average_count\n}\n\n/**\n * Returns the average (arithmetic mean) of all values that meet multiple criteria.\n *\n * Category: Statistical\n *\n * @param {*} args One or more values to average, including numbers or names, arrays, or references that contain numbers.\n * @returns\n */\nfunction AVERAGEIFS() {\n // Does not work with multi dimensional ranges yet!\n // http://office.microsoft.com/en-001/excel-help/averageifs-function-HA010047493.aspx\n const args = argsToArray(arguments);\n const criteriaLength = (args.length - 1) / 2;\n const range = flatten(args[0]);\n let count = 0;\n let result = 0;\n\n for (let i = 0; i < range.length; i++) {\n let isMeetCondition = false;\n\n for (let j = 0; j < criteriaLength; j++) {\n const value = args[2 * j + 1][i];\n const criteria = args[2 * j + 2];\n const isWildcard = criteria === void 0 || criteria === '*';\n let computedResult = false;\n\n if (isWildcard) {\n computedResult = true;\n } else {\n const tokenizedCriteria = parse(criteria + '');\n const tokens = [createToken(value, TOKEN_TYPE_LITERAL)].concat(tokenizedCriteria);\n\n computedResult = compute(tokens);\n }\n\n // Criterias are calculated as AND so any `false` breakes the loop as unmeet condition\n if (!computedResult) {\n isMeetCondition = false;\n break\n }\n\n isMeetCondition = true;\n }\n\n if (isMeetCondition) {\n result += range[i];\n count++;\n }\n }\n\n const average = result / count;\n\n return isNaN(average) ? 0 : average\n}\n\nconst BETA = {};\n\n/**\n * Returns the beta cumulative distribution function.\n *\n * Category: Statistical\n *\n * @param {*} x The value between A and B at which to evaluate the function\n * @param {*} alpha A parameter of the distribution.\n * @param {*} beta A parameter of the distribution.\n * @param {*} cumulative A logical value that determines the form of the function. If cumulative is TRUE, BETA.DIST returns the cumulative distribution function; if FALSE, it returns the probability density function.\n * @param {*} a Optional. A lower bound to the interval of x.\n * @param {*} b Optional. An upper bound to the interval of x.\n * @returns\n */\nBETA.DIST = function (x, alpha, beta, cumulative, a, b) {\n if (arguments.length < 4) {\n return value\n }\n\n a = a === undefined ? 0 : a;\n b = b === undefined ? 1 : b;\n\n x = parseNumber(x);\n alpha = parseNumber(alpha);\n beta = parseNumber(beta);\n a = parseNumber(a);\n b = parseNumber(b);\n\n if (anyIsError(x, alpha, beta, a, b)) {\n return value\n }\n\n x = (x - a) / (b - a);\n\n return cumulative ? jStat.beta.cdf(x, alpha, beta) : jStat.beta.pdf(x, alpha, beta)\n};\n\n/**\n * Returns the inverse of the cumulative distribution function for a specified beta distribution.\n *\n * Category: Statistical\n *\n * @param {*} probability A probability associated with the beta distribution.\n * @param {*} alpha A parameter of the distribution.\n * @param {*} beta A parameter the distribution.\n * @param {*} a Optional. A lower bound to the interval of x.\n * @param {*} b Optional. An upper bound to the interval of x.\n * @returns\n */\nBETA.INV = (probability, alpha, beta, a, b) => {\n a = a === undefined ? 0 : a;\n b = b === undefined ? 1 : b;\n probability = parseNumber(probability);\n alpha = parseNumber(alpha);\n beta = parseNumber(beta);\n a = parseNumber(a);\n b = parseNumber(b);\n\n if (anyIsError(probability, alpha, beta, a, b)) {\n return value\n }\n\n return jStat.beta.inv(probability, alpha, beta) * (b - a) + a\n};\n\nconst BINOM = {};\n\n/**\n * Returns the individual term binomial distribution probability.\n *\n * Category: Statistical\n *\n * @param {*} number_s The number of successes in trials.\n * @param {*} trials The number of independent trials.\n * @param {*} probability_s The probability of success on each trial.\n * @param {*} cumulative A logical value that determines the form of the function. If cumulative is TRUE, then BINOM.DIST returns the cumulative distribution function, which is the probability that there are at most number_s successes; if FALSE, it returns the probability mass function, which is the probability that there are number_s successes.\n * @returns\n */\nBINOM.DIST = (number_s, trials, probability_s, cumulative) => {\n number_s = parseNumber(number_s);\n trials = parseNumber(trials);\n probability_s = parseNumber(probability_s);\n cumulative = parseNumber(cumulative);\n\n if (anyIsError(number_s, trials, probability_s, cumulative)) {\n return value\n }\n\n return cumulative\n ? jStat.binomial.cdf(number_s, trials, probability_s)\n : jStat.binomial.pdf(number_s, trials, probability_s)\n};\n\n/**\n * Returns the probability of a trial result using a binomial distribution.\n *\n * Category: Statistical\n *\n * @param {*} trials The number of independent trials. Must be greater than or equal to 0.\n * @param {*} probability_s The probability of success in each trial. Must be greater than or equal to 0 and less than or equal to 1.\n * @param {*} number_s The number of successes in trials. Must be greater than or equal to 0 and less than or equal to Trials.\n * @param {*} number_s2 Optional. If provided, returns the probability that the number of successful trials will fall between Number_s and number_s2. Must be greater than or equal to Number_s and less than or equal to Trials.\n * @returns\n */\nBINOM.DIST.RANGE = (trials, probability_s, number_s, number_s2) => {\n number_s2 = number_s2 === undefined ? number_s : number_s2;\n\n trials = parseNumber(trials);\n probability_s = parseNumber(probability_s);\n number_s = parseNumber(number_s);\n number_s2 = parseNumber(number_s2);\n\n if (anyIsError(trials, probability_s, number_s, number_s2)) {\n return value\n }\n\n let result = 0;\n\n for (let i = number_s; i <= number_s2; i++) {\n result += COMBIN(trials, i) * Math.pow(probability_s, i) * Math.pow(1 - probability_s, trials - i);\n }\n\n return result\n};\n\n/**\n * Returns the smallest value for which the cumulative binomial distribution is less than or equal to a criterion value.\n *\n * Category: Statistical\n *\n * @param {*} trials The number of Bernoulli trials.\n * @param {*} probability_s The probability of a success on each trial.\n * @param {*} alpha The criterion value.\n * @returns\n */\nBINOM.INV = (trials, probability_s, alpha) => {\n trials = parseNumber(trials);\n probability_s = parseNumber(probability_s);\n alpha = parseNumber(alpha);\n\n if (anyIsError(trials, probability_s, alpha)) {\n return value\n }\n\n let x = 0;\n\n while (x <= trials) {\n if (jStat.binomial.cdf(x, trials, probability_s) >= alpha) {\n return x\n }\n\n x++;\n }\n};\n\nconst CHISQ = {};\n\n/**\n * Returns the cumulative beta probability density function.\n *\n * Category: Statistical\n *\n * @param {*} x The value at which you want to evaluate the distribution.\n * @param {*} deg_freedom The number of degrees of freedom.\n * @param {*} cumulative A logical value that determines the form of the function. If cumulative is TRUE, CHISQ.DIST returns the cumulative distribution function; if FALSE, it returns the probability density function.\n * @returns\n */\nCHISQ.DIST = (x, deg_freedom, cumulative) => {\n x = parseNumber(x);\n deg_freedom = parseNumber(deg_freedom);\n\n if (anyIsError(x, deg_freedom)) {\n return value\n }\n\n return cumulative ? jStat.chisquare.cdf(x, deg_freedom) : jStat.chisquare.pdf(x, deg_freedom)\n};\n\n/**\n * Returns the one-tailed probability of the chi-squared distribution.\n *\n * Category: Statistical\n *\n * @param {*} x The value at which you want to evaluate the distribution.\n * @param {*} deg_freedom The number of degrees of freedom.\n * @returns\n */\nCHISQ.DIST.RT = (x, deg_freedom) => {\n if (!x | !deg_freedom) {\n return na\n }\n\n if (x < 1 || deg_freedom > Math.pow(10, 10)) {\n return num\n }\n\n if (typeof x !== 'number' || typeof deg_freedom !== 'number') {\n return value\n }\n\n return 1 - jStat.chisquare.cdf(x, deg_freedom)\n};\n\n/**\n * Returns the cumulative beta probability density function.\n *\n * Category: Statistical\n *\n * @param {*} probability A probability associated with the chi-squared distribution.\n * @param {*} deg_freedom The number of degrees of freedom.\n * @returns\n */\nCHISQ.INV = (probability, deg_freedom) => {\n probability = parseNumber(probability);\n deg_freedom = parseNumber(deg_freedom);\n\n if (anyIsError(probability, deg_freedom)) {\n return value\n }\n\n return jStat.chisquare.inv(probability, deg_freedom)\n};\n\n/**\n * Returns the inverse of the one-tailed probability of the chi-squared distribution.\n *\n * Category: Statistical\n *\n * @param {*} probability A probability associated with the chi-squared distribution.\n * @param {*} deg_freedom The number of degrees of freedom.\n * @returns\n */\nCHISQ.INV.RT = (probability, deg_freedom) => {\n if (!probability | !deg_freedom) {\n return na\n }\n\n if (probability < 0 || probability > 1 || deg_freedom < 1 || deg_freedom > Math.pow(10, 10)) {\n return num\n }\n\n if (typeof probability !== 'number' || typeof deg_freedom !== 'number') {\n return value\n }\n\n return jStat.chisquare.inv(1.0 - probability, deg_freedom)\n};\n\n/**\n * Returns the test for independence.\n *\n * Category: Statistical\n *\n * @param {*} actual_range The range of data that contains observations to test against expected values.\n * @param {*} expected_range The range of data that contains the ratio of the product of row totals and column totals to the grand total.\n * @returns\n */\nCHISQ.TEST = function (actual_range, expected_range) {\n if (arguments.length !== 2) {\n return na\n }\n\n if (!(actual_range instanceof Array) || !(expected_range instanceof Array)) {\n return value\n }\n\n if (actual_range.length !== expected_range.length) {\n return value\n }\n\n if (actual_range[0] && expected_range[0] && actual_range[0].length !== expected_range[0].length) {\n return value\n }\n\n const row = actual_range.length;\n let tmp, i, j;\n\n // Convert single-dimension array into two-dimension array\n\n for (i = 0; i < row; i++) {\n if (!(actual_range[i] instanceof Array)) {\n tmp = actual_range[i];\n actual_range[i] = [];\n actual_range[i].push(tmp);\n }\n\n if (!(expected_range[i] instanceof Array)) {\n tmp = expected_range[i];\n expected_range[i] = [];\n expected_range[i].push(tmp);\n }\n }\n\n const col = actual_range[0].length;\n const dof = col === 1 ? row - 1 : (row - 1) * (col - 1);\n let xsqr = 0;\n const Pi = Math.PI;\n\n for (i = 0; i < row; i++) {\n for (j = 0; j < col; j++) {\n xsqr += Math.pow(actual_range[i][j] - expected_range[i][j], 2) / expected_range[i][j];\n }\n }\n\n // Get independency by X square and its degree of freedom\n function ChiSq(xsqr, dof) {\n let p = Math.exp(-0.5 * xsqr);\n\n if (dof % 2 === 1) {\n p = p * Math.sqrt((2 * xsqr) / Pi);\n }\n\n let k = dof;\n\n while (k >= 2) {\n p = (p * xsqr) / k;\n k = k - 2;\n }\n\n let t = p;\n let a = dof;\n\n while (t > 0.0000000001 * p) {\n a = a + 2;\n t = (t * xsqr) / a;\n p = p + t;\n }\n\n return 1 - p\n }\n\n return Math.round(ChiSq(xsqr, dof) * 1000000) / 1000000\n};\n\nconst CONFIDENCE = {};\n\n/**\n * Returns the confidence interval for a population mean.\n *\n * Category: Statistical\n *\n * @param {*} alpha The significance level used to compute the confidence level. The confidence level equals 100*(1 - alpha)%, or in other words, an alpha of 0.05 indicates a 95 percent confidence level.\n * @param {*} standard_dev The population standard deviation for the data range and is assumed to be known.\n * @param {*} size The sample size.\n * @returns\n */\nCONFIDENCE.NORM = (alpha, standard_dev, size) => {\n alpha = parseNumber(alpha);\n standard_dev = parseNumber(standard_dev);\n size = parseNumber(size);\n\n if (anyIsError(alpha, standard_dev, size)) {\n return value\n }\n\n return jStat.normalci(1, alpha, standard_dev, size)[1] - 1\n};\n\n/**\n * Returns the confidence interval for a population mean, using a Student's t distribution.\n *\n * Category: Statistical\n *\n * @param {*} alpha The significance level used to compute the confidence level. The confidence level equals 100*(1 - alpha)%, or in other words, an alpha of 0.05 indicates a 95 percent confidence level.\n * @param {*} standard_dev The population standard deviation for the data range and is assumed to be known.\n * @param {*} size The sample size.\n * @returns\n */\nCONFIDENCE.T = (alpha, standard_dev, size) => {\n alpha = parseNumber(alpha);\n standard_dev = parseNumber(standard_dev);\n size = parseNumber(size);\n\n if (anyIsError(alpha, standard_dev, size)) {\n return value\n }\n\n return jStat.tci(1, alpha, standard_dev, size)[1] - 1\n};\n\n/**\n * Returns the correlation coefficient between two data sets.\n *\n * Category: Statistical\n *\n * @param {*} array1 A range of value values.\n * @param {*} array2 A second range of value values.\n * @returns\n */\nfunction CORREL(array1, array2) {\n array1 = parseNumberArray(flatten(array1));\n array2 = parseNumberArray(flatten(array2));\n\n if (anyIsError(array1, array2)) {\n return value\n }\n\n return jStat.corrcoeff(array1, array2)\n}\n\n/**\n * Counts how many numbers are in the list of arguments.\n *\n * Category: Statistical\n *\n * @param {*} args Cell reference, or range within which you want to count numbers.count numbers.\n * @returns\n */\nfunction COUNT() {\n const flatArguments = flatten(arguments);\n\n return numbers(flatArguments).length\n}\n\n/**\n * Counts how many values are in the list of arguments.\n *\n * Category: Statistical\n *\n * @param {*} args Arguments representing the values that you want to count.\n * @returns\n */\nfunction COUNTA() {\n const flatArguments = flatten(arguments);\n\n return flatArguments.length - COUNTBLANK(flatArguments)\n}\n\n/**\n * Formula.js only\n *\n * @param {*} range\n * @param {*} value\n * @returns\n */\nfunction COUNTIN(range, value) {\n let result = 0;\n\n range = flatten(range);\n\n for (let i = 0; i < range.length; i++) {\n if (range[i] === value) {\n result++;\n }\n }\n\n return result\n}\n\n/**\n * Counts the number of blank values within a range.\n *\n * Category: Statistical\n *\n * @param {*} args The range from which you want to count the blank values.\n * @returns\n */\nfunction COUNTBLANK() {\n const range = flatten(arguments);\n let blanks = 0;\n let element;\n\n for (let i = 0; i < range.length; i++) {\n element = range[i];\n\n if (element === undefined || element === null || element === '') {\n blanks++;\n }\n }\n\n return blanks\n}\n\n/**\n * Counts the number of values within a range that meet the given criteria.\n *\n * Category: Statistical\n *\n * @returns\n */\nfunction COUNTIF(range, criteria) {\n range = flatten(range);\n\n const isWildcard = criteria === void 0 || criteria === '*';\n\n if (isWildcard) {\n return range.length\n }\n\n let matches = 0;\n const tokenizedCriteria = parse(criteria + '');\n\n for (let i = 0; i < range.length; i++) {\n const value = range[i];\n const tokens = [createToken(value, TOKEN_TYPE_LITERAL)].concat(tokenizedCriteria);\n\n if (compute(tokens)) {\n matches++;\n }\n }\n\n return matches\n}\n\n/**\n * Counts the number of values within a range that meet multiple criteria.\n *\n * Category: Statistical\n *\n * @param {*} args Range in which to evaluate the associated criteria.\n * @returns\n */\nfunction COUNTIFS() {\n const args = argsToArray(arguments);\n const results = new Array(flatten(args[0]).length);\n\n for (let i = 0; i < results.length; i++) {\n results[i] = true;\n }\n\n for (let i = 0; i < args.length; i += 2) {\n const range = flatten(args[i]);\n const criteria = args[i + 1];\n const isWildcard = criteria === void 0 || criteria === '*';\n\n if (!isWildcard) {\n const tokenizedCriteria = parse(criteria + '');\n\n for (let j = 0; j < range.length; j++) {\n const value = range[j];\n const tokens = [createToken(value, TOKEN_TYPE_LITERAL)].concat(tokenizedCriteria);\n\n results[j] = results[j] && compute(tokens);\n }\n }\n }\n\n let result = 0;\n\n for (let i = 0; i < results.length; i++) {\n if (results[i]) {\n result++;\n }\n }\n\n return result\n}\n\n/**\n * Formula.js only\n *\n * @returns\n */\nfunction COUNTUNIQUE() {\n return UNIQUE.apply(null, flatten(arguments)).length\n}\n\nconst COVARIANCE = {};\n\n/**\n * Returns covariance, the average of the products of paired deviations.\n *\n * Category: Statistical\n *\n * @param {*} array1 The first value range of integers.\n * @param {*} array2 The second value range of integers.\n * @returns\n */\nCOVARIANCE.P = (array1, array2) => {\n array1 = parseNumberArray(flatten(array1));\n array2 = parseNumberArray(flatten(array2));\n\n if (anyIsError(array1, array2)) {\n return value\n }\n\n const mean1 = jStat.mean(array1);\n const mean2 = jStat.mean(array2);\n let result = 0;\n const n = array1.length;\n\n for (let i = 0; i < n; i++) {\n result += (array1[i] - mean1) * (array2[i] - mean2);\n }\n\n return result / n\n};\n\n/**\n * Returns the sample covariance, the average of the products deviations for each data point pair in two data sets.\n *\n * Category: Statistical\n *\n * @param {*} array1 The first value range of integers.\n * @param {*} array2 The second value range of integers.\n * @returns\n */\nCOVARIANCE.S = (array1, array2) => {\n array1 = parseNumberArray(flatten(array1));\n array2 = parseNumberArray(flatten(array2));\n\n if (anyIsError(array1, array2)) {\n return value\n }\n\n return jStat.covariance(array1, array2)\n};\n\n/**\n * Returns the sum of squares of deviations.\n *\n * Category: Statistical\n *\n * @param {*} args number1, number2, ... Number1 is required, subsequent numbers are optional. 1 to 255 arguments for which you want to calculate the sum of squared deviations. You can also use a single array or a reference to an array instead of arguments separated by commas.\n * @returns\n */\nfunction DEVSQ() {\n const range = parseNumberArray(flatten(arguments));\n\n if (range instanceof Error) {\n return range\n }\n\n const mean = jStat.mean(range);\n let result = 0;\n\n for (let i = 0; i < range.length; i++) {\n result += Math.pow(range[i] - mean, 2);\n }\n\n return result\n}\n\nconst EXPON = {};\n\n/**\n * Returns the exponential distribution.\n *\n * Category: Statistical\n *\n * @param {*} x The value of the function.\n * @param {*} lambda The parameter value.\n * @param {*} cumulative A logical value that indicates which form of the exponential function to provide. If cumulative is TRUE, EXPON.DIST returns the cumulative distribution function; if FALSE, it returns the probability density function.\n * @returns\n */\nEXPON.DIST = (x, lambda, cumulative) => {\n x = parseNumber(x);\n lambda = parseNumber(lambda);\n\n if (anyIsError(x, lambda)) {\n return value\n }\n\n return cumulative ? jStat.exponential.cdf(x, lambda) : jStat.exponential.pdf(x, lambda)\n};\n\nconst F = {};\n\n/**\n * Returns the F probability distribution.\n *\n * Category: Statistical\n *\n * @param {*} x The value at which to evaluate the function.\n * @param {*} deg_freedom1 The numerator degrees of freedom.\n * @param {*} deg_freedom2 The denominator degrees of freedom.\n * @param {*} cumulative A logical value that determines the form of the function. If cumulative is TRUE, F.DIST returns the cumulative distribution function; if FALSE, it returns the probability density function.\n * @returns\n */\nF.DIST = (x, deg_freedom1, deg_freedom2, cumulative) => {\n x = parseNumber(x);\n deg_freedom1 = parseNumber(deg_freedom1);\n deg_freedom2 = parseNumber(deg_freedom2);\n\n if (anyIsError(x, deg_freedom1, deg_freedom2)) {\n return value\n }\n\n return cumulative\n ? jStat.centralF.cdf(x, deg_freedom1, deg_freedom2)\n : jStat.centralF.pdf(x, deg_freedom1, deg_freedom2)\n};\n\n/**\n * Returns the F probability distribution.\n *\n * Category: Statistical\n *\n * @param {*} x The value at which to evaluate the function.\n * @param {*} deg_freedom1 The numerator degrees of freedom.\n * @param {*} deg_freedom2 The denominator degrees of freedom.\n * @returns\n */\nF.DIST.RT = function (x, deg_freedom1, deg_freedom2) {\n if (arguments.length !== 3) {\n return na\n }\n\n if (x < 0 || deg_freedom1 < 1 || deg_freedom2 < 1) {\n return num\n }\n\n if (typeof x !== 'number' || typeof deg_freedom1 !== 'number' || typeof deg_freedom2 !== 'number') {\n return value\n }\n\n return 1 - jStat.centralF.cdf(x, deg_freedom1, deg_freedom2)\n};\n\n/**\n * Returns the inverse of the F probability distribution.\n *\n * Category: Statistical\n *\n * @param {*} probability A probability associated with the F cumulative distribution.\n * @param {*} deg_freedom1 The numerator degrees of freedom.\n * @param {*} deg_freedom2 The denominator degrees of freedom.\n * @returns\n */\nF.INV = (probability, deg_freedom1, deg_freedom2) => {\n probability = parseNumber(probability);\n deg_freedom1 = parseNumber(deg_freedom1);\n deg_freedom2 = parseNumber(deg_freedom2);\n\n if (anyIsError(probability, deg_freedom1, deg_freedom2)) {\n return value\n }\n\n if (probability <= 0.0 || probability > 1.0) {\n return num\n }\n\n return jStat.centralF.inv(probability, deg_freedom1, deg_freedom2)\n};\n\n/**\n * Returns the inverse of the F probability distribution.\n *\n * Category: Statistical\n *\n * @param {*} probability A probability associated with the F cumulative distribution.\n * @param {*} deg_freedom1 The numerator degrees of freedom.\n * @param {*} deg_freedom2 The denominator degrees of freedom.\n * @returns\n */\nF.INV.RT = function (probability, deg_freedom1, deg_freedom2) {\n if (arguments.length !== 3) {\n return na\n }\n\n if (\n probability < 0 ||\n probability > 1 ||\n deg_freedom1 < 1 ||\n deg_freedom1 > Math.pow(10, 10) ||\n deg_freedom2 < 1 ||\n deg_freedom2 > Math.pow(10, 10)\n ) {\n return num\n }\n\n if (typeof probability !== 'number' || typeof deg_freedom1 !== 'number' || typeof deg_freedom2 !== 'number') {\n return value\n }\n\n return jStat.centralF.inv(1.0 - probability, deg_freedom1, deg_freedom2)\n};\n\n/**\n * Returns the result of an F-test.\n *\n * Category: Statistical\n *\n * @param {*} array1 The first array or range of data.\n * @param {*} array2 The second array or range of data.\n * @returns\n */\nF.TEST = (array1, array2) => {\n if (!array1 || !array2) {\n return na\n }\n\n if (!(array1 instanceof Array) || !(array2 instanceof Array)) {\n return na\n }\n\n if (array1.length < 2 || array2.length < 2) {\n return div0\n }\n\n const sumOfSquares = (values, x1) => {\n let sum = 0;\n\n for (let i = 0; i < values.length; i++) {\n sum += Math.pow(values[i] - x1, 2);\n }\n\n return sum\n };\n\n const x1 = SUM(array1) / array1.length;\n const x2 = SUM(array2) / array2.length;\n const sum1 = sumOfSquares(array1, x1) / (array1.length - 1);\n const sum2 = sumOfSquares(array2, x2) / (array2.length - 1);\n\n return sum1 / sum2\n};\n\n/**\n * Returns the Fisher transformation.\n *\n * Category: Statistical\n *\n * @param {*} x A numeric value for which you want the transformation.\n * @returns\n */\nfunction FISHER(x) {\n x = parseNumber(x);\n\n if (x instanceof Error) {\n return x\n }\n\n return Math.log((1 + x) / (1 - x)) / 2\n}\n\n/**\n * Returns the inverse of the Fisher transformation.\n *\n * Category: Statistical\n *\n * @param {*} y The value for which you want to perform the inverse of the transformation.\n * @returns\n */\nfunction FISHERINV(y) {\n y = parseNumber(y);\n\n if (y instanceof Error) {\n return y\n }\n\n const e2y = Math.exp(2 * y);\n\n return (e2y - 1) / (e2y + 1)\n}\n\n/**\n * Returns a value along a linear trend.\n *\n * Category: Statistical\n *\n * @param {*} x The data point for which you want to predict a value.\n * @param {*} known_ys The dependent array or range of data.\n * @param {*} known_xs The independent array or range of data.\n * @returns\n */\nfunction FORECAST(x, known_ys, known_xs) {\n x = parseNumber(x);\n known_ys = parseNumberArray(flatten(known_ys));\n known_xs = parseNumberArray(flatten(known_xs));\n\n if (anyIsError(x, known_ys, known_xs)) {\n return value\n }\n\n const xmean = jStat.mean(known_xs);\n const ymean = jStat.mean(known_ys);\n const n = known_xs.length;\n let num = 0;\n let den = 0;\n\n for (let i = 0; i < n; i++) {\n num += (known_xs[i] - xmean) * (known_ys[i] - ymean);\n den += Math.pow(known_xs[i] - xmean, 2);\n }\n\n const b = num / den;\n const a = ymean - b * xmean;\n\n return a + b * x\n}\n\n/**\n * Returns a frequency distribution as a vertical array.\n *\n * Category: Statistical\n *\n * @param {*} data_array An array of or reference to a set of values for which you want to count frequencies. If data_array contains no values, FREQUENCY returns an array of zeros.\n * @param {*} bins_array An array of or reference to intervals into which you want to group the values in data_array. If bins_array contains no values, FREQUENCY returns the number of elements in data_array.\n * @returns\n */\nfunction FREQUENCY(data_array, bins_array) {\n data_array = parseNumberArray(flatten(data_array));\n bins_array = parseNumberArray(flatten(bins_array));\n\n if (anyIsError(data_array, bins_array)) {\n return value\n }\n\n const n = data_array.length;\n const b = bins_array.length;\n const r = [];\n\n for (let i = 0; i <= b; i++) {\n r[i] = 0;\n\n for (let j = 0; j < n; j++) {\n if (i === 0) {\n if (data_array[j] <= bins_array[0]) {\n r[0] += 1;\n }\n } else if (i < b) {\n if (data_array[j] > bins_array[i - 1] && data_array[j] <= bins_array[i]) {\n r[i] += 1;\n }\n } else if (i === b) {\n if (data_array[j] > bins_array[b - 1]) {\n r[b] += 1;\n }\n }\n }\n }\n\n return r\n}\n\n/**\n * Returns the Gamma function value.\n *\n * Category: Statistical\n *\n * @param {*} number Returns a number.\n * @returns\n */\nfunction GAMMA(number) {\n number = parseNumber(number);\n\n if (number instanceof Error) {\n return number\n }\n\n if (number === 0) {\n return num\n }\n\n if (parseInt(number, 10) === number && number < 0) {\n return num\n }\n\n return jStat.gammafn(number)\n}\n\n/**\n * Returns the gamma distribution.\n *\n * Category: Statistical\n *\n * @param {*} x The value at which you want to evaluate the distribution.\n * @param {*} alpha A parameter to the distribution.\n * @param {*} beta A parameter to the distribution. If beta = 1, GAMMA.DIST returns the standard gamma distribution.\n * @param {*} cumulative A logical value that determines the form of the function. If cumulative is TRUE, GAMMA.DIST returns the cumulative distribution function; if FALSE, it returns the probability density function.\n * @returns\n */\nGAMMA.DIST = function (value$1, alpha, beta, cumulative) {\n if (arguments.length !== 4) {\n return na\n }\n\n if (value$1 < 0 || alpha <= 0 || beta <= 0) {\n return value\n }\n\n if (typeof value$1 !== 'number' || typeof alpha !== 'number' || typeof beta !== 'number') {\n return value\n }\n\n return cumulative ? jStat.gamma.cdf(value$1, alpha, beta, true) : jStat.gamma.pdf(value$1, alpha, beta, false)\n};\n\n/**\n * Returns the inverse of the gamma cumulative distribution.\n *\n * Category: Statistical\n *\n * @param {*} probability The probability associated with the gamma distribution.\n * @param {*} alpha A parameter to the distribution.\n * @param {*} beta A parameter to the distribution. If beta = 1, GAMMA.INV returns the standard gamma distribution.\n * @returns\n */\nGAMMA.INV = function (probability, alpha, beta) {\n if (arguments.length !== 3) {\n return na\n }\n\n if (probability < 0 || probability > 1 || alpha <= 0 || beta <= 0) {\n return num\n }\n\n if (typeof probability !== 'number' || typeof alpha !== 'number' || typeof beta !== 'number') {\n return value\n }\n\n return jStat.gamma.inv(probability, alpha, beta)\n};\n\n/**\n * Returns the natural logarithm of the gamma function, Γ(x).\n *\n * Category: Statistical\n *\n * @param {*} x The value for which you want to calculate GAMMALN.\n * @returns\n */\nfunction GAMMALN(x) {\n x = parseNumber(x);\n\n if (x instanceof Error) {\n return x\n }\n\n return jStat.gammaln(x)\n}\n\n/**\n * Returns the natural logarithm of the gamma function, Γ(x).\n *\n * Category: Statistical\n *\n * @param {*} x The value for which you want to calculate GAMMALN.PRECISE.\n * @returns\n */\nGAMMALN.PRECISE = function (x) {\n if (arguments.length !== 1) {\n return na\n }\n\n if (x <= 0) {\n return num\n }\n\n if (typeof x !== 'number') {\n return value\n }\n\n return jStat.gammaln(x)\n};\n\n/**\n * Returns 0.5 less than the standard normal cumulative distribution.\n *\n * Category: Statistical\n *\n * @param {*} z Returns a number.\n * @returns\n */\nfunction GAUSS(z) {\n z = parseNumber(z);\n\n if (z instanceof Error) {\n return z\n }\n\n return jStat.normal.cdf(z, 0, 1) - 0.5\n}\n\n/**\n * Returns the geometric mean.\n *\n * Category: Statistical\n *\n * @param {*} args number1, number2, ... Number1 is required, subsequent numbers are optional. 1 to 255 arguments for which you want to calculate the mean. You can also use a single array or a reference to an array instead of arguments separated by commas.\n * @returns\n */\nfunction GEOMEAN() {\n const args = parseNumberArray(flatten(arguments));\n\n if (args instanceof Error) {\n return args\n }\n\n return jStat.geomean(args)\n}\n\n/**\n * Returns values along an exponential trend.\n *\n * Category: Statistical\n *\n * @param {*} known_y The set of y-values you already know in the relationship y = b*m^x.\n - If the array known_y's is in a single column, then each column of known_x's is interpreted as a separate variable.\n - If the array known_y's is in a single row, then each row of known_x's is interpreted as a separate variable.\n - If any of the numbers in known_y's is 0 or negative, GROWTH returns the #NUM! error value.\n * @param {*} known_x Optional. An optional set of x-values that you may already know in the relationship y = b*m^x.\n - The array known_x's can include one or more sets of variables. If only one variable is used, known_y's and known_x's can be ranges of any shape, as long as they have equal dimensions. If more than one variable is used, known_y's must be a vector (that is, a range with a height of one row or a width of one column).\n - If known_x's is omitted, it is assumed to be the array {1,2,3,...} that is the same size as known_y's.\n * @param {*} new_x Optional. Are new x-values for which you want GROWTH to return corresponding y-values.\n - new_x's must include a column (or row) for each independent variable, just as known_x's does. So, if known_y's is in a single column, known_x's and new_x's must have the same number of columns. If known_y's is in a single row, known_x's and new_x's must have the same number of rows.\n - If new_x's is omitted, it is assumed to be the same as known_x's.\n - If both known_x's and new_x's are omitted, they are assumed to be the array {1,2,3,...} that is the same size as known_y's.\n * @param {*} use_const Optional. A logical value specifying whether to force the constant b to equal 1. If const is TRUE or omitted, b is calculated normally. If const is FALSE, b is set equal to 1 and the m-values are adjusted so that y = m^x.\n - If const is TRUE or omitted, b is calculated normally.\n - If const is FALSE, b is set equal to 1 and the m-values are adjusted so that y = m^x.\n * @returns\n */\nfunction GROWTH(known_y, known_x, new_x, use_const) {\n // Credits: Ilmari Karonen (http://stackoverflow.com/questions/14161990/how-to-implement-growth-function-in-javascript)\n known_y = parseNumberArray(known_y);\n\n if (known_y instanceof Error) {\n return known_y\n }\n\n // Default values for optional parameters:\n let i;\n\n if (known_x === undefined) {\n known_x = [];\n\n for (i = 1; i <= known_y.length; i++) {\n known_x.push(i);\n }\n }\n\n if (new_x === undefined) {\n new_x = [];\n\n for (i = 1; i <= known_y.length; i++) {\n new_x.push(i);\n }\n }\n\n known_x = parseNumberArray(known_x);\n new_x = parseNumberArray(new_x);\n\n if (anyIsError(known_x, new_x)) {\n return value\n }\n\n if (use_const === undefined) {\n use_const = true;\n }\n\n // Calculate sums over the data:\n const n = known_y.length;\n let avg_x = 0;\n let avg_y = 0;\n let avg_xy = 0;\n let avg_xx = 0;\n\n for (i = 0; i < n; i++) {\n const x = known_x[i];\n const y = Math.log(known_y[i]);\n avg_x += x;\n avg_y += y;\n avg_xy += x * y;\n avg_xx += x * x;\n }\n\n avg_x /= n;\n avg_y /= n;\n avg_xy /= n;\n avg_xx /= n;\n\n // Compute linear regression coefficients:\n let beta;\n let alpha;\n\n if (use_const) {\n beta = (avg_xy - avg_x * avg_y) / (avg_xx - avg_x * avg_x);\n alpha = avg_y - beta * avg_x;\n } else {\n beta = avg_xy / avg_xx;\n alpha = 0;\n }\n\n // Compute and return result array:\n const new_y = [];\n\n for (i = 0; i < new_x.length; i++) {\n new_y.push(Math.exp(alpha + beta * new_x[i]));\n }\n\n return new_y\n}\n\n/**\n * Returns the harmonic mean.\n *\n * Category: Statistical\n *\n * @param {*} args number1, number2, ... Number1 is required, subsequent numbers are optional. 1 to 255 arguments for which you want to calculate the mean. You can also use a single array or a reference to an array instead of arguments separated by commas.\n * @returns\n */\nfunction HARMEAN() {\n const range = parseNumberArray(flatten(arguments));\n\n if (range instanceof Error) {\n return range\n }\n\n const n = range.length;\n let den = 0;\n\n for (let i = 0; i < n; i++) {\n den += 1 / range[i];\n }\n\n return n / den\n}\n\nconst HYPGEOM = {};\n\n/**\n * Returns the hypergeometric distribution.\n *\n * Category: Statistical\n *\n * @param {*} sample_s The number of successes in the sample.\n * @param {*} number_sample The size of the sample.\n * @param {*} population_s The number of successes in the population.\n * @param {*} number_pop The population size.\n * @param {*} cumulative A logical value that determines the form of the function. If cumulative is TRUE, then HYPGEOM.DIST returns the cumulative distribution function; if FALSE, it returns the probability mass function.\n * @returns\n */\nHYPGEOM.DIST = (sample_s, number_sample, population_s, number_pop, cumulative) => {\n sample_s = parseNumber(sample_s);\n number_sample = parseNumber(number_sample);\n population_s = parseNumber(population_s);\n number_pop = parseNumber(number_pop);\n\n if (anyIsError(sample_s, number_sample, population_s, number_pop)) {\n return value\n }\n\n function pdf(x, n, M, N) {\n return (COMBIN(M, x) * COMBIN(N - M, n - x)) / COMBIN(N, n)\n }\n\n function cdf(x, n, M, N) {\n let result = 0;\n\n for (let i = 0; i <= x; i++) {\n result += pdf(i, n, M, N);\n }\n\n return result\n }\n\n return cumulative\n ? cdf(sample_s, number_sample, population_s, number_pop)\n : pdf(sample_s, number_sample, population_s, number_pop)\n};\n\n/**\n * Returns the intercept of the linear regression line.\n *\n * Category: Statistical\n *\n * @param {*} known_y The dependent set of observations or data.\n * @param {*} known_x The independent set of observations or data.\n * @returns\n */\nfunction INTERCEPT(known_y, known_x) {\n known_y = parseNumberArray(known_y);\n known_x = parseNumberArray(known_x);\n\n if (anyIsError(known_y, known_x)) {\n return value\n }\n\n if (known_y.length !== known_x.length) {\n return na\n }\n\n return FORECAST(0, known_y, known_x)\n}\n\n/**\n * Returns the kurtosis of a data set.\n *\n * Category: Statistical\n *\n * @param {*} args number1, number2, ... Number1 is required, subsequent numbers are optional. 1 to 255 arguments for which you want to calculate kurtosis. You can also use a single array or a reference to an array instead of arguments separated by commas.\n * @returns\n */\nfunction KURT() {\n const range = parseNumberArray(flatten(arguments));\n\n if (range instanceof Error) {\n return range\n }\n\n const mean = jStat.mean(range);\n const n = range.length;\n let sigma = 0;\n\n for (let i = 0; i < n; i++) {\n sigma += Math.pow(range[i] - mean, 4);\n }\n\n sigma = sigma / Math.pow(jStat.stdev(range, true), 4);\n\n return ((n * (n + 1)) / ((n - 1) * (n - 2) * (n - 3))) * sigma - (3 * (n - 1) * (n - 1)) / ((n - 2) * (n - 3))\n}\n\n/**\n * Returns the k-th largest value in a data set.\n *\n * Category: Statistical\n *\n * @param {*} array The array or range of data for which you want to determine the k-th largest value.\n * @param {*} k The position (from the largest) in the array or value range of data to return.\n * @returns\n */\nfunction LARGE(array, k) {\n array = parseNumberArray(flatten(array));\n k = parseNumber(k);\n\n if (anyIsError(array, k)) {\n return array\n }\n\n if (k < 0 || array.length < k) {\n return value\n }\n\n return array.sort((a, b) => b - a)[k - 1]\n}\n\n/**\n * Returns the parameters of a linear trend.\n *\n * Category: Statistical\n *\n * @param {*} known_y The set of y-values that you already know in the relationship y = mx + b.\n - If the range of known_y's is in a single column, each column of known_x's is interpreted as a separate variable.\n - If the range of known_y's is contained in a single row, each row of known_x's is interpreted as a separate variable.\n * @param {*} known_x Optional. A set of x-values that you may already know in the relationship y = mx + b.\n - The range of known_x's can include one or more sets of variables. If only one variable is used, known_y's and known_x's can be ranges of any shape, as long as they have equal dimensions. If more than one variable is used, known_y's must be a vector (that is, a range with a height of one row or a width of one column).\n - If known_x's is omitted, it is assumed to be the array {1,2,3,...} that is the same size as known_y's.\n * @returns\n */\nfunction LINEST(known_y, known_x) {\n known_y = parseNumberArray(flatten(known_y));\n known_x = parseNumberArray(flatten(known_x));\n\n if (anyIsError(known_y, known_x)) {\n return value\n }\n\n const ymean = jStat.mean(known_y);\n const xmean = jStat.mean(known_x);\n const n = known_x.length;\n let num = 0;\n let den = 0;\n\n for (let i = 0; i < n; i++) {\n num += (known_x[i] - xmean) * (known_y[i] - ymean);\n den += Math.pow(known_x[i] - xmean, 2);\n }\n\n const m = num / den;\n const b = ymean - m * xmean;\n\n return [m, b]\n}\n\n// According to Microsoft:\n// http://office.microsoft.com/en-us/starter-help/logest-function-HP010342665.aspx\n// LOGEST returns are based on the following linear model:\n// ln y = x1 ln m1 + ... + xn ln mn + ln b\n/**\n * Returns the parameters of an exponential trend.\n *\n * Category: Statistical\n *\n * @param {*} known_y The set of y-values you already know in the relationship y = b*m^x.\n - If the array known_y's is in a single column, then each column of known_x's is interpreted as a separate variable.\n - If the array known_y's is in a single row, then each row of known_x's is interpreted as a separate variable.\n * @param {*} known_x Optional. An optional set of x-values that you may already know in the relationship y = b*m^x.\n - The array known_x's can include one or more sets of variables. If only one variable is used, known_y's and known_x's can be ranges of any shape, as long as they have equal dimensions. If more than one variable is used, known_y's must be a range of values with a height of one row or a width of one column (which is also known as a vector).\n - If known_x's is omitted, it is assumed to be the array {1,2,3,...} that is the same size as known_y's.\n * @returns\n */\nfunction LOGEST(known_y, known_x) {\n known_y = parseNumberArray(flatten(known_y));\n known_x = parseNumberArray(flatten(known_x));\n\n if (anyIsError(known_y, known_x)) {\n return value\n }\n\n if (known_y.length !== known_x.length) {\n return value\n }\n\n for (let i = 0; i < known_y.length; i++) {\n known_y[i] = Math.log(known_y[i]);\n }\n\n const result = LINEST(known_y, known_x);\n result[0] = Math.round(Math.exp(result[0]) * 1000000) / 1000000;\n result[1] = Math.round(Math.exp(result[1]) * 1000000) / 1000000;\n\n return result\n}\n\nconst LOGNORM = {};\n\n/**\n * Returns the cumulative lognormal distribution.\n *\n * Category: Statistical\n *\n * @param {*} x The value at which to evaluate the function.\n * @param {*} mean The mean of ln(x).\n * @param {*} standard_dev The standard deviation of ln(x).\n * @param {*} cumulative A logical value that determines the form of the function. If cumulative is TRUE, LOGNORM.DIST returns the cumulative distribution function; if FALSE, it returns the probability density function.\n * @returns\n */\nLOGNORM.DIST = (x, mean, standard_dev, cumulative) => {\n x = parseNumber(x);\n mean = parseNumber(mean);\n standard_dev = parseNumber(standard_dev);\n\n if (anyIsError(x, mean, standard_dev)) {\n return value\n }\n\n return cumulative ? jStat.lognormal.cdf(x, mean, standard_dev) : jStat.lognormal.pdf(x, mean, standard_dev)\n};\n\n/**\n * Returns the inverse of the lognormal cumulative distribution.\n *\n * Category: Statistical\n *\n * @param {*} probability A probability associated with the lognormal distribution.\n * @param {*} mean The mean of ln(x).\n * @param {*} standard_dev The standard deviation of ln(x).\n * @returns\n */\nLOGNORM.INV = (probability, mean, standard_dev) => {\n probability = parseNumber(probability);\n mean = parseNumber(mean);\n standard_dev = parseNumber(standard_dev);\n\n if (anyIsError(probability, mean, standard_dev)) {\n return value\n }\n\n return jStat.lognormal.inv(probability, mean, standard_dev)\n};\n\n/**\n * Returns the maximum value in a list of arguments.\n *\n * Category: Statistical\n *\n * @param {*} args number1, number2, ... Number1 is required, subsequent numbers are optional. 1 to 255 numbers for which you want to find the maximum value.\n * @returns\n */\nfunction MAX() {\n const flatArguments = flatten(arguments);\n const someError = anyError.apply(undefined, flatArguments);\n\n if (someError) {\n return someError\n }\n\n const range = numbers(flatArguments);\n\n return range.length === 0 ? 0 : Math.max.apply(Math, range)\n}\n\n/**\n * Returns the maximum value in a list of arguments, including numbers, text, and logical values.\n *\n * Category: Statistical\n *\n * @param {*} args value1, value2,... Number arguments 2 to 255 for which you want to find the largest value.\n * @returns\n */\nfunction MAXA() {\n const flatArguments = flatten(arguments);\n const someError = anyError.apply(undefined, flatArguments);\n\n if (someError) {\n return someError\n }\n\n let range = arrayValuesToNumbers(flatArguments);\n range = range.map((value) => (value === undefined || value === null ? 0 : value));\n\n return range.length === 0 ? 0 : Math.max.apply(Math, range)\n}\n\n/**\n * Returns the median of the given numbers.\n *\n * Category: Statistical\n *\n * @param {*} args number1, number2, ... Number1 is required, subsequent numbers are optional. 1 to 255 numbers for which you want the median.\n * @returns\n */\nfunction MEDIAN() {\n const flatArguments = flatten(arguments);\n const someError = anyError.apply(undefined, flatArguments);\n\n if (someError) {\n return someError\n }\n\n const range = arrayValuesToNumbers(flatArguments);\n let result = jStat.median(range);\n\n if (isNaN(result)) {\n result = num;\n }\n\n return result\n}\n\n/**\n * Returns the minimum value in a list of arguments.\n *\n * Category: Statistical\n *\n * @param {*} args number1, number2, ... Number1 is optional, subsequent numbers are optional. 1 to 255 numbers for which you want to find the minimum value.\n * @returns\n */\nfunction MIN() {\n const flatArguments = flatten(arguments);\n const someError = anyError.apply(undefined, flatArguments);\n\n if (someError) {\n return someError\n }\n\n const range = numbers(flatArguments);\n\n return range.length === 0 ? 0 : Math.min.apply(Math, range)\n}\n\n/**\n * Returns the smallest value in a list of arguments, including numbers, text, and logical values.\n *\n * Category: Statistical\n *\n * @param {*} args value1, value2, ... Value1 is required, subsequent values are optional. 1 to 255 values for which you want to find the smallest value.\n * @returns\n */\nfunction MINA() {\n const flatArguments = flatten(arguments);\n const someError = anyError.apply(undefined, flatArguments);\n\n if (someError) {\n return someError\n }\n\n let range = arrayValuesToNumbers(flatArguments);\n range = range.map((value) => (value === undefined || value === null ? 0 : value));\n\n return range.length === 0 ? 0 : Math.min.apply(Math, range)\n}\n\nconst MODE = {};\n\n/**\n * Returns a vertical array of the most frequently occurring, or repetitive values in an array or range of data.\n *\n * Category: Statistical\n *\n * @param {*} args number1, number2, ... Number arguments 2 to 254 for which you want to calculate the mode. You can also use a single array or a reference to an array instead of arguments separated by commas.\n * @returns\n */\nMODE.MULT = function () {\n // Credits: Roönaän\n const range = parseNumberArray(flatten(arguments));\n\n if (range instanceof Error) {\n return range\n }\n\n const n = range.length;\n const count = {};\n let maxItems = [];\n let max = 0;\n let currentItem;\n\n for (let i = 0; i < n; i++) {\n currentItem = range[i];\n count[currentItem] = count[currentItem] ? count[currentItem] + 1 : 1;\n\n if (count[currentItem] > max) {\n max = count[currentItem];\n maxItems = [];\n }\n\n if (count[currentItem] === max) {\n maxItems[maxItems.length] = currentItem;\n }\n }\n\n return maxItems\n};\n\n/**\n * Returns the most common value in a data set.\n *\n * Category: Statistical\n *\n * @param {*} args number1, number2, ... Arguments 2 to 254 for which you want to calculate the mode. You can also use a single array or a reference to an array instead of arguments separated by commas.\n * @returns\n */\nMODE.SNGL = function () {\n const range = parseNumberArray(flatten(arguments));\n\n if (range instanceof Error) {\n return range\n }\n\n return MODE.MULT(range).sort((a, b) => a - b)[0]\n};\n\nconst NEGBINOM = {};\n\n/**\n * Returns the negative binomial distribution.\n *\n * Category: Statistical\n *\n * @param {*} number_f The number of failures.\n * @param {*} number_s The threshold number of successes.\n * @param {*} probability_s The probability of a success.\n * @param {*} cumulative A logical value that determines the form of the function. If cumulative is TRUE, NEGBINOM.DIST returns the cumulative distribution function; if FALSE, it returns the probability density function.\n * @returns\n */\nNEGBINOM.DIST = (number_f, number_s, probability_s, cumulative) => {\n number_f = parseNumber(number_f);\n number_s = parseNumber(number_s);\n probability_s = parseNumber(probability_s);\n\n if (anyIsError(number_f, number_s, probability_s)) {\n return value\n }\n\n return cumulative\n ? jStat.negbin.cdf(number_f, number_s, probability_s)\n : jStat.negbin.pdf(number_f, number_s, probability_s)\n};\n\nconst NORM = {};\n\n/**\n * Returns the normal cumulative distribution.\n *\n * Category: Statistical\n *\n * @param {*} x The value for which you want the distribution.\n * @param {*} mean The arithmetic mean of the distribution.\n * @param {*} standard_dev The standard deviation of the distribution.\n * @param {*} cumulative A logical value that determines the form of the function. If cumulative is TRUE, NORM.DIST returns the cumulative distribution function; if FALSE, it returns the probability density function.\n * @returns\n */\nNORM.DIST = (x, mean, standard_dev, cumulative) => {\n x = parseNumber(x);\n mean = parseNumber(mean);\n standard_dev = parseNumber(standard_dev);\n\n if (anyIsError(x, mean, standard_dev)) {\n return value\n }\n\n if (standard_dev <= 0) {\n return num\n }\n\n // Return normal distribution computed by jStat [http://jstat.org]\n return cumulative ? jStat.normal.cdf(x, mean, standard_dev) : jStat.normal.pdf(x, mean, standard_dev)\n};\n\n/**\n * Returns the inverse of the normal cumulative distribution.\n *\n * Category: Statistical\n *\n * @param {*} probability A probability corresponding to the normal distribution.\n * @param {*} mean The arithmetic mean of the distribution.\n * @param {*} standard_dev The standard deviation of the distribution.\n * @returns\n */\nNORM.INV = (probability, mean, standard_dev) => {\n probability = parseNumber(probability);\n mean = parseNumber(mean);\n standard_dev = parseNumber(standard_dev);\n\n if (anyIsError(probability, mean, standard_dev)) {\n return value\n }\n\n return jStat.normal.inv(probability, mean, standard_dev)\n};\n\nNORM.S = {};\n\n/**\n * Returns the standard normal cumulative distribution.\n *\n * Category: Statistical\n *\n * @param {*} z The value for which you want the distribution.\n * @param {*} cumulative Cumulative is a logical value that determines the form of the function. If cumulative is TRUE, NORMS.DIST returns the cumulative distribution function; if FALSE, it returns the probability mass function.\n * @returns\n */\nNORM.S.DIST = (z, cumulative) => {\n z = parseNumber(z);\n\n if (z instanceof Error) {\n return value\n }\n\n return cumulative ? jStat.normal.cdf(z, 0, 1) : jStat.normal.pdf(z, 0, 1)\n};\n\n/**\n * Returns the inverse of the standard normal cumulative distribution.\n *\n * Category: Statistical\n *\n * @param {*} probability A probability corresponding to the normal distribution.\n * @returns\n */\nNORM.S.INV = (probability) => {\n probability = parseNumber(probability);\n\n if (probability instanceof Error) {\n return value\n }\n\n return jStat.normal.inv(probability, 0, 1)\n};\n\n/**\n * Returns the Pearson product moment correlation coefficient.\n *\n * Category: Statistical\n *\n * @param {*} array1 A set of independent values.\n * @param {*} array2 A set of dependent values.\n * @returns\n */\nfunction PEARSON(array1, array2) {\n array2 = parseNumberArray(flatten(array2));\n array1 = parseNumberArray(flatten(array1));\n\n if (anyIsError(array2, array1)) {\n return value\n }\n\n const xmean = jStat.mean(array1);\n const ymean = jStat.mean(array2);\n const n = array1.length;\n let num = 0;\n let den1 = 0;\n let den2 = 0;\n\n for (let i = 0; i < n; i++) {\n num += (array1[i] - xmean) * (array2[i] - ymean);\n den1 += Math.pow(array1[i] - xmean, 2);\n den2 += Math.pow(array2[i] - ymean, 2);\n }\n\n return num / Math.sqrt(den1 * den2)\n}\n\nconst PERCENTILE = {};\n\n/**\n * Returns the k-th percentile of values in a range, where k is in the range 0..1, exclusive.\n *\n * Category: Statistical\n *\n * @returns\n */\nPERCENTILE.EXC = (array, k) => {\n array = parseNumberArray(flatten(array));\n k = parseNumber(k);\n\n if (anyIsError(array, k)) {\n return value\n }\n\n array = array.sort((a, b) => a - b);\n const n = array.length;\n\n if (k < 1 / (n + 1) || k > 1 - 1 / (n + 1)) {\n return num\n }\n\n const l = k * (n + 1) - 1;\n const fl = Math.floor(l);\n\n return cleanFloat(l === fl ? array[l] : array[fl] + (l - fl) * (array[fl + 1] - array[fl]))\n};\n\n/**\n * Returns the k-th percentile of values in a range.\n *\n * Category: Statistical\n *\n * @param {*} array The array or range of data that defines relative standing.\n * @param {*} k The percentile value in the range 0..1, inclusive.\n * @returns\n */\nPERCENTILE.INC = (array, k) => {\n array = parseNumberArray(flatten(array));\n k = parseNumber(k);\n\n if (anyIsError(array, k)) {\n return value\n }\n\n array = array.sort((a, b) => a - b);\n const n = array.length;\n const l = k * (n - 1);\n const fl = Math.floor(l);\n\n return cleanFloat(l === fl ? array[l] : array[fl] + (l - fl) * (array[fl + 1] - array[fl]))\n};\n\nconst PERCENTRANK = {};\n\n/**\n * Returns the rank of a value in a data set as a percentage (0..1, exclusive) of the data set.\n *\n * Category: Statistical\n *\n * @param {*} array The array or range of data with numeric values that defines relative standing\n * @param {*} x The value for which you want to know the rank.\n * @param {*} significance Optional. A value that identifies the number of significant digits for the returned percentage value. If omitted, PERCENTRANK.EXC uses three digits (0.xxx).\n * @returns\n */\nPERCENTRANK.EXC = (array, x, significance) => {\n significance = significance === undefined ? 3 : significance;\n array = parseNumberArray(flatten(array));\n x = parseNumber(x);\n significance = parseNumber(significance);\n\n if (anyIsError(array, x, significance)) {\n return value\n }\n\n array = array.sort((a, b) => a - b);\n const uniques = UNIQUE.apply(null, array);\n const n = array.length;\n const m = uniques.length;\n const power = Math.pow(10, significance);\n let result = 0;\n let match = false;\n let i = 0;\n\n while (!match && i < m) {\n if (x === uniques[i]) {\n result = (array.indexOf(uniques[i]) + 1) / (n + 1);\n match = true;\n } else if (x >= uniques[i] && (x < uniques[i + 1] || i === m - 1)) {\n result = (array.indexOf(uniques[i]) + 1 + (x - uniques[i]) / (uniques[i + 1] - uniques[i])) / (n + 1);\n match = true;\n }\n\n i++;\n }\n\n return Math.floor(result * power) / power\n};\n\n/**\n * Returns the percentage rank of a value in a data set.\n *\n * Category: Statistical\n *\n * @param {*} array The array or range of data with numeric values that defines relative standing.\n * @param {*} x The value for which you want to know the rank.\n * @param {*} significance Optional. A value that identifies the number of significant digits for the returned percentage value. If omitted, PERCENTRANK.INC uses three digits (0.xxx).\n * @returns\n */\nPERCENTRANK.INC = (array, x, significance) => {\n significance = significance === undefined ? 3 : significance;\n array = parseNumberArray(flatten(array));\n x = parseNumber(x);\n significance = parseNumber(significance);\n\n if (anyIsError(array, x, significance)) {\n return value\n }\n\n array = array.sort((a, b) => a - b);\n const uniques = UNIQUE.apply(null, array);\n const n = array.length;\n const m = uniques.length;\n const power = Math.pow(10, significance);\n let result = 0;\n let match = false;\n let i = 0;\n\n while (!match && i < m) {\n if (x === uniques[i]) {\n result = array.indexOf(uniques[i]) / (n - 1);\n match = true;\n } else if (x >= uniques[i] && (x < uniques[i + 1] || i === m - 1)) {\n result = (array.indexOf(uniques[i]) + (x - uniques[i]) / (uniques[i + 1] - uniques[i])) / (n - 1);\n match = true;\n }\n\n i++;\n }\n\n return Math.floor(result * power) / power\n};\n\n/**\n * Returns the number of permutations for a given number of objects.\n *\n * Category: Statistical\n *\n * @param {*} number An integer that describes the number of objects.\n * @param {*} number_chosen An integer that describes the number of objects in each permutation.\n * @returns\n */\nfunction PERMUT(number, number_chosen) {\n number = parseNumber(number);\n number_chosen = parseNumber(number_chosen);\n\n if (anyIsError(number, number_chosen)) {\n return value\n }\n\n return FACT(number) / FACT(number - number_chosen)\n}\n\n/**\n * Returns the number of permutations for a given number of objects (with repetitions) that can be selected from the total objects.\n *\n * Category: Statistical\n *\n * @param {*} number An integer that describes the total number of objects.\n * @param {*} number_chosen An integer that describes the number of objects in each permutation.\n * @returns\n */\nfunction PERMUTATIONA(number, number_chosen) {\n number = parseNumber(number);\n number_chosen = parseNumber(number_chosen);\n\n if (anyIsError(number, number_chosen)) {\n return value\n }\n\n return Math.pow(number, number_chosen)\n}\n\n/**\n * Returns the value of the density function for a standard normal distribution.\n *\n * Category: Statistical\n *\n * @param {*} x X is the number for which you want the density of the standard normal distribution.\n * @returns\n */\nfunction PHI(x) {\n x = parseNumber(x);\n\n if (x instanceof Error) {\n return value\n }\n\n return Math.exp(-0.5 * x * x) / SQRT2PI\n}\n\nconst POISSON = {};\n\n/**\n * Returns the Poisson distribution.\n *\n * Category: Statistical\n *\n * @param {*} x The number of events.\n * @param {*} mean The expected numeric value.\n * @param {*} cumulative A logical value that determines the form of the probability distribution returned. If cumulative is TRUE, POISSON.DIST returns the cumulative Poisson probability that the number of random events occurring will be between zero and x inclusive; if FALSE, it returns the Poisson probability mass function that the number of events occurring will be exactly x.\n * @returns\n */\nPOISSON.DIST = (x, mean, cumulative) => {\n x = parseNumber(x);\n mean = parseNumber(mean);\n\n if (anyIsError(x, mean)) {\n return value\n }\n\n return cumulative ? jStat.poisson.cdf(x, mean) : jStat.poisson.pdf(x, mean)\n};\n\n/**\n * Returns the probability that values in a range are between two limits.\n *\n * Category: Statistical\n *\n * @param {*} x_range The range of numeric values of x with which there are associated probabilities.\n * @param {*} prob_range A set of probabilities associated with values in x_range.\n * @param {*} lower_limit Optional. The lower bound on the value for which you want a probability.\n * @param {*} upper_limit Optional. The optional upper bound on the value for which you want a probability.\n * @returns\n */\nfunction PROB(x_range, prob_range, lower_limit, upper_limit) {\n if (lower_limit === undefined) {\n return 0\n }\n\n upper_limit = upper_limit === undefined ? lower_limit : upper_limit;\n\n x_range = parseNumberArray(flatten(x_range));\n prob_range = parseNumberArray(flatten(prob_range));\n lower_limit = parseNumber(lower_limit);\n upper_limit = parseNumber(upper_limit);\n\n if (anyIsError(x_range, prob_range, lower_limit, upper_limit)) {\n return value\n }\n\n if (lower_limit === upper_limit) {\n return x_range.indexOf(lower_limit) >= 0 ? prob_range[x_range.indexOf(lower_limit)] : 0\n }\n\n const sorted = x_range.sort((a, b) => a - b);\n const n = sorted.length;\n let result = 0;\n\n for (let i = 0; i < n; i++) {\n if (sorted[i] >= lower_limit && sorted[i] <= upper_limit) {\n result += prob_range[x_range.indexOf(sorted[i])];\n }\n }\n\n return result\n}\n\nconst QUARTILE = {};\n\n/**\n * Returns the quartile of the data set, based on percentile values from 0..1, exclusive.\n *\n * Category: Statistical\n *\n * @param {*} array The array or value range of numeric values for which you want the quartile value.\n * @param {*} quart Indicates which value to return.\n * @returns\n */\nQUARTILE.EXC = (range, quart) => {\n range = parseNumberArray(flatten(range));\n quart = parseNumber(quart);\n\n if (anyIsError(range, quart)) {\n return value\n }\n\n switch (quart) {\n case 1:\n return PERCENTILE.EXC(range, 0.25)\n case 2:\n return PERCENTILE.EXC(range, 0.5)\n case 3:\n return PERCENTILE.EXC(range, 0.75)\n default:\n return num\n }\n};\n\n/**\n * Returns the quartile of a data set.\n *\n * Category: Statistical\n *\n * @param {*} array The array or value range of numeric values for which you want the quartile value.\n * @param {*} quart Indicates which value to return.\n * @returns\n */\nQUARTILE.INC = (range, quart) => {\n range = parseNumberArray(flatten(range));\n quart = parseNumber(quart);\n\n if (anyIsError(range, quart)) {\n return value\n }\n\n switch (quart) {\n case 1:\n return PERCENTILE.INC(range, 0.25)\n case 2:\n return PERCENTILE.INC(range, 0.5)\n case 3:\n return PERCENTILE.INC(range, 0.75)\n default:\n return num\n }\n};\n\nconst RANK = {};\n\n/**\n * Returns the rank of a number in a list of numbers.\n *\n * Category: Statistical\n *\n * @param {*} number The number whose rank you want to find.\n * @param {*} ref An array of, or a reference to, a list of numbers. Nonnumeric values in Ref are ignored.\n * @param {*} order Optional. A number specifying how to rank number.\n * @returns\n */\nRANK.AVG = (number, ref, order) => {\n number = parseNumber(number);\n ref = parseNumberArray(flatten(ref));\n\n if (anyIsError(number, ref)) {\n return value\n }\n\n ref = flatten(ref);\n order = order || false;\n const sort = order ? (a, b) => a - b : (a, b) => b - a;\n ref = ref.sort(sort);\n\n const length = ref.length;\n let count = 0;\n\n for (let i = 0; i < length; i++) {\n if (ref[i] === number) {\n count++;\n }\n }\n\n return count > 1 ? (2 * ref.indexOf(number) + count + 1) / 2 : ref.indexOf(number) + 1\n};\n\n/**\n * Returns the rank of a number in a list of numbers.\n *\n * Category: Statistical\n *\n * @param {*} number The number whose rank you want to find.\n * @param {*} ref An array of, or a reference to, a list of numbers. Non-numeric values in Ref are ignored.\n * @param {*} order Optional. A number specifying how to rank number.\n * @returns\n */\nRANK.EQ = (number, ref, order) => {\n number = parseNumber(number);\n ref = parseNumberArray(flatten(ref));\n\n if (anyIsError(number, ref)) {\n return value\n }\n\n order = order || false;\n const sort = order ? (a, b) => a - b : (a, b) => b - a;\n ref = ref.sort(sort);\n\n return ref.indexOf(number) + 1\n};\n\n/**\n * Returns the row number of a reference.\n *\n * Category: Lookup and reference\n *\n * @param {*} reference the value or range of values for which you want the row number.\n * @param {*} index\n * @returns\n */\nfunction ROW(reference, index) {\n if (arguments.length !== 2) {\n return na\n }\n\n if (index < 0) {\n return num\n }\n\n if (!(reference instanceof Array) || typeof index !== 'number') {\n return value\n }\n\n if (reference.length === 0) {\n return undefined\n }\n\n return jStat.row(reference, index)\n}\n\n/**\n * Returns the square of the Pearson product moment correlation coefficient.\n *\n * Category: Statistical\n *\n * @param {*} known_y An array or range of data points.\n * @param {*} known_x An array or range of data points.\n * @returns\n */\nfunction RSQ(known_y, known_x) {\n // no need to flatten here, PEARSON will take care of that\n known_y = parseNumberArray(flatten(known_y));\n known_x = parseNumberArray(flatten(known_x));\n\n if (anyIsError(known_y, known_x)) {\n return value\n }\n\n return Math.pow(PEARSON(known_y, known_x), 2)\n}\n\n/**\n * Returns the skewness of a distribution.\n *\n * Category: Statistical\n *\n * @param {*} args number1, number2, ... Number1 is required, subsequent numbers are optional. 1 to 255 arguments for which you want to calculate skewness. You can also use a single array or a reference to an array instead of arguments separated by commas.\n * @returns\n */\nfunction SKEW() {\n const range = parseNumberArray(flatten(arguments));\n\n if (range instanceof Error) {\n return range\n }\n\n const mean = jStat.mean(range);\n const n = range.length;\n let sigma = 0;\n\n for (let i = 0; i < n; i++) {\n sigma += Math.pow(range[i] - mean, 3);\n }\n\n return (n * sigma) / ((n - 1) * (n - 2) * Math.pow(jStat.stdev(range, true), 3))\n}\n\n/**\n * Returns the skewness of a distribution based on a population.\n *\n * Category: Statistical\n *\n * @returns\n */\nSKEW.P = function () {\n const range = parseNumberArray(flatten(arguments));\n\n if (range instanceof Error) {\n return range\n }\n\n const mean = jStat.mean(range);\n const n = range.length;\n let m2 = 0;\n let m3 = 0;\n\n for (let i = 0; i < n; i++) {\n m3 += Math.pow(range[i] - mean, 3);\n m2 += Math.pow(range[i] - mean, 2);\n }\n\n m3 = m3 / n;\n m2 = m2 / n;\n\n return m3 / Math.pow(m2, 3 / 2)\n};\n\n/**\n * Returns the slope of the linear regression line.\n *\n * Category: Statistical\n *\n * @param {*} known_y An array or value range of numeric dependent data points.\n * @param {*} known_x The set of independent data points.\n * @returns\n */\nfunction SLOPE(known_y, known_x) {\n known_y = parseNumberArray(flatten(known_y));\n known_x = parseNumberArray(flatten(known_x));\n\n if (anyIsError(known_y, known_x)) {\n return value\n }\n\n const xmean = jStat.mean(known_x);\n const ymean = jStat.mean(known_y);\n const n = known_x.length;\n let num = 0;\n let den = 0;\n\n for (let i = 0; i < n; i++) {\n num += (known_x[i] - xmean) * (known_y[i] - ymean);\n den += Math.pow(known_x[i] - xmean, 2);\n }\n\n return num / den\n}\n\n/**\n * Returns the k-th smallest value in a data set.\n *\n * Category: Statistical\n *\n * @param {*} array An array or range of numerical data for which you want to determine the k-th smallest value.\n * @param {*} k The position (from the smallest) in the array or range of data to return.\n * @returns\n */\nfunction SMALL(array, k) {\n array = parseNumberArray(flatten(array));\n k = parseNumber(k);\n\n if (anyIsError(array, k)) {\n return array\n }\n\n return array.sort((a, b) => a - b)[k - 1]\n}\n\n/**\n * Returns a normalized value.\n *\n * Category: Statistical\n *\n * @param {*} x The value you want to normalize.\n * @param {*} mean The arithmetic mean of the distribution.\n * @param {*} standard_dev The standard deviation of the distribution.\n * @returns\n */\nfunction STANDARDIZE(x, mean, standard_dev) {\n x = parseNumber(x);\n mean = parseNumber(mean);\n standard_dev = parseNumber(standard_dev);\n\n if (anyIsError(x, mean, standard_dev)) {\n return value\n }\n\n return (x - mean) / standard_dev\n}\n\nconst STDEV = {};\n\n/**\n * Calculates standard deviation based on the entire population.\n *\n * Category: Statistical\n *\n * @param {*} args number1, number2, ... Number arguments 2 to 254 corresponding to a population. You can also use a single array or a reference to an array instead of arguments separated by commas.\n * @returns\n */\nSTDEV.P = function () {\n const v = VAR.P.apply(this, arguments);\n let result = Math.sqrt(v);\n\n if (isNaN(result)) {\n result = num;\n }\n\n return result\n};\n\n/**\n * Estimates standard deviation based on a sample.\n *\n * Category: Statistical\n *\n * @param {*} args number1, number2, ... Number arguments 2 to 254 corresponding to a sample of a population. You can also use a single array or a reference to an array instead of arguments separated by commas.\n * @returns\n */\nSTDEV.S = function () {\n const v = VAR.S.apply(this, arguments);\n const result = Math.sqrt(v);\n\n return result\n};\n\n/**\n * Estimates standard deviation based on a sample, including numbers, text, and logical values.\n *\n * Category: Statistical\n *\n * @param {*} args value1, value2, ... Value1 is required, subsequent values are optional. 1 to 255 values corresponding to a sample of a population. You can also use a single array or a reference to an array instead of arguments separated by commas.\n * @returns\n */\nfunction STDEVA() {\n const v = VARA.apply(this, arguments);\n const result = Math.sqrt(v);\n\n return result\n}\n\n/**\n * Calculates standard deviation based on the entire population, including numbers, text, and logical values.\n *\n * Category: Statistical\n *\n * @param {*} args value1, value2, ... Value1 is required, subsequent values are optional. 1 to 255 values corresponding to a population. You can also use a single array or a reference to an array instead of arguments separated by commas.\n * @returns\n */\nfunction STDEVPA() {\n const v = VARPA.apply(this, arguments);\n let result = Math.sqrt(v);\n\n if (isNaN(result)) {\n result = num;\n }\n\n return result\n}\n\n/**\n * Returns the standard error of the predicted y-value for each x in the regression.\n *\n * Category: Statistical\n *\n * @param {*} known_y An array or range of dependent data points.\n * @param {*} known_x An array or range of independent data points.\n * @returns\n */\nfunction STEYX(known_y, known_x) {\n known_y = parseNumberArray(flatten(known_y));\n known_x = parseNumberArray(flatten(known_x));\n\n if (anyIsError(known_y, known_x)) {\n return value\n }\n\n const xmean = jStat.mean(known_x);\n const ymean = jStat.mean(known_y);\n const n = known_x.length;\n let lft = 0;\n let num = 0;\n let den = 0;\n\n for (let i = 0; i < n; i++) {\n lft += Math.pow(known_y[i] - ymean, 2);\n num += (known_x[i] - xmean) * (known_y[i] - ymean);\n den += Math.pow(known_x[i] - xmean, 2);\n }\n\n return Math.sqrt((lft - (num * num) / den) / (n - 2))\n}\n\nconst T$1 = {};\n\n/**\n * Returns the Percentage Points (probability) for the Student t-distribution.\n *\n * Category: Statistical\n *\n * @param {*} x The numeric value at which to evaluate the distribution\n * @param {*} deg_freedom An integer indicating the number of degrees of freedom.\n * @param {*} cumulative A logical value that determines the form of the function. If cumulative is TRUE, T.DIST returns the cumulative distribution function; if FALSE, it returns the probability density function.\n * @returns\n */\nT$1.DIST = (x, deg_freedom, cumulative) => {\n if (cumulative !== 1 && cumulative !== 2) {\n return num\n }\n\n return cumulative === 1 ? T$1.DIST.RT(x, deg_freedom) : T$1.DIST['2T'](x, deg_freedom)\n};\n\n/**\n * Returns the Percentage Points (probability) for the Student t-distribution\n *\n * Category: Statistical\n *\n * @param {*} x The numeric value at which to evaluate the distribution.\n * @param {*} deg_freedom An integer indicating the number of degrees of freedom.\n * @returns\n */\nT$1.DIST['2T'] = function (x, deg_freedom) {\n if (arguments.length !== 2) {\n return na\n }\n\n if (x < 0 || deg_freedom < 1) {\n return num\n }\n\n if (typeof x !== 'number' || typeof deg_freedom !== 'number') {\n return value\n }\n\n return (1 - jStat.studentt.cdf(x, deg_freedom)) * 2\n};\n\n/**\n * Returns the Student's t-distribution.\n *\n * Category: Statistical\n *\n * @param {*} x The numeric value at which to evaluate the distribution.\n * @param {*} deg_freedom An integer indicating the number of degrees of freedom.\n * @returns\n */\nT$1.DIST.RT = function (x, deg_freedom) {\n if (arguments.length !== 2) {\n return na\n }\n\n if (x < 0 || deg_freedom < 1) {\n return num\n }\n\n if (typeof x !== 'number' || typeof deg_freedom !== 'number') {\n return value\n }\n\n return 1 - jStat.studentt.cdf(x, deg_freedom)\n};\n\n/**\n * Returns the t-value of the Student's t-distribution as a function of the probability and the degrees of freedom.\n *\n * Category: Statistical\n *\n * @param {*} probability The probability associated with the Student's t-distribution.\n * @param {*} deg_freedom The number of degrees of freedom with which to characterize the distribution.\n * @returns\n */\nT$1.INV = (probability, deg_freedom) => {\n probability = parseNumber(probability);\n deg_freedom = parseNumber(deg_freedom);\n\n if (anyIsError(probability, deg_freedom)) {\n return value\n }\n\n return jStat.studentt.inv(probability, deg_freedom)\n};\n\n/**\n * Returns the inverse of the Student's t-distribution\n *\n * Category: Statistical\n *\n * @param {*} probability The probability associated with the Student's t-distribution.\n * @param {*} deg_freedom The number of degrees of freedom with which to characterize the distribution.\n * @returns\n */\nT$1.INV['2T'] = (probability, deg_freedom) => {\n probability = parseNumber(probability);\n deg_freedom = parseNumber(deg_freedom);\n\n if (probability <= 0 || probability > 1 || deg_freedom < 1) {\n return num\n }\n\n if (anyIsError(probability, deg_freedom)) {\n return value\n }\n\n return Math.abs(jStat.studentt.inv(probability / 2, deg_freedom))\n};\n\n// The algorithm can be found here:\n// http://www.chem.uoa.gr/applets/AppletTtest/Appl_Ttest2.html\n/**\n * Returns the probability associated with a Student's t-test.\n *\n * Category: Statistical\n *\n * @param {*} array1 The first data set.\n * @param {*} array2 The second data set.\n * @returns\n */\nT$1.TEST = (array1, array2) => {\n array1 = parseNumberArray(flatten(array1));\n array2 = parseNumberArray(flatten(array2));\n\n if (anyIsError(array1, array2)) {\n return value\n }\n\n const mean_x = jStat.mean(array1);\n const mean_y = jStat.mean(array2);\n let s_x = 0;\n let s_y = 0;\n let i;\n\n for (i = 0; i < array1.length; i++) {\n s_x += Math.pow(array1[i] - mean_x, 2);\n }\n\n for (i = 0; i < array2.length; i++) {\n s_y += Math.pow(array2[i] - mean_y, 2);\n }\n\n s_x = s_x / (array1.length - 1);\n s_y = s_y / (array2.length - 1);\n\n const t = Math.abs(mean_x - mean_y) / Math.sqrt(s_x / array1.length + s_y / array2.length);\n\n return T$1.DIST['2T'](t, array1.length + array2.length - 2)\n};\n\n/**\n * Returns values along a linear trend.\n *\n * Category: Statistical\n *\n * @param {*} known_ys The set of y-values you already know in the relationship y = mx + b\n * @param {*} known_xs An optional set of x-values that you may already know in the relationship y = mx + b\n * @param {*} new_xs Optional. New x-values for which you want TREND to return corresponding y-values.\n * @returns\n */\nfunction TREND(known_ys, known_xs, new_xs) {\n known_ys = parseNumberArray(flatten(known_ys));\n known_xs = parseNumberArray(flatten(known_xs));\n new_xs = parseNumberArray(flatten(new_xs));\n\n if (anyIsError(known_ys, known_xs, new_xs)) {\n return value\n }\n\n const linest = LINEST(known_ys, known_xs);\n const m = linest[0];\n const b = linest[1];\n const result = [];\n\n new_xs.forEach((x) => {\n result.push(m * x + b);\n });\n\n return result\n}\n\n/**\n * Returns the mean of the interior of a data set.\n *\n * Category: Statistical\n *\n * @param {*} array The array or range of values to trim and average.\n * @param {*} percent The fractional number of data points to exclude from the calculation. For example, if percent = 0.2, 4 points are trimmed from a data set of 20 points (20 x 0.2): 2 from the top and 2 from the bottom of the set.\n * @returns\n */\nfunction TRIMMEAN(range, percent) {\n range = parseNumberArray(flatten(range));\n percent = parseNumber(percent);\n\n if (anyIsError(range, percent)) {\n return value\n }\n\n const trim = FLOOR(range.length * percent, 2) / 2;\n\n return jStat.mean(\n initial(\n rest(\n range.sort((a, b) => a - b),\n trim\n ),\n trim\n )\n )\n}\n\nconst VAR = {};\n\n/**\n * Calculates variance based on the entire population.\n *\n * Category: Statistical\n *\n * @param {*} args number1, number2, ... Number arguments 2 to 254 corresponding to a population.\n * @returns\n */\nVAR.P = function () {\n const range = numbers(flatten(arguments));\n const n = range.length;\n let sigma = 0;\n const mean = AVERAGE(range);\n let result;\n\n for (let i = 0; i < n; i++) {\n sigma += Math.pow(range[i] - mean, 2);\n }\n\n result = sigma / n;\n\n if (isNaN(result)) {\n result = num;\n }\n\n return result\n};\n\n/**\n * Estimates variance based on a sample.\n *\n * Category: Statistical\n *\n * @param {*} args number1, number2, ... Number arguments 2 to 254 corresponding to a sample of a population.\n * @returns\n */\nVAR.S = function () {\n const range = numbers(flatten(arguments));\n const n = range.length;\n let sigma = 0;\n const mean = AVERAGE(range);\n\n for (let i = 0; i < n; i++) {\n sigma += Math.pow(range[i] - mean, 2);\n }\n\n return sigma / (n - 1)\n};\n\n/**\n * Estimates variance based on a sample, including numbers, text, and logical values.\n *\n * Category: Statistical\n *\n * @param {*} args value1, value2, ... Value1 is required, subsequent values are optional. 1 to 255 value arguments corresponding to a sample of a population.\n * @returns\n */\nfunction VARA() {\n const range = flatten(arguments);\n const n = range.length;\n let sigma = 0;\n let count = 0;\n const mean = AVERAGEA(range);\n\n for (let i = 0; i < n; i++) {\n const el = range[i];\n\n if (typeof el === 'number') {\n sigma += Math.pow(el - mean, 2);\n } else if (el === true) {\n sigma += Math.pow(1 - mean, 2);\n } else {\n sigma += Math.pow(0 - mean, 2);\n }\n\n if (el !== null) {\n count++;\n }\n }\n\n return sigma / (count - 1)\n}\n\n/**\n * Calculates variance based on the entire population, including numbers, text, and logical values.\n *\n * Category: Statistical\n *\n * @param {*} args value1, value2, ... Value1 is required, subsequent values are optional. 1 to 255 value arguments corresponding to a population.\n * @returns\n */\nfunction VARPA() {\n const range = flatten(arguments);\n const n = range.length;\n let sigma = 0;\n let count = 0;\n const mean = AVERAGEA(range);\n let result;\n\n for (let i = 0; i < n; i++) {\n const el = range[i];\n\n if (typeof el === 'number') {\n sigma += Math.pow(el - mean, 2);\n } else if (el === true) {\n sigma += Math.pow(1 - mean, 2);\n } else {\n sigma += Math.pow(0 - mean, 2);\n }\n\n if (el !== null) {\n count++;\n }\n }\n\n result = sigma / count;\n\n if (isNaN(result)) {\n result = num;\n }\n\n return result\n}\n\nconst WEIBULL = {};\n\n/**\n * Returns the Weibull distribution.\n *\n * Category: Statistical\n *\n * @param {*} x The value at which to evaluate the function.\n * @param {*} alpha A parameter to the distribution.\n * @param {*} beta A parameter to the distribution.\n * @param {*} cumulative Determines the form of the function.\n * @returns\n */\nWEIBULL.DIST = (x, alpha, beta, cumulative) => {\n x = parseNumber(x);\n alpha = parseNumber(alpha);\n beta = parseNumber(beta);\n\n if (anyIsError(x, alpha, beta)) {\n return value\n }\n\n return cumulative\n ? 1 - Math.exp(-Math.pow(x / beta, alpha))\n : (Math.pow(x, alpha - 1) * Math.exp(-Math.pow(x / beta, alpha)) * alpha) / Math.pow(beta, alpha)\n};\n\nconst Z = {};\n\n/**\n * Returns the one-tailed probability-value of a z-test.\n *\n * Category: Statistical\n *\n * @param {*} array The array or range of data against which to test x.\n * @param {*} x The value to test.\n * @param {*} sigma Optional. The population (known) standard deviation. If omitted, the sample standard deviation is used.\n * @returns\n */\nZ.TEST = (array, x, sigma) => {\n array = parseNumberArray(flatten(array));\n x = parseNumber(x);\n\n if (anyIsError(array, x)) {\n return value\n }\n\n sigma = sigma || STDEV.S(array);\n const n = array.length;\n\n return 1 - NORM.S.DIST((AVERAGE(array) - x) / (sigma / Math.sqrt(n)), true)\n};\n\n/**\n * Returns the absolute value of a number.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number The real number of which you want the absolute value.\n * @returns\n */\nfunction ABS(number) {\n number = parseNumber(number);\n\n if (number instanceof Error) {\n return number\n }\n\n const result = Math.abs(number);\n\n return result\n}\n\n/**\n * Returns the arccosine of a number.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number The cosine of the angle you want and must be from -1 to 1.\n * @returns\n */\nfunction ACOS(number) {\n number = parseNumber(number);\n\n if (number instanceof Error) {\n return number\n }\n\n let result = Math.acos(number);\n\n if (isNaN(result)) {\n result = num;\n }\n\n return result\n}\n\n/**\n * Returns the inverse hyperbolic cosine of a number.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number Any real number equal to or greater than 1.\n * @returns\n */\nfunction ACOSH(number) {\n number = parseNumber(number);\n\n if (number instanceof Error) {\n return number\n }\n\n let result = Math.log(number + Math.sqrt(number * number - 1));\n\n if (isNaN(result)) {\n result = num;\n }\n\n return result\n}\n\n/**\n * Returns the arccotangent of a number.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number Number is the cotangent of the angle you want. This must be a real number.\n * @returns\n */\nfunction ACOT(number) {\n number = parseNumber(number);\n\n if (number instanceof Error) {\n return number\n }\n\n const result = Math.atan(1 / number);\n\n return result\n}\n\n/**\n * Returns the hyperbolic arccotangent of a number.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number The absolute value of Number must be greater than 1.\n * @returns\n */\nfunction ACOTH(number) {\n number = parseNumber(number);\n\n if (number instanceof Error) {\n return number\n }\n\n let result = 0.5 * Math.log((number + 1) / (number - 1));\n\n if (isNaN(result)) {\n result = num;\n }\n\n return result\n}\n\n// TODO: use options\n/**\n * Returns an aggregate in a list or database.\n *\n * Category: Math and trigonometry\n *\n * @param {*} function_num A number 1 to 19 that specifies which function to use.\n * @param {*} options A numerical value that determines which values to ignore in the evaluation range for the function. Note: The function will not ignore hidden rows, nested subtotals or nested aggregates if the array argument includes a calculation, for example: =AGGREGATE(14,3,A1:A100*(A1:A100>0),1)\n * @param {*} ref1 The first numeric argument for functions that take multiple numeric arguments for which you want the aggregate value.\n * @param {*} ref2 Optional. Numeric arguments 2 to 253 for which you want the aggregate value. For functions that take an array, ref1 is an array, an array formula, or a reference to a range of values for which you want the aggregate value. Ref2 is a second argument that is required for certain functions.\n * @returns\n */\nfunction AGGREGATE(function_num, options, ref1, ref2) {\n function_num = parseNumber(function_num);\n options = parseNumber(function_num);\n\n if (anyIsError(function_num, options)) {\n return value\n }\n\n switch (function_num) {\n case 1:\n return AVERAGE(ref1)\n case 2:\n return COUNT(ref1)\n case 3:\n return COUNTA(ref1)\n case 4:\n return MAX(ref1)\n case 5:\n return MIN(ref1)\n case 6:\n return PRODUCT(ref1)\n case 7:\n return STDEV.S(ref1)\n case 8:\n return STDEV.P(ref1)\n case 9:\n return SUM(ref1)\n case 10:\n return VAR.S(ref1)\n case 11:\n return VAR.P(ref1)\n case 12:\n return MEDIAN(ref1)\n case 13:\n return MODE.SNGL(ref1)\n case 14:\n return LARGE(ref1, ref2)\n case 15:\n return SMALL(ref1, ref2)\n case 16:\n return PERCENTILE.INC(ref1, ref2)\n case 17:\n return QUARTILE.INC(ref1, ref2)\n case 18:\n return PERCENTILE.EXC(ref1, ref2)\n case 19:\n return QUARTILE.EXC(ref1, ref2)\n }\n}\n\n/**\n * Converts a Roman number to Arabic, as a number.\n *\n * Category: Math and trigonometry\n *\n * @param {*} text A string enclosed in quotation marks, an empty string (\"\"), or a reference to a value containing text.\n * @returns\n */\nfunction ARABIC(text) {\n if (text === undefined || text === null) {\n return 0\n }\n\n if (text instanceof Error) {\n return text\n }\n\n // Credits: Rafa? Kukawski\n if (!/^M*(?:D?C{0,3}|C[MD])(?:L?X{0,3}|X[CL])(?:V?I{0,3}|I[XV])$/.test(text)) {\n return value\n }\n\n let r = 0;\n text.replace(/[MDLV]|C[MD]?|X[CL]?|I[XV]?/g, (i) => {\n r += {\n M: 1000,\n CM: 900,\n D: 500,\n CD: 400,\n C: 100,\n XC: 90,\n L: 50,\n XL: 40,\n X: 10,\n IX: 9,\n V: 5,\n IV: 4,\n I: 1\n }[i];\n });\n\n return r\n}\n\n/**\n * Returns the arcsine of a number.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number The sine of the angle you want and must be from -1 to 1.\n * @returns\n */\nfunction ASIN(number) {\n number = parseNumber(number);\n\n if (number instanceof Error) {\n return number\n }\n\n let result = Math.asin(number);\n\n if (isNaN(result)) {\n result = num;\n }\n\n return result\n}\n\n/**\n * Returns the inverse hyperbolic sine of a number.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number Any real number.\n * @returns\n */\nfunction ASINH(number) {\n number = parseNumber(number);\n\n if (number instanceof Error) {\n return number\n }\n\n return Math.log(number + Math.sqrt(number * number + 1))\n}\n\n/**\n * Returns the arctangent of a number.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number The tangent of the angle you want.\n * @returns\n */\nfunction ATAN(number) {\n number = parseNumber(number);\n\n if (number instanceof Error) {\n return number\n }\n\n return Math.atan(number)\n}\n\n/**\n * Returns the arctangent from x- and y-coordinates.\n *\n * Category: Math and trigonometry\n *\n * @param {*} x_num The x-coordinate of the point.\n * @param {*} y_num The y-coordinate of the point.\n * @returns\n */\nfunction ATAN2(x_num, y_num) {\n x_num = parseNumber(x_num);\n y_num = parseNumber(y_num);\n const anyError$1 = anyError(x_num, y_num);\n\n if (anyError$1) {\n return anyError$1\n }\n\n return Math.atan2(x_num, y_num)\n}\n\n/**\n * Returns the inverse hyperbolic tangent of a number.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number Any real number between 1 and -1.\n * @returns\n */\nfunction ATANH(number) {\n number = parseNumber(number);\n\n if (number instanceof Error) {\n return number\n }\n\n let result = Math.log((1 + number) / (1 - number)) / 2;\n\n if (isNaN(result)) {\n result = num;\n }\n\n return result\n}\n\n/**\n * Converts a number into a text representation with the given radix (base).\n *\n * Category: Math and trigonometry\n *\n * @param {*} number The number that you want to convert. Must be an integer greater than or equal to 0 and less than 2^53.\n * @param {*} radix The base radix that you want to convert the number into. Must be an integer greater than or equal to 2 and less than or equal to 36.\n * @param {*} min_length Optional. The minimum length of the returned string. Must be an integer greater than or equal to 0.\n * @returns\n */\nfunction BASE(number, radix, min_length) {\n number = parseNumber(number);\n radix = parseNumber(radix);\n min_length = parseNumber(min_length);\n const anyError$1 = anyError(number, radix, min_length);\n\n if (anyError$1) {\n return anyError$1\n }\n\n if (radix === 0) {\n return num\n }\n\n const result = number.toString(radix);\n\n return new Array(Math.max(min_length + 1 - result.length, 0)).join('0') + result\n}\n\n/**\n * Rounds a number to the nearest integer or to the nearest multiple of significance.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number The value you want to round.\n * @param {*} significance The multiple to which you want to round.\n * @param {*} mode Optional. For negative numbers, controls whether Number is rounded toward or away from zero.\n * @returns\n */\nfunction CEILING(number, significance, mode) {\n number = parseNumber(number);\n significance = parseNumber(significance);\n mode = parseNumber(mode);\n const anyError$1 = anyError(number, significance, mode);\n\n if (anyError$1) {\n return anyError$1\n }\n\n if (significance === 0) {\n return 0\n }\n\n significance = Math.abs(significance);\n const precision = -Math.floor(Math.log(significance) / Math.log(10));\n\n if (number >= 0) {\n return ROUND(Math.ceil(number / significance) * significance, precision)\n } else {\n if (mode === 0) {\n return -ROUND(Math.floor(Math.abs(number) / significance) * significance, precision)\n } else {\n return -ROUND(Math.ceil(Math.abs(number) / significance) * significance, precision)\n }\n }\n}\n\nCEILING.MATH = CEILING;\n\nCEILING.PRECISE = CEILING;\n\n/**\n * Returns the number of combinations for a given number of objects.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number The number of items.\n * @param {*} number_chosen The number of items in each combination.\n * @returns\n */\nfunction COMBIN(number, number_chosen) {\n number = parseNumber(number);\n number_chosen = parseNumber(number_chosen);\n const anyError$1 = anyError(number, number_chosen);\n\n if (anyError$1) {\n return anyError$1\n }\n\n if (number < number_chosen) {\n return num\n }\n\n return FACT(number) / (FACT(number_chosen) * FACT(number - number_chosen))\n}\n\n/**\n * Returns the number of combinations with repetitions for a given number of items.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number Must be greater than or equal to 0, and greater than or equal to Number_chosen. Non-integer values are truncated.\n * @param {*} number_chosen Must be greater than or equal to 0. Non-integer values are truncated.\n * @returns\n */\nfunction COMBINA(number, number_chosen) {\n number = parseNumber(number);\n number_chosen = parseNumber(number_chosen);\n const anyError$1 = anyError(number, number_chosen);\n\n if (anyError$1) {\n return anyError$1\n }\n\n if (number < number_chosen) {\n return num\n }\n\n return number === 0 && number_chosen === 0 ? 1 : COMBIN(number + number_chosen - 1, number - 1)\n}\n\n/**\n * Returns the cosine of a number.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number The angle in radians for which you want the cosine.\n * @returns\n */\nfunction COS(number) {\n number = parseNumber(number);\n\n if (number instanceof Error) {\n return number\n }\n\n return Math.cos(number)\n}\n\n/**\n * Returns the hyperbolic cosine of a number.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number Any real number for which you want to find the hyperbolic cosine.\n * @returns\n */\nfunction COSH(number) {\n number = parseNumber(number);\n\n if (number instanceof Error) {\n return number\n }\n\n return (Math.exp(number) + Math.exp(-number)) / 2\n}\n\n/**\n * Returns the hyperbolic cosine of a number.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number The angle in radians for which you want the cotangent.\n * @returns\n */\nfunction COT(number) {\n number = parseNumber(number);\n\n if (number instanceof Error) {\n return number\n }\n\n if (number === 0) {\n return div0\n }\n\n return 1 / Math.tan(number)\n}\n\n/**\n * Returns the cotangent of an angle.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number\n * @returns\n */\nfunction COTH(number) {\n number = parseNumber(number);\n\n if (number instanceof Error) {\n return number\n }\n\n if (number === 0) {\n return div0\n }\n\n const e2 = Math.exp(2 * number);\n\n return (e2 + 1) / (e2 - 1)\n}\n\n/**\n * Returns the cosecant of an angle.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number\n * @returns\n */\nfunction CSC(number) {\n number = parseNumber(number);\n\n if (number instanceof Error) {\n return number\n }\n\n if (number === 0) {\n return div0\n }\n\n return 1 / Math.sin(number)\n}\n\n/**\n * Returns the hyperbolic cosecant of an angle.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number\n * @returns\n */\nfunction CSCH(number) {\n number = parseNumber(number);\n\n if (number instanceof Error) {\n return number\n }\n\n if (number === 0) {\n return div0\n }\n\n return 2 / (Math.exp(number) - Math.exp(-number))\n}\n\n/**\n * Converts a text representation of a number in a given base into a decimal number.\n *\n * Category: Math and trigonometry\n *\n * @param {*} text\n * @param {*} radix Radix must be an integer.\n * @returns\n */\nfunction DECIMAL(text, radix) {\n if (arguments.length < 1) {\n return value\n }\n\n text = parseNumber(text);\n radix = parseNumber(radix);\n const anyError$1 = anyError(text, radix);\n\n if (anyError$1) {\n return anyError$1\n }\n\n if (radix === 0) {\n return num\n }\n\n return parseInt(text, radix)\n}\n\n/**\n * Converts radians to degrees.\n *\n * Category: Math and trigonometry\n *\n * @param {*} angle The angle in radians that you want to convert.\n * @returns\n */\nfunction DEGREES(angle) {\n angle = parseNumber(angle);\n\n if (angle instanceof Error) {\n return angle\n }\n\n return (angle * 180) / Math.PI\n}\n\n/**\n * Rounds a number up to the nearest even integer.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number The value to round.\n * @returns\n */\nfunction EVEN(number) {\n number = parseNumber(number);\n\n if (number instanceof Error) {\n return number\n }\n\n return CEILING(number, -2, -1)\n}\n\n/**\n * Returns e raised to the power of a given number.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number The exponent applied to the base e.\n * @returns\n */\nfunction EXP(number) {\n if (arguments.length < 1) {\n return na\n }\n\n if (arguments.length > 1) {\n return error\n }\n\n number = parseNumber(number);\n\n if (number instanceof Error) {\n return number\n }\n\n number = Math.exp(number);\n\n return number\n}\n\nconst MEMOIZED_FACT = [];\n/**\n * Returns the factorial of a number.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number The nonnegative number for which you want the factorial. If number is not an integer, it is truncated.\n * @returns\n */\nfunction FACT(number) {\n number = parseNumber(number);\n\n if (number instanceof Error) {\n return number\n }\n\n const n = Math.floor(number);\n\n if (n === 0 || n === 1) {\n return 1\n } else if (MEMOIZED_FACT[n] > 0) {\n return MEMOIZED_FACT[n]\n } else {\n MEMOIZED_FACT[n] = FACT(n - 1) * n;\n\n return MEMOIZED_FACT[n]\n }\n}\n\n/**\n * Returns the double factorial of a number.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number The value for which to return the double factorial. If number is not an integer, it is truncated.\n * @returns\n */\nfunction FACTDOUBLE(number) {\n number = parseNumber(number);\n\n if (number instanceof Error) {\n return number\n }\n\n const n = Math.floor(number);\n\n return n <= 0 ? 1 : n * FACTDOUBLE(n - 2)\n}\n\n/**\n * Rounds a number down, toward zero.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number The numeric value you want to round.\n * @param {*} significance The multiple to which you want to round.\n * @returns\n */\nfunction FLOOR(number, significance) {\n number = parseNumber(number);\n significance = parseNumber(significance);\n const anyError$1 = anyError(number, significance);\n\n if (anyError$1) {\n return anyError$1\n }\n\n if (significance === 0) {\n return 0\n }\n\n if (!(number >= 0 && significance > 0) && !(number <= 0 && significance < 0)) {\n return num\n }\n\n significance = Math.abs(significance);\n const precision = -Math.floor(Math.log(significance) / Math.log(10));\n\n return number >= 0\n ? ROUND(Math.floor(number / significance) * significance, precision)\n : -ROUND(Math.ceil(Math.abs(number) / significance), precision)\n}\n\n// TODO: Verify\n\n/**\n * Rounds a number down, to the nearest integer or to the nearest multiple of significance.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number The number to be rounded down.\n * @param {*} significance Optional. The multiple to which you want to round.\n * @param {*} mode Optional. The direction (toward or away from 0) to round negative numbers.\n * @returns\n */\nFLOOR.MATH = (number, significance, mode) => {\n if (significance instanceof Error) {\n return significance\n }\n\n significance = significance === undefined ? 0 : significance;\n\n number = parseNumber(number);\n significance = parseNumber(significance);\n mode = parseNumber(mode);\n const anyError$1 = anyError(number, significance, mode);\n\n if (anyError$1) {\n return anyError$1\n }\n\n if (significance === 0) {\n return 0\n }\n\n significance = significance ? Math.abs(significance) : 1;\n const precision = -Math.floor(Math.log(significance) / Math.log(10));\n\n if (number >= 0) {\n return ROUND(Math.floor(number / significance) * significance, precision)\n } else if (mode === 0 || mode === undefined) {\n return -ROUND(Math.ceil(Math.abs(number) / significance) * significance, precision)\n }\n\n return -ROUND(Math.floor(Math.abs(number) / significance) * significance, precision)\n};\n\n// Deprecated\n\n/**\n * Rounds a number the nearest integer or to the nearest multiple of significance. Regardless of the sign of the number, the number is rounded up.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number The value to be rounded.\n * @param {*} significance Optional. The multiple to which number is to be rounded. If significance is omitted, its default value is 1.\n * @returns\n */\nFLOOR.PRECISE = FLOOR['MATH'];\n\n// adapted http://rosettacode.org/wiki/Greatest_common_divisor#JavaScript\n/**\n * Returns the greatest common divisor.\n *\n * Category: Math and trigonometry\n *\n * @param {*} args number1, number2, ... Number1 is required, subsequent numbers are optional. 1 to 255 values. If any value is not an integer, it is truncated.\n * @returns\n */\nfunction GCD() {\n const range = parseNumberArray(flatten(arguments));\n\n if (range instanceof Error) {\n return range\n }\n\n const n = range.length;\n const r0 = range[0];\n let x = r0 < 0 ? -r0 : r0;\n\n for (let i = 1; i < n; i++) {\n const ri = range[i];\n let y = ri < 0 ? -ri : ri;\n\n while (x && y) {\n if (x > y) {\n x %= y;\n } else {\n y %= x;\n }\n }\n\n x += y;\n }\n\n return x\n}\n\n/**\n * Rounds a number down to the nearest integer.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number The real number you want to round down to an integer.\n * @returns\n */\nfunction INT(number) {\n number = parseNumber(number);\n\n if (number instanceof Error) {\n return number\n }\n\n return Math.floor(number)\n}\n\n// TODO: verify\nconst ISO = {\n CEILING: CEILING\n};\n\n/**\n * Returns the least common multiple.\n *\n * Category: Math and trigonometry\n *\n * @param {*} args number1, number2,... Number1 is required, subsequent numbers are optional. 1 to 255 values for which you want the least common multiple. If value is not an integer, it is truncated.\n * @returns\n */\nfunction LCM() {\n // Credits: Jonas Raoni Soares Silva\n const o = parseNumberArray(flatten(arguments));\n\n if (o instanceof Error) {\n return o\n }\n\n for (var i, j, n, d, r = 1; (n = o.pop()) !== undefined; ) {\n if (n === 0) {\n return 0\n }\n\n while (n > 1) {\n if (n % 2) {\n for (i = 3, j = Math.floor(Math.sqrt(n)); i <= j && n % i; i += 2) {\n // empty\n }\n\n d = i <= j ? i : n;\n } else {\n d = 2;\n }\n\n for (n /= d, r *= d, i = o.length; i; o[--i] % d === 0 && (o[i] /= d) === 1 && o.splice(i, 1)) {\n // empty\n }\n }\n }\n\n return r\n}\n\n/**\n * Returns the natural logarithm of a number.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number The positive real number for which you want the natural logarithm.\n * @returns\n */\nfunction LN(number) {\n number = parseNumber(number);\n\n if (number instanceof Error) {\n return number\n }\n\n if (number === 0) {\n return num\n }\n\n return Math.log(number)\n}\n\n/**\n * Formula.js only\n *\n * @returns\n */\nfunction LN10() {\n return Math.log(10)\n}\n\n/**\n * Formula.js only\n *\n * @returns\n */\nfunction LN2() {\n return Math.log(2)\n}\n\n/**\n * Formula.js only\n *\n * @returns\n */\nfunction LOG10E() {\n return Math.LOG10E\n}\n\n/**\n * Formula.js only\n *\n * @returns\n */\nfunction LOG2E() {\n return Math.LOG2E\n}\n\n/**\n * Returns the logarithm of a number to a specified base.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number The positive real number for which you want the logarithm.\n * @param {*} base Optional. The base of the logarithm. If base is omitted, it is assumed to be 10.\n * @returns\n */\nfunction LOG(number, base) {\n number = parseNumber(number);\n base = parseNumber(base);\n const anyError$1 = anyError(number, base);\n\n if (anyError$1) {\n return anyError$1\n }\n\n if (number === 0 || base === 0) {\n return num\n }\n\n return Math.log(number) / Math.log(base)\n}\n\n/**\n * Returns the base-10 logarithm of a number.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number The positive real number for which you want the base-10 logarithm.\n * @returns\n */\nfunction LOG10(number) {\n number = parseNumber(number);\n\n if (number instanceof Error) {\n return number\n }\n\n if (number === 0) {\n return num\n }\n\n return Math.log(number) / Math.log(10)\n}\n\n/**\n * Returns the remainder from division.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number The number for which you want to find the remainder.\n * @param {*} divisor The number by which you want to divide number.\n * @returns\n */\nfunction MOD(number, divisor) {\n number = parseNumber(number);\n divisor = parseNumber(divisor);\n const anyError$1 = anyError(number, divisor);\n\n if (anyError$1) {\n return anyError$1\n }\n\n if (divisor === 0) {\n return div0\n }\n\n let modulus = Math.abs(number % divisor);\n modulus = number < 0 ? divisor - modulus : modulus;\n\n return divisor > 0 ? modulus : -modulus\n}\n\n/**\n * Returns a number rounded to the desired multiple.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number The value to round.\n * @param {*} multiple The multiple to which you want to round number.\n * @returns\n */\nfunction MROUND(number, multiple) {\n number = parseNumber(number);\n multiple = parseNumber(multiple);\n const anyError$1 = anyError(number, multiple);\n\n if (anyError$1) {\n return anyError$1\n }\n\n if (number * multiple === 0) {\n return 0\n }\n\n if (number * multiple < 0) {\n return num\n }\n\n return Math.round(number / multiple) * multiple\n}\n\n/**\n * Returns the multinomial of a set of numbers.\n *\n * Category: Math and trigonometry\n *\n * @param {*} args number1, number2, ... Number1 is required, subsequent numbers are optional. 1 to 255 values for which you want the multinomial.\n * @returns\n */\nfunction MULTINOMIAL() {\n const args = parseNumberArray(flatten(arguments));\n\n if (args instanceof Error) {\n return args\n }\n\n let sum = 0;\n let divisor = 1;\n\n for (let i = 0; i < args.length; i++) {\n sum += args[i];\n divisor *= FACT(args[i]);\n }\n\n return FACT(sum) / divisor\n}\n\n/**\n * Rounds a number up to the nearest odd integer.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number: The value to round.\n * @returns\n */\nfunction ODD(number) {\n number = parseNumber(number);\n\n if (number instanceof Error) {\n return number\n }\n\n let temp = Math.ceil(Math.abs(number));\n temp = temp & 1 ? temp : temp + 1;\n\n return number >= 0 ? temp : -temp\n}\n\n/**\n * Returns the value of pi.\n *\n * Category: Math and trigonometry\n *\n * @returns\n */\nfunction PI() {\n return Math.PI\n}\n\n/**\n * Formula.js only\n *\n * @returns\n */\nfunction E() {\n return Math.E\n}\n\n/**\n * Returns the result of a number raised to a power.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number The base number. It can be any real number.\n * @param {*} power The exponent to which the base number is raised.\n * @returns\n */\nfunction POWER(number, power) {\n number = parseNumber(number);\n power = parseNumber(power);\n const anyError$1 = anyError(number, power);\n\n if (anyError$1) {\n return anyError$1\n }\n\n if (number === 0 && power === 0) {\n return num\n }\n\n const result = Math.pow(number, power);\n\n if (isNaN(result)) {\n return num\n }\n\n return result\n}\n\n/**\n * Multiplies its arguments.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number1 The first number or range that you want to multiply.\n * @param {*} args number2, ... Optional. Additional numbers or ranges that you want to multiply, up to a maximum of 255 arguments.\n * @returns\n */\nfunction PRODUCT() {\n const flatArguments = flatten(arguments);\n const flatArgumentsDefined = flatArguments.filter((arg) => arg !== undefined && arg !== null);\n\n if (flatArgumentsDefined.length === 0) {\n return 0\n }\n\n const args = parseNumberArray(flatArgumentsDefined);\n\n if (args instanceof Error) {\n return args\n }\n\n let result = 1;\n\n for (let i = 0; i < args.length; i++) {\n result *= args[i];\n }\n\n return result\n}\n\n/**\n * Returns the integer portion of a division.\n *\n * Category: Math and trigonometry\n *\n * @param {*} numerator The dividend.\n * @param {*} denominator The divisor.\n * @returns\n */\nfunction QUOTIENT(numerator, denominator) {\n numerator = parseNumber(numerator);\n denominator = parseNumber(denominator);\n const anyError$1 = anyError(numerator, denominator);\n\n if (anyError$1) {\n return anyError$1\n }\n\n return parseInt(numerator / denominator, 10)\n}\n\n/**\n * Converts degrees to radians.\n *\n * Category: Math and trigonometry\n *\n * @param {*} angle An angle in degrees that you want to convert.\n * @returns\n */\nfunction RADIANS(angle) {\n angle = parseNumber(angle);\n\n if (angle instanceof Error) {\n return angle\n }\n\n return (angle * Math.PI) / 180\n}\n\n/**\n * Returns a random number between 0 and 1.\n *\n * Category: Math and trigonometry\n *\n * @returns\n */\nfunction RAND() {\n return Math.random()\n}\n\n/**\n * Returns a random number between the numbers you specify.\n *\n * Category: Math and trigonometry\n *\n * @param {*} bottom The smallest integer RANDBETWEEN will return.\n * @param {*} top The largest integer RANDBETWEEN will return.\n * @returns\n */\nfunction RANDBETWEEN(bottom, top) {\n bottom = parseNumber(bottom);\n top = parseNumber(top);\n const anyError$1 = anyError(bottom, top);\n\n if (anyError$1) {\n return anyError$1\n }\n // Creative Commons Attribution 3.0 License\n // Copyright (c) 2012 eqcode\n\n return bottom + Math.ceil((top - bottom + 1) * Math.random()) - 1\n}\n\n// TODO\n/**\n * Converts an arabic numeral to roman, as text.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number The Arabic numeral you want converted.\n * @returns\n */\nfunction ROMAN(number) {\n number = parseNumber(number);\n\n if (number instanceof Error) {\n return number\n }\n\n // The MIT License\n // Copyright (c) 2008 Steven Levithan\n const digits = String(number).split('');\n const key = [\n '',\n 'C',\n 'CC',\n 'CCC',\n 'CD',\n 'D',\n 'DC',\n 'DCC',\n 'DCCC',\n 'CM',\n '',\n 'X',\n 'XX',\n 'XXX',\n 'XL',\n 'L',\n 'LX',\n 'LXX',\n 'LXXX',\n 'XC',\n '',\n 'I',\n 'II',\n 'III',\n 'IV',\n 'V',\n 'VI',\n 'VII',\n 'VIII',\n 'IX'\n ];\n let roman = '';\n let i = 3;\n\n while (i--) {\n roman = (key[+digits.pop() + i * 10] || '') + roman;\n }\n\n return new Array(+digits.join('') + 1).join('M') + roman\n}\n\n/**\n * Rounds a number to a specified number of digits.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number The number that you want to round.\n * @param {*} num_digits The number of digits to which you want to round the number argument.\n * @returns\n */\nfunction ROUND(number, num_digits) {\n number = parseNumber(number);\n num_digits = parseNumber(num_digits);\n const anyError$1 = anyError(number, num_digits);\n\n if (anyError$1) {\n return anyError$1\n }\n\n return Number(Math.round(Number(number + 'e' + num_digits)) + 'e' + num_digits * -1)\n}\n\n/**\n * Rounds a number down, toward zero.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number Any real number that you want rounded down.\n * @param {*} num_digits The number of digits to which you want to round number.\n * @returns\n */\nfunction ROUNDDOWN(number, num_digits) {\n number = parseNumber(number);\n num_digits = parseNumber(num_digits);\n const anyError$1 = anyError(number, num_digits);\n\n if (anyError$1) {\n return anyError$1\n }\n\n const sign = number > 0 ? 1 : -1;\n\n return (sign * Math.floor(Math.abs(number) * Math.pow(10, num_digits))) / Math.pow(10, num_digits)\n}\n\n/**\n * Rounds a number up, away from zero.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number Any real number that you want rounded up.\n * @param {*} num_digits The number of digits to which you want to round number.\n * @returns\n */\nfunction ROUNDUP(number, num_digits) {\n number = parseNumber(number);\n num_digits = parseNumber(num_digits);\n const anyError$1 = anyError(number, num_digits);\n\n if (anyError$1) {\n return anyError$1\n }\n\n const sign = number > 0 ? 1 : -1;\n\n return (sign * Math.ceil(Math.abs(number) * Math.pow(10, num_digits))) / Math.pow(10, num_digits)\n}\n\n/**\n * Returns the secant of an angle.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number The angle in radians for which you want the secant.\n * @returns\n */\nfunction SEC(number) {\n number = parseNumber(number);\n\n if (number instanceof Error) {\n return number\n }\n\n return 1 / Math.cos(number)\n}\n\n/**\n * Returns the hyperbolic secant of an angle.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number The angle in radians for which you want the hyperbolic secant.\n * @returns\n */\nfunction SECH(number) {\n number = parseNumber(number);\n\n if (number instanceof Error) {\n return number\n }\n\n return 2 / (Math.exp(number) + Math.exp(-number))\n}\n\n/**\n * Returns the sum of a power series based on the formula.\n *\n * Category: Math and trigonometry\n *\n * @param {*} x The input value to the power series.\n * @param {*} n The initial power to which you want to raise x.\n * @param {*} m The step by which to increase n for each term in the series.\n * @param {*} coefficients A set of coefficients by which each successive power of x is multiplied. The number of values in coefficients determines the number of terms in the power series. For example, if there are three values in coefficients, then there will be three terms in the power series.\n * @returns\n */\nfunction SERIESSUM(x, n, m, coefficients) {\n x = parseNumber(x);\n n = parseNumber(n);\n m = parseNumber(m);\n coefficients = parseNumberArray(coefficients);\n\n if (anyIsError(x, n, m, coefficients)) {\n return value\n }\n\n let result = coefficients[0] * Math.pow(x, n);\n\n for (let i = 1; i < coefficients.length; i++) {\n result += coefficients[i] * Math.pow(x, n + i * m);\n }\n\n return result\n}\n\n/**\n * Returns the sign of a number.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number Any real number.\n * @returns\n */\nfunction SIGN(number) {\n number = parseNumber(number);\n\n if (number instanceof Error) {\n return number\n }\n\n if (number < 0) {\n return -1\n } else if (number === 0) {\n return 0\n } else {\n return 1\n }\n}\n\n/**\n * Returns the sine of the given angle.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number The angle in radians for which you want the sine.\n * @returns\n */\nfunction SIN(number) {\n number = parseNumber(number);\n\n if (number instanceof Error) {\n return number\n }\n\n return Math.sin(number)\n}\n\n/**\n * Returns the hyperbolic sine of a number.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number Any real number.\n * @returns\n */\nfunction SINH(number) {\n number = parseNumber(number);\n\n if (number instanceof Error) {\n return number\n }\n\n return (Math.exp(number) - Math.exp(-number)) / 2\n}\n\n/**\n * Returns a positive square root.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number The number for which you want the square root.\n * @returns\n */\nfunction SQRT(number) {\n number = parseNumber(number);\n\n if (number instanceof Error) {\n return number\n }\n\n if (number < 0) {\n return num\n }\n\n return Math.sqrt(number)\n}\n\n/**\n * Returns the square root of (number * pi).\n *\n * Category: Math and trigonometry\n *\n * @param {*} number The number by which pi is multiplied.\n * @returns\n */\nfunction SQRTPI(number) {\n number = parseNumber(number);\n\n if (number instanceof Error) {\n return number\n }\n\n return Math.sqrt(number * Math.PI)\n}\n\n/**\n * Formula.js only\n *\n * @returns\n */\nfunction SQRT1_2() {\n return 1 / Math.sqrt(2)\n}\n\n/**\n * Formula.js only\n *\n * @returns\n */\nfunction SQRT2() {\n return Math.sqrt(2)\n}\n\n/**\n * Returns a subtotal in a list or database.\n *\n * Category: Math and trigonometry\n *\n * @param {*} function_num The number 1-11 or 101-111 that specifies the function to use for the subtotal. 1-11 includes manually-hidden rows, while 101-111 excludes them; filtered-out values are always excluded.\n * @param {*} ref1 The first named range or reference for which you want the subtotal.\n * @returns\n */\nfunction SUBTOTAL(function_num, ref1) {\n function_num = parseNumber(function_num);\n\n if (function_num instanceof Error) {\n return function_num\n }\n\n switch (function_num) {\n case 1:\n return AVERAGE(ref1)\n case 2:\n return COUNT(ref1)\n case 3:\n return COUNTA(ref1)\n case 4:\n return MAX(ref1)\n case 5:\n return MIN(ref1)\n case 6:\n return PRODUCT(ref1)\n case 7:\n return STDEV.S(ref1)\n case 8:\n return STDEV.P(ref1)\n case 9:\n return SUM(ref1)\n case 10:\n return VAR.S(ref1)\n case 11:\n return VAR.P(ref1)\n // no hidden values for us\n case 101:\n return AVERAGE(ref1)\n case 102:\n return COUNT(ref1)\n case 103:\n return COUNTA(ref1)\n case 104:\n return MAX(ref1)\n case 105:\n return MIN(ref1)\n case 106:\n return PRODUCT(ref1)\n case 107:\n return STDEV.S(ref1)\n case 108:\n return STDEV.P(ref1)\n case 109:\n return SUM(ref1)\n case 110:\n return VAR.S(ref1)\n case 111:\n return VAR.P(ref1)\n }\n}\n\n/**\n * Formula.js only\n *\n * @param {*} num1\n * @param {*} num2\n * @returns\n */\nfunction ADD(num1, num2) {\n if (arguments.length !== 2) {\n return na\n }\n\n num1 = parseNumber(num1);\n num2 = parseNumber(num2);\n const anyError$1 = anyError(num1, num2);\n\n if (anyError$1) {\n return anyError$1\n }\n\n return num1 + num2\n}\n\n/**\n * Formula.js only\n *\n * @param {*} num1\n * @param {*} num2\n * @returns\n */\nfunction MINUS(num1, num2) {\n if (arguments.length !== 2) {\n return na\n }\n\n num1 = parseNumber(num1);\n num2 = parseNumber(num2);\n const anyError$1 = anyError(num1, num2);\n\n if (anyError$1) {\n return anyError$1\n }\n\n return num1 - num2\n}\n\n/**\n * Formula.js only\n *\n * @param {*} dividend\n * @param {*} divisor\n * @returns\n */\nfunction DIVIDE(dividend, divisor) {\n if (arguments.length !== 2) {\n return na\n }\n\n dividend = parseNumber(dividend);\n divisor = parseNumber(divisor);\n const anyError$1 = anyError(dividend, divisor);\n\n if (anyError$1) {\n return anyError$1\n }\n\n if (divisor === 0) {\n return div0\n }\n\n return dividend / divisor\n}\n\n/**\n * Formula.js only\n *\n * @param {*} factor1\n * @param {*} factor2\n * @returns\n */\nfunction MULTIPLY(factor1, factor2) {\n if (arguments.length !== 2) {\n return na\n }\n\n factor1 = parseNumber(factor1);\n factor2 = parseNumber(factor2);\n const anyError$1 = anyError(factor1, factor2);\n\n if (anyError$1) {\n return anyError$1\n }\n\n return factor1 * factor2\n}\n\n/**\n * Formula.js only\n *\n * @param {*} num1\n * @param {*} num2\n * @returns\n */\nfunction GT(num1, num2) {\n if (arguments.length !== 2) {\n return na\n }\n\n if (num1 instanceof Error) {\n return num1\n }\n\n if (num2 instanceof Error) {\n return num2\n }\n\n if (anyIsString(num1, num2)) {\n num1 = parseString(num1);\n num2 = parseString(num2);\n } else {\n num1 = parseNumber(num1);\n num2 = parseNumber(num2);\n }\n\n const anyError$1 = anyError(num1, num2);\n\n if (anyError$1) {\n return anyError$1\n }\n\n return num1 > num2\n}\n\n/**\n * Formula.js only\n *\n * @param {*} num1\n * @param {*} num2\n * @returns\n */\nfunction GTE(num1, num2) {\n if (arguments.length !== 2) {\n return na\n }\n\n if (anyIsString(num1, num2)) {\n num1 = parseString(num1);\n num2 = parseString(num2);\n } else {\n num1 = parseNumber(num1);\n num2 = parseNumber(num2);\n }\n\n const anyError$1 = anyError(num1, num2);\n\n if (anyError$1) {\n return anyError$1\n }\n\n return num1 >= num2\n}\n\n/**\n * Formula.js only\n *\n * @param {*} num1\n * @param {*} num2\n * @returns\n */\nfunction LT(num1, num2) {\n if (arguments.length !== 2) {\n return na\n }\n\n if (anyIsString(num1, num2)) {\n num1 = parseString(num1);\n num2 = parseString(num2);\n } else {\n num1 = parseNumber(num1);\n num2 = parseNumber(num2);\n }\n\n const anyError$1 = anyError(num1, num2);\n\n if (anyError$1) {\n return anyError$1\n }\n\n return num1 < num2\n}\n\n/**\n * Formula.js only\n *\n * @param {*} num1\n * @param {*} num2\n * @returns\n */\nfunction LTE(num1, num2) {\n if (arguments.length !== 2) {\n return na\n }\n\n if (anyIsString(num1, num2)) {\n num1 = parseString(num1);\n num2 = parseString(num2);\n } else {\n num1 = parseNumber(num1);\n num2 = parseNumber(num2);\n }\n\n const anyError$1 = anyError(num1, num2);\n\n if (anyError$1) {\n return anyError$1\n }\n\n return num1 <= num2\n}\n\n/**\n * Formula.js only\n *\n * @param {*} value1\n * @param {*} value2\n * @returns\n */\nfunction EQ(value1, value2) {\n if (arguments.length !== 2) {\n return na\n }\n\n if (value1 instanceof Error) {\n return value1\n }\n\n if (value2 instanceof Error) {\n return value2\n }\n\n if (value1 === null) {\n value1 = undefined;\n }\n\n if (value2 === null) {\n value2 = undefined;\n }\n\n return value1 === value2\n}\n\n/**\n * Formula.js only\n *\n * @param {*} value1\n * @param {*} value2\n * @returns\n */\nfunction NE(value1, value2) {\n if (arguments.length !== 2) {\n return na\n }\n\n if (value1 instanceof Error) {\n return value1\n }\n\n if (value2 instanceof Error) {\n return value2\n }\n\n if (value1 === null) {\n value1 = undefined;\n }\n\n if (value2 === null) {\n value2 = undefined;\n }\n\n return value1 !== value2\n}\n\n/**\n * Formula.js only\n *\n * @param {*} base\n * @param {*} exponent\n * @returns\n */\nfunction POW(base, exponent) {\n if (arguments.length !== 2) {\n return na\n }\n\n return POWER(base, exponent)\n}\n\n/**\n * Adds its arguments.\n *\n * Category: Math and trigonometry\n *\n * @returns\n */\nfunction SUM() {\n let result = 0;\n\n arrayEach(argsToArray(arguments), (value) => {\n if (result instanceof Error) {\n return false\n } else if (value instanceof Error) {\n result = value;\n } else if (typeof value === 'number') {\n result += value;\n } else if (typeof value === 'string') {\n const parsed = parseFloat(value);\n\n !isNaN(parsed) && (result += parsed);\n } else if (Array.isArray(value)) {\n const inner_result = SUM.apply(null, value);\n\n if (inner_result instanceof Error) {\n result = inner_result;\n } else {\n result += inner_result;\n }\n }\n });\n\n return result\n}\n\n/**\n * Adds the values specified by a given criteria.\n *\n * Category: Math and trigonometry\n *\n * @param {*} range The range of values that you want evaluated by criteria. Cells in each range must be numbers or names, arrays, or references that contain numbers. Blank and text values are ignored.\n * @param {*} criteria The criteria in the form of a number, expression, a value reference, text, or a function that defines which values will be added.\n * @param {*} sum_range Optional. The actual values to add, if you want to add values other than those specified in the range argument. If the sum_range argument is omitted, Excel adds the values that are specified in the range argument (the same values to which the criteria is applied). Sum_range should be the same size and shape as range. If it isn't, performance may suffer, and the formula will sum a range of values that starts with the first value in sum_range but has the same dimensions as range.\n * @returns\n */\nfunction SUMIF(range, criteria, sum_range) {\n range = flatten(range);\n\n sum_range = sum_range ? flatten(sum_range) : range;\n\n if (range instanceof Error) {\n return range\n }\n\n if (criteria === undefined || criteria === null || criteria instanceof Error) {\n return 0\n }\n\n let result = 0;\n const isWildcard = criteria === '*';\n const tokenizedCriteria = isWildcard ? null : parse(criteria + '');\n\n for (let i = 0; i < range.length; i++) {\n const value = range[i];\n const sumValue = sum_range[i];\n\n if (isWildcard) {\n result += value;\n } else {\n const tokens = [createToken(value, TOKEN_TYPE_LITERAL)].concat(tokenizedCriteria);\n\n result += compute(tokens) ? sumValue : 0;\n }\n }\n\n return result\n}\n\n/**\n * Adds the values in a range that meet multiple criteria.\n *\n * Category: Math and trigonometry\n *\n * @returns\n */\nfunction SUMIFS() {\n const args = argsToArray(arguments);\n const range = parseNumberArray(flatten(args.shift()));\n\n if (range instanceof Error) {\n return range\n }\n\n const criterias = args;\n const criteriaLength = criterias.length / 2;\n\n for (let i = 0; i < criteriaLength; i++) {\n criterias[i * 2] = flatten(criterias[i * 2]);\n }\n\n let result = 0;\n\n for (let i = 0; i < range.length; i++) {\n let isMeetCondition = false;\n\n for (let j = 0; j < criteriaLength; j++) {\n const valueToTest = criterias[j * 2][i];\n const criteria = criterias[j * 2 + 1];\n const isWildcard = criteria === void 0 || criteria === '*';\n let computedResult = false;\n\n if (isWildcard) {\n computedResult = true;\n } else {\n const tokenizedCriteria = parse(criteria + '');\n const tokens = [createToken(valueToTest, TOKEN_TYPE_LITERAL)].concat(\n tokenizedCriteria\n );\n\n computedResult = compute(tokens);\n }\n\n // Criterias are calculated as AND so any `false` breakes the loop as unmeet condition\n if (!computedResult) {\n isMeetCondition = false;\n break\n }\n\n isMeetCondition = true;\n }\n\n if (isMeetCondition) {\n result += range[i];\n }\n }\n\n return result\n}\n\n/**\n * Returns the sum of the products of corresponding array components.\n *\n * Category: Math and trigonometry\n *\n * @returns\n */\nfunction SUMPRODUCT() {\n if (!arguments || arguments.length === 0) {\n return value\n }\n\n const arrays = arguments.length + 1;\n let result = 0;\n let product;\n let k;\n let _i;\n let _ij;\n\n for (let i = 0; i < arguments[0].length; i++) {\n if (!(arguments[0][i] instanceof Array)) {\n product = 1;\n\n for (k = 1; k < arrays; k++) {\n const _i_arg = arguments[k - 1][i];\n\n if (_i_arg instanceof Error) {\n return _i_arg\n }\n\n _i = parseNumber(_i_arg);\n\n if (_i instanceof Error) {\n return _i\n }\n\n product *= _i;\n }\n\n result += product;\n } else {\n for (let j = 0; j < arguments[0][i].length; j++) {\n product = 1;\n\n for (k = 1; k < arrays; k++) {\n const _ij_arg = arguments[k - 1][i][j];\n\n if (_ij_arg instanceof Error) {\n return _ij_arg\n }\n\n _ij = parseNumber(_ij_arg);\n\n if (_ij instanceof Error) {\n return _ij\n }\n\n product *= _ij;\n }\n\n result += product;\n }\n }\n }\n\n return result\n}\n\n/**\n * Returns the sum of the squares of the arguments.\n *\n * Category: Math and trigonometry\n *\n * @param {*} args number1, number2, ... Number1 is required, subsequent numbers are optional. 1 to 255 arguments for which you want the sum of the squares. You can also use a single array or a reference to an array instead of arguments separated by commas.\n * @returns\n */\nfunction SUMSQ() {\n const numbers = parseNumberArray(flatten(arguments));\n\n if (numbers instanceof Error) {\n return numbers\n }\n\n let result = 0;\n const length = numbers.length;\n\n for (let i = 0; i < length; i++) {\n result += ISNUMBER(numbers[i]) ? numbers[i] * numbers[i] : 0;\n }\n\n return result\n}\n\n/**\n * Returns the sum of the difference of squares of corresponding values in two arrays.\n *\n * Category: Math and trigonometry\n *\n * @param {*} array_x The first array or range of values.\n * @param {*} array_y The second array or range of values.\n * @returns\n */\nfunction SUMX2MY2(array_x, array_y) {\n array_x = parseNumberArray(flatten(array_x));\n array_y = parseNumberArray(flatten(array_y));\n\n if (anyIsError(array_x, array_y)) {\n return value\n }\n\n let result = 0;\n\n for (let i = 0; i < array_x.length; i++) {\n result += array_x[i] * array_x[i] - array_y[i] * array_y[i];\n }\n\n return result\n}\n\n/**\n * Returns the sum of the sum of squares of corresponding values in two arrays.\n *\n * Category: Math and trigonometry\n *\n * @param {*} array_x The first array or range of values.\n * @param {*} array_y The second array or range of values.\n * @returns\n */\nfunction SUMX2PY2(array_x, array_y) {\n array_x = parseNumberArray(flatten(array_x));\n array_y = parseNumberArray(flatten(array_y));\n\n if (anyIsError(array_x, array_y)) {\n return value\n }\n\n let result = 0;\n array_x = parseNumberArray(flatten(array_x));\n array_y = parseNumberArray(flatten(array_y));\n\n for (let i = 0; i < array_x.length; i++) {\n result += array_x[i] * array_x[i] + array_y[i] * array_y[i];\n }\n\n return result\n}\n\n/**\n * Returns the sum of squares of differences of corresponding values in two arrays.\n *\n * Category: Math and trigonometry\n *\n * @param {*} array_x The first array or range of values.\n * @param {*} array_y The second array or range of values.\n * @returns\n */\nfunction SUMXMY2(array_x, array_y) {\n array_x = parseNumberArray(flatten(array_x));\n array_y = parseNumberArray(flatten(array_y));\n\n if (anyIsError(array_x, array_y)) {\n return value\n }\n\n let result = 0;\n array_x = flatten(array_x);\n array_y = flatten(array_y);\n\n for (let i = 0; i < array_x.length; i++) {\n result += Math.pow(array_x[i] - array_y[i], 2);\n }\n\n return result\n}\n\n/**\n * Returns the tangent of a number.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number The angle in radians for which you want the tangent.\n * @returns\n */\nfunction TAN(number) {\n number = parseNumber(number);\n\n if (number instanceof Error) {\n return number\n }\n\n return Math.tan(number)\n}\n\n/**\n * Returns the hyperbolic tangent of a number.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number Any real number.\n * @returns\n */\nfunction TANH(number) {\n number = parseNumber(number);\n\n if (number instanceof Error) {\n return number\n }\n\n const e2 = Math.exp(2 * number);\n\n return (e2 - 1) / (e2 + 1)\n}\n\n/**\n * Truncates a number to an integer.\n *\n * Category: Math and trigonometry\n *\n * @param {*} number The number you want to truncate.\n * @param {*} num_digits Optional. A number specifying the precision of the truncation. The default value for num_digits is 0 (zero).\n * @returns\n */\nfunction TRUNC(number, num_digits) {\n number = parseNumber(number);\n num_digits = parseNumber(num_digits);\n const anyError$1 = anyError(number, num_digits);\n\n if (anyError$1) {\n return anyError$1\n }\n\n const sign = number > 0 ? 1 : -1;\n\n return (sign * Math.floor(Math.abs(number) * Math.pow(10, num_digits))) / Math.pow(10, num_digits)\n}\n\n// TODO\n/**\n * -- Not implemented --\n *\n * Changes full-width (double-byte) English letters or katakana within a character string to half-width (single-byte) characters.\n *\n * Category: Text\n *\n * @param {*} text The text or a reference to a value that contains the text you want to change. If text does not contain any full-width letters, text is not changed.\n * @returns\n */\nfunction ASC() {\n throw new Error('ASC is not implemented')\n}\n\n// TODO\n/**\n * -- Not implemented --\n *\n * Converts a number to text, using the ß (baht) currency format.\n *\n * Category: Text\n *\n * @param {*} number A number you want to convert to text, or a reference to a value containing a number, or a formula that evaluates to a number.\n * @returns\n */\nfunction BAHTTEXT() {\n throw new Error('BAHTTEXT is not implemented')\n}\n\n/**\n * Returns the character specified by the code number.\n *\n * Category: Text\n *\n * @param {*} number A number between 1 and 255 specifying which character you want. The character is from the character set used by your computer. Note: Excel for the web supports only CHAR(9), CHAR(10), CHAR(13), and CHAR(32) and above.\n * @returns\n */\nfunction CHAR(number) {\n number = parseNumber(number);\n\n if (number === 0) {\n return value\n }\n\n if (number instanceof Error) {\n return number\n }\n\n return String.fromCharCode(number)\n}\n\n/**\n * Removes all nonprintable characters from text.\n *\n * Category: Text\n *\n * @param {*} text Any worksheet information from which you want to remove nonprintable characters.\n * @returns\n */\nfunction CLEAN(text) {\n if (anyIsError(text)) {\n return text\n }\n\n text = text || '';\n const re = /[\\0-\\x1F]/g;\n\n return text.replace(re, '')\n}\n\n/**\n * Returns a numeric code for the first character in a text string.\n *\n * Category: Text\n *\n * @param {*} text The text for which you want the code of the first character.\n * @returns\n */\nfunction CODE(text) {\n if (anyIsError(text)) {\n return text\n }\n\n text = text || '';\n let result = text.charCodeAt(0);\n\n if (isNaN(result)) {\n result = value;\n }\n\n return result\n}\n\n/**\n * Joins several text items into one text item.\n *\n * Category: Text\n *\n * @returns\n */\nfunction CONCATENATE() {\n const args = flatten(arguments);\n const someError = anyError.apply(undefined, args);\n\n if (someError) {\n return someError\n }\n\n let trueFound = 0;\n\n while ((trueFound = args.indexOf(true)) > -1) {\n args[trueFound] = 'TRUE';\n }\n\n let falseFound = 0;\n\n while ((falseFound = args.indexOf(false)) > -1) {\n args[falseFound] = 'FALSE';\n }\n\n return args.join('')\n}\n\nconst CONCAT = CONCATENATE;\n\n// TODO\n/**\n * -- Not implemented --\n *\n * Changes half-width (single-byte) English letters or katakana within a character string to full-width (double-byte) characters.\n *\n * Category: Text\n *\n * @param {*} text The text or a reference to a value that contains the text you want to change. If text does not contain any half-width English letters or katakana, text is not changed.\n * @returns\n */\nfunction DBCS() {\n throw new Error('DBCS is not implemented')\n}\n\n/**\n * Converts a number to text, using the $ (dollar) currency format.\n *\n * Category: Text\n *\n * @param {*} number A number, a reference to a value containing a number, or a formula that evaluates to a number.\n * @param {*} decimals Optional. The number of digits to the right of the decimal point. If this is negative, the number is rounded to the left of the decimal point. If you omit decimals, it is assumed to be 2.\n * @returns\n */\nfunction DOLLAR(number, decimals = 2) {\n number = parseNumber(number);\n if (isNaN(number)) {\n return value\n }\n\n number = ROUND(number, decimals);\n\n const options = {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: decimals >= 0 ? decimals : 0,\n maximumFractionDigits: decimals >= 0 ? decimals : 0\n };\n\n const formattedNumber = number.toLocaleString('en-US', options);\n\n if (number < 0) {\n return '$(' + formattedNumber.slice(2) + ')'\n }\n\n return formattedNumber\n}\n\n/**\n * Checks to see if two text values are identical.\n *\n * Category: Text\n *\n * @param {*} text1 The first text string.\n * @param {*} text2 The second text string.\n * @returns\n */\nfunction EXACT(text1, text2) {\n if (arguments.length !== 2) {\n return na\n }\n\n const someError = anyError(text1, text2);\n\n if (someError) {\n return someError\n }\n\n text1 = parseString(text1);\n text2 = parseString(text2);\n\n return text1 === text2\n}\n\n/**\n * Locate one text string within a second text string, and return the number of the starting position of the first text string from the first character of the second text string.\n *\n * Category: Text\n *\n * @param {*} find_text The text you want to find.\n * @param {*} within_text The text containing the text you want to find.\n * @param {*} start_num Optional. Specifies the character at which to start the search. The first character in within_text is character number 1. If you omit start_num, it is assumed to be 1.\n * @returns\n */\nfunction FIND(find_text, within_text, start_num) {\n if (arguments.length < 2) {\n return na\n }\n\n find_text = parseString(find_text);\n within_text = parseString(within_text);\n start_num = start_num === undefined ? 0 : start_num;\n const found_index = within_text.indexOf(find_text, start_num - 1);\n\n if (found_index === -1) {\n return value\n }\n\n return found_index + 1\n}\n\n/**\n * Formats a number as text with a fixed number of decimals.\n *\n * Category: Text\n *\n * @param {*} number The number you want to round and convert to text.\n * @param {*} decimals Optional. The number of digits to the right of the decimal point.\n * @param {*} no_commas Optional. A logical value that, if TRUE, prevents FIXED from including commas in the returned text.\n * @returns\n */\nfunction FIXED(number, decimals = 2, no_commas = false) {\n number = parseNumber(number);\n if (isNaN(number)) {\n return value\n }\n\n decimals = parseNumber(decimals);\n if (isNaN(decimals)) {\n return value\n }\n\n if (decimals < 0) {\n const factor = Math.pow(10, -decimals);\n number = Math.round(number / factor) * factor;\n } else {\n number = number.toFixed(decimals);\n }\n\n if (no_commas) {\n number = number.toString().replace(/,/g, '');\n } else {\n const parts = number.toString().split('.');\n parts[0] = parts[0].replace(/\\B(?=(\\d{3})+$)/g, ',');\n number = parts.join('.');\n }\n\n return number\n}\n\n/**\n * Formula.js only\n *\n * @param {*} value\n * @returns\n */\nfunction HTML2TEXT(value) {\n if (anyIsError(value)) {\n return value\n }\n\n let result = '';\n\n if (value) {\n if (value instanceof Array) {\n value.forEach((line) => {\n if (result !== '') {\n result += '\\n';\n }\n\n result += line.replace(/<(?:.|\\n)*?>/gm, '');\n });\n } else {\n result = value.replace(/<(?:.|\\n)*?>/gm, '');\n }\n }\n\n return result\n}\n\n/**\n * Returns the leftmost characters from a text value.\n *\n * Category: Text\n *\n * @param {*} text The text string that contains the characters you want to extract.\n * @param {*} num_chars Optional. Specifies the number of characters you want LEFT to extract.\n * @returns\n */\nfunction LEFT(text, num_chars) {\n const someError = anyError(text, num_chars);\n\n if (someError) {\n return someError\n }\n\n text = parseString(text);\n num_chars = num_chars === undefined ? 1 : num_chars;\n num_chars = parseNumber(num_chars);\n\n if (num_chars instanceof Error || typeof text !== 'string') {\n return value\n }\n\n return text.substring(0, num_chars)\n}\n\n/**\n * Returns the number of characters in a text string\n *\n * Category: Text\n *\n * @param {*} text The text whose length you want to find. Spaces count as characters.\n * @returns\n */\nfunction LEN(text) {\n if (arguments.length === 0) {\n return error\n }\n\n if (text instanceof Error) {\n return text\n }\n\n if (Array.isArray(text)) {\n return value\n }\n\n const textAsString = parseString(text);\n\n return textAsString.length\n}\n\n/**\n * Converts text to lowercase.\n *\n * Category: Text\n *\n * @param {*} text The text you want to convert to lowercase. LOWER does not change characters in text that are not letters.\n * @returns\n */\nfunction LOWER(text) {\n if (arguments.length !== 1) {\n return value\n }\n\n text = parseString(text);\n\n if (anyIsError(text)) {\n return text\n }\n\n return text.toLowerCase()\n}\n\n/**\n * Returns a specific number of characters from a text string starting at the position you specify\n *\n * Category: Text\n *\n * @param {*} text The text string containing the characters you want to extract.\n * @param {*} start_num The position of the first character you want to extract in text. The first character in text has start_num 1, and so on.\n * @param {*} num_chars Specifies the number of characters you want MID to return from text.\n * @returns\n */\nfunction MID(text, start_num, num_chars) {\n if (start_num === undefined || start_num === null) {\n return value\n }\n\n start_num = parseNumber(start_num);\n num_chars = parseNumber(num_chars);\n\n if (anyIsError(start_num, num_chars) || typeof text !== 'string') {\n return num_chars\n }\n\n const begin = start_num - 1;\n const end = begin + num_chars;\n\n return text.substring(begin, end)\n}\n\n// TODO\n/**\n * Converts text to number in a locale-independent manner.\n *\n * Category: Text\n *\n * @param {*} text The text to convert to a number.\n * @param {*} decimal_separator Optional. The character used to separate the integer and fractional part of the result.\n * @param {*} group_separator Optional. The character used to separate groupings of numbers, such as thousands from hundreds and millions from thousands.\n * @returns\n */\nfunction NUMBERVALUE(text, decimal_separator, group_separator) {\n text = isDefined(text) ? text : '';\n\n if (typeof text === 'number') {\n return text\n }\n\n if (typeof text !== 'string') {\n return na\n }\n\n decimal_separator = typeof decimal_separator === 'undefined' ? '.' : decimal_separator;\n group_separator = typeof group_separator === 'undefined' ? ',' : group_separator;\n\n return Number(text.replace(decimal_separator, '.').replace(group_separator, ''))\n}\n\n// TODO\n/**\n * -- Not implemented --\n */\nfunction PRONETIC() {\n throw new Error('PRONETIC is not implemented')\n}\n\n/**\n * Capitalizes the first letter in each word of a text value.\n *\n * Category: Text\n *\n * @param {*} text Text enclosed in quotation marks, a formula that returns text, or a reference to a value containing the text you want to partially capitalize.\n * @returns\n */\nfunction PROPER(text) {\n if (anyIsError(text)) {\n return text\n }\n\n if (isNaN(text) && typeof text === 'number') {\n return value\n }\n\n text = parseString(text);\n\n return text.replace(/\\w\\S*/g, (txt) => txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase())\n}\n\n/**\n * Formula.js only\n *\n * @param {*} text\n * @param {*} regular_expression\n * @returns\n */\nfunction REGEXEXTRACT(text, regular_expression) {\n if (arguments.length < 2) {\n return na\n }\n\n const match = text.match(new RegExp(regular_expression));\n\n return match ? match[match.length > 1 ? match.length - 1 : 0] : null\n}\n\n/**\n * Formula.js only\n *\n * @param {*} text\n * @param {*} regular_expression\n * @param {*} full\n * @returns\n */\nfunction REGEXMATCH(text, regular_expression, full) {\n if (arguments.length < 2) {\n return na\n }\n\n const match = text.match(new RegExp(regular_expression));\n\n return full ? match : !!match\n}\n\n/**\n * Formula.js only\n *\n * @param {*} text\n * @param {*} regular_expression\n * @param {*} replacement\n * @returns\n */\nfunction REGEXREPLACE(text, regular_expression, replacement) {\n if (arguments.length < 3) {\n return na\n }\n\n return text.replace(new RegExp(regular_expression), replacement)\n}\n\n/**\n * Replaces characters within text\n *\n * Category: Text\n *\n * @param {*} old_text Text in which you want to replace some characters.\n * @param {*} num_chars The number of characters in old_text that you want REPLACE to replace with new_text.\n * @param {*} length he number of characters in old_text that you want REPLACEB to replace with new_text.\n * @param {*} new_text he text that will replace characters in old_text.\n * @returns\n */\nfunction REPLACE(old_text, num_chars, length, new_text) {\n num_chars = parseNumber(num_chars);\n length = parseNumber(length);\n\n if (anyIsError(num_chars, length) || typeof old_text !== 'string' || typeof new_text !== 'string') {\n return value\n }\n\n return old_text.substr(0, num_chars - 1) + new_text + old_text.substr(num_chars - 1 + length)\n}\n\n/**\n * Repeats text a given number of times.\n *\n * Category: Text\n *\n * @param {*} text The text you want to repeat.\n * @param {*} number_times A positive number specifying the number of times to repeat text.\n * @returns\n */\nfunction REPT(text, number_times) {\n const someError = anyError(text, number_times);\n\n if (someError) {\n return someError\n }\n\n text = parseString(text);\n number_times = parseNumber(number_times);\n\n if (number_times instanceof Error) {\n return number_times\n }\n\n return new Array(number_times + 1).join(text)\n}\n\n/**\n * Returns the rightmost characters from a text value\n *\n * Category: Text\n *\n * @param {*} text The text string containing the characters you want to extract.\n * @param {*} num_chars Optional. Specifies the number of characters you want RIGHT to extract.\n * @returns\n */\nfunction RIGHT(text, num_chars) {\n const someError = anyError(text, num_chars);\n\n if (someError) {\n return someError\n }\n\n text = parseString(text);\n num_chars = num_chars === undefined ? 1 : num_chars;\n num_chars = parseNumber(num_chars);\n\n if (num_chars instanceof Error) {\n return num_chars\n }\n\n return text.substring(text.length - num_chars)\n}\n\n/**\n * Finds one text value within another (not case-sensitive)\n *\n * Category: Text\n *\n * @param {*} find_text The text that you want to find.\n * @param {*} within_text The text in which you want to search for the value of the find_text argument.\n * @param {*} start_num Optional. The character number in the within_text argument at which you want to start searching.\n * @returns\n */\nfunction SEARCH(find_text, within_text, start_num) {\n let foundAt;\n\n if (typeof find_text !== 'string' || typeof within_text !== 'string') {\n return value\n }\n\n start_num = start_num === undefined ? 0 : start_num;\n foundAt = within_text.toLowerCase().indexOf(find_text.toLowerCase(), start_num - 1) + 1;\n\n return foundAt === 0 ? value : foundAt\n}\n\n/**\n * Formula.js only\n *\n * @param {*} text\n * @param {*} separator\n * @returns\n */\nfunction SPLIT(text, separator) {\n return text.split(separator)\n}\n\n/**\n * Substitutes new text for old text in a text string.\n *\n * Category: Text\n *\n * @param {*} text The text or the reference to a value containing text for which you want to substitute characters.\n * @param {*} old_text The text you want to replace.\n * @param {*} new_text The text you want to replace old_text with.\n * @param {*} instance_num Optional. Specifies which occurrence of old_text you want to replace with new_text. If you specify instance_num, only that instance of old_text is replaced. Otherwise, every occurrence of old_text in text is changed to new_text.\n * @returns\n */\nfunction SUBSTITUTE(text, old_text, new_text, instance_num) {\n if (arguments.length < 3) {\n return na\n }\n\n if (!text || !old_text) {\n return text\n } else if (instance_num === undefined) {\n return text.split(old_text).join(new_text)\n } else {\n instance_num = Math.floor(Number(instance_num));\n\n if (Number.isNaN(instance_num) || instance_num <= 0) {\n return value\n }\n\n let index = 0;\n let i = 0;\n\n while (index > -1 && text.indexOf(old_text, index) > -1) {\n index = text.indexOf(old_text, index + 1);\n i++;\n\n if (index > -1 && i === instance_num) {\n return text.substring(0, index) + new_text + text.substring(index + old_text.length)\n }\n }\n\n return text\n }\n}\n\n/**\n * Converts its arguments to text.\n *\n * Category: Text\n *\n * @param {*} value The value you want to test.\n * @returns\n */\nfunction T(value) {\n if (value instanceof Error) {\n return value\n }\n\n return typeof value === 'string' ? value : ''\n}\n\n/**\n * Formats a number and converts it to text.\n *\n * Category: Text\n *\n * @param {*} number The number you want to format.\n * @param {*} format The format you want to use.\n * @returns\n */\nfunction TEXT(number, format) {\n if (number === undefined || format === undefined) return na\n\n const currencySymbol = format.startsWith('$') ? '$' : '';\n const isPercent = format.endsWith('%');\n format = format.replace(/%/g, '').replace(/\\$/g, '');\n\n // count all 0s after the decimal point\n const decimalPlaces = format.split('.')[1].match(/0/g).length;\n\n const noCommas = !format.includes(',');\n\n if (isPercent) {\n number = number * 100;\n }\n\n number = FIXED(number, decimalPlaces, noCommas);\n\n if (number.startsWith('-')) {\n number = number.replace('-', '');\n number = '-' + currencySymbol + number;\n } else {\n number = currencySymbol + number;\n }\n\n if (isPercent) {\n number = number + '%';\n }\n\n return number\n}\n\n/**\n * Combines the text from multiple ranges and/or strings.\n *\n * Category: Text\n * @param {*} delimiter A text string, either empty, or one or more characters enclosed by double quotes, or a reference to a valid text string. If a number is supplied, it will be treated as text.\n * @param {*} ignore_empty If TRUE, ignores empty values.\n * @param {*} args Text item to be joined. A text string, or array of strings, such as a range of values.\n * @returns\n */\nfunction TEXTJOIN(delimiter, ignore_empty, ...args) {\n if (typeof ignore_empty !== 'boolean') {\n ignore_empty = parseBool(ignore_empty);\n }\n\n if (arguments.length < 3) {\n return na\n }\n\n delimiter = delimiter !== null && delimiter !== undefined ? delimiter : '';\n\n let flatArgs = flatten(args);\n let textToJoin = ignore_empty ? flatArgs.filter((text) => text) : flatArgs;\n\n if (Array.isArray(delimiter)) {\n delimiter = flatten(delimiter);\n\n let chunks = textToJoin.map((item) => [item]);\n let index = 0;\n\n for (let i = 0; i < chunks.length - 1; i++) {\n chunks[i].push(delimiter[index]);\n index++;\n\n if (index === delimiter.length) {\n index = 0;\n }\n }\n\n textToJoin = flatten(chunks);\n\n return textToJoin.join('')\n }\n\n return textToJoin.join(delimiter)\n}\n\n/**\n * Removes spaces from text.\n *\n * Category: Text\n *\n * @param {*} text The text from which you want spaces removed.\n * @returns\n */\nfunction TRIM(text) {\n text = parseString(text);\n\n if (text instanceof Error) {\n return text\n }\n\n return text.replace(/\\s+/g, ' ').trim()\n}\n\nconst UNICHAR = CHAR;\n\nconst UNICODE = CODE;\n\n/**\n * Converts text to uppercase.\n *\n * Category: Text\n *\n * @param {*} text The text you want converted to uppercase. Text can be a reference or text string.\n * @returns\n */\nfunction UPPER(text) {\n text = parseString(text);\n\n if (text instanceof Error) {\n return text\n }\n\n return text.toUpperCase()\n}\n\n/**\n * Converts a text argument to a number.\n *\n * Category: Text\n *\n * @param {*} text The text enclosed in quotation marks or a reference to a value containing the text you want to convert.\n * @returns\n */\nfunction VALUE(text) {\n const anyError$1 = anyError(text);\n\n if (anyError$1) {\n return anyError$1\n }\n\n if (typeof text === 'number') {\n return text\n }\n\n if (!isDefined(text)) {\n text = '';\n }\n\n if (typeof text !== 'string') {\n return value\n }\n\n const isPercent = /(%)$/.test(text) || /^(%)/.test(text);\n text = text.replace(/^[^0-9-]{0,3}/, '');\n text = text.replace(/[^0-9]{0,3}$/, '');\n text = text.replace(/[ ,]/g, '');\n\n if (text === '') {\n return 0\n }\n\n let output = Number(text);\n\n if (isNaN(output)) {\n return value\n }\n\n output = output || 0;\n\n if (isPercent) {\n output = output * 0.01;\n }\n\n return output\n}\n\nfunction isValidBinaryNumber(number) {\n return /^[01]{1,10}$/.test(number)\n}\n\n/**\n * Returns the modified Bessel function In(x).\n *\n * Category: Engineering\n *\n * @param {*} x The value at which to evaluate the function.\n * @param {*} n The order of the Bessel function. If n is not an integer, it is truncated.\n * @returns\n */\nfunction BESSELI(x, n) {\n x = parseNumber(x);\n n = parseNumber(n);\n\n if (anyIsError(x, n)) {\n return value\n }\n\n return bessel.besseli(x, n)\n}\n\n/**\n * Returns the Bessel function Jn(x).\n *\n * Category: Engineering\n *\n * @param {*} x The value at which to evaluate the function.\n * @param {*} n The order of the Bessel function. If n is not an integer, it is truncated.\n * @returns\n */\nfunction BESSELJ(x, n) {\n x = parseNumber(x);\n n = parseNumber(n);\n\n if (anyIsError(x, n)) {\n return value\n }\n\n return bessel.besselj(x, n)\n}\n\n/**\n * Returns the modified Bessel function Kn(x).\n *\n * Category: Engineering\n *\n * @param {*} x The value at which to evaluate the function.\n * @param {*} n The order of the function. If n is not an integer, it is truncated.\n * @returns\n */\nfunction BESSELK(x, n) {\n x = parseNumber(x);\n n = parseNumber(n);\n\n if (anyIsError(x, n)) {\n return value\n }\n\n return bessel.besselk(x, n)\n}\n\n/**\n * Returns the Bessel function Yn(x).\n *\n * Category: Engineering\n *\n * @param {*} x The value at which to evaluate the function.\n * @param {*} n The order of the function. If n is not an integer, it is truncated.\n * @returns\n */\nfunction BESSELY(x, n) {\n x = parseNumber(x);\n n = parseNumber(n);\n\n if (anyIsError(x, n)) {\n return value\n }\n\n return bessel.bessely(x, n)\n}\n\n/**\n * Converts a binary number to decimal.\n *\n * Category: Engineering\n *\n * @param {*} number The binary number you want to convert. Number cannot contain more than 10 characters (10 bits). The most significant bit of number is the sign bit. The remaining 9 bits are magnitude bits. Negative numbers are represented using two's-complement notation.\n * @returns\n */\nfunction BIN2DEC(number) {\n // Return error if number is not binary or contains more than 10 characters (10 digits)\n if (!isValidBinaryNumber(number)) {\n return num\n }\n\n // Convert binary number to decimal\n const result = parseInt(number, 2);\n\n // Handle negative numbers\n const stringified = number.toString();\n\n if (stringified.length === 10 && stringified.substring(0, 1) === '1') {\n return parseInt(stringified.substring(1), 2) - 512\n } else {\n return result\n }\n}\n\n/**\n * Converts a binary number to hexadecimal.\n *\n * Category: Engineering\n *\n * @param {*} number The binary number you want to convert. Number cannot contain more than 10 characters (10 bits). The most significant bit of number is the sign bit. The remaining 9 bits are magnitude bits. Negative numbers are represented using two's-complement notation.\n * @param {*} places Optional. The number of characters to use. If places is omitted, BIN2HEX uses the minimum number of characters necessary. Places is useful for padding the return value with leading 0s (zeros).\n * @returns\n */\nfunction BIN2HEX(number, places) {\n // Return error if number is not binary or contains more than 10 characters (10 digits)\n if (!isValidBinaryNumber(number)) {\n return num\n }\n\n // Ignore places and return a 10-character hexadecimal number if number is negative\n const stringified = number.toString();\n\n if (stringified.length === 10 && stringified.substring(0, 1) === '1') {\n return (1099511627264 + parseInt(stringified.substring(1), 2)).toString(16)\n }\n\n // Convert binary number to hexadecimal\n const result = parseInt(number, 2).toString(16);\n\n // Return hexadecimal number using the minimum number of characters necessary if places is undefined\n if (places === undefined) {\n return result\n } else {\n // Return error if places is nonnumeric\n if (isNaN(places)) {\n return value\n }\n\n // Return error if places is negative\n if (places < 0) {\n return num\n }\n\n // Truncate places in case it is not an integer\n places = Math.floor(places);\n\n // Pad return value with leading 0s (zeros) if necessary (using Underscore.string)\n return places >= result.length ? REPT('0', places - result.length) + result : num\n }\n}\n\n/**\n * Converts a binary number to octal.\n *\n * Category: Engineering\n *\n * @param {*} number The binary number you want to convert. Number cannot contain more than 10 characters (10 bits). The most significant bit of number is the sign bit. The remaining 9 bits are magnitude bits. Negative numbers are represented using two's-complement notation.\n * @param {*} places Optional. The number of characters to use. If places is omitted, BIN2OCT uses the minimum number of characters necessary. Places is useful for padding the return value with leading 0s (zeros).\n * @returns\n */\nfunction BIN2OCT(number, places) {\n // Return error if number is not binary or contains more than 10 characters (10 digits)\n if (!isValidBinaryNumber(number)) {\n return num\n }\n\n // Ignore places and return a 10-character octal number if number is negative\n const stringified = number.toString();\n\n if (stringified.length === 10 && stringified.substring(0, 1) === '1') {\n return (1073741312 + parseInt(stringified.substring(1), 2)).toString(8)\n }\n\n // Convert binary number to octal\n const result = parseInt(number, 2).toString(8);\n\n // Return octal number using the minimum number of characters necessary if places is undefined\n if (places === undefined) {\n return result\n } else {\n // Return error if places is nonnumeric\n if (isNaN(places)) {\n return value\n }\n\n // Return error if places is negative\n if (places < 0) {\n return num\n }\n\n // Truncate places in case it is not an integer\n places = Math.floor(places);\n\n // Pad return value with leading 0s (zeros) if necessary (using Underscore.string)\n return places >= result.length ? REPT('0', places - result.length) + result : num\n }\n}\n\n/**\n * Returns a 'Bitwise And' of two numbers.\n *\n * Category: Engineering\n *\n * @param {*} number1 Must be in decimal form and greater than or equal to 0.\n * @param {*} number2 Must be in decimal form and greater than or equal to 0.\n * @returns\n */\nfunction BITAND(number1, number2) {\n // Return error if either number is a non-numeric value\n number1 = parseNumber(number1);\n number2 = parseNumber(number2);\n\n if (anyIsError(number1, number2)) {\n return value\n }\n\n // Return error if either number is less than 0\n if (number1 < 0 || number2 < 0) {\n return num\n }\n\n // Return error if either number is a non-integer\n if (Math.floor(number1) !== number1 || Math.floor(number2) !== number2) {\n return num\n }\n\n // Return error if either number is greater than (2^48)-1\n if (number1 > 281474976710655 || number2 > 281474976710655) {\n return num\n }\n\n // Return bitwise AND of two numbers\n return number1 & number2\n}\n\n/**\n * Returns a value number shifted left by shift_amount bits.\n *\n * Category: Engineering\n *\n * @param {*} number Number must be an integer greater than or equal to 0.\n * @param {*} shift_amount Shift_amount must be an integer.\n * @returns\n */\nfunction BITLSHIFT(number, shift_amount) {\n number = parseNumber(number);\n shift_amount = parseNumber(shift_amount);\n\n if (anyIsError(number, shift_amount)) {\n return value\n }\n\n // Return error if number is less than 0\n if (number < 0) {\n return num\n }\n\n // Return error if number is a non-integer\n if (Math.floor(number) !== number) {\n return num\n }\n\n // Return error if number is greater than (2^48)-1\n if (number > 281474976710655) {\n return num\n }\n\n // Return error if the absolute value of shift is greater than 53\n if (Math.abs(shift_amount) > 53) {\n return num\n }\n\n // Return number shifted by shift bits to the left or to the right if shift is negative\n return shift_amount >= 0 ? number << shift_amount : number >> -shift_amount\n}\n\n/**\n * Returns a bitwise OR of 2 numbers.\n *\n * Category: Engineering\n *\n * @param {*} number1 Must be in decimal form and greater than or equal to 0.\n * @param {*} number2 Must be in decimal form and greater than or equal to 0.\n * @returns\n */\nfunction BITOR(number1, number2) {\n number1 = parseNumber(number1);\n number2 = parseNumber(number2);\n\n if (anyIsError(number1, number2)) {\n return value\n }\n\n // Return error if either number is less than 0\n if (number1 < 0 || number2 < 0) {\n return num\n }\n\n // Return error if either number is a non-integer\n if (Math.floor(number1) !== number1 || Math.floor(number2) !== number2) {\n return num\n }\n\n // Return error if either number is greater than (2^48)-1\n if (number1 > 281474976710655 || number2 > 281474976710655) {\n return num\n }\n\n // Return bitwise OR of two numbers\n return number1 | number2\n}\n\n/**\n * Returns a value number shifted right by shift_amount bits.\n *\n * Category: Engineering\n *\n * @param {*} number Must be an integer greater than or equal to 0.\n * @param {*} shift_amount Must be an integer.\n * @returns\n */\nfunction BITRSHIFT(number, shift_amount) {\n number = parseNumber(number);\n shift_amount = parseNumber(shift_amount);\n\n if (anyIsError(number, shift_amount)) {\n return value\n }\n\n // Return error if number is less than 0\n if (number < 0) {\n return num\n }\n\n // Return error if number is a non-integer\n if (Math.floor(number) !== number) {\n return num\n }\n\n // Return error if number is greater than (2^48)-1\n if (number > 281474976710655) {\n return num\n }\n\n // Return error if the absolute value of shift is greater than 53\n if (Math.abs(shift_amount) > 53) {\n return num\n }\n\n // Return number shifted by shift bits to the right or to the left if shift is negative\n return shift_amount >= 0 ? number >> shift_amount : number << -shift_amount\n}\n\n/**\n * Returns a bitwise 'Exclusive Or' of two numbers.\n *\n * Category: Engineering\n *\n * @param {*} number1 Must be greater than or equal to 0.\n * @param {*} number2 Must be greater than or equal to 0.\n * @returns\n */\nfunction BITXOR(number1, number2) {\n number1 = parseNumber(number1);\n number2 = parseNumber(number2);\n\n if (anyIsError(number1, number2)) {\n return value\n }\n\n // Return error if either number is less than 0\n if (number1 < 0 || number2 < 0) {\n return num\n }\n\n // Return error if either number is a non-integer\n if (Math.floor(number1) !== number1 || Math.floor(number2) !== number2) {\n return num\n }\n\n // Return error if either number is greater than (2^48)-1\n if (number1 > 281474976710655 || number2 > 281474976710655) {\n return num\n }\n\n // Return bitwise XOR of two numbers\n return number1 ^ number2\n}\n\n/**\n * Converts real and imaginary coefficients into a complex number.\n *\n * Category: Engineering\n *\n * @param {*} real_num The real coefficient of the complex number.\n * @param {*} i_num The imaginary coefficient of the complex number.\n * @param {*} suffix Optional. The suffix for the imaginary component of the complex number. If omitted, suffix is assumed to be \"i\".\n * @returns\n */\nfunction COMPLEX(real_num, i_num, suffix) {\n real_num = parseNumber(real_num);\n i_num = parseNumber(i_num);\n\n if (anyIsError(real_num, i_num)) {\n return real_num\n }\n\n // Set suffix\n suffix = suffix === undefined ? 'i' : suffix;\n\n // Return error if suffix is neither \"i\" nor \"j\"\n if (suffix !== 'i' && suffix !== 'j') {\n return value\n }\n\n // Return complex number\n if (real_num === 0 && i_num === 0) {\n return 0\n } else if (real_num === 0) {\n return i_num === 1 ? suffix : i_num.toString() + suffix\n } else if (i_num === 0) {\n return real_num.toString()\n } else {\n const sign = i_num > 0 ? '+' : '';\n return real_num.toString() + sign + (i_num === 1 ? suffix : i_num.toString() + suffix)\n }\n}\n\n/**\n * Converts a number from one measurement system to another.\n *\n * Category: Engineering\n *\n * @param {*} number is the value in from_units to convert.\n * @param {*} from_unit is the units for number.\n * @param {*} to_unit is the units for the result. CONVERT accepts the following text values (in quotation marks) for from_unit and to_unit.\n * @returns\n */\nfunction CONVERT(number, from_unit, to_unit) {\n number = parseNumber(number);\n\n if (number instanceof Error) {\n return number\n }\n\n // List of units supported by CONVERT and units defined by the International System of Units\n // [Name, Symbol, Alternate symbols, Quantity, ISU, CONVERT, Conversion ratio]\n const units = [\n ['a.u. of action', '?', null, 'action', false, false, 1.05457168181818e-34],\n ['a.u. of charge', 'e', null, 'electric_charge', false, false, 1.60217653141414e-19],\n ['a.u. of energy', 'Eh', null, 'energy', false, false, 4.35974417757576e-18],\n ['a.u. of length', 'a?', null, 'length', false, false, 5.29177210818182e-11],\n ['a.u. of mass', 'm?', null, 'mass', false, false, 9.10938261616162e-31],\n ['a.u. of time', '?/Eh', null, 'time', false, false, 2.41888432650516e-17],\n ['admiralty knot', 'admkn', null, 'speed', false, true, 0.514773333],\n ['ampere', 'A', null, 'electric_current', true, false, 1],\n ['ampere per meter', 'A/m', null, 'magnetic_field_intensity', true, false, 1],\n ['ångström', 'Å', ['ang'], 'length', false, true, 1e-10],\n ['are', 'ar', null, 'area', false, true, 100],\n ['astronomical unit', 'ua', null, 'length', false, false, 1.49597870691667e-11],\n ['bar', 'bar', null, 'pressure', false, false, 100000],\n ['barn', 'b', null, 'area', false, false, 1e-28],\n ['becquerel', 'Bq', null, 'radioactivity', true, false, 1],\n ['bit', 'bit', ['b'], 'information', false, true, 1],\n ['btu', 'BTU', ['btu'], 'energy', false, true, 1055.05585262],\n ['byte', 'byte', null, 'information', false, true, 8],\n ['candela', 'cd', null, 'luminous_intensity', true, false, 1],\n ['candela per square metre', 'cd/m?', null, 'luminance', true, false, 1],\n ['coulomb', 'C', null, 'electric_charge', true, false, 1],\n ['cubic ångström', 'ang3', ['ang^3'], 'volume', false, true, 1e-30],\n ['cubic foot', 'ft3', ['ft^3'], 'volume', false, true, 0.028316846592],\n ['cubic inch', 'in3', ['in^3'], 'volume', false, true, 0.000016387064],\n ['cubic light-year', 'ly3', ['ly^3'], 'volume', false, true, 8.46786664623715e-47],\n ['cubic metre', 'm?', null, 'volume', true, true, 1],\n ['cubic mile', 'mi3', ['mi^3'], 'volume', false, true, 4168181825.44058],\n ['cubic nautical mile', 'Nmi3', ['Nmi^3'], 'volume', false, true, 6352182208],\n ['cubic Pica', 'Pica3', ['Picapt3', 'Pica^3', 'Picapt^3'], 'volume', false, true, 7.58660370370369e-8],\n ['cubic yard', 'yd3', ['yd^3'], 'volume', false, true, 0.764554857984],\n ['cup', 'cup', null, 'volume', false, true, 0.0002365882365],\n ['dalton', 'Da', ['u'], 'mass', false, false, 1.66053886282828e-27],\n ['day', 'd', ['day'], 'time', false, true, 86400],\n ['degree', '°', null, 'angle', false, false, 0.0174532925199433],\n ['degrees Rankine', 'Rank', null, 'temperature', false, true, 0.555555555555556],\n ['dyne', 'dyn', ['dy'], 'force', false, true, 0.00001],\n ['electronvolt', 'eV', ['ev'], 'energy', false, true, 1.60217656514141],\n ['ell', 'ell', null, 'length', false, true, 1.143],\n ['erg', 'erg', ['e'], 'energy', false, true, 1e-7],\n ['farad', 'F', null, 'electric_capacitance', true, false, 1],\n ['fluid ounce', 'oz', null, 'volume', false, true, 0.0000295735295625],\n ['foot', 'ft', null, 'length', false, true, 0.3048],\n ['foot-pound', 'flb', null, 'energy', false, true, 1.3558179483314],\n ['gal', 'Gal', null, 'acceleration', false, false, 0.01],\n ['gallon', 'gal', null, 'volume', false, true, 0.003785411784],\n ['gauss', 'G', ['ga'], 'magnetic_flux_density', false, true, 1],\n ['grain', 'grain', null, 'mass', false, true, 0.0000647989],\n ['gram', 'g', null, 'mass', false, true, 0.001],\n ['gray', 'Gy', null, 'absorbed_dose', true, false, 1],\n ['gross registered ton', 'GRT', ['regton'], 'volume', false, true, 2.8316846592],\n ['hectare', 'ha', null, 'area', false, true, 10000],\n ['henry', 'H', null, 'inductance', true, false, 1],\n ['hertz', 'Hz', null, 'frequency', true, false, 1],\n ['horsepower', 'HP', ['h'], 'power', false, true, 745.69987158227],\n ['horsepower-hour', 'HPh', ['hh', 'hph'], 'energy', false, true, 2684519.538],\n ['hour', 'h', ['hr'], 'time', false, true, 3600],\n ['imperial gallon (U.K.)', 'uk_gal', null, 'volume', false, true, 0.00454609],\n ['imperial hundredweight', 'lcwt', ['uk_cwt', 'hweight'], 'mass', false, true, 50.802345],\n ['imperial quart (U.K)', 'uk_qt', null, 'volume', false, true, 0.0011365225],\n ['imperial ton', 'brton', ['uk_ton', 'LTON'], 'mass', false, true, 1016.046909],\n ['inch', 'in', null, 'length', false, true, 0.0254],\n ['international acre', 'uk_acre', null, 'area', false, true, 4046.8564224],\n ['IT calorie', 'cal', null, 'energy', false, true, 4.1868],\n ['joule', 'J', null, 'energy', true, true, 1],\n ['katal', 'kat', null, 'catalytic_activity', true, false, 1],\n ['kelvin', 'K', ['kel'], 'temperature', true, true, 1],\n ['kilogram', 'kg', null, 'mass', true, true, 1],\n ['knot', 'kn', null, 'speed', false, true, 0.514444444444444],\n ['light-year', 'ly', null, 'length', false, true, 9460730472580800],\n ['litre', 'L', ['l', 'lt'], 'volume', false, true, 0.001],\n ['lumen', 'lm', null, 'luminous_flux', true, false, 1],\n ['lux', 'lx', null, 'illuminance', true, false, 1],\n ['maxwell', 'Mx', null, 'magnetic_flux', false, false, 1e-18],\n ['measurement ton', 'MTON', null, 'volume', false, true, 1.13267386368],\n ['meter per hour', 'm/h', ['m/hr'], 'speed', false, true, 0.00027777777777778],\n ['meter per second', 'm/s', ['m/sec'], 'speed', true, true, 1],\n ['meter per second squared', 'm?s??', null, 'acceleration', true, false, 1],\n ['parsec', 'pc', ['parsec'], 'length', false, true, 30856775814671900],\n ['meter squared per second', 'm?/s', null, 'kinematic_viscosity', true, false, 1],\n ['metre', 'm', null, 'length', true, true, 1],\n ['miles per hour', 'mph', null, 'speed', false, true, 0.44704],\n ['millimetre of mercury', 'mmHg', null, 'pressure', false, false, 133.322],\n ['minute', '?', null, 'angle', false, false, 0.000290888208665722],\n ['minute', 'min', ['mn'], 'time', false, true, 60],\n ['modern teaspoon', 'tspm', null, 'volume', false, true, 0.000005],\n ['mole', 'mol', null, 'amount_of_substance', true, false, 1],\n ['morgen', 'Morgen', null, 'area', false, true, 2500],\n ['n.u. of action', '?', null, 'action', false, false, 1.05457168181818e-34],\n ['n.u. of mass', 'm?', null, 'mass', false, false, 9.10938261616162e-31],\n ['n.u. of speed', 'c?', null, 'speed', false, false, 299792458],\n ['n.u. of time', '?/(me?c??)', null, 'time', false, false, 1.28808866778687e-21],\n ['nautical mile', 'M', ['Nmi'], 'length', false, true, 1852],\n ['newton', 'N', null, 'force', true, true, 1],\n ['œrsted', 'Oe ', null, 'magnetic_field_intensity', false, false, 79.5774715459477],\n ['ohm', 'Ω', null, 'electric_resistance', true, false, 1],\n ['ounce mass', 'ozm', null, 'mass', false, true, 0.028349523125],\n ['pascal', 'Pa', null, 'pressure', true, false, 1],\n ['pascal second', 'Pa?s', null, 'dynamic_viscosity', true, false, 1],\n ['pferdestärke', 'PS', null, 'power', false, true, 735.49875],\n ['phot', 'ph', null, 'illuminance', false, false, 0.0001],\n ['pica (1/6 inch)', 'pica', null, 'length', false, true, 0.00035277777777778],\n ['pica (1/72 inch)', 'Pica', ['Picapt'], 'length', false, true, 0.00423333333333333],\n ['poise', 'P', null, 'dynamic_viscosity', false, false, 0.1],\n ['pond', 'pond', null, 'force', false, true, 0.00980665],\n ['pound force', 'lbf', null, 'force', false, true, 4.4482216152605],\n ['pound mass', 'lbm', null, 'mass', false, true, 0.45359237],\n ['quart', 'qt', null, 'volume', false, true, 0.000946352946],\n ['radian', 'rad', null, 'angle', true, false, 1],\n ['second', '?', null, 'angle', false, false, 0.00000484813681109536],\n ['second', 's', ['sec'], 'time', true, true, 1],\n ['short hundredweight', 'cwt', ['shweight'], 'mass', false, true, 45.359237],\n ['siemens', 'S', null, 'electrical_conductance', true, false, 1],\n ['sievert', 'Sv', null, 'equivalent_dose', true, false, 1],\n ['slug', 'sg', null, 'mass', false, true, 14.59390294],\n ['square ångström', 'ang2', ['ang^2'], 'area', false, true, 1e-20],\n ['square foot', 'ft2', ['ft^2'], 'area', false, true, 0.09290304],\n ['square inch', 'in2', ['in^2'], 'area', false, true, 0.00064516],\n ['square light-year', 'ly2', ['ly^2'], 'area', false, true, 8.95054210748189e31],\n ['square meter', 'm?', null, 'area', true, true, 1],\n ['square mile', 'mi2', ['mi^2'], 'area', false, true, 2589988.110336],\n ['square nautical mile', 'Nmi2', ['Nmi^2'], 'area', false, true, 3429904],\n ['square Pica', 'Pica2', ['Picapt2', 'Pica^2', 'Picapt^2'], 'area', false, true, 0.00001792111111111],\n ['square yard', 'yd2', ['yd^2'], 'area', false, true, 0.83612736],\n ['statute mile', 'mi', null, 'length', false, true, 1609.344],\n ['steradian', 'sr', null, 'solid_angle', true, false, 1],\n ['stilb', 'sb', null, 'luminance', false, false, 0.0001],\n ['stokes', 'St', null, 'kinematic_viscosity', false, false, 0.0001],\n ['stone', 'stone', null, 'mass', false, true, 6.35029318],\n ['tablespoon', 'tbs', null, 'volume', false, true, 0.0000147868],\n ['teaspoon', 'tsp', null, 'volume', false, true, 0.00000492892],\n ['tesla', 'T', null, 'magnetic_flux_density', true, true, 1],\n ['thermodynamic calorie', 'c', null, 'energy', false, true, 4.184],\n ['ton', 'ton', null, 'mass', false, true, 907.18474],\n ['tonne', 't', null, 'mass', false, false, 1000],\n ['U.K. pint', 'uk_pt', null, 'volume', false, true, 0.00056826125],\n ['U.S. bushel', 'bushel', null, 'volume', false, true, 0.03523907],\n ['U.S. oil barrel', 'barrel', null, 'volume', false, true, 0.158987295],\n ['U.S. pint', 'pt', ['us_pt'], 'volume', false, true, 0.000473176473],\n ['U.S. survey mile', 'survey_mi', null, 'length', false, true, 1609.347219],\n ['U.S. survey/statute acre', 'us_acre', null, 'area', false, true, 4046.87261],\n ['volt', 'V', null, 'voltage', true, false, 1],\n ['watt', 'W', null, 'power', true, true, 1],\n ['watt-hour', 'Wh', ['wh'], 'energy', false, true, 3600],\n ['weber', 'Wb', null, 'magnetic_flux', true, false, 1],\n ['yard', 'yd', null, 'length', false, true, 0.9144],\n ['year', 'yr', null, 'time', false, true, 31557600]\n ];\n\n // Binary prefixes\n // [Name, Prefix power of 2 value, Previx value, Abbreviation, Derived from]\n const binary_prefixes = {\n Yi: ['yobi', 80, 1208925819614629174706176, 'Yi', 'yotta'],\n Zi: ['zebi', 70, 1180591620717411303424, 'Zi', 'zetta'],\n Ei: ['exbi', 60, 1152921504606846976, 'Ei', 'exa'],\n Pi: ['pebi', 50, 1125899906842624, 'Pi', 'peta'],\n Ti: ['tebi', 40, 1099511627776, 'Ti', 'tera'],\n Gi: ['gibi', 30, 1073741824, 'Gi', 'giga'],\n Mi: ['mebi', 20, 1048576, 'Mi', 'mega'],\n ki: ['kibi', 10, 1024, 'ki', 'kilo']\n };\n\n // Unit prefixes\n // [Name, Multiplier, Abbreviation]\n const unit_prefixes = {\n Y: ['yotta', 1e24, 'Y'],\n Z: ['zetta', 1e21, 'Z'],\n E: ['exa', 1e18, 'E'],\n P: ['peta', 1e15, 'P'],\n T: ['tera', 1e12, 'T'],\n G: ['giga', 1e9, 'G'],\n M: ['mega', 1e6, 'M'],\n k: ['kilo', 1e3, 'k'],\n h: ['hecto', 1e2, 'h'],\n e: ['dekao', 1e1, 'e'],\n d: ['deci', 1e-1, 'd'],\n c: ['centi', 1e-2, 'c'],\n m: ['milli', 1e-3, 'm'],\n u: ['micro', 1e-6, 'u'],\n n: ['nano', 1e-9, 'n'],\n p: ['pico', 1e-12, 'p'],\n f: ['femto', 1e-15, 'f'],\n a: ['atto', 1e-18, 'a'],\n z: ['zepto', 1e-21, 'z'],\n y: ['yocto', 1e-24, 'y']\n };\n\n // Initialize units and multipliers\n let from = null;\n let to = null;\n let base_from_unit = from_unit;\n let base_to_unit = to_unit;\n let from_multiplier = 1;\n let to_multiplier = 1;\n let alt;\n\n // Lookup from and to units\n for (let i = 0; i < units.length; i++) {\n alt = units[i][2] === null ? [] : units[i][2];\n\n if (units[i][1] === base_from_unit || alt.indexOf(base_from_unit) >= 0) {\n from = units[i];\n }\n\n if (units[i][1] === base_to_unit || alt.indexOf(base_to_unit) >= 0) {\n to = units[i];\n }\n }\n\n // Lookup from prefix\n if (from === null) {\n const from_binary_prefix = binary_prefixes[from_unit.substring(0, 2)];\n let from_unit_prefix = unit_prefixes[from_unit.substring(0, 1)];\n\n // Handle dekao unit prefix (only unit prefix with two characters)\n if (from_unit.substring(0, 2) === 'da') {\n from_unit_prefix = ['dekao', 1e1, 'da'];\n }\n\n // Handle binary prefixes first (so that 'Yi' is processed before 'Y')\n if (from_binary_prefix) {\n from_multiplier = from_binary_prefix[2];\n base_from_unit = from_unit.substring(2);\n } else if (from_unit_prefix) {\n from_multiplier = from_unit_prefix[1];\n base_from_unit = from_unit.substring(from_unit_prefix[2].length);\n }\n\n // Lookup from unit\n for (let j = 0; j < units.length; j++) {\n alt = units[j][2] === null ? [] : units[j][2];\n\n if (units[j][1] === base_from_unit || alt.indexOf(base_from_unit) >= 0) {\n from = units[j];\n }\n }\n }\n\n // Lookup to prefix\n if (to === null) {\n const to_binary_prefix = binary_prefixes[to_unit.substring(0, 2)];\n let to_unit_prefix = unit_prefixes[to_unit.substring(0, 1)];\n\n // Handle dekao unit prefix (only unit prefix with two characters)\n if (to_unit.substring(0, 2) === 'da') {\n to_unit_prefix = ['dekao', 1e1, 'da'];\n }\n\n // Handle binary prefixes first (so that 'Yi' is processed before 'Y')\n if (to_binary_prefix) {\n to_multiplier = to_binary_prefix[2];\n base_to_unit = to_unit.substring(2);\n } else if (to_unit_prefix) {\n to_multiplier = to_unit_prefix[1];\n base_to_unit = to_unit.substring(to_unit_prefix[2].length);\n }\n\n // Lookup to unit\n for (let k = 0; k < units.length; k++) {\n alt = units[k][2] === null ? [] : units[k][2];\n\n if (units[k][1] === base_to_unit || alt.indexOf(base_to_unit) >= 0) {\n to = units[k];\n }\n }\n }\n\n // Return error if a unit does not exist\n if (from === null || to === null) {\n return na\n }\n\n // Return error if units represent different quantities\n if (from[3] !== to[3]) {\n return na\n }\n\n // Return converted number\n return (number * from[6] * from_multiplier) / (to[6] * to_multiplier)\n}\n\n/**\n * Converts a decimal number to binary.\n *\n * Category: Engineering\n *\n * @param {*} number The decimal integer you want to convert. If number is negative, valid place values are ignored and DEC2BIN returns a 10-character (10-bit) binary number in which the most significant bit is the sign bit. The remaining 9 bits are magnitude bits. Negative numbers are represented using two's-complement notation.\n * @param {*} places Optional. The number of characters to use. If places is omitted, DEC2BIN uses the minimum number of characters necessary. Places is useful for padding the return value with leading 0s (zeros).\n * @returns\n */\nfunction DEC2BIN(number, places) {\n number = parseNumber(number);\n\n if (number instanceof Error) {\n return number\n }\n\n // Return error if number is not decimal, is lower than -512, or is greater than 511\n if (!/^-?[0-9]{1,3}$/.test(number) || number < -512 || number > 511) {\n return num\n }\n\n // Ignore places and return a 10-character binary number if number is negative\n if (number < 0) {\n return '1' + REPT('0', 9 - (512 + number).toString(2).length) + (512 + number).toString(2)\n }\n\n // Convert decimal number to binary\n const result = parseInt(number, 10).toString(2);\n\n // Return binary number using the minimum number of characters necessary if places is undefined\n if (typeof places === 'undefined') {\n return result\n } else {\n // Return error if places is nonnumeric\n if (isNaN(places)) {\n return value\n }\n\n // Return error if places is negative\n if (places < 0) {\n return num\n }\n\n // Truncate places in case it is not an integer\n places = Math.floor(places);\n\n // Pad return value with leading 0s (zeros) if necessary (using Underscore.string)\n return places >= result.length ? REPT('0', places - result.length) + result : num\n }\n}\n\n/**\n * Converts a decimal number to hexadecimal.\n *\n * Category: Engineering\n *\n * @param {*} number The decimal integer you want to convert. If number is negative, places is ignored and DEC2HEX returns a 10-character (40-bit) hexadecimal number in which the most significant bit is the sign bit. The remaining 39 bits are magnitude bits. Negative numbers are represented using two's-complement notation.\n * @param {*} places Optional. The number of characters to use. If places is omitted, DEC2HEX uses the minimum number of characters necessary. Places is useful for padding the return value with leading 0s (zeros).\n * @returns\n */\nfunction DEC2HEX(number, places) {\n number = parseNumber(number);\n\n if (number instanceof Error) {\n return number\n }\n\n // Return error if number is not decimal, is lower than -549755813888, or is greater than 549755813887\n if (!/^-?[0-9]{1,12}$/.test(number) || number < -549755813888 || number > 549755813887) {\n return num\n }\n\n // Ignore places and return a 10-character hexadecimal number if number is negative\n if (number < 0) {\n return (1099511627776 + number).toString(16)\n }\n\n // Convert decimal number to hexadecimal\n const result = parseInt(number, 10).toString(16);\n\n // Return hexadecimal number using the minimum number of characters necessary if places is undefined\n if (typeof places === 'undefined') {\n return result\n } else {\n // Return error if places is nonnumeric\n if (isNaN(places)) {\n return value\n }\n\n // Return error if places is negative\n if (places < 0) {\n return num\n }\n\n // Truncate places in case it is not an integer\n places = Math.floor(places);\n\n // Pad return value with leading 0s (zeros) if necessary (using Underscore.string)\n return places >= result.length ? REPT('0', places - result.length) + result : num\n }\n}\n\n/**\n * Converts a decimal number to octal.\n *\n * Category: Engineering\n *\n * @param {*} number The decimal integer you want to convert. If number is negative, places is ignored and DEC2OCT returns a 10-character (30-bit) octal number in which the most significant bit is the sign bit. The remaining 29 bits are magnitude bits. Negative numbers are represented using two's-complement notation.\n * @param {*} places Optional. The number of characters to use. If places is omitted, DEC2OCT uses the minimum number of characters necessary. Places is useful for padding the return value with leading 0s (zeros).\n * @returns\n */\nfunction DEC2OCT(number, places) {\n number = parseNumber(number);\n\n if (number instanceof Error) {\n return number\n }\n\n // Return error if number is not decimal, is lower than -549755813888, or is greater than 549755813887\n if (!/^-?[0-9]{1,9}$/.test(number) || number < -536870912 || number > 536870911) {\n return num\n }\n\n // Ignore places and return a 10-character octal number if number is negative\n if (number < 0) {\n return (1073741824 + number).toString(8)\n }\n\n // Convert decimal number to octal\n const result = parseInt(number, 10).toString(8);\n\n // Return octal number using the minimum number of characters necessary if places is undefined\n if (typeof places === 'undefined') {\n return result\n } else {\n // Return error if places is nonnumeric\n if (isNaN(places)) {\n return value\n }\n\n // Return error if places is negative\n if (places < 0) {\n return num\n }\n\n // Truncate places in case it is not an integer\n places = Math.floor(places);\n\n // Pad return value with leading 0s (zeros) if necessary (using Underscore.string)\n return places >= result.length ? REPT('0', places - result.length) + result : num\n }\n}\n\n/**\n * Tests whether two values are equal.\n *\n * Category: Engineering\n *\n * @param {*} number1 The first number.\n * @param {*} number2 Optional. The second number. If omitted, number2 is assumed to be zero.\n * @returns\n */\nfunction DELTA(number1, number2) {\n // Set number2 to zero if undefined\n number2 = number2 === undefined ? 0 : number2;\n number1 = parseNumber(number1);\n number2 = parseNumber(number2);\n\n if (anyIsError(number1, number2)) {\n return value\n }\n\n // Return delta\n return number1 === number2 ? 1 : 0\n}\n\n// TODO: why is upper_bound not used ? The excel documentation has no examples with upper_bound\n/**\n * Returns the error function.\n *\n * Category: Engineering\n *\n * @param {*} lower_limit The lower bound for integrating ERF.\n * @param {*} upper_limit Optional. The upper bound for integrating ERF. If omitted, ERF integrates between zero and lower_limit.\n * @returns\n */\nfunction ERF(lower_limit, upper_limit) {\n // Set number2 to zero if undefined\n upper_limit = upper_limit === undefined ? 0 : upper_limit;\n\n lower_limit = parseNumber(lower_limit);\n upper_limit = parseNumber(upper_limit);\n\n if (anyIsError(lower_limit, upper_limit)) {\n return value\n }\n\n return jStat.erf(lower_limit)\n}\n\n// TODO\n\n/**\n * -- Not implemented --\n *\n * Returns the error function.\n *\n * Category: Engineering\n *\n * @param {*} x The lower bound for integrating ERF.PRECISE.\n * @returns\n */\nERF.PRECISE = () => {\n throw new Error('ERF.PRECISE is not implemented')\n};\n\n/**\n * Returns the complementary error function.\n *\n * Category: Engineering\n *\n * @param {*} x The lower bound for integrating ERFC.\n * @returns\n */\nfunction ERFC(x) {\n // Return error if x is not a number\n if (isNaN(x)) {\n return value\n }\n\n return jStat.erfc(x)\n}\n\n// TODO\n\n/**\n * -- Not implemented --\n *\n * Returns the complementary ERF function integrated between x and infinity.\n *\n * Category: Engineering\n *\n * @param {*} x The lower bound for integrating ERFC.PRECISE.\n * @returns\n */\nERFC.PRECISE = () => {\n throw new Error('ERFC.PRECISE is not implemented')\n};\n\n/**\n * Tests whether a number is greater than a threshold value.\n *\n * Category: Engineering\n *\n * @param {*} number The value to test against step.\n * @param {*} step Optional. The threshold value. If you omit a value for step, GESTEP uses zero.\n * @returns\n */\nfunction GESTEP(number, step) {\n step = step || 0;\n number = parseNumber(number);\n\n if (anyIsError(step, number)) {\n return number\n }\n\n // Return delta\n return number >= step ? 1 : 0\n}\n\n/**\n * Converts a hexadecimal number to binary.\n *\n * Category: Engineering\n *\n * @param {*} number The hexadecimal number you want to convert. Number cannot contain more than 10 characters. The most significant bit of number is the sign bit (40th bit from the right). The remaining 9 bits are magnitude bits. Negative numbers are represented using two's-complement notation.\n * @param {*} places Optional. The number of characters to use. If places is omitted, HEX2BIN uses the minimum number of characters necessary. Places is useful for padding the return value with leading 0s (zeros).\n * @returns\n */\nfunction HEX2BIN(number, places) {\n // Return error if number is not hexadecimal or contains more than ten characters (10 digits)\n if (!/^[0-9A-Fa-f]{1,10}$/.test(number)) {\n return num\n }\n\n // Check if number is negative\n const negative = !!(number.length === 10 && number.substring(0, 1).toLowerCase() === 'f');\n\n // Convert hexadecimal number to decimal\n const decimal = negative ? parseInt(number, 16) - 1099511627776 : parseInt(number, 16);\n\n // Return error if number is lower than -512 or greater than 511\n if (decimal < -512 || decimal > 511) {\n return num\n }\n\n // Ignore places and return a 10-character binary number if number is negative\n if (negative) {\n return '1' + REPT('0', 9 - (512 + decimal).toString(2).length) + (512 + decimal).toString(2)\n }\n\n // Convert decimal number to binary\n const result = decimal.toString(2);\n\n // Return binary number using the minimum number of characters necessary if places is undefined\n if (places === undefined) {\n return result\n } else {\n // Return error if places is nonnumeric\n if (isNaN(places)) {\n return value\n }\n\n // Return error if places is negative\n if (places < 0) {\n return num\n }\n\n // Truncate places in case it is not an integer\n places = Math.floor(places);\n\n // Pad return value with leading 0s (zeros) if necessary (using Underscore.string)\n return places >= result.length ? REPT('0', places - result.length) + result : num\n }\n}\n\n/**\n * Converts a hexadecimal number to decimal.\n *\n * Category: Engineering\n *\n * @param {*} number The hexadecimal number you want to convert. Number cannot contain more than 10 characters (40 bits). The most significant bit of number is the sign bit. The remaining 39 bits are magnitude bits. Negative numbers are represented using two's-complement notation.\n * @returns\n */\nfunction HEX2DEC(number) {\n // Return error if number is not hexadecimal or contains more than ten characters (10 digits)\n if (!/^[0-9A-Fa-f]{1,10}$/.test(number)) {\n return num\n }\n\n // Convert hexadecimal number to decimal\n const decimal = parseInt(number, 16);\n\n // Return decimal number\n return decimal >= 549755813888 ? decimal - 1099511627776 : decimal\n}\n\n/**\n * Converts a hexadecimal number to octal.\n *\n * Category: Engineering\n *\n * @param {*} number The hexadecimal number you want to convert. Number cannot contain more than 10 characters. The most significant bit of number is the sign bit. The remaining 39 bits are magnitude bits. Negative numbers are represented using two's-complement notation.\n * @param {*} places Optional. The number of characters to use. If places is omitted, HEX2OCT uses the minimum number of characters necessary. Places is useful for padding the return value with leading 0s (zeros).\n * @returns\n */\nfunction HEX2OCT(number, places) {\n // Return error if number is not hexadecimal or contains more than ten characters (10 digits)\n if (!/^[0-9A-Fa-f]{1,10}$/.test(number)) {\n return num\n }\n\n // Convert hexadecimal number to decimal\n const decimal = parseInt(number, 16);\n\n // Return error if number is positive and greater than 0x1fffffff (536870911)\n if (decimal > 536870911 && decimal < 1098974756864) {\n return num\n }\n\n // Ignore places and return a 10-character octal number if number is negative\n if (decimal >= 1098974756864) {\n return (decimal - 1098437885952).toString(8)\n }\n\n // Convert decimal number to octal\n const result = decimal.toString(8);\n\n // Return octal number using the minimum number of characters necessary if places is undefined\n if (places === undefined) {\n return result\n } else {\n // Return error if places is nonnumeric\n if (isNaN(places)) {\n return value\n }\n\n // Return error if places is negative\n if (places < 0) {\n return num\n }\n\n // Truncate places in case it is not an integer\n places = Math.floor(places);\n\n // Pad return value with leading 0s (zeros) if necessary (using Underscore.string)\n return places >= result.length ? REPT('0', places - result.length) + result : num\n }\n}\n\n/**\n * Returns the absolute value (modulus) of a complex number.\n *\n * Category: Engineering\n *\n * @param {*} inumber A complex number for which you want the absolute value.\n * @returns\n */\nfunction IMABS(inumber) {\n // Lookup real and imaginary coefficients using exports.js [http://formulajs.org]\n const x = IMREAL(inumber);\n const y = IMAGINARY(inumber);\n\n // Return error if either coefficient is not a number\n if (anyIsError(x, y)) {\n return value\n }\n\n // Return absolute value of complex number\n return Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2))\n}\n\n/**\n * Returns the imaginary coefficient of a complex number.\n *\n * Category: Engineering\n *\n * @param {*} inumber A complex number for which you want the imaginary coefficient.\n * @returns\n */\nfunction IMAGINARY(inumber) {\n if (inumber === undefined || inumber === true || inumber === false) {\n return value\n }\n\n // Return 0 if inumber is equal to 0\n if (inumber === 0 || inumber === '0') {\n return 0\n }\n\n // Handle special cases\n if (['i', 'j'].indexOf(inumber) >= 0) {\n return 1\n }\n\n // Force string type\n inumber = inumber + '';\n\n // Normalize imaginary coefficient\n inumber = inumber.replace('+i', '+1i').replace('-i', '-1i').replace('+j', '+1j').replace('-j', '-1j');\n\n // Lookup sign\n let plus = inumber.indexOf('+');\n let minus = inumber.indexOf('-');\n\n if (plus === 0) {\n plus = inumber.indexOf('+', 1);\n }\n\n if (minus === 0) {\n minus = inumber.indexOf('-', 1);\n }\n\n // Lookup imaginary unit\n const last = inumber.substring(inumber.length - 1, inumber.length);\n const unit = last === 'i' || last === 'j';\n\n if (plus >= 0 || minus >= 0) {\n // Return error if imaginary unit is neither i nor j\n if (!unit) {\n return num\n }\n\n // Return imaginary coefficient of complex number\n if (plus >= 0) {\n return isNaN(inumber.substring(0, plus)) || isNaN(inumber.substring(plus + 1, inumber.length - 1))\n ? num\n : Number(inumber.substring(plus + 1, inumber.length - 1))\n } else {\n return isNaN(inumber.substring(0, minus)) || isNaN(inumber.substring(minus + 1, inumber.length - 1))\n ? num\n : -Number(inumber.substring(minus + 1, inumber.length - 1))\n }\n } else {\n if (unit) {\n return isNaN(inumber.substring(0, inumber.length - 1)) ? num : inumber.substring(0, inumber.length - 1)\n } else {\n return isNaN(inumber) ? num : 0\n }\n }\n}\n\n/**\n * Returns the argument theta, an angle expressed in radians.\n *\n * Category: Engineering\n *\n * @param {*} inumber A complex number for which you want the argument .\n * @returns\n */\nfunction IMARGUMENT(inumber) {\n // Lookup real and imaginary coefficients using exports.js [http://formulajs.org]\n const x = IMREAL(inumber);\n const y = IMAGINARY(inumber);\n\n // Return error if either coefficient is not a number\n if (anyIsError(x, y)) {\n return value\n }\n\n // Return error if inumber is equal to zero\n if (x === 0 && y === 0) {\n return div0\n }\n\n // Return PI/2 if x is equal to zero and y is positive\n if (x === 0 && y > 0) {\n return Math.PI / 2\n }\n\n // Return -PI/2 if x is equal to zero and y is negative\n if (x === 0 && y < 0) {\n return -Math.PI / 2\n }\n\n // Return zero if x is negative and y is equal to zero\n if (y === 0 && x > 0) {\n return 0\n }\n\n // Return zero if x is negative and y is equal to zero\n if (y === 0 && x < 0) {\n return -Math.PI\n }\n\n // Return argument of complex number\n if (x > 0) {\n return Math.atan(y / x)\n } else if (x < 0 && y >= 0) {\n return Math.atan(y / x) + Math.PI\n } else {\n return Math.atan(y / x) - Math.PI\n }\n}\n\n/**\n * Returns the complex conjugate of a complex number.\n *\n * Category: Engineering\n *\n * @param {*} inumber A complex number for which you want the conjugate.\n * @returns\n */\nfunction IMCONJUGATE(inumber) {\n // Lookup real and imaginary coefficients using exports.js [http://formulajs.org]\n const x = IMREAL(inumber);\n const y = IMAGINARY(inumber);\n\n if (anyIsError(x, y)) {\n return value\n }\n\n // Lookup imaginary unit\n let unit = inumber.substring(inumber.length - 1);\n unit = unit === 'i' || unit === 'j' ? unit : 'i';\n\n // Return conjugate of complex number\n return y !== 0 ? COMPLEX(x, -y, unit) : inumber\n}\n\n/**\n * Returns the cosine of a complex number.\n *\n * Category: Engineering\n *\n * @param {*} inumber A complex number for which you want the cosine.\n * @returns\n */\nfunction IMCOS(inumber) {\n // Lookup real and imaginary coefficients using exports.js [http://formulajs.org]\n const x = IMREAL(inumber);\n const y = IMAGINARY(inumber);\n\n if (anyIsError(x, y)) {\n return value\n }\n\n // Lookup imaginary unit\n let unit = inumber.substring(inumber.length - 1);\n unit = unit === 'i' || unit === 'j' ? unit : 'i';\n\n // Return cosine of complex number\n return COMPLEX(\n (Math.cos(x) * (Math.exp(y) + Math.exp(-y))) / 2,\n (-Math.sin(x) * (Math.exp(y) - Math.exp(-y))) / 2,\n unit\n )\n}\n\n/**\n * Returns the hyperbolic cosine of a complex number.\n *\n * Category: Engineering\n *\n * @param {*} inumber A complex number for which you want the hyperbolic cosine.\n * @returns\n */\nfunction IMCOSH(inumber) {\n // Lookup real and imaginary coefficients using exports.js [http://formulajs.org]\n const x = IMREAL(inumber);\n const y = IMAGINARY(inumber);\n\n if (anyIsError(x, y)) {\n return value\n }\n\n // Lookup imaginary unit\n let unit = inumber.substring(inumber.length - 1);\n unit = unit === 'i' || unit === 'j' ? unit : 'i';\n\n // Return hyperbolic cosine of complex number\n return COMPLEX(\n (Math.cos(y) * (Math.exp(x) + Math.exp(-x))) / 2,\n (Math.sin(y) * (Math.exp(x) - Math.exp(-x))) / 2,\n unit\n )\n}\n\n/**\n * Returns the cotangent of a complex number.\n *\n * Category: Engineering\n *\n * @param {*} inumber A complex number for which you want the cotangent.\n * @returns\n */\nfunction IMCOT(inumber) {\n // Lookup real and imaginary coefficients using Formula.js [http://formulajs.org]\n const x = IMREAL(inumber);\n const y = IMAGINARY(inumber);\n\n if (anyIsError(x, y)) {\n return value\n }\n\n // Return cotangent of complex number\n return IMDIV(IMCOS(inumber), IMSIN(inumber))\n}\n\n/**\n * Returns the quotient of two complex numbers.\n *\n * Category: Engineering\n *\n * @param {*} inumber1 The complex numerator or dividend.\n * @param {*} inumber2 The complex denominator or divisor.\n * @returns\n */\nfunction IMDIV(inumber1, inumber2) {\n // Lookup real and imaginary coefficients using Formula.js [http://formulajs.org]\n const a = IMREAL(inumber1);\n const b = IMAGINARY(inumber1);\n const c = IMREAL(inumber2);\n const d = IMAGINARY(inumber2);\n\n if (anyIsError(a, b, c, d)) {\n return value\n }\n\n // Lookup imaginary unit\n const unit1 = inumber1.substring(inumber1.length - 1);\n const unit2 = inumber2.substring(inumber2.length - 1);\n let unit = 'i';\n\n if (unit1 === 'j') {\n unit = 'j';\n } else if (unit2 === 'j') {\n unit = 'j';\n }\n\n // Return error if inumber2 is null\n if (c === 0 && d === 0) {\n return num\n }\n\n // Return exponential of complex number\n const den = c * c + d * d;\n return COMPLEX((a * c + b * d) / den, (b * c - a * d) / den, unit)\n}\n\n/**\n * Returns the exponential of a complex number.\n *\n * Category: Engineering\n *\n * @param {*} inumber A complex number for which you want the exponential.\n * @returns\n */\nfunction IMEXP(inumber) {\n // Lookup real and imaginary coefficients using Formula.js [http://formulajs.org]\n const x = IMREAL(inumber);\n const y = IMAGINARY(inumber);\n\n if (anyIsError(x, y)) {\n return value\n }\n\n // Lookup imaginary unit\n let unit = inumber.substring(inumber.length - 1);\n unit = unit === 'i' || unit === 'j' ? unit : 'i';\n\n // Return exponential of complex number\n const e = Math.exp(x);\n return COMPLEX(e * Math.cos(y), e * Math.sin(y), unit)\n}\n\n/**\n * Returns the natural logarithm of a complex number.\n *\n * Category: Engineering\n *\n * @param {*} inumber A complex number for which you want the natural logarithm.\n * @returns\n */\nfunction IMLN(inumber) {\n // Lookup real and imaginary coefficients using Formula.js [http://formulajs.org]\n const x = IMREAL(inumber);\n const y = IMAGINARY(inumber);\n\n if (anyIsError(x, y)) {\n return value\n }\n\n // Lookup imaginary unit\n let unit = inumber.substring(inumber.length - 1);\n unit = unit === 'i' || unit === 'j' ? unit : 'i';\n\n // Return exponential of complex number\n return COMPLEX(Math.log(Math.sqrt(x * x + y * y)), Math.atan(y / x), unit)\n}\n\n/**\n * Returns the base-10 logarithm of a complex number.\n *\n * Category: Engineering\n *\n * @param {*} inumber A complex number for which you want the common logarithm.\n * @returns\n */\nfunction IMLOG10(inumber) {\n // Lookup real and imaginary coefficients using Formula.js [http://formulajs.org]\n const x = IMREAL(inumber);\n const y = IMAGINARY(inumber);\n\n if (anyIsError(x, y)) {\n return value\n }\n\n // Lookup imaginary unit\n let unit = inumber.substring(inumber.length - 1);\n unit = unit === 'i' || unit === 'j' ? unit : 'i';\n\n // Return exponential of complex number\n return COMPLEX(Math.log(Math.sqrt(x * x + y * y)) / Math.log(10), Math.atan(y / x) / Math.log(10), unit)\n}\n\n/**\n * Returns the base-2 logarithm of a complex number.\n *\n * Category: Engineering\n *\n * @param {*} inumber A complex number for which you want the base-2 logarithm.\n * @returns\n */\nfunction IMLOG2(inumber) {\n // Lookup real and imaginary coefficients using Formula.js [http://formulajs.org]\n const x = IMREAL(inumber);\n const y = IMAGINARY(inumber);\n\n if (anyIsError(x, y)) {\n return value\n }\n\n // Lookup imaginary unit\n let unit = inumber.substring(inumber.length - 1);\n unit = unit === 'i' || unit === 'j' ? unit : 'i';\n\n // Return exponential of complex number\n return COMPLEX(Math.log(Math.sqrt(x * x + y * y)) / Math.log(2), Math.atan(y / x) / Math.log(2), unit)\n}\n\n/**\n * Returns a complex number raised to an integer power.\n *\n * Category: Engineering\n *\n * @param {*} inumber A complex number you want to raise to a power.\n * @param {*} number The power to which you want to raise the complex number.\n * @returns\n */\nfunction IMPOWER(inumber, number) {\n number = parseNumber(number);\n const x = IMREAL(inumber);\n const y = IMAGINARY(inumber);\n\n if (anyIsError(number, x, y)) {\n return value\n }\n\n // Lookup imaginary unit\n let unit = inumber.substring(inumber.length - 1);\n unit = unit === 'i' || unit === 'j' ? unit : 'i';\n\n // Calculate power of modulus\n const p = Math.pow(IMABS(inumber), number);\n\n // Calculate argument\n const t = IMARGUMENT(inumber);\n\n // Return exponential of complex number\n return COMPLEX(p * Math.cos(number * t), p * Math.sin(number * t), unit)\n}\n\n/**\n * Returns the product of complex numbers.\n *\n * Category: Engineering\n *\n * @param {*} args inumber1, [inumber2], … Inumber1 is required, subsequent inumbers are not. 1 to 255 complex numbers to multiply.\n * @returns\n */\nfunction IMPRODUCT() {\n // Initialize result\n let result = arguments[0];\n\n if (!arguments.length) {\n return value\n }\n\n // Loop on all numbers\n for (let i = 1; i < arguments.length; i++) {\n // Lookup coefficients of two complex numbers\n const a = IMREAL(result);\n const b = IMAGINARY(result);\n const c = IMREAL(arguments[i]);\n const d = IMAGINARY(arguments[i]);\n\n if (anyIsError(a, b, c, d)) {\n return value\n }\n\n // Complute product of two complex numbers\n result = COMPLEX(a * c - b * d, a * d + b * c);\n }\n\n // Return product of complex numbers\n return result\n}\n\n/**\n * Returns the real coefficient of a complex number.\n *\n * Category: Engineering\n *\n * @param {*} inumber A complex number for which you want the real coefficient.\n * @returns\n */\nfunction IMREAL(inumber) {\n if (inumber === undefined || inumber === true || inumber === false) {\n return value\n }\n\n // Return 0 if inumber is equal to 0\n if (inumber === 0 || inumber === '0') {\n return 0\n }\n\n // Handle special cases\n if (['i', '+i', '1i', '+1i', '-i', '-1i', 'j', '+j', '1j', '+1j', '-j', '-1j'].indexOf(inumber) >= 0) {\n return 0\n }\n\n // Force String type\n inumber = inumber + '';\n\n // Lookup sign\n let plus = inumber.indexOf('+');\n let minus = inumber.indexOf('-');\n\n if (plus === 0) {\n plus = inumber.indexOf('+', 1);\n }\n\n if (minus === 0) {\n minus = inumber.indexOf('-', 1);\n }\n\n // Lookup imaginary unit\n const last = inumber.substring(inumber.length - 1, inumber.length);\n const unit = last === 'i' || last === 'j';\n\n if (plus >= 0 || minus >= 0) {\n // Return error if imaginary unit is neither i nor j\n if (!unit) {\n return num\n }\n\n // Return real coefficient of complex number\n if (plus >= 0) {\n return isNaN(inumber.substring(0, plus)) || isNaN(inumber.substring(plus + 1, inumber.length - 1))\n ? num\n : Number(inumber.substring(0, plus))\n } else {\n return isNaN(inumber.substring(0, minus)) || isNaN(inumber.substring(minus + 1, inumber.length - 1))\n ? num\n : Number(inumber.substring(0, minus))\n }\n } else {\n if (unit) {\n return isNaN(inumber.substring(0, inumber.length - 1)) ? num : 0\n } else {\n return isNaN(inumber) ? num : inumber\n }\n }\n}\n\n/**\n * Returns the secant of a complex number.\n *\n * Category: Engineering\n *\n * @param {*} inumber A complex number for which you want the secant.\n * @returns\n */\nfunction IMSEC(inumber) {\n // Return error if inumber is a logical value\n if (inumber === true || inumber === false) {\n return value\n }\n\n // Lookup real and imaginary coefficients using Formula.js [http://formulajs.org]\n const x = IMREAL(inumber);\n const y = IMAGINARY(inumber);\n\n if (anyIsError(x, y)) {\n return value\n }\n\n // Return secant of complex number\n return IMDIV('1', IMCOS(inumber))\n}\n\n/**\n * Returns the hyperbolic secant of a complex number.\n *\n * Category: Engineering\n *\n * @param {*} inumber A complex number for which you want the hyperbolic secant.\n * @returns\n */\nfunction IMSECH(inumber) {\n // Lookup real and imaginary coefficients using Formula.js [http://formulajs.org]\n const x = IMREAL(inumber);\n const y = IMAGINARY(inumber);\n\n if (anyIsError(x, y)) {\n return value\n }\n\n // Return hyperbolic secant of complex number\n return IMDIV('1', IMCOSH(inumber))\n}\n\n/**\n * Returns the sine of a complex number.\n *\n * Category: Engineering\n *\n * @param {*} inumber A complex number for which you want the sine.\n * @returns\n */\nfunction IMSIN(inumber) {\n // Lookup real and imaginary coefficients using Formula.js [http://formulajs.org]\n const x = IMREAL(inumber);\n const y = IMAGINARY(inumber);\n\n if (anyIsError(x, y)) {\n return value\n }\n\n // Lookup imaginary unit\n let unit = inumber.substring(inumber.length - 1);\n unit = unit === 'i' || unit === 'j' ? unit : 'i';\n\n // Return sine of complex number\n return COMPLEX(\n (Math.sin(x) * (Math.exp(y) + Math.exp(-y))) / 2,\n (Math.cos(x) * (Math.exp(y) - Math.exp(-y))) / 2,\n unit\n )\n}\n\n/**\n * Returns the hyperbolic sine of a complex number.\n *\n * Category: Engineering\n *\n * @param {*} inumber A complex number for which you want the hyperbolic sine.\n * @returns\n */\nfunction IMSINH(inumber) {\n // Lookup real and imaginary coefficients using Formula.js [http://formulajs.org]\n const x = IMREAL(inumber);\n const y = IMAGINARY(inumber);\n\n if (anyIsError(x, y)) {\n return value\n }\n\n // Lookup imaginary unit\n let unit = inumber.substring(inumber.length - 1);\n unit = unit === 'i' || unit === 'j' ? unit : 'i';\n\n // Return hyperbolic sine of complex number\n return COMPLEX(\n (Math.cos(y) * (Math.exp(x) - Math.exp(-x))) / 2,\n (Math.sin(y) * (Math.exp(x) + Math.exp(-x))) / 2,\n unit\n )\n}\n\n/**\n * Returns the square root of a complex number.\n *\n * Category: Engineering\n *\n * @param {*} inumber A complex number for which you want the square root.\n * @returns\n */\nfunction IMSQRT(inumber) {\n // Lookup real and imaginary coefficients using Formula.js [http://formulajs.org]\n const x = IMREAL(inumber);\n const y = IMAGINARY(inumber);\n\n if (anyIsError(x, y)) {\n return value\n }\n\n // Lookup imaginary unit\n let unit = inumber.substring(inumber.length - 1);\n unit = unit === 'i' || unit === 'j' ? unit : 'i';\n\n // Calculate power of modulus\n const s = Math.sqrt(IMABS(inumber));\n\n // Calculate argument\n const t = IMARGUMENT(inumber);\n\n // Return exponential of complex number\n return COMPLEX(s * Math.cos(t / 2), s * Math.sin(t / 2), unit)\n}\n\n/**\n * Returns the cosecant of a complex number.\n *\n * Category: Engineering\n *\n * @param {*} inumber A complex number for which you want the cosecant.\n * @returns\n */\nfunction IMCSC(inumber) {\n // Return error if inumber is a logical value\n if (inumber === true || inumber === false) {\n return value\n }\n\n // Lookup real and imaginary coefficients using Formula.js [http://formulajs.org]\n const x = IMREAL(inumber);\n const y = IMAGINARY(inumber);\n\n // Return error if either coefficient is not a number\n if (anyIsError(x, y)) {\n return num\n }\n\n // Return cosecant of complex number\n return IMDIV('1', IMSIN(inumber))\n}\n\n/**\n * Returns the hyperbolic cosecant of a complex number.\n *\n * Category: Engineering\n *\n * @param {*} inumber A complex number for which you want the hyperbolic cosecant.\n * @returns\n */\nfunction IMCSCH(inumber) {\n // Return error if inumber is a logical value\n if (inumber === true || inumber === false) {\n return value\n }\n\n // Lookup real and imaginary coefficients using Formula.js [http://formulajs.org]\n const x = IMREAL(inumber);\n const y = IMAGINARY(inumber);\n\n // Return error if either coefficient is not a number\n if (anyIsError(x, y)) {\n return num\n }\n\n // Return hyperbolic cosecant of complex number\n return IMDIV('1', IMSINH(inumber))\n}\n\n/**\n * Returns the difference between two complex numbers.\n *\n * Category: Engineering\n *\n * @param {*} inumber1 The complex number from which to subtract inumber2.\n * @param {*} inumber2 The complex number to subtract from inumber1.\n * @returns\n */\nfunction IMSUB(inumber1, inumber2) {\n // Lookup real and imaginary coefficients using Formula.js [http://formulajs.org]\n const a = IMREAL(inumber1);\n const b = IMAGINARY(inumber1);\n const c = IMREAL(inumber2);\n const d = IMAGINARY(inumber2);\n\n if (anyIsError(a, b, c, d)) {\n return value\n }\n\n // Lookup imaginary unit\n const unit1 = inumber1.substring(inumber1.length - 1);\n const unit2 = inumber2.substring(inumber2.length - 1);\n let unit = 'i';\n\n if (unit1 === 'j') {\n unit = 'j';\n } else if (unit2 === 'j') {\n unit = 'j';\n }\n\n // Return _ of two complex numbers\n return COMPLEX(a - c, b - d, unit)\n}\n\n/**\n * Returns the sum of complex numbers.\n *\n * Category: Engineering\n *\n * @param {*} args inumber1, [inumber2], ... Inumber1 is required, subsequent numbers are not. 1 to 255 complex numbers to add.\n * @returns\n */\nfunction IMSUM() {\n if (!arguments.length) {\n return value\n }\n\n const args = flatten(arguments);\n\n // Initialize result\n let result = args[0];\n\n // Loop on all numbers\n for (let i = 1; i < args.length; i++) {\n // Lookup coefficients of two complex numbers\n const a = IMREAL(result);\n const b = IMAGINARY(result);\n const c = IMREAL(args[i]);\n const d = IMAGINARY(args[i]);\n\n if (anyIsError(a, b, c, d)) {\n return value\n }\n\n // Complute product of two complex numbers\n result = COMPLEX(a + c, b + d);\n }\n\n // Return sum of complex numbers\n return result\n}\n\n/**\n * Returns the tangent of a complex number.\n *\n * Category: Engineering\n *\n * @param {*} inumber A complex number for which you want the tangent.\n * @returns\n */\nfunction IMTAN(inumber) {\n // Return error if inumber is a logical value\n if (inumber === true || inumber === false) {\n return value\n }\n\n // Lookup real and imaginary coefficients using Formula.js [http://formulajs.org]\n const x = IMREAL(inumber);\n const y = IMAGINARY(inumber);\n\n if (anyIsError(x, y)) {\n return value\n }\n\n // Return tangent of complex number\n return IMDIV(IMSIN(inumber), IMCOS(inumber))\n}\n\n/**\n * Converts an octal number to binary.\n *\n * Category: Engineering\n *\n * @param {*} number The octal number you want to convert. Number may not contain more than 10 characters. The most significant bit of number is the sign bit. The remaining 29 bits are magnitude bits. Negative numbers are represented using two's-complement notation.\n * @param {*} places Optional. The number of characters to use. If places is omitted, OCT2BIN uses the minimum number of characters necessary. Places is useful for padding the return value with leading 0s (zeros).\n * @returns\n */\nfunction OCT2BIN(number, places) {\n // Return error if number is not hexadecimal or contains more than ten characters (10 digits)\n if (!/^[0-7]{1,10}$/.test(number)) {\n return num\n }\n\n // Check if number is negative\n const negative = !!(number.length === 10 && number.substring(0, 1) === '7');\n\n // Convert octal number to decimal\n const decimal = negative ? parseInt(number, 8) - 1073741824 : parseInt(number, 8);\n\n // Return error if number is lower than -512 or greater than 511\n if (decimal < -512 || decimal > 511) {\n return num\n }\n\n // Ignore places and return a 10-character binary number if number is negative\n if (negative) {\n return '1' + REPT('0', 9 - (512 + decimal).toString(2).length) + (512 + decimal).toString(2)\n }\n\n // Convert decimal number to binary\n const result = decimal.toString(2);\n\n // Return binary number using the minimum number of characters necessary if places is undefined\n if (typeof places === 'undefined') {\n return result\n } else {\n // Return error if places is nonnumeric\n if (isNaN(places)) {\n return value\n }\n\n // Return error if places is negative\n if (places < 0) {\n return num\n }\n\n // Truncate places in case it is not an integer\n places = Math.floor(places);\n\n // Pad return value with leading 0s (zeros) if necessary (using Underscore.string)\n return places >= result.length ? REPT('0', places - result.length) + result : num\n }\n}\n\n/**\n * Converts an octal number to decimal.\n *\n * Category: Engineering\n *\n * @param {*} number The octal number you want to convert. Number may not contain more than 10 octal characters (30 bits). The most significant bit of number is the sign bit. The remaining 29 bits are magnitude bits. Negative numbers are represented using two's-complement notation.\n * @returns\n */\nfunction OCT2DEC(number) {\n // Return error if number is not octal or contains more than ten characters (10 digits)\n if (!/^[0-7]{1,10}$/.test(number)) {\n return num\n }\n\n // Convert octal number to decimal\n const decimal = parseInt(number, 8);\n\n // Return decimal number\n return decimal >= 536870912 ? decimal - 1073741824 : decimal\n}\n\n/**\n * Converts an octal number to hexadecimal.\n *\n * Category: Engineering\n *\n * @param {*} number The octal number you want to convert. Number may not contain more than 10 octal characters (30 bits). The most significant bit of number is the sign bit. The remaining 29 bits are magnitude bits. Negative numbers are represented using two's-complement notation.\n * @param {*} places Optional. The number of characters to use. If places is omitted, OCT2HEX uses the minimum number of characters necessary. Places is useful for padding the return value with leading 0s (zeros).\n * @returns\n */\nfunction OCT2HEX(number, places) {\n // Return error if number is not octal or contains more than ten characters (10 digits)\n if (!/^[0-7]{1,10}$/.test(number)) {\n return num\n }\n\n // Convert octal number to decimal\n const decimal = parseInt(number, 8);\n\n // Ignore places and return a 10-character octal number if number is negative\n if (decimal >= 536870912) {\n return 'ff' + (decimal + 3221225472).toString(16)\n }\n\n // Convert decimal number to hexadecimal\n const result = decimal.toString(16);\n\n // Return hexadecimal number using the minimum number of characters necessary if places is undefined\n if (places === undefined) {\n return result\n } else {\n // Return error if places is nonnumeric\n if (isNaN(places)) {\n return value\n }\n\n // Return error if places is negative\n if (places < 0) {\n return num\n }\n\n // Truncate places in case it is not an integer\n places = Math.floor(places);\n\n // Pad return value with leading 0s (zeros) if necessary (using Underscore.string)\n return places >= result.length ? REPT('0', places - result.length) + result : num\n }\n}\n\nconst BETADIST = BETA.DIST;\nconst BETAINV = BETA.INV;\nconst BINOMDIST = BINOM.DIST;\nconst CEILINGMATH = CEILING.MATH;\nconst CEILINGPRECISE = CEILING.PRECISE;\nconst CHIDIST = CHISQ.DIST;\nconst CHIDISTRT = CHISQ.DIST.RT;\nconst CHIINV = CHISQ.INV;\nconst CHIINVRT = CHISQ.INV.RT;\nconst CHITEST = CHISQ.TEST;\nconst COVAR = COVARIANCE.P;\nconst COVARIANCEP = COVARIANCE.P;\nconst COVARIANCES = COVARIANCE.S;\nconst CRITBINOM = BINOM.INV;\nconst ERFCPRECISE = ERFC.PRECISE;\nconst ERFPRECISE = ERF.PRECISE;\nconst EXPONDIST = EXPON.DIST;\nconst FDIST = F.DIST;\nconst FDISTRT = F.DIST.RT;\nconst FINV = F.INV;\nconst FINVRT = F.INV.RT;\nconst FLOORMATH = FLOOR.MATH;\nconst FLOORPRECISE = FLOOR.PRECISE;\nconst FTEST = F.TEST;\nconst GAMMADIST = GAMMA.DIST;\nconst GAMMAINV = GAMMA.INV;\nconst GAMMALNPRECISE = GAMMALN.PRECISE;\nconst HYPGEOMDIST = HYPGEOM.DIST;\nconst LOGINV = LOGNORM.INV;\nconst LOGNORMDIST = LOGNORM.DIST;\nconst LOGNORMINV = LOGNORM.INV;\nconst MODEMULT = MODE.MULT;\nconst MODESNGL = MODE.SNGL;\nconst NEGBINOMDIST = NEGBINOM.DIST;\nconst NETWORKDAYSINTL = NETWORKDAYS.INTL;\nconst NORMDIST = NORM.DIST;\nconst NORMINV = NORM.INV;\nconst NORMSDIST = NORM.S.DIST;\nconst NORMSINV = NORM.S.INV;\nconst PERCENTILEEXC = PERCENTILE.EXC;\nconst PERCENTILEINC = PERCENTILE.INC;\nconst PERCENTRANKEXC = PERCENTRANK.EXC;\nconst PERCENTRANKINC = PERCENTRANK.INC;\nconst POISSONDIST = POISSON.DIST;\nconst QUARTILEEXC = QUARTILE.EXC;\nconst QUARTILEINC = QUARTILE.INC;\nconst RANKAVG = RANK.AVG;\nconst RANKEQ = RANK.EQ;\nconst SKEWP = SKEW.P;\nconst STDEVP = STDEV.P;\nconst STDEVS = STDEV.S;\nconst TDIST = T$1.DIST;\nconst TDISTRT = T$1.DIST.RT;\nconst TINV = T$1.INV;\nconst TTEST = T$1.TEST;\nconst VARP = VAR.P;\nconst VARS = VAR.S;\nconst WEIBULLDIST = WEIBULL.DIST;\nconst WORKDAYINTL = WORKDAY.INTL;\nconst ZTEST = Z.TEST;\n\nfunction compact(array) {\n const result = [];\n\n arrayEach(array, (value) => {\n if (value) {\n result.push(value);\n }\n });\n\n return result\n}\n\n/**\n * Formula.js only\n *\n * @param {*} database\n * @param {*} title\n * @returns\n */\nfunction FINDFIELD(database, title) {\n let index = null;\n\n arrayEach(database, (value, i) => {\n if (value[0] === title) {\n index = i;\n\n return false\n }\n });\n\n // Return error if the input field title is incorrect\n if (index == null) {\n return value\n }\n\n return index\n}\n\nfunction findResultIndex(database, criterias) {\n const matches = {};\n\n for (let i = 1; i < database[0].length; ++i) {\n matches[i] = true;\n }\n\n let maxCriteriaLength = criterias[0].length;\n\n for (let i = 1; i < criterias.length; ++i) {\n if (criterias[i].length > maxCriteriaLength) {\n maxCriteriaLength = criterias[i].length;\n }\n }\n\n for (let k = 1; k < database.length; ++k) {\n for (let l = 1; l < database[k].length; ++l) {\n let currentCriteriaResult = false;\n let hasMatchingCriteria = false;\n\n for (let j = 0; j < criterias.length; ++j) {\n const criteria = criterias[j];\n\n if (criteria.length < maxCriteriaLength) {\n continue\n }\n\n const criteriaField = criteria[0];\n\n if (database[k][0] !== criteriaField) {\n continue\n }\n\n hasMatchingCriteria = true;\n\n for (let p = 1; p < criteria.length; ++p) {\n if (!currentCriteriaResult) {\n const isWildcard = criteria[p] === void 0 || criteria[p] === '*';\n\n if (isWildcard) {\n currentCriteriaResult = true;\n } else {\n const tokenizedCriteria = parse(criteria[p] + '');\n const tokens = [createToken(database[k][l], TOKEN_TYPE_LITERAL)].concat(\n tokenizedCriteria\n );\n\n currentCriteriaResult = compute(tokens);\n }\n }\n }\n }\n\n if (hasMatchingCriteria) {\n matches[l] = matches[l] && currentCriteriaResult;\n }\n }\n }\n\n const result = [];\n\n for (let n = 0; n < database[0].length; ++n) {\n if (matches[n]) {\n result.push(n - 1);\n }\n }\n\n return result\n}\n\n// Database functions\n/**\n * Returns the average of selected database entries.\n *\n * Category: Database\n *\n * @param {*} database Range of values that makes up the list or database. A database is a list of related data in which rows of related information are records, and columns of data are fields. The first row of the list contains labels for each column.\n * @param {*} field Indicates which column is used in the function. Enter the column label enclosed between double quotation marks, such as \"Age\" or \"Yield,\" or a number (without quotation marks) that represents the position of the column within the list: 1 for the first column, 2 for the second column, and so on.\n * @param {*} criteria Range of values that contains the conditions you specify. You can use any range for the criteria argument, as long as it includes at least one column label and at least one value below the column label in which you specify a condition for the column.\n * @returns\n */\nfunction DAVERAGE(database, field, criteria) {\n // Return error if field is not a number and not a string\n if (isNaN(field) && typeof field !== 'string') {\n return value\n }\n\n const resultIndexes = findResultIndex(database, criteria);\n let targetFields = [];\n\n if (typeof field === 'string') {\n const index = FINDFIELD(database, field);\n targetFields = rest(database[index]);\n } else {\n targetFields = rest(database[field]);\n }\n\n let sum = 0;\n\n arrayEach(resultIndexes, (value) => {\n sum += targetFields[value];\n });\n\n return resultIndexes.length === 0 ? div0 : sum / resultIndexes.length\n}\n\n/**\n * Counts the values that contain numbers in a database.\n *\n * Category: Database\n *\n * @param {*} database The range of values that makes up the list or database. A database is a list of related data in which rows of related information are records, and columns of data are fields. The first row of the list contains labels for each column.\n * @param {*} field Indicates which column is used in the function. Enter the column label enclosed between double quotation marks, such as \"Age\" or \"Yield,\" or a number (without quotation marks) that represents the position of the column within the list: 1 for the first column, 2 for the second column, and so on.\n * @param {*} criteria The range of values that contains the conditions that you specify. You can use any range for the criteria argument, as long as the argument includes at least one column label and at least one value below the column label in which you specify a condition for the column.\n * @returns\n */\nfunction DCOUNT(database, field, criteria) {\n // Return error if field is not a number and not a string\n if (isNaN(field) && typeof field !== 'string') {\n return value\n }\n\n const resultIndexes = findResultIndex(database, criteria);\n let targetFields = [];\n\n if (typeof field === 'string') {\n const index = FINDFIELD(database, field);\n targetFields = rest(database[index]);\n } else {\n targetFields = rest(database[field]);\n }\n\n const targetValues = [];\n\n arrayEach(resultIndexes, (value) => {\n targetValues.push(targetFields[value]);\n });\n\n return COUNT(targetValues)\n}\n\n/**\n * Counts nonblank values in a database.\n *\n * Category: Database\n *\n * @param {*} database The range of values that makes up the list or database. A database is a list of related data in which rows of related information are records, and columns of data are fields. The first row of the list contains labels for each column.\n * @param {*} field Optional. Indicates which column is used in the function. Enter the column label enclosed between double quotation marks, such as \"Age\" or \"Yield,\" or a number (without quotation marks) that represents the position of the column within the list: 1 for the first column, 2 for the second column, and so on.\n * @param {*} criteria The range of values that contains the conditions that you specify. You can use any range for the criteria argument, as long as it includes at least one column label and at least one value below the column label in which you specify a condition for the column.\n * @returns\n */\nfunction DCOUNTA(database, field, criteria) {\n // Return error if field is not a number and not a string\n if (isNaN(field) && typeof field !== 'string') {\n return value\n }\n\n const resultIndexes = findResultIndex(database, criteria);\n let targetFields = [];\n\n if (typeof field === 'string') {\n const index = FINDFIELD(database, field);\n targetFields = rest(database[index]);\n } else {\n targetFields = rest(database[field]);\n }\n\n const targetValues = [];\n\n arrayEach(resultIndexes, (value) => {\n targetValues.push(targetFields[value]);\n });\n\n return COUNTA(targetValues)\n}\n\n/**\n * Extracts from a database a single record that matches the specified criteria.\n *\n * Category: Database\n *\n * @param {*} database The range of values that makes up the list or database. A database is a list of related data in which rows of related information are records, and columns of data are fields. The first row of the list contains labels for each column.\n * @param {*} field Indicates which column is used in the function. Enter the column label enclosed between double quotation marks, such as \"Age\" or \"Yield,\" or a number (without quotation marks) that represents the position of the column within the list: 1 for the first column, 2 for the second column, and so on.\n * @param {*} criteria The range of values that contains the conditions that you specify. You can use any range for the criteria argument, as long as it includes at least one column label and at least one value below the column label in which you specify a condition for the column.\n * @returns\n */\nfunction DGET(database, field, criteria) {\n // Return error if field is not a number and not a string\n if (isNaN(field) && typeof field !== 'string') {\n return value\n }\n\n const resultIndexes = findResultIndex(database, criteria);\n let targetFields = [];\n\n if (typeof field === 'string') {\n const index = FINDFIELD(database, field);\n targetFields = rest(database[index]);\n } else {\n targetFields = rest(database[field]);\n }\n\n // Return error if no record meets the criteria\n if (resultIndexes.length === 0) {\n return value\n }\n // Returns the #NUM! error value because more than one record meets the\n // criteria\n if (resultIndexes.length > 1) {\n return num\n }\n\n return targetFields[resultIndexes[0]]\n}\n\n/**\n * Returns the maximum value from selected database entries.\n *\n * Category: Database\n *\n * @param {*} database The range of values that makes up the list or database. A database is a list of related data in which rows of related information are records, and columns of data are fields. The first row of the list contains labels for each column.\n * @param {*} field Indicates which column is used in the function. Enter the column label enclosed between double quotation marks, such as \"Age\" or \"Yield,\" or a number (without quotation marks) that represents the position of the column within the list: 1 for the first column, 2 for the second column, and so on.\n * @param {*} criteria The range of values that contains the conditions that you specify. You can use any range for the criteria argument, as long as it includes at least one column label and at least one value below the column label in which you specify a condition for the column.\n * @returns\n */\nfunction DMAX(database, field, criteria) {\n // Return error if field is not a number and not a string\n\n if (isNaN(field) && typeof field !== 'string') {\n return value\n }\n\n const resultIndexes = findResultIndex(database, criteria);\n let targetFields = [];\n\n if (typeof field === 'string') {\n const index = FINDFIELD(database, field);\n targetFields = rest(database[index]);\n } else {\n targetFields = rest(database[field]);\n }\n\n let maxValue = targetFields[resultIndexes[0]];\n\n arrayEach(resultIndexes, (value) => {\n if (maxValue < targetFields[value]) {\n maxValue = targetFields[value];\n }\n });\n\n return maxValue\n}\n\n/**\n * Returns the minimum value from selected database entries.\n *\n * Category: Database\n *\n * @param {*} database The range of values that makes up the list or database. A database is a list of related data in which rows of related information are records, and columns of data are fields. The first row of the list contains labels for each column.\n * @param {*} field Indicates which column is used in the function. Enter the column label enclosed between double quotation marks, such as \"Age\" or \"Yield,\" or a number (without quotation marks) that represents the position of the column within the list: 1 for the first column, 2 for the second column, and so on.\n * @param {*} criteria The range of values that contains the conditions that you specify. You can use any range for the criteria argument, as long as it includes at least one column label and at least one value below the column label in which you specify a condition for the column.\n * @returns\n */\nfunction DMIN(database, field, criteria) {\n // Return error if field is not a number and not a string\n if (isNaN(field) && typeof field !== 'string') {\n return value\n }\n\n const resultIndexes = findResultIndex(database, criteria);\n let targetFields = [];\n\n if (typeof field === 'string') {\n const index = FINDFIELD(database, field);\n targetFields = rest(database[index]);\n } else {\n targetFields = rest(database[field]);\n }\n\n let minValue = targetFields[resultIndexes[0]];\n\n arrayEach(resultIndexes, (value) => {\n if (minValue > targetFields[value]) {\n minValue = targetFields[value];\n }\n });\n\n return minValue\n}\n\n/**\n * Multiplies the values in a particular field of records that match the criteria in a database.\n *\n * Category: Database\n *\n * @param {*} database The range of values that makes up the list or database. A database is a list of related data in which rows of related information are records, and columns of data are fields. The first row of the list contains labels for each column.\n * @param {*} field Indicates which column is used in the function. Enter the column label enclosed between double quotation marks, such as \"Age\" or \"Yield,\" or a number (without quotation marks) that represents the position of the column within the list: 1 for the first column, 2 for the second column, and so on.\n * @param {*} criteria The range of values that contains the conditions that you specify. You can use any range for the criteria argument, as long as it includes at least one column label and at least one value below the column label in which you specify a condition for the column.\n * @returns\n */\nfunction DPRODUCT(database, field, criteria) {\n // Return error if field is not a number and not a string\n if (isNaN(field) && typeof field !== 'string') {\n return value\n }\n\n const resultIndexes = findResultIndex(database, criteria);\n let targetFields = [];\n\n if (typeof field === 'string') {\n const index = FINDFIELD(database, field);\n targetFields = rest(database[index]);\n } else {\n targetFields = rest(database[field]);\n }\n\n let targetValues = [];\n\n arrayEach(resultIndexes, (value) => {\n targetValues.push(targetFields[value]);\n });\n targetValues = compact(targetValues);\n\n let result = 1;\n\n arrayEach(targetValues, (value) => {\n result *= value;\n });\n\n return result\n}\n\n/**\n * Estimates the standard deviation based on a sample of selected database entries.\n *\n * Category: Database\n *\n * @param {*} database The range of values that makes up the list or database. A database is a list of related data in which rows of related information are records, and columns of data are fields. The first row of the list contains labels for each column.\n * @param {*} field Indicates which column is used in the function. Enter the column label enclosed between double quotation marks, such as \"Age\" or \"Yield,\" or a number (without quotation marks) that represents the position of the column within the list: 1 for the first column, 2 for the second column, and so on.\n * @param {*} criteria The range of values that contains the conditions that you specify. You can use any range for the criteria argument, as long as it includes at least one column label and at least one value below the column label in which you specify a condition for the column.\n * @returns\n */\nfunction DSTDEV(database, field, criteria) {\n // Return error if field is not a number and not a string\n if (isNaN(field) && typeof field !== 'string') {\n return value\n }\n\n const resultIndexes = findResultIndex(database, criteria);\n let targetFields = [];\n\n if (typeof field === 'string') {\n const index = FINDFIELD(database, field);\n targetFields = rest(database[index]);\n } else {\n targetFields = rest(database[field]);\n }\n\n let targetValues = [];\n\n arrayEach(resultIndexes, (value) => {\n targetValues.push(targetFields[value]);\n });\n\n targetValues = compact(targetValues);\n\n return STDEV.S(targetValues)\n}\n\n/**\n * Calculates the standard deviation based on the entire population of selected database entries.\n *\n * Category: Database\n *\n * @param {*} database The range of values that makes up the list or database. A database is a list of related data in which rows of related information are records, and columns of data are fields. The first row of the list contains labels for each column.\n * @param {*} field Indicates which column is used in the function. Enter the column label enclosed between double quotation marks, such as \"Age\" or \"Yield,\" or a number (without quotation marks) that represents the position of the column within the list: 1 for the first column, 2 for the second column, and so on.\n * @param {*} criteria The range of values that contains the conditions that you specify. You can use any range for the criteria argument, as long as it includes at least one column label and at least one value below the column label in which you specify a condition for the column.\n * @returns\n */\nfunction DSTDEVP(database, field, criteria) {\n // Return error if field is not a number and not a string\n if (isNaN(field) && typeof field !== 'string') {\n return value\n }\n\n const resultIndexes = findResultIndex(database, criteria);\n let targetFields = [];\n\n if (typeof field === 'string') {\n const index = FINDFIELD(database, field);\n targetFields = rest(database[index]);\n } else {\n targetFields = rest(database[field]);\n }\n\n let targetValues = [];\n\n arrayEach(resultIndexes, (value) => {\n targetValues.push(targetFields[value]);\n });\n\n targetValues = compact(targetValues);\n\n return STDEV.P(targetValues)\n}\n\n/**\n * Adds the numbers in the field column of records in the database that match the criteria.\n *\n * Category: Database\n *\n * @param {*} database The range of values that makes up the list or database. A database is a list of related data in which rows of related information are records, and columns of data are fields. The first row of the list contains labels for each column.\n * @param {*} field Indicates which column is used in the function. Enter the column label enclosed between double quotation marks, such as \"Age\" or \"Yield,\" or a number (without quotation marks) that represents the position of the column within the list: 1 for the first column, 2 for the second column, and so on.\n * @param {*} criteria Is the range of values that contains the conditions that you specify. You can use any range for the criteria argument, as long as it includes at least one column label and at least one value below the column label in which you specify a condition for the column.\n * @returns\n */\nfunction DSUM(database, field, criteria) {\n // Return error if field is not a number and not a string\n if (isNaN(field) && typeof field !== 'string') {\n return value\n }\n\n const resultIndexes = findResultIndex(database, criteria);\n let targetFields = [];\n\n if (typeof field === 'string') {\n const index = FINDFIELD(database, field);\n targetFields = rest(database[index]);\n } else {\n targetFields = rest(database[field]);\n }\n\n const targetValues = [];\n\n arrayEach(resultIndexes, (value) => {\n targetValues.push(targetFields[value]);\n });\n\n return SUM(targetValues)\n}\n\n/**\n * Estimates variance based on a sample from selected database entries.\n *\n * Category: Database\n *\n * @param {*} database The range of values that makes up the list or database. A database is a list of related data in which rows of related information are records, and columns of data are fields. The first row of the list contains labels for each column.\n * @param {*} field Indicates which column is used in the function. Enter the column label enclosed between double quotation marks, such as \"Age\" or \"Yield,\" or a number (without quotation marks) that represents the position of the column within the list: 1 for the first column, 2 for the second column, and so on.\n * @param {*} criteria The range of values that contains the conditions that you specify. You can use any range for the criteria argument, as long as it includes at least one column label and at least one value below the column label in which you specify a condition for the column.\n * @returns\n */\nfunction DVAR(database, field, criteria) {\n // Return error if field is not a number and not a string\n if (isNaN(field) && typeof field !== 'string') {\n return value\n }\n\n const resultIndexes = findResultIndex(database, criteria);\n let targetFields = [];\n\n if (typeof field === 'string') {\n const index = FINDFIELD(database, field);\n targetFields = rest(database[index]);\n } else {\n targetFields = rest(database[field]);\n }\n\n const targetValues = [];\n\n arrayEach(resultIndexes, (value) => {\n targetValues.push(targetFields[value]);\n });\n\n return VAR.S(targetValues)\n}\n\n/**\n * Calculates variance based on the entire population of selected database entries.\n *\n * Category: Database\n *\n * @param {*} database The range of values that makes up the list or database. A database is a list of related data in which rows of related information are records, and columns of data are fields. The first row of the list contains labels for each column.\n * @param {*} field Indicates which column is used in the function. Enter the column label enclosed between double quotation marks, such as \"Age\" or \"Yield,\" or a number (without quotation marks) that represents the position of the column within the list: 1 for the first column, 2 for the second column, and so on.\n * @param {*} criteria The range of values that contains the conditions that you specify. You can use any range for the criteria argument, as long as it includes at least one column label and at least one value below the column label in which you specify a condition for the column.\n * @returns\n */\nfunction DVARP(database, field, criteria) {\n // Return error if field is not a number and not a string\n\n if (isNaN(field) && typeof field !== 'string') {\n return value\n }\n\n const resultIndexes = findResultIndex(database, criteria);\n let targetFields = [];\n\n if (typeof field === 'string') {\n const index = FINDFIELD(database, field);\n targetFields = rest(database[index]);\n } else {\n targetFields = rest(database[field]);\n }\n\n const targetValues = [];\n\n arrayEach(resultIndexes, (value) => {\n targetValues.push(targetFields[value]);\n });\n\n return VAR.P(targetValues)\n}\n\nfunction validDate(d) {\n return d && d.getTime && !isNaN(d.getTime())\n}\n\nfunction ensureDate(d) {\n return d instanceof Date ? d : new Date(d)\n}\n\n/**\n * Returns the accrued interest for a security that pays periodic interest.\n *\n * Category: Financial\n *\n * @param {*} issue The security's issue date.\n * @param {*} first_interest The security's first interest date.\n * @param {*} settlement The security's settlement date. The security settlement date is the date after the issue date when the security is traded to the buyer.\n * @param {*} rate The security's annual coupon rate.\n * @param {*} par The security's par value. If you omit par, ACCRINT uses $1,000.\n * @param {*} frequency The number of coupon payments per year. For annual payments, frequency = 1; for semiannual, frequency = 2; for quarterly, frequency = 4.\n * @param {*} basis Optional. The type of day count basis to use.\n * @param {*} calc_method Optional. Not implemented in formulajs. A logical value that specifies the way to calculate the total accrued interest when the date of settlement is later than the date of first_interest. A value of TRUE (1) returns the total accrued interest from issue to settlement. A value of FALSE (0) returns the accrued interest from first_interest to settlement. If you do not enter the argument, it defaults to TRUE.\n * @returns\n */\nfunction ACCRINT(issue, first_interest, settlement, rate, par, frequency, basis) {\n // Return error if either date is invalid\n issue = ensureDate(issue);\n first_interest = ensureDate(first_interest);\n settlement = ensureDate(settlement);\n\n if (!validDate(issue) || !validDate(first_interest) || !validDate(settlement)) {\n return value\n }\n\n // Return error if either rate or par are lower than or equal to zero\n if (rate <= 0 || par <= 0) {\n return num\n }\n\n // Return error if frequency is neither 1, 2, or 4\n if ([1, 2, 4].indexOf(frequency) === -1) {\n return num\n }\n\n // Return error if basis is neither 0, 1, 2, 3, or 4\n if ([0, 1, 2, 3, 4].indexOf(basis) === -1) {\n return num\n }\n\n // Return error if settlement is before or equal to issue\n if (settlement <= issue) {\n return num\n }\n\n // Set default values\n par = par || 0;\n basis = basis || 0;\n\n // Compute accrued interest\n return par * rate * YEARFRAC(issue, settlement, basis)\n}\n\n// TODO\n/**\n * -- Not implemented --\n *\n * Returns the accrued interest for a security that pays interest at maturity.\n *\n * Category: Financial\n *\n * @param {*} issue The security's issue date.\n * @param {*} settlement The security's maturity date.\n * @param {*} rate The security's annual coupon rate.\n * @param {*} par The security's par value. If you omit par, ACCRINTM uses $1,000.\n * @param {*} basis Optional. The type of day count basis to use.\n * @returns\n */\nfunction ACCRINTM() {\n throw new Error('ACCRINTM is not implemented')\n}\n\n// TODO\n/**\n * -- Not implemented --\n *\n * Returns the depreciation for each accounting period by using a depreciation coefficient.\n *\n * Category: Financial\n *\n * @param {*} cost The cost of the asset.\n * @param {*} date_purchased The date of the purchase of the asset.\n * @param {*} first_period The date of the end of the first period.\n * @param {*} salvage The salvage value at the end of the life of the asset.\n * @param {*} period The period.\n * @param {*} rate The rate of depreciation.\n * @param {*} basis Optional. The year basis to be used.\n * @returns\n */\nfunction AMORDEGRC() {\n throw new Error('AMORDEGRC is not implemented')\n}\n\n// TODO\n/**\n * -- Not implemented --\n *\n * Returns the depreciation for each accounting period.\n *\n * Category: Financial\n *\n * @param {*} cost The cost of the asset.\n * @param {*} date_purchased The date of the purchase of the asset.\n * @param {*} first_period The date of the end of the first period.\n * @param {*} salvage The salvage value at the end of the life of the asset.\n * @param {*} period The period.\n * @param {*} rate The rate of depreciation.\n * @param {*} basis Optional. The year basis to be used.\n * @returns\n */\nfunction AMORLINC() {\n throw new Error('AMORLINC is not implemented')\n}\n\n// TODO\n/**\n * -- Not implemented --\n *\n * Returns the number of days from the beginning of the coupon period to the settlement date.\n *\n * Category: Financial\n *\n * @param {*} settlement The security's settlement date. The security settlement date is the date after the issue date when the security is traded to the buyer.\n * @param {*} maturity The security's maturity date. The maturity date is the date when the security expires.\n * @param {*} frequency The number of coupon payments per year. For annual payments, frequency = 1; for semiannual, frequency = 2; for quarterly, frequency = 4.\n * @param {*} basis Optional. The type of day count basis to use.\n * @returns\n */\nfunction COUPDAYBS() {\n throw new Error('COUPDAYBS is not implemented')\n}\n\n// TODO\n/**\n * -- Not implemented --\n *\n * Returns the number of days in the coupon period that contains the settlement date.\n *\n * Category: Financial\n *\n * @param {*} settlement The security's settlement date. The security settlement date is the date after the issue date when the security is traded to the buyer.\n * @param {*} maturity The security's maturity date. The maturity date is the date when the security expires.\n * @param {*} frequency The number of coupon payments per year. For annual payments, frequency = 1; for semiannual, frequency = 2; for quarterly, frequency = 4.\n * @param {*} basis Optional. The type of day count basis to use.\n * @returns\n */\nfunction COUPDAYS() {\n throw new Error('COUPDAYS is not implemented')\n}\n\n// TODO\n/**\n * -- Not implemented --\n *\n * Returns the number of days from the settlement date to the next coupon date.\n *\n * Category: Financial\n *\n * @param {*} settlement The security's settlement date. The security settlement date is the date after the issue date when the security is traded to the buyer.\n * @param {*} maturity The security's maturity date. The maturity date is the date when the security expires.\n * @param {*} frequency The number of coupon payments per year. For annual payments, frequency = 1; for semiannual, frequency = 2; for quarterly, frequency = 4.\n * @param {*} basis Optional. The type of day count basis to use.\n * @returns\n */\nfunction COUPDAYSNC() {\n throw new Error('COUPDAYSNC is not implemented')\n}\n\n// TODO\n/**\n * -- Not implemented --\n *\n * Returns the next coupon date after the settlement date.\n *\n * Category: Financial\n *\n * @param {*} settlement The security's settlement date. The security settlement date is the date after the issue date when the security is traded to the buyer.\n * @param {*} maturity The security's maturity date. The maturity date is the date when the security expires.\n * @param {*} frequency The number of coupon payments per year. For annual payments, frequency = 1; for semiannual, frequency = 2; for quarterly, frequency = 4.\n * @param {*} basis Optional. The type of day count basis to use.\n * @returns\n */\nfunction COUPNCD() {\n throw new Error('COUPNCD is not implemented')\n}\n\n// TODO\n/**\n * -- Not implemented --\n *\n * Returns the number of coupons payable between the settlement date and maturity date.\n *\n * Category: Financial\n *\n * @param {*} settlement The security's settlement date. The security settlement date is the date after the issue date when the security is traded to the buyer.\n * @param {*} maturity The security's maturity date. The maturity date is the date when the security expires.\n * @param {*} frequency The number of coupon payments per year. For annual payments, frequency = 1; for semiannual, frequency = 2; for quarterly, frequency = 4.\n * @param {*} basis Optional. The type of day count basis to use.\n * @returns\n */\nfunction COUPNUM() {\n throw new Error('COUPNUM is not implemented')\n}\n\n// TODO\n/**\n * -- Not implemented --\n *\n * Returns the previous coupon date before the settlement date.\n *\n * Category: Financial\n *\n * @param {*} settlement The security's settlement date. The security settlement date is the date after the issue date when the security is traded to the buyer.\n * @param {*} maturity The security's maturity date. The maturity date is the date when the security expires.\n * @param {*} frequency The number of coupon payments per year. For annual payments, frequency = 1; for semiannual, frequency = 2; for quarterly, frequency = 4.\n * @param {*} basis Optional. The type of day count basis to use.\n * @returns\n */\nfunction COUPPCD() {\n throw new Error('COUPPCD is not implemented')\n}\n\n/**\n * Returns the cumulative interest paid between two periods.\n *\n * Category: Financial\n *\n * @param {*} rate The interest rate.\n * @param {*} nper The total number of payment periods.\n * @param {*} pv The present value.\n * @param {*} start_period The first period in the calculation. Payment periods are numbered beginning with 1.\n * @param {*} end_period The last period in the calculation.\n * @param {*} type The timing of the payment.\n * @returns\n */\nfunction CUMIPMT(rate, nper, pv, start_period, end_period, type) {\n rate = parseNumber(rate);\n nper = parseNumber(nper);\n pv = parseNumber(pv);\n\n if (anyIsError(rate, nper, pv)) {\n return value\n }\n\n if (rate <= 0 || nper <= 0 || pv <= 0) {\n return num\n }\n\n if (start_period < 1 || end_period < 1 || start_period > end_period) {\n return num\n }\n\n if (type !== 0 && type !== 1) {\n return num\n }\n\n const payment = PMT(rate, nper, pv, 0, type);\n let interest = 0;\n\n if (start_period === 1) {\n if (type === 0) {\n interest = -pv;\n }\n\n start_period++;\n }\n\n for (let i = start_period; i <= end_period; i++) {\n interest += type === 1 ? FV(rate, i - 2, payment, pv, 1) - payment : FV(rate, i - 1, payment, pv, 0);\n }\n\n interest *= rate;\n\n return interest\n}\n\n/**\n * Returns the cumulative principal paid on a loan between two periods.\n *\n * Category: Financial\n *\n * @param {*} rate The interest rate.\n * @param {*} nper The total number of payment periods.\n * @param {*} pv The present value.\n * @param {*} start_period The first period in the calculation. Payment periods are numbered beginning with 1.\n * @param {*} end_period The last period in the calculation.\n * @param {*} type The timing of the payment.\n * @returns\n */\nfunction CUMPRINC(rate, nper, pv, start_period, end, type) {\n // Credits: algorithm inspired by Apache OpenOffice\n // Credits: Hannes Stiebitzhofer for the translations of function and variable names\n rate = parseNumber(rate);\n nper = parseNumber(nper);\n pv = parseNumber(pv);\n\n if (anyIsError(rate, nper, pv)) {\n return value\n }\n\n // Return error if either rate, nper, or value are lower than or equal to zero\n if (rate <= 0 || nper <= 0 || pv <= 0) {\n return num\n }\n\n // Return error if start < 1, end < 1, or start > end\n if (start_period < 1 || end < 1 || start_period > end) {\n return num\n }\n\n // Return error if type is neither 0 nor 1\n if (type !== 0 && type !== 1) {\n return num\n }\n\n // Compute cumulative principal\n const payment = PMT(rate, nper, pv, 0, type);\n let principal = 0;\n\n if (start_period === 1) {\n principal = type === 0 ? payment + pv * rate : payment;\n\n start_period++;\n }\n\n for (let i = start_period; i <= end; i++) {\n principal +=\n type > 0\n ? payment - (FV(rate, i - 2, payment, pv, 1) - payment) * rate\n : payment - FV(rate, i - 1, payment, pv, 0) * rate;\n }\n\n // Return cumulative principal\n return principal\n}\n\n/**\n * Returns the depreciation of an asset for a specified period by using the fixed-declining balance method.\n *\n * Category: Financial\n *\n * @param {*} cost The initial cost of the asset.\n * @param {*} salvage The value at the end of the depreciation (sometimes called the salvage value of the asset).\n * @param {*} life The number of periods over which the asset is being depreciated (sometimes called the useful life of the asset).\n * @param {*} period The period for which you want to calculate the depreciation. Period must use the same units as life.\n * @param {*} month Optional. The number of months in the first year. If month is omitted, it is assumed to be 12.\n * @returns\n */\nfunction DB(cost, salvage, life, period, month) {\n // Initialize month\n month = month === undefined ? 12 : month;\n\n cost = parseNumber(cost);\n salvage = parseNumber(salvage);\n life = parseNumber(life);\n period = parseNumber(period);\n month = parseNumber(month);\n\n if (anyIsError(cost, salvage, life, period, month)) {\n return value\n }\n\n // Return error if any of the parameters is negative\n if (cost < 0 || salvage < 0 || life < 0 || period < 0) {\n return num\n }\n\n // Return error if month is not an integer between 1 and 12\n if ([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12].indexOf(month) === -1) {\n return num\n }\n\n // Return error if period is greater than life\n if (period > life) {\n return num\n }\n\n // Return 0 (zero) if salvage is greater than or equal to cost\n if (salvage >= cost) {\n return 0\n }\n\n // Rate is rounded to three decimals places\n const rate = (1 - Math.pow(salvage / cost, 1 / life)).toFixed(3);\n\n // Compute initial depreciation\n const initial = (cost * rate * month) / 12;\n\n // Compute total depreciation\n let total = initial;\n let current = 0;\n const ceiling = period === life ? life - 1 : period;\n\n for (let i = 2; i <= ceiling; i++) {\n current = (cost - total) * rate;\n total += current;\n }\n\n // Depreciation for the first and last periods are special cases\n if (period === 1) {\n // First period\n return initial\n } else if (period === life) {\n // Last period\n\n return (cost - total) * rate\n } else {\n return current\n }\n}\n\n/**\n * Returns the depreciation of an asset for a specified period by using the double-declining balance method or some other method that you specify.\n *\n * Category: Financial\n *\n * @param {*} cost The initial cost of the asset.\n * @param {*} salvage The value at the end of the depreciation (sometimes called the salvage value of the asset). This value can be 0.\n * @param {*} life The number of periods over which the asset is being depreciated (sometimes called the useful life of the asset).\n * @param {*} period The period for which you want to calculate the depreciation. Period must use the same units as life.\n * @param {*} factor Optional. The rate at which the balance declines. If factor is omitted, it is assumed to be 2 (the double-declining balance method).\n * @returns\n */\nfunction DDB(cost, salvage, life, period, factor) {\n // Initialize factor\n factor = factor === undefined ? 2 : factor;\n\n cost = parseNumber(cost);\n salvage = parseNumber(salvage);\n life = parseNumber(life);\n period = parseNumber(period);\n factor = parseNumber(factor);\n\n if (anyIsError(cost, salvage, life, period, factor)) {\n return value\n }\n\n // Return error if any of the parameters is negative or if factor is null\n if (cost < 0 || salvage < 0 || life < 0 || period < 0 || factor <= 0) {\n return num\n }\n\n // Return error if period is greater than life\n if (period > life) {\n return num\n }\n\n // Return 0 (zero) if salvage is greater than or equal to cost\n if (salvage >= cost) {\n return 0\n }\n\n // Compute depreciation\n let total = 0;\n let current = 0;\n\n for (let i = 1; i <= period; i++) {\n current = Math.min((cost - total) * (factor / life), cost - salvage - total);\n total += current;\n }\n\n // Return depreciation\n return current\n}\n\n// TODO\n/**\n * -- Not implemented --\n *\n * Returns the discount rate for a security.\n *\n * Category: Financial\n *\n * @param {*} settlement The security's settlement date. The security settlement date is the date after the issue date when the security is traded to the buyer.\n * @param {*} maturity The security's maturity date. The maturity date is the date when the security expires.\n * @param {*} pr The security's price per $100 face value.\n * @param {*} redemption The security's redemption value per $100 face value.\n * @param {*} basis Optional. The type of day count basis to use.\n * @returns\n */\nfunction DISC() {\n throw new Error('DISC is not implemented')\n}\n\n/**\n * Converts a dollar price, expressed as a fraction, into a dollar price, expressed as a decimal number.\n *\n * Category: Financial\n *\n * @param {*} fractional_dollar A number expressed as an integer part and a fraction part, separated by a decimal symbol.\n * @param {*} fraction The integer to use in the denominator of the fraction.\n * @returns\n */\nfunction DOLLARDE(fractional_dollar, fraction) {\n // Credits: algorithm inspired by Apache OpenOffice\n fractional_dollar = parseNumber(fractional_dollar);\n fraction = parseNumber(fraction);\n\n if (anyIsError(fractional_dollar, fraction)) {\n return value\n }\n\n // Return error if fraction is negative\n if (fraction < 0) {\n return num\n }\n\n // Return error if fraction is greater than or equal to 0 and less than 1\n if (fraction >= 0 && fraction < 1) {\n return div0\n }\n\n // Truncate fraction if it is not an integer\n fraction = parseInt(fraction, 10);\n\n // Compute integer part\n let result = parseInt(fractional_dollar, 10);\n\n // Add decimal part\n result += ((fractional_dollar % 1) * Math.pow(10, Math.ceil(Math.log(fraction) / Math.LN10))) / fraction;\n\n // Round result\n const power = Math.pow(10, Math.ceil(Math.log(fraction) / Math.LN2) + 1);\n result = Math.round(result * power) / power;\n\n // Return converted dollar price\n return result\n}\n\n/**\n * Converts a dollar price, expressed as a decimal number, into a dollar price, expressed as a fraction.\n *\n * Category: Financial\n *\n * @param {*} decimal_dollar A decimal number.\n * @param {*} fraction The integer to use in the denominator of a fraction.\n * @returns\n */\nfunction DOLLARFR(decimal_dollar, fraction) {\n // Credits: algorithm inspired by Apache OpenOffice\n decimal_dollar = parseNumber(decimal_dollar);\n fraction = parseNumber(fraction);\n\n if (anyIsError(decimal_dollar, fraction)) {\n return value\n }\n\n // Return error if fraction is negative\n if (fraction < 0) {\n return num\n }\n\n // Return error if fraction is greater than or equal to 0 and less than 1\n if (fraction >= 0 && fraction < 1) {\n return div0\n }\n\n // Truncate fraction if it is not an integer\n fraction = parseInt(fraction, 10);\n\n // Compute integer part\n let result = parseInt(decimal_dollar, 10);\n\n // Add decimal part\n result += (decimal_dollar % 1) * Math.pow(10, -Math.ceil(Math.log(fraction) / Math.LN10)) * fraction;\n\n // Return converted dollar price\n return result\n}\n\n// TODO\n/**\n * -- Not implemented --\n *\n * Returns the annual duration of a security with periodic interest payments.\n *\n * Category: Financial\n *\n * @param {*} settlement The security's settlement date. The security settlement date is the date after the issue date when the security is traded to the buyer.\n * @param {*} maturity The security's maturity date. The maturity date is the date when the security expires.\n * @param {*} coupon The security's annual coupon rate.\n * @param {*} yld The security's annual yield.\n * @param {*} frequency The number of coupon payments per year. For annual payments, frequency = 1; for semiannual, frequency = 2; for quarterly, frequency = 4.\n * @param {*} basis Optional. The type of day count basis to use.\n * @returns\n */\nfunction DURATION() {\n throw new Error('DURATION is not implemented')\n}\n\n/**\n * Returns the effective annual interest rate.\n *\n * Category: Financial\n *\n * @param {*} nominal_rate The nominal interest rate.\n * @param {*} npery The number of compounding periods per year.\n * @returns\n */\nfunction EFFECT(nominal_rate, npery) {\n nominal_rate = parseNumber(nominal_rate);\n npery = parseNumber(npery);\n\n if (anyIsError(nominal_rate, npery)) {\n return value\n }\n\n // Return error if rate <=0 or periods < 1\n if (nominal_rate <= 0 || npery < 1) {\n return num\n }\n\n // Truncate periods if it is not an integer\n npery = parseInt(npery, 10);\n\n // Return effective annual interest rate\n return Math.pow(1 + nominal_rate / npery, npery) - 1\n}\n\n/**\n * Returns the future value of an investment.\n *\n * Category: Financial\n *\n * @param {*} rate The interest rate per period.\n * @param {*} nper The total number of payment periods in an annuity.\n * @param {*} pmt The payment made each period; it cannot change over the life of the annuity. Typically, pmt contains principal and interest but no other fees or taxes. If pmt is omitted, you must include the pv argument.\n * @param {*} pv Optional. The present value, or the lump-sum amount that a series of future payments is worth right now. If pv is omitted, it is assumed to be 0 (zero), and you must include the pmt argument.\n * @param {*} type Optional. The number 0 or 1 and indicates when payments are due. If type is omitted, it is assumed to be 0.\n * @returns\n */\nfunction FV(rate, nper, payment, value$1, type) {\n // Credits: algorithm inspired by Apache OpenOffice\n value$1 = value$1 || 0;\n type = type || 0;\n\n rate = parseNumber(rate);\n nper = parseNumber(nper);\n payment = parseNumber(payment);\n value$1 = parseNumber(value$1);\n type = parseNumber(type);\n\n if (anyIsError(rate, nper, payment, value$1, type)) {\n return value\n }\n\n // Return future value\n let result;\n\n if (rate === 0) {\n result = value$1 + payment * nper;\n } else {\n const term = Math.pow(1 + rate, nper);\n\n result =\n type === 1\n ? value$1 * term + (payment * (1 + rate) * (term - 1)) / rate\n : value$1 * term + (payment * (term - 1)) / rate;\n }\n\n return -result\n}\n\n/**\n * Returns the future value of an initial principal after applying a series of compound interest rates.\n *\n * Category: Financial\n *\n * @param {*} principal The present value.\n * @param {*} schedule An array of interest rates to apply.\n * @returns\n */\nfunction FVSCHEDULE(principal, schedule) {\n principal = parseNumber(principal);\n schedule = parseNumberArray(flatten(schedule));\n\n if (anyIsError(principal, schedule)) {\n return value\n }\n\n const n = schedule.length;\n let future = principal;\n\n // Apply all interests in schedule\n\n for (let i = 0; i < n; i++) {\n // Apply scheduled interest\n future *= 1 + schedule[i];\n }\n\n // Return future value\n return future\n}\n\n// TODO\n/**\n * -- Not implemented --\n *\n * Returns the interest rate for a fully invested security.\n *\n * Category: Financial\n *\n * @param {*} settlement The security's settlement date. The security settlement date is the date after the issue date when the security is traded to the buyer.\n * @param {*} maturity The security's maturity date. The maturity date is the date when the security expires.\n * @param {*} investment The amount invested in the security.\n * @param {*} redemption The amount to be received at maturity.\n * @param {*} basis Optional. The type of day count basis to use.\n * @returns\n */\nfunction INTRATE() {\n throw new Error('INTRATE is not implemented')\n}\n\n/**\n * Returns the interest payment for an investment for a given period.\n *\n * Category: Financial\n *\n * @param {*} rate The interest rate per period.\n * @param {*} per The period for which you want to find the interest and must be in the range 1 to nper.\n * @param {*} nper The total number of payment periods in an annuity.\n * @param {*} pv The present value, or the lump-sum amount that a series of future payments is worth right now.\n * @param {*} fv Optional. The future value, or a cash balance you want to attain after the last payment is made. If fv is omitted, it is assumed to be 0 (the future value of a loan, for example, is 0).\n * @param {*} type Optional. The number 0 or 1 and indicates when payments are due. If type is omitted, it is assumed to be 0.\n * @returns\n */\nfunction IPMT(rate, per, nper, pv, fv, type) {\n // Credits: algorithm inspired by Apache OpenOffice\n fv = fv || 0;\n type = type || 0;\n\n rate = parseNumber(rate);\n per = parseNumber(per);\n nper = parseNumber(nper);\n pv = parseNumber(pv);\n fv = parseNumber(fv);\n type = parseNumber(type);\n\n if (anyIsError(rate, per, nper, pv, fv, type)) {\n return value\n }\n\n // Compute payment\n const payment = PMT(rate, nper, pv, fv, type);\n\n // Compute interest\n let interest =\n per === 1\n ? type === 1\n ? 0\n : -pv\n : type === 1\n ? FV(rate, per - 2, payment, pv, 1) - payment\n : FV(rate, per - 1, payment, pv, 0);\n\n // Return interest\n return interest * rate\n}\n\n/**\n * Returns the internal rate of return for a series of cash flows.\n *\n * Category: Financial\n *\n * @param {*} values An array or a reference to values that contain numbers for which you want to calculate the internal rate of return.\n - Values must contain at least one positive value and one negative value to calculate the internal rate of return.\n - IRR uses the order of values to interpret the order of cash flows. Be sure to enter your payment and income values in the sequence you want.\n - If an array or reference argument contains text, logical values, or empty values, those values are ignored.\n * @param {*} guess Optional. A number that you guess is close to the result of IRR.\n - Microsoft Excel uses an iterative technique for calculating IRR. Starting with guess, IRR cycles through the calculation until the result is accurate within 0.00001 percent. If IRR can't find a result that works after 20 tries, the #NUM! error value is returned.\n - In most cases you do not need to provide guess for the IRR calculation. If guess is omitted, it is assumed to be 0.1 (10 percent).\n - If IRR gives the #NUM! error value, or if the result is not close to what you expected, try again with a different value for guess.\n * @returns\n */\nfunction IRR(values, guess) {\n // Credits: algorithm inspired by Apache OpenOffice\n guess = guess || 0;\n\n values = parseNumberArray(flatten(values));\n guess = parseNumber(guess);\n\n if (anyIsError(values, guess)) {\n return value\n }\n\n // Calculates the resulting amount\n const irrResult = (values, dates, rate) => {\n const r = rate + 1;\n let result = values[0];\n\n for (let i = 1; i < values.length; i++) {\n result += values[i] / Math.pow(r, (dates[i] - dates[0]) / 365);\n }\n\n return result\n };\n\n // Calculates the first derivation\n const irrResultDeriv = (values, dates, rate) => {\n const r = rate + 1;\n let result = 0;\n\n for (let i = 1; i < values.length; i++) {\n const frac = (dates[i] - dates[0]) / 365;\n result -= (frac * values[i]) / Math.pow(r, frac + 1);\n }\n\n return result\n };\n\n // Initialize dates and check that values contains at least one positive value and one negative value\n const dates = [];\n let positive = false;\n let negative = false;\n\n for (let i = 0; i < values.length; i++) {\n dates[i] = i === 0 ? 0 : dates[i - 1] + 365;\n\n if (values[i] > 0) {\n positive = true;\n }\n\n if (values[i] < 0) {\n negative = true;\n }\n }\n\n // Return error if values does not contain at least one positive value and one negative value\n if (!positive || !negative) {\n return num\n }\n\n // Initialize guess and resultRate\n guess = guess === undefined ? 0.1 : guess;\n let resultRate = guess;\n\n // Set maximum epsilon for end of iteration\n const epsMax = 1e-10;\n\n // Implement Newton's method\n let newRate, epsRate, resultValue;\n let contLoop = true;\n do {\n resultValue = irrResult(values, dates, resultRate);\n newRate = resultRate - resultValue / irrResultDeriv(values, dates, resultRate);\n epsRate = Math.abs(newRate - resultRate);\n resultRate = newRate;\n contLoop = epsRate > epsMax && Math.abs(resultValue) > epsMax;\n } while (contLoop)\n\n // Return internal rate of return\n return resultRate\n}\n\n/**\n * Calculates the interest paid during a specific period of an investment.\n *\n * Category: Financial\n *\n * @param {*} rate The interest rate for the investment.\n * @param {*} per The period for which you want to find the interest, and must be between 1 and Nper.\n * @param {*} nper The total number of payment periods for the investment.\n * @param {*} pv The present value of the investment. For a loan, Pv is the loan amount.\n *\n * @returns\n */\nfunction ISPMT(rate, per, nper, pv) {\n rate = parseNumber(rate);\n per = parseNumber(per);\n nper = parseNumber(nper);\n pv = parseNumber(pv);\n\n if (anyIsError(rate, per, nper, pv)) {\n return value\n }\n\n // Return interest\n return pv * rate * (per / nper - 1)\n}\n\n// TODO\n/**\n * -- Not implemented --\n *\n * Returns the Macauley modified duration for a security with an assumed par value of $100.\n *\n * Category: Financial\n *\n * @param {*} settlement The security's settlement date. The security settlement date is the date after the issue date when the security is traded to the buyer.\n * @param {*} maturity The security's maturity date. The maturity date is the date when the security expires.\n * @param {*} coupon The security's annual coupon rate.\n * @param {*} yld The security's annual yield.\n * @param {*} frequency The number of coupon payments per year. For annual payments, frequency = 1; for semiannual, frequency = 2; for quarterly, frequency = 4.\n * @param {*} basis Optional. The type of day count basis to use.\n * @returns\n */\nfunction MDURATION() {\n throw new Error('MDURATION is not implemented')\n}\n\n/**\n * Returns the internal rate of return where positive and negative cash flows are financed at different rates.\n *\n * Category: Financial\n *\n * @param {*} values An array or a reference to values that contain numbers. These numbers represent a series of payments (negative values) and income (positive values) occurring at regular periods.\n - Values must contain at least one positive value and one negative value to calculate the modified internal rate of return. Otherwise, MIRR returns the #DIV/0! error value.\n - If an array or reference argument contains text, logical values, or empty values, those values are ignored; however, values with the value zero are included.\n * @param {*} finance_rate The interest rate you pay on the money used in the cash flows.\n * @param {*} reinvest_rate The interest rate you receive on the cash flows as you reinvest them.\n * @returns\n */\nfunction MIRR(values, finance_rate, reinvest_rate) {\n values = parseNumberArray(flatten(values));\n finance_rate = parseNumber(finance_rate);\n reinvest_rate = parseNumber(reinvest_rate);\n\n if (anyIsError(values, finance_rate, reinvest_rate)) {\n return value\n }\n\n // Initialize number of values\n const n = values.length;\n\n // Lookup payments (negative values) and incomes (positive values)\n const payments = [];\n const incomes = [];\n\n for (let i = 0; i < n; i++) {\n if (values[i] < 0) {\n payments.push(values[i]);\n } else {\n incomes.push(values[i]);\n }\n }\n\n // Return modified internal rate of return\n const num = -NPV(reinvest_rate, incomes) * Math.pow(1 + reinvest_rate, n - 1);\n const den = NPV(finance_rate, payments) * (1 + finance_rate);\n\n return Math.pow(num / den, 1 / (n - 1)) - 1\n}\n\n/**\n * Returns the annual nominal interest rate.\n *\n * Category: Financial\n *\n * @param {*} effect_rate The effective interest rate.\n * @param {*} npery The number of compounding periods per year.\n * @returns\n */\nfunction NOMINAL(effect_rate, npery) {\n effect_rate = parseNumber(effect_rate);\n npery = parseNumber(npery);\n\n if (anyIsError(effect_rate, npery)) {\n return value\n }\n\n // Return error if rate <=0 or periods < 1\n if (effect_rate <= 0 || npery < 1) {\n return num\n }\n\n // Truncate periods if it is not an integer\n npery = parseInt(npery, 10);\n\n // Return nominal annual interest rate\n return (Math.pow(effect_rate + 1, 1 / npery) - 1) * npery\n}\n\n/**\n * Returns the number of periods for an investment.\n *\n * Category: Financial\n *\n * @param {*} rate The interest rate per period.\n * @param {*} pmt The payment made each period; it cannot change over the life of the annuity. Typically, pmt contains principal and interest but no other fees or taxes.\n * @param {*} pv The present value, or the lump-sum amount that a series of future payments is worth right now.\n * @param {*} fv Optional. The future value, or a cash balance you want to attain after the last payment is made. If fv is omitted, it is assumed to be 0 (the future value of a loan, for example, is 0).\n * @param {*} type Optional. The number 0 or 1 and indicates when payments are due.\n * @returns\n */\nfunction NPER(rate, pmt, pv, fv, type) {\n type = type === undefined ? 0 : type;\n fv = fv === undefined ? 0 : fv;\n\n rate = parseNumber(rate);\n pmt = parseNumber(pmt);\n pv = parseNumber(pv);\n fv = parseNumber(fv);\n type = parseNumber(type);\n\n if (anyIsError(rate, pmt, pv, fv, type)) {\n return value\n }\n\n if (rate === 0) {\n return -(pv + fv) / pmt\n } else {\n const num = pmt * (1 + rate * type) - fv * rate;\n const den = pv * rate + pmt * (1 + rate * type);\n\n return Math.log(num / den) / Math.log(1 + rate)\n }\n}\n\n/**\n * Returns the net present value of an investment based on a series of periodic cash flows and a discount rate.\n *\n * Category: Financial\n *\n * @param {*} rate The rate of discount over the length of one period.\n * @param {*} args value1, value2, ... Value1 is required, subsequent values are optional. 1 to 254 arguments representing the payments and income.\n - value1, value2, ... must be equally spaced in time and occur at the end of each period.\n - NPV uses the order of value1, value2, ... to interpret the order of cash flows. Be sure to enter your payment and income values in the correct sequence.\n - Arguments that are empty values, logical values, or text representations of numbers, error values, or text that cannot be translated into numbers are ignored.\n - If an argument is an array or reference, only numbers in that array or reference are counted. Empty values, logical values, text, or error values in the array or reference are ignored.\n * @returns\n */\nfunction NPV() {\n const args = parseNumberArray(flatten(arguments));\n\n if (args instanceof Error) {\n return args\n }\n\n // Lookup rate\n const rate = args[0];\n\n // Initialize net present value\n let value = 0;\n\n // Loop on all values\n for (let j = 1; j < args.length; j++) {\n value += args[j] / Math.pow(1 + rate, j);\n }\n\n // Return net present value\n return value\n}\n\n// TODO\n/**\n * -- Not implemented --\n *\n * Returns the price per $100 face value of a security with an odd first period.\n *\n * Category: Financial\n *\n * @param {*} settlement The security's settlement date. The security settlement date is the date after the issue date when the security is traded to the buyer.\n * @param {*} maturity The security's maturity date. The maturity date is the date when the security expires.\n * @param {*} issue The security's issue date.\n * @param {*} first_coupon The security's first coupon date.\n * @param {*} rate The security's interest rate.\n * @param {*} yld The security's annual yield.\n * @param {*} redemption The security's redemption value per $100 face value.\n * @param {*} frequency The number of coupon payments per year. For annual payments, frequency = 1; for semiannual, frequency = 2; for quarterly, frequency = 4.\n * @param {*} basis Optional. The type of day count basis to use.\n * @returns\n */\nfunction ODDFPRICE() {\n throw new Error('ODDFPRICE is not implemented')\n}\n\n// TODO\n/**\n * -- Not implemented --\n *\n * Returns the yield of a security with an odd first period.\n *\n * Category: Financial\n *\n * @param {*} settlement The security's settlement date. The security settlement date is the date after the issue date when the security is traded to the buyer.\n * @param {*} maturity The security's maturity date. The maturity date is the date when the security expires.\n * @param {*} issue The security's issue date.\n * @param {*} first_coupon The security's first coupon date.\n * @param {*} rate The security's interest rate.\n * @param {*} pr The security's price.\n * @param {*} redemption The security's redemption value per $100 face value.\n * @param {*} frequency The number of coupon payments per year. For annual payments, frequency = 1; for semiannual, frequency = 2; for quarterly, frequency = 4.\n * @param {*} basis Optional. The type of day count basis to use.\n * @returns\n */\nfunction ODDFYIELD() {\n throw new Error('ODDFYIELD is not implemented')\n}\n\n// TODO\n/**\n * -- Not implemented --\n *\n * Returns the price per $100 face value of a security with an odd last period.\n *\n * Category: Financial\n *\n * @param {*} settlement The security's settlement date. The security settlement date is the date after the issue date when the security is traded to the buyer.\n * @param {*} maturity The security's maturity date. The maturity date is the date when the security expires.\n * @param {*} last_interest The security's last coupon date.\n * @param {*} rate The security's interest rate.\n * @param {*} yld The security's annual yield.\n * @param {*} redemption The security's redemption value per $100 face value.\n * @param {*} frequency The number of coupon payments per year. For annual payments, frequency = 1; for semiannual, frequency = 2; for quarterly, frequency = 4.\n * @param {*} basis Optional. The type of day count basis to use.\n * @returns\n */\nfunction ODDLPRICE() {\n throw new Error('ODDLPRICE is not implemented')\n}\n\n// TODO\n/**\n * -- Not implemented --\n *\n * Returns the yield of a security with an odd last period.\n *\n * Category: Financial\n *\n * @param {*} settlement The security's settlement date. The security settlement date is the date after the issue date when the security is traded to the buyer.\n * @param {*} maturity The security's maturity date. The maturity date is the date when the security expires.\n * @param {*} last_interest The security's last coupon date.\n * @param {*} rate The security's interest rate\n * @param {*} pr The security's price.\n * @param {*} redemption The security's redemption value per $100 face value.\n * @param {*} frequency The number of coupon payments per year. For annual payments, frequency = 1; for semiannual, frequency = 2; for quarterly, frequency = 4.\n * @param {*} basis Optional. The type of day count basis to use.\n * @returns\n */\nfunction ODDLYIELD() {\n throw new Error('ODDLYIELD is not implemented')\n}\n\n/**\n * Returns the number of periods required by an investment to reach a specified value.\n *\n * Category: Financial\n *\n * @param {*} rate Rate is the interest rate per period.\n * @param {*} pv Pv is the present value of the investment.\n * @param {*} fv Fv is the desired future value of the investment.\n * @returns\n */\nfunction PDURATION(rate, pv, fv) {\n rate = parseNumber(rate);\n pv = parseNumber(pv);\n fv = parseNumber(fv);\n\n if (anyIsError(rate, pv, fv)) {\n return value\n }\n\n // Return error if rate <=0\n if (rate <= 0) {\n return num\n }\n\n // Return number of periods\n return (Math.log(fv) - Math.log(pv)) / Math.log(1 + rate)\n}\n\n/**\n * Returns the periodic payment for an annuity.\n *\n * Category: Financial\n *\n * @param {*} rate The interest rate for the loan.\n * @param {*} nper The total number of payments for the loan.\n * @param {*} pv The present value, or the total amount that a series of future payments is worth now; also known as the principal.\n * @param {*} fv Optional. The future value, or a cash balance you want to attain after the last payment is made. If fv is omitted, it is assumed to be 0 (zero), that is, the future value of a loan is 0.\n * @param {*} type Optional. The number 0 (zero) or 1 and indicates when payments are due.\n * @returns\n */\nfunction PMT(rate, nper, pv, fv, type) {\n // Credits: algorithm inspired by Apache OpenOffice\n fv = fv || 0;\n type = type || 0;\n\n rate = parseNumber(rate);\n nper = parseNumber(nper);\n pv = parseNumber(pv);\n fv = parseNumber(fv);\n type = parseNumber(type);\n\n if (anyIsError(rate, nper, pv, fv, type)) {\n return value\n }\n\n // Return payment\n let result;\n\n if (rate === 0) {\n result = (pv + fv) / nper;\n } else {\n const term = Math.pow(1 + rate, nper);\n\n result =\n type === 1\n ? ((fv * rate) / (term - 1) + (pv * rate) / (1 - 1 / term)) / (1 + rate)\n : (fv * rate) / (term - 1) + (pv * rate) / (1 - 1 / term);\n }\n\n return -result\n}\n\n/**\n * Returns the payment on the principal for an investment for a given period.\n *\n * Category: Financial\n *\n * @param {*} rate The interest rate per period.\n * @param {*} per Specifies the period and must be in the range 1 to nper.\n * @param {*} nper The total number of payment periods in an annuity.\n * @param {*} pv The present value — the total amount that a series of future payments is worth now.\n * @param {*} fv Optional. The future value, or a cash balance you want to attain after the last payment is made. If fv is omitted, it is assumed to be 0 (zero), that is, the future value of a loan is 0.\n * @param {*} type Optional. The number 0 or 1 and indicates when payments are due.\n * @returns\n */\nfunction PPMT(rate, per, nper, pv, fv, type) {\n fv = fv || 0;\n type = type || 0;\n\n rate = parseNumber(rate);\n nper = parseNumber(nper);\n pv = parseNumber(pv);\n fv = parseNumber(fv);\n type = parseNumber(type);\n\n if (anyIsError(rate, nper, pv, fv, type)) {\n return value\n }\n\n return PMT(rate, nper, pv, fv, type) - IPMT(rate, per, nper, pv, fv, type)\n}\n\n// TODO\n/**\n * -- Not implemented --\n *\n * Returns the price per $100 face value of a security that pays periodic interest.\n *\n * Category: Financial\n *\n * @param {*} settlement The security's settlement date. The security settlement date is the date after the issue date when the security is traded to the buyer.\n * @param {*} maturity The security's maturity date. The maturity date is the date when the security expires.\n * @param {*} rate The security's annual coupon rate.\n * @param {*} yld The security's annual yield.\n * @param {*} redemption The security's redemption value per $100 face value.\n * @param {*} frequency The number of coupon payments per year. For annual payments, frequency = 1; for semiannual, frequency = 2; for quarterly, frequency = 4.\n * @param {*} basis Optional. The type of day count basis to use.\n * @returns\n */\nfunction PRICE() {\n throw new Error('PRICE is not implemented')\n}\n\n// TODO\n/**\n * -- Not implemented --\n *\n * Returns the price per $100 face value of a discounted security.\n *\n * Category: Financial\n *\n * @param {*} settlement The security's settlement date. The security settlement date is the date after the issue date when the security is traded to the buyer.\n * @param {*} maturity The security's maturity date. The maturity date is the date when the security expires.\n * @param {*} discount The security's discount rate.\n * @param {*} redemption The security's redemption value per $100 face value.\n * @param {*} basis Optional. The type of day count basis to use.\n * @returns\n */\nfunction PRICEDISC() {\n throw new Error('PRICEDISC is not implemented')\n}\n\n// TODO\n/**\n * -- Not implemented --\n *\n * Returns the price per $100 face value of a security that pays interest at maturity.\n *\n * Category: Financial\n *\n * @param {*} settlement The security's settlement date. The security settlement date is the date after the issue date when the security is traded to the buyer.\n * @param {*} maturity The security's maturity date. The maturity date is the date when the security expires.\n * @param {*} issue The security's issue date, expressed as a serial date number.\n * @param {*} rate The security's interest rate at date of issue.\n * @param {*} yld The security's annual yield.\n * @param {*} basis Optional. The type of day count basis to use.\n * @returns\n */\nfunction PRICEMAT() {\n throw new Error('PRICEMAT is not implemented')\n}\n\n/**\n * Returns the present value of an investment.\n *\n * Category: Financial\n *\n * @param {*} rate The interest rate per period. For example, if you obtain an automobile loan at a 10 percent annual interest rate and make monthly payments, your interest rate per month is 10%/12, or 0.83%. You would enter 10%/12, or 0.83%, or 0.0083, into the formula as the rate.\n * @param {*} nper The total number of payment periods in an annuity. For example, if you get a four-year car loan and make monthly payments, your loan has 4*12 (or 48) periods. You would enter 48 into the formula for nper.\n * @param {*} pmt The payment made each period and cannot change over the life of the annuity. Typically, pmt includes principal and interest but no other fees or taxes. For example, the monthly payments on a $10,000, four-year car loan at 12 percent are $263.33. You would enter -263.33 into the formula as the pmt. If pmt is omitted, you must include the fv argument.\n * @param {*} fv Optional. The future value, or a cash balance you want to attain after the last payment is made. If fv is omitted, it is assumed to be 0 (the future value of a loan, for example, is 0). For example, if you want to save $50,000 to pay for a special project in 18 years, then $50,000 is the future value. You could then make a conservative guess at an interest rate and determine how much you must save each month. If fv is omitted, you must include the pmt argument.\n * @param {*} type Optional. The number 0 or 1 and indicates when payments are due.\n * @returns\n */\nfunction PV(rate, per, pmt, fv, type) {\n fv = fv || 0;\n type = type || 0;\n\n rate = parseNumber(rate);\n per = parseNumber(per);\n pmt = parseNumber(pmt);\n fv = parseNumber(fv);\n type = parseNumber(type);\n\n if (anyIsError(rate, per, pmt, fv, type)) {\n return value\n }\n\n // Return present value\n return rate === 0\n ? -pmt * per - fv\n : (((1 - Math.pow(1 + rate, per)) / rate) * pmt * (1 + rate * type) - fv) / Math.pow(1 + rate, per)\n}\n\n/**\n * Returns the interest rate per period of an annuity.\n *\n * Category: Financial\n *\n * @param {*} nper The total number of payment periods in an annuity.\n * @param {*} pmt The payment made each period and cannot change over the life of the annuity. Typically, pmt includes principal and interest but no other fees or taxes. If pmt is omitted, you must include the fv argument.\n * @param {*} pv The present value — the total amount that a series of future payments is worth now.\n * @param {*} fv Optional. The future value, or a cash balance you want to attain after the last payment is made. If fv is omitted, it is assumed to be 0 (the future value of a loan, for example, is 0). If fv is omitted, you must include the pmt argument.\n * @param {*} type Optional. The number 0 or 1 and indicates when payments are due.\n * @param {*} guess Optional. Your guess for what the rate will be. If you omit guess, it is assumed to be 10 percent. If RATE does not converge, try different values for guess. RATE usually converges if guess is between 0 and 1.\n - If you omit guess, it is assumed to be 10 percent.\n - If RATE does not converge, try different values for guess. RATE usually converges if guess is between 0 and 1.\n * @returns\n */\nfunction RATE(nper, pmt, pv, fv, type, guess) {\n guess = guess === undefined ? 0.01 : guess;\n fv = fv === undefined ? 0 : fv;\n type = type === undefined ? 0 : type;\n\n nper = parseNumber(nper);\n pmt = parseNumber(pmt);\n pv = parseNumber(pv);\n fv = parseNumber(fv);\n type = parseNumber(type);\n guess = parseNumber(guess);\n\n if (anyIsError(nper, pmt, pv, fv, type, guess)) {\n return value\n }\n\n const epsMax = 1e-10;\n const iterMax = 20;\n let rate = guess;\n\n type = type ? 1 : 0;\n\n for (let i = 0; i < iterMax; i++) {\n if (rate <= -1) {\n return num\n }\n\n let y, f;\n\n if (Math.abs(rate) < epsMax) {\n y = pv * (1 + nper * rate) + pmt * (1 + rate * type) * nper + fv;\n } else {\n f = Math.pow(1 + rate, nper);\n y = pv * f + pmt * (1 / rate + type) * (f - 1) + fv;\n }\n\n if (Math.abs(y) < epsMax) {\n return rate\n }\n\n let dy;\n\n if (Math.abs(rate) < epsMax) {\n dy = pv * nper + pmt * type * nper;\n } else {\n f = Math.pow(1 + rate, nper);\n const df = nper * Math.pow(1 + rate, nper - 1);\n dy = pv * df + pmt * (1 / rate + type) * df + pmt * (-1 / (rate * rate)) * (f - 1);\n }\n\n rate -= y / dy;\n }\n\n return rate\n}\n\n// TODO\n/**\n * -- Not implemented --\n *\n * Returns the amount received at maturity for a fully invested security.\n *\n * Category: Financial\n *\n * @param {*} settlement The security's settlement date. The security settlement date is the date after the issue date when the security is traded to the buyer.\n * @param {*} maturity The security's maturity date. The maturity date is the date when the security expires.\n * @param {*} investment The amount invested in the security.\n * @param {*} discount The security's discount rate.\n * @param {*} basis Optional. The type of day count basis to use.\n * @returns\n */\nfunction RECEIVED() {\n throw new Error('RECEIVED is not implemented')\n}\n\n/**\n * Returns an equivalent interest rate for the growth of an investment.\n *\n * Category: Financial\n *\n * @param {*} nper Nper is the number of periods for the investment.\n * @param {*} pv Pv is the present value of the investment.\n * @param {*} fv Fv is the future value of the investment.\n * @returns\n */\nfunction RRI(nper, pv, fv) {\n nper = parseNumber(nper);\n pv = parseNumber(pv);\n fv = parseNumber(fv);\n\n if (anyIsError(nper, pv, fv)) {\n return value\n }\n\n // Return error if nper or present is equal to 0 (zero)\n if (nper === 0 || pv === 0) {\n return num\n }\n\n // Return equivalent interest rate\n return Math.pow(fv / pv, 1 / nper) - 1\n}\n\n/**\n * Returns the straight-line depreciation of an asset for one period.\n *\n * Category: Financial\n *\n * @param {*} cost The initial cost of the asset.\n * @param {*} salvage The value at the end of the depreciation (sometimes called the salvage value of the asset).\n * @param {*} life The number of periods over which the asset is depreciated (sometimes called the useful life of the asset).\n * @returns\n */\nfunction SLN(cost, salvage, life) {\n cost = parseNumber(cost);\n salvage = parseNumber(salvage);\n life = parseNumber(life);\n\n if (anyIsError(cost, salvage, life)) {\n return value\n }\n\n // Return error if life equal to 0 (zero)\n if (life === 0) {\n return num\n }\n\n // Return straight-line depreciation\n return (cost - salvage) / life\n}\n\n/**\n * Returns the sum-of-years' digits depreciation of an asset for a specified period.\n *\n * Category: Financial\n *\n * @param {*} cost The initial cost of the asset.\n * @param {*} salvage The value at the end of the depreciation (sometimes called the salvage value of the asset).\n * @param {*} life The number of periods over which the asset is depreciated (sometimes called the useful life of the asset).\n * @param {*} per The period and must use the same units as life.\n * @returns\n */\nfunction SYD(cost, salvage, life, per) {\n // Return error if any of the parameters is not a number\n cost = parseNumber(cost);\n salvage = parseNumber(salvage);\n life = parseNumber(life);\n per = parseNumber(per);\n\n if (anyIsError(cost, salvage, life, per)) {\n return value\n }\n\n // Return error if life equal to 0 (zero)\n if (life === 0) {\n return num\n }\n\n // Return error if period is lower than 1 or greater than life\n if (per < 1 || per > life) {\n return num\n }\n\n // Truncate period if it is not an integer\n per = parseInt(per, 10);\n\n // Return straight-line depreciation\n return ((cost - salvage) * (life - per + 1) * 2) / (life * (life + 1))\n}\n\n/**\n * Returns the bond-equivalent yield for a Treasury bill.\n *\n * Category: Financial\n *\n * @param {*} settlement The Treasury bill's settlement date. The security settlement date is the date after the issue date when the Treasury bill is traded to the buyer.\n * @param {*} maturity The Treasury bill's maturity date. The maturity date is the date when the Treasury bill expires.\n * @param {*} discount The Treasury bill's discount rate.\n * @returns\n */\nfunction TBILLEQ(settlement, maturity, discount) {\n settlement = parseDate(settlement);\n maturity = parseDate(maturity);\n discount = parseNumber(discount);\n\n if (anyIsError(settlement, maturity, discount)) {\n return value\n }\n\n // Return error if discount is lower than or equal to zero\n if (discount <= 0) {\n return num\n }\n\n // Return error if settlement is greater than maturity\n if (settlement > maturity) {\n return num\n }\n\n // Return error if maturity is more than one year after settlement\n if (maturity - settlement > 365 * 24 * 60 * 60 * 1000) {\n return num\n }\n\n // Return bond-equivalent yield\n return (365 * discount) / (360 - discount * DAYS360(settlement, maturity, false))\n}\n\n/**\n * Returns the price per $100 face value for a Treasury bill.\n *\n * Category: Financial\n *\n * @param {*} settlement The Treasury bill's settlement date. The security settlement date is the date after the issue date when the Treasury bill is traded to the buyer.\n * @param {*} maturity The Treasury bill's maturity date. The maturity date is the date when the Treasury bill expires.\n * @param {*} discount The Treasury bill's discount rate.\n * @returns\n */\nfunction TBILLPRICE(settlement, maturity, discount) {\n settlement = parseDate(settlement);\n maturity = parseDate(maturity);\n discount = parseNumber(discount);\n\n if (anyIsError(settlement, maturity, discount)) {\n return value\n }\n\n // Return error if discount is lower than or equal to zero\n if (discount <= 0) {\n return num\n }\n\n // Return error if settlement is greater than maturity\n if (settlement > maturity) {\n return num\n }\n\n // Return error if maturity is more than one year after settlement\n if (maturity - settlement > 365 * 24 * 60 * 60 * 1000) {\n return num\n }\n\n // Return bond-equivalent yield\n return 100 * (1 - (discount * DAYS360(settlement, maturity, false)) / 360)\n}\n\n/**\n * Returns the yield for a Treasury bill.\n *\n * Category: Financial\n *\n * @param {*} settlement The Treasury bill's settlement date. The security settlement date is the date after the issue date when the Treasury bill is traded to the buyer.\n * @param {*} maturity The Treasury bill's maturity date. The maturity date is the date when the Treasury bill expires.\n * @param {*} pr The Treasury bill's price per $100 face value.\n * @returns\n */\nfunction TBILLYIELD(settlement, maturity, pr) {\n settlement = parseDate(settlement);\n maturity = parseDate(maturity);\n pr = parseNumber(pr);\n\n if (anyIsError(settlement, maturity, pr)) {\n return value\n }\n\n // Return error if price is lower than or equal to zero\n if (pr <= 0) {\n return num\n }\n\n // Return error if settlement is greater than maturity\n if (settlement > maturity) {\n return num\n }\n\n // Return error if maturity is more than one year after settlement\n if (maturity - settlement > 365 * 24 * 60 * 60 * 1000) {\n return num\n }\n\n // Return bond-equivalent yield\n return ((100 - pr) * 360) / (pr * DAYS360(settlement, maturity, false))\n}\n\n// TODO\n/**\n * -- Not implemented --\n * \n * Returns the depreciation of an asset for a specified or partial period by using a declining balance method.\n *\n * Category: Financial\n *\n * @param {*} cost The initial cost of the asset.\n * @param {*} salvage The value at the end of the depreciation (sometimes called the salvage value of the asset). This value can be 0.\n * @param {*} life The number of periods over which the asset is depreciated (sometimes called the useful life of the asset).\n * @param {*} start_period The starting period for which you want to calculate the depreciation. Start_period must use the same units as life.\n * @param {*} end_period The ending period for which you want to calculate the depreciation. End_period must use the same units as life.\n * @param {*} factor Optional. The rate at which the balance declines. If factor is omitted, it is assumed to be 2 (the double-declining balance method). Change factor if you do not want to use the double-declining balance method. For a description of the double-declining balance method, see DDB.\n * @param {*} no_switch Optional. A logical value specifying whether to switch to straight-line depreciation when depreciation is greater than the declining balance calculation.\n - If no_switch is TRUE, Microsoft Excel does not switch to straight-line depreciation even when the depreciation is greater than the declining balance calculation.\n - If no_switch is FALSE or omitted, Excel switches to straight-line depreciation when depreciation is greater than the declining balance calculation.\n * @returns\n */\nfunction VDB() {\n throw new Error('VDB is not implemented')\n}\n\n/**\n * Returns the internal rate of return for a schedule of cash flows that is not necessarily periodic.\n *\n * Category: Financial\n *\n * @param {*} values A series of cash flows that corresponds to a schedule of payments in dates. The first payment is optional and corresponds to a cost or payment that occurs at the beginning of the investment. If the first value is a cost or payment, it must be a negative value. All succeeding payments are discounted based on a 365-day year. The series of values must contain at least one positive and one negative value.\n * @param {*} dates A schedule of payment dates that corresponds to the cash flow payments. Dates may occur in any order. Dates should be entered by using the DATE function, or as results of other formulas or functions. For example, use DATE(2008,5,23) for the 23rd day of May, 2008. Problems can occur if dates are entered as text. .\n * @param {*} guess Optional. A number that you guess is close to the result of XIRR.\n * @returns\n */\nfunction XIRR(values, dates, guess) {\n // Credits: algorithm inspired by Apache OpenOffice\n values = parseNumberArray(flatten(values));\n dates = parseDateArray(flatten(dates));\n guess = parseNumber(guess);\n\n if (anyIsError(values, dates, guess)) {\n return value\n }\n\n // Calculates the resulting amount\n const irrResult = (values, dates, rate) => {\n const r = rate + 1;\n let result = values[0];\n\n for (let i = 1; i < values.length; i++) {\n result += values[i] / Math.pow(r, DAYS(dates[i], dates[0]) / 365);\n }\n\n return result\n };\n\n // Calculates the first derivation\n const irrResultDeriv = (values, dates, rate) => {\n const r = rate + 1;\n let result = 0;\n\n for (let i = 1; i < values.length; i++) {\n const frac = DAYS(dates[i], dates[0]) / 365;\n result -= (frac * values[i]) / Math.pow(r, frac + 1);\n }\n\n return result\n };\n\n // Check that values contains at least one positive value and one negative value\n let positive = false;\n let negative = false;\n\n for (let i = 0; i < values.length; i++) {\n if (values[i] > 0) {\n positive = true;\n }\n\n if (values[i] < 0) {\n negative = true;\n }\n }\n\n // Return error if values does not contain at least one positive value and one negative value\n if (!positive || !negative) {\n return num\n }\n\n // Initialize guess and resultRate\n guess = guess || 0.1;\n let resultRate = guess;\n\n // Set maximum epsilon for end of iteration\n const epsMax = 1e-10;\n\n // Implement Newton's method\n let newRate, epsRate, resultValue;\n let contLoop = true;\n\n do {\n resultValue = irrResult(values, dates, resultRate);\n newRate = resultRate - resultValue / irrResultDeriv(values, dates, resultRate);\n epsRate = Math.abs(newRate - resultRate);\n resultRate = newRate;\n contLoop = epsRate > epsMax && Math.abs(resultValue) > epsMax;\n } while (contLoop)\n\n // Return internal rate of return\n return resultRate\n}\n\n/**\n * Returns the net present value for a schedule of cash flows that is not necessarily periodic.\n *\n * Category: Financial\n *\n * @param {*} rate The discount rate to apply to the cash flows.\n * @param {*} values A series of cash flows that corresponds to a schedule of payments in dates. The first payment is optional and corresponds to a cost or payment that occurs at the beginning of the investment. If the first value is a cost or payment, it must be a negative value. All succeeding payments are discounted based on a 365-day year. The series of values must contain at least one positive value and one negative value.\n * @param {*} dates A schedule of payment dates that corresponds to the cash flow payments. The first payment date indicates the beginning of the schedule of payments. All other dates must be later than this date, but they may occur in any order.\n * @returns\n */\nfunction XNPV(rate, values, dates) {\n rate = parseNumber(rate);\n values = parseNumberArray(flatten(values));\n dates = parseDateArray(flatten(dates));\n\n if (anyIsError(rate, values, dates)) {\n return value\n }\n\n let result = 0;\n\n for (let i = 0; i < values.length; i++) {\n result += values[i] / Math.pow(1 + rate, DAYS(dates[i], dates[0]) / 365);\n }\n\n return result\n}\n\n// TODO\n/**\n * -- Not implemented --\n *\n * Returns the yield on a security that pays periodic interest.\n *\n * Category: Financial\n *\n * @param {*} settlement The security's settlement date. The security settlement date is the date after the issue date when the security is traded to the buyer.\n * @param {*} maturity The security's maturity date. The maturity date is the date when the security expires.\n * @param {*} rate The security's annual coupon rate.\n * @param {*} pr The security's price per $100 face value.\n * @param {*} redemption The security's redemption value per $100 face value.\n * @param {*} frequency The number of coupon payments per year. For annual payments, frequency = 1; for semiannual, frequency = 2; for quarterly, frequency = 4.\n * @param {*} basis Optional. The type of day count basis to use.\n * @returns\n */\nfunction YIELD() {\n throw new Error('YIELD is not implemented')\n}\n\n// TODO\n/**\n * -- Not implemented --\n *\n * Returns the annual yield for a discounted security; for example, a Treasury bill.\n *\n * Category: Financial\n *\n * @param {*} settlement The security's settlement date. The security settlement date is the date after the issue date when the security is traded to the buyer.\n * @param {*} maturity The security's maturity date. The maturity date is the date when the security expires.\n * @param {*} pr The security's price per $100 face value.\n * @param {*} redemption The security's redemption value per $100 face value.\n * @param {*} basis Optional. The type of day count basis to use.\n * @returns\n */\nfunction YIELDDISC() {\n throw new Error('YIELDDISC is not implemented')\n}\n\n// TODO\n/**\n * -- Not implemented --\n *\n * Returns the annual yield of a security that pays interest at maturity.\n *\n * Category: Financial\n *\n * @param {*} settlement The security's settlement date. The security settlement date is the date after the issue date when the security is traded to the buyer.\n * @param {*} maturity The security's maturity date. The maturity date is the date when the security expires.\n * @param {*} issue The security's issue date, expressed as a serial date number.\n * @param {*} rate The security's interest rate at date of issue.\n * @param {*} pr The security's price per $100 face value.\n * @param {*} basis Optional. The type of day count basis to use.\n * @returns\n */\nfunction YIELDMAT() {\n throw new Error('YIELDMAT is not implemented')\n}\n\n/**\n * Returns TRUE if all of its arguments are TRUE.\n *\n * Category: Logical\n *\n * @returns\n */\nfunction AND() {\n const args = flatten(arguments);\n let result = value;\n\n for (let i = 0; i < args.length; i++) {\n if (args[i] instanceof Error) {\n return args[i]\n }\n\n if (args[i] === undefined || args[i] === null || typeof args[i] === 'string') {\n continue\n }\n\n if (result === value) {\n result = true;\n }\n\n if (!args[i]) {\n result = false;\n }\n }\n\n return result\n}\n\n/**\n * Returns the logical value FALSE.\n *\n * Category: Logical\n *\n * @returns\n */\nfunction FALSE() {\n return false\n}\n\n/**\n * Specifies a logical test to perform.\n *\n * Category: Logical\n *\n * @param {*} logical_test\n * @param {*} value_if_true\n * @param {*} value_if_false\n *\n * @returns\n */\nfunction IF(logical_test, value_if_true, value_if_false) {\n if (logical_test instanceof Error) {\n return logical_test\n }\n\n value_if_true = arguments.length >= 2 ? value_if_true : true;\n\n if (value_if_true === undefined || value_if_true === null) {\n value_if_true = 0;\n }\n\n value_if_false = arguments.length === 3 ? value_if_false : false;\n\n if (value_if_false === undefined || value_if_false === null) {\n value_if_false = 0;\n }\n\n return logical_test ? value_if_true : value_if_false\n}\n\n/**\n * Checks whether one or more conditions are met and returns a value that corresponds to the first TRUE condition.\n *\n * Category: Logical\n *\n * @returns\n */\nfunction IFS() {\n for (let i = 0; i < arguments.length / 2; i++) {\n if (arguments[i * 2]) {\n return arguments[i * 2 + 1]\n }\n }\n\n return na\n}\n\n/**\n * Returns a value you specify if a formula evaluates to an error; otherwise, returns the result of the formula.\n *\n * Category: Logical\n *\n * @param {*} value The argument that is checked for an error.\n * @param {*} value_if_error The value to return if the formula evaluates to an error. The following error types are evaluated: #N/A, #VALUE!, #REF!, #DIV/0!, #NUM!, #NAME?, or #NULL!.\n * @returns\n */\nfunction IFERROR(value, value_if_error) {\n if (ISERROR(value)) {\n return value_if_error\n }\n\n return value\n}\n\n/**\n * Returns the value you specify if the expression resolves to #N/A, otherwise returns the result of the expression.\n *\n * Category: Logical\n *\n * @returns\n */\nfunction IFNA(value, value_if_na) {\n return value === na ? value_if_na : value\n}\n\n/**\n * Reverses the logic of its argument.\n *\n * Category: Logical\n *\n * @returns\n */\nfunction NOT(logical) {\n if (typeof logical === 'string') {\n return value\n }\n\n if (logical instanceof Error) {\n return logical\n }\n\n return !logical\n}\n\n/**\n * Returns TRUE if any argument is TRUE.\n *\n * Category: Logical\n *\n * @returns\n */\nfunction OR() {\n const args = flatten(arguments);\n let result = value;\n\n for (let i = 0; i < args.length; i++) {\n if (args[i] instanceof Error) {\n return args[i]\n }\n\n if (args[i] === undefined || args[i] === null || typeof args[i] === 'string') {\n continue\n }\n\n if (result === value) {\n result = false;\n }\n\n if (args[i]) {\n result = true;\n }\n }\n\n return result\n}\n\n/**\n * Returns the logical value TRUE.\n *\n * Category: Logical\n *\n * @returns\n */\nfunction TRUE() {\n return true\n}\n\n/**\n * Returns a logical exclusive OR of all arguments.\n *\n * Category: Logical\n *\n * @param {*} args logical1, logical2,… Logical 1 is required, subsequent logical values are optional. 1 to 254 conditions you want to test that can be either TRUE or FALSE, and can be logical values, arrays, or references.\n * @returns\n */\nfunction XOR() {\n const args = flatten(arguments);\n let result = value;\n\n for (let i = 0; i < args.length; i++) {\n if (args[i] instanceof Error) {\n return args[i]\n }\n\n if (args[i] === undefined || args[i] === null || typeof args[i] === 'string') {\n continue\n }\n\n if (result === value) {\n result = 0;\n }\n\n if (args[i]) {\n result++;\n }\n }\n\n if (result === value) {\n return result\n }\n\n return !!(Math.floor(Math.abs(result)) & 1)\n}\n\n/**\n * Evaluates an expression against a list of values and returns the result corresponding to the first matching value. If there is no match, an optional default value may be returned.\n *\n * Category: Logical\n *\n * @returns\n */\nfunction SWITCH() {\n let result;\n\n if (arguments.length > 0) {\n const targetValue = arguments[0];\n const argc = arguments.length - 1;\n const switchCount = Math.floor(argc / 2);\n let switchSatisfied = false;\n const hasDefaultClause = argc % 2 !== 0;\n const defaultClause = argc % 2 === 0 ? null : arguments[arguments.length - 1];\n\n if (switchCount) {\n for (let index = 0; index < switchCount; index++) {\n if (targetValue === arguments[index * 2 + 1]) {\n result = arguments[index * 2 + 2];\n switchSatisfied = true;\n break\n }\n }\n }\n\n if (!switchSatisfied) {\n result = hasDefaultClause ? defaultClause : na;\n }\n } else {\n result = value;\n }\n\n return result\n}\n\nconst FLATTEN = flatten;\n\nfunction ARGS2ARRAY() {\n return Array.prototype.slice.call(arguments, 0)\n}\n\n/**\n * Formula.js only\n *\n * @param {*} context\n * @param {*} reference\n * @returns\n */\nfunction REFERENCE(context, reference) {\n if (!arguments.length) {\n return error\n }\n\n try {\n const path = reference.split('.');\n let result = context;\n\n for (let i = 0; i < path.length; ++i) {\n const step = path[i];\n\n if (step[step.length - 1] === ']') {\n const opening = step.indexOf('[');\n const index = step.substring(opening + 1, step.length - 1);\n result = result[step.substring(0, opening)][index];\n } else {\n result = result[step];\n }\n }\n\n return result\n } catch (error) {}\n}\n\n/**\n * Formula.js only\n *\n * @param {*} array\n * @param {*} separator\n * @returns\n */\nfunction JOIN(array, separator) {\n return array.join(separator)\n}\n\n/**\n * Formula.js only\n *\n * @returns\n */\nfunction NUMBERS() {\n const possibleNumbers = flatten(arguments);\n\n return possibleNumbers.filter((el) => typeof el === 'number')\n}\n\nexport { ABS, ACCRINT, ACCRINTM, ACOS, ACOSH, ACOT, ACOTH, ADD, AGGREGATE, AMORDEGRC, AMORLINC, AND, ARABIC, ARGS2ARRAY, ASC, ASIN, ASINH, ATAN, ATAN2, ATANH, AVEDEV, AVERAGE, AVERAGEA, AVERAGEIF, AVERAGEIFS, BAHTTEXT, BASE, BESSELI, BESSELJ, BESSELK, BESSELY, BETA, BETADIST, BETAINV, BIN2DEC, BIN2HEX, BIN2OCT, BINOM, BINOMDIST, BITAND, BITLSHIFT, BITOR, BITRSHIFT, BITXOR, CEILING, CEILINGMATH, CEILINGPRECISE, CELL, CHAR, CHIDIST, CHIDISTRT, CHIINV, CHIINVRT, CHISQ, CHITEST, CHOOSE, CLEAN, CODE, COLUMN, COLUMNS, COMBIN, COMBINA, COMPLEX, CONCAT, CONCATENATE, CONFIDENCE, CONVERT, CORREL, COS, COSH, COT, COTH, COUNT, COUNTA, COUNTBLANK, COUNTIF, COUNTIFS, COUNTIN, COUNTUNIQUE, COUPDAYBS, COUPDAYS, COUPDAYSNC, COUPNCD, COUPNUM, COUPPCD, COVAR, COVARIANCE, COVARIANCEP, COVARIANCES, CRITBINOM, CSC, CSCH, CUMIPMT, CUMPRINC, DATE, DATEDIF, DATEVALUE, DAVERAGE, DAY, DAYS, DAYS360, DB, DBCS, DCOUNT, DCOUNTA, DDB, DEC2BIN, DEC2HEX, DEC2OCT, DECIMAL, DEGREES, DELTA, DEVSQ, DGET, DISC, DIVIDE, DMAX, DMIN, DOLLAR, DOLLARDE, DOLLARFR, DPRODUCT, DSTDEV, DSTDEVP, DSUM, DURATION, DVAR, DVARP, E, EDATE, EFFECT, EOMONTH, EQ, ERF, ERFC, ERFCPRECISE, ERFPRECISE, ERROR, EVEN, EXACT, EXP, EXPON, EXPONDIST, F, FACT, FACTDOUBLE, FALSE, FDIST, FDISTRT, FIND, FINDFIELD, FINV, FINVRT, FISHER, FISHERINV, FIXED, FLATTEN, FLOOR, FLOORMATH, FLOORPRECISE, FORECAST, FREQUENCY, FTEST, FV, FVSCHEDULE, GAMMA, GAMMADIST, GAMMAINV, GAMMALN, GAMMALNPRECISE, GAUSS, GCD, GEOMEAN, GESTEP, GROWTH, GT, GTE, HARMEAN, HEX2BIN, HEX2DEC, HEX2OCT, HLOOKUP, HOUR, HTML2TEXT, HYPGEOM, HYPGEOMDIST, IF, IFERROR, IFNA, IFS, IMABS, IMAGINARY, IMARGUMENT, IMCONJUGATE, IMCOS, IMCOSH, IMCOT, IMCSC, IMCSCH, IMDIV, IMEXP, IMLN, IMLOG10, IMLOG2, IMPOWER, IMPRODUCT, IMREAL, IMSEC, IMSECH, IMSIN, IMSINH, IMSQRT, IMSUB, IMSUM, IMTAN, INDEX, INFO, INT, INTERCEPT, INTERVAL, INTRATE, IPMT, IRR, ISBINARY, ISBLANK, ISERR, ISERROR, ISEVEN, ISFORMULA, ISLOGICAL, ISNA, ISNONTEXT, ISNUMBER, ISO, ISODD, ISOWEEKNUM, ISPMT, ISREF, ISTEXT, JOIN, KURT, LARGE, LCM, LEFT, LEN, LINEST, LN, LN10, LN2, LOG, LOG10, LOG10E, LOG2E, LOGEST, LOGINV, LOGNORM, LOGNORMDIST, LOGNORMINV, LOOKUP, LOWER, LT, LTE, MATCH, MAX, MAXA, MDURATION, MEDIAN, MID, MIN, MINA, MINUS, MINUTE, MIRR, MOD, MODE, MODEMULT, MODESNGL, MONTH, MROUND, MULTINOMIAL, MULTIPLY, N, NA, NE, NEGBINOM, NEGBINOMDIST, NETWORKDAYS, NETWORKDAYSINTL, NOMINAL, NORM, NORMDIST, NORMINV, NORMSDIST, NORMSINV, NOT, NOW, NPER, NPV, NUMBERS, NUMBERVALUE, OCT2BIN, OCT2DEC, OCT2HEX, ODD, ODDFPRICE, ODDFYIELD, ODDLPRICE, ODDLYIELD, OR, PDURATION, PEARSON, PERCENTILE, PERCENTILEEXC, PERCENTILEINC, PERCENTRANK, PERCENTRANKEXC, PERCENTRANKINC, PERMUT, PERMUTATIONA, PHI, PI, PMT, POISSON, POISSONDIST, POW, POWER, PPMT, PRICE, PRICEDISC, PRICEMAT, PROB, PRODUCT, PRONETIC, PROPER, PV, QUARTILE, QUARTILEEXC, QUARTILEINC, QUOTIENT, RADIANS, RAND, RANDBETWEEN, RANK, RANKAVG, RANKEQ, RATE, RECEIVED, REFERENCE, REGEXEXTRACT, REGEXMATCH, REGEXREPLACE, REPLACE, REPT, RIGHT, ROMAN, ROUND, ROUNDDOWN, ROUNDUP, ROW, ROWS, RRI, RSQ, SEARCH, SEC, SECH, SECOND, SERIESSUM, SHEET, SHEETS, SIGN, SIN, SINH, SKEW, SKEWP, SLN, SLOPE, SMALL, SPLIT, SQRT, SQRT1_2, SQRT2, SQRTPI, STANDARDIZE, STDEV, STDEVA, STDEVP, STDEVPA, STDEVS, STEYX, SUBSTITUTE, SUBTOTAL, SUM, SUMIF, SUMIFS, SUMPRODUCT, SUMSQ, SUMX2MY2, SUMX2PY2, SUMXMY2, SWITCH, SYD, T, TAN, TANH, TBILLEQ, TBILLPRICE, TBILLYIELD, TDIST, TDISTRT, TEXT, TEXTJOIN, TIME, TIMEVALUE, TINV, TODAY, TRANSPOSE, TREND, TRIM, TRIMMEAN, TRUE, TRUNC, TTEST, TYPE, UNICHAR, UNICODE, UNIQUE, UPPER, VALUE, VAR, VARA, VARP, VARPA, VARS, VDB, VLOOKUP, WEEKDAY, WEEKNUM, WEIBULL, WEIBULLDIST, WORKDAY, WORKDAYINTL, XIRR, XNPV, XOR, YEAR, YEARFRAC, YIELD, YIELDDISC, YIELDMAT, Z, ZTEST };\n","import * as formulajs from '@formulajs/formulajs';\nimport { SharedContext } from '../Parser/SharedContext';\nimport { ArrayResult } from '../Cell/ArrayResult';\n\n/**\n * FormulaJS Wrapper for Calx Environment\n *\n * This wrapper provides access to FormulaJS functions in the Calx context.\n * It handles type conversions and provides a consistent interface.\n */\nexport class FormulaJSWrapper {\n private context: SharedContext;\n\n constructor(context: SharedContext) {\n this.context = context;\n }\n\n /**\n * Get a FormulaJS function by name\n */\n getFunction(name: string): Function | undefined {\n const upperName = name.toUpperCase();\n\n // Check for custom user functions first (registered via Calx.setFormula)\n // Access via require to avoid circular dependency\n try {\n const { Calx } = require('../../Calx');\n if (Calx.formulae && Calx.formulae[upperName]) {\n return Calx.formulae[upperName];\n }\n } catch (e) {\n // Ignore if Calx is not available yet\n }\n\n // Check for custom implementations\n if (upperName === 'SEQUENCE') {\n return this.sequenceFunction.bind(this);\n }\n if (upperName === 'SORT') {\n return this.sortFunction.bind(this);\n }\n if (upperName === 'FILTER') {\n return this.filterFunction.bind(this);\n }\n if (upperName === 'UNIQUE') {\n return this.uniqueFunction.bind(this);\n }\n\n // Check if function exists in formulajs\n let fn = (formulajs as any)[upperName];\n\n // Some functions like STDEV are objects with sub-functions (STDEV.S, STDEV.P)\n // For backward compatibility, use STDEV.S as default\n if (fn && typeof fn === 'object' && !Array.isArray(fn)) {\n // Try .S first (sample standard deviation, most common)\n if (typeof fn.S === 'function') {\n fn = fn.S;\n }\n // Then try .P (population standard deviation)\n else if (typeof fn.P === 'function') {\n fn = fn.P;\n }\n }\n\n if (typeof fn === 'function') {\n return fn;\n }\n\n return undefined;\n }\n\n /**\n * Custom SEQUENCE function (Excel 365 dynamic array function)\n * SEQUENCE(rows, [columns], [start], [step])\n */\n private sequenceFunction(rows: number, columns: number = 1, start: number = 1, step: number = 1): any {\n const result: number[][] = [];\n let value = start;\n\n for (let r = 0; r < rows; r++) {\n const row: number[] = [];\n for (let c = 0; c < columns; c++) {\n row.push(value);\n value += step;\n }\n result.push(row);\n }\n\n // If single column, return as 1D array\n if (columns === 1) {\n return result.map(row => row[0]);\n }\n\n return result;\n }\n\n /**\n * Custom SORT function (Excel 365 dynamic array function)\n * SORT(array, [sort_index], [sort_order], [by_col])\n */\n private sortFunction(array: any, sortIndex: number = 1, sortOrder: number = 1, byCol: boolean = false): any {\n // Convert array to 2D if needed\n let arr2D: any[][];\n if (!Array.isArray(array)) {\n arr2D = [[array]];\n } else if (!Array.isArray(array[0])) {\n // 1D array - convert to column\n arr2D = array.map(val => [val]);\n } else {\n arr2D = array;\n }\n\n // Make a copy to avoid mutating original\n const sorted = arr2D.map(row => [...row]);\n\n // Sort by column (default) or by row\n if (!byCol) {\n // Sort rows based on the specified column index (1-based)\n const colIdx = sortIndex - 1;\n sorted.sort((a, b) => {\n const aVal = a[colIdx];\n const bVal = b[colIdx];\n\n // Handle nulls/undefined\n if (aVal == null && bVal == null) return 0;\n if (aVal == null) return sortOrder === 1 ? 1 : -1;\n if (bVal == null) return sortOrder === 1 ? -1 : 1;\n\n // Compare values\n if (aVal < bVal) return sortOrder === 1 ? -1 : 1;\n if (aVal > bVal) return sortOrder === 1 ? 1 : -1;\n return 0;\n });\n }\n\n // Return as 1D array if it was originally 1D\n if (!Array.isArray(array[0])) {\n return sorted.map(row => row[0]);\n }\n\n return sorted;\n }\n\n /**\n * Custom FILTER function (Excel 365 dynamic array function)\n * FILTER(array, include, [if_empty])\n */\n private filterFunction(array: any, include: any, ifEmpty: any = '#N/A'): any {\n // Convert arrays to 2D if needed\n let arr2D: any[][];\n if (!Array.isArray(array)) {\n arr2D = [[array]];\n } else if (!Array.isArray(array[0])) {\n arr2D = array.map(val => [val]);\n } else {\n arr2D = array;\n }\n\n let include1D: any[];\n if (!Array.isArray(include)) {\n include1D = [include];\n } else if (Array.isArray(include[0])) {\n // 2D include array - flatten to 1D\n include1D = include.map(row => row[0]);\n } else {\n include1D = include;\n }\n\n // Filter rows based on include array\n const filtered = arr2D.filter((row, idx) => {\n const includeVal = include1D[idx];\n // In Excel, any non-zero/non-false value is truthy\n return includeVal !== false && includeVal !== 0 && includeVal != null;\n });\n\n // Return if_empty if no matches\n if (filtered.length === 0) {\n return ifEmpty;\n }\n\n // Return as 1D array if original was 1D\n if (!Array.isArray(array[0])) {\n return filtered.map(row => row[0]);\n }\n\n return filtered;\n }\n\n /**\n * Custom UNIQUE function (Excel 365 dynamic array function)\n * UNIQUE(array, [by_col], [exactly_once])\n */\n private uniqueFunction(array: any, byCol: boolean = false, exactlyOnce: boolean = false): any {\n // Convert to 2D array if needed\n let arr2D: any[][];\n let was1D = false;\n\n if (!Array.isArray(array)) {\n arr2D = [[array]];\n was1D = true;\n } else if (!Array.isArray(array[0])) {\n arr2D = array.map(val => [val]);\n was1D = true;\n } else {\n arr2D = array;\n }\n\n const unique: any[][] = [];\n const seen = new Map();\n\n // Process each row\n for (const row of arr2D) {\n const key = JSON.stringify(row);\n const count = seen.get(key) || 0;\n seen.set(key, count + 1);\n\n if (count === 0) {\n unique.push(row);\n }\n }\n\n // If exactly_once is true, filter to only values that appear once\n if (exactlyOnce) {\n const result = unique.filter(row => {\n const key = JSON.stringify(row);\n return seen.get(key) === 1;\n });\n\n if (result.length === 0) {\n return '#N/A';\n }\n\n return was1D ? result.map(row => row[0]) : result;\n }\n\n // Return as 1D array if original was 1D\n return was1D ? unique.map(row => row[0]) : unique;\n }\n\n /**\n * Call a FormulaJS function with arguments\n */\n callFunction(name: string, args: any[]): any {\n const fn = this.getFunction(name);\n\n if (!fn) {\n throw new Error(`Function ${name} not found`);\n }\n\n try {\n // Convert Range objects to arrays if needed\n const convertedArgs = args.map(arg => this.convertArg(arg));\n\n // Call the function\n let result = fn(...convertedArgs);\n\n // Handle Date objects - convert to Excel serial number\n if (result instanceof Date) {\n // Excel's epoch is December 30, 1899\n const excelEpoch = new Date(1899, 11, 30).getTime();\n const msPerDay = 24 * 60 * 60 * 1000;\n result = Math.floor((result.getTime() - excelEpoch) / msPerDay);\n }\n\n // Handle array results from dynamic array functions (SEQUENCE, SORT, UNIQUE, etc.)\n // Convert to ArrayResult for spilling behavior\n if (Array.isArray(result) && this.isDynamicArrayFunction(name)) {\n // Check if it's a 2D array\n if (result.length > 0 && Array.isArray(result[0])) {\n return ArrayResult.from2DArray(result);\n } else {\n // 1D array - return as vertical array for spilling\n return ArrayResult.fromVerticalArray(result);\n }\n }\n\n // Handle error results\n if (result && typeof result === 'object' && result.error) {\n return '#ERROR!';\n }\n\n return result;\n } catch (error) {\n console.error(`Error calling function ${name}:`, error);\n return '#ERROR!';\n }\n }\n\n /**\n * Check if a function is a dynamic array function that should spill\n */\n private isDynamicArrayFunction(name: string): boolean {\n const dynamicArrayFunctions = [\n 'SEQUENCE', 'SORT', 'UNIQUE', 'FILTER', 'RANDARRAY',\n 'SORTBY', 'XLOOKUP', 'XMATCH'\n ];\n return dynamicArrayFunctions.includes(name.toUpperCase());\n }\n\n /**\n * Convert argument to appropriate type for FormulaJS\n */\n private convertArg(arg: any): any {\n // If it's null or undefined, return as-is\n if (arg == null) {\n return arg;\n }\n\n // If it's an array, recursively convert elements\n if (Array.isArray(arg)) {\n return arg.map(item => this.convertArg(item));\n }\n\n // If it's a Range object, convert to value or array\n if (arg && typeof arg === 'object' && typeof arg.toArray === 'function') {\n const values = arg.toArray();\n // If single cell, return single value\n return values.length === 1 ? values[0] : values;\n }\n\n // If it's a Cell object, return its value\n if (arg && typeof arg === 'object' && 'value' in arg) {\n return arg.value;\n }\n\n // Return as-is for primitives\n return arg;\n }\n\n /**\n * Get all available FormulaJS functions\n */\n getAvailableFunctions(): string[] {\n return Object.keys(formulajs).filter(key => {\n return typeof (formulajs as any)[key] === 'function';\n });\n }\n\n /**\n * Check if a function exists\n */\n hasFunction(name: string): boolean {\n return this.getFunction(name) !== undefined;\n }\n}\n\n/**\n * Create a FormulaJS wrapper instance\n */\nexport function createFormulaJSWrapper(context: SharedContext): FormulaJSWrapper {\n return new FormulaJSWrapper(context);\n}\n\n/**\n * Export commonly used FormulaJS functions for convenience\n */\nexport const FormulaJSFunctions = {\n // Math functions\n SUM: formulajs.SUM,\n AVERAGE: formulajs.AVERAGE,\n MIN: formulajs.MIN,\n MAX: formulajs.MAX,\n COUNT: formulajs.COUNT,\n COUNTA: formulajs.COUNTA,\n ROUND: formulajs.ROUND,\n ROUNDUP: formulajs.ROUNDUP,\n ROUNDDOWN: formulajs.ROUNDDOWN,\n ABS: formulajs.ABS,\n SQRT: formulajs.SQRT,\n POWER: formulajs.POWER,\n MOD: formulajs.MOD,\n\n // Statistical functions\n MEDIAN: formulajs.MEDIAN,\n MODE: formulajs.MODE,\n STDEV: formulajs.STDEV,\n VAR: formulajs.VAR,\n\n // Logical functions\n IF: formulajs.IF,\n AND: formulajs.AND,\n OR: formulajs.OR,\n NOT: formulajs.NOT,\n XOR: formulajs.XOR,\n\n // Text functions\n CONCATENATE: formulajs.CONCATENATE,\n LEFT: formulajs.LEFT,\n RIGHT: formulajs.RIGHT,\n MID: formulajs.MID,\n LEN: formulajs.LEN,\n LOWER: formulajs.LOWER,\n UPPER: formulajs.UPPER,\n TRIM: formulajs.TRIM,\n TEXT: formulajs.TEXT,\n\n // Lookup functions\n VLOOKUP: formulajs.VLOOKUP,\n HLOOKUP: formulajs.HLOOKUP,\n MATCH: formulajs.MATCH,\n INDEX: formulajs.INDEX,\n\n // Date functions\n DATE: formulajs.DATE,\n TODAY: formulajs.TODAY,\n NOW: formulajs.NOW,\n YEAR: formulajs.YEAR,\n MONTH: formulajs.MONTH,\n DAY: formulajs.DAY,\n\n // Financial functions\n PMT: formulajs.PMT,\n FV: formulajs.FV,\n PV: formulajs.PV,\n RATE: formulajs.RATE,\n NPV: formulajs.NPV,\n IRR: formulajs.IRR,\n};\n","import { Sheet } from \"../Sheet\"\nimport { Workbook } from \"../Workbook\"\nimport { FormulaJSWrapper, createFormulaJSWrapper } from \"../Formula/FormulaJSWrapper\";\n\nexport type SharedContextInterface = {\n /**\n * The workbook as main context of the parser\n */\n workbook ?: Workbook,\n\n /**\n * Collection of sheets in the workbook\n */\n sheets : Record,\n\n /**\n * Current active sheet which the parser will refer to when parsing formula\n */\n activeSheet ?: Sheet,\n\n /**\n * Utility that can be used inside the parser\n */\n utility : object,\n\n /**\n * Default comparator for comparing cell and value\n */\n comparator ?: {\n equal : (a : any, b : any) => boolean,\n notEqual : (a : any, b : any) => boolean,\n lessThan : (a : any, b : any) => boolean,\n greaterThan : (a : any, b : any) => boolean,\n lessEqualThan : (a : any, b : any) => boolean,\n greaterEqualThan : (a : any, b : any) => boolean,\n }\n\n /**\n * Methods for getting values from the workbook\n */\n getFunction?: (name: string) => Function | undefined;\n getVariable?: (name: string, sheetName?: string) => any;\n getCellValue?: (ref: string, sheetName?: string) => any;\n getCellRange?: (range: string, sheetName?: string) => any[];\n getRowRange?: (range: string, sheetName?: string) => any[];\n getColumnRange?: (range: string, sheetName?: string) => any[];\n getNamedRange?: (name: string) => any;\n}\n\nexport class SharedContext implements SharedContextInterface {\n\n public workbook ?: Workbook;\n\n public sheets : Record = {};\n\n public activeSheet ?: Sheet;\n\n public utility!: object;\n\n private _formulaJSWrapper?: FormulaJSWrapper;\n\n public comparator ?: {\n equal : (a : any, b : any) => boolean,\n notEqual : (a : any, b : any) => boolean,\n lessThan : (a : any, b : any) => boolean,\n greaterThan : (a : any, b : any) => boolean,\n lessEqualThan : (a : any, b : any) => boolean,\n greaterEqualThan : (a : any, b : any) => boolean,\n };\n\n constructor(init ?: Partial) {\n Object.assign(this, init);\n this._formulaJSWrapper = createFormulaJSWrapper(this);\n }\n\n setActiveSheet(sheet : Sheet) {\n this.activeSheet = sheet;\n }\n\n setWorkbook(workbook : Workbook) {\n this.workbook = workbook;\n }\n\n addSheet(sheet : Sheet) {\n this.sheets[sheet.id] = sheet;\n }\n\n callFunction(name : string, args : any[]) : any {\n // Use FormulaJS wrapper\n if (this._formulaJSWrapper) {\n return this._formulaJSWrapper.callFunction(name, args);\n }\n return '#NAME?';\n }\n\n getFunction(name: string): Function | undefined {\n // Check FormulaJS first (workbook custom functions can be added later)\n if (this._formulaJSWrapper) {\n return this._formulaJSWrapper.getFunction(name);\n }\n\n return undefined;\n }\n\n getVariable(name: string, sheetName?: string): any {\n const sheet = sheetName ? this.sheets[sheetName] : this.activeSheet;\n if (sheet) {\n // Variables are managed by the sheet\n return sheet.getVariable(name);\n }\n return \"#NAME?\";\n }\n\n getCellValue(ref: string, sheetName?: string): any {\n let sheet = this.activeSheet;\n\n if (sheetName) {\n // Try to find sheet by name or id\n sheet = this.sheets[sheetName] || Object.values(this.sheets).find(s => s.name === sheetName);\n }\n\n if (sheet) {\n return sheet.getCellValue(ref);\n }\n return \"#REF!\";\n }\n\n getCellRange(range: string, sheetName?: string): any[] {\n const sheet = sheetName ? this.sheets[sheetName] : this.activeSheet;\n if (sheet) {\n // Parse range like \"A1:B2\"\n const [start, end] = range.split(':');\n return sheet.getCellRangeValues(start, end);\n }\n return [];\n }\n\n getRowRange(range: string, sheetName?: string): any[] {\n const sheet = sheetName ? this.sheets[sheetName] : this.activeSheet;\n if (sheet) {\n // Parse range like \"1:3\" (rows 1 to 3)\n return sheet.getRowRangeValues(range);\n }\n return [];\n }\n\n getColumnRange(range: string, sheetName?: string): any[] {\n const sheet = sheetName ? this.sheets[sheetName] : this.activeSheet;\n if (sheet) {\n // Parse range like \"A:C\" (columns A to C)\n return sheet.getColumnRangeValues(range);\n }\n return [];\n }\n\n getNamedRange(name: string): any {\n if (this.workbook) {\n return this.workbook.nameManager.resolve(name);\n }\n return \"#NAME?\";\n }\n}","import { Workbook } from \"../Workbook\";\n\n/**\n * Named range definition\n */\nexport interface NamedRange {\n name: string;\n reference: string;\n sheetName?: string;\n comment?: string;\n}\n\n/**\n * Manage named cell or cell range\n */\nexport class NameManager {\n private _workbook : Workbook\n private _nameRegistry : Record = {};\n\n public setContext(workbook : Workbook) {\n this._workbook = workbook;\n }\n\n /**\n * Define named cell or cell range.\n *\n * @param name the alias name (e.g., \"SalesData\", \"TaxRate\")\n * @param reference the cell or cell range to be aliased (e.g., \"A1\", \"A1:B10\", \"Sheet1!A1:B10\")\n * @param sheetName optional sheet name to scope this name to a specific sheet\n * @param comment optional comment describing the named range\n * @returns true if defined successfully, false if name is invalid\n */\n public define(name : string, reference : string, sheetName?: string, comment?: string): boolean {\n // Validate name: must start with letter or underscore, can contain letters, numbers, underscores\n // Cannot be a cell reference (e.g., \"A1\")\n if (!this.isValidName(name)) {\n return false;\n }\n\n this._nameRegistry[name] = {\n name,\n reference,\n sheetName,\n comment\n };\n return true;\n }\n\n /**\n * Check if a name is valid for a named range\n * - Must start with letter or underscore\n * - Can contain letters, numbers, underscores, dots\n * - Cannot be a cell reference (A1, B2, etc.)\n * - Cannot be a reserved keyword\n */\n private isValidName(name: string): boolean {\n // Must start with letter or underscore\n if (!/^[a-zA-Z_]/.test(name)) {\n return false;\n }\n\n // Can only contain letters, numbers, underscores, dots\n if (!/^[a-zA-Z_][a-zA-Z0-9_\\.]*$/.test(name)) {\n return false;\n }\n\n // Cannot be a cell reference\n if (/^[A-Z]+[0-9]+$/.test(name)) {\n return false;\n }\n\n // Reserved keywords\n const reserved = ['TRUE', 'FALSE', 'NULL'];\n if (reserved.includes(name.toUpperCase())) {\n return false;\n }\n\n return true;\n }\n\n /**\n * Get the reference string for a named range\n *\n * @param name the alias name\n * @returns the reference string or undefined if not found\n */\n public getReference(name: string): string | undefined {\n const namedRange = this._nameRegistry[name];\n return namedRange?.reference;\n }\n\n /**\n * Resolve a named range to its value(s)\n *\n * @param name the alias name\n * @returns target cell value or array of values\n */\n public resolve(name : string) {\n const namedRange = this._nameRegistry[name];\n if (!namedRange) {\n return '#NAME?';\n }\n\n // Find the first sheet to use as context if no active sheet\n let targetSheet = this._workbook.getActiveSheet();\n if (!targetSheet) {\n const sheets = this._workbook.getSheets();\n const sheetNames = Object.keys(sheets);\n if (sheetNames.length > 0) {\n targetSheet = sheets[sheetNames[0]];\n }\n }\n\n // Set active sheet temporarily\n if (targetSheet) {\n this._workbook.setActiveSheet(targetSheet);\n }\n\n // If the reference includes sheet name, parse it as-is\n // Otherwise, prepend with \"=\" to make it a formula\n const formula = namedRange.reference.startsWith('=')\n ? namedRange.reference\n : `=${namedRange.reference}`;\n\n return this._workbook.parser.parse(formula);\n }\n\n /**\n * Check if a named range exists\n *\n * @param name the alias name\n * @returns true if the named range exists\n */\n public has(name: string): boolean {\n return name in this._nameRegistry;\n }\n\n /**\n * Get all named ranges\n *\n * @returns array of all named range definitions\n */\n public getAll(): NamedRange[] {\n return Object.values(this._nameRegistry);\n }\n\n /**\n * Get a named range definition\n *\n * @param name the alias name\n * @returns the named range definition or undefined\n */\n public get(name: string): NamedRange | undefined {\n return this._nameRegistry[name];\n }\n\n /**\n * Remove the alias\n *\n * @param name the alias name\n * @returns true if removed, false if not found\n */\n public remove(name : string): boolean {\n if (name in this._nameRegistry) {\n delete this._nameRegistry[name];\n return true;\n }\n return false;\n }\n\n /**\n * Clear all named ranges\n */\n public clear(): void {\n this._nameRegistry = {};\n }\n}","export const Comparator = {\n equal(a : any, b : any) : boolean {\n /** ignore case as excel does */\n if (typeof a == 'string') {\n return a.toLowerCase() == ('' + b).toLowerCase();\n }\n\n return a == b;\n },\n\n notEqual(a : any, b : any) : boolean {\n /** ignore case as excel does */\n if (typeof a == 'string') {\n return a.toLowerCase() != ('' + b).toLowerCase();\n }\n\n return a != b;\n },\n\n lessThan(a : any, b : any) : boolean {\n return a < b;\n },\n\n greaterThan(a : any, b : any) : boolean {\n return a > b;\n },\n\n lessEqualThan(a : any, b : any) : boolean {\n return a <= b;\n },\n\n greaterEqualThan(a : any, b : any) : boolean {\n return a >= b;\n }\n}","import { Sheet } from \"./Sheet\";\nimport { CalxInterpreter } from \"./Parser/Chevrotain/Interpreter\";\nimport { CalxParser } from \"./Parser/Chevrotain/Parser\";\nimport { SharedContext } from \"./Parser/SharedContext\";\nimport * as Utility from './Utility/Utility';\nimport { EventDispatcher } from \"./Utility/EventDispatcher\";\nimport { NameManager } from \"./Workbook/NameManager\";\nimport { CellData, Data } from \"./Workbook/Data\";\nimport { Comparator } from \"./Utility/Comparator\";\nimport { DependencyTree } from \"./Workbook/DependencyTree\";\nimport { DependencyBuilder } from \"./Workbook/DependencyBuilder\";\n\n/**\n * Create parser instance with shared context\n */\nfunction createParser(context: SharedContext): CalxInterpreter {\n const interpreter = new CalxInterpreter();\n interpreter.setContext(context);\n return interpreter;\n}\n\nexport class Workbook {\n private _sheets : Record;\n private _functions!: Record;\n private _parser : CalxInterpreter;\n private _dispatcher : EventDispatcher;\n private _nameManager : NameManager\n private _autoCalculate : boolean = true;\n\n private _deps!: DependencyTree;\n private _depsBuilder!: DependencyBuilder;\n\n private constructor(\n parser : CalxInterpreter,\n nameManager : NameManager,\n dispatcher : EventDispatcher,\n ) {\n this._sheets = {};\n this._parser = parser;\n this._dispatcher = dispatcher;\n this._nameManager = nameManager;\n\n this._nameManager.setContext(this);\n }\n\n public get parser() {\n return this._parser;\n }\n\n public get dispatcher() {\n return this._dispatcher;\n }\n\n /**\n * Get the name manager for managing named ranges\n */\n public get nameManager(): NameManager {\n return this._nameManager;\n }\n\n /**\n * Get autoCalculate option\n */\n public get autoCalculate(): boolean {\n return this._autoCalculate;\n }\n\n /**\n * Set autoCalculate option\n * When true, changes to cell values automatically trigger recalculation of all sheets\n * When false, manual calculation is required\n * This also updates all sheets' autoCalculate settings\n */\n public set autoCalculate(value: boolean) {\n this._autoCalculate = value;\n // Propagate to all sheets\n for (const sheetName in this._sheets) {\n this._sheets[sheetName].autoCalculate = value;\n }\n }\n\n public setActiveSheet(sheet : Sheet) {\n if (this._parser) {\n const context = this._parser.getContext();\n if (context) {\n context.activeSheet = sheet;\n context.setActiveSheet(sheet);\n }\n }\n }\n\n public getActiveSheet() {\n return this._parser.yy?.activeSheet;\n }\n\n public isValidCellAddress(address : string) {\n return address.match(/^[A-Z]+\\d+$/);\n }\n\n /**\n * Calculate the whole workbook\n */\n public calculate() {\n // Build dependency tree if not already built\n if (!this._deps) {\n this.build();\n }\n\n // Calculate all sheets in dependency order\n for (const sheetName in this._sheets) {\n this._sheets[sheetName].calculate();\n }\n }\n\n /**\n * Build the workbook, create dependency tree, and other necessary things\n */\n public build() {\n // Initialize dependency builder\n this._depsBuilder = new DependencyBuilder();\n\n // Build dependency trees for each sheet\n for (const sheetName in this._sheets) {\n this._sheets[sheetName].buildDependencyTree();\n }\n\n // Build workbook-level dependency tree (for cross-sheet dependencies)\n // This will be implemented when we have a complete cell registry\n }\n\n /**\n * Hydrate object using data from the workbook recusively\n *\n * {\n * someKey : '#sheet1!A1',\n * anotherKey : '#sheet2!B2',\n * nested : {\n * key : '#sheet3!C3'\n * }\n * }\n *\n * @param obj\n */\n public hydrateObj(obj : any) {\n for (const key in obj) {\n if (typeof obj[key] === 'object') {\n this.hydrateObj(obj[key]);\n } else {\n if (typeof obj[key] === 'string' && obj[key].startsWith('#')) {\n const [sheetName, address] = obj[key].split('!');\n\n if (sheetName in this._sheets) {\n obj[key] = this._sheets[sheetName].getCell(address).value;\n }\n }\n }\n }\n }\n\n /**\n * Create new sheet object and register it to workbook sheet registry and parser shared context.\n */\n public createSheet(name: string, element ?: any) :Sheet\n {\n if (!name) {\n throw new Error('Sheet should have a name');\n }\n\n if (this._sheets[name]) {\n throw new Error(`Sheet with the name \"${name}\" is already exists`);\n }\n\n const sheet = new Sheet(this, name);\n\n // Inherit workbook's autoCalculate setting\n sheet.autoCalculate = this._autoCalculate;\n\n if (element) {\n sheet.element = element;\n }\n\n this._sheets[name] = sheet;\n if (this._parser && this._parser.yy) {\n this._parser.yy.sheets[name] = sheet;\n }\n\n return sheet;\n }\n\n /**\n * Get sheets collection from the workbook\n */\n public getSheets() : Record {\n return this._sheets;\n }\n\n /**\n * Get particular sheet in the workbook sheet registry\n */\n public getSheet(name : string) : Sheet | void {\n if (name in this._sheets) {\n return this._sheets[name];\n }\n\n throw Error(`Sheet not found with name ${name}`);\n }\n\n\n /**\n * Load configuration to workbook\n */\n public loadData(data : Data) {\n for (const sheetName in data.sheets) {\n const sheet = this.createSheet(sheetName, data.sheets[sheetName]?.element);\n\n for (const cellKey in data.sheets[sheetName].cells) {\n const cellData = data.sheets[sheetName].cells[cellKey];\n sheet.createCell(cellKey, cellData);\n }\n }\n }\n\n /**\n * Export workbook to JSON Data format\n * Returns a Data object that can be used with createWorkbookFromData()\n */\n public exportJSON(): Data {\n const data: Data = {\n sheets: {}\n };\n\n for (const sheetName in this._sheets) {\n const sheet = this._sheets[sheetName];\n const allCells = sheet.cells;\n\n data.sheets[sheetName] = {\n element: sheet.element,\n cells: {},\n variables: {}\n };\n\n // Export each cell's data\n for (const address in allCells) {\n const cell = allCells[address];\n const cellData: CellData = {};\n\n if (cell.formula) {\n cellData.formula = cell.formula;\n } else if (cell.value !== undefined) {\n cellData.value = cell.value;\n }\n\n if (cell.type) {\n cellData.type = cell.type;\n }\n\n // Only include cells that have data\n if (cellData.formula || cellData.value !== undefined) {\n data.sheets[sheetName].cells[address] = cellData;\n }\n }\n }\n\n return data;\n }\n\n /**\n * Create workbook object from given config\n */\n public static createFromData(data : Data) {\n const sharedContext = new SharedContext({\n sheets : {},\n utility : Utility,\n comparator : Comparator,\n });\n\n const parser = createParser(sharedContext);\n const dispatcher = new EventDispatcher();\n const nameManager = new NameManager();\n\n const workbook = new Workbook(parser, nameManager, dispatcher);\n\n sharedContext.workbook = workbook;\n\n /** TODO : read the configuration and configure the workbook */\n workbook.loadData(data);\n\n return workbook;\n }\n\n /**\n * Create workbook object from given element, and parse related data-tag\n */\n public static createFromElement(element : any, data ?: Data) {\n const parser = createParser(new SharedContext({\n sheets : {},\n utility : Utility,\n comparator : null,\n }));\n\n const dispatcher = new EventDispatcher();\n const nameManager = new NameManager();\n const workbook = new Workbook(parser, nameManager, dispatcher);\n\n /** TODO : traverse element and read the configuration and configure the workbook */\n\n if (data) {\n workbook.loadData(data);\n }\n\n return workbook;\n }\n}\n","import { CalxInterpreter } from \"./Calx/Parser/Chevrotain/Interpreter\";\nimport { CalxParser } from \"./Calx/Parser/Chevrotain/Parser\";\nimport { Workbook } from \"./Calx/Workbook\";\nimport { Data } from \"./Calx/Workbook/Data\";\nimport { DateUtil } from \"./Calx/Utility/DateUtil\";\n\n// Export utilities\nexport { DateUtil };\n\n// Export types\nexport type { Data };\n\nexport class Calx {\n\n static formulae : Record = {};\n\n static setFormula(name : string, formula : Function) {\n Calx.formulae[name] = formula;\n }\n\n static setFormulae(formulae : Record) {\n Calx.formulae = {\n ...Calx.formulae,\n ...formulae,\n };\n }\n\n static createWorkbook() {\n const data : Data = {\n sheets : {},\n }\n\n return Calx.createWorkbookFromData(data);\n }\n\n static createWorkbookFromData(data : Data) {\n return Workbook.createFromData(data);\n }\n\n static createWorkbookFromElement(element : any, data ?: Data) {\n return Workbook.createFromElement(element, data);\n }\n\n static createParser() {\n return new CalxParser();\n }\n\n static createInterpreter() {\n return new CalxInterpreter();\n }\n\n static exportJSON(workbook: Workbook): Data {\n return workbook.exportJSON();\n }\n}","\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.validateMissingCstMethods = exports.validateVisitor = exports.CstVisitorDefinitionError = exports.createBaseVisitorConstructorWithDefaults = exports.createBaseSemanticVisitorConstructor = exports.defaultVisit = void 0;\nvar isEmpty_1 = __importDefault(require(\"lodash/isEmpty\"));\nvar compact_1 = __importDefault(require(\"lodash/compact\"));\nvar isArray_1 = __importDefault(require(\"lodash/isArray\"));\nvar map_1 = __importDefault(require(\"lodash/map\"));\nvar forEach_1 = __importDefault(require(\"lodash/forEach\"));\nvar filter_1 = __importDefault(require(\"lodash/filter\"));\nvar keys_1 = __importDefault(require(\"lodash/keys\"));\nvar isFunction_1 = __importDefault(require(\"lodash/isFunction\"));\nvar isUndefined_1 = __importDefault(require(\"lodash/isUndefined\"));\nvar lang_extensions_1 = require(\"../../lang/lang_extensions\");\nfunction defaultVisit(ctx, param) {\n var childrenNames = (0, keys_1.default)(ctx);\n var childrenNamesLength = childrenNames.length;\n for (var i = 0; i < childrenNamesLength; i++) {\n var currChildName = childrenNames[i];\n var currChildArray = ctx[currChildName];\n var currChildArrayLength = currChildArray.length;\n for (var j = 0; j < currChildArrayLength; j++) {\n var currChild = currChildArray[j];\n // distinction between Tokens Children and CstNode children\n if (currChild.tokenTypeIdx === undefined) {\n this[currChild.name](currChild.children, param);\n }\n }\n }\n // defaultVisit does not support generic out param\n}\nexports.defaultVisit = defaultVisit;\nfunction createBaseSemanticVisitorConstructor(grammarName, ruleNames) {\n var derivedConstructor = function () { };\n // can be overwritten according to:\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/\n // name?redirectlocale=en-US&redirectslug=JavaScript%2FReference%2FGlobal_Objects%2FFunction%2Fname\n (0, lang_extensions_1.defineNameProp)(derivedConstructor, grammarName + \"BaseSemantics\");\n var semanticProto = {\n visit: function (cstNode, param) {\n // enables writing more concise visitor methods when CstNode has only a single child\n if ((0, isArray_1.default)(cstNode)) {\n // A CST Node's children dictionary can never have empty arrays as values\n // If a key is defined there will be at least one element in the corresponding value array.\n cstNode = cstNode[0];\n }\n // enables passing optional CstNodes concisely.\n if ((0, isUndefined_1.default)(cstNode)) {\n return undefined;\n }\n return this[cstNode.name](cstNode.children, param);\n },\n validateVisitor: function () {\n var semanticDefinitionErrors = validateVisitor(this, ruleNames);\n if (!(0, isEmpty_1.default)(semanticDefinitionErrors)) {\n var errorMessages = (0, map_1.default)(semanticDefinitionErrors, function (currDefError) { return currDefError.msg; });\n throw Error(\"Errors Detected in CST Visitor <\".concat(this.constructor.name, \">:\\n\\t\") +\n \"\".concat(errorMessages.join(\"\\n\\n\").replace(/\\n/g, \"\\n\\t\")));\n }\n }\n };\n derivedConstructor.prototype = semanticProto;\n derivedConstructor.prototype.constructor = derivedConstructor;\n derivedConstructor._RULE_NAMES = ruleNames;\n return derivedConstructor;\n}\nexports.createBaseSemanticVisitorConstructor = createBaseSemanticVisitorConstructor;\nfunction createBaseVisitorConstructorWithDefaults(grammarName, ruleNames, baseConstructor) {\n var derivedConstructor = function () { };\n // can be overwritten according to:\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/\n // name?redirectlocale=en-US&redirectslug=JavaScript%2FReference%2FGlobal_Objects%2FFunction%2Fname\n (0, lang_extensions_1.defineNameProp)(derivedConstructor, grammarName + \"BaseSemanticsWithDefaults\");\n var withDefaultsProto = Object.create(baseConstructor.prototype);\n (0, forEach_1.default)(ruleNames, function (ruleName) {\n withDefaultsProto[ruleName] = defaultVisit;\n });\n derivedConstructor.prototype = withDefaultsProto;\n derivedConstructor.prototype.constructor = derivedConstructor;\n return derivedConstructor;\n}\nexports.createBaseVisitorConstructorWithDefaults = createBaseVisitorConstructorWithDefaults;\nvar CstVisitorDefinitionError;\n(function (CstVisitorDefinitionError) {\n CstVisitorDefinitionError[CstVisitorDefinitionError[\"REDUNDANT_METHOD\"] = 0] = \"REDUNDANT_METHOD\";\n CstVisitorDefinitionError[CstVisitorDefinitionError[\"MISSING_METHOD\"] = 1] = \"MISSING_METHOD\";\n})(CstVisitorDefinitionError = exports.CstVisitorDefinitionError || (exports.CstVisitorDefinitionError = {}));\nfunction validateVisitor(visitorInstance, ruleNames) {\n var missingErrors = validateMissingCstMethods(visitorInstance, ruleNames);\n return missingErrors;\n}\nexports.validateVisitor = validateVisitor;\nfunction validateMissingCstMethods(visitorInstance, ruleNames) {\n var missingRuleNames = (0, filter_1.default)(ruleNames, function (currRuleName) {\n return (0, isFunction_1.default)(visitorInstance[currRuleName]) === false;\n });\n var errors = (0, map_1.default)(missingRuleNames, function (currRuleName) {\n return {\n msg: \"Missing visitor method: <\".concat(currRuleName, \"> on \").concat((visitorInstance.constructor.name), \" CST Visitor.\"),\n type: CstVisitorDefinitionError.MISSING_METHOD,\n methodName: currRuleName\n };\n });\n return (0, compact_1.default)(errors);\n}\nexports.validateMissingCstMethods = validateMissingCstMethods;\n//# sourceMappingURL=cst_visitor.js.map","/** Used to compose unicode character classes. */\nvar rsAstralRange = '\\\\ud800-\\\\udfff',\n rsComboMarksRange = '\\\\u0300-\\\\u036f',\n reComboHalfMarksRange = '\\\\ufe20-\\\\ufe2f',\n rsComboSymbolsRange = '\\\\u20d0-\\\\u20ff',\n rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange,\n rsVarRange = '\\\\ufe0e\\\\ufe0f';\n\n/** Used to compose unicode capture groups. */\nvar rsZWJ = '\\\\u200d';\n\n/** Used to detect strings with [zero-width joiners or code points from the astral planes](http://eev.ee/blog/2015/09/12/dark-corners-of-unicode/). */\nvar reHasUnicode = RegExp('[' + rsZWJ + rsAstralRange + rsComboRange + rsVarRange + ']');\n\n/**\n * Checks if `string` contains Unicode symbols.\n *\n * @private\n * @param {string} string The string to inspect.\n * @returns {boolean} Returns `true` if a symbol is found, else `false`.\n */\nfunction hasUnicode(string) {\n return reHasUnicode.test(string);\n}\n\nmodule.exports = hasUnicode;\n","var arrayEvery = require('./_arrayEvery'),\n baseEvery = require('./_baseEvery'),\n baseIteratee = require('./_baseIteratee'),\n isArray = require('./isArray'),\n isIterateeCall = require('./_isIterateeCall');\n\n/**\n * Checks if `predicate` returns truthy for **all** elements of `collection`.\n * Iteration is stopped once `predicate` returns falsey. The predicate is\n * invoked with three arguments: (value, index|key, collection).\n *\n * **Note:** This method returns `true` for\n * [empty collections](https://en.wikipedia.org/wiki/Empty_set) because\n * [everything is true](https://en.wikipedia.org/wiki/Vacuous_truth) of\n * elements of empty collections.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {boolean} Returns `true` if all elements pass the predicate check,\n * else `false`.\n * @example\n *\n * _.every([true, 1, null, 'yes'], Boolean);\n * // => false\n *\n * var users = [\n * { 'user': 'barney', 'age': 36, 'active': false },\n * { 'user': 'fred', 'age': 40, 'active': false }\n * ];\n *\n * // The `_.matches` iteratee shorthand.\n * _.every(users, { 'user': 'barney', 'active': false });\n * // => false\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.every(users, ['active', false]);\n * // => true\n *\n * // The `_.property` iteratee shorthand.\n * _.every(users, 'active');\n * // => false\n */\nfunction every(collection, predicate, guard) {\n var func = isArray(collection) ? arrayEvery : baseEvery;\n if (guard && isIterateeCall(collection, predicate, guard)) {\n predicate = undefined;\n }\n return func(collection, baseIteratee(predicate, 3));\n}\n\nmodule.exports = every;\n","var arrayEach = require('./_arrayEach'),\n baseEach = require('./_baseEach'),\n castFunction = require('./_castFunction'),\n isArray = require('./isArray');\n\n/**\n * Iterates over elements of `collection` and invokes `iteratee` for each element.\n * The iteratee is invoked with three arguments: (value, index|key, collection).\n * Iteratee functions may exit iteration early by explicitly returning `false`.\n *\n * **Note:** As with other \"Collections\" methods, objects with a \"length\"\n * property are iterated like arrays. To avoid this behavior use `_.forIn`\n * or `_.forOwn` for object iteration.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @alias each\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Array|Object} Returns `collection`.\n * @see _.forEachRight\n * @example\n *\n * _.forEach([1, 2], function(value) {\n * console.log(value);\n * });\n * // => Logs `1` then `2`.\n *\n * _.forEach({ 'a': 1, 'b': 2 }, function(value, key) {\n * console.log(key);\n * });\n * // => Logs 'a' then 'b' (iteration order is not guaranteed).\n */\nfunction forEach(collection, iteratee) {\n var func = isArray(collection) ? arrayEach : baseEach;\n return func(collection, castFunction(iteratee));\n}\n\nmodule.exports = forEach;\n","/**\n * A specialized version of `_.filter` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {Array} Returns the new filtered array.\n */\nfunction arrayFilter(array, predicate) {\n var index = -1,\n length = array == null ? 0 : array.length,\n resIndex = 0,\n result = [];\n\n while (++index < length) {\n var value = array[index];\n if (predicate(value, index, array)) {\n result[resIndex++] = value;\n }\n }\n return result;\n}\n\nmodule.exports = arrayFilter;\n","/**\n * Checks if a stack value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Stack\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction stackHas(key) {\n return this.__data__.has(key);\n}\n\nmodule.exports = stackHas;\n","var baseIndexOf = require('./_baseIndexOf'),\n isArrayLike = require('./isArrayLike'),\n isString = require('./isString'),\n toInteger = require('./toInteger'),\n values = require('./values');\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max;\n\n/**\n * Checks if `value` is in `collection`. If `collection` is a string, it's\n * checked for a substring of `value`, otherwise\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * is used for equality comparisons. If `fromIndex` is negative, it's used as\n * the offset from the end of `collection`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object|string} collection The collection to inspect.\n * @param {*} value The value to search for.\n * @param {number} [fromIndex=0] The index to search from.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`.\n * @returns {boolean} Returns `true` if `value` is found, else `false`.\n * @example\n *\n * _.includes([1, 2, 3], 1);\n * // => true\n *\n * _.includes([1, 2, 3], 1, 2);\n * // => false\n *\n * _.includes({ 'a': 1, 'b': 2 }, 1);\n * // => true\n *\n * _.includes('abcd', 'bc');\n * // => true\n */\nfunction includes(collection, value, fromIndex, guard) {\n collection = isArrayLike(collection) ? collection : values(collection);\n fromIndex = (fromIndex && !guard) ? toInteger(fromIndex) : 0;\n\n var length = collection.length;\n if (fromIndex < 0) {\n fromIndex = nativeMax(length + fromIndex, 0);\n }\n return isString(collection)\n ? (fromIndex <= length && collection.indexOf(value, fromIndex) > -1)\n : (!!length && baseIndexOf(collection, value, fromIndex) > -1);\n}\n\nmodule.exports = includes;\n","/**\n * This function is like `arrayIncludes` except that it accepts a comparator.\n *\n * @private\n * @param {Array} [array] The array to inspect.\n * @param {*} target The value to search for.\n * @param {Function} comparator The comparator invoked per element.\n * @returns {boolean} Returns `true` if `target` is found, else `false`.\n */\nfunction arrayIncludesWith(array, value, comparator) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n while (++index < length) {\n if (comparator(value, array[index])) {\n return true;\n }\n }\n return false;\n}\n\nmodule.exports = arrayIncludesWith;\n","\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.validateGrammar = exports.resolveGrammar = void 0;\nvar forEach_1 = __importDefault(require(\"lodash/forEach\"));\nvar defaults_1 = __importDefault(require(\"lodash/defaults\"));\nvar resolver_1 = require(\"../resolver\");\nvar checks_1 = require(\"../checks\");\nvar errors_public_1 = require(\"../../errors_public\");\nfunction resolveGrammar(options) {\n var actualOptions = (0, defaults_1.default)(options, {\n errMsgProvider: errors_public_1.defaultGrammarResolverErrorProvider\n });\n var topRulesTable = {};\n (0, forEach_1.default)(options.rules, function (rule) {\n topRulesTable[rule.name] = rule;\n });\n return (0, resolver_1.resolveGrammar)(topRulesTable, actualOptions.errMsgProvider);\n}\nexports.resolveGrammar = resolveGrammar;\nfunction validateGrammar(options) {\n options = (0, defaults_1.default)(options, {\n errMsgProvider: errors_public_1.defaultGrammarValidatorErrorProvider\n });\n return (0, checks_1.validateGrammar)(options.rules, options.tokenTypes, options.errMsgProvider, options.grammarName);\n}\nexports.validateGrammar = validateGrammar;\n//# sourceMappingURL=gast_resolver_public.js.map","/**\n * This method returns `false`.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {boolean} Returns `false`.\n * @example\n *\n * _.times(2, _.stubFalse);\n * // => [false, false]\n */\nfunction stubFalse() {\n return false;\n}\n\nmodule.exports = stubFalse;\n","var Stack = require('./_Stack'),\n arrayEach = require('./_arrayEach'),\n assignValue = require('./_assignValue'),\n baseAssign = require('./_baseAssign'),\n baseAssignIn = require('./_baseAssignIn'),\n cloneBuffer = require('./_cloneBuffer'),\n copyArray = require('./_copyArray'),\n copySymbols = require('./_copySymbols'),\n copySymbolsIn = require('./_copySymbolsIn'),\n getAllKeys = require('./_getAllKeys'),\n getAllKeysIn = require('./_getAllKeysIn'),\n getTag = require('./_getTag'),\n initCloneArray = require('./_initCloneArray'),\n initCloneByTag = require('./_initCloneByTag'),\n initCloneObject = require('./_initCloneObject'),\n isArray = require('./isArray'),\n isBuffer = require('./isBuffer'),\n isMap = require('./isMap'),\n isObject = require('./isObject'),\n isSet = require('./isSet'),\n keys = require('./keys'),\n keysIn = require('./keysIn');\n\n/** Used to compose bitmasks for cloning. */\nvar CLONE_DEEP_FLAG = 1,\n CLONE_FLAT_FLAG = 2,\n CLONE_SYMBOLS_FLAG = 4;\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n arrayTag = '[object Array]',\n boolTag = '[object Boolean]',\n dateTag = '[object Date]',\n errorTag = '[object Error]',\n funcTag = '[object Function]',\n genTag = '[object GeneratorFunction]',\n mapTag = '[object Map]',\n numberTag = '[object Number]',\n objectTag = '[object Object]',\n regexpTag = '[object RegExp]',\n setTag = '[object Set]',\n stringTag = '[object String]',\n symbolTag = '[object Symbol]',\n weakMapTag = '[object WeakMap]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n dataViewTag = '[object DataView]',\n float32Tag = '[object Float32Array]',\n float64Tag = '[object Float64Array]',\n int8Tag = '[object Int8Array]',\n int16Tag = '[object Int16Array]',\n int32Tag = '[object Int32Array]',\n uint8Tag = '[object Uint8Array]',\n uint8ClampedTag = '[object Uint8ClampedArray]',\n uint16Tag = '[object Uint16Array]',\n uint32Tag = '[object Uint32Array]';\n\n/** Used to identify `toStringTag` values supported by `_.clone`. */\nvar cloneableTags = {};\ncloneableTags[argsTag] = cloneableTags[arrayTag] =\ncloneableTags[arrayBufferTag] = cloneableTags[dataViewTag] =\ncloneableTags[boolTag] = cloneableTags[dateTag] =\ncloneableTags[float32Tag] = cloneableTags[float64Tag] =\ncloneableTags[int8Tag] = cloneableTags[int16Tag] =\ncloneableTags[int32Tag] = cloneableTags[mapTag] =\ncloneableTags[numberTag] = cloneableTags[objectTag] =\ncloneableTags[regexpTag] = cloneableTags[setTag] =\ncloneableTags[stringTag] = cloneableTags[symbolTag] =\ncloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] =\ncloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true;\ncloneableTags[errorTag] = cloneableTags[funcTag] =\ncloneableTags[weakMapTag] = false;\n\n/**\n * The base implementation of `_.clone` and `_.cloneDeep` which tracks\n * traversed objects.\n *\n * @private\n * @param {*} value The value to clone.\n * @param {boolean} bitmask The bitmask flags.\n * 1 - Deep clone\n * 2 - Flatten inherited properties\n * 4 - Clone symbols\n * @param {Function} [customizer] The function to customize cloning.\n * @param {string} [key] The key of `value`.\n * @param {Object} [object] The parent object of `value`.\n * @param {Object} [stack] Tracks traversed objects and their clone counterparts.\n * @returns {*} Returns the cloned value.\n */\nfunction baseClone(value, bitmask, customizer, key, object, stack) {\n var result,\n isDeep = bitmask & CLONE_DEEP_FLAG,\n isFlat = bitmask & CLONE_FLAT_FLAG,\n isFull = bitmask & CLONE_SYMBOLS_FLAG;\n\n if (customizer) {\n result = object ? customizer(value, key, object, stack) : customizer(value);\n }\n if (result !== undefined) {\n return result;\n }\n if (!isObject(value)) {\n return value;\n }\n var isArr = isArray(value);\n if (isArr) {\n result = initCloneArray(value);\n if (!isDeep) {\n return copyArray(value, result);\n }\n } else {\n var tag = getTag(value),\n isFunc = tag == funcTag || tag == genTag;\n\n if (isBuffer(value)) {\n return cloneBuffer(value, isDeep);\n }\n if (tag == objectTag || tag == argsTag || (isFunc && !object)) {\n result = (isFlat || isFunc) ? {} : initCloneObject(value);\n if (!isDeep) {\n return isFlat\n ? copySymbolsIn(value, baseAssignIn(result, value))\n : copySymbols(value, baseAssign(result, value));\n }\n } else {\n if (!cloneableTags[tag]) {\n return object ? value : {};\n }\n result = initCloneByTag(value, tag, isDeep);\n }\n }\n // Check for circular references and return its corresponding clone.\n stack || (stack = new Stack);\n var stacked = stack.get(value);\n if (stacked) {\n return stacked;\n }\n stack.set(value, result);\n\n if (isSet(value)) {\n value.forEach(function(subValue) {\n result.add(baseClone(subValue, bitmask, customizer, subValue, value, stack));\n });\n } else if (isMap(value)) {\n value.forEach(function(subValue, key) {\n result.set(key, baseClone(subValue, bitmask, customizer, key, value, stack));\n });\n }\n\n var keysFunc = isFull\n ? (isFlat ? getAllKeysIn : getAllKeys)\n : (isFlat ? keysIn : keys);\n\n var props = isArr ? undefined : keysFunc(value);\n arrayEach(props || value, function(subValue, key) {\n if (props) {\n key = subValue;\n subValue = value[key];\n }\n // Recursively populate clone (susceptible to call stack limits).\n assignValue(result, key, baseClone(subValue, bitmask, customizer, key, value, stack));\n });\n return result;\n}\n\nmodule.exports = baseClone;\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\tid: moduleId,\n\t\tloaded: false,\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Flag the module as loaded\n\tmodule.loaded = true;\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.nmd = (module) => {\n\tmodule.paths = [];\n\tif (!module.children) module.children = [];\n\treturn module;\n};","/**\n * jQuery Calx Plugin - Backward Compatibility Wrapper\n * Wraps the modern Calx.js implementation with jQuery plugin API\n */\n\nimport { Calx } from './Calx';\nimport { Workbook } from './Calx/Workbook';\nimport { Sheet } from './Calx/Sheet';\nimport { DataType } from './Calx/Cell/DataType';\nimport { FormatterInterface } from './Calx/Cell/Formatter';\n\ninterface JQueryCalxOptions {\n data?: Record;\n autoCalculate?: boolean;\n variables?: Record;\n functions?: Record;\n formatters?: Record;\n styleFormatters?: Record;\n}\n\ninterface SheetData {\n [cellAddress: string]: CellConfig;\n}\n\ninterface CellConfig {\n value?: any;\n formula?: string;\n format?: string;\n type?: DataType;\n styleFormatter?: StyleFormatterFunction;\n}\n\ntype StyleFormatterFunction = (value: any, $element: any) => Record | void;\n\ninterface JQuery {\n calx(options?: JQueryCalxOptions | string, ...args: any[]): any;\n}\n\n// Extend jQuery\n(function($: any) {\n if (!$) {\n console.warn('jQuery not found. The Calx jQuery plugin requires jQuery to be loaded first.');\n return;\n }\n\n // Store workbook instances per element group\n const workbooks = new WeakMap();\n\n // Global formatter registry with predefined formatters\n // Each formatter has format() and parse() methods for input-mask behavior\n const formatterRegistry: Record = {\n currency: {\n format: (value: any): string => {\n if (value == null || isNaN(value)) return '';\n return '$' + Number(value).toFixed(2).replace(/\\B(?=(\\d{3})+(?!\\d))/g, ',');\n },\n parse: (input: string): any => {\n // Strip currency symbols, commas, spaces\n const cleaned = String(input).replace(/[$,\\s]/g, '');\n const num = parseFloat(cleaned);\n return isNaN(num) ? null : num;\n }\n },\n percent: {\n format: (value: any): string => {\n if (value == null || isNaN(value)) return '';\n return (Number(value) * 100).toFixed(2) + '%';\n },\n parse: (input: string): any => {\n const inputStr = String(input).trim();\n // Check if input already contains % symbol\n const hasPercent = inputStr.includes('%');\n // Strip % symbol and spaces\n const cleaned = inputStr.replace(/[%\\s]/g, '');\n const num = parseFloat(cleaned);\n if (isNaN(num)) return null;\n // If user typed \"30%\", interpret as 30% (store as 0.30)\n // If user typed \"30\", interpret as raw value 30 (displays as 3000%)\n return hasPercent ? num / 100 : num;\n }\n },\n number: {\n format: (value: any): string => {\n if (value == null || isNaN(value)) return '';\n return Number(value).toFixed(2);\n },\n parse: (input: string): any => {\n const num = parseFloat(String(input));\n return isNaN(num) ? null : num;\n }\n },\n integer: {\n format: (value: any): string => {\n if (value == null || isNaN(value)) return '';\n return Math.round(Number(value)).toString();\n },\n parse: (input: string): any => {\n const num = parseFloat(String(input));\n return isNaN(num) ? null : Math.round(num);\n }\n },\n text: {\n format: (value: any): string => {\n return value != null ? String(value) : '';\n },\n parse: (input: string): any => {\n return input;\n }\n }\n };\n\n // Global function registry\n const functionRegistry: Record = {};\n\n // Global style formatter registry\n const styleFormatterRegistry: Record = {\n negative: (value: any, $element: any) => {\n if (value < 0) {\n return { color: 'red' };\n }\n return { color: '' }; // Reset color\n },\n positive: (value: any, $element: any) => {\n if (value > 0) {\n return { color: 'green' };\n }\n return { color: '' }; // Reset color\n },\n zero: (value: any, $element: any) => {\n if (value === 0) {\n return { color: 'gray' };\n }\n return { color: '' }; // Reset color\n }\n };\n\n /**\n * Register a custom formatter\n */\n $.calx = {\n registerFormatter: function(name: string, formatter: FormatterInterface) {\n formatterRegistry[name] = formatter;\n },\n\n registerFunction: function(name: string, func: Function) {\n functionRegistry[name.toUpperCase()] = func;\n // Also register with Calx core\n Calx.setFormula(name.toUpperCase(), func);\n },\n\n registerStyleFormatter: function(name: string, formatter: StyleFormatterFunction) {\n styleFormatterRegistry[name] = formatter;\n },\n\n getFormatter: function(name: string): FormatterInterface | undefined {\n return formatterRegistry[name];\n }\n };\n\n $.fn.calx = function(this: any, options?: JQueryCalxOptions | string, ...args: any[]) {\n // Handle method calls\n if (typeof options === 'string') {\n const method = options;\n const element = this[0];\n const workbook = workbooks.get(element);\n\n if (!workbook) {\n console.error('Calx not initialized on this element');\n return this;\n }\n\n return handleMethodCall(workbook, element, method, args);\n }\n\n // Initialize options with defaults\n const opts = $.extend(true, {\n data: {},\n autoCalculate: true,\n variables: {},\n functions: {},\n formatters: {},\n styleFormatters: {}\n }, options);\n\n // Register custom functions\n if (opts.functions) {\n Object.keys(opts.functions).forEach(name => {\n $.calx.registerFunction(name, opts.functions[name]);\n });\n }\n\n // Register custom formatters\n if (opts.formatters) {\n Object.keys(opts.formatters).forEach(name => {\n $.calx.registerFormatter(name, opts.formatters[name]);\n });\n }\n\n // Register custom style formatters\n if (opts.styleFormatters) {\n Object.keys(opts.styleFormatters).forEach(name => {\n styleFormatterRegistry[name] = opts.styleFormatters[name];\n });\n }\n\n // Determine if data has sheet structure or flat cell structure\n const hasSheetStructure = opts.data && Object.keys(opts.data).some(key => {\n const value = opts.data[key];\n return typeof value === 'object' && !('value' in value || 'formula' in value);\n });\n\n // Create one workbook for all selected elements\n const workbook = Calx.createWorkbook();\n\n // Process variables via NameManager\n if (opts.variables) {\n Object.keys(opts.variables).forEach(varName => {\n const reference = opts.variables[varName];\n workbook.nameManager.define(varName, reference);\n });\n }\n\n // First pass: Create all sheets to avoid race conditions with cross-sheet references\n const sheetElements: Array<{element: any, sheetName: string, sheetData: SheetData}> = [];\n\n this.each(function(this: HTMLElement, index: number) {\n const $element = $(this);\n\n // Determine sheet name from element ID or data-sheet attribute\n let sheetName = $element.attr('id') || $element.attr('data-sheet') || `Sheet${index + 1}`;\n\n // Get sheet-specific data from config if it exists\n const sheetData = hasSheetStructure && opts.data[sheetName]\n ? opts.data[sheetName] as SheetData\n : (hasSheetStructure ? {} : opts.data as SheetData);\n\n // Try to get existing sheet, create if it doesn't exist\n let sheet;\n try {\n sheet = workbook.getSheet(sheetName);\n } catch (e) {\n sheet = workbook.createSheet(sheetName);\n sheet.autoCalculate = opts.autoCalculate !== false; // Enable by default\n }\n\n // Store for second pass\n sheetElements.push({\n element: $element,\n sheetName: sheetName,\n sheetData: sheetData\n });\n\n // Store workbook reference on ALL elements\n workbooks.set(this, workbook);\n });\n\n // Second pass: Process all sheet data now that all sheets exist\n sheetElements.forEach(({element, sheetName, sheetData}) => {\n const sheet = workbook.getSheet(sheetName);\n if (sheet) {\n processSheetData(workbook, element, sheet, sheetData, opts);\n }\n });\n\n // Build and calculate\n workbook.build();\n\n // Mark all cells as dirty to ensure proper calculation on first load\n // This is important for cross-sheet references that may not have been resolved during cell creation\n sheetElements.forEach(({sheetName}) => {\n const sheet = workbook.getSheet(sheetName);\n if (sheet) {\n const cells = sheet.cells;\n for (const address in cells) {\n const cell = cells[address];\n if (cell.formula) {\n cell.markAsDirty();\n }\n }\n }\n });\n\n workbook.calculate();\n\n // Update all cells in all sheets\n this.each(function(this: HTMLElement, index: number) {\n const $element = $(this);\n const sheetName = $element.attr('id') || $element.attr('data-sheet') || `Sheet${index + 1}`;\n const sheet = workbook.getSheet(sheetName);\n if (sheet) {\n updateAllCells(sheet, $element);\n }\n });\n\n return this;\n };\n\n /**\n * Process sheet data (cells and formulas) after sheet is created\n */\n function processSheetData(\n workbook: Workbook,\n $element: any,\n sheet: Sheet,\n sheetData: SheetData,\n opts: JQueryCalxOptions\n ): void {\n // Process HTML elements with data-cell/data-formula attributes first\n // This will auto-assign CALX addresses to elements with data-formula but no data-cell\n processDataAttributes($element, sheet);\n\n // Process data configuration from arguments and merge with HTML attributes\n // Data from arguments takes precedence over HTML attributes\n if (sheetData) {\n Object.keys(sheetData).forEach(cellRef => {\n const config = sheetData[cellRef];\n const cell = sheet.getCell(cellRef);\n\n // Merge: data from arguments overrides HTML attributes\n if (config.value !== undefined) {\n cell.value = config.value;\n }\n if (config.formula) {\n cell.formula = config.formula;\n }\n if (config.format) {\n cell.format = config.format;\n }\n if (config.type) {\n cell.type = config.type;\n }\n });\n }\n\n // Listen to cell value changes to update DOM\n sheet.listen('VALUE_CHANGED', (event: any) => {\n const { address } = event;\n const $cell = $element.find(`[data-cell=\"${address}\"]`);\n if ($cell.length) {\n const cell = sheet.getCell(address);\n const value = cell.value;\n\n // Skip updating focused inputs (user is typing)\n if ($cell.is('input, textarea') && $cell.is(':focus')) {\n return;\n }\n\n // Apply formatter: data-format attribute > cell.format property > raw value\n const dataFormat = $cell.attr('data-format');\n const cellFormat = cell.format;\n let formattedValue: string;\n\n if (dataFormat && formatterRegistry[dataFormat]) {\n formattedValue = formatterRegistry[dataFormat].format(value);\n } else if (cellFormat && formatterRegistry[cellFormat]) {\n formattedValue = formatterRegistry[cellFormat].format(value);\n } else {\n // Render as-is fallback\n formattedValue = value != null ? String(value) : '';\n }\n\n if ($cell.is('input, select, textarea')) {\n $cell.val(formattedValue);\n } else {\n $cell.text(formattedValue);\n }\n\n // Apply conditional styling (style formatter)\n applyStyleFormatter(value, $cell);\n }\n });\n\n // Handle focus on formatted inputs: show raw value for editing\n $element.on('focus', 'input[data-format], textarea[data-format]', function() {\n const $input = $(this);\n const cellAddress = $input.attr('data-cell') || $input.attr('data-formula');\n\n if (cellAddress) {\n const cell = sheet.getCellDirect(cellAddress);\n if (cell) {\n const rawValue = cell.value;\n $input.val(rawValue != null ? String(rawValue) : '');\n }\n }\n });\n\n // Handle blur on formatted inputs: parse and format value (input-mask behavior)\n $element.on('blur', 'input[data-format], textarea[data-format]', function(e) {\n const $input = $(this);\n let cellAddress = $input.attr('data-cell') || $input.attr('data-formula');\n\n if (cellAddress) {\n const cell = sheet.getCellDirect(cellAddress);\n if (cell) {\n const dataFormat = $input.attr('data-format');\n const cellFormat = cell.format;\n\n // Determine which formatter to use\n const formatter = (dataFormat && formatterRegistry[dataFormat])\n || (cellFormat && formatterRegistry[cellFormat]);\n\n if (formatter) {\n // Format for display immediately (legacy calx approach)\n const formattedValue = formatter.format(cell.value);\n $input.val(formattedValue);\n }\n }\n }\n });\n\n // Handle change on formatted inputs: parse and calculate\n $element.on('change', 'input[data-format], textarea[data-format]', function(e) {\n const $input = $(this);\n let cellAddress = $input.attr('data-cell') || $input.attr('data-formula');\n\n if (cellAddress) {\n const cell = sheet.getCellDirect(cellAddress);\n if (cell) {\n // Get the raw input value\n const rawInput = $input.val();\n const dataFormat = $input.attr('data-format');\n const cellFormat = cell.format;\n\n // Determine which formatter to use\n const formatter = (dataFormat && formatterRegistry[dataFormat])\n || (cellFormat && formatterRegistry[cellFormat]);\n\n if (formatter && formatter.parse) {\n // Parse the input (handles $2, 2, $2.00, etc.) - only for editable cells\n const isReadonly = $input.prop('readonly');\n const hasFormula = !!$input.attr('data-formula');\n\n if (!isReadonly && !hasFormula) {\n const parsedValue = formatter.parse(rawInput);\n\n // Update the cell value with parsed value\n if (parsedValue !== null && parsedValue !== cell.value) {\n cell.value = parsedValue;\n\n // Trigger calculation if auto-calculate is enabled\n if (opts.autoCalculate) {\n workbook.calculate();\n // Update all cells in workbook\n const allElements: HTMLElement[] = [];\n $('body').find('*').each(function(this: HTMLElement) {\n if (workbooks.get(this) === workbook) {\n allElements.push(this);\n }\n });\n updateAllCellsInWorkbook(workbook, $(allElements));\n }\n }\n }\n }\n }\n }\n });\n\n // Setup auto-calculation on input changes\n if (opts.autoCalculate) {\n $element.on('input change', '[data-cell], [data-formula]', function() {\n const $input = $(this);\n let cellRef = $input.attr('data-cell') || $input.attr('data-formula');\n\n if (cellRef) {\n // Skip inputs with data-format - let blur handler parse them\n const hasFormat = $input.attr('data-format');\n if (hasFormat) {\n return;\n }\n\n const cell = sheet.getCellDirect(cellRef);\n if (cell) {\n const newValue = $input.val();\n if (typeof newValue === 'string' || typeof newValue === 'number') {\n cell.value = newValue;\n }\n\n workbook.calculate();\n\n // Update all sheets in the workbook by finding all elements that share this workbook\n const allElements: HTMLElement[] = [];\n $('body').find('*').each(function(this: HTMLElement) {\n if (workbooks.get(this) === workbook) {\n allElements.push(this);\n }\n });\n updateAllCellsInWorkbook(workbook, $(allElements));\n }\n }\n });\n }\n }\n\n /**\n * Process data attributes on HTML elements\n */\n function processDataAttributes($element: any, sheet: Sheet): void {\n let calxCounter = 1;\n\n // First pass: Process elements with data-formula but no data-cell (auto-assign addresses)\n $element.find('[data-formula]:not([data-cell])').each(function(this: HTMLElement) {\n const $el = $(this);\n const autoAddress = `CALX${calxCounter}`;\n $el.attr('data-cell', autoAddress);\n calxCounter++;\n });\n\n // Second pass: Process all elements with data-cell (including auto-assigned ones)\n $element.find('[data-cell]').each(function(this: HTMLElement) {\n const $cell = $(this);\n const cellAddress = $cell.attr('data-cell');\n\n if (!cellAddress) return;\n\n // Register named variable if data-var is specified\n const varName = $cell.attr('data-var');\n if (varName) {\n const workbook = sheet.workbook;\n workbook.nameManager.define(varName, cellAddress);\n }\n\n // Get cell configuration from attributes\n const formula = $cell.attr('data-formula');\n const format = $cell.attr('data-format');\n const dataType = $cell.attr('data-type');\n\n // Get initial value from input/element\n const tagName = $cell.prop('tagName').toLowerCase();\n let initialValue: any = null;\n\n if (tagName === 'input' || tagName === 'textarea' || tagName === 'select') {\n initialValue = $cell.val();\n } else {\n initialValue = $cell.text().trim();\n }\n\n // Parse initial value if formatter is present (for values like \"25%\" or \"$1000\")\n if (initialValue && format && formatterRegistry[format] && formatterRegistry[format].parse) {\n initialValue = formatterRegistry[format].parse(initialValue);\n }\n\n // Get or create cell\n const cell = sheet.getCell(cellAddress);\n\n // Set type FIRST if specified (before setting value)\n if (dataType) {\n switch (dataType.toLowerCase()) {\n case 'number':\n cell.type = DataType.NUMBER;\n break;\n case 'text':\n cell.type = DataType.TEXT;\n break;\n case 'boolean':\n cell.type = DataType.BOOLEAN;\n break;\n case 'date':\n cell.type = DataType.DATE;\n break;\n }\n }\n\n // Set formula if specified\n if (formula) {\n cell.formula = formula;\n } else if (initialValue !== null) {\n cell.value = initialValue;\n }\n\n // Set format if specified\n if (format) {\n cell.format = format;\n }\n });\n }\n\n /**\n * Update all cells in all sheets of a workbook\n */\n function updateAllCellsInWorkbook(workbook: Workbook, $elements: any): void {\n $elements.each(function(this: HTMLElement) {\n const $element = $(this);\n const sheetName = $element.attr('id') || $element.attr('data-sheet');\n if (sheetName) {\n try {\n const sheet = workbook.getSheet(sheetName);\n if (sheet) {\n updateAllCells(sheet, $element);\n }\n } catch (e) {\n // Sheet might not exist, skip it\n }\n }\n });\n }\n\n /**\n * Update all cell elements with their current values\n */\n function updateAllCells(sheet: Sheet, $element: any): void {\n $element.find('[data-cell]').each(function(this: HTMLElement) {\n const $cell = $(this);\n const cellAddress = $cell.attr('data-cell');\n\n if (!cellAddress) return;\n\n const cell = sheet.getCellDirect(cellAddress);\n if (!cell) return;\n\n const value = cell.value;\n\n // Apply formatter: data-format attribute > cell.format property > raw value\n const dataFormat = $cell.attr('data-format');\n const cellFormat = cell.format;\n let formattedValue: string;\n\n if (dataFormat && formatterRegistry[dataFormat]) {\n formattedValue = formatterRegistry[dataFormat].format(value);\n } else if (cellFormat && formatterRegistry[cellFormat]) {\n formattedValue = formatterRegistry[cellFormat].format(value);\n } else {\n // Render as-is fallback\n formattedValue = value != null ? String(value) : '';\n }\n\n const tagName = $cell.prop('tagName').toLowerCase();\n\n // Don't update if this is the active/focused element (user is typing)\n if (document.activeElement === this) {\n return;\n }\n\n if (tagName === 'input' || tagName === 'textarea' || tagName === 'select') {\n // Only update if value has changed to avoid cursor jumping\n if ($cell.val() !== formattedValue) {\n $cell.val(formattedValue);\n }\n } else {\n $cell.text(formattedValue);\n }\n\n // Apply conditional styling (style formatter)\n applyStyleFormatter(value, $cell);\n });\n }\n\n /**\n * Apply conditional styling to a cell element\n */\n function applyStyleFormatter(value: any, $element: any): void {\n const styleFormatterName = $element.attr('data-style-if');\n\n if (styleFormatterName && styleFormatterRegistry[styleFormatterName]) {\n const css = styleFormatterRegistry[styleFormatterName](value, $element);\n if (css && typeof css === 'object') {\n // Always apply CSS to allow resetting styles\n $element.css(css);\n }\n }\n }\n\n /**\n * Handle method calls on initialized Calx instances\n */\n function handleMethodCall(workbook: Workbook, element: HTMLElement, method: string, args: any[]): any {\n // Determine the sheet name from the element or from the cell address\n let sheetName: string;\n\n if (args[0] && typeof args[0] === 'string' && args[0].includes('!')) {\n // Cell address includes sheet name (e.g., \"Sheet1!A1\")\n sheetName = args[0].split('!')[0].replace('#', '');\n } else {\n // Use element's ID or data-sheet attribute as sheet name\n const $element = $(element);\n sheetName = $element.attr('id') || $element.attr('data-sheet') || 'Sheet1';\n }\n\n const sheet = workbook.getSheet(sheetName);\n\n if (!sheet) {\n console.error(`Sheet '${sheetName}' not found`);\n return null;\n }\n\n switch (method) {\n case 'getCell':\n const address = args[0];\n return sheet.getCellDirect(address);\n\n case 'getCellValue':\n return sheet.getCellValue(args[0]);\n\n case 'setCellValue':\n const cellToSet = sheet.getCellDirect(args[0]);\n cellToSet.value = args[1];\n workbook.calculate();\n return workbook;\n\n case 'setCellFormula':\n const cellToSetFormula = sheet.getCellDirect(args[0]);\n cellToSetFormula.formula = args[1];\n workbook.build();\n workbook.calculate();\n return workbook;\n\n case 'calculate':\n workbook.calculate();\n return workbook;\n\n case 'build':\n workbook.build();\n return workbook;\n\n case 'getWorkbook':\n return workbook;\n\n case 'getSheet':\n const requestedSheet = args[0] ? workbook.getSheet(args[0]) : sheet;\n return requestedSheet;\n\n case 'destroy':\n // Clean up event listeners and references\n workbooks.delete(element);\n return null;\n\n default:\n console.warn(`Method '${method}' not found`);\n return workbook;\n }\n }\n\n})(typeof jQuery !== 'undefined' ? jQuery : typeof $ !== 'undefined' ? $ : null);\n\n// Export for module systems\nexport {};\n"],"names":["root","factory","exports","module","define","amd","a","i","this","baseGetAllKeys","getSymbols","keys","object","listCacheClear","listCacheDelete","listCacheGet","listCacheHas","listCacheSet","ListCache","entries","index","length","clear","entry","set","prototype","get","has","assocIndexOf","splice","Array","key","data","__data__","pop","call","size","MapCache","memoize","func","resolver","TypeError","memoized","args","arguments","apply","cache","result","Cache","extendStatics","__extends","d","b","Object","setPrototypeOf","__proto__","p","hasOwnProperty","String","__","constructor","create","__importDefault","mod","__esModule","defineProperty","value","EarlyExitException","NotAllInputParsedException","NoViableAltException","MismatchedTokenException","isRecognitionException","includes_1","MISMATCHED_TOKEN_EXCEPTION","NO_VIABLE_ALT_EXCEPTION","EARLY_EXIT_EXCEPTION","NOT_ALL_INPUT_PARSED_EXCEPTION","RECOGNITION_EXCEPTION_NAMES","freeze","error","default","name","RecognitionException","_super","message","token","_newTarget","_this","resyncedTokens","Error","captureStackTrace","previousToken","Lexer","LexerDefinitionErrorType","lexer_1","noop_1","isEmpty_1","isArray_1","last_1","reject_1","map_1","forEach_1","keys_1","isUndefined_1","identity_1","assign_1","reduce_1","clone_1","utils_1","tokens_1","lexer_errors_public_1","reg_exp_parser_1","DEFAULT_LEXER_CONFIG","deferDefinitionErrorsHandling","positionTracking","lineTerminatorsPattern","lineTerminatorCharacters","ensureOptimizations","safeMode","errorMessageProvider","defaultLexerErrorProvider","traceInitPerf","skipValidations","recoveryEnabled","lexerDefinition","config","lexerDefinitionErrors","lexerDefinitionWarning","patternIdxToConfig","charCodeToPatternIdxToConfig","modes","emptyGroups","trackStartLines","trackEndLines","hasCustom","canModeBeOptimized","TRACE_INIT","phaseDesc","phaseImpl","traceInitIndent","indent","join","traceInitMaxIdent","console","log","concat","_a","timer","time","traceMethod","warn","traceInitVal","Infinity","actualDefinition","hasOnlySingleMode","LineTerminatorOptimizedTester","test","defaultMode","DEFAULT_MODE","performRuntimeChecks","performWarningRuntimeChecks","currModeValue","currModeName","currTokType","allModeNames","currModDef","currModName","currAnalyzeResult_1","push","validatePatterns","augmentTokenTypes","analyzeTokenTypes","tracer","canBeOptimized","allErrMessagesString","warningDescriptor","PRINT_WARNING","SUPPORT_STICKY","chopInput","match","matchWithTest","updateLastIndex","matchWithExec","handleModes","computeNewColumn","updateTokenEndLineColumnLocation","createTokenInstance","createFullToken","createStartOnlyToken","createOffsetOnlyToken","addToken","addTokenUsingPush","handlePayload","handlePayloadWithCustom","addTokenUsingMemberAccess","handlePayloadNoCustom","unOptimizedModes","cannotBeOptimized","modeName","clearRegExpParserCache","toFastProperties","tokenize","text","initialMode","tokenizeInternal","j","k","matchAltImage","longerAlt","matchedImage","payload","altPayload","imageLength","group","tokType","newToken","errLength","msg","getPossiblePatterns","orgText","orgLength","offset","matchedTokensIndex","guessedNumberOfTokens","Math","floor","matchedTokens","errors","line","undefined","column","groups","cloneEmptyGroups","trackLines","lineTerminatorPattern","currModePatternsLength","currCharCodeToPatternIdxToConfig","modeStack","emptyArray","getPossiblePatternsSlow","getPossiblePatternsOptimized","charCode","optimizedCharIdx","charCodeToOptimizedIndex","possiblePatterns","currConfig","pop_mode","popToken","tokenType","PUSH_MODE","msg_1","buildUnableToPopLexerModeMessage","startOffset","startLine","startColumn","image","newMode","modeCanBeOptimized","push_mode","nextCharCode","charCodeAt","chosenPatternIdxToConfig","chosenPatternsLength","currPattern","pattern","singleCharCode","short","isCustom","exec","longerAltLength","longerAltConfig","longerAltPattern","tokenTypeIdx","canLineTerminator","numOfLTsInMatch","foundTerminator","lastLTEndOffset","lastIndex","errorStartOffset","errorLine","errorColumn","foundResyncPoint","currConfig_1","buildUnexpectedCharactersMessage","tokens","pushMode","substring","regExp","newLastIndex","lastLTIdx","lastCharIsLT","fixForEndingInLT","endLine","endColumn","oldColumn","endOffset","tokenVector","tokenToAdd","regExpArray","SKIPPED","NA","baseIsEqualDeep","isObjectLike","baseIsEqual","other","bitmask","customizer","stack","getMapData","map","forEach","reIsUint","type","getRegExpAst","regexp_to_ast_1","regExpAstCache","regExpParser","RegExpParser","regExpStr","toString","regExpAst","fullText","charAt","__assign","assign","t","s","n","checkPrefixAlternativesAmbiguities","validateSomeNonEmptyLookaheadPath","validateTooManyAlts","RepetitionCollector","validateAmbiguousAlternationAlternatives","validateEmptyOrAlternative","getFirstNoneTerminal","validateNoLeftRecursion","validateRuleIsOverridden","validateRuleDoesNotAlreadyExist","OccurrenceValidationCollector","identifyProductionForDuplicates","validateGrammar","validateLookahead","first_1","drop_1","flatten_1","filter_1","difference_1","groupBy_1","pickBy_1","values_1","flatMap_1","parser_1","gast_1","lookahead_1","interpreter_1","gast_2","gast_3","dropRight_1","compact_1","prod","getProductionDslName","idx","getExtraProductionArgument","Terminal","terminalType","NonTerminal","nonTerminalName","options","lookaheadValidationErrorMessages","lookaheadStrategy","validate","rules","tokenTypes","grammarName","errorMessage","ParserDefinitionErrorType","CUSTOM_LOOKAHEAD_VALIDATION","topLevels","errMsgProvider","duplicateErrors","currTopLevel","topLevelRule","collectorVisitor","accept","allRuleProductions","allProductions","productionGroups","duplicates","currGroup","currDuplicates","firstProd","buildDuplicateFoundError","dslName","defError","DUPLICATE_PRODUCTIONS","ruleName","occurrence","param","parameter","validateDuplicateProductions","termsNamespaceConflictErrors","tokenNames","currToken","currRule","currRuleName","errMsg","buildNamespaceConflictError","CONFLICT_TOKENS_RULES_NAMESPACE","checkTerminalAndNoneTerminalsNameSpace","tooManyAltsErrors","curRule","duplicateRulesError","visitNonTerminal","subrule","visitOption","option","visitRepetitionWithSeparator","manySep","visitRepetitionMandatory","atLeastOne","visitRepetitionMandatoryWithSeparator","atLeastOneSep","visitRepetition","many","visitAlternation","or","visitTerminal","terminal","GAstVisitor","rule","allRules","className","buildDuplicateRuleNameError","DUPLICATE_RULE_NAME","definition","referencedRule","Alternative","Option","RepetitionMandatory","RepetitionMandatoryWithSeparator","RepetitionWithSeparator","Repetition","Alternation","currSubDef","isFirstOptional","isOptionalProd","hasMore","rest","definedRulesNames","INVALID_RULE_OVERRIDE","topRule","path","nextNonTerminals","buildLeftRecursionError","leftRecursionPath","LEFT_RECURSION","validNextSteps","errorsFromNextSteps","currRefRule","newPath","OrCollector","alternations","node","orCollector","ors","currOr","exceptLast","currAlternative","currAltIdx","possibleFirstInAlt","nextPossibleTokensAfter","tokenStructuredMatcher","buildEmptyAlternationError","alternation","emptyChoiceIdx","NONE_LAST_EMPTY_ALT","alternative","globalMaxLookahead","ignoreAmbiguities","currOccurrence","actualMaxLookahead","maxLookahead","alternatives","getLookaheadPathsForOr","altsAmbiguityErrors","foundAmbiguousPaths","identicalAmbiguities","currAlt","currPath","altsCurrPathAppearsIn","currOtherAlt","currOtherAltIdx","containsPath","alts","currAmbDescriptor","ambgIndices","buildAlternationAmbiguityError","ambiguityIndices","prefixPath","AMBIGUOUS_ALTS","checkAlternativesAmbiguities","altsPrefixAmbiguityErrors","buildTooManyAlternativesError","TOO_MANY_ALTS","pathsAndIndices","currPathsAndIdx","currPathAndIdx","targetIdx","targetPath","prefixAmbiguitiesPathsAndIndices","searchPathAndIdx","isStrictPrefixOfPath","currAmbPathAndIdx","buildAlternationPrefixAmbiguityError","AMBIGUOUS_PREFIX_ALTS","topLevelRules","currTopRule","currProd","prodType","getProdType","pathsInsideProduction","getLookaheadPathsForOptionalProd","buildEmptyRepetitionError","repetition","NO_NON_EMPTY_LOOKAHEAD","arrayMap","props","baseProperty","basePropertyDeep","isKey","toKey","ContentAssist","initContentAssist","computeContentAssist","startRuleName","precedingInput","startRuleGast","gastProductionsCache","tokenMatcher","getNextPossibleTokenTypes","grammarPath","topRuleName","ruleStack","topProduction","getGAstProductions","NextAfterTokenWalker","startWalking","baseHasIn","hasPath","baseFor","iteratee","Symbol","objectProto","nativeObjectToString","symToStringTag","toStringTag","isOwn","tag","unmasked","e","getAllKeys","equalFunc","isPartial","objProps","objLength","objStacked","othStacked","skipCtor","objValue","othValue","compared","objCtor","othCtor","baseTimes","isArguments","isArray","isBuffer","isIndex","isTypedArray","inherited","isArr","isArg","isBuff","isType","skipIndexes","isObject","isStrictComparable","arrayReduce","baseEach","baseIteratee","baseReduce","collection","accumulator","initAccum","defaultGrammarValidatorErrorProvider","defaultGrammarResolverErrorProvider","defaultParserErrorProvider","tokens_public_1","buildMismatchTokenMessage","expected","actual","expectedMsg","previous","hasTokenLabel","tokenLabel","buildNotAllInputParsedMessage","firstRedundant","buildNoViableAltMessage","expectedPathsPerAlt","customUserDescription","errPrefix","errSuffix","allLookAheadPaths","currAltPaths","nextValidTokenSequences","currTokenType","nextValidSequenceItems","itemMsg","buildEarlyExitMessage","expectedIterationPaths","buildRuleNotFoundError","undefinedRule","duplicateProds","topLevelName","duplicateProd","extraArgument","hasExplicitIndex","replace","pathMsg","currTok","currtok","currMessage","buildTokenNameError","pathNames","leftRecursivePath","buildInvalidRuleNameError","Rule","array","baseForOwn","createBaseEach","predicate","LexerAdapter","initLexerAdapter","tokVector","tokVectorLength","currIdx","newInput","selfAnalysisDone","reset","enumerable","configurable","SKIP_TOKEN","consumeToken","LA","END_OF_FILE","howMuch","soughtIdx","exportLexerState","importLexerState","newState","resetLexerState","moveToTerminatedState","getLexerPosition","Map","pairs","LARGE_ARRAY_SIZE","baseRest","isIterateeCall","assigner","sources","guard","source","thisArg","nativeCreate","getNative","string","split","basePickBy","getAllKeysIn","prop","RecognizerApi","exceptions_public_1","errors_public_1","checks_1","ACTION","impl","consume","consumeInternal","ruleToCall","subruleInternal","actionORMethodDef","optionInternal","altsOrOpts","orInternal","manyInternal","atLeastOneInternal","CONSUME","CONSUME1","CONSUME2","CONSUME3","CONSUME4","CONSUME5","CONSUME6","CONSUME7","CONSUME8","CONSUME9","SUBRULE","SUBRULE1","SUBRULE2","SUBRULE3","SUBRULE4","SUBRULE5","SUBRULE6","SUBRULE7","SUBRULE8","SUBRULE9","OPTION","OPTION1","OPTION2","OPTION3","OPTION4","OPTION5","OPTION6","OPTION7","OPTION8","OPTION9","OR","OR1","OR2","OR3","OR4","OR5","OR6","OR7","OR8","OR9","MANY","MANY1","MANY2","MANY3","MANY4","MANY5","MANY6","MANY7","MANY8","MANY9","MANY_SEP","manySepFirstInternal","MANY_SEP1","MANY_SEP2","MANY_SEP3","MANY_SEP4","MANY_SEP5","MANY_SEP6","MANY_SEP7","MANY_SEP8","MANY_SEP9","AT_LEAST_ONE","AT_LEAST_ONE1","AT_LEAST_ONE2","AT_LEAST_ONE3","AT_LEAST_ONE4","AT_LEAST_ONE5","AT_LEAST_ONE6","AT_LEAST_ONE7","AT_LEAST_ONE8","AT_LEAST_ONE9","AT_LEAST_ONE_SEP","atLeastOneSepFirstInternal","AT_LEAST_ONE_SEP1","AT_LEAST_ONE_SEP2","AT_LEAST_ONE_SEP3","AT_LEAST_ONE_SEP4","AT_LEAST_ONE_SEP5","AT_LEAST_ONE_SEP6","AT_LEAST_ONE_SEP7","AT_LEAST_ONE_SEP8","AT_LEAST_ONE_SEP9","RULE","implementation","DEFAULT_RULE_CONFIG","definitionErrors","ruleImplementation","defineRule","OVERRIDE_RULE","ruleErrors","BACKTRACK","grammarRule","isBackTrackingStack","orgState","saveRecogState","reloadRecogState","getSerializedGastProductions","serializeGrammar","version_1","VERSION","CstParser","EmbeddedActionsParser","EMPTY_ALT","lexer_public_1","createToken","EOF","tokenName","getLookaheadPaths","llk_lookahead_1","LLkLookaheadStrategy","serializeProduction","cst_dts_gen_1","generateCstDts","render_public_1","createSyntaxDiagramsCode","baseGetTag","baseHas","toFinite","remainder","hashClear","hashDelete","hashGet","hashHas","hashSet","Hash","start","Date","getTime","val","baseIndexOf","toInteger","nativeMax","max","fromIndex","stringToPath","assignValue","baseAssignValue","isNew","newValue","Stack","matchData","noCustomizer","srcValue","COMPARE_PARTIAL_FLAG","reWhitespace","memoizeCapped","rePropName","reEscapeChar","number","quote","subString","nativeNow","now","count","lastCalled","stamp","remaining","CellEvent","cloneArrayBuffer","typedArray","isDeep","buffer","byteOffset","Uint8Array","eq","equalArrays","mapToArray","setToArray","symbolProto","symbolValueOf","valueOf","byteLength","convert","stacked","arrayAggregator","baseAggregator","setter","initializer","isArrayLike","findIndexFunc","iterable","createAggregator","groupBy","rsAstralRange","rsAstral","rsCombo","rsFitz","rsNonAstral","rsRegional","rsSurrPair","reOptMod","rsModifier","rsOptVar","rsSeq","rsSymbol","reUnicode","RegExp","collectMethods","LooksAhead","has_1","initLooksAhead","dynamicTokensEnabled","DEFAULT_PARSER_CONFIG","lookAheadFuncsCache","preComputeLookaheadFunctions","repetitionMandatory","repetitionMandatoryWithSeparator","repetitionWithSeparator","prodIdx","laFunc","buildLookaheadForAlternation","prodOccurrence","hasPredicates","getKeyForAutomaticLookahead","fullRuleNameToShort","OR_IDX","setLaFuncCache","computeLookaheadFunc","MANY_IDX","OPTION_IDX","AT_LEAST_ONE_IDX","AT_LEAST_ONE_SEP_IDX","MANY_SEP_IDX","prodKey","prodMaxLookahead","dslMethodName","buildLookaheadForOptional","dslMethodIdx","currRuleShortName","getLastExplicitRuleShortName","getLaFuncFromCache","DslMethodsCollectorVisitor","dslMethods","PerformanceTracer","initPerformanceTracer","userTraceInitPerf","traceIsNumber","baseKeys","getTag","isPrototype","firstForTerminal","firstForBranching","firstForSequence","first","uniq_1","isSequenceProd","isBranchingProd","currSubProd","firstSet","seq","nextSubProdIdx","hasInnerProdsRemaining","isLastInnerProdOptional","allAlternativesFirsts","innerProd","arrayPush","keysFunc","symbolsFunc","copyObject","PRINT_ERROR","GastRecorder","some_1","isFunction_1","RECORDING_NULL_OBJECT","description","HANDLE_SEPARATOR","MAX_METHOD_IDX","pow","BITS_FOR_OCCURRENCE_IDX","RFT","RECORDING_PHASE_TOKEN","RECORDING_PHASE_CSTNODE","children","initGastRecorder","recordingProdStack","RECORDING_PHASE","enableRecording","_loop_1","arg1","arg2","consumeInternalRecord","subruleInternalRecord","optionInternalRecord","orInternalRecord","manyInternalRecord","manySepFirstInternalRecord","atLeastOneInternalRecord","atLeastOneSepFirstInternalRecord","ACTION_RECORD","BACKTRACK_RECORD","LA_RECORD","disableRecording","that","topLevelRuleRecord","def","newTopLevelRule","originalError","KNOWN_RECORDER_ERROR","mutabilityError","recordProd","recordOrProd","assertMethodIdxIsValid","getIdxSuffix","JSON","stringify","prevProd","newNoneTerminal","label","LABEL","outputCst","hasShortKeyProperty","prodConstructor","mainProdArg","handleSep","grammarAction","DEF","newProd","separator","SEP","MAX_LOOKAHEAD","hasOptions","newOrProd","IGNORE_AMBIGUITIES","GATE","currAltFlat","ALT","arraySome","baseSome","baseIsArguments","propertyIsEnumerable","self","saveState","input","groupIdx","restoreState","consumeChar","disjunction","flags","loc","begin","end","global","ignoreCase","multiLine","unicode","sticky","isRegExpFlag","popChar","addFlag","peekChar","terms","isTerm","term","isAssertion","assertion","atom","ASSERT_EXISTS","ASSERT_NEVER_REACH_HERE","quantifier","isBacktracking","range","atLeast","atMost","integerIncludingZero","isDigit","greedy","dotAll","atomEscape","characterClass","isPatternCharacter","patternCharacter","isQuantifier","complement","cc","decimalEscapeAtom","characterClassEscape","controlEscapeAtom","controlLetterEscapeAtom","nulCharacterAtom","hexEscapeSequenceAtom","regExpUnicodeEscapeSequenceAtom","identityEscapeAtom","positiveInteger","digitsCharCodes","whitespaceCodes","wordCharCodes","escapeCode","letter","toUpperCase","parseHexDigits","classPatternCharacterAtom","isClassAtom","from","classAtom","isRangeDash","to","insertToSet","classEscape","capturing","groupAst","decimalPatternNoZero","decimalPattern","parseInt","nextChar","isAtom","prevState","howMany","hexString","hexChar","hexDigitPattern","char","item","subItem","flagObj","flagKey","obj","BaseRegExpVisitor","visitChildren","child","visit","subChild","visitPattern","visitFlags","visitDisjunction","visitAlternative","visitStartAnchor","visitEndAnchor","visitWordBoundary","visitNonWordBoundary","visitLookahead","visitNegativeLookahead","visitCharacter","visitSet","visitGroup","visitGroupBackReference","visitQuantifier","castSlice","hasUnicode","stringToArray","methodName","strSymbols","chr","trailing","slice","fromRight","getRawTag","objectToString","baseClone","isKeyable","Promise","baseSetToString","setToString","shortOut","nativeKeysIn","isProto","isTokenType","hasExtendingTokensTypesMapProperty","hasExtendingTokensTypesProperty","hasCategoriesProperty","singleAssignCategoriesToksMap","assignCategoriesMapProp","assignCategoriesTokensProp","assignTokenDefaultProps","expandCategories","tokenIdxToClass","tokenShortNameIdx","tokenStructuredMatcherNoCategories","categories","searching","CATEGORIES","newCategories","categoryMatches","categoryMatchesMap","nextNode","pathNode","nextCategory","tokInstance","tokConstructor","instanceType","isParent","tokenTypesAndParents","isFlattenable","baseFlatten","depth","isStrict","RestWalker","walk","prevRest","subProd","currRest","walkProdRef","walkTerminal","walkFlat","walkOption","walkAtLeastOne","walkAtLeastOneSep","walkManySep","walkMany","walkOr","refProd","flatProd","fullOrRest","optionProd","atLeastOneProd","fullAtLeastOneRest","atLeastOneSepProd","fullAtLeastOneSepRest","restForRepetitionWithSeparator","manyProd","fullManyRest","manySepProd","fullManySepRest","orProd","alt","prodWrapper","repSepProd","castPath","nested","reFlags","regexp","baseToString","model_1","generate_1","defaultOptions","includeVisitorInterface","visitorInterfaceName","productions","effectiveOptions","model","buildModel","genDts","freeExports","nodeType","freeModule","Buffer","allocUnsafe","copy","getSymbolsIn","keysIn","baseUniq","visitor_1","helpers_1","every_1","alreadyVisited","AbstractProduction","nativeKeys","overArg","stubFalse","mapCacheClear","mapCacheDelete","mapCacheGet","mapCacheHas","mapCacheSet","baseIsMatch","getMatchData","matchesStrictComparable","resIndex","symbol","baseSlice","asciiToArray","unicodeToArray","SetCache","arrayIncludes","arrayIncludesWith","baseUnary","cacheHas","values","comparator","includes","isCommon","valuesLength","outer","computed","valuesIndex","GastRefResolverVisitor","resolveGrammar","refResolver","resolveRefs","nameToTopRule","ref","UNRESOLVED_SUBRULE_REF","unresolvedRefName","identity","nodeAny","visitRule","trimmedEndIndex","reTrimStart","transform","arg","possiblePathsFrom","NextTerminalAfterAtLeastOneSepWalker","NextTerminalAfterAtLeastOneWalker","NextTerminalAfterManySepWalker","NextTerminalAfterManyWalker","AbstractNextTerminalAfterProductionWalker","AbstractNextPossibleTokensWalker","rest_1","first_2","topProd","possibleTokTypes","nextProductionName","nextProductionOccurrence","found","isAtEndOfPath","reverse","occurrenceStack","updateExpectedNext","fullRest","nextTerminalName","nextTerminalOccurrence","lastTok","lastTokOccurrence","restProd","isEndOfRule","firstAfterMany","firstAfterManySep","firstAfterAtLeastOne","atleastOneSepProd","firstAfterfirstAfterAtLeastOneSep","expandTopLevelRule","currRuleStack","currOccurrenceStack","newRuleStack","newCurrOccurrenceStack","targetDef","maxLength","getAlternativesForProd","newDef","partialPath","suffixDef","initialDef","tokMatcher","maxLookAhead","EXIT_NON_TERMINAL","EXIT_NON_TERMINAL_ARR","EXIT_ALTERNATIVE","foundCompletePath","tokenVectorLength","minimalAlternativesIndex","possiblePaths","currDef","nextPath","nextIdx","nextTokenType","nextTokenOccurrence","newOccurrenceStack","nextPathWithout","nextPathWith","secondIteration","separatorGast","nthRepetition","currAltPath","Set","noop","createSet","defineNameProp","nameValue","writable","arrayFilter","stubArray","nativeGetSymbols","getOwnPropertySymbols","defaults","propsIndex","propsLength","baseFindIndex","BESSEL","version","M","_horner","arr","v","z","_bessel_iter","x","f0","f1","sign","tdx","f2","o","_bessel_wrap","bessel0","bessel1","nonzero","NaN","W","b0_a1a","b0_a2a","b0_a1b","b0_a2b","b1_a1a","b1_a2a","b1_a1b","b1_a2b","b0_a","b0_b","b1_a","b1_b","besselj","a1","a2","y","xx","sqrt","cos","sin","abs","round","isFinite","isNaN","ret","jsum","bjp","sum","bj","bjm","tox","bessely","besseli","exp","bip","bi","bim","besselk","DO_NOT_EXPORT_BESSEL","freeGlobal","g","isFunction","isLength","typedArrayTags","IN","minOptimizationVal","buildLineBreakIssueMessage","isShortPattern","isCustomPattern","addStickyFlag","addStartOfInput","findUnreachablePatterns","findModesThatDoNotExist","findInvalidGroupType","findDuplicatePatterns","findUnsupportedFlags","findStartOfInputAnchor","findEmptyMatchRegExps","findEndOfInputAnchor","findInvalidPatterns","findMissingPatterns","enableSticky","disableSticky","MODES","indexOf_1","isString_1","find_1","isRegExp_1","defaults_1","reg_exp_1","PATTERN","tokenTypesWithMissingPattern","currType","MISSING_PATTERN","valid","tokenTypesWithInvalidPattern","INVALID_PATTERN","onlyRelevantTypes","useSticky","debug","action","charCodeToOptimizedIdxMap","initCharCodeToOptimizedIndexMap","allTransformedPatterns","patternIdxToType","patternIdxToGroup","patternIdxToLongerAltIdxArr","patternIdxToPushMode","patternIdxToPopMode","patternIdxToCanLineTerminator","patternIdxToIsCustom","patternIdxToShort","regExpSource","escapedRegExpString","wrappedRegExp","clazz","groupName","GROUP","longerAltType","LONGER_ALT","lineTerminatorCharCodes","getCharCodes","LINE_BREAKS","checkLineBreaksIssues","canMatchCharCode","acc","optimizedIdx","addToMapOfArrays","START_CHARS_HINT","lastOptimizedIdx_1","charOrInt","currOptimizedIdx","failedOptimizationPrefixMsg","optimizedCodes","getOptimizedStartCodesIndices","code","validModesNames","missingResult","invalidResult","validTokenTypes","withRegExpPatterns","validateRegExpPattern","end_of_input","EndAnchorFinder","invalidRegex","regexpAst","endAnchorVisitor","EOI_ANCHOR_FOUND","matchesEmptyString","EMPTY_MATCH_PATTERN","start_of_input","StartAnchorFinder","startAnchorVisitor","SOI_ANCHOR_FOUND","invalidFlags","multiline","UNSUPPORTED_FLAGS_FOUND","identicalPatterns","outerType","innerType","duplicatePatterns","currIdenticalSet","setOfIdentical","tokenTypeNames","dupPatternSrc","DUPLICATE_PATTERNS_FOUND","invalidTypes","INVALID_GROUP_TYPE_FOUND","validModes","invalidModes","PUSH_MODE_DOES_NOT_EXIST","canBeTested","metaChars","str","indexOf","testIdx","testTokenType","UNREACHABLE_PATTERN","issue","IDENTIFY_TERMINATOR","CUSTOM_LINE_BREAK","details","charsOrCodes","numOrString","MULTI_MODE_LEXER_WITHOUT_DEFAULT_MODE","MULTI_MODE_LEXER_WITHOUT_MODES_PROPERTY","MULTI_MODE_LEXER_DEFAULT_MODE_VALUE_DOES_NOT_EXIST","LEXER_DEFINITION_CANNOT_CONTAIN_UNDEFINED","currLongerAlt","MULTI_MODE_LEXER_LONGER_ALT_NOT_IN_CURRENT_MODE","warnings","hasAnyLineBreak","allTokenTypes","concreteTokenTypes","terminatorCharCodes","currIssue","NO_LINE_BREAKS_FLAGS","clonedResult","groupKeys","currKey","currGroupValue","len","c","isMasked","toSource","reIsHostCtor","funcProto","Function","funcToString","reIsNative","baseMap","baseMatches","baseMatchesProperty","property","coreJsData","Ctor","baseCreate","getPrototype","eachFunc","DataView","EventDispatcher","_listeners","_isEventPaused","listen","listener","listeners","addListener","hasListener","removeListener","listenerArray","dispatch","eventName","eventData","target","l","pauseListener","resumeListener","__spreadArray","pack","ar","leftRecursionErrors","emptyAltErrors","validateEmptyOrAlternatives","ambiguousAltsErrors","emptyRepetitionErrors","buildLookaheadFuncForOr","buildAlternativesLookAheadFunc","buildLookaheadFuncForOptionalProd","buildSingleAlternativeLookaheadFunction","seen","seenIndex","upperFirst","createCaseFirst","WeakMap","mapTag","promiseTag","setTag","weakMapTag","dataViewTag","dataViewCtorString","mapCtorString","promiseCtorString","setCtorString","weakMapCtorString","ArrayBuffer","resolve","ctorString","baseValues","spreadableSymbol","isConcatSpreadable","arrLength","othLength","arrStacked","arrValue","othIndex","arrayLikeKeys","grammar","_b","_c","resourceBase","_d","css","freeProcess","process","nodeUtil","require","types","binding","generator","CstNodeDefinitionGenerator","rawElements","visitEach","grouped","el","propertyName","properties","allNullable","canBeNull","propertyType","optional","visitEachAndOverrideWith","getType","override","production","kind","baseIsNative","getValue","baseIsNaN","strictIndexOf","createAssigner","dataView","buildInProdFollowPrefix","buildBetweenProdsFollowPrefix","computeAllProdsFollows","ResyncFollowsWalker","constants_1","follows","followName","t_in_topProd_follows","inner","occurenceInParent","topProductions","reSyncFollows","currRefsFollow","firstCharOptimizedIndices","complementErrorMessage","ast","addOptimizedIdxToResult","rangeCode","minUnOptVal","maxUnOptVal","minOptIdx","maxOptIdx","currOptIdx","isOptionalQuantifier","isWholeOptional","fromCharCode","upperChar","lowerChar","toLowerCase","handleIgnoreCase","findCode","setNode","targetCharCodes","codeOrRange","range_1","targetCode","msgSuffix","CharCodeFinder","charCodes","charCodeFinder","baseDifference","isArrayLikeObject","difference","toBecomeFast","FakeConstructor","fakeInstance","fakeAccess","bar","Parser","follow_1","gast_resolver_public_1","recoverable_1","looksahead_1","tree_builder_1","lexer_adapter_1","recognizer_api_1","recognizer_engine_1","error_handler_1","context_assist_1","gast_recorder_1","perf_tracer_1","apply_mixins_1","nodeLocationTracking","recoveryValueFunc","resyncEnabled","tokenVocabulary","initErrorHandler","initRecognizerEngine","initRecoverable","initTreeBuilder","performSelfAnalysis","parserInstance","defErrorsMsgs","recordedRuleGast","originalGrammarAction","resolverErrors","validationErrors","tokensMap","lookaheadValidationErrors","allFollows","resyncFollows","initialize","DEFER_DEFINITION_ERRORS_HANDLING","applyMixins","Recoverable","TreeBuilder","RecognizerEngine","ErrorHandler","configClone","upperFirst_1","getTypeString","getNodeInterfaceName","getNodeChildrenTypeName","nodes","contentParts","nodeCstInterface","nodeInterfaceName","childrenTypeName","genNodeInterface","nodeChildrenInterface","typeName","typeNames","buildTypeString","genChildProperty","genNodeChildrenType","genCstNodeTypes","genVisitorFunction","jStat","calcRdx","m","LOG10E","isNumber","num","_init","retZero","retOne","retIdent","fn","toArray","utils","toVector","_random_fn","random","setRandom","extend","rows","cols","dimensions","row","rowa","col","submat","arange","ind","cola","diag","nrow","res","antidiag","transpose","objArr","toAlter","ncol","cumreduce","alter","zeros","ones","rand","symmetric","min","cnt","hival","step","current","rl","_slice","list","rcSlice","colSlice","rowSlice","sliceAssign","A","B","nl","ml","diagonal","diagArray","mat","jProto","sort","funcs","passfunc","results","setTimeout","ascNum","clip","sumsqrd","sumsqerr","tmp","mean","sumrow","product","low","high","unique","hash","_arr","meansqerr","geomean","logs","meanOfLogs","median","arrlen","cumsum","cumprod","diff","diffs","arrLen","rank","distinctNumbers","numberCounts","sortedDistinctNumbers","numberRanks","currentRank","mode","maxCount","numMaxCount","mode_arr","variance","flag","pooledvariance","reduce","samples","deviation","dev","stdev","pooledstdev","meandev","meddev","coeffvar","quartiles","quantiles","quantilesArray","alphap","betap","aleph","gamma","sortedArray","quantileVals","percentile","exclusive","realIndex","frac","percentileOfScore","score","counter","strict","histogram","binCnt","binWidth","bins","covariance","arr1","arr2","u","arr1Len","sq_dev","corrcoeff","spearmancoeff","stanMoment","mu","sigma","skewSum","skewness","kurtosis","fullbool","tmpthis","callbackFunction","argsToPass","curriedFunction","vector","gammaln","cof","ser","loggam","x0","x2","xp","gl","gl0","PI","gammafn","yi","q","fact","xden","xnum","gammap","lowRegGamma","an","aln","ap","del","h","ITMAX","factorialln","factorial","combination","combinationln","permutation","betafn","betaln","betacf","m2","aa","fpmin","qab","qap","qam","gammapinv","pp","lna1","afac","gln","erf","ty","isneg","dd","erfc","erfcinv","err","ibetainv","lna","lnb","al","w","b1","ibeta","bt","randn","randg","shape","oalph","betinc","eps","c9","a0","b0","m9","tukeyWprob","rr","xleg","aleg","qsqz","wincr","pr_w","normal","cdf","blb","binc","bub","einsum","cc1","wi","elsum","jj","ac","qexpo","rinsum","f","newthis","sample","vals","fnfunc","beta","pdf","alpha","inv","centralF","df1","df2","binomial","cauchy","local","scale","atan","tan","chisquare","dof","exponential","rate","invgamma","kumaraswamy","lognormal","noncentralt","ncp","studentt","tol","flip","prob","lastvalue","std","pareto","SQRT2","dof2","weibull","uniform","betacdf","negbin","r","hypgeom","N","scaledPDF","samplesDone","scaledCDF","factor","poisson","sumarr","sampleSmall","L","sampleLarge","U","V","slam","loglam","invalpha","vr","us","lam","triangular","arcsine","asin","laplace","tukey","nmeans","df","xlegq","alegq","Number","ulen","f2lf","f21","ff4","ans","otsum","twa1","t1","x1","ps","tukeyQinv","valx0","valx1","iter","isUsable","add","subtract","divide","multiply","nrescols","rescols","dot","left","right","norm","nnorm","angle","acos","aug","newarr","gauss_jordan","det","determinant","submatrix","gauss_elimination","maug","pivot","temp","y2","maxrow","triaUpSolve","parts","matrix_mode","triaLowSolve","lu","R","cholesky","T","gauss_jacobi","xv","xk","gauss_seidel","SOR","householder","QR","lstsq","array_mode","Q","attrs","Q1","RI","I","Aj","cAi","Ij","cIi","R_I","Q2","jacobi","maxim","theta","condition","ev","rungekutta","t_j","u_j","order","k1","k2","k3","romberg","h1","richardson","X","pos","y1","h_min","simpson","hermite","F","dF","dl","lagrange","cubic_spline","sq","gauss_quadrature","PCA","temp1","Bt","D","temp2","Y","C","Vt","differenceOfProportions","p1","n1","p2","n2","pooled","zscore","ztest","sides","tscore","ttest","anovafscore","expVar","sampMean","sampSampMean","tmpargs","unexpVar","anovaftest","ftest","fscore","anovaftes","qscore","mean1","mean2","sd","qtest","tukeyhsd","arrays","means","normalci","change","tci","significant","pvalue","oneSidedDifferenceOfProportions","twoSidedDifferenceOfProportions","models","ols","endog","exog","nobs","df_model","df_resid","coef","predict","resid","ybar","SSE","SSR","SST","R2","t_test","var_count","subModelList","endog_index","exog_index","filter","sigmaHat","seBetaHat","tStatistic","pValue","leftppf","interval95","se","F_statistic","F_test","adjust_R2","buildxmatrix","matrixRows","builddxmatrix","buildjxmatrix","jMat","pass","buildymatrix","buildjymatrix","matrixmult","regress","jMatX","jMatY","innerinv","xtranspxinv","xtransp","next","regresst","compile","jMatYBar","yBar","yAverage","anova","residuals","ssr","msr","sse","mse","sst","mst","r2","fratio","rmse","r2adj","stats","sds","ts","covar","xtranspx","matrixsubtract","createBaseFor","otherArgs","addNoneTerminalToCst","addTerminalToCst","setNodeLocationFull","setNodeLocationOnlyOffset","currNodeLocation","newLocationInfo","tokenTypeName","ruleResult","BITS_FOR_ALT_IDX","BITS_FOR_RULE_IDX","BITS_FOR_METHOD_TYPE","ruleIdx","equalByTag","equalObjects","argsTag","arrayTag","objectTag","objIsArr","othIsArr","objTag","othTag","objIsObj","othIsObj","isSameTag","objIsWrapped","othIsWrapped","objUnwrapped","othUnwrapped","baseIsTypedArray","nodeIsTypedArray","derivedCtor","baseCtors","baseCtor","baseProto","getOwnPropertyNames","propName","basePropDescriptor","getOwnPropertyDescriptor","cloneDataView","cloneRegExp","cloneSymbol","cloneTypedArray","isObject_1","shortRuleNameToFull","ruleShortNameIdx","subruleIdx","RULE_STACK","RULE_OCCURRENCE_STACK","allTokenTypes_1","uniqueTokens","noTokenCategoriesUsed","tokenConstructor","invokeRuleWithTry","shortName","_i","ruleInvocationStateUpdate","cst","CST_STACK","cstPostRule","invokeRuleCatch","ruleFinallyStateUpdate","resyncEnabledConfig","isFirstInvokedRule","reSyncEnabled","isBackTracking","recogError","partialCstResult","reSyncTokType","findReSyncTokenType","isInCurrentRuleReSyncSet","reSyncTo","recoveredNode","optionInternalLogic","lookAheadFunc","predicate_1","orgLookaheadFunction_1","laKey","atLeastOneInternalLogic","predicate_2","orgLookaheadFunction_2","raiseEarlyExitException","PROD_TYPE","REPETITION_MANDATORY","ERR_MSG","notStuck","doSingleRepetition","attemptInRepetitionRecovery","atLeastOneSepFirstInternalLogic","REPETITION_MANDATORY_WITH_SEPARATOR","separatorLookAheadFunc","repetitionSepSecondInternal","manyInternalLogic","lookaheadFunction","predicate_3","orgLookaheadFunction_3","manySepFirstInternalLogic","nextTerminalAfterWalker","beforeIteration","altIdxToTake","raiseNoAltException","cstFinallyStateUpdate","isAtEndOfInput","firstRedundantTok","getCurrRuleFullName","SAVE_ERROR","ARGS","cstPostNonTerminal","subruleInternalError","consumedToken","nextToken","consumeInternalError","eFromConsumption","consumeInternalRecovery","cstPostTerminal","getFollowsForInRuleRecovery","tryInRuleRecovery","eFromInRuleRecovery","IN_RULE_RECOVERY_EXCEPTION","savedErrors","savedRuleStack","lexerState","fullName","idxInCallingRule","cstInvocationStateUpdate","shortRuleNameToFullName","stackClear","stackDelete","stackGet","stackHas","stackSet","baseKeysIn","baseGet","uid","maskSrcKey","IE_PROTO","find","createFind","toNumber","INFINITY","baseSet","paths","cst_1","cst_visitor_1","setNodeLocationFromToken","setNodeLocationFromNode","setInitialNodeLocation","setInitialNodeLocationFullRecovery","cstPostRuleFull","setInitialNodeLocationFullRegular","setInitialNodeLocationOnlyOffsetRecovery","cstPostRuleOnlyOffset","setInitialNodeLocationOnlyOffsetRegular","cstNode","location","fullRuleName","ruleCstNode","prevToken","rootCst","ruleCstResult","preCstNode","getBaseCstVisitorConstructor","baseCstVisitorConstructor","newBaseCstVisitorConstructor","createBaseSemanticVisitorConstructor","getBaseCstVisitorConstructorWithDefaults","baseCstVisitorWithDefaultsConstructor","newConstructor","createBaseVisitorConstructorWithDefaults","getPreviousExplicitRuleShortName","getLastExplicitRuleOccurrenceIndex","isSymbol","symbolToString","baseFilter","baseIsMap","nodeIsMap","isMap","_errors","context","getHumanReadableRuleStack","ruleOccurrenceStack","newErrors","userDefinedErrMsg","ruleGrammar","insideProdPaths","actualTokens","errMsgTypes","lookAheadPathsPerAlternative","hasIn","negate","defaultValue","InRuleRecoveryException","EOF_FOLLOW_KEY","firstAfterRepMap","getTokenToInsert","tokToInsert","isInsertedInRecovery","canTokenTypeBeInsertedInRecovery","canTokenTypeBeDeletedInRecovery","tryInRepetitionRecovery","grammarRuleArgs","expectedTokType","savedLexerState","passedResyncPoint","nextTokenWithoutResync","generateErrorMessage","addToResyncTokens","shouldInRepetitionRecoveryBeTried","expectTokAfterLastMatch","nextTokIdx","canPerformInRuleRecovery","tokIdxInRule","getCurrentGrammarPath","canRecoverWithSingleTokenInsertion","canRecoverWithSingleTokenDeletion","nextTok","expectedToken","mismatchedTok","possibleFollowsTokType","followKey","getCurrFollowKey","currentRuleReSyncSet","getFollowSetFromFollowKey","allPossibleReSyncTokTypes","flattenFollowSet","foundMatch","resyncTokType","currRuleIdx","prevRuleShortName","inRule","buildFullFollowKeyStack","explicitRuleStack","explicitOccurrenceStack","followStack","resyncTokens","prodFunc","lookaheadFunc","nextToksWalker","currShortName","firstAfterRepInfo","DependencyTree","cellRegistry","dispatcher","builder","depTree","buildTree","FORMULA_CHANGED","_updateGraph","bind","each","cell","formula","address","event","markAsDirty","dependents","getDependents","topologicalSort","levels","visited","cellLevels","calculateLevel","precedents","getPrecedents","maxLevel","precedent","precedentLevel","level","flattenToTopology","getDepth","_getDepth","tree","DependencyBuilder","patterns","remoteColumnRange","remoteRowRange","remoteCellRange","remoteCell","columnRange","rowRange","cellRange","namedRange","setWorkbook","workbook","build","cells","sheet","localDeps","remoteDeps","getFormulaDependencies","dependencies","precedentCell","setPrecedents","addDependent","remoteRef","sheetName","cellAddress","parseRemoteReference","remoteSheet","getSheet","remoteCellObj","getCellDirect","addRemoteDependent","trim","cleanFormula","startsWith","remoteColumnMatches","remoteRowMatches","remoteCellRangeMatches","sheetPart","rangePart","expandCellRange","addr","remoteCellMatches","cellRangeMatches","cellMatches","isFunctionOrKeyword","identifierMatches","identifier","nameManager","reference","getReference","addresses","startColMatch","startRowMatch","endColMatch","endRowMatch","startCol","startRow","endCol","endRow","colToNum","numToCol","startColNum","endColNum","minRow","maxRow","minCol","maxCol","baseIsSet","nodeIsSet","isSet","_definition","visitor","convertDefinition","serializedNonTerminal","serializedTerminal","terminalLabel","topRules","reIsDeepProp","reIsPlainProp","areTokenCategoriesNotUsed","lookAheadSequenceFromAlternatives","REPETITION","REPETITION_WITH_SEPARATOR","ALTERNATION","laFuncBuilder","lookAheadPaths","lookaheadBuilder","numOfAlts","areAllOneTokenLookahead","orAlts","predicates","currNumOfPaths","currPredicate","currPathLength","singleTokenAlts","choiceToAlt_1","currExtendingType","numOfPaths","singleTokensTypes","expectedTokenUniqueKey_1","choiceToAlt_2","RestDefinitionFinderWalker","targetOccurrence","targetProdType","restDef","checkIsTarget","expectedProdType","InsideDefinitionFinderVisitor","targetRef","expectedProdName","initializeArrayOfArrays","pathToHashKeys","longerKeys","currShorterKey","categoriesKeySuffix","isUniquePrefixHash","altKnownPathsKeys","searchPathKeys","otherAltKnownPathsKeys","searchIdx","altsDefs","partialAlts","finalResult","altsHashes","dict","newData","pathLength","currDataset","altIdx","currAltPathsAndSuffixes","currPathIdx","currPathPrefix","prefixKeys","currAltResult","newPartialPathsAndSuffixes","insideDefVisitor","insideDef","afterDef","searchPath","compareOtherPath","otherPath","searchTok","otherTok","singleAltPaths","singlePath","prefix","otherTokType","setCacheAdd","setCacheHas","getPrototypeOf","DataType","print_1","timer_1","to_fast_properties_1","overRest","freeSelf","hasFunc","objectCreate","proto","baseTrim","reIsBadHex","reIsBinary","reIsOctal","freeParseInt","isBinary","POP_MODE","createTokenInternal","constant","baseIsRegExp","nodeIsRegExp","isRegExp","arrayBuffer","Plus","Minus","Mult","Div","LParen","RParen","Comma","RowRange","NumberLiteral","longer_alt","Variable","SheetName","CellRange","CellRef","StringLiteral","Concat","FunctionName","WhiteSpace","GreaterThan","LessThan","GreaterThanEqual","LessThanEqual","Equal","NotEqual","IfFunction","TrueKeyword","FalseKeyword","NullKeyword","ArrayRowSep","RangeIntersect","ErrorConstant","IfErrorFunction","IfsFunction","SwitchFunction","LCurly","RCurly","ColumnRange","Power","allTokens","CalxTokens","CalxLexer","CalxParser","super","comparisonExpression","atomicExpression","$","arrayFormula","expression","additionExpression","concatenationExpression","multiplicationExpression","exponentiationExpression","unaryExpression","ifFunctionCall","functionCall","ifErrorFunctionCall","ifsFunctionCall","switchFunctionCall","arrayRow","parse","inputText","lexResult","ErrorType","ArrayResult","isSingleValue","getSingleValue","toFlatArray","fromVerticalArray","fromHorizontalArray","from2DArray","normalized","newRow","fromSingleValue","CalxInterpreter","validateVisitor","setContext","yy","getContext","ctx","separators","currentRow","expressions","lhs","rhs","operators","rightValue","operator","arrayOperation","operation","isError","leftArray","rightArray","resultLength","leftVal","rightVal","resolveVariable","resolveCellReference","resolveCellRange","resolveRowRange","resolveColumnRange","isTruthy","whenTrue","whenFalse","funcName","expr","callFunction","excelEpoch","msPerDay","getFunction","executeBuiltInFunction","isErrorValue","valueIfError","conditions","arrayExpression","getNamedRange","getVariable","getCellValue","getCellRange","getRowRange","getColumnRange","flattenAndSum","flattenedArray","flattenArray","arrayMax","arrayMin","every","some","flat","parseInput","cleanInput","parseCst","ERROR","Range","_cells","_address","parseAddress","loadCells","cleanAddress","_startAddress","_endAddress","isSingleCell","expandRange","getValues","setValuesFromArray","cellIndex","rowData","setValues","calculate","columns","callback","getCellAt","getCellAtPosition","getRange","SheetEvent","SheetState","DateUtil","serialToDate","serialDate","epochDate","ms","MS_PER_DAY","dateToSerial","date","isValidSerialDate","fromComponents","year","month","day","toComponents","getFullYear","getMonth","getDate","weekday","getDay","hours","getHours","minutes","getMinutes","seconds","getSeconds","toISOString","fromISOString","isoString","today","setHours","EXCEL_EPOCH","Cell","_type","NUMBER","_rules","remotePrecedents","remoteDependents","dynamicPrecedents","_dirty","_calculated","_hasRemotePrecedents","_hasRemoteDependents","_hasDynamicPrecedents","_isArrayAnchor","init","mount","ELEMENT_MOUNTED","isEmpty","rawValue","_computed","_value","_formula","eval","handleArrayResult","valueChanged","CALCULATED","_markDependentsAsDirty","autoCalculate","_recalculateDependents","arrayResult","_arrayResult","checkSpillRange","spillArray","SPILL","getCellCoordinates","targetAddress","coordinatesToAddress","targetCell","getCell","_spillRange","colStr","isArrayAnchor","getSpillRange","setFormat","format","setFormatter","formatter","getFormattedValue","isCalculated","isDirty","isNumeric","parseFloat","oldFormula","updateDynamicPrecedents","newFormula","oldPrecedents","removeDependent","rebuildDependencies","targetSheet","addRemotePrecedent","parsed","BOOLEAN","DATE","DATETIME","TIME","upperValue","VALUE_CHANGED","invalidateDynamicDependents","recalculateDirtyCells","dependent","getStringValue","getNumericValue","getDateValue","getSerialDateValue","setDateValue","setSerialDateValue","getFormattedDate","isDate","addPrecedent","setDependents","columnRanges","rowRanges","columnPattern","rowPattern","beforeMatch","hasDynamicPrecedents","dependsOnColumn","colNum","columnToNumber","dependsOnRow","CellRegistry","CELL_ADDED","remove","CELL_REMOVED","CELL_CREATED","all","filtered","numToStr","strToNum","chars","base","getCellsInRange","regex","rangeStart","rangeEnd","boundaries","isValidBinary","strRepeat","qty","repeat","initial","arrayMerge","objectToArray","trimEmptyCell","rangeToTable","alphaPattern","numPattern","arrayTable","resultTable","colLength","resultRow","rowLength","transposeTable","table","newTable","translateFormula","cellRowOffset","cellColOffset","translated","col1Abs","col1","row1Abs","row1","col2Abs","col2","row2Abs","row2","col1Num","row1Num","newRow1Num","newStart","col2Num","row2Num","newRow2Num","colAbs","rowAbs","rowNum","newRowNum","updateMovedReferences","oldStartCol","oldStartRow","oldEndCol","oldEndRow","newStartCol","newStartRow","newEndCol","newEndRow","oldStartColNum","oldEndColNum","newStartColNum","newEndColNum","oldMinRow","oldMaxRow","oldMinCol","oldMaxCol","newMinRow","newMaxRow","newMinCol","newMaxCol","rangeMinCol","rangeMaxCol","rangeMinRow","rangeMaxRow","newCol1","newCol2","Sheet","_states","calculation","CALCULATION_IDLE","_variables","_autoCalculate","_id","_generateId","wasAutoCalculate","element","setAttribute","id","_el","ELEMENT_ATTACHED","withoutEvent","_depTree","calculationOrder","requestCalculate","depAddress","cellAddr","createCell","setActiveSheet","parser","buildDependencyTree","setVariable","getCellRangeValues","getRowRangeValues","allCells","rowMatch","getColumnRangeValues","colMatch","loadArray","anchor","anchorMatch","anchorCol","anchorRow","anchorColNum","formulaRowOffset","formulaColOffset","rowIdx","colIdx","translatedFormula","moveRange","srcRange","dstAddress","srcParts","srcStart","srcEnd","srcStartCol","srcStartRow","srcEndCol","srcEndRow","dstCleaned","dstStartCol","dstStartRow","srcStartColNum","srcEndColNum","colCount","rowCount","dstStartColNum","dstEndColNum","dstEndRow","dstEndCol","rowOffset","colOffset","srcCellAddresses","cellData","srcAddr","srcColMatch","srcRowMatch","srcCol","dstRow","dstAddr","existingCell","updatedFormula","copyRange","srcCell","nil","div0","na","flattenShallow","aIsArray","bIsArray","isFlat","flatten","argument","argsToArray","arrayEach","numbers","cleanFloat","power","parseBool","bool","up","parseNumber","parseString","parseNumberArray","parseDate","serial","utc_days","date_info","fractional_day","total_seconds","days","getUTCDate","getUTCMonth","getUTCFullYear","serialNumberToDate","parseDateArray","anyError","isDefined","anyIsError","anyIsString","arrayValuesToNumbers","d1900","UTC","WEEK_STARTS","WEEK_TYPES","WEEKEND_TYPES","DATEDIF","start_date","end_date","unit","start_date_year","start_date_month","start_date_day","end_date_year","end_date_month","end_date_day","YEARFRAC","DAYS","setFullYear","setMonth","DATEVALUE","date_text","DAY","serial_number","startOfDay","newDate","DAYS360","method","sm","ed","em","smd","emd","EDATE","months","EOMONTH","HOUR","INTERVAL","second","hour","sec","ISOWEEKNUM","setDate","yearStart","ceil","MINUTE","MONTH","NETWORKDAYS","holidays","INTL","NOW","SECOND","minute","TIMEVALUE","time_text","TODAY","WEEKDAY","return_type","WEEKNUM","week_start","jan","inc","WORKDAY","YEAR","isLeapYear","daysBetween","basis","sy","ey","feb29Between","date1","date2","year1","mar1year1","year2","mar1year2","ylength","years","average","addOn","weekend","isMask","maskDays","maskIndex","maskRegex","total","getTimezoneOffset","getUTCDay","dec","holiday","defaultOperator","validSymbols","_TOKEN_TYPE_OPERATOR","_TOKEN_TYPE_LITERAL","SUPPORTED_TOKENS","TOKEN_TYPE_OPERATOR","TOKEN_TYPE_LITERAL","literalValue","analyzedTokens","castValueToCorrectType","unshift","analyzeTokens","expressionLength","cursorIndex","processedValue","processedSymbol","tokenizeExpression","compute","evaluate","CELL","INFO","ISBLANK","ISBINARY","ISERR","value$1","ISERROR","ISEVEN","ISFORMULA","ISLOGICAL","ISNA","ISNONTEXT","ISNUMBER","ISODD","ISREF","ISTEXT","SHEET","SHEETS","TYPE","CHOOSE","COLUMN","COLUMNS","HLOOKUP","lookup_value","table_array","row_index_num","range_lookup","VLOOKUP","matrix","INDEX","row_num","column_num","someError","isOneDimensionRange","LOOKUP","result_array","isNumberLookup","localeCompare","MATCH","lookup_array","match_type","indexValue","lookupValueStr","ROWS","TRANSPOSE","UNIQUE","hasElement","col_index_num","exactMatchOnly","error_val","SQRT2PI","AVEDEV","flatArgumentsDefined","AVERAGE","AVERAGEA","AVERAGEIF","criteria","average_range","average_count","isWildcard","tokenizedCriteria","AVERAGEIFS","criteriaLength","isMeetCondition","computedResult","BETA","cumulative","probability","BINOM","number_s","trials","probability_s","DIST","RANGE","number_s2","COMBIN","INV","CHISQ","deg_freedom","RT","TEST","actual_range","expected_range","xsqr","Pi","ChiSq","CONFIDENCE","CORREL","array1","array2","COUNT","COUNTA","flatArguments","COUNTBLANK","COUNTIN","blanks","COUNTIF","matches","COUNTIFS","COUNTUNIQUE","NORM","standard_dev","COVARIANCE","DEVSQ","P","S","EXPON","lambda","FISHER","FISHERINV","e2y","FORECAST","known_ys","known_xs","xmean","ymean","den","FREQUENCY","data_array","bins_array","GAMMA","GAMMALN","GAUSS","GEOMEAN","GROWTH","known_y","known_x","new_x","use_const","avg_x","avg_y","avg_xy","avg_xx","new_y","HARMEAN","deg_freedom1","deg_freedom2","sumOfSquares","SUM","PRECISE","HYPGEOM","INTERCEPT","KURT","LARGE","LINEST","LOGEST","sample_s","number_sample","population_s","number_pop","LOGNORM","MAX","MAXA","MEDIAN","MIN","MINA","MODE","currentItem","maxItems","MULT","NEGBINOM","number_f","PEARSON","den1","den2","PERCENTILE","fl","PERCENTRANK","PERMUT","number_chosen","FACT","PERMUTATIONA","PHI","EXC","significance","uniques","INC","POISSON","PROB","x_range","prob_range","lower_limit","upper_limit","sorted","QUARTILE","quart","RANK","ROW","RSQ","SKEW","SLOPE","SMALL","STANDARDIZE","AVG","EQ","m3","STDEV","STDEVA","VARA","STDEVPA","VARPA","STEYX","lft","VAR","T$1","TREND","new_xs","linest","TRIMMEAN","percent","FLOOR","mean_x","mean_y","s_x","s_y","WEIBULL","Z","ABS","ACOS","ACOSH","ACOT","ACOTH","AGGREGATE","function_num","ref1","ref2","PRODUCT","SNGL","ARABIC","CM","CD","XC","XL","IX","IV","ASIN","ASINH","ATAN","ATAN2","x_num","y_num","atan2","ATANH","BASE","radix","min_length","anyError$1","CEILING","precision","ROUND","COMBINA","COS","COSH","COT","COTH","e2","CSC","CSCH","DECIMAL","DEGREES","EVEN","EXP","MATH","MEMOIZED_FACT","FACTDOUBLE","GCD","r0","ri","INT","ISO","LCM","LN","LN10","LN2","LOG2E","LOG","LOG10","MOD","divisor","modulus","MROUND","multiple","MULTINOMIAL","ODD","E","POWER","QUOTIENT","numerator","denominator","RADIANS","RAND","RANDBETWEEN","bottom","top","ROMAN","digits","roman","num_digits","ROUNDDOWN","ROUNDUP","SEC","SECH","SERIESSUM","coefficients","SIGN","SIN","SINH","SQRT","SQRTPI","SQRT1_2","SUBTOTAL","ADD","num1","num2","MINUS","DIVIDE","dividend","MULTIPLY","factor1","factor2","GT","GTE","LT","LTE","value1","value2","NE","POW","exponent","inner_result","SUMIF","sum_range","sumValue","SUMIFS","shift","criterias","valueToTest","SUMPRODUCT","_ij","_ij_arg","_i_arg","SUMSQ","SUMX2MY2","array_x","array_y","SUMX2PY2","SUMXMY2","TAN","TANH","TRUNC","ASC","BAHTTEXT","CHAR","CLEAN","CODE","CONCATENATE","trueFound","falseFound","CONCAT","DBCS","DOLLAR","decimals","style","currency","minimumFractionDigits","maximumFractionDigits","formattedNumber","toLocaleString","EXACT","text1","text2","FIND","find_text","within_text","start_num","found_index","FIXED","no_commas","toFixed","HTML2TEXT","LEFT","num_chars","LEN","LOWER","MID","NUMBERVALUE","decimal_separator","group_separator","PRONETIC","PROPER","txt","substr","REGEXEXTRACT","regular_expression","REGEXMATCH","full","REGEXREPLACE","replacement","REPLACE","old_text","new_text","REPT","number_times","RIGHT","SEARCH","foundAt","SPLIT","SUBSTITUTE","instance_num","TEXT","currencySymbol","isPercent","endsWith","TEXTJOIN","delimiter","ignore_empty","flatArgs","textToJoin","chunks","TRIM","UNICHAR","UNICODE","UPPER","VALUE","output","isValidBinaryNumber","BESSELI","bessel","BESSELJ","BESSELK","BESSELY","BIN2DEC","stringified","BIN2HEX","places","BIN2OCT","BITAND","number1","number2","BITLSHIFT","shift_amount","BITOR","BITRSHIFT","BITXOR","COMPLEX","real_num","i_num","suffix","CONVERT","from_unit","to_unit","units","binary_prefixes","Yi","Zi","Ei","Ti","Gi","Mi","ki","unit_prefixes","G","base_from_unit","base_to_unit","from_multiplier","to_multiplier","from_binary_prefix","from_unit_prefix","to_binary_prefix","to_unit_prefix","DEC2BIN","DEC2HEX","DEC2OCT","DELTA","ERF","ERFC","GESTEP","HEX2BIN","negative","decimal","HEX2DEC","HEX2OCT","IMABS","inumber","IMREAL","IMAGINARY","plus","minus","last","IMARGUMENT","IMCONJUGATE","IMCOS","IMCOSH","IMCOT","IMDIV","IMSIN","inumber1","inumber2","unit1","unit2","IMEXP","IMLN","IMLOG10","IMLOG2","IMPOWER","IMPRODUCT","IMSEC","IMSECH","IMSINH","IMSQRT","IMCSC","IMCSCH","IMSUB","IMSUM","IMTAN","OCT2BIN","OCT2DEC","OCT2HEX","BETADIST","BETAINV","BINOMDIST","CEILINGMATH","CEILINGPRECISE","CHIDIST","CHIDISTRT","CHIINV","CHIINVRT","CHITEST","COVAR","COVARIANCEP","COVARIANCES","CRITBINOM","ERFCPRECISE","ERFPRECISE","EXPONDIST","FDIST","FDISTRT","FINV","FINVRT","FLOORMATH","FLOORPRECISE","FTEST","GAMMADIST","GAMMAINV","GAMMALNPRECISE","HYPGEOMDIST","LOGINV","LOGNORMDIST","LOGNORMINV","MODEMULT","MODESNGL","NEGBINOMDIST","NETWORKDAYSINTL","NORMDIST","NORMINV","NORMSDIST","NORMSINV","PERCENTILEEXC","PERCENTILEINC","PERCENTRANKEXC","PERCENTRANKINC","POISSONDIST","QUARTILEEXC","QUARTILEINC","RANKAVG","RANKEQ","SKEWP","STDEVP","STDEVS","TDIST","TDISTRT","TINV","TTEST","VARP","VARS","WEIBULLDIST","WORKDAYINTL","ZTEST","compact","FINDFIELD","database","title","findResultIndex","maxCriteriaLength","currentCriteriaResult","hasMatchingCriteria","criteriaField","DAVERAGE","field","resultIndexes","targetFields","DCOUNT","targetValues","DCOUNTA","DGET","DMAX","maxValue","DMIN","minValue","DPRODUCT","DSTDEV","DSTDEVP","DSUM","DVAR","DVARP","validDate","ensureDate","ACCRINT","first_interest","settlement","par","frequency","ACCRINTM","AMORDEGRC","AMORLINC","COUPDAYBS","COUPDAYS","COUPDAYSNC","COUPNCD","COUPNUM","COUPPCD","CUMIPMT","nper","pv","start_period","end_period","payment","PMT","interest","FV","CUMPRINC","principal","DB","cost","salvage","life","period","ceiling","DDB","DISC","DOLLARDE","fractional_dollar","fraction","DOLLARFR","decimal_dollar","DURATION","EFFECT","nominal_rate","npery","FVSCHEDULE","schedule","future","INTRATE","IPMT","per","fv","IRR","guess","irrResult","dates","irrResultDeriv","positive","newRate","epsRate","resultValue","resultRate","contLoop","ISPMT","MDURATION","MIRR","finance_rate","reinvest_rate","payments","incomes","NPV","NOMINAL","effect_rate","NPER","pmt","ODDFPRICE","ODDFYIELD","ODDLPRICE","ODDLYIELD","PDURATION","PPMT","PRICE","PRICEDISC","PRICEMAT","PV","RATE","epsMax","dy","RECEIVED","RRI","SLN","SYD","TBILLEQ","maturity","discount","TBILLPRICE","TBILLYIELD","pr","VDB","XIRR","XNPV","YIELD","YIELDDISC","YIELDMAT","AND","FALSE","IF","logical_test","value_if_true","value_if_false","IFS","IFERROR","value_if_error","IFNA","value_if_na","NOT","logical","TRUE","XOR","SWITCH","targetValue","argc","switchCount","switchSatisfied","hasDefaultClause","defaultClause","FLATTEN","ARGS2ARRAY","REFERENCE","opening","JOIN","NUMBERS","FormulaJSWrapper","upperName","Calx","formulae","sequenceFunction","sortFunction","filterFunction","uniqueFunction","sortIndex","sortOrder","byCol","arr2D","aVal","bVal","include","ifEmpty","include1D","includeVal","exactlyOnce","was1D","convertArg","isDynamicArrayFunction","getAvailableFunctions","hasFunction","SharedContext","sheets","_formulaJSWrapper","activeSheet","addSheet","NameManager","_nameRegistry","_workbook","comment","isValidName","getActiveSheet","getSheets","sheetNames","getAll","Comparator","equal","notEqual","lessThan","greaterThan","lessEqualThan","greaterEqualThan","createParser","interpreter","Workbook","_sheets","_parser","_dispatcher","_nameManager","isValidCellAddress","_deps","_depsBuilder","hydrateObj","createSheet","loadData","cellKey","exportJSON","variables","createFromData","sharedContext","utility","createFromElement","setFormula","setFormulae","createWorkbook","createWorkbookFromData","createWorkbookFromElement","createInterpreter","validateMissingCstMethods","CstVisitorDefinitionError","defaultVisit","lang_extensions_1","childrenNames","childrenNamesLength","currChildArray","currChildArrayLength","currChild","visitorInstance","ruleNames","missingRuleNames","MISSING_METHOD","derivedConstructor","semanticDefinitionErrors","errorMessages","currDefError","_RULE_NAMES","baseConstructor","withDefaultsProto","reHasUnicode","arrayEvery","baseEvery","castFunction","isString","resolver_1","actualOptions","topRulesTable","baseAssign","baseAssignIn","cloneBuffer","copyArray","copySymbols","copySymbolsIn","initCloneArray","initCloneByTag","initCloneObject","funcTag","cloneableTags","isFull","isFunc","subValue","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","loaded","__webpack_modules__","globalThis","window","nmd","workbooks","formatterRegistry","cleaned","inputStr","hasPercent","integer","functionRegistry","styleFormatterRegistry","$element","color","zero","updateAllCellsInWorkbook","$elements","attr","updateAllCells","$cell","dataFormat","cellFormat","formattedValue","tagName","document","activeElement","applyStyleFormatter","styleFormatterName","calx","registerFormatter","registerFunction","registerStyleFormatter","getFormatter","delete","handleMethodCall","opts","functions","formatters","styleFormatters","hasSheetStructure","varName","sheetElements","sheetData","calxCounter","$el","autoAddress","dataType","initialValue","processDataAttributes","cellRef","is","on","$input","rawInput","isReadonly","hasFormula","parsedValue","allElements","processSheetData","jQuery"],"sourceRoot":""} \ No newline at end of file diff --git a/examples/exportJSON.ts b/examples/exportJSON.ts new file mode 100644 index 0000000..ad49127 --- /dev/null +++ b/examples/exportJSON.ts @@ -0,0 +1,49 @@ +import { Calx } from '../src/Calx'; + +// Example: Export and reload a workbook + +// 1. Create a workbook with data +console.log('Creating workbook...'); +const workbook1 = Calx.createWorkbook(); +const sheet1 = workbook1.createSheet('Sales'); + +// Add some data +sheet1.createCell('A1', { value: 100 }); +sheet1.createCell('A2', { value: 200 }); +sheet1.createCell('A3', { value: 150 }); +sheet1.createCell('A4', { formula: '=SUM(A1:A3)' }); +sheet1.createCell('B1', { formula: '=A1*0.1' }); + +workbook1.build(); +workbook1.calculate(); + +console.log('Original workbook values:'); +console.log('A1:', sheet1.getCellValue('A1')); +console.log('A4 (SUM):', sheet1.getCellValue('A4')); +console.log('B1 (Tax):', sheet1.getCellValue('B1')); + +// 2. Export to JSON +console.log('\nExporting to JSON...'); +const data = workbook1.exportJSON(); +const jsonString = JSON.stringify(data, null, 2); +console.log('Exported JSON:', jsonString); + +// 3. Reload from JSON +console.log('\nReloading from JSON...'); +const workbook2 = Calx.createWorkbookFromData(data); +const sheet2 = workbook2.getSheet('Sales') as any; + +workbook2.build(); +workbook2.calculate(); + +console.log('Reloaded workbook values:'); +console.log('A1:', sheet2.getCellValue('A1')); +console.log('A4 (SUM):', sheet2.getCellValue('A4')); +console.log('B1 (Tax):', sheet2.getCellValue('B1')); + +// 4. Verify formulas are preserved +console.log('\nFormulas preserved:'); +console.log('A4 formula:', sheet2.getCell('A4').formula); +console.log('B1 formula:', sheet2.getCell('B1').formula); + +console.log('\n✓ Export/Import successful!'); diff --git a/jest.config.js b/jest.config.js index 02b642c..429ae9b 100644 --- a/jest.config.js +++ b/jest.config.js @@ -11,11 +11,22 @@ module.exports = { coverageDirectory: 'coverage', coverageReporters: ['text', 'lcov', 'html'], moduleNameMapper: { - '^@/(.*)$': '/src/$1' + '^@/(.*)$': '/src/$1', + '^@chevrotain/utils$': '/node_modules/@chevrotain/utils/lib/src/api.js', + '^@chevrotain/gast$': '/node_modules/@chevrotain/gast/lib/src/api.js', + '^@chevrotain/regexp-to-ast$': '/node_modules/@chevrotain/regexp-to-ast/lib/src/api.js', + '^@chevrotain/types$': '/node_modules/@chevrotain/types/lib/src/api.js', + '^@chevrotain/cst-dts-gen$': '/node_modules/@chevrotain/cst-dts-gen/lib/src/api.js' }, + modulePaths: ['/node_modules'], transform: { - '^.+\\.ts$': ['ts-jest', { - tsconfig: 'tsconfig.test.json' + '^.+\\.(ts|tsx|js|jsx)$': ['ts-jest', { + tsconfig: 'tsconfig.test.json', + useESM: false }] - } + }, + transformIgnorePatterns: [ + 'node_modules/(?!(chevrotain|lodash-es|@chevrotain)/)' + ], + moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json'] }; diff --git a/package-lock.json b/package-lock.json index c0f0abe..5e160e6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@xsanisty/calxjs", - "version": "3.0.0", + "version": "3.0.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@xsanisty/calxjs", - "version": "3.0.0", + "version": "3.0.2", "license": "MIT", "dependencies": { "@formulajs/formulajs": "^3.1.1", @@ -26,28 +26,14 @@ "webpack-cli": "^5.1.4" } }, - "node_modules/@ampproject/remapping": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", - "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/@babel/code-frame": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", - "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.28.6.tgz", + "integrity": "sha512-JYgintcMjRiCvS8mMECzaEn+m3PfoQiyqukOMCCVQtoJGYJw8j/8LBJEiqkHLkfwCcs74E3pbAUFNg7d9VNJ+Q==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" }, @@ -56,9 +42,9 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.0.tgz", - "integrity": "sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.6.tgz", + "integrity": "sha512-2lfu57JtzctfIrcGMz992hyLlByuzgIk58+hhGCxjKZ3rWI82NnVLjXcaTqkI2NvlcvOskZaiZ5kjUALo3Lpxg==", "dev": true, "license": "MIT", "engines": { @@ -66,22 +52,22 @@ } }, "node_modules/@babel/core": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.0.tgz", - "integrity": "sha512-UlLAnTPrFdNGoFtbSXwcGFQBtQZJCNjaN6hQNP3UPvuNXT1i82N26KL3dZeIpNalWywr9IuQuncaAfUaS1g6sQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.28.0", - "@babel/helper-compilation-targets": "^7.27.2", - "@babel/helper-module-transforms": "^7.27.3", - "@babel/helpers": "^7.27.6", - "@babel/parser": "^7.28.0", - "@babel/template": "^7.27.2", - "@babel/traverse": "^7.28.0", - "@babel/types": "^7.28.0", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.6.tgz", + "integrity": "sha512-H3mcG6ZDLTlYfaSNi0iOKkigqMFvkTKlGUYlD8GW7nNOYRrevuA46iTypPyv+06V3fEmvvazfntkBU34L0azAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.28.6", + "@babel/generator": "^7.28.6", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helpers": "^7.28.6", + "@babel/parser": "^7.28.6", + "@babel/template": "^7.28.6", + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6", + "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -104,14 +90,14 @@ "license": "MIT" }, "node_modules/@babel/generator": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.0.tgz", - "integrity": "sha512-lJjzvrbEeWrhB4P3QBsH7tey117PjLZnDbLiQEKjQ/fNJTjuq4HSqgFA+UNSwZT8D7dxxbnuSBMsa1lrWzKlQg==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.6.tgz", + "integrity": "sha512-lOoVRwADj8hjf7al89tvQ2a1lf53Z+7tiXMgpZJL3maQPDxh0DgLMN62B2MKUOFcoodBHLMbDM6WAbKgNy5Suw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.28.0", - "@babel/types": "^7.28.0", + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" @@ -121,13 +107,13 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", - "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", + "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.27.2", + "@babel/compat-data": "^7.28.6", "@babel/helper-validator-option": "^7.27.1", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", @@ -148,29 +134,29 @@ } }, "node_modules/@babel/helper-module-imports": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", - "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", + "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/traverse": "^7.27.1", - "@babel/types": "^7.27.1" + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.27.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.27.3.tgz", - "integrity": "sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", + "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.27.1", - "@babel/helper-validator-identifier": "^7.27.1", - "@babel/traverse": "^7.27.3" + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -180,9 +166,9 @@ } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", - "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz", + "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==", "dev": true, "license": "MIT", "engines": { @@ -200,9 +186,9 @@ } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", - "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", "dev": true, "license": "MIT", "engines": { @@ -220,27 +206,27 @@ } }, "node_modules/@babel/helpers": { - "version": "7.28.2", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.2.tgz", - "integrity": "sha512-/V9771t+EgXz62aCcyofnQhGM8DQACbRhvzKFsXKC9QM+5MadF8ZmIm0crDMaz3+o0h0zXfJnd4EhbYbxsrcFw==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.6.tgz", + "integrity": "sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/template": "^7.27.2", - "@babel/types": "^7.28.2" + "@babel/template": "^7.28.6", + "@babel/types": "^7.28.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.0.tgz", - "integrity": "sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.6.tgz", + "integrity": "sha512-TeR9zWR18BvbfPmGbLampPMW+uW1NZnJlRuuHso8i87QZNq2JRF9i6RgxRqtEq+wQGsS19NNTWr2duhnE49mfQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.28.0" + "@babel/types": "^7.28.6" }, "bin": { "parser": "bin/babel-parser.js" @@ -305,13 +291,13 @@ } }, "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.27.1.tgz", - "integrity": "sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.28.6.tgz", + "integrity": "sha512-jiLC0ma9XkQT3TKJ9uYvlakm66Pamywo+qwL+oL8HJOvc6TWdZXVfhqJr8CCzbSGUAbDOzlGHJC1U+vRfLQDvw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -347,13 +333,13 @@ } }, "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.27.1.tgz", - "integrity": "sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.28.6.tgz", + "integrity": "sha512-wgEmr06G6sIpqr8YDwA2dSRTE3bJ+V0IfpzfSY3Lfgd7YWOaAdlykvJi13ZKBt8cZHfgH1IXN+CL656W3uUa4w==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -473,13 +459,13 @@ } }, "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.27.1.tgz", - "integrity": "sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.28.6.tgz", + "integrity": "sha512-+nDNmQye7nlnuuHDboPbGm00Vqg3oO8niRRL27/4LYHUsHYh0zJ1xWOz0uRwNFmM1Avzk8wZbc6rdiYhomzv/A==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -489,33 +475,33 @@ } }, "node_modules/@babel/template": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", - "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", + "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/parser": "^7.27.2", - "@babel/types": "^7.27.1" + "@babel/code-frame": "^7.28.6", + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.0.tgz", - "integrity": "sha512-mGe7UK5wWyh0bKRfupsUchrQGqvDbZDbKJw+kcRGSmdHVYrv+ltd0pnpDTVpiTqnaBru9iEvA8pz8W46v0Amwg==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.6.tgz", + "integrity": "sha512-fgWX62k02qtjqdSNTAGxmKYY/7FSL9WAS1o2Hu5+I5m9T0yxZzr4cnrfXQ/MX0rIifthCSs6FKTlzYbJcPtMNg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.28.0", + "@babel/code-frame": "^7.28.6", + "@babel/generator": "^7.28.6", "@babel/helper-globals": "^7.28.0", - "@babel/parser": "^7.28.0", - "@babel/template": "^7.27.2", - "@babel/types": "^7.28.0", + "@babel/parser": "^7.28.6", + "@babel/template": "^7.28.6", + "@babel/types": "^7.28.6", "debug": "^4.3.1" }, "engines": { @@ -523,14 +509,14 @@ } }, "node_modules/@babel/types": { - "version": "7.28.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.2.tgz", - "integrity": "sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.6.tgz", + "integrity": "sha512-0ZrskXVEHSWIqZM/sQZ4EV3jZJXRkio/WCxaqKZP1g//CEWEPSfeZFcms4XeKBCHU0ZKnIkdJeU/kF+eRp5lBg==", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.27.1" + "@babel/helper-validator-identifier": "^7.28.5" }, "engines": { "node": ">=6.9.0" @@ -932,9 +918,9 @@ } }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.12", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.12.tgz", - "integrity": "sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==", + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", "dev": true, "license": "MIT", "dependencies": { @@ -942,6 +928,17 @@ "@jridgewell/trace-mapping": "^0.3.24" } }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, "node_modules/@jridgewell/resolve-uri": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", @@ -953,9 +950,9 @@ } }, "node_modules/@jridgewell/source-map": { - "version": "0.3.10", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.10.tgz", - "integrity": "sha512-0pPkgz9dY+bijgistcTTJ5mR+ocqRXLuhXHYdzoMmmoJ2C9S46RCm2GMUbatPEUK9Yjy26IrAy8D/M00lLkv+Q==", + "version": "0.3.11", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz", + "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==", "dev": true, "license": "MIT", "dependencies": { @@ -964,16 +961,16 @@ } }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.4.tgz", - "integrity": "sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==", + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", "dev": true, "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.29", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.29.tgz", - "integrity": "sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==", + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", "dev": true, "license": "MIT", "dependencies": { @@ -1172,9 +1169,9 @@ "license": "MIT" }, "node_modules/@types/yargs": { - "version": "17.0.33", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", - "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", + "version": "17.0.35", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.35.tgz", + "integrity": "sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==", "dev": true, "license": "MIT", "dependencies": { @@ -1766,6 +1763,16 @@ ], "license": "MIT" }, + "node_modules/baseline-browser-mapping": { + "version": "2.9.19", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.19.tgz", + "integrity": "sha512-ipDqC8FrAl/76p2SSWKSI+H9tFwm7vYqXQrItCuiVPt26Km0jS+NzSsBWAaBusvSbQcfJG+JitdMm+wZAgTYqg==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.js" + } + }, "node_modules/bessel": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/bessel/-/bessel-1.0.2.tgz", @@ -1960,25 +1967,24 @@ } }, "node_modules/browserify-sign": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.3.tgz", - "integrity": "sha512-JWCZW6SKhfhjJxO8Tyiiy+XYB7cqd2S5/+WeYHsKdNKFlCBhKbblba1A/HN/90YwtxKc8tCErjffZl++UNmGiw==", + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.5.tgz", + "integrity": "sha512-C2AUdAJg6rlM2W5QMp2Q4KGQMVBwR1lIimTsUnutJ8bMpW5B52pGpR2gEnNBNwijumDo5FojQ0L9JrXA8m4YEw==", "dev": true, "license": "ISC", "dependencies": { - "bn.js": "^5.2.1", - "browserify-rsa": "^4.1.0", + "bn.js": "^5.2.2", + "browserify-rsa": "^4.1.1", "create-hash": "^1.2.0", "create-hmac": "^1.1.7", - "elliptic": "^6.5.5", - "hash-base": "~3.0", + "elliptic": "^6.6.1", "inherits": "^2.0.4", - "parse-asn1": "^5.1.7", + "parse-asn1": "^5.1.9", "readable-stream": "^2.3.8", "safe-buffer": "^5.2.1" }, "engines": { - "node": ">= 0.12" + "node": ">= 0.10" } }, "node_modules/browserify-zlib": { @@ -1992,9 +1998,9 @@ } }, "node_modules/browserslist": { - "version": "4.25.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.25.1.tgz", - "integrity": "sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw==", + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", + "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", "dev": true, "funding": [ { @@ -2012,10 +2018,11 @@ ], "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001726", - "electron-to-chromium": "^1.5.173", - "node-releases": "^2.0.19", - "update-browserslist-db": "^1.1.3" + "baseline-browser-mapping": "^2.9.0", + "caniuse-lite": "^1.0.30001759", + "electron-to-chromium": "^1.5.263", + "node-releases": "^2.0.27", + "update-browserslist-db": "^1.2.0" }, "bin": { "browserslist": "cli.js" @@ -2157,9 +2164,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001731", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001731.tgz", - "integrity": "sha512-lDdp2/wrOmTRWuoB5DpfNkC0rJDU8DqRa6nYL6HK6sytw70QMopt/NIc/9SM7ylItlBWfACXk0tEn37UWM/+mg==", + "version": "1.0.30001766", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001766.tgz", + "integrity": "sha512-4C0lfJ0/YPjJQHagaE9x2Elb69CIqEPZeG0anQt9SIvIoOH4a4uaRl73IavyO+0qZh6MDLH//DrXThEYKHkmYA==", "dev": true, "funding": [ { @@ -2245,14 +2252,15 @@ } }, "node_modules/cipher-base": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.6.tgz", - "integrity": "sha512-3Ek9H3X6pj5TgenXYtNWdaBon1tgYCaebd+XPg0keyjEbEfkD4KkmAxkQ/i1vYvxdcT5nscLBfq9VJRmCBcFSw==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.7.tgz", + "integrity": "sha512-Mz9QMT5fJe7bKI7MH31UilT5cEK5EHHRCccw/YRFsRY47AuNgaV6HY3rscp0/I4Q+tTW/5zoqpSeRRI54TkDWA==", "dev": true, "license": "MIT", "dependencies": { "inherits": "^2.0.4", - "safe-buffer": "^5.2.1" + "safe-buffer": "^5.2.1", + "to-buffer": "^1.2.2" }, "engines": { "node": ">= 0.10" @@ -2307,9 +2315,9 @@ } }, "node_modules/collect-v8-coverage": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", - "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.3.tgz", + "integrity": "sha512-1L5aqIkwPfiodaMgQunkF1zRhNqifHBmtbbbxcr6yVxxBnliw4TDOW6NxpO8DJLgJ16OT+Y4ztZqP6p/FtXnAw==", "dev": true, "license": "MIT" }, @@ -2529,9 +2537,9 @@ "license": "Apache-2.0" }, "node_modules/debug": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", - "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "dev": true, "license": "MIT", "dependencies": { @@ -2547,9 +2555,9 @@ } }, "node_modules/dedent": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.6.0.tgz", - "integrity": "sha512-F1Z+5UCFpmQUzJa11agbyPVMbpgT/qA3/SKyJ1jyBgm7dUcUEa8v9JwDkerSQXfakBwFljIxhOJqGkjUwZ9FSA==", + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.7.1.tgz", + "integrity": "sha512-9JmrhGZpOlEgOLdQgSm0zxFaYoQon408V1v49aqTWuXENVlnCuY9JBZcXZiCsZQWDjTm5Qf/nIvAy77mXDAjEg==", "dev": true, "license": "MIT", "peerDependencies": { @@ -2738,9 +2746,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.194", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.194.tgz", - "integrity": "sha512-SdnWJwSUot04UR51I2oPD8kuP2VI37/CADR1OHsFOUzZIvfWJBO6q11k5P/uKNyTT3cdOsnyjkrZ+DDShqYqJA==", + "version": "1.5.282", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.282.tgz", + "integrity": "sha512-FCPkJtpst28UmFzd903iU7PdeVTfY0KAeJy+Lk0GLZRwgwYHn/irRcaCbQQOmr5Vytc/7rcavsYLvTM8RiHYhQ==", "dev": true, "license": "ISC" }, @@ -2788,9 +2796,9 @@ "license": "MIT" }, "node_modules/enhanced-resolve": { - "version": "5.18.2", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.2.tgz", - "integrity": "sha512-6Jw4sE1maoRJo3q8MsSIn2onJFbLTOjY9hlx4DZXmOKvLRd1Ok2kXmAGXaafL2+ijsJZ1ClYbl/pmqr9+k4iUQ==", + "version": "5.18.4", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.4.tgz", + "integrity": "sha512-LgQMM4WXU3QI+SYgEc2liRgznaD5ojbmY3sb8LxyguVkIg5FxdpTkvk72te2R38/TGKxH634oLxXRGY6d7AP+Q==", "dev": true, "license": "MIT", "dependencies": { @@ -2802,9 +2810,9 @@ } }, "node_modules/envinfo": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.14.0.tgz", - "integrity": "sha512-CO40UI41xDQzhLB1hWyqUKgFhs250pNcGbyGKe1l/e4FSaI/+YE4IMG76GDt0In67WLPACIITC+sOi08x4wIvg==", + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.21.0.tgz", + "integrity": "sha512-Lw7I8Zp5YKHFCXL7+Dz95g4CcbMEpgvqZNNq3AmlT5XAV6CgAAk6gyAMqn2zjw08K9BHfcNuKrMiCPLByGafow==", "dev": true, "license": "MIT", "bin": { @@ -2815,9 +2823,9 @@ } }, "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", + "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2845,9 +2853,9 @@ } }, "node_modules/es-module-lexer": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", - "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.0.0.tgz", + "integrity": "sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw==", "dev": true, "license": "MIT" }, @@ -3038,9 +3046,9 @@ "license": "MIT" }, "node_modules/fast-uri": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.6.tgz", - "integrity": "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", + "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", "dev": true, "funding": [ { @@ -3168,6 +3176,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/generator-function": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", + "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -3667,14 +3685,15 @@ } }, "node_modules/is-generator-function": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz", - "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", + "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==", "dev": true, "license": "MIT", "dependencies": { - "call-bound": "^1.0.3", - "get-proto": "^1.0.0", + "call-bound": "^1.0.4", + "generator-function": "^2.0.0", + "get-proto": "^1.0.1", "has-tostringtag": "^1.0.2", "safe-regex-test": "^1.1.0" }, @@ -3808,9 +3827,9 @@ } }, "node_modules/istanbul-lib-instrument/node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", "dev": true, "license": "ISC", "bin": { @@ -3861,9 +3880,9 @@ } }, "node_modules/istanbul-reports": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", - "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz", + "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -4357,9 +4376,9 @@ } }, "node_modules/jest-snapshot/node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", "dev": true, "license": "ISC", "bin": { @@ -4612,13 +4631,17 @@ "license": "MIT" }, "node_modules/loader-runner": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", - "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.1.tgz", + "integrity": "sha512-IWqP2SCPhyVFTBtRcgMHdzlf9ul25NwaFx4wCEH/KjAXuuHY4yNjvPXsBokp8jCB936PyWRaPKUNh8NvylLp2Q==", "dev": true, "license": "MIT", "engines": { "node": ">=6.11.5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, "node_modules/locate-path": { @@ -4674,9 +4697,9 @@ } }, "node_modules/make-dir/node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", "dev": true, "license": "ISC", "bin": { @@ -4903,9 +4926,9 @@ "license": "MIT" }, "node_modules/node-releases": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", - "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", + "version": "2.0.27", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", + "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", "dev": true, "license": "MIT" }, @@ -5082,17 +5105,16 @@ } }, "node_modules/parse-asn1": { - "version": "5.1.7", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.7.tgz", - "integrity": "sha512-CTM5kuWR3sx9IFamcl5ErfPl6ea/N8IYwiJ+vpeB2g+1iknv7zBl5uPwbMbRVznRVbrNY6lGuDoE5b30grmbqg==", + "version": "5.1.9", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.9.tgz", + "integrity": "sha512-fIYNuZ/HastSb80baGOuPRo1O9cf4baWw5WsAp7dBuUzeTD/BoaG8sVTdlPFksBE2lF21dN+A1AnrpIjSWqHHg==", "dev": true, "license": "ISC", "dependencies": { "asn1.js": "^4.10.1", "browserify-aes": "^1.2.0", "evp_bytestokey": "^1.0.3", - "hash-base": "~3.0", - "pbkdf2": "^3.1.2", + "pbkdf2": "^3.1.5", "safe-buffer": "^5.2.1" }, "engines": { @@ -5173,55 +5195,21 @@ } }, "node_modules/pbkdf2": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.3.tgz", - "integrity": "sha512-wfRLBZ0feWRhCIkoMB6ete7czJcnNnqRpcoWQBLqatqXXmelSRqfdDK4F3u9T2s2cXas/hQJcryI/4lAL+XTlA==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.5.tgz", + "integrity": "sha512-Q3CG/cYvCO1ye4QKkuH7EXxs3VC/rI1/trd+qX2+PolbaKG0H+bgcZzrTt96mMyRtejk+JMCiLUn3y29W8qmFQ==", "dev": true, "license": "MIT", "dependencies": { - "create-hash": "~1.1.3", + "create-hash": "^1.2.0", "create-hmac": "^1.1.7", - "ripemd160": "=2.0.1", + "ripemd160": "^2.0.3", "safe-buffer": "^5.2.1", - "sha.js": "^2.4.11", - "to-buffer": "^1.2.0" + "sha.js": "^2.4.12", + "to-buffer": "^1.2.1" }, "engines": { - "node": ">=0.12" - } - }, - "node_modules/pbkdf2/node_modules/create-hash": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.1.3.tgz", - "integrity": "sha512-snRpch/kwQhcdlnZKYanNF1m0RDlrCdSKQaH87w1FCFPVPNCQ/Il9QJKAX2jVBZddRdaHBMC+zXa9Gw9tmkNUA==", - "dev": true, - "license": "MIT", - "dependencies": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "sha.js": "^2.4.0" - } - }, - "node_modules/pbkdf2/node_modules/hash-base": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-2.0.2.tgz", - "integrity": "sha512-0TROgQ1/SxE6KmxWSvXHvRj90/Xo1JvZShofnYF+f6ZsGtR4eES7WfrQzPalmyagfKZCXpVnitiRebZulWsbiw==", - "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.1" - } - }, - "node_modules/pbkdf2/node_modules/ripemd160": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.1.tgz", - "integrity": "sha512-J7f4wutN8mdbV08MJnXibYpCOPHR+yzy+iQ/AsjMv2j8cLavQ8VGagDFUwwTAdF8FmRKVeNpbTTEwNHCW1g94w==", - "dev": true, - "license": "MIT", - "dependencies": { - "hash-base": "^2.0.0", - "inherits": "^2.0.1" + "node": ">= 0.10" } }, "node_modules/picocolors": { @@ -5512,13 +5500,13 @@ } }, "node_modules/resolve": { - "version": "1.22.10", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", - "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "version": "1.22.11", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", + "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", "dev": true, "license": "MIT", "dependencies": { - "is-core-module": "^2.16.0", + "is-core-module": "^2.16.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, @@ -5566,14 +5554,33 @@ } }, "node_modules/ripemd160": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", - "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.3.tgz", + "integrity": "sha512-5Di9UC0+8h1L6ZD2d7awM7E/T4uA1fJRlx6zk/NvdCCVEoAnFqvHmCuNeIKoCeIixBX/q8uM+6ycDvF8woqosA==", "dev": true, "license": "MIT", "dependencies": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" + "hash-base": "^3.1.2", + "inherits": "^2.0.4" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/ripemd160/node_modules/hash-base": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.2.tgz", + "integrity": "sha512-Bb33KbowVTIj5s7Ked1OsqHUeCpz//tPwR+E2zJgJKo9Z5XolZ9b6bdUgjmYlwnWhoOQKoTd1TYToZGn5mAYOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.4", + "readable-stream": "^2.3.8", + "safe-buffer": "^5.2.1", + "to-buffer": "^1.2.1" + }, + "engines": { + "node": ">= 0.8" } }, "node_modules/safe-buffer": { @@ -5616,9 +5623,9 @@ } }, "node_modules/schema-utils": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.2.tgz", - "integrity": "sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz", + "integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==", "dev": true, "license": "MIT", "dependencies": { @@ -5708,13 +5715,16 @@ } }, "node_modules/shasum-object": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shasum-object/-/shasum-object-1.0.0.tgz", - "integrity": "sha512-Iqo5rp/3xVi6M4YheapzZhhGPVs0yZwHj7wvwQ1B9z8H6zk+FEnI7y3Teq7qwnekfEhu8WmG2z0z4iWZaxLWVg==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/shasum-object/-/shasum-object-1.0.1.tgz", + "integrity": "sha512-SsC+1tW7XKQ/94D4k1JhLmjDFpVGET/Nf54jVDtbavbALf8Zhp0Td9zTlxScjMW6nbEIrpADtPWfLk9iCXzHDQ==", "dev": true, "license": "Apache-2.0", "dependencies": { "fast-safe-stringify": "^2.0.7" + }, + "bin": { + "shasum-object": "bin.js" } }, "node_modules/shebang-command": { @@ -6145,24 +6155,28 @@ } }, "node_modules/tapable": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.2.tgz", - "integrity": "sha512-Re10+NauLTMCudc7T5WLFLAwDhQ0JWdrMK+9B2M8zR5hRExKmsRDCBA7/aV/pNJFltmBFO5BAMlQFi/vq3nKOg==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz", + "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==", "dev": true, "license": "MIT", "engines": { "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, "node_modules/terser": { - "version": "5.43.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.43.1.tgz", - "integrity": "sha512-+6erLbBm0+LROX2sPXlUYx/ux5PyE9K/a92Wrt6oA+WDAoFTdpHE5tCYCI5PNzq2y8df4rA+QgHLJuR4jNymsg==", + "version": "5.46.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.46.0.tgz", + "integrity": "sha512-jTwoImyr/QbOWFFso3YoU3ik0jBBDJ6JTOQiy/J2YxVJdZCc+5u7skhNwiOR3FQIygFqVUPHl7qbbxtjW2K3Qg==", "dev": true, "license": "BSD-2-Clause", "dependencies": { "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.14.0", + "acorn": "^8.15.0", "commander": "^2.20.0", "source-map-support": "~0.5.20" }, @@ -6174,9 +6188,9 @@ } }, "node_modules/terser-webpack-plugin": { - "version": "5.3.14", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.14.tgz", - "integrity": "sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw==", + "version": "5.3.16", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.16.tgz", + "integrity": "sha512-h9oBFCWrq78NyWWVcSwZarJkZ01c2AyGrzs1crmHZO3QUg9D61Wu4NPjBy69n7JqylFF5y+CsUZYmYEIZ3mR+Q==", "dev": true, "license": "MIT", "dependencies": { @@ -6326,9 +6340,9 @@ "license": "BSD-3-Clause" }, "node_modules/to-buffer": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.2.1.tgz", - "integrity": "sha512-tB82LpAIWjhLYbqjx3X4zEeHN6M8CiuOEy2JY8SEQVdYRe3CCHOFaqrBW1doLDrfpWhplcW7BL+bO3/6S3pcDQ==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.2.2.tgz", + "integrity": "sha512-db0E3UJjcFhpDhAF4tLo03oli3pwl3dbnzXOUIlRKrp+ldk/VUxzpWYZENsw2SZiuBjHAk7DfB0VU7NKdpb6sw==", "dev": true, "license": "MIT", "dependencies": { @@ -6447,9 +6461,9 @@ } }, "node_modules/ts-loader": { - "version": "9.5.2", - "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.5.2.tgz", - "integrity": "sha512-Qo4piXvOTWcMGIgRiuFa6nHNm+54HbYaZCKqc9eeZCLRy3XqafQgwX2F7mofrbJG3g7EEb+lkiR+z2Lic2s3Zw==", + "version": "9.5.4", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.5.4.tgz", + "integrity": "sha512-nCz0rEwunlTZiy6rXFByQU1kVVpCIgUpc/psFiKVrUwrizdnIbRFu8w7bxhUF0X613DYwT4XzrZHpVyMe758hQ==", "dev": true, "license": "MIT", "dependencies": { @@ -6468,9 +6482,9 @@ } }, "node_modules/ts-loader/node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", "dev": true, "license": "ISC", "bin": { @@ -6543,9 +6557,9 @@ "license": "MIT" }, "node_modules/typescript": { - "version": "5.9.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.2.tgz", - "integrity": "sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==", + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "dev": true, "license": "Apache-2.0", "bin": { @@ -6605,9 +6619,9 @@ "license": "MIT" }, "node_modules/update-browserslist-db": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", - "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", "dev": true, "funding": [ { @@ -6710,9 +6724,9 @@ } }, "node_modules/watchpack": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.4.tgz", - "integrity": "sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.5.1.tgz", + "integrity": "sha512-Zn5uXdcFNIA1+1Ei5McRd+iRzfhENPCe7LeABkJtNulSxjma+l7ltNx55BWZkRlwRnpOgHqxnjyaDgJnNXnqzg==", "dev": true, "license": "MIT", "dependencies": { @@ -6724,9 +6738,9 @@ } }, "node_modules/webpack": { - "version": "5.101.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.101.0.tgz", - "integrity": "sha512-B4t+nJqytPeuZlHuIKTbalhljIFXeNRqrUGAQgTGlfOl2lXXKXw+yZu6bicycP+PUlM44CxBjCFD6aciKFT3LQ==", + "version": "5.104.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.104.1.tgz", + "integrity": "sha512-Qphch25abbMNtekmEGJmeRUhLDbe+QfiWTiqpKYkpCOWY64v9eyl+KRRLmqOFA2AvKPpc9DC6+u2n76tQLBoaA==", "dev": true, "license": "MIT", "dependencies": { @@ -6738,22 +6752,22 @@ "@webassemblyjs/wasm-parser": "^1.14.1", "acorn": "^8.15.0", "acorn-import-phases": "^1.0.3", - "browserslist": "^4.24.0", + "browserslist": "^4.28.1", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.17.2", - "es-module-lexer": "^1.2.1", + "enhanced-resolve": "^5.17.4", + "es-module-lexer": "^2.0.0", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.2.11", "json-parse-even-better-errors": "^2.3.1", - "loader-runner": "^4.2.0", + "loader-runner": "^4.3.1", "mime-types": "^2.1.27", "neo-async": "^2.6.2", - "schema-utils": "^4.3.2", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.3.11", - "watchpack": "^2.4.1", + "schema-utils": "^4.3.3", + "tapable": "^2.3.0", + "terser-webpack-plugin": "^5.3.16", + "watchpack": "^2.4.4", "webpack-sources": "^3.3.3" }, "bin": { @@ -6896,9 +6910,9 @@ } }, "node_modules/which-typed-array": { - "version": "1.1.19", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", - "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", + "version": "1.1.20", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.20.tgz", + "integrity": "sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==", "dev": true, "license": "MIT", "dependencies": { diff --git a/package.json b/package.json index c5fe287..c25a283 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@xsanisty/calxjs", - "version": "3.0.0", + "version": "3.0.2", "description": "Spreadsheet Calculation Engine", "main": "dist/index.js", "types": "dist/index.d.ts", diff --git a/readme.md b/readme.md index b3df7c8..440076d 100644 --- a/readme.md +++ b/readme.md @@ -140,6 +140,49 @@ sheet.calculate(); console.log(sheet.getCell('A3').value); // 30 ``` +### Export and Reload Workbooks + +```typescript +import { Calx } from '@xsanisty/calxjs'; + +// Create workbook with data +const workbook = Calx.createWorkbook(); +const sheet = workbook.createSheet('Sales'); +sheet.createCell('A1', { value: 100 }); +sheet.createCell('A2', { formula: '=A1*2' }); + +workbook.build(); +workbook.calculate(); + +// Export to JSON +const data = workbook.exportJSON(); +// or: const data = Calx.exportJSON(workbook); + +// Save to storage (localStorage, API, etc.) +localStorage.setItem('workbook', JSON.stringify(data)); + +// Later, reload from JSON +const savedData = JSON.parse(localStorage.getItem('workbook')); +const newWorkbook = Calx.createWorkbookFromData(savedData); + +newWorkbook.build(); +newWorkbook.calculate(); +``` + +### Move and Copy Cell Ranges + +```typescript +const sheet = workbook.createSheet('Sheet1'); +sheet.createCell('A1', { value: 10 }); +sheet.createCell('A2', { formula: '=A1*2' }); + +// Move range (updates formulas that reference these cells) +sheet.moveRange('A1:A2', 'C3'); // Moves A1:A2 to C3:C4 + +// Copy range (formulas within copied cells are translated) +sheet.copyRange('C3:C4', 'E5'); // Copies C3:C4 to E5:E6 +``` + ## 🔧 Development ### Prerequisites diff --git a/src/Calx.ts b/src/Calx.ts index e755c93..592fe02 100644 --- a/src/Calx.ts +++ b/src/Calx.ts @@ -7,6 +7,9 @@ import { DateUtil } from "./Calx/Utility/DateUtil"; // Export utilities export { DateUtil }; +// Export types +export type { Data }; + export class Calx { static formulae : Record = {}; @@ -45,4 +48,8 @@ export class Calx { static createInterpreter() { return new CalxInterpreter(); } + + static exportJSON(workbook: Workbook): Data { + return workbook.exportJSON(); + } } \ No newline at end of file diff --git a/src/Calx/Cell.ts b/src/Calx/Cell.ts index 2ef90d1..ca00a60 100644 --- a/src/Calx/Cell.ts +++ b/src/Calx/Cell.ts @@ -404,7 +404,7 @@ export class Cell { // Resolve local dependencies const dependencies: Record = {}; for (const address in localDeps) { - const precedentCell = this.sheet.getCellDirect(address); + const precedentCell = this.sheet.getCellIfExists(address); if (precedentCell) { dependencies[address] = precedentCell; precedentCell.addDependent(this); @@ -419,7 +419,7 @@ export class Cell { const { sheetName, cellAddress } = builder.parseRemoteReference(remoteRef); const targetSheet = this.sheet.workbook.getSheet(sheetName); if (targetSheet) { - const targetCell = targetSheet.getCellDirect(cellAddress); + const targetCell = targetSheet.getCellIfExists(cellAddress); if (targetCell) { targetCell.addRemoteDependent(this); this.addRemotePrecedent(targetCell); diff --git a/src/Calx/Sheet.ts b/src/Calx/Sheet.ts index 1125aa0..dabfd51 100644 --- a/src/Calx/Sheet.ts +++ b/src/Calx/Sheet.ts @@ -7,6 +7,7 @@ import { CellRegistry } from './Sheet/CellRegistry'; import { DependencyTree } from './Workbook/DependencyTree'; import { DependencyBuilder } from './Workbook/DependencyBuilder'; import { CellData } from './Workbook/Data'; +import { strToNum, numToStr, translateFormula, updateMovedReferences, getCellsInRange } from './Utility/Utility'; export class Sheet { private _el!: any; @@ -202,6 +203,13 @@ export class Sheet { return this._cells.get(address); } + /** + * Get a cell only if it already exists (doesn't auto-create) + */ + public getCellIfExists(address: string): Cell | null { + return this._cells.has(address) ? this._cells.get(address) : null; + } + /** * Alias for getRange (Excel-like) * @deprecated Use getRange() instead @@ -394,4 +402,293 @@ export class Sheet { return result; } + + /** + * Load data from a 2D array into the sheet, starting at the anchor cell + * Formulas are automatically translated to the correct cell addresses based on the anchor offset + * + * @param data 2D array of values (numbers, strings, or formulas starting with =) + * @param anchor Cell address where the array should start (e.g., 'B2') + * + * @example + * sheet.loadArray([ + * [100, 200, 300], + * [400, 500, 600], + * ['=SUM(A1:C1)', 0, 0] + * ], 'B2'); + * // Creates cells at B2, C2, D2, B3, C3, D3, B4, C4, D4 + * // Formula '=SUM(A1:C1)' at array[2][0] becomes '=SUM(B2:D2)' at cell B4 + */ + public loadArray(data: any[][], anchor: string): void { + if (!Array.isArray(data) || data.length === 0) { + throw new Error('Data must be a non-empty 2D array'); + } + + // Parse anchor address to get column and row + const anchorMatch = anchor.match(/^([A-Z]+)(\d+)$/i); + if (!anchorMatch) { + throw new Error(`Invalid anchor address: ${anchor}`); + } + + const anchorCol = anchorMatch[1].toUpperCase(); + const anchorRow = parseInt(anchorMatch[2]); + const anchorColNum = strToNum(anchorCol); + + // Calculate the offset that applies to all formulas in the array + // This is the offset from the theoretical position (A1) to the actual anchor + const formulaRowOffset = anchorRow - 1; + const formulaColOffset = anchorColNum - 1; + + // Iterate through the array and create cells + for (let rowIdx = 0; rowIdx < data.length; rowIdx++) { + const row = data[rowIdx]; + if (!Array.isArray(row)) { + throw new Error(`Row ${rowIdx} is not an array`); + } + + for (let colIdx = 0; colIdx < row.length; colIdx++) { + const value = row[colIdx]; + const targetCol = numToStr(anchorColNum + colIdx); + const targetRow = anchorRow + rowIdx; + const targetAddress = `${targetCol}${targetRow}`; + + // Determine if it's a formula or a value + if (typeof value === 'string' && value.startsWith('=')) { + // Translate formula using the same offset for all cells + const translatedFormula = translateFormula(value, formulaRowOffset, formulaColOffset); + this.createCell(targetAddress, { formula: translatedFormula }); + } else { + // Regular value + this.createCell(targetAddress, { value }); + } + } + } + } + + /** + * Move a range of cells to a new location + * - Moves cell values and formulas + * - Translates formulas within the moved cells + * - Updates references to moved cells in other formulas + * - Rebuilds dependency tree + * + * @param srcRange Source range address (e.g., 'A1:B2' or 'A1') + * @param dstAddress Destination starting address (e.g., 'C3') + * + * @example + * sheet.moveRange('A1:B2', 'D5'); + * // Moves cells A1, A2, B1, B2 to D5, D6, E5, E6 + * // Formula =SUM(A1:B2) in moved cells becomes =SUM(D5:E6) + * // Formula =A1+B1 in other cells becomes =D5+E5 + */ + public moveRange(srcRange: string, dstAddress: string): void { + // Parse source range + const srcParts = srcRange.includes(':') ? srcRange.split(':') : [srcRange, srcRange]; + const srcStart = srcParts[0].trim().replace(/\$/g, ''); + const srcEnd = srcParts[1].trim().replace(/\$/g, ''); + + const srcStartCol = srcStart.match(/[A-Z]+/)?.[0] || 'A'; + const srcStartRow = parseInt(srcStart.match(/\d+/)?.[0] || '1'); + const srcEndCol = srcEnd.match(/[A-Z]+/)?.[0] || srcStartCol; + const srcEndRow = parseInt(srcEnd.match(/\d+/)?.[0] || srcStartRow.toString()); + + // Parse destination + const dstCleaned = dstAddress.replace(/\$/g, ''); + const dstStartCol = dstCleaned.match(/[A-Z]+/)?.[0] || 'A'; + const dstStartRow = parseInt(dstCleaned.match(/\d+/)?.[0] || '1'); + + // Calculate range dimensions + const srcStartColNum = strToNum(srcStartCol); + const srcEndColNum = strToNum(srcEndCol); + const colCount = Math.abs(srcEndColNum - srcStartColNum) + 1; + const rowCount = Math.abs(srcEndRow - srcStartRow) + 1; + + const dstStartColNum = strToNum(dstStartCol); + const dstEndColNum = dstStartColNum + colCount - 1; + const dstEndRow = dstStartRow + rowCount - 1; + const dstEndCol = numToStr(dstEndColNum); + + // Calculate offset for translating formulas in moved cells + const rowOffset = dstStartRow - srcStartRow; + const colOffset = dstStartColNum - srcStartColNum; + + // Get all cells in source range + const srcCellAddresses = getCellsInRange( + srcStart === srcEnd ? `${srcStart}:${srcEnd}` : srcRange + ); + + // Store cell data before moving + const cellData: Array<{ address: string; value: any; formula: string | null }> = []; + srcCellAddresses.forEach(addr => { + if (this._cells.has(addr)) { + const cell = this._cells.get(addr); + cellData.push({ + address: addr, + value: cell.value, + formula: cell.formula + }); + } + }); + + // Remove source cells FIRST + srcCellAddresses.forEach(addr => { + if (this._cells.has(addr)) { + const cell = this._cells.get(addr); + this._cells.remove(cell); + } + }); + + // Create cells at destination with translated formulas + cellData.forEach((data) => { + const srcAddr = data.address; + const srcColMatch = srcAddr.match(/[A-Z]+/)?.[0] || 'A'; + const srcRowMatch = parseInt(srcAddr.match(/\d+/)?.[0] || '1'); + const srcCol = strToNum(srcColMatch); + const srcRow = srcRowMatch; + + // Calculate destination address + const dstCol = srcCol + colOffset; + const dstRow = srcRow + rowOffset; + const dstAddr = `${numToStr(dstCol)}${dstRow}`; + + // Remove existing cell at destination if it exists + if (this._cells.has(dstAddr)) { + const existingCell = this._cells.get(dstAddr); + this._cells.remove(existingCell); + } + + // Translate formula if exists + let newFormula = data.formula; + if (newFormula) { + newFormula = translateFormula(newFormula, rowOffset, colOffset); + } + + // Create new cell + if (newFormula) { + this.createCell(dstAddr, { formula: newFormula }); + } else { + this.createCell(dstAddr, { value: data.value }); + } + }); + + // Update all formulas in the sheet that reference the moved range + // Do this AFTER creating destination cells so they exist when formulas are updated + this._cells.each((cell: Cell) => { + // Skip cells that are at the destination (just moved) + if (cell.address >= numToStr(dstStartColNum) + dstStartRow && + cell.address <= numToStr(dstEndColNum) + dstEndRow) { + // This is a rough check - could be improved + return; + } + + if (cell.formula) { + const updatedFormula = updateMovedReferences( + cell.formula, + srcStartCol, srcStartRow, srcEndCol, srcEndRow, + dstStartCol, dstStartRow, dstEndCol, dstEndRow + ); + if (updatedFormula !== cell.formula) { + cell.formula = updatedFormula; + } + } + }); + + // Rebuild dependency tree + this.buildDependencyTree(); + } + + /** + * Copy a range of cells to a new location + * - Copies cell values and formulas + * - Translates formulas within the copied cells + * - Does NOT update references in other formulas (they still point to original) + * - Rebuilds dependency tree + * + * @param srcRange Source range address (e.g., 'A1:B2' or 'A1') + * @param dstAddress Destination starting address (e.g., 'C3') + * + * @example + * sheet.copyRange('A1:B2', 'D5'); + * // Copies cells A1, A2, B1, B2 to D5, D6, E5, E6 + * // Formula =SUM(A1:B2) in copied cells becomes =SUM(D5:E6) + * // Other formulas that reference A1:B2 remain unchanged + */ + public copyRange(srcRange: string, dstAddress: string): void { + // Parse source range + const srcParts = srcRange.includes(':') ? srcRange.split(':') : [srcRange, srcRange]; + const srcStart = srcParts[0].trim().replace(/\$/g, ''); + const srcEnd = srcParts[1].trim().replace(/\$/g, ''); + + const srcStartCol = srcStart.match(/[A-Z]+/)?.[0] || 'A'; + const srcStartRow = parseInt(srcStart.match(/\d+/)?.[0] || '1'); + const srcEndCol = srcEnd.match(/[A-Z]+/)?.[0] || srcStartCol; + const srcEndRow = parseInt(srcEnd.match(/\d+/)?.[0] || srcStartRow.toString()); + + // Parse destination + const dstCleaned = dstAddress.replace(/\$/g, ''); + const dstStartCol = dstCleaned.match(/[A-Z]+/)?.[0] || 'A'; + const dstStartRow = parseInt(dstCleaned.match(/\d+/)?.[0] || '1'); + + // Calculate offset for translating formulas + const srcStartColNum = strToNum(srcStartCol); + const dstStartColNum = strToNum(dstStartCol); + const rowOffset = dstStartRow - srcStartRow; + const colOffset = dstStartColNum - srcStartColNum; + + // Get all cells in source range + const srcCellAddresses = getCellsInRange( + srcStart === srcEnd ? `${srcStart}:${srcEnd}` : srcRange + ); + + // Collect all source cell data BEFORE writing (important for overlapping ranges) + const cellData: { srcAddr: string; dstAddr: string; value: any; formula: string }[] = []; + + srcCellAddresses.forEach(srcAddr => { + if (this._cells.has(srcAddr)) { + const srcCell = this._cells.get(srcAddr); + + // Calculate destination address + const srcColMatch = srcAddr.match(/[A-Z]+/)?.[0] || 'A'; + const srcRowMatch = parseInt(srcAddr.match(/\d+/)?.[0] || '1'); + const srcCol = strToNum(srcColMatch); + const srcRow = srcRowMatch; + + const dstCol = srcCol + colOffset; + const dstRow = srcRow + rowOffset; + const dstAddr = `${numToStr(dstCol)}${dstRow}`; + + cellData.push({ + srcAddr, + dstAddr, + value: srcCell.value, + formula: srcCell.formula + }); + } + }); + + // Now write all destination cells + cellData.forEach(data => { + // Remove existing cell at destination if it exists + if (this._cells.has(data.dstAddr)) { + const existingCell = this._cells.get(data.dstAddr); + this._cells.remove(existingCell); + } + + // Translate formula if exists + let newFormula = data.formula; + if (newFormula) { + newFormula = translateFormula(newFormula, rowOffset, colOffset); + } + + // Create new cell at destination + if (newFormula) { + this.createCell(data.dstAddr, { formula: newFormula }); + } else { + this.createCell(data.dstAddr, { value: data.value }); + } + }); + + // Rebuild dependency tree + this.buildDependencyTree(); + } } diff --git a/src/Calx/Utility/Utility.ts b/src/Calx/Utility/Utility.ts index 941fb30..12cc53a 100644 --- a/src/Calx/Utility/Utility.ts +++ b/src/Calx/Utility/Utility.ts @@ -278,3 +278,174 @@ export function transposeTable(table: Array>): Array> { return newTable; } + +/** + * Translate all cell references in a formula by applying row and column offsets. + * Respects absolute references ($ markers) and translates both individual cells and ranges. + * + * @param formula The formula to translate (must start with =) + * @param cellRowOffset The row offset to apply to relative row references + * @param cellColOffset The column offset to apply to relative column references + * @returns The translated formula + * + * @example + * translateFormula('=A1', 1, 1) // Returns '=B2' + * translateFormula('=SUM(A1:B2)', 1, 1) // Returns '=SUM(B2:C3)' + * translateFormula('=$A$1', 1, 1) // Returns '=$A$1' (absolute reference unchanged) + * translateFormula('=A$1', 1, 1) // Returns '=B$1' (absolute row unchanged) + */ +export function translateFormula(formula: string, cellRowOffset: number, cellColOffset: number): string { + if (!formula.startsWith('=')) return formula; + + // Remove leading = + let translated = formula.substring(1); + + // First, match and translate cell ranges (A1:B2) + // We do this first to avoid double-processing individual cells in ranges + translated = translated.replace( + /(\$?)([A-Z]+)(\$?)(\d+):(\$?)([A-Z]+)(\$?)(\d+)/gi, + (match, col1Abs, col1, row1Abs, row1, col2Abs, col2, row2Abs, row2) => { + // Translate start of range + const col1Num = strToNum(col1.toUpperCase()); + const row1Num = parseInt(row1); + const newCol1Num = col1Abs === '$' ? col1Num : col1Num + cellColOffset; + const newRow1Num = row1Abs === '$' ? row1Num : row1Num + cellRowOffset; + const newStart = `${col1Abs}${numToStr(newCol1Num)}${row1Abs}${newRow1Num}`; + + // Translate end of range + const col2Num = strToNum(col2.toUpperCase()); + const row2Num = parseInt(row2); + const newCol2Num = col2Abs === '$' ? col2Num : col2Num + cellColOffset; + const newRow2Num = row2Abs === '$' ? row2Num : row2Num + cellRowOffset; + const newEnd = `${col2Abs}${numToStr(newCol2Num)}${row2Abs}${newRow2Num}`; + + return `${newStart}:${newEnd}`; + } + ); + + // Then match individual cell references (A1, $A$1, A$1, $A1) + // Use (? { + const colNum = strToNum(col.toUpperCase()); + const rowNum = parseInt(row); + + const newColNum = colAbs === '$' ? colNum : colNum + cellColOffset; + const newRowNum = rowAbs === '$' ? rowNum : rowNum + cellRowOffset; + + return `${colAbs}${numToStr(newColNum)}${rowAbs}${newRowNum}`; + } + ); + + return '=' + translated; +} + +/** + * Update references to a moved range in a formula + * When a range is moved from oldRange to newRange, all formulas that reference + * cells in oldRange need to be updated to reference newRange instead + * + * @param formula The formula to update + * @param oldStartCol The starting column of the old range (e.g., 'A') + * @param oldStartRow The starting row of the old range (e.g., 1) + * @param oldEndCol The ending column of the old range (e.g., 'B') + * @param oldEndRow The ending row of the old range (e.g., 2) + * @param newStartCol The starting column of the new range + * @param newStartRow The starting row of the new range + * @param newEndCol The ending column of the new range + * @param newEndRow The ending row of the new range + * @returns The updated formula + * + * @example + * updateMovedReferences('=SUM(A1:B2)', 'A', 1, 'B', 2, 'C', 3, 'D', 4) + * // Returns '=SUM(C3:D4)' + * + * updateMovedReferences('=A1+B1', 'A', 1, 'B', 2, 'C', 3, 'D', 4) + * // Returns '=C3+D3' + */ +export function updateMovedReferences( + formula: string, + oldStartCol: string, + oldStartRow: number, + oldEndCol: string, + oldEndRow: number, + newStartCol: string, + newStartRow: number, + newEndCol: string, + newEndRow: number +): string { + if (!formula.startsWith('=')) return formula; + + const oldStartColNum = strToNum(oldStartCol); + const oldEndColNum = strToNum(oldEndCol); + const newStartColNum = strToNum(newStartCol); + const newEndColNum = strToNum(newEndCol); + + // Normalize ranges (ensure start <= end) + const oldMinRow = Math.min(oldStartRow, oldEndRow); + const oldMaxRow = Math.max(oldStartRow, oldEndRow); + const oldMinCol = Math.min(oldStartColNum, oldEndColNum); + const oldMaxCol = Math.max(oldStartColNum, oldEndColNum); + + const newMinRow = Math.min(newStartRow, newEndRow); + const newMaxRow = Math.max(newStartRow, newEndRow); + const newMinCol = Math.min(newStartColNum, newEndColNum); + const newMaxCol = Math.max(newStartColNum, newEndColNum); + + let translated = formula.substring(1); + + // Update range references (A1:B2) + translated = translated.replace( + /(? { + const col1Num = strToNum(col1.toUpperCase()); + const row1Num = parseInt(row1); + const col2Num = strToNum(col2.toUpperCase()); + const row2Num = parseInt(row2); + + // Check if this range overlaps with the moved range + const rangeMinCol = Math.min(col1Num, col2Num); + const rangeMaxCol = Math.max(col1Num, col2Num); + const rangeMinRow = Math.min(row1Num, row2Num); + const rangeMaxRow = Math.max(row1Num, row2Num); + + // If the range matches the old range exactly, update it + if (rangeMinCol === oldMinCol && rangeMaxCol === oldMaxCol && + rangeMinRow === oldMinRow && rangeMaxRow === oldMaxRow) { + const newCol1 = numToStr(newMinCol); + const newCol2 = numToStr(newMaxCol); + return `${col1Abs}${newCol1}${row1Abs}${newMinRow}:${col2Abs}${newCol2}${row2Abs}${newMaxRow}`; + } + + return match; + } + ); + + // Update individual cell references + translated = translated.replace( + /(? { + const colNum = strToNum(col.toUpperCase()); + const rowNum = parseInt(row); + + // Check if this cell is in the moved range + if (colNum >= oldMinCol && colNum <= oldMaxCol && + rowNum >= oldMinRow && rowNum <= oldMaxRow) { + // Calculate relative position within old range + const relCol = colNum - oldMinCol; + const relRow = rowNum - oldMinRow; + + // Apply to new range + const newColNum = newMinCol + relCol; + const newRowNum = newMinRow + relRow; + + return `${colAbs}${numToStr(newColNum)}${rowAbs}${newRowNum}`; + } + + return match; + } + ); + + return '=' + translated; +} diff --git a/src/Calx/Workbook.ts b/src/Calx/Workbook.ts index 4b842c9..5c1f25b 100644 --- a/src/Calx/Workbook.ts +++ b/src/Calx/Workbook.ts @@ -220,6 +220,50 @@ export class Workbook { } } + /** + * Export workbook to JSON Data format + * Returns a Data object that can be used with createWorkbookFromData() + */ + public exportJSON(): Data { + const data: Data = { + sheets: {} + }; + + for (const sheetName in this._sheets) { + const sheet = this._sheets[sheetName]; + const allCells = sheet.cells; + + data.sheets[sheetName] = { + element: sheet.element, + cells: {}, + variables: {} + }; + + // Export each cell's data + for (const address in allCells) { + const cell = allCells[address]; + const cellData: CellData = {}; + + if (cell.formula) { + cellData.formula = cell.formula; + } else if (cell.value !== undefined) { + cellData.value = cell.value; + } + + if (cell.type) { + cellData.type = cell.type; + } + + // Only include cells that have data + if (cellData.formula || cellData.value !== undefined) { + data.sheets[sheetName].cells[address] = cellData; + } + } + } + + return data; + } + /** * Create workbook object from given config */ diff --git a/test/DateHandling.test.ts b/test/DateHandling.test.ts index b7529c6..32cc794 100644 --- a/test/DateHandling.test.ts +++ b/test/DateHandling.test.ts @@ -1,4 +1,4 @@ -import { describe, expect, test, beforeEach } from 'bun:test'; +import { describe, expect, test, beforeEach } from '@jest/globals'; import { Calx, DateUtil } from '../src/Calx'; import { DataType } from '../src/Calx/Cell/DataType'; diff --git a/test/Debug2D.test.ts b/test/Debug2D.test.ts index e497545..c037ece 100644 --- a/test/Debug2D.test.ts +++ b/test/Debug2D.test.ts @@ -22,7 +22,6 @@ describe('Debug 2D Array', () => { const cellB1 = sheet.getCell('B1'); console.log('Cell B1 exists:', cellB1 !== null); console.log('Cell B1 value:', cellB1?.value); - console.log('Cell B1 calculated:', cellB1?._calculated); // Check A1's spillRange const cellA1 = sheet.getCell('A1'); diff --git a/test/DebugArithmetic.test.ts b/test/DebugArithmetic.test.ts index f1cebba..ef76688 100644 --- a/test/DebugArithmetic.test.ts +++ b/test/DebugArithmetic.test.ts @@ -1,4 +1,4 @@ -import { describe, test, expect } from 'bun:test'; +import { describe, test, expect } from '@jest/globals'; import { Calx } from '../src/Calx'; describe('Debug Arithmetic', () => { diff --git a/test/DynamicUpdates.test.ts b/test/DynamicUpdates.test.ts index 779cbab..c6961c0 100644 --- a/test/DynamicUpdates.test.ts +++ b/test/DynamicUpdates.test.ts @@ -22,10 +22,15 @@ describe('Dynamic Updates', () => { // First, update the formula to include a wider range sheet.getCellDirect('A3').formula = '=SUM(A1:A5)'; + // Temporarily disable auto-calculate to add cells without triggering calculation + sheet.autoCalculate = false; + // Add new cells sheet.createCell('A4', { value: 15 }); sheet.createCell('A5', { value: 25 }); + // Re-enable auto-calculate and manually calculate + sheet.autoCalculate = true; // Just calculate, don't build again workbook.calculate(); diff --git a/test/NamedRange.test.ts b/test/NamedRange.test.ts index 8dd4396..6917257 100644 --- a/test/NamedRange.test.ts +++ b/test/NamedRange.test.ts @@ -1,4 +1,4 @@ -import { describe, test, expect } from 'bun:test'; +import { describe, test, expect } from '@jest/globals'; import { Calx } from '../src/Calx'; describe('Named Ranges', () => { diff --git a/test/exportJSON.test.ts b/test/exportJSON.test.ts new file mode 100644 index 0000000..01ef434 --- /dev/null +++ b/test/exportJSON.test.ts @@ -0,0 +1,137 @@ +import { Calx } from '../src/Calx'; + +describe('Workbook.exportJSON()', () => { + it('should export empty workbook', () => { + const workbook = Calx.createWorkbook(); + workbook.createSheet('Sheet1'); + + const data = workbook.exportJSON(); + + expect(data).toHaveProperty('sheets'); + expect(data.sheets).toHaveProperty('Sheet1'); + expect(data.sheets.Sheet1.cells).toEqual({}); + }); + + it('should export workbook with values', () => { + const workbook = Calx.createWorkbook(); + const sheet = workbook.createSheet('Sheet1'); + + sheet.createCell('A1', { value: 10 }); + sheet.createCell('A2', { value: 20 }); + sheet.createCell('B1', { value: 'Hello' }); + + const data = workbook.exportJSON(); + + expect(data.sheets.Sheet1.cells.A1.value).toBe(10); + expect(data.sheets.Sheet1.cells.A2.value).toBe(20); + expect(data.sheets.Sheet1.cells.B1.value).toBe('Hello'); + }); + + it('should export workbook with formulas', () => { + const workbook = Calx.createWorkbook(); + const sheet = workbook.createSheet('Sheet1'); + + sheet.createCell('A1', { value: 10 }); + sheet.createCell('A2', { value: 20 }); + sheet.createCell('A3', { formula: '=A1+A2' }); + + const data = workbook.exportJSON(); + + expect(data.sheets.Sheet1.cells.A1.value).toBe(10); + expect(data.sheets.Sheet1.cells.A2.value).toBe(20); + expect(data.sheets.Sheet1.cells.A3.formula).toBe('=A1+A2'); + }); + + it('should export and reload workbook correctly', () => { + // Create original workbook + const workbook1 = Calx.createWorkbook(); + const sheet1 = workbook1.createSheet('Sheet1'); + + sheet1.createCell('A1', { value: 10 }); + sheet1.createCell('A2', { value: 20 }); + sheet1.createCell('A3', { formula: '=A1+A2' }); + sheet1.createCell('B1', { formula: '=A1*2' }); + + workbook1.build(); + workbook1.calculate(); + + // Export to JSON + const data = workbook1.exportJSON(); + + // Create new workbook from exported data + const workbook2 = Calx.createWorkbookFromData(data); + const sheet2 = workbook2.getSheet('Sheet1') as any; + + workbook2.build(); + workbook2.calculate(); + + // Verify values match + expect(sheet2.getCellValue('A1')).toBe(10); + expect(sheet2.getCellValue('A2')).toBe(20); + expect(sheet2.getCellValue('A3')).toBe(30); + expect(sheet2.getCellValue('B1')).toBe(20); + + // Verify formulas match + expect(sheet2.getCell('A3').formula).toBe('=A1+A2'); + expect(sheet2.getCell('B1').formula).toBe('=A1*2'); + }); + + it('should export multiple sheets', () => { + const workbook = Calx.createWorkbook(); + const sheet1 = workbook.createSheet('Sheet1'); + const sheet2 = workbook.createSheet('Sheet2'); + + sheet1.createCell('A1', { value: 10 }); + sheet2.createCell('A1', { value: 20 }); + + const data = workbook.exportJSON(); + + expect(data.sheets.Sheet1.cells.A1.value).toBe(10); + expect(data.sheets.Sheet2.cells.A1.value).toBe(20); + }); + + it('should use Calx.exportJSON static method', () => { + const workbook = Calx.createWorkbook(); + const sheet = workbook.createSheet('Sheet1'); + + sheet.createCell('A1', { value: 42 }); + + const data = Calx.exportJSON(workbook); + + expect(data.sheets.Sheet1.cells.A1.value).toBe(42); + }); + + it('should handle complex scenario with formulas and dependencies', () => { + const workbook1 = Calx.createWorkbook(); + const sheet1 = workbook1.createSheet('Sales'); + + sheet1.createCell('A1', { value: 100 }); + sheet1.createCell('A2', { value: 200 }); + sheet1.createCell('A3', { value: 150 }); + sheet1.createCell('A4', { formula: '=SUM(A1:A3)' }); + sheet1.createCell('B1', { formula: '=A1*0.1' }); + sheet1.createCell('B2', { formula: '=A2*0.1' }); + sheet1.createCell('B3', { formula: '=A3*0.1' }); + sheet1.createCell('B4', { formula: '=SUM(B1:B3)' }); + + workbook1.build(); + workbook1.calculate(); + + const originalTotal = sheet1.getCellValue('A4'); + const originalTax = sheet1.getCellValue('B4'); + + // Export and reload + const data = workbook1.exportJSON(); + const workbook2 = Calx.createWorkbookFromData(data); + const sheet2 = workbook2.getSheet('Sales') as any; + + workbook2.build(); + workbook2.calculate(); + + // Verify calculations match + expect(sheet2.getCellValue('A4')).toBe(originalTotal); + expect(sheet2.getCellValue('B4')).toBe(originalTax); + expect(sheet2.getCellValue('A4')).toBe(450); + expect(sheet2.getCellValue('B4')).toBe(45); + }); +}); diff --git a/test/loadArray.test.ts b/test/loadArray.test.ts new file mode 100644 index 0000000..06ac269 --- /dev/null +++ b/test/loadArray.test.ts @@ -0,0 +1,406 @@ +import { Calx } from '../src/Calx'; + +describe('Sheet.loadArray()', () => { + let workbook: any; + let sheet: any; + + beforeEach(() => { + workbook = Calx.createWorkbook(); + sheet = workbook.createSheet('test'); + }); + + describe('Basic Array Loading', () => { + it('should load simple 2D array at anchor A1', () => { + sheet.loadArray([ + [100, 200, 300], + [400, 500, 600] + ], 'A1'); + + expect(sheet.getCellValue('A1')).toBe(100); + expect(sheet.getCellValue('B1')).toBe(200); + expect(sheet.getCellValue('C1')).toBe(300); + expect(sheet.getCellValue('A2')).toBe(400); + expect(sheet.getCellValue('B2')).toBe(500); + expect(sheet.getCellValue('C2')).toBe(600); + }); + + it('should load array at different anchor (B2)', () => { + sheet.loadArray([ + [10, 20], + [30, 40] + ], 'B2'); + + expect(sheet.getCellValue('B2')).toBe(10); + expect(sheet.getCellValue('C2')).toBe(20); + expect(sheet.getCellValue('B3')).toBe(30); + expect(sheet.getCellValue('C3')).toBe(40); + }); + + it('should load array with mixed data types', () => { + sheet.loadArray([ + [100, 'text', true], + [3.14, 0, 0] // Changed null to 0 since cells default to numeric 0 + ], 'A1'); + + expect(sheet.getCellValue('A1')).toBe(100); + expect(sheet.getCellValue('B1')).toBe('text'); + expect(sheet.getCellValue('C1')).toBe(true); + expect(sheet.getCellValue('A2')).toBe(3.14); + expect(sheet.getCellValue('B2')).toBe(0); + expect(sheet.getCellValue('C2')).toBe(0); + }); + + it('should handle single row array', () => { + sheet.loadArray([[1, 2, 3, 4, 5]], 'D5'); + + expect(sheet.getCellValue('D5')).toBe(1); + expect(sheet.getCellValue('E5')).toBe(2); + expect(sheet.getCellValue('F5')).toBe(3); + expect(sheet.getCellValue('G5')).toBe(4); + expect(sheet.getCellValue('H5')).toBe(5); + }); + + it('should handle single column array', () => { + sheet.loadArray([ + [100], + [200], + [300] + ], 'C3'); + + expect(sheet.getCellValue('C3')).toBe(100); + expect(sheet.getCellValue('C4')).toBe(200); + expect(sheet.getCellValue('C5')).toBe(300); + }); + }); + + describe('Formula Translation', () => { + beforeEach(() => { + workbook = Calx.createWorkbook(); + sheet = workbook.createSheet('test'); + }); + + it('should translate simple cell reference from A1 to B2', () => { + sheet.loadArray([ + [100, 200], + ['=A1', '=B1'] + ], 'B2'); + + workbook.build(); + workbook.calculate(); + + // =A1 at array[1][0] should become =B2 (anchor B2 + offset 0,1) + expect(sheet.getCell('B3').formula).toBe('=B2'); + expect(sheet.getCellValue('B3')).toBe(100); + + // =B1 at array[1][1] should become =C2 (anchor B2 + offset 1,1) + expect(sheet.getCell('C3').formula).toBe('=C2'); + expect(sheet.getCellValue('C3')).toBe(200); + }); + + it('should translate SUM formula with range', () => { + sheet.loadArray([ + [100, 200, 300], + ['=SUM(A1:C1)', 0, 0] + ], 'B2'); + + workbook.build(); + workbook.calculate(); + + // =SUM(A1:C1) at array[1][0] should become =SUM(B2:D2) + expect(sheet.getCell('B3').formula).toBe('=SUM(B2:D2)'); + expect(sheet.getCellValue('B3')).toBe(600); + }); + + it('should translate formula at different anchor positions', () => { + // Test at anchor A1 (no offset) + sheet.loadArray([ + [10, 20], + ['=A1+B1', 0] + ], 'A1'); + + workbook.build(); + workbook.calculate(); + + expect(sheet.getCell('A2').formula).toBe('=A1+B1'); + expect(sheet.getCellValue('A2')).toBe(30); + }); + + it('should translate formula with multiple cell references', () => { + sheet.loadArray([ + [10, 20, 30], + ['=A1+B1+C1', 0, 0] + ], 'D5'); + + workbook.build(); + workbook.calculate(); + + // =A1+B1+C1 should become =D5+E5+F5 + expect(sheet.getCell('D6').formula).toBe('=D5+E5+F5'); + expect(sheet.getCellValue('D6')).toBe(60); + }); + + it('should translate nested functions', () => { + sheet.loadArray([ + [5, 10, 15], + ['=IF(A1>0, SUM(A1:C1), 0)', 0, 0] + ], 'B2'); + + workbook.build(); + workbook.calculate(); + + expect(sheet.getCell('B3').formula).toBe('=IF(B2>0, SUM(B2:D2), 0)'); + expect(sheet.getCellValue('B3')).toBe(30); + }); + }); + + describe('Absolute References', () => { + beforeEach(() => { + workbook = Calx.createWorkbook(); + sheet = workbook.createSheet('test'); + }); + + it('should preserve absolute column reference ($A1)', () => { + sheet.loadArray([ + [100, 200], + ['=$A1', 0] + ], 'C3'); + + workbook.build(); + workbook.calculate(); + + // $A1 should remain $A1 (absolute column) + expect(sheet.getCell('C4').formula).toBe('=$A3'); + }); + + it('should preserve absolute row reference (A$1)', () => { + sheet.loadArray([ + [100, 200], + ['=A$1', 0] + ], 'C3'); + + workbook.build(); + workbook.calculate(); + + // A$1 should become C$1 (relative column, absolute row) + expect(sheet.getCell('C4').formula).toBe('=C$1'); + }); + + it('should preserve fully absolute reference ($A$1)', () => { + sheet.loadArray([ + [100, 200], + ['=$A$1', 0] + ], 'C3'); + + workbook.build(); + workbook.calculate(); + + // $A$1 should remain $A$1 (both absolute) + expect(sheet.getCell('C4').formula).toBe('=$A$1'); + }); + + it('should handle mixed absolute references in ranges', () => { + sheet.loadArray([ + [10, 20, 30], + ['=SUM($A1:C$1)', 0, 0] + ], 'B2'); + + workbook.build(); + workbook.calculate(); + + // Formula is at array[1][0], which maps to cell B3 + // Original formula: =SUM($A1:C$1) + // If array were at A1, this cell (array[1][0]) would be at A2 + // Actual position: B3 + // Offset: B3 - A2 = +1 col, +1 row + // But we calculate offset as anchorRow-1=1, anchorCol-1=1 + // + // Translation: + // - $A1: $A (absolute col, stays A), 1 (relative row, +1 = 2) → $A2 + // - C$1: C (relative col, +1 = D), $1 (absolute row, stays 1) → D$1 + // Result: =SUM($A2:D$1) + const formula = sheet.getCell('B3').formula; + expect(formula).toBe('=SUM($A2:D$1)'); + }); + }); + + describe('Complex Scenarios', () => { + beforeEach(() => { + workbook = Calx.createWorkbook(); + sheet = workbook.createSheet('test'); + }); + + it('should load invoice-like data', () => { + sheet.loadArray([ + ['Item', 'Quantity', 'Price', 'Total'], + ['Product A', 10, 5.50, '=B2*C2'], + ['Product B', 5, 12.00, '=B3*C3'], + ['', '', 'Subtotal', '=SUM(D2:D3)'] + ], 'A1'); + + workbook.build(); + workbook.calculate(); + + expect(sheet.getCellValue('D2')).toBe(55); + expect(sheet.getCellValue('D3')).toBe(60); + expect(sheet.getCellValue('D4')).toBe(115); + }); + + it('should load table with row and column totals', () => { + sheet.loadArray([ + [10, 20, 30, '=SUM(A1:C1)'], + [40, 50, 60, '=SUM(A2:C2)'], + ['=SUM(A1:A2)', '=SUM(B1:B2)', '=SUM(C1:C2)', '=SUM(A1:C2)'] + ], 'B5'); + + workbook.build(); + workbook.calculate(); + + // Row totals + expect(sheet.getCellValue('E5')).toBe(60); // =SUM(B5:D5) + expect(sheet.getCellValue('E6')).toBe(150); // =SUM(B6:D6) + + // Column totals + expect(sheet.getCellValue('B7')).toBe(50); // =SUM(B5:B6) + expect(sheet.getCellValue('C7')).toBe(70); // =SUM(C5:C6) + expect(sheet.getCellValue('D7')).toBe(90); // =SUM(D5:D6) + + // Grand total + expect(sheet.getCellValue('E7')).toBe(210); // =SUM(B5:D6) + }); + + it('should load data with cross-references', () => { + sheet.loadArray([ + [100, 200, '=A1+B1'], + [300, 400, '=A2+B2'], + ['=A1+A2', '=B1+B2', '=C1+C2'] + ], 'A1'); + + workbook.build(); + workbook.calculate(); + + expect(sheet.getCellValue('C1')).toBe(300); // 100+200 + expect(sheet.getCellValue('C2')).toBe(700); // 300+400 + expect(sheet.getCellValue('A3')).toBe(400); // 100+300 + expect(sheet.getCellValue('B3')).toBe(600); // 200+400 + expect(sheet.getCellValue('C3')).toBe(1000); // 300+700 + }); + }); + + describe('Error Handling', () => { + it('should throw error for invalid anchor', () => { + expect(() => { + sheet.loadArray([[1, 2]], 'invalid'); + }).toThrow('Invalid anchor address: invalid'); + }); + + it('should throw error for empty array', () => { + expect(() => { + sheet.loadArray([], 'A1'); + }).toThrow('Data must be a non-empty 2D array'); + }); + + it('should throw error for non-array data', () => { + expect(() => { + sheet.loadArray('not an array' as any, 'A1'); + }).toThrow('Data must be a non-empty 2D array'); + }); + + it('should throw error if row is not an array', () => { + expect(() => { + sheet.loadArray([ + [1, 2, 3], + 'not an array' as any + ], 'A1'); + }).toThrow('Row 1 is not an array'); + }); + }); + + describe('Edge Cases', () => { + let workbook2: any; + let sheet2: any; + + beforeEach(() => { + workbook2 = Calx.createWorkbook(); + sheet2 = workbook2.createSheet('test'); + }); + + it('should handle large anchor offsets', () => { + sheet2.loadArray([ + [1, 2], + ['=A1', 0] + ], 'Z99'); + + workbook2.build(); + workbook2.calculate(); + + expect(sheet2.getCellValue('Z99')).toBe(1); + expect(sheet2.getCell('Z100').formula).toBe('=Z99'); + expect(sheet2.getCellValue('Z100')).toBe(1); + }); + + it('should handle column beyond Z (AA, AB, etc.)', () => { + sheet2.loadArray([ + [100, 200, 300] + ], 'Z1'); + + expect(sheet2.getCellValue('Z1')).toBe(100); + expect(sheet2.getCellValue('AA1')).toBe(200); + expect(sheet2.getCellValue('AB1')).toBe(300); + }); + + it('should handle formulas with function calls', () => { + sheet2.loadArray([ + [5, 10, 15], + ['=AVERAGE(A1:C1)', '=MAX(A1:C1)', '=MIN(A1:C1)'] + ], 'B2'); + + workbook2.build(); + workbook2.calculate(); + + expect(sheet2.getCellValue('B3')).toBe(10); // AVERAGE(5,10,15) + expect(sheet2.getCellValue('C3')).toBe(15); // MAX(5,10,15) + expect(sheet2.getCellValue('D3')).toBe(5); // MIN(5,10,15) + }); + + it('should preserve formulas without cell references', () => { + sheet2.loadArray([ + ['=PI()', '=2+2', '=SUM(1,2,3)'] + ], 'A1'); + + workbook2.build(); + workbook2.calculate(); + + expect(sheet2.getCellValue('A1')).toBeCloseTo(3.14159, 4); + expect(sheet2.getCellValue('B1')).toBe(4); + expect(sheet2.getCellValue('C1')).toBe(6); + }); + }); + + describe('Performance', () => { + it('should handle moderately large arrays efficiently', () => { + const rows = 50; + const cols = 20; + const data: any[][] = []; + + // Create data array + for (let r = 0; r < rows; r++) { + const row: any[] = []; + for (let c = 0; c < cols; c++) { + row.push(r * cols + c); + } + data.push(row); + } + + const start = performance.now(); + sheet.loadArray(data, 'A1'); + const duration = performance.now() - start; + + console.log(`Loaded ${rows}x${cols} array in ${duration.toFixed(2)}ms`); + expect(duration).toBeLessThan(1000); // Should complete in less than 1 second + + // Verify some cells + expect(sheet.getCellValue('A1')).toBe(0); + expect(sheet.getCellValue('T50')).toBe(999); // Last cell (row 50, col 20) + }); + }); +}); diff --git a/test/moveAndCopyRange.test.ts b/test/moveAndCopyRange.test.ts new file mode 100644 index 0000000..bde5a8c --- /dev/null +++ b/test/moveAndCopyRange.test.ts @@ -0,0 +1,575 @@ +import { Calx } from '../src/Calx'; + +describe('Sheet.moveRange() and copyRange()', () => { + let workbook: any; + let sheet: any; + + beforeEach(() => { + workbook = Calx.createWorkbook(); + sheet = workbook.createSheet('test'); + }); + + describe('moveRange()', () => { + describe('Basic Move Operations', () => { + it('should move a single cell', () => { + sheet.createCell('A1', { value: 100 }); + + sheet.moveRange('A1', 'B2'); + + expect(sheet.getCellValue('A1')).toBe(0); // Original cell should be empty/0 + expect(sheet.getCellValue('B2')).toBe(100); + }); + + it('should move a range of cells', () => { + sheet.createCell('A1', { value: 10 }); + sheet.createCell('A2', { value: 20 }); + sheet.createCell('B1', { value: 30 }); + sheet.createCell('B2', { value: 40 }); + + sheet.moveRange('A1:B2', 'D5'); + + // Original cells should be empty + expect(sheet.getCellValue('A1')).toBe(0); + expect(sheet.getCellValue('A2')).toBe(0); + expect(sheet.getCellValue('B1')).toBe(0); + expect(sheet.getCellValue('B2')).toBe(0); + + // New cells should have the values + expect(sheet.getCellValue('D5')).toBe(10); + expect(sheet.getCellValue('D6')).toBe(20); + expect(sheet.getCellValue('E5')).toBe(30); + expect(sheet.getCellValue('E6')).toBe(40); + }); + + it('should move cells with mixed data types', () => { + sheet.createCell('A1', { value: 100 }); + sheet.createCell('A2', { value: 'text' }); + sheet.createCell('B1', { value: true }); + sheet.createCell('B2', { value: 3.14 }); + + sheet.moveRange('A1:B2', 'C3'); + + expect(sheet.getCellValue('C3')).toBe(100); + expect(sheet.getCellValue('C4')).toBe('text'); + expect(sheet.getCellValue('D3')).toBe(true); + expect(sheet.getCellValue('D4')).toBe(3.14); + }); + }); + + describe('Formula Translation in Moved Cells', () => { + it('should translate simple cell reference in moved formula', () => { + sheet.createCell('A1', { value: 100 }); + sheet.createCell('B1', { formula: '=A1' }); + + workbook.build(); + workbook.calculate(); + + expect(sheet.getCellValue('B1')).toBe(100); + + // Move B1 to C3 + sheet.moveRange('B1', 'C3'); + + workbook.build(); + workbook.calculate(); + + // Formula should be translated: =A1 -> =B3 (offset +2 rows, +1 col) + expect(sheet.getCell('C3').formula).toBe('=B3'); + }); + + it('should translate SUM formula with range in moved cell', () => { + sheet.createCell('A1', { value: 10 }); + sheet.createCell('A2', { value: 20 }); + sheet.createCell('A3', { value: 30 }); + sheet.createCell('B1', { formula: '=SUM(A1:A3)' }); + + workbook.build(); + workbook.calculate(); + + expect(sheet.getCellValue('B1')).toBe(60); + + // Move B1 to D5 + sheet.moveRange('B1', 'D5'); + + workbook.build(); + workbook.calculate(); + + // Formula should be translated: =SUM(A1:A3) -> =SUM(C5:C7) + expect(sheet.getCell('D5').formula).toBe('=SUM(C5:C7)'); + }); + + it('should translate formulas in moved range', () => { + sheet.createCell('A1', { value: 10 }); + sheet.createCell('A2', { value: 20 }); + sheet.createCell('B1', { formula: '=A1*2' }); + sheet.createCell('B2', { formula: '=A2*2' }); + + workbook.build(); + workbook.calculate(); + + expect(sheet.getCellValue('B1')).toBe(20); + expect(sheet.getCellValue('B2')).toBe(40); + + // Move B1:B2 to D5:D6 + sheet.moveRange('B1:B2', 'D5'); + + workbook.build(); + workbook.calculate(); + + // Formulas should be translated + expect(sheet.getCell('D5').formula).toBe('=C5*2'); + expect(sheet.getCell('D6').formula).toBe('=C6*2'); + }); + + it('should preserve absolute references in moved formulas', () => { + sheet.createCell('A1', { value: 10 }); + sheet.createCell('B1', { formula: '=$A$1' }); + + sheet.moveRange('B1', 'C3'); + + // Absolute reference should not change + expect(sheet.getCell('C3').formula).toBe('=$A$1'); + }); + + it('should handle mixed absolute references correctly', () => { + sheet.createCell('A1', { value: 10 }); + sheet.createCell('B1', { formula: '=$A1+A$1' }); + + sheet.moveRange('B1', 'D3'); + + // $A1 -> $A3 (absolute col, relative row +2) + // A$1 -> C$1 (relative col +2, absolute row) + expect(sheet.getCell('D3').formula).toBe('=$A3+C$1'); + }); + }); + + describe('Update References to Moved Cells', () => { + it('should update references to a moved single cell', () => { + sheet.createCell('A1', { value: 100 }); + sheet.createCell('B1', { formula: '=A1*2' }); + + workbook.build(); + workbook.calculate(); + + expect(sheet.getCellValue('B1')).toBe(200); + + // Move A1 to C3 + sheet.moveRange('A1', 'C3'); + + workbook.build(); + workbook.calculate(); + + // B1's formula should now reference C3 + expect(sheet.getCell('B1').formula).toBe('=C3*2'); + expect(sheet.getCellValue('B1')).toBe(200); + }); + + it('should update references to a moved range', () => { + sheet.createCell('A1', { value: 10 }); + sheet.createCell('A2', { value: 20 }); + sheet.createCell('A3', { value: 30 }); + sheet.createCell('B1', { formula: '=SUM(A1:A3)' }); + + workbook.build(); + workbook.calculate(); + + expect(sheet.getCellValue('B1')).toBe(60); + + // Move A1:A3 to D5:D7 + sheet.moveRange('A1:A3', 'D5'); + + workbook.build(); + workbook.calculate(); + + // B1's formula should now reference D5:D7 + expect(sheet.getCell('B1').formula).toBe('=SUM(D5:D7)'); + expect(sheet.getCellValue('B1')).toBe(60); + }); + + it('should update multiple formulas that reference moved cells', () => { + sheet.createCell('A1', { value: 100 }); + sheet.createCell('B1', { formula: '=A1+10' }); + sheet.createCell('C1', { formula: '=A1*2' }); + sheet.createCell('D1', { formula: '=A1-5' }); + + workbook.build(); + workbook.calculate(); + + expect(sheet.getCellValue('B1')).toBe(110); + expect(sheet.getCellValue('C1')).toBe(200); + expect(sheet.getCellValue('D1')).toBe(95); + + // Move A1 to E5 + sheet.moveRange('A1', 'E5'); + + workbook.build(); + workbook.calculate(); + + // All formulas should be updated + expect(sheet.getCell('B1').formula).toBe('=E5+10'); + expect(sheet.getCell('C1').formula).toBe('=E5*2'); + expect(sheet.getCell('D1').formula).toBe('=E5-5'); + + expect(sheet.getCellValue('B1')).toBe(110); + expect(sheet.getCellValue('C1')).toBe(200); + expect(sheet.getCellValue('D1')).toBe(95); + }); + + it('should update references within moved range formulas', () => { + sheet.createCell('A1', { value: 10 }); + sheet.createCell('A2', { value: 20 }); + sheet.createCell('A3', { formula: '=A1+A2' }); + sheet.createCell('B1', { formula: '=A3*2' }); + + workbook.build(); + workbook.calculate(); + + expect(sheet.getCellValue('A3')).toBe(30); + expect(sheet.getCellValue('B1')).toBe(60); + + // Move A1:A3 to D5:D7 + sheet.moveRange('A1:A3', 'D5'); + + workbook.build(); + workbook.calculate(); + + // D7 (moved A3) should reference D5+D6 (moved A1, A2) + expect(sheet.getCell('D7').formula).toBe('=D5+D6'); + // B1 should reference D7 (moved A3) + expect(sheet.getCell('B1').formula).toBe('=D7*2'); + + expect(sheet.getCellValue('D7')).toBe(30); + expect(sheet.getCellValue('B1')).toBe(60); + }); + }); + + describe('Dependency Tree Rebuild', () => { + it('should rebuild dependency tree after move', () => { + sheet.createCell('A1', { value: 10 }); + sheet.createCell('A2', { value: 20 }); + sheet.createCell('A3', { formula: '=A1+A2' }); + sheet.createCell('B1', { formula: '=A3*2' }); + + workbook.build(); + workbook.calculate(); + + expect(sheet.getCellValue('B1')).toBe(60); + + // Move A1:A3 to D5:D7 + sheet.moveRange('A1:A3', 'D5'); + + // Change D5 (moved A1) value + sheet.getCell('D5').value = 50; + + workbook.calculate(); + + // D7 should recalculate: 50 + 20 = 70 + // B1 should recalculate: 70 * 2 = 140 + expect(sheet.getCellValue('D7')).toBe(70); + expect(sheet.getCellValue('B1')).toBe(140); + }); + }); + }); + + describe('copyRange()', () => { + describe('Basic Copy Operations', () => { + it('should copy a single cell', () => { + sheet.createCell('A1', { value: 100 }); + + sheet.copyRange('A1', 'B2'); + + // Both cells should have the value + expect(sheet.getCellValue('A1')).toBe(100); + expect(sheet.getCellValue('B2')).toBe(100); + }); + + it('should copy a range of cells', () => { + sheet.createCell('A1', { value: 10 }); + sheet.createCell('A2', { value: 20 }); + sheet.createCell('B1', { value: 30 }); + sheet.createCell('B2', { value: 40 }); + + sheet.copyRange('A1:B2', 'D5'); + + // Original cells should still have values + expect(sheet.getCellValue('A1')).toBe(10); + expect(sheet.getCellValue('A2')).toBe(20); + expect(sheet.getCellValue('B1')).toBe(30); + expect(sheet.getCellValue('B2')).toBe(40); + + // Copied cells should have the same values + expect(sheet.getCellValue('D5')).toBe(10); + expect(sheet.getCellValue('D6')).toBe(20); + expect(sheet.getCellValue('E5')).toBe(30); + expect(sheet.getCellValue('E6')).toBe(40); + }); + + it('should copy cells with mixed data types', () => { + sheet.createCell('A1', { value: 100 }); + sheet.createCell('A2', { value: 'text' }); + sheet.createCell('B1', { value: true }); + sheet.createCell('B2', { value: 3.14 }); + + sheet.copyRange('A1:B2', 'C3'); + + expect(sheet.getCellValue('C3')).toBe(100); + expect(sheet.getCellValue('C4')).toBe('text'); + expect(sheet.getCellValue('D3')).toBe(true); + expect(sheet.getCellValue('D4')).toBe(3.14); + }); + }); + + describe('Formula Translation in Copied Cells', () => { + it('should translate simple cell reference in copied formula', () => { + sheet.createCell('A1', { value: 100 }); + sheet.createCell('B1', { formula: '=A1' }); + + workbook.build(); + workbook.calculate(); + + expect(sheet.getCellValue('B1')).toBe(100); + + // Copy B1 to C3 + sheet.copyRange('B1', 'C3'); + + workbook.build(); + workbook.calculate(); + + // Original formula should stay the same + expect(sheet.getCell('B1').formula).toBe('=A1'); + // Copied formula should be translated: =A1 -> =B3 (offset +2 rows, +1 col) + expect(sheet.getCell('C3').formula).toBe('=B3'); + }); + + it('should translate SUM formula with range in copied cell', () => { + sheet.createCell('A1', { value: 10 }); + sheet.createCell('A2', { value: 20 }); + sheet.createCell('A3', { value: 30 }); + sheet.createCell('B1', { formula: '=SUM(A1:A3)' }); + + workbook.build(); + workbook.calculate(); + + expect(sheet.getCellValue('B1')).toBe(60); + + // Copy B1 to D5 + sheet.copyRange('B1', 'D5'); + + workbook.build(); + workbook.calculate(); + + // Original formula unchanged + expect(sheet.getCell('B1').formula).toBe('=SUM(A1:A3)'); + // Copied formula should be translated: =SUM(A1:A3) -> =SUM(C5:C7) + expect(sheet.getCell('D5').formula).toBe('=SUM(C5:C7)'); + }); + + it('should translate formulas in copied range', () => { + sheet.createCell('A1', { value: 10 }); + sheet.createCell('A2', { value: 20 }); + sheet.createCell('B1', { formula: '=A1*2' }); + sheet.createCell('B2', { formula: '=A2*2' }); + + workbook.build(); + workbook.calculate(); + + // Copy B1:B2 to D5:D6 + sheet.copyRange('B1:B2', 'D5'); + + workbook.build(); + workbook.calculate(); + + // Original formulas unchanged + expect(sheet.getCell('B1').formula).toBe('=A1*2'); + expect(sheet.getCell('B2').formula).toBe('=A2*2'); + + // Copied formulas should be translated + expect(sheet.getCell('D5').formula).toBe('=C5*2'); + expect(sheet.getCell('D6').formula).toBe('=C6*2'); + }); + + it('should preserve absolute references in copied formulas', () => { + sheet.createCell('A1', { value: 10 }); + sheet.createCell('B1', { formula: '=$A$1' }); + + sheet.copyRange('B1', 'C3'); + + // Absolute reference should not change + expect(sheet.getCell('C3').formula).toBe('=$A$1'); + }); + + it('should handle mixed absolute references correctly', () => { + sheet.createCell('A1', { value: 10 }); + sheet.createCell('B1', { formula: '=$A1+A$1' }); + + sheet.copyRange('B1', 'D3'); + + // $A1 -> $A3 (absolute col, relative row +2) + // A$1 -> C$1 (relative col +2, absolute row) + expect(sheet.getCell('D3').formula).toBe('=$A3+C$1'); + }); + }); + + describe('References to Copied Cells', () => { + it('should NOT update references to copied cells in other formulas', () => { + sheet.createCell('A1', { value: 100 }); + sheet.createCell('B1', { formula: '=A1*2' }); + + workbook.build(); + workbook.calculate(); + + expect(sheet.getCellValue('B1')).toBe(200); + + // Copy A1 to C3 + sheet.copyRange('A1', 'C3'); + + workbook.build(); + workbook.calculate(); + + // B1's formula should still reference A1, not C3 + expect(sheet.getCell('B1').formula).toBe('=A1*2'); + expect(sheet.getCellValue('B1')).toBe(200); + }); + + it('should NOT update range references when copying', () => { + sheet.createCell('A1', { value: 10 }); + sheet.createCell('A2', { value: 20 }); + sheet.createCell('A3', { value: 30 }); + sheet.createCell('B1', { formula: '=SUM(A1:A3)' }); + + workbook.build(); + workbook.calculate(); + + expect(sheet.getCellValue('B1')).toBe(60); + + // Copy A1:A3 to D5:D7 + sheet.copyRange('A1:A3', 'D5'); + + workbook.build(); + workbook.calculate(); + + // B1's formula should still reference A1:A3 + expect(sheet.getCell('B1').formula).toBe('=SUM(A1:A3)'); + expect(sheet.getCellValue('B1')).toBe(60); + }); + }); + + describe('Dependency Tree Rebuild', () => { + it('should rebuild dependency tree after copy', () => { + sheet.createCell('A1', { value: 10 }); + sheet.createCell('A2', { value: 20 }); + sheet.createCell('A3', { formula: '=A1+A2' }); + + workbook.build(); + workbook.calculate(); + + expect(sheet.getCellValue('A3')).toBe(30); + + // Copy A1:A3 to D5:D7 + sheet.copyRange('A1:A3', 'D5'); + + // Change D5 (copied A1) value + sheet.getCell('D5').value = 50; + + workbook.calculate(); + + // D7 should recalculate: 50 + 20 = 70 + // Original A3 should stay: 10 + 20 = 30 + expect(sheet.getCellValue('D7')).toBe(70); + expect(sheet.getCellValue('A3')).toBe(30); + }); + }); + + describe('Complex Scenarios', () => { + it('should handle copying formulas that reference cells outside the range', () => { + sheet.createCell('A1', { value: 100 }); + sheet.createCell('B1', { value: 10 }); + sheet.createCell('B2', { value: 20 }); + sheet.createCell('C1', { formula: '=A1+B1' }); + sheet.createCell('C2', { formula: '=A1+B2' }); + + workbook.build(); + workbook.calculate(); + + expect(sheet.getCellValue('C1')).toBe(110); + expect(sheet.getCellValue('C2')).toBe(120); + + // Copy C1:C2 to E5:E6 + sheet.copyRange('C1:C2', 'E5'); + + workbook.build(); + workbook.calculate(); + + // Copied formulas should reference C5 (offset from A1) and respective B cells + expect(sheet.getCell('E5').formula).toBe('=C5+D5'); + expect(sheet.getCell('E6').formula).toBe('=C5+D6'); + }); + + it('should copy formulas with complex nested functions', () => { + sheet.createCell('A1', { value: 10 }); + sheet.createCell('A2', { value: 20 }); + sheet.createCell('A3', { value: 30 }); + sheet.createCell('B1', { formula: '=IF(SUM(A1:A3)>50,MAX(A1:A3),MIN(A1:A3))' }); + + workbook.build(); + workbook.calculate(); + + expect(sheet.getCellValue('B1')).toBe(30); // SUM=60>50, so MAX=30 + + sheet.copyRange('B1', 'D5'); + + workbook.build(); + workbook.calculate(); + + expect(sheet.getCell('D5').formula).toBe('=IF(SUM(C5:C7)>50,MAX(C5:C7),MIN(C5:C7))'); + }); + }); + }); + + describe('Edge Cases', () => { + it('should handle moving range to overlapping location', () => { + sheet.createCell('A1', { value: 10 }); + sheet.createCell('A2', { value: 20 }); + sheet.createCell('A3', { value: 30 }); + + // Move A1:A2 to A2:A3 (overlap) + sheet.moveRange('A1:A2', 'A2'); + + expect(sheet.getCellValue('A1')).toBe(0); + expect(sheet.getCellValue('A2')).toBe(10); + expect(sheet.getCellValue('A3')).toBe(20); + }); + + it('should handle copying to overlapping location', () => { + sheet.createCell('A1', { value: 10 }); + sheet.createCell('A2', { value: 20 }); + sheet.createCell('A3', { value: 30 }); + + // Copy A1:A2 to A2:A3 (overlap) + sheet.copyRange('A1:A2', 'A2'); + + // After copy: A1=10 (unchanged), A2=10 (from A1), A3=20 (from A2) + expect(sheet.getCellValue('A1')).toBe(10); + expect(sheet.getCellValue('A2')).toBe(10); + expect(sheet.getCellValue('A3')).toBe(20); + }); + + it('should handle range with absolute reference markers in address', () => { + sheet.createCell('A1', { value: 100 }); + + sheet.moveRange('$A$1', 'B2'); + + expect(sheet.getCellValue('A1')).toBe(0); + expect(sheet.getCellValue('B2')).toBe(100); + }); + + it('should handle column beyond Z', () => { + sheet.createCell('Z1', { value: 100 }); + sheet.createCell('AA1', { value: 200 }); + + sheet.moveRange('Z1:AA1', 'AB5'); + + expect(sheet.getCellValue('AB5')).toBe(100); + expect(sheet.getCellValue('AC5')).toBe(200); + }); + }); +});