@clickview/auth 0.70.0-rc.0 → 0.70.0-rc.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/.vite/manifest.json +35 -2
- package/dist/bundles.json +2 -2
- package/dist/css/{BzkciF7s.chunk.css → CudewNs7.chunk.css} +1 -1
- package/dist/en.json +1 -1
- package/dist/scripts/B7AxsMtH.chunk.js +2 -0
- package/dist/scripts/B7AxsMtH.chunk.js.map +1 -0
- package/dist/scripts/DFawGnSF.chunk.js +2 -0
- package/dist/scripts/DFawGnSF.chunk.js.map +1 -0
- package/dist/scripts/DUO5SaBm.chunk.js +2 -0
- package/dist/scripts/DUO5SaBm.chunk.js.map +1 -0
- package/dist/scripts/DZiTrzZf.chunk.js +2 -0
- package/dist/scripts/DZiTrzZf.chunk.js.map +1 -0
- package/dist/scripts/index-ONpk5m_v.js +61 -0
- package/dist/scripts/index-ONpk5m_v.js.map +1 -0
- package/package.json +1 -1
- package/dist/scripts/index-BQFNXZDc.js +0 -30
- package/dist/scripts/index-BQFNXZDc.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DUO5SaBm.chunk.js","names":[],"sources":["../../../../../node_modules/@zxcvbn-ts/dictionary-compression/dist/decompress.mjs"],"sourcesContent":["function decompress(encodedString) {\n const decompressedArray = encodedString.split(/([A-Z])/g);\n const decompressedData = [];\n let last = \"\";\n let i;\n for (i = 1; i < decompressedArray.length; i += 2) {\n last = last.slice(0, decompressedArray[i].charCodeAt(0) - 65) + decompressedArray[i + 1];\n decompressedData.push(last);\n }\n return decompressedData;\n}\nexport {\n decompress as default\n};\n//# sourceMappingURL=decompress.mjs.map"],"x_google_ignoreList":[0],"mappings":"AAAA,SAAS,EAAW,EAAe,CACjC,IAAM,EAAoB,EAAc,MAAM,UAAU,EAClD,EAAmB,CAAC,EACtB,EAAO,GACP,EACJ,IAAK,EAAI,EAAG,EAAI,EAAkB,OAAQ,GAAK,EAC7C,EAAO,EAAK,MAAM,EAAG,EAAkB,EAAE,CAAC,WAAW,CAAC,EAAI,EAAE,EAAI,EAAkB,EAAI,GACtF,EAAiB,KAAK,CAAI,EAE5B,OAAO,CACT"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
var e=(e,t)=>e.push.apply(e,t),t=e=>e.sort((e,t)=>e.i-t.i||e.j-t.j),n=e=>{let t={},n=1;return e.forEach(e=>{t[e]=n,n+=1}),t},r={4:[[1,2],[2,3]],5:[[1,3],[2,3],[2,4]],6:[[1,2],[2,4],[4,5]],7:[[1,3],[2,3],[4,5],[4,6]],8:[[2,4],[4,6]]},i=1e4,a=/^[A-Z\xbf-\xdf][^A-Z\xbf-\xdf]+$/,o=/^[^A-Z\xbf-\xdf]+[A-Z\xbf-\xdf]$/,s=/^[A-Z\xbf-\xdf]+$/,c=/^[^a-z\xdf-\xff]+$/,l=/^[a-z\xdf-\xff]+$/,u=/^[^A-Z\xbf-\xdf]+$/,d=/[a-z\xdf-\xff]/,f=/[A-Z\xbf-\xdf]/,p=/[^A-Za-z\xbf-\xdf]/gi,m=/^\d+$/,h=new Date().getFullYear(),g={recentYear:/19\d\d|200\d|201\d|202\d/g},_=[` `,`,`,`;`,`:`,`|`,`/`,`\\`,`_`,`.`,`-`],ee=_.length,te=/[.*+?^${}()|[\]\\]/g,v=class{constructor(e){this.options=e}},ne=class extends v{match({password:e}){let n=[...this.getMatchesWithoutSeparator(e),...this.getMatchesWithSeparator(e)];return t(this.filterNoise(n))}getMatchesWithSeparator(e){let t=[],n=/^(\d{1,4})([\s/\\_.-])(\d{1,2})\2(\d{1,4})$/;for(let r=0;r<=Math.abs(e.length-6);r+=1)for(let i=r+5;i<=r+9&&!(i>=e.length);i+=1){let a=e.slice(r,i+1||9e9),o=n.exec(a);if(o!=null){let e=this.mapIntegersToDayMonthYear([parseInt(o[1],10),parseInt(o[3],10),parseInt(o[4],10)]);e!=null&&t.push({pattern:`date`,token:a,i:r,j:i,separator:o[2],year:e.year,month:e.month,day:e.day})}}return t}getMatchesWithoutSeparator(e){let t=[],n=/^\d{4,8}$/,i=e=>Math.abs(e.year-h);for(let a=0;a<=Math.abs(e.length-4);a+=1)for(let o=a+3;o<=a+7&&!(o>=e.length);o+=1){let s=e.slice(a,o+1||9e9);if(n.exec(s)){let e=[];if(r[s.length].forEach(([t,n])=>{let r=this.mapIntegersToDayMonthYear([parseInt(s.slice(0,t),10),parseInt(s.slice(t,n),10),parseInt(s.slice(n),10)]);r!=null&&e.push(r)}),e.length>0){let n=e[0],r=i(e[0]);e.slice(1).forEach(e=>{let t=i(e);t<r&&(n=e,r=t)}),t.push({pattern:`date`,token:s,i:a,j:o,separator:``,year:n.year,month:n.month,day:n.day})}}}return t}filterNoise(e){return e.filter(t=>{let n=!1,r=e.length;for(let i=0;i<r;i+=1){let r=e[i];if(t!==r&&r.i<=t.i&&r.j>=t.j){n=!0;break}}return!n})}mapIntegersToDayMonthYear(e){if(e[1]>31||e[1]<=0)return null;let t=0,n=0,r=0;for(let i=0,a=e.length;i<a;i+=1){let a=e[i];if(a>99&&a<1e3||a>2050)return null;a>31&&(n+=1),a>12&&(t+=1),a<=0&&(r+=1)}return n>=2||t===3||r>=2?null:this.getDayMonth(e)}getDayMonth(e){let t=[[e[2],e.slice(0,2)],[e[0],e.slice(1,3)]],n=t.length;for(let e=0;e<n;e+=1){let[n,r]=t[e];if(1e3<=n&&n<=2050){let e=this.mapIntegersToDayMonth(r);return e==null?null:{year:n,month:e.month,day:e.day}}}for(let e=0;e<n;e+=1){let[n,r]=t[e],i=this.mapIntegersToDayMonth(r);if(i!=null)return{year:this.twoToFourDigitYear(n),month:i.month,day:i.day}}return null}mapIntegersToDayMonth(e){let t=[e,e.slice().reverse()];for(let e=0;e<t.length;e+=1){let n=t[e],r=n[0],i=n[1];if(r>=1&&r<=31&&i>=1&&i<=12)return{day:r,month:i}}return null}twoToFourDigitYear(e){return e>99?e:e>50?e+1900:e+2e3}},y=new Uint32Array(65536),re=(e,t)=>{let n=e.length,r=t.length,i=1<<n-1,a=-1,o=0,s=n,c=n;for(;c--;)y[e.charCodeAt(c)]|=1<<c;for(c=0;c<r;c++){let e=y[t.charCodeAt(c)],n=e|o;e|=(e&a)+a^a,o|=~(e|a),a&=e,o&i&&s++,a&i&&s--,o=o<<1|1,a=a<<1|~(n|o),o&=n}for(c=n;c--;)y[e.charCodeAt(c)]=0;return s},ie=(e,t)=>{let n=t.length,r=e.length,i=[],a=[],o=Math.ceil(n/32),s=Math.ceil(r/32);for(let e=0;e<o;e++)a[e]=-1,i[e]=0;let c=0;for(;c<s-1;c++){let o=0,s=-1,l=c*32,u=Math.min(32,r)+l;for(let t=l;t<u;t++)y[e.charCodeAt(t)]|=1<<t;for(let e=0;e<n;e++){let n=y[t.charCodeAt(e)],r=a[e/32|0]>>>e&1,c=i[e/32|0]>>>e&1,l=n|o,u=((n|c)&s)+s^s|n|c,d=o|~(u|s),f=s&u;d>>>31^r&&(a[e/32|0]^=1<<e),f>>>31^c&&(i[e/32|0]^=1<<e),d=d<<1|r,f=f<<1|c,s=f|~(l|d),o=d&l}for(let t=l;t<u;t++)y[e.charCodeAt(t)]=0}let l=0,u=-1,d=c*32,f=Math.min(32,r-d)+d;for(let t=d;t<f;t++)y[e.charCodeAt(t)]|=1<<t;let p=r;for(let e=0;e<n;e++){let n=y[t.charCodeAt(e)],o=a[e/32|0]>>>e&1,s=i[e/32|0]>>>e&1,c=n|l,d=((n|s)&u)+u^u|n|s,f=l|~(d|u),m=u&d;p+=f>>>r-1&1,p-=m>>>r-1&1,f>>>31^o&&(a[e/32|0]^=1<<e),m>>>31^s&&(i[e/32|0]^=1<<e),f=f<<1|o,m=m<<1|s,u=m|~(c|f),l=f&c}for(let t=d;t<f;t++)y[e.charCodeAt(t)]=0;return p},b=(e,t)=>{if(e.length<t.length){let n=t;t=e,e=n}return t.length===0?e.length:e.length<=32?re(e,t):ie(e,t)},ae=(e,t,n)=>{let r=e.length<=t.length,i=e.length<=n;return r||i?Math.ceil(e.length/4):n},oe=(e,t,n)=>{let r=0,i=Object.keys(t).find(t=>{let i=ae(e,t,n);if(Math.abs(e.length-t.length)>i)return!1;let a=b(e,t),o=a<=i;return o&&(r=a),o});return i?{levenshteinDistance:r,levenshteinDistanceEntry:i}:{}},se=(e,t,n)=>{if(!n)return{rankedDictionaries:e,rankedDictionariesMaxWordSize:t};let r={...e},i={...t};return r.userInputs={...r.userInputs||{},...n.rankedDictionary},i.userInputs=Math.max(n.rankedDictionaryMaxWordSize,i.userInputs||0),{rankedDictionaries:r,rankedDictionariesMaxWordSize:i}},x=class extends v{constructor(e,t){super(e),this.wordSequenceCheck=t}getRangedDictionaries(e){if(this.wordSequenceCheck){let e={},t={};return Object.keys(this.options.rankedDictionaries).forEach(n=>{this.options.isWordSequence(n)&&(e[n]=this.options.rankedDictionaries[n],t[n]=this.options.rankedDictionariesMaxWordSize[n])}),{rankedDictionaries:e,rankedDictionariesMaxWordSize:t}}return se(this.options.rankedDictionaries,this.options.rankedDictionariesMaxWordSize,e)}match({password:e,userInputsOptions:t,useLevenshtein:n=!0}){let r=[],i=e.length,a=e.toLowerCase(),{rankedDictionaries:o,rankedDictionariesMaxWordSize:s}=this.getRangedDictionaries(t),c=Object.keys(o),l=Math.max(0,...Object.values(s));for(let t=0;t<i;t+=1)for(let u=t;u<i;u+=1){let d=t===0&&u===i-1;if(u-t+1>l&&!d)break;let f=a.slice(t,u+1);for(let i of c){let a=o[i];if(u-t+1>s[i]&&!d)continue;let c=a[f],l=c!==void 0,p={};this.options.useLevenshteinDistance&&d&&!l&&n&&(p=oe(f,a,this.options.levenshteinThreshold));let m=p.levenshteinDistance!==void 0;if(l||m){let n=m?p.levenshteinDistanceEntry:f,o=l?c:a[n];r.push({pattern:`dictionary`,i:t,j:u,token:e.slice(t,u+1),matchedWord:f,rank:o,dictionaryName:i,reversed:!1,l33t:!1,...p})}}}return r}},ce=class{constructor({substr:e,limit:t,trieRoot:n}){this.buffer=[],this.finalPasswords=[],this.substr=e,this.limit=t,this.trieRoot=n}getAllPossibleSubsAtIndex(e){let t=[],n=this.trieRoot;for(let r=e;r<this.substr.length;r+=1){let e=this.substr.charAt(r);if(n=n.getChild(e),!n)break;t.push(n)}return t}helper({onlyFullSub:e,isFullSub:t,index:n,subIndex:r,changes:i,lastSubLetter:a,consecutiveSubCount:o}){if(this.finalPasswords.length>=this.limit)return;if(n===this.substr.length){e===t&&this.finalPasswords.push({password:this.buffer.join(``),changes:i,isFullSubstitution:e});return}let s=[...this.getAllPossibleSubsAtIndex(n)],c=!1;for(let l=n+s.length-1;l>=n;--l){let u=s[l-n],d=u.parents.join(``);if(u.isTerminal()){if(a===d&&o>=3)continue;c=!0;let s=u.subs;for(let c of s){this.buffer.push(c);let s=i.concat({i:r,letter:c,substitution:d});if(this.helper({onlyFullSub:e,isFullSub:t,index:n+d.length,subIndex:r+c.length,changes:s,lastSubLetter:d,consecutiveSubCount:a===d?o+1:1}),this.buffer.pop(),this.finalPasswords.length>=this.limit)return}}}if(!e||!c){let s=this.substr.charAt(n);this.buffer.push(s),this.helper({onlyFullSub:e,isFullSub:t&&!c,index:n+1,subIndex:r+1,changes:i,lastSubLetter:a,consecutiveSubCount:o}),this.buffer.pop()}}getAll(){return this.helper({onlyFullSub:!0,isFullSub:!0,index:0,subIndex:0,changes:[],lastSubLetter:void 0,consecutiveSubCount:0}),this.helper({onlyFullSub:!1,isFullSub:!0,index:0,subIndex:0,changes:[],lastSubLetter:void 0,consecutiveSubCount:0}),this.finalPasswords}},le=(e,t,n)=>new ce({substr:e,limit:t,trieRoot:n}).getAll(),ue=(e,t,n)=>{let r=t,i=n,a=[],o=[],s=new Set;return e.changes.forEach(e=>{if(e.i<t){let t=e.substitution.length-e.letter.length;r+=t,i+=t}else if(e.i<=n){i+=e.substitution.length-e.letter.length;let t=`${e.letter}-${e.substitution}`;s.has(t)||(s.add(t),a.push({letter:e.letter,substitution:e.substitution}),o.push(`${e.substitution} -> ${e.letter}`))}}),{i:r,j:i,subs:a,subDisplay:o.join(`, `)}},S=class extends x{isAlreadyIncluded(e,t){return e.some(e=>e.i===t.i&&e.j===t.j&&e.dictionaryName===t.dictionaryName&&e.matchedWord===t.matchedWord)}match(e){let t=[],n=le(e.password,this.options.l33tMaxSubstitutions,this.options.trieNodeRoot),r=!1;return n.forEach(n=>{r||super.match({...e,password:n.password,useLevenshtein:n.isFullSubstitution}).forEach(i=>{let a=ue(n,i.i,i.j);r||=a.i===0&&a.j===e.password.length-1;let o=e.password.slice(a.i,a.j+1),s={...i,l33t:!0,token:o,...a},c=this.isAlreadyIncluded(t,s);o.toLowerCase()!==i.matchedWord&&!c&&t.push(s)})}),t.filter(e=>e.token.length>1)}},C=class extends x{match(e){let t=e.password.split(``).reverse().join(``);return super.match({...e,password:t}).map(t=>({...t,token:t.token.split(``).reverse().join(``),reversed:!0,i:e.password.length-1-t.j,j:e.password.length-1-t.i}))}},de=class extends v{match({password:e}){let n=[];return Object.keys(g).forEach(t=>{let r=g[t];r.lastIndex=0;let i;for(;i=r.exec(e);)if(i){let e=i[0];n.push({pattern:`regex`,token:e,i:i.index,j:i.index+i[0].length-1,regexName:t,regexMatch:i})}}),t(n)}},fe=Math.log(10),pe=Math.log(2),w={nCk(e,t){let n=e;if(t>n)return 0;if(t===0)return 1;let r=1;for(let e=1;e<=t;e+=1)r*=n,r/=e,--n;return r},log10(e){return e===0?0:Math.log(e)/fe},log2(e){return Math.log(e)/pe},factorial(e){let t=1;for(let n=2;n<=e;n+=1)t*=n;return t}},me=({token:e})=>{let t=10**e.length;t===1/0&&(t=Number.MAX_VALUE);let n;return n=e.length===1?11:51,Math.max(t,n)},he=({year:e,separator:t})=>{let n=Math.max(Math.abs(e-h),21)*365;return t&&(n*=4),n},ge=e=>{let t=e.split(``),n=t.filter(e=>e.match(f)).length,r=t.filter(e=>e.match(d)).length,i=0,a=Math.min(n,r);for(let e=1;e<=a;e+=1)i+=w.nCk(n+r,e);return i},_e=e=>{let t=e.replace(p,``);if(t.match(u)||t.toLowerCase()===t)return 1;let n=[a,o,c],r=n.length;for(let e=0;e<r;e+=1){let r=n[e];if(t.match(r))return 2}return ge(t)},T=(e,t)=>{let n=0,r=e.indexOf(t);for(;r>=0;)n+=1,r=e.indexOf(t,r+t.length);return n},ve=({sub:e,token:t})=>{let n=t.toLowerCase();return{subbedCount:T(n,e.substitution),unsubbedCount:T(n,e.letter)}},E=({l33t:e,subs:t,token:n})=>{if(!e)return 1;let r=1;return t.forEach(e=>{let{subbedCount:t,unsubbedCount:i}=ve({sub:e,token:n});if(t===0||i===0)r*=2;else{let e=Math.min(i,t),n=0;for(let r=1;r<=e;r+=1)n+=w.nCk(i+t,r);r*=n}}),r},D=({rank:e,reversed:t,l33t:n,subs:r,token:i,dictionaryName:a})=>{let o=e,s=_e(i),c=E({l33t:n,subs:r,token:i}),l=t&&2||1,u;return u=a===`diceware`?6**5/2:o*s*c*l,{baseGuesses:o,uppercaseVariations:s,l33tVariations:c,calculation:u}},O=({regexName:e,regexMatch:t,token:n})=>{let r={alphaLower:26,alphaUpper:26,alpha:52,alphanumeric:62,digits:10,symbols:33};if(e in r)return r[e]**n.length;switch(e){case`recentYear`:return Math.max(Math.abs(parseInt(t[0],10)-h),21)}return 0},k=({baseGuesses:e,repeatCount:t})=>e*t,A=({token:e,ascending:t})=>{let n=e.charAt(0),r;return r=[`a`,`A`,`z`,`Z`,`0`,`1`,`9`].includes(n)?4:/\d/.exec(n)?10:26,t||(r*=2),r*e.length},j=e=>{let t=0;return Object.keys(e).forEach(n=>{let r=e[n];t+=r.filter(e=>!!e).length}),t/=Object.entries(e).length,t},M=(e,{token:t,turns:n})=>{let r=Object.keys(e).length,i=j(e),a=0,o=t.length;for(let e=2;e<=o;e+=1){let t=Math.min(n,e-1);for(let n=1;n<=t;n+=1)a+=w.nCk(e-1,n-1)*r*i**n}return a},N=({graph:e,token:t,shiftedCount:n,turns:r},i)=>{let a=M(i.graphs[e],{token:t,turns:r});if(n){let e=t.length-n;if(n===0||e===0)a*=2;else{let t=0;for(let r=1;r<=Math.min(n,e);r+=1)t+=w.nCk(n+e,r);a*=t}}return Math.round(a)},P=()=>ee;function F(e){return e<=1?1:e*F(e-1)}var ye=e=>e.pattern===`wordSequence`?F(e.wordCount)*2**(e.wordCount-2):0,be=(e,t)=>{let n=1;return e.token.length<t.length&&(n=e.token.length===1?10:50),n},I={bruteforce:me,date:he,dictionary:D,regex:O,repeat:k,sequence:A,spatial:N,separator:P,wordSequence:ye},xe=(e,t,n)=>I[t]?I[t](n,e):e.matchers[t]&&`scoring`in e.matchers[t]?e.matchers[t].scoring(n,e):0,Se=(e,t,n)=>{let r={};if(`guesses`in t&&t.guesses!=null)return t;let i=be(t,n),a=xe(e,t.pattern,t),o=0;typeof a==`number`?o=a:t.pattern===`dictionary`&&(o=a.calculation,r.baseGuesses=a.baseGuesses,r.uppercaseVariations=a.uppercaseVariations,r.l33tVariations=a.l33tVariations);let s=Math.max(o,i);return{...t,...r,guesses:s,guessesLog10:w.log10(s)}},L=class{constructor(e){this.options=e,this.password=``,this.optimal={},this.excludeAdditive=!1}fillArray(e,t){let n=[];for(let r=0;r<e;r+=1){let e=[];t===`object`&&(e={}),n.push(e)}return n}makeBruteforceMatch(e,t){return{pattern:`bruteforce`,token:this.password.slice(e,t+1||9e9),i:e,j:t}}update(e,t){let n=e.j,r=Se(this.options,e,this.password),a=r.guesses;t>1&&(a*=this.optimal.guessesProduct[r.i-1][t-1]);let o=w.factorial(t)*a;this.excludeAdditive||(o+=i**(t-1));let s=!1,c=this.optimal.totalGuesses[n];Object.keys(c).forEach(e=>{let n=parseInt(e,10),r=c[n];n<=t&&r<=o&&(s=!0)}),s||(this.optimal.totalGuesses[n][t]=o,this.optimal.bestMatches[n][t]=r,this.optimal.guessesProduct[n][t]=a)}bruteforceUpdate(e){let t=this.makeBruteforceMatch(0,e);this.update(t,1);for(let n=1;n<=e;n+=1){t=this.makeBruteforceMatch(n,e);let r=this.optimal.bestMatches[n-1];Object.keys(r).forEach(e=>{let n=parseInt(e,10);r[n].pattern!==`bruteforce`&&this.update(t,n+1)})}}unwind(e){let t=[],n=e-1,r=0,i=1/0,a=this.optimal.totalGuesses[n];for(a&&Object.keys(a).forEach(e=>{let t=parseInt(e,10),n=a[t];n<i&&(r=t,i=n)});n>=0;){let e=this.optimal.bestMatches[n][r];t.unshift(e),n=e.i-1,--r}return t}mostGuessableMatchSequence(e,t,n=!1){this.password=e,this.excludeAdditive=n;let r=e.length,i=this.fillArray(r,`array`);t.forEach(e=>{i[e.j].push(e)}),i=i.map(e=>e.sort((e,t)=>e.i-t.i)),this.optimal={bestMatches:this.fillArray(r,`object`),guessesProduct:this.fillArray(r,`object`),totalGuesses:this.fillArray(r,`object`)};for(let e=0;e<r;e+=1)i[e].forEach(e=>{if(e.i>0){let t=this.optimal.bestMatches[e.i-1];Object.keys(t).forEach(t=>{let n=parseInt(t,10);this.update(e,n+1)})}else this.update(e,1)}),this.bruteforceUpdate(e);let a=this.unwind(r),o=a.length,s=this.getGuesses(e,o);return{password:e,guesses:s,guessesLog10:w.log10(s),sequence:a}}getGuesses(e,t){let n=e.length;return e.length===0?1:this.optimal.totalGuesses[n-1][t]}},Ce=class extends v{constructor(e){super(e),this.scoring=new L(e)}match({password:e,omniMatch:t}){let n=[],r=0;for(;r<e.length;){let i=this.getGreedyMatch(e,r),a=this.getLazyMatch(e,r);if(i==null)break;let{match:o,baseToken:s}=this.setMatchToken(i,a);if(o){let e=o.index+o[0].length-1,i=this.getBaseGuesses(s,t);n.push(this.normalizeMatch(s,e,o,i)),r=e+1}}return n.some(e=>e instanceof Promise)?Promise.all(n):n}normalizeMatch(e,t,n,r){let i={pattern:`repeat`,i:n.index,j:t,token:n[0],baseToken:e,baseGuesses:0,repeatCount:n[0].length/e.length};return r instanceof Promise?r.then(e=>({...i,baseGuesses:e})):{...i,baseGuesses:r}}getGreedyMatch(e,t){let n=/(.+)\1+/g;return n.lastIndex=t,n.exec(e)}getLazyMatch(e,t){let n=/(.+?)\1+/g;return n.lastIndex=t,n.exec(e)}setMatchToken(e,t){let n=/^(.+?)\1+$/,r,i=``;if(t&&e[0].length>t[0].length){r=e;let t=n.exec(r[0]);t&&(i=t[1])}else r=t,r&&(i=r[1]);return{match:r,baseToken:i}}getBaseGuesses(e,t){let n=t.match(e);return n instanceof Promise?n.then(t=>this.scoring.mostGuessableMatchSequence(e,t).guesses):this.scoring.mostGuessableMatchSequence(e,n).guesses}},we=class extends v{constructor(){super(...arguments),this.MAX_DELTA=5}match({password:e}){let t=[];if(e.length===1)return[];let n=0,r=null,i=e.length;for(let a=1;a<i;a+=1){let i=e.charCodeAt(a)-e.charCodeAt(a-1);if(r===null&&(r=i),i!==r){let o=a-1;this.update({i:n,j:o,delta:r,password:e,result:t}),n=o,r=i}}return this.update({i:n,j:i-1,delta:r,password:e,result:t}),t}update({i:e,j:t,delta:n,password:r,result:i}){if(t-e>1||Math.abs(n)===1){let a=Math.abs(n);if(a>0&&a<=this.MAX_DELTA){let a=r.slice(e,t+1||9e9),{sequenceName:o,sequenceSpace:s}=this.getSequence(a);return i.push({pattern:`sequence`,i:e,j:t,token:r.slice(e,t+1||9e9),sequenceName:o,sequenceSpace:s,ascending:n>0})}}return null}getSequence(e){let t=`unicode`,n=26;return l.test(e)?(t=`lower`,n=26):s.test(e)?(t=`upper`,n=26):m.test(e)&&(t=`digits`,n=10),{sequenceName:t,sequenceSpace:n}}},Te=class extends v{constructor(){super(...arguments),this.SHIFTED_RX=/[~!@#$%^&*()_+QWERTYUIOP{}|ASDFGHJKL:"ZXCVBNM<>?]/}match({password:n}){let r=[];return Object.keys(this.options.graphs).forEach(t=>{let i=this.options.graphs[t];e(r,this.helper(n,i,t))}),t(r)}checkIfShifted(e,t,n){return!e.includes(`keypad`)&&this.SHIFTED_RX.test(t.charAt(n))?1:0}helper(e,t,n){let r,i=[],a=0,o=e.length;for(;a<o-1;){let s=a+1,c=null,l=0;for(r=this.checkIfShifted(n,e,a);;){let u=t[e.charAt(s-1)]||[],d=!1,f=-1;if(s<o){let t=e.charAt(s),n=u.length;for(let e=0;e<n;e+=1){let n=u[e];if(f+=1,n){let e=n.indexOf(t);if(e!==-1){d=!0,e===1&&(r+=1);let t=f;c!==t&&(l+=1,c=t);break}}}}if(d)s+=1;else{s-a>2&&i.push({pattern:`spatial`,i:a,j:s-1,token:e.slice(a,s),graph:n,turns:l,shiftedCount:r}),a=s;break}}}return i}},Ee=RegExp(`[${_.join(``)}]`),De=class e extends v{static getMostUsedSeparatorChar(e){let t=[...e.split(``).filter(e=>Ee.test(e)).reduce((e,t)=>{let n=e.get(t);return n?e.set(t,parseInt(n,10)+1):e.set(t,1),e},new Map).entries()].sort(([e,t],[n,r])=>r-t);if(!t.length)return;let n=t[0];if(!(n[1]<2))return n[0]}static getSeparatorRegex(e){let t=e.replace(te,`\\$&`);return RegExp(`([^${t}\n])(${t})(?!${t})`,`g`)}match({password:t}){let n=[];if(t.length===0)return n;let r=e.getMostUsedSeparatorChar(t);if(r===void 0)return n;let i=e.getSeparatorRegex(r);for(let e of t.matchAll(i)){if(e.index===void 0)continue;let t=e.index+1;n.push({pattern:`separator`,token:r,i:t,j:t})}return n}},Oe=class extends v{constructor(e){super(e),this.dictionary=new x(this.options,!0),this.dictionaryL33t=new S(this.options,!0),this.dictionaryReverse=new C(this.options,!0)}match(e){let{password:t}=e,n=this.dictionary.match(e),r=this.dictionaryL33t.match(e),i=this.dictionaryReverse.match(e),a=this.filterDictionaryMatches([...n,...r,...i]),o=this.convertToWordMatches(a);return this.findWordSequences(o,t)}filterDictionaryMatches(e){return[...e].sort((e,t)=>e.i===t.i?e.j===t.j?e.reversed===t.reversed?e.l33t===t.l33t?e.rank-t.rank:e.l33t?1:-1:e.reversed?1:-1:e.j-t.j:e.i-t.i).reduce((e,t)=>{let n=e[e.length-1];return(!n||t.i>n.j)&&e.push(t),e},[])}convertToWordMatches(e){return e.map(e=>({word:e.matchedWord,i:e.i,j:e.j,rank:e.rank,dictionaryName:e.dictionaryName}))}findWordSequences(e,t){let n=[];if(e.length===0)return n;let r=[...e].sort((e,t)=>e.i-t.i);for(let e=0;e<r.length;e+=1){let i=this.findSequencesFromStart(r,e,t);n.push(...i)}return n}findSequencesFromStart(e,t,n){let r=[],i=e[t],a=[i],o=i.j;for(let i=t+1;i<e.length;i+=1){let t=e[i];this.isValidWordSequence(a,t,n)?(a.push(t),o=t.j):t.i>o&&(a.length>1&&r.push(this.createWordSequenceMatch(a,n)),a=[t],o=t.j)}return a.length>1&&r.push(this.createWordSequenceMatch(a,n)),r}isValidWordSequence(e,t,n){let r=e[e.length-1],i=n.slice(r.j+1,t.i),a=[``,` `,`-`,`_`,`.`,``],o=i===``,s=a.some(e=>i===e),c=i.length===1&&i===i.toUpperCase()&&i!==i.toLowerCase();return s||o||c}createWordSequenceMatch(e,t){let n=e[0],r=e[e.length-1],i=e.map(e=>e.word),a=e.map(e=>e.rank),o=a.every((e,t)=>t===0||e>=a[t-1]),s=e.map(e=>e.dictionaryName),c=this.getMostCommon(s)||n.dictionaryName;return{pattern:`wordSequence`,i:n.i,j:r.j,token:t.slice(n.i,r.j+1),words:i,wordCount:i.length,dictionaryName:c,ascending:o}}getMostCommon(e){if(e.length===0)return null;let t=new Map,n=0,r=null;return e.forEach(e=>{let i=(t.get(e)||0)+1;t.set(e,i),i>n&&(n=i,r=e)}),r}},ke=class{constructor(e){this.options=e,this.matchers={},this.matchers={date:new ne(this.options),dictionary:new x(this.options),dictionaryL33t:new S(this.options),dictionaryReverse:new C(this.options),regex:new de(this.options),repeat:new Ce(this.options),sequence:new we(this.options),spatial:new Te(this.options),separator:new De(this.options),wordSequence:new Oe(this.options)},Object.entries(this.options.matchers).forEach(([e,t])=>{this.matchers[e]=new t.Matching(this.options)})}processResult(t,n,r){if(r instanceof Promise){let i=r.then(n=>(e(t,n),n));n.push(i)}else e(t,r)}handlePromises(e,n){return n.length>0?new Promise((r,i)=>{Promise.all(n).then(()=>{r(t(e))}).catch(e=>{i(e)})}):t(e)}match(e,t){let n=[],r=[];return Object.values(this.matchers).forEach(i=>{let a=i.match({password:e,omniMatch:this,userInputsOptions:t});this.processResult(n,r,a)}),this.handlePromises(n,r)}},R=1,z=R*60,B=z*60,V=B*24,H=V*31,U=H*12,W={second:R,minute:z,hour:B,day:V,month:H,year:U,century:U*100},G={scoring:{0:1e3,1:1e6,2:1e8,3:1e10},attackTime:{onlineThrottlingXPerHour:100,onlineNoThrottlingXPerSecond:10,offlineSlowHashingXPerSecond:1e4,offlineFastHashingXPerSecond:1e10}},Ae=class{constructor(e){this.options=e}estimateAttackTimes(e){let t=this.calculateCrackTimesSeconds(e),n={};return Object.keys(t).forEach(e=>{let r=e,i=t[r],{base:a,displayStr:o}=this.displayTime(i);n[r]={base:a,seconds:i,display:this.translate(o,a)}}),{crackTimes:n,score:this.guessesToScore(e)}}calculateCrackTimesSeconds(e){let t=this.options.timeEstimationValues.attackTime;return{onlineThrottlingXPerHour:e/(t.onlineThrottlingXPerHour/3600),onlineNoThrottlingXPerSecond:e/t.onlineNoThrottlingXPerSecond,offlineSlowHashingXPerSecond:e/t.offlineSlowHashingXPerSecond,offlineFastHashingXPerSecond:e/t.offlineFastHashingXPerSecond}}guessesToScore(e){let t=this.options.timeEstimationValues.scoring;return e<t[0]+5?0:e<t[1]+5?1:e<t[2]+5?2:e<t[3]+5?3:4}displayTime(e){let t=`centuries`,n=null,r=Object.keys(W),i=r.findIndex(t=>e<W[t]);return i>-1&&(t=r[i-1],i===0?t=`ltSecond`:n=Math.round(e/W[t])),{base:n,displayStr:t}}translate(e,t){let n=e;t!==null&&t!==1&&(n+=`s`);let{timeEstimation:r}=this.options.translations,i=r[n];return typeof i==`function`?i(t):i.replace(`{base}`,`${t}`)}},je=()=>null,Me=e=>({warning:e.translations.warnings.dates,suggestions:[e.translations.suggestions.dates]}),Ne=(e,t,n)=>{let r=null;return n&&!t.l33t&&!t.reversed?r=t.rank<=10?e.translations.warnings.topTen:t.rank<=100?e.translations.warnings.topHundred:e.translations.warnings.common:t.guessesLog10<=4&&(r=e.translations.warnings.similarToCommon),r},Pe=(e,t,n)=>{let r=null;return n&&(r=e.translations.warnings.wordByItself),r},Fe=(e,t,n)=>n?e.translations.warnings.namesByThemselves:e.translations.warnings.commonNames,Ie=(e,t,n)=>{let r=t.dictionaryName,i=r.toLowerCase().includes(`lastnames`)||r.toLowerCase().includes(`firstnames`)||r.toLowerCase().includes(`names`);return r.includes(`passwords`)?Ne(e,t,n):r.includes(`wikipedia`)?Pe(e,t,n):i?Fe(e,t,n):r.includes(`userInputs`)?e.translations.warnings.userInputs:null},Le=(e,t,n)=>{let r=Ie(e,t,n),i=[],o=t.token;return o.match(a)?i.push(e.translations.suggestions.capitalization):o.match(c)&&o.toLowerCase()!==o&&i.push(e.translations.suggestions.allUppercase),t.reversed&&t.token.length>=4&&i.push(e.translations.suggestions.reverseWords),t.l33t&&i.push(e.translations.suggestions.l33t),{warning:r,suggestions:i}},Re=(e,t)=>t.regexName===`recentYear`?{warning:e.translations.warnings.recentYears,suggestions:[e.translations.suggestions.recentYears,e.translations.suggestions.associatedYears]}:{warning:null,suggestions:[]},ze=(e,t)=>{let n=e.translations.warnings.extendedRepeat;return t.baseToken.length===1&&(n=e.translations.warnings.simpleRepeat),{warning:n,suggestions:[e.translations.suggestions.repeated]}},Be=e=>({warning:e.translations.warnings.sequences,suggestions:[e.translations.suggestions.sequences]}),Ve=(e,t)=>{let n=e.translations.warnings.keyPattern;return t.turns===1&&(n=e.translations.warnings.straightRow),{warning:n,suggestions:[e.translations.suggestions.longerKeyboardPattern]}},He=()=>null,Ue=(e,t)=>{if(t.pattern!==`wordSequence`)return null;let n=null,r=[];return t.wordCount>=3&&(n=e.translations.warnings.sequences),t.ascending?r.push(e.translations.suggestions.sequences):r.push(e.translations.suggestions.anotherWord),t.wordCount>2&&r.push(e.translations.suggestions.useWords),{warning:n,suggestions:r}},K=e=>({warning:null,suggestions:e??[]}),We=class{constructor(e){this.options=e,this.matchers={},this.matchers={bruteforce:je,date:Me,dictionary:Le,regex:Re,repeat:ze,sequence:Be,spatial:Ve,separator:He,wordSequence:Ue},Object.entries(this.options.matchers).forEach(([e,t])=>{t.feedback&&(this.matchers[e]=t.feedback)})}getFeedback(e,t){if(t.length===0)return K([this.options.translations.suggestions.useWords,this.options.translations.suggestions.noNeed]);if(e>2)return K();let n=this.options.translations.suggestions.anotherWord,r=this.getLongestMatch(t),i=this.getMatchFeedback(r,t.length===1);return i==null?i=K([n]):i.suggestions.unshift(n),i}getLongestMatch(e){let t=e[0];for(let n=1;n<e.length;n+=1){let r=e[n];r.token.length>t.token.length&&(t=r)}return t}getMatchFeedback(e,t){return this.matchers[e.pattern]?this.matchers[e.pattern](this.options,e,t):K()}},q={a:[`4`,`@`],b:[`8`],c:[`(`,`{`,`[`,`<`],d:[`6`,`|)`],e:[`3`],f:[`#`],g:[`6`,`9`,`&`],h:[`#`,`|-|`],i:[`1`,`!`,`|`],k:[`<`,`|<`],l:[`!`,`1`,`|`,`7`],m:[`^^`,`nn`,`2n`,`/\\\\/\\\\`],n:[`//`],o:[`0`,`()`],q:[`9`],u:[`|_|`],s:[`$`,`5`],t:[`+`,`7`],v:[`<`,`>`,`/`],w:[`^/`,`uu`,`vv`,`2u`,`2v`,`\\\\/\\\\/`],x:[`%`,`><`],z:[`2`]},J={warnings:{straightRow:`straightRow`,keyPattern:`keyPattern`,simpleRepeat:`simpleRepeat`,extendedRepeat:`extendedRepeat`,sequences:`sequences`,recentYears:`recentYears`,dates:`dates`,topTen:`topTen`,topHundred:`topHundred`,common:`common`,similarToCommon:`similarToCommon`,wordByItself:`wordByItself`,namesByThemselves:`namesByThemselves`,commonNames:`commonNames`,userInputs:`userInputs`,pwned:`pwned`},suggestions:{l33t:`l33t`,reverseWords:`reverseWords`,allUppercase:`allUppercase`,capitalization:`capitalization`,dates:`dates`,recentYears:`recentYears`,associatedYears:`associatedYears`,sequences:`sequences`,repeated:`repeated`,longerKeyboardPattern:`longerKeyboardPattern`,anotherWord:`anotherWord`,useWords:`useWords`,noNeed:`noNeed`,pwned:`pwned`},timeEstimation:{ltSecond:`ltSecond`,second:`second`,seconds:`seconds`,minute:`minute`,minutes:`minutes`,hour:`hour`,hours:`hours`,day:`day`,days:`days`,month:`month`,months:`months`,year:`year`,years:`years`,centuries:`centuries`}},Y=class e{constructor(e=[]){this.parents=e,this.children=new Map}addSub(t,...n){let r=t.charAt(0);this.children.has(r)||this.children.set(r,new e([...this.parents,r]));let i=this.children.get(r);for(let e=1;e<t.length;e+=1){let n=t.charAt(e);i.hasChild(n)||i.addChild(n),i=i.getChild(n)}return i.subs=(i.subs||[]).concat(n),this}getChild(e){return this.children.get(e)}isTerminal(){return!!this.subs}addChild(t){this.hasChild(t)||this.children.set(t,new e([...this.parents,t]))}hasChild(e){return this.children.has(e)}},X=(e,t)=>(Object.entries(e).forEach(([e,n])=>{n.forEach(n=>{t.addSub(n,e)})}),t),Ge=e=>{if(typeof e!=`object`||!e)throw Error(`l33tTable must be an object`);Object.values(e).forEach(e=>{if(!Array.isArray(e))throw Error(`l33tTable substitutions must be an array`);e.forEach(e=>{if(typeof e!=`string`)throw Error(`l33tTable substitutions must be strings`)})})},Ke=e=>{if(typeof e!=`object`||!e)throw Error(`dictionary must be an object`);Object.values(e).forEach(e=>{if(!Array.isArray(e))throw Error(`dictionary list must be an array`);e.forEach(e=>{if(typeof e!=`string`&&typeof e!=`number`)throw Error(`dictionary entries must be strings or numbers`)})})},Z=e=>{if(typeof e!=`object`||!e)throw Error(`graphs must be an object`);Object.values(e).forEach(e=>{if(typeof e!=`object`||!e)throw Error(`graph must be an object`);Object.values(e).forEach(e=>{if(!Array.isArray(e))throw Error(`graph adjacencies must be an array`);e.forEach(e=>{if(typeof e!=`string`&&e!==null)throw Error(`graph adjacency must be a string or null`)})})})},qe=e=>{if(typeof e!=`boolean`)throw Error(`useLevenshteinDistance must be a boolean`)},Je=e=>{if(typeof e!=`number`||e<0)throw Error(`levenshteinThreshold must be a non-negative number`)},Ye=e=>{if(typeof e!=`number`||e<0)throw Error(`l33tMaxSubstitutions must be a non-negative number`)},Xe=e=>{if(typeof e!=`number`||e<0)throw Error(`maxLength must be a non-negative number`)},Ze=(e,t)=>{if(typeof e!=`string`)throw Error(`matcher name must be a string`);if(typeof t!=`object`||!t)throw Error(`matcher ${e} must be an object`);if(typeof t.feedback!=`function`)throw Error(`matcher ${e}.feedback must be a function`);if(typeof t.scoring!=`function`)throw Error(`matcher ${e}.scoring must be a function`);if(typeof t.Matching!=`function`)throw Error(`matcher ${e}.Matching must be a constructor`)},Qe=e=>{if(typeof e!=`object`||!e)throw Error(`customMatchers must be an object`)},$e=e=>{let t=!0;return Object.keys(J).forEach(n=>{if(n in e){let r=n;Object.keys(J[r]).forEach(n=>{n in e[r]||(t=!1);let i=e[r][n];typeof i!=`string`&&typeof i!=`function`&&(t=!1)})}else t=!1}),t},et=e=>{if(typeof e!=`object`||!e)throw Error(`timeEstimationValues must be an object`);Object.keys(G).forEach(t=>{if(!(t in e))throw Error(`timeEstimationValues.${t} is required`);let n=e[t];if(typeof n!=`object`||!n)throw Error(`timeEstimationValues.${t} must be an object`);Object.keys(G[t]).forEach(e=>{if(!(e in n))throw Error(`timeEstimationValues.${t}.${e} is required`);let r=n[e];if(typeof r!=`number`)throw Error(`timeEstimationValues.${t}.${e} must be a number`);if(r<G[t][e])throw Error(`Time estimation values are not to be allowed to be less than default`)})})},Q=class{constructor(e={},t={}){this.matchers={},this.l33tTable=q,this.trieNodeRoot=X(q,new Y),this.dictionary={userInputs:[]},this.rankedDictionaries={},this.rankedDictionariesMaxWordSize={},this.translations=J,this.graphs={},this.useLevenshteinDistance=!1,this.levenshteinThreshold=2,this.l33tMaxSubstitutions=100,this.maxLength=256,this.wordSequenceNames=[`cardinalNumbers`,`ordinalNumbers`,`daysOfWeek`,`months`,`seasons`,`timePeriods`,`rainbowColors`,`directions`,`intermediateDirections`,`sizeProgression`,`militaryAlphabet`,`planets`,`zodiacSigns`,`chineseZodiac`],this.timeEstimationValues={scoring:{...G.scoring},attackTime:{...G.attackTime}},Qe(t),this.setOptions(e),Object.entries(t).forEach(([e,t])=>{Ze(e,t),this.addMatcher(e,t)})}isWordSequence(e){return this.wordSequenceNames.some(t=>e===t||e.startsWith(`${t}-`))}setOptions(e={}){e.l33tTable&&(Ge(e.l33tTable),this.l33tTable=e.l33tTable,this.trieNodeRoot=X(e.l33tTable,new Y)),e.dictionary&&(Ke(e.dictionary),this.dictionary=e.dictionary,this.setRankedDictionaries()),e.translations&&this.setTranslations(e.translations),e.graphs&&(Z(e.graphs),this.graphs=e.graphs),e.useLevenshteinDistance!==void 0&&(qe(e.useLevenshteinDistance),this.useLevenshteinDistance=e.useLevenshteinDistance),e.levenshteinThreshold!==void 0&&(Je(e.levenshteinThreshold),this.levenshteinThreshold=e.levenshteinThreshold),e.l33tMaxSubstitutions!==void 0&&(Ye(e.l33tMaxSubstitutions),this.l33tMaxSubstitutions=e.l33tMaxSubstitutions),e.maxLength!==void 0&&(Xe(e.maxLength),this.maxLength=e.maxLength),e.timeEstimationValues!==void 0&&(et(e.timeEstimationValues),this.timeEstimationValues={scoring:{...e.timeEstimationValues.scoring},attackTime:{...e.timeEstimationValues.attackTime}})}setTranslations(e){if($e(e))this.translations=e;else throw Error(`Invalid translations object fallback to keys`)}setRankedDictionaries(){let e={},t={};Object.keys(this.dictionary).forEach(r=>{e[r]=n(this.dictionary[r]),t[r]=this.getRankedDictionariesMaxWordSize(this.dictionary[r])}),this.rankedDictionaries=e,this.rankedDictionariesMaxWordSize=t}getRankedDictionariesMaxWordSize(e){let t=e.map(e=>typeof e==`string`?e.length:e.toString().length);return t.length===0?0:t.reduce((e,t)=>Math.max(e,t),-1/0)}buildSanitizedRankedDictionary(e){let t=[];return e.forEach(e=>{let n=typeof e;(n===`string`||n===`number`||n===`boolean`)&&t.push(e.toString().toLowerCase())}),n(t)}getUserInputsOptions(e){let t={},n=0;return e&&(t=this.buildSanitizedRankedDictionary(e),n=this.getRankedDictionariesMaxWordSize(e)),{rankedDictionary:t,rankedDictionaryMaxWordSize:n}}addMatcher(e,t){this.matchers[e]?console.info(`Matcher ${e} already exists`):this.matchers[e]=t}},tt=(e,t,n)=>{let r;return function(...i){let a=this,o=()=>{r=void 0,n||e.apply(a,i)},s=n&&!r;if(r!==void 0&&clearTimeout(r),r=setTimeout(o,t),s){e.apply(a,i);return}}},$=()=>new Date().getTime(),nt=class{constructor(e={},t={}){this.options=new Q(e,t),this.scoring=new L(this.options),this.matching=new ke(this.options),this.feedback=new We(this.options),this.timeEstimates=new Ae(this.options)}estimateAttackTimes(e){return this.timeEstimates.estimateAttackTimes(e)}getFeedback(e,t){return this.feedback.getFeedback(e,t)}createReturnValue(e,t,n){let r=this.scoring.mostGuessableMatchSequence(t,e),i=$()-n,a=this.estimateAttackTimes(r.guesses);return{calcTime:i,...r,...a,feedback:this.getFeedback(a.score,r.sequence)}}main(e,t){let n=this.options.getUserInputsOptions(t);return this.matching.match(e,n)}check(e,t){let n=e.substring(0,this.options.maxLength),r=$(),i=this.main(n,t);if(i instanceof Promise)throw Error("You are using a Promised matcher, please use `zxcvbnAsync` for it.");return this.createReturnValue(i,n,r)}async checkAsync(e,t){let n=e.substring(0,this.options.maxLength),r=$(),i=await this.main(n,t);return this.createReturnValue(i,n,r)}};export{v as MatcherBaseClass,Q as Options,nt as ZxcvbnFactory,tt as debounce};
|
|
2
|
+
//# sourceMappingURL=DZiTrzZf.chunk.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DZiTrzZf.chunk.js","names":["bruteforceMatcher","dateMatcher","dictionaryMatcher","regexMatcher","repeatMatcher","sequenceMatcher","spatialMatcher","separatorMatcher","wordSequenceMatcher","bruteforceMatcher","dateMatcher","dictionaryMatcher","regexMatcher","repeatMatcher","sequenceMatcher","spatialMatcher","separatorMatcher","wordSequenceMatcher"],"sources":["../../../../../node_modules/@zxcvbn-ts/core/dist/utils/helper.mjs","../../../../../node_modules/@zxcvbn-ts/core/dist/data/dateSplits.mjs","../../../../../node_modules/@zxcvbn-ts/core/dist/data/const.mjs","../../../../../node_modules/@zxcvbn-ts/core/dist/types.mjs","../../../../../node_modules/@zxcvbn-ts/core/dist/matcher/date/matching.mjs","../../../../../node_modules/fastest-levenshtein/esm/mod.js","../../../../../node_modules/@zxcvbn-ts/core/dist/utils/levenshtein.mjs","../../../../../node_modules/@zxcvbn-ts/core/dist/utils/mergeUserInputDictionary.mjs","../../../../../node_modules/@zxcvbn-ts/core/dist/matcher/dictionary/matching.mjs","../../../../../node_modules/@zxcvbn-ts/core/dist/matcher/dictionary/variants/matching/unmunger/getCleanPasswords.mjs","../../../../../node_modules/@zxcvbn-ts/core/dist/matcher/dictionary/variants/matching/l33t.mjs","../../../../../node_modules/@zxcvbn-ts/core/dist/matcher/dictionary/variants/matching/reverse.mjs","../../../../../node_modules/@zxcvbn-ts/core/dist/matcher/regex/matching.mjs","../../../../../node_modules/@zxcvbn-ts/core/dist/scoring/utils.mjs","../../../../../node_modules/@zxcvbn-ts/core/dist/matcher/bruteforce/scoring.mjs","../../../../../node_modules/@zxcvbn-ts/core/dist/matcher/date/scoring.mjs","../../../../../node_modules/@zxcvbn-ts/core/dist/matcher/dictionary/variants/scoring/uppercase.mjs","../../../../../node_modules/@zxcvbn-ts/core/dist/matcher/dictionary/variants/scoring/l33t.mjs","../../../../../node_modules/@zxcvbn-ts/core/dist/matcher/dictionary/scoring.mjs","../../../../../node_modules/@zxcvbn-ts/core/dist/matcher/regex/scoring.mjs","../../../../../node_modules/@zxcvbn-ts/core/dist/matcher/repeat/scoring.mjs","../../../../../node_modules/@zxcvbn-ts/core/dist/matcher/sequence/scoring.mjs","../../../../../node_modules/@zxcvbn-ts/core/dist/matcher/spatial/scoring.mjs","../../../../../node_modules/@zxcvbn-ts/core/dist/matcher/separator/scoring.mjs","../../../../../node_modules/@zxcvbn-ts/core/dist/matcher/wordSequence/scoring.mjs","../../../../../node_modules/@zxcvbn-ts/core/dist/scoring/estimate.mjs","../../../../../node_modules/@zxcvbn-ts/core/dist/scoring/index.mjs","../../../../../node_modules/@zxcvbn-ts/core/dist/matcher/repeat/matching.mjs","../../../../../node_modules/@zxcvbn-ts/core/dist/matcher/sequence/matching.mjs","../../../../../node_modules/@zxcvbn-ts/core/dist/matcher/spatial/matching.mjs","../../../../../node_modules/@zxcvbn-ts/core/dist/matcher/separator/matching.mjs","../../../../../node_modules/@zxcvbn-ts/core/dist/matcher/wordSequence/matching.mjs","../../../../../node_modules/@zxcvbn-ts/core/dist/Matching.mjs","../../../../../node_modules/@zxcvbn-ts/core/dist/TimeEstimates.mjs","../../../../../node_modules/@zxcvbn-ts/core/dist/matcher/bruteforce/feedback.mjs","../../../../../node_modules/@zxcvbn-ts/core/dist/matcher/date/feedback.mjs","../../../../../node_modules/@zxcvbn-ts/core/dist/matcher/dictionary/feedback.mjs","../../../../../node_modules/@zxcvbn-ts/core/dist/matcher/regex/feedback.mjs","../../../../../node_modules/@zxcvbn-ts/core/dist/matcher/repeat/feedback.mjs","../../../../../node_modules/@zxcvbn-ts/core/dist/matcher/sequence/feedback.mjs","../../../../../node_modules/@zxcvbn-ts/core/dist/matcher/spatial/feedback.mjs","../../../../../node_modules/@zxcvbn-ts/core/dist/matcher/separator/feedback.mjs","../../../../../node_modules/@zxcvbn-ts/core/dist/matcher/wordSequence/feedback.mjs","../../../../../node_modules/@zxcvbn-ts/core/dist/Feedback.mjs","../../../../../node_modules/@zxcvbn-ts/core/dist/data/l33tTable.mjs","../../../../../node_modules/@zxcvbn-ts/core/dist/data/translationKeys.mjs","../../../../../node_modules/@zxcvbn-ts/core/dist/matcher/dictionary/variants/matching/unmunger/TrieNode.mjs","../../../../../node_modules/@zxcvbn-ts/core/dist/matcher/dictionary/variants/matching/unmunger/l33tTableToTrieNode.mjs","../../../../../node_modules/@zxcvbn-ts/core/dist/runtimeChecks.mjs","../../../../../node_modules/@zxcvbn-ts/core/dist/Options.mjs","../../../../../node_modules/@zxcvbn-ts/core/dist/utils/debounce.mjs","../../../../../node_modules/@zxcvbn-ts/core/dist/index.mjs"],"sourcesContent":["const extend = (listToExtend, list) =>\n// eslint-disable-next-line prefer-spread\nlistToExtend.push.apply(listToExtend, list);\n// sort on i primary, j secondary\nconst sorted = matches => matches.sort((m1, m2) => m1.i - m2.i || m1.j - m2.j);\nconst buildRankedDictionary = orderedList => {\n const result = {};\n let counter = 1; // rank starts at 1, not 0\n orderedList.forEach(word => {\n result[word] = counter;\n counter += 1;\n });\n return result;\n};\n\nexport { buildRankedDictionary, extend, sorted };\n//# sourceMappingURL=helper.mjs.map\n","var dateSplits = {\n 4: [\n // for length-4 strings, eg 1191 or 9111, two ways to split:\n [1, 2],\n // 1 1 91 (2nd split starts at index 1, 3rd at index 2)\n [2, 3] // 91 1 1\n ],\n 5: [[1, 3],\n // 1 11 91\n [2, 3],\n // 11 1 91\n // [2, 3], // 91 1 11 <- duplicate previous one\n [2, 4] // 91 11 1 <- New and must be added as bug fix\n ],\n 6: [[1, 2],\n // 1 1 1991\n [2, 4],\n // 11 11 91\n [4, 5] // 1991 1 1\n ],\n // 1111991\n 7: [[1, 3],\n // 1 11 1991\n [2, 3],\n // 11 1 1991\n [4, 5],\n // 1991 1 11\n [4, 6] // 1991 11 1\n ],\n 8: [[2, 4],\n // 11 11 1991\n [4, 6] // 1991 11 11\n ]\n};\n\nexport { dateSplits as default };\n//# sourceMappingURL=dateSplits.mjs.map\n","import dateSplits from './dateSplits.mjs';\n\nconst DATE_MAX_YEAR = 2050;\nconst DATE_MIN_YEAR = 1000;\nconst DATE_SPLITS = dateSplits;\nconst BRUTEFORCE_CARDINALITY = 10;\nconst MIN_GUESSES_BEFORE_GROWING_SEQUENCE = 10000;\nconst MIN_SUBMATCH_GUESSES_SINGLE_CHAR = 10;\nconst MIN_SUBMATCH_GUESSES_MULTI_CHAR = 50;\nconst MIN_YEAR_SPACE = 21;\n// \\xbf-\\xdf is a range for almost all special uppercase letter like Ä and so on\nconst START_UPPER = /^[A-Z\\xbf-\\xdf][^A-Z\\xbf-\\xdf]+$/;\nconst END_UPPER = /^[^A-Z\\xbf-\\xdf]+[A-Z\\xbf-\\xdf]$/;\n// \\xdf-\\xff is a range for almost all special lowercase letter like ä and so on\nconst ALL_UPPER = /^[A-Z\\xbf-\\xdf]+$/;\nconst ALL_UPPER_INVERTED = /^[^a-z\\xdf-\\xff]+$/;\nconst ALL_LOWER = /^[a-z\\xdf-\\xff]+$/;\nconst ALL_LOWER_INVERTED = /^[^A-Z\\xbf-\\xdf]+$/;\nconst ONE_LOWER = /[a-z\\xdf-\\xff]/;\nconst ONE_UPPER = /[A-Z\\xbf-\\xdf]/;\nconst ALPHA_INVERTED = /[^A-Za-z\\xbf-\\xdf]/gi;\nconst ALL_DIGIT = /^\\d+$/;\nconst REFERENCE_YEAR = new Date().getFullYear();\nconst REGEXEN = {\n recentYear: /19\\d\\d|200\\d|201\\d|202\\d/g\n};\n/* Separators */\nconst SEPERATOR_CHARS = [' ', ',', ';', ':', '|', '/', '\\\\', '_', '.', '-'];\nconst SEPERATOR_CHAR_COUNT = SEPERATOR_CHARS.length;\nconst ESCAPE_REGEX = /[.*+?^${}()|[\\]\\\\]/g;\n\nexport { ALL_DIGIT, ALL_LOWER, ALL_LOWER_INVERTED, ALL_UPPER, ALL_UPPER_INVERTED, ALPHA_INVERTED, BRUTEFORCE_CARDINALITY, DATE_MAX_YEAR, DATE_MIN_YEAR, DATE_SPLITS, END_UPPER, ESCAPE_REGEX, MIN_GUESSES_BEFORE_GROWING_SEQUENCE, MIN_SUBMATCH_GUESSES_MULTI_CHAR, MIN_SUBMATCH_GUESSES_SINGLE_CHAR, MIN_YEAR_SPACE, ONE_LOWER, ONE_UPPER, REFERENCE_YEAR, REGEXEN, SEPERATOR_CHARS, SEPERATOR_CHAR_COUNT, START_UPPER };\n//# sourceMappingURL=const.mjs.map\n","class MatcherBaseClass {\n constructor(options) {\n this.options = options;\n }\n}\n\nexport { MatcherBaseClass };\n//# sourceMappingURL=types.mjs.map\n","import { DATE_SPLITS, DATE_MIN_YEAR, DATE_MAX_YEAR, REFERENCE_YEAR } from '../../data/const.mjs';\nimport { sorted } from '../../utils/helper.mjs';\nimport { MatcherBaseClass } from '../../types.mjs';\n\n/*\n * -------------------------------------------------------------------------------\n * date matching ----------------------------------------------------------------\n * -------------------------------------------------------------------------------\n */\nclass MatchDate extends MatcherBaseClass {\n /*\n * a \"date\" is recognized as:\n * any 3-tuple that starts or ends with a 2- or 4-digit year,\n * with 2 or 0 separator chars (1.1.91 or 1191),\n * maybe zero-padded (01-01-91 vs 1-1-91),\n * a month between 1 and 12,\n * a day between 1 and 31.\n *\n * note: this isn't true date parsing in that \"feb 31st\" is allowed,\n * this doesn't check for leap years, etc.\n *\n * recipe:\n * start with regex to find maybe-dates, then attempt to map the integers\n * onto month-day-year to filter the maybe-dates into dates.\n * finally, remove matches that are substrings of other matches to reduce noise.\n *\n * note: instead of using a lazy or greedy regex to find many dates over the full string,\n * this uses a ^...$ regex against every substring of the password -- less performant but leads\n * to every possible date match.\n */\n match({\n password\n }) {\n const matches = [...this.getMatchesWithoutSeparator(password), ...this.getMatchesWithSeparator(password)];\n const filteredMatches = this.filterNoise(matches);\n return sorted(filteredMatches);\n }\n getMatchesWithSeparator(password) {\n const matches = [];\n const maybeDateWithSeparator = /^(\\d{1,4})([\\s/\\\\_.-])(\\d{1,2})\\2(\\d{1,4})$/;\n // # dates with separators are between length 6 '1/1/91' and 10 '11/11/1991'\n for (let i = 0; i <= Math.abs(password.length - 6); i += 1) {\n for (let j = i + 5; j <= i + 9; j += 1) {\n if (j >= password.length) {\n break;\n }\n const token = password.slice(i, j + 1 || 9e9);\n const regexMatch = maybeDateWithSeparator.exec(token);\n if (regexMatch != null) {\n const dmy = this.mapIntegersToDayMonthYear([parseInt(regexMatch[1], 10), parseInt(regexMatch[3], 10), parseInt(regexMatch[4], 10)]);\n if (dmy != null) {\n matches.push({\n pattern: 'date',\n token,\n i,\n j,\n separator: regexMatch[2],\n year: dmy.year,\n month: dmy.month,\n day: dmy.day\n });\n }\n }\n }\n }\n return matches;\n }\n // eslint-disable-next-line max-statements\n getMatchesWithoutSeparator(password) {\n const matches = [];\n const maybeDateNoSeparator = /^\\d{4,8}$/;\n const metric = candidate => Math.abs(candidate.year - REFERENCE_YEAR);\n // # dates without separators are between length 4 '1191' and 8 '11111991'\n for (let i = 0; i <= Math.abs(password.length - 4); i += 1) {\n for (let j = i + 3; j <= i + 7; j += 1) {\n if (j >= password.length) {\n break;\n }\n const token = password.slice(i, j + 1 || 9e9);\n if (maybeDateNoSeparator.exec(token)) {\n const candidates = [];\n const index = token.length;\n const splittedDates = DATE_SPLITS[index];\n splittedDates.forEach(([k, l]) => {\n const dmy = this.mapIntegersToDayMonthYear([parseInt(token.slice(0, k), 10), parseInt(token.slice(k, l), 10), parseInt(token.slice(l), 10)]);\n if (dmy != null) {\n candidates.push(dmy);\n }\n });\n if (candidates.length > 0) {\n /*\n * at this point: different possible dmy mappings for the same i,j substring.\n * match the candidate date that likely takes the fewest guesses: a year closest\n * to 2000.\n * (scoring.REFERENCE_YEAR).\n *\n * ie, considering '111504', prefer 11-15-04 to 1-1-1504\n * (interpreting '04' as 2004)\n */\n let bestCandidate = candidates[0];\n let minDistance = metric(candidates[0]);\n candidates.slice(1).forEach(candidate => {\n const distance = metric(candidate);\n if (distance < minDistance) {\n bestCandidate = candidate;\n minDistance = distance;\n }\n });\n matches.push({\n pattern: 'date',\n token,\n i,\n j,\n separator: '',\n year: bestCandidate.year,\n month: bestCandidate.month,\n day: bestCandidate.day\n });\n }\n }\n }\n }\n return matches;\n }\n /*\n * matches now contains all valid date strings in a way that is tricky to capture\n * with regexes only. while thorough, it will contain some unintuitive noise:\n *\n * '2015_06_04', in addition to matching 2015_06_04, will also contain\n * 5(!) other date matches: 15_06_04, 5_06_04, ..., even 2015 (matched as 5/1/2020)\n *\n * to reduce noise, remove date matches that are strict substrings of others\n */\n filterNoise(matches) {\n return matches.filter(match => {\n let isSubmatch = false;\n const matchesLength = matches.length;\n for (let o = 0; o < matchesLength; o += 1) {\n const otherMatch = matches[o];\n if (match !== otherMatch) {\n if (otherMatch.i <= match.i && otherMatch.j >= match.j) {\n isSubmatch = true;\n break;\n }\n }\n }\n return !isSubmatch;\n });\n }\n /*\n * given a 3-tuple, discard if:\n * middle int is over 31 (for all dmy formats, years are never allowed in the middle)\n * middle int is zero\n * any int is over the max allowable year\n * any int is over two digits but under the min allowable year\n * 2 integers are over 31, the max allowable day\n * 2 integers are zero\n * all integers are over 12, the max allowable month\n */\n // eslint-disable-next-line complexity, max-statements\n mapIntegersToDayMonthYear(integers) {\n if (integers[1] > 31 || integers[1] <= 0) {\n return null;\n }\n let over12 = 0;\n let over31 = 0;\n let under1 = 0;\n for (let o = 0, len1 = integers.length; o < len1; o += 1) {\n const int = integers[o];\n if (int > 99 && int < DATE_MIN_YEAR || int > DATE_MAX_YEAR) {\n return null;\n }\n if (int > 31) {\n over31 += 1;\n }\n if (int > 12) {\n over12 += 1;\n }\n if (int <= 0) {\n under1 += 1;\n }\n }\n if (over31 >= 2 || over12 === 3 || under1 >= 2) {\n return null;\n }\n return this.getDayMonth(integers);\n }\n // eslint-disable-next-line max-statements\n getDayMonth(integers) {\n // first look for a four digit year: yyyy + daymonth or daymonth + yyyy\n const possibleYearSplits = [[integers[2], integers.slice(0, 2)],\n // year last\n [integers[0], integers.slice(1, 3)] // year first\n ];\n const possibleYearSplitsLength = possibleYearSplits.length;\n for (let j = 0; j < possibleYearSplitsLength; j += 1) {\n const [y, rest] = possibleYearSplits[j];\n if (DATE_MIN_YEAR <= y && y <= DATE_MAX_YEAR) {\n const dm = this.mapIntegersToDayMonth(rest);\n if (dm != null) {\n return {\n year: y,\n month: dm.month,\n day: dm.day\n };\n }\n /*\n * for a candidate that includes a four-digit year,\n * when the remaining integers don't match to a day and month,\n * it is not a date.\n */\n return null;\n }\n }\n // given no four-digit year, two digit years are the most flexible int to match, so\n // try to parse a day-month out of integers[0..1] or integers[1..0]\n for (let k = 0; k < possibleYearSplitsLength; k += 1) {\n const [y, rest] = possibleYearSplits[k];\n const dm = this.mapIntegersToDayMonth(rest);\n if (dm != null) {\n return {\n year: this.twoToFourDigitYear(y),\n month: dm.month,\n day: dm.day\n };\n }\n }\n return null;\n }\n mapIntegersToDayMonth(integers) {\n const temp = [integers, integers.slice().reverse()];\n // eslint-disable-next-line @typescript-eslint/prefer-for-of\n for (let i = 0; i < temp.length; i += 1) {\n const data = temp[i];\n const day = data[0];\n const month = data[1];\n if (day >= 1 && day <= 31 && month >= 1 && month <= 12) {\n return {\n day,\n month\n };\n }\n }\n return null;\n }\n twoToFourDigitYear(year) {\n if (year > 99) {\n return year;\n }\n if (year > 50) {\n // 87 -> 1987\n return year + 1900;\n }\n // 15 -> 2015\n return year + 2000;\n }\n}\n\nexport { MatchDate as default };\n//# sourceMappingURL=matching.mjs.map\n","const peq = new Uint32Array(0x10000);\nconst myers_32 = (a, b) => {\n const n = a.length;\n const m = b.length;\n const lst = 1 << (n - 1);\n let pv = -1;\n let mv = 0;\n let sc = n;\n let i = n;\n while (i--) {\n peq[a.charCodeAt(i)] |= 1 << i;\n }\n for (i = 0; i < m; i++) {\n let eq = peq[b.charCodeAt(i)];\n const xv = eq | mv;\n eq |= ((eq & pv) + pv) ^ pv;\n mv |= ~(eq | pv);\n pv &= eq;\n if (mv & lst) {\n sc++;\n }\n if (pv & lst) {\n sc--;\n }\n mv = (mv << 1) | 1;\n pv = (pv << 1) | ~(xv | mv);\n mv &= xv;\n }\n i = n;\n while (i--) {\n peq[a.charCodeAt(i)] = 0;\n }\n return sc;\n};\nconst myers_x = (b, a) => {\n const n = a.length;\n const m = b.length;\n const mhc = [];\n const phc = [];\n const hsize = Math.ceil(n / 32);\n const vsize = Math.ceil(m / 32);\n for (let i = 0; i < hsize; i++) {\n phc[i] = -1;\n mhc[i] = 0;\n }\n let j = 0;\n for (; j < vsize - 1; j++) {\n let mv = 0;\n let pv = -1;\n const start = j * 32;\n const vlen = Math.min(32, m) + start;\n for (let k = start; k < vlen; k++) {\n peq[b.charCodeAt(k)] |= 1 << k;\n }\n for (let i = 0; i < n; i++) {\n const eq = peq[a.charCodeAt(i)];\n const pb = (phc[(i / 32) | 0] >>> i) & 1;\n const mb = (mhc[(i / 32) | 0] >>> i) & 1;\n const xv = eq | mv;\n const xh = ((((eq | mb) & pv) + pv) ^ pv) | eq | mb;\n let ph = mv | ~(xh | pv);\n let mh = pv & xh;\n if ((ph >>> 31) ^ pb) {\n phc[(i / 32) | 0] ^= 1 << i;\n }\n if ((mh >>> 31) ^ mb) {\n mhc[(i / 32) | 0] ^= 1 << i;\n }\n ph = (ph << 1) | pb;\n mh = (mh << 1) | mb;\n pv = mh | ~(xv | ph);\n mv = ph & xv;\n }\n for (let k = start; k < vlen; k++) {\n peq[b.charCodeAt(k)] = 0;\n }\n }\n let mv = 0;\n let pv = -1;\n const start = j * 32;\n const vlen = Math.min(32, m - start) + start;\n for (let k = start; k < vlen; k++) {\n peq[b.charCodeAt(k)] |= 1 << k;\n }\n let score = m;\n for (let i = 0; i < n; i++) {\n const eq = peq[a.charCodeAt(i)];\n const pb = (phc[(i / 32) | 0] >>> i) & 1;\n const mb = (mhc[(i / 32) | 0] >>> i) & 1;\n const xv = eq | mv;\n const xh = ((((eq | mb) & pv) + pv) ^ pv) | eq | mb;\n let ph = mv | ~(xh | pv);\n let mh = pv & xh;\n score += (ph >>> (m - 1)) & 1;\n score -= (mh >>> (m - 1)) & 1;\n if ((ph >>> 31) ^ pb) {\n phc[(i / 32) | 0] ^= 1 << i;\n }\n if ((mh >>> 31) ^ mb) {\n mhc[(i / 32) | 0] ^= 1 << i;\n }\n ph = (ph << 1) | pb;\n mh = (mh << 1) | mb;\n pv = mh | ~(xv | ph);\n mv = ph & xv;\n }\n for (let k = start; k < vlen; k++) {\n peq[b.charCodeAt(k)] = 0;\n }\n return score;\n};\nconst distance = (a, b) => {\n if (a.length < b.length) {\n const tmp = b;\n b = a;\n a = tmp;\n }\n if (b.length === 0) {\n return a.length;\n }\n if (a.length <= 32) {\n return myers_32(a, b);\n }\n return myers_x(a, b);\n};\nconst closest = (str, arr) => {\n let min_distance = Infinity;\n let min_index = 0;\n for (let i = 0; i < arr.length; i++) {\n const dist = distance(str, arr[i]);\n if (dist < min_distance) {\n min_distance = dist;\n min_index = i;\n }\n }\n return arr[min_index];\n};\nexport { closest, distance };\n","import { distance } from 'fastest-levenshtein';\n\nconst getUsedThreshold = (password, entry, threshold) => {\n const isPasswordToShort = password.length <= entry.length;\n const isThresholdLongerThanPassword = password.length <= threshold;\n const shouldUsePasswordLength = isPasswordToShort || isThresholdLongerThanPassword;\n // if password is too small use the password length divided by 4 while the threshold needs to be at least 1\n return shouldUsePasswordLength ? Math.ceil(password.length / 4) : threshold;\n};\nconst findLevenshteinDistance = (password, rankedDictionary, threshold) => {\n let foundDistance = 0;\n const found = Object.keys(rankedDictionary).find(entry => {\n const usedThreshold = getUsedThreshold(password, entry, threshold);\n if (Math.abs(password.length - entry.length) > usedThreshold) {\n return false;\n }\n const foundEntryDistance = distance(password, entry);\n const isInThreshold = foundEntryDistance <= usedThreshold;\n if (isInThreshold) {\n foundDistance = foundEntryDistance;\n }\n return isInThreshold;\n });\n if (found) {\n return {\n levenshteinDistance: foundDistance,\n levenshteinDistanceEntry: found\n };\n }\n return {};\n};\n\nexport { findLevenshteinDistance as default };\n//# sourceMappingURL=levenshtein.mjs.map\n","var mergeUserInputDictionary = (optionsRankedDictionaries, optionsRankedDictionariesMaxWordSize, userInputsOptions) => {\n if (!userInputsOptions) {\n return {\n rankedDictionaries: optionsRankedDictionaries,\n rankedDictionariesMaxWordSize: optionsRankedDictionariesMaxWordSize\n };\n }\n const rankedDictionaries = {\n ...optionsRankedDictionaries\n };\n const rankedDictionariesMaxWordSize = {\n ...optionsRankedDictionariesMaxWordSize\n };\n rankedDictionaries.userInputs = {\n ...(rankedDictionaries.userInputs || {}),\n ...userInputsOptions.rankedDictionary\n };\n rankedDictionariesMaxWordSize.userInputs = Math.max(userInputsOptions.rankedDictionaryMaxWordSize, rankedDictionariesMaxWordSize.userInputs || 0);\n return {\n rankedDictionaries,\n rankedDictionariesMaxWordSize\n };\n};\n\nexport { mergeUserInputDictionary as default };\n//# sourceMappingURL=mergeUserInputDictionary.mjs.map\n","import findLevenshteinDistance from '../../utils/levenshtein.mjs';\nimport { MatcherBaseClass } from '../../types.mjs';\nimport mergeUserInputDictionary from '../../utils/mergeUserInputDictionary.mjs';\n\nclass MatchDictionary extends MatcherBaseClass {\n constructor(options, wordSequenceCheck) {\n super(options);\n this.wordSequenceCheck = wordSequenceCheck;\n }\n getRangedDictionaries(userInputsOptions) {\n if (this.wordSequenceCheck) {\n const rankedDictionaries = {};\n const rankedDictionariesMaxWordSize = {};\n Object.keys(this.options.rankedDictionaries).forEach(key => {\n if (this.options.isWordSequence(key)) {\n rankedDictionaries[key] = this.options.rankedDictionaries[key];\n rankedDictionariesMaxWordSize[key] = this.options.rankedDictionariesMaxWordSize[key];\n }\n });\n return {\n rankedDictionaries,\n rankedDictionariesMaxWordSize\n };\n }\n return mergeUserInputDictionary(this.options.rankedDictionaries, this.options.rankedDictionariesMaxWordSize, userInputsOptions);\n }\n // eslint-disable-next-line complexity,max-statements\n match({\n password,\n userInputsOptions,\n useLevenshtein = true\n }) {\n const matches = [];\n const passwordLength = password.length;\n const passwordLower = password.toLowerCase();\n const {\n rankedDictionaries,\n rankedDictionariesMaxWordSize\n } = this.getRangedDictionaries(userInputsOptions);\n const dictionaryNames = Object.keys(rankedDictionaries);\n const maxSearchWidth = Math.max(0, ...Object.values(rankedDictionariesMaxWordSize));\n for (let i = 0; i < passwordLength; i += 1) {\n for (let j = i; j < passwordLength; j += 1) {\n const isFullPassword = i === 0 && j === passwordLength - 1;\n // if the word is longer than the longest word in any dictionary and it is not the full password\n // we can skip it. For the full password we still need to check for levenshtein distance\n if (j - i + 1 > maxSearchWidth && !isFullPassword) {\n break;\n }\n const usedPassword = passwordLower.slice(i, j + 1);\n for (const dictionaryName of dictionaryNames) {\n const rankedDict = rankedDictionaries[dictionaryName];\n if (j - i + 1 > rankedDictionariesMaxWordSize[dictionaryName] && !isFullPassword) {\n continue;\n }\n const rank = rankedDict[usedPassword];\n const isInDictionary = rank !== undefined;\n let foundLevenshteinDistance = {};\n // only use levenshtein distance on full password to minimize the performance drop\n // and because otherwise there would be to many false positives\n if (this.options.useLevenshteinDistance && isFullPassword && !isInDictionary && useLevenshtein) {\n foundLevenshteinDistance = findLevenshteinDistance(usedPassword, rankedDict, this.options.levenshteinThreshold);\n }\n const isLevenshteinMatch = foundLevenshteinDistance.levenshteinDistance !== undefined;\n if (isInDictionary || isLevenshteinMatch) {\n const usedRankPassword = isLevenshteinMatch ? foundLevenshteinDistance.levenshteinDistanceEntry : usedPassword;\n const rankValue = isInDictionary ? rank : rankedDict[usedRankPassword];\n matches.push({\n pattern: 'dictionary',\n i,\n j,\n token: password.slice(i, j + 1),\n matchedWord: usedPassword,\n rank: rankValue,\n dictionaryName,\n reversed: false,\n l33t: false,\n ...foundLevenshteinDistance\n });\n }\n }\n }\n }\n return matches;\n }\n}\n\nexport { MatchDictionary as default };\n//# sourceMappingURL=matching.mjs.map\n","class CleanPasswords {\n constructor({\n substr,\n limit,\n trieRoot\n }) {\n this.buffer = [];\n this.finalPasswords = [];\n this.substr = substr;\n this.limit = limit;\n this.trieRoot = trieRoot;\n }\n getAllPossibleSubsAtIndex(index) {\n const nodes = [];\n let cur = this.trieRoot;\n for (let i = index; i < this.substr.length; i += 1) {\n const character = this.substr.charAt(i);\n cur = cur.getChild(character);\n if (!cur) {\n break;\n }\n nodes.push(cur);\n }\n return nodes;\n }\n // eslint-disable-next-line complexity,max-statements\n helper({\n onlyFullSub,\n isFullSub,\n index,\n subIndex,\n changes,\n lastSubLetter,\n consecutiveSubCount\n }) {\n if (this.finalPasswords.length >= this.limit) {\n return;\n }\n if (index === this.substr.length) {\n if (onlyFullSub === isFullSub) {\n this.finalPasswords.push({\n password: this.buffer.join(''),\n changes,\n isFullSubstitution: onlyFullSub\n });\n }\n return;\n }\n // first, exhaust all possible substitutions at this index\n const nodes = [...this.getAllPossibleSubsAtIndex(index)];\n let hasSubs = false;\n // iterate backward to get wider substitutions first\n for (let i = index + nodes.length - 1; i >= index; i -= 1) {\n const cur = nodes[i - index];\n const sub = cur.parents.join('');\n if (cur.isTerminal()) {\n // Skip if this would be a 4th or more consecutive substitution of the same letter\n // this should work in all language as there shouldn't be the same letter more than four times in a row\n // So we can ignore the rest to save calculation time\n if (lastSubLetter === sub && consecutiveSubCount >= 3) {\n continue;\n }\n hasSubs = true;\n const letters = cur.subs;\n for (const letter of letters) {\n this.buffer.push(letter);\n const newSubs = changes.concat({\n i: subIndex,\n letter,\n substitution: sub\n });\n // recursively build the rest of the string\n this.helper({\n onlyFullSub,\n isFullSub,\n index: index + sub.length,\n subIndex: subIndex + letter.length,\n changes: newSubs,\n lastSubLetter: sub,\n consecutiveSubCount: lastSubLetter === sub ? consecutiveSubCount + 1 : 1\n });\n // backtrack by ignoring the added postfix\n this.buffer.pop();\n if (this.finalPasswords.length >= this.limit) {\n return;\n }\n }\n }\n }\n // next, generate all combos without doing a substitution at this index\n // if a partial substitution is requested or there are no substitutions at this index\n if (!onlyFullSub || !hasSubs) {\n const firstChar = this.substr.charAt(index);\n this.buffer.push(firstChar);\n this.helper({\n onlyFullSub,\n isFullSub: isFullSub && !hasSubs,\n index: index + 1,\n subIndex: subIndex + 1,\n changes,\n lastSubLetter,\n consecutiveSubCount\n });\n this.buffer.pop();\n }\n }\n getAll() {\n // only full substitution\n this.helper({\n onlyFullSub: true,\n isFullSub: true,\n index: 0,\n subIndex: 0,\n changes: [],\n lastSubLetter: undefined,\n consecutiveSubCount: 0\n });\n // only partial substitution\n this.helper({\n onlyFullSub: false,\n isFullSub: true,\n index: 0,\n subIndex: 0,\n changes: [],\n lastSubLetter: undefined,\n consecutiveSubCount: 0\n });\n return this.finalPasswords;\n }\n}\nconst getCleanPasswords = (password, limit, trieRoot) => {\n const helper = new CleanPasswords({\n substr: password,\n limit,\n trieRoot\n });\n return helper.getAll();\n};\n\nexport { getCleanPasswords as default };\n//# sourceMappingURL=getCleanPasswords.mjs.map\n","import getCleanPasswords from './unmunger/getCleanPasswords.mjs';\nimport MatchDictionary from '../../matching.mjs';\n\nconst getExtras = (passwordWithSubs, i, j) => {\n let iUnsubbed = i;\n let jUnsubbed = j;\n const filtered = [];\n const subDisplay = [];\n const seenSubs = new Set();\n passwordWithSubs.changes.forEach(change => {\n if (change.i < i) {\n const diff = change.substitution.length - change.letter.length;\n iUnsubbed += diff;\n jUnsubbed += diff;\n } else if (change.i <= j) {\n jUnsubbed += change.substitution.length - change.letter.length;\n const subKey = `${change.letter}-${change.substitution}`;\n if (!seenSubs.has(subKey)) {\n seenSubs.add(subKey);\n filtered.push({\n letter: change.letter,\n substitution: change.substitution\n });\n subDisplay.push(`${change.substitution} -> ${change.letter}`);\n }\n }\n });\n return {\n i: iUnsubbed,\n j: jUnsubbed,\n subs: filtered,\n subDisplay: subDisplay.join(', ')\n };\n};\n/*\n * -------------------------------------------------------------------------------\n * Dictionary l33t matching -----------------------------------------------------\n * -------------------------------------------------------------------------------\n */\nclass MatchL33t extends MatchDictionary {\n isAlreadyIncluded(matches, newMatch) {\n return matches.some(l33tMatch => {\n return l33tMatch.i === newMatch.i && l33tMatch.j === newMatch.j && l33tMatch.dictionaryName === newMatch.dictionaryName && l33tMatch.matchedWord === newMatch.matchedWord;\n });\n }\n match(matchOptions) {\n const matches = [];\n const subbedPasswords = getCleanPasswords(matchOptions.password, this.options.l33tMaxSubstitutions, this.options.trieNodeRoot);\n let hasFullMatch = false;\n subbedPasswords.forEach(subbedPassword => {\n if (hasFullMatch) {\n return;\n }\n const matchedDictionary = super.match({\n ...matchOptions,\n password: subbedPassword.password,\n useLevenshtein: subbedPassword.isFullSubstitution\n });\n matchedDictionary.forEach(match => {\n const extras = getExtras(subbedPassword, match.i, match.j);\n if (!hasFullMatch) {\n hasFullMatch = extras.i === 0 && extras.j === matchOptions.password.length - 1;\n }\n const token = matchOptions.password.slice(extras.i, extras.j + 1);\n const newMatch = {\n ...match,\n l33t: true,\n token,\n ...extras\n };\n const alreadyIncluded = this.isAlreadyIncluded(matches, newMatch);\n // only return the matches that contain an actual substitution\n if (token.toLowerCase() !== match.matchedWord && !alreadyIncluded) {\n matches.push(newMatch);\n }\n });\n });\n // filter single-character l33t matches to reduce noise.\n // otherwise '1' matches 'i', '4' matches 'a', both very common English words\n // with low dictionary rank.\n return matches.filter(match => match.token.length > 1);\n }\n}\n\nexport { MatchL33t as default };\n//# sourceMappingURL=l33t.mjs.map\n","import MatchDictionary from '../../matching.mjs';\n\n/*\n * -------------------------------------------------------------------------------\n * Dictionary reverse matching --------------------------------------------------\n * -------------------------------------------------------------------------------\n */\nclass MatchReverse extends MatchDictionary {\n match(matchOptions) {\n const passwordReversed = matchOptions.password.split('').reverse().join('');\n return super.match({\n ...matchOptions,\n password: passwordReversed\n }).map(match => ({\n ...match,\n token: match.token.split('').reverse().join(''),\n // reverse back\n reversed: true,\n // map coordinates back to original string\n i: matchOptions.password.length - 1 - match.j,\n j: matchOptions.password.length - 1 - match.i\n }));\n }\n}\n\nexport { MatchReverse as default };\n//# sourceMappingURL=reverse.mjs.map\n","import { REGEXEN } from '../../data/const.mjs';\nimport { sorted } from '../../utils/helper.mjs';\nimport { MatcherBaseClass } from '../../types.mjs';\n\n/*\n * -------------------------------------------------------------------------------\n * regex matching ---------------------------------------------------------------\n * -------------------------------------------------------------------------------\n */\nclass MatchRegex extends MatcherBaseClass {\n match({\n password\n }) {\n const matches = [];\n Object.keys(REGEXEN).forEach(name => {\n const regex = REGEXEN[name];\n regex.lastIndex = 0; // keeps regexMatch stateless\n let regexMatch;\n while (regexMatch = regex.exec(password)) {\n if (regexMatch) {\n const token = regexMatch[0];\n matches.push({\n pattern: 'regex',\n token,\n i: regexMatch.index,\n j: regexMatch.index + regexMatch[0].length - 1,\n regexName: name,\n regexMatch\n });\n }\n }\n });\n return sorted(matches);\n }\n}\n\nexport { MatchRegex as default };\n//# sourceMappingURL=matching.mjs.map\n","const LOG10 = Math.log(10);\nconst LOG2 = Math.log(2);\nvar utils = {\n // binomial coefficients\n // src: http://blog.plover.com/math/choose.html\n nCk(n, k) {\n let count = n;\n if (k > count) {\n return 0;\n }\n if (k === 0) {\n return 1;\n }\n let coEff = 1;\n for (let i = 1; i <= k; i += 1) {\n coEff *= count;\n coEff /= i;\n count -= 1;\n }\n return coEff;\n },\n log10(n) {\n if (n === 0) return 0;\n return Math.log(n) / LOG10; // IE doesn't support Math.log10 :(\n },\n log2(n) {\n return Math.log(n) / LOG2;\n },\n factorial(num) {\n let rval = 1;\n for (let i = 2; i <= num; i += 1) rval *= i;\n return rval;\n }\n};\n\nexport { utils as default };\n//# sourceMappingURL=utils.mjs.map\n","import { BRUTEFORCE_CARDINALITY, MIN_SUBMATCH_GUESSES_SINGLE_CHAR, MIN_SUBMATCH_GUESSES_MULTI_CHAR } from '../../data/const.mjs';\n\nvar bruteforceMatcher = ({\n token\n}) => {\n let guesses = BRUTEFORCE_CARDINALITY ** token.length;\n if (guesses === Number.POSITIVE_INFINITY) {\n guesses = Number.MAX_VALUE;\n }\n let minGuesses;\n // small detail: make bruteforce matches at minimum one guess bigger than smallest allowed\n // submatch guesses, such that non-bruteforce submatches over the same [i..j] take precedence.\n if (token.length === 1) {\n minGuesses = MIN_SUBMATCH_GUESSES_SINGLE_CHAR + 1;\n } else {\n minGuesses = MIN_SUBMATCH_GUESSES_MULTI_CHAR + 1;\n }\n return Math.max(guesses, minGuesses);\n};\n\nexport { bruteforceMatcher as default };\n//# sourceMappingURL=scoring.mjs.map\n","import { REFERENCE_YEAR, MIN_YEAR_SPACE } from '../../data/const.mjs';\n\nvar dateMatcher = ({\n year,\n separator\n}) => {\n // base guesses: (year distance from REFERENCE_YEAR) * num_days * num_years\n const yearSpace = Math.max(Math.abs(year - REFERENCE_YEAR), MIN_YEAR_SPACE);\n let guesses = yearSpace * 365;\n // add factor of 4 for separator selection (one of ~4 choices)\n if (separator) {\n guesses *= 4;\n }\n return guesses;\n};\n\nexport { dateMatcher as default };\n//# sourceMappingURL=scoring.mjs.map\n","import utils from '../../../../scoring/utils.mjs';\nimport { ALPHA_INVERTED, ALL_LOWER_INVERTED, START_UPPER, END_UPPER, ALL_UPPER_INVERTED, ONE_UPPER, ONE_LOWER } from '../../../../data/const.mjs';\n\nconst getVariations = cleanedWord => {\n const wordArray = cleanedWord.split('');\n const upperCaseCount = wordArray.filter(char => char.match(ONE_UPPER)).length;\n const lowerCaseCount = wordArray.filter(char => char.match(ONE_LOWER)).length;\n let variations = 0;\n const variationLength = Math.min(upperCaseCount, lowerCaseCount);\n for (let i = 1; i <= variationLength; i += 1) {\n variations += utils.nCk(upperCaseCount + lowerCaseCount, i);\n }\n return variations;\n};\nvar uppercaseVariant = word => {\n // clean words of non alpha characters to remove the reward effekt to capitalize the first letter https://github.com/dropbox/zxcvbn/issues/232\n const cleanedWord = word.replace(ALPHA_INVERTED, '');\n if (cleanedWord.match(ALL_LOWER_INVERTED) || cleanedWord.toLowerCase() === cleanedWord) {\n return 1;\n }\n // a capitalized word is the most common capitalization scheme,\n // so it only doubles the search space (uncapitalized + capitalized).\n // all caps and end-capitalized are common enough too, underestimate as 2x factor to be safe.\n const commonCases = [START_UPPER, END_UPPER, ALL_UPPER_INVERTED];\n const commonCasesLength = commonCases.length;\n for (let i = 0; i < commonCasesLength; i += 1) {\n const regex = commonCases[i];\n if (cleanedWord.match(regex)) {\n return 2;\n }\n }\n // otherwise calculate the number of ways to capitalize U+L uppercase+lowercase letters\n // with U uppercase letters or less. or, if there's more uppercase than lower (for eg. PASSwORD),\n // the number of ways to lowercase U+L letters with L lowercase letters or less.\n return getVariations(cleanedWord);\n};\n\nexport { uppercaseVariant as default };\n//# sourceMappingURL=uppercase.mjs.map\n","import utils from '../../../../scoring/utils.mjs';\n\nconst countSubstring = (string, substring) => {\n let count = 0;\n let pos = string.indexOf(substring);\n while (pos >= 0) {\n count += 1;\n pos = string.indexOf(substring, pos + substring.length);\n }\n return count;\n};\nconst getCounts = ({\n sub,\n token\n}) => {\n // lower-case match.token before calculating: capitalization shouldn't affect l33t calc.\n const tokenLower = token.toLowerCase();\n // num of subbed chars\n const subbedCount = countSubstring(tokenLower, sub.substitution);\n // num of unsubbed chars\n const unsubbedCount = countSubstring(tokenLower, sub.letter);\n return {\n subbedCount,\n unsubbedCount\n };\n};\nvar l33tVariant = ({\n l33t,\n subs,\n token\n}) => {\n if (!l33t) {\n return 1;\n }\n let variations = 1;\n subs.forEach(sub => {\n const {\n subbedCount,\n unsubbedCount\n } = getCounts({\n sub,\n token\n });\n if (subbedCount === 0 || unsubbedCount === 0) {\n // for this sub, password is either fully subbed (444) or fully unsubbed (aaa)\n // treat that as doubling the space (attacker needs to try fully subbed chars in addition to\n // unsubbed.)\n variations *= 2;\n } else {\n // this case is similar to capitalization:\n // with aa44a, U = 3, S = 2, attacker needs to try unsubbed + one sub + two subs\n const p = Math.min(unsubbedCount, subbedCount);\n let possibilities = 0;\n for (let i = 1; i <= p; i += 1) {\n possibilities += utils.nCk(unsubbedCount + subbedCount, i);\n }\n variations *= possibilities;\n }\n });\n return variations;\n};\n\nexport { l33tVariant as default };\n//# sourceMappingURL=l33t.mjs.map\n","import uppercaseVariant from './variants/scoring/uppercase.mjs';\nimport l33tVariant from './variants/scoring/l33t.mjs';\n\nvar dictionaryMatcher = ({\n rank,\n reversed,\n l33t,\n subs,\n token,\n dictionaryName\n}) => {\n const baseGuesses = rank; // keep these as properties for display purposes\n const uppercaseVariations = uppercaseVariant(token);\n const l33tVariations = l33tVariant({\n l33t,\n subs,\n token\n });\n const reversedVariations = reversed && 2 || 1;\n let calculation;\n if (dictionaryName === 'diceware') {\n // diceware dictionaries are special, so we get a simple scoring of 1/2 of 6^5 (6 digits on 5 dice)\n // to get fix entropy of ~12.9 bits for every entry https://en.wikipedia.org/wiki/Diceware#:~:text=The%20level%20of,bits\n calculation = 6 ** 5 / 2;\n } else {\n calculation = baseGuesses * uppercaseVariations * l33tVariations * reversedVariations;\n }\n return {\n baseGuesses,\n uppercaseVariations,\n l33tVariations,\n calculation\n };\n};\n\nexport { dictionaryMatcher as default };\n//# sourceMappingURL=scoring.mjs.map\n","import { REFERENCE_YEAR, MIN_YEAR_SPACE } from '../../data/const.mjs';\n\nvar regexMatcher = ({\n regexName,\n regexMatch,\n token\n}) => {\n const charClassBases = {\n alphaLower: 26,\n alphaUpper: 26,\n alpha: 52,\n alphanumeric: 62,\n digits: 10,\n symbols: 33\n };\n if (regexName in charClassBases) {\n return charClassBases[regexName] ** token.length;\n }\n // TODO add more regex types for example special dates like 09.11\n switch (regexName) {\n case 'recentYear':\n // conservative estimate of year space: num years from REFERENCE_YEAR.\n // if year is close to REFERENCE_YEAR, estimate a year space of MIN_YEAR_SPACE.\n return Math.max(Math.abs(parseInt(regexMatch[0], 10) - REFERENCE_YEAR), MIN_YEAR_SPACE);\n }\n return 0;\n};\n\nexport { regexMatcher as default };\n//# sourceMappingURL=scoring.mjs.map\n","var repeatMatcher = ({\n baseGuesses,\n repeatCount\n}) => baseGuesses * repeatCount;\n\nexport { repeatMatcher as default };\n//# sourceMappingURL=scoring.mjs.map\n","var sequenceMatcher = ({\n token,\n ascending\n}) => {\n const firstChr = token.charAt(0);\n let baseGuesses;\n const startingPoints = ['a', 'A', 'z', 'Z', '0', '1', '9'];\n // lower guesses for obvious starting points\n if (startingPoints.includes(firstChr)) {\n baseGuesses = 4;\n } else if (/\\d/.exec(firstChr)) {\n baseGuesses = 10; // digits\n } else {\n // could give a higher base for uppercase,\n // assigning 26 to both upper and lower sequences is more conservative.\n baseGuesses = 26;\n }\n // need to try a descending sequence in addition to every ascending sequence ->\n // 2x guesses\n if (!ascending) {\n baseGuesses *= 2;\n }\n return baseGuesses * token.length;\n};\n\nexport { sequenceMatcher as default };\n//# sourceMappingURL=scoring.mjs.map\n","import utils from '../../scoring/utils.mjs';\n\nconst calcAverageDegree = graph => {\n let average = 0;\n Object.keys(graph).forEach(key => {\n const neighbors = graph[key];\n average += neighbors.filter(entry => !!entry).length;\n });\n average /= Object.entries(graph).length;\n return average;\n};\nconst estimatePossiblePatterns = (graphEntry, {\n token,\n turns\n}) => {\n const startingPosition = Object.keys(graphEntry).length;\n const averageDegree = calcAverageDegree(graphEntry);\n let guesses = 0;\n const tokenLength = token.length;\n // # estimate the number of possible patterns w/ tokenLength or less with turns or less.\n for (let i = 2; i <= tokenLength; i += 1) {\n const possibleTurns = Math.min(turns, i - 1);\n for (let j = 1; j <= possibleTurns; j += 1) {\n guesses += utils.nCk(i - 1, j - 1) * startingPosition * averageDegree ** j;\n }\n }\n return guesses;\n};\nvar spatialMatcher = ({\n graph,\n token,\n shiftedCount,\n turns\n}, options) => {\n let guesses = estimatePossiblePatterns(options.graphs[graph], {\n token,\n turns\n });\n // add extra guesses for shifted keys. (% instead of 5, A instead of a.)\n // math is similar to extra guesses of l33t substitutions in dictionary matches.\n if (shiftedCount) {\n const unShiftedCount = token.length - shiftedCount;\n if (shiftedCount === 0 || unShiftedCount === 0) {\n guesses *= 2;\n } else {\n let shiftedVariations = 0;\n for (let i = 1; i <= Math.min(shiftedCount, unShiftedCount); i += 1) {\n shiftedVariations += utils.nCk(shiftedCount + unShiftedCount, i);\n }\n guesses *= shiftedVariations;\n }\n }\n return Math.round(guesses);\n};\n\nexport { spatialMatcher as default };\n//# sourceMappingURL=scoring.mjs.map\n","import { SEPERATOR_CHAR_COUNT } from '../../data/const.mjs';\n\nvar separatorMatcher = () => {\n return SEPERATOR_CHAR_COUNT;\n};\n\nexport { separatorMatcher as default };\n//# sourceMappingURL=scoring.mjs.map\n","function factorial(n) {\n if (n <= 1) return 1;\n return n * factorial(n - 1);\n}\nvar wordSequenceMatcher = match => {\n if (match.pattern !== 'wordSequence') {\n return 0;\n }\n // Base guesses: factorial of word count (number of ways to order the words)\n const baseGuesses = factorial(match.wordCount);\n // Additional penalty for longer sequences\n const lengthPenalty = 2 ** (match.wordCount - 2);\n return baseGuesses * lengthPenalty;\n};\n\nexport { wordSequenceMatcher as default };\n//# sourceMappingURL=scoring.mjs.map\n","import { MIN_SUBMATCH_GUESSES_SINGLE_CHAR, MIN_SUBMATCH_GUESSES_MULTI_CHAR } from '../data/const.mjs';\nimport utils from './utils.mjs';\nimport bruteforceMatcher from '../matcher/bruteforce/scoring.mjs';\nimport dateMatcher from '../matcher/date/scoring.mjs';\nimport dictionaryMatcher from '../matcher/dictionary/scoring.mjs';\nimport regexMatcher from '../matcher/regex/scoring.mjs';\nimport repeatMatcher from '../matcher/repeat/scoring.mjs';\nimport sequenceMatcher from '../matcher/sequence/scoring.mjs';\nimport spatialMatcher from '../matcher/spatial/scoring.mjs';\nimport separatorMatcher from '../matcher/separator/scoring.mjs';\nimport wordSequenceMatcher from '../matcher/wordSequence/scoring.mjs';\n\nconst getMinGuesses = (match, password) => {\n let minGuesses = 1;\n if (match.token.length < password.length) {\n if (match.token.length === 1) {\n minGuesses = MIN_SUBMATCH_GUESSES_SINGLE_CHAR;\n } else {\n minGuesses = MIN_SUBMATCH_GUESSES_MULTI_CHAR;\n }\n }\n return minGuesses;\n};\nconst matchers = {\n bruteforce: bruteforceMatcher,\n date: dateMatcher,\n dictionary: dictionaryMatcher,\n regex: regexMatcher,\n repeat: repeatMatcher,\n sequence: sequenceMatcher,\n spatial: spatialMatcher,\n separator: separatorMatcher,\n wordSequence: wordSequenceMatcher\n};\nconst getScoring = (options, name, match) => {\n if (matchers[name]) {\n return matchers[name](match, options);\n }\n if (options.matchers[name] && 'scoring' in options.matchers[name]) {\n return options.matchers[name].scoring(match, options);\n }\n return 0;\n};\n// ------------------------------------------------------------------------------\n// guess estimation -- one function per match pattern ---------------------------\n// ------------------------------------------------------------------------------\nvar estimateGuesses = (options, match, password) => {\n const extraData = {};\n // a match's guess estimate doesn't change. cache it.\n if ('guesses' in match && match.guesses != null) {\n return match;\n }\n const minGuesses = getMinGuesses(match, password);\n const estimationResult = getScoring(options, match.pattern, match);\n let guesses = 0;\n if (typeof estimationResult === 'number') {\n guesses = estimationResult;\n } else if (match.pattern === 'dictionary') {\n guesses = estimationResult.calculation;\n extraData.baseGuesses = estimationResult.baseGuesses;\n extraData.uppercaseVariations = estimationResult.uppercaseVariations;\n extraData.l33tVariations = estimationResult.l33tVariations;\n }\n const matchGuesses = Math.max(guesses, minGuesses);\n return {\n ...match,\n ...extraData,\n guesses: matchGuesses,\n guessesLog10: utils.log10(matchGuesses)\n };\n};\n\nexport { estimateGuesses as default };\n//# sourceMappingURL=estimate.mjs.map\n","import utils from './utils.mjs';\nimport estimateGuesses from './estimate.mjs';\nimport { MIN_GUESSES_BEFORE_GROWING_SEQUENCE } from '../data/const.mjs';\n\nclass Scoring {\n constructor(options) {\n this.options = options;\n this.password = '';\n this.optimal = {};\n this.excludeAdditive = false;\n }\n fillArray(size, valueType) {\n const result = [];\n for (let i = 0; i < size; i += 1) {\n let value = [];\n if (valueType === 'object') {\n value = {};\n }\n result.push(value);\n }\n return result;\n }\n // helper: make bruteforce match objects spanning i to j, inclusive.\n makeBruteforceMatch(i, j) {\n return {\n pattern: 'bruteforce',\n token: this.password.slice(i, j + 1 || 9e9),\n i,\n j\n };\n }\n // helper: considers whether a length-sequenceLength\n // sequence ending at match bestMatches is better (fewer guesses)\n // than previously encountered sequences, updating state if so.\n // eslint-disable-next-line max-statements\n update(match, sequenceLength) {\n const k = match.j;\n const estimatedMatch = estimateGuesses(this.options, match, this.password);\n let pi = estimatedMatch.guesses;\n if (sequenceLength > 1) {\n // we're considering a length-sequenceLength sequence ending with match bestMatches:\n // obtain the product term in the minimization function by multiplying bestMatches's guesses\n // by the product of the length-(sequenceLength-1)\n // sequence ending just before bestMatches, at bestMatches.i - 1.\n pi *= this.optimal.guessesProduct[estimatedMatch.i - 1][sequenceLength - 1];\n }\n // calculate the minimization func\n let g = utils.factorial(sequenceLength) * pi;\n if (!this.excludeAdditive) {\n g += MIN_GUESSES_BEFORE_GROWING_SEQUENCE ** (sequenceLength - 1);\n }\n // update state if new best.\n // first see if any competing sequences covering this prefix,\n // with sequenceLength or fewer matches,\n // fare better than this sequence. if so, skip it and return.\n let shouldSkip = false;\n const competingG = this.optimal.totalGuesses[k];\n Object.keys(competingG).forEach(competingPatternLengthStr => {\n const competingPatternLength = parseInt(competingPatternLengthStr, 10);\n const competingMetricMatch = competingG[competingPatternLength];\n if (competingPatternLength <= sequenceLength) {\n if (competingMetricMatch <= g) {\n shouldSkip = true;\n }\n }\n });\n if (!shouldSkip) {\n // this sequence might be part of the final optimal sequence.\n this.optimal.totalGuesses[k][sequenceLength] = g;\n this.optimal.bestMatches[k][sequenceLength] = estimatedMatch;\n this.optimal.guessesProduct[k][sequenceLength] = pi;\n }\n }\n // helper: evaluate bruteforce matches ending at passwordCharIndex.\n bruteforceUpdate(passwordCharIndex) {\n // see if a single bruteforce match spanning the passwordCharIndex-prefix is optimal.\n let match = this.makeBruteforceMatch(0, passwordCharIndex);\n this.update(match, 1);\n for (let i = 1; i <= passwordCharIndex; i += 1) {\n // generate passwordCharIndex bruteforce matches, spanning from (i=1, j=passwordCharIndex) up to (i=passwordCharIndex, j=passwordCharIndex).\n // see if adding these new matches to any of the sequences in optimal[i-1]\n // leads to new bests.\n match = this.makeBruteforceMatch(i, passwordCharIndex);\n const tmp = this.optimal.bestMatches[i - 1];\n Object.keys(tmp).forEach(sequenceLengthStr => {\n const sequenceLength = parseInt(sequenceLengthStr, 10);\n const lastMatch = tmp[sequenceLength];\n // corner: an optimal sequence will never have two adjacent bruteforce matches.\n // it is strictly better to have a single bruteforce match spanning the same region:\n // same contribution to the guess product with a lower length.\n // --> safe to skip those cases.\n if (lastMatch.pattern !== 'bruteforce') {\n // try adding bestMatches to this length-sequenceLength sequence.\n this.update(match, sequenceLength + 1);\n }\n });\n }\n }\n // helper: step backwards through optimal.bestMatches starting at the end,\n // constructing the final optimal match sequence.\n unwind(passwordLength) {\n const optimalMatchSequence = [];\n let k = passwordLength - 1;\n // find the final best sequence length and score\n let sequenceLength = 0;\n // eslint-disable-next-line no-loss-of-precision\n let g = 2e308;\n const temp = this.optimal.totalGuesses[k];\n // safety check for empty passwords\n if (temp) {\n Object.keys(temp).forEach(candidateSequenceLengthStr => {\n const candidateSequenceLength = parseInt(candidateSequenceLengthStr, 10);\n const candidateMetricMatch = temp[candidateSequenceLength];\n if (candidateMetricMatch < g) {\n sequenceLength = candidateSequenceLength;\n g = candidateMetricMatch;\n }\n });\n }\n while (k >= 0) {\n const match = this.optimal.bestMatches[k][sequenceLength];\n optimalMatchSequence.unshift(match);\n k = match.i - 1;\n sequenceLength -= 1;\n }\n return optimalMatchSequence;\n }\n // ------------------------------------------------------------------------------\n // search --- most guessable match sequence -------------------------------------\n // ------------------------------------------------------------------------------\n //\n // takes a sequence of overlapping matches, returns the non-overlapping sequence with\n // minimum guesses. the following is a O(l_max * (n + m)) dynamic programming algorithm\n // for a length-n password with m candidate matches. l_max is the maximum optimal\n // sequence length spanning each prefix of the password. In practice it rarely exceeds 5 and the\n // search terminates rapidly.\n //\n // the optimal \"minimum guesses\" sequence is here defined to be the sequence that\n // minimizes the following function:\n //\n // totalGuesses = sequenceLength! * Product(m.guesses for m in sequence) + D^(sequenceLength - 1)\n //\n // where sequenceLength is the length of the sequence.\n //\n // the factorial term is the number of ways to order sequenceLength patterns.\n //\n // the D^(sequenceLength-1) term is another length penalty, roughly capturing the idea that an\n // attacker will try lower-length sequences first before trying length-sequenceLength sequences.\n //\n // for example, consider a sequence that is date-repeat-dictionary.\n // - an attacker would need to try other date-repeat-dictionary combinations,\n // hence the product term.\n // - an attacker would need to try repeat-date-dictionary, dictionary-repeat-date,\n // ..., hence the factorial term.\n // - an attacker would also likely try length-1 (dictionary) and length-2 (dictionary-date)\n // sequences before length-3. assuming at minimum D guesses per pattern type,\n // D^(sequenceLength-1) approximates Sum(D^i for i in [1..sequenceLength-1]\n //\n // ------------------------------------------------------------------------------\n mostGuessableMatchSequence(password, matches, excludeAdditive = false) {\n this.password = password;\n this.excludeAdditive = excludeAdditive;\n const passwordLength = password.length;\n // partition matches into sublists according to ending index j\n let matchesByCoordinateJ = this.fillArray(passwordLength, 'array');\n matches.forEach(match => {\n matchesByCoordinateJ[match.j].push(match);\n });\n // small detail: for deterministic output, sort each sublist by i.\n matchesByCoordinateJ = matchesByCoordinateJ.map(match => match.sort((m1, m2) => m1.i - m2.i));\n this.optimal = {\n // optimal.bestMatches[k][sequenceLength] holds final match in the best length-sequenceLength\n // match sequence covering the\n // password prefix up to k, inclusive.\n // if there is no length-sequenceLength sequence that scores better (fewer guesses) than\n // a shorter match sequence spanning the same prefix,\n // optimal.bestMatches[k][sequenceLength] is undefined.\n bestMatches: this.fillArray(passwordLength, 'object'),\n // same structure as optimal.bestMatches -- holds the product term Prod(bestMatches.guesses for bestMatches in sequence).\n // optimal.guessesProduct allows for fast (non-looping) updates to the minimization function.\n guessesProduct: this.fillArray(passwordLength, 'object'),\n // same structure as optimal.bestMatches -- holds the overall metric.\n totalGuesses: this.fillArray(passwordLength, 'object')\n };\n for (let k = 0; k < passwordLength; k += 1) {\n matchesByCoordinateJ[k].forEach(match => {\n if (match.i > 0) {\n const prevM = this.optimal.bestMatches[match.i - 1];\n Object.keys(prevM).forEach(sequenceLengthStr => {\n const sequenceLength = parseInt(sequenceLengthStr, 10);\n this.update(match, sequenceLength + 1);\n });\n } else {\n this.update(match, 1);\n }\n });\n this.bruteforceUpdate(k);\n }\n const optimalMatchSequence = this.unwind(passwordLength);\n const optimalSequenceLength = optimalMatchSequence.length;\n const guesses = this.getGuesses(password, optimalSequenceLength);\n return {\n password,\n guesses,\n guessesLog10: utils.log10(guesses),\n sequence: optimalMatchSequence\n };\n }\n getGuesses(password, optimalSequenceLength) {\n const passwordLength = password.length;\n if (password.length === 0) {\n return 1;\n } else {\n return this.optimal.totalGuesses[passwordLength - 1][optimalSequenceLength];\n }\n }\n}\n\nexport { Scoring as default };\n//# sourceMappingURL=index.mjs.map\n","import { MatcherBaseClass } from '../../types.mjs';\nimport Scoring from '../../scoring/index.mjs';\n\n/*\n *-------------------------------------------------------------------------------\n * repeats (aaa, abcabcabc) ------------------------------\n *-------------------------------------------------------------------------------\n */\nclass MatchRepeat extends MatcherBaseClass {\n constructor(options) {\n super(options);\n this.scoring = new Scoring(options);\n }\n // eslint-disable-next-line max-statements\n match({\n password,\n omniMatch\n }) {\n const matches = [];\n let lastIndex = 0;\n while (lastIndex < password.length) {\n const greedyMatch = this.getGreedyMatch(password, lastIndex);\n const lazyMatch = this.getLazyMatch(password, lastIndex);\n if (greedyMatch == null) {\n break;\n }\n const {\n match,\n baseToken\n } = this.setMatchToken(greedyMatch, lazyMatch);\n if (match) {\n const j = match.index + match[0].length - 1;\n const baseGuesses = this.getBaseGuesses(baseToken, omniMatch);\n matches.push(this.normalizeMatch(baseToken, j, match, baseGuesses));\n lastIndex = j + 1;\n }\n }\n const hasPromises = matches.some(match => {\n return match instanceof Promise;\n });\n if (hasPromises) {\n // eslint-disable-next-line @typescript-eslint/await-thenable\n return Promise.all(matches);\n }\n return matches;\n }\n // eslint-disable-next-line max-params\n normalizeMatch(baseToken, j, match, baseGuesses) {\n const baseMatch = {\n pattern: 'repeat',\n i: match.index,\n j,\n token: match[0],\n baseToken,\n baseGuesses: 0,\n repeatCount: match[0].length / baseToken.length\n };\n if (baseGuesses instanceof Promise) {\n return baseGuesses.then(resolvedBaseGuesses => {\n return {\n ...baseMatch,\n baseGuesses: resolvedBaseGuesses\n };\n });\n }\n return {\n ...baseMatch,\n baseGuesses\n };\n }\n getGreedyMatch(password, lastIndex) {\n const greedy = /(.+)\\1+/g;\n greedy.lastIndex = lastIndex;\n return greedy.exec(password);\n }\n getLazyMatch(password, lastIndex) {\n const lazy = /(.+?)\\1+/g;\n lazy.lastIndex = lastIndex;\n return lazy.exec(password);\n }\n setMatchToken(greedyMatch, lazyMatch) {\n const lazyAnchored = /^(.+?)\\1+$/;\n let match;\n let baseToken = '';\n if (lazyMatch && greedyMatch[0].length > lazyMatch[0].length) {\n // greedy beats lazy for 'aabaab'\n // greedy: [aabaab, aab]\n // lazy: [aa, a]\n match = greedyMatch;\n // greedy's repeated string might itself be repeated, eg.\n // aabaab in aabaabaabaab.\n // run an anchored lazy match on greedy's repeated string\n // to find the shortest repeated string\n const temp = lazyAnchored.exec(match[0]);\n if (temp) {\n baseToken = temp[1];\n }\n } else {\n // lazy beats greedy for 'aaaaa'\n // greedy: [aaaa, aa]\n // lazy: [aaaaa, a]\n match = lazyMatch;\n if (match) {\n baseToken = match[1];\n }\n }\n return {\n match,\n baseToken\n };\n }\n getBaseGuesses(baseToken, omniMatch) {\n const matches = omniMatch.match(baseToken);\n if (matches instanceof Promise) {\n return matches.then(resolvedMatches => {\n const baseAnalysis = this.scoring.mostGuessableMatchSequence(baseToken, resolvedMatches);\n return baseAnalysis.guesses;\n });\n }\n const baseAnalysis = this.scoring.mostGuessableMatchSequence(baseToken, matches);\n return baseAnalysis.guesses;\n }\n}\n\nexport { MatchRepeat as default };\n//# sourceMappingURL=matching.mjs.map\n","import { ALL_LOWER, ALL_UPPER, ALL_DIGIT } from '../../data/const.mjs';\nimport { MatcherBaseClass } from '../../types.mjs';\n\n/*\n *-------------------------------------------------------------------------------\n * sequences (abcdef) ------------------------------\n *-------------------------------------------------------------------------------\n */\nclass MatchSequence extends MatcherBaseClass {\n constructor() {\n super(...arguments);\n this.MAX_DELTA = 5;\n }\n // eslint-disable-next-line max-statements\n match({\n password\n }) {\n /*\n * Identifies sequences by looking for repeated differences in unicode codepoint.\n * this allows skipping, such as 9753, and also matches some extended unicode sequences\n * such as Greek and Cyrillic alphabets.\n *\n * for example, consider the input 'abcdb975zy'\n *\n * password: a b c d b 9 7 5 z y\n * index: 0 1 2 3 4 5 6 7 8 9\n * delta: 1 1 1 -2 -41 -2 -2 69 1\n *\n * expected result:\n * [(i, j, delta), ...] = [(0, 3, 1), (5, 7, -2), (8, 9, 1)]\n */\n const result = [];\n if (password.length === 1) {\n return [];\n }\n let i = 0;\n let lastDelta = null;\n const passwordLength = password.length;\n for (let k = 1; k < passwordLength; k += 1) {\n const delta = password.charCodeAt(k) - password.charCodeAt(k - 1);\n if (lastDelta === null) {\n lastDelta = delta;\n }\n if (delta !== lastDelta) {\n const j = k - 1;\n this.update({\n i,\n j,\n delta: lastDelta,\n password,\n result\n });\n i = j;\n lastDelta = delta;\n }\n }\n this.update({\n i,\n j: passwordLength - 1,\n delta: lastDelta,\n password,\n result\n });\n return result;\n }\n update({\n i,\n j,\n delta,\n password,\n result\n }) {\n if (j - i > 1 || Math.abs(delta) === 1) {\n const absoluteDelta = Math.abs(delta);\n if (absoluteDelta > 0 && absoluteDelta <= this.MAX_DELTA) {\n const token = password.slice(i, j + 1 || 9e9);\n const {\n sequenceName,\n sequenceSpace\n } = this.getSequence(token);\n return result.push({\n pattern: 'sequence',\n i,\n j,\n token: password.slice(i, j + 1 || 9e9),\n sequenceName,\n sequenceSpace,\n ascending: delta > 0\n });\n }\n }\n return null;\n }\n getSequence(token) {\n // TODO conservatively stick with roman alphabet size.\n // (this could be improved)\n let sequenceName = 'unicode';\n let sequenceSpace = 26;\n if (ALL_LOWER.test(token)) {\n sequenceName = 'lower';\n sequenceSpace = 26;\n } else if (ALL_UPPER.test(token)) {\n sequenceName = 'upper';\n sequenceSpace = 26;\n } else if (ALL_DIGIT.test(token)) {\n sequenceName = 'digits';\n sequenceSpace = 10;\n }\n return {\n sequenceName,\n sequenceSpace\n };\n }\n}\n\nexport { MatchSequence as default };\n//# sourceMappingURL=matching.mjs.map\n","import { extend, sorted } from '../../utils/helper.mjs';\nimport { MatcherBaseClass } from '../../types.mjs';\n\n/*\n * ------------------------------------------------------------------------------\n * spatial match (qwerty/dvorak/keypad and so on) -----------------------------------------\n * ------------------------------------------------------------------------------\n */\nclass MatchSpatial extends MatcherBaseClass {\n constructor() {\n super(...arguments);\n this.SHIFTED_RX = /[~!@#$%^&*()_+QWERTYUIOP{}|ASDFGHJKL:\"ZXCVBNM<>?]/;\n }\n match({\n password\n }) {\n const matches = [];\n Object.keys(this.options.graphs).forEach(graphName => {\n const graph = this.options.graphs[graphName];\n extend(matches, this.helper(password, graph, graphName));\n });\n return sorted(matches);\n }\n checkIfShifted(graphName, password, index) {\n if (!graphName.includes('keypad') &&\n // initial character is shifted\n this.SHIFTED_RX.test(password.charAt(index))) {\n return 1;\n }\n return 0;\n }\n // eslint-disable-next-line complexity, max-statements\n helper(password, graph, graphName) {\n let shiftedCount;\n const matches = [];\n let i = 0;\n const passwordLength = password.length;\n while (i < passwordLength - 1) {\n let j = i + 1;\n let lastDirection = null;\n let turns = 0;\n shiftedCount = this.checkIfShifted(graphName, password, i);\n while (true) {\n const prevChar = password.charAt(j - 1);\n const adjacents = graph[prevChar] || [];\n let found = false;\n let curDirection = -1;\n // consider growing pattern by one character if j hasn't gone over the edge.\n if (j < passwordLength) {\n const curChar = password.charAt(j);\n const adjacentsLength = adjacents.length;\n for (let k = 0; k < adjacentsLength; k += 1) {\n const adjacent = adjacents[k];\n curDirection += 1;\n // eslint-disable-next-line max-depth\n if (adjacent) {\n const adjacentIndex = adjacent.indexOf(curChar);\n // eslint-disable-next-line max-depth\n if (adjacentIndex !== -1) {\n found = true;\n // eslint-disable-next-line max-depth\n if (adjacentIndex === 1) {\n // # index 1 in the adjacency means the key is shifted,\n // # 0 means unshifted: A vs a, % vs 5, etc.\n // # for example, 'q' is adjacent to the entry '2@'.\n // # @ is shifted w/ index 1, 2 is unshifted.\n shiftedCount += 1;\n }\n const foundDirection = curDirection;\n // eslint-disable-next-line max-depth\n if (lastDirection !== foundDirection) {\n // # adding a turn is correct even in the initial\n // case when last_direction is null:\n // # every spatial pattern starts with a turn.\n turns += 1;\n lastDirection = foundDirection;\n }\n break;\n }\n }\n }\n }\n // if the current pattern continued, extend j and try to grow again\n if (found) {\n j += 1;\n // otherwise push the pattern discovered so far, if any...\n } else {\n // don't consider length 1 or 2 chains.\n if (j - i > 2) {\n matches.push({\n pattern: 'spatial',\n i,\n j: j - 1,\n token: password.slice(i, j),\n graph: graphName,\n turns,\n shiftedCount\n });\n }\n // ...and then start a new search for the rest of the password.\n i = j;\n break;\n }\n }\n }\n return matches;\n }\n}\n\nexport { MatchSpatial as default };\n//# sourceMappingURL=matching.mjs.map\n","import { ESCAPE_REGEX, SEPERATOR_CHARS } from '../../data/const.mjs';\nimport { MatcherBaseClass } from '../../types.mjs';\n\nconst separatorRegex = new RegExp(`[${SEPERATOR_CHARS.join('')}]`);\n/*\n *-------------------------------------------------------------------------------\n * separators (any semi-repeated special character) -----------------------------\n *-------------------------------------------------------------------------------\n */\nclass MatchSeparator extends MatcherBaseClass {\n static getMostUsedSeparatorChar(password) {\n const mostUsedSeperators = [...password.split('').filter(c => separatorRegex.test(c)).reduce((memo, c) => {\n const m = memo.get(c);\n if (m) {\n memo.set(c, parseInt(m, 10) + 1);\n } else {\n memo.set(c, 1);\n }\n return memo;\n }, new Map()).entries()].sort(([_a, a], [_b, b]) => b - a);\n if (!mostUsedSeperators.length) return undefined;\n const match = mostUsedSeperators[0];\n // If the special character is only used once, don't treat it like a separator\n if (match[1] < 2) return undefined;\n return match[0];\n }\n static getSeparatorRegex(separator) {\n const escaped = separator.replace(ESCAPE_REGEX, '\\\\$&');\n return new RegExp(`([^${escaped}\\n])(${escaped})(?!${escaped})`, 'g');\n // negative lookbehind can be added again in a few years when it is more supported by the browsers (currently 2023)\n // https://github.com/zxcvbn-ts/zxcvbn/issues/202\n // return new RegExp(`(?<!${separator})(${separator})(?!${separator})`, 'g')\n }\n match({\n password\n }) {\n const result = [];\n if (password.length === 0) return result;\n const mostUsedSpecial = MatchSeparator.getMostUsedSeparatorChar(password);\n if (mostUsedSpecial === undefined) return result;\n const isSeparator = MatchSeparator.getSeparatorRegex(mostUsedSpecial);\n for (const match of password.matchAll(isSeparator)) {\n if (match.index === undefined) continue;\n // add one to the index because we changed the regex from negative lookbehind to something simple.\n // this simple approach uses the first character before the separater too but we only need the index of the separater\n // https://github.com/zxcvbn-ts/zxcvbn/issues/202\n const i = match.index + 1;\n result.push({\n pattern: 'separator',\n token: mostUsedSpecial,\n i,\n j: i\n });\n }\n return result;\n }\n}\n\nexport { MatchSeparator as default };\n//# sourceMappingURL=matching.mjs.map\n","import MatchL33t from '../dictionary/variants/matching/l33t.mjs';\nimport MatchReverse from '../dictionary/variants/matching/reverse.mjs';\nimport MatchDictionary from '../dictionary/matching.mjs';\nimport { MatcherBaseClass } from '../../types.mjs';\n\n/*\n *-------------------------------------------------------------------------------\n * word sequences (oneTwoThree, fourFiveSix) ------------------------------\n *-------------------------------------------------------------------------------\n */\nclass MatchWordSequence extends MatcherBaseClass {\n constructor(options) {\n super(options);\n this.dictionary = new MatchDictionary(this.options, true);\n this.dictionaryL33t = new MatchL33t(this.options, true);\n this.dictionaryReverse = new MatchReverse(this.options, true);\n }\n match(matchOptions) {\n const {\n password\n } = matchOptions;\n // Get all dictionary matches first\n const dictionaryMatches = this.dictionary.match(matchOptions);\n const dictionaryL33tMatches = this.dictionaryL33t.match(matchOptions);\n const dictionaryReverseMatches = this.dictionaryReverse.match(matchOptions);\n const filteredDictionaryMatches = this.filterDictionaryMatches([...dictionaryMatches, ...dictionaryL33tMatches, ...dictionaryReverseMatches]);\n // Convert dictionary matches to our internal format\n const wordMatches = this.convertToWordMatches(filteredDictionaryMatches);\n // Find sequences of consecutive words\n return this.findWordSequences(wordMatches, password);\n }\n filterDictionaryMatches(matches) {\n // sort by start index, then by end index\n return [...matches].sort((a, b) => {\n if (a.i !== b.i) return a.i - b.i;\n if (a.j !== b.j) return a.j - b.j;\n // prefer forward over reversed\n if (a.reversed !== b.reversed) return a.reversed ? 1 : -1;\n // prefer non-l33t\n if (a.l33t !== b.l33t) return a.l33t ? 1 : -1;\n // prefer better rank\n return a.rank - b.rank;\n })\n // Keep only non-overlapping matches, favoring earlier ones\n .reduce((acc, match) => {\n const last = acc[acc.length - 1];\n if (!last || match.i > last.j) {\n acc.push(match);\n }\n return acc;\n }, []);\n }\n convertToWordMatches(dictionaryMatches) {\n return dictionaryMatches.map(match => ({\n word: match.matchedWord,\n i: match.i,\n j: match.j,\n rank: match.rank,\n dictionaryName: match.dictionaryName\n }));\n }\n findWordSequences(wordMatches, password) {\n const sequences = [];\n if (wordMatches.length === 0) {\n return sequences;\n }\n // Sort matches by start position\n const sortedMatches = [...wordMatches].sort((a, b) => a.i - b.i);\n // Find all possible sequences\n for (let startIdx = 0; startIdx < sortedMatches.length; startIdx += 1) {\n const sequencesFromStart = this.findSequencesFromStart(sortedMatches, startIdx, password);\n sequences.push(...sequencesFromStart);\n }\n return sequences;\n }\n // eslint-disable-next-line max-statements\n findSequencesFromStart(sortedMatches, startIdx, password) {\n const sequences = [];\n const startMatch = sortedMatches[startIdx];\n // Start with single word sequence\n let currentSequence = [startMatch];\n let currentEnd = startMatch.j;\n // Try to extend the sequence\n for (let nextIdx = startIdx + 1; nextIdx < sortedMatches.length; nextIdx += 1) {\n const nextMatch = sortedMatches[nextIdx];\n // Only extend if the next word can form a valid sequence\n if (this.isValidWordSequence(currentSequence, nextMatch, password)) {\n currentSequence.push(nextMatch);\n currentEnd = nextMatch.j;\n } else if (nextMatch.i > currentEnd) {\n // Gap found, save current sequence and start new one\n if (currentSequence.length > 1) {\n sequences.push(this.createWordSequenceMatch(currentSequence, password));\n }\n currentSequence = [nextMatch];\n currentEnd = nextMatch.j;\n }\n // If nextMatch.i <= currentEnd, it overlaps, so we skip it\n }\n // Don't forget the last sequence\n if (currentSequence.length > 1) {\n sequences.push(this.createWordSequenceMatch(currentSequence, password));\n }\n return sequences;\n }\n isValidWordSequence(currentSequence, nextMatch, password) {\n // Get the text between the last word and the next word\n const lastWord = currentSequence[currentSequence.length - 1];\n const textBetween = password.slice(lastWord.j + 1, nextMatch.i);\n // Check for common word separators\n const separators = ['', ' ', '-', '_', '.', ''];\n // For simple concatenation (no separator)\n const isSimpleConcat = textBetween === '';\n // For snake_case or kebab-case, check for separators\n const hasValidSeparator = separators.some(sep => textBetween === sep);\n // For camelCase, we need to check if the next word starts with uppercase\n // and there's no separator (or just a single character that could be uppercase)\n const isCamelCase = textBetween.length === 1 && textBetween === textBetween.toUpperCase() && textBetween !== textBetween.toLowerCase();\n return hasValidSeparator || isSimpleConcat || isCamelCase;\n }\n createWordSequenceMatch(sequence, password) {\n const firstMatch = sequence[0];\n const lastMatch = sequence[sequence.length - 1];\n const words = sequence.map(match => match.word);\n // Determine if sequence is ascending (by rank)\n const ranks = sequence.map(match => match.rank);\n const ascending = ranks.every((rank, i) => i === 0 || rank >= ranks[i - 1]);\n // Use the most common dictionary name, or the first one\n const dictionaryNames = sequence.map(match => match.dictionaryName);\n const dictionaryName = this.getMostCommon(dictionaryNames) || firstMatch.dictionaryName;\n return {\n pattern: 'wordSequence',\n i: firstMatch.i,\n j: lastMatch.j,\n token: password.slice(firstMatch.i, lastMatch.j + 1),\n words,\n wordCount: words.length,\n dictionaryName,\n ascending\n };\n }\n getMostCommon(array) {\n if (array.length === 0) return null;\n const counts = new Map();\n let maxCount = 0;\n let mostCommon = null;\n array.forEach(item => {\n const count = (counts.get(item) || 0) + 1;\n counts.set(item, count);\n if (count > maxCount) {\n maxCount = count;\n mostCommon = item;\n }\n });\n return mostCommon;\n }\n}\n\nexport { MatchWordSequence as default };\n//# sourceMappingURL=matching.mjs.map\n","import { extend, sorted } from './utils/helper.mjs';\nimport MatchDate from './matcher/date/matching.mjs';\nimport MatchDictionary from './matcher/dictionary/matching.mjs';\nimport MatchL33t from './matcher/dictionary/variants/matching/l33t.mjs';\nimport MatchReverse from './matcher/dictionary/variants/matching/reverse.mjs';\nimport MatchRegex from './matcher/regex/matching.mjs';\nimport MatchRepeat from './matcher/repeat/matching.mjs';\nimport MatchSequence from './matcher/sequence/matching.mjs';\nimport MatchSpatial from './matcher/spatial/matching.mjs';\nimport MatchSeparator from './matcher/separator/matching.mjs';\nimport MatchWordSequence from './matcher/wordSequence/matching.mjs';\n\n/*\n * -------------------------------------------------------------------------------\n * Omnimatch combine matchers ---------------------------------------------------------------\n * -------------------------------------------------------------------------------\n */\nclass Matching {\n constructor(options) {\n this.options = options;\n this.matchers = {};\n this.matchers = {\n date: new MatchDate(this.options),\n dictionary: new MatchDictionary(this.options),\n dictionaryL33t: new MatchL33t(this.options),\n dictionaryReverse: new MatchReverse(this.options),\n regex: new MatchRegex(this.options),\n repeat: new MatchRepeat(this.options),\n sequence: new MatchSequence(this.options),\n spatial: new MatchSpatial(this.options),\n separator: new MatchSeparator(this.options),\n wordSequence: new MatchWordSequence(this.options)\n };\n Object.entries(this.options.matchers).forEach(([key, Matcher]) => {\n this.matchers[key] = new Matcher.Matching(this.options);\n });\n }\n processResult(matches, promises, result) {\n if (result instanceof Promise) {\n const wrappedPromise = result.then(response => {\n extend(matches, response);\n return response;\n });\n promises.push(wrappedPromise);\n } else {\n extend(matches, result);\n }\n }\n handlePromises(matches, promises) {\n if (promises.length > 0) {\n return new Promise((resolve, reject) => {\n Promise.all(promises).then(() => {\n resolve(sorted(matches));\n }).catch(error => {\n // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors\n reject(error);\n });\n });\n }\n return sorted(matches);\n }\n match(password, userInputsOptions) {\n const matches = [];\n const promises = [];\n Object.values(this.matchers).forEach(matcher => {\n const result = matcher.match({\n password,\n omniMatch: this,\n userInputsOptions\n });\n // extends matches and promises by references\n this.processResult(matches, promises, result);\n });\n return this.handlePromises(matches, promises);\n }\n}\n\nexport { Matching as default };\n//# sourceMappingURL=Matching.mjs.map\n","const SECOND = 1;\nconst MINUTE = SECOND * 60;\nconst HOUR = MINUTE * 60;\nconst DAY = HOUR * 24;\nconst MONTH = DAY * 31;\nconst YEAR = MONTH * 12;\nconst CENTURY = YEAR * 100;\nconst times = {\n second: SECOND,\n minute: MINUTE,\n hour: HOUR,\n day: DAY,\n month: MONTH,\n year: YEAR,\n century: CENTURY\n};\nconst timeEstimationValuesDefaults = {\n scoring: {\n 0: 1e3,\n 1: 1e6,\n 2: 1e8,\n 3: 1e10\n },\n attackTime: {\n onlineThrottlingXPerHour: 100,\n onlineNoThrottlingXPerSecond: 10,\n offlineSlowHashingXPerSecond: 1e4,\n offlineFastHashingXPerSecond: 1e10\n }\n};\n/*\n * -------------------------------------------------------------------------------\n * Estimates time for an attacker ---------------------------------------------------------------\n * -------------------------------------------------------------------------------\n */\nclass TimeEstimates {\n constructor(options) {\n this.options = options;\n }\n estimateAttackTimes(guesses) {\n const crackTimesSeconds = this.calculateCrackTimesSeconds(guesses);\n const crackTimes = {};\n Object.keys(crackTimesSeconds).forEach(crackTime => {\n const usedScenario = crackTime;\n const seconds = crackTimesSeconds[usedScenario];\n const {\n base,\n displayStr\n } = this.displayTime(seconds);\n crackTimes[usedScenario] = {\n base,\n seconds,\n display: this.translate(displayStr, base)\n };\n });\n return {\n crackTimes,\n score: this.guessesToScore(guesses)\n };\n }\n calculateCrackTimesSeconds(guesses) {\n const attackTimesOptions = this.options.timeEstimationValues.attackTime;\n return {\n onlineThrottlingXPerHour: guesses / (attackTimesOptions.onlineThrottlingXPerHour / 3600),\n onlineNoThrottlingXPerSecond: guesses / attackTimesOptions.onlineNoThrottlingXPerSecond,\n offlineSlowHashingXPerSecond: guesses / attackTimesOptions.offlineSlowHashingXPerSecond,\n offlineFastHashingXPerSecond: guesses / attackTimesOptions.offlineFastHashingXPerSecond\n };\n }\n guessesToScore(guesses) {\n const scoringOptions = this.options.timeEstimationValues.scoring;\n const DELTA = 5;\n if (guesses < scoringOptions[0] + DELTA) {\n // risky password: \"too guessable\"\n return 0;\n }\n if (guesses < scoringOptions[1] + DELTA) {\n // modest protection from throttled online attacks: \"very guessable\"\n return 1;\n }\n if (guesses < scoringOptions[2] + DELTA) {\n // modest protection from unthrottled online attacks: \"somewhat guessable\"\n return 2;\n }\n if (guesses < scoringOptions[3] + DELTA) {\n // modest protection from offline attacks: \"safely unguessable\"\n // assuming a salted, slow hash function like bcrypt, scrypt, PBKDF2, argon, etc\n return 3;\n }\n // strong protection from offline attacks under same scenario: \"very unguessable\"\n return 4;\n }\n displayTime(seconds) {\n let displayStr = 'centuries';\n let base = null;\n const timeKeys = Object.keys(times);\n const foundIndex = timeKeys.findIndex(time => seconds < times[time]);\n if (foundIndex > -1) {\n displayStr = timeKeys[foundIndex - 1];\n if (foundIndex !== 0) {\n base = Math.round(seconds / times[displayStr]);\n } else {\n displayStr = 'ltSecond';\n }\n }\n return {\n base,\n displayStr\n };\n }\n translate(displayStr, value) {\n let key = displayStr;\n if (value !== null && value !== 1) {\n key += 's';\n }\n const {\n timeEstimation\n } = this.options.translations;\n const translation = timeEstimation[key];\n if (typeof translation === 'function') {\n return translation(value);\n }\n return translation.replace('{base}', `${value}`);\n }\n}\n\nexport { TimeEstimates, timeEstimationValuesDefaults };\n//# sourceMappingURL=TimeEstimates.mjs.map\n","var bruteforceMatcher = () => {\n return null;\n};\n\nexport { bruteforceMatcher as default };\n//# sourceMappingURL=feedback.mjs.map\n","var dateMatcher = options => {\n return {\n warning: options.translations.warnings.dates,\n suggestions: [options.translations.suggestions.dates]\n };\n};\n\nexport { dateMatcher as default };\n//# sourceMappingURL=feedback.mjs.map\n","import { START_UPPER, ALL_UPPER_INVERTED } from '../../data/const.mjs';\n\nconst getDictionaryWarningPassword = (options, match, isSoleMatch) => {\n let warning = null;\n if (isSoleMatch && !match.l33t && !match.reversed) {\n if (match.rank <= 10) {\n warning = options.translations.warnings.topTen;\n } else if (match.rank <= 100) {\n warning = options.translations.warnings.topHundred;\n } else {\n warning = options.translations.warnings.common;\n }\n } else if (match.guessesLog10 <= 4) {\n warning = options.translations.warnings.similarToCommon;\n }\n return warning;\n};\nconst getDictionaryWarningWikipedia = (options, match, isSoleMatch) => {\n let warning = null;\n if (isSoleMatch) {\n warning = options.translations.warnings.wordByItself;\n }\n return warning;\n};\nconst getDictionaryWarningNames = (options, match, isSoleMatch) => {\n if (isSoleMatch) {\n return options.translations.warnings.namesByThemselves;\n }\n return options.translations.warnings.commonNames;\n};\nconst getDictionaryWarning = (options, match, isSoleMatch) => {\n const dictName = match.dictionaryName;\n const isAName = dictName.toLowerCase().includes('lastnames') || dictName.toLowerCase().includes('firstnames') || dictName.toLowerCase().includes('names');\n if (dictName.includes('passwords')) {\n return getDictionaryWarningPassword(options, match, isSoleMatch);\n }\n if (dictName.includes('wikipedia')) {\n return getDictionaryWarningWikipedia(options, match, isSoleMatch);\n }\n if (isAName) {\n return getDictionaryWarningNames(options, match, isSoleMatch);\n }\n if (dictName.includes('userInputs')) {\n return options.translations.warnings.userInputs;\n }\n return null;\n};\nvar dictionaryMatcher = (options, match, isSoleMatch) => {\n const warning = getDictionaryWarning(options, match, isSoleMatch);\n const suggestions = [];\n const word = match.token;\n if (word.match(START_UPPER)) {\n suggestions.push(options.translations.suggestions.capitalization);\n } else if (word.match(ALL_UPPER_INVERTED) && word.toLowerCase() !== word) {\n suggestions.push(options.translations.suggestions.allUppercase);\n }\n if (match.reversed && match.token.length >= 4) {\n suggestions.push(options.translations.suggestions.reverseWords);\n }\n if (match.l33t) {\n suggestions.push(options.translations.suggestions.l33t);\n }\n return {\n warning,\n suggestions\n };\n};\n\nexport { dictionaryMatcher as default };\n//# sourceMappingURL=feedback.mjs.map\n","var regexMatcher = (options, match) => {\n if (match.regexName === 'recentYear') {\n return {\n warning: options.translations.warnings.recentYears,\n suggestions: [options.translations.suggestions.recentYears, options.translations.suggestions.associatedYears]\n };\n }\n return {\n warning: null,\n suggestions: []\n };\n};\n\nexport { regexMatcher as default };\n//# sourceMappingURL=feedback.mjs.map\n","var repeatMatcher = (options, match) => {\n let warning = options.translations.warnings.extendedRepeat;\n if (match.baseToken.length === 1) {\n warning = options.translations.warnings.simpleRepeat;\n }\n return {\n warning,\n suggestions: [options.translations.suggestions.repeated]\n };\n};\n\nexport { repeatMatcher as default };\n//# sourceMappingURL=feedback.mjs.map\n","var sequenceMatcher = options => {\n return {\n warning: options.translations.warnings.sequences,\n suggestions: [options.translations.suggestions.sequences]\n };\n};\n\nexport { sequenceMatcher as default };\n//# sourceMappingURL=feedback.mjs.map\n","var spatialMatcher = (options, match) => {\n let warning = options.translations.warnings.keyPattern;\n if (match.turns === 1) {\n warning = options.translations.warnings.straightRow;\n }\n return {\n warning,\n suggestions: [options.translations.suggestions.longerKeyboardPattern]\n };\n};\n\nexport { spatialMatcher as default };\n//# sourceMappingURL=feedback.mjs.map\n","var separatorMatcher = () => {\n // no suggestions\n return null;\n};\n\nexport { separatorMatcher as default };\n//# sourceMappingURL=feedback.mjs.map\n","var wordSequenceMatcher = (options, match) => {\n if (match.pattern !== 'wordSequence') {\n return null;\n }\n let warning = null;\n const suggestions = [];\n // Warning for common word sequences\n if (match.wordCount >= 3) {\n warning = options.translations.warnings.sequences;\n }\n // Suggestions based on sequence characteristics\n if (match.ascending) {\n suggestions.push(options.translations.suggestions.sequences);\n } else {\n suggestions.push(options.translations.suggestions.anotherWord);\n }\n if (match.wordCount > 2) {\n suggestions.push(options.translations.suggestions.useWords);\n }\n return {\n warning,\n suggestions\n };\n};\n\nexport { wordSequenceMatcher as default };\n//# sourceMappingURL=feedback.mjs.map\n","import bruteforceMatcher from './matcher/bruteforce/feedback.mjs';\nimport dateMatcher from './matcher/date/feedback.mjs';\nimport dictionaryMatcher from './matcher/dictionary/feedback.mjs';\nimport regexMatcher from './matcher/regex/feedback.mjs';\nimport repeatMatcher from './matcher/repeat/feedback.mjs';\nimport sequenceMatcher from './matcher/sequence/feedback.mjs';\nimport spatialMatcher from './matcher/spatial/feedback.mjs';\nimport separatorMatcher from './matcher/separator/feedback.mjs';\nimport wordSequenceMatcher from './matcher/wordSequence/feedback.mjs';\n\nconst createFeedback = suggestions => ({\n warning: null,\n suggestions: suggestions !== null && suggestions !== void 0 ? suggestions : []\n});\n/*\n * -------------------------------------------------------------------------------\n * Generate feedback ---------------------------------------------------------------\n * -------------------------------------------------------------------------------\n */\nclass Feedback {\n constructor(options) {\n this.options = options;\n this.matchers = {};\n this.matchers = {\n bruteforce: bruteforceMatcher,\n date: dateMatcher,\n dictionary: dictionaryMatcher,\n regex: regexMatcher,\n repeat: repeatMatcher,\n sequence: sequenceMatcher,\n spatial: spatialMatcher,\n separator: separatorMatcher,\n wordSequence: wordSequenceMatcher\n };\n Object.entries(this.options.matchers).forEach(([key, matcher]) => {\n if (matcher.feedback) {\n this.matchers[key] = matcher.feedback;\n }\n });\n }\n getFeedback(score, sequence) {\n if (sequence.length === 0) {\n return createFeedback([this.options.translations.suggestions.useWords, this.options.translations.suggestions.noNeed]);\n }\n if (score > 2) {\n return createFeedback();\n }\n const extraFeedback = this.options.translations.suggestions.anotherWord;\n const longestMatch = this.getLongestMatch(sequence);\n let feedback = this.getMatchFeedback(longestMatch, sequence.length === 1);\n if (feedback !== null && feedback !== undefined) {\n feedback.suggestions.unshift(extraFeedback);\n } else {\n feedback = createFeedback([extraFeedback]);\n }\n return feedback;\n }\n getLongestMatch(sequence) {\n let longestMatch = sequence[0];\n // ignore first entry\n for (let i = 1; i < sequence.length; i += 1) {\n const match = sequence[i];\n if (match.token.length > longestMatch.token.length) {\n longestMatch = match;\n }\n }\n return longestMatch;\n }\n getMatchFeedback(match, isSoleMatch) {\n if (this.matchers[match.pattern]) {\n return this.matchers[match.pattern](this.options, match, isSoleMatch);\n }\n return createFeedback();\n }\n}\n\nexport { Feedback as default };\n//# sourceMappingURL=Feedback.mjs.map\n","var l33tTable = {\n a: ['4', '@'],\n b: ['8'],\n c: ['(', '{', '[', '<'],\n d: ['6', '|)'],\n e: ['3'],\n f: ['#'],\n g: ['6', '9', '&'],\n h: ['#', '|-|'],\n i: ['1', '!', '|'],\n k: ['<', '|<'],\n l: ['!', '1', '|', '7'],\n m: ['^^', 'nn', '2n', '/\\\\\\\\/\\\\\\\\'],\n n: ['//'],\n o: ['0', '()'],\n q: ['9'],\n u: ['|_|'],\n s: ['$', '5'],\n t: ['+', '7'],\n v: ['<', '>', '/'],\n w: ['^/', 'uu', 'vv', '2u', '2v', '\\\\\\\\/\\\\\\\\/'],\n x: ['%', '><'],\n z: ['2']\n};\n\nexport { l33tTable as default };\n//# sourceMappingURL=l33tTable.mjs.map\n","var translationKeys = {\n warnings: {\n straightRow: 'straightRow',\n keyPattern: 'keyPattern',\n simpleRepeat: 'simpleRepeat',\n extendedRepeat: 'extendedRepeat',\n sequences: 'sequences',\n recentYears: 'recentYears',\n dates: 'dates',\n topTen: 'topTen',\n topHundred: 'topHundred',\n common: 'common',\n similarToCommon: 'similarToCommon',\n wordByItself: 'wordByItself',\n namesByThemselves: 'namesByThemselves',\n commonNames: 'commonNames',\n userInputs: 'userInputs',\n pwned: 'pwned'\n },\n suggestions: {\n l33t: 'l33t',\n reverseWords: 'reverseWords',\n allUppercase: 'allUppercase',\n capitalization: 'capitalization',\n dates: 'dates',\n recentYears: 'recentYears',\n associatedYears: 'associatedYears',\n sequences: 'sequences',\n repeated: 'repeated',\n longerKeyboardPattern: 'longerKeyboardPattern',\n anotherWord: 'anotherWord',\n useWords: 'useWords',\n noNeed: 'noNeed',\n pwned: 'pwned'\n },\n timeEstimation: {\n ltSecond: 'ltSecond',\n second: 'second',\n seconds: 'seconds',\n minute: 'minute',\n minutes: 'minutes',\n hour: 'hour',\n hours: 'hours',\n day: 'day',\n days: 'days',\n month: 'month',\n months: 'months',\n year: 'year',\n years: 'years',\n centuries: 'centuries'\n }\n};\n\nexport { translationKeys as default };\n//# sourceMappingURL=translationKeys.mjs.map\n","class TrieNode {\n constructor(parents = []) {\n this.parents = parents;\n this.children = new Map();\n }\n addSub(key, ...subs) {\n const firstChar = key.charAt(0);\n if (!this.children.has(firstChar)) {\n this.children.set(firstChar, new TrieNode([...this.parents, firstChar]));\n }\n let cur = this.children.get(firstChar);\n for (let i = 1; i < key.length; i += 1) {\n const c = key.charAt(i);\n if (!cur.hasChild(c)) {\n cur.addChild(c);\n }\n cur = cur.getChild(c);\n }\n cur.subs = (cur.subs || []).concat(subs);\n return this;\n }\n getChild(child) {\n return this.children.get(child);\n }\n isTerminal() {\n return !!this.subs;\n }\n addChild(child) {\n if (!this.hasChild(child)) {\n this.children.set(child, new TrieNode([...this.parents, child]));\n }\n }\n hasChild(child) {\n return this.children.has(child);\n }\n}\n\nexport { TrieNode as default };\n//# sourceMappingURL=TrieNode.mjs.map\n","var l33tTableToTrieNode = (l33tTable, triNode) => {\n Object.entries(l33tTable).forEach(([letter, substitutions]) => {\n substitutions.forEach(substitution => {\n triNode.addSub(substitution, letter);\n });\n });\n return triNode;\n};\n\nexport { l33tTableToTrieNode as default };\n//# sourceMappingURL=l33tTableToTrieNode.mjs.map\n","import translationKeys from './data/translationKeys.mjs';\nimport { timeEstimationValuesDefaults } from './TimeEstimates.mjs';\n\nconst checkL33tTable = l33tTable => {\n if (typeof l33tTable !== 'object' || l33tTable === null) {\n throw new Error('l33tTable must be an object');\n }\n Object.values(l33tTable).forEach(substitutions => {\n if (!Array.isArray(substitutions)) {\n throw new Error('l33tTable substitutions must be an array');\n }\n substitutions.forEach(substitution => {\n if (typeof substitution !== 'string') {\n throw new Error('l33tTable substitutions must be strings');\n }\n });\n });\n};\nconst checkDictionary = dictionary => {\n if (typeof dictionary !== 'object' || dictionary === null) {\n throw new Error('dictionary must be an object');\n }\n Object.values(dictionary).forEach(list => {\n if (!Array.isArray(list)) {\n throw new Error('dictionary list must be an array');\n }\n list.forEach(el => {\n if (typeof el !== 'string' && typeof el !== 'number') {\n throw new Error('dictionary entries must be strings or numbers');\n }\n });\n });\n};\nconst checkGraphs = graphs => {\n if (typeof graphs !== 'object' || graphs === null) {\n throw new Error('graphs must be an object');\n }\n Object.values(graphs).forEach(graph => {\n if (typeof graph !== 'object' || graph === null) {\n throw new Error('graph must be an object');\n }\n Object.values(graph).forEach(adjacencies => {\n if (!Array.isArray(adjacencies)) {\n throw new Error('graph adjacencies must be an array');\n }\n adjacencies.forEach(adjacency => {\n if (typeof adjacency !== 'string' && adjacency !== null) {\n throw new Error('graph adjacency must be a string or null');\n }\n });\n });\n });\n};\nconst checkUseLevenshteinDistance = useLevenshteinDistance => {\n if (typeof useLevenshteinDistance !== 'boolean') {\n throw new Error('useLevenshteinDistance must be a boolean');\n }\n};\nconst checkLevenshteinThreshold = levenshteinThreshold => {\n if (typeof levenshteinThreshold !== 'number' || levenshteinThreshold < 0) {\n throw new Error('levenshteinThreshold must be a non-negative number');\n }\n};\nconst checkL33tMaxSubstitutions = l33tMaxSubstitutions => {\n if (typeof l33tMaxSubstitutions !== 'number' || l33tMaxSubstitutions < 0) {\n throw new Error('l33tMaxSubstitutions must be a non-negative number');\n }\n};\nconst checkMaxLength = maxLength => {\n if (typeof maxLength !== 'number' || maxLength < 0) {\n throw new Error('maxLength must be a non-negative number');\n }\n};\nconst checkMatcher = (name, matcher) => {\n if (typeof name !== 'string') {\n throw new Error('matcher name must be a string');\n }\n if (typeof matcher !== 'object' || matcher === null) {\n throw new Error(`matcher ${name} must be an object`);\n }\n if (typeof matcher.feedback !== 'function') {\n throw new Error(`matcher ${name}.feedback must be a function`);\n }\n if (typeof matcher.scoring !== 'function') {\n throw new Error(`matcher ${name}.scoring must be a function`);\n }\n if (typeof matcher.Matching !== 'function') {\n throw new Error(`matcher ${name}.Matching must be a constructor`);\n }\n};\nconst checkCustomMatchers = customMatchers => {\n if (typeof customMatchers !== 'object' || customMatchers === null) {\n throw new Error('customMatchers must be an object');\n }\n};\nconst checkCustomTranslations = translations => {\n let valid = true;\n Object.keys(translationKeys).forEach(type => {\n if (type in translations) {\n const translationType = type;\n Object.keys(translationKeys[translationType]).forEach(key => {\n if (!(key in translations[translationType])) {\n valid = false;\n }\n const translation = translations[translationType][key];\n if (typeof translation !== 'string' && typeof translation !== 'function') {\n valid = false;\n }\n });\n } else {\n valid = false;\n }\n });\n return valid;\n};\nconst checkTimeEstimationValues = timeEstimationValues => {\n if (typeof timeEstimationValues !== 'object' || timeEstimationValues === null) {\n throw new Error('timeEstimationValues must be an object');\n }\n Object.keys(timeEstimationValuesDefaults).forEach(key => {\n if (!(key in timeEstimationValues)) {\n throw new Error(`timeEstimationValues.${key} is required`);\n }\n const data = timeEstimationValues[key];\n if (typeof data !== 'object' || data === null) {\n throw new Error(`timeEstimationValues.${key} must be an object`);\n }\n Object.keys(timeEstimationValuesDefaults[key]).forEach(subKey => {\n if (!(subKey in data)) {\n throw new Error(`timeEstimationValues.${key}.${subKey} is required`);\n }\n const value = data[subKey];\n if (typeof value !== 'number') {\n throw new Error(`timeEstimationValues.${key}.${subKey} must be a number`);\n }\n if (value < timeEstimationValuesDefaults[key][subKey]) {\n throw new Error('Time estimation values are not to be allowed to be less than default');\n }\n });\n });\n};\n\nexport { checkCustomMatchers, checkCustomTranslations, checkDictionary, checkGraphs, checkL33tMaxSubstitutions, checkL33tTable, checkLevenshteinThreshold, checkMatcher, checkMaxLength, checkTimeEstimationValues, checkUseLevenshteinDistance };\n//# sourceMappingURL=runtimeChecks.mjs.map\n","import { buildRankedDictionary } from './utils/helper.mjs';\nimport l33tTable from './data/l33tTable.mjs';\nimport translationKeys from './data/translationKeys.mjs';\nimport TrieNode from './matcher/dictionary/variants/matching/unmunger/TrieNode.mjs';\nimport l33tTableToTrieNode from './matcher/dictionary/variants/matching/unmunger/l33tTableToTrieNode.mjs';\nimport { timeEstimationValuesDefaults } from './TimeEstimates.mjs';\nimport { checkCustomMatchers, checkMatcher, checkL33tTable, checkDictionary, checkGraphs, checkUseLevenshteinDistance, checkLevenshteinThreshold, checkL33tMaxSubstitutions, checkMaxLength, checkTimeEstimationValues, checkCustomTranslations } from './runtimeChecks.mjs';\n\nclass Options {\n constructor(options = {}, customMatchers = {}) {\n this.matchers = {};\n this.l33tTable = l33tTable;\n this.trieNodeRoot = l33tTableToTrieNode(l33tTable, new TrieNode());\n this.dictionary = {\n userInputs: []\n };\n this.rankedDictionaries = {};\n this.rankedDictionariesMaxWordSize = {};\n this.translations = translationKeys;\n this.graphs = {};\n this.useLevenshteinDistance = false;\n this.levenshteinThreshold = 2;\n this.l33tMaxSubstitutions = 100;\n this.maxLength = 256;\n this.wordSequenceNames = ['cardinalNumbers', 'ordinalNumbers', 'daysOfWeek', 'months', 'seasons', 'timePeriods', 'rainbowColors', 'directions', 'intermediateDirections', 'sizeProgression', 'militaryAlphabet', 'planets', 'zodiacSigns', 'chineseZodiac'];\n this.timeEstimationValues = {\n scoring: {\n ...timeEstimationValuesDefaults.scoring\n },\n attackTime: {\n ...timeEstimationValuesDefaults.attackTime\n }\n };\n checkCustomMatchers(customMatchers);\n this.setOptions(options);\n Object.entries(customMatchers).forEach(([name, matcher]) => {\n checkMatcher(name, matcher);\n this.addMatcher(name, matcher);\n });\n }\n isWordSequence(key) {\n return this.wordSequenceNames.some(name => key === name || key.startsWith(`${name}-`));\n }\n // eslint-disable-next-line max-statements,complexity\n setOptions(options = {}) {\n if (options.l33tTable) {\n checkL33tTable(options.l33tTable);\n this.l33tTable = options.l33tTable;\n this.trieNodeRoot = l33tTableToTrieNode(options.l33tTable, new TrieNode());\n }\n if (options.dictionary) {\n checkDictionary(options.dictionary);\n this.dictionary = options.dictionary;\n this.setRankedDictionaries();\n }\n if (options.translations) {\n this.setTranslations(options.translations);\n }\n if (options.graphs) {\n checkGraphs(options.graphs);\n this.graphs = options.graphs;\n }\n if (options.useLevenshteinDistance !== undefined) {\n checkUseLevenshteinDistance(options.useLevenshteinDistance);\n this.useLevenshteinDistance = options.useLevenshteinDistance;\n }\n if (options.levenshteinThreshold !== undefined) {\n checkLevenshteinThreshold(options.levenshteinThreshold);\n this.levenshteinThreshold = options.levenshteinThreshold;\n }\n if (options.l33tMaxSubstitutions !== undefined) {\n checkL33tMaxSubstitutions(options.l33tMaxSubstitutions);\n this.l33tMaxSubstitutions = options.l33tMaxSubstitutions;\n }\n if (options.maxLength !== undefined) {\n checkMaxLength(options.maxLength);\n this.maxLength = options.maxLength;\n }\n if (options.timeEstimationValues !== undefined) {\n checkTimeEstimationValues(options.timeEstimationValues);\n this.timeEstimationValues = {\n scoring: {\n ...options.timeEstimationValues.scoring\n },\n attackTime: {\n ...options.timeEstimationValues.attackTime\n }\n };\n }\n }\n setTranslations(translations) {\n if (checkCustomTranslations(translations)) {\n this.translations = translations;\n } else {\n throw new Error('Invalid translations object fallback to keys');\n }\n }\n setRankedDictionaries() {\n const rankedDictionaries = {};\n const rankedDictionariesMaxWorkSize = {};\n Object.keys(this.dictionary).forEach(name => {\n rankedDictionaries[name] = buildRankedDictionary(this.dictionary[name]);\n rankedDictionariesMaxWorkSize[name] = this.getRankedDictionariesMaxWordSize(this.dictionary[name]);\n });\n this.rankedDictionaries = rankedDictionaries;\n this.rankedDictionariesMaxWordSize = rankedDictionariesMaxWorkSize;\n }\n getRankedDictionariesMaxWordSize(list) {\n const data = list.map(el => {\n if (typeof el !== 'string') {\n return el.toString().length;\n }\n return el.length;\n });\n // do not use Math.max(...data) because it can result in max stack size error because every entry will be used as an argument\n if (data.length === 0) {\n return 0;\n }\n return data.reduce((a, b) => Math.max(a, b), -Infinity);\n }\n buildSanitizedRankedDictionary(list) {\n const sanitizedInputs = [];\n list.forEach(input => {\n const inputType = typeof input;\n if (inputType === 'string' || inputType === 'number' || inputType === 'boolean') {\n sanitizedInputs.push(input.toString().toLowerCase());\n }\n });\n return buildRankedDictionary(sanitizedInputs);\n }\n getUserInputsOptions(dictionary) {\n let rankedDictionary = {};\n let rankedDictionaryMaxWordSize = 0;\n if (dictionary) {\n rankedDictionary = this.buildSanitizedRankedDictionary(dictionary);\n rankedDictionaryMaxWordSize = this.getRankedDictionariesMaxWordSize(dictionary);\n }\n return {\n rankedDictionary,\n rankedDictionaryMaxWordSize\n };\n }\n addMatcher(name, matcher) {\n if (this.matchers[name]) {\n console.info(`Matcher ${name} already exists`);\n } else {\n this.matchers[name] = matcher;\n }\n }\n}\n\nexport { Options as default };\n//# sourceMappingURL=Options.mjs.map\n","/**\n * @link https://davidwalsh.name/javascript-debounce-function\n * @param func needs to implement a function which is debounced\n * @param wait how long do you want to wait till the previous declared function is executed\n * @param isImmediate defines if you want to execute the function on the first execution or the last execution inside the time window. `true` for first and `false` for last.\n */\nvar debounce = (func, wait, isImmediate) => {\n let timeout;\n return function debounce(...args) {\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const context = this;\n const later = () => {\n timeout = undefined;\n if (!isImmediate) {\n func.apply(context, args);\n }\n };\n const shouldCallNow = isImmediate && !timeout;\n if (timeout !== undefined) {\n clearTimeout(timeout);\n }\n timeout = setTimeout(later, wait);\n if (shouldCallNow) {\n func.apply(context, args);\n return;\n }\n return undefined;\n };\n};\n\nexport { debounce as default };\n//# sourceMappingURL=debounce.mjs.map\n","import Matching from './Matching.mjs';\nimport { TimeEstimates } from './TimeEstimates.mjs';\nimport Feedback from './Feedback.mjs';\nimport Options from './Options.mjs';\nexport { default as debounce } from './utils/debounce.mjs';\nimport Scoring from './scoring/index.mjs';\nexport { MatcherBaseClass } from './types.mjs';\n\nconst time = () => new Date().getTime();\nclass ZxcvbnFactory {\n constructor(options = {}, customMatchers = {}) {\n this.options = new Options(options, customMatchers);\n this.scoring = new Scoring(this.options);\n this.matching = new Matching(this.options);\n this.feedback = new Feedback(this.options);\n this.timeEstimates = new TimeEstimates(this.options);\n }\n estimateAttackTimes(guesses) {\n return this.timeEstimates.estimateAttackTimes(guesses);\n }\n getFeedback(score, sequence) {\n return this.feedback.getFeedback(score, sequence);\n }\n createReturnValue(resolvedMatches, password, start) {\n const matchSequence = this.scoring.mostGuessableMatchSequence(password, resolvedMatches);\n const calcTime = time() - start;\n const attackTimes = this.estimateAttackTimes(matchSequence.guesses);\n return {\n calcTime,\n ...matchSequence,\n ...attackTimes,\n feedback: this.getFeedback(attackTimes.score, matchSequence.sequence)\n };\n }\n main(password, userInputs) {\n const userInputsOptions = this.options.getUserInputsOptions(userInputs);\n return this.matching.match(password, userInputsOptions);\n }\n check(password, userInputs) {\n const reducedPassword = password.substring(0, this.options.maxLength);\n const start = time();\n const matches = this.main(reducedPassword, userInputs);\n if (matches instanceof Promise) {\n throw new Error('You are using a Promised matcher, please use `zxcvbnAsync` for it.');\n }\n return this.createReturnValue(matches, reducedPassword, start);\n }\n async checkAsync(password, userInputs) {\n const reducedPassword = password.substring(0, this.options.maxLength);\n const start = time();\n const matches = await this.main(reducedPassword, userInputs);\n return this.createReturnValue(matches, reducedPassword, start);\n }\n}\n\nexport { Options, ZxcvbnFactory };\n//# sourceMappingURL=index.mjs.map\n"],"x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51],"mappings":"AAAA,IAAM,GAAU,EAAc,IAE9B,EAAa,KAAK,MAAM,EAAc,CAAI,EAEpC,EAAS,GAAW,EAAQ,MAAM,EAAI,IAAO,EAAG,EAAI,EAAG,GAAK,EAAG,EAAI,EAAG,CAAC,EACvE,EAAwB,GAAe,CAC3C,IAAM,EAAS,CAAC,EACZ,EAAU,EAKd,OAJA,EAAY,QAAQ,GAAQ,CAC1B,EAAO,GAAQ,EACf,GAAW,CACb,CAAC,EACM,CACT,EETM,EAAc,CDHlB,EAAG,CAEH,CAAC,EAAG,CAAC,EAEL,CAAC,EAAG,CAAC,CACL,EACA,EAAG,CAAC,CAAC,EAAG,CAAC,EAET,CAAC,EAAG,CAAC,EAGL,CAAC,EAAG,CAAC,CACL,EACA,EAAG,CAAC,CAAC,EAAG,CAAC,EAET,CAAC,EAAG,CAAC,EAEL,CAAC,EAAG,CAAC,CACL,EAEA,EAAG,CAAC,CAAC,EAAG,CAAC,EAET,CAAC,EAAG,CAAC,EAEL,CAAC,EAAG,CAAC,EAEL,CAAC,EAAG,CAAC,CACL,EACA,EAAG,CAAC,CAAC,EAAG,CAAC,EAET,CAAC,EAAG,CAAC,CACL,CC5BkB,EAEd,EAAsC,IAKtC,EAAc,mCACd,EAAY,mCAEZ,EAAY,oBACZ,EAAqB,qBACrB,EAAY,oBACZ,EAAqB,qBACrB,EAAY,iBACZ,EAAY,iBACZ,EAAiB,uBACjB,EAAY,QACZ,EAAiB,IAAI,KAAK,CAAA,CAAE,YAAY,EACxC,EAAU,CACd,WAAY,2BACd,EAEM,EAAkB,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KAAM,IAAK,IAAK,GAAG,EACpE,GAAuB,EAAgB,OACvC,GAAe,sBC7Bf,EAAN,KAAuB,CACrB,YAAY,EAAS,CACnB,KAAK,QAAU,CACjB,CACF,ECKM,GAAN,cAAwB,CAAiB,CAqBvC,MAAM,CACJ,YACC,CACD,IAAM,EAAU,CAAC,GAAG,KAAK,2BAA2B,CAAQ,EAAG,GAAG,KAAK,wBAAwB,CAAQ,CAAC,EAExG,OAAO,EADiB,KAAK,YAAY,CACb,CAAC,CAC/B,CACA,wBAAwB,EAAU,CAChC,IAAM,EAAU,CAAC,EACX,EAAyB,8CAE/B,IAAK,IAAI,EAAI,EAAG,GAAK,KAAK,IAAI,EAAS,OAAS,CAAC,EAAG,GAAK,EACvD,IAAK,IAAI,EAAI,EAAI,EAAG,GAAK,EAAI,GACvB,KAAK,EAAS,QADY,GAAK,EAAG,CAItC,IAAM,EAAQ,EAAS,MAAM,EAAG,EAAI,GAAK,GAAG,EACtC,EAAa,EAAuB,KAAK,CAAK,EACpD,GAAI,GAAc,KAAM,CACtB,IAAM,EAAM,KAAK,0BAA0B,CAAC,SAAS,EAAW,GAAI,EAAE,EAAG,SAAS,EAAW,GAAI,EAAE,EAAG,SAAS,EAAW,GAAI,EAAE,CAAC,CAAC,EAC9H,GAAO,MACT,EAAQ,KAAK,CACX,QAAS,OACT,QACA,IACA,IACA,UAAW,EAAW,GACtB,KAAM,EAAI,KACV,MAAO,EAAI,MACX,IAAK,EAAI,GACX,CAAC,CAEL,CACF,CAEF,OAAO,CACT,CAEA,2BAA2B,EAAU,CACnC,IAAM,EAAU,CAAC,EACX,EAAuB,YACvB,EAAS,GAAa,KAAK,IAAI,EAAU,KAAO,CAAc,EAEpE,IAAK,IAAI,EAAI,EAAG,GAAK,KAAK,IAAI,EAAS,OAAS,CAAC,EAAG,GAAK,EACvD,IAAK,IAAI,EAAI,EAAI,EAAG,GAAK,EAAI,GACvB,KAAK,EAAS,QADY,GAAK,EAAG,CAItC,IAAM,EAAQ,EAAS,MAAM,EAAG,EAAI,GAAK,GAAG,EAC5C,GAAI,EAAqB,KAAK,CAAK,EAAG,CACpC,IAAM,EAAa,CAAC,EASpB,GANA,EAFc,EAAM,OAEP,CAAC,SAAS,CAAC,EAAG,KAAO,CAChC,IAAM,EAAM,KAAK,0BAA0B,CAAC,SAAS,EAAM,MAAM,EAAG,CAAC,EAAG,EAAE,EAAG,SAAS,EAAM,MAAM,EAAG,CAAC,EAAG,EAAE,EAAG,SAAS,EAAM,MAAM,CAAC,EAAG,EAAE,CAAC,CAAC,EACvI,GAAO,MACT,EAAW,KAAK,CAAG,CAEvB,CAAC,EACG,EAAW,OAAS,EAAG,CAUzB,IAAI,EAAgB,EAAW,GAC3B,EAAc,EAAO,EAAW,EAAE,EACtC,EAAW,MAAM,CAAC,CAAC,CAAC,QAAQ,GAAa,CACvC,IAAM,EAAW,EAAO,CAAS,EAC7B,EAAW,IACb,EAAgB,EAChB,EAAc,EAElB,CAAC,EACD,EAAQ,KAAK,CACX,QAAS,OACT,QACA,IACA,IACA,UAAW,GACX,KAAM,EAAc,KACpB,MAAO,EAAc,MACrB,IAAK,EAAc,GACrB,CAAC,CACH,CACF,CACF,CAEF,OAAO,CACT,CAUA,YAAY,EAAS,CACnB,OAAO,EAAQ,OAAO,GAAS,CAC7B,IAAI,EAAa,GACX,EAAgB,EAAQ,OAC9B,IAAK,IAAI,EAAI,EAAG,EAAI,EAAe,GAAK,EAAG,CACzC,IAAM,EAAa,EAAQ,GAC3B,GAAI,IAAU,GACR,EAAW,GAAK,EAAM,GAAK,EAAW,GAAK,EAAM,EAAG,CACtD,EAAa,GACb,KACF,CAEJ,CACA,MAAO,CAAC,CACV,CAAC,CACH,CAYA,0BAA0B,EAAU,CAClC,GAAI,EAAS,GAAK,IAAM,EAAS,IAAM,EACrC,OAAO,KAET,IAAI,EAAS,EACT,EAAS,EACT,EAAS,EACb,IAAK,IAAI,EAAI,EAAG,EAAO,EAAS,OAAQ,EAAI,EAAM,GAAK,EAAG,CACxD,IAAM,EAAM,EAAS,GACrB,GAAI,EAAM,IAAM,EAAA,KAAuB,EAAA,KACrC,OAAO,KAEL,EAAM,KACR,GAAU,GAER,EAAM,KACR,GAAU,GAER,GAAO,IACT,GAAU,EAEd,CAIA,OAHI,GAAU,GAAK,IAAW,GAAK,GAAU,EACpC,KAEF,KAAK,YAAY,CAAQ,CAClC,CAEA,YAAY,EAAU,CAEpB,IAAM,EAAqB,CAAC,CAAC,EAAS,GAAI,EAAS,MAAM,EAAG,CAAC,CAAC,EAE9D,CAAC,EAAS,GAAI,EAAS,MAAM,EAAG,CAAC,CAAC,CAClC,EACM,EAA2B,EAAmB,OACpD,IAAK,IAAI,EAAI,EAAG,EAAI,EAA0B,GAAK,EAAG,CACpD,GAAM,CAAC,EAAG,GAAQ,EAAmB,GACrC,GAAA,KAAqB,GAAK,GAAA,KAAoB,CAC5C,IAAM,EAAK,KAAK,sBAAsB,CAAI,EAa1C,OAZI,GAAM,KAYH,KAXE,CACL,KAAM,EACN,MAAO,EAAG,MACV,IAAK,EAAG,GACV,CAQJ,CACF,CAGA,IAAK,IAAI,EAAI,EAAG,EAAI,EAA0B,GAAK,EAAG,CACpD,GAAM,CAAC,EAAG,GAAQ,EAAmB,GAC/B,EAAK,KAAK,sBAAsB,CAAI,EAC1C,GAAI,GAAM,KACR,MAAO,CACL,KAAM,KAAK,mBAAmB,CAAC,EAC/B,MAAO,EAAG,MACV,IAAK,EAAG,GACV,CAEJ,CACA,OAAO,IACT,CACA,sBAAsB,EAAU,CAC9B,IAAM,EAAO,CAAC,EAAU,EAAS,MAAM,CAAC,CAAC,QAAQ,CAAC,EAElD,IAAK,IAAI,EAAI,EAAG,EAAI,EAAK,OAAQ,GAAK,EAAG,CACvC,IAAM,EAAO,EAAK,GACZ,EAAM,EAAK,GACX,EAAQ,EAAK,GACnB,GAAI,GAAO,GAAK,GAAO,IAAM,GAAS,GAAK,GAAS,GAClD,MAAO,CACL,MACA,OACF,CAEJ,CACA,OAAO,IACT,CACA,mBAAmB,EAAM,CASvB,OARI,EAAO,GACF,EAEL,EAAO,GAEF,EAAO,KAGT,EAAO,GAChB,CACF,EChQM,EAAM,IAAI,YAAY,KAAO,EAC7B,IAAY,EAAG,IAAM,CACvB,IAAM,EAAI,EAAE,OACN,EAAI,EAAE,OACN,EAAM,GAAM,EAAI,EAClB,EAAK,GACL,EAAK,EACL,EAAK,EACL,EAAI,EACR,KAAO,KACH,EAAI,EAAE,WAAW,CAAC,IAAM,GAAK,EAEjC,IAAK,EAAI,EAAG,EAAI,EAAG,IAAK,CACpB,IAAI,EAAK,EAAI,EAAE,WAAW,CAAC,GACrB,EAAK,EAAK,EAChB,IAAQ,EAAK,GAAM,EAAM,EACzB,GAAM,EAAE,EAAK,GACb,GAAM,EACF,EAAK,GACL,IAEA,EAAK,GACL,IAEJ,EAAM,GAAM,EAAK,EACjB,EAAM,GAAM,EAAK,EAAE,EAAK,GACxB,GAAM,CACV,CAEA,IADA,EAAI,EACG,KACH,EAAI,EAAE,WAAW,CAAC,GAAK,EAE3B,OAAO,CACX,EACM,IAAW,EAAG,IAAM,CACtB,IAAM,EAAI,EAAE,OACN,EAAI,EAAE,OACN,EAAM,CAAC,EACP,EAAM,CAAC,EACP,EAAQ,KAAK,KAAK,EAAI,EAAE,EACxB,EAAQ,KAAK,KAAK,EAAI,EAAE,EAC9B,IAAK,IAAI,EAAI,EAAG,EAAI,EAAO,IACvB,EAAI,GAAK,GACT,EAAI,GAAK,EAEb,IAAI,EAAI,EACR,KAAO,EAAI,EAAQ,EAAG,IAAK,CACvB,IAAI,EAAK,EACL,EAAK,GACH,EAAQ,EAAI,GACZ,EAAO,KAAK,IAAI,GAAI,CAAC,EAAI,EAC/B,IAAK,IAAI,EAAI,EAAO,EAAI,EAAM,IAC1B,EAAI,EAAE,WAAW,CAAC,IAAM,GAAK,EAEjC,IAAK,IAAI,EAAI,EAAG,EAAI,EAAG,IAAK,CACxB,IAAM,EAAK,EAAI,EAAE,WAAW,CAAC,GACvB,EAAM,EAAK,EAAI,GAAM,KAAO,EAAK,EACjC,EAAM,EAAK,EAAI,GAAM,KAAO,EAAK,EACjC,EAAK,EAAK,EACV,IAAS,EAAK,GAAM,GAAM,EAAM,EAAM,EAAK,EAC7C,EAAK,EAAK,EAAE,EAAK,GACjB,EAAK,EAAK,EACT,IAAO,GAAM,IACd,EAAK,EAAI,GAAM,IAAM,GAAK,GAEzB,IAAO,GAAM,IACd,EAAK,EAAI,GAAM,IAAM,GAAK,GAE9B,EAAM,GAAM,EAAK,EACjB,EAAM,GAAM,EAAK,EACjB,EAAK,EAAK,EAAE,EAAK,GACjB,EAAK,EAAK,CACd,CACA,IAAK,IAAI,EAAI,EAAO,EAAI,EAAM,IAC1B,EAAI,EAAE,WAAW,CAAC,GAAK,CAE/B,CACA,IAAI,EAAK,EACL,EAAK,GACH,EAAQ,EAAI,GACZ,EAAO,KAAK,IAAI,GAAI,EAAI,CAAK,EAAI,EACvC,IAAK,IAAI,EAAI,EAAO,EAAI,EAAM,IAC1B,EAAI,EAAE,WAAW,CAAC,IAAM,GAAK,EAEjC,IAAI,EAAQ,EACZ,IAAK,IAAI,EAAI,EAAG,EAAI,EAAG,IAAK,CACxB,IAAM,EAAK,EAAI,EAAE,WAAW,CAAC,GACvB,EAAM,EAAK,EAAI,GAAM,KAAO,EAAK,EACjC,EAAM,EAAK,EAAI,GAAM,KAAO,EAAK,EACjC,EAAK,EAAK,EACV,IAAS,EAAK,GAAM,GAAM,EAAM,EAAM,EAAK,EAC7C,EAAK,EAAK,EAAE,EAAK,GACjB,EAAK,EAAK,EACd,GAAU,IAAQ,EAAI,EAAM,EAC5B,GAAU,IAAQ,EAAI,EAAM,EACvB,IAAO,GAAM,IACd,EAAK,EAAI,GAAM,IAAM,GAAK,GAEzB,IAAO,GAAM,IACd,EAAK,EAAI,GAAM,IAAM,GAAK,GAE9B,EAAM,GAAM,EAAK,EACjB,EAAM,GAAM,EAAK,EACjB,EAAK,EAAK,EAAE,EAAK,GACjB,EAAK,EAAK,CACd,CACA,IAAK,IAAI,EAAI,EAAO,EAAI,EAAM,IAC1B,EAAI,EAAE,WAAW,CAAC,GAAK,EAE3B,OAAO,CACX,EACM,GAAY,EAAG,IAAM,CACvB,GAAI,EAAE,OAAS,EAAE,OAAQ,CACrB,IAAM,EAAM,EACZ,EAAI,EACJ,EAAI,CACR,CAOA,OANI,EAAE,SAAW,EACN,EAAE,OAET,EAAE,QAAU,GACL,GAAS,EAAG,CAAC,EAEjB,GAAQ,EAAG,CAAC,CACvB,EC1HM,IAAoB,EAAU,EAAO,IAAc,CACvD,IAAM,EAAoB,EAAS,QAAU,EAAM,OAC7C,EAAgC,EAAS,QAAU,EAGzD,OAFgC,GAAqB,EAEpB,KAAK,KAAK,EAAS,OAAS,CAAC,EAAI,CACpE,EACM,IAA2B,EAAU,EAAkB,IAAc,CACzE,IAAI,EAAgB,EACd,EAAQ,OAAO,KAAK,CAAgB,CAAC,CAAC,KAAK,GAAS,CACxD,IAAM,EAAgB,GAAiB,EAAU,EAAO,CAAS,EACjE,GAAI,KAAK,IAAI,EAAS,OAAS,EAAM,MAAM,EAAI,EAC7C,MAAO,GAET,IAAM,EAAqB,EAAS,EAAU,CAAK,EAC7C,EAAgB,GAAsB,EAI5C,OAHI,IACF,EAAgB,GAEX,CACT,CAAC,EAOD,OANI,EACK,CACL,oBAAqB,EACrB,yBAA0B,CAC5B,EAEK,CAAC,CACV,EC9BI,IAA4B,EAA2B,EAAsC,IAAsB,CACrH,GAAI,CAAC,EACH,MAAO,CACL,mBAAoB,EACpB,8BAA+B,CACjC,EAEF,IAAM,EAAqB,CACzB,GAAG,CACL,EACM,EAAgC,CACpC,GAAG,CACL,EAMA,MALA,GAAmB,WAAa,CAC9B,GAAI,EAAmB,YAAc,CAAC,EACtC,GAAG,EAAkB,gBACvB,EACA,EAA8B,WAAa,KAAK,IAAI,EAAkB,4BAA6B,EAA8B,YAAc,CAAC,EACzI,CACL,qBACA,+BACF,CACF,EClBM,EAAN,cAA8B,CAAiB,CAC7C,YAAY,EAAS,EAAmB,CACtC,MAAM,CAAO,EACb,KAAK,kBAAoB,CAC3B,CACA,sBAAsB,EAAmB,CACvC,GAAI,KAAK,kBAAmB,CAC1B,IAAM,EAAqB,CAAC,EACtB,EAAgC,CAAC,EAOvC,OANA,OAAO,KAAK,KAAK,QAAQ,kBAAkB,CAAC,CAAC,QAAQ,GAAO,CACtD,KAAK,QAAQ,eAAe,CAAG,IACjC,EAAmB,GAAO,KAAK,QAAQ,mBAAmB,GAC1D,EAA8B,GAAO,KAAK,QAAQ,8BAA8B,GAEpF,CAAC,EACM,CACL,qBACA,+BACF,CACF,CACA,OAAO,GAAyB,KAAK,QAAQ,mBAAoB,KAAK,QAAQ,8BAA+B,CAAiB,CAChI,CAEA,MAAM,CACJ,WACA,oBACA,iBAAiB,IAChB,CACD,IAAM,EAAU,CAAC,EACX,EAAiB,EAAS,OAC1B,EAAgB,EAAS,YAAY,EACrC,CACJ,qBACA,iCACE,KAAK,sBAAsB,CAAiB,EAC1C,EAAkB,OAAO,KAAK,CAAkB,EAChD,EAAiB,KAAK,IAAI,EAAG,GAAG,OAAO,OAAO,CAA6B,CAAC,EAClF,IAAK,IAAI,EAAI,EAAG,EAAI,EAAgB,GAAK,EACvC,IAAK,IAAI,EAAI,EAAG,EAAI,EAAgB,GAAK,EAAG,CAC1C,IAAM,EAAiB,IAAM,GAAK,IAAM,EAAiB,EAGzD,GAAI,EAAI,EAAI,EAAI,GAAkB,CAAC,EACjC,MAEF,IAAM,EAAe,EAAc,MAAM,EAAG,EAAI,CAAC,EACjD,IAAK,IAAM,KAAkB,EAAiB,CAC5C,IAAM,EAAa,EAAmB,GACtC,GAAI,EAAI,EAAI,EAAI,EAA8B,IAAmB,CAAC,EAChE,SAEF,IAAM,EAAO,EAAW,GAClB,EAAiB,IAAS,IAAA,GAC5B,EAA2B,CAAC,EAG5B,KAAK,QAAQ,wBAA0B,GAAkB,CAAC,GAAkB,IAC9E,EAA2B,GAAwB,EAAc,EAAY,KAAK,QAAQ,oBAAoB,GAEhH,IAAM,EAAqB,EAAyB,sBAAwB,IAAA,GAC5E,GAAI,GAAkB,EAAoB,CACxC,IAAM,EAAmB,EAAqB,EAAyB,yBAA2B,EAC5F,EAAY,EAAiB,EAAO,EAAW,GACrD,EAAQ,KAAK,CACX,QAAS,aACT,IACA,IACA,MAAO,EAAS,MAAM,EAAG,EAAI,CAAC,EAC9B,YAAa,EACb,KAAM,EACN,iBACA,SAAU,GACV,KAAM,GACN,GAAG,CACL,CAAC,CACH,CACF,CACF,CAEF,OAAO,CACT,CACF,ECrFM,GAAN,KAAqB,CACnB,YAAY,CACV,SACA,QACA,YACC,CACD,KAAK,OAAS,CAAC,EACf,KAAK,eAAiB,CAAC,EACvB,KAAK,OAAS,EACd,KAAK,MAAQ,EACb,KAAK,SAAW,CAClB,CACA,0BAA0B,EAAO,CAC/B,IAAM,EAAQ,CAAC,EACX,EAAM,KAAK,SACf,IAAK,IAAI,EAAI,EAAO,EAAI,KAAK,OAAO,OAAQ,GAAK,EAAG,CAClD,IAAM,EAAY,KAAK,OAAO,OAAO,CAAC,EAEtC,GADA,EAAM,EAAI,SAAS,CAAS,EACxB,CAAC,EACH,MAEF,EAAM,KAAK,CAAG,CAChB,CACA,OAAO,CACT,CAEA,OAAO,CACL,cACA,YACA,QACA,WACA,UACA,gBACA,uBACC,CACD,GAAI,KAAK,eAAe,QAAU,KAAK,MACrC,OAEF,GAAI,IAAU,KAAK,OAAO,OAAQ,CAC5B,IAAgB,GAClB,KAAK,eAAe,KAAK,CACvB,SAAU,KAAK,OAAO,KAAK,EAAE,EAC7B,UACA,mBAAoB,CACtB,CAAC,EAEH,MACF,CAEA,IAAM,EAAQ,CAAC,GAAG,KAAK,0BAA0B,CAAK,CAAC,EACnD,EAAU,GAEd,IAAK,IAAI,EAAI,EAAQ,EAAM,OAAS,EAAG,GAAK,EAAO,IAAQ,CACzD,IAAM,EAAM,EAAM,EAAI,GAChB,EAAM,EAAI,QAAQ,KAAK,EAAE,EAC/B,GAAI,EAAI,WAAW,EAAG,CAIpB,GAAI,IAAkB,GAAO,GAAuB,EAClD,SAEF,EAAU,GACV,IAAM,EAAU,EAAI,KACpB,IAAK,IAAM,KAAU,EAAS,CAC5B,KAAK,OAAO,KAAK,CAAM,EACvB,IAAM,EAAU,EAAQ,OAAO,CAC7B,EAAG,EACH,SACA,aAAc,CAChB,CAAC,EAaD,GAXA,KAAK,OAAO,CACV,cACA,YACA,MAAO,EAAQ,EAAI,OACnB,SAAU,EAAW,EAAO,OAC5B,QAAS,EACT,cAAe,EACf,oBAAqB,IAAkB,EAAM,EAAsB,EAAI,CACzE,CAAC,EAED,KAAK,OAAO,IAAI,EACZ,KAAK,eAAe,QAAU,KAAK,MACrC,MAEJ,CACF,CACF,CAGA,GAAI,CAAC,GAAe,CAAC,EAAS,CAC5B,IAAM,EAAY,KAAK,OAAO,OAAO,CAAK,EAC1C,KAAK,OAAO,KAAK,CAAS,EAC1B,KAAK,OAAO,CACV,cACA,UAAW,GAAa,CAAC,EACzB,MAAO,EAAQ,EACf,SAAU,EAAW,EACrB,UACA,gBACA,qBACF,CAAC,EACD,KAAK,OAAO,IAAI,CAClB,CACF,CACA,QAAS,CAqBP,OAnBA,KAAK,OAAO,CACV,YAAa,GACb,UAAW,GACX,MAAO,EACP,SAAU,EACV,QAAS,CAAC,EACV,cAAe,IAAA,GACf,oBAAqB,CACvB,CAAC,EAED,KAAK,OAAO,CACV,YAAa,GACb,UAAW,GACX,MAAO,EACP,SAAU,EACV,QAAS,CAAC,EACV,cAAe,IAAA,GACf,oBAAqB,CACvB,CAAC,EACM,KAAK,cACd,CACF,EACM,IAAqB,EAAU,EAAO,IAMnC,IALY,GAAe,CAChC,OAAQ,EACR,QACA,UACF,CACY,CAAC,CAAC,OAAO,ECrIjB,IAAa,EAAkB,EAAG,IAAM,CAC5C,IAAI,EAAY,EACZ,EAAY,EACV,EAAW,CAAC,EACZ,EAAa,CAAC,EACd,EAAW,IAAI,IAmBrB,OAlBA,EAAiB,QAAQ,QAAQ,GAAU,CACzC,GAAI,EAAO,EAAI,EAAG,CAChB,IAAM,EAAO,EAAO,aAAa,OAAS,EAAO,OAAO,OACxD,GAAa,EACb,GAAa,CACf,MAAO,GAAI,EAAO,GAAK,EAAG,CACxB,GAAa,EAAO,aAAa,OAAS,EAAO,OAAO,OACxD,IAAM,EAAS,GAAG,EAAO,OAAO,GAAG,EAAO,eACrC,EAAS,IAAI,CAAM,IACtB,EAAS,IAAI,CAAM,EACnB,EAAS,KAAK,CACZ,OAAQ,EAAO,OACf,aAAc,EAAO,YACvB,CAAC,EACD,EAAW,KAAK,GAAG,EAAO,aAAa,MAAM,EAAO,QAAQ,EAEhE,CACF,CAAC,EACM,CACL,EAAG,EACH,EAAG,EACH,KAAM,EACN,WAAY,EAAW,KAAK,IAAI,CAClC,CACF,EAMM,EAAN,cAAwB,CAAgB,CACtC,kBAAkB,EAAS,EAAU,CACnC,OAAO,EAAQ,KAAK,GACX,EAAU,IAAM,EAAS,GAAK,EAAU,IAAM,EAAS,GAAK,EAAU,iBAAmB,EAAS,gBAAkB,EAAU,cAAgB,EAAS,WAC/J,CACH,CACA,MAAM,EAAc,CAClB,IAAM,EAAU,CAAC,EACX,EAAkB,GAAkB,EAAa,SAAU,KAAK,QAAQ,qBAAsB,KAAK,QAAQ,YAAY,EACzH,EAAe,GAgCnB,OA/BA,EAAgB,QAAQ,GAAkB,CACpC,GAQJ,MALgC,MAAM,CACpC,GAAG,EACH,SAAU,EAAe,SACzB,eAAgB,EAAe,kBACjC,CACgB,CAAC,CAAC,QAAQ,GAAS,CACjC,IAAM,EAAS,GAAU,EAAgB,EAAM,EAAG,EAAM,CAAC,EACzD,AACE,IAAe,EAAO,IAAM,GAAK,EAAO,IAAM,EAAa,SAAS,OAAS,EAE/E,IAAM,EAAQ,EAAa,SAAS,MAAM,EAAO,EAAG,EAAO,EAAI,CAAC,EAC1D,EAAW,CACf,GAAG,EACH,KAAM,GACN,QACA,GAAG,CACL,EACM,EAAkB,KAAK,kBAAkB,EAAS,CAAQ,EAE5D,EAAM,YAAY,IAAM,EAAM,aAAe,CAAC,GAChD,EAAQ,KAAK,CAAQ,CAEzB,CAAC,CACH,CAAC,EAIM,EAAQ,OAAO,GAAS,EAAM,MAAM,OAAS,CAAC,CACvD,CACF,EC3EM,EAAN,cAA2B,CAAgB,CACzC,MAAM,EAAc,CAClB,IAAM,EAAmB,EAAa,SAAS,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,KAAK,EAAE,EAC1E,OAAO,MAAM,MAAM,CACjB,GAAG,EACH,SAAU,CACZ,CAAC,CAAC,CAAC,IAAI,IAAU,CACf,GAAG,EACH,MAAO,EAAM,MAAM,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,KAAK,EAAE,EAE9C,SAAU,GAEV,EAAG,EAAa,SAAS,OAAS,EAAI,EAAM,EAC5C,EAAG,EAAa,SAAS,OAAS,EAAI,EAAM,CAC9C,EAAE,CACJ,CACF,ECdM,GAAN,cAAyB,CAAiB,CACxC,MAAM,CACJ,YACC,CACD,IAAM,EAAU,CAAC,EAmBjB,OAlBA,OAAO,KAAK,CAAO,CAAC,CAAC,QAAQ,GAAQ,CACnC,IAAM,EAAQ,EAAQ,GACtB,EAAM,UAAY,EAClB,IAAI,EACJ,KAAO,EAAa,EAAM,KAAK,CAAQ,GACrC,GAAI,EAAY,CACd,IAAM,EAAQ,EAAW,GACzB,EAAQ,KAAK,CACX,QAAS,QACT,QACA,EAAG,EAAW,MACd,EAAG,EAAW,MAAQ,EAAW,EAAE,CAAC,OAAS,EAC7C,UAAW,EACX,YACF,CAAC,CACH,CAEJ,CAAC,EACM,EAAO,CAAO,CACvB,CACF,EClCM,GAAQ,KAAK,IAAI,EAAE,EACnB,GAAO,KAAK,IAAI,CAAC,EACnB,EAAQ,CAGV,IAAI,EAAG,EAAG,CACR,IAAI,EAAQ,EACZ,GAAI,EAAI,EACN,MAAO,GAET,GAAI,IAAM,EACR,MAAO,GAET,IAAI,EAAQ,EACZ,IAAK,IAAI,EAAI,EAAG,GAAK,EAAG,GAAK,EAC3B,GAAS,EACT,GAAS,EACT,IAEF,OAAO,CACT,EACA,MAAM,EAAG,CAEP,OADI,IAAM,EAAU,EACb,KAAK,IAAI,CAAC,EAAI,EACvB,EACA,KAAK,EAAG,CACN,OAAO,KAAK,IAAI,CAAC,EAAI,EACvB,EACA,UAAU,EAAK,CACb,IAAI,EAAO,EACX,IAAK,IAAI,EAAI,EAAG,GAAK,EAAK,GAAK,EAAG,GAAQ,EAC1C,OAAO,CACT,CACF,EC/BIA,IAAqB,CACvB,WACI,CACJ,IAAI,EAAA,IAAoC,EAAM,OAC1C,IAAY,MACd,EAAU,OAAO,WAEnB,IAAI,EAQJ,MALA,CAGE,EAHE,EAAM,SAAW,EACnB,GAEA,GAEK,KAAK,IAAI,EAAS,CAAU,CACrC,EChBIC,IAAe,CACjB,OACA,eACI,CAGJ,IAAI,EADc,KAAK,IAAI,KAAK,IAAI,EAAO,CAAc,EAAA,EACnC,EAAI,IAK1B,OAHI,IACF,GAAW,GAEN,CACT,ECXM,GAAgB,GAAe,CACnC,IAAM,EAAY,EAAY,MAAM,EAAE,EAChC,EAAiB,EAAU,OAAO,GAAQ,EAAK,MAAM,CAAS,CAAC,CAAC,CAAC,OACjE,EAAiB,EAAU,OAAO,GAAQ,EAAK,MAAM,CAAS,CAAC,CAAC,CAAC,OACnE,EAAa,EACX,EAAkB,KAAK,IAAI,EAAgB,CAAc,EAC/D,IAAK,IAAI,EAAI,EAAG,GAAK,EAAiB,GAAK,EACzC,GAAc,EAAM,IAAI,EAAiB,EAAgB,CAAC,EAE5D,OAAO,CACT,EACI,GAAmB,GAAQ,CAE7B,IAAM,EAAc,EAAK,QAAQ,EAAgB,EAAE,EACnD,GAAI,EAAY,MAAM,CAAkB,GAAK,EAAY,YAAY,IAAM,EACzE,MAAO,GAKT,IAAM,EAAc,CAAC,EAAa,EAAW,CAAkB,EACzD,EAAoB,EAAY,OACtC,IAAK,IAAI,EAAI,EAAG,EAAI,EAAmB,GAAK,EAAG,CAC7C,IAAM,EAAQ,EAAY,GAC1B,GAAI,EAAY,MAAM,CAAK,EACzB,MAAO,EAEX,CAIA,OAAO,GAAc,CAAW,CAClC,ECjCM,GAAkB,EAAQ,IAAc,CAC5C,IAAI,EAAQ,EACR,EAAM,EAAO,QAAQ,CAAS,EAClC,KAAO,GAAO,GACZ,GAAS,EACT,EAAM,EAAO,QAAQ,EAAW,EAAM,EAAU,MAAM,EAExD,OAAO,CACT,EACM,IAAa,CACjB,MACA,WACI,CAEJ,IAAM,EAAa,EAAM,YAAY,EAKrC,MAAO,CACL,YAJkB,EAAe,EAAY,EAAI,YAIvC,EACV,cAHoB,EAAe,EAAY,EAAI,MAGvC,CACd,CACF,EACI,GAAe,CACjB,OACA,OACA,WACI,CACJ,GAAI,CAAC,EACH,MAAO,GAET,IAAI,EAAa,EAyBjB,OAxBA,EAAK,QAAQ,GAAO,CAClB,GAAM,CACJ,cACA,iBACE,GAAU,CACZ,MACA,OACF,CAAC,EACD,GAAI,IAAgB,GAAK,IAAkB,EAIzC,GAAc,MACT,CAGL,IAAM,EAAI,KAAK,IAAI,EAAe,CAAW,EACzC,EAAgB,EACpB,IAAK,IAAI,EAAI,EAAG,GAAK,EAAG,GAAK,EAC3B,GAAiB,EAAM,IAAI,EAAgB,EAAa,CAAC,EAE3D,GAAc,CAChB,CACF,CAAC,EACM,CACT,ECzDIC,GAAqB,CACvB,OACA,WACA,OACA,OACA,QACA,oBACI,CACJ,IAAM,EAAc,EACd,EAAsB,GAAiB,CAAK,EAC5C,EAAiB,EAAY,CACjC,OACA,OACA,OACF,CAAC,EACK,EAAqB,GAAY,GAAK,EACxC,EAQJ,MAPA,CAKE,EALE,IAAmB,WAGP,GAAK,EAAI,EAET,EAAc,EAAsB,EAAiB,EAE9D,CACL,cACA,sBACA,iBACA,aACF,CACF,EC/BIC,GAAgB,CAClB,YACA,aACA,WACI,CACJ,IAAM,EAAiB,CACrB,WAAY,GACZ,WAAY,GACZ,MAAO,GACP,aAAc,GACd,OAAQ,GACR,QAAS,EACX,EACA,GAAI,KAAa,EACf,OAAO,EAAe,IAAc,EAAM,OAG5C,OAAQ,EAAR,CACE,IAAK,aAGH,OAAO,KAAK,IAAI,KAAK,IAAI,SAAS,EAAW,GAAI,EAAE,EAAI,CAAc,EAAA,EAAiB,CAC1F,CACA,MAAO,EACT,EC1BIC,GAAiB,CACnB,cACA,iBACI,EAAc,ECHhBC,GAAmB,CACrB,QACA,eACI,CACJ,IAAM,EAAW,EAAM,OAAO,CAAC,EAC3B,EAiBJ,MAdA,CAOE,EAPE,CAFoB,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAErC,CAAC,CAAC,SAAS,CAAQ,EACpB,EACL,KAAK,KAAK,CAAQ,EACb,GAIA,GAIX,IACH,GAAe,GAEV,EAAc,EAAM,MAC7B,ECrBM,EAAoB,GAAS,CACjC,IAAI,EAAU,EAMd,OALA,OAAO,KAAK,CAAK,CAAC,CAAC,QAAQ,GAAO,CAChC,IAAM,EAAY,EAAM,GACxB,GAAW,EAAU,OAAO,GAAS,CAAC,CAAC,CAAK,CAAC,CAAC,MAChD,CAAC,EACD,GAAW,OAAO,QAAQ,CAAK,CAAC,CAAC,OAC1B,CACT,EACM,GAA4B,EAAY,CAC5C,QACA,WACI,CACJ,IAAM,EAAmB,OAAO,KAAK,CAAU,CAAC,CAAC,OAC3C,EAAgB,EAAkB,CAAU,EAC9C,EAAU,EACR,EAAc,EAAM,OAE1B,IAAK,IAAI,EAAI,EAAG,GAAK,EAAa,GAAK,EAAG,CACxC,IAAM,EAAgB,KAAK,IAAI,EAAO,EAAI,CAAC,EAC3C,IAAK,IAAI,EAAI,EAAG,GAAK,EAAe,GAAK,EACvC,GAAW,EAAM,IAAI,EAAI,EAAG,EAAI,CAAC,EAAI,EAAmB,GAAiB,CAE7E,CACA,OAAO,CACT,EACIC,GAAkB,CACpB,QACA,QACA,eACA,SACC,IAAY,CACb,IAAI,EAAU,EAAyB,EAAQ,OAAO,GAAQ,CAC5D,QACA,OACF,CAAC,EAGD,GAAI,EAAc,CAChB,IAAM,EAAiB,EAAM,OAAS,EACtC,GAAI,IAAiB,GAAK,IAAmB,EAC3C,GAAW,MACN,CACL,IAAI,EAAoB,EACxB,IAAK,IAAI,EAAI,EAAG,GAAK,KAAK,IAAI,EAAc,CAAc,EAAG,GAAK,EAChE,GAAqB,EAAM,IAAI,EAAe,EAAgB,CAAC,EAEjE,GAAW,CACb,CACF,CACA,OAAO,KAAK,MAAM,CAAO,CAC3B,ECnDIC,MACK,GCHT,SAAS,EAAU,EAAG,CAEpB,OADI,GAAK,EAAU,EACZ,EAAI,EAAU,EAAI,CAAC,CAC5B,CACA,IAAIC,GAAsB,GACpB,EAAM,UAAY,eAIF,EAAU,EAAM,SAGnB,EADK,IAAM,EAAM,UAAY,GALrC,ECML,IAAiB,EAAO,IAAa,CACzC,IAAI,EAAa,EAQjB,OAPI,EAAM,MAAM,OAAS,EAAS,SAChC,AAGE,EAHE,EAAM,MAAM,SAAW,EACzB,GAEA,IAGG,CACT,EACM,EAAW,CACf,WAAYC,GACZ,KAAMC,GACN,WAAYC,EACZ,MAAOC,EACP,OAAQC,EACR,SAAUC,EACV,QAASC,EACT,UAAWC,EACX,aAAcC,EAChB,EACM,IAAc,EAAS,EAAM,IAC7B,EAAS,GACJ,EAAS,EAAK,CAAC,EAAO,CAAO,EAElC,EAAQ,SAAS,IAAS,YAAa,EAAQ,SAAS,GACnD,EAAQ,SAAS,EAAK,CAAC,QAAQ,EAAO,CAAO,EAE/C,EAKL,IAAmB,EAAS,EAAO,IAAa,CAClD,IAAM,EAAY,CAAC,EAEnB,GAAI,YAAa,GAAS,EAAM,SAAW,KACzC,OAAO,EAET,IAAM,EAAa,GAAc,EAAO,CAAQ,EAC1C,EAAmB,GAAW,EAAS,EAAM,QAAS,CAAK,EAC7D,EAAU,EACV,OAAO,GAAqB,SAC9B,EAAU,EACD,EAAM,UAAY,eAC3B,EAAU,EAAiB,YAC3B,EAAU,YAAc,EAAiB,YACzC,EAAU,oBAAsB,EAAiB,oBACjD,EAAU,eAAiB,EAAiB,gBAE9C,IAAM,EAAe,KAAK,IAAI,EAAS,CAAU,EACjD,MAAO,CACL,GAAG,EACH,GAAG,EACH,QAAS,EACT,aAAc,EAAM,MAAM,CAAY,CACxC,CACF,EClEM,EAAN,KAAc,CACZ,YAAY,EAAS,CACnB,KAAK,QAAU,EACf,KAAK,SAAW,GAChB,KAAK,QAAU,CAAC,EAChB,KAAK,gBAAkB,EACzB,CACA,UAAU,EAAM,EAAW,CACzB,IAAM,EAAS,CAAC,EAChB,IAAK,IAAI,EAAI,EAAG,EAAI,EAAM,GAAK,EAAG,CAChC,IAAI,EAAQ,CAAC,EACT,IAAc,WAChB,EAAQ,CAAC,GAEX,EAAO,KAAK,CAAK,CACnB,CACA,OAAO,CACT,CAEA,oBAAoB,EAAG,EAAG,CACxB,MAAO,CACL,QAAS,aACT,MAAO,KAAK,SAAS,MAAM,EAAG,EAAI,GAAK,GAAG,EAC1C,IACA,GACF,CACF,CAKA,OAAO,EAAO,EAAgB,CAC5B,IAAM,EAAI,EAAM,EACV,EAAiB,GAAgB,KAAK,QAAS,EAAO,KAAK,QAAQ,EACrE,EAAK,EAAe,QACpB,EAAiB,IAKnB,GAAM,KAAK,QAAQ,eAAe,EAAe,EAAI,EAAE,CAAC,EAAiB,IAG3E,IAAI,EAAI,EAAM,UAAU,CAAc,EAAI,EACrC,KAAK,kBACR,GAAK,IAAwC,EAAiB,IAMhE,IAAI,EAAa,GACX,EAAa,KAAK,QAAQ,aAAa,GAC7C,OAAO,KAAK,CAAU,CAAC,CAAC,QAAQ,GAA6B,CAC3D,IAAM,EAAyB,SAAS,EAA2B,EAAE,EAC/D,EAAuB,EAAW,GACpC,GAA0B,GACxB,GAAwB,IAC1B,EAAa,GAGnB,CAAC,EACI,IAEH,KAAK,QAAQ,aAAa,EAAE,CAAC,GAAkB,EAC/C,KAAK,QAAQ,YAAY,EAAE,CAAC,GAAkB,EAC9C,KAAK,QAAQ,eAAe,EAAE,CAAC,GAAkB,EAErD,CAEA,iBAAiB,EAAmB,CAElC,IAAI,EAAQ,KAAK,oBAAoB,EAAG,CAAiB,EACzD,KAAK,OAAO,EAAO,CAAC,EACpB,IAAK,IAAI,EAAI,EAAG,GAAK,EAAmB,GAAK,EAAG,CAI9C,EAAQ,KAAK,oBAAoB,EAAG,CAAiB,EACrD,IAAM,EAAM,KAAK,QAAQ,YAAY,EAAI,GACzC,OAAO,KAAK,CAAG,CAAC,CAAC,QAAQ,GAAqB,CAC5C,IAAM,EAAiB,SAAS,EAAmB,EAAE,EACnC,EAAI,EAKT,CAAC,UAAY,cAExB,KAAK,OAAO,EAAO,EAAiB,CAAC,CAEzC,CAAC,CACH,CACF,CAGA,OAAO,EAAgB,CACrB,IAAM,EAAuB,CAAC,EAC1B,EAAI,EAAiB,EAErB,EAAiB,EAEjB,EAAI,IACF,EAAO,KAAK,QAAQ,aAAa,GAYvC,IAVI,GACF,OAAO,KAAK,CAAI,CAAC,CAAC,QAAQ,GAA8B,CACtD,IAAM,EAA0B,SAAS,EAA4B,EAAE,EACjE,EAAuB,EAAK,GAC9B,EAAuB,IACzB,EAAiB,EACjB,EAAI,EAER,CAAC,EAEI,GAAK,GAAG,CACb,IAAM,EAAQ,KAAK,QAAQ,YAAY,EAAE,CAAC,GAC1C,EAAqB,QAAQ,CAAK,EAClC,EAAI,EAAM,EAAI,EACd,GACF,CACA,OAAO,CACT,CAiCA,2BAA2B,EAAU,EAAS,EAAkB,GAAO,CACrE,KAAK,SAAW,EAChB,KAAK,gBAAkB,EACvB,IAAM,EAAiB,EAAS,OAE5B,EAAuB,KAAK,UAAU,EAAgB,OAAO,EACjE,EAAQ,QAAQ,GAAS,CACvB,EAAqB,EAAM,EAAE,CAAC,KAAK,CAAK,CAC1C,CAAC,EAED,EAAuB,EAAqB,IAAI,GAAS,EAAM,MAAM,EAAI,IAAO,EAAG,EAAI,EAAG,CAAC,CAAC,EAC5F,KAAK,QAAU,CAOb,YAAa,KAAK,UAAU,EAAgB,QAAQ,EAGpD,eAAgB,KAAK,UAAU,EAAgB,QAAQ,EAEvD,aAAc,KAAK,UAAU,EAAgB,QAAQ,CACvD,EACA,IAAK,IAAI,EAAI,EAAG,EAAI,EAAgB,GAAK,EACvC,EAAqB,EAAE,CAAC,QAAQ,GAAS,CACvC,GAAI,EAAM,EAAI,EAAG,CACf,IAAM,EAAQ,KAAK,QAAQ,YAAY,EAAM,EAAI,GACjD,OAAO,KAAK,CAAK,CAAC,CAAC,QAAQ,GAAqB,CAC9C,IAAM,EAAiB,SAAS,EAAmB,EAAE,EACrD,KAAK,OAAO,EAAO,EAAiB,CAAC,CACvC,CAAC,CACH,MACE,KAAK,OAAO,EAAO,CAAC,CAExB,CAAC,EACD,KAAK,iBAAiB,CAAC,EAEzB,IAAM,EAAuB,KAAK,OAAO,CAAc,EACjD,EAAwB,EAAqB,OAC7C,EAAU,KAAK,WAAW,EAAU,CAAqB,EAC/D,MAAO,CACL,WACA,UACA,aAAc,EAAM,MAAM,CAAO,EACjC,SAAU,CACZ,CACF,CACA,WAAW,EAAU,EAAuB,CAC1C,IAAM,EAAiB,EAAS,OAI9B,OAHE,EAAS,SAAW,EACf,EAEA,KAAK,QAAQ,aAAa,EAAiB,EAAE,CAAC,EAEzD,CACF,EChNM,GAAN,cAA0B,CAAiB,CACzC,YAAY,EAAS,CACnB,MAAM,CAAO,EACb,KAAK,QAAU,IAAI,EAAQ,CAAO,CACpC,CAEA,MAAM,CACJ,WACA,aACC,CACD,IAAM,EAAU,CAAC,EACb,EAAY,EAChB,KAAO,EAAY,EAAS,QAAQ,CAClC,IAAM,EAAc,KAAK,eAAe,EAAU,CAAS,EACrD,EAAY,KAAK,aAAa,EAAU,CAAS,EACvD,GAAI,GAAe,KACjB,MAEF,GAAM,CACJ,QACA,aACE,KAAK,cAAc,EAAa,CAAS,EAC7C,GAAI,EAAO,CACT,IAAM,EAAI,EAAM,MAAQ,EAAM,EAAE,CAAC,OAAS,EACpC,EAAc,KAAK,eAAe,EAAW,CAAS,EAC5D,EAAQ,KAAK,KAAK,eAAe,EAAW,EAAG,EAAO,CAAW,CAAC,EAClE,EAAY,EAAI,CAClB,CACF,CAQA,OAPoB,EAAQ,KAAK,GACxB,aAAiB,OAEZ,EAEL,QAAQ,IAAI,CAAO,EAErB,CACT,CAEA,eAAe,EAAW,EAAG,EAAO,EAAa,CAC/C,IAAM,EAAY,CAChB,QAAS,SACT,EAAG,EAAM,MACT,IACA,MAAO,EAAM,GACb,YACA,YAAa,EACb,YAAa,EAAM,EAAE,CAAC,OAAS,EAAU,MAC3C,EASA,OARI,aAAuB,QAClB,EAAY,KAAK,IACf,CACL,GAAG,EACH,YAAa,CACf,EACD,EAEI,CACL,GAAG,EACH,aACF,CACF,CACA,eAAe,EAAU,EAAW,CAClC,IAAM,EAAS,WAEf,MADA,GAAO,UAAY,EACZ,EAAO,KAAK,CAAQ,CAC7B,CACA,aAAa,EAAU,EAAW,CAChC,IAAM,EAAO,YAEb,MADA,GAAK,UAAY,EACV,EAAK,KAAK,CAAQ,CAC3B,CACA,cAAc,EAAa,EAAW,CACpC,IAAM,EAAe,aACjB,EACA,EAAY,GAChB,GAAI,GAAa,EAAY,EAAE,CAAC,OAAS,EAAU,EAAE,CAAC,OAAQ,CAI5D,EAAQ,EAKR,IAAM,EAAO,EAAa,KAAK,EAAM,EAAE,EACnC,IACF,EAAY,EAAK,GAErB,KAIE,GAAQ,EACJ,IACF,EAAY,EAAM,IAGtB,MAAO,CACL,QACA,WACF,CACF,CACA,eAAe,EAAW,EAAW,CACnC,IAAM,EAAU,EAAU,MAAM,CAAS,EAQzC,OAPI,aAAmB,QACd,EAAQ,KAAK,GACG,KAAK,QAAQ,2BAA2B,EAAW,CACtD,CAAC,CAAC,OACrB,EAEkB,KAAK,QAAQ,2BAA2B,EAAW,CACtD,CAAC,CAAC,OACtB,CACF,EClHM,GAAN,cAA4B,CAAiB,CAC3C,aAAc,CACZ,MAAM,GAAG,SAAS,EAClB,KAAK,UAAY,CACnB,CAEA,MAAM,CACJ,YACC,CAeD,IAAM,EAAS,CAAC,EAChB,GAAI,EAAS,SAAW,EACtB,MAAO,CAAC,EAEV,IAAI,EAAI,EACJ,EAAY,KACV,EAAiB,EAAS,OAChC,IAAK,IAAI,EAAI,EAAG,EAAI,EAAgB,GAAK,EAAG,CAC1C,IAAM,EAAQ,EAAS,WAAW,CAAC,EAAI,EAAS,WAAW,EAAI,CAAC,EAIhE,GAHI,IAAc,OAChB,EAAY,GAEV,IAAU,EAAW,CACvB,IAAM,EAAI,EAAI,EACd,KAAK,OAAO,CACV,IACA,IACA,MAAO,EACP,WACA,QACF,CAAC,EACD,EAAI,EACJ,EAAY,CACd,CACF,CAQA,OAPA,KAAK,OAAO,CACV,IACA,EAAG,EAAiB,EACpB,MAAO,EACP,WACA,QACF,CAAC,EACM,CACT,CACA,OAAO,CACL,IACA,IACA,QACA,WACA,UACC,CACD,GAAI,EAAI,EAAI,GAAK,KAAK,IAAI,CAAK,IAAM,EAAG,CACtC,IAAM,EAAgB,KAAK,IAAI,CAAK,EACpC,GAAI,EAAgB,GAAK,GAAiB,KAAK,UAAW,CACxD,IAAM,EAAQ,EAAS,MAAM,EAAG,EAAI,GAAK,GAAG,EACtC,CACJ,eACA,iBACE,KAAK,YAAY,CAAK,EAC1B,OAAO,EAAO,KAAK,CACjB,QAAS,WACT,IACA,IACA,MAAO,EAAS,MAAM,EAAG,EAAI,GAAK,GAAG,EACrC,eACA,gBACA,UAAW,EAAQ,CACrB,CAAC,CACH,CACF,CACA,OAAO,IACT,CACA,YAAY,EAAO,CAGjB,IAAI,EAAe,UACf,EAAgB,GAWpB,OAVI,EAAU,KAAK,CAAK,GACtB,EAAe,QACf,EAAgB,IACP,EAAU,KAAK,CAAK,GAC7B,EAAe,QACf,EAAgB,IACP,EAAU,KAAK,CAAK,IAC7B,EAAe,SACf,EAAgB,IAEX,CACL,eACA,eACF,CACF,CACF,ECzGM,GAAN,cAA2B,CAAiB,CAC1C,aAAc,CACZ,MAAM,GAAG,SAAS,EAClB,KAAK,WAAa,mDACpB,CACA,MAAM,CACJ,YACC,CACD,IAAM,EAAU,CAAC,EAKjB,OAJA,OAAO,KAAK,KAAK,QAAQ,MAAM,CAAC,CAAC,QAAQ,GAAa,CACpD,IAAM,EAAQ,KAAK,QAAQ,OAAO,GAClC,EAAO,EAAS,KAAK,OAAO,EAAU,EAAO,CAAS,CAAC,CACzD,CAAC,EACM,EAAO,CAAO,CACvB,CACA,eAAe,EAAW,EAAU,EAAO,CAMzC,MALI,CAAC,EAAU,SAAS,QAAQ,GAEhC,KAAK,WAAW,KAAK,EAAS,OAAO,CAAK,CAAC,EAClC,EAEF,CACT,CAEA,OAAO,EAAU,EAAO,EAAW,CACjC,IAAI,EACE,EAAU,CAAC,EACb,EAAI,EACF,EAAiB,EAAS,OAChC,KAAO,EAAI,EAAiB,GAAG,CAC7B,IAAI,EAAI,EAAI,EACR,EAAgB,KAChB,EAAQ,EAEZ,IADA,EAAe,KAAK,eAAe,EAAW,EAAU,CAAC,IAC5C,CAEX,IAAM,EAAY,EADD,EAAS,OAAO,EAAI,CACN,IAAM,CAAC,EAClC,EAAQ,GACR,EAAe,GAEnB,GAAI,EAAI,EAAgB,CACtB,IAAM,EAAU,EAAS,OAAO,CAAC,EAC3B,EAAkB,EAAU,OAClC,IAAK,IAAI,EAAI,EAAG,EAAI,EAAiB,GAAK,EAAG,CAC3C,IAAM,EAAW,EAAU,GAG3B,GAFA,GAAgB,EAEZ,EAAU,CACZ,IAAM,EAAgB,EAAS,QAAQ,CAAO,EAE9C,GAAI,IAAkB,GAAI,CACxB,EAAQ,GAEJ,IAAkB,IAKpB,GAAgB,GAElB,IAAM,EAAiB,EAEnB,IAAkB,IAIpB,GAAS,EACT,EAAgB,GAElB,KACF,CACF,CACF,CACF,CAEA,GAAI,EACF,GAAK,MAEA,CAED,EAAI,EAAI,GACV,EAAQ,KAAK,CACX,QAAS,UACT,IACA,EAAG,EAAI,EACP,MAAO,EAAS,MAAM,EAAG,CAAC,EAC1B,MAAO,EACP,QACA,cACF,CAAC,EAGH,EAAI,EACJ,KACF,CACF,CACF,CACA,OAAO,CACT,CACF,ECxGM,GAAqB,OAAO,IAAI,EAAgB,KAAK,EAAE,EAAE,EAAE,EAM3D,GAAN,MAAM,UAAuB,CAAiB,CAC5C,OAAO,yBAAyB,EAAU,CACxC,IAAM,EAAqB,CAAC,GAAG,EAAS,MAAM,EAAE,CAAC,CAAC,OAAO,GAAK,GAAe,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAM,IAAM,CACxG,IAAM,EAAI,EAAK,IAAI,CAAC,EAMpB,OALI,EACF,EAAK,IAAI,EAAG,SAAS,EAAG,EAAE,EAAI,CAAC,EAE/B,EAAK,IAAI,EAAG,CAAC,EAER,CACT,EAAG,IAAI,GAAK,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,EAAI,GAAI,CAAC,EAAI,KAAO,EAAI,CAAC,EACzD,GAAI,CAAC,EAAmB,OAAQ,OAChC,IAAM,EAAQ,EAAmB,GAE7B,OAAM,GAAK,GACf,OAAO,EAAM,EACf,CACA,OAAO,kBAAkB,EAAW,CAClC,IAAM,EAAU,EAAU,QAAQ,GAAc,MAAM,EACtD,OAAW,OAAO,MAAM,EAAQ,OAAO,EAAQ,MAAM,EAAQ,GAAI,GAAG,CAItE,CACA,MAAM,CACJ,YACC,CACD,IAAM,EAAS,CAAC,EAChB,GAAI,EAAS,SAAW,EAAG,OAAO,EAClC,IAAM,EAAkB,EAAe,yBAAyB,CAAQ,EACxE,GAAI,IAAoB,IAAA,GAAW,OAAO,EAC1C,IAAM,EAAc,EAAe,kBAAkB,CAAe,EACpE,IAAK,IAAM,KAAS,EAAS,SAAS,CAAW,EAAG,CAClD,GAAI,EAAM,QAAU,IAAA,GAAW,SAI/B,IAAM,EAAI,EAAM,MAAQ,EACxB,EAAO,KAAK,CACV,QAAS,YACT,MAAO,EACP,IACA,EAAG,CACL,CAAC,CACH,CACA,OAAO,CACT,CACF,EC9CM,GAAN,cAAgC,CAAiB,CAC/C,YAAY,EAAS,CACnB,MAAM,CAAO,EACb,KAAK,WAAa,IAAI,EAAgB,KAAK,QAAS,EAAI,EACxD,KAAK,eAAiB,IAAI,EAAU,KAAK,QAAS,EAAI,EACtD,KAAK,kBAAoB,IAAI,EAAa,KAAK,QAAS,EAAI,CAC9D,CACA,MAAM,EAAc,CAClB,GAAM,CACJ,YACE,EAEE,EAAoB,KAAK,WAAW,MAAM,CAAY,EACtD,EAAwB,KAAK,eAAe,MAAM,CAAY,EAC9D,EAA2B,KAAK,kBAAkB,MAAM,CAAY,EACpE,EAA4B,KAAK,wBAAwB,CAAC,GAAG,EAAmB,GAAG,EAAuB,GAAG,CAAwB,CAAC,EAEtI,EAAc,KAAK,qBAAqB,CAAyB,EAEvE,OAAO,KAAK,kBAAkB,EAAa,CAAQ,CACrD,CACA,wBAAwB,EAAS,CAE/B,MAAO,CAAC,GAAG,CAAO,CAAC,CAAC,MAAM,EAAG,IACvB,EAAE,IAAM,EAAE,EACV,EAAE,IAAM,EAAE,EAEV,EAAE,WAAa,EAAE,SAEjB,EAAE,OAAS,EAAE,KAEV,EAAE,KAAO,EAAE,KAFY,EAAE,KAAO,EAAI,GAFL,EAAE,SAAW,EAAI,GAF/B,EAAE,EAAI,EAAE,EADR,EAAE,EAAI,EAAE,CAQjC,CAAC,CAED,QAAQ,EAAK,IAAU,CACtB,IAAM,EAAO,EAAI,EAAI,OAAS,GAI9B,OAHI,CAAC,GAAQ,EAAM,EAAI,EAAK,IAC1B,EAAI,KAAK,CAAK,EAET,CACT,EAAG,CAAC,CAAC,CACP,CACA,qBAAqB,EAAmB,CACtC,OAAO,EAAkB,IAAI,IAAU,CACrC,KAAM,EAAM,YACZ,EAAG,EAAM,EACT,EAAG,EAAM,EACT,KAAM,EAAM,KACZ,eAAgB,EAAM,cACxB,EAAE,CACJ,CACA,kBAAkB,EAAa,EAAU,CACvC,IAAM,EAAY,CAAC,EACnB,GAAI,EAAY,SAAW,EACzB,OAAO,EAGT,IAAM,EAAgB,CAAC,GAAG,CAAW,CAAC,CAAC,MAAM,EAAG,IAAM,EAAE,EAAI,EAAE,CAAC,EAE/D,IAAK,IAAI,EAAW,EAAG,EAAW,EAAc,OAAQ,GAAY,EAAG,CACrE,IAAM,EAAqB,KAAK,uBAAuB,EAAe,EAAU,CAAQ,EACxF,EAAU,KAAK,GAAG,CAAkB,CACtC,CACA,OAAO,CACT,CAEA,uBAAuB,EAAe,EAAU,EAAU,CACxD,IAAM,EAAY,CAAC,EACb,EAAa,EAAc,GAE7B,EAAkB,CAAC,CAAU,EAC7B,EAAa,EAAW,EAE5B,IAAK,IAAI,EAAU,EAAW,EAAG,EAAU,EAAc,OAAQ,GAAW,EAAG,CAC7E,IAAM,EAAY,EAAc,GAE5B,KAAK,oBAAoB,EAAiB,EAAW,CAAQ,GAC/D,EAAgB,KAAK,CAAS,EAC9B,EAAa,EAAU,GACd,EAAU,EAAI,IAEnB,EAAgB,OAAS,GAC3B,EAAU,KAAK,KAAK,wBAAwB,EAAiB,CAAQ,CAAC,EAExE,EAAkB,CAAC,CAAS,EAC5B,EAAa,EAAU,EAG3B,CAKA,OAHI,EAAgB,OAAS,GAC3B,EAAU,KAAK,KAAK,wBAAwB,EAAiB,CAAQ,CAAC,EAEjE,CACT,CACA,oBAAoB,EAAiB,EAAW,EAAU,CAExD,IAAM,EAAW,EAAgB,EAAgB,OAAS,GACpD,EAAc,EAAS,MAAM,EAAS,EAAI,EAAG,EAAU,CAAC,EAExD,EAAa,CAAC,GAAI,IAAK,IAAK,IAAK,IAAK,EAAE,EAExC,EAAiB,IAAgB,GAEjC,EAAoB,EAAW,KAAK,GAAO,IAAgB,CAAG,EAG9D,EAAc,EAAY,SAAW,GAAK,IAAgB,EAAY,YAAY,GAAK,IAAgB,EAAY,YAAY,EACrI,OAAO,GAAqB,GAAkB,CAChD,CACA,wBAAwB,EAAU,EAAU,CAC1C,IAAM,EAAa,EAAS,GACtB,EAAY,EAAS,EAAS,OAAS,GACvC,EAAQ,EAAS,IAAI,GAAS,EAAM,IAAI,EAExC,EAAQ,EAAS,IAAI,GAAS,EAAM,IAAI,EACxC,EAAY,EAAM,OAAO,EAAM,IAAM,IAAM,GAAK,GAAQ,EAAM,EAAI,EAAE,EAEpE,EAAkB,EAAS,IAAI,GAAS,EAAM,cAAc,EAC5D,EAAiB,KAAK,cAAc,CAAe,GAAK,EAAW,eACzE,MAAO,CACL,QAAS,eACT,EAAG,EAAW,EACd,EAAG,EAAU,EACb,MAAO,EAAS,MAAM,EAAW,EAAG,EAAU,EAAI,CAAC,EACnD,QACA,UAAW,EAAM,OACjB,iBACA,WACF,CACF,CACA,cAAc,EAAO,CACnB,GAAI,EAAM,SAAW,EAAG,OAAO,KAC/B,IAAM,EAAS,IAAI,IACf,EAAW,EACX,EAAa,KASjB,OARA,EAAM,QAAQ,GAAQ,CACpB,IAAM,GAAS,EAAO,IAAI,CAAI,GAAK,GAAK,EACxC,EAAO,IAAI,EAAM,CAAK,EAClB,EAAQ,IACV,EAAW,EACX,EAAa,EAEjB,CAAC,EACM,CACT,CACF,EC3IM,GAAN,KAAe,CACb,YAAY,EAAS,CACnB,KAAK,QAAU,EACf,KAAK,SAAW,CAAC,EACjB,KAAK,SAAW,CACd,KAAM,IAAI,GAAU,KAAK,OAAO,EAChC,WAAY,IAAI,EAAgB,KAAK,OAAO,EAC5C,eAAgB,IAAI,EAAU,KAAK,OAAO,EAC1C,kBAAmB,IAAI,EAAa,KAAK,OAAO,EAChD,MAAO,IAAI,GAAW,KAAK,OAAO,EAClC,OAAQ,IAAI,GAAY,KAAK,OAAO,EACpC,SAAU,IAAI,GAAc,KAAK,OAAO,EACxC,QAAS,IAAI,GAAa,KAAK,OAAO,EACtC,UAAW,IAAI,GAAe,KAAK,OAAO,EAC1C,aAAc,IAAI,GAAkB,KAAK,OAAO,CAClD,EACA,OAAO,QAAQ,KAAK,QAAQ,QAAQ,CAAC,CAAC,SAAS,CAAC,EAAK,KAAa,CAChE,KAAK,SAAS,GAAO,IAAI,EAAQ,SAAS,KAAK,OAAO,CACxD,CAAC,CACH,CACA,cAAc,EAAS,EAAU,EAAQ,CACvC,GAAI,aAAkB,QAAS,CAC7B,IAAM,EAAiB,EAAO,KAAK,IACjC,EAAO,EAAS,CAAQ,EACjB,EACR,EACD,EAAS,KAAK,CAAc,CAC9B,MACE,EAAO,EAAS,CAAM,CAE1B,CACA,eAAe,EAAS,EAAU,CAWhC,OAVI,EAAS,OAAS,EACb,IAAI,SAAS,EAAS,IAAW,CACtC,QAAQ,IAAI,CAAQ,CAAC,CAAC,SAAW,CAC/B,EAAQ,EAAO,CAAO,CAAC,CACzB,CAAC,CAAC,CAAC,MAAM,GAAS,CAEhB,EAAO,CAAK,CACd,CAAC,CACH,CAAC,EAEI,EAAO,CAAO,CACvB,CACA,MAAM,EAAU,EAAmB,CACjC,IAAM,EAAU,CAAC,EACX,EAAW,CAAC,EAUlB,OATA,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,QAAQ,GAAW,CAC9C,IAAM,EAAS,EAAQ,MAAM,CAC3B,WACA,UAAW,KACX,mBACF,CAAC,EAED,KAAK,cAAc,EAAS,EAAU,CAAM,CAC9C,CAAC,EACM,KAAK,eAAe,EAAS,CAAQ,CAC9C,CACF,EC3EM,EAAS,EACT,EAAS,EAAS,GAClB,EAAO,EAAS,GAChB,EAAM,EAAO,GACb,EAAQ,EAAM,GACd,EAAO,EAAQ,GAEf,EAAQ,CACZ,OAAQ,EACR,OAAQ,EACR,KAAM,EACN,IAAK,EACL,MAAO,EACP,KAAM,EACN,QARc,EAAO,GASvB,EACM,EAA+B,CACnC,QAAS,CACP,EAAG,IACH,EAAG,IACH,EAAG,IACH,EAAG,IACL,EACA,WAAY,CACV,yBAA0B,IAC1B,6BAA8B,GAC9B,6BAA8B,IAC9B,6BAA8B,IAChC,CACF,EAMM,GAAN,KAAoB,CAClB,YAAY,EAAS,CACnB,KAAK,QAAU,CACjB,CACA,oBAAoB,EAAS,CAC3B,IAAM,EAAoB,KAAK,2BAA2B,CAAO,EAC3D,EAAa,CAAC,EAcpB,OAbA,OAAO,KAAK,CAAiB,CAAC,CAAC,QAAQ,GAAa,CAClD,IAAM,EAAe,EACf,EAAU,EAAkB,GAC5B,CACJ,OACA,cACE,KAAK,YAAY,CAAO,EAC5B,EAAW,GAAgB,CACzB,OACA,UACA,QAAS,KAAK,UAAU,EAAY,CAAI,CAC1C,CACF,CAAC,EACM,CACL,aACA,MAAO,KAAK,eAAe,CAAO,CACpC,CACF,CACA,2BAA2B,EAAS,CAClC,IAAM,EAAqB,KAAK,QAAQ,qBAAqB,WAC7D,MAAO,CACL,yBAA0B,GAAW,EAAmB,yBAA2B,MACnF,6BAA8B,EAAU,EAAmB,6BAC3D,6BAA8B,EAAU,EAAmB,6BAC3D,6BAA8B,EAAU,EAAmB,4BAC7D,CACF,CACA,eAAe,EAAS,CACtB,IAAM,EAAiB,KAAK,QAAQ,qBAAqB,QAoBzD,OAlBI,EAAU,EAAe,GAAK,EAEzB,EAEL,EAAU,EAAe,GAAK,EAEzB,EAEL,EAAU,EAAe,GAAK,EAEzB,EAEL,EAAU,EAAe,GAAK,EAGzB,EAGF,CACT,CACA,YAAY,EAAS,CACnB,IAAI,EAAa,YACb,EAAO,KACL,EAAW,OAAO,KAAK,CAAK,EAC5B,EAAa,EAAS,UAAU,GAAQ,EAAU,EAAM,EAAK,EASnE,OARI,EAAa,KACf,EAAa,EAAS,EAAa,GAC/B,IAAe,EAGjB,EAAa,WAFb,EAAO,KAAK,MAAM,EAAU,EAAM,EAAW,GAK1C,CACL,OACA,YACF,CACF,CACA,UAAU,EAAY,EAAO,CAC3B,IAAI,EAAM,EACN,IAAU,MAAQ,IAAU,IAC9B,GAAO,KAET,GAAM,CACJ,kBACE,KAAK,QAAQ,aACX,EAAc,EAAe,GAInC,OAHI,OAAO,GAAgB,WAClB,EAAY,CAAK,EAEnB,EAAY,QAAQ,SAAU,GAAG,GAAO,CACjD,CACF,EC5HI,OACK,KCDL,GAAc,IACT,CACL,QAAS,EAAQ,aAAa,SAAS,MACvC,YAAa,CAAC,EAAQ,aAAa,YAAY,KAAK,CACtD,GCFI,IAAgC,EAAS,EAAO,IAAgB,CACpE,IAAI,EAAU,KAYd,OAXI,GAAe,CAAC,EAAM,MAAQ,CAAC,EAAM,SACvC,AAKE,EALE,EAAM,MAAQ,GACN,EAAQ,aAAa,SAAS,OAC/B,EAAM,MAAQ,IACb,EAAQ,aAAa,SAAS,WAE9B,EAAQ,aAAa,SAAS,OAEjC,EAAM,cAAgB,IAC/B,EAAU,EAAQ,aAAa,SAAS,iBAEnC,CACT,EACM,IAAiC,EAAS,EAAO,IAAgB,CACrE,IAAI,EAAU,KAId,OAHI,IACF,EAAU,EAAQ,aAAa,SAAS,cAEnC,CACT,EACM,IAA6B,EAAS,EAAO,IAC7C,EACK,EAAQ,aAAa,SAAS,kBAEhC,EAAQ,aAAa,SAAS,YAEjC,IAAwB,EAAS,EAAO,IAAgB,CAC5D,IAAM,EAAW,EAAM,eACjB,EAAU,EAAS,YAAY,CAAC,CAAC,SAAS,WAAW,GAAK,EAAS,YAAY,CAAC,CAAC,SAAS,YAAY,GAAK,EAAS,YAAY,CAAC,CAAC,SAAS,OAAO,EAaxJ,OAZI,EAAS,SAAS,WAAW,EACxB,GAA6B,EAAS,EAAO,CAAW,EAE7D,EAAS,SAAS,WAAW,EACxB,GAA8B,EAAS,EAAO,CAAW,EAE9D,EACK,GAA0B,EAAS,EAAO,CAAW,EAE1D,EAAS,SAAS,YAAY,EACzB,EAAQ,aAAa,SAAS,WAEhC,IACT,EACI,IAAqB,EAAS,EAAO,IAAgB,CACvD,IAAM,EAAU,GAAqB,EAAS,EAAO,CAAW,EAC1D,EAAc,CAAC,EACf,EAAO,EAAM,MAYnB,OAXI,EAAK,MAAM,CAAW,EACxB,EAAY,KAAK,EAAQ,aAAa,YAAY,cAAc,EACvD,EAAK,MAAM,CAAkB,GAAK,EAAK,YAAY,IAAM,GAClE,EAAY,KAAK,EAAQ,aAAa,YAAY,YAAY,EAE5D,EAAM,UAAY,EAAM,MAAM,QAAU,GAC1C,EAAY,KAAK,EAAQ,aAAa,YAAY,YAAY,EAE5D,EAAM,MACR,EAAY,KAAK,EAAQ,aAAa,YAAY,IAAI,EAEjD,CACL,UACA,aACF,CACF,EClEI,IAAgB,EAAS,IACvB,EAAM,YAAc,aACf,CACL,QAAS,EAAQ,aAAa,SAAS,YACvC,YAAa,CAAC,EAAQ,aAAa,YAAY,YAAa,EAAQ,aAAa,YAAY,eAAe,CAC9G,EAEK,CACL,QAAS,KACT,YAAa,CAAC,CAChB,ECVE,IAAiB,EAAS,IAAU,CACtC,IAAI,EAAU,EAAQ,aAAa,SAAS,eAI5C,OAHI,EAAM,UAAU,SAAW,IAC7B,EAAU,EAAQ,aAAa,SAAS,cAEnC,CACL,UACA,YAAa,CAAC,EAAQ,aAAa,YAAY,QAAQ,CACzD,CACF,ECTI,GAAkB,IACb,CACL,QAAS,EAAQ,aAAa,SAAS,UACvC,YAAa,CAAC,EAAQ,aAAa,YAAY,SAAS,CAC1D,GCJE,IAAkB,EAAS,IAAU,CACvC,IAAI,EAAU,EAAQ,aAAa,SAAS,WAI5C,OAHI,EAAM,QAAU,IAClB,EAAU,EAAQ,aAAa,SAAS,aAEnC,CACL,UACA,YAAa,CAAC,EAAQ,aAAa,YAAY,qBAAqB,CACtE,CACF,ECTI,OAEK,KCFL,IAAuB,EAAS,IAAU,CAC5C,GAAI,EAAM,UAAY,eACpB,OAAO,KAET,IAAI,EAAU,KACR,EAAc,CAAC,EAcrB,OAZI,EAAM,WAAa,IACrB,EAAU,EAAQ,aAAa,SAAS,WAGtC,EAAM,UACR,EAAY,KAAK,EAAQ,aAAa,YAAY,SAAS,EAE3D,EAAY,KAAK,EAAQ,aAAa,YAAY,WAAW,EAE3D,EAAM,UAAY,GACpB,EAAY,KAAK,EAAQ,aAAa,YAAY,QAAQ,EAErD,CACL,UACA,aACF,CACF,ECbM,EAAiB,IAAgB,CACrC,QAAS,KACT,YAAa,GAA+D,CAAC,CAC/E,GAMM,GAAN,KAAe,CACb,YAAY,EAAS,CACnB,KAAK,QAAU,EACf,KAAK,SAAW,CAAC,EACjB,KAAK,SAAW,CACd,WAAY,GACZ,KAAM,GACN,WAAY,GACZ,MAAO,GACP,OAAQ,GACR,SAAU,GACV,QAAS,GACT,UAAW,GACX,aAAc,EAChB,EACA,OAAO,QAAQ,KAAK,QAAQ,QAAQ,CAAC,CAAC,SAAS,CAAC,EAAK,KAAa,CAC5D,EAAQ,WACV,KAAK,SAAS,GAAO,EAAQ,SAEjC,CAAC,CACH,CACA,YAAY,EAAO,EAAU,CAC3B,GAAI,EAAS,SAAW,EACtB,OAAO,EAAe,CAAC,KAAK,QAAQ,aAAa,YAAY,SAAU,KAAK,QAAQ,aAAa,YAAY,MAAM,CAAC,EAEtH,GAAI,EAAQ,EACV,OAAO,EAAe,EAExB,IAAM,EAAgB,KAAK,QAAQ,aAAa,YAAY,YACtD,EAAe,KAAK,gBAAgB,CAAQ,EAC9C,EAAW,KAAK,iBAAiB,EAAc,EAAS,SAAW,CAAC,EAMxE,OALI,GAAa,KAGf,EAAW,EAAe,CAAC,CAAa,CAAC,EAFzC,EAAS,YAAY,QAAQ,CAAa,EAIrC,CACT,CACA,gBAAgB,EAAU,CACxB,IAAI,EAAe,EAAS,GAE5B,IAAK,IAAI,EAAI,EAAG,EAAI,EAAS,OAAQ,GAAK,EAAG,CAC3C,IAAM,EAAQ,EAAS,GACnB,EAAM,MAAM,OAAS,EAAa,MAAM,SAC1C,EAAe,EAEnB,CACA,OAAO,CACT,CACA,iBAAiB,EAAO,EAAa,CAInC,OAHI,KAAK,SAAS,EAAM,SACf,KAAK,SAAS,EAAM,QAAQ,CAAC,KAAK,QAAS,EAAO,CAAW,EAE/D,EAAe,CACxB,CACF,EC1EI,EAAY,CACd,EAAG,CAAC,IAAK,GAAG,EACZ,EAAG,CAAC,GAAG,EACP,EAAG,CAAC,IAAK,IAAK,IAAK,GAAG,EACtB,EAAG,CAAC,IAAK,IAAI,EACb,EAAG,CAAC,GAAG,EACP,EAAG,CAAC,GAAG,EACP,EAAG,CAAC,IAAK,IAAK,GAAG,EACjB,EAAG,CAAC,IAAK,KAAK,EACd,EAAG,CAAC,IAAK,IAAK,GAAG,EACjB,EAAG,CAAC,IAAK,IAAI,EACb,EAAG,CAAC,IAAK,IAAK,IAAK,GAAG,EACtB,EAAG,CAAC,KAAM,KAAM,KAAM,YAAY,EAClC,EAAG,CAAC,IAAI,EACR,EAAG,CAAC,IAAK,IAAI,EACb,EAAG,CAAC,GAAG,EACP,EAAG,CAAC,KAAK,EACT,EAAG,CAAC,IAAK,GAAG,EACZ,EAAG,CAAC,IAAK,GAAG,EACZ,EAAG,CAAC,IAAK,IAAK,GAAG,EACjB,EAAG,CAAC,KAAM,KAAM,KAAM,KAAM,KAAM,YAAY,EAC9C,EAAG,CAAC,IAAK,IAAI,EACb,EAAG,CAAC,GAAG,CACT,ECvBI,EAAkB,CACpB,SAAU,CACR,YAAa,cACb,WAAY,aACZ,aAAc,eACd,eAAgB,iBAChB,UAAW,YACX,YAAa,cACb,MAAO,QACP,OAAQ,SACR,WAAY,aACZ,OAAQ,SACR,gBAAiB,kBACjB,aAAc,eACd,kBAAmB,oBACnB,YAAa,cACb,WAAY,aACZ,MAAO,OACT,EACA,YAAa,CACX,KAAM,OACN,aAAc,eACd,aAAc,eACd,eAAgB,iBAChB,MAAO,QACP,YAAa,cACb,gBAAiB,kBACjB,UAAW,YACX,SAAU,WACV,sBAAuB,wBACvB,YAAa,cACb,SAAU,WACV,OAAQ,SACR,MAAO,OACT,EACA,eAAgB,CACd,SAAU,WACV,OAAQ,SACR,QAAS,UACT,OAAQ,SACR,QAAS,UACT,KAAM,OACN,MAAO,QACP,IAAK,MACL,KAAM,OACN,MAAO,QACP,OAAQ,SACR,KAAM,OACN,MAAO,QACP,UAAW,WACb,CACF,ECnDM,EAAN,MAAM,CAAS,CACb,YAAY,EAAU,CAAC,EAAG,CACxB,KAAK,QAAU,EACf,KAAK,SAAW,IAAI,GACtB,CACA,OAAO,EAAK,GAAG,EAAM,CACnB,IAAM,EAAY,EAAI,OAAO,CAAC,EACzB,KAAK,SAAS,IAAI,CAAS,GAC9B,KAAK,SAAS,IAAI,EAAW,IAAI,EAAS,CAAC,GAAG,KAAK,QAAS,CAAS,CAAC,CAAC,EAEzE,IAAI,EAAM,KAAK,SAAS,IAAI,CAAS,EACrC,IAAK,IAAI,EAAI,EAAG,EAAI,EAAI,OAAQ,GAAK,EAAG,CACtC,IAAM,EAAI,EAAI,OAAO,CAAC,EACjB,EAAI,SAAS,CAAC,GACjB,EAAI,SAAS,CAAC,EAEhB,EAAM,EAAI,SAAS,CAAC,CACtB,CAEA,MADA,GAAI,MAAQ,EAAI,MAAQ,CAAC,EAAA,CAAG,OAAO,CAAI,EAChC,IACT,CACA,SAAS,EAAO,CACd,OAAO,KAAK,SAAS,IAAI,CAAK,CAChC,CACA,YAAa,CACX,MAAO,CAAC,CAAC,KAAK,IAChB,CACA,SAAS,EAAO,CACT,KAAK,SAAS,CAAK,GACtB,KAAK,SAAS,IAAI,EAAO,IAAI,EAAS,CAAC,GAAG,KAAK,QAAS,CAAK,CAAC,CAAC,CAEnE,CACA,SAAS,EAAO,CACd,OAAO,KAAK,SAAS,IAAI,CAAK,CAChC,CACF,ECnCI,GAAuB,EAAW,KACpC,OAAO,QAAQ,CAAS,CAAC,CAAC,SAAS,CAAC,EAAQ,KAAmB,CAC7D,EAAc,QAAQ,GAAgB,CACpC,EAAQ,OAAO,EAAc,CAAM,CACrC,CAAC,CACH,CAAC,EACM,GCHH,GAAiB,GAAa,CAClC,GAAI,OAAO,GAAc,WAAY,EACnC,MAAU,MAAM,6BAA6B,EAE/C,OAAO,OAAO,CAAS,CAAC,CAAC,QAAQ,GAAiB,CAChD,GAAI,CAAC,MAAM,QAAQ,CAAa,EAC9B,MAAU,MAAM,0CAA0C,EAE5D,EAAc,QAAQ,GAAgB,CACpC,GAAI,OAAO,GAAiB,SAC1B,MAAU,MAAM,yCAAyC,CAE7D,CAAC,CACH,CAAC,CACH,EACM,GAAkB,GAAc,CACpC,GAAI,OAAO,GAAe,WAAY,EACpC,MAAU,MAAM,8BAA8B,EAEhD,OAAO,OAAO,CAAU,CAAC,CAAC,QAAQ,GAAQ,CACxC,GAAI,CAAC,MAAM,QAAQ,CAAI,EACrB,MAAU,MAAM,kCAAkC,EAEpD,EAAK,QAAQ,GAAM,CACjB,GAAI,OAAO,GAAO,UAAY,OAAO,GAAO,SAC1C,MAAU,MAAM,+CAA+C,CAEnE,CAAC,CACH,CAAC,CACH,EACM,EAAc,GAAU,CAC5B,GAAI,OAAO,GAAW,WAAY,EAChC,MAAU,MAAM,0BAA0B,EAE5C,OAAO,OAAO,CAAM,CAAC,CAAC,QAAQ,GAAS,CACrC,GAAI,OAAO,GAAU,WAAY,EAC/B,MAAU,MAAM,yBAAyB,EAE3C,OAAO,OAAO,CAAK,CAAC,CAAC,QAAQ,GAAe,CAC1C,GAAI,CAAC,MAAM,QAAQ,CAAW,EAC5B,MAAU,MAAM,oCAAoC,EAEtD,EAAY,QAAQ,GAAa,CAC/B,GAAI,OAAO,GAAc,UAAY,IAAc,KACjD,MAAU,MAAM,0CAA0C,CAE9D,CAAC,CACH,CAAC,CACH,CAAC,CACH,EACM,GAA8B,GAA0B,CAC5D,GAAI,OAAO,GAA2B,UACpC,MAAU,MAAM,0CAA0C,CAE9D,EACM,GAA4B,GAAwB,CACxD,GAAI,OAAO,GAAyB,UAAY,EAAuB,EACrE,MAAU,MAAM,oDAAoD,CAExE,EACM,GAA4B,GAAwB,CACxD,GAAI,OAAO,GAAyB,UAAY,EAAuB,EACrE,MAAU,MAAM,oDAAoD,CAExE,EACM,GAAiB,GAAa,CAClC,GAAI,OAAO,GAAc,UAAY,EAAY,EAC/C,MAAU,MAAM,yCAAyC,CAE7D,EACM,IAAgB,EAAM,IAAY,CACtC,GAAI,OAAO,GAAS,SAClB,MAAU,MAAM,+BAA+B,EAEjD,GAAI,OAAO,GAAY,WAAY,EACjC,MAAU,MAAM,WAAW,EAAK,mBAAmB,EAErD,GAAI,OAAO,EAAQ,UAAa,WAC9B,MAAU,MAAM,WAAW,EAAK,6BAA6B,EAE/D,GAAI,OAAO,EAAQ,SAAY,WAC7B,MAAU,MAAM,WAAW,EAAK,4BAA4B,EAE9D,GAAI,OAAO,EAAQ,UAAa,WAC9B,MAAU,MAAM,WAAW,EAAK,gCAAgC,CAEpE,EACM,GAAsB,GAAkB,CAC5C,GAAI,OAAO,GAAmB,WAAY,EACxC,MAAU,MAAM,kCAAkC,CAEtD,EACM,GAA0B,GAAgB,CAC9C,IAAI,EAAQ,GAiBZ,OAhBA,OAAO,KAAK,CAAe,CAAC,CAAC,QAAQ,GAAQ,CAC3C,GAAI,KAAQ,EAAc,CACxB,IAAM,EAAkB,EACxB,OAAO,KAAK,EAAgB,EAAgB,CAAC,CAAC,QAAQ,GAAO,CACrD,KAAO,EAAa,KACxB,EAAQ,IAEV,IAAM,EAAc,EAAa,EAAgB,CAAC,GAC9C,OAAO,GAAgB,UAAY,OAAO,GAAgB,aAC5D,EAAQ,GAEZ,CAAC,CACH,KACE,GAAQ,EAEZ,CAAC,EACM,CACT,EACM,GAA4B,GAAwB,CACxD,GAAI,OAAO,GAAyB,WAAY,EAC9C,MAAU,MAAM,wCAAwC,EAE1D,OAAO,KAAK,CAA4B,CAAC,CAAC,QAAQ,GAAO,CACvD,GAAI,EAAE,KAAO,GACX,MAAU,MAAM,wBAAwB,EAAI,aAAa,EAE3D,IAAM,EAAO,EAAqB,GAClC,GAAI,OAAO,GAAS,WAAY,EAC9B,MAAU,MAAM,wBAAwB,EAAI,mBAAmB,EAEjE,OAAO,KAAK,EAA6B,EAAI,CAAC,CAAC,QAAQ,GAAU,CAC/D,GAAI,EAAE,KAAU,GACd,MAAU,MAAM,wBAAwB,EAAI,GAAG,EAAO,aAAa,EAErE,IAAM,EAAQ,EAAK,GACnB,GAAI,OAAO,GAAU,SACnB,MAAU,MAAM,wBAAwB,EAAI,GAAG,EAAO,kBAAkB,EAE1E,GAAI,EAAQ,EAA6B,EAAI,CAAC,GAC5C,MAAU,MAAM,sEAAsE,CAE1F,CAAC,CACH,CAAC,CACH,ECpIM,EAAN,KAAc,CACZ,YAAY,EAAU,CAAC,EAAG,EAAiB,CAAC,EAAG,CAC7C,KAAK,SAAW,CAAC,EACjB,KAAK,UAAY,EACjB,KAAK,aAAe,EAAoB,EAAW,IAAI,CAAU,EACjE,KAAK,WAAa,CAChB,WAAY,CAAC,CACf,EACA,KAAK,mBAAqB,CAAC,EAC3B,KAAK,8BAAgC,CAAC,EACtC,KAAK,aAAe,EACpB,KAAK,OAAS,CAAC,EACf,KAAK,uBAAyB,GAC9B,KAAK,qBAAuB,EAC5B,KAAK,qBAAuB,IAC5B,KAAK,UAAY,IACjB,KAAK,kBAAoB,CAAC,kBAAmB,iBAAkB,aAAc,SAAU,UAAW,cAAe,gBAAiB,aAAc,yBAA0B,kBAAmB,mBAAoB,UAAW,cAAe,eAAe,EAC1P,KAAK,qBAAuB,CAC1B,QAAS,CACP,GAAG,EAA6B,OAClC,EACA,WAAY,CACV,GAAG,EAA6B,UAClC,CACF,EACA,GAAoB,CAAc,EAClC,KAAK,WAAW,CAAO,EACvB,OAAO,QAAQ,CAAc,CAAC,CAAC,SAAS,CAAC,EAAM,KAAa,CAC1D,GAAa,EAAM,CAAO,EAC1B,KAAK,WAAW,EAAM,CAAO,CAC/B,CAAC,CACH,CACA,eAAe,EAAK,CAClB,OAAO,KAAK,kBAAkB,KAAK,GAAQ,IAAQ,GAAQ,EAAI,WAAW,GAAG,EAAK,EAAE,CAAC,CACvF,CAEA,WAAW,EAAU,CAAC,EAAG,CACnB,EAAQ,YACV,GAAe,EAAQ,SAAS,EAChC,KAAK,UAAY,EAAQ,UACzB,KAAK,aAAe,EAAoB,EAAQ,UAAW,IAAI,CAAU,GAEvE,EAAQ,aACV,GAAgB,EAAQ,UAAU,EAClC,KAAK,WAAa,EAAQ,WAC1B,KAAK,sBAAsB,GAEzB,EAAQ,cACV,KAAK,gBAAgB,EAAQ,YAAY,EAEvC,EAAQ,SACV,EAAY,EAAQ,MAAM,EAC1B,KAAK,OAAS,EAAQ,QAEpB,EAAQ,yBAA2B,IAAA,KACrC,GAA4B,EAAQ,sBAAsB,EAC1D,KAAK,uBAAyB,EAAQ,wBAEpC,EAAQ,uBAAyB,IAAA,KACnC,GAA0B,EAAQ,oBAAoB,EACtD,KAAK,qBAAuB,EAAQ,sBAElC,EAAQ,uBAAyB,IAAA,KACnC,GAA0B,EAAQ,oBAAoB,EACtD,KAAK,qBAAuB,EAAQ,sBAElC,EAAQ,YAAc,IAAA,KACxB,GAAe,EAAQ,SAAS,EAChC,KAAK,UAAY,EAAQ,WAEvB,EAAQ,uBAAyB,IAAA,KACnC,GAA0B,EAAQ,oBAAoB,EACtD,KAAK,qBAAuB,CAC1B,QAAS,CACP,GAAG,EAAQ,qBAAqB,OAClC,EACA,WAAY,CACV,GAAG,EAAQ,qBAAqB,UAClC,CACF,EAEJ,CACA,gBAAgB,EAAc,CAC5B,GAAI,GAAwB,CAAY,EACtC,KAAK,aAAe,OAEpB,MAAU,MAAM,8CAA8C,CAElE,CACA,uBAAwB,CACtB,IAAM,EAAqB,CAAC,EACtB,EAAgC,CAAC,EACvC,OAAO,KAAK,KAAK,UAAU,CAAC,CAAC,QAAQ,GAAQ,CAC3C,EAAmB,GAAQ,EAAsB,KAAK,WAAW,EAAK,EACtE,EAA8B,GAAQ,KAAK,iCAAiC,KAAK,WAAW,EAAK,CACnG,CAAC,EACD,KAAK,mBAAqB,EAC1B,KAAK,8BAAgC,CACvC,CACA,iCAAiC,EAAM,CACrC,IAAM,EAAO,EAAK,IAAI,GAChB,OAAO,GAAO,SAGX,EAAG,OAFD,EAAG,SAAS,CAAC,CAAC,MAGxB,EAKD,OAHI,EAAK,SAAW,EACX,EAEF,EAAK,QAAQ,EAAG,IAAM,KAAK,IAAI,EAAG,CAAC,EAAG,IAAS,CACxD,CACA,+BAA+B,EAAM,CACnC,IAAM,EAAkB,CAAC,EAOzB,OANA,EAAK,QAAQ,GAAS,CACpB,IAAM,EAAY,OAAO,GACrB,IAAc,UAAY,IAAc,UAAY,IAAc,YACpE,EAAgB,KAAK,EAAM,SAAS,CAAC,CAAC,YAAY,CAAC,CAEvD,CAAC,EACM,EAAsB,CAAe,CAC9C,CACA,qBAAqB,EAAY,CAC/B,IAAI,EAAmB,CAAC,EACpB,EAA8B,EAKlC,OAJI,IACF,EAAmB,KAAK,+BAA+B,CAAU,EACjE,EAA8B,KAAK,iCAAiC,CAAU,GAEzE,CACL,mBACA,6BACF,CACF,CACA,WAAW,EAAM,EAAS,CACpB,KAAK,SAAS,GAChB,QAAQ,KAAK,WAAW,EAAK,gBAAgB,EAE7C,KAAK,SAAS,GAAQ,CAE1B,CACF,EC/II,IAAY,EAAM,EAAM,IAAgB,CAC1C,IAAI,EACJ,OAAO,SAAkB,GAAG,EAAM,CAEhC,IAAM,EAAU,KACV,MAAc,CAClB,EAAU,IAAA,GACL,GACH,EAAK,MAAM,EAAS,CAAI,CAE5B,EACM,EAAgB,GAAe,CAAC,EAKtC,GAJI,IAAY,IAAA,IACd,aAAa,CAAO,EAEtB,EAAU,WAAW,EAAO,CAAI,EAC5B,EAAe,CACjB,EAAK,MAAM,EAAS,CAAI,EACxB,MACF,CAEF,CACF,ECpBM,MAAa,IAAI,KAAK,CAAA,CAAE,QAAQ,EAChC,GAAN,KAAoB,CAClB,YAAY,EAAU,CAAC,EAAG,EAAiB,CAAC,EAAG,CAC7C,KAAK,QAAU,IAAI,EAAQ,EAAS,CAAc,EAClD,KAAK,QAAU,IAAI,EAAQ,KAAK,OAAO,EACvC,KAAK,SAAW,IAAI,GAAS,KAAK,OAAO,EACzC,KAAK,SAAW,IAAI,GAAS,KAAK,OAAO,EACzC,KAAK,cAAgB,IAAI,GAAc,KAAK,OAAO,CACrD,CACA,oBAAoB,EAAS,CAC3B,OAAO,KAAK,cAAc,oBAAoB,CAAO,CACvD,CACA,YAAY,EAAO,EAAU,CAC3B,OAAO,KAAK,SAAS,YAAY,EAAO,CAAQ,CAClD,CACA,kBAAkB,EAAiB,EAAU,EAAO,CAClD,IAAM,EAAgB,KAAK,QAAQ,2BAA2B,EAAU,CAAe,EACjF,EAAW,EAAK,EAAI,EACpB,EAAc,KAAK,oBAAoB,EAAc,OAAO,EAClE,MAAO,CACL,WACA,GAAG,EACH,GAAG,EACH,SAAU,KAAK,YAAY,EAAY,MAAO,EAAc,QAAQ,CACtE,CACF,CACA,KAAK,EAAU,EAAY,CACzB,IAAM,EAAoB,KAAK,QAAQ,qBAAqB,CAAU,EACtE,OAAO,KAAK,SAAS,MAAM,EAAU,CAAiB,CACxD,CACA,MAAM,EAAU,EAAY,CAC1B,IAAM,EAAkB,EAAS,UAAU,EAAG,KAAK,QAAQ,SAAS,EAC9D,EAAQ,EAAK,EACb,EAAU,KAAK,KAAK,EAAiB,CAAU,EACrD,GAAI,aAAmB,QACrB,MAAU,MAAM,oEAAoE,EAEtF,OAAO,KAAK,kBAAkB,EAAS,EAAiB,CAAK,CAC/D,CACA,MAAM,WAAW,EAAU,EAAY,CACrC,IAAM,EAAkB,EAAS,UAAU,EAAG,KAAK,QAAQ,SAAS,EAC9D,EAAQ,EAAK,EACb,EAAU,MAAM,KAAK,KAAK,EAAiB,CAAU,EAC3D,OAAO,KAAK,kBAAkB,EAAS,EAAiB,CAAK,CAC/D,CACF"}
|