diff --git a/.npmignore b/.npmignore new file mode 100644 index 0000000..30d74d2 --- /dev/null +++ b/.npmignore @@ -0,0 +1 @@ +test \ No newline at end of file diff --git a/README.md b/README.md index 1887993..87abd15 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ You must first fetch a token using getToken ```js const token = await fun.getToken({ pkey: "476068BF-9607-4799-B53D-966BE98E2B81", // The public key - surl: "https://roblox-api.arkoselabs.com", // OPTIONAL: Some websites can have a custom service URL + surl: "https://arkoselabs.roblox.com", // OPTIONAL: Some websites can have a custom service URL data: { // OPTIONAL blob: "blob" // Some websites can have custom data passed: here it is data[blob] }, @@ -24,7 +24,13 @@ const token = await fun.getToken({ // in mind to pass a user agent when doing that "User-Agent": 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Safari/537.36' }, - site: "https://www.roblox.com/login", // The site which contains the funcaptcha + bda: { // OPTIONAL + "window__ancestor_origins": ["https://www.roblox.com", "https://www.roblox.com"], + "client_config__sitedata_location_href": "https://www.roblox.com/arkose/iframe", + "window__tree_structure": "[[[]]]", + 'window__tree_index': [0, 0] + }, + site: "https://www.roblox.com", // The site which contains the funcaptcha proxy: "http://127.0.0.1:8888" // OPTIONAL: A proxy to fetch the token, usually not required // NOTE: The proxy will only be used for fetching the token, and not future requests such as getting images and answering captchas }) @@ -57,6 +63,7 @@ console.log(challenge.variant) // The game variant, eg: apple, rotated, maze, di console.log(challenge.instruction) // Self explanatory console.log(challenge.waves) // Wave count console.log(challenge.wave) // Current wave number +console.log(challenge.difficulty) // Challenge difficulty || Img width / 200 // You can then use these functions await challenge.getImage() @@ -93,7 +100,7 @@ function ask(question) { } fun.getToken({ - pkey: "69A21A01-CC7B-B9C6-0F9A-E7FA06677FFC", + pkey: "DF58DD3B-DFCC-4502-91FA-EDC0DC385CFF", }).then(async token => { let session = new fun.Session(token) let challenge = await session.getChallenge() diff --git a/lib/api.d.ts b/lib/api.d.ts index 94e7b22..45e1920 100644 --- a/lib/api.d.ts +++ b/lib/api.d.ts @@ -11,11 +11,15 @@ export interface GetTokenOptions { location?: string; proxy?: string; language?: string; + capi?: string; + hash?: string; + bda?: Record<'window__ancestor_origins' | 'client_config__sitedata_location_href' | 'window__tree_structure' | 'window__tree_index', any>; } export interface GetTokenResult { challenge_url: string; challenge_url_cdn: string; challenge_url_cdn_sri: string; + compatibility_mode_enabled: boolean; disable_default_styling: boolean | null; iframe_height: number | null; iframe_width: number | null; @@ -24,5 +28,14 @@ export interface GetTokenResult { noscript: string; tbio: boolean; token: string; + pow: boolean; + cookie: string; + capi: string; + hash: string; } -export declare function getToken(options: GetTokenOptions): Promise; +interface ErrorResponse { + error?: boolean; + message?: string; +} +export declare function getToken(options: GetTokenOptions): Promise; +export {}; diff --git a/lib/api.js b/lib/api.js index b1cee39..aad2f57 100644 --- a/lib/api.js +++ b/lib/api.js @@ -1,37 +1,69 @@ "use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; Object.defineProperty(exports, "__esModule", { value: true }); exports.getToken = void 0; -const http_1 = require("./http"); -const util_1 = require("./util"); +const http_1 = __importDefault(require("./http")); +const util_1 = __importDefault(require("./util")); async function getToken(options) { + let xheaders = { ...options.headers }; + delete options.headers; options = { surl: "https://client-api.arkoselabs.com", data: {}, - ...options, + headers: { + // ':authority': 'client-api.arkoselabs.com', + // ':method': 'POST', + // ':path': '/fc/gt2/public_key/{key}', + // ':scheme': 'https', + 'Accept': '*/*', + 'Accept-Encoding': '', + 'Accept-Language': 'en-GB,en-US;q=0.9,en;q=0.8,ar;q=0.7', + 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8', + 'Origin': '{surl}', + 'Priority': 'u=1, i', + 'Referer': '{surl}/v2/{capi}/enforcement.{hash}.html', + 'Sec-Ch-Ua': '"Google Chrome";v="131", "Chromium";v="131", "Not_A_Brand";v="24"', + 'Sec-Ch-Ua-Mobile': '?0', + 'Sec-Ch-Ua-Platform': '"Windows"', + 'Sec-Fetch-Dest': 'empty', + 'Sec-Fetch-Mode': 'cors', + 'Sec-Fetch-Site': 'same-origin', + ...xheaders + // 'X-Ark-Esync-Value': '1734588000' + }, + ...options }; - if (!options.headers) - options.headers = { "User-Agent": util_1.default.DEFAULT_USER_AGENT }; - else if (!Object.keys(options.headers).map(v => v.toLowerCase()).includes("user-agent")) + // options.headers[':authority'] = new URL(options.surl).host; + // options.headers[':path'] = options.headers[':path'].replace('{key}', options.pkey); + if (!Object.keys(options.headers).map(v => v.toLowerCase()).includes("user-agent")) options.headers["User-Agent"] = util_1.default.DEFAULT_USER_AGENT; - options.headers["Accept-Language"] = "en-US,en;q=0.9"; - options.headers["Sec-Fetch-Site"] = "same-origin"; - options.headers["Accept"] = "*/*"; - options.headers["Content-Type"] = "application/x-www-form-urlencoded; charset=UTF-8"; - options.headers["sec-fetch-mode"] = "cors"; + options.surl = new URL(options.surl).origin; + let surl = options.surl; + let ua = options.headers[Object.keys(options.headers).find(v => v.toLowerCase() == "user-agent")]; + let { capi, hash, cookie } = await getkeyInfo(surl, options.pkey, options.proxy); + options.capi = capi; + options.hash = hash; if (options.site) { - options.headers["Origin"] = options.surl; - options.headers["Referer"] = `${options.surl}/v2/${options.pkey}/1.5.5/enforcement.fbfc14b0d793c6ef8359e0e4b4a91f67.html`; + options.headers["Origin"] = surl; + options.headers["Referer"] = options.headers["Referer"].replace('{surl}', surl).replace('{capi}', capi).replace('{hash}', hash); } - let ua = options.headers[Object.keys(options.headers).find(v => v.toLowerCase() == "user-agent")]; - let res = await (0, http_1.default)(options.surl, { - method: "POST", - path: "/fc/gt2/public_key/" + options.pkey, + if (cookie) { + options.headers["Cookie"] = cookie; + } + let time = new Date().getTime() / 1000; + let key = Math.round(time - (time % 21600)); + options.headers['X-Ark-Esync-Value'] = key.toString(); + let res = await (0, http_1.default)(surl, { + path: `/fc/gt2/public_key/${options.pkey}`, + method: 'POST', body: util_1.default.constructFormData({ bda: util_1.default.getBda(ua, options), public_key: options.pkey, site: options.site ? new URL(options.site).origin : undefined, userbrowser: ua, - capi_version: "1.5.5", + capi_version: capi, capi_mode: "inline", style_theme: "default", rnd: Math.random().toString(), @@ -40,6 +72,47 @@ async function getToken(options) { }), headers: options.headers, }, options.proxy); - return JSON.parse(res.body.toString()); + try { + const x = JSON.parse(res.body); + x.cookie = cookie; + x.capi = capi; + x.hash = hash; + return x; + } + catch { + return { error: true, message: res.body }; + } } exports.getToken = getToken; +async function getkeyInfo(surl, key, proxy) { + var _a, _b; + let res = await (0, http_1.default)(surl, { + method: 'GET', + "path": `/v2/${key}/api.js`, + headers: { + // ":authority": new URL(surl).host, + // ":method": "GET", + // ":path": `/v2/${key}/api.js`, + // ":scheme": "https", + "Accept": "*/*", + 'Accept-Encoding': '', + "Accept-Language": "en-GB,en-US;q=0.9,en;q=0.8,ar;q=0.7", + "Referer": "https://demo.arkoselabs.com/", + "Sec-Ch-Ua": "\"Google Chrome\";v=\"131\", \"Chromium\";v=\"131\", \"Not_A Brand\";v=\"24\"", + "Sec-Ch-Ua-Mobile": "?0", + "Sec-Ch-Ua-Platform": "\"Windows\"", + "Sec-Fetch-Dest": "script", + "Sec-Fetch-Mode": "no-cors", + "Sec-Fetch-Site": "same-site", + "User-Agent": util_1.default.DEFAULT_USER_AGENT + } + }, proxy); + const data = res.body; + const capi = (_a = data.match(/u="([\d.]+)"/)) === null || _a === void 0 ? void 0 : _a[1]; + const hash = (_b = data.match(/enforcement\.([a-f0-9]+)\.html/)) === null || _b === void 0 ? void 0 : _b[1]; + return { + cookie: typeof res.headers['set-cookie'] == 'string' && res.headers['set-cookie'].split(';')[0].concat(';'), + capi, + hash + }; +} diff --git a/lib/bio.d.ts b/lib/bio.d.ts new file mode 100644 index 0000000..1f77f21 --- /dev/null +++ b/lib/bio.d.ts @@ -0,0 +1 @@ +export default function getBio(): string; diff --git a/lib/bio.js b/lib/bio.js new file mode 100644 index 0000000..152bbbd --- /dev/null +++ b/lib/bio.js @@ -0,0 +1,54 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const data = [ + "eyJtYmlvIjoiNzc0LDAsMTYyLDE3ODs3OTAsMCwxODQsMTcwOzgwNSwwLDIwNCwxNjQ7ODIyLDAsMjEyLDE2MTs4MzksMCwyMjQsMTU5Ozg1NiwwLDIzNiwxNTY7ODcyLDAsMjQyLDE1NTs5MDYsMCwyNDgsMTUzOzk3MiwwLDI1NCwxNTI7MTI0MCwwLDI2MCwxNTI7MTY3MywwLDI2MiwxNTc7Mzk1NiwxLDI2MiwxNTc7NDA4NywyLDI2MiwxNTc7NDYyMiwwLDI0OCwxNjk7NDYzOCwwLDI0MSwxNzY7NDY1NSwwLDIzNiwxODA7NDcwNiwwLDIzMCwxODU7NDc3MiwwLDIyNSwxODc7NDgyMywwLDIyMCwxOTE7NDg3MSwwLDIxNSwxOTQ7NDkyMiwwLDIwOCwxOTc7NDk1NiwwLDIwMywyMDA7NTAwOSwxLDIwMCwyMDE7NTExNCwyLDIwMCwyMDE7IiwidGJpbyI6IiIsImtiaW8iOiIifQ==", + "eyJtYmlvIjoiNzIwNywwLDI2OSwyMDk7NzIyMSwwLDI2MiwxOTA7NzIzOCwwLDI1OSwxODU7NzI1NCwwLDI1NiwxODA7NzI4OSwwLDI1MywxNzQ7NzMyMSwwLDI1MCwxNjc7NzM1NSwwLDI0OCwxNjE7NzU3MiwwLDI0MywxNjI7NzkwNCwwLDIzOCwxNjM7NzkzNywwLDIzMywxNjQ7Nzk3MSwwLDIyNCwxNjU7Nzk4OCwwLDIxMywxNjY7ODAwNCwwLDIwNywxNjY7ODAyMSwwLDE5OCwxNjY7ODA1NCwwLDE4OSwxNjY7ODA4OCwwLDE4MiwxNjU7ODQ1NSwwLDIwMiwxNjY7ODQ3MSwwLDIxNSwxNjY7ODQ4NywwLDIyNCwxNjY7ODUzNywwLDIzMiwxNjY7ODU3MSwwLDIzOSwxNjY7ODYwNCwwLDI0NSwxNjY7ODYzOCwwLDI1MiwxNjY7ODY3MSwwLDI1OSwxNjY7ODcyMSwwLDI2NSwxNjY7ODc3MSwwLDI3MSwxNjY7ODg1NCwwLDI3NywxNjY7OTEwNSwxLDI3OSwxNjg7OTI0MiwyLDI3OSwxNjg7MTAwNDAsMSwyNzksMTY4OzEwMTI1LDIsMjc5LDE2ODsxMDI1MSwxLDI3OSwxNjg7MTAzNjAsMiwyNzksMTY4OzEwNjg5LDEsMjc5LDE2ODsxMDc4MCwyLDI3OSwxNjg7MTA4NTYsMSwyNzksMTY4OzEwOTUxLDIsMjc5LDE2ODsxMTE3NywxLDI3OSwxNjg7MTEyNDcsMiwyNzksMTY4OzExNDg4LDAsMjY1LDE2OTsxMTUwNCwwLDI1OSwxNjk7MTE1MjAsMCwyNTAsMTY5OzExNTM4LDAsMjQzLDE2OTsxMTU1NCwwLDIzNywxNjk7MTE1NzEsMCwyMjksMTY5OzExNjA1LDAsMjIxLDE2ODsxMTYzNywwLDIxMiwxNjc7MTE2NzEsMCwyMDUsMTY2OzExNzAzLDAsMTk4LDE2NTsxMTczNywwLDE5MiwxNjU7MTE3ODcsMCwxODUsMTY1OzExODU0LDAsMTgwLDE2NjsxMjAwNSwwLDE3NSwxNjc7MTIxNTAsMSwxNzQsMTY5OzEyMjUwLDIsMTc0LDE2OTsxMjQyMiwwLDE3NCwxNzc7MTI0NTUsMCwxNzQsMTg2OzEyNDcxLDAsMTc0LDE5MjsxMjUyMSwwLDE3NCwxOTk7MTI4NjAsMSwxNzIsMjAzOzEyOTM1LDIsMTcyLDIwMzsiLCJ0YmlvIjoiIiwia2JpbyI6IiJ9", + "eyJtYmlvIjoiNDk2MSwwLDMwMiwxNTA7NDk5MywwLDI5NCwxNTM7NTAyNiwwLDI4OSwxNTU7NTEwOSwwLDI4NCwxNTc7NTM0NCwwLDI4MCwxNjE7NTM5NCwwLDI3NSwxNjI7NTQ0MywwLDI2OSwxNjI7NTUyNywwLDI2MywxNjI7NTg1NCwxLDI2NiwxNTk7NTk1MywyLDI2NiwxNTk7NjM2NSwxLDI2NiwxNTk7NjQ1NiwyLDI2NiwxNTk7NzAwOSwwLDI1NCwxNjk7NzAyNywwLDI1MCwxNzM7NzA0NCwwLDI0NiwxNzc7NzA2MCwwLDI0MCwxODM7NzA3NywwLDIzNSwxODc7NzA5MywwLDIzMCwxOTA7NzEyNywwLDIyNCwxOTM7NzE3NywwLDIxNywxOTc7NzIxMCwwLDIxMiwxOTk7NzI2MCwwLDIwNiwyMDM7NzMxMCwwLDIwMCwyMDc7NzM2MSwwLDE5NiwyMTE7NzQ0MywxLDE5MiwyMTI7NzUwNCwyLDE5MiwyMTI7IiwidGJpbyI6IiIsImtiaW8iOiIifQ==", + "eyJtYmlvIjoiNTM2MSwwLDI5OSwxNjk7NTM3OCwwLDI5NiwxNTg7NTM5NCwwLDI5MiwxNDU7NTQyOCwwLDI5MSwxMzc7NTc2MSwwLDI4NCwxMzc7NTc5NCwwLDI4MCwxNDE7NTg2MSwwLDI3NCwxNDM7NTk3OCwwLDI2OSwxNDU7NjA3OCwwLDI2NCwxNDk7NjMyOCwwLDI2MCwxNTM7NjgzNiwxLDI2MSwxNTQ7Njk1MCwyLDI2MSwxNTQ7NzM5MiwxLDI2MSwxNTc7NzQ3OSwyLDI2MSwxNTc7Nzk3OCwwLDI1NywxNjA7Nzk5NSwwLDI1MCwxNjc7ODAxMSwwLDI0NCwxNzE7ODAyNywwLDIzNywxNzc7ODA2MSwwLDIzMCwxODM7ODA5NCwwLDIyNCwxODY7ODEyOCwwLDIxOCwxODg7ODE3OCwwLDIxMywxOTA7ODI0NSwwLDIwOCwxOTI7ODI3NywwLDIwMywxOTU7ODMxMSwwLDE5OCwxOTk7ODM2MSwwLDE5MywyMDM7ODQ0MiwwLDE4OCwyMDY7ODQ0MywxLDE4OCwyMDY7ODU0NywyLDE4OCwyMDY7IiwidGJpbyI6IiIsImtiaW8iOiIifQ==", + "eyJtYmlvIjoiNTE3NSwwLDI5MCwxNjQ7NTE5MCwwLDI4MCwxNjY7NTIwNiwwLDI2OCwxNjk7NTI0MCwwLDI2MSwxNzE7NTQyNCwwLDI1NiwxNzA7NTU3MywwLDI1NiwxNjQ7NTcwNywwLDI2MSwxNjM7NjE2NywxLDI2MywxNjE7NjI2OSwyLDI2MywxNjE7Njg4NiwxLDI2MywxNjE7Njk5MiwyLDI2MywxNjE7NzE5NiwxLDI2MywxNjE7NzI2NSwyLDI2MywxNjE7NzUyMywwLDI1MiwxNjE7NzU0MCwwLDI0MiwxNjE7NzU1NiwwLDIzNCwxNjE7NzU3MiwwLDIyNiwxNjE7NzU4OSwwLDIyMCwxNjI7NzYwNiwwLDIxNCwxNjI7NzYyMywwLDIwMywxNjQ7NzY0MCwwLDE5NSwxNjQ7NzY1NywwLDE4NiwxNjU7NzY4OSwwLDE3NywxNjU7NzcwNiwwLDE3MCwxNjU7Nzc0MSwwLDE2NCwxNjM7Nzc5MCwwLDE1OCwxNjE7Nzg2NSwxLDE1NiwxNTk7Nzk0OSwyLDE1NiwxNTk7ODE0MCwwLDE2MCwxNzA7ODE3MywwLDE2MywxNzc7ODIwNiwwLDE2NiwxODQ7ODI0MCwwLDE2NywxODk7ODMwNiwwLDE2NywxOTU7ODU1NiwwLDE2MywyMDA7ODYwMywxLDE2MywyMDE7ODY5NCwyLDE2MywyMDE7IiwidGJpbyI6IiIsImtiaW8iOiIifQ==", + "eyJtYmlvIjoiOTM5LDAsMTcxLDE4OTs5NDYsMCwxOTMsMTkxOzk1MywwLDIxOCwxOTM7OTYwLDAsMjM5LDE5NDs5NjcsMCwyNTgsMTk2Ozk3NCwwLDI3MiwxOTg7OTgwLDAsMjgyLDE5OTs5ODgsMCwyOTIsMjAwOzE4NzIsMCwzMDEsMTg0OzE4NzksMCwyOTEsMTg0OzE4ODYsMCwyODUsMTg0OzE4OTMsMCwyNzcsMTg0OzE5MDAsMCwyNzAsMTg0OzE5MTUsMCwyNjEsMTg0OzE5MjcsMCwyNTQsMTgzOzE5NDIsMCwyNDcsMTgxOzE5NTYsMCwyNDIsMTgwOzE5NzYsMCwyMzcsMTc4OzIwMTIsMCwyMzIsMTc2OzIwOTUsMCwyMjcsMTc3OzIxMzAsMCwyMjIsMTgwOzIxNTgsMCwyMTgsMTg2OzIxODUsMCwyMTMsMTkwOzIyMDYsMCwyMDgsMTk0OzIyMjcsMCwyMDMsMTk4OzIyNDksMCwxOTcsMjAyOzIyNzYsMCwxOTIsMjA0OzIzMTEsMCwxODcsMjA4OzIzNDYsMCwxODEsMjExOzIzNjYsMCwxNzYsMjE0OzIzODgsMCwxNzAsMjIwOzI0MDEsMCwxNjQsMjIzOzI0MTYsMCwxNTksMjI3OzI0MjgsMCwxNTIsMjMzOzI0MzYsMCwxNDcsMjM3OzI0NTAsMCwxNDAsMjQ0OzI0NjQsMCwxMzMsMjQ5OzI0NzgsMCwxMjksMjU1OzI0OTIsMCwxMjUsMjU5OzI1MTMsMCwxMjEsMjY0OzI2ODAsMCwxMjUsMjYwOzI3MDEsMCwxMzAsMjU1OzI3MjIsMCwxMzUsMjUwOzI3MzUsMCwxMzksMjQ2OzI3NTAsMCwxNDUsMjM5OzI3NjQsMCwxNTEsMjMzOzI3NzcsMCwxNTgsMjI3OzI3ODUsMCwxNjMsMjI1OzI3OTcsMCwxNzEsMjIyOzI4MTksMCwxNzcsMjIwOzI4MzksMCwxODIsMjE4OzI4OTUsMCwxODksMjE4OzI5OTIsMCwxODcsMjIzOzMwNDEsMCwxODIsMjI0OzMxMTAsMCwxNzYsMjI0OzMyMzYsMCwxNzEsMjIwOzM1MTAsMSwxNjksMjE4OzM2MTQsMiwxNjksMjE4OyIsInRiaW8iOiIiLCJrYmlvIjoiIn0=", + "eyJtYmlvIjoiMTAxOTEsMCwzMDEsMjMxOzEwMjE5LDAsMjk2LDIzMDsxMDIzOSwwLDI5MCwyMjk7MTAyNjcsMCwyODUsMjI4OzEwMzIzLDAsMjc5LDIyODsxMDY3NywwLDI3MywyMjg7MTA2OTcsMCwyNjYsMjI4OzEwNzEyLDAsMjYxLDIyNjsxMDcyNSwwLDI1NCwyMjQ7MTA3NDYsMCwyNDgsMjIwOzEwNzYwLDAsMjQzLDIxNzsxMDc4MSwwLDIzOCwyMTQ7MTA4MjMsMCwyMzMsMjEwOzEwODcyLDAsMjI4LDIwOTsxMDkxNywxLDIyOCwyMDk7MTEwMjAsMiwyMjgsMjA5OyIsInRiaW8iOiIiLCJrYmlvIjoiIn0=", + "eyJtYmlvIjoiMTA2MzcsMCwzMDAsMjAzOzEwNjQyLDAsMjk1LDIwMTsxMDY1NiwwLDI4OCwxOTU7MTA2NzAsMCwyODMsMTkxOzEwNjg0LDAsMjc4LDE4NTsxMDY5OCwwLDI3NCwxODA7MTA3MTIsMCwyNzAsMTc0OzEwNzI2LDAsMjY2LDE2ODsxMDczOSwwLDI2MywxNjM7MTA3NjEsMCwyNTksMTU4OzEwNzg5LDAsMjU1LDE1MzsxMTA2MSwwLDI2MSwxNTM7MTExMDksMSwyNjQsMTU0OzExMTk0LDIsMjY0LDE1NDsxMTQ3NCwwLDI1NiwxNjM7MTE0NzksMCwyNDUsMTc0OzExNDg1LDAsMjM0LDE4NTsxMTQ5MiwwLDIyNCwxOTU7MTE1MDAsMCwyMTcsMjA0OzExNTA2LDAsMjA5LDIxMTsxMTUxMywwLDIwNCwyMTc7MTE1MjAsMCwxOTcsMjI0OzExNTI3LDAsMTg5LDIzMDsxMTUzNCwwLDE4NCwyMzU7MTE1NDEsMCwxNzcsMjQxOzExNTQ4LDAsMTcxLDI0NTsxMTU1NSwwLDE2NCwyNTE7MTE1NjIsMCwxNTksMjUzOzExNTY5LDAsMTU0LDI1NzsxMTU4MiwwLDE0OSwyNjE7MTE1OTYsMCwxNDMsMjY1OzExNjE3LDAsMTM4LDI2NzsxMTY2NywwLDEzMiwyNzA7MTE3NTAsMCwxMjgsMjY2OzExNzc4LDAsMTI3LDI2MDsxMTc5MiwwLDEyNiwyNTU7MTE4MDUsMCwxMjQsMjQ5OzExODI2LDAsMTIxLDI0MjsxMTg0NywwLDExNiwyMzg7MTE4NjgsMCwxMTEsMjM1OzExODg5LDAsMTA1LDIzMTsxMTkxMCwwLDEwMCwyMjc7MTE5MjUsMCw5NSwyMjQ7MTE5MzcsMCw5MiwyMTg7MTE5NTgsMCw4NywyMTM7MTE5OTMsMCw4MywyMDk7MTIwNTcsMCw3OCwyMDU7MTIxNzUsMCw3NSwyMTA7MTIyNTQsMSw3NCwyMTI7MTIzMjEsMiw3NCwyMTI7IiwidGJpbyI6IiIsImtiaW8iOiIifQ==", + "eyJtYmlvIjoiNTU3OCwwLDI5OSwyODE7NTU4NCwwLDI3NywyNzI7NTU5MSwwLDI2MCwyNjM7NTU5OCwwLDI0NywyNTc7NTYwNCwwLDIzOCwyNTE7NTYxMSwwLDIyOCwyNDY7NTYxOCwwLDIxOSwyNDI7NTYyNSwwLDIxMCwyMzc7NTYzMiwwLDIwNSwyMzU7NTYzOSwwLDIwMCwyMzI7NTY1MywwLDE5MiwyMjk7NTY2OCwwLDE4NSwyMjY7NTY4MSwwLDE3OSwyMjI7NTcwMywwLDE3MywyMTg7NTcxNywwLDE2NywyMTY7NTczOCwwLDE2MiwyMTM7NTc3MywwLDE1NiwyMTA7NTgwOCwwLDE1MCwyMDk7NTgyOCwwLDE0NCwyMDc7NTg1MCwwLDEzNSwyMDc7NTg2MiwwLDEyOCwyMDc7NTg3NiwwLDEyMCwyMDg7NTg5MSwwLDExMiwyMDg7NTkwNSwwLDEwNiwyMTA7NTkxOSwwLDEwMCwyMTE7NTk0MCwwLDkzLDIxMTs1OTYwLDAsODUsMjExOzU5ODEsMCw3NywyMTE7NTk5NSwwLDcxLDIxMTs2MDE1LDAsNjUsMjExOzYwNDQsMCw1OSwyMTE7NjEwMCwwLDUzLDIxMTs2NDU0LDAsNTgsMjA5OzY0NzYsMCw2NCwyMDg7NjQ5MCwwLDcyLDIwNzs2NTAzLDAsODQsMjA3OzY1MTEsMCw5MiwyMDY7NjUxOCwwLDEwNiwyMDY7NjUyNSwwLDEyNCwyMDQ7NjUzMSwwLDE0MiwyMDQ7NjUzOSwwLDE1OCwyMDQ7NjU0NiwwLDE3MCwyMDQ7NjU1MiwwLDE4MCwyMDU7NjU1OSwwLDE4OSwyMDU7NjU3MywwLDE5NiwyMDY7NjU4OCwwLDIwMywyMDY7NjY0MywwLDIxMCwyMDY7Njc5MSwxLDIxMCwyMDY7Njg4MCwyLDIxMCwyMDY7IiwidGJpbyI6IiIsImtiaW8iOiIifQ==", + "eyJtYmlvIjoiNTM5OSwwLDE1NywyODU7NTQxMiwwLDE1OCwyNzU7NTQyNiwwLDE1OSwyNjY7NTQ0MCwwLDE1OSwyNTc7NTQ1NCwwLDE1OSwyNTA7NTQ3NSwwLDE1OSwyNDM7NTQ5NiwwLDE1OSwyMzU7NTUxMCwwLDE2MCwyMjk7NTUzOCwwLDE2MCwyMjI7NTU4NiwwLDE1OSwyMTc7NTkwMiwwLDE1MywyMTY7NTkxNSwwLDE0NywyMTU7NTkyOCwwLDE0MCwyMTM7NTk0MywwLDEzNSwyMTI7NTk3MSwwLDEyOSwyMTA7NjA0MCwwLDEyMywyMTA7NjA5MSwxLDEyMywyMTA7NjE4OCwyLDEyMywyMTA7IiwidGJpbyI6IiIsImtiaW8iOiIifQ==", + "eyJtYmlvIjoiMTE0NjMsMCwyNzEsMjU0OzExNDY5LDAsMjUxLDI1NDsxMTQ3NywwLDIzOSwyNTQ7MTE0ODMsMCwyMzMsMjU0OzExNDk4LDAsMjI2LDI1MzsxMTc3MCwwLDIyNiwyNDY7MTE3OTgsMCwyMjYsMjQwOzExODY3LDAsMjI2LDIzNDsxMTk4NSwwLDIyNCwyMjg7MTIxNzQsMCwyMjIsMjIyOzEyMjg0LDAsMjI1LDIxNjsxMjMyNiwwLDIzMCwyMTI7MTIzNTQsMCwyMzMsMjA3OzEyMzc0LDAsMjM3LDIwMzsxMjQwMiwwLDI0MywyMDA7MTI0MzAsMCwyNDYsMTk1OzEyNDU4LDAsMjUyLDE5MTsxMjQ3OSwwLDI1NiwxODc7MTI1MDcsMCwyNTksMTgyOzEyNTQ5LDAsMjYzLDE3NzsxMjgzNywxLDI2NywxNzQ7MTI5NDMsMiwyNjcsMTc0OzEzMTcwLDAsMjU3LDE3OTsxMzE5MCwwLDI1MSwxODI7MTMyMDQsMCwyNDYsMTg1OzEzMjI1LDAsMjQwLDE4ODsxMzIzOSwwLDIzNiwxOTI7MTMyNjIsMCwyMzEsMTk1OzEzMjgwLDAsMjI2LDE5ODsxMzMwOSwwLDIyMSwyMDE7MTMzMzcsMSwyMTksMjAyOzEzNDIxLDIsMjE5LDIwMjsiLCJ0YmlvIjoiIiwia2JpbyI6IiJ9", + "eyJtYmlvIjoiNDIyLDAsMjA0LDIxOTs1MjIsMCwyMDEsMjE0OzYxMCwwLDIwMiwyMDg7NjUyLDAsMjEwLDIwOTs2NTgsMCwyMTYsMjEwOzY2NSwwLDIzMSwyMTU7NjcyLDAsMjQ3LDIyMjs2NzksMCwyNjIsMjMwOzY4OCwwLDI3NywyMzY7NjkzLDAsMjk4LDI0Mzs2NjUzLDAsMjkyLDI1ODs2NjU5LDAsMjc5LDI1MDs2NjY2LDAsMjcyLDI0NTs2NjczLDAsMjYzLDIzOTs2NjgxLDAsMjU2LDIzMzs2Njg3LDAsMjQ3LDIyNzs2Njk0LDAsMjM4LDIyMjs2NzAxLDAsMjI5LDIxODs2NzA4LDAsMjE5LDIxMzs2NzE1LDAsMjEwLDIxMDs2NzIyLDAsMjAzLDIwODs2NzI5LDAsMTk4LDIwNTs2NzQzLDAsMTkxLDIwMjs2NzU2LDAsMTg2LDE5OTs2Nzg0LDAsMTgwLDE5NTs2ODMzLDAsMTc0LDE5Mjs2ODc0LDAsMTY5LDE4ODs2OTE4LDAsMTY0LDE4NDs2OTQ2LDAsMTU5LDE4MTs2OTcyLDAsMTUzLDE3ODs2OTkzLDAsMTQ4LDE3Njs3MDM1LDAsMTQ1LDE3MTs3MjU4LDAsMTUwLDE2OTs3Mzg1LDEsMTUxLDE2OTs3NDYxLDIsMTUxLDE2OTs3Nzc2LDEsMTUxLDE2OTs3OTA1LDIsMTUxLDE2OTs4MTM1LDAsMTU1LDE3MDs4MTQ5LDAsMTYxLDE3MTs4MTY5LDAsMTY3LDE3Mzs4MTkxLDAsMTczLDE3NTs4MjEyLDAsMTc4LDE3OTs4MjM5LDAsMTgyLDE4Mzs4MjgxLDAsMTg1LDE5MDs4MzIzLDAsMTg0LDE5NTs4MzY1LDAsMTgwLDE5OTs4NDE0LDAsMTc1LDIwNDs4NDQ5LDAsMTcwLDIwNzs4NTIwLDAsMTY1LDIxMzs4NTQ4LDEsMTY0LDIxMzs4NjEwLDIsMTY0LDIxMzsiLCJ0YmlvIjoiIiwia2JpbyI6IiJ9", + "eyJtYmlvIjoiNjk1NywwLDMwMCwxNjA7NzAwMCwwLDI5MywxNjM7NzAzNCwwLDI4OCwxNjU7NzA4NCwwLDI4MiwxNjc7NzEzOCwwLDI3NiwxNjg7NzE5NSwxLDI3MiwxNjg7NzI3MSwyLDI3MiwxNjg7NzM5MCwxLDI3MiwxNjg7NzQ3NSwyLDI3MiwxNjg7Nzc1MiwwLDI3MCwxNzA7Nzc4NiwwLDI2NiwxNzQ7NzgyMSwwLDI2MSwxNzU7Nzg3MCwwLDI1NiwxODA7Nzg5NywwLDI1MSwxODM7NzkyNSwwLDI0NywxODc7Nzk1MywwLDI0MiwxOTE7Nzk3NCwwLDIzNiwxOTQ7ODAwMSwwLDIzMCwxOTc7ODAyMiwwLDIyNSwxOTg7ODA1NywwLDIxOCwyMDA7ODEwNiwwLDIxMywyMDM7ODE2MywxLDIwOCwyMDU7ODI1MiwyLDIwOCwyMDU7IiwidGJpbyI6IiIsImtiaW8iOiIifQ==", + "eyJtYmlvIjoiNzA1OCwwLDMwMSwxODA7NzA3NywwLDI5NSwxNzc7NzA5MSwwLDI5MSwxNzM7NzExMywwLDI4NiwxNzI7NzE0MiwwLDI4MSwxNzA7NzE4OSwwLDI3NiwxNjk7NzI1OSwwLDI3MCwxNjk7NzYxNSwxLDI2NiwxNzA7NzY5OCwyLDI2NiwxNzA7NzkxNCwwLDI2NSwxNzE7NzkzNCwwLDI2MCwxNzY7Nzk1NSwwLDI1NSwxODA7Nzk3NiwwLDI1MCwxODM7ODAwNCwwLDI0NSwxODg7ODAzMiwwLDI0MCwxOTI7ODA2NywwLDIzNSwxOTQ7ODEyMywwLDIzMSwxOTg7ODI0MiwwLDIyNywyMDM7ODI4MywwLDIyMywyMDc7ODMxMCwwLDIxOSwyMTE7ODMzMCwwLDIxNywyMTY7ODM1MSwwLDIxNCwyMjI7ODM2NiwwLDIxMSwyMjg7ODM4MCwwLDIwOSwyMzM7ODM5NCwwLDIwNywyMzg7ODQwOCwwLDIwNSwyNDQ7ODQyOSwwLDIwMiwyNTA7ODQ0OSwwLDIwMSwyNTU7ODQ5MywwLDE5OSwyNjE7ODU0OCwxLDE5NiwyNjQ7ODY0NywyLDE5NiwyNjQ7ODg3NywwLDIwNCwyNTg7ODg4OSwwLDIxMCwyNTI7ODkwNSwwLDIxNSwyNDg7ODkxNywwLDIyMSwyNDI7ODkzMCwwLDIyNCwyMzc7ODk1OCwwLDIyOCwyMzE7ODk3OCwwLDIzMSwyMjY7OTAxMywwLDIzMiwyMjA7OTA2MiwwLDIzMywyMTM7OTA5NywwLDIzMywyMDc7OTEzMiwwLDIzNSwyMDI7OTE1OSwwLDIzNiwxOTc7OTE5NCwwLDIzOCwxOTI7OTI4NSwwLDI0MCwxODc7OTMxOSwwLDIzNCwxOTA7OTM0MCwwLDIyOCwxOTQ7OTM1NCwwLDIyMCwxOTY7OTM2MiwwLDIxNSwxOTc7OTM2OCwwLDIxMCwxOTg7OTM3NSwwLDIwNCwxOTg7OTM4OSwwLDE5MywxOTk7OTM5NiwwLDE4NywxOTk7OTQxMCwwLDE3OSwxOTg7OTQzMSwwLDE3MywxOTY7OTQ1MiwxLDE3MiwxOTU7OTU0MywyLDE3MiwxOTU7OTcyNCwwLDE4MywxOTM7OTczMywwLDE4OSwxOTM7OTczOCwwLDE5NiwxOTE7OTc0NSwwLDIwMiwxOTA7OTc1MSwwLDIwNywxODk7OTc2NSwwLDIxNCwxODg7OTc4MCwwLDIyMCwxODc7OTgwMCwwLDIyNSwxODY7OTgzNCwwLDIzMSwxODU7OTg5MiwwLDIzNywxODU7MTAwMzAsMCwyNDMsMTgxOzEwMTIyLDAsMjQ0LDE3NjsxMDE5NywwLDI0NSwxNzE7MTAyNjcsMCwyNDcsMTY2OzEwNDcwLDAsMjUyLDE2MjsxMDU3NSwwLDI1NywxNjM7MTA2NDMsMCwyNTcsMTY5OzEwNjkxLDAsMjU4LDE3NTsxMDcxMiwwLDI2MiwxODI7MTA3MjAsMCwyNjgsMTg3OzEwNzI3LDAsMjc3LDE5ODsxMDczMywwLDI5MywyMTY7MTExMDMsMCwyNTYsMjg1OzExMTE2LDAsMjUzLDI3NzsxMTEzMCwwLDI1MSwyNzE7MTExNDQsMCwyNTAsMjY2OzExMTY0LDAsMjQ4LDI2MTsxMTIxMywwLDI0MywyNTU7MTEyODMsMCwyMzksMjUxOzExMzE3LDAsMjM1LDI0NTsxMTM0NiwwLDIzMywyMzk7MTEzNjYsMCwyMzEsMjM0OzExMzg3LDAsMjMwLDIyOTsxMTQyOSwwLDIyOSwyMjQ7MTE1MDYsMSwyMjYsMjIxOzExNjE4LDIsMjI2LDIyMTsiLCJ0YmlvIjoiIiwia2JpbyI6IiJ9", + "eyJtYmlvIjoiNjYyOTgsMCwzMDEsMTkxOzY2MzExLDAsMjk1LDE5MTs2NjMzOSwwLDI4OCwxOTE7NjY0MDksMCwyODIsMTkxOzY2NTc3LDAsMjc5LDE5Njs2NjYyNCwwLDI3NSwyMDA7NjY3OTIsMCwyNzIsMTk1OzY2ODA1LDAsMjcyLDE4OTs2NjgxOSwwLDI3MywxODQ7NjY4MzQsMCwyNzQsMTc1OzY2ODQ2LDAsMjc1LDE2Nzs2Njg2MCwwLDI3NiwxNjI7NjY4OTYsMCwyNzgsMTU2OzY3MDE3LDEsMjc3LDE1NTs2NzA2OSwyLDI3NywxNTU7NjczNDIsMCwyNzMsMTY2OzY3MzU1LDAsMjY5LDE3NDs2NzM3MCwwLDI2NiwxNzk7NjczODMsMCwyNjMsMTg1OzY3NDA0LDAsMjU5LDE5MTs2NzQyNSwwLDI1NCwxOTY7Njc0NDUsMCwyNTAsMjAxOzY3NDc0LDAsMjQ2LDIwNjs2NzUxNiwwLDI0MCwyMTA7Njc1ODYsMSwyMzYsMjEyOzY3NjQxLDIsMjM2LDIxMjsiLCJ0YmlvIjoiIiwia2JpbyI6IiJ9", + "eyJtYmlvIjoiNTk0NSwwLDMwMCwxNDY7NTk1OCwwLDI5MywxNTI7NTk3MSwwLDI4OCwxNTQ7NTk5NCwwLDI4MiwxNTg7NjAxMywwLDI3NiwxNjE7NjA0MiwwLDI3MCwxNjQ7NjA3NywwLDI2NiwxNjg7NjE3NSwwLDI2MSwxNzE7NjQ4MywxLDI2MSwxNjY7NjU4NiwyLDI2MSwxNjY7Njc2NSwwLDI1MywxNzg7Njc4MCwwLDI0OCwxODM7Njc5MywwLDI0MywxODk7NjgyMiwwLDIzOSwxOTM7Njg0OSwwLDIzNCwxOTY7Njg5MSwwLDIyOCwyMDE7NjkyNiwwLDIyNCwyMDU7Njk4OCwwLDIyMCwyMTA7NzA1MiwwLDIxNSwyMTM7NzE5MSwxLDIxMSwyMTY7NzI2MSwyLDIxMSwyMTY7IiwidGJpbyI6IiIsImtiaW8iOiIifQ==", + "eyJtYmlvIjoiNTcwMSwwLDI5OCwyMDg7NTcxMywwLDI5MiwyMDY7NTcyOCwwLDI4NCwyMDI7NTczNCwwLDI3OSwyMDA7NTc0OCwwLDI3MiwxOTc7NTc2MSwwLDI2NywxOTQ7NTc4NCwwLDI2MSwxOTA7NTgwNCwwLDI1NSwxODQ7NTgxOCwwLDI0OSwxNzk7NTgzMCwwLDI0MywxNzI7NTg0NCwwLDIzOCwxNjY7NTg2NiwwLDIzNCwxNjE7NTkxNCwwLDIyOSwxNTg7NjA2OCwwLDIzMSwxNjM7NjExMCwwLDIyNywxNjc7NjEzOCwwLDIyMiwxNjk7NjI3MCwwLDIyOSwxNjk7NjI4NCwwLDIzNCwxNjg7NjI5OCwwLDI0MiwxNjc7NjMyMiwwLDI0OSwxNjY7NjMzOSwwLDI1NSwxNjU7NjQwMywwLDI2MSwxNjM7NjU2NSwxLDI2MSwxNjM7NjY0MCwyLDI2MSwxNjM7Njg4MywwLDI1NiwxNzA7NjkxMiwwLDI1MiwxNzU7NjkzOSwwLDI0OSwxODA7Njk2OCwwLDI0NiwxODY7NzAwMiwwLDI0MiwxOTI7NzA0MywwLDIzOCwxOTg7NzA5MiwxLDIzNCwyMDE7NzE3NiwyLDIzNCwyMDE7IiwidGJpbyI6IiIsImtiaW8iOiIifQ==", + "eyJtYmlvIjoiNTIwMywwLDI5NywxMzg7NTIxNywwLDI5MiwxNDA7NTIzNywwLDI4NiwxNDE7NTI2NSwwLDI4MSwxNDM7NTI5OSwwLDI3NiwxNDQ7NTM0OSwwLDI3MCwxNDY7NTQ0NywwLDI2NywxNTE7NTYwOSwxLDI2NiwxNTM7NTY3NywyLDI2NiwxNTM7NTc4MCwxLDI2NiwxNTM7NTg1MSwyLDI2NiwxNTM7NTk0OSwxLDI2NiwxNTM7NjAwMywyLDI2NiwxNTM7NjI2MSwwLDI2MiwxNTc7NjI3NiwwLDI1NiwxNjE7NjI5MCwwLDI1MSwxNjY7NjMwMiwwLDI0NSwxNzA7NjMxNiwwLDI0MCwxNzQ7NjMzMCwwLDIzNiwxNzg7NjM1MiwwLDIzMSwxODA7NjM3MywwLDIyNiwxODU7NjQxMywwLDIyMSwxODk7NjQ0MSwwLDIxNiwxOTM7NjQ4NCwwLDIxMCwxOTg7NjUyNSwwLDIwNiwyMDI7NjU1MywwLDIwMiwyMDc7NjYyMywxLDIwMCwyMTI7NjcyMiwyLDIwMCwyMTI7IiwidGJpbyI6IiIsImtiaW8iOiIifQ==", + "eyJtYmlvIjoiNTQzMCwwLDMwMSwyNTA7NTQ0MywwLDI5OCwyNDQ7NTQ1NiwwLDI5NSwyMzU7NTQ3MSwwLDI5NiwyMjQ7NTQ4NiwwLDI5NywyMTU7NTQ5OSwwLDMwMCwyMDY7NTgwMCwwLDMwMSwyMDE7NTgxOSwwLDI5NSwxOTY7NTgzMywwLDI4OCwxOTI7NTg0NywwLDI4MSwxODc7NTg2MCwwLDI3NiwxODQ7NTg4MSwwLDI3MiwxODA7NTkxNSwwLDI2OCwxNzY7NjAwOCwwLDI2NiwxNzE7NjE0MCwwLDI2NiwxNjU7NjI1NCwxLDI2NiwxNjU7NjMxOSwyLDI2NiwxNjU7NjQ0MSwxLDI2NiwxNjU7NjUzNywyLDI2NiwxNjU7Njc3MiwwLDI2MiwxNzA7Njc4NiwwLDI1NywxNzM7NjgyMiwwLDI1MywxNzc7Njg1NiwwLDI0NywxODI7Njg3NywwLDI0MiwxODQ7Njg5MSwwLDIzOCwxODg7NjkxMiwwLDIzMiwxOTE7NjkyNiwwLDIyNywxOTQ7NjkzOSwwLDIyMiwxOTc7Njk1NCwwLDIxNywxOTk7Njk2OSwwLDIxMiwyMDI7Njk4OCwwLDIwNiwyMDY7NzAxNiwwLDIwMCwyMDg7NzAzMCwwLDE5NSwyMTA7NzA1OCwwLDE5MCwyMTI7NzA5MywwLDE4NCwyMTQ7NzEyMCwwLDE3OCwyMTU7NzE0OSwwLDE3MywyMTc7NzE3NiwwLDE2OCwyMTk7NzIxMSwwLDE2MiwyMTk7NzI3NCwwLDE1NiwyMjA7NzMyNCwxLDE1NCwyMjA7NzQwNiwyLDE1NCwyMjA7IiwidGJpbyI6IiIsImtiaW8iOiIifQ==", + "eyJtYmlvIjoiNDczNCwwLDI5NCwyMzc7NDc0MiwwLDI4NywyMzE7NDc0NywwLDI4MCwyMjY7NDc1NSwwLDI3NSwyMjA7NDc2MCwwLDI2OSwyMTU7NDc3NCwwLDI2MiwyMDg7NDc4OSwwLDI1OCwyMDM7NDgwOSwwLDI1MiwxOTk7NDgyNCwwLDI0MSwxOTc7NDgzMCwwLDIzNCwxOTc7NDgzOCwwLDIyNCwxOTU7NDg0NCwwLDIxNiwxOTU7NDg1MSwwLDIwOCwxOTU7NDg2NSwwLDE5NywxOTU7NDg3OCwwLDE4OCwxOTQ7NDg5MiwwLDE4MywxOTM7NDkwNiwwLDE3OCwxOTI7NDkyNywwLDE3MywxOTA7NTIxMywwLDE2NywxODQ7NTIzNSwwLDE2MiwxNzk7NTI0NywwLDE1OSwxNzQ7NTI4MywwLDE1NCwxNzA7NTM1MywwLDE1MCwxNjY7NTYzMiwxLDE1MSwxNjI7NTcyOSwyLDE1MSwxNjI7NTkxMSwxLDE1MSwxNjI7NTk5NCwyLDE1MSwxNjI7NjA5OSwxLDE1MSwxNjI7NjE4OSwyLDE1MSwxNjI7NjI2NSwxLDE1MSwxNjI7NjM0OSwyLDE1MSwxNjI7NjQ0MSwxLDE1MSwxNjI7NjUwOSwyLDE1MSwxNjI7NzExNSwwLDE1NCwxNjI7NzE0MiwwLDE1OCwxNjc7NzE1NiwwLDE2NCwxNzQ7NzE2MywwLDE2OCwxNzk7NzE3MCwwLDE3NSwxODU7NzE3OCwwLDE4MiwxOTI7NzE4NSwwLDE4OCwxOTg7NzE5MiwwLDE5MywyMDM7NzE5OSwwLDIwMSwyMDk7NzIwNiwwLDIwNywyMTE7NzIxMywwLDIxMSwyMTU7NzIyMCwwLDIxNiwyMTc7NzIzMywwLDIyMSwyMjE7NzI2MSwwLDIyNiwyMjM7NzM4OCwwLDIyOCwyMjg7Nzg5MCwwLDIyNCwyMjQ7Nzk5MywwLDIxOCwyMjM7ODA4MywwLDIxMywyMjI7ODExOSwxLDIxMywyMjI7ODIxNywyLDIxMywyMjI7IiwidGJpbyI6IiIsImtiaW8iOiIifQ==", + "eyJtYmlvIjoiNDI3NSwwLDI5MiwxOTA7NDI4MiwwLDI4NSwxODY7NDI4OCwwLDI4MCwxODQ7NDI5NSwwLDI3NCwxODE7NDMwOSwwLDI2OCwxNzY7NDMzOCwwLDI2NCwxNzI7NDYwMSwwLDI2MywxNjc7NDYyMiwwLDI2MCwxNjI7NDY3MiwwLDI1OSwxNTY7NDg3NSwxLDI2MSwxNTk7NDkyOCwyLDI2MSwxNTk7NTAwMCwxLDI2MSwxNTk7NTA4MiwyLDI2MSwxNTk7NTEzNywxLDI2MSwxNTk7NTIyMiwyLDI2MSwxNTk7NTQ2NSwwLDI2MCwxNjM7NTQ4NiwwLDI1OCwxNjg7NTUxNCwwLDI1NSwxNzM7NTUyOCwwLDI1MiwxNzk7NTU0MiwwLDI0OCwxODQ7NTU1NSwwLDI0NCwxOTE7NTU2OSwwLDIzOSwxOTg7NTU4NCwwLDIzNCwyMDM7NTYwNCwwLDIzMCwyMDg7NTY0NiwwLDIyNiwyMTM7NTg1NCwwLDIyNSwyMDg7NTkyNSwwLDIyNywyMDM7NjAwMCwxLDIyNywyMDQ7NjA3MiwyLDIyNywyMDQ7IiwidGJpbyI6IiIsImtiaW8iOiIifQ==", + "eyJtYmlvIjoiNDI2NiwwLDI3MCwyODY7NDI3MiwwLDIyOCwyNzI7NDI3OSwwLDE5NCwyNTg7NDI4NiwwLDE3NiwyNTA7NDI5MywwLDE2NiwyNDQ7NDI5OSwwLDE1OSwyMzk7NDMxOSwwLDE1MywyMzU7NDU1OCwwLDE1OSwyMzA7NDU2NCwwLDE2NiwyMjM7NDU3MSwwLDE3NiwyMTU7NDU3NywwLDE4MywyMDk7NDU4NCwwLDE5NCwyMDE7NDU5MSwwLDIwMCwxOTQ7NDU5OSwwLDIwNywxODc7NDYwNiwwLDIxNCwxODA7NDYxMiwwLDIyMCwxNzQ7NDYxOSwwLDIyNSwxNjc7NDYzMywwLDIzMSwxNTk7NDYzOSwwLDIzNSwxNTU7NDY1MywwLDIzOCwxNTA7NDY5MCwwLDI0MiwxNDQ7NDgyMCwwLDI0NywxNDM7NDg5OCwwLDI1MSwxNDc7NDk1NSwwLDI1MiwxNTM7NTAyNCwwLDI1MCwxNTk7NTE3NiwxLDI1NCwxNjI7NTI1MiwyLDI1NCwxNjI7NTM1OSwxLDI1NCwxNjI7NTQ0MiwyLDI1NCwxNjI7NTYzOSwwLDI1MywxNjY7NTY0MywwLDI0OSwxNzE7NTY1MCwwLDI0NSwxNzc7NTY2NCwwLDIzOSwxODM7NTY3OCwwLDIzNSwxODg7NTY5OCwwLDIzMSwxOTM7NTc0NywwLDIyNywxOTc7NTc4OSwwLDIyMywyMDE7NTgzMSwwLDIxOSwyMDY7NTg3MywwLDIxNSwyMTA7NTkxNSwwLDIxMCwyMTI7NTk1MCwwLDIwNSwyMTY7NTk3NywwLDIwMCwyMTg7NTk5MSwwLDE5NCwyMjA7NjAwNiwwLDE4OCwyMjI7NjAyMCwwLDE4MSwyMjQ7NjAzMywwLDE3MiwyMjU7NjA0NywwLDE2NCwyMjY7NjA2MCwwLDE1NSwyMjg7NjA2NywwLDE1MCwyMjk7NjA4MSwwLDE0MywyMjk7NjA5NSwwLDEzNCwyMjk7NjEwMiwwLDEyOCwyMjk7NjExNiwwLDExOSwyMjk7NjEyMywwLDExNCwyMjc7NjEzOCwwLDEwNiwyMjc7NjE1MiwwLDEwMCwyMjY7NjE3MiwwLDk1LDIyNTs2MjE0LDAsOTAsMjIzOzYzMDQsMCw4NCwyMjM7NjMyMCwxLDg0LDIyMzs2Mzk3LDIsODQsMjIzOyIsInRiaW8iOiIiLCJrYmlvIjoiIn0=", + "eyJtYmlvIjoiNTY3MCwwLDI5NiwxODY7NTY4NSwwLDI4OSwxODM7NTcxMiwwLDI4NCwxODA7NjAxMSwwLDI3OSwxNzY7NjAzMSwwLDI3NCwxNzM7NjA1OSwwLDI2OCwxNjk7NjA4OCwwLDI2MywxNjY7NjE1MSwwLDI1OSwxNjI7NjMzOSwwLDI1NiwxNjc7NjM1OSwwLDI1MywxNzM7NjM3OSwwLDI0OSwxODI7NjM5MywwLDI0NSwxOTI7NjQwMCwwLDI0MywxOTk7NjQwNywwLDIzOCwyMDg7NjQxNCwwLDIzNSwyMTQ7NjQyMCwwLDIzMywyMjE7NjQyOCwwLDIzMCwyMjg7NjQzNSwwLDIyNiwyMzM7NjQ0MywwLDIyNCwyMzg7NjQ0OSwwLDIyMSwyNDM7NjQ2NCwwLDIxOCwyNDg7NjQ3NywwLDIxNCwyNTM7NjQ5OCwwLDIxMSwyNTg7NjUxOCwwLDIwNywyNjI7NjUzOSwwLDIwNCwyNjc7NjU3NCwwLDIwMCwyNzI7NjYyNiwxLDE5OSwyNzQ7NjcxNiwyLDE5OSwyNzQ7Njg3NSwwLDIwNiwyNjk7Njg4NywwLDIxMSwyNjY7NjkwOSwwLDIxNywyNjE7NjkyMywwLDIyMCwyNTY7Njk0NCwwLDIyNSwyNTE7Njk2NCwwLDIzMCwyNDY7Njk4NiwwLDIzMywyNDE7NzAwNiwwLDIzNiwyMzQ7NzAyOCwwLDIzOCwyMjg7NzA0OCwwLDIzOSwyMjI7NzA2OSwwLDI0MCwyMTY7NzA5MSwwLDI0MSwyMTE7NzExOSwwLDI0MywyMDU7NzE1OSwwLDI0MywxOTg7NzIwOSwwLDI0MywxOTI7NzI3MSwwLDIzOCwxOTA7NzI5MywwLDIzMSwxOTA7NzMwNywwLDIyNCwxOTA7NzMyNiwwLDIxNiwxOTA7NzM0MSwwLDIwNywxOTA7NzM1NSwwLDE5OCwxOTA7NzM2OSwwLDE5MCwxOTA7NzM4MywwLDE4NCwxODk7NzM5NywxLDE4MiwxODk7NzQ5NSwyLDE4MiwxODk7NzY2MiwwLDE5MCwxODk7NzY2OCwwLDE5NiwxODk7NzY4MiwwLDIwNSwxODg7NzY4OSwwLDIxMSwxODY7NzcwMiwwLDIxNywxODY7NzcyMywwLDIyMiwxODQ7Nzc2NiwwLDIyNywxODM7NzgyMiwwLDIzMiwxODI7Nzk2OCwwLDIzNywxNzk7ODA3MywwLDI0MiwxNzQ7ODEyNiwwLDI0NywxNzI7ODEzNCwwLDI1NCwxNjk7ODE0MSwwLDI1OSwxNjc7ODE0OCwwLDI2NywxNjM7ODE1NSwwLDI3OCwxNTY7ODE2MiwwLDI5MSwxNDg7OTA5NiwwLDMwMCwxMTU7OTEwMiwwLDI5NiwxMjU7OTEwOSwwLDI5MSwxMzQ7OTExNywwLDI4NywxNDE7OTEyMywwLDI4MywxNDc7OTE0MSwwLDI4MiwxNTY7OTE1MSwwLDI3OSwxNjE7OTE2NSwwLDI3NSwxNjY7OTE3OSwwLDI3MywxNzI7OTIwMCwwLDI2OSwxNzk7OTIyMCwwLDI2MywxODc7OTI1NiwwLDI2MCwxOTI7OTMxOSwwLDI1NywxOTg7OTQwOSwwLDI1NywxOTE7OTQzMCwwLDI1OCwxODQ7OTQ1OSwwLDI1OSwxNzc7OTQ5MywwLDI2MSwxNzI7OTUzNCwwLDI2MywxNjc7OTU4MywxLDI2MywxNjQ7OTY4OCwyLDI2MywxNjQ7OTk2NiwwLDI2MSwxNzI7MTAwMDEsMCwyNjAsMTc3OzEwMDI3LDAsMjU4LDE4MjsxMDA1NywwLDI1NiwxODg7MTAwNzcsMCwyNTMsMTkzOzEwMDk3LDAsMjUxLDE5ODsxMDExOSwwLDI0OCwyMDM7MTAxNDksMCwyNDUsMjA4OzEwMTkwLDAsMjQwLDIxMTsxMDI0NiwxLDIzNywyMTA7MTAzMjksMiwyMzcsMjEwOyIsInRiaW8iOiIiLCJrYmlvIjoiIn0=", + "eyJtYmlvIjoiMzY5OSwwLDI5MiwyMjA7MzcwNSwwLDI4NiwyMjA7MzcxMywwLDI4MCwyMjA7MzcxOSwwLDI3NSwyMjE7NDAwMSwwLDI3MCwyMTk7NDAxMywwLDI2MCwyMTI7NDAyMCwwLDI1NSwyMDg7NDAyNywwLDI1MCwyMDQ7NDAzNCwwLDI0NSwyMDI7NDA0MSwwLDIzOSwxOTg7NDA0OSwwLDIzNCwxOTU7NDA1NCwwLDIyOSwxOTM7NDA2OSwwLDIyMCwxOTA7NDA3NiwwLDIxNCwxODk7NDA5MCwwLDIwMywxODg7NDA5NiwwLDE5OCwxODc7NDExMSwwLDE4OSwxODQ7NDEyNiwwLDE4MSwxODI7NDEzOSwwLDE3NiwxODE7NDE2NSwwLDE3MSwxNzg7NDIwMiwwLDE2NSwxNzU7NDI0MiwwLDE2MSwxNzE7NDI5NywwLDE1NiwxNjY7NDM3MSwxLDE1NCwxNjU7NDQ1OSwyLDE1NCwxNjU7NDcxNywxLDE1NCwxNjU7NDc5MywyLDE1NCwxNjU7NTA4NCwwLDE1NCwxNzE7NTExMywwLDE1NiwxNzc7NTEzNCwwLDE1OCwxODM7NTE0OCwwLDE2MCwxODg7NTE2OCwwLDE2MiwxOTQ7NTE4OSwwLDE2NCwyMDE7NTIxMSwwLDE2NiwyMDk7NTIyNSwwLDE2NiwyMTU7NTI0NSwwLDE2NywyMjI7NTI4OCwwLDE2OCwyMjc7NTUwNCwwLDE3NCwyMjg7NTcyNSwwLDE3NiwyMjI7NTg5NSwwLDE3NywyMTc7NTkxNSwxLDE3NywyMTc7NTk5OSwyLDE3NywyMTc7IiwidGJpbyI6IiIsImtiaW8iOiIifQ==", + "eyJtYmlvIjoiMzUwNiwwLDI5NiwyMzk7MzUxMywwLDI4MSwyMzU7MzUxOSwwLDI2OSwyMzQ7MzUyNywwLDI1NywyMzE7MzUzNCwwLDI0NSwyMjk7MzU0MCwwLDIzMCwyMjg7MzU0NywwLDIyMCwyMjY7MzU1NCwwLDIxMiwyMjU7MzU2OCwwLDIwMSwyMjU7MzU3NSwwLDE5NSwyMjQ7MzU5NywwLDE4OCwyMjQ7MzYzOCwwLDE4MywyMjM7Mzc2MywwLDE3NywyMjM7Mzc4NCwwLDE3MCwyMjM7Mzc5OSwwLDE1OSwyMjU7MzgwNiwwLDE1MSwyMjY7MzgxMiwwLDE0MiwyMjg7MzgxOSwwLDEzNCwyMjk7MzgyNiwwLDEyOCwyMjk7MzgzNCwwLDEyMywyMzA7Mzg0OCwwLDExNCwyMzI7Mzg2MCwwLDEwMywyMzM7Mzg2NywwLDk1LDIzNDszODc0LDAsODgsMjM2OzM4ODIsMCw3OCwyMzY7Mzg5MCwwLDY4LDIzNzszODk2LDAsNjAsMjM4OzM5MDIsMCw1MywyMzg7MzkxNywwLDQ3LDIzODszOTM3LDAsNDAsMjM4OzM5NzIsMCwzMywyMzc7NDAzNiwwLDI5LDIzMzs0MTQwLDAsMjcsMjI4OzQxOTUsMCwyNywyMjI7NDM0MiwwLDM0LDIyMDs0MzU1LDAsNDEsMjIwOzQzNjksMCw1MCwyMjA7NDM4MywwLDU5LDIxODs0Mzk4LDAsNjgsMjE2OzQ0MTIsMCw3NiwyMTY7NDQyNSwwLDg1LDIxNDs0NDM5LDAsOTMsMjE0OzQ0NTIsMCw5OSwyMTM7NDQ3MywwLDEwNSwyMTM7NDUwOSwwLDExMSwyMTM7NDU3MiwwLDExNywyMTM7NDcwNiwwLDExOSwyMTk7NDgwOCwwLDExNywyMjU7NTA0NywxLDExNiwyMjU7NTEyOSwyLDExNiwyMjU7IiwidGJpbyI6IiIsImtiaW8iOiIifQ==", + "eyJtYmlvIjoiNTI3OCwwLDMwMSwyMDU7NTMwMCwwLDI5NCwyMDQ7NTM4MywwLDI4OCwyMDQ7NTQ1MSwwLDI4NSwxOTk7NTQ3MiwwLDI3OSwxOTY7NTQ4NiwwLDI3MywxOTI7NTUwNywwLDI2OSwxODg7NTUzNCwwLDI2NCwxODU7NTU4MywwLDI2MCwxODE7NTczOCwwLDI1OSwxNzQ7NTgwOCwxLDI1OCwxNzM7NTg2OSwyLDI1OCwxNzM7NTk2OSwxLDI1OCwxNzM7NjAzMCwyLDI1OCwxNzM7NjE1MCwxLDI1OCwxNzM7NjIwNCwyLDI1OCwxNzM7NjU0NiwwLDI1NSwxNzg7NjU2NiwwLDI1MywxODM7NjU4NiwwLDI0OCwxODk7NjYwNywwLDI0MiwxOTU7NjYyMSwwLDIzOCwyMDA7NjYzNSwwLDIzMywyMDU7NjY0OSwwLDIyOCwyMDk7NjY2MywwLDIyMiwyMTM7NjY5MiwwLDIxNywyMTY7NjczMywwLDIxMiwyMTc7Njg1MiwwLDIwNiwyMTc7NjkwOCwwLDIwMCwyMTc7Njk2MywxLDE5NiwyMTc7NzAzMiwyLDE5NiwyMTc7IiwidGJpbyI6IiIsImtiaW8iOiIifQ==", + "eyJtYmlvIjoiMzczNiwwLDI4NSwxNzg7Mzc0NCwwLDI3MCwxODA7Mzc1MCwwLDI1OCwxODE7Mzc1NywwLDI1MCwxODQ7Mzc2NSwwLDI0MSwxODc7Mzc3MiwwLDIzMCwxOTA7Mzc3OSwwLDIyMiwxOTU7NDA5OSwwLDIyOSwxOTE7NDEwNywwLDIzNCwxODk7NDEyMCwwLDI0MCwxODQ7NDEzNSwwLDI0NiwxODE7NDE2MSwwLDI1MywxNzc7NDE5NywwLDI1NywxNzM7NDI2NywwLDI2MiwxNzA7NDY4NywxLDI2MywxNzA7NDc0MSwyLDI2MywxNzA7NDg3NCwxLDI2MywxNzA7NTAwNiwyLDI2MywxNzA7NTIzNSwwLDI1OCwxNzc7NTI1NSwwLDI1NCwxODE7NTI3NiwwLDI0OSwxODU7NTMxNywwLDI0MywxODk7NTM3NCwwLDIzNywxOTI7NTQyMywwLDIzMiwxOTY7NTQ2NSwwLDIyNywxOTg7NTQ5MywwLDIyMiwxOTk7NTUxOSwwLDIxNywyMDE7NTU0OCwwLDIxMiwyMDQ7NTU2OCwwLDIwNiwyMDY7NTU4OSwwLDIwMCwyMDg7NTYxMSwwLDE5NSwyMDk7NTYzOCwwLDE5MCwyMTE7NTY1NCwxLDE4OSwyMTE7NTczNiwyLDE4OSwyMTE7IiwidGJpbyI6IiIsImtiaW8iOiIifQ==", + "eyJtYmlvIjoiNDI4MywwLDMwMSwxNzQ7NDMxNSwwLDI5NywxNzA7NDM1MSwwLDI5MSwxNjg7NDM5MCwwLDI4NSwxNjg7NDQ2MSwxLDI4MSwxNzA7NDU0NCwyLDI4MSwxNzA7NDYyMywxLDI4MSwxNzA7NDcxOSwyLDI4MSwxNzA7NDk0MiwwLDI3OCwxNzE7NDk2OSwwLDI3MSwxNzY7NDk4NCwwLDI2NiwxNzk7NDk5NiwwLDI2MCwxODU7NTAxMCwwLDI1NCwxODk7NTAyNCwwLDI0NywxOTU7NTAzOCwwLDI0MCwyMDE7NTA1MiwwLDIzMywyMDY7NTA2NiwwLDIyOSwyMTE7NTA4MCwwLDIyNSwyMTU7NTEwMSwwLDIxOCwyMTk7NTEzMCwwLDIxNCwyMjM7NTE3OSwwLDIwOSwyMjY7NTMwNSwwLDIwNCwyMjM7NTQwOSwxLDIwMiwyMjE7NTUwNSwyLDIwMiwyMjE7IiwidGJpbyI6IiIsImtiaW8iOiIifQ==", + "eyJtYmlvIjoiNzg4MCwwLDIxNiwxNjQ7ODEwNSwwLDIyMywxNjQ7ODEzMywwLDIyOCwxNjM7ODE1NCwwLDIzMywxNjI7ODE4MSwwLDIzOCwxNjE7ODIwOSwwLDI0MywxNjA7ODI0NiwwLDI0OSwxNjA7ODI3OSwwLDI1NSwxNTk7ODMyMSwwLDI2MSwxNTk7ODM3MCwwLDI2NywxNTk7ODQzOSwxLDI3MSwxNjI7ODQ5NywyLDI3MSwxNjI7ODU4MiwxLDI3MSwxNjI7ODY3MCwyLDI3MSwxNjI7ODgyNSwwLDI2OSwxNjY7ODgzMCwwLDI2NywxNzE7ODgzNywwLDI2NCwxNzY7ODg1MSwwLDI2MCwxODQ7ODg2NCwwLDI1NSwxOTE7ODg3OSwwLDI1MiwxOTg7ODkwMCwwLDI0NywyMDM7ODkyOCwwLDI0MywyMDk7ODk2MSwwLDIzOCwyMTM7OTAwMywwLDIzMywyMTc7OTA0NiwwLDIyOCwyMjE7OTA5NSwwLDIyNCwyMjU7OTEwMSwxLDIyNCwyMjU7OTE3OCwyLDIyNCwyMjU7IiwidGJpbyI6IiIsImtiaW8iOiIifQ==", + "eyJtYmlvIjoiMzkzMiwwLDI1MiwyMzM7MzkzNywwLDIxOCwyMzE7Mzk0NCwwLDE5NiwyMjk7Mzk1MiwwLDE4MiwyMjk7Mzk1OCwwLDE3MiwyMjk7Mzk3MSwwLDE2NywyMjg7NDIzOCwwLDE3MiwyMjY7NDI0MywwLDE4MSwyMjE7NDI1MCwwLDE4NiwyMTk7NDI1OCwwLDE5MywyMTY7NDI3MSwwLDE5OCwyMTM7NDMzNSwwLDIwMiwyMDk7NDM3MCwwLDE5OCwyMDU7NDM4MywwLDE5MywyMDI7NDM5NywwLDE4NywxOTk7NDQxMSwwLDE4MiwxOTQ7NDQyNSwwLDE3NSwxODk7NDQzOCwwLDE3MSwxODQ7NDQ2NywwLDE2NywxNzk7NDUwMiwwLDE2NCwxNzQ7NDU1MCwwLDE2MiwxNjc7NDYwNSwwLDE2MiwxNjE7NDY2MywxLDE2MiwxNjA7NDY4OSwyLDE2MiwxNjA7NDkwNSwxLDE2MiwxNjA7NTAwMiwyLDE2MiwxNjA7NTIzOSwwLDE2MSwxNjg7NTI1MywwLDE2MCwxNzQ7NTI3NCwwLDE1OSwxODE7NTI4OCwwLDE1OCwxODY7NTMwOSwwLDE1NSwxOTI7NTMzMCwwLDE1NCwxOTk7NTM1MCwwLDE1MywyMDU7NTM3MiwwLDE1MiwyMTA7NTQwNywwLDE1MCwyMTY7NTQ0OSwwLDE0OCwyMjI7NTYwMiwwLDE0MywyMjU7NTY2NCwwLDEzOCwyMjY7NTY4NSwwLDEzMSwyMjc7NTY5OCwwLDEyNCwyMjg7NTcxMiwwLDExNSwyMjg7NTcyNiwwLDEwNywyMjg7NTc0MSwwLDEwMCwyMjg7NTc2OCwwLDk0LDIyNzs1ODE4LDAsODksMjI1OzU5MDEsMCw4NywyMjA7NTkzNiwxLDg3LDIxOTs2MDI4LDIsODcsMjE5OyIsInRiaW8iOiIiLCJrYmlvIjoiIn0=", + "eyJtYmlvIjoiMzkyMiwwLDI5NSwxOTk7MzkyNywwLDI4NiwxOTk7MzkzNSwwLDI4MCwxOTk7Mzk0OCwwLDI3MywxOTk7Mzk3NywwLDI2NywxOTg7NDAyNSwwLDI2MywxOTQ7NDA3NCwwLDI2MiwxODk7NDE0NCwwLDI2MCwxODQ7NDU1OCwxLDI2MCwxODQ7NDYzOCwyLDI2MCwxODQ7NTA0MywwLDI1NSwxODU7NTA5MSwxLDI1MSwxODc7NTE5MCwyLDI1MSwxODc7NTQ3NCwwLDI0OSwxODg7NTUwMiwwLDI0NSwxOTI7NTU0NCwwLDIzOSwxOTg7NTU4NiwwLDIzMywyMDI7NTYxOSwwLDIyOSwyMDc7NTY2MiwwLDIyNCwyMTA7NTcwNCwxLDIyMywyMTI7NTc4MiwyLDIyMywyMTI7IiwidGJpbyI6IiIsImtiaW8iOiIifQ==", + "eyJtYmlvIjoiNDU2MywwLDMwMCwxNTc7NDYwMywwLDI5NSwxNjI7NDYzMCwwLDI5MCwxNjU7NDY1OCwwLDI4NSwxNjg7NDY4NiwwLDI3OSwxNjk7NDcyOCwwLDI3MywxNjk7NDc1MCwxLDI3MiwxNjk7NDgxOSwyLDI3MiwxNjk7NDkwMywxLDI3MiwxNjk7NDk3OSwyLDI3MiwxNjk7NTI3OCwwLDI2NywxNzU7NTI5MiwwLDI2NCwxODE7NTMwNiwwLDI1OSwxODY7NTMyMCwwLDI1NCwxOTI7NTMzNSwwLDI0OSwxOTg7NTM0OSwwLDI0NCwyMDM7NTM2MywwLDIzOSwyMDc7NTM4MywwLDIzNCwyMTI7NTQwNCwwLDIyOSwyMTU7NTQ2MSwwLDIyNSwyMTk7NTkyNywwLDIzMSwyMTY7NjIyNywxLDIzMywyMTg7NjMxMSwyLDIzMywyMTg7IiwidGJpbyI6IiIsImtiaW8iOiIifQ==", + "eyJtYmlvIjoiMTAyMywwLDE5NiwxNzc7MTA0NSwwLDE5OSwxNzE7MTA3MywwLDIwNSwxNjQ7MTEwOCwwLDIxMCwxNTk7MTE0OSwwLDIxNiwxNTc7MTE4NSwwLDIyMSwxNTQ7MTIzNCwwLDIyOSwxNTQ7MTI3NiwwLDIzNCwxNTM7MTMzMCwwLDI0MCwxNTM7MTQwOCwwLDI0NiwxNTM7MTY4MSwxLDI0OCwxNTM7MTc0NCwyLDI0OCwxNTM7MTg0MSwxLDI0OCwxNTM7MTkwOCwyLDI0OCwxNTM7MjEzMiwwLDI0MiwxNjA7MjEzOSwwLDIzOSwxNjU7MjE1MiwwLDIzMiwxNzI7MjE2OCwwLDIyNywxNzk7MjE4MSwwLDIyMiwxODM7MjIwMywwLDIxNywxODg7MjIyMSwwLDIxMiwxOTI7MjI2NSwwLDIwOCwxOTg7MjM0NiwwLDIwNCwyMDI7MjUwMSwxLDIwMywyMDI7MjU4NSwyLDIwMywyMDI7IiwidGJpbyI6IiIsImtiaW8iOiIifQ==", + "eyJtYmlvIjoiMTQ4MjcwLDAsMzAwLDEzMDsxNDgyODMsMCwyOTMsMTM5OzE0ODI5MCwwLDI4OSwxNDQ7MTQ4Mjk4LDAsMjg1LDE0ODsxNDgzMTEsMCwyODAsMTU1OzE0ODMyNCwwLDI3NSwxNjE7MTQ4MzQ1LDAsMjcwLDE2NTsxNDgzOTQsMCwyNjYsMTY5OzE0ODY2NiwwLDI3MSwxNzA7MTQ4Njk1LDAsMjgwLDE3MjsxNDg3MDAsMCwyODksMTc1OzE1NDIwMSwwLDI5NCw5MDsxNTQyMDYsMCwyODksOTQ7MTU0MjIxLDAsMjgyLDEwMTsxNTQyMzUsMCwyNzgsMTA3OzE1NDI1NCwwLDI3MywxMTM7MTU0Mjc2LDAsMjcxLDExODsxNTQzMTgsMCwyNjYsMTIxOzE1NDM0NiwwLDI2MSwxMjQ7MTU0MzY3LDAsMjU1LDEyODsxNTQzODAsMCwyNDksMTMxOzE1NDM5NCwwLDI0NCwxMzY7MTU0NDA4LDAsMjM5LDE0MDsxNTQ0MjIsMCwyMzQsMTQ2OzE1NDQzNSwwLDIyOCwxNTQ7MTU0NDQzLDAsMjI0LDE1OTsxNTQ0NDksMCwyMjIsMTY0OzE1NDQ2MywwLDIxNywxNzE7MTU0NDc3LDAsMjE0LDE3NjsxNTQ0OTgsMCwyMTIsMTgxOzE1NDU1MywwLDIwOCwxODU7MTU0NjU4LDAsMjA1LDE5MDsxNTQ3MDAsMCwyMDAsMTkzOzE1NDcyMSwwLDE5NSwxOTc7MTU0NzQyLDAsMTg3LDIwMTsxNTQ3NjIsMCwxODEsMjAzOzE1NDc5MCwwLDE3NiwyMDY7MTU0ODI3LDEsMTczLDIwNzsxNTQ5MDMsMiwxNzMsMjA3OyIsInRiaW8iOiIiLCJrYmlvIjoiIn0=", + "eyJtYmlvIjoiNDA4NSwwLDI5NywyMTk7NDA5MiwwLDI4NywyMTI7NDEwMCwwLDI4MCwyMDg7NDEwNiwwLDI3NSwyMDY7NDEyMCwwLDI3MCwyMDM7NDE0MCwwLDI2NSwyMDA7NDE2OCwwLDI2MiwxOTU7NDE5MCwwLDI1OSwxODk7NDIxNCwwLDI1NiwxODM7NDI1NCwwLDI1MywxNzg7NDMxNiwwLDI1MywxNzI7NDM0NSwwLDI1NCwxNjY7NDM2MywwLDI1OCwxNjI7NDM5NywwLDI2MSwxNTc7NDQ3MywxLDI2NSwxNTU7NDU0MCwyLDI2NSwxNTU7NDYxNiwxLDI2NSwxNTU7NDcwNCwyLDI2NSwxNTU7NDg0OSwwLDI1NywxNjU7NDg1OSwwLDI1MywxNzI7NDg2NCwwLDI0OSwxNzk7NDg3MywwLDI0NSwxODY7NDg3OSwwLDI0MSwxOTE7NDg4NiwwLDIzNywxOTc7NDg5NCwwLDIzMSwyMDI7NDkwMiwwLDIyNywyMDc7NDkwOSwwLDIyMiwyMTM7NDkxMiwwLDIxNywyMTg7NDkyMCwwLDIxMSwyMjM7NDkzNiwwLDIwNCwyMjk7NDk1NCwwLDE5OCwyMzM7NDk5MCwxLDE5NSwyMzU7NTA2OSwyLDE5NSwyMzU7NTMwNCwwLDIxMSwyMzg7NTMxMCwwLDIyOSwyNDE7NTMxNiwwLDIzOSwyNDI7NTMyMywwLDI0NiwyNDI7NTM2NywwLDI1MiwyNDM7NTQzNSwwLDI0OCwyMzk7NTQ2MCwwLDI0MywyMzc7NTQ3OCwwLDIzNywyMzU7NTQ5OSwwLDIzMSwyMzI7NTUzNSwwLDIyNSwyMzA7NTU2OSwxLDIyMywyMjk7NTY1MiwyLDIyMywyMjk7NTgxOSwwLDI0OCwyMTk7NTgyNSwwLDI4NywxOTk7NjA2OSwwLDI5NSwxNzA7NjA3NywwLDI4NiwxNzQ7NjA4NSwwLDI3NSwxNzc7NjA5OCwwLDI2MiwxODE7NjEwMywwLDI1NywxODQ7NjExNywwLDI0OCwxODU7NjEzMSwwLDI0MSwxODc7NjE0NSwwLDIzNSwxODk7NjE2NywwLDIyOSwxOTE7NjE4MSwwLDIyMywxOTQ7NjE5NiwwLDIxOCwxOTk7NjIwOSwwLDIxMCwyMDM7NjIxNiwwLDIwNCwyMDc7NjIyNCwwLDE5OSwyMTA7NjIzNiwwLDE4OCwyMTQ7NjI0NCwwLDE4MywyMTY7NjI1NywwLDE3NywyMTc7NjI4NSwwLDE3MSwyMTk7NjI5MywxLDE3MSwyMTk7NjM3NiwyLDE3MSwyMTk7IiwidGJpbyI6IiIsImtiaW8iOiIifQ==", + "eyJtYmlvIjoiNjM5NywwLDMwMSw5MDs2NDA0LDAsMjcxLDc3OzY0MTAsMCwyNTEsNjc7NjQxOCwwLDIzNyw2Mjs2NDI1LDAsMjI2LDU5OzY0MzIsMCwyMTgsNTk7NjQzOSwwLDIxMiw1OTs2NDUzLDAsMjA1LDYwOzY1MTcsMCwyMDEsNjc7NjU0NSwwLDE5OSw3NDs2NTc5LDAsMTk3LDgwOzY2MTUsMCwxOTYsODU7NjY0MSwwLDE5Niw5MTs2NjU0LDAsMTk2LDk3OzY2NjcsMCwxOTcsMTAyOzY2ODEsMCwyMDAsMTA4OzY2ODgsMCwyMDEsMTEzOzY2OTUsMCwyMDIsMTE4OzY3MDIsMCwyMDQsMTIzOzY3MDksMCwyMDYsMTI5OzY3MTYsMCwyMDcsMTM0OzY3MzEsMCwyMDksMTQzOzY3NDUsMCwyMTAsMTUyOzY3NjYsMCwyMTAsMTU5OzY4MTAsMCwyMDcsMTY0OzY4MjksMCwyMDEsMTY3OzY4NTIsMCwxOTUsMTY4OzY4NjQsMCwxOTAsMTY5OzY4ODUsMCwxODUsMTcwOzY5MjMsMCwxNzksMTcxOzY5NzcsMCwxNzMsMTcxOzcwODMsMSwxNjksMTcwOzcxNTEsMiwxNjksMTcwOzc0MjAsMSwxNjksMTcwOzc0ODMsMiwxNjksMTcwOzc3NjgsMCwxNjksMTc1Ozc3OTcsMCwxNjksMTgyOzc4MTgsMCwxNjgsMTg3Ozc4NDAsMCwxNjcsMTkyOzc4NjcsMCwxNjUsMTk4Ozc4ODksMCwxNjQsMjAzOzc5MjQsMCwxNjIsMjA4Ozc5NzgsMSwxNjAsMjEyOzgwNTMsMiwxNjAsMjEyOyIsInRiaW8iOiIiLCJrYmlvIjoiIn0=", + "eyJtYmlvIjoiMzI0OCwwLDMwMSwxMzE7MzI2MCwwLDI5NCwxMzM7MzI4MSwwLDI4OCwxMzU7MzMyMiwwLDI4MiwxMzk7MzM2NCwwLDI3NywxNDI7MzQwMiwwLDI3MiwxNDU7MzQyOCwwLDI2NywxNDc7MzQ3OSwwLDI2MSwxNTA7MzU4MywxLDI1OSwxNTQ7MzY0MCwyLDI1OSwxNTQ7MzgxOSwwLDI1NywxNTg7MzgyMywwLDI1NCwxNjM7MzgzOSwwLDI1MiwxNzA7Mzg1NSwwLDI0OSwxNzc7Mzg2OCwwLDI0NiwxODI7Mzg4NiwwLDI0MiwxODg7MzkwNywwLDIzOCwxOTQ7MzkzMCwwLDIzNSwxOTk7Mzk1MCwwLDIzMiwyMDQ7Mzk4NiwwLDIyOSwyMDk7NDAyMSwwLDIyNiwyMTQ7NDE0NywxLDIyMywyMTc7NDIyOCwyLDIyMywyMTc7IiwidGJpbyI6IiIsImtiaW8iOiIifQ==", + "eyJtYmlvIjoiNTYzNywwLDI4Nyw2Mzs1NjQ0LDAsMjY5LDYxOzU2NTIsMCwyNDksNjA7NTY1NywwLDIzMSw1Njs1NjY0LDAsMjE3LDU2OzU2NzIsMCwyMDgsNTU7NTY3OCwwLDIwMiw1NTs1NjkxLDAsMTk2LDU1OzU3MTgsMCwxOTAsNTY7NTc2NywwLDE4OCw2NTs1NzgxLDAsMTg4LDc3OzU3ODgsMCwxODksODU7NTc5NiwwLDE5Miw5Njs1ODAzLDAsMTk0LDEwMzs1ODE3LDAsMTk3LDExMTs1ODMwLDAsMTk4LDExNjs1ODU5LDAsMjAxLDEyMTs1ODg4LDAsMjAzLDEyNjs1OTE2LDAsMjA3LDEzMDs1OTY1LDAsMjEwLDEzNTs2MDA1LDAsMjExLDE0MDs2MDQwLDAsMjE2LDE0Mjs2MDYwLDAsMjIxLDE0Mzs2MDczLDAsMjMyLDE0NDs2MDgxLDAsMjM3LDE0Njs2MDg4LDAsMjQzLDE0Nzs2MTAzLDAsMjUwLDE0OTs2MTE1LDAsMjU1LDE1MTs2MTQ1LDAsMjYwLDE1NDs2MjAxLDAsMjY0LDE1OTs2MjYyLDAsMjYzLDE2Njs2Mjk5LDAsMjYxLDE3MTs2MzE4LDAsMjU3LDE3Nzs2MzMzLDAsMjUyLDE4MTs2MzQ3LDAsMjQ4LDE4Njs2MzY4LDAsMjQyLDE5MTs2Mzg5LDAsMjM3LDE5NTs2NDExLDAsMjMxLDE5OTs2NDMwLDAsMjI2LDIwMzs2NDcxLDAsMjIxLDIwNTs2NTQxLDAsMjE2LDIwNzs2ODUzLDEsMjE2LDIwNzs2OTEzLDIsMjE2LDIwNzsiLCJ0YmlvIjoiIiwia2JpbyI6IiJ9", + "eyJtYmlvIjoiNDM1NiwwLDI1NywyODg7NDM1OSwwLDI0MywyODc7NDM2OSwwLDIzMCwyODM7NDM3NCwwLDIxOCwyODA7NDM4MSwwLDIwNywyNzY7NDM4OCwwLDE5NSwyNzM7NDM5MywwLDE4NiwyNzA7NDQwMiwwLDE4MCwyNjk7NDQwOCwwLDE3MywyNjY7NDQyMiwwLDE2NiwyNjQ7NDQzNiwwLDE2MSwyNjA7NDQ2NSwwLDE1NSwyNTc7NDQ5MywwLDE1MiwyNTI7NDUxOCwwLDE1MCwyNDY7NDU0NiwwLDE0OSwyNDE7NDU4NCwwLDE0OSwyMzQ7NDU5NywwLDE1MSwyMjg7NDYxMSwwLDE1NiwyMTk7NDYyMCwwLDE2MCwyMTI7NDYyNSwwLDE2NCwyMDU7NDYzNCwwLDE2NywyMDA7NDY0NiwwLDE3MiwxOTM7NDY1OSwwLDE3NywxODY7NDY4MywwLDE4MCwxODE7NDcxNCwwLDE4MywxNzU7NDc3MSwwLDE4NCwxNjk7NDgwNiwwLDE4NCwxNjM7NDg0MSwwLDE4MCwxNTg7NDg5MSwwLDE3NSwxNTY7NDkxMywxLDE3MywxNTY7NTAwMSwyLDE3MywxNTY7NTIzMCwwLDE3MywxNjM7NTI0NCwwLDE3MywxNzE7NTI1NywwLDE3MywxODE7NTI3MywwLDE3MywxODk7NTI4NywwLDE3MywxOTY7NTMwNywwLDE3MiwyMDE7NTMyOCwwLDE3MSwyMDY7NTM0OSwwLDE3MCwyMTE7NTM3NywwLDE2NywyMTY7NTQwNSwwLDE2NCwyMjE7NTQ2OCwwLDE2MiwyMjY7NTQ5NCwxLDE2MCwyMjY7NTU2NCwyLDE2MCwyMjY7IiwidGJpbyI6IiIsImtiaW8iOiIifQ==", + "eyJtYmlvIjoiNTE3NywwLDMwMCwxNzM7NTE5MCwwLDI5NCwxNzM7NTIxMiwwLDI4NiwxNzM7NTIzMSwwLDI3NywxNzM7NTI0MSwwLDI2OSwxNzM7NTI1MywwLDI2NCwxNzI7NTI4MiwwLDI1NywxNzI7NTUxNSwxLDI1NiwxNzI7NTU1MSwyLDI1NiwxNzI7NTc2MiwxLDI1NiwxNzI7NTgxOCwyLDI1NiwxNzI7NjExMCwwLDI1MSwxNzY7NjEyNCwwLDI0NCwxODA7NjE0MiwwLDIzOCwxODU7NjE2NSwwLDIzMywxODg7NjE5MywwLDIyOCwxOTE7NjI0MiwwLDIyMywxOTQ7NjI2MiwxLDIyMiwxOTU7NjMzMywyLDIyMiwxOTU7NjY1MSwwLDIyOCwxOTU7NjY2MCwwLDIzNCwxOTU7NjY3MywwLDI0MSwxOTU7Njc0MSwwLDI0NSwxOTk7NjgwMSwwLDI0MiwyMDU7NjgxOSwxLDIzOSwyMDc7NjkxNywyLDIzOSwyMDc7IiwidGJpbyI6IiIsImtiaW8iOiIifQ==", + "eyJtYmlvIjoiMTA2NCwwLDE5MywxODQ7MTA3MCwwLDIwNywxODQ7MTA3NiwwLDIyMSwxODM7MTA4MywwLDIzNSwxODE7MTA5MSwwLDI0NCwxODE7MTA5OCwwLDI1MiwxODA7MTExMSwwLDI2MCwxNzk7MTEzNSwwLDI2NiwxNzk7MTIxNiwwLDI3MywxNzk7MTM2MywwLDI3MywxODU7MTM3NiwwLDI3MSwxOTA7MTM4OSwwLDI2NywxOTQ7MTQxMSwwLDI2MSwyMDA7MTQ0MCwwLDI1NCwyMDU7MTQ3NCwwLDI0OSwyMDk7MTY0MCwxLDI0NCwyMDk7MTcxMCwyLDI0NCwyMDk7IiwidGJpbyI6IiIsImtiaW8iOiIifQ==", + "eyJtYmlvIjoiNTE4NywwLDMwMSw4Mzs1MjE0LDAsMjk1LDkxOzUyMjgsMCwyODgsOTk7NTIzNSwwLDI4MiwxMDY7NTI0MywwLDI3NywxMTM7NTI0OSwwLDI2OSwxMjE7NTI1NywwLDI2MywxMjg7NTI2NCwwLDI2MCwxMzM7NTI3MSwwLDI1NiwxMzg7NTI3OSwwLDI1MiwxNDQ7NTI5MywwLDI0NywxNDk7NTMxMywwLDI0NCwxNTQ7NTM0OCwwLDI0MiwxNjA7NTM3NSwwLDI0MSwxNjU7NTQyMiwwLDI0MCwxNzA7NTUwOCwwLDI0NywxNzE7NTUyMSwwLDI1NSwxNzA7NTUyOCwwLDI2MCwxNjg7NTU0MywwLDI2OCwxNjY7NTU1NiwwLDI3MywxNjQ7NTU5MSwwLDI3OCwxNjI7NTc1MSwxLDI4MCwxNjI7NTgyNiwyLDI4MCwxNjI7NjA0NCwwLDI3NywxNzA7NjA1MiwwLDI3MiwxNzk7NjA1OSwwLDI2OCwxODc7NjA2NSwwLDI2NSwxOTQ7NjA3NywwLDI1OSwyMDE7NjA5MSwwLDI1NiwyMDY7NjEwNiwwLDI1MywyMTE7NjE0NiwwLDI0OSwyMTU7NjE3NiwxLDI0NywyMTY7NjI2MCwyLDI0NywyMTY7IiwidGJpbyI6IiIsImtiaW8iOiIifQ==", + "eyJtYmlvIjoiMzg1NSwwLDE0MiwyMzE7Mzg3MywwLDE2OCwyMjc7Mzg3OSwwLDIwNywyMjA7Mzg4NiwwLDIzNSwyMTQ7Mzg5NSwwLDI1MSwyMTM7MzkwMCwwLDI2NSwyMTE7MzkwOCwwLDI4MSwyMTE7MzkxNiwwLDI5NSwyMTE7NDA2OSwwLDI5MSwyMDU7NDA3NSwwLDI4MiwyMDI7NDA4MywwLDI3MSwxOTk7NDA4OCwwLDI2MywxOTU7NDA5NiwwLDI1NCwxOTI7NDEwMiwwLDI0NSwxODk7NDExMCwwLDIzOCwxODU7NDExNiwwLDIzMSwxODI7NDEzMSwwLDIyNSwxODA7NDE1NywwLDIxOCwxNzU7NDE4NiwwLDIxMywxNzM7NDIwNiwwLDIwNywxNzI7NDIyNiwwLDIwMSwxNzI7NDI0OSwwLDE5NCwxNzE7NDI2MiwwLDE4NiwxNzA7NDI3NSwwLDE3OCwxNzA7NDI4OCwwLDE3MCwxNjg7NDMwMiwwLDE2NCwxNjg7NDMyMywwLDE1OCwxNjY7NDM1MiwwLDE1MywxNjU7NDQ4NywxLDE1MSwxNjI7NDU2NSwyLDE1MSwxNjI7NDcwMCwwLDE0OCwxNzQ7NDcwOSwwLDE0NSwxODE7NDcxNSwwLDE0MywxODY7NDcyMSwwLDE0MiwxOTE7NDczNSwwLDEzOSwxOTY7NDc1MCwwLDEzNiwyMDE7NDc2OSwwLDEzNSwyMDY7NDc5MywwLDEzMywyMTE7NDgyNywwLDEyOSwyMTc7NDg2OCwxLDEyNywyMjE7NDk1MywyLDEyNywyMjE7IiwidGJpbyI6IiIsImtiaW8iOiIifQ==", + "eyJtYmlvIjoiNDk2NywwLDMwMSwxMjA7NDk3MywwLDI5NiwxMjQ7NDk4NSwwLDI5MCwxMjg7NDk5OSwwLDI4NiwxMzM7NTAxOSwwLDI4MiwxNDA7NTA0MiwwLDI4MCwxNDY7NTA3MCwwLDI3OCwxNTE7NTExNywwLDI3NSwxNTc7NTIxNSwwLDI3MCwxNjM7NTQ1MCwxLDI2NSwxNjE7NTU2MiwyLDI2NSwxNjE7NTc1MywwLDI2MywxNjI7NTc3MywwLDI1OSwxNjg7NTc5NCwwLDI1NSwxNzM7NTgxNCwwLDI1MSwxNzc7NTg0MiwwLDI0OCwxODI7NTg3OCwwLDI0NCwxODc7NTg5OSwwLDIzOSwxOTI7NTkxOSwwLDIzNCwxOTY7NTk0MSwwLDIyOSwxOTk7NTk3MCwwLDIyMywyMDE7NjAwNiwxLDIyMSwyMDM7NjA1MywyLDIyMSwyMDM7IiwidGJpbyI6IiIsImtiaW8iOiIifQ==", + "eyJtYmlvIjoiMzk5OSwwLDI5MywyMjg7NDAwNSwwLDI3NCwyMjE7NDAxMywwLDI1NCwyMTg7NDAyMCwwLDIzNiwyMTU7NDAyNSwwLDIyMiwyMTM7NDAzNCwwLDIwOSwyMTA7NDAzOSwwLDIwMSwyMTA7NDA0NywwLDE5NSwyMDk7NDA2MSwwLDE4OCwyMDk7NDA3NCwwLDE4MiwyMDk7NDA5NiwwLDE3NiwyMTA7NDExNiwwLDE3MCwyMTE7NDM5NywxLDE2NSwyMTE7NDQ1NCwyLDE2NSwyMTE7IiwidGJpbyI6IiIsImtiaW8iOiIifQ==" +]; +function getBio() { + const bio = data[Math.floor(Math.random() * data.length)]; + return bio; +} +exports.default = getBio; diff --git a/lib/challenge.d.ts b/lib/challenge.d.ts index 07b6c75..c7e5162 100644 --- a/lib/challenge.d.ts +++ b/lib/challenge.d.ts @@ -35,6 +35,10 @@ interface ChallengeData { [key: string]: string; }; string_table_prefixes: string[]; + cookie?: string; + capi?: string; + hash?: string; + is_compatibility_mode: boolean; } interface AnswerResponse { response: "not answered" | "answered"; @@ -52,14 +56,22 @@ export declare abstract class Challenge { protected key: Promise; protected userAgent: string; protected proxy: string; + protected cookie: string; + protected record_payload: Record; + protected click: { + sc: number[]; + }; constructor(data: ChallengeData, challengeOptions: ChallengeOptions); getImage(): Promise; + Record(category: 'Site URL' | 'loaded' | 'begin app', payload?: Record): Promise; protected getKey(): Promise; abstract answer(answer: number): Promise; get gameType(): number; get variant(): string; get instruction(): string; get waves(): number; + getReferer(): string; + getRequestId(): string; } export declare class Challenge1 extends Challenge { private answerHistory; diff --git a/lib/challenge.js b/lib/challenge.js index 787ef4c..6abee42 100644 --- a/lib/challenge.js +++ b/lib/challenge.js @@ -1,32 +1,58 @@ "use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; Object.defineProperty(exports, "__esModule", { value: true }); exports.Challenge4 = exports.Challenge3 = exports.Challenge1 = exports.Challenge = void 0; -const http_1 = require("./http"); -const util_1 = require("./util"); -const crypt_1 = require("./crypt"); +const http_1 = __importDefault(require("./http")); +const util_1 = __importDefault(require("./util")); +const crypt_1 = __importDefault(require("./crypt")); const console_1 = require("console"); +const bio_1 = __importDefault(require("./bio")); class Challenge { constructor(data, challengeOptions) { this.wave = 0; + this.click = util_1.default.generateClickCoordinates(); this.data = data; this.userAgent = challengeOptions.userAgent; this.proxy = challengeOptions.proxy; - // Preload images + this.cookie = data.cookie; this.imgs = data.game_data.customGUI._challenge_imgs.map(async (v) => { + let timestamp = util_1.default.getTimestamp(); let req = await (0, http_1.default)(v, { method: "GET", - path: undefined, headers: { - "User-Agent": this.userAgent, - "Referer": this.data.tokenInfo.surl + // ":scheme": "https", + "Accept": "*/*", + 'Accept-Encoding': '', + "Accept-Language": "en-GB,en-US;q=0.9,en;q=0.8,ar;q=0.7", + "Cookie": this.cookie ? `${this.cookie} ${timestamp.cookie}` : timestamp.cookie, + "Priority": "u=1, i", + "Referer": this.data.tokenInfo.surl, + "Sec-Ch-Ua": "\"Google Chrome\";v=\"131\", \"Chromium\";v=\"131\", \"Not_A Brand\";v=\"24\"", + "Sec-Ch-Ua-Mobile": "?0", + "Sec-Ch-Ua-Platform": "\"Windows\"", + "Sec-Fetch-Dest": "empty", + "Sec-Fetch-Mode": "cors", + "Sec-Fetch-Site": "same-origin", + "User-Agent": this.userAgent }, - }); - return req.body; + responseType: 'buffer' + }, this.proxy, true); + return req.buffer; }); if (data.game_data.customGUI.encrypted_mode) { // Preload decryption key this.key = this.getKey(); } + this.record_payload = { + sid: this.data.tokenInfo.r, + session_token: this.data.session_token, + analytics_tier: this.data.tokenInfo.at, + disableCookies: false, + render_type: 'canvas', + is_compatibility_mode: this.data.is_compatibility_mode, + }; } async getImage() { let img = await this.imgs[this.wave]; @@ -40,6 +66,81 @@ class Challenge { } return img; } + async Record(category, payload) { + let timestamp = util_1.default.getTimestamp(); + let body = { ...this.record_payload }; + let headers = { + "Accept": "*/*", + "Accept-Encoding": "gzip, deflate, br, zstd", + "Accept-Language": "en-GB,en-US;q=0.9,en;q=0.8,ar;q=0.7", + "Cache-Control": "no-cache", + // "Content-Length": "275", + "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8", + "Cookie": this.cookie ? `${this.cookie} ${timestamp.cookie}` : timestamp.cookie, + "Origin": this.data.tokenInfo.surl, + "Priority": "u=1, i", + "Referer": this.data.tokenInfo.surl, + "Sec-Ch-Ua": "\"Google Chrome\";v=\"131\", \"Chromium\";v=\"131\", \"Not_A_Brand\";v=\"24\"", + "Sec-Ch-Ua-Mobile": "?0", + "Sec-Ch-Ua-Platform": "\"Windows\"", + "Sec-Fetch-Dest": "empty", + "Sec-Fetch-Mode": "cors", + "Sec-Fetch-Site": "same-origin", + "User-Agent": this.userAgent, + "X-Newrelic-Timestamp": timestamp.value, + "X-Requested-With": "XMLHttpRequest" + }; + if (category !== 'Site URL' && category !== 'loaded' && category !== 'begin app') { + if (!payload) + throw new Error(`Invalid category`); + else + body = { ...body, ...payload }; + } + ; + if (category == 'Site URL' && !payload) { + body = { + ...body, + category, + action: this.getReferer() + }; + } + else if (category == 'loaded' && !payload) { + body = { + ...body, + game_token: this.data.challengeID, + game_type: this.data.game_data.gameType, + category, + action: 'game loaded' + }; + } + else if (category == 'begin app' && !payload) { + body = { + ...body, + game_token: this.data.challengeID, + game_type: this.data.game_data.gameType, + category, + action: 'begin app' + }; + headers = { + ...headers, + "X-Requested-Id": this.getRequestId(), + }; + } + else { + body = { + ...body, + category, + ...payload + }; + } + let req = await (0, http_1.default)(this.data.tokenInfo.surl, { + method: "POST", + path: '/fc/a/', + headers, + body: util_1.default.constructFormData(body) + }, this.proxy); + return JSON.parse(req.body); + } async getKey() { if (this.key) return await this.key; @@ -71,6 +172,13 @@ class Challenge { get waves() { return this.data.game_data.waves; } + getReferer() { + return `${this.data.tokenInfo.surl}/v2/${this.data.capi}/enforcement.${this.data.hash}.html`; + } + getRequestId() { + let requestedId = crypt_1.default.encrypt(JSON.stringify(this.click), `REQUESTED${this.data.session_token}ID`); + return requestedId; + } } exports.Challenge = Challenge; class Challenge1 extends Challenge { @@ -121,19 +229,31 @@ class Challenge3 extends Challenge { (0, console_1.assert)(tile >= 0 && tile <= 5, "Tile must be between 0 and 5"); let pos = util_1.default.tileToLoc(tile); this.answerHistory.push(util_1.default.solveBreaker(!!this.data.game_data.customGUI.is_using_api_breaker_v2, this.data.game_data.customGUI.api_breaker, 3, pos)); - let encrypted = await crypt_1.default.encrypt(JSON.stringify(this.answerHistory), this.data.session_token); - let requestedId = await crypt_1.default.encrypt(JSON.stringify({}), `REQUESTED${this.data.session_token}ID`); + let encrypted = crypt_1.default.encrypt(JSON.stringify(this.answerHistory), this.data.session_token); let { cookie: tCookie, value: tValue } = util_1.default.getTimestamp(); let req = await (0, http_1.default)(this.data.tokenInfo.surl, { method: "POST", path: "/fc/ca/", headers: { + "Accept": "*/*", + "Accept-Encoding": '', + "Accept-Language": "en-GB,en-US;q=0.9,en;q=0.8,ar;q=0.7", + "Cache-Control": "no-cache", + "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8", + "Cookie": this.cookie ? `${this.cookie} ${tCookie}` : tCookie, + "Origin": this.data.tokenInfo.surl, + "Priority": "u=1, i", + "Referer": "", + "Sec-Ch-Ua": "\"Google Chrome\";v=\"131\", \"Chromium\";v=\"131\", \"Not_A Brand\";v=\"24\"", + "Sec-Ch-Ua-Mobile": "?0", + "Sec-Ch-Ua-Platform": "\"Windows\"", + "Sec-Fetch-Dest": "empty", + "Sec-Fetch-Mode": "cors", + "Sec-Fetch-Site": "same-origin", "User-Agent": this.userAgent, - "Content-Type": "application/x-www-form-urlencoded", "X-Newrelic-Timestamp": tValue, - "X-Requested-ID": requestedId, - "Cookie": tCookie, - "Referer": this.data.challengeURL + "X-Requested-Id": this.getRequestId(), + "X-Requested-With": "XMLHttpRequest" }, body: util_1.default.constructFormData({ session_token: this.data.session_token, @@ -152,34 +272,51 @@ class Challenge3 extends Challenge { } exports.Challenge3 = Challenge3; class Challenge4 extends Challenge { + // private click: { sc: number[] }; constructor(data, challengeOptions) { super(data, challengeOptions); this.answerHistory = []; + // this.click = util.generateClickCoordinates() } async answer(index) { (0, console_1.assert)(index >= 0 && index <= this.data.game_data.game_difficulty - 1, "Index must be between 0 and " + (this.data.game_data.game_difficulty - 1)); this.answerHistory.push(util_1.default.solveBreaker(!!this.data.game_data.customGUI.is_using_api_breaker_v2, this.data.game_data.customGUI.api_breaker, 4, { index })); - let encrypted = await crypt_1.default.encrypt(JSON.stringify(this.answerHistory), this.data.session_token); - let requestedId = await crypt_1.default.encrypt(JSON.stringify({}), `REQUESTED${this.data.session_token}ID`); + let encrypted = crypt_1.default.encrypt(JSON.stringify(this.answerHistory), this.data.session_token); let { cookie: tCookie, value: tValue } = util_1.default.getTimestamp(); - let req = await (0, http_1.default)(this.data.tokenInfo.surl, { + let url = new URL(this.data.tokenInfo.surl); + url.pathname = "/fc/ca/"; + let req = await (0, http_1.default)(url.toString(), { method: "POST", - path: "/fc/ca/", + // path: url.pathname, headers: { + "Accept": "*/*", + "Accept-Encoding": '', + "Accept-Language": "en-GB,en-US;q=0.9,en;q=0.8,ar;q=0.7", + "Cache-Control": "no-cache", + "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8", + "Cookie": this.cookie ? `${this.cookie} ${tCookie}` : tCookie, + "Origin": this.data.tokenInfo.surl, + "Priority": "u=1, i", + "Referer": "", + "Sec-Ch-Ua": "\"Google Chrome\";v=\"131\", \"Chromium\";v=\"131\", \"Not_A Brand\";v=\"24\"", + "Sec-Ch-Ua-Mobile": "?0", + "Sec-Ch-Ua-Platform": "\"Windows\"", + "Sec-Fetch-Dest": "empty", + "Sec-Fetch-Mode": "cors", + "Sec-Fetch-Site": "same-origin", "User-Agent": this.userAgent, - "Content-Type": "application/x-www-form-urlencoded", "X-Newrelic-Timestamp": tValue, - "X-Requested-ID": requestedId, - "Cookie": tCookie, - "Referer": this.data.challengeURL + "X-Requested-Id": this.getRequestId(), + "X-Requested-With": "XMLHttpRequest" }, body: util_1.default.constructFormData({ session_token: this.data.session_token, game_token: this.data.challengeID, guess: encrypted, + render_type: 'canvas', analytics_tier: this.data.tokenInfo.at, - sid: this.data.tokenInfo.r, - bio: this.data.tokenInfo.mbio && "eyJtYmlvIjoiMTI1MCwwLDE0NywyMDQ7MTg5NCwwLDE1MSwyMDA7MTk2MCwxLDE1MiwxOTk7MjAyOSwyLDE1MiwxOTk7MjU3NSwwLDE1NSwxOTU7MjU4NSwwLDE1NiwxOTA7MjU5NSwwLDE1OCwxODU7MjYwNCwwLDE1OSwxODA7MjYxMywwLDE2MCwxNzU7MjYyMSwwLDE2MSwxNzA7MjYzMCwwLDE2MywxNjU7MjY0MCwwLDE2NCwxNjA7MjY1MCwwLDE2NSwxNTU7MjY2NCwwLDE2NiwxNTA7MjY3NywwLDE2NiwxNDQ7MjY5NCwwLDE2NywxMzk7MjcyMCwwLDE2NywxMzM7Mjc1NCwwLDE2NywxMjc7Mjc4MywwLDE2NywxMjE7MjgxMiwwLDE2NywxMTU7Mjg0MywwLDE2NywxMDk7Mjg2MywwLDE2NywxMDM7Mjg3NSwwLDE2Niw5ODsyOTA1LDAsMTY1LDkzOzMyMzIsMCwxNjUsOTk7MzI2MiwwLDE2NSwxMDU7MzI5OSwwLDE2NCwxMTA7MzM0MCwwLDE2MSwxMTU7MzM3MiwwLDE1NywxMjA7MzM5NSwwLDE1MywxMjQ7MzQwOCwwLDE0OCwxMjc7MzQyMCwwLDE0MywxMzA7MzQyOSwwLDEzOCwxMzE7MzQ0MSwwLDEzMywxMzQ7MzQ1MCwwLDEyOCwxMzU7MzQ2MSwwLDEyMywxMzg7MzQ3NiwwLDExOCwxNDA7MzQ4OSwwLDExMywxNDI7MzUwMywwLDEwOCwxNDM7MzUxOCwwLDEwMywxNDQ7MzUzNCwwLDk4LDE0NTszNTU2LDAsOTMsMTQ2OzM2MTUsMCw4OCwxNDg7MzY2MiwwLDgzLDE1MTszNjgzLDAsNzgsMTU0OzM3MDEsMCw3MywxNTc7MzcyNSwwLDY5LDE2MTszNzkzLDEsNjgsMTYyOzM4NTEsMiw2OCwxNjI7IiwidGJpbyI6IiIsImtiaW8iOiIifQ==" + bio: this.data.tokenInfo.mbio && (0, bio_1.default)(), + is_compatibility_mode: this.data.is_compatibility_mode, }), }, this.proxy); let reqData = JSON.parse(req.body.toString()); diff --git a/lib/fingerprint.d.ts b/lib/fingerprint.d.ts index 422954b..a64029d 100644 --- a/lib/fingerprint.d.ts +++ b/lib/fingerprint.d.ts @@ -1,56 +1,8 @@ -declare const baseFingerprint: { - DNT: string; - L: string; - D: number; - PR: number; - S: number[]; - AS: number[]; - TO: number; - SS: boolean; - LS: boolean; - IDB: boolean; - B: boolean; - ODB: boolean; - CPUC: string; - PK: string; - CFP: string; - FR: boolean; - FOS: boolean; - FB: boolean; - JSF: string[]; - P: string[]; - T: (number | boolean)[]; - H: number; - SWF: boolean; -}; -declare function getFingerprint(): { - DNT: string; - L: string; - D: number; - PR: number; - S: number[]; - AS: number[]; - TO: number; - SS: boolean; - LS: boolean; - IDB: boolean; - B: boolean; - ODB: boolean; - CPUC: string; - PK: string; - CFP: string; - FR: boolean; - FOS: boolean; - FB: boolean; - JSF: string[]; - P: string[]; - T: (number | boolean)[]; - H: number; - SWF: boolean; -}; +import { GetTokenOptions } from './api'; +declare function getFingerprint(): Record; declare function prepareF(fingerprint: any): string; declare function prepareFe(fingerprint: any): any[]; -declare function getEnhancedFingerprint(fp: typeof baseFingerprint, ua: string, opts: any): { +declare function getEnhancedFingerprint(fp: Record, ua: string, opts: GetTokenOptions): { key: string; value: any; }[]; diff --git a/lib/fingerprint.js b/lib/fingerprint.js index b36ee5d..6321b13 100644 --- a/lib/fingerprint.js +++ b/lib/fingerprint.js @@ -1,7 +1,11 @@ "use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; Object.defineProperty(exports, "__esModule", { value: true }); -const murmur_1 = require("./murmur"); -const crypto_1 = require("crypto"); +const crypto_1 = __importDefault(require("crypto")); +const murmur_1 = __importDefault(require("./murmur")); +const util_1 = __importDefault(require("./util")); const baseFingerprint = { DNT: "unknown", L: "en-US", @@ -89,9 +93,11 @@ const baseFingerprint = { "Wingdings 3", ], P: [ - "Chrome PDF Plugin::Portable Document Format::application/x-google-chrome-pdf~pdf", - "Chrome PDF Viewer::::application/pdf~pdf", - "Native Client::::application/x-nacl~,application/x-pnacl~", + "Chrome PDF Viewer", + "Chromium PDF Viewer", + "Microsoft Edge PDF Viewer", + "PDF Viewer", + "WebKit built-in PDF" ], T: [0, false, false], H: 24, @@ -129,6 +135,32 @@ let screenRes = [ [1600, 1200], [1600, 900], ]; +let canvases1 = [ + "1815906631", + "235298495", + "1850036655", + "-1661048561", + "823022740", + "-1712985017", + "679642534", + "512287303", + "-1570039461", + "11949726", + "512287303", + "-479006826", + "-1124974951", + "1999955435", + "213013447", + "-1058930346", + "-1291191045", + "-1338001587", + "-1946591325", + "-70526813", + "-72944365", + "1456333650", + "1732442814", + "631151448", +]; function randomScreenRes() { return screenRes[Math.floor(Math.random() * screenRes.length)]; } @@ -150,12 +182,12 @@ function getFingerprint() { fingerprint["ODB"] = Math.random() > 0.5; fingerprint["CPUC"] = "unknown"; fingerprint["PK"] = "Win32"; - fingerprint["CFP"] = "canvas winding:yes~canvas fp:data:image/png;base64," + (0, crypto_1.randomBytes)(128).toString("base64"); + fingerprint["CFP"] = canvases1[Math.floor(Math.random() * canvases1.length)]; fingerprint["FR"] = false; // Fake Resolution fingerprint["FOS"] = false; // Fake Operating System fingerprint["FB"] = false; // Fake Browser fingerprint["JSF"] = fingerprint["JSF"].filter(() => Math.random() > 0.5); - fingerprint["P"] = fingerprint["P"].filter(() => Math.random() > 0.5); + fingerprint["P"] = fingerprint["P"].filter(() => Math.random() > 0.5).join(','); fingerprint["T"] = [ Math.floor(Math.random() * 8), Math.random() > 0.5, @@ -182,10 +214,10 @@ function prepareFe(fingerprint) { for (let i = 0; i < keys.length; i++) { switch (keys[i]) { case "CFP": - fe.push(`${keys[i]}:${cfpHash(fingerprint[keys[i]])}`); + fe.push(`${keys[i]}:${fingerprint[keys[i]]}`); break; case "P": - fe.push(`${keys[i]}:${fingerprint[keys[i]].map((v) => v.split("::")[0])}`); + fe.push(`${keys[i]}:${fingerprint[keys[i]]}`); break; default: fe.push(`${keys[i]}:${fingerprint[keys[i]]}`); @@ -214,66 +246,112 @@ function cfpHash(H8W) { return l8W; } let baseEnhancedFingerprint = { - "webgl_extensions": "ANGLE_instanced_arrays;EXT_blend_minmax;EXT_color_buffer_half_float;EXT_disjoint_timer_query;EXT_float_blend;EXT_frag_depth;EXT_shader_texture_lod;EXT_texture_compression_bptc;EXT_texture_compression_rgtc;EXT_texture_filter_anisotropic;EXT_sRGB;KHR_parallel_shader_compile;OES_element_index_uint;OES_fbo_render_mipmap;OES_standard_derivatives;OES_texture_float;OES_texture_float_linear;OES_texture_half_float;OES_texture_half_float_linear;OES_vertex_array_object;WEBGL_color_buffer_float;WEBGL_compressed_texture_s3tc;WEBGL_compressed_texture_s3tc_srgb;WEBGL_debug_renderer_info;WEBGL_debug_shaders;WEBGL_depth_texture;WEBGL_draw_buffers;WEBGL_lose_context;WEBGL_multi_draw", - "webgl_extensions_hash": "58a5a04a5bef1a78fa88d5c5098bd237", - "webgl_renderer": "WebKit WebGL", - "webgl_vendor": "WebKit", - "webgl_version": "WebGL 1.0 (OpenGL ES 2.0 Chromium)", - "webgl_shading_language_version": "WebGL GLSL ES 1.0 (OpenGL ES GLSL ES 1.0 Chromium)", - "webgl_aliased_line_width_range": "[1, 1]", - "webgl_aliased_point_size_range": "[1, 1023]", - "webgl_antialiasing": "yes", - "webgl_bits": "8,8,24,8,8,0", - "webgl_max_params": "16,64,16384,4096,8192,32,8192,31,16,32,4096", - "webgl_max_viewport_dims": "[8192, 8192]", - "webgl_unmasked_vendor": "Google Inc. (Google)", - "webgl_unmasked_renderer": "ANGLE (Google, Vulkan 1.3.0 (SwiftShader Device (Subzero) (0x0000C0DE)), SwiftShader driver)", - "webgl_vsf_params": "23,127,127,23,127,127,23,127,127", - "webgl_vsi_params": "0,31,30,0,31,30,0,31,30", - "webgl_fsf_params": "23,127,127,23,127,127,23,127,127", - "webgl_fsi_params": "0,31,30,0,31,30,0,31,30", - "webgl_hash_webgl": null, - "user_agent_data_brands": "Chromium,Google Chrome,Not=A?Brand", - "user_agent_data_mobile": null, - "navigator_connection_downlink": null, - "navigator_connection_downlink_max": null, - "network_info_rtt": null, - "network_info_save_data": false, - "network_info_rtt_type": null, - "screen_pixel_depth": 24, - "navigator_device_memory": 0.5, - "navigator_languages": "en-US,fr-BE,fr,en-BE,en", - "window_inner_width": 0, - "window_inner_height": 0, - "window_outer_width": 2195, - "window_outer_height": 1195, - "browser_detection_firefox": false, - "browser_detection_brave": false, - "audio_codecs": "{\"ogg\":\"probably\",\"mp3\":\"probably\",\"wav\":\"probably\",\"m4a\":\"maybe\",\"aac\":\"probably\"}", - "video_codecs": "{\"ogg\":\"probably\",\"h264\":\"probably\",\"webm\":\"probably\",\"mpeg4v\":\"\",\"mpeg4a\":\"\",\"theora\":\"\"}", - "media_query_dark_mode": true, - "headless_browser_phantom": false, - "headless_browser_selenium": false, - "headless_browser_nightmare_js": false, - "document__referrer": "https://www.roblox.com/", - "window__ancestor_origins": [ - "https://www.roblox.com", + webgl_extensions: "ANGLE_instanced_arrays;EXT_blend_minmax;EXT_clip_control;EXT_color_buffer_half_float;EXT_depth_clamp;EXT_disjoint_timer_query;EXT_float_blend;EXT_frag_depth;EXT_polygon_offset_clamp;EXT_shader_texture_lod;EXT_texture_compression_bptc;EXT_texture_compression_rgtc;EXT_texture_filter_anisotropic;EXT_texture_mirror_clamp_to_edge;EXT_sRGB;KHR_parallel_shader_compile;OES_element_index_uint;OES_fbo_render_mipmap;OES_standard_derivatives;OES_texture_float;OES_texture_float_linear;OES_texture_half_float;OES_texture_half_float_linear;OES_vertex_array_object;WEBGL_blend_func_extended;WEBGL_color_buffer_float;WEBGL_compressed_texture_s3tc;WEBGL_compressed_texture_s3tc_srgb;WEBGL_debug_renderer_info;WEBGL_debug_shaders;WEBGL_depth_texture;WEBGL_draw_buffers;WEBGL_lose_context;WEBGL_multi_draw;WEBGL_polygon_mode", + webgl_extensions_hash: "58a5a04a5bef1a78fa88d5c5098bd237", + webgl_renderer: "WebKit WebGL", + webgl_vendor: "WebKit", + webgl_version: "WebGL 1.0 (OpenGL ES 2.0 Chromium)", + webgl_shading_language_version: "WebGL GLSL ES 1.0 (OpenGL ES GLSL ES 1.0 Chromium)", + webgl_aliased_line_width_range: "[1, 1]", + webgl_aliased_point_size_range: "[1, 1024]", + webgl_antialiasing: "yes", + webgl_bits: "8,8,24,8,8,0", + webgl_max_params: "16,32,16384,1024,16384,16,16384,30,16,16,4096", + webgl_max_viewport_dims: "[32767, 32767]", + webgl_unmasked_vendor: "Google Inc. (Intel)", + webgl_unmasked_renderer: "ANGLE (Intel, Intel(R) Iris(R) Xe Graphics (0x0000A7A0) Direct3D11 vs_5_0 ps_5_0, D3D11)", + webgl_vsf_params: "23,127,127,23,127,127,23,127,127", + webgl_vsi_params: "0,31,30,0,31,30,0,31,30", + webgl_fsf_params: "23,127,127,23,127,127,23,127,127", + webgl_fsi_params: "0,31,30,0,31,30,0,31,30", + webgl_hash_webgl: null, + user_agent_data_brands: "Google Chrome,Chromium,Not_A Brand", + user_agent_data_mobile: false, + navigator_connection_downlink: 1.85, + navigator_connection_downlink_max: null, + network_info_rtt: 50, + network_info_save_data: false, + network_info_rtt_type: null, + screen_pixel_depth: 24, + navigator_device_memory: 8, + navigator_pdf_viewer_enabled: true, + navigator_languages: "en-GB,en-US,en,ar", + window_inner_width: 0, + window_inner_height: 0, + window_outer_width: 1280, + window_outer_height: 752, + browser_detection_firefox: false, + browser_detection_brave: false, + browser_api_checks: [ + "permission_status: true", + "eye_dropper: true", + "audio_data: true", + "writable_stream: true", + "css_style_rule: true", + "navigator_ua: true", + "barcode_detector: false", + "display_names: true", + "contacts_manager: false", + "svg_discard_element: false", + "usb: defined", + "media_device: defined", + "playback_quality: true" ], - "window__tree_index": [ - 0 - ], - "window__tree_structure": "[[]]", - "window__location_href": "https://roblox-api.arkoselabs.com/v2/1.5.5/enforcement.fbfc14b0d793c6ef8359e0e4b4a91f67.html#476068BF-9607-4799-B53D-966BE98E2B81", - "client_config__sitedata_location_href": "https://www.roblox.com/arkose/iframe", - "client_config__surl": "https://roblox-api.arkoselabs.com", - "client_config__language": null, - "navigator_battery_charging": true, - "audio_fingerprint": "124.04347527516074" + browser_object_checks: "554838a8451ac36cb977e719e9d6623c", + "29s83ih9": "68934a3e9455fa72420237eb05902327⁣", + audio_codecs: "{\"ogg\":\"probably\",\"mp3\":\"probably\",\"wav\":\"probably\",\"m4a\":\"maybe\",\"aac\":\"probably\"}", + audio_codecs_extended_hash: "805036349642e2569ec299baed02315b", + video_codecs: "{\"ogg\":\"\",\"h264\":\"probably\",\"webm\":\"probably\",\"mpeg4v\":\"\",\"mpeg4a\":\"\",\"theora\":\"\"}", + video_codecs_extended_hash: "67b509547efe3423d32a3a70a2553c16", + media_query_dark_mode: false, + css_media_queries: 0, + css_color_gamut: "srgb", + css_contrast: "no-preference", + css_monochrome: false, + css_pointer: "coarse", + css_grid_support: false, + headless_browser_phantom: false, + headless_browser_selenium: false, + headless_browser_nightmare_js: false, + headless_browser_generic: 4, + "1l2l5234ar2": '', + document__referrer: '', + window__ancestor_origins: [], + window__tree_index: [], + window__tree_structure: "", + window__location_href: "", + client_config__sitedata_location_href: "", + client_config__language: null, + client_config__surl: "", + c8480e29a: "", + client_config__triggered_inline: false, + mobile_sdk__is_sdk: false, + audio_fingerprint: "124.04347527516074", + navigator_battery_charging: false, + media_device_kinds: ["audioinput", "videoinput", "audiooutput"], + media_devices_hash: "199eba60310b53c200cc783906883c67", + navigator_permissions_hash: "67419471976a14a1430378465782c62d", + math_fingerprint: "3b2ff195f341257a6a2abbc122f4ae67", + supported_math_functions: "e9dd4fafb44ee489f48f7c93d0f48163", + screen_orientation: "landscape-primary", + rtc_peer_connection: 5, + "4b4b269e68": "", + "6a62b2a558": "", + speech_default_voice: "Microsoft David - English (United States) || en-US", + speech_voices_hash: "215bda67dce4341131fbd207102abff3", + "4ca87df3d1": "Ow==", + "867e25e5d4": "Ow==", + "d4a306884c": "Ow==" }; function getEnhancedFingerprint(fp, ua, opts) { + var _a, _b; + !opts.bda && (opts.bda = {}); let fingerprint = { ...baseEnhancedFingerprint }; + let surl = new URL(opts.surl).origin; + let char = '⁣'; fingerprint.webgl_extensions = fingerprint.webgl_extensions.split(";").filter(_ => Math.random() > 0.5).join(";"); fingerprint.webgl_extensions_hash = (0, murmur_1.default)(fingerprint.webgl_extensions, 0); + fingerprint.webgl_hash_webgl = (0, murmur_1.default)(Object.entries(fingerprint).filter(([k, v]) => k.startsWith("webgl_") && k != "webgl_hash_webgl").map(([k, v]) => v).join(","), 0); fingerprint.screen_pixel_depth = fp.D; fingerprint.navigator_languages = fp.L; fingerprint.window_outer_height = fp.S[0]; @@ -284,15 +362,21 @@ function getEnhancedFingerprint(fp, ua, opts) { fingerprint.browser_detection_firefox = !!ua.match(/Firefox\/\d+/); fingerprint.browser_detection_brave = !!ua.match(/Brave\/\d+/); fingerprint.media_query_dark_mode = Math.random() > 0.9; - fingerprint.webgl_hash_webgl = (0, murmur_1.default)(Object.entries(fingerprint).filter(([k, v]) => k.startsWith("webgl_") && k != "webgl_hash_webgl").map(([k, v]) => v).join(","), 0); + fingerprint['29s83ih9'] = "68934a3e9455fa72420237eb05902327" + char; + fingerprint['1l2l5234ar2'] = Date.now().toString() + char; + fingerprint['window__tree_index'] = ((_a = opts === null || opts === void 0 ? void 0 : opts.bda) === null || _a === void 0 ? void 0 : _a.window__tree_index) || "[0]"; + fingerprint['window__tree_structure'] = ((_b = opts === null || opts === void 0 ? void 0 : opts.bda) === null || _b === void 0 ? void 0 : _b.window__tree_structure) || "[[]]"; + fingerprint['c8480e29a'] = crypto_1.default.createHash("md5").update(surl).digest("hex") + char; + fingerprint['6a62b2a558'] = opts.hash; + fingerprint['4b4b269e68'] = util_1.default.generateUUID(); fingerprint.client_config__language = opts.language || null; - fingerprint.window__location_href = `${opts.surl}/v2/1.5.5/enforcement.fbfc14b0d793c6ef8359e0e4b4a91f67.html#${opts.pkey}`; + fingerprint.window__location_href = `${surl}/v2/${opts.capi}/enforcement.${opts.hash}.html`; if (opts.site) { - fingerprint.document__referrer = opts.site; - fingerprint.window__ancestor_origins = [opts.site]; - fingerprint.client_config__sitedata_location_href = opts.site; + fingerprint.document__referrer = new URL(opts.site).origin; + fingerprint.window__ancestor_origins = (opts === null || opts === void 0 ? void 0 : opts.bda.window__ancestor_origins) || [opts.site]; + fingerprint.client_config__sitedata_location_href = (opts === null || opts === void 0 ? void 0 : opts.bda.client_config__sitedata_location_href) || opts.site; } - fingerprint.client_config__surl = opts.surl || "https://client-api.arkoselabs.com"; + fingerprint.client_config__surl = surl || "https://client-api.arkoselabs.com"; fingerprint.audio_fingerprint = (124.04347527516074 + Math.random() * 0.001 - 0.0005).toString(); return Object.entries(fingerprint).map(([k, v]) => ({ key: k, value: v })); } diff --git a/lib/http.d.ts b/lib/http.d.ts index 5c2e939..df4a059 100644 --- a/lib/http.d.ts +++ b/lib/http.d.ts @@ -1,7 +1,9 @@ /// import { RequestOptions } from "undici/types/dispatcher"; -declare function req(url: string, options: RequestOptions, proxy?: string): Promise<{ +declare function req(url: string, options: RequestOptions, proxy?: string, needsBuffer?: boolean): Promise<{ + status: number; headers: import("undici/types/header").IncomingHttpHeaders; - body: Buffer; + body: string; + buffer: Buffer; }>; export default req; diff --git a/lib/http.js b/lib/http.js index 92b8d8b..5d1401a 100644 --- a/lib/http.js +++ b/lib/http.js @@ -1,7 +1,7 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const undici_1 = require("undici"); -async function req(url, options, proxy) { +async function req(url, options, proxy, needsBuffer = false) { let auth = undefined; if (proxy) { let proxyUrl = new URL(proxy); @@ -17,9 +17,14 @@ async function req(url, options, proxy) { ...options, dispatcher, }); + const arrayBuffer = await req.body.arrayBuffer(); + const buffer = needsBuffer ? Buffer.from(arrayBuffer) : undefined; + const text = needsBuffer ? undefined : Buffer.from(arrayBuffer).toString('utf-8'); return { + status: req.statusCode, headers: req.headers, - body: Buffer.from(await req.body.arrayBuffer()), + body: text, + buffer: buffer, }; } exports.default = req; diff --git a/lib/session.d.ts b/lib/session.d.ts index d40a10c..a024362 100644 --- a/lib/session.d.ts +++ b/lib/session.d.ts @@ -30,7 +30,18 @@ export declare class Session { tokenInfo: TokenInfo; private userAgent; private proxy; + private cookie?; + private capi?; + private hash?; + protected is_compatibility_mode: boolean; + protected sessionId: string; constructor(token: string | GetTokenResult, sessionOptions?: SessionOptions); getChallenge(): Promise; + /** + * @deprecated + */ + initialize(): Promise; + getReferer(): string; + getCookie(): string; getEmbedUrl(): string; } diff --git a/lib/session.js b/lib/session.js index e2216d3..3567474 100644 --- a/lib/session.js +++ b/lib/session.js @@ -1,20 +1,27 @@ "use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; Object.defineProperty(exports, "__esModule", { value: true }); exports.Session = void 0; const challenge_1 = require("./challenge"); -const http_1 = require("./http"); -const util_1 = require("./util"); +const http_1 = __importDefault(require("./http")); +const util_1 = __importDefault(require("./util")); let parseToken = (token) => Object.fromEntries(token .split("|") .map((v) => v.split("=").map((v) => decodeURIComponent(v)))); class Session { constructor(token, sessionOptions) { var _a; + this.capi = "2.11.3"; + this.hash = "507409183b9903b911945fa68e24c1d9"; if (typeof token === "string") { this.token = token; } else { this.token = token.token; + token.capi && (this.capi = token.capi); + token.hash && (this.hash = token.hash); } if (!this.token.startsWith("token=")) this.token = "token=" + this.token; @@ -22,31 +29,57 @@ class Session { this.tokenInfo.mbio = typeof (token) !== "string" ? (_a = token.mbio) !== null && _a !== void 0 ? _a : false : false; this.userAgent = (sessionOptions === null || sessionOptions === void 0 ? void 0 : sessionOptions.userAgent) || util_1.default.DEFAULT_USER_AGENT; this.proxy = sessionOptions === null || sessionOptions === void 0 ? void 0 : sessionOptions.proxy; + this.cookie = typeof token !== "string" ? token.cookie : undefined; + this.is_compatibility_mode = typeof token !== "string" ? token.compatibility_mode_enabled : false; + this.sessionId = this.token.split('|')[0].split('=')[1]; } async getChallenge() { + const surl = new URL(this.tokenInfo.surl); + const timestamp = util_1.default.getTimestamp(); let res = await (0, http_1.default)(this.tokenInfo.surl, { - path: "/fc/gfct/", method: "POST", + path: "/fc/gfct/", body: util_1.default.constructFormData({ + token: this.tokenInfo.token, sid: this.tokenInfo.r, render_type: "canvas", - token: this.tokenInfo.token, - analytics_tier: this.tokenInfo.at, - "data%5Bstatus%5D": "init", lang: "en", - apiBreakerVersion: "green" + isAudioGame: false, + is_compatibility_mode: this.is_compatibility_mode, + apiBreakerVersion: "green", + analytics_tier: this.tokenInfo.at }), headers: { - "User-Agent": this.userAgent, - "Content-Type": "application/x-www-form-urlencoded", - "Accept-Language": "en-US,en;q=0.9", - "Sec-Fetch-Site": "same-origin", - "Referer": this.getEmbedUrl() + // ':authority': surl.host, + // ':method': 'POST', + // ':path': '/fc/gfct/', + // ':scheme': 'https', + 'Accept': '*/*', + 'Accept-Encoding': '', + 'Accept-Language': 'en-GB,en-US;q=0.9,en;q=0.8,ar;q=0.7', + 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8', + 'Cookie': this.cookie ? `${this.cookie} ${timestamp.cookie}` : timestamp.cookie, + 'Origin': surl.origin, + 'Priority': 'u=1, i', + 'Referer': `${surl.origin}/v2/${this.capi}/enforcement.${this.hash}.html`, + 'Sec-Ch-Ua': '"Google Chrome";v="131", "Chromium";v="131", "Not_A_Brand";v="24"', + 'Sec-Ch-Ua-Mobile': '?0', + 'Sec-Ch-Ua-Platform': '"Windows"', + 'Sec-Fetch-Dest': 'empty', + 'Sec-Fetch-Mode': 'cors', + 'Sec-Fetch-Site': 'same-origin', + 'User-Agent': this.userAgent, + 'X-Newrelic-Timestamp': timestamp.value, + 'X-Requested-With': 'XMLHttpRequest' }, }, this.proxy); - let data = JSON.parse(res.body.toString()); + let data = JSON.parse(res.body); data.token = this.token; data.tokenInfo = this.tokenInfo; + data.cookie = this.cookie; + data.is_compatibility_mode = this.is_compatibility_mode; + data.capi = this.capi; + data.hash = this.hash; if (data.game_data.gameType == 1) { return new challenge_1.Challenge1(data, { proxy: this.proxy, @@ -68,7 +101,45 @@ class Session { else { throw new Error("Unsupported game type: " + data.game_data.gameType); } - //return res.body.toString() + } + /** + * @deprecated + */ + async initialize() { + // not Working :( + let payload = { + method: "GET", + path: '/fc/init-load', + headers: { + "Accept": "*/*", + "Accept-Language": "en-GB,en-US;q=0.9,en;q=0.8,ar;q=0.7", + "Priority": "u=1, i", + "Sec-Ch-Ua": "\"Google Chrome\";v=\"131\", \"Chromium\";v=\"131\", \"Not_A Brand\";v=\"24\"", + "Sec-Ch-Ua-Mobile": "?0", + "Sec-Ch-Ua-Platform": "\"Windows\"", + "Sec-Fetch-Dest": "empty", + "Sec-Fetch-Mode": "cors", + "Sec-Fetch-Site": "same-origin", + "Cookie": this.getCookie(), + "Referer": this.getReferer(), + "Referrer-Policy": "strict-origin-when-cross-origin", + "Accept-Encoding": "gzip, deflate, br, zstd", + "User-Agent": this.userAgent + }, + query: { + session_token: this.sessionId + }, + body: null + }; + let res = await (0, http_1.default)(this.tokenInfo.surl, payload, this.proxy); + return res.status; + } + getReferer() { + return `${this.tokenInfo.surl}/v2/${this.capi}/enforcement.${this.hash}.html`; + } + getCookie() { + const timestamp = util_1.default.getTimestamp(); + return this.cookie ? `${this.cookie} ${timestamp.cookie}` : timestamp.cookie; } getEmbedUrl() { return `${this.tokenInfo.surl}/fc/gc/?${util_1.default.constructFormData(this.tokenInfo)}`; diff --git a/lib/util.d.ts b/lib/util.d.ts index e269a42..b95a575 100644 --- a/lib/util.d.ts +++ b/lib/util.d.ts @@ -1,3 +1,4 @@ +import { GetTokenOptions } from './api'; interface TimestampData { cookie: string; value: string; @@ -12,7 +13,10 @@ declare function tileToLoc(tile: number): TileLoc; declare function constructFormData(data: {}): string; declare function random(): string; declare function getTimestamp(): TimestampData; -declare function getBda(userAgent: string, opts: object): string; +declare function generateClickCoordinates(baseX?: number, baseY?: number, variance?: number): { + sc: number[]; +}; +declare function getBda(userAgent: string, opts: GetTokenOptions): string; declare function solveBreaker(v2: boolean, breaker: { value: string[]; key: string; @@ -186,5 +190,7 @@ declare const _default: { getTimestamp: typeof getTimestamp; random: typeof random; solveBreaker: typeof solveBreaker; + generateUUID: () => string; + generateClickCoordinates: typeof generateClickCoordinates; }; export default _default; diff --git a/lib/util.js b/lib/util.js index 9907051..f5bd497 100644 --- a/lib/util.js +++ b/lib/util.js @@ -1,9 +1,13 @@ "use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; Object.defineProperty(exports, "__esModule", { value: true }); -const fingerprint_1 = require("./fingerprint"); -const murmur_1 = require("./murmur"); -const crypt_1 = require("./crypt"); -const DEFAULT_USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36"; +const fingerprint_1 = __importDefault(require("./fingerprint")); +const murmur_1 = __importDefault(require("./murmur")); +const crypt_1 = __importDefault(require("./crypt")); +const crypto_1 = __importDefault(require("crypto")); +const DEFAULT_USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36"; let apiBreakers = { v1: { 3: { @@ -105,15 +109,31 @@ function random() { function getTimestamp() { const time = (new Date()).getTime().toString(); const value = `${time.substring(0, 7)}00${time.substring(7, 13)}`; - return { cookie: `timestamp=${value};path=/;secure;samesite=none`, value }; + return { cookie: `timestamp=${value}`, value }; +} +function toVal(t) { + if (!t) + return []; + var e = []; + for (var n in t) + t.hasOwnProperty(n) && e.push(t[n]); + return e; +} +function generateClickCoordinates(baseX = 140, baseY = 212, variance = 10) { + const randomX = baseX + (Math.random() - 0.5) * variance; + const randomY = baseY + (Math.random() - 0.5) * variance; + const x = Math.round(randomX); + const y = Math.round(randomY); + return { + "sc": [x, y] + }; } function getBda(userAgent, opts) { let fp = fingerprint_1.default.getFingerprint(); let fe = fingerprint_1.default.prepareFe(fp); let bda = [ { key: "api_type", value: "js" }, - { key: "p", value: 1 }, - { key: "f", value: (0, murmur_1.default)(fingerprint_1.default.prepareF(fingerprint_1.default), 31) }, + { key: "f", value: (0, murmur_1.default)(toVal(fp).join(';'), 0) }, { key: "n", value: Buffer.from(Math.round(Date.now() / (1000 - 0)).toString()).toString("base64"), @@ -125,7 +145,7 @@ function getBda(userAgent, opts) { }, { key: "fe", value: fe }, { key: "ife_hash", value: (0, murmur_1.default)(fe.join(", "), 38) }, - { key: "cs", value: 1 }, + // { key: "cs", value: 1 }, { key: "jsbd", value: JSON.stringify({ @@ -160,6 +180,16 @@ function solveBreaker(v2, breaker = "default", gameType, value) { return value; } } +const generateUUID = () => { + const bytes = crypto_1.default.randomBytes(16); + bytes[6] = (bytes[6] & 0x0f) | 0x40; // Version 4 + bytes[8] = (bytes[8] & 0x3f) | 0x80; // Variant 10xxxxxx + return (bytes.toString('hex').slice(0, 8) + '-' + + bytes.toString('hex').slice(8, 12) + '-' + + bytes.toString('hex').slice(12, 16) + '-' + + bytes.toString('hex').slice(16, 20) + '-' + + bytes.toString('hex').slice(20)); +}; exports.default = { DEFAULT_USER_AGENT, tileToLoc, @@ -168,5 +198,7 @@ exports.default = { apiBreakers, getTimestamp, random, - solveBreaker + solveBreaker, + generateUUID, + generateClickCoordinates, }; diff --git a/package-lock.json b/package-lock.json index 098164d..3458f0d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "funcaptcha", - "version": "1.0.38", + "version": "1.1.7", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "funcaptcha", - "version": "1.0.38", + "version": "1.1.7", "license": "MIT", "dependencies": { "undici": "^5.22.0" @@ -168,6 +168,7 @@ "version": "5.22.0", "resolved": "https://registry.npmjs.org/undici/-/undici-5.22.0.tgz", "integrity": "sha512-fR9RXCc+6Dxav4P9VV/sp5w3eFiSdOjJYsbtWfd4s5L5C4ogyuVpdKIVHeW0vV1MloM65/f7W45nR9ZxwVdyiA==", + "license": "MIT", "dependencies": { "busboy": "^1.6.0" }, diff --git a/package.json b/package.json index 0757938..2d4cf23 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "funcaptcha", - "version": "1.1.7", + "version": "1.2.0", "description": "A library used to interact with funcaptchas.", "author": "noahcoolboy", "license": "MIT", diff --git a/src/api.ts b/src/api.ts index 6582750..0dffa9e 100644 --- a/src/api.ts +++ b/src/api.ts @@ -12,12 +12,17 @@ export interface GetTokenOptions { location?: string; proxy?: string; language?: string; + // capi & hash are not required it's automatically initialized + capi?: string; + hash?: string; + bda?: Record<'window__ancestor_origins' | 'client_config__sitedata_location_href' | 'window__tree_structure' | 'window__tree_index', any>; } export interface GetTokenResult { challenge_url: string; challenge_url_cdn: string; challenge_url_cdn_sri: string; + compatibility_mode_enabled: boolean; disable_default_styling: boolean | null; iframe_height: number | null; iframe_width: number | null; @@ -30,56 +35,138 @@ export interface GetTokenResult { tbio: boolean; // The token for the funcaptcha. Can be used 10 times before having to get a new token. token: string; + pow: boolean; + + cookie: string; + capi: string; + hash: string; +} + +interface ErrorResponse { + error?: boolean; + message?: string; } -export async function getToken( - options: GetTokenOptions -): Promise { +export async function getToken(options: GetTokenOptions): Promise { + let xheaders = { ...options.headers }; + delete options.headers; + options = { surl: "https://client-api.arkoselabs.com", data: {}, - ...options, + headers: { + // ':authority': 'client-api.arkoselabs.com', + // ':method': 'POST', + // ':path': '/fc/gt2/public_key/{key}', + // ':scheme': 'https', + 'Accept': '*/*', + 'Accept-Encoding': '',// 'gzip, deflate, br, zstd', + 'Accept-Language': 'en-GB,en-US;q=0.9,en;q=0.8,ar;q=0.7', + 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8', + 'Origin': '{surl}', + 'Priority': 'u=1, i', + 'Referer': '{surl}/v2/{capi}/enforcement.{hash}.html', + 'Sec-Ch-Ua': '"Google Chrome";v="131", "Chromium";v="131", "Not_A_Brand";v="24"', + 'Sec-Ch-Ua-Mobile': '?0', + 'Sec-Ch-Ua-Platform': '"Windows"', + 'Sec-Fetch-Dest': 'empty', + 'Sec-Fetch-Mode': 'cors', + 'Sec-Fetch-Site': 'same-origin', + ...xheaders + // 'X-Ark-Esync-Value': '1734588000' + }, + ...options }; - if (!options.headers) - options.headers = { "User-Agent": util.DEFAULT_USER_AGENT }; - else if (!Object.keys(options.headers).map(v => v.toLowerCase()).includes("user-agent")) + // options.headers[':authority'] = new URL(options.surl).host; + // options.headers[':path'] = options.headers[':path'].replace('{key}', options.pkey); + + if (!Object.keys(options.headers).map(v => v.toLowerCase()).includes("user-agent")) options.headers["User-Agent"] = util.DEFAULT_USER_AGENT; - options.headers["Accept-Language"] = "en-US,en;q=0.9"; - options.headers["Sec-Fetch-Site"] = "same-origin"; - options.headers["Accept"] = "*/*"; - options.headers["Content-Type"] = "application/x-www-form-urlencoded; charset=UTF-8"; - options.headers["sec-fetch-mode"] = "cors" + options.surl = new URL(options.surl).origin; + let surl = options.surl; + let ua = options.headers[Object.keys(options.headers).find(v => v.toLowerCase() == "user-agent")] + let { capi, hash, cookie } = await getkeyInfo(surl, options.pkey, options.proxy); + + options.capi = capi; + options.hash = hash; if (options.site) { - options.headers["Origin"] = options.surl - options.headers["Referer"] = `${options.surl}/v2/${options.pkey}/1.5.5/enforcement.fbfc14b0d793c6ef8359e0e4b4a91f67.html` + options.headers["Origin"] = surl + options.headers["Referer"] = options.headers["Referer"].replace('{surl}', surl).replace('{capi}', capi).replace('{hash}', hash); } - - let ua = options.headers[Object.keys(options.headers).find(v => v.toLowerCase() == "user-agent")] - let res = await request( - options.surl, - { - method: "POST", - path: "/fc/gt2/public_key/" + options.pkey, - body: util.constructFormData({ - bda: util.getBda(ua, options), - public_key: options.pkey, - site: options.site ? new URL(options.site).origin : undefined, - userbrowser: ua, - capi_version: "1.5.5", - capi_mode: "inline", - style_theme: "default", - rnd: Math.random().toString(), - ...Object.fromEntries(Object.keys(options.data).map(v => ["data[" + v + "]", options.data[v]])), - language: options.language || "en", - }), - headers: options.headers, - }, - options.proxy - ); + if (cookie) { + options.headers["Cookie"] = cookie; + } - return JSON.parse(res.body.toString()); + let time = new Date().getTime() / 1000; + let key = Math.round(time - (time % 21600)); + options.headers['X-Ark-Esync-Value'] = key.toString(); + + let res = await request(surl, { + path: `/fc/gt2/public_key/${options.pkey}`, + method: 'POST', + body: util.constructFormData({ + bda: util.getBda(ua, options), + public_key: options.pkey, + site: options.site ? new URL(options.site).origin : undefined, + userbrowser: ua, + capi_version: capi, + capi_mode: "inline", + style_theme: "default", + rnd: Math.random().toString(), + ...Object.fromEntries(Object.keys(options.data).map(v => ["data[" + v + "]", options.data[v]])), + language: options.language || "en", + }), + headers: options.headers, + }, options.proxy); + + try { + const x = JSON.parse(res.body); + + x.cookie = cookie; + x.capi = capi; + x.hash = hash; + + return x; + } catch { + return { error: true, message: res.body } + } } + +async function getkeyInfo(surl: string, key: string, proxy: string) { + let res = await request(surl, { + method: 'GET', + "path": `/v2/${key}/api.js`, + headers: { + // ":authority": new URL(surl).host, + // ":method": "GET", + // ":path": `/v2/${key}/api.js`, + // ":scheme": "https", + "Accept": "*/*", + 'Accept-Encoding': '',// 'gzip, deflate, br, zstd', + "Accept-Language": "en-GB,en-US;q=0.9,en;q=0.8,ar;q=0.7", + "Referer": "https://demo.arkoselabs.com/", + "Sec-Ch-Ua": "\"Google Chrome\";v=\"131\", \"Chromium\";v=\"131\", \"Not_A Brand\";v=\"24\"", + "Sec-Ch-Ua-Mobile": "?0", + "Sec-Ch-Ua-Platform": "\"Windows\"", + "Sec-Fetch-Dest": "script", + "Sec-Fetch-Mode": "no-cors", + "Sec-Fetch-Site": "same-site", + "User-Agent": util.DEFAULT_USER_AGENT + } + }, proxy); + + const data = res.body; + + const capi = data.match(/u="([\d.]+)"/)?.[1]; + const hash = data.match(/enforcement\.([a-f0-9]+)\.html/)?.[1]; + + return { + cookie: typeof res.headers['set-cookie'] == 'string' && res.headers['set-cookie'].split(';')[0].concat(';'), + capi, + hash + } +} \ No newline at end of file diff --git a/src/bio.ts b/src/bio.ts new file mode 100644 index 0000000..e32c477 --- /dev/null +++ b/src/bio.ts @@ -0,0 +1,52 @@ +const data = [ + "eyJtYmlvIjoiNzc0LDAsMTYyLDE3ODs3OTAsMCwxODQsMTcwOzgwNSwwLDIwNCwxNjQ7ODIyLDAsMjEyLDE2MTs4MzksMCwyMjQsMTU5Ozg1NiwwLDIzNiwxNTY7ODcyLDAsMjQyLDE1NTs5MDYsMCwyNDgsMTUzOzk3MiwwLDI1NCwxNTI7MTI0MCwwLDI2MCwxNTI7MTY3MywwLDI2MiwxNTc7Mzk1NiwxLDI2MiwxNTc7NDA4NywyLDI2MiwxNTc7NDYyMiwwLDI0OCwxNjk7NDYzOCwwLDI0MSwxNzY7NDY1NSwwLDIzNiwxODA7NDcwNiwwLDIzMCwxODU7NDc3MiwwLDIyNSwxODc7NDgyMywwLDIyMCwxOTE7NDg3MSwwLDIxNSwxOTQ7NDkyMiwwLDIwOCwxOTc7NDk1NiwwLDIwMywyMDA7NTAwOSwxLDIwMCwyMDE7NTExNCwyLDIwMCwyMDE7IiwidGJpbyI6IiIsImtiaW8iOiIifQ==", + "eyJtYmlvIjoiNzIwNywwLDI2OSwyMDk7NzIyMSwwLDI2MiwxOTA7NzIzOCwwLDI1OSwxODU7NzI1NCwwLDI1NiwxODA7NzI4OSwwLDI1MywxNzQ7NzMyMSwwLDI1MCwxNjc7NzM1NSwwLDI0OCwxNjE7NzU3MiwwLDI0MywxNjI7NzkwNCwwLDIzOCwxNjM7NzkzNywwLDIzMywxNjQ7Nzk3MSwwLDIyNCwxNjU7Nzk4OCwwLDIxMywxNjY7ODAwNCwwLDIwNywxNjY7ODAyMSwwLDE5OCwxNjY7ODA1NCwwLDE4OSwxNjY7ODA4OCwwLDE4MiwxNjU7ODQ1NSwwLDIwMiwxNjY7ODQ3MSwwLDIxNSwxNjY7ODQ4NywwLDIyNCwxNjY7ODUzNywwLDIzMiwxNjY7ODU3MSwwLDIzOSwxNjY7ODYwNCwwLDI0NSwxNjY7ODYzOCwwLDI1MiwxNjY7ODY3MSwwLDI1OSwxNjY7ODcyMSwwLDI2NSwxNjY7ODc3MSwwLDI3MSwxNjY7ODg1NCwwLDI3NywxNjY7OTEwNSwxLDI3OSwxNjg7OTI0MiwyLDI3OSwxNjg7MTAwNDAsMSwyNzksMTY4OzEwMTI1LDIsMjc5LDE2ODsxMDI1MSwxLDI3OSwxNjg7MTAzNjAsMiwyNzksMTY4OzEwNjg5LDEsMjc5LDE2ODsxMDc4MCwyLDI3OSwxNjg7MTA4NTYsMSwyNzksMTY4OzEwOTUxLDIsMjc5LDE2ODsxMTE3NywxLDI3OSwxNjg7MTEyNDcsMiwyNzksMTY4OzExNDg4LDAsMjY1LDE2OTsxMTUwNCwwLDI1OSwxNjk7MTE1MjAsMCwyNTAsMTY5OzExNTM4LDAsMjQzLDE2OTsxMTU1NCwwLDIzNywxNjk7MTE1NzEsMCwyMjksMTY5OzExNjA1LDAsMjIxLDE2ODsxMTYzNywwLDIxMiwxNjc7MTE2NzEsMCwyMDUsMTY2OzExNzAzLDAsMTk4LDE2NTsxMTczNywwLDE5MiwxNjU7MTE3ODcsMCwxODUsMTY1OzExODU0LDAsMTgwLDE2NjsxMjAwNSwwLDE3NSwxNjc7MTIxNTAsMSwxNzQsMTY5OzEyMjUwLDIsMTc0LDE2OTsxMjQyMiwwLDE3NCwxNzc7MTI0NTUsMCwxNzQsMTg2OzEyNDcxLDAsMTc0LDE5MjsxMjUyMSwwLDE3NCwxOTk7MTI4NjAsMSwxNzIsMjAzOzEyOTM1LDIsMTcyLDIwMzsiLCJ0YmlvIjoiIiwia2JpbyI6IiJ9", + "eyJtYmlvIjoiNDk2MSwwLDMwMiwxNTA7NDk5MywwLDI5NCwxNTM7NTAyNiwwLDI4OSwxNTU7NTEwOSwwLDI4NCwxNTc7NTM0NCwwLDI4MCwxNjE7NTM5NCwwLDI3NSwxNjI7NTQ0MywwLDI2OSwxNjI7NTUyNywwLDI2MywxNjI7NTg1NCwxLDI2NiwxNTk7NTk1MywyLDI2NiwxNTk7NjM2NSwxLDI2NiwxNTk7NjQ1NiwyLDI2NiwxNTk7NzAwOSwwLDI1NCwxNjk7NzAyNywwLDI1MCwxNzM7NzA0NCwwLDI0NiwxNzc7NzA2MCwwLDI0MCwxODM7NzA3NywwLDIzNSwxODc7NzA5MywwLDIzMCwxOTA7NzEyNywwLDIyNCwxOTM7NzE3NywwLDIxNywxOTc7NzIxMCwwLDIxMiwxOTk7NzI2MCwwLDIwNiwyMDM7NzMxMCwwLDIwMCwyMDc7NzM2MSwwLDE5NiwyMTE7NzQ0MywxLDE5MiwyMTI7NzUwNCwyLDE5MiwyMTI7IiwidGJpbyI6IiIsImtiaW8iOiIifQ==", + "eyJtYmlvIjoiNTM2MSwwLDI5OSwxNjk7NTM3OCwwLDI5NiwxNTg7NTM5NCwwLDI5MiwxNDU7NTQyOCwwLDI5MSwxMzc7NTc2MSwwLDI4NCwxMzc7NTc5NCwwLDI4MCwxNDE7NTg2MSwwLDI3NCwxNDM7NTk3OCwwLDI2OSwxNDU7NjA3OCwwLDI2NCwxNDk7NjMyOCwwLDI2MCwxNTM7NjgzNiwxLDI2MSwxNTQ7Njk1MCwyLDI2MSwxNTQ7NzM5MiwxLDI2MSwxNTc7NzQ3OSwyLDI2MSwxNTc7Nzk3OCwwLDI1NywxNjA7Nzk5NSwwLDI1MCwxNjc7ODAxMSwwLDI0NCwxNzE7ODAyNywwLDIzNywxNzc7ODA2MSwwLDIzMCwxODM7ODA5NCwwLDIyNCwxODY7ODEyOCwwLDIxOCwxODg7ODE3OCwwLDIxMywxOTA7ODI0NSwwLDIwOCwxOTI7ODI3NywwLDIwMywxOTU7ODMxMSwwLDE5OCwxOTk7ODM2MSwwLDE5MywyMDM7ODQ0MiwwLDE4OCwyMDY7ODQ0MywxLDE4OCwyMDY7ODU0NywyLDE4OCwyMDY7IiwidGJpbyI6IiIsImtiaW8iOiIifQ==", + "eyJtYmlvIjoiNTE3NSwwLDI5MCwxNjQ7NTE5MCwwLDI4MCwxNjY7NTIwNiwwLDI2OCwxNjk7NTI0MCwwLDI2MSwxNzE7NTQyNCwwLDI1NiwxNzA7NTU3MywwLDI1NiwxNjQ7NTcwNywwLDI2MSwxNjM7NjE2NywxLDI2MywxNjE7NjI2OSwyLDI2MywxNjE7Njg4NiwxLDI2MywxNjE7Njk5MiwyLDI2MywxNjE7NzE5NiwxLDI2MywxNjE7NzI2NSwyLDI2MywxNjE7NzUyMywwLDI1MiwxNjE7NzU0MCwwLDI0MiwxNjE7NzU1NiwwLDIzNCwxNjE7NzU3MiwwLDIyNiwxNjE7NzU4OSwwLDIyMCwxNjI7NzYwNiwwLDIxNCwxNjI7NzYyMywwLDIwMywxNjQ7NzY0MCwwLDE5NSwxNjQ7NzY1NywwLDE4NiwxNjU7NzY4OSwwLDE3NywxNjU7NzcwNiwwLDE3MCwxNjU7Nzc0MSwwLDE2NCwxNjM7Nzc5MCwwLDE1OCwxNjE7Nzg2NSwxLDE1NiwxNTk7Nzk0OSwyLDE1NiwxNTk7ODE0MCwwLDE2MCwxNzA7ODE3MywwLDE2MywxNzc7ODIwNiwwLDE2NiwxODQ7ODI0MCwwLDE2NywxODk7ODMwNiwwLDE2NywxOTU7ODU1NiwwLDE2MywyMDA7ODYwMywxLDE2MywyMDE7ODY5NCwyLDE2MywyMDE7IiwidGJpbyI6IiIsImtiaW8iOiIifQ==", + "eyJtYmlvIjoiOTM5LDAsMTcxLDE4OTs5NDYsMCwxOTMsMTkxOzk1MywwLDIxOCwxOTM7OTYwLDAsMjM5LDE5NDs5NjcsMCwyNTgsMTk2Ozk3NCwwLDI3MiwxOTg7OTgwLDAsMjgyLDE5OTs5ODgsMCwyOTIsMjAwOzE4NzIsMCwzMDEsMTg0OzE4NzksMCwyOTEsMTg0OzE4ODYsMCwyODUsMTg0OzE4OTMsMCwyNzcsMTg0OzE5MDAsMCwyNzAsMTg0OzE5MTUsMCwyNjEsMTg0OzE5MjcsMCwyNTQsMTgzOzE5NDIsMCwyNDcsMTgxOzE5NTYsMCwyNDIsMTgwOzE5NzYsMCwyMzcsMTc4OzIwMTIsMCwyMzIsMTc2OzIwOTUsMCwyMjcsMTc3OzIxMzAsMCwyMjIsMTgwOzIxNTgsMCwyMTgsMTg2OzIxODUsMCwyMTMsMTkwOzIyMDYsMCwyMDgsMTk0OzIyMjcsMCwyMDMsMTk4OzIyNDksMCwxOTcsMjAyOzIyNzYsMCwxOTIsMjA0OzIzMTEsMCwxODcsMjA4OzIzNDYsMCwxODEsMjExOzIzNjYsMCwxNzYsMjE0OzIzODgsMCwxNzAsMjIwOzI0MDEsMCwxNjQsMjIzOzI0MTYsMCwxNTksMjI3OzI0MjgsMCwxNTIsMjMzOzI0MzYsMCwxNDcsMjM3OzI0NTAsMCwxNDAsMjQ0OzI0NjQsMCwxMzMsMjQ5OzI0NzgsMCwxMjksMjU1OzI0OTIsMCwxMjUsMjU5OzI1MTMsMCwxMjEsMjY0OzI2ODAsMCwxMjUsMjYwOzI3MDEsMCwxMzAsMjU1OzI3MjIsMCwxMzUsMjUwOzI3MzUsMCwxMzksMjQ2OzI3NTAsMCwxNDUsMjM5OzI3NjQsMCwxNTEsMjMzOzI3NzcsMCwxNTgsMjI3OzI3ODUsMCwxNjMsMjI1OzI3OTcsMCwxNzEsMjIyOzI4MTksMCwxNzcsMjIwOzI4MzksMCwxODIsMjE4OzI4OTUsMCwxODksMjE4OzI5OTIsMCwxODcsMjIzOzMwNDEsMCwxODIsMjI0OzMxMTAsMCwxNzYsMjI0OzMyMzYsMCwxNzEsMjIwOzM1MTAsMSwxNjksMjE4OzM2MTQsMiwxNjksMjE4OyIsInRiaW8iOiIiLCJrYmlvIjoiIn0=", + "eyJtYmlvIjoiMTAxOTEsMCwzMDEsMjMxOzEwMjE5LDAsMjk2LDIzMDsxMDIzOSwwLDI5MCwyMjk7MTAyNjcsMCwyODUsMjI4OzEwMzIzLDAsMjc5LDIyODsxMDY3NywwLDI3MywyMjg7MTA2OTcsMCwyNjYsMjI4OzEwNzEyLDAsMjYxLDIyNjsxMDcyNSwwLDI1NCwyMjQ7MTA3NDYsMCwyNDgsMjIwOzEwNzYwLDAsMjQzLDIxNzsxMDc4MSwwLDIzOCwyMTQ7MTA4MjMsMCwyMzMsMjEwOzEwODcyLDAsMjI4LDIwOTsxMDkxNywxLDIyOCwyMDk7MTEwMjAsMiwyMjgsMjA5OyIsInRiaW8iOiIiLCJrYmlvIjoiIn0=", + "eyJtYmlvIjoiMTA2MzcsMCwzMDAsMjAzOzEwNjQyLDAsMjk1LDIwMTsxMDY1NiwwLDI4OCwxOTU7MTA2NzAsMCwyODMsMTkxOzEwNjg0LDAsMjc4LDE4NTsxMDY5OCwwLDI3NCwxODA7MTA3MTIsMCwyNzAsMTc0OzEwNzI2LDAsMjY2LDE2ODsxMDczOSwwLDI2MywxNjM7MTA3NjEsMCwyNTksMTU4OzEwNzg5LDAsMjU1LDE1MzsxMTA2MSwwLDI2MSwxNTM7MTExMDksMSwyNjQsMTU0OzExMTk0LDIsMjY0LDE1NDsxMTQ3NCwwLDI1NiwxNjM7MTE0NzksMCwyNDUsMTc0OzExNDg1LDAsMjM0LDE4NTsxMTQ5MiwwLDIyNCwxOTU7MTE1MDAsMCwyMTcsMjA0OzExNTA2LDAsMjA5LDIxMTsxMTUxMywwLDIwNCwyMTc7MTE1MjAsMCwxOTcsMjI0OzExNTI3LDAsMTg5LDIzMDsxMTUzNCwwLDE4NCwyMzU7MTE1NDEsMCwxNzcsMjQxOzExNTQ4LDAsMTcxLDI0NTsxMTU1NSwwLDE2NCwyNTE7MTE1NjIsMCwxNTksMjUzOzExNTY5LDAsMTU0LDI1NzsxMTU4MiwwLDE0OSwyNjE7MTE1OTYsMCwxNDMsMjY1OzExNjE3LDAsMTM4LDI2NzsxMTY2NywwLDEzMiwyNzA7MTE3NTAsMCwxMjgsMjY2OzExNzc4LDAsMTI3LDI2MDsxMTc5MiwwLDEyNiwyNTU7MTE4MDUsMCwxMjQsMjQ5OzExODI2LDAsMTIxLDI0MjsxMTg0NywwLDExNiwyMzg7MTE4NjgsMCwxMTEsMjM1OzExODg5LDAsMTA1LDIzMTsxMTkxMCwwLDEwMCwyMjc7MTE5MjUsMCw5NSwyMjQ7MTE5MzcsMCw5MiwyMTg7MTE5NTgsMCw4NywyMTM7MTE5OTMsMCw4MywyMDk7MTIwNTcsMCw3OCwyMDU7MTIxNzUsMCw3NSwyMTA7MTIyNTQsMSw3NCwyMTI7MTIzMjEsMiw3NCwyMTI7IiwidGJpbyI6IiIsImtiaW8iOiIifQ==", + "eyJtYmlvIjoiNTU3OCwwLDI5OSwyODE7NTU4NCwwLDI3NywyNzI7NTU5MSwwLDI2MCwyNjM7NTU5OCwwLDI0NywyNTc7NTYwNCwwLDIzOCwyNTE7NTYxMSwwLDIyOCwyNDY7NTYxOCwwLDIxOSwyNDI7NTYyNSwwLDIxMCwyMzc7NTYzMiwwLDIwNSwyMzU7NTYzOSwwLDIwMCwyMzI7NTY1MywwLDE5MiwyMjk7NTY2OCwwLDE4NSwyMjY7NTY4MSwwLDE3OSwyMjI7NTcwMywwLDE3MywyMTg7NTcxNywwLDE2NywyMTY7NTczOCwwLDE2MiwyMTM7NTc3MywwLDE1NiwyMTA7NTgwOCwwLDE1MCwyMDk7NTgyOCwwLDE0NCwyMDc7NTg1MCwwLDEzNSwyMDc7NTg2MiwwLDEyOCwyMDc7NTg3NiwwLDEyMCwyMDg7NTg5MSwwLDExMiwyMDg7NTkwNSwwLDEwNiwyMTA7NTkxOSwwLDEwMCwyMTE7NTk0MCwwLDkzLDIxMTs1OTYwLDAsODUsMjExOzU5ODEsMCw3NywyMTE7NTk5NSwwLDcxLDIxMTs2MDE1LDAsNjUsMjExOzYwNDQsMCw1OSwyMTE7NjEwMCwwLDUzLDIxMTs2NDU0LDAsNTgsMjA5OzY0NzYsMCw2NCwyMDg7NjQ5MCwwLDcyLDIwNzs2NTAzLDAsODQsMjA3OzY1MTEsMCw5MiwyMDY7NjUxOCwwLDEwNiwyMDY7NjUyNSwwLDEyNCwyMDQ7NjUzMSwwLDE0MiwyMDQ7NjUzOSwwLDE1OCwyMDQ7NjU0NiwwLDE3MCwyMDQ7NjU1MiwwLDE4MCwyMDU7NjU1OSwwLDE4OSwyMDU7NjU3MywwLDE5NiwyMDY7NjU4OCwwLDIwMywyMDY7NjY0MywwLDIxMCwyMDY7Njc5MSwxLDIxMCwyMDY7Njg4MCwyLDIxMCwyMDY7IiwidGJpbyI6IiIsImtiaW8iOiIifQ==", + "eyJtYmlvIjoiNTM5OSwwLDE1NywyODU7NTQxMiwwLDE1OCwyNzU7NTQyNiwwLDE1OSwyNjY7NTQ0MCwwLDE1OSwyNTc7NTQ1NCwwLDE1OSwyNTA7NTQ3NSwwLDE1OSwyNDM7NTQ5NiwwLDE1OSwyMzU7NTUxMCwwLDE2MCwyMjk7NTUzOCwwLDE2MCwyMjI7NTU4NiwwLDE1OSwyMTc7NTkwMiwwLDE1MywyMTY7NTkxNSwwLDE0NywyMTU7NTkyOCwwLDE0MCwyMTM7NTk0MywwLDEzNSwyMTI7NTk3MSwwLDEyOSwyMTA7NjA0MCwwLDEyMywyMTA7NjA5MSwxLDEyMywyMTA7NjE4OCwyLDEyMywyMTA7IiwidGJpbyI6IiIsImtiaW8iOiIifQ==", + "eyJtYmlvIjoiMTE0NjMsMCwyNzEsMjU0OzExNDY5LDAsMjUxLDI1NDsxMTQ3NywwLDIzOSwyNTQ7MTE0ODMsMCwyMzMsMjU0OzExNDk4LDAsMjI2LDI1MzsxMTc3MCwwLDIyNiwyNDY7MTE3OTgsMCwyMjYsMjQwOzExODY3LDAsMjI2LDIzNDsxMTk4NSwwLDIyNCwyMjg7MTIxNzQsMCwyMjIsMjIyOzEyMjg0LDAsMjI1LDIxNjsxMjMyNiwwLDIzMCwyMTI7MTIzNTQsMCwyMzMsMjA3OzEyMzc0LDAsMjM3LDIwMzsxMjQwMiwwLDI0MywyMDA7MTI0MzAsMCwyNDYsMTk1OzEyNDU4LDAsMjUyLDE5MTsxMjQ3OSwwLDI1NiwxODc7MTI1MDcsMCwyNTksMTgyOzEyNTQ5LDAsMjYzLDE3NzsxMjgzNywxLDI2NywxNzQ7MTI5NDMsMiwyNjcsMTc0OzEzMTcwLDAsMjU3LDE3OTsxMzE5MCwwLDI1MSwxODI7MTMyMDQsMCwyNDYsMTg1OzEzMjI1LDAsMjQwLDE4ODsxMzIzOSwwLDIzNiwxOTI7MTMyNjIsMCwyMzEsMTk1OzEzMjgwLDAsMjI2LDE5ODsxMzMwOSwwLDIyMSwyMDE7MTMzMzcsMSwyMTksMjAyOzEzNDIxLDIsMjE5LDIwMjsiLCJ0YmlvIjoiIiwia2JpbyI6IiJ9", + "eyJtYmlvIjoiNDIyLDAsMjA0LDIxOTs1MjIsMCwyMDEsMjE0OzYxMCwwLDIwMiwyMDg7NjUyLDAsMjEwLDIwOTs2NTgsMCwyMTYsMjEwOzY2NSwwLDIzMSwyMTU7NjcyLDAsMjQ3LDIyMjs2NzksMCwyNjIsMjMwOzY4OCwwLDI3NywyMzY7NjkzLDAsMjk4LDI0Mzs2NjUzLDAsMjkyLDI1ODs2NjU5LDAsMjc5LDI1MDs2NjY2LDAsMjcyLDI0NTs2NjczLDAsMjYzLDIzOTs2NjgxLDAsMjU2LDIzMzs2Njg3LDAsMjQ3LDIyNzs2Njk0LDAsMjM4LDIyMjs2NzAxLDAsMjI5LDIxODs2NzA4LDAsMjE5LDIxMzs2NzE1LDAsMjEwLDIxMDs2NzIyLDAsMjAzLDIwODs2NzI5LDAsMTk4LDIwNTs2NzQzLDAsMTkxLDIwMjs2NzU2LDAsMTg2LDE5OTs2Nzg0LDAsMTgwLDE5NTs2ODMzLDAsMTc0LDE5Mjs2ODc0LDAsMTY5LDE4ODs2OTE4LDAsMTY0LDE4NDs2OTQ2LDAsMTU5LDE4MTs2OTcyLDAsMTUzLDE3ODs2OTkzLDAsMTQ4LDE3Njs3MDM1LDAsMTQ1LDE3MTs3MjU4LDAsMTUwLDE2OTs3Mzg1LDEsMTUxLDE2OTs3NDYxLDIsMTUxLDE2OTs3Nzc2LDEsMTUxLDE2OTs3OTA1LDIsMTUxLDE2OTs4MTM1LDAsMTU1LDE3MDs4MTQ5LDAsMTYxLDE3MTs4MTY5LDAsMTY3LDE3Mzs4MTkxLDAsMTczLDE3NTs4MjEyLDAsMTc4LDE3OTs4MjM5LDAsMTgyLDE4Mzs4MjgxLDAsMTg1LDE5MDs4MzIzLDAsMTg0LDE5NTs4MzY1LDAsMTgwLDE5OTs4NDE0LDAsMTc1LDIwNDs4NDQ5LDAsMTcwLDIwNzs4NTIwLDAsMTY1LDIxMzs4NTQ4LDEsMTY0LDIxMzs4NjEwLDIsMTY0LDIxMzsiLCJ0YmlvIjoiIiwia2JpbyI6IiJ9", + "eyJtYmlvIjoiNjk1NywwLDMwMCwxNjA7NzAwMCwwLDI5MywxNjM7NzAzNCwwLDI4OCwxNjU7NzA4NCwwLDI4MiwxNjc7NzEzOCwwLDI3NiwxNjg7NzE5NSwxLDI3MiwxNjg7NzI3MSwyLDI3MiwxNjg7NzM5MCwxLDI3MiwxNjg7NzQ3NSwyLDI3MiwxNjg7Nzc1MiwwLDI3MCwxNzA7Nzc4NiwwLDI2NiwxNzQ7NzgyMSwwLDI2MSwxNzU7Nzg3MCwwLDI1NiwxODA7Nzg5NywwLDI1MSwxODM7NzkyNSwwLDI0NywxODc7Nzk1MywwLDI0MiwxOTE7Nzk3NCwwLDIzNiwxOTQ7ODAwMSwwLDIzMCwxOTc7ODAyMiwwLDIyNSwxOTg7ODA1NywwLDIxOCwyMDA7ODEwNiwwLDIxMywyMDM7ODE2MywxLDIwOCwyMDU7ODI1MiwyLDIwOCwyMDU7IiwidGJpbyI6IiIsImtiaW8iOiIifQ==", + "eyJtYmlvIjoiNzA1OCwwLDMwMSwxODA7NzA3NywwLDI5NSwxNzc7NzA5MSwwLDI5MSwxNzM7NzExMywwLDI4NiwxNzI7NzE0MiwwLDI4MSwxNzA7NzE4OSwwLDI3NiwxNjk7NzI1OSwwLDI3MCwxNjk7NzYxNSwxLDI2NiwxNzA7NzY5OCwyLDI2NiwxNzA7NzkxNCwwLDI2NSwxNzE7NzkzNCwwLDI2MCwxNzY7Nzk1NSwwLDI1NSwxODA7Nzk3NiwwLDI1MCwxODM7ODAwNCwwLDI0NSwxODg7ODAzMiwwLDI0MCwxOTI7ODA2NywwLDIzNSwxOTQ7ODEyMywwLDIzMSwxOTg7ODI0MiwwLDIyNywyMDM7ODI4MywwLDIyMywyMDc7ODMxMCwwLDIxOSwyMTE7ODMzMCwwLDIxNywyMTY7ODM1MSwwLDIxNCwyMjI7ODM2NiwwLDIxMSwyMjg7ODM4MCwwLDIwOSwyMzM7ODM5NCwwLDIwNywyMzg7ODQwOCwwLDIwNSwyNDQ7ODQyOSwwLDIwMiwyNTA7ODQ0OSwwLDIwMSwyNTU7ODQ5MywwLDE5OSwyNjE7ODU0OCwxLDE5NiwyNjQ7ODY0NywyLDE5NiwyNjQ7ODg3NywwLDIwNCwyNTg7ODg4OSwwLDIxMCwyNTI7ODkwNSwwLDIxNSwyNDg7ODkxNywwLDIyMSwyNDI7ODkzMCwwLDIyNCwyMzc7ODk1OCwwLDIyOCwyMzE7ODk3OCwwLDIzMSwyMjY7OTAxMywwLDIzMiwyMjA7OTA2MiwwLDIzMywyMTM7OTA5NywwLDIzMywyMDc7OTEzMiwwLDIzNSwyMDI7OTE1OSwwLDIzNiwxOTc7OTE5NCwwLDIzOCwxOTI7OTI4NSwwLDI0MCwxODc7OTMxOSwwLDIzNCwxOTA7OTM0MCwwLDIyOCwxOTQ7OTM1NCwwLDIyMCwxOTY7OTM2MiwwLDIxNSwxOTc7OTM2OCwwLDIxMCwxOTg7OTM3NSwwLDIwNCwxOTg7OTM4OSwwLDE5MywxOTk7OTM5NiwwLDE4NywxOTk7OTQxMCwwLDE3OSwxOTg7OTQzMSwwLDE3MywxOTY7OTQ1MiwxLDE3MiwxOTU7OTU0MywyLDE3MiwxOTU7OTcyNCwwLDE4MywxOTM7OTczMywwLDE4OSwxOTM7OTczOCwwLDE5NiwxOTE7OTc0NSwwLDIwMiwxOTA7OTc1MSwwLDIwNywxODk7OTc2NSwwLDIxNCwxODg7OTc4MCwwLDIyMCwxODc7OTgwMCwwLDIyNSwxODY7OTgzNCwwLDIzMSwxODU7OTg5MiwwLDIzNywxODU7MTAwMzAsMCwyNDMsMTgxOzEwMTIyLDAsMjQ0LDE3NjsxMDE5NywwLDI0NSwxNzE7MTAyNjcsMCwyNDcsMTY2OzEwNDcwLDAsMjUyLDE2MjsxMDU3NSwwLDI1NywxNjM7MTA2NDMsMCwyNTcsMTY5OzEwNjkxLDAsMjU4LDE3NTsxMDcxMiwwLDI2MiwxODI7MTA3MjAsMCwyNjgsMTg3OzEwNzI3LDAsMjc3LDE5ODsxMDczMywwLDI5MywyMTY7MTExMDMsMCwyNTYsMjg1OzExMTE2LDAsMjUzLDI3NzsxMTEzMCwwLDI1MSwyNzE7MTExNDQsMCwyNTAsMjY2OzExMTY0LDAsMjQ4LDI2MTsxMTIxMywwLDI0MywyNTU7MTEyODMsMCwyMzksMjUxOzExMzE3LDAsMjM1LDI0NTsxMTM0NiwwLDIzMywyMzk7MTEzNjYsMCwyMzEsMjM0OzExMzg3LDAsMjMwLDIyOTsxMTQyOSwwLDIyOSwyMjQ7MTE1MDYsMSwyMjYsMjIxOzExNjE4LDIsMjI2LDIyMTsiLCJ0YmlvIjoiIiwia2JpbyI6IiJ9", + "eyJtYmlvIjoiNjYyOTgsMCwzMDEsMTkxOzY2MzExLDAsMjk1LDE5MTs2NjMzOSwwLDI4OCwxOTE7NjY0MDksMCwyODIsMTkxOzY2NTc3LDAsMjc5LDE5Njs2NjYyNCwwLDI3NSwyMDA7NjY3OTIsMCwyNzIsMTk1OzY2ODA1LDAsMjcyLDE4OTs2NjgxOSwwLDI3MywxODQ7NjY4MzQsMCwyNzQsMTc1OzY2ODQ2LDAsMjc1LDE2Nzs2Njg2MCwwLDI3NiwxNjI7NjY4OTYsMCwyNzgsMTU2OzY3MDE3LDEsMjc3LDE1NTs2NzA2OSwyLDI3NywxNTU7NjczNDIsMCwyNzMsMTY2OzY3MzU1LDAsMjY5LDE3NDs2NzM3MCwwLDI2NiwxNzk7NjczODMsMCwyNjMsMTg1OzY3NDA0LDAsMjU5LDE5MTs2NzQyNSwwLDI1NCwxOTY7Njc0NDUsMCwyNTAsMjAxOzY3NDc0LDAsMjQ2LDIwNjs2NzUxNiwwLDI0MCwyMTA7Njc1ODYsMSwyMzYsMjEyOzY3NjQxLDIsMjM2LDIxMjsiLCJ0YmlvIjoiIiwia2JpbyI6IiJ9", + "eyJtYmlvIjoiNTk0NSwwLDMwMCwxNDY7NTk1OCwwLDI5MywxNTI7NTk3MSwwLDI4OCwxNTQ7NTk5NCwwLDI4MiwxNTg7NjAxMywwLDI3NiwxNjE7NjA0MiwwLDI3MCwxNjQ7NjA3NywwLDI2NiwxNjg7NjE3NSwwLDI2MSwxNzE7NjQ4MywxLDI2MSwxNjY7NjU4NiwyLDI2MSwxNjY7Njc2NSwwLDI1MywxNzg7Njc4MCwwLDI0OCwxODM7Njc5MywwLDI0MywxODk7NjgyMiwwLDIzOSwxOTM7Njg0OSwwLDIzNCwxOTY7Njg5MSwwLDIyOCwyMDE7NjkyNiwwLDIyNCwyMDU7Njk4OCwwLDIyMCwyMTA7NzA1MiwwLDIxNSwyMTM7NzE5MSwxLDIxMSwyMTY7NzI2MSwyLDIxMSwyMTY7IiwidGJpbyI6IiIsImtiaW8iOiIifQ==", + "eyJtYmlvIjoiNTcwMSwwLDI5OCwyMDg7NTcxMywwLDI5MiwyMDY7NTcyOCwwLDI4NCwyMDI7NTczNCwwLDI3OSwyMDA7NTc0OCwwLDI3MiwxOTc7NTc2MSwwLDI2NywxOTQ7NTc4NCwwLDI2MSwxOTA7NTgwNCwwLDI1NSwxODQ7NTgxOCwwLDI0OSwxNzk7NTgzMCwwLDI0MywxNzI7NTg0NCwwLDIzOCwxNjY7NTg2NiwwLDIzNCwxNjE7NTkxNCwwLDIyOSwxNTg7NjA2OCwwLDIzMSwxNjM7NjExMCwwLDIyNywxNjc7NjEzOCwwLDIyMiwxNjk7NjI3MCwwLDIyOSwxNjk7NjI4NCwwLDIzNCwxNjg7NjI5OCwwLDI0MiwxNjc7NjMyMiwwLDI0OSwxNjY7NjMzOSwwLDI1NSwxNjU7NjQwMywwLDI2MSwxNjM7NjU2NSwxLDI2MSwxNjM7NjY0MCwyLDI2MSwxNjM7Njg4MywwLDI1NiwxNzA7NjkxMiwwLDI1MiwxNzU7NjkzOSwwLDI0OSwxODA7Njk2OCwwLDI0NiwxODY7NzAwMiwwLDI0MiwxOTI7NzA0MywwLDIzOCwxOTg7NzA5MiwxLDIzNCwyMDE7NzE3NiwyLDIzNCwyMDE7IiwidGJpbyI6IiIsImtiaW8iOiIifQ==", + "eyJtYmlvIjoiNTIwMywwLDI5NywxMzg7NTIxNywwLDI5MiwxNDA7NTIzNywwLDI4NiwxNDE7NTI2NSwwLDI4MSwxNDM7NTI5OSwwLDI3NiwxNDQ7NTM0OSwwLDI3MCwxNDY7NTQ0NywwLDI2NywxNTE7NTYwOSwxLDI2NiwxNTM7NTY3NywyLDI2NiwxNTM7NTc4MCwxLDI2NiwxNTM7NTg1MSwyLDI2NiwxNTM7NTk0OSwxLDI2NiwxNTM7NjAwMywyLDI2NiwxNTM7NjI2MSwwLDI2MiwxNTc7NjI3NiwwLDI1NiwxNjE7NjI5MCwwLDI1MSwxNjY7NjMwMiwwLDI0NSwxNzA7NjMxNiwwLDI0MCwxNzQ7NjMzMCwwLDIzNiwxNzg7NjM1MiwwLDIzMSwxODA7NjM3MywwLDIyNiwxODU7NjQxMywwLDIyMSwxODk7NjQ0MSwwLDIxNiwxOTM7NjQ4NCwwLDIxMCwxOTg7NjUyNSwwLDIwNiwyMDI7NjU1MywwLDIwMiwyMDc7NjYyMywxLDIwMCwyMTI7NjcyMiwyLDIwMCwyMTI7IiwidGJpbyI6IiIsImtiaW8iOiIifQ==", + "eyJtYmlvIjoiNTQzMCwwLDMwMSwyNTA7NTQ0MywwLDI5OCwyNDQ7NTQ1NiwwLDI5NSwyMzU7NTQ3MSwwLDI5NiwyMjQ7NTQ4NiwwLDI5NywyMTU7NTQ5OSwwLDMwMCwyMDY7NTgwMCwwLDMwMSwyMDE7NTgxOSwwLDI5NSwxOTY7NTgzMywwLDI4OCwxOTI7NTg0NywwLDI4MSwxODc7NTg2MCwwLDI3NiwxODQ7NTg4MSwwLDI3MiwxODA7NTkxNSwwLDI2OCwxNzY7NjAwOCwwLDI2NiwxNzE7NjE0MCwwLDI2NiwxNjU7NjI1NCwxLDI2NiwxNjU7NjMxOSwyLDI2NiwxNjU7NjQ0MSwxLDI2NiwxNjU7NjUzNywyLDI2NiwxNjU7Njc3MiwwLDI2MiwxNzA7Njc4NiwwLDI1NywxNzM7NjgyMiwwLDI1MywxNzc7Njg1NiwwLDI0NywxODI7Njg3NywwLDI0MiwxODQ7Njg5MSwwLDIzOCwxODg7NjkxMiwwLDIzMiwxOTE7NjkyNiwwLDIyNywxOTQ7NjkzOSwwLDIyMiwxOTc7Njk1NCwwLDIxNywxOTk7Njk2OSwwLDIxMiwyMDI7Njk4OCwwLDIwNiwyMDY7NzAxNiwwLDIwMCwyMDg7NzAzMCwwLDE5NSwyMTA7NzA1OCwwLDE5MCwyMTI7NzA5MywwLDE4NCwyMTQ7NzEyMCwwLDE3OCwyMTU7NzE0OSwwLDE3MywyMTc7NzE3NiwwLDE2OCwyMTk7NzIxMSwwLDE2MiwyMTk7NzI3NCwwLDE1NiwyMjA7NzMyNCwxLDE1NCwyMjA7NzQwNiwyLDE1NCwyMjA7IiwidGJpbyI6IiIsImtiaW8iOiIifQ==", + "eyJtYmlvIjoiNDczNCwwLDI5NCwyMzc7NDc0MiwwLDI4NywyMzE7NDc0NywwLDI4MCwyMjY7NDc1NSwwLDI3NSwyMjA7NDc2MCwwLDI2OSwyMTU7NDc3NCwwLDI2MiwyMDg7NDc4OSwwLDI1OCwyMDM7NDgwOSwwLDI1MiwxOTk7NDgyNCwwLDI0MSwxOTc7NDgzMCwwLDIzNCwxOTc7NDgzOCwwLDIyNCwxOTU7NDg0NCwwLDIxNiwxOTU7NDg1MSwwLDIwOCwxOTU7NDg2NSwwLDE5NywxOTU7NDg3OCwwLDE4OCwxOTQ7NDg5MiwwLDE4MywxOTM7NDkwNiwwLDE3OCwxOTI7NDkyNywwLDE3MywxOTA7NTIxMywwLDE2NywxODQ7NTIzNSwwLDE2MiwxNzk7NTI0NywwLDE1OSwxNzQ7NTI4MywwLDE1NCwxNzA7NTM1MywwLDE1MCwxNjY7NTYzMiwxLDE1MSwxNjI7NTcyOSwyLDE1MSwxNjI7NTkxMSwxLDE1MSwxNjI7NTk5NCwyLDE1MSwxNjI7NjA5OSwxLDE1MSwxNjI7NjE4OSwyLDE1MSwxNjI7NjI2NSwxLDE1MSwxNjI7NjM0OSwyLDE1MSwxNjI7NjQ0MSwxLDE1MSwxNjI7NjUwOSwyLDE1MSwxNjI7NzExNSwwLDE1NCwxNjI7NzE0MiwwLDE1OCwxNjc7NzE1NiwwLDE2NCwxNzQ7NzE2MywwLDE2OCwxNzk7NzE3MCwwLDE3NSwxODU7NzE3OCwwLDE4MiwxOTI7NzE4NSwwLDE4OCwxOTg7NzE5MiwwLDE5MywyMDM7NzE5OSwwLDIwMSwyMDk7NzIwNiwwLDIwNywyMTE7NzIxMywwLDIxMSwyMTU7NzIyMCwwLDIxNiwyMTc7NzIzMywwLDIyMSwyMjE7NzI2MSwwLDIyNiwyMjM7NzM4OCwwLDIyOCwyMjg7Nzg5MCwwLDIyNCwyMjQ7Nzk5MywwLDIxOCwyMjM7ODA4MywwLDIxMywyMjI7ODExOSwxLDIxMywyMjI7ODIxNywyLDIxMywyMjI7IiwidGJpbyI6IiIsImtiaW8iOiIifQ==", + "eyJtYmlvIjoiNDI3NSwwLDI5MiwxOTA7NDI4MiwwLDI4NSwxODY7NDI4OCwwLDI4MCwxODQ7NDI5NSwwLDI3NCwxODE7NDMwOSwwLDI2OCwxNzY7NDMzOCwwLDI2NCwxNzI7NDYwMSwwLDI2MywxNjc7NDYyMiwwLDI2MCwxNjI7NDY3MiwwLDI1OSwxNTY7NDg3NSwxLDI2MSwxNTk7NDkyOCwyLDI2MSwxNTk7NTAwMCwxLDI2MSwxNTk7NTA4MiwyLDI2MSwxNTk7NTEzNywxLDI2MSwxNTk7NTIyMiwyLDI2MSwxNTk7NTQ2NSwwLDI2MCwxNjM7NTQ4NiwwLDI1OCwxNjg7NTUxNCwwLDI1NSwxNzM7NTUyOCwwLDI1MiwxNzk7NTU0MiwwLDI0OCwxODQ7NTU1NSwwLDI0NCwxOTE7NTU2OSwwLDIzOSwxOTg7NTU4NCwwLDIzNCwyMDM7NTYwNCwwLDIzMCwyMDg7NTY0NiwwLDIyNiwyMTM7NTg1NCwwLDIyNSwyMDg7NTkyNSwwLDIyNywyMDM7NjAwMCwxLDIyNywyMDQ7NjA3MiwyLDIyNywyMDQ7IiwidGJpbyI6IiIsImtiaW8iOiIifQ==", + "eyJtYmlvIjoiNDI2NiwwLDI3MCwyODY7NDI3MiwwLDIyOCwyNzI7NDI3OSwwLDE5NCwyNTg7NDI4NiwwLDE3NiwyNTA7NDI5MywwLDE2NiwyNDQ7NDI5OSwwLDE1OSwyMzk7NDMxOSwwLDE1MywyMzU7NDU1OCwwLDE1OSwyMzA7NDU2NCwwLDE2NiwyMjM7NDU3MSwwLDE3NiwyMTU7NDU3NywwLDE4MywyMDk7NDU4NCwwLDE5NCwyMDE7NDU5MSwwLDIwMCwxOTQ7NDU5OSwwLDIwNywxODc7NDYwNiwwLDIxNCwxODA7NDYxMiwwLDIyMCwxNzQ7NDYxOSwwLDIyNSwxNjc7NDYzMywwLDIzMSwxNTk7NDYzOSwwLDIzNSwxNTU7NDY1MywwLDIzOCwxNTA7NDY5MCwwLDI0MiwxNDQ7NDgyMCwwLDI0NywxNDM7NDg5OCwwLDI1MSwxNDc7NDk1NSwwLDI1MiwxNTM7NTAyNCwwLDI1MCwxNTk7NTE3NiwxLDI1NCwxNjI7NTI1MiwyLDI1NCwxNjI7NTM1OSwxLDI1NCwxNjI7NTQ0MiwyLDI1NCwxNjI7NTYzOSwwLDI1MywxNjY7NTY0MywwLDI0OSwxNzE7NTY1MCwwLDI0NSwxNzc7NTY2NCwwLDIzOSwxODM7NTY3OCwwLDIzNSwxODg7NTY5OCwwLDIzMSwxOTM7NTc0NywwLDIyNywxOTc7NTc4OSwwLDIyMywyMDE7NTgzMSwwLDIxOSwyMDY7NTg3MywwLDIxNSwyMTA7NTkxNSwwLDIxMCwyMTI7NTk1MCwwLDIwNSwyMTY7NTk3NywwLDIwMCwyMTg7NTk5MSwwLDE5NCwyMjA7NjAwNiwwLDE4OCwyMjI7NjAyMCwwLDE4MSwyMjQ7NjAzMywwLDE3MiwyMjU7NjA0NywwLDE2NCwyMjY7NjA2MCwwLDE1NSwyMjg7NjA2NywwLDE1MCwyMjk7NjA4MSwwLDE0MywyMjk7NjA5NSwwLDEzNCwyMjk7NjEwMiwwLDEyOCwyMjk7NjExNiwwLDExOSwyMjk7NjEyMywwLDExNCwyMjc7NjEzOCwwLDEwNiwyMjc7NjE1MiwwLDEwMCwyMjY7NjE3MiwwLDk1LDIyNTs2MjE0LDAsOTAsMjIzOzYzMDQsMCw4NCwyMjM7NjMyMCwxLDg0LDIyMzs2Mzk3LDIsODQsMjIzOyIsInRiaW8iOiIiLCJrYmlvIjoiIn0=", + "eyJtYmlvIjoiNTY3MCwwLDI5NiwxODY7NTY4NSwwLDI4OSwxODM7NTcxMiwwLDI4NCwxODA7NjAxMSwwLDI3OSwxNzY7NjAzMSwwLDI3NCwxNzM7NjA1OSwwLDI2OCwxNjk7NjA4OCwwLDI2MywxNjY7NjE1MSwwLDI1OSwxNjI7NjMzOSwwLDI1NiwxNjc7NjM1OSwwLDI1MywxNzM7NjM3OSwwLDI0OSwxODI7NjM5MywwLDI0NSwxOTI7NjQwMCwwLDI0MywxOTk7NjQwNywwLDIzOCwyMDg7NjQxNCwwLDIzNSwyMTQ7NjQyMCwwLDIzMywyMjE7NjQyOCwwLDIzMCwyMjg7NjQzNSwwLDIyNiwyMzM7NjQ0MywwLDIyNCwyMzg7NjQ0OSwwLDIyMSwyNDM7NjQ2NCwwLDIxOCwyNDg7NjQ3NywwLDIxNCwyNTM7NjQ5OCwwLDIxMSwyNTg7NjUxOCwwLDIwNywyNjI7NjUzOSwwLDIwNCwyNjc7NjU3NCwwLDIwMCwyNzI7NjYyNiwxLDE5OSwyNzQ7NjcxNiwyLDE5OSwyNzQ7Njg3NSwwLDIwNiwyNjk7Njg4NywwLDIxMSwyNjY7NjkwOSwwLDIxNywyNjE7NjkyMywwLDIyMCwyNTY7Njk0NCwwLDIyNSwyNTE7Njk2NCwwLDIzMCwyNDY7Njk4NiwwLDIzMywyNDE7NzAwNiwwLDIzNiwyMzQ7NzAyOCwwLDIzOCwyMjg7NzA0OCwwLDIzOSwyMjI7NzA2OSwwLDI0MCwyMTY7NzA5MSwwLDI0MSwyMTE7NzExOSwwLDI0MywyMDU7NzE1OSwwLDI0MywxOTg7NzIwOSwwLDI0MywxOTI7NzI3MSwwLDIzOCwxOTA7NzI5MywwLDIzMSwxOTA7NzMwNywwLDIyNCwxOTA7NzMyNiwwLDIxNiwxOTA7NzM0MSwwLDIwNywxOTA7NzM1NSwwLDE5OCwxOTA7NzM2OSwwLDE5MCwxOTA7NzM4MywwLDE4NCwxODk7NzM5NywxLDE4MiwxODk7NzQ5NSwyLDE4MiwxODk7NzY2MiwwLDE5MCwxODk7NzY2OCwwLDE5NiwxODk7NzY4MiwwLDIwNSwxODg7NzY4OSwwLDIxMSwxODY7NzcwMiwwLDIxNywxODY7NzcyMywwLDIyMiwxODQ7Nzc2NiwwLDIyNywxODM7NzgyMiwwLDIzMiwxODI7Nzk2OCwwLDIzNywxNzk7ODA3MywwLDI0MiwxNzQ7ODEyNiwwLDI0NywxNzI7ODEzNCwwLDI1NCwxNjk7ODE0MSwwLDI1OSwxNjc7ODE0OCwwLDI2NywxNjM7ODE1NSwwLDI3OCwxNTY7ODE2MiwwLDI5MSwxNDg7OTA5NiwwLDMwMCwxMTU7OTEwMiwwLDI5NiwxMjU7OTEwOSwwLDI5MSwxMzQ7OTExNywwLDI4NywxNDE7OTEyMywwLDI4MywxNDc7OTE0MSwwLDI4MiwxNTY7OTE1MSwwLDI3OSwxNjE7OTE2NSwwLDI3NSwxNjY7OTE3OSwwLDI3MywxNzI7OTIwMCwwLDI2OSwxNzk7OTIyMCwwLDI2MywxODc7OTI1NiwwLDI2MCwxOTI7OTMxOSwwLDI1NywxOTg7OTQwOSwwLDI1NywxOTE7OTQzMCwwLDI1OCwxODQ7OTQ1OSwwLDI1OSwxNzc7OTQ5MywwLDI2MSwxNzI7OTUzNCwwLDI2MywxNjc7OTU4MywxLDI2MywxNjQ7OTY4OCwyLDI2MywxNjQ7OTk2NiwwLDI2MSwxNzI7MTAwMDEsMCwyNjAsMTc3OzEwMDI3LDAsMjU4LDE4MjsxMDA1NywwLDI1NiwxODg7MTAwNzcsMCwyNTMsMTkzOzEwMDk3LDAsMjUxLDE5ODsxMDExOSwwLDI0OCwyMDM7MTAxNDksMCwyNDUsMjA4OzEwMTkwLDAsMjQwLDIxMTsxMDI0NiwxLDIzNywyMTA7MTAzMjksMiwyMzcsMjEwOyIsInRiaW8iOiIiLCJrYmlvIjoiIn0=", + "eyJtYmlvIjoiMzY5OSwwLDI5MiwyMjA7MzcwNSwwLDI4NiwyMjA7MzcxMywwLDI4MCwyMjA7MzcxOSwwLDI3NSwyMjE7NDAwMSwwLDI3MCwyMTk7NDAxMywwLDI2MCwyMTI7NDAyMCwwLDI1NSwyMDg7NDAyNywwLDI1MCwyMDQ7NDAzNCwwLDI0NSwyMDI7NDA0MSwwLDIzOSwxOTg7NDA0OSwwLDIzNCwxOTU7NDA1NCwwLDIyOSwxOTM7NDA2OSwwLDIyMCwxOTA7NDA3NiwwLDIxNCwxODk7NDA5MCwwLDIwMywxODg7NDA5NiwwLDE5OCwxODc7NDExMSwwLDE4OSwxODQ7NDEyNiwwLDE4MSwxODI7NDEzOSwwLDE3NiwxODE7NDE2NSwwLDE3MSwxNzg7NDIwMiwwLDE2NSwxNzU7NDI0MiwwLDE2MSwxNzE7NDI5NywwLDE1NiwxNjY7NDM3MSwxLDE1NCwxNjU7NDQ1OSwyLDE1NCwxNjU7NDcxNywxLDE1NCwxNjU7NDc5MywyLDE1NCwxNjU7NTA4NCwwLDE1NCwxNzE7NTExMywwLDE1NiwxNzc7NTEzNCwwLDE1OCwxODM7NTE0OCwwLDE2MCwxODg7NTE2OCwwLDE2MiwxOTQ7NTE4OSwwLDE2NCwyMDE7NTIxMSwwLDE2NiwyMDk7NTIyNSwwLDE2NiwyMTU7NTI0NSwwLDE2NywyMjI7NTI4OCwwLDE2OCwyMjc7NTUwNCwwLDE3NCwyMjg7NTcyNSwwLDE3NiwyMjI7NTg5NSwwLDE3NywyMTc7NTkxNSwxLDE3NywyMTc7NTk5OSwyLDE3NywyMTc7IiwidGJpbyI6IiIsImtiaW8iOiIifQ==", + "eyJtYmlvIjoiMzUwNiwwLDI5NiwyMzk7MzUxMywwLDI4MSwyMzU7MzUxOSwwLDI2OSwyMzQ7MzUyNywwLDI1NywyMzE7MzUzNCwwLDI0NSwyMjk7MzU0MCwwLDIzMCwyMjg7MzU0NywwLDIyMCwyMjY7MzU1NCwwLDIxMiwyMjU7MzU2OCwwLDIwMSwyMjU7MzU3NSwwLDE5NSwyMjQ7MzU5NywwLDE4OCwyMjQ7MzYzOCwwLDE4MywyMjM7Mzc2MywwLDE3NywyMjM7Mzc4NCwwLDE3MCwyMjM7Mzc5OSwwLDE1OSwyMjU7MzgwNiwwLDE1MSwyMjY7MzgxMiwwLDE0MiwyMjg7MzgxOSwwLDEzNCwyMjk7MzgyNiwwLDEyOCwyMjk7MzgzNCwwLDEyMywyMzA7Mzg0OCwwLDExNCwyMzI7Mzg2MCwwLDEwMywyMzM7Mzg2NywwLDk1LDIzNDszODc0LDAsODgsMjM2OzM4ODIsMCw3OCwyMzY7Mzg5MCwwLDY4LDIzNzszODk2LDAsNjAsMjM4OzM5MDIsMCw1MywyMzg7MzkxNywwLDQ3LDIzODszOTM3LDAsNDAsMjM4OzM5NzIsMCwzMywyMzc7NDAzNiwwLDI5LDIzMzs0MTQwLDAsMjcsMjI4OzQxOTUsMCwyNywyMjI7NDM0MiwwLDM0LDIyMDs0MzU1LDAsNDEsMjIwOzQzNjksMCw1MCwyMjA7NDM4MywwLDU5LDIxODs0Mzk4LDAsNjgsMjE2OzQ0MTIsMCw3NiwyMTY7NDQyNSwwLDg1LDIxNDs0NDM5LDAsOTMsMjE0OzQ0NTIsMCw5OSwyMTM7NDQ3MywwLDEwNSwyMTM7NDUwOSwwLDExMSwyMTM7NDU3MiwwLDExNywyMTM7NDcwNiwwLDExOSwyMTk7NDgwOCwwLDExNywyMjU7NTA0NywxLDExNiwyMjU7NTEyOSwyLDExNiwyMjU7IiwidGJpbyI6IiIsImtiaW8iOiIifQ==", + "eyJtYmlvIjoiNTI3OCwwLDMwMSwyMDU7NTMwMCwwLDI5NCwyMDQ7NTM4MywwLDI4OCwyMDQ7NTQ1MSwwLDI4NSwxOTk7NTQ3MiwwLDI3OSwxOTY7NTQ4NiwwLDI3MywxOTI7NTUwNywwLDI2OSwxODg7NTUzNCwwLDI2NCwxODU7NTU4MywwLDI2MCwxODE7NTczOCwwLDI1OSwxNzQ7NTgwOCwxLDI1OCwxNzM7NTg2OSwyLDI1OCwxNzM7NTk2OSwxLDI1OCwxNzM7NjAzMCwyLDI1OCwxNzM7NjE1MCwxLDI1OCwxNzM7NjIwNCwyLDI1OCwxNzM7NjU0NiwwLDI1NSwxNzg7NjU2NiwwLDI1MywxODM7NjU4NiwwLDI0OCwxODk7NjYwNywwLDI0MiwxOTU7NjYyMSwwLDIzOCwyMDA7NjYzNSwwLDIzMywyMDU7NjY0OSwwLDIyOCwyMDk7NjY2MywwLDIyMiwyMTM7NjY5MiwwLDIxNywyMTY7NjczMywwLDIxMiwyMTc7Njg1MiwwLDIwNiwyMTc7NjkwOCwwLDIwMCwyMTc7Njk2MywxLDE5NiwyMTc7NzAzMiwyLDE5NiwyMTc7IiwidGJpbyI6IiIsImtiaW8iOiIifQ==", + "eyJtYmlvIjoiMzczNiwwLDI4NSwxNzg7Mzc0NCwwLDI3MCwxODA7Mzc1MCwwLDI1OCwxODE7Mzc1NywwLDI1MCwxODQ7Mzc2NSwwLDI0MSwxODc7Mzc3MiwwLDIzMCwxOTA7Mzc3OSwwLDIyMiwxOTU7NDA5OSwwLDIyOSwxOTE7NDEwNywwLDIzNCwxODk7NDEyMCwwLDI0MCwxODQ7NDEzNSwwLDI0NiwxODE7NDE2MSwwLDI1MywxNzc7NDE5NywwLDI1NywxNzM7NDI2NywwLDI2MiwxNzA7NDY4NywxLDI2MywxNzA7NDc0MSwyLDI2MywxNzA7NDg3NCwxLDI2MywxNzA7NTAwNiwyLDI2MywxNzA7NTIzNSwwLDI1OCwxNzc7NTI1NSwwLDI1NCwxODE7NTI3NiwwLDI0OSwxODU7NTMxNywwLDI0MywxODk7NTM3NCwwLDIzNywxOTI7NTQyMywwLDIzMiwxOTY7NTQ2NSwwLDIyNywxOTg7NTQ5MywwLDIyMiwxOTk7NTUxOSwwLDIxNywyMDE7NTU0OCwwLDIxMiwyMDQ7NTU2OCwwLDIwNiwyMDY7NTU4OSwwLDIwMCwyMDg7NTYxMSwwLDE5NSwyMDk7NTYzOCwwLDE5MCwyMTE7NTY1NCwxLDE4OSwyMTE7NTczNiwyLDE4OSwyMTE7IiwidGJpbyI6IiIsImtiaW8iOiIifQ==", + "eyJtYmlvIjoiNDI4MywwLDMwMSwxNzQ7NDMxNSwwLDI5NywxNzA7NDM1MSwwLDI5MSwxNjg7NDM5MCwwLDI4NSwxNjg7NDQ2MSwxLDI4MSwxNzA7NDU0NCwyLDI4MSwxNzA7NDYyMywxLDI4MSwxNzA7NDcxOSwyLDI4MSwxNzA7NDk0MiwwLDI3OCwxNzE7NDk2OSwwLDI3MSwxNzY7NDk4NCwwLDI2NiwxNzk7NDk5NiwwLDI2MCwxODU7NTAxMCwwLDI1NCwxODk7NTAyNCwwLDI0NywxOTU7NTAzOCwwLDI0MCwyMDE7NTA1MiwwLDIzMywyMDY7NTA2NiwwLDIyOSwyMTE7NTA4MCwwLDIyNSwyMTU7NTEwMSwwLDIxOCwyMTk7NTEzMCwwLDIxNCwyMjM7NTE3OSwwLDIwOSwyMjY7NTMwNSwwLDIwNCwyMjM7NTQwOSwxLDIwMiwyMjE7NTUwNSwyLDIwMiwyMjE7IiwidGJpbyI6IiIsImtiaW8iOiIifQ==", + "eyJtYmlvIjoiNzg4MCwwLDIxNiwxNjQ7ODEwNSwwLDIyMywxNjQ7ODEzMywwLDIyOCwxNjM7ODE1NCwwLDIzMywxNjI7ODE4MSwwLDIzOCwxNjE7ODIwOSwwLDI0MywxNjA7ODI0NiwwLDI0OSwxNjA7ODI3OSwwLDI1NSwxNTk7ODMyMSwwLDI2MSwxNTk7ODM3MCwwLDI2NywxNTk7ODQzOSwxLDI3MSwxNjI7ODQ5NywyLDI3MSwxNjI7ODU4MiwxLDI3MSwxNjI7ODY3MCwyLDI3MSwxNjI7ODgyNSwwLDI2OSwxNjY7ODgzMCwwLDI2NywxNzE7ODgzNywwLDI2NCwxNzY7ODg1MSwwLDI2MCwxODQ7ODg2NCwwLDI1NSwxOTE7ODg3OSwwLDI1MiwxOTg7ODkwMCwwLDI0NywyMDM7ODkyOCwwLDI0MywyMDk7ODk2MSwwLDIzOCwyMTM7OTAwMywwLDIzMywyMTc7OTA0NiwwLDIyOCwyMjE7OTA5NSwwLDIyNCwyMjU7OTEwMSwxLDIyNCwyMjU7OTE3OCwyLDIyNCwyMjU7IiwidGJpbyI6IiIsImtiaW8iOiIifQ==", + "eyJtYmlvIjoiMzkzMiwwLDI1MiwyMzM7MzkzNywwLDIxOCwyMzE7Mzk0NCwwLDE5NiwyMjk7Mzk1MiwwLDE4MiwyMjk7Mzk1OCwwLDE3MiwyMjk7Mzk3MSwwLDE2NywyMjg7NDIzOCwwLDE3MiwyMjY7NDI0MywwLDE4MSwyMjE7NDI1MCwwLDE4NiwyMTk7NDI1OCwwLDE5MywyMTY7NDI3MSwwLDE5OCwyMTM7NDMzNSwwLDIwMiwyMDk7NDM3MCwwLDE5OCwyMDU7NDM4MywwLDE5MywyMDI7NDM5NywwLDE4NywxOTk7NDQxMSwwLDE4MiwxOTQ7NDQyNSwwLDE3NSwxODk7NDQzOCwwLDE3MSwxODQ7NDQ2NywwLDE2NywxNzk7NDUwMiwwLDE2NCwxNzQ7NDU1MCwwLDE2MiwxNjc7NDYwNSwwLDE2MiwxNjE7NDY2MywxLDE2MiwxNjA7NDY4OSwyLDE2MiwxNjA7NDkwNSwxLDE2MiwxNjA7NTAwMiwyLDE2MiwxNjA7NTIzOSwwLDE2MSwxNjg7NTI1MywwLDE2MCwxNzQ7NTI3NCwwLDE1OSwxODE7NTI4OCwwLDE1OCwxODY7NTMwOSwwLDE1NSwxOTI7NTMzMCwwLDE1NCwxOTk7NTM1MCwwLDE1MywyMDU7NTM3MiwwLDE1MiwyMTA7NTQwNywwLDE1MCwyMTY7NTQ0OSwwLDE0OCwyMjI7NTYwMiwwLDE0MywyMjU7NTY2NCwwLDEzOCwyMjY7NTY4NSwwLDEzMSwyMjc7NTY5OCwwLDEyNCwyMjg7NTcxMiwwLDExNSwyMjg7NTcyNiwwLDEwNywyMjg7NTc0MSwwLDEwMCwyMjg7NTc2OCwwLDk0LDIyNzs1ODE4LDAsODksMjI1OzU5MDEsMCw4NywyMjA7NTkzNiwxLDg3LDIxOTs2MDI4LDIsODcsMjE5OyIsInRiaW8iOiIiLCJrYmlvIjoiIn0=", + "eyJtYmlvIjoiMzkyMiwwLDI5NSwxOTk7MzkyNywwLDI4NiwxOTk7MzkzNSwwLDI4MCwxOTk7Mzk0OCwwLDI3MywxOTk7Mzk3NywwLDI2NywxOTg7NDAyNSwwLDI2MywxOTQ7NDA3NCwwLDI2MiwxODk7NDE0NCwwLDI2MCwxODQ7NDU1OCwxLDI2MCwxODQ7NDYzOCwyLDI2MCwxODQ7NTA0MywwLDI1NSwxODU7NTA5MSwxLDI1MSwxODc7NTE5MCwyLDI1MSwxODc7NTQ3NCwwLDI0OSwxODg7NTUwMiwwLDI0NSwxOTI7NTU0NCwwLDIzOSwxOTg7NTU4NiwwLDIzMywyMDI7NTYxOSwwLDIyOSwyMDc7NTY2MiwwLDIyNCwyMTA7NTcwNCwxLDIyMywyMTI7NTc4MiwyLDIyMywyMTI7IiwidGJpbyI6IiIsImtiaW8iOiIifQ==", + "eyJtYmlvIjoiNDU2MywwLDMwMCwxNTc7NDYwMywwLDI5NSwxNjI7NDYzMCwwLDI5MCwxNjU7NDY1OCwwLDI4NSwxNjg7NDY4NiwwLDI3OSwxNjk7NDcyOCwwLDI3MywxNjk7NDc1MCwxLDI3MiwxNjk7NDgxOSwyLDI3MiwxNjk7NDkwMywxLDI3MiwxNjk7NDk3OSwyLDI3MiwxNjk7NTI3OCwwLDI2NywxNzU7NTI5MiwwLDI2NCwxODE7NTMwNiwwLDI1OSwxODY7NTMyMCwwLDI1NCwxOTI7NTMzNSwwLDI0OSwxOTg7NTM0OSwwLDI0NCwyMDM7NTM2MywwLDIzOSwyMDc7NTM4MywwLDIzNCwyMTI7NTQwNCwwLDIyOSwyMTU7NTQ2MSwwLDIyNSwyMTk7NTkyNywwLDIzMSwyMTY7NjIyNywxLDIzMywyMTg7NjMxMSwyLDIzMywyMTg7IiwidGJpbyI6IiIsImtiaW8iOiIifQ==", + "eyJtYmlvIjoiMTAyMywwLDE5NiwxNzc7MTA0NSwwLDE5OSwxNzE7MTA3MywwLDIwNSwxNjQ7MTEwOCwwLDIxMCwxNTk7MTE0OSwwLDIxNiwxNTc7MTE4NSwwLDIyMSwxNTQ7MTIzNCwwLDIyOSwxNTQ7MTI3NiwwLDIzNCwxNTM7MTMzMCwwLDI0MCwxNTM7MTQwOCwwLDI0NiwxNTM7MTY4MSwxLDI0OCwxNTM7MTc0NCwyLDI0OCwxNTM7MTg0MSwxLDI0OCwxNTM7MTkwOCwyLDI0OCwxNTM7MjEzMiwwLDI0MiwxNjA7MjEzOSwwLDIzOSwxNjU7MjE1MiwwLDIzMiwxNzI7MjE2OCwwLDIyNywxNzk7MjE4MSwwLDIyMiwxODM7MjIwMywwLDIxNywxODg7MjIyMSwwLDIxMiwxOTI7MjI2NSwwLDIwOCwxOTg7MjM0NiwwLDIwNCwyMDI7MjUwMSwxLDIwMywyMDI7MjU4NSwyLDIwMywyMDI7IiwidGJpbyI6IiIsImtiaW8iOiIifQ==", + "eyJtYmlvIjoiMTQ4MjcwLDAsMzAwLDEzMDsxNDgyODMsMCwyOTMsMTM5OzE0ODI5MCwwLDI4OSwxNDQ7MTQ4Mjk4LDAsMjg1LDE0ODsxNDgzMTEsMCwyODAsMTU1OzE0ODMyNCwwLDI3NSwxNjE7MTQ4MzQ1LDAsMjcwLDE2NTsxNDgzOTQsMCwyNjYsMTY5OzE0ODY2NiwwLDI3MSwxNzA7MTQ4Njk1LDAsMjgwLDE3MjsxNDg3MDAsMCwyODksMTc1OzE1NDIwMSwwLDI5NCw5MDsxNTQyMDYsMCwyODksOTQ7MTU0MjIxLDAsMjgyLDEwMTsxNTQyMzUsMCwyNzgsMTA3OzE1NDI1NCwwLDI3MywxMTM7MTU0Mjc2LDAsMjcxLDExODsxNTQzMTgsMCwyNjYsMTIxOzE1NDM0NiwwLDI2MSwxMjQ7MTU0MzY3LDAsMjU1LDEyODsxNTQzODAsMCwyNDksMTMxOzE1NDM5NCwwLDI0NCwxMzY7MTU0NDA4LDAsMjM5LDE0MDsxNTQ0MjIsMCwyMzQsMTQ2OzE1NDQzNSwwLDIyOCwxNTQ7MTU0NDQzLDAsMjI0LDE1OTsxNTQ0NDksMCwyMjIsMTY0OzE1NDQ2MywwLDIxNywxNzE7MTU0NDc3LDAsMjE0LDE3NjsxNTQ0OTgsMCwyMTIsMTgxOzE1NDU1MywwLDIwOCwxODU7MTU0NjU4LDAsMjA1LDE5MDsxNTQ3MDAsMCwyMDAsMTkzOzE1NDcyMSwwLDE5NSwxOTc7MTU0NzQyLDAsMTg3LDIwMTsxNTQ3NjIsMCwxODEsMjAzOzE1NDc5MCwwLDE3NiwyMDY7MTU0ODI3LDEsMTczLDIwNzsxNTQ5MDMsMiwxNzMsMjA3OyIsInRiaW8iOiIiLCJrYmlvIjoiIn0=", + "eyJtYmlvIjoiNDA4NSwwLDI5NywyMTk7NDA5MiwwLDI4NywyMTI7NDEwMCwwLDI4MCwyMDg7NDEwNiwwLDI3NSwyMDY7NDEyMCwwLDI3MCwyMDM7NDE0MCwwLDI2NSwyMDA7NDE2OCwwLDI2MiwxOTU7NDE5MCwwLDI1OSwxODk7NDIxNCwwLDI1NiwxODM7NDI1NCwwLDI1MywxNzg7NDMxNiwwLDI1MywxNzI7NDM0NSwwLDI1NCwxNjY7NDM2MywwLDI1OCwxNjI7NDM5NywwLDI2MSwxNTc7NDQ3MywxLDI2NSwxNTU7NDU0MCwyLDI2NSwxNTU7NDYxNiwxLDI2NSwxNTU7NDcwNCwyLDI2NSwxNTU7NDg0OSwwLDI1NywxNjU7NDg1OSwwLDI1MywxNzI7NDg2NCwwLDI0OSwxNzk7NDg3MywwLDI0NSwxODY7NDg3OSwwLDI0MSwxOTE7NDg4NiwwLDIzNywxOTc7NDg5NCwwLDIzMSwyMDI7NDkwMiwwLDIyNywyMDc7NDkwOSwwLDIyMiwyMTM7NDkxMiwwLDIxNywyMTg7NDkyMCwwLDIxMSwyMjM7NDkzNiwwLDIwNCwyMjk7NDk1NCwwLDE5OCwyMzM7NDk5MCwxLDE5NSwyMzU7NTA2OSwyLDE5NSwyMzU7NTMwNCwwLDIxMSwyMzg7NTMxMCwwLDIyOSwyNDE7NTMxNiwwLDIzOSwyNDI7NTMyMywwLDI0NiwyNDI7NTM2NywwLDI1MiwyNDM7NTQzNSwwLDI0OCwyMzk7NTQ2MCwwLDI0MywyMzc7NTQ3OCwwLDIzNywyMzU7NTQ5OSwwLDIzMSwyMzI7NTUzNSwwLDIyNSwyMzA7NTU2OSwxLDIyMywyMjk7NTY1MiwyLDIyMywyMjk7NTgxOSwwLDI0OCwyMTk7NTgyNSwwLDI4NywxOTk7NjA2OSwwLDI5NSwxNzA7NjA3NywwLDI4NiwxNzQ7NjA4NSwwLDI3NSwxNzc7NjA5OCwwLDI2MiwxODE7NjEwMywwLDI1NywxODQ7NjExNywwLDI0OCwxODU7NjEzMSwwLDI0MSwxODc7NjE0NSwwLDIzNSwxODk7NjE2NywwLDIyOSwxOTE7NjE4MSwwLDIyMywxOTQ7NjE5NiwwLDIxOCwxOTk7NjIwOSwwLDIxMCwyMDM7NjIxNiwwLDIwNCwyMDc7NjIyNCwwLDE5OSwyMTA7NjIzNiwwLDE4OCwyMTQ7NjI0NCwwLDE4MywyMTY7NjI1NywwLDE3NywyMTc7NjI4NSwwLDE3MSwyMTk7NjI5MywxLDE3MSwyMTk7NjM3NiwyLDE3MSwyMTk7IiwidGJpbyI6IiIsImtiaW8iOiIifQ==", + "eyJtYmlvIjoiNjM5NywwLDMwMSw5MDs2NDA0LDAsMjcxLDc3OzY0MTAsMCwyNTEsNjc7NjQxOCwwLDIzNyw2Mjs2NDI1LDAsMjI2LDU5OzY0MzIsMCwyMTgsNTk7NjQzOSwwLDIxMiw1OTs2NDUzLDAsMjA1LDYwOzY1MTcsMCwyMDEsNjc7NjU0NSwwLDE5OSw3NDs2NTc5LDAsMTk3LDgwOzY2MTUsMCwxOTYsODU7NjY0MSwwLDE5Niw5MTs2NjU0LDAsMTk2LDk3OzY2NjcsMCwxOTcsMTAyOzY2ODEsMCwyMDAsMTA4OzY2ODgsMCwyMDEsMTEzOzY2OTUsMCwyMDIsMTE4OzY3MDIsMCwyMDQsMTIzOzY3MDksMCwyMDYsMTI5OzY3MTYsMCwyMDcsMTM0OzY3MzEsMCwyMDksMTQzOzY3NDUsMCwyMTAsMTUyOzY3NjYsMCwyMTAsMTU5OzY4MTAsMCwyMDcsMTY0OzY4MjksMCwyMDEsMTY3OzY4NTIsMCwxOTUsMTY4OzY4NjQsMCwxOTAsMTY5OzY4ODUsMCwxODUsMTcwOzY5MjMsMCwxNzksMTcxOzY5NzcsMCwxNzMsMTcxOzcwODMsMSwxNjksMTcwOzcxNTEsMiwxNjksMTcwOzc0MjAsMSwxNjksMTcwOzc0ODMsMiwxNjksMTcwOzc3NjgsMCwxNjksMTc1Ozc3OTcsMCwxNjksMTgyOzc4MTgsMCwxNjgsMTg3Ozc4NDAsMCwxNjcsMTkyOzc4NjcsMCwxNjUsMTk4Ozc4ODksMCwxNjQsMjAzOzc5MjQsMCwxNjIsMjA4Ozc5NzgsMSwxNjAsMjEyOzgwNTMsMiwxNjAsMjEyOyIsInRiaW8iOiIiLCJrYmlvIjoiIn0=", + "eyJtYmlvIjoiMzI0OCwwLDMwMSwxMzE7MzI2MCwwLDI5NCwxMzM7MzI4MSwwLDI4OCwxMzU7MzMyMiwwLDI4MiwxMzk7MzM2NCwwLDI3NywxNDI7MzQwMiwwLDI3MiwxNDU7MzQyOCwwLDI2NywxNDc7MzQ3OSwwLDI2MSwxNTA7MzU4MywxLDI1OSwxNTQ7MzY0MCwyLDI1OSwxNTQ7MzgxOSwwLDI1NywxNTg7MzgyMywwLDI1NCwxNjM7MzgzOSwwLDI1MiwxNzA7Mzg1NSwwLDI0OSwxNzc7Mzg2OCwwLDI0NiwxODI7Mzg4NiwwLDI0MiwxODg7MzkwNywwLDIzOCwxOTQ7MzkzMCwwLDIzNSwxOTk7Mzk1MCwwLDIzMiwyMDQ7Mzk4NiwwLDIyOSwyMDk7NDAyMSwwLDIyNiwyMTQ7NDE0NywxLDIyMywyMTc7NDIyOCwyLDIyMywyMTc7IiwidGJpbyI6IiIsImtiaW8iOiIifQ==", + "eyJtYmlvIjoiNTYzNywwLDI4Nyw2Mzs1NjQ0LDAsMjY5LDYxOzU2NTIsMCwyNDksNjA7NTY1NywwLDIzMSw1Njs1NjY0LDAsMjE3LDU2OzU2NzIsMCwyMDgsNTU7NTY3OCwwLDIwMiw1NTs1NjkxLDAsMTk2LDU1OzU3MTgsMCwxOTAsNTY7NTc2NywwLDE4OCw2NTs1NzgxLDAsMTg4LDc3OzU3ODgsMCwxODksODU7NTc5NiwwLDE5Miw5Njs1ODAzLDAsMTk0LDEwMzs1ODE3LDAsMTk3LDExMTs1ODMwLDAsMTk4LDExNjs1ODU5LDAsMjAxLDEyMTs1ODg4LDAsMjAzLDEyNjs1OTE2LDAsMjA3LDEzMDs1OTY1LDAsMjEwLDEzNTs2MDA1LDAsMjExLDE0MDs2MDQwLDAsMjE2LDE0Mjs2MDYwLDAsMjIxLDE0Mzs2MDczLDAsMjMyLDE0NDs2MDgxLDAsMjM3LDE0Njs2MDg4LDAsMjQzLDE0Nzs2MTAzLDAsMjUwLDE0OTs2MTE1LDAsMjU1LDE1MTs2MTQ1LDAsMjYwLDE1NDs2MjAxLDAsMjY0LDE1OTs2MjYyLDAsMjYzLDE2Njs2Mjk5LDAsMjYxLDE3MTs2MzE4LDAsMjU3LDE3Nzs2MzMzLDAsMjUyLDE4MTs2MzQ3LDAsMjQ4LDE4Njs2MzY4LDAsMjQyLDE5MTs2Mzg5LDAsMjM3LDE5NTs2NDExLDAsMjMxLDE5OTs2NDMwLDAsMjI2LDIwMzs2NDcxLDAsMjIxLDIwNTs2NTQxLDAsMjE2LDIwNzs2ODUzLDEsMjE2LDIwNzs2OTEzLDIsMjE2LDIwNzsiLCJ0YmlvIjoiIiwia2JpbyI6IiJ9", + "eyJtYmlvIjoiNDM1NiwwLDI1NywyODg7NDM1OSwwLDI0MywyODc7NDM2OSwwLDIzMCwyODM7NDM3NCwwLDIxOCwyODA7NDM4MSwwLDIwNywyNzY7NDM4OCwwLDE5NSwyNzM7NDM5MywwLDE4NiwyNzA7NDQwMiwwLDE4MCwyNjk7NDQwOCwwLDE3MywyNjY7NDQyMiwwLDE2NiwyNjQ7NDQzNiwwLDE2MSwyNjA7NDQ2NSwwLDE1NSwyNTc7NDQ5MywwLDE1MiwyNTI7NDUxOCwwLDE1MCwyNDY7NDU0NiwwLDE0OSwyNDE7NDU4NCwwLDE0OSwyMzQ7NDU5NywwLDE1MSwyMjg7NDYxMSwwLDE1NiwyMTk7NDYyMCwwLDE2MCwyMTI7NDYyNSwwLDE2NCwyMDU7NDYzNCwwLDE2NywyMDA7NDY0NiwwLDE3MiwxOTM7NDY1OSwwLDE3NywxODY7NDY4MywwLDE4MCwxODE7NDcxNCwwLDE4MywxNzU7NDc3MSwwLDE4NCwxNjk7NDgwNiwwLDE4NCwxNjM7NDg0MSwwLDE4MCwxNTg7NDg5MSwwLDE3NSwxNTY7NDkxMywxLDE3MywxNTY7NTAwMSwyLDE3MywxNTY7NTIzMCwwLDE3MywxNjM7NTI0NCwwLDE3MywxNzE7NTI1NywwLDE3MywxODE7NTI3MywwLDE3MywxODk7NTI4NywwLDE3MywxOTY7NTMwNywwLDE3MiwyMDE7NTMyOCwwLDE3MSwyMDY7NTM0OSwwLDE3MCwyMTE7NTM3NywwLDE2NywyMTY7NTQwNSwwLDE2NCwyMjE7NTQ2OCwwLDE2MiwyMjY7NTQ5NCwxLDE2MCwyMjY7NTU2NCwyLDE2MCwyMjY7IiwidGJpbyI6IiIsImtiaW8iOiIifQ==", + "eyJtYmlvIjoiNTE3NywwLDMwMCwxNzM7NTE5MCwwLDI5NCwxNzM7NTIxMiwwLDI4NiwxNzM7NTIzMSwwLDI3NywxNzM7NTI0MSwwLDI2OSwxNzM7NTI1MywwLDI2NCwxNzI7NTI4MiwwLDI1NywxNzI7NTUxNSwxLDI1NiwxNzI7NTU1MSwyLDI1NiwxNzI7NTc2MiwxLDI1NiwxNzI7NTgxOCwyLDI1NiwxNzI7NjExMCwwLDI1MSwxNzY7NjEyNCwwLDI0NCwxODA7NjE0MiwwLDIzOCwxODU7NjE2NSwwLDIzMywxODg7NjE5MywwLDIyOCwxOTE7NjI0MiwwLDIyMywxOTQ7NjI2MiwxLDIyMiwxOTU7NjMzMywyLDIyMiwxOTU7NjY1MSwwLDIyOCwxOTU7NjY2MCwwLDIzNCwxOTU7NjY3MywwLDI0MSwxOTU7Njc0MSwwLDI0NSwxOTk7NjgwMSwwLDI0MiwyMDU7NjgxOSwxLDIzOSwyMDc7NjkxNywyLDIzOSwyMDc7IiwidGJpbyI6IiIsImtiaW8iOiIifQ==", + "eyJtYmlvIjoiMTA2NCwwLDE5MywxODQ7MTA3MCwwLDIwNywxODQ7MTA3NiwwLDIyMSwxODM7MTA4MywwLDIzNSwxODE7MTA5MSwwLDI0NCwxODE7MTA5OCwwLDI1MiwxODA7MTExMSwwLDI2MCwxNzk7MTEzNSwwLDI2NiwxNzk7MTIxNiwwLDI3MywxNzk7MTM2MywwLDI3MywxODU7MTM3NiwwLDI3MSwxOTA7MTM4OSwwLDI2NywxOTQ7MTQxMSwwLDI2MSwyMDA7MTQ0MCwwLDI1NCwyMDU7MTQ3NCwwLDI0OSwyMDk7MTY0MCwxLDI0NCwyMDk7MTcxMCwyLDI0NCwyMDk7IiwidGJpbyI6IiIsImtiaW8iOiIifQ==", + "eyJtYmlvIjoiNTE4NywwLDMwMSw4Mzs1MjE0LDAsMjk1LDkxOzUyMjgsMCwyODgsOTk7NTIzNSwwLDI4MiwxMDY7NTI0MywwLDI3NywxMTM7NTI0OSwwLDI2OSwxMjE7NTI1NywwLDI2MywxMjg7NTI2NCwwLDI2MCwxMzM7NTI3MSwwLDI1NiwxMzg7NTI3OSwwLDI1MiwxNDQ7NTI5MywwLDI0NywxNDk7NTMxMywwLDI0NCwxNTQ7NTM0OCwwLDI0MiwxNjA7NTM3NSwwLDI0MSwxNjU7NTQyMiwwLDI0MCwxNzA7NTUwOCwwLDI0NywxNzE7NTUyMSwwLDI1NSwxNzA7NTUyOCwwLDI2MCwxNjg7NTU0MywwLDI2OCwxNjY7NTU1NiwwLDI3MywxNjQ7NTU5MSwwLDI3OCwxNjI7NTc1MSwxLDI4MCwxNjI7NTgyNiwyLDI4MCwxNjI7NjA0NCwwLDI3NywxNzA7NjA1MiwwLDI3MiwxNzk7NjA1OSwwLDI2OCwxODc7NjA2NSwwLDI2NSwxOTQ7NjA3NywwLDI1OSwyMDE7NjA5MSwwLDI1NiwyMDY7NjEwNiwwLDI1MywyMTE7NjE0NiwwLDI0OSwyMTU7NjE3NiwxLDI0NywyMTY7NjI2MCwyLDI0NywyMTY7IiwidGJpbyI6IiIsImtiaW8iOiIifQ==", + "eyJtYmlvIjoiMzg1NSwwLDE0MiwyMzE7Mzg3MywwLDE2OCwyMjc7Mzg3OSwwLDIwNywyMjA7Mzg4NiwwLDIzNSwyMTQ7Mzg5NSwwLDI1MSwyMTM7MzkwMCwwLDI2NSwyMTE7MzkwOCwwLDI4MSwyMTE7MzkxNiwwLDI5NSwyMTE7NDA2OSwwLDI5MSwyMDU7NDA3NSwwLDI4MiwyMDI7NDA4MywwLDI3MSwxOTk7NDA4OCwwLDI2MywxOTU7NDA5NiwwLDI1NCwxOTI7NDEwMiwwLDI0NSwxODk7NDExMCwwLDIzOCwxODU7NDExNiwwLDIzMSwxODI7NDEzMSwwLDIyNSwxODA7NDE1NywwLDIxOCwxNzU7NDE4NiwwLDIxMywxNzM7NDIwNiwwLDIwNywxNzI7NDIyNiwwLDIwMSwxNzI7NDI0OSwwLDE5NCwxNzE7NDI2MiwwLDE4NiwxNzA7NDI3NSwwLDE3OCwxNzA7NDI4OCwwLDE3MCwxNjg7NDMwMiwwLDE2NCwxNjg7NDMyMywwLDE1OCwxNjY7NDM1MiwwLDE1MywxNjU7NDQ4NywxLDE1MSwxNjI7NDU2NSwyLDE1MSwxNjI7NDcwMCwwLDE0OCwxNzQ7NDcwOSwwLDE0NSwxODE7NDcxNSwwLDE0MywxODY7NDcyMSwwLDE0MiwxOTE7NDczNSwwLDEzOSwxOTY7NDc1MCwwLDEzNiwyMDE7NDc2OSwwLDEzNSwyMDY7NDc5MywwLDEzMywyMTE7NDgyNywwLDEyOSwyMTc7NDg2OCwxLDEyNywyMjE7NDk1MywyLDEyNywyMjE7IiwidGJpbyI6IiIsImtiaW8iOiIifQ==", + "eyJtYmlvIjoiNDk2NywwLDMwMSwxMjA7NDk3MywwLDI5NiwxMjQ7NDk4NSwwLDI5MCwxMjg7NDk5OSwwLDI4NiwxMzM7NTAxOSwwLDI4MiwxNDA7NTA0MiwwLDI4MCwxNDY7NTA3MCwwLDI3OCwxNTE7NTExNywwLDI3NSwxNTc7NTIxNSwwLDI3MCwxNjM7NTQ1MCwxLDI2NSwxNjE7NTU2MiwyLDI2NSwxNjE7NTc1MywwLDI2MywxNjI7NTc3MywwLDI1OSwxNjg7NTc5NCwwLDI1NSwxNzM7NTgxNCwwLDI1MSwxNzc7NTg0MiwwLDI0OCwxODI7NTg3OCwwLDI0NCwxODc7NTg5OSwwLDIzOSwxOTI7NTkxOSwwLDIzNCwxOTY7NTk0MSwwLDIyOSwxOTk7NTk3MCwwLDIyMywyMDE7NjAwNiwxLDIyMSwyMDM7NjA1MywyLDIyMSwyMDM7IiwidGJpbyI6IiIsImtiaW8iOiIifQ==", + "eyJtYmlvIjoiMzk5OSwwLDI5MywyMjg7NDAwNSwwLDI3NCwyMjE7NDAxMywwLDI1NCwyMTg7NDAyMCwwLDIzNiwyMTU7NDAyNSwwLDIyMiwyMTM7NDAzNCwwLDIwOSwyMTA7NDAzOSwwLDIwMSwyMTA7NDA0NywwLDE5NSwyMDk7NDA2MSwwLDE4OCwyMDk7NDA3NCwwLDE4MiwyMDk7NDA5NiwwLDE3NiwyMTA7NDExNiwwLDE3MCwyMTE7NDM5NywxLDE2NSwyMTE7NDQ1NCwyLDE2NSwyMTE7IiwidGJpbyI6IiIsImtiaW8iOiIifQ==" +] + +export default function getBio() { + const bio = data[Math.floor(Math.random() * data.length)]; + return bio; +} \ No newline at end of file diff --git a/src/challenge.ts b/src/challenge.ts index 40090c4..fe02374 100644 --- a/src/challenge.ts +++ b/src/challenge.ts @@ -3,6 +3,7 @@ import { TokenInfo } from "./session"; import util from "./util"; import crypt from "./crypt"; import { assert } from "console"; +import bio from './bio'; interface ChallengeOptions { userAgent?: string; @@ -39,7 +40,11 @@ interface ChallengeData { string_table: { [key: string]: string; }, - string_table_prefixes: string[] + string_table_prefixes: string[], + cookie?: string, + capi?: string, + hash?: string, + is_compatibility_mode: boolean } interface AnswerResponse { @@ -59,29 +64,58 @@ export abstract class Challenge { protected key: Promise; protected userAgent: string; protected proxy: string; + protected cookie: string; + protected record_payload: Record; + protected click: { sc: number[] }; constructor(data: ChallengeData, challengeOptions: ChallengeOptions) { + this.click = util.generateClickCoordinates() + this.data = data; this.userAgent = challengeOptions.userAgent; this.proxy = challengeOptions.proxy; + this.cookie = data.cookie; - // Preload images this.imgs = data.game_data.customGUI._challenge_imgs.map(async (v) => { + let timestamp = util.getTimestamp(); + let req = await request(v, { method: "GET", - path: undefined, headers: { - "User-Agent": this.userAgent, - "Referer": this.data.tokenInfo.surl + // ":scheme": "https", + "Accept": "*/*", + 'Accept-Encoding': '',// 'gzip, deflate, br, zstd', + "Accept-Language": "en-GB,en-US;q=0.9,en;q=0.8,ar;q=0.7", + "Cookie": this.cookie ? `${this.cookie} ${timestamp.cookie}` : timestamp.cookie, + "Priority": "u=1, i", + "Referer": this.data.tokenInfo.surl, + "Sec-Ch-Ua": "\"Google Chrome\";v=\"131\", \"Chromium\";v=\"131\", \"Not_A Brand\";v=\"24\"", + "Sec-Ch-Ua-Mobile": "?0", + "Sec-Ch-Ua-Platform": "\"Windows\"", + "Sec-Fetch-Dest": "empty", + "Sec-Fetch-Mode": "cors", + "Sec-Fetch-Site": "same-origin", + "User-Agent": this.userAgent }, - }); - return req.body; + responseType: 'buffer' + }, this.proxy, true); + + return req.buffer as Buffer; }); - if(data.game_data.customGUI.encrypted_mode) { + if (data.game_data.customGUI.encrypted_mode) { // Preload decryption key this.key = this.getKey(); } + + this.record_payload = { + sid: this.data.tokenInfo.r, + session_token: this.data.session_token, + analytics_tier: this.data.tokenInfo.at, + disableCookies: false, // later + render_type: 'canvas', + is_compatibility_mode: this.data.is_compatibility_mode, + } } async getImage(): Promise { @@ -99,6 +133,81 @@ export abstract class Challenge { return img; } + async Record(category: 'Site URL' | 'loaded' | 'begin app', payload?: Record) { + let timestamp = util.getTimestamp(); + let body = { ...this.record_payload }; + let headers: Record = { + "Accept": "*/*", + "Accept-Encoding": "gzip, deflate, br, zstd", + "Accept-Language": "en-GB,en-US;q=0.9,en;q=0.8,ar;q=0.7", + "Cache-Control": "no-cache", + // "Content-Length": "275", + "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8", + "Cookie": this.cookie ? `${this.cookie} ${timestamp.cookie}` : timestamp.cookie, + "Origin": this.data.tokenInfo.surl, + "Priority": "u=1, i", + "Referer": this.data.tokenInfo.surl, + "Sec-Ch-Ua": "\"Google Chrome\";v=\"131\", \"Chromium\";v=\"131\", \"Not_A_Brand\";v=\"24\"", + "Sec-Ch-Ua-Mobile": "?0", + "Sec-Ch-Ua-Platform": "\"Windows\"", + "Sec-Fetch-Dest": "empty", + "Sec-Fetch-Mode": "cors", + "Sec-Fetch-Site": "same-origin", + "User-Agent": this.userAgent, + "X-Newrelic-Timestamp": timestamp.value, + "X-Requested-With": "XMLHttpRequest" + } + + if (category !== 'Site URL' && category !== 'loaded' && category !== 'begin app') { + if (!payload) throw new Error(`Invalid category`) + else body = { ...body, ...payload } + }; + + if (category == 'Site URL' && !payload) { + body = { + ...body, + category, + action: this.getReferer() + } + } else if (category == 'loaded' && !payload) { + body = { + ...body, + game_token: this.data.challengeID, + game_type: this.data.game_data.gameType, + category, + action: 'game loaded' + } + } else if (category == 'begin app' && !payload) { + body = { + ...body, + game_token: this.data.challengeID, + game_type: this.data.game_data.gameType, + category, + action: 'begin app' + } + + headers = { + ...headers, + "X-Requested-Id": this.getRequestId(), + } + } else { + body = { + ...body, + category, + ...payload + } + } + + let req = await request(this.data.tokenInfo.surl, { + method: "POST", + path: '/fc/a/', + headers, + body: util.constructFormData(body) + }, this.proxy); + + return JSON.parse(req.body); + } + protected async getKey() { if (this.key) return await this.key; let response = await request( @@ -127,7 +236,7 @@ export abstract class Challenge { get gameType() { return this.data.game_data.gameType; } - + get variant() { return this.data.game_data.game_variant || this.data.game_data.instruction_string; } @@ -139,6 +248,15 @@ export abstract class Challenge { get waves() { return this.data.game_data.waves; } + + getReferer() { + return `${this.data.tokenInfo.surl}/v2/${this.data.capi}/enforcement.${this.data.hash}.html`; + } + + getRequestId() { + let requestedId = crypt.encrypt(JSON.stringify(this.click), `REQUESTED${this.data.session_token}ID`); + return requestedId; + } } export class Challenge1 extends Challenge { @@ -147,7 +265,7 @@ export class Challenge1 extends Challenge { constructor(data: ChallengeData, challengeOptions: ChallengeOptions) { super(data, challengeOptions); - + // But WHY?! let clr = data.game_data.customGUI._guiFontColr this.increment = parseInt(clr ? clr.replace("#", "").substring(3) : "28", 16) @@ -159,7 +277,7 @@ export class Challenge1 extends Challenge { } async answer(answer: number): Promise { - if(answer >= 0 && answer <= Math.round(360 / 51.4) - 1) + if (answer >= 0 && answer <= Math.round(360 / 51.4) - 1) this.answerHistory.push(this.round(answer * this.increment)); else this.answerHistory.push(this.round(answer)) @@ -202,28 +320,42 @@ export class Challenge3 extends Challenge { async answer(tile: number): Promise { assert(tile >= 0 && tile <= 5, "Tile must be between 0 and 5"); - + let pos = util.tileToLoc(tile); this.answerHistory.push(util.solveBreaker(!!this.data.game_data.customGUI.is_using_api_breaker_v2, this.data.game_data.customGUI.api_breaker, 3, pos)) - - let encrypted = await crypt.encrypt( + + let encrypted = crypt.encrypt( JSON.stringify(this.answerHistory), this.data.session_token ); - let requestedId = await crypt.encrypt(JSON.stringify({}), `REQUESTED${this.data.session_token}ID`); + let { cookie: tCookie, value: tValue } = util.getTimestamp(); + let req = await request( this.data.tokenInfo.surl, { method: "POST", path: "/fc/ca/", headers: { + "Accept": "*/*", + "Accept-Encoding": '',// 'gzip, deflate, br, zstd',, + "Accept-Language": "en-GB,en-US;q=0.9,en;q=0.8,ar;q=0.7", + "Cache-Control": "no-cache", + "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8", + "Cookie": this.cookie ? `${this.cookie} ${tCookie}` : tCookie, + "Origin": this.data.tokenInfo.surl, + "Priority": "u=1, i", + "Referer": "", + "Sec-Ch-Ua": "\"Google Chrome\";v=\"131\", \"Chromium\";v=\"131\", \"Not_A Brand\";v=\"24\"", + "Sec-Ch-Ua-Mobile": "?0", + "Sec-Ch-Ua-Platform": "\"Windows\"", + "Sec-Fetch-Dest": "empty", + "Sec-Fetch-Mode": "cors", + "Sec-Fetch-Site": "same-origin", "User-Agent": this.userAgent, - "Content-Type": "application/x-www-form-urlencoded", "X-Newrelic-Timestamp": tValue, - "X-Requested-ID": requestedId, - "Cookie": tCookie, - "Referer": this.data.challengeURL + "X-Requested-Id": this.getRequestId(), + "X-Requested-With": "XMLHttpRequest" }, body: util.constructFormData({ session_token: this.data.session_token, @@ -236,6 +368,7 @@ export class Challenge3 extends Challenge { }, this.proxy ); + let reqData = JSON.parse(req.body.toString()); this.key = reqData.decryption_key || ""; this.wave++; @@ -245,45 +378,62 @@ export class Challenge3 extends Challenge { export class Challenge4 extends Challenge { private answerHistory = []; + // private click: { sc: number[] }; constructor(data: ChallengeData, challengeOptions: ChallengeOptions) { super(data, challengeOptions); + // this.click = util.generateClickCoordinates() } async answer(index: number): Promise { assert(index >= 0 && index <= this.data.game_data.game_difficulty - 1, "Index must be between 0 and " + (this.data.game_data.game_difficulty - 1)); this.answerHistory.push(util.solveBreaker(!!this.data.game_data.customGUI.is_using_api_breaker_v2, this.data.game_data.customGUI.api_breaker, 4, { index })) - - let encrypted = await crypt.encrypt( + + let encrypted = crypt.encrypt( JSON.stringify(this.answerHistory), this.data.session_token ); - let requestedId = await crypt.encrypt(JSON.stringify({}), `REQUESTED${this.data.session_token}ID`); + let { cookie: tCookie, value: tValue } = util.getTimestamp(); - let req = await request( - this.data.tokenInfo.surl, - { - method: "POST", - path: "/fc/ca/", - headers: { - "User-Agent": this.userAgent, - "Content-Type": "application/x-www-form-urlencoded", - "X-Newrelic-Timestamp": tValue, - "X-Requested-ID": requestedId, - "Cookie": tCookie, - "Referer": this.data.challengeURL - }, - body: util.constructFormData({ - session_token: this.data.session_token, - game_token: this.data.challengeID, - guess: encrypted, - analytics_tier: this.data.tokenInfo.at, - sid: this.data.tokenInfo.r, - bio: this.data.tokenInfo.mbio && "eyJtYmlvIjoiMTI1MCwwLDE0NywyMDQ7MTg5NCwwLDE1MSwyMDA7MTk2MCwxLDE1MiwxOTk7MjAyOSwyLDE1MiwxOTk7MjU3NSwwLDE1NSwxOTU7MjU4NSwwLDE1NiwxOTA7MjU5NSwwLDE1OCwxODU7MjYwNCwwLDE1OSwxODA7MjYxMywwLDE2MCwxNzU7MjYyMSwwLDE2MSwxNzA7MjYzMCwwLDE2MywxNjU7MjY0MCwwLDE2NCwxNjA7MjY1MCwwLDE2NSwxNTU7MjY2NCwwLDE2NiwxNTA7MjY3NywwLDE2NiwxNDQ7MjY5NCwwLDE2NywxMzk7MjcyMCwwLDE2NywxMzM7Mjc1NCwwLDE2NywxMjc7Mjc4MywwLDE2NywxMjE7MjgxMiwwLDE2NywxMTU7Mjg0MywwLDE2NywxMDk7Mjg2MywwLDE2NywxMDM7Mjg3NSwwLDE2Niw5ODsyOTA1LDAsMTY1LDkzOzMyMzIsMCwxNjUsOTk7MzI2MiwwLDE2NSwxMDU7MzI5OSwwLDE2NCwxMTA7MzM0MCwwLDE2MSwxMTU7MzM3MiwwLDE1NywxMjA7MzM5NSwwLDE1MywxMjQ7MzQwOCwwLDE0OCwxMjc7MzQyMCwwLDE0MywxMzA7MzQyOSwwLDEzOCwxMzE7MzQ0MSwwLDEzMywxMzQ7MzQ1MCwwLDEyOCwxMzU7MzQ2MSwwLDEyMywxMzg7MzQ3NiwwLDExOCwxNDA7MzQ4OSwwLDExMywxNDI7MzUwMywwLDEwOCwxNDM7MzUxOCwwLDEwMywxNDQ7MzUzNCwwLDk4LDE0NTszNTU2LDAsOTMsMTQ2OzM2MTUsMCw4OCwxNDg7MzY2MiwwLDgzLDE1MTszNjgzLDAsNzgsMTU0OzM3MDEsMCw3MywxNTc7MzcyNSwwLDY5LDE2MTszNzkzLDEsNjgsMTYyOzM4NTEsMiw2OCwxNjI7IiwidGJpbyI6IiIsImtiaW8iOiIifQ==" - }), + + let url = new URL(this.data.tokenInfo.surl); + url.pathname = "/fc/ca/"; + + let req = await request(url.toString(), { + method: "POST", + // path: url.pathname, + headers: { + "Accept": "*/*", + "Accept-Encoding": '',// 'gzip, deflate, br, zstd',, + "Accept-Language": "en-GB,en-US;q=0.9,en;q=0.8,ar;q=0.7", + "Cache-Control": "no-cache", + "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8", + "Cookie": this.cookie ? `${this.cookie} ${tCookie}` : tCookie, + "Origin": this.data.tokenInfo.surl, + "Priority": "u=1, i", + "Referer": "", + "Sec-Ch-Ua": "\"Google Chrome\";v=\"131\", \"Chromium\";v=\"131\", \"Not_A Brand\";v=\"24\"", + "Sec-Ch-Ua-Mobile": "?0", + "Sec-Ch-Ua-Platform": "\"Windows\"", + "Sec-Fetch-Dest": "empty", + "Sec-Fetch-Mode": "cors", + "Sec-Fetch-Site": "same-origin", + "User-Agent": this.userAgent, + "X-Newrelic-Timestamp": tValue, + "X-Requested-Id": this.getRequestId(), + "X-Requested-With": "XMLHttpRequest" }, - this.proxy - ); + body: util.constructFormData({ + session_token: this.data.session_token, + game_token: this.data.challengeID, + guess: encrypted, + render_type: 'canvas', + analytics_tier: this.data.tokenInfo.at, + bio: this.data.tokenInfo.mbio && bio(), + is_compatibility_mode: this.data.is_compatibility_mode, + }), + }, this.proxy); + let reqData = JSON.parse(req.body.toString()); this.key = reqData.decryption_key || ""; this.wave++; diff --git a/src/fingerprint.ts b/src/fingerprint.ts index b4d24ea..e23aeb9 100644 --- a/src/fingerprint.ts +++ b/src/fingerprint.ts @@ -1,5 +1,8 @@ +import crypto from 'crypto'; import x64hash128 from "./murmur"; import { randomBytes } from "crypto"; +import { GetTokenOptions } from './api' +import util from "./util"; const baseFingerprint = { DNT: "unknown", // Do not track On/Off | Previous Value: 1 @@ -90,9 +93,11 @@ const baseFingerprint = { "Wingdings 3", ], // Available fonts P: [ - "Chrome PDF Plugin::Portable Document Format::application/x-google-chrome-pdf~pdf", - "Chrome PDF Viewer::::application/pdf~pdf", - "Native Client::::application/x-nacl~,application/x-pnacl~", + "Chrome PDF Viewer", + "Chromium PDF Viewer", + "Microsoft Edge PDF Viewer", + "PDF Viewer", + "WebKit built-in PDF" ], // Plugins T: [0, false, false], // Touch screen (maxTouchPoints, TouchEvent event listener support, ontouchstart support) H: 24, // Cpu threads @@ -132,14 +137,41 @@ let screenRes = [ [1600, 1200], [1600, 900], ]; + +let canvases1 = [ + "1815906631", + "235298495", + "1850036655", + "-1661048561", + "823022740", + "-1712985017", + "679642534", + "512287303", + "-1570039461", + "11949726", + "512287303", + "-479006826", + "-1124974951", + "1999955435", + "213013447", + "-1058930346", + "-1291191045", + "-1338001587", + "-1946591325", + "-70526813", + "-72944365", + "1456333650", + "1732442814", + "631151448", +] + function randomScreenRes() { return screenRes[Math.floor(Math.random() * screenRes.length)]; } // Get fingerprint function getFingerprint() { - let fingerprint = { ...baseFingerprint }; // Create a copy of the base fingerprint - + let fingerprint: Record = { ...baseFingerprint }; // Create a copy of the base fingerprint // Randomization time! fingerprint["DNT"] = "unknown"; fingerprint["L"] = languages[Math.floor(Math.random() * languages.length)]; @@ -157,12 +189,12 @@ function getFingerprint() { fingerprint["ODB"] = Math.random() > 0.5; fingerprint["CPUC"] = "unknown"; fingerprint["PK"] = "Win32" - fingerprint["CFP"] = "canvas winding:yes~canvas fp:data:image/png;base64," + randomBytes(128).toString("base64"); + fingerprint["CFP"] = canvases1[Math.floor(Math.random() * canvases1.length)]; fingerprint["FR"] = false; // Fake Resolution fingerprint["FOS"] = false; // Fake Operating System fingerprint["FB"] = false; // Fake Browser fingerprint["JSF"] = fingerprint["JSF"].filter(() => Math.random() > 0.5); - fingerprint["P"] = fingerprint["P"].filter(() => Math.random() > 0.5); + fingerprint["P"] = fingerprint["P"].filter(() => Math.random() > 0.5).join(','); fingerprint["T"] = [ Math.floor(Math.random() * 8), Math.random() > 0.5, @@ -190,13 +222,11 @@ function prepareFe(fingerprint) { for (let i = 0; i < keys.length; i++) { switch (keys[i]) { case "CFP": - fe.push(`${keys[i]}:${cfpHash(fingerprint[keys[i]])}`); + fe.push(`${keys[i]}:${fingerprint[keys[i]]}`); break; case "P": fe.push( - `${keys[i]}:${fingerprint[keys[i]].map( - (v) => v.split("::")[0] - )}` + `${keys[i]}:${fingerprint[keys[i]]}` ); break; default: @@ -226,67 +256,121 @@ function cfpHash(H8W) { } let baseEnhancedFingerprint = { - "webgl_extensions": "ANGLE_instanced_arrays;EXT_blend_minmax;EXT_color_buffer_half_float;EXT_disjoint_timer_query;EXT_float_blend;EXT_frag_depth;EXT_shader_texture_lod;EXT_texture_compression_bptc;EXT_texture_compression_rgtc;EXT_texture_filter_anisotropic;EXT_sRGB;KHR_parallel_shader_compile;OES_element_index_uint;OES_fbo_render_mipmap;OES_standard_derivatives;OES_texture_float;OES_texture_float_linear;OES_texture_half_float;OES_texture_half_float_linear;OES_vertex_array_object;WEBGL_color_buffer_float;WEBGL_compressed_texture_s3tc;WEBGL_compressed_texture_s3tc_srgb;WEBGL_debug_renderer_info;WEBGL_debug_shaders;WEBGL_depth_texture;WEBGL_draw_buffers;WEBGL_lose_context;WEBGL_multi_draw", - "webgl_extensions_hash": "58a5a04a5bef1a78fa88d5c5098bd237", - "webgl_renderer": "WebKit WebGL", - "webgl_vendor": "WebKit", - "webgl_version": "WebGL 1.0 (OpenGL ES 2.0 Chromium)", - "webgl_shading_language_version": "WebGL GLSL ES 1.0 (OpenGL ES GLSL ES 1.0 Chromium)", - "webgl_aliased_line_width_range": "[1, 1]", - "webgl_aliased_point_size_range": "[1, 1023]", - "webgl_antialiasing": "yes", - "webgl_bits": "8,8,24,8,8,0", - "webgl_max_params": "16,64,16384,4096,8192,32,8192,31,16,32,4096", - "webgl_max_viewport_dims": "[8192, 8192]", - "webgl_unmasked_vendor": "Google Inc. (Google)", - "webgl_unmasked_renderer": "ANGLE (Google, Vulkan 1.3.0 (SwiftShader Device (Subzero) (0x0000C0DE)), SwiftShader driver)", - "webgl_vsf_params": "23,127,127,23,127,127,23,127,127", - "webgl_vsi_params": "0,31,30,0,31,30,0,31,30", - "webgl_fsf_params": "23,127,127,23,127,127,23,127,127", - "webgl_fsi_params": "0,31,30,0,31,30,0,31,30", - "webgl_hash_webgl": null, - "user_agent_data_brands": "Chromium,Google Chrome,Not=A?Brand", - "user_agent_data_mobile": null, - "navigator_connection_downlink": null, - "navigator_connection_downlink_max": null, - "network_info_rtt": null, - "network_info_save_data": false, - "network_info_rtt_type": null, - "screen_pixel_depth": 24, - "navigator_device_memory": 0.5, - "navigator_languages": "en-US,fr-BE,fr,en-BE,en", - "window_inner_width": 0, - "window_inner_height": 0, - "window_outer_width": 2195, - "window_outer_height": 1195, - "browser_detection_firefox": false, - "browser_detection_brave": false, - "audio_codecs": "{\"ogg\":\"probably\",\"mp3\":\"probably\",\"wav\":\"probably\",\"m4a\":\"maybe\",\"aac\":\"probably\"}", - "video_codecs": "{\"ogg\":\"probably\",\"h264\":\"probably\",\"webm\":\"probably\",\"mpeg4v\":\"\",\"mpeg4a\":\"\",\"theora\":\"\"}", - "media_query_dark_mode": true, - "headless_browser_phantom": false, - "headless_browser_selenium": false, - "headless_browser_nightmare_js": false, - "document__referrer": "https://www.roblox.com/", - "window__ancestor_origins": [ - "https://www.roblox.com", - ], - "window__tree_index": [ - 0 + webgl_extensions: "ANGLE_instanced_arrays;EXT_blend_minmax;EXT_clip_control;EXT_color_buffer_half_float;EXT_depth_clamp;EXT_disjoint_timer_query;EXT_float_blend;EXT_frag_depth;EXT_polygon_offset_clamp;EXT_shader_texture_lod;EXT_texture_compression_bptc;EXT_texture_compression_rgtc;EXT_texture_filter_anisotropic;EXT_texture_mirror_clamp_to_edge;EXT_sRGB;KHR_parallel_shader_compile;OES_element_index_uint;OES_fbo_render_mipmap;OES_standard_derivatives;OES_texture_float;OES_texture_float_linear;OES_texture_half_float;OES_texture_half_float_linear;OES_vertex_array_object;WEBGL_blend_func_extended;WEBGL_color_buffer_float;WEBGL_compressed_texture_s3tc;WEBGL_compressed_texture_s3tc_srgb;WEBGL_debug_renderer_info;WEBGL_debug_shaders;WEBGL_depth_texture;WEBGL_draw_buffers;WEBGL_lose_context;WEBGL_multi_draw;WEBGL_polygon_mode", + webgl_extensions_hash: "58a5a04a5bef1a78fa88d5c5098bd237", + webgl_renderer: "WebKit WebGL", + webgl_vendor: "WebKit", + webgl_version: "WebGL 1.0 (OpenGL ES 2.0 Chromium)", + webgl_shading_language_version: "WebGL GLSL ES 1.0 (OpenGL ES GLSL ES 1.0 Chromium)", + webgl_aliased_line_width_range: "[1, 1]", + webgl_aliased_point_size_range: "[1, 1024]", + webgl_antialiasing: "yes", + webgl_bits: "8,8,24,8,8,0", + webgl_max_params: "16,32,16384,1024,16384,16,16384,30,16,16,4096", + webgl_max_viewport_dims: "[32767, 32767]", + webgl_unmasked_vendor: "Google Inc. (Intel)", + webgl_unmasked_renderer: "ANGLE (Intel, Intel(R) Iris(R) Xe Graphics (0x0000A7A0) Direct3D11 vs_5_0 ps_5_0, D3D11)", + webgl_vsf_params: "23,127,127,23,127,127,23,127,127", + webgl_vsi_params: "0,31,30,0,31,30,0,31,30", + webgl_fsf_params: "23,127,127,23,127,127,23,127,127", + webgl_fsi_params: "0,31,30,0,31,30,0,31,30", + webgl_hash_webgl: null, + user_agent_data_brands: "Google Chrome,Chromium,Not_A Brand", + user_agent_data_mobile: false, + navigator_connection_downlink: 1.85, + navigator_connection_downlink_max: null, + network_info_rtt: 50, + network_info_save_data: false, + network_info_rtt_type: null, + screen_pixel_depth: 24, + navigator_device_memory: 8, + navigator_pdf_viewer_enabled: true, + navigator_languages: "en-GB,en-US,en,ar", + window_inner_width: 0, + window_inner_height: 0, + window_outer_width: 1280, + window_outer_height: 752, + browser_detection_firefox: false, + browser_detection_brave: false, + browser_api_checks: [ + "permission_status: true", + "eye_dropper: true", + "audio_data: true", + "writable_stream: true", + "css_style_rule: true", + "navigator_ua: true", + "barcode_detector: false", + "display_names: true", + "contacts_manager: false", + "svg_discard_element: false", + "usb: defined", + "media_device: defined", + "playback_quality: true" ], - "window__tree_structure": "[[]]", - "window__location_href": "https://roblox-api.arkoselabs.com/v2/1.5.5/enforcement.fbfc14b0d793c6ef8359e0e4b4a91f67.html#476068BF-9607-4799-B53D-966BE98E2B81", - "client_config__sitedata_location_href": "https://www.roblox.com/arkose/iframe", - "client_config__surl": "https://roblox-api.arkoselabs.com", - "client_config__language": null, - "navigator_battery_charging": true, - "audio_fingerprint": "124.04347527516074" -} -function getEnhancedFingerprint(fp: typeof baseFingerprint, ua: string, opts: any) { + browser_object_checks: "554838a8451ac36cb977e719e9d6623c", // chrome + + "29s83ih9": "68934a3e9455fa72420237eb05902327⁣", // false + + audio_codecs: "{\"ogg\":\"probably\",\"mp3\":\"probably\",\"wav\":\"probably\",\"m4a\":\"maybe\",\"aac\":\"probably\"}", + audio_codecs_extended_hash: "805036349642e2569ec299baed02315b", + + video_codecs: "{\"ogg\":\"\",\"h264\":\"probably\",\"webm\":\"probably\",\"mpeg4v\":\"\",\"mpeg4a\":\"\",\"theora\":\"\"}", + video_codecs_extended_hash: "67b509547efe3423d32a3a70a2553c16", + + media_query_dark_mode: false, + css_media_queries: 0, + css_color_gamut: "srgb", + css_contrast: "no-preference", + css_monochrome: false, + css_pointer: "coarse", + css_grid_support: false, + headless_browser_phantom: false, + headless_browser_selenium: false, + headless_browser_nightmare_js: false, + headless_browser_generic: 4, + "1l2l5234ar2": '', // done + document__referrer: '', // done + window__ancestor_origins: [], // done + window__tree_index: [], // done + window__tree_structure: "", // done + window__location_href: "", // done + client_config__sitedata_location_href: "", // done + client_config__language: null, // done + client_config__surl: "", // done + c8480e29a: "", // surl hash + client_config__triggered_inline: false, + mobile_sdk__is_sdk: false, + audio_fingerprint: "124.04347527516074", + navigator_battery_charging: false, + media_device_kinds: ["audioinput", "videoinput", "audiooutput"], + media_devices_hash: "199eba60310b53c200cc783906883c67", + navigator_permissions_hash: "67419471976a14a1430378465782c62d", + math_fingerprint: "3b2ff195f341257a6a2abbc122f4ae67", + supported_math_functions: "e9dd4fafb44ee489f48f7c93d0f48163", + screen_orientation: "landscape-primary", + rtc_peer_connection: 5, + "4b4b269e68": "", // random UUID done + "6a62b2a558": "", // Hash done + + speech_default_voice: "Microsoft David - English (United States) || en-US", + speech_voices_hash: "215bda67dce4341131fbd207102abff3", + + "4ca87df3d1": "Ow==", + "867e25e5d4": "Ow==", + "d4a306884c": "Ow==" +}; + +function getEnhancedFingerprint(fp: Record, ua: string, opts: GetTokenOptions) { + !opts.bda && (opts.bda = {} as any); + let fingerprint = { ...baseEnhancedFingerprint }; + let surl = new URL(opts.surl).origin; + let char = '⁣'; fingerprint.webgl_extensions = fingerprint.webgl_extensions.split(";").filter(_ => Math.random() > 0.5).join(";"); fingerprint.webgl_extensions_hash = x64hash128(fingerprint.webgl_extensions, 0); + fingerprint.webgl_hash_webgl = x64hash128(Object.entries(fingerprint).filter(([k, v]) => k.startsWith("webgl_") && k != "webgl_hash_webgl").map(([k, v]) => v).join(","), 0); + fingerprint.screen_pixel_depth = fp.D; fingerprint.navigator_languages = fp.L; fingerprint.window_outer_height = fp.S[0]; @@ -297,19 +381,27 @@ function getEnhancedFingerprint(fp: typeof baseFingerprint, ua: string, opts: an fingerprint.browser_detection_firefox = !!ua.match(/Firefox\/\d+/) fingerprint.browser_detection_brave = !!ua.match(/Brave\/\d+/) fingerprint.media_query_dark_mode = Math.random() > 0.9; - fingerprint.webgl_hash_webgl = x64hash128(Object.entries(fingerprint).filter(([k, v]) => k.startsWith("webgl_") && k != "webgl_hash_webgl").map(([k, v]) => v).join(","), 0); + + fingerprint['29s83ih9'] = "68934a3e9455fa72420237eb05902327" + char; + fingerprint['1l2l5234ar2'] = Date.now().toString() + char; + fingerprint['window__tree_index'] = opts?.bda?.window__tree_index || "[0]" + fingerprint['window__tree_structure'] = opts?.bda?.window__tree_structure || "[[]]"; + fingerprint['c8480e29a'] = crypto.createHash("md5").update(surl).digest("hex") + char; + fingerprint['6a62b2a558'] = opts.hash; + fingerprint['4b4b269e68'] = util.generateUUID(); fingerprint.client_config__language = opts.language || null; - fingerprint.window__location_href = `${opts.surl}/v2/1.5.5/enforcement.fbfc14b0d793c6ef8359e0e4b4a91f67.html#${opts.pkey}` + fingerprint.window__location_href = `${surl}/v2/${opts.capi}/enforcement.${opts.hash}.html`; + if (opts.site) { - fingerprint.document__referrer = opts.site; - fingerprint.window__ancestor_origins = [opts.site]; - fingerprint.client_config__sitedata_location_href = opts.site; + fingerprint.document__referrer = new URL(opts.site).origin; + fingerprint.window__ancestor_origins = opts?.bda.window__ancestor_origins || [opts.site]; + fingerprint.client_config__sitedata_location_href = opts?.bda.client_config__sitedata_location_href || opts.site; } - fingerprint.client_config__surl = opts.surl || "https://client-api.arkoselabs.com"; + fingerprint.client_config__surl = surl || "https://client-api.arkoselabs.com"; fingerprint.audio_fingerprint = (124.04347527516074 + Math.random() * 0.001 - 0.0005).toString(); - + return Object.entries(fingerprint).map(([k, v]) => ({ key: k, value: v })); } diff --git a/src/http.ts b/src/http.ts index e0fa3ac..9a07f8b 100644 --- a/src/http.ts +++ b/src/http.ts @@ -2,14 +2,16 @@ import { request, ProxyAgent } from "undici"; // @ts-ignore import { RequestOptions } from "undici/types/dispatcher"; -async function req(url: string, options: RequestOptions, proxy?: string) { +async function req(url: string, options: RequestOptions, proxy?: string, needsBuffer = false) { let auth = undefined; + if (proxy) { let proxyUrl = new URL(proxy); - if(proxyUrl.username && proxyUrl.password) { - auth = Buffer.from(proxyUrl.username + ":" + proxyUrl.password).toString("base64") + if (proxyUrl.username && proxyUrl.password) { + auth = Buffer.from(proxyUrl.username + ":" + proxyUrl.password).toString("base64"); } } + let dispatcher = proxy ? new ProxyAgent({ uri: proxy, auth @@ -19,10 +21,18 @@ async function req(url: string, options: RequestOptions, proxy?: string) { ...options, dispatcher, }); + + const arrayBuffer = await req.body.arrayBuffer(); + const buffer = needsBuffer ? Buffer.from(arrayBuffer) : undefined; + + const text = needsBuffer ? undefined : Buffer.from(arrayBuffer).toString('utf-8'); + return { + status: req.statusCode, headers: req.headers, - body: Buffer.from(await req.body.arrayBuffer()), + body: text, + buffer: buffer, }; } -export default req; +export default req; \ No newline at end of file diff --git a/src/session.ts b/src/session.ts index 9244daa..b9575a7 100644 --- a/src/session.ts +++ b/src/session.ts @@ -45,6 +45,11 @@ export class Session { public tokenInfo: TokenInfo; private userAgent: string; private proxy: string; + private cookie?: string; + private capi?: string = "2.11.3"; + private hash?: string = "507409183b9903b911945fa68e24c1d9"; + protected is_compatibility_mode: boolean; + protected sessionId: string; constructor( token: string | GetTokenResult, @@ -54,45 +59,72 @@ export class Session { this.token = token; } else { this.token = token.token; + token.capi && (this.capi = token.capi); + token.hash && (this.hash = token.hash); } + if (!this.token.startsWith("token=")) this.token = "token=" + this.token; this.tokenInfo = parseToken(this.token); - this.tokenInfo.mbio = typeof(token) !== "string" ? token.mbio ?? false : false + this.tokenInfo.mbio = typeof (token) !== "string" ? token.mbio ?? false : false this.userAgent = sessionOptions?.userAgent || util.DEFAULT_USER_AGENT; this.proxy = sessionOptions?.proxy; + this.cookie = typeof token !== "string" ? token.cookie : undefined; + this.is_compatibility_mode = typeof token !== "string" ? token.compatibility_mode_enabled : false; + + this.sessionId = this.token.split('|')[0].split('=')[1]; } async getChallenge(): Promise { - let res = await http( - this.tokenInfo.surl, - { - path: "/fc/gfct/", - method: "POST", - body: util.constructFormData({ - sid: this.tokenInfo.r, - render_type: "canvas", - token: this.tokenInfo.token, - analytics_tier: this.tokenInfo.at, - "data%5Bstatus%5D": "init", - lang: "en", - apiBreakerVersion: "green" - }), - headers: { - "User-Agent": this.userAgent, - "Content-Type": "application/x-www-form-urlencoded", - "Accept-Language": "en-US,en;q=0.9", - "Sec-Fetch-Site": "same-origin", - "Referer": this.getEmbedUrl() - }, + const surl = new URL(this.tokenInfo.surl); + const timestamp = util.getTimestamp() + + let res = await http(this.tokenInfo.surl, { + method: "POST", + path: "/fc/gfct/", + body: util.constructFormData({ + token: this.tokenInfo.token, + sid: this.tokenInfo.r, + render_type: "canvas", + lang: "en", + isAudioGame: false, + is_compatibility_mode: this.is_compatibility_mode, + apiBreakerVersion: "green", + analytics_tier: this.tokenInfo.at + }), + headers: { + // ':authority': surl.host, + // ':method': 'POST', + // ':path': '/fc/gfct/', + // ':scheme': 'https', + 'Accept': '*/*', + 'Accept-Encoding': '',// 'gzip, deflate, br, zstd', + 'Accept-Language': 'en-GB,en-US;q=0.9,en;q=0.8,ar;q=0.7', + 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8', + 'Cookie': this.cookie ? `${this.cookie} ${timestamp.cookie}` : timestamp.cookie, + 'Origin': surl.origin, + 'Priority': 'u=1, i', + 'Referer': `${surl.origin}/v2/${this.capi}/enforcement.${this.hash}.html`, + 'Sec-Ch-Ua': '"Google Chrome";v="131", "Chromium";v="131", "Not_A_Brand";v="24"', + 'Sec-Ch-Ua-Mobile': '?0', + 'Sec-Ch-Ua-Platform': '"Windows"', + 'Sec-Fetch-Dest': 'empty', + 'Sec-Fetch-Mode': 'cors', + 'Sec-Fetch-Site': 'same-origin', + 'User-Agent': this.userAgent, + 'X-Newrelic-Timestamp': timestamp.value, + 'X-Requested-With': 'XMLHttpRequest' }, - this.proxy - ); + }, this.proxy); - let data = JSON.parse(res.body.toString()); + let data = JSON.parse(res.body); data.token = this.token; data.tokenInfo = this.tokenInfo; + data.cookie = this.cookie; + data.is_compatibility_mode = this.is_compatibility_mode; + data.capi = this.capi; + data.hash = this.hash; if (data.game_data.gameType == 1) { return new Challenge1(data, { @@ -104,7 +136,7 @@ export class Session { proxy: this.proxy, userAgent: this.userAgent, }); - } else if (data.game_data.gameType == 4) { + } else if (data.game_data.gameType == 4) { return new Challenge4(data, { proxy: this.proxy, userAgent: this.userAgent, @@ -114,7 +146,50 @@ export class Session { "Unsupported game type: " + data.game_data.gameType ); } - //return res.body.toString() + } + + /** + * @deprecated + */ + async initialize() { + // not Working :( + let payload = { + method: "GET", + path: '/fc/init-load', + headers: { + "Accept": "*/*", + "Accept-Language": "en-GB,en-US;q=0.9,en;q=0.8,ar;q=0.7", + "Priority": "u=1, i", + "Sec-Ch-Ua": "\"Google Chrome\";v=\"131\", \"Chromium\";v=\"131\", \"Not_A Brand\";v=\"24\"", + "Sec-Ch-Ua-Mobile": "?0", + "Sec-Ch-Ua-Platform": "\"Windows\"", + "Sec-Fetch-Dest": "empty", + "Sec-Fetch-Mode": "cors", + "Sec-Fetch-Site": "same-origin", + "Cookie": this.getCookie(), // Use the actual cookie value + "Referer": this.getReferer(), + "Referrer-Policy": "strict-origin-when-cross-origin", + "Accept-Encoding": "gzip, deflate, br, zstd", + "User-Agent": this.userAgent + }, + query: { + session_token: this.sessionId + }, + body: null + } + + let res = await http(this.tokenInfo.surl, payload, this.proxy); + + return res.status + } + + getReferer() { + return `${this.tokenInfo.surl}/v2/${this.capi}/enforcement.${this.hash}.html`; + } + + getCookie() { + const timestamp = util.getTimestamp(); + return this.cookie ? `${this.cookie} ${timestamp.cookie}` : timestamp.cookie; } getEmbedUrl(): string { diff --git a/src/util.ts b/src/util.ts index da9412a..eaa848c 100644 --- a/src/util.ts +++ b/src/util.ts @@ -1,14 +1,15 @@ import fingerprint from "./fingerprint"; import murmur from "./murmur"; import crypt from "./crypt"; +import crypto from 'crypto'; +import { GetTokenOptions } from './api' interface TimestampData { cookie: string; value: string; } -const DEFAULT_USER_AGENT = - "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36"; +const DEFAULT_USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36"; let apiBreakers = { v1: { @@ -122,22 +123,38 @@ function getTimestamp(): TimestampData { const time = (new Date()).getTime().toString() const value = `${time.substring(0, 7)}00${time.substring(7, 13)}` - return { cookie: `timestamp=${value};path=/;secure;samesite=none`, value } + return { cookie: `timestamp=${value}`, value } } -function getBda(userAgent: string, opts: object): string { +function toVal(t) { + if (!t) return []; + var e = []; + for (var n in t) t.hasOwnProperty(n) && e.push(t[n]); + return e +} + +function generateClickCoordinates(baseX = 140, baseY = 212, variance = 10) { + const randomX = baseX + (Math.random() - 0.5) * variance; + const randomY = baseY + (Math.random() - 0.5) * variance; + + const x = Math.round(randomX); + const y = Math.round(randomY); + + return { + "sc": [x, y] + }; +} + +function getBda(userAgent: string, opts: GetTokenOptions): string { let fp = fingerprint.getFingerprint(); let fe = fingerprint.prepareFe(fp); let bda = [ { key: "api_type", value: "js" }, - { key: "p", value: 1 }, - { key: "f", value: murmur(fingerprint.prepareF(fingerprint), 31) }, + { key: "f", value: murmur(toVal(fp).join(';'), 0) }, { key: "n", - value: Buffer.from( - Math.round(Date.now() / (1000 - 0)).toString() - ).toString("base64"), + value: Buffer.from(Math.round(Date.now() / (1000 - 0)).toString()).toString("base64"), }, { key: "wh", value: `${random()}|${random()}` }, { @@ -146,7 +163,7 @@ function getBda(userAgent: string, opts: object): string { }, { key: "fe", value: fe }, { key: "ife_hash", value: murmur(fe.join(", "), 38) }, - { key: "cs", value: 1 }, + // { key: "cs", value: 1 }, { key: "jsbd", value: JSON.stringify({ @@ -185,6 +202,22 @@ function solveBreaker(v2: boolean, breaker: { value: string[], key: string } | s } } +const generateUUID = () => { + const bytes = crypto.randomBytes(16); + + bytes[6] = (bytes[6] & 0x0f) | 0x40; // Version 4 + bytes[8] = (bytes[8] & 0x3f) | 0x80; // Variant 10xxxxxx + + return ( + bytes.toString('hex').slice(0, 8) + '-' + + bytes.toString('hex').slice(8, 12) + '-' + + bytes.toString('hex').slice(12, 16) + '-' + + bytes.toString('hex').slice(16, 20) + '-' + + bytes.toString('hex').slice(20) + ); +}; + + export default { DEFAULT_USER_AGENT, tileToLoc, @@ -193,5 +226,7 @@ export default { apiBreakers, getTimestamp, random, - solveBreaker + solveBreaker, + generateUUID, + generateClickCoordinates, }; diff --git a/test/benchmark.js b/test/benchmark.js index 5754da7..e7ae4e5 100644 --- a/test/benchmark.js +++ b/test/benchmark.js @@ -3,13 +3,13 @@ let fun = require("../lib"); console.time("Full captcha"); console.time("Get token"); fun.getToken({ - pkey: "69A21A01-CC7B-B9C6-0F9A-E7FA06677FFC", - site: "https://client-demo.arkoselabs.com" + surl: "https://client-api.arkoselabs.com", + pkey: "CDB38584-ABDB-4342-BCED-6F5067CBC8DC", + site: "https://demo.arkoselabs.com", }).then(async (token) => { - console.timeEnd("Get token"); - console.time("Get challenge"); let session = new fun.Session(token); let captcha = await session.getChallenge(); + // console.log(`${captcha.gameType}|${captcha.variant}|${captcha.waves}|${captcha.difficulty}`); console.timeEnd("Get challenge"); for (let x = 0; x < captcha.data.game_data.waves; x++) { diff --git a/test/fullexample.js b/test/fullexample.js new file mode 100644 index 0000000..55ef84d --- /dev/null +++ b/test/fullexample.js @@ -0,0 +1,37 @@ +const fs = require("fs") +const fun = require("../lib") +const readline = require("readline") +let rl = readline.createInterface({ + input: process.stdin, + output: process.stdout +}) + +function ask(question) { + return new Promise((resolve, reject) => { + rl.question(question, (answer) => { + resolve(answer) + }) + }) +}; + +const keys = [ + 'DF58DD3B-DFCC-4502-91FA-EDC0DC385CFF', + 'D86E85D5-F029-43FA-B4D0-33086FDDABDF', + 'C07CAFBC-F76F-4DFD-ABFA-A6B78ADC1F29 ' +] + +fun.getToken({ + pkey: "DF58DD3B-DFCC-4502-91FA-EDC0DC385CFF", +}).then(async token => { + let session = new fun.Session(token) + let challenge = await session.getChallenge() + console.log(challenge.data.game_data.game_variant) + // console.log(challenge.data.game_data.customGUI.api_breaker) + + for (let x = 0; x < challenge.data.game_data.waves; x++) { + fs.writeFileSync(`${x}.gif`, await challenge.getImage()) + console.log(await challenge.answer(parseInt(await ask("Answer: ")))) + } + + console.log("Done!") +}) \ No newline at end of file diff --git a/test/image.png b/test/image.png new file mode 100644 index 0000000..1dd3017 Binary files /dev/null and b/test/image.png differ diff --git a/test/roblox.js b/test/roblox.js index aa20b71..cc97804 100644 --- a/test/roblox.js +++ b/test/roblox.js @@ -1,10 +1,11 @@ -// Optional test for roblox detection -const USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36" +const USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36" const undici = require("undici") const funcaptcha = require("../lib") +const fs = require('fs'); function continueToken(tracker, challengeId, captchaId, token) { + undici.request("https://apis.roblox.com/challenge/v1/continue", { headers: { "user-agent": USER_AGENT, @@ -20,10 +21,10 @@ function continueToken(tracker, challengeId, captchaId, token) { actionType: "Login" }), challengeType: "captcha" - }) + }), }).then(async res => { console.log(res.statusCode, await res.body.text()) - if(res.statusCode == 200) { + if (res.statusCode == 200) { console.log("Token accepted by roblox :D") } else { console.log("Token rejected by roblox :(") @@ -48,66 +49,75 @@ undici.request("https://auth.roblox.com/v2/login", { "ctype": "Username", "cvalue": "Test", "password": "Test", - }) - }) + }), + }); + + console.log(await res2.body.text()); const fieldData = JSON.parse(Buffer.from(res2.headers["rblx-challenge-metadata"], "base64")) - const tracker = (Array.isArray(res2.headers["set-cookie"]) ? res2.headers["set-cookie"].find(v => v.startsWith("RBXEventTrackerV2")) : response.headers["set-cookie"])?.split(";")[0] ?? undefined; + const tracker = (Array.isArray(res2.headers["set-cookie"]) ? res2.headers["set-cookie"].find(v => v.startsWith("RBXEventTrackerV2")) : res2.headers["set-cookie"])?.split(";")[0] ?? undefined; const challengeId = res2.headers["rblx-challenge-id"] const captchaId = fieldData.unifiedCaptchaId + + const token = await funcaptcha.getToken({ + pkey: "476068BF-9607-4799-B53D-966BE98E2B81", + surl: "https://arkoselabs.roblox.com", + data: { + "blob": fieldData.dataExchangeBlob, + }, + headers: { + "User-Agent": USER_AGENT, + }, + bda: { + "window__ancestor_origins": ["https://www.roblox.com", "https://www.roblox.com"], + "client_config__sitedata_location_href": "https://www.roblox.com/arkose/iframe", + "window__tree_structure": "[[[]]]", + 'window__tree_index': [0, 0] + }, + site: "https://www.roblox.com", + // proxy: proxy // Add proxy + }); + + console.log(token); + + if (token.error) { + console.log(token.error) + return; + } + + if (token.token.includes("sup=1")) { + console.log("Suppressed captcha!") + return continueToken(tracker, challengeId, captchaId, token.token) + } + + console.log(token); + + let session = new funcaptcha.Session(token, { + userAgent: USER_AGENT, + // proxy: proxy // Add proxy + }); + + // let init = await session.initialize(); :( useless + + let challenge = await session.getChallenge(); + + // let record1 = await challenge.Record('Site URL'); + // console.log(record1); + + // let record2 = await challenge.Record('loaded'); + // console.log(record2); + + // let record3 = await challenge.Record('begin app'); + // console.log(record3); - setTimeout(async () => { - const token = await funcaptcha.getToken({ - pkey: "476068BF-9607-4799-B53D-966BE98E2B81", - surl: "https://roblox-api.arkoselabs.com", - data: { - "blob": fieldData.dataExchangeBlob, - }, - headers: { - "User-Agent": USER_AGENT, - }, - site: "https://www.roblox.com/login", - }) - - if(token.token.includes("sup=1")) { - console.log("Suppressed captcha!") - return continueToken(tracker, challengeId, captchaId, token.token) - } + console.log(`${challenge.gameType}|${challenge.variant}|${challenge.waves}|${challenge.difficulty}`); - let session = new funcaptcha.Session(token, { - userAgent: USER_AGENT, - }) - let challenge = await session.getChallenge().catch((err) => console.log('login fail', err)) - - console.log("Login", challenge.variant, challenge.waves) - - if ( - challenge.variant && ( - challenge.variant.startsWith("dice_") || - challenge.variant.startsWith("dart") || - challenge.variant.startsWith("context-") || - [ - "shadow-icons", - "penguins", - "shadows", - "mismatched-jigsaw", - "stairs_walking", - "reflection", - "numericalmatch" - ].includes(challenge.variant) - ) - ) { - console.log("Login", "Test failed :(") - } else { - console.log("Login", "Test passed!") - } + let img = await challenge.getImage(); + fs.writeFileSync('challenge.png', img) + + let answer = await challenge.answer(1); + console.log(answer); - if(challenge.variant == "colour") { - console.log("Colour challenge") - await challenge.answer(0) - return continueToken(tracker, challengeId, captchaId, token.token) - } - }, 2500); }) process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0" \ No newline at end of file diff --git a/test/snapchat.js b/test/snapchat.js new file mode 100644 index 0000000..c207bd0 --- /dev/null +++ b/test/snapchat.js @@ -0,0 +1,37 @@ +const funcaptcha = require("../lib") + +async function main() { + const token = await funcaptcha.getToken({ + surl: "https://snap-api.arkoselabs.com", + pkey: "EA4B65CB-594A-438E-B4B5-D0DBA28C9334", + bda: { + "window__ancestor_origins": ["https://iframe.arkoselabs.com", "https://accounts.snapchat.com"], + "client_config__sitedata_location_href": "https://iframe.arkoselabs.com/EA4B65CB-594A-438E-B4B5-D0DBA28C9334/lightbox.html", + "window__tree_structure": "[[[]]]", + 'window__tree_index': [0, 0] + }, + site: "https://iframe.arkoselabs.com", + // proxy: proxy // Add proxy + }); + + if (token.error) { + console.log(token.message) + return; + } + + if (token.token.includes('sup=1')) { + console.log("sup token :)") + return; + } + + const session = new funcaptcha.Session(token, { + // proxy: proxy + }); + + const challenge = await session.getChallenge(); + + console.log(`${challenge.gameType}|${challenge.variant}|${challenge.waves}|${challenge.difficulty}`); + +}; + +main(); \ No newline at end of file diff --git a/test/test.js b/test/test.js index c2c12b1..b7fe495 100644 --- a/test/test.js +++ b/test/test.js @@ -87,5 +87,5 @@ async function test(publicKey, name, surl = "https://client-api.arkoselabs.com") } setImmediate(async () => { - await test("69A21A01-CC7B-B9C6-0F9A-E7FA06677FFC", "Tiles"); + await test("E8A75615-1CBA-5DFF-8032-D16BCF234E10", "Tiles"); }); diff --git a/test/test.py b/test/test.py new file mode 100644 index 0000000..ce4ea5d --- /dev/null +++ b/test/test.py @@ -0,0 +1,204 @@ +import tls_client +# from api import getToken +# import challenge as funcap +import json +import base64 +# from curl_cffi import requests + +proxy = None #"http://username:password@host:port" + +def test(): + session = tls_client.Session( + client_identifier="safari_ios_16_0", + random_tls_extension_order=True, + # proxy="http://user:password@host:port", + ) + + nsession = session + + __token = signup(session) + print(f"Token: {__token}") + signup_attemp = signup(session, __token) + + opts = { + "surl": "https://arkoselabs.roblox.com", + "pkey": "A2A14B1D-1AF3-C791-9BBC-EE33CC7A0A6F", + "blob": signup_attemp[0], + "site": "https://www.roblox.com", + } + + print(signup_attemp[0]) + + # token = getToken(session, opts, proxy) + # solved = False + + # if token.get("error"): + # return print("DENIED ACCESS") + + # if "sup=1" in token.get("token"): + # print("ACCESS GRANTED (SUP=1)") + + # return continueToken( + # session=session, + # cookie=signup_attemp[3], + # unifiedCaptchaId=signup_attemp[1], + # taskId=token.get("token"), + # token=__token, + # followResponse=signup_attemp[4], + # ) + + # print(token) + + # session = funcap.Session(session, token, proxy) + # challenge = session.getChallenge() + + # print(f"Challenge: {challenge.variant}|{challenge.waves}|{challenge.difficulty}") + + # for i in range(challenge.waves): + # img = challenge.getImage(i) + # base64_img = base64.b64encode(img).decode() + # s = xevil.solve_captcha(base64_img, challenge.variant) + + # with open("captcha.png", "wb") as f: + # f.write(img) + + # x = challenge.answer(s, one_click=True) + # print(x) + + # if x["response"] == "answered": + # solved = x["solved"] + # # print(challenge.answers) + # print(f"Captcha: {x["solved"]}") + + # if not solved: + # print("Failed to solve captcha") + # return + + # continueToken( + # session=nsession, + # cookie=signup_attemp[3], + # unifiedCaptchaId=signup_attemp[1], + # taskId=token.get("token"), + # token=__token, + # followResponse=signup_attemp[4], + # ) + + +def signup(session: tls_client.Session, token=""): + payload = { + "agreementIds": [ + "3f341564-2a8b-4d10-8b1b-fd6e20d0a88a", + "c52851e3-faeb-4853-a597-12e374f8aa98", + ], + "birthday": "the Birthday in the format YYYY-MM-DD", + "gender": 1, + "isTosAgreementBoxChecked": True, + "password": "the_very_unique_password", + "username": "the_cool_username", + # "securityAuthIntent": authIntent, + } + + signupResponse = session.post( + "https://auth.roblox.com/v2/signup", + headers={ + # ":authority": "auth.roblox.com", + # ":method": "POST", + # ":path": "/v2/signup", + # ":scheme": "https", + "Accept": "application/json, text/plain, */*", + "Accept-Encoding": "gzip, deflate, br, zstd", + "Accept-Language": "en-US,en;q=0.9", + # "Content-Length": len(json.dumps(payload).encode('utf-8')), + "Content-Type": "application/json;charset=UTF-8", + # "Cookie": cookie, + "Origin": "https://www.roblox.com", + "Priority": "u=1, i", + "Referer": "https://www.roblox.com/", + "Sec-Ch-Ua": '"Google Chrome";v="131", "Chromium";v="131", "Not_A_Brand";v="24"', + "Sec-Ch-Ua-Mobile": "?0", + "Sec-Ch-Ua-Platform": '"Windows"', + "Sec-Fetch-Dest": "empty", + "Sec-Fetch-Mode": "cors", + "Sec-Fetch-Site": "same-site", + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36", + "X-Csrf-Token": token, + }, + data=payload, + proxy=proxy + ) + + if signupResponse.headers.get("X-Csrf-Token"): + return signupResponse.headers.get("X-Csrf-Token") + else: + challengeData = json.loads( + base64.b64decode( + signupResponse.headers.get("Rblx-Challenge-Metadata") + ).decode() + ) + dataBlob = challengeData["dataExchangeBlob"] + unifiedCaptchaId = challengeData["unifiedCaptchaId"] + challengeId = challengeData["sharedParameters"]["genericChallengeId"] + + return [ + dataBlob, # 0 + unifiedCaptchaId, # 1, + challengeId, # 2 + None, # 3 + signupResponse, # 4 + ] + +def continueToken(session: tls_client.Session, unifiedCaptchaId, taskId, followResponse, cookie, token): + metadata = json.dumps( + { + "unifiedCaptchaId": unifiedCaptchaId, + "captchaToken": taskId, + "actionType": "Signup", + } + ) + + continue_payload = { + "challengeId": followResponse.headers.get("Rblx-Challenge-Id"), + "challengeMetadata": metadata, + "challengeType": "captcha", + } + + headers = { + # ":authority": "apis.roblox.com", + # ":method": "POST", + # ":path": "/challenge/v1/continue", + # ":scheme": "https", + "Accept": "application/json, text/plain, */*", + "Accept-Encoding": "gzip, deflate, br, zstd", + "Accept-Language": "en-GB,en-US;q=0.9,en;q=0.8,ar;q=0.7", + "Cache-Control": "no-cache", + "Content-Type": "application/json;charset=UTF-8", + "Cookie": cookie, + "Origin": "https://www.roblox.com", + "Pragma": "no-cache", + "Priority": "u=1, i", + "Referer": "https://www.roblox.com/", + "Sec-Ch-Ua": '"Google Chrome";v="131", "Chromium";v="131", "Not_A Brand";v="24"', + "Sec-Ch-Ua-Mobile": "?0", + "Sec-Ch-Ua-Platform": '"Windows"', + "Sec-Fetch-Dest": "empty", + "Sec-Fetch-Mode": "cors", + "Sec-Fetch-Site": "same-site", + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36", + "X-Csrf-Token": token, + } + + continueApiUrl = "https://apis.roblox.com/challenge/v1/continue" + continueResponse = session.post( + continueApiUrl, + headers=headers, + json=continue_payload, + ) + + if (continueResponse.status_code != 200): + print(f"Token Rejected! Status Code: {continueResponse.status_code}") + print(continueResponse.text) + else: + print("Token Accepted! :)") + + +test() diff --git a/test/utils/f.js b/test/utils/f.js new file mode 100644 index 0000000..f8a2cad --- /dev/null +++ b/test/utils/f.js @@ -0,0 +1,106 @@ +const c = require('./murmur_arkose.js'); +const m = require('../../lib/murmur.js') + +const x = { + "DNT": "unknown", + "L": "en-GB", + "D": 24, + "PR": 1.5, + "S": [ + 1280, + 800 + ], + "AS": [ + 1280, + 752 + ], + "TO": -180, + "SS": true, + "LS": true, + "IDB": true, + "B": false, + "ODB": false, + "CPUC": "unknown", + "PK": "Win32", + "CFP": 0, + "FR": false, + "FOS": false, + "FB": false, + "JSF": [ + "Arial", + "Arial Black", + "Arial Narrow", + "Book Antiqua", + "Bookman Old Style", + "Calibri", + "Cambria", + "Cambria Math", + "Century", + "Century Gothic", + "Century Schoolbook", + "Comic Sans MS", + "Consolas", + "Courier", + "Courier New", + "Garamond", + "Georgia", + "Helvetica", + "Impact", + "Lucida Bright", + "Lucida Calligraphy", + "Lucida Console", + "Lucida Fax", + "Lucida Handwriting", + "Lucida Sans", + "Lucida Sans Typewriter", + "Lucida Sans Unicode", + "Microsoft Sans Serif", + "Monotype Corsiva", + "MS Gothic", + "MS PGothic", + "MS Reference Sans Serif", + "MS Sans Serif", + "MS Serif", + "Palatino Linotype", + "Segoe Print", + "Segoe Script", + "Segoe UI", + "Segoe UI Light", + "Segoe UI Semibold", + "Segoe UI Symbol", + "Tahoma", + "Times", + "Times New Roman", + "Trebuchet MS", + "Verdana", + "Wingdings", + "Wingdings 2", + "Wingdings 3" + ], + "P": [ + "Chrome PDF Viewer", + "Chromium PDF Viewer", + "Microsoft Edge PDF Viewer", + "PDF Viewer", + "WebKit built-in PDF" + ], + "T": [ + 10, + false, + false + ], + "H": 16, + "SWF": false +} + + +function toVal(t) { + if (!t) return []; + var e = []; + for (var n in t) t.hasOwnProperty(n) && e.push(t[n]); + return e +} + +console.log(toVal(x).join(';')); + +console.log(m.default(toVal(x).join(';'), 0)) \ No newline at end of file diff --git a/test/utils/murmur_arkose.js b/test/utils/murmur_arkose.js new file mode 100644 index 0000000..fd1a72a --- /dev/null +++ b/test/utils/murmur_arkose.js @@ -0,0 +1,226 @@ +var d = function (t) { + var e = 301 + , n = 301 + , r = 317 + , o = 312 + , i = 317 + , a = 312 + , h = 312 + , d = 317 + , g = 312 + , m = 312 + , y = 317 + , b = 312 + , w = 317 + , O = 317 + , x = 312 + , S = 317 + , E = 312 + , _ = 317 + , A = 312 + , I = 317 + , j = 317 + , k = 317 + , P = 312 + , T = 317 + , R = 312 + , C = 317 + , L = 317 + , N = 312 + , M = 317 + , D = 312 + , U = 317 + , F = 317 + , B = 312 + , G = 317 + , H = 312 + , W = 317 + , V = 317 + , J = 312 + , z = 312 + , q = 301 + , X = 308 + , Y = 311 + , Q = 307 + , K = 318 + , Z = 308 + , $ = 311 + , tt = 307 + , et = 318 + , nt = 308 + , rt = 311 + , ot = 308 + , it = 318 + , at = p // hmm later + , ct = arguments[at(e)] > 1 && void 0 !== arguments[1] ? arguments[1] : 0; + ct = ct || 0; + for (var ut = (t = t || "")[at(e)] % 16, st = t[at(n)] - ut, ft = [0, ct], lt = [0, ct], pt = [0, 0], ht = [0, 0], vt = [2277735313, 289559509], dt = [1291169091, 658871167], gt = 0; gt < st; gt += 16) + pt = [255 & t[at(r) + at(o)](gt + 4) | (255 & t[at(i) + at(a)](gt + 5)) << 8 | (255 & t[at(i) + at(a)](gt + 6)) << 16 | (255 & t[at(i) + at(h)](gt + 7)) << 24, 255 & t[at(d) + at(a)](gt) | (255 & t[at(i) + at(g)](gt + 1)) << 8 | (255 & t[at(d) + at(m)](gt + 2)) << 16 | (255 & t[at(y) + at(b)](gt + 3)) << 24], + ht = [255 & t[at(w) + at(h)](gt + 12) | (255 & t[at(O) + at(h)](gt + 13)) << 8 | (255 & t[at(y) + at(x)](gt + 14)) << 16 | (255 & t[at(y) + at(h)](gt + 15)) << 24, 255 & t[at(S) + at(b)](gt + 8) | (255 & t[at(d) + at(E)](gt + 9)) << 8 | (255 & t[at(_) + at(A)](gt + 10)) << 16 | (255 & t[at(I) + at(m)](gt + 11)) << 24], + pt = s(pt = u(pt, vt), 31), + ft = s(ft = l(ft, pt = u(pt, dt)), 27), + ft = c(ft, lt), + ft = c(u(ft, [0, 5]), [0, 1390208809]), + ht = s(ht = u(ht, dt), 33), + lt = s(lt = l(lt, ht = u(ht, vt)), 31), + lt = c(lt, ft), + lt = c(u(lt, [0, 5]), [0, 944331445]); + switch (pt = [0, 0], + ht = [0, 0], + ut) { + case 15: + ht = l(ht, f([0, t[at(j) + at(a)](gt + 14)], 48)); + case 14: + ht = l(ht, f([0, t[at(k) + at(P)](gt + 13)], 40)); + case 13: + ht = l(ht, f([0, t[at(T) + at(o)](gt + 12)], 32)); + case 12: + ht = l(ht, f([0, t[at(O) + at(R)](gt + 11)], 24)); + case 11: + ht = l(ht, f([0, t[at(C) + at(x)](gt + 10)], 16)); + case 10: + ht = l(ht, f([0, t[at(L) + at(N)](gt + 9)], 8)); + case 9: + ht = l(ht, [0, t[at(M) + at(R)](gt + 8)]), + ht = s(ht = u(ht, dt), 33), + lt = l(lt, ht = u(ht, vt)); + case 8: + pt = l(pt, f([0, t[at(M) + at(D)](gt + 7)], 56)); + case 7: + pt = l(pt, f([0, t[at(U) + at(N)](gt + 6)], 48)); + case 6: + pt = l(pt, f([0, t[at(F) + at(B)](gt + 5)], 40)); + case 5: + pt = l(pt, f([0, t[at(G) + at(H)](gt + 4)], 32)); + case 4: + pt = l(pt, f([0, t[at(C) + at(h)](gt + 3)], 24)); + case 3: + pt = l(pt, f([0, t[at(W) + at(m)](gt + 2)], 16)); + case 2: + pt = l(pt, f([0, t[at(V) + at(J)](gt + 1)], 8)); + case 1: + pt = l(pt, [0, t[at(r) + at(z)](gt)]), + pt = s(pt = u(pt, vt), 31), + ft = l(ft, pt = u(pt, dt)) + } + return ft = l(ft, [0, t[at(n)]]), + lt = l(lt, [0, t[at(q)]]), + ft = c(ft, lt), + lt = c(lt, ft), + ft = v(ft), + lt = v(lt), + ft = c(ft, lt), + lt = c(lt, ft), + (at(X) + "00")[at(Y)]((ft[0] >>> 0)[at(Q) + "ng"](16))[at(K)](-8) + (at(Z) + "00")[at($)]((ft[1] >>> 0)[at(tt) + "ng"](16))[at(et)](-8) + (at(nt) + "00")[at(rt)]((lt[0] >>> 0)[at(tt) + "ng"](16))[at(et)](-8) + (at(ot) + "00")[at($)]((lt[1] >>> 0)[at(tt) + "ng"](16))[at(it)](-8) +} + +function s(t, e) { + return 32 === (e %= 64) ? [t[1], t[0]] : e < 32 ? [t[0] << e | t[1] >>> 32 - e, t[1] << e | t[0] >>> 32 - e] : (e -= 32, + [t[1] << e | t[0] >>> 32 - e, t[0] << e | t[1] >>> 32 - e]) +} + +function u(t, e) { + t = [t[0] >>> 16, 65535 & t[0], t[1] >>> 16, 65535 & t[1]], + e = [e[0] >>> 16, 65535 & e[0], e[1] >>> 16, 65535 & e[1]]; + var n = [0, 0, 0, 0]; + return n[3] += t[3] * e[3], + n[2] += n[3] >>> 16, + n[3] &= 65535, + n[2] += t[2] * e[3], + n[1] += n[2] >>> 16, + n[2] &= 65535, + n[2] += t[3] * e[2], + n[1] += n[2] >>> 16, + n[2] &= 65535, + n[1] += t[1] * e[3], + n[0] += n[1] >>> 16, + n[1] &= 65535, + n[1] += t[2] * e[2], + n[0] += n[1] >>> 16, + n[1] &= 65535, + n[1] += t[3] * e[1], + n[0] += n[1] >>> 16, + n[1] &= 65535, + n[0] += t[0] * e[3] + t[1] * e[2] + t[2] * e[1] + t[3] * e[0], + n[0] &= 65535, + [n[0] << 16 | n[1], n[2] << 16 | n[3]] +}; + +function l(t, e) { + return [t[0] ^ e[0], t[1] ^ e[1]] +} + +function c(t, e) { + t = [t[0] >>> 16, 65535 & t[0], t[1] >>> 16, 65535 & t[1]], + e = [e[0] >>> 16, 65535 & e[0], e[1] >>> 16, 65535 & e[1]]; + var n = [0, 0, 0, 0]; + return n[3] += t[3] + e[3], + n[2] += n[3] >>> 16, + n[3] &= 65535, + n[2] += t[2] + e[2], + n[1] += n[2] >>> 16, + n[2] &= 65535, + n[1] += t[1] + e[1], + n[0] += n[1] >>> 16, + n[1] &= 65535, + n[0] += t[0] + e[0], + n[0] &= 65535, + [n[0] << 16 | n[1], n[2] << 16 | n[3]] +} + +function f(t, e) { + return 0 === (e %= 64) ? t : e < 32 ? [t[0] << e | t[1] >>> 32 - e, t[1] << e] : [t[1] << e - 32, 0] +} + +function v(t) { + return t = l(t, [0, t[0] >>> 1]), + t = l(t = u(t, [4283543511, 3981806797]), [0, t[0] >>> 1]), + t = l(t = u(t, [3301882366, 444984403]), [0, t[0] >>> 1]) +} + +function p(t, e) { + var n = h(); + return (p = function (t, e) { + return n[t -= 297] + } + )(t, e) +} +function h() { + var t = [ + "30352kyMDCK", + "602936dqacpg", + "63sbzaJz", + "reduce", + "length", + "constr", + "4180536IvvNAX", + "28120ocwbzO", + "+)+)+$", + "324IYixaU", + "toStri", + "000000", + "apply", + "search", + "concat", + "deAt", + "split", + "protot", + "2572706TnQhmW", + "ype", + "charCo", + "slice", + "uctor", + "3322186IrsaDB", + "(((.+)", + "3162260PUjCKl" + ]; + + return (h = function () { + return t + } + )() +} + +module.exports = d; + +// console.log(d('DNT:unknown, L:en-GB, D:24, PR:1.5, S:1280,800, AS:1280,752, TO:-180, SS:true, LS:true, IDB:true, B:false, ODB:false, CPUC:unknown, PK:Win32, CFP:, FR:false, FOS:false, FB:false, JSF:Arial,Arial Black,Arial Narrow,Book Antiqua,Bookman Old Style,Calibri,Cambria,Cambria Math,Century,Century Gothic,Century Schoolbook,Comic Sans MS,Consolas,Courier,Courier New,Garamond,Georgia,Helvetica,Impact,Lucida Bright,Lucida Calligraphy,Lucida Console,Lucida Fax,Lucida Handwriting,Lucida Sans,Lucida Sans Typewriter,Lucida Sans Unicode,Microsoft Sans Serif,Monotype Corsiva,MS Gothic,MS PGothic,MS Reference Sans Serif,MS Sans Serif,MS Serif,Palatino Linotype,Segoe Print,Segoe Script,Segoe UI,Segoe UI Light,Segoe UI Semibold,Segoe UI Symbol,Tahoma,Times,Times New Roman,Trebuchet MS,Verdana,Wingdings,Wingdings 2,Wingdings 3, P:Chrome PDF Viewer,Chromium PDF Viewer,Microsoft Edge PDF Viewer,PDF Viewer,WebKit built-in PDF, T:10,false,false, H:16, SWF:false', 38)) \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json index b11a0c6..36e0665 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -3,7 +3,8 @@ "target": "es2019", "module": "commonjs", "declaration": true, - "outDir": "./lib" + "outDir": "./lib", + "esModuleInterop": true }, "include": ["src"], } \ No newline at end of file