export function getEncodedSnapSave(data) { return data.split('decodeURIComponent(escape(r))}(')[1] ?.split('))')[0] ?.split(',') ?.map(v => v.replace(/"/g, '').trim()) || []; } export function getDecodedSnapSave(data) { return data.split('getElementById("download-section").innerHTML = "')[1] ?.split('"; document.getElementById("inputData").remove(); ')[0] ?.replace(/\\(\\)?/g, '') || ''; } export function decryptSnapSave(data) { const args = getEncodedSnapSave(data); if (args.length < 6) { throw new Error("Invalid SnapSave decryption arguments."); } const decoded = decodeSnapSave(...args); return getDecodedSnapSave(decoded); } export function decodeSnapSave(...args) { let [h, u, n, t, e, r] = args; function decode(d, e, f) { const g = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/'.split(''); let h = g.slice(0, e); let i = g.slice(0, f); let j = d.split('').reverse().reduce((a, b, c) => { let index = h.indexOf(b); return index !== -1 ? a + index * Math.pow(e, c) : a; }, 0); let k = ''; while (j > 0) { k = i[j % f] + k; j = Math.floor(j / f); } return k || '0'; } // Remove duplicate `let r` let result = ''; for (let i = 0, len = h.length; i < len; i++) { let s = ''; while (h[i] !== n[e]) { s += h[i]; i++; } for (let j = 0; j < n.length; j++) { s = s.replace(new RegExp(n[j], "g"), j.toString()); } result += String.fromCharCode(decode(s, e, 10) - t); } return decodeURIComponent(encodeURIComponent(result)); }