Google Ads Scraper Pro beta
Pricing
Pay per usage
Go to Store
Google Ads Scraper Pro beta
Google Ads Scraper beta
5.0 (3)
Pricing
Pay per usage
3
Total users
11
Monthly users
11
Runs succeeded
>99%
Last modified
23 days ago
.actor/Dockerfile
# Specify the base Docker image. You can read more about# the available images at https://docs.apify.com/sdk/js/docs/guides/docker-images# You can also use any other image from Docker Hub.FROM apify/actor-node:20
# Check preinstalled packagesRUN npm ls crawlee apify puppeteer playwright
# Copy just package.json and package-lock.json# to speed up the build using Docker layer cache.COPY package*.json ./
# Install NPM packages, skip optional and development dependencies to# keep the image small. Avoid logging too much and print the dependency# tree for debuggingRUN npm --quiet set progress=false \ && npm install --omit=dev --omit=optional \ && echo "Installed NPM packages:" \ && (npm list --omit=dev --all || true) \ && echo "Node.js version:" \ && node --version \ && echo "NPM version:" \ && npm --version \ && rm -r ~/.npm
# Next, copy the remaining files and directories with the source code.# Since we do this after NPM install, quick build will be really fast# for most source file changes.COPY . ./
# Run the image.CMD npm start --silent
.actor/actor.json
{ "actorSpecification": 1, "name": "my-actor-2", "title": "Google Ads Transparency Scraper", "description": "Crawlee and Cheerio project in javascript.", "version": "0.0", "meta": { "templateId": "js-crawlee-cheerio" }, "input": "./input_schema.json", "dockerfile": "./Dockerfile", "readme": "./README.md", "storages": { "dataset": { "actorSpecification": 1, "title": "Results", "views": { "results": { "title": "results to scan", "transformation": { "fields": ["advertiserId", "creativeId", "format", "previewUrls", "creativeRegions", "adTransparencyUrl", "regionStats"] }, "display": { "component": "table", "properties": { "advertiserId": { "label": "advertiser Id", "format": "text" }, "creativeId": { "label": "creative Id", "format": "text" }, "format": { "label": "format", "format": "text" }, "previewUrls": { "label": "previewUrls", "format": "text" }, "creativeRegions": { "label": "creative Regions", "format": "text" }, "adTransparencyUrl": { "label": "adTransparency Url", "format": "link" }, "regionStats": { "label": "region Stats", "format": "text" } } } } } }}}
.actor/input_schema.json
{ "title": "Ad Search Configuration", "type": "object", "schemaVersion": 1, "properties": { "Use_URL_Filter": { "title": "Use parameter URL as a filter", "type": "boolean", "description": "Debug messages will be included in the log.", "default": true, "groupCaption": "Options", "groupDescription": "Various options for this Actor" }, "isPolitical": { "title": "isPolitical", "type": "boolean", "description": "Debug messages will be included in the log.", "default": true, "groupCaption": "Options", "groupDescription": "Various options for this Actor" }, "keyword_domain_advertiserid": { "title": "Search Keywords", "type": "array", "description": "Enter one or more keywords to search for relevant ads.", "editor": "stringList", "default": [ "AR05789404224659914753", "https://adstransparency.google.com/advertiser/AR05789404224659914753?region=US&topic=political&preset-date=Last+7+days&format=VIDEO&platform=YOUTUBE" ] }, "limitResults": { "title": "limit Results", "type": "integer", "description": "Specify the maximum number of unique domains to retrieve.", "editor": "number", "default": 3
}, "maxDomains": { "title": "Maximum Domains", "type": "integer", "description": "Specify the maximum number of unique domains to retrieve.", "default": 0, "editor": "number" }, "maxAdvertisers": { "title": "Maximum Advertisers", "type": "integer", "description": "Set the maximum number of advertisers to fetch results from.", "default": 10, "editor": "number" }, "platform": { "title": "", "type": "string", "description": "", "editor": "select", "default": "0", "enum": ["0", "2", "1", "4", "3", "5"], "enumTitles": ["All platforms", "Google Maps", "Google Play", "Google Shopping", "Google Search", "YouTube"] }, "format": { "title": "Ad Format", "type": "string", "description": "Select the preferred ad format to filter results.", "editor": "select", "default": "0", "enum": ["0", "1", "2", "3"], "enumTitles": ["All formats", "Text", "Image", "Video"] }, "presetDate": { "title": "Date Range", "type": "string", "description": "Select a predefined date range for filtering ads.", "editor": "select", "default": "0", "enum": ["0", "1", "7", "30", "-1"], "enumTitles": ["Today", "Yesterday", "Last 7 days", "Last 30 days", "Any time"] }, "startDate": { "title": "Start Date", "type": "string", "description": "Specify a custom start date for filtering ads (YYYYMMDD).", "editor": "datepicker", "default": "2024-01-01"
}, "endDate": { "title": "End Date", "type": "string", "description": "Specify a custom end date for filtering ads (YYYYMMDD).", "editor": "datepicker" }, "region": { "title": "Target Region", "type": "string", "description": "Select a specific country/region to filter ads.", "editor": "select", "enum": [ "Albania", "Algeria", "American Samoa", "Andorra", "Angola", "Antarctica", "Antigua and Barbuda", "Argentina", "Armenia", "Australia", "Austria", "Azerbaijan", "Bahrain", "Bangladesh", "Barbados", "Belarus", "Belgium", "Belize", "Benin", "Bhutan", "Bolivia", "Bosnia and Herzegovina", "Botswana", "Brazil", "Brunei", "Bulgaria", "Burkina Faso", "Burundi", "Cambodia", "Cameroon", "Canada", "Cabo Verde", "Caribbean Netherlands", "Central African Republic", "Chad", "Chile", "China", "Christmas Island", "Cocos (Keeling) Islands", "Colombia", "Comoros", "Cook Islands", "Costa Rica", "Cote d'Ivoire", "Croatia", "Curacao", "Cyprus", "Czechia", "Democratic Republic of the Congo", "Denmark", "Djibouti", "Dominica", "Dominican Republic", "Ecuador", "Egypt", "El Salvador", "Equatorial Guinea", "Eritrea", "Estonia", "Eswatini", "Ethiopia", "Micronesia", "Fiji", "Finland", "France", "French Polynesia", "French Southern and Antarctic Lands", "Gabon", "Georgia", "Germany", "Ghana", "Greece", "Grenada", "Guam", "Guatemala", "Guernsey", "Guinea", "Guinea-Bissau", "Guyana", "Haiti", "Heard Island and McDonald Islands", "Honduras", "Hungary", "Iceland", "India", "Indonesia", "Iraq", "Ireland", "Israel", "Italy", "Jamaica", "Japan", "Jersey", "Jordan", "Kazakhstan", "Kenya", "Kiribati", "Kuwait", "Kyrgyzstan", "Laos", "Latvia", "Lebanon", "Lesotho", "Liberia", "Libya", "Liechtenstein", "Lithuania", "Luxembourg", "Madagascar", "Malawi", "Malaysia", "Maldives", "Malta", "Mali", "Marshall Islands", "Mauritania", "Mauritius", "Mexico", "Moldova", "Monaco", "Mongolia", "Montenegro", "Morocco", "Mozambique", "Myanmar (Burma)", "Namibia", "Nauru", "Nepal", "Netherlands", "New Caledonia", "New Zealand", "Nicaragua", "Niger", "Nigeria", "Niue", "Norfolk Island", "North Macedonia", "Northern Mariana Islands", "Norway", "Oman", "Pakistan", "Palau", "Panama", "Papua New Guinea", "Paraguay", "Peru", "Philippines", "Pitcairn Islands", "Poland", "Portugal", "Qatar", "Republic of the Congo", "Romania", "Rwanda", "Saint Helena, Ascension and Tristan da Cunha", "Saint Kitts and Nevis", "Saint Lucia", "Saint Pierre and Miquelon", "Saint Vincent and the Grenadines", "Samoa", "San Marino", "Sao Tome and Principe", "Saudi Arabia", "Senegal", "Seychelles", "Sierra Leone", "Singapore", "Sint Maarten", "Slovakia", "Slovenia", "Solomon Islands", "Somalia", "South Africa", "South Georgia and the South Sandwich Islands", "South Korea", "Spain", "Sri Lanka", "Suriname", "Switzerland", "Sweden", "Tajikistan", "Tanzania", "Thailand", "The Bahamas", "The Gambia", "Timor-Leste", "Togo", "Tokelau", "Tonga", "Trinidad and Tobago", "Tunisia", "Turkiye", "Turkmenistan", "Tuvalu", "Uganda", "Ukraine", "United Arab Emirates", "United Kingdom", "United States", "Uruguay", "Uzbekistan", "Vanuatu", "Vatican City", "Venezuela", "Vietnam", "Yemen", "Zambia", "Zimbabwe", "Bermuda", "Bouvet Island", "British Indian Ocean Territory", "British Virgin Islands", "Canary Islands", "Cayman Islands", "Taiwan", "Mayotte", "Faroe Islands", "Falkland Islands (Islas Malvinas)", "French Guiana", "Palestine", "Gibraltar", "Greenland", "Guadeloupe", "Hong Kong", "Isle of Man", "Macao", "Martinique", "Montserrat", "Aruba", "Puerto Rico", "Reunion", "Anguilla", "Western Sahara", "Saint Martin", "Svalbard and Jan Mayen", "Turks and Caicos Islands", "United States Minor Outlying Islands", "U.S. Virgin Islands", "Wallis and Futuna" ], "enumTitles": [ "Albania", "Algeria", "American Samoa", "Andorra", "Angola", "Antarctica", "Antigua and Barbuda", "Argentina", "Armenia", "Australia", "Austria", "Azerbaijan", "Bahrain", "Bangladesh", "Barbados", "Belarus", "Belgium", "Belize", "Benin", "Bhutan", "Bolivia", "Bosnia and Herzegovina", "Botswana", "Brazil", "Brunei", "Bulgaria", "Burkina Faso", "Burundi", "Cambodia", "Cameroon", "Canada", "Cabo Verde", "Caribbean Netherlands", "Central African Republic", "Chad", "Chile", "China", "Christmas Island", "Cocos (Keeling) Islands", "Colombia", "Comoros", "Cook Islands", "Costa Rica", "Cote d'Ivoire", "Croatia", "Curacao", "Cyprus", "Czechia", "Democratic Republic of the Congo", "Denmark", "Djibouti", "Dominica", "Dominican Republic", "Ecuador", "Egypt", "El Salvador", "Equatorial Guinea", "Eritrea", "Estonia", "Eswatini", "Ethiopia", "Micronesia", "Fiji", "Finland", "France", "French Polynesia", "French Southern and Antarctic Lands", "Gabon", "Georgia", "Germany", "Ghana", "Greece", "Grenada", "Guam", "Guatemala", "Guernsey", "Guinea", "Guinea-Bissau", "Guyana", "Haiti", "Heard Island and McDonald Islands", "Honduras", "Hungary", "Iceland", "India", "Indonesia", "Iraq", "Ireland", "Israel", "Italy", "Jamaica", "Japan", "Jersey", "Jordan", "Kazakhstan", "Kenya", "Kiribati", "Kuwait", "Kyrgyzstan", "Laos", "Latvia", "Lebanon", "Lesotho", "Liberia", "Libya", "Liechtenstein", "Lithuania", "Luxembourg", "Madagascar", "Malawi", "Malaysia", "Maldives", "Malta", "Mali", "Marshall Islands", "Mauritania", "Mauritius", "Mexico", "Moldova", "Monaco", "Mongolia", "Montenegro", "Morocco", "Mozambique", "Myanmar (Burma)", "Namibia", "Nauru", "Nepal", "Netherlands", "New Caledonia", "New Zealand", "Nicaragua", "Niger", "Nigeria", "Niue", "Norfolk Island", "North Macedonia", "Northern Mariana Islands", "Norway", "Oman", "Pakistan", "Palau", "Panama", "Papua New Guinea", "Paraguay", "Peru", "Philippines", "Pitcairn Islands", "Poland", "Portugal", "Qatar", "Republic of the Congo", "Romania", "Rwanda", "Saint Helena, Ascension and Tristan da Cunha", "Saint Kitts and Nevis", "Saint Lucia", "Saint Pierre and Miquelon", "Saint Vincent and the Grenadines", "Samoa", "San Marino", "Sao Tome and Principe", "Saudi Arabia", "Senegal", "Seychelles", "Sierra Leone", "Singapore", "Sint Maarten", "Slovakia", "Slovenia", "Solomon Islands", "Somalia", "South Africa", "South Georgia and the South Sandwich Islands", "South Korea", "Spain", "Sri Lanka", "Suriname", "Switzerland", "Sweden", "Tajikistan", "Tanzania", "Thailand", "The Bahamas", "The Gambia", "Timor-Leste", "Togo", "Tokelau", "Tonga", "Trinidad and Tobago", "Tunisia", "Turkiye", "Turkmenistan", "Tuvalu", "Uganda", "Ukraine", "United Arab Emirates", "United Kingdom", "United States", "Uruguay", "Uzbekistan", "Vanuatu", "Vatican City", "Venezuela", "Vietnam", "Yemen", "Zambia", "Zimbabwe", "Bermuda", "Bouvet Island", "British Indian Ocean Territory", "British Virgin Islands", "Canary Islands", "Cayman Islands", "Taiwan", "Mayotte", "Faroe Islands", "Falkland Islands (Islas Malvinas)", "French Guiana", "Palestine", "Gibraltar", "Greenland", "Guadeloupe", "Hong Kong", "Isle of Man", "Macao", "Martinique", "Montserrat", "Aruba", "Puerto Rico", "Reunion", "Anguilla", "Western Sahara", "Saint Martin", "Svalbard and Jan Mayen", "Turks and Caicos Islands", "United States Minor Outlying Islands", "U.S. Virgin Islands", "Wallis and Futuna" ] }, "proxyConfig": { "sectionCaption": "Proxy Configuration", "sectionDescription": "Configure proxy settings to use during the scan. Utilizing proxies can help you avoid IP bans, bypass WAF (Web Application Firewall) restrictions, and access specific geographical regions. This ensures smooth crawling across various environments and enhances the overall efficiency and reliability of your scanning activities.", "title": "Proxy", "type": "object", "description": "Configure proxy settings to use during the scan. Utilizing proxies can help you avoid IP bans, bypass WAF (Web Application Firewall) restrictions, and access specific geographical regions. This ensures smooth crawling across various environments and enhances the overall efficiency and reliability of your scanning activities.", "default": {"useApifyProxy": false}, "editor": "proxy" } } }
src/fetchWithProxyRotation.js
1import { Actor } from 'apify';2
3await Actor.init();4
5// Load and parse input parameters6const input = await Actor.getInput() ?? {};7const { proxyConfig } = input;8
9// Create a helper function to handle proxy rotation and retries10export async function fetchWithProxyRotation(options, postData, maxRetries = 3) {11 const { request } = await import('https');12 let retryCount = 0;13 let lastError = null;14 let proxyConfiguration = null;15 let useProxy = !!proxyConfig; // Check if proxyConfig is provided16
17 if (useProxy) {18 try {19 proxyConfiguration = await Actor.createProxyConfiguration(proxyConfig);20 if (!proxyConfiguration) {21 console.warn("⚠️ Proxy configuration failed. Running without proxy.");22 useProxy = false;23 }24 } catch (error) {25 console.warn("⚠️ Failed to initialize proxy configuration. Running without proxy.");26 useProxy = false;27 }28 }29
30 while (retryCount < maxRetries) {31 try {32 let proxyAgent = null;33 let proxyUrl = null;34
35 if (useProxy && proxyConfiguration) {36 try {37 proxyUrl = await proxyConfiguration.newUrl();38 if (!proxyUrl) {39 console.warn("⚠️ Failed to retrieve proxy URL. Continuing without a proxy.");40 useProxy = false;41 } else {42 const { HttpsProxyAgent } = await import('https-proxy-agent');43 proxyAgent = new HttpsProxyAgent(proxyUrl);44 console.log(`🔄 Attempt ${retryCount + 1}/${maxRetries} using proxy: ${proxyUrl.replace(/:[^:]*@/, ':****@')}`);45 }46 } catch (error) {47 console.warn("⚠️ Error getting new proxy URL. Running without proxy.");48 useProxy = false;49 }50 } else {51 console.log(`🔄 Attempt ${retryCount + 1}/${maxRetries} without a proxy.`);52 }53
54 // Update options with proxy settings if available55 const proxyOptions = {56 ...options,57 agent: proxyAgent || undefined58 };59
60 // Make the request with the current proxy61 const response = await new Promise((resolve, reject) => {62 const req = request(proxyOptions, (res) => {63 let data = "";64
65 res.on("data", (chunk) => { data += chunk; });66
67 res.on("end", () => {68 // Check for blocks or CAPTCHA69 if (res.statusCode >= 400) {70 reject(new Error(`HTTP ${res.statusCode}: ${data}`));71 return;72 }73
74 if (data.includes("<title>302 Moved</title>") || data.includes("google.com/sorry")) {75 reject(new Error("CAPTCHA detected or request blocked by Google."));76 return;77 }78
79 resolve({80 data,81 headers: res.headers, // ✅ Capturing response headers82 });83 });84 });85
86 req.on("error", reject);87
88 if (postData) {89 req.write(postData);90 }91
92 req.end();93 });94
95 return response;96
97 } catch (error) {98 lastError = error;99 console.error(`❌ Request failed (attempt ${retryCount + 1}/${maxRetries}): ${error.message}`);100
101 // Only retry if it's a block or CAPTCHA102 if (error.message.includes("CAPTCHA") ||103 error.message.includes("sorry") ||104 error.message.includes("302 Moved") ||105 error.message.includes("429") ||106 error.message.includes("403")) {107
108 retryCount++;109
110 // Add exponential backoff111 const waitTime = 2000 * Math.pow(2, retryCount - 1);112 console.log(`⏱️ Waiting ${waitTime / 1000} seconds before retry...`);113 await new Promise(resolve => setTimeout(resolve, waitTime));114
115 } else {116 // For other errors, don't retry117 throw error;118 }119 }120 }121
122 // If we've exhausted all retries123 throw lastError || new Error('Maximum retries reached');124}
src/filterAdvertiser.js
1import { getDateRange } from './getDateRange.js';2import { parseAdvertiserUrl } from './parseAdvertiserUrl.js';3
4
5export const filterAdvertiser = async (kw, Use_URL_Filter, maxAdvertisers, maxDomains, RegionCode, format, platform, presetDate, startDate, endDate, limitResults,domainExists) => {6 const parsedData = parseAdvertiserUrl(kw);7 try {8 const filterData = Use_URL_Filter9 ? {10 advertiserId_OR_kw: parsedData.advertiserId_domain,11 maxDomains,12 maxAdvertisers,13 RegionCode: parsedData.RegionCode,14 format: parseInt(parsedData.format),15 dateRange: getDateRange(parsedData.presetDate, parsedData.startDate, parsedData.endDate),16 platform: parseInt(parsedData.platform),17 startDate: parsedData.startDate,18 endDate: parsedData.endDate,19 limitResults,20 domainExists : parsedData.domainExists21 }22 : {23 advertiserId_OR_kw: parsedData.advertiserId_domain,24 maxDomains,25 maxAdvertisers,26 RegionCode,27 format: parseInt(format),28 platform: parseInt(platform),29 dateRange: getDateRange(presetDate, startDate, endDate),30 startDate,31 endDate,32 limitResults,33 domainExists34 };35 console.log(Use_URL_Filter ? 'If Use_URL_Filter is true, override input filter:' : 'Use Actor.getInput() filtering:', filterData);36 return {37 advertiserId_OR_kw: parsedData.advertiserId_domain,38 maxAdvertisers,39 maxDomains,40 RegionCode: Use_URL_Filter ? parsedData.RegionCode : RegionCode,41 format: parseInt(Use_URL_Filter ? parsedData.format : format),42 dateRange: getDateRange(43 Use_URL_Filter ? parsedData.presetDate : presetDate,44 Use_URL_Filter ? parsedData.startDate : startDate,45 Use_URL_Filter ? parsedData.endDate : endDate46 ),47 platform: parseInt(Use_URL_Filter ? parsedData.platform : platform),48 limitResults,49 domainExists: parsedData.domainExists50 };51 } catch (error) {52 console.error(`❌ Error processing advertiser ID "${parsedData.advertiserId_domain}":`, error);53 }54};
src/getDateRange.js
1import dayjs from 'dayjs';2
3function validateCustomDates(Start_Date, End_Date) {4 const isValidDate = (date) => /^\d{4}-\d{2}-\d{2}$/.test(date);5
6 let fromDate = isValidDate(Start_Date) ? parseInt(Start_Date.replace(/-/g, ""), 10) : null;7 let toDate = isValidDate(End_Date) ? parseInt(End_Date.replace(/-/g, ""), 10) : null;8
9 if (fromDate && toDate) {10 if (fromDate > toDate) {11 console.error("❌ Error: Start_Date cannot be after End_Date.");12 return null; // Do not return error, let it fall back to default13 }14 return { fromDate, toDate, anyTime: false, dateRangeLabel: "Custom Range" };15 }16
17 if ((Start_Date && !isValidDate(Start_Date)) || (End_Date && !isValidDate(End_Date))) {18 console.error("❌ Error: Invalid date format. Expected YYYY-MM-DD. Falling back to default values.");19 return null; // Do not return error, let it fall back to default20 }21
22 return null;23}24
25export function getDateRange(days, Start_Date, End_Date) {26 let customDateRange = validateCustomDates(Start_Date, End_Date);27 if (customDateRange) return customDateRange;28
29 let yesterday = parseInt(dayjs().subtract(1, "day").format("YYYYMMDD"), 10);30 let defaultToDate = yesterday;31 let defaultFromDate;32 let anyTime = false;33 let dateRangeLabel = "";34
35 if (days === "0") {36 defaultFromDate = parseInt(dayjs().subtract(2, "day").format("YYYYMMDD"), 10);37 dateRangeLabel = "Today";38 } else if (days === "1") {39 defaultFromDate = parseInt(dayjs().subtract(2, "day").format("YYYYMMDD"), 10);40 dateRangeLabel = "Yesterday";41 } else if (days === "7") {42 defaultFromDate = parseInt(dayjs().subtract(8, "day").format("YYYYMMDD"), 10);43 dateRangeLabel = "Last 7 days";44 } else if (days === "30") {45 defaultFromDate = parseInt(dayjs().subtract(31, "day").format("YYYYMMDD"), 10);46 dateRangeLabel = "Last 30 days";47 } else if (days === "-1") {48 dateRangeLabel = "Any time";49 return { anyTime: true, dateRangeLabel };50 } else {51 return null;52 }53
54 return { fromDate: defaultFromDate, toDate: defaultToDate, anyTime, dateRangeLabel };55}
src/get_creative_details.js
1import https from "https";2import { processAds } from "./processAds.js"; // Import function3import { fetchWithProxyRotation } from "./fetchWithProxyRotation.js"; // Import function4/**5 * Function to get creative details by ID6 * @param {string} creativeId - The creative ID to fetch details for7 * @param {string} advertiserId - The advertiser ID associated with the creative8 * @param {number} regionCode - The region code (default is worldwide: 2012)9 * @returns {Promise<Object>} - The creative details10 */11export async function getCreativeDetails(creativeId, advertiserId, regionCode = 2012) {12 const requestPayload = {13 "1": advertiserId,14 "2": creativeId,15 "5": {16 "1": 1, // Page number17 "2": 30, // Page size18 "3": 201219 }20 };21
22 const postData = new URLSearchParams({23 "f.req": JSON.stringify(requestPayload)24 }).toString();25
26 const options = {27 hostname: "adstransparency.google.com",28 path: "/anji/_/rpc/LookupService/GetCreativeById?authuser=0",29 method: "POST",30 headers: {31 "Content-Type": "application/x-www-form-urlencoded",32 "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36",33 "Connection": "keep-alive",34 "Content-Length": Buffer.byteLength(postData),35 }36 };37
38 try {39 // Use our new proxy rotation function40 const response = await fetchWithProxyRotation(options, postData, 5); // Try up to 5 times41
42 try {43 const parsedResponse = JSON.parse(response.data);44 console.log(`✅ Successfully fetched creative ID: ${creativeId}`);45 return parsedResponse;46 } catch (error) {47 console.error("❌ JSON Parsing Error:", error);48 throw error;49 }50
51 } catch (error) {52 console.error(`❌ Failed to fetch creative ID ${creativeId} after multiple attempts:`, error.message);53 throw error;54 }55}56
57/**58 * Function to process each ad as soon as it's fetched59 * @param {Array<Object>} allResults - The array of results from searchForAds60 * @param {number} regionCode - The region code (default is worldwide: 2012)61 */62
63async function sleep(ms) {64 return new Promise(resolve => setTimeout(resolve, ms));65}66
67export async function processCreativeDetails(allResults, regionCode = 2012) {68 for (const result of allResults) {69 if (result["2"]) {70 try {71 const creativeDetail = await getCreativeDetails(result["2"], result["1"], regionCode);72 console.log(`✅ Processed creative: ${result["2"]}`);73
74 // Process each creative detail as soon as it's fetched75 processAds([creativeDetail]);76
77 // Optional delay to avoid detection (increase if needed)78 //await sleep(300); // 3 seconds delay79
80 } catch (error) {81 console.error(`❌ Failed to process creative: ${result["2"]}`, error);82 }83 }84 }85}
src/main.js
1const startTime = performance.now();2import { Actor } from 'apify';3import { Dataset } from 'crawlee';4import { getDateRange } from './getDateRange.js';5import { parseAdvertiserUrl } from './parseAdvertiserUrl.js';6import { searchForAdsList } from './search_for_an_ads.js';7import { searchForPoliticalAdsList } from './search_for_an_political_ads.js';8import { filterAdvertiser } from './filterAdvertiser.js';9import fs from 'fs';10
11await Actor.init();12
13// Load and parse input parameters14const input = await Actor.getInput() ?? {};15const {16 keyword_domain_advertiserid,17 maxAdvertisers,18 maxDomains,19 region,20 format,21 platform,22 presetDate,23 startDate,24 endDate,25 Use_URL_Filter,26 limitResults,27 isPolitical28} = input;29
30// Load regions.json and resolve region code31const regionMapping = JSON.parse(fs.readFileSync("src/regions.json", "utf-8"));32const regionEntry = regionMapping.regions.region.find(r => r["4"] === region);33const RegionCode = regionEntry ? regionEntry["1"] : undefined;34
35// Determine date range36const dateRange = getDateRange(presetDate, startDate, endDate);37
38// Function to detect URLs39const isGenericUrl = (kw) => /^https?:\/\//.test(kw);40const advertiserIdPattern = (kw) => /^AR\d+$/.test(kw);41
42const isAdvertiserUrl = /https:\/\/adstransparency\.google\.com\/advertiser\/(AR\d+)/;43const isDomainUrl = /[?&]domain=([^&]+)/;44const isTopic = /[?&]topic=([^&]+)/;45
46let domainExists47
48const processKeyword = async (kw) => {49 try {50 let filterData;51
52 if (kw.match(isTopic) || isPolitical && !kw.match(isAdvertiserUrl) && !kw.match(isDomainUrl)) {53 kw = kw.replace(/\s+/g, "+"); // Replace spaces with '+'54 console.log(`✅✅ Political : ${kw}`);55 const parsedData = parseAdvertiserUrl(kw);56
57 const filterData = {58 adveritserId_OR_kw: parsedData.advertiserId_domain,59 maxAdvertisers,60 RegionCode: parsedData.RegionCode,61 format: parseInt(parsedData.format),62 platform: parseInt(parsedData.platform),63 dateRange: getDateRange(parsedData.presetDate, parsedData.startDate, parsedData.endDate),64 startDate: parsedData.startDate,65 endDate: parsedData.endDate,66 limitResults,67 }68 console.log("Filter Data:", JSON.stringify(filterData, null, 2));69 let adsData = await searchForPoliticalAdsList(70 parsedData.advertiserId_domain,71 maxAdvertisers,72 parsedData.RegionCode,73 parseInt(parsedData.format),74 getDateRange(parsedData.presetDate, parsedData.startDate, parsedData.endDate),75 parseInt(parsedData.platform),76 limitResults77 );78
79 await Dataset.pushData({ advertiserId_OR_kw: kw, adsData });80
81 }82 else if (kw.match(isAdvertiserUrl) || kw.match(isDomainUrl)) {83 const advertiserMatch = kw.match(isAdvertiserUrl);84 const domainMatch = kw.match(isDomainUrl);85 const parsedData = parseAdvertiserUrl(kw);86
87 if (advertiserMatch && domainMatch) {88 console.error(`❌ Invalid URL: Cannot contain both advertiser ID and domain -> ${kw}`);89 return; // Skip processing this invalid URL90 }91 if (advertiserMatch) {92 // Advertiser ID detected93 if (!parsedData) throw new Error("Invalid advertiser URL");94 await filterAdvertiser(kw, Use_URL_Filter, maxAdvertisers, maxDomains, RegionCode, format, platform, presetDate, startDate, endDate, limitResults, domainExists);95 } else if (domainMatch) {96 // Domain detected97 console.log('🔹 Processing Domain:', parsedData.advertiserId_domain,);98 let Filter_Advertiser = await filterAdvertiser(kw, Use_URL_Filter, maxAdvertisers, maxDomains, RegionCode, format, platform, presetDate, startDate, endDate, limitResults, domainExists);99 //console.log(`Filter_Advertiser ${JSON.stringify(Filter_Advertiser, null, 2)}`);100 let adsData = await searchForAdsList(101 parsedData.advertiserId_domain,102 maxAdvertisers,103 maxDomains,104 Filter_Advertiser.RegionCode,105 Filter_Advertiser.format,106 Filter_Advertiser.dateRange,107 Filter_Advertiser.platform,108 limitResults,109 Filter_Advertiser.domainExists110 );111
112 //console.log(`adsData ${JSON.stringify(adsData, null, 2)}`);113
114 }115 }116 else {117 // Handle generic keywords (not URLs)118 if (isGenericUrl(kw)) console.warn(`⚠️ Detected a generic URL: ${kw}.\nTreating as a regular keyword.`);119 kw = kw.replace(/\s+/g, "+"); // Replace spaces with '+'120 if (advertiserIdPattern(kw)) console.log(`✅ Advertiser ID: ${kw}`);121 filterData = {122 advertiserId_OR_kw: kw,123 maxDomains,124 maxAdvertisers,125 RegionCode,126 format: parseInt(format),127 platform: parseInt(platform),128 dateRange,129 startDate,130 endDate131 };132
133 let adsData = await searchForAdsList(134 kw,135 maxAdvertisers,136 maxDomains,137 RegionCode,138 parseInt(format),139 getDateRange(presetDate, startDate, endDate),140 parseInt(platform),141 limitResults142 );143 //await Dataset.pushData({ advertiserId_OR_kw0: kw, adsData });144 }145 } catch (error) {146 console.error(`❌ Error processing "${kw}":`, error);147 }148};149
150
151// Process all queries in parallel152await Promise.all(keyword_domain_advertiserid.map(processKeyword));153
154const endTime = performance.now();155console.log(`⏳ Execution time: ${(endTime - startTime).toFixed(2)} ms`);156await Actor.exit();
src/parseAdvertiserUrl.js
1import fs from "fs";2
3export function parseAdvertiserUrl(url) {4 const advertiserPattern = /https:\/\/adstransparency\.google\.com\/advertiser\/(AR\d+)/;5 const match = url.match(advertiserPattern);6
7 const urlParams = new URL(url).searchParams;8 const advertiserId = match ? match[1] : null;9 const domain = urlParams.has("domain") ? urlParams.get("domain") : null;10
11 // Ensure that only one of advertiserId or domain exists12 if (advertiserId && domain) {13 return null; // Invalid URL structure14 }15
16 // Determine advertiserId_domain17 const advertiserId_domain = advertiserId || domain || null;18
19 // Extract query parameters20 const region = urlParams.get("region") || null;21 const format = urlParams.get("format") || null;22 const presetDate = urlParams.get("preset-date")?.replace(/ /g, "+") || null;23 const startDate = urlParams.get("start-date") || null;24 const endDate = urlParams.get("end-date") || null;25 const platform = urlParams.get("platform") || null;26
27 // Load regions.json and resolve region code28 const regionMapping = JSON.parse(fs.readFileSync("src/regions.json", "utf-8"));29 const regionEntry = regionMapping.regions.region.find(r => r["3"] === region);30 const RegionCode = regionEntry ? regionEntry["1"] : undefined;31
32 // Platform Mapping33 const platformMap = {34 "MAPS": "2",35 "PLAY": "1",36 "SHOPPING": "4",37 "SEARCH": "3",38 "YOUTUBE": "5"39 };40
41 // Format Mapping42 const formatMap = {43 "VIDEO": "3",44 "TEXT": "1",45 "IMAGE": "2"46 };47
48 // Preset Date Mapping49 const presetDateMap = {50 "Today": "0",51 "Yesterday": "1",52 "Last+7+days": "7",53 "Last+30+days": "30"54 };55
56 return {57 advertiserId_domain,58 domainExists: !!domain, // ✅ Returns true if domain exists, false otherwise59 RegionCode,60 format: formatMap[format] || "0", // Default to "0" (All formats)61 presetDate: presetDateMap[presetDate] || "-1", // Default to "-1" (Any Time)62 startDate,63 endDate,64 platform: platformMap[platform] || "0" // Default to "0" (All platforms)65 };66}
src/processAds.js
1import fs from "fs";2import { Dataset } from 'crawlee';3
4// Load the region mapping file5let regionMapping;6try {7 regionMapping = JSON.parse(fs.readFileSync("src/regions.json", "utf-8"));8} catch (error) {9 console.error("Error loading region mapping file:", error);10 process.exit(1);11}12
13// Platform mapping for `"8"` field (Google services)14const platformMapping = {15 1: "Google Play",16 2: "Google Maps",17 3: "Google Search",18 4: "Google Shopping",19 5: "YouTube"20};21
22// Format mapping for `"1": {"8": ...}`23const formatMapping = {24 1: "TEXT",25 2: "IMAGE",26 3: "VIDEO"27};28
29// Convert region codes to readable names30function getRegionName(regionCode) {31 const regionEntry = regionMapping.regions.region.find(r => r["1"] === regionCode);32 return regionEntry33 ? { regionCode: regionEntry["3"], regionName: regionEntry["4"] } // "3" = Country Code, "4" = Country Name34 : { regionCode: "Unknown", regionName: "N/A" };35}36
37export async function processAds(allResults) {38 if (!allResults || allResults.length === 0) {39 console.log("No ad data available to process.");40 return [];41 }42
43 const formattedAds = allResults.map(ad => {44 const rawRegions = ad?.["1"]?.["17"];45
46 const regionStats = Array.isArray(rawRegions)47 ? rawRegions.map(region => {48 if (!region || typeof region !== "object") return {}; // Prevent errors on missing data49
50 const { regionCode, regionName } = getRegionName(region["1"]);51
52 // Extract platform stats from "8"53 const platformStats = Array.isArray(region["8"])54 ? region["8"].map(platform => ({55 surfaceName: platformMapping[platform["1"]] || "Unknown Platform",56 impressions: {57 lowerBound: platform["2"] ?? 0,58 upperBound: platform["3"] ?? 059 }60 }))61 : [];62
63 return {64 regionNumber: region["1"] ?? "Unknown",65 regionCode,66 regionName,67 firstShown: region.hasOwnProperty("4") ? region["4"] : "Unknown",68 lastShown: region.hasOwnProperty("5") ? region["5"] : "Unknown",69 impressions: {70 lowerBound: region["2"] ?? 0,71 upperBound: region["3"] ?? 072 },73 platformStats74 };75 })76 : [];77
78 // Get format from `ad["1"]["8"]`79 const formatType = formatMapping[ad?.["1"]?.["8"]] || "UNKNOWN";80
81 // Extract preview URLs from both possible locations82 const previewUrls = Array.isArray(ad?.["1"]?.["5"])83 ? ad["1"]["5"].map(item =>84 item?.["1"]?.["4"] ?? // Case 1: "1": { "4": "URL" }85 item?.["3"]?.["2"] ?? // Case 2: "3": { "2": "URL" }86 "Unknown"87 )88 : [];89
90 // Construct Ad Transparency URL91 const advertiserId = ad?.["1"]?.["1"] ?? "Unknown";92 const creativeId = ad?.["1"]?.["2"] ?? "Unknown";93 const adTransparencyUrl =94 advertiserId !== "Unknown" && creativeId !== "Unknown"95 ? `https://adstransparency.google.com/advertiser/${advertiserId}/creative/${creativeId}?region=anywhere`96 : "Unknown";97
98 return {99 advertiserId,100 creativeId,101 creativeRegions: [...new Set(regionStats.map(r => r.regionName))], // Unique region names102 adTransparencyUrl, // Added ad transparency link103 previewUrls, // Now properly extracting URLs104 format: formatType, // Updated format assignment105 regionStats106 };107 });108
109 let advertiserId = formattedAds[0].advertiserId110 let creativeId = formattedAds[0].creativeId111 let creativeRegions = formattedAds[0].creativeRegions112 let adTransparencyUrl = formattedAds[0].adTransparencyUrl113 let previewUrls = formattedAds[0].previewUrls114 let format = formattedAds[0].format115 let regionStats = formattedAds[0].regionStats116
117 console.log(`✅ Processed ${formattedAds.length} ads.`);118 return await Dataset.pushData({119 advertiserId,120 creativeId,121 creativeRegions,122 adTransparencyUrl,123 previewUrls,124 format,125 regionStats126 });127}
src/regions.json
{ "regions": { "region": [ { "1": 2008, "3": "AL", "4": "Albania", "8": { "1": 411533320, "2": 201683310 }, "10": 1 }, { "1": 2012, "3": "DZ", "4": "Algeria", "8": { "1": 280338860, "2": 16596260 }, "10": 1 }, { "1": 2016, "3": "AS", "4": "American Samoa", "8": { "1": -142709720, "2": -1701322170 }, "10": 1 }, { "1": 2020, "3": "AD", "4": "Andorra", "8": { "1": 425062850, "2": 15218010 }, "10": 1 }, { "1": 2024, "3": "AO", "4": "Angola", "8": { "1": -112026920, "2": 178738870 }, "10": 1 }, { "1": 2010, "3": "AQ", "4": "Antarctica", "8": { "1": -752509730, "2": -713890 }, "10": 1 }, { "1": 2028, "3": "AG", "4": "Antigua and Barbuda", "8": { "1": 170608160, "2": -617964280 }, "10": 1 }, { "1": 2032, "3": "AR", "4": "Argentina", "8": { "1": -384160970, "2": -636166720 }, "10": 1 }, { "1": 2051, "3": "AM", "4": "Armenia", "8": { "1": 400690990, "2": 450381890 }, "10": 1 }, { "1": 2036, "3": "AU", "4": "Australia", "8": { "1": -252743980, "2": 1337751360 }, "10": 1 }, { "1": 2040, "3": "AT", "4": "Austria", "5": "Austria", "8": { "1": 475162310, "2": 145500720 }, "10": 1 }, { "1": 2031, "3": "AZ", "4": "Azerbaijan", "8": { "1": 401431050, "2": 475769270 }, "10": 1 }, { "1": 2048, "3": "BH", "4": "Bahrain", "8": { "1": 260667000, "2": 505577000 }, "10": 1 }, { "1": 2050, "3": "BD", "4": "Bangladesh", "8": { "1": 236849940, "2": 903563310 }, "10": 1 }, { "1": 2052, "3": "BB", "4": "Barbados", "8": { "1": 131938870, "2": -595431980 }, "10": 1 }, { "1": 2112, "3": "BY", "4": "Belarus", "8": { "1": 537098070, "2": 279533890 }, "10": 1 }, { "1": 2056, "3": "BE", "4": "Belgium", "5": "Belgium", "8": { "1": 505038870, "2": 44699360 }, "10": 1 }, { "1": 2084, "3": "BZ", "4": "Belize", "8": { "1": 171898770, "2": -884976500 }, "10": 1 }, { "1": 2204, "3": "BJ", "4": "Benin", "8": { "1": 93076900, "2": 23158340 }, "10": 1 }, { "1": 2064, "3": "BT", "4": "Bhutan", "8": { "1": 275141620, "2": 904336010 }, "10": 1 }, { "1": 2068, "3": "BO", "4": "Bolivia", "8": { "1": -162901540, "2": -635886530 }, "10": 1 }, { "1": 2070, "3": "BA", "4": "Bosnia and Herzegovina", "8": { "1": 439158860, "2": 176790760 }, "10": 1 }, { "1": 2072, "3": "BW", "4": "Botswana", "8": { "1": -223284740, "2": 246848660 }, "10": 1 }, { "1": 2076, "3": "BR", "4": "Brazil", "8": { "1": -142350040, "2": -519252800 }, "10": 1 }, { "1": 2096, "3": "BN", "4": "Brunei", "8": { "1": 45352770, "2": 1147276690 }, "10": 1 }, { "1": 2100, "3": "BG", "4": "Bulgaria", "8": { "1": 427338830, "2": 254858300 }, "10": 1 }, { "1": 2854, "3": "BF", "4": "Burkina Faso", "8": { "1": 122383330, "2": -15615930 }, "10": 1 }, { "1": 2108, "3": "BI", "4": "Burundi", "8": { "1": -33730560, "2": 299188860 }, "10": 1 }, { "1": 2116, "3": "KH", "4": "Cambodia", "8": { "1": 125656790, "2": 1049909630 }, "10": 1 }, { "1": 2120, "3": "CM", "4": "Cameroon", "8": { "1": 73697220, "2": 123547220 }, "10": 1 }, { "1": 2124, "3": "CA", "4": "Canada", "5": "Canada", "8": { "1": 561303660, "2": -1063467710 }, "10": 1 }, { "1": 2132, "3": "CV", "4": "Cabo Verde", "5": "Cabo Verde", "8": { "1": 165388000, "2": -230418000 }, "10": 1 }, { "1": 2535, "3": "BQ", "4": "Caribbean Netherlands", "8": { "1": 121783611, "2": -682385339 }, "10": 1 }, { "1": 2140, "3": "CF", "4": "Central African Republic", "8": { "1": 66111110, "2": 209394440 }, "10": 1 }, { "1": 2148, "3": "TD", "4": "Chad", "8": { "1": 154541660, "2": 187322070 }, "10": 1 }, { "1": 2152, "3": "CL", "4": "Chile", "8": { "1": -356751470, "2": -715429690 }, "10": 1 }, { "1": 2156, "3": "CN", "4": "China", "8": { "1": 358616600, "2": 1041953970 }, "10": 1 }, { "1": 2162, "3": "CX", "4": "Christmas Island", "8": { "1": -104475250, "2": 1056904490 }, "10": 1 }, { "1": 2166, "3": "CC", "4": "Cocos (Keeling) Islands", "8": { "1": -121641650, "2": 968709560 }, "10": 1 }, { "1": 2170, "3": "CO", "4": "Colombia", "8": { "1": 45708680, "2": -742973330 }, "10": 1 }, { "1": 2174, "3": "KM", "4": "Comoros", "8": { "1": -116455000, "2": 433333000 }, "10": 1 }, { "1": 2184, "3": "CK", "4": "Cook Islands", "8": { "1": -212367360, "2": -1597776710 }, "10": 1 }, { "1": 2188, "3": "CR", "4": "Costa Rica", "8": { "1": 97489170, "2": -837534280 }, "10": 1 }, { "1": 2384, "3": "CI", "4": "Cote d'Ivoire", "8": { "1": 75399890, "2": -55470800 }, "10": 1 }, { "1": 2191, "3": "HR", "4": "Croatia", "8": { "1": 451000000, "2": 152000000 }, "10": 1 }, { "1": 2531, "3": "CW", "4": "Curacao", "8": { "1": 121695700, "2": -689900200 }, "10": 1 }, { "1": 2196, "3": "CY", "4": "Cyprus", "8": { "1": 351264130, "2": 334298590 }, "10": 1 }, { "1": 2203, "3": "CZ", "4": "Czechia", "5": "Czechia", "8": { "1": 498174920, "2": 154729620 }, "10": 1 }, { "1": 2180, "3": "CD", "4": "Democratic Republic of the Congo", "8": { "1": -40383330, "2": 217586640 }, "10": 1 }, { "1": 2208, "3": "DK", "4": "Denmark", "5": "Denmark", "8": { "1": 562639200, "2": 95017850 }, "10": 1 }, { "1": 2262, "3": "DJ", "4": "Djibouti", "8": { "1": 118251380, "2": 425902750 }, "10": 1 }, { "1": 2212, "3": "DM", "4": "Dominica", "8": { "1": 154149990, "2": -613709760 }, "10": 1 }, { "1": 2214, "3": "DO", "4": "Dominican Republic", "8": { "1": 187356930, "2": -701626510 }, "10": 1 }, { "1": 2218, "3": "EC", "4": "Ecuador", "8": { "1": -18312390, "2": -781834060 }, "10": 1 }, { "1": 2818, "3": "EG", "4": "Egypt", "8": { "1": 268205530, "2": 308024980 }, "10": 1 }, { "1": 2222, "3": "SV", "4": "El Salvador", "8": { "1": 137941850, "2": -888965300 }, "10": 1 }, { "1": 2226, "3": "GQ", "4": "Equatorial Guinea", "8": { "1": 16508010, "2": 102678950 }, "10": 1 }, { "1": 2232, "3": "ER", "4": "Eritrea", "8": { "1": 151793840, "2": 397823340 }, "10": 1 }, { "1": 2233, "3": "EE", "4": "Estonia", "8": { "1": 585952720, "2": 250136070 }, "10": 1 }, { "1": 2748, "3": "SZ", "4": "Eswatini", "5": "Eswatini", "8": { "1": -265225030, "2": 314658660 }, "10": 1 }, { "1": 2231, "3": "ET", "4": "Ethiopia", "8": { "1": 91450000, "2": 404896730 }, "10": 1 }, { "1": 2583, "3": "FM", "4": "Micronesia", "8": { "1": 74255540, "2": 1505508120 }, "10": 1 }, { "1": 2242, "3": "FJ", "4": "Fiji", "8": { "1": -177133710, "2": 1780650320 }, "10": 1 }, { "1": 2246, "3": "FI", "4": "Finland", "8": { "1": 619241100, "2": 257481510 }, "10": 1 }, { "1": 2250, "3": "FR", "4": "France", "8": { "1": 462276380, "2": 22137490 }, "10": 1 }, { "1": 2258, "3": "PF", "4": "French Polynesia", "8": { "1": -176797420, "2": -1494068430 }, "10": 1 }, { "1": 2260, "3": "TF", "4": "French Southern and Antarctic Lands", "8": { "1": -492803660, "2": 693485570 }, "10": 1 }, { "1": 2266, "3": "GA", "4": "Gabon", "8": { "1": -8036890, "2": 116094440 }, "10": 1 }, { "1": 2268, "3": "GE", "4": "Georgia", "8": { "1": 423154070, "2": 433568920 }, "10": 1 }, { "1": 2276, "3": "DE", "4": "Germany", "5": "Germany", "8": { "1": 511656910, "2": 104515260 }, "10": 1 }, { "1": 2288, "3": "GH", "4": "Ghana", "8": { "1": 79465270, "2": -10231940 }, "10": 1 }, { "1": 2300, "3": "GR", "4": "Greece", "8": { "1": 390742080, "2": 218243120 }, "10": 1 }, { "1": 2308, "3": "GD", "4": "Grenada", "8": { "1": 121165000, "2": -616790000 }, "10": 1 }, { "1": 2316, "3": "GU", "4": "Guam", "8": { "1": 133823791, "2": 1446972774 }, "10": 1 }, { "1": 2320, "3": "GT", "4": "Guatemala", "8": { "1": 157834710, "2": -902307590 }, "10": 1 }, { "1": 2831, "3": "GG", "4": "Guernsey", "8": { "1": 494481808, "2": -25894685 }, "10": 1 }, { "1": 2324, "3": "GN", "4": "Guinea", "8": { "1": 99455870, "2": -96966450 }, "10": 1 }, { "1": 2624, "3": "GW", "4": "Guinea-Bissau", "8": { "1": 118037490, "2": -151804130 }, "10": 1 }, { "1": 2328, "3": "GY", "4": "Guyana", "8": { "1": 48604160, "2": -589301800 }, "10": 1 }, { "1": 2332, "3": "HT", "4": "Haiti", "8": { "1": 189711870, "2": -722852150 }, "10": 1 }, { "1": 2334, "3": "HM", "4": "Heard Island and McDonald Islands", "8": { "1": -530818100, "2": 735041580 }, "10": 1 }, { "1": 2340, "3": "HN", "4": "Honduras", "8": { "1": 151999990, "2": -862419050 }, "10": 1 }, { "1": 2348, "3": "HU", "4": "Hungary", "8": { "1": 471624940, "2": 195033040 }, "10": 1 }, { "1": 2352, "3": "IS", "4": "Iceland", "8": { "1": 649630510, "2": -190208350 }, "10": 1 }, { "1": 2356, "3": "IN", "4": "India", "8": { "1": 205936840, "2": 789628800 }, "10": 1 }, { "1": 2360, "3": "ID", "4": "Indonesia", "8": { "1": -7892750, "2": 1139213270 }, "10": 1 }, { "1": 2368, "3": "IQ", "4": "Iraq", "8": { "1": 332231910, "2": 436792910 }, "10": 1 }, { "1": 2372, "3": "IE", "4": "Ireland", "8": { "1": 534129100, "2": -82438900 }, "10": 1 }, { "1": 2376, "3": "IL", "4": "Israel", "8": { "1": 310460510, "2": 348516120 }, "10": 1 }, { "1": 2380, "3": "IT", "4": "Italy", "8": { "1": 418719400, "2": 125673800 }, "10": 1 }, { "1": 2388, "3": "JM", "4": "Jamaica", "8": { "1": 181095810, "2": -772975080 }, "10": 1 }, { "1": 2392, "3": "JP", "4": "Japan", "8": { "1": 362048240, "2": 1382529240 }, "10": 1 }, { "1": 2832, "3": "JE", "4": "Jersey", "8": { "1": 492137711, "2": -21357662 }, "10": 1 }, { "1": 2400, "3": "JO", "4": "Jordan", "8": { "1": 305851640, "2": 362384140 }, "10": 1 }, { "1": 2398, "3": "KZ", "4": "Kazakhstan", "8": { "1": 480195730, "2": 669236840 }, "10": 1 }, { "1": 2404, "3": "KE", "4": "Kenya", "8": { "1": -235590, "2": 379061930 }, "10": 1 }, { "1": 2296, "3": "KI", "4": "Kiribati", "8": { "1": 14421300, "2": 1729829763 }, "10": 1 }, { "1": 2414, "3": "KW", "4": "Kuwait", "8": { "1": 293116600, "2": 474817660 }, "10": 1 }, { "1": 2417, "3": "KG", "4": "Kyrgyzstan", "8": { "1": 412043800, "2": 747660980 }, "10": 1 }, { "1": 2418, "3": "LA", "4": "Laos", "8": { "1": 198562700, "2": 1024954960 }, "10": 1 }, { "1": 2428, "3": "LV", "4": "Latvia", "8": { "1": 568796350, "2": 246031890 }, "10": 1 }, { "1": 2422, "3": "LB", "4": "Lebanon", "8": { "1": 338547210, "2": 358622850 }, "10": 1 }, { "1": 2426, "3": "LS", "4": "Lesotho", "8": { "1": -296099880, "2": 282336080 }, "10": 1 }, { "1": 2430, "3": "LR", "4": "Liberia", "8": { "1": 64280550, "2": -94294990 }, "10": 1 }, { "1": 2434, "3": "LY", "4": "Libya", "8": { "1": 263351000, "2": 172283310 }, "10": 1 }, { "1": 2438, "3": "LI", "4": "Liechtenstein", "8": { "1": 471410392, "2": 95209350 }, "10": 1 }, { "1": 2440, "3": "LT", "4": "Lithuania", "8": { "1": 551694380, "2": 238812750 }, "10": 1 }, { "1": 2442, "3": "LU", "4": "Luxembourg", "5": "Luxembourg", "8": { "1": 498152730, "2": 61295830 }, "10": 1 }, { "1": 2450, "3": "MG", "4": "Madagascar", "8": { "1": -187669470, "2": 468691070 }, "10": 1 }, { "1": 2454, "3": "MW", "4": "Malawi", "8": { "1": -132543080, "2": 343015250 }, "10": 1 }, { "1": 2458, "3": "MY", "4": "Malaysia", "8": { "1": 42104840, "2": 1019757660 }, "10": 1 }, { "1": 2462, "3": "MV", "4": "Maldives", "8": { "1": 32027780, "2": 732206800 }, "10": 1 }, { "1": 2470, "3": "MT", "4": "Malta", "8": { "1": 359374960, "2": 143754160 }, "10": 1 }, { "1": 2466, "3": "ML", "4": "Mali", "8": { "1": 175706920, "2": -39961660 }, "10": 1 }, { "1": 2584, "3": "MH", "4": "Marshall Islands", "8": { "1": 71314740, "2": 1711844780 }, "10": 1 }, { "1": 2478, "3": "MR", "4": "Mauritania", "8": { "1": 210078900, "2": -109408350 }, "10": 1 }, { "1": 2480, "3": "MU", "4": "Mauritius", "8": { "1": -203484040, "2": 575521520 }, "10": 1 }, { "1": 2484, "3": "MX", "4": "Mexico", "8": { "1": 236345010, "2": -1025527840 }, "10": 1 }, { "1": 2498, "3": "MD", "4": "Moldova", "8": { "1": 474116310, "2": 283698850 }, "10": 1 }, { "1": 2492, "3": "MC", "4": "Monaco", "8": { "1": 437384176, "2": 74246158 }, "10": 1 }, { "1": 2496, "3": "MN", "4": "Mongolia", "8": { "1": 468624960, "2": 1038466560 }, "10": 1 }, { "1": 2499, "3": "ME", "4": "Montenegro", "8": { "1": 427086780, "2": 193743900 }, "10": 1 }, { "1": 2504, "3": "MA", "4": "Morocco", "8": { "1": 317917020, "2": -70926200 }, "10": 1 }, { "1": 2508, "3": "MZ", "4": "Mozambique", "8": { "1": -186656950, "2": 355295620 }, "10": 1 }, { "1": 2104, "3": "MM", "4": "Myanmar (Burma)", "8": { "1": 219162210, "2": 959559740 }, "10": 1 }, { "1": 2516, "3": "NA", "4": "Namibia", "8": { "1": -229576400, "2": 184904100 }, "10": 1 }, { "1": 2520, "3": "NR", "4": "Nauru", "8": { "1": -5227780, "2": 1669315030 }, "10": 1 }, { "1": 2524, "3": "NP", "4": "Nepal", "8": { "1": 283948570, "2": 841240080 }, "10": 1 }, { "1": 2528, "3": "NL", "4": "Netherlands", "5": "Netherlands", "8": { "1": 521326330, "2": 52912660 }, "10": 1 }, { "1": 2540, "3": "NC", "4": "New Caledonia", "8": { "1": -209043050, "2": 1656180420 }, "10": 1 }, { "1": 2554, "3": "NZ", "4": "New Zealand", "8": { "1": -409005570, "2": 1748859710 }, "10": 1 }, { "1": 2558, "3": "NI", "4": "Nicaragua", "8": { "1": 128654160, "2": -852072290 }, "10": 1 }, { "1": 2562, "3": "NE", "4": "Niger", "8": { "1": 176077890, "2": 80816660 }, "10": 1 }, { "1": 2566, "3": "NG", "4": "Nigeria", "8": { "1": 90819990, "2": 86752770 }, "10": 1 }, { "1": 2570, "3": "NU", "4": "Niue", "8": { "1": -190544450, "2": -1698672330 }, "10": 1 }, { "1": 2574, "3": "NF", "4": "Norfolk Island", "8": { "1": -290408350, "2": 1679547120 }, "10": 1 }, { "1": 2807, "3": "MK", "4": "North Macedonia", "5": "North Macedonia", "8": { "1": 416086350, "2": 217452750 }, "10": 1 }, { "1": 2580, "3": "MP", "4": "Northern Mariana Islands", "8": { "1": 150979000, "2": 1456739000 }, "10": 1 }, { "1": 2578, "3": "NO", "4": "Norway", "8": { "1": 604720240, "2": 84689460 }, "10": 1 }, { "1": 2512, "3": "OM", "4": "Oman", "8": { "1": 214735329, "2": 559754130 }, "10": 1 }, { "1": 2586, "3": "PK", "4": "Pakistan", "8": { "1": 303753210, "2": 693451160 }, "10": 1 }, { "1": 2585, "3": "PW", "4": "Palau", "8": { "1": 75149800, "2": 1345825200 }, "10": 1 }, { "1": 2591, "3": "PA", "4": "Panama", "8": { "1": 85379810, "2": -807821270 }, "10": 1 }, { "1": 2598, "3": "PG", "4": "Papua New Guinea", "8": { "1": -63149930, "2": 1439555500 }, "10": 1 }, { "1": 2600, "3": "PY", "4": "Paraguay", "8": { "1": -234425030, "2": -584438320 }, "10": 1 }, { "1": 2604, "3": "PE", "4": "Peru", "8": { "1": -91899670, "2": -750151520 }, "10": 1 }, { "1": 2608, "3": "PH", "4": "Philippines", "8": { "1": 128797210, "2": 1217740170 }, "10": 1 }, { "1": 2612, "3": "PN", "4": "Pitcairn Islands", "8": { "1": -243767537, "2": -1283242376 }, "10": 1 }, { "1": 2616, "3": "PL", "4": "Poland", "8": { "1": 519194380, "2": 191451360 }, "10": 1 }, { "1": 2620, "3": "PT", "4": "Portugal", "8": { "1": 393998720, "2": -82244540 }, "10": 1 }, { "1": 2634, "3": "QA", "4": "Qatar", "8": { "1": 253548260, "2": 511838840 }, "10": 1 }, { "1": 2178, "3": "CG", "4": "Republic of the Congo", "8": { "1": -2280210, "2": 158276590 }, "10": 1 }, { "1": 2642, "3": "RO", "4": "Romania", "8": { "1": 459431610, "2": 249667600 }, "10": 1 }, { "1": 2646, "3": "RW", "4": "Rwanda", "8": { "1": -19402780, "2": 298738880 }, "10": 1 }, { "1": 2654, "3": "SH", "4": "Saint Helena, Ascension and Tristan da Cunha", "5": "St Helena, Ascension and Tristan da Cunha", "8": { "1": -159583317, "2": -57019989 }, "10": 1 }, { "1": 2659, "3": "KN", "4": "Saint Kitts and Nevis", "5": "St Kitts & Nevis", "8": { "1": 173578220, "2": -627829980 }, "10": 1 }, { "1": 2662, "3": "LC", "4": "Saint Lucia", "5": "St Lucia", "8": { "1": 139094440, "2": -609788930 }, "10": 1 }, { "1": 2666, "3": "PM", "4": "Saint Pierre and Miquelon", "5": "St Pierre and Miquelon", "8": { "1": 468852000, "2": -563159000 }, "10": 1 }, { "1": 2670, "3": "VC", "4": "Saint Vincent and the Grenadines", "5": "St Vincent and the Grenadines", "8": { "1": 129843050, "2": -612872280 }, "10": 1 }, { "1": 2882, "3": "WS", "4": "Samoa", "8": { "1": -137590290, "2": -1721046290 }, "10": 1 }, { "1": 2674, "3": "SM", "4": "San Marino", "8": { "1": 439423600, "2": 124577770 }, "10": 1 }, { "1": 2678, "3": "ST", "4": "Sao Tome and Principe", "8": { "1": 1863600, "2": 66130810 }, "10": 1 }, { "1": 2682, "3": "SA", "4": "Saudi Arabia", "8": { "1": 238859420, "2": 450791620 }, "10": 1 }, { "1": 2686, "3": "SN", "4": "Senegal", "8": { "1": 144974010, "2": -144523620 }, "10": 1 }, { "1": 2690, "3": "SC", "4": "Seychelles", "8": { "1": -46795740, "2": 554919770 }, "10": 1 }, { "1": 2694, "3": "SL", "4": "Sierra Leone", "8": { "1": 84605550, "2": -117798890 }, "10": 1 }, { "1": 2702, "3": "SG", "4": "Singapore", "8": { "1": 13520830, "2": 1038198360 }, "10": 1 }, { "1": 2534, "3": "SX", "4": "Sint Maarten", "8": { "1": 180424800, "2": -630548300 }, "10": 1 }, { "1": 2703, "3": "SK", "4": "Slovakia", "5": "Slovakia", "8": { "1": 486690260, "2": 196990240 }, "10": 1 }, { "1": 2705, "3": "SI", "4": "Slovenia", "8": { "1": 461512410, "2": 149954630 }, "10": 1 }, { "1": 2090, "3": "SB", "4": "Solomon Islands", "8": { "1": -96457100, "2": 1601561940 }, "10": 1 }, { "1": 2706, "3": "SO", "4": "Somalia", "8": { "1": 51521490, "2": 461996160 }, "10": 1 }, { "1": 2710, "3": "ZA", "4": "South Africa", "8": { "1": -305594820, "2": 229375060 }, "10": 1 }, { "1": 2239, "3": "GS", "4": "South Georgia and the South Sandwich Islands", "8": { "1": -544295790, "2": -365879090 }, "10": 1 }, { "1": 2410, "3": "KR", "4": "South Korea", "8": { "1": 359077570, "2": 1277669220 }, "10": 1 }, { "1": 2724, "3": "ES", "4": "Spain", "8": { "1": 404636670, "2": -37492200 }, "10": 1 }, { "1": 2144, "3": "LK", "4": "Sri Lanka", "8": { "1": 78730540, "2": 807717970 }, "10": 1 }, { "1": 2740, "3": "SR", "4": "Suriname", "8": { "1": 39193050, "2": -560277830 }, "10": 1 }, { "1": 2756, "3": "CH", "4": "Switzerland", "8": { "1": 468181880, "2": 82275120 }, "10": 1 }, { "1": 2752, "3": "SE", "4": "Sweden", "8": { "1": 601281610, "2": 186435010 }, "10": 1 }, { "1": 2762, "3": "TJ", "4": "Tajikistan", "8": { "1": 388610340, "2": 712760930 }, "10": 1 }, { "1": 2834, "3": "TZ", "4": "Tanzania", "8": { "1": -63690280, "2": 348888220 }, "10": 1 }, { "1": 2764, "3": "TH", "4": "Thailand", "8": { "1": 158700320, "2": 1009925410 }, "10": 1 }, { "1": 2044, "3": "BS", "4": "The Bahamas", "8": { "1": 250342800, "2": -773962800 }, "10": 1 }, { "1": 2270, "3": "GM", "4": "The Gambia", "8": { "1": 134431820, "2": -153101390 }, "10": 1 }, { "1": 2626, "3": "TL", "4": "Timor-Leste", "8": { "1": -88742170, "2": 1257275390 }, "10": 1 }, { "1": 2768, "3": "TG", "4": "Togo", "8": { "1": 86195430, "2": 8247820 }, "10": 1 }, { "1": 2772, "3": "TK", "4": "Tokelau", "8": { "1": -92002000, "2": -1718484000 }, "10": 1 }, { "1": 2776, "3": "TO", "4": "Tonga", "8": { "1": -211789860, "2": -1751982420 }, "10": 1 }, { "1": 2780, "3": "TT", "4": "Trinidad and Tobago", "8": { "1": 106918030, "2": -612225030 }, "10": 1 }, { "1": 2788, "3": "TN", "4": "Tunisia", "8": { "1": 338869170, "2": 95374990 }, "10": 1 }, { "1": 2792, "3": "TR", "4": "Turkiye", "5": "Türkiye", "8": { "1": 389637450, "2": 352433220 }, "10": 1 }, { "1": 2795, "3": "TM", "4": "Turkmenistan", "8": { "1": 389697190, "2": 595562780 }, "10": 1 }, { "1": 2798, "3": "TV", "4": "Tuvalu", "8": { "1": -71095350, "2": 1776493300 }, "10": 1 }, { "1": 2800, "3": "UG", "4": "Uganda", "8": { "1": 13733330, "2": 322902750 }, "10": 1 }, { "1": 2804, "3": "UA", "4": "Ukraine", "8": { "1": 483794330, "2": 311655800 }, "10": 1 }, { "1": 2784, "3": "AE", "4": "United Arab Emirates", "8": { "1": 234240760, "2": 538478180 }, "10": 1 }, { "1": 2826, "3": "GB", "4": "United Kingdom", "8": { "1": 553780510, "2": -34359730 }, "10": 1 }, { "1": 2840, "3": "US", "4": "United States", "5": "United States", "8": { "1": 387945952, "2": -1065348379 }, "10": 1 }, { "1": 2858, "3": "UY", "4": "Uruguay", "8": { "1": -325227790, "2": -557658350 }, "10": 1 }, { "1": 2860, "3": "UZ", "4": "Uzbekistan", "8": { "1": 413774910, "2": 645852620 }, "10": 1 }, { "1": 2548, "3": "VU", "4": "Vanuatu", "5": "Vanuatu", "8": { "1": -153767060, "2": 1669591580 }, "10": 1 }, { "1": 2336, "3": "VA", "4": "Vatican City", "5": "Vatican City", "8": { "1": 419029160, "2": 124533890 }, "10": 1 }, { "1": 2862, "3": "VE", "4": "Venezuela", "8": { "1": 64237500, "2": -665897300 }, "10": 1 }, { "1": 2704, "3": "VN", "4": "Vietnam", "8": { "1": 140583240, "2": 1082771990 }, "10": 1 }, { "1": 2887, "3": "YE", "4": "Yemen", "8": { "1": 155527270, "2": 485163880 }, "10": 1 }, { "1": 2894, "3": "ZM", "4": "Zambia", "8": { "1": -131338970, "2": 278493320 }, "10": 1 }, { "1": 2716, "3": "ZW", "4": "Zimbabwe", "8": { "1": -190154380, "2": 291548570 }, "10": 1 }, { "1": 2060, "3": "BM", "4": "Bermuda", "8": { "1": 323078000, "2": -647505000 }, "10": 2 }, { "1": 2074, "3": "BV", "4": "Bouvet Island", "8": { "1": -544231990, "2": 34131940 }, "10": 2 }, { "1": 2086, "3": "IO", "4": "British Indian Ocean Territory", "8": { "1": -63431940, "2": 718765190 }, "10": 2 }, { "1": 2092, "3": "VG", "4": "British Virgin Islands", "8": { "1": 184206950, "2": -646399680 }, "10": 2 }, { "1": 20277, "3": "IC", "4": "Canary Islands", "5": "Canary Islands", "8": { "1": 282915637, "2": -166291304 }, "10": 5 }, { "1": 2136, "3": "KY", "4": "Cayman Islands", "8": { "1": 193133000, "2": -812546000 }, "10": 2 }, { "1": 2158, "3": "TW", "4": "Taiwan", "8": { "1": 236978100, "2": 1209605150 }, "10": 2 }, { "1": 2175, "3": "YT", "4": "Mayotte", "8": { "1": -128275000, "2": 451662440 }, "10": 2 }, { "1": 2234, "3": "FO", "4": "Faroe Islands", "8": { "1": 618926350, "2": -69118060 }, "10": 2 }, { "1": 2238, "3": "FK", "4": "Falkland Islands (Islas Malvinas)", "8": { "1": -517962530, "2": -595236130 }, "10": 2 }, { "1": 2254, "3": "GF", "4": "French Guiana", "8": { "1": 39338890, "2": -531257820 }, "10": 2 }, { "1": 2275, "3": "PS", "4": "Palestine", "5": "Palestine", "8": { "1": 319521620, "2": 352331540 }, "10": 2 }, { "1": 2292, "3": "GI", "4": "Gibraltar", "8": { "1": 361407510, "2": -53535850 }, "10": 2 }, { "1": 2304, "3": "GL", "4": "Greenland", "8": { "1": 717069360, "2": -426043030 }, "10": 2 }, { "1": 2312, "3": "GP", "4": "Guadeloupe", "8": { "1": 162650000, "2": -615510000 }, "10": 2 }, { "1": 2344, "3": "HK", "4": "Hong Kong", "8": { "1": 223193039, "2": 1141693611 }, "10": 2 }, { "1": 2833, "3": "IM", "4": "Isle of Man", "8": { "1": 542361070, "2": -45480560 }, "10": 1 }, { "1": 2446, "3": "MO", "4": "Macao", "5": "Macao", "8": { "1": 221987450, "2": 1135438730 }, "10": 2 }, { "1": 2474, "3": "MQ", "4": "Martinique", "8": { "1": 146415280, "2": -610241740 }, "10": 2 }, { "1": 2500, "3": "MS", "4": "Montserrat", "8": { "1": 167424980, "2": -621873660 }, "10": 2 }, { "1": 2533, "3": "AW", "4": "Aruba", "8": { "1": 125211100, "2": -699683380 }, "10": 2 }, { "1": 2630, "3": "PR", "4": "Puerto Rico", "8": { "1": 182208330, "2": -665901490 }, "10": 2 }, { "1": 2638, "3": "RE", "4": "Reunion", "5": "Réunion", "8": { "1": -211151410, "2": 555363840 }, "10": 2 }, { "1": 2660, "3": "AI", "4": "Anguilla", "8": { "1": 182205540, "2": -630686150 }, "10": 2 }, { "1": 2732, "3": "EH", "4": "Western Sahara", "8": { "1": 242155270, "2": -128858340 }, "10": 2 }, { "1": 2663, "3": "MF", "4": "Saint Martin", "5": "St Martin", "8": { "1": 180825500, "2": -630522510 }, "10": 1 }, { "1": 2744, "3": "SJ", "4": "Svalbard and Jan Mayen", "8": { "1": 775536040, "2": 236702720 }, "10": 2 }, { "1": 2796, "3": "TC", "4": "Turks and Caicos Islands", "8": { "1": 216940250, "2": -717979280 }, "10": 2 }, { "1": 2581, "3": "UM", "4": "United States Minor Outlying Islands", "8": { "1": 192823192, "2": 1666470470 }, "10": 1 }, { "1": 2850, "3": "VI", "4": "U.S. Virgin Islands", "5": "U.S. Virgin Islands", "8": { "1": 183357650, "2": -648963350 }, "10": 2 }, { "1": 2876, "3": "WF", "4": "Wallis and Futuna", "8": { "1": -142938000, "2": -1781165000 }, "10": 1 } ] }}
src/search_advertiser_creatives.js
1import { processCreativeDetails } from "./get_creative_details.js";2import { fetchWithProxyRotation } from "./fetchWithProxyRotation.js";3
4export async function searchForAds(5 advertiserId,6 RegionCode = null,7 format,8 dateRange,9 platform,10 limitResults = null,11 isPolitical12) {13 let selectedRegion;14 let nextPageToken = null;15 const isDomain = advertiserId.includes(".");16 const adjustedLimit = limitResults ? Math.min(limitResults, 100) : 40; // Max limit 100, default 4017 let allResults = [];18
19 do {20 const requestPayload = isPolitical21 ? {22 "2": adjustedLimit,23 "3": {24 "1": advertiserId,25 ...(format !== 0 && { "4": format }),26 ...(RegionCode && { "8": [RegionCode] }),27 "12": { "1": "", "2": true },28 ...(platform && { "14": [platform] })29 },30 "6": { "1": 3, "2": true },31 "7": { "1": 2, "2": 30, "3": selectedRegion || 1 }32 }33 : isDomain34 ? {35 "2": adjustedLimit,36 "3": {37 ...(format !== 0 && { "4": format }),38 ...(RegionCode && { "8": [RegionCode] }),39 "12": { "1": advertiserId, "2": true },40 ...(platform && { "14": [platform] })41 },42 "7": { "1": 1, "2": 30, "3": selectedRegion || 1 }43 }44 : {45 "2": adjustedLimit,46 "3": {47 ...(format !== 0 && { "4": format }),48 ...(RegionCode && { "8": [RegionCode] }),49 "12": { "1": "", "2": true },50 "13": { "1": [advertiserId] },51 ...(platform && { "14": [platform] })52 },53 "7": { "1": 1, "2": 30, "3": selectedRegion || 1 }54 };55
56 if (!dateRange?.anyTime) {57 requestPayload["3"]["6"] = dateRange.fromDate;58 requestPayload["3"]["7"] = dateRange.toDate;59 }60
61 if (nextPageToken) {62 requestPayload["4"] = nextPageToken;63 }64
65 const postData = new URLSearchParams({66 "f.req": JSON.stringify(requestPayload)67 }).toString();68
69 const options = {70 hostname: "adstransparency.google.com",71 path: "/anji/_/rpc/SearchService/SearchCreatives?authuser=0",72 method: "POST",73 headers: {74 "Content-Type": "application/x-www-form-urlencoded",75 "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36",76 "Connection": "keep-alive",77 "Content-Length": Buffer.byteLength(String(postData)),78 }79 };80
81 try {82 // Fetch with proxy rotation83 const jsonResponse = await fetchWithProxyRotation(options, postData, 5);84
85 if (jsonResponse?.data) {86 let parsedResponse;87 try {88 parsedResponse = JSON.parse(jsonResponse.data);89 } catch (error) {90 console.error("❌ JSON Parsing Error:", error.message);91 throw new Error(`Invalid JSON response: ${jsonResponse.data}`);92 }93
94 if (!parsedResponse || typeof parsedResponse !== "object") {95 throw new Error("Invalid JSON response");96 }97
98 if (parsedResponse["1"]) {99 allResults = allResults.concat(parsedResponse["1"]);100 await processCreativeDetails(allResults.flat().filter(Boolean), RegionCode);101 }102
103 nextPageToken = parsedResponse["2"] || null;104 console.log(`🔹 Next Page Token: ${nextPageToken ? nextPageToken : "None"}`);105 }106 } catch (error) {107 console.error(`❌ Request failed: ${error.message}`);108 return allResults; // Return what was collected before failure109 }110
111 if (limitResults && allResults.length >= limitResults) {112 console.log(`✅ Limit reached: Returning first ${limitResults} results.`);113 return allResults.slice(0, limitResults);114 }115 } while (nextPageToken);116
117 console.log(`✅ Total results fetched for ${advertiserId}: ${allResults.length}`);118 return allResults;119}
src/search_for_an_ads.js
1import { searchForAds } from "./search_advertiser_creatives.js";2import { processCreativeDetails } from "./get_creative_details.js";3import https from "https";4
5// Regular expression to detect advertiser IDs6const advertiserIdPattern = /^AR\d+$/;7
8// Function to extract advertiser ID from a URL9function extractAdvertiserIdFromUrl(url) {10 const match = url.match(/advertiser\/(AR\d+)/);11 return match ? match[1] : null;12}13
14export async function searchForAdsList(keyword_domain_advertiserid, maxAdvertisers, maxDomains, RegionCode = null, format, dateRange, platform, limitResults, domainExists) {15 let advertiserid_domain = []; // Store valid advertiser IDs16 let keywords_domains = []; // Store non-advertiser keywords_domains17
18 console.log('domain Exists', domainExists);19
20 // Normalize input into an array21 const inputList = Array.isArray(keyword_domain_advertiserid) ? keyword_domain_advertiserid : [keyword_domain_advertiserid];22
23 // Validate each item24 inputList.forEach(item => {25 if (typeof item !== "string") return;26
27 let extractedId = item.startsWith("http") ? extractAdvertiserIdFromUrl(item) : item;28
29 if (advertiserIdPattern.test(extractedId)|| domainExists) {30 advertiserid_domain.push(extractedId); // Store advertiser ID and domains31 } else {32 keywords_domains.push(item); // Treat as a keyword/domain33 }34 });35
36 // If advertiser IDs exist OR domainExists is true, process them immediately and SKIP API request37 if (advertiserid_domain.length > 0 || domainExists) {38 console.log(`🚀 Processing advertiser IDs directly (domainExists: ${domainExists}):`, advertiserid_domain);39 const adPromises = advertiserid_domain.map(id => searchForAds(id, RegionCode, format, dateRange, platform, limitResults));40 const adResults = await Promise.all(adPromises);41 }42
43
44 // If no keywords_domains exist, return no data (avoids unnecessary request)45 if (keywords_domains.length === 0) {46 console.warn(`⚠️ No valid keywords_domains found. Skipping API request.`);47 return { message: "No data", keyword_domain_advertiserid };48 }49
50 console.log(`📡 Sending API request for keywords_domains:`, keywords_domains);51
52 // Fix: If there's only one keyword, send it as a string. If multiple, send as an array.53 const requestPayload = {54 "1": keywords_domains.length === 1 ? keywords_domains[0] : keywords_domains,55 "2": maxAdvertisers,56 "3": maxDomains,57 "4": RegionCode ? [RegionCode] : []58 };59
60 console.log(`requestPayload ${JSON.stringify(requestPayload, null, 2)}`);61
62 const postData = new URLSearchParams({63 "f.req": JSON.stringify(requestPayload)64 }).toString();65
66 const agent = new https.Agent({ keepAlive: true });67 const options = {68 agent,69 hostname: "adstransparency.google.com",70 path: "/anji/_/rpc/SearchService/SearchSuggestions?authuser=0",71 method: "POST",72 headers: {73 "Content-Type": "application/x-www-form-urlencoded",74 "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36",75 "Connection": "keep-alive",76 "Content-Length": Buffer.byteLength(String(postData)),77 }78 };79
80 return new Promise((resolve, reject) => {81 const req = https.request(options, (res) => {82 let data = "";83
84 res.on("data", (chunk) => (data += chunk));85
86 res.on("end", async () => {87 if (res.statusCode >= 400) {88 console.error(`❌ HTTP Error ${res.statusCode}: ${data}`);89 return reject(new Error(`HTTP ${res.statusCode}: ${data}`));90 }91 // Check for CAPTCHA or blocking92 if (data.includes("<title>302 Moved</title>") || data.includes("google.com/sorry")) {93 console.error("❌ CAPTCHA or Block Detected: Google has blocked the request.");94 reject(new Error("CAPTCHA detected or request blocked by Google."));95 return;96 }97 try {98 const jsonResponse = JSON.parse(data);99 const promises = [];100 //console.log(`statusCode : ${res.statusCode} | jsonResponse ${JSON.stringify(jsonResponse, null, 2)}`);101
102 // Ensure jsonResponse["1"] is an array before processing103 if (Array.isArray(jsonResponse["1"])) {104 promises.push(...jsonResponse["1"].map(async (item) => {105 let advertiserId = null;106
107 if (item["1"] && item["1"]["2"]) {108 advertiserId = item["1"]["2"];109 } else if (item["2"] && item["2"]["1"]) {110 advertiserId = item["2"]["1"];111 }112
113 return advertiserId ? searchForAds(advertiserId, RegionCode, format, dateRange, platform, limitResults) : null;114 }));115 }116
117 // Wait for all promises to resolve118 const allResults = await Promise.all(promises);119 const creativeDetails = await processCreativeDetails(allResults.flat().filter(Boolean), RegionCode);120 resolve(creativeDetails.flat().filter(Boolean));121
122 } catch (error) {123 console.error("❌ JSON Parsing Error:", error);124 reject(error);125 }126 });127 });128
129 req.on("error", (err) => {130 console.error("❌ Request Error:", err.message);131 reject(err);132 });133
134 req.write(postData);135 req.end();136 });137}
src/search_for_an_political_ads.js
1import { searchForAds } from "./search_advertiser_creatives.js";2import { processCreativeDetails } from "./get_creative_details.js";3import https from "https";4
5// Regular expression to detect advertiser IDs6const advertiserIdPattern = /^AR\d+$/;7
8// Function to extract advertiser ID from a URL9function extractAdvertiserIdFromUrl(url) {10 const match = url.match(/advertiser\/(AR\d+)/);11 return match ? match[1] : null;12}13
14export async function searchForPoliticalAdsList(keyword_advertiserid, maxAdvertisers, RegionCode = null, format, dateRange, platform, limitResults) {15 let advertiserid = []; // Store valid advertiser IDs16 let key_advid = []; // Store non-advertiser keyword or advertiserid17 let isPolitical = true18 // Normalize input into an array19 const inputList = Array.isArray(keyword_advertiserid) ? keyword_advertiserid : [keyword_advertiserid];20
21 // Validate each item22 inputList.forEach(item => {23 if (typeof item !== "string") return;24
25 let extractedId = item.startsWith("http") ? extractAdvertiserIdFromUrl(item) : item;26
27 if (advertiserIdPattern.test(extractedId)) {28 advertiserid.push(extractedId); // Store advertiser ID29 } else {30 key_advid.push(item); // Treat as a keyword31 }32 });33
34 // If advertiser IDs exist, process it immediately and SKIP API request35 if (advertiserid.length > 0) {36 console.log(`🚀 Processing advertiser IDs directly :`, advertiserid);37 const adPromises = advertiserid.map(id => searchForAds(id, RegionCode, format, dateRange, platform, limitResults, isPolitical));38 const adResults = await Promise.all(adPromises);39 const creativeDetails = await processCreativeDetails(adResults.flat().filter(Boolean), RegionCode);40 return creativeDetails.flat().filter(Boolean);41 }42
43 // If no keyword or advertiserid exist, return no data (avoids unnecessary request)44 if (key_advid.length === 0) {45 console.warn(`⚠️ No valid keyword or advertiserid found. Skipping API request.`);46 return { message: "No data", keyword_advertiserid };47 }48
49 console.log(`📡 Sending API request for keyword or advertiserid:`, key_advid);50
51 // Fix: If there's only one keyword, send it as a string. If multiple, send as an array.52 const requestPayload = {53 "2": maxAdvertisers,54 "4": {55 "2": RegionCode ? [RegionCode] : [],56 "3": Array.isArray(key_advid) ? key_advid.join(",") : key_advid // Ensure a string57 },58 "7": {59 "1": 260 }61 };62
63 console.log(`requestPayload ${JSON.stringify(requestPayload, null, 2)}`);64 const postData = new URLSearchParams({65 "f.req": JSON.stringify(requestPayload)66 }).toString();67
68 const agent = new https.Agent({ keepAlive: true });69 const options = {70 agent,71 hostname: "adstransparency.google.com",72 path: "/anji/_/rpc/SearchService/SearchAdvertisers?authuser=0",73 method: "POST",74 headers: {75 "Content-Type": "application/x-www-form-urlencoded",76 "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36",77 "Connection": "keep-alive",78 "Content-Length": Buffer.byteLength(String(postData)),79 }80 };81
82 return new Promise((resolve, reject) => {83 const req = https.request(options, (res) => {84 let data = "";85
86 res.on("data", (chunk) => (data += chunk));87
88 res.on("end", async () => {89 if (res.statusCode >= 400) {90 console.error(`❌ HTTP Error ${res.statusCode}: ${data}`);91 return reject(new Error(`HTTP ${res.statusCode}: ${data}`));92 }93 // Check for CAPTCHA or blocking94 if (data.includes("<title>302 Moved</title>") || data.includes("google.com/sorry")) {95 console.error("❌ CAPTCHA or Block Detected: Google has blocked the request.");96 reject(new Error("CAPTCHA detected or request blocked by Google."));97 return;98 }99 try {100 const jsonResponse = JSON.parse(data);101 const promises = [];102
103 console.log(`statusCode : ${res.statusCode} | jsonResponse ${JSON.stringify(jsonResponse, null, 2)}`);104 // Ensure jsonResponse["1"] is an array before processing105 if (Array.isArray(jsonResponse["1"])) {106 promises.push(...jsonResponse["1"].map(async (item) => {107 let advertiserId = null;108
109 // New response format handling110 if (item["1"]) {111 advertiserId = item["1"];112 }113
114 return advertiserId ? searchForAds(advertiserId, RegionCode, format, dateRange, platform, limitResults, isPolitical ) : null;115 }));116 }117
118 // Wait for all promises to resolve119 const allResults = await Promise.all(promises);120 const creativeDetails = await processCreativeDetails(allResults.flat().filter(Boolean), RegionCode);121 resolve(creativeDetails.flat().filter(Boolean));122
123 } catch (error) {124 console.error("❌ JSON Parsing Error:", error);125 reject(error);126 }127 });128 });129
130 req.on("error", (err) => {131 console.error("❌ Request Error:", err.message);132 reject(err);133 });134
135 req.write(postData);136 req.end();137 });138}
src0/filterAdvertiser.js
1import { Dataset } from 'crawlee';2import { getDateRange } from './getDateRange.js';3import { searchForAdsList } from './search_for_an_ads.js';4import { parseAdvertiserUrl } from './parseAdvertiserUrl.js';5
6
7export const filterAdvertiser = async (kw, Use_URL_Filter, maxAdvertisers, maxDomains, RegionCode, format, platform, presetDate, startDate, endDate, limitResults,domainExists) => {8 const parsedData = parseAdvertiserUrl(kw);9 try {10 const filterData = Use_URL_Filter11 ? {12 advertiserId_OR_kw: parsedData.advertiserId_domain,13 maxDomains,14 maxAdvertisers,15 RegionCode: parsedData.RegionCode,16 format: parseInt(parsedData.format),17 dateRange: getDateRange(parsedData.presetDate, parsedData.startDate, parsedData.endDate),18 platform: parseInt(parsedData.platform),19 startDate: parsedData.startDate,20 endDate: parsedData.endDate,21 limitResults,22 domainExists : parsedData.domainExists23 }24 : {25 advertiserId_OR_kw: parsedData.advertiserId_domain,26 maxDomains,27 maxAdvertisers,28 RegionCode,29 format: parseInt(format),30 platform: parseInt(platform),31 dateRange: getDateRange(presetDate, startDate, endDate),32 startDate,33 endDate,34 limitResults,35 domainExists36 };37
38 //console.log(Use_URL_Filter ? 'If Use_URL_Filter is true, override input filter:' : 'Use Actor.getInput() filtering:', filterData);39
40 let adsData = await searchForAdsList(41 parsedData.advertiserId_domain,42 maxAdvertisers,43 maxDomains,44 Use_URL_Filter ? parsedData.RegionCode : RegionCode,45 parseInt(Use_URL_Filter ? parsedData.format : format),46 getDateRange(Use_URL_Filter ? parsedData.presetDate : presetDate, Use_URL_Filter ? parsedData.startDate : startDate, Use_URL_Filter ? parsedData.endDate : endDate),47 parseInt(Use_URL_Filter ? parsedData.platform : platform),48 limitResults,49 parsedData.domainExists50 );51
52 await Dataset.pushData({ advertiserId_OR_kw1: parsedData.advertiserId_domain, adsData });53 } catch (error) {54 console.error(`❌ Error processing advertiser ID "${parsedData.advertiserId_domain}":`, error);55 }56};
src0/getDateRange.js
1import dayjs from 'dayjs';2
3function validateCustomDates(Start_Date, End_Date) {4 const isValidDate = (date) => /^\d{4}-\d{2}-\d{2}$/.test(date);5
6 let fromDate = isValidDate(Start_Date) ? parseInt(Start_Date.replace(/-/g, ""), 10) : null;7 let toDate = isValidDate(End_Date) ? parseInt(End_Date.replace(/-/g, ""), 10) : null;8
9 if (fromDate && toDate) {10 if (fromDate > toDate) {11 console.error("❌ Error: Start_Date cannot be after End_Date.");12 return null; // Do not return error, let it fall back to default13 }14 return { fromDate, toDate, anyTime: false, dateRangeLabel: "Custom Range" };15 }16
17 if ((Start_Date && !isValidDate(Start_Date)) || (End_Date && !isValidDate(End_Date))) {18 console.error("❌ Error: Invalid date format. Expected YYYY-MM-DD. Falling back to default values.");19 return null; // Do not return error, let it fall back to default20 }21
22 return null;23}24
25export function getDateRange(days, Start_Date, End_Date) {26 let customDateRange = validateCustomDates(Start_Date, End_Date);27 if (customDateRange) return customDateRange;28
29 let yesterday = parseInt(dayjs().subtract(1, "day").format("YYYYMMDD"), 10);30 let defaultToDate = yesterday;31 let defaultFromDate;32 let anyTime = false;33 let dateRangeLabel = "";34
35 if (days === "0") {36 defaultFromDate = parseInt(dayjs().subtract(2, "day").format("YYYYMMDD"), 10);37 dateRangeLabel = "Today";38 } else if (days === "1") {39 defaultFromDate = parseInt(dayjs().subtract(2, "day").format("YYYYMMDD"), 10);40 dateRangeLabel = "Yesterday";41 } else if (days === "7") {42 defaultFromDate = parseInt(dayjs().subtract(8, "day").format("YYYYMMDD"), 10);43 dateRangeLabel = "Last 7 days";44 } else if (days === "30") {45 defaultFromDate = parseInt(dayjs().subtract(31, "day").format("YYYYMMDD"), 10);46 dateRangeLabel = "Last 30 days";47 } else if (days === "-1") {48 dateRangeLabel = "Any time";49 return { anyTime: true, dateRangeLabel };50 } else {51 return null;52 }53
54 return { fromDate: defaultFromDate, toDate: defaultToDate, anyTime, dateRangeLabel };55}
src0/get_creative_details.js
1import https from "https";2import pLimit from "p-limit";3import { processAds } from "./processAds.js"; // Import function4
5/**6 * Function to get creative details by ID7 * @param {string} creativeId - The creative ID to fetch details for8 * @param {string} advertiserId - The advertiser ID associated with the creative9 * @param {number} regionCode - The region code (default is worldwide: 2012)10 * @returns {Promise<Object>} - The creative details11 */12export async function getCreativeDetails(creativeId, advertiserId, regionCode = null) {13 //const startTime = performance.now();14 const requestPayload = {15 "1": advertiserId,16 "2": creativeId,17 "5": {18 "1": 1, // Page number19 "2": 30, // Page size20 "3": 201221 //"3": regionCode ? [regionCode] : [] // Region filter22 }23 };24
25 const postData = new URLSearchParams({26 "f.req": JSON.stringify(requestPayload)27 }).toString();28 const agent = new https.Agent({ keepAlive: true });29
30 const options = {31 agent, // Reuse connections32 hostname: "adstransparency.google.com",33 path: "/anji/_/rpc/LookupService/GetCreativeById?authuser=0",34 method: "POST",35 headers: {36 "Content-Type": "application/x-www-form-urlencoded",37 "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36",38 "Connection": "keep-alive",39 "Content-Length": Buffer.byteLength(String(postData)),40 }41 };42
43 return new Promise((resolve, reject) => {44 const req = https.request(options, (res) => {45 let data = "";46
47 //console.log(`get_creative_details - 🔹 Status Code: ${res.statusCode}`);48
49 res.on("data", (chunk) => {50 data += chunk;51 });52
53 res.on("end", () => {54
55 //const endTime = performance.now();56 //console.log(`⏳ Creative ID ${creativeId} took ${(endTime - startTime).toFixed(2)} ms`);57
58 if (res.statusCode >= 400) {59 console.error(`❌ HTTP Error ${res.statusCode}: ${data}`);60 //console.log(`${res.statusCode}: ${JSON.stringify(requestPayload, null, 2)}`);61 reject(new Error(`HTTP ${res.statusCode}: ${data}`));62 } else {63 try {64 const parsedResponse = JSON.parse(data);65 console.log(`requestPayload ${JSON.stringify(requestPayload, null, 2)}`);66 resolve(parsedResponse);67 } catch (error) {68 console.error("❌ JSON Parsing Error:", error);69 reject(error);70 }71 }72 });73 });74
75 req.on("error", (err) => {76 console.error("❌ Request Error:", err.message);77 reject(err);78 });79
80 req.write(postData);81 req.end();82 });83}84
85/**86 * Function to process allResults and fetch creative details87 * @param {Array<Object>} allResults - The array of results from searchForAds88 * @param {number} regionCode - The region code (default is worldwide: 2012)89 * @returns {Promise<Array<Object>>} - Array of creative details90 */91
92const limit = pLimit(2); // Limit to 5 concurrent requests93
94export async function processCreativeDetails(allResults, regionCode = 2012) {95 const results = await Promise.allSettled(96 allResults.map((result) => {97 if (result["2"]) {98 return getCreativeDetails(result["2"], result["1"], regionCode);99 }100 return null;101 })102 );103
104 // Extract only successful responses105 const fulfilledResults = results106 .filter((res) => res.status === "fulfilled")107 .map((res) => res.value);108
109 console.log(`✅ Successfully fetched ${fulfilledResults.length} creative details.`);110
111 // Send data to processAds.js for formatting112 //return fulfilledResults;113 return processAds(fulfilledResults);114}
src0/main.js
1const startTime = performance.now();2import { Actor } from 'apify';3import { Dataset } from 'crawlee';4import { getDateRange } from './getDateRange.js';5import { parseAdvertiserUrl } from './parseAdvertiserUrl.js';6import { searchForAdsList } from './search_for_an_ads.js';7import { searchForPoliticalAdsList } from './search_for_an_political_ads.js';8import { filterAdvertiser } from './filterAdvertiser.js';9import fs from 'fs';10
11await Actor.init();12
13// Load and parse input parameters14const input = await Actor.getInput() ?? {};15const {16 keyword_domain_advertiserid,17 maxAdvertisers,18 maxDomains,19 region,20 format,21 platform,22 presetDate,23 startDate,24 endDate,25 Use_URL_Filter,26 limitResults,27 isPolitical28} = input;29
30// Load regions.json and resolve region code31const regionMapping = JSON.parse(fs.readFileSync("src/regions.json", "utf-8"));32const regionEntry = regionMapping.regions.region.find(r => r["4"] === region);33const RegionCode = regionEntry ? regionEntry["1"] : undefined;34
35// Determine date range36const dateRange = getDateRange(presetDate, startDate, endDate);37
38// Function to detect URLs39const isGenericUrl = (kw) => /^https?:\/\//.test(kw);40const advertiserIdPattern = (kw) => /^AR\d+$/.test(kw);41
42const isAdvertiserUrl = /https:\/\/adstransparency\.google\.com\/advertiser\/(AR\d+)/;43const isDomainUrl = /[?&]domain=([^&]+)/;44const isTopic = /[?&]topic=([^&]+)/;45
46let domainExists47
48const processKeyword = async (kw) => {49 try {50 let filterData;51
52 if (kw.match(isTopic) || isPolitical && !kw.match(isAdvertiserUrl) && !kw.match(isDomainUrl)) {53 kw = kw.replace(/\s+/g, "+"); // Replace spaces with '+'54 console.log(`✅✅ Political : ${kw}`);55 const parsedData = parseAdvertiserUrl(kw);56
57 const filterData = {58 adveritserId_OR_kw: parsedData.advertiserId_domain,59 maxAdvertisers,60 RegionCode: parsedData.RegionCode,61 format: parseInt(parsedData.format),62 platform: parseInt(parsedData.platform),63 dateRange: getDateRange(parsedData.presetDate, parsedData.startDate, parsedData.endDate),64 startDate: parsedData.startDate,65 endDate: parsedData.endDate,66 limitResults,67 }68 console.log("Filter Data:", JSON.stringify(filterData, null, 2));69 let adsData = await searchForPoliticalAdsList(70 parsedData.advertiserId_domain,71 maxAdvertisers,72 parsedData.RegionCode,73 parseInt(parsedData.format),74 getDateRange(parsedData.presetDate, parsedData.startDate, parsedData.endDate),75 parseInt(parsedData.platform),76 limitResults77 );78
79 await Dataset.pushData({ advertiserId_OR_kw: kw, adsData });80
81 }82 else if (kw.match(isAdvertiserUrl) || kw.match(isDomainUrl)) {83 const advertiserMatch = kw.match(isAdvertiserUrl);84 const domainMatch = kw.match(isDomainUrl);85 const parsedData = parseAdvertiserUrl(kw);86
87 if (advertiserMatch && domainMatch) {88 console.error(`❌ Invalid URL: Cannot contain both advertiser ID and domain -> ${kw}`);89 return; // Skip processing this invalid URL90 }91 if (advertiserMatch) {92 // Advertiser ID detected93 if (!parsedData) throw new Error("Invalid advertiser URL");94 await filterAdvertiser(kw, Use_URL_Filter, maxAdvertisers, maxDomains, RegionCode, format, platform, presetDate, startDate, endDate, limitResults, domainExists);95 } else if (domainMatch) {96 // Domain detected97 console.log('🔹 Processing Domain:', parsedData.advertiserId_domain,);98 await filterAdvertiser(kw, Use_URL_Filter, maxAdvertisers, maxDomains, RegionCode, format, platform, presetDate, startDate, endDate, limitResults, domainExists);99 }100 }101 else {102 // Handle generic keywords (not URLs)103 if (isGenericUrl(kw)) console.warn(`⚠️ Detected a generic URL: ${kw}.\nTreating as a regular keyword.`);104 kw = kw.replace(/\s+/g, "+"); // Replace spaces with '+'105 if (advertiserIdPattern(kw)) console.log(`✅ Advertiser ID: ${kw}`);106 filterData = {107 advertiserId_OR_kw: kw,108 maxDomains,109 maxAdvertisers,110 RegionCode,111 format: parseInt(format),112 platform: parseInt(platform),113 dateRange,114 startDate,115 endDate116 };117
118 let adsData = await searchForAdsList(119 kw,120 maxAdvertisers,121 maxDomains,122 RegionCode,123 parseInt(format),124 getDateRange(presetDate, startDate, endDate),125 parseInt(platform),126 limitResults127 );128 await Dataset.pushData({ advertiserId_OR_kw0: kw, adsData });129 }130 } catch (error) {131 console.error(`❌ Error processing "${kw}":`, error);132 }133};134
135
136// Process all queries in parallel137await Promise.all(keyword_domain_advertiserid.map(processKeyword));138
139const endTime = performance.now();140console.log(`⏳ Execution time: ${(endTime - startTime).toFixed(2)} ms`);141await Actor.exit();
src0/parseAdvertiserUrl.js
1import fs from "fs";2
3export function parseAdvertiserUrl(url) {4 const advertiserPattern = /https:\/\/adstransparency\.google\.com\/advertiser\/(AR\d+)/;5 const match = url.match(advertiserPattern);6
7 const urlParams = new URL(url).searchParams;8 const advertiserId = match ? match[1] : null;9 const domain = urlParams.has("domain") ? urlParams.get("domain") : null;10
11 // Ensure that only one of advertiserId or domain exists12 if (advertiserId && domain) {13 return null; // Invalid URL structure14 }15
16 // Determine advertiserId_domain17 const advertiserId_domain = advertiserId || domain || null;18
19 // Extract query parameters20 const region = urlParams.get("region") || null;21 const format = urlParams.get("format") || null;22 const presetDate = urlParams.get("preset-date")?.replace(/ /g, "+") || null;23 const startDate = urlParams.get("start-date") || null;24 const endDate = urlParams.get("end-date") || null;25 const platform = urlParams.get("platform") || null;26
27 // Load regions.json and resolve region code28 const regionMapping = JSON.parse(fs.readFileSync("src/regions.json", "utf-8"));29 const regionEntry = regionMapping.regions.region.find(r => r["3"] === region);30 const RegionCode = regionEntry ? regionEntry["1"] : undefined;31
32 // Platform Mapping33 const platformMap = {34 "MAPS": "2",35 "PLAY": "1",36 "SHOPPING": "4",37 "SEARCH": "3",38 "YOUTUBE": "5"39 };40
41 // Format Mapping42 const formatMap = {43 "VIDEO": "3",44 "TEXT": "1",45 "IMAGE": "2"46 };47
48 // Preset Date Mapping49 const presetDateMap = {50 "Today": "0",51 "Yesterday": "1",52 "Last+7+days": "7",53 "Last+30+days": "30"54 };55
56 return {57 advertiserId_domain,58 domainExists: !!domain, // ✅ Returns true if domain exists, false otherwise59 RegionCode,60 format: formatMap[format] || "0", // Default to "0" (All formats)61 presetDate: presetDateMap[presetDate] || "-1", // Default to "-1" (Any Time)62 startDate,63 endDate,64 platform: platformMap[platform] || "0" // Default to "0" (All platforms)65 };66}
src0/processAds.js
1import fs from "fs";2
3// Load the region mapping file4const regionMapping = JSON.parse(fs.readFileSync("src/regions.json", "utf-8"));5
6// Platform mapping for `"8"` field (Google services)7const platformMapping = {8 1: "Google Play",9 2: "Google Maps",10 3: "Google Search",11 4: "Google Shopping",12 5: "YouTube"13};14
15// Format mapping for `"1": {"8": ...}`16const formatMapping = {17 1: "TEXT",18 2: "IMAGE",19 3: "VIDEO"20};21
22// Convert region codes to readable names23function getRegionName(regionCode) {24 const regionEntry = regionMapping.regions.region.find(r => r["1"] === regionCode);25 return regionEntry26 ? { regionCode: regionEntry["3"], regionName: regionEntry["4"] } // "3" = Country Code, "4" = Country Name27 : { regionCode: "Unknown", regionName: "N/A" };28}29
30export function processAds(allResults) {31 if (!allResults || allResults.length === 0) {32 console.log("No ad data available to process.");33 return [];34 }35
36 const formattedAds = allResults.map(ad => {37 const rawRegions = ad?.["1"]?.["17"];38
39 //console.log("🔍 Raw region data:", JSON.stringify(rawRegions, null, 2)); // Debugging40
41 const regionStats = Array.isArray(rawRegions)42 ? rawRegions.map(region => {43 if (!region || typeof region !== "object") return {}; // Prevent errors on missing data44
45 const { regionCode, regionName } = getRegionName(region["1"]);46
47 // ✅ Extract platform stats from "8"48 const platformStats = Array.isArray(region["8"])49 ? region["8"].map(platform => ({50 surfaceName: platformMapping[platform["1"]] || "Unknown Platform",51 impressions: {52 lowerBound: platform["2"] ?? 0,53 upperBound: platform["3"] ?? 054 }55 }))56 : [];57
58 return {59 regionNumber: region["1"] ?? "Unknown",60 regionCode,61 regionName,62 firstShown: region.hasOwnProperty("4") ? region["4"] : "Unknown",63 lastShown: region.hasOwnProperty("5") ? region["5"] : "Unknown",64 impressions: {65 lowerBound: region["2"] ?? 0,66 upperBound: region["3"] ?? 067 },68 platformStats69 };70 })71 : [];72
73 // ✅ Get format from `ad["1"]["8"]`74 const formatType = formatMapping[ad?.["1"]?.["8"]] || "UNKNOWN";75
76 // ✅ Extract preview URLs from both possible locations77 const previewUrls = Array.isArray(ad?.["1"]?.["5"])78 ? ad["1"]["5"].map(item =>79 item?.["1"]?.["4"] ?? // Case 1: "1": { "4": "URL" }80 item?.["3"]?.["2"] ?? // Case 2: "3": { "2": "URL" }81 "Unknown"82 )83 : [];84
85 // ✅ Construct Ad Transparency URL86 const advertiserId = ad?.["1"]?.["1"] ?? "Unknown";87 const creativeId = ad?.["1"]?.["2"] ?? "Unknown";88 const adTransparencyUrl =89 advertiserId !== "Unknown" && creativeId !== "Unknown"90 ? `https://adstransparency.google.com/advertiser/${advertiserId}/creative/${creativeId}?region=anywhere`91 : "Unknown";92
93 return {94 advertiserId,95 creativeId,96 creativeRegions: [...new Set(regionStats.map(r => r.regionName))], // ✅ Unique region names97 adTransparencyUrl, // ✅ Added ad transparency link98 previewUrls, // ✅ Now properly extracting URLs99 format: formatType, // ✅ Updated format assignment100 regionStats101 };102 });103
104 console.log(`✅ Processed ${formattedAds.length} ads.`);105
106 return formattedAds;107}
src0/regions.json
{ "regions": { "region": [ { "1": 2008, "3": "AL", "4": "Albania", "8": { "1": 411533320, "2": 201683310 }, "10": 1 }, { "1": 2012, "3": "DZ", "4": "Algeria", "8": { "1": 280338860, "2": 16596260 }, "10": 1 }, { "1": 2016, "3": "AS", "4": "American Samoa", "8": { "1": -142709720, "2": -1701322170 }, "10": 1 }, { "1": 2020, "3": "AD", "4": "Andorra", "8": { "1": 425062850, "2": 15218010 }, "10": 1 }, { "1": 2024, "3": "AO", "4": "Angola", "8": { "1": -112026920, "2": 178738870 }, "10": 1 }, { "1": 2010, "3": "AQ", "4": "Antarctica", "8": { "1": -752509730, "2": -713890 }, "10": 1 }, { "1": 2028, "3": "AG", "4": "Antigua and Barbuda", "8": { "1": 170608160, "2": -617964280 }, "10": 1 }, { "1": 2032, "3": "AR", "4": "Argentina", "8": { "1": -384160970, "2": -636166720 }, "10": 1 }, { "1": 2051, "3": "AM", "4": "Armenia", "8": { "1": 400690990, "2": 450381890 }, "10": 1 }, { "1": 2036, "3": "AU", "4": "Australia", "8": { "1": -252743980, "2": 1337751360 }, "10": 1 }, { "1": 2040, "3": "AT", "4": "Austria", "5": "Austria", "8": { "1": 475162310, "2": 145500720 }, "10": 1 }, { "1": 2031, "3": "AZ", "4": "Azerbaijan", "8": { "1": 401431050, "2": 475769270 }, "10": 1 }, { "1": 2048, "3": "BH", "4": "Bahrain", "8": { "1": 260667000, "2": 505577000 }, "10": 1 }, { "1": 2050, "3": "BD", "4": "Bangladesh", "8": { "1": 236849940, "2": 903563310 }, "10": 1 }, { "1": 2052, "3": "BB", "4": "Barbados", "8": { "1": 131938870, "2": -595431980 }, "10": 1 }, { "1": 2112, "3": "BY", "4": "Belarus", "8": { "1": 537098070, "2": 279533890 }, "10": 1 }, { "1": 2056, "3": "BE", "4": "Belgium", "5": "Belgium", "8": { "1": 505038870, "2": 44699360 }, "10": 1 }, { "1": 2084, "3": "BZ", "4": "Belize", "8": { "1": 171898770, "2": -884976500 }, "10": 1 }, { "1": 2204, "3": "BJ", "4": "Benin", "8": { "1": 93076900, "2": 23158340 }, "10": 1 }, { "1": 2064, "3": "BT", "4": "Bhutan", "8": { "1": 275141620, "2": 904336010 }, "10": 1 }, { "1": 2068, "3": "BO", "4": "Bolivia", "8": { "1": -162901540, "2": -635886530 }, "10": 1 }, { "1": 2070, "3": "BA", "4": "Bosnia and Herzegovina", "8": { "1": 439158860, "2": 176790760 }, "10": 1 }, { "1": 2072, "3": "BW", "4": "Botswana", "8": { "1": -223284740, "2": 246848660 }, "10": 1 }, { "1": 2076, "3": "BR", "4": "Brazil", "8": { "1": -142350040, "2": -519252800 }, "10": 1 }, { "1": 2096, "3": "BN", "4": "Brunei", "8": { "1": 45352770, "2": 1147276690 }, "10": 1 }, { "1": 2100, "3": "BG", "4": "Bulgaria", "8": { "1": 427338830, "2": 254858300 }, "10": 1 }, { "1": 2854, "3": "BF", "4": "Burkina Faso", "8": { "1": 122383330, "2": -15615930 }, "10": 1 }, { "1": 2108, "3": "BI", "4": "Burundi", "8": { "1": -33730560, "2": 299188860 }, "10": 1 }, { "1": 2116, "3": "KH", "4": "Cambodia", "8": { "1": 125656790, "2": 1049909630 }, "10": 1 }, { "1": 2120, "3": "CM", "4": "Cameroon", "8": { "1": 73697220, "2": 123547220 }, "10": 1 }, { "1": 2124, "3": "CA", "4": "Canada", "5": "Canada", "8": { "1": 561303660, "2": -1063467710 }, "10": 1 }, { "1": 2132, "3": "CV", "4": "Cabo Verde", "5": "Cabo Verde", "8": { "1": 165388000, "2": -230418000 }, "10": 1 }, { "1": 2535, "3": "BQ", "4": "Caribbean Netherlands", "8": { "1": 121783611, "2": -682385339 }, "10": 1 }, { "1": 2140, "3": "CF", "4": "Central African Republic", "8": { "1": 66111110, "2": 209394440 }, "10": 1 }, { "1": 2148, "3": "TD", "4": "Chad", "8": { "1": 154541660, "2": 187322070 }, "10": 1 }, { "1": 2152, "3": "CL", "4": "Chile", "8": { "1": -356751470, "2": -715429690 }, "10": 1 }, { "1": 2156, "3": "CN", "4": "China", "8": { "1": 358616600, "2": 1041953970 }, "10": 1 }, { "1": 2162, "3": "CX", "4": "Christmas Island", "8": { "1": -104475250, "2": 1056904490 }, "10": 1 }, { "1": 2166, "3": "CC", "4": "Cocos (Keeling) Islands", "8": { "1": -121641650, "2": 968709560 }, "10": 1 }, { "1": 2170, "3": "CO", "4": "Colombia", "8": { "1": 45708680, "2": -742973330 }, "10": 1 }, { "1": 2174, "3": "KM", "4": "Comoros", "8": { "1": -116455000, "2": 433333000 }, "10": 1 }, { "1": 2184, "3": "CK", "4": "Cook Islands", "8": { "1": -212367360, "2": -1597776710 }, "10": 1 }, { "1": 2188, "3": "CR", "4": "Costa Rica", "8": { "1": 97489170, "2": -837534280 }, "10": 1 }, { "1": 2384, "3": "CI", "4": "Cote d'Ivoire", "8": { "1": 75399890, "2": -55470800 }, "10": 1 }, { "1": 2191, "3": "HR", "4": "Croatia", "8": { "1": 451000000, "2": 152000000 }, "10": 1 }, { "1": 2531, "3": "CW", "4": "Curacao", "8": { "1": 121695700, "2": -689900200 }, "10": 1 }, { "1": 2196, "3": "CY", "4": "Cyprus", "8": { "1": 351264130, "2": 334298590 }, "10": 1 }, { "1": 2203, "3": "CZ", "4": "Czechia", "5": "Czechia", "8": { "1": 498174920, "2": 154729620 }, "10": 1 }, { "1": 2180, "3": "CD", "4": "Democratic Republic of the Congo", "8": { "1": -40383330, "2": 217586640 }, "10": 1 }, { "1": 2208, "3": "DK", "4": "Denmark", "5": "Denmark", "8": { "1": 562639200, "2": 95017850 }, "10": 1 }, { "1": 2262, "3": "DJ", "4": "Djibouti", "8": { "1": 118251380, "2": 425902750 }, "10": 1 }, { "1": 2212, "3": "DM", "4": "Dominica", "8": { "1": 154149990, "2": -613709760 }, "10": 1 }, { "1": 2214, "3": "DO", "4": "Dominican Republic", "8": { "1": 187356930, "2": -701626510 }, "10": 1 }, { "1": 2218, "3": "EC", "4": "Ecuador", "8": { "1": -18312390, "2": -781834060 }, "10": 1 }, { "1": 2818, "3": "EG", "4": "Egypt", "8": { "1": 268205530, "2": 308024980 }, "10": 1 }, { "1": 2222, "3": "SV", "4": "El Salvador", "8": { "1": 137941850, "2": -888965300 }, "10": 1 }, { "1": 2226, "3": "GQ", "4": "Equatorial Guinea", "8": { "1": 16508010, "2": 102678950 }, "10": 1 }, { "1": 2232, "3": "ER", "4": "Eritrea", "8": { "1": 151793840, "2": 397823340 }, "10": 1 }, { "1": 2233, "3": "EE", "4": "Estonia", "8": { "1": 585952720, "2": 250136070 }, "10": 1 }, { "1": 2748, "3": "SZ", "4": "Eswatini", "5": "Eswatini", "8": { "1": -265225030, "2": 314658660 }, "10": 1 }, { "1": 2231, "3": "ET", "4": "Ethiopia", "8": { "1": 91450000, "2": 404896730 }, "10": 1 }, { "1": 2583, "3": "FM", "4": "Micronesia", "8": { "1": 74255540, "2": 1505508120 }, "10": 1 }, { "1": 2242, "3": "FJ", "4": "Fiji", "8": { "1": -177133710, "2": 1780650320 }, "10": 1 }, { "1": 2246, "3": "FI", "4": "Finland", "8": { "1": 619241100, "2": 257481510 }, "10": 1 }, { "1": 2250, "3": "FR", "4": "France", "8": { "1": 462276380, "2": 22137490 }, "10": 1 }, { "1": 2258, "3": "PF", "4": "French Polynesia", "8": { "1": -176797420, "2": -1494068430 }, "10": 1 }, { "1": 2260, "3": "TF", "4": "French Southern and Antarctic Lands", "8": { "1": -492803660, "2": 693485570 }, "10": 1 }, { "1": 2266, "3": "GA", "4": "Gabon", "8": { "1": -8036890, "2": 116094440 }, "10": 1 }, { "1": 2268, "3": "GE", "4": "Georgia", "8": { "1": 423154070, "2": 433568920 }, "10": 1 }, { "1": 2276, "3": "DE", "4": "Germany", "5": "Germany", "8": { "1": 511656910, "2": 104515260 }, "10": 1 }, { "1": 2288, "3": "GH", "4": "Ghana", "8": { "1": 79465270, "2": -10231940 }, "10": 1 }, { "1": 2300, "3": "GR", "4": "Greece", "8": { "1": 390742080, "2": 218243120 }, "10": 1 }, { "1": 2308, "3": "GD", "4": "Grenada", "8": { "1": 121165000, "2": -616790000 }, "10": 1 }, { "1": 2316, "3": "GU", "4": "Guam", "8": { "1": 133823791, "2": 1446972774 }, "10": 1 }, { "1": 2320, "3": "GT", "4": "Guatemala", "8": { "1": 157834710, "2": -902307590 }, "10": 1 }, { "1": 2831, "3": "GG", "4": "Guernsey", "8": { "1": 494481808, "2": -25894685 }, "10": 1 }, { "1": 2324, "3": "GN", "4": "Guinea", "8": { "1": 99455870, "2": -96966450 }, "10": 1 }, { "1": 2624, "3": "GW", "4": "Guinea-Bissau", "8": { "1": 118037490, "2": -151804130 }, "10": 1 }, { "1": 2328, "3": "GY", "4": "Guyana", "8": { "1": 48604160, "2": -589301800 }, "10": 1 }, { "1": 2332, "3": "HT", "4": "Haiti", "8": { "1": 189711870, "2": -722852150 }, "10": 1 }, { "1": 2334, "3": "HM", "4": "Heard Island and McDonald Islands", "8": { "1": -530818100, "2": 735041580 }, "10": 1 }, { "1": 2340, "3": "HN", "4": "Honduras", "8": { "1": 151999990, "2": -862419050 }, "10": 1 }, { "1": 2348, "3": "HU", "4": "Hungary", "8": { "1": 471624940, "2": 195033040 }, "10": 1 }, { "1": 2352, "3": "IS", "4": "Iceland", "8": { "1": 649630510, "2": -190208350 }, "10": 1 }, { "1": 2356, "3": "IN", "4": "India", "8": { "1": 205936840, "2": 789628800 }, "10": 1 }, { "1": 2360, "3": "ID", "4": "Indonesia", "8": { "1": -7892750, "2": 1139213270 }, "10": 1 }, { "1": 2368, "3": "IQ", "4": "Iraq", "8": { "1": 332231910, "2": 436792910 }, "10": 1 }, { "1": 2372, "3": "IE", "4": "Ireland", "8": { "1": 534129100, "2": -82438900 }, "10": 1 }, { "1": 2376, "3": "IL", "4": "Israel", "8": { "1": 310460510, "2": 348516120 }, "10": 1 }, { "1": 2380, "3": "IT", "4": "Italy", "8": { "1": 418719400, "2": 125673800 }, "10": 1 }, { "1": 2388, "3": "JM", "4": "Jamaica", "8": { "1": 181095810, "2": -772975080 }, "10": 1 }, { "1": 2392, "3": "JP", "4": "Japan", "8": { "1": 362048240, "2": 1382529240 }, "10": 1 }, { "1": 2832, "3": "JE", "4": "Jersey", "8": { "1": 492137711, "2": -21357662 }, "10": 1 }, { "1": 2400, "3": "JO", "4": "Jordan", "8": { "1": 305851640, "2": 362384140 }, "10": 1 }, { "1": 2398, "3": "KZ", "4": "Kazakhstan", "8": { "1": 480195730, "2": 669236840 }, "10": 1 }, { "1": 2404, "3": "KE", "4": "Kenya", "8": { "1": -235590, "2": 379061930 }, "10": 1 }, { "1": 2296, "3": "KI", "4": "Kiribati", "8": { "1": 14421300, "2": 1729829763 }, "10": 1 }, { "1": 2414, "3": "KW", "4": "Kuwait", "8": { "1": 293116600, "2": 474817660 }, "10": 1 }, { "1": 2417, "3": "KG", "4": "Kyrgyzstan", "8": { "1": 412043800, "2": 747660980 }, "10": 1 }, { "1": 2418, "3": "LA", "4": "Laos", "8": { "1": 198562700, "2": 1024954960 }, "10": 1 }, { "1": 2428, "3": "LV", "4": "Latvia", "8": { "1": 568796350, "2": 246031890 }, "10": 1 }, { "1": 2422, "3": "LB", "4": "Lebanon", "8": { "1": 338547210, "2": 358622850 }, "10": 1 }, { "1": 2426, "3": "LS", "4": "Lesotho", "8": { "1": -296099880, "2": 282336080 }, "10": 1 }, { "1": 2430, "3": "LR", "4": "Liberia", "8": { "1": 64280550, "2": -94294990 }, "10": 1 }, { "1": 2434, "3": "LY", "4": "Libya", "8": { "1": 263351000, "2": 172283310 }, "10": 1 }, { "1": 2438, "3": "LI", "4": "Liechtenstein", "8": { "1": 471410392, "2": 95209350 }, "10": 1 }, { "1": 2440, "3": "LT", "4": "Lithuania", "8": { "1": 551694380, "2": 238812750 }, "10": 1 }, { "1": 2442, "3": "LU", "4": "Luxembourg", "5": "Luxembourg", "8": { "1": 498152730, "2": 61295830 }, "10": 1 }, { "1": 2450, "3": "MG", "4": "Madagascar", "8": { "1": -187669470, "2": 468691070 }, "10": 1 }, { "1": 2454, "3": "MW", "4": "Malawi", "8": { "1": -132543080, "2": 343015250 }, "10": 1 }, { "1": 2458, "3": "MY", "4": "Malaysia", "8": { "1": 42104840, "2": 1019757660 }, "10": 1 }, { "1": 2462, "3": "MV", "4": "Maldives", "8": { "1": 32027780, "2": 732206800 }, "10": 1 }, { "1": 2470, "3": "MT", "4": "Malta", "8": { "1": 359374960, "2": 143754160 }, "10": 1 }, { "1": 2466, "3": "ML", "4": "Mali", "8": { "1": 175706920, "2": -39961660 }, "10": 1 }, { "1": 2584, "3": "MH", "4": "Marshall Islands", "8": { "1": 71314740, "2": 1711844780 }, "10": 1 }, { "1": 2478, "3": "MR", "4": "Mauritania", "8": { "1": 210078900, "2": -109408350 }, "10": 1 }, { "1": 2480, "3": "MU", "4": "Mauritius", "8": { "1": -203484040, "2": 575521520 }, "10": 1 }, { "1": 2484, "3": "MX", "4": "Mexico", "8": { "1": 236345010, "2": -1025527840 }, "10": 1 }, { "1": 2498, "3": "MD", "4": "Moldova", "8": { "1": 474116310, "2": 283698850 }, "10": 1 }, { "1": 2492, "3": "MC", "4": "Monaco", "8": { "1": 437384176, "2": 74246158 }, "10": 1 }, { "1": 2496, "3": "MN", "4": "Mongolia", "8": { "1": 468624960, "2": 1038466560 }, "10": 1 }, { "1": 2499, "3": "ME", "4": "Montenegro", "8": { "1": 427086780, "2": 193743900 }, "10": 1 }, { "1": 2504, "3": "MA", "4": "Morocco", "8": { "1": 317917020, "2": -70926200 }, "10": 1 }, { "1": 2508, "3": "MZ", "4": "Mozambique", "8": { "1": -186656950, "2": 355295620 }, "10": 1 }, { "1": 2104, "3": "MM", "4": "Myanmar (Burma)", "8": { "1": 219162210, "2": 959559740 }, "10": 1 }, { "1": 2516, "3": "NA", "4": "Namibia", "8": { "1": -229576400, "2": 184904100 }, "10": 1 }, { "1": 2520, "3": "NR", "4": "Nauru", "8": { "1": -5227780, "2": 1669315030 }, "10": 1 }, { "1": 2524, "3": "NP", "4": "Nepal", "8": { "1": 283948570, "2": 841240080 }, "10": 1 }, { "1": 2528, "3": "NL", "4": "Netherlands", "5": "Netherlands", "8": { "1": 521326330, "2": 52912660 }, "10": 1 }, { "1": 2540, "3": "NC", "4": "New Caledonia", "8": { "1": -209043050, "2": 1656180420 }, "10": 1 }, { "1": 2554, "3": "NZ", "4": "New Zealand", "8": { "1": -409005570, "2": 1748859710 }, "10": 1 }, { "1": 2558, "3": "NI", "4": "Nicaragua", "8": { "1": 128654160, "2": -852072290 }, "10": 1 }, { "1": 2562, "3": "NE", "4": "Niger", "8": { "1": 176077890, "2": 80816660 }, "10": 1 }, { "1": 2566, "3": "NG", "4": "Nigeria", "8": { "1": 90819990, "2": 86752770 }, "10": 1 }, { "1": 2570, "3": "NU", "4": "Niue", "8": { "1": -190544450, "2": -1698672330 }, "10": 1 }, { "1": 2574, "3": "NF", "4": "Norfolk Island", "8": { "1": -290408350, "2": 1679547120 }, "10": 1 }, { "1": 2807, "3": "MK", "4": "North Macedonia", "5": "North Macedonia", "8": { "1": 416086350, "2": 217452750 }, "10": 1 }, { "1": 2580, "3": "MP", "4": "Northern Mariana Islands", "8": { "1": 150979000, "2": 1456739000 }, "10": 1 }, { "1": 2578, "3": "NO", "4": "Norway", "8": { "1": 604720240, "2": 84689460 }, "10": 1 }, { "1": 2512, "3": "OM", "4": "Oman", "8": { "1": 214735329, "2": 559754130 }, "10": 1 }, { "1": 2586, "3": "PK", "4": "Pakistan", "8": { "1": 303753210, "2": 693451160 }, "10": 1 }, { "1": 2585, "3": "PW", "4": "Palau", "8": { "1": 75149800, "2": 1345825200 }, "10": 1 }, { "1": 2591, "3": "PA", "4": "Panama", "8": { "1": 85379810, "2": -807821270 }, "10": 1 }, { "1": 2598, "3": "PG", "4": "Papua New Guinea", "8": { "1": -63149930, "2": 1439555500 }, "10": 1 }, { "1": 2600, "3": "PY", "4": "Paraguay", "8": { "1": -234425030, "2": -584438320 }, "10": 1 }, { "1": 2604, "3": "PE", "4": "Peru", "8": { "1": -91899670, "2": -750151520 }, "10": 1 }, { "1": 2608, "3": "PH", "4": "Philippines", "8": { "1": 128797210, "2": 1217740170 }, "10": 1 }, { "1": 2612, "3": "PN", "4": "Pitcairn Islands", "8": { "1": -243767537, "2": -1283242376 }, "10": 1 }, { "1": 2616, "3": "PL", "4": "Poland", "8": { "1": 519194380, "2": 191451360 }, "10": 1 }, { "1": 2620, "3": "PT", "4": "Portugal", "8": { "1": 393998720, "2": -82244540 }, "10": 1 }, { "1": 2634, "3": "QA", "4": "Qatar", "8": { "1": 253548260, "2": 511838840 }, "10": 1 }, { "1": 2178, "3": "CG", "4": "Republic of the Congo", "8": { "1": -2280210, "2": 158276590 }, "10": 1 }, { "1": 2642, "3": "RO", "4": "Romania", "8": { "1": 459431610, "2": 249667600 }, "10": 1 }, { "1": 2646, "3": "RW", "4": "Rwanda", "8": { "1": -19402780, "2": 298738880 }, "10": 1 }, { "1": 2654, "3": "SH", "4": "Saint Helena, Ascension and Tristan da Cunha", "5": "St Helena, Ascension and Tristan da Cunha", "8": { "1": -159583317, "2": -57019989 }, "10": 1 }, { "1": 2659, "3": "KN", "4": "Saint Kitts and Nevis", "5": "St Kitts & Nevis", "8": { "1": 173578220, "2": -627829980 }, "10": 1 }, { "1": 2662, "3": "LC", "4": "Saint Lucia", "5": "St Lucia", "8": { "1": 139094440, "2": -609788930 }, "10": 1 }, { "1": 2666, "3": "PM", "4": "Saint Pierre and Miquelon", "5": "St Pierre and Miquelon", "8": { "1": 468852000, "2": -563159000 }, "10": 1 }, { "1": 2670, "3": "VC", "4": "Saint Vincent and the Grenadines", "5": "St Vincent and the Grenadines", "8": { "1": 129843050, "2": -612872280 }, "10": 1 }, { "1": 2882, "3": "WS", "4": "Samoa", "8": { "1": -137590290, "2": -1721046290 }, "10": 1 }, { "1": 2674, "3": "SM", "4": "San Marino", "8": { "1": 439423600, "2": 124577770 }, "10": 1 }, { "1": 2678, "3": "ST", "4": "Sao Tome and Principe", "8": { "1": 1863600, "2": 66130810 }, "10": 1 }, { "1": 2682, "3": "SA", "4": "Saudi Arabia", "8": { "1": 238859420, "2": 450791620 }, "10": 1 }, { "1": 2686, "3": "SN", "4": "Senegal", "8": { "1": 144974010, "2": -144523620 }, "10": 1 }, { "1": 2690, "3": "SC", "4": "Seychelles", "8": { "1": -46795740, "2": 554919770 }, "10": 1 }, { "1": 2694, "3": "SL", "4": "Sierra Leone", "8": { "1": 84605550, "2": -117798890 }, "10": 1 }, { "1": 2702, "3": "SG", "4": "Singapore", "8": { "1": 13520830, "2": 1038198360 }, "10": 1 }, { "1": 2534, "3": "SX", "4": "Sint Maarten", "8": { "1": 180424800, "2": -630548300 }, "10": 1 }, { "1": 2703, "3": "SK", "4": "Slovakia", "5": "Slovakia", "8": { "1": 486690260, "2": 196990240 }, "10": 1 }, { "1": 2705, "3": "SI", "4": "Slovenia", "8": { "1": 461512410, "2": 149954630 }, "10": 1 }, { "1": 2090, "3": "SB", "4": "Solomon Islands", "8": { "1": -96457100, "2": 1601561940 }, "10": 1 }, { "1": 2706, "3": "SO", "4": "Somalia", "8": { "1": 51521490, "2": 461996160 }, "10": 1 }, { "1": 2710, "3": "ZA", "4": "South Africa", "8": { "1": -305594820, "2": 229375060 }, "10": 1 }, { "1": 2239, "3": "GS", "4": "South Georgia and the South Sandwich Islands", "8": { "1": -544295790, "2": -365879090 }, "10": 1 }, { "1": 2410, "3": "KR", "4": "South Korea", "8": { "1": 359077570, "2": 1277669220 }, "10": 1 }, { "1": 2724, "3": "ES", "4": "Spain", "8": { "1": 404636670, "2": -37492200 }, "10": 1 }, { "1": 2144, "3": "LK", "4": "Sri Lanka", "8": { "1": 78730540, "2": 807717970 }, "10": 1 }, { "1": 2740, "3": "SR", "4": "Suriname", "8": { "1": 39193050, "2": -560277830 }, "10": 1 }, { "1": 2756, "3": "CH", "4": "Switzerland", "8": { "1": 468181880, "2": 82275120 }, "10": 1 }, { "1": 2752, "3": "SE", "4": "Sweden", "8": { "1": 601281610, "2": 186435010 }, "10": 1 }, { "1": 2762, "3": "TJ", "4": "Tajikistan", "8": { "1": 388610340, "2": 712760930 }, "10": 1 }, { "1": 2834, "3": "TZ", "4": "Tanzania", "8": { "1": -63690280, "2": 348888220 }, "10": 1 }, { "1": 2764, "3": "TH", "4": "Thailand", "8": { "1": 158700320, "2": 1009925410 }, "10": 1 }, { "1": 2044, "3": "BS", "4": "The Bahamas", "8": { "1": 250342800, "2": -773962800 }, "10": 1 }, { "1": 2270, "3": "GM", "4": "The Gambia", "8": { "1": 134431820, "2": -153101390 }, "10": 1 }, { "1": 2626, "3": "TL", "4": "Timor-Leste", "8": { "1": -88742170, "2": 1257275390 }, "10": 1 }, { "1": 2768, "3": "TG", "4": "Togo", "8": { "1": 86195430, "2": 8247820 }, "10": 1 }, { "1": 2772, "3": "TK", "4": "Tokelau", "8": { "1": -92002000, "2": -1718484000 }, "10": 1 }, { "1": 2776, "3": "TO", "4": "Tonga", "8": { "1": -211789860, "2": -1751982420 }, "10": 1 }, { "1": 2780, "3": "TT", "4": "Trinidad and Tobago", "8": { "1": 106918030, "2": -612225030 }, "10": 1 }, { "1": 2788, "3": "TN", "4": "Tunisia", "8": { "1": 338869170, "2": 95374990 }, "10": 1 }, { "1": 2792, "3": "TR", "4": "Turkiye", "5": "Türkiye", "8": { "1": 389637450, "2": 352433220 }, "10": 1 }, { "1": 2795, "3": "TM", "4": "Turkmenistan", "8": { "1": 389697190, "2": 595562780 }, "10": 1 }, { "1": 2798, "3": "TV", "4": "Tuvalu", "8": { "1": -71095350, "2": 1776493300 }, "10": 1 }, { "1": 2800, "3": "UG", "4": "Uganda", "8": { "1": 13733330, "2": 322902750 }, "10": 1 }, { "1": 2804, "3": "UA", "4": "Ukraine", "8": { "1": 483794330, "2": 311655800 }, "10": 1 }, { "1": 2784, "3": "AE", "4": "United Arab Emirates", "8": { "1": 234240760, "2": 538478180 }, "10": 1 }, { "1": 2826, "3": "GB", "4": "United Kingdom", "8": { "1": 553780510, "2": -34359730 }, "10": 1 }, { "1": 2840, "3": "US", "4": "United States", "5": "United States", "8": { "1": 387945952, "2": -1065348379 }, "10": 1 }, { "1": 2858, "3": "UY", "4": "Uruguay", "8": { "1": -325227790, "2": -557658350 }, "10": 1 }, { "1": 2860, "3": "UZ", "4": "Uzbekistan", "8": { "1": 413774910, "2": 645852620 }, "10": 1 }, { "1": 2548, "3": "VU", "4": "Vanuatu", "5": "Vanuatu", "8": { "1": -153767060, "2": 1669591580 }, "10": 1 }, { "1": 2336, "3": "VA", "4": "Vatican City", "5": "Vatican City", "8": { "1": 419029160, "2": 124533890 }, "10": 1 }, { "1": 2862, "3": "VE", "4": "Venezuela", "8": { "1": 64237500, "2": -665897300 }, "10": 1 }, { "1": 2704, "3": "VN", "4": "Vietnam", "8": { "1": 140583240, "2": 1082771990 }, "10": 1 }, { "1": 2887, "3": "YE", "4": "Yemen", "8": { "1": 155527270, "2": 485163880 }, "10": 1 }, { "1": 2894, "3": "ZM", "4": "Zambia", "8": { "1": -131338970, "2": 278493320 }, "10": 1 }, { "1": 2716, "3": "ZW", "4": "Zimbabwe", "8": { "1": -190154380, "2": 291548570 }, "10": 1 }, { "1": 2060, "3": "BM", "4": "Bermuda", "8": { "1": 323078000, "2": -647505000 }, "10": 2 }, { "1": 2074, "3": "BV", "4": "Bouvet Island", "8": { "1": -544231990, "2": 34131940 }, "10": 2 }, { "1": 2086, "3": "IO", "4": "British Indian Ocean Territory", "8": { "1": -63431940, "2": 718765190 }, "10": 2 }, { "1": 2092, "3": "VG", "4": "British Virgin Islands", "8": { "1": 184206950, "2": -646399680 }, "10": 2 }, { "1": 20277, "3": "IC", "4": "Canary Islands", "5": "Canary Islands", "8": { "1": 282915637, "2": -166291304 }, "10": 5 }, { "1": 2136, "3": "KY", "4": "Cayman Islands", "8": { "1": 193133000, "2": -812546000 }, "10": 2 }, { "1": 2158, "3": "TW", "4": "Taiwan", "8": { "1": 236978100, "2": 1209605150 }, "10": 2 }, { "1": 2175, "3": "YT", "4": "Mayotte", "8": { "1": -128275000, "2": 451662440 }, "10": 2 }, { "1": 2234, "3": "FO", "4": "Faroe Islands", "8": { "1": 618926350, "2": -69118060 }, "10": 2 }, { "1": 2238, "3": "FK", "4": "Falkland Islands (Islas Malvinas)", "8": { "1": -517962530, "2": -595236130 }, "10": 2 }, { "1": 2254, "3": "GF", "4": "French Guiana", "8": { "1": 39338890, "2": -531257820 }, "10": 2 }, { "1": 2275, "3": "PS", "4": "Palestine", "5": "Palestine", "8": { "1": 319521620, "2": 352331540 }, "10": 2 }, { "1": 2292, "3": "GI", "4": "Gibraltar", "8": { "1": 361407510, "2": -53535850 }, "10": 2 }, { "1": 2304, "3": "GL", "4": "Greenland", "8": { "1": 717069360, "2": -426043030 }, "10": 2 }, { "1": 2312, "3": "GP", "4": "Guadeloupe", "8": { "1": 162650000, "2": -615510000 }, "10": 2 }, { "1": 2344, "3": "HK", "4": "Hong Kong", "8": { "1": 223193039, "2": 1141693611 }, "10": 2 }, { "1": 2833, "3": "IM", "4": "Isle of Man", "8": { "1": 542361070, "2": -45480560 }, "10": 1 }, { "1": 2446, "3": "MO", "4": "Macao", "5": "Macao", "8": { "1": 221987450, "2": 1135438730 }, "10": 2 }, { "1": 2474, "3": "MQ", "4": "Martinique", "8": { "1": 146415280, "2": -610241740 }, "10": 2 }, { "1": 2500, "3": "MS", "4": "Montserrat", "8": { "1": 167424980, "2": -621873660 }, "10": 2 }, { "1": 2533, "3": "AW", "4": "Aruba", "8": { "1": 125211100, "2": -699683380 }, "10": 2 }, { "1": 2630, "3": "PR", "4": "Puerto Rico", "8": { "1": 182208330, "2": -665901490 }, "10": 2 }, { "1": 2638, "3": "RE", "4": "Reunion", "5": "Réunion", "8": { "1": -211151410, "2": 555363840 }, "10": 2 }, { "1": 2660, "3": "AI", "4": "Anguilla", "8": { "1": 182205540, "2": -630686150 }, "10": 2 }, { "1": 2732, "3": "EH", "4": "Western Sahara", "8": { "1": 242155270, "2": -128858340 }, "10": 2 }, { "1": 2663, "3": "MF", "4": "Saint Martin", "5": "St Martin", "8": { "1": 180825500, "2": -630522510 }, "10": 1 }, { "1": 2744, "3": "SJ", "4": "Svalbard and Jan Mayen", "8": { "1": 775536040, "2": 236702720 }, "10": 2 }, { "1": 2796, "3": "TC", "4": "Turks and Caicos Islands", "8": { "1": 216940250, "2": -717979280 }, "10": 2 }, { "1": 2581, "3": "UM", "4": "United States Minor Outlying Islands", "8": { "1": 192823192, "2": 1666470470 }, "10": 1 }, { "1": 2850, "3": "VI", "4": "U.S. Virgin Islands", "5": "U.S. Virgin Islands", "8": { "1": 183357650, "2": -648963350 }, "10": 2 }, { "1": 2876, "3": "WF", "4": "Wallis and Futuna", "8": { "1": -142938000, "2": -1781165000 }, "10": 1 } ] }}
src0/search_advertiser_creatives.js
1import https from "https";2
3export async function searchForAds(4 advertiserId,5 RegionCode = null,6 format,7 dateRange,8 platform,9 limitResults = null,10 isPolitical11) {12 let selectedRegion;13 let allResults = [];14 let nextPageToken = null;15 const isDomain = advertiserId.includes(".");16 const adjustedLimit = limitResults ? Math.min(limitResults, 100) : 40; // Ensure limitResults does not exceed 100, default to 4017
18
19 do {20 const requestPayload = isPolitical21 ? {22 "2": adjustedLimit,23 "3": {24 "1": advertiserId,25 ...(format !== 0 && { "4": format }), // Ensure format is added only if non-zero26 ...(RegionCode && { "8": [RegionCode] }),27 "12": { "1": "", "2": true },28 ...(platform && { "14": [platform] })29 },30 "6": { "1": 3, "2": true },31 "7": { "1": 2, "2": 30, "3": selectedRegion || 1 } // Ensure fallback for selectedRegion32 }33 : isDomain34 ? {35 "2": adjustedLimit,36 "3": {37 ...(format !== 0 && { "4": format }),38 ...(RegionCode && { "8": [RegionCode] }),39 "12": { "1": advertiserId, "2": true },40 ...(platform && { "14": [platform] })41 },42 "7": { "1": 1, "2": 30, "3": selectedRegion || 1 }43 }44 : {45 "2": adjustedLimit,46 "3": {47 ...(format !== 0 && { "4": format }),48 ...(RegionCode && { "8": [RegionCode] }),49 "12": { "1": "", "2": true },50 "13": { "1": [advertiserId] },51 ...(platform && { "14": [platform] })52 },53 "7": { "1": 1, "2": 30, "3": selectedRegion || 1 }54 };55
56 console.log(`isPolitical ${isPolitical}`);57 if (!dateRange?.anyTime) {58 requestPayload["3"]["6"] = dateRange.fromDate;59 requestPayload["3"]["7"] = dateRange.toDate;60 }61
62 if (nextPageToken) {63 requestPayload["4"] = nextPageToken;64 }65
66 const postData = new URLSearchParams({67 "f.req": JSON.stringify(requestPayload)68 }).toString();69
70 const agent = new https.Agent({ keepAlive: true });71 const options = {72 agent,73 hostname: "adstransparency.google.com",74 path: "/anji/_/rpc/SearchService/SearchCreatives?authuser=0",75 method: "POST",76 headers: {77 "Content-Type": "application/x-www-form-urlencoded",78 "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36",79 "Connection": "keep-alive",80 "Content-Length": Buffer.byteLength(String(postData)),81 }82 };83
84 //console.log(`requestPayload ${JSON.stringify(requestPayload, null, 2)}`);85 const jsonResponse = await new Promise((resolve, reject) => {86 const req = https.request(options, (res) => {87 let data = "";88 //console.log(`statusCode : ${res.statusCode} | requestPayload ${JSON.stringify(requestPayload, null, 2)}`);89
90 res.on("data", (chunk) => { data += chunk; });91
92 //console.log(`data : ${data} `);93 res.on("end", () => {94 if (res.statusCode >= 400) {95 console.error(`❌ HTTP Error ${res.statusCode}: ${data}`);96 reject(new Error(`HTTP ${res.statusCode}: ${data}`));97 return;98 }99
100 if (!data) {101 console.error("❌ Empty response received");102 reject(new Error("Empty response from server"));103 return;104 }105
106 let parsedResponse;107 try {108 parsedResponse = JSON.parse(data);109 } catch (error) {110 console.error("❌ JSON Parsing Error:", error.message);111 reject(new Error(`Invalid JSON response: ${data}`));112 return;113 }114
115 //console.log(`parsedResponse ${JSON.stringify(parsedResponse, null, 2)}`);116
117 if (!parsedResponse || typeof parsedResponse !== "object") {118 reject(new Error("Invalid JSON response"));119 return;120 }121
122 resolve(parsedResponse);123 });124 });125
126 req.on("error", (err) => {127 console.error("❌ Request Error:", err.message);128 reject(err);129 });130
131 req.write(postData);132 req.end();133 });134
135 if (jsonResponse["1"]) {136 allResults = allResults.concat(jsonResponse["1"]);137 }138
139 nextPageToken = jsonResponse["2"] || null;140 console.log(`search_advertiser_creatives - 🔹 Next Page Token: ${nextPageToken ? nextPageToken : "None"}`);141
142 // Stop fetching if limitResults is reached143 if (limitResults && allResults.length >= limitResults) {144 console.log(`✅ Limit reached: Returning first ${limitResults} results.`);145 return allResults.slice(0, limitResults);146 }147 } while (nextPageToken);148 console.log(`data for : ${advertiserId} - ✅ Total results fetched: ${allResults.length}`);149 return allResults; // Process and save the results ;150}
src0/search_for_an_ads.js
1import { searchForAds } from "./search_advertiser_creatives.js";2import { processCreativeDetails } from "./get_creative_details.js";3import https from "https";4
5// Regular expression to detect advertiser IDs6const advertiserIdPattern = /^AR\d+$/;7
8// Function to extract advertiser ID from a URL9function extractAdvertiserIdFromUrl(url) {10 const match = url.match(/advertiser\/(AR\d+)/);11 return match ? match[1] : null;12}13
14export async function searchForAdsList(keyword_domain_advertiserid, maxAdvertisers, maxDomains, RegionCode = null, format, dateRange, platform, limitResults, domainExists) {15 let advertiserid_domain = []; // Store valid advertiser IDs16 let keywords_domains = []; // Store non-advertiser keywords_domains17
18 console.log('domain Exists', domainExists);19
20 // Normalize input into an array21 const inputList = Array.isArray(keyword_domain_advertiserid) ? keyword_domain_advertiserid : [keyword_domain_advertiserid];22
23 // Validate each item24 inputList.forEach(item => {25 if (typeof item !== "string") return;26
27 let extractedId = item.startsWith("http") ? extractAdvertiserIdFromUrl(item) : item;28
29 if (advertiserIdPattern.test(extractedId)|| domainExists) {30 advertiserid_domain.push(extractedId); // Store advertiser ID and domains31 } else {32 keywords_domains.push(item); // Treat as a keyword/domain33 }34 });35
36 // If advertiser IDs exist OR domainExists is true, process them immediately and SKIP API request37 if (advertiserid_domain.length > 0 || domainExists) {38 console.log(`🚀 Processing advertiser IDs directly (domainExists: ${domainExists}):`, advertiserid_domain);39 const adPromises = advertiserid_domain.map(id => searchForAds(id, RegionCode, format, dateRange, platform, limitResults));40 const adResults = await Promise.all(adPromises);41 const creativeDetails = await processCreativeDetails(adResults.flat().filter(Boolean), RegionCode);42 return creativeDetails.flat().filter(Boolean);43 }44
45
46 // If no keywords_domains exist, return no data (avoids unnecessary request)47 if (keywords_domains.length === 0) {48 console.warn(`⚠️ No valid keywords_domains found. Skipping API request.`);49 return { message: "No data", keyword_domain_advertiserid };50 }51
52 console.log(`📡 Sending API request for keywords_domains:`, keywords_domains);53
54 // Fix: If there's only one keyword, send it as a string. If multiple, send as an array.55 const requestPayload = {56 "1": keywords_domains.length === 1 ? keywords_domains[0] : keywords_domains,57 "2": maxAdvertisers,58 "3": maxDomains,59 "4": RegionCode ? [RegionCode] : []60 };61
62 console.log(`requestPayload ${JSON.stringify(requestPayload, null, 2)}`);63
64 const postData = new URLSearchParams({65 "f.req": JSON.stringify(requestPayload)66 }).toString();67
68 const agent = new https.Agent({ keepAlive: true });69 const options = {70 agent,71 hostname: "adstransparency.google.com",72 path: "/anji/_/rpc/SearchService/SearchSuggestions?authuser=0",73 method: "POST",74 headers: {75 "Content-Type": "application/x-www-form-urlencoded",76 "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36",77 "Connection": "keep-alive",78 "Content-Length": Buffer.byteLength(String(postData)),79 }80 };81
82 return new Promise((resolve, reject) => {83 const req = https.request(options, (res) => {84 let data = "";85
86 res.on("data", (chunk) => (data += chunk));87
88 res.on("end", async () => {89 if (res.statusCode >= 400) {90 console.error(`❌ HTTP Error ${res.statusCode}: ${data}`);91 return reject(new Error(`HTTP ${res.statusCode}: ${data}`));92 }93
94 try {95 const jsonResponse = JSON.parse(data);96 const promises = [];97 //console.log(`statusCode : ${res.statusCode} | jsonResponse ${JSON.stringify(jsonResponse, null, 2)}`);98
99 // Ensure jsonResponse["1"] is an array before processing100 if (Array.isArray(jsonResponse["1"])) {101 promises.push(...jsonResponse["1"].map(async (item) => {102 let advertiserId = null;103
104 if (item["1"] && item["1"]["2"]) {105 advertiserId = item["1"]["2"];106 } else if (item["2"] && item["2"]["1"]) {107 advertiserId = item["2"]["1"];108 }109
110 return advertiserId ? searchForAds(advertiserId, RegionCode, format, dateRange, platform, limitResults) : null;111 }));112 }113
114 // Wait for all promises to resolve115 const allResults = await Promise.all(promises);116 const creativeDetails = await processCreativeDetails(allResults.flat().filter(Boolean), RegionCode);117 resolve(creativeDetails.flat().filter(Boolean));118
119 } catch (error) {120 console.error("❌ JSON Parsing Error:", error);121 reject(error);122 }123 });124 });125
126 req.on("error", (err) => {127 console.error("❌ Request Error:", err.message);128 reject(err);129 });130
131 req.write(postData);132 req.end();133 });134}
src0/search_for_an_political_ads.js
1import { searchForAds } from "./search_advertiser_creatives.js";2import { processCreativeDetails } from "./get_creative_details.js";3import https from "https";4
5// Regular expression to detect advertiser IDs6const advertiserIdPattern = /^AR\d+$/;7
8// Function to extract advertiser ID from a URL9function extractAdvertiserIdFromUrl(url) {10 const match = url.match(/advertiser\/(AR\d+)/);11 return match ? match[1] : null;12}13
14export async function searchForPoliticalAdsList(keyword_advertiserid, maxAdvertisers, RegionCode = null, format, dateRange, platform, limitResults) {15 let advertiserid = []; // Store valid advertiser IDs16 let key_advid = []; // Store non-advertiser keyword or advertiserid17 let isPolitical = true18 // Normalize input into an array19 const inputList = Array.isArray(keyword_advertiserid) ? keyword_advertiserid : [keyword_advertiserid];20
21 // Validate each item22 inputList.forEach(item => {23 if (typeof item !== "string") return;24
25 let extractedId = item.startsWith("http") ? extractAdvertiserIdFromUrl(item) : item;26
27 if (advertiserIdPattern.test(extractedId)) {28 advertiserid.push(extractedId); // Store advertiser ID29 } else {30 key_advid.push(item); // Treat as a keyword31 }32 });33
34 // If advertiser IDs exist, process it immediately and SKIP API request35 if (advertiserid.length > 0) {36 console.log(`🚀 Processing advertiser IDs directly :`, advertiserid);37 const adPromises = advertiserid.map(id => searchForAds(id, RegionCode, format, dateRange, platform, limitResults, isPolitical));38 const adResults = await Promise.all(adPromises);39 const creativeDetails = await processCreativeDetails(adResults.flat().filter(Boolean), RegionCode);40 return creativeDetails.flat().filter(Boolean);41 }42
43 // If no keyword or advertiserid exist, return no data (avoids unnecessary request)44 if (key_advid.length === 0) {45 console.warn(`⚠️ No valid keyword or advertiserid found. Skipping API request.`);46 return { message: "No data", keyword_advertiserid };47 }48
49 console.log(`📡 Sending API request for keyword or advertiserid:`, key_advid);50
51 // Fix: If there's only one keyword, send it as a string. If multiple, send as an array.52 const requestPayload = {53 "2": maxAdvertisers,54 "4": {55 "2": RegionCode ? [RegionCode] : [],56 "3": Array.isArray(key_advid) ? key_advid.join(",") : key_advid // Ensure a string57 },58 "7": {59 "1": 260 }61 };62
63 console.log(`requestPayload ${JSON.stringify(requestPayload, null, 2)}`);64 const postData = new URLSearchParams({65 "f.req": JSON.stringify(requestPayload)66 }).toString();67
68 const agent = new https.Agent({ keepAlive: true });69 const options = {70 agent,71 hostname: "adstransparency.google.com",72 path: "/anji/_/rpc/SearchService/SearchAdvertisers?authuser=0",73 method: "POST",74 headers: {75 "Content-Type": "application/x-www-form-urlencoded",76 "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36",77 "Connection": "keep-alive",78 "Content-Length": Buffer.byteLength(String(postData)),79 }80 };81
82 return new Promise((resolve, reject) => {83 const req = https.request(options, (res) => {84 let data = "";85
86 res.on("data", (chunk) => (data += chunk));87
88 res.on("end", async () => {89 if (res.statusCode >= 400) {90 console.error(`❌ HTTP Error ${res.statusCode}: ${data}`);91 return reject(new Error(`HTTP ${res.statusCode}: ${data}`));92 }93
94 try {95 const jsonResponse = JSON.parse(data);96 const promises = [];97
98 console.log(`statusCode : ${res.statusCode} | jsonResponse ${JSON.stringify(jsonResponse, null, 2)}`);99 // Ensure jsonResponse["1"] is an array before processing100 if (Array.isArray(jsonResponse["1"])) {101 promises.push(...jsonResponse["1"].map(async (item) => {102 let advertiserId = null;103
104 // New response format handling105 if (item["1"]) {106 advertiserId = item["1"];107 }108
109 return advertiserId ? searchForAds(advertiserId, RegionCode, format, dateRange, platform, limitResults, isPolitical ) : null;110 }));111 }112
113 // Wait for all promises to resolve114 const allResults = await Promise.all(promises);115 const creativeDetails = await processCreativeDetails(allResults.flat().filter(Boolean), RegionCode);116 resolve(creativeDetails.flat().filter(Boolean));117
118 } catch (error) {119 console.error("❌ JSON Parsing Error:", error);120 reject(error);121 }122 });123 });124
125 req.on("error", (err) => {126 console.error("❌ Request Error:", err.message);127 reject(err);128 });129
130 req.write(postData);131 req.end();132 });133}
src3/main.js
1import { Actor } from 'apify';2import { CheerioCrawler, Dataset } from 'crawlee';3
4await Actor.init();5
6// Structure of input is defined in input_schema.json7const {8 keyword_domain_advertiserid,9 proxyConfig10} = await Actor.getInput() ?? {};11
12const proxyConfiguration = await Actor.createProxyConfiguration(proxyConfig);13const crawler = new CheerioCrawler({14 proxyConfiguration,15 useSessionPool: true,16 persistCookiesPerSession: true,17 additionalMimeTypes: ['application/json', 'text/plain'],18 // Use requestHandler to process the response19 async requestHandler({ request, response, $, body, log }) {20 log.info('Processing URL', { url: request.url });21
22 const responseHeaders = response.headers;23 const requestHeaders = response.request.options.headers;24
25 // Try to parse the response as JSON26 let responseData = null;27 try {28 // First attempt to use the body directly29 responseData = JSON.parse(body.toString());30 log.info('Response data parsed from body:', responseData);31 } catch (e) {32 // If that fails, try to extract it from the HTML if available33 if ($) {34 try {35 const bodyText = $('body').text();36 responseData = JSON.parse(bodyText);37 log.info('Response data parsed from HTML body:', responseData);38 } catch (e2) {39 log.error('Failed to parse JSON response', { error: e2.message });40 }41 } else {42 log.error('Failed to parse JSON response and no HTML found', { error: e.message });43 }44 }45
46 // Save data to Dataset47 await Dataset.pushData({48 url: request.url,49 requestHeaders: requestHeaders,50 responseHeaders: responseHeaders,51 statusCode: response.statusCode,52 responseBodyRaw: body.toString(), // Add the raw response body53 responseData: responseData // Save the JSON response if parsed54 });55 },56});57
58await crawler.run(keyword_domain_advertiserid);59
60// Gracefully exit the Actor process61await Actor.exit();
src3/routes.js
1import { Dataset, createPuppeteerRouter } from 'crawlee';2
3export const router = createPuppeteerRouter();4
5router.addDefaultHandler(async ({ enqueueLinks, log, page, request }) => {6 log.info(`Enqueueing new URLs`);7
8 // Capture all network requests and their headers9 const requestHeaders = [];10 page.on('request', (req) => {11 requestHeaders.push({12 url: req.url(),13 method: req.method(),14 headers: req.headers(),15 });16 });17
18 // Wait for the page to fully load19 await page.waitForLoadState('networkidle');20
21 // Get all cookies22 const cookies = await page.cookies();23
24 // Get User-Agent25 const userAgent = await page.evaluate(() => navigator.userAgent);26
27 await Dataset.pushData({28 url: request.url,29 cookies,30 userAgent,31 requestHeaders, // Store all captured request headers32 });33});34
35router.addHandler('detail', async ({ request, page, log }) => {36 const title = await page.title();37 log.info(`${title}`, { url: request.loadedUrl });38
39 // Capture all network requests and their headers40 const requestHeaders = [];41 page.on('request', (req) => {42 requestHeaders.push({43 url: req.url(),44 method: req.method(),45 headers: req.headers(),46 });47 });48
49 // Wait for the page to fully load50 await page.waitForLoadState('networkidle');51
52 // Get all cookies53 const cookies = await page.cookies();54
55 // Get User-Agent56 const userAgent = await page.evaluate(() => navigator.userAgent);57
58 await Dataset.pushData({59 url: request.loadedUrl,60 title,61 cookies,62 userAgent,63 requestHeaders, // Store all captured request headers64 });65});
.dockerignore
# configurations.idea
# crawlee and apify storage foldersapify_storagecrawlee_storagestorage
# installed filesnode_modules
# git folder.git
.editorconfig
root = true
[*]indent_style = spaceindent_size = 4charset = utf-8trim_trailing_whitespace = trueinsert_final_newline = trueend_of_line = lf
.eslintrc
{ "extends": "@apify", "root": true}
.gitignore
# This file tells Git which files shouldn't be added to source control
.DS_Store.ideadistnode_modulesapify_storagestorage
package.json
{ "name": "crawlee-puppeteer-javascript", "version": "0.0.1", "type": "module", "description": "This is an example of an Apify actor.", "dependencies": { "apify": "^3.2.6", "crawlee": "^3.11.5", "dayjs": "^1.11.13", "puppeteer": "^24.4.0" }, "devDependencies": { "@apify/eslint-config": "^0.4.0", "eslint": "^8.50.0" }, "scripts": { "start": "node src/main.js", "test": "echo \"Error: oops, the actor has no tests yet, sad!\" && exit 1" }, "author": "It's not you it's me", "license": "ISC"}
package0.json
{ "name": "crawlee-cheerio-javascript", "version": "0.0.1", "type": "module", "description": "This is a boilerplate of an Apify actor.", "engines": { "node": ">=18.0.0" }, "dependencies": { "apify": "^3.3.2", "crawlee": "^3.12.2", "dayjs": "^1.11.13" }, "devDependencies": { "@apify/eslint-config": "^0.4.0", "eslint": "^9.21.0" }, "scripts": { "start": "node src/main.js", "lint": "eslint ./src --ext .js,.jsx", "lint:fix": "eslint ./src --ext .js,.jsx --fix", "test": "echo \"Error: oops, the actor has no tests yet, sad!\" && exit 1" }, "author": "It's not you it's me", "license": "ISC"}
pnpm-lock.yaml
lockfileVersion: '9.0'
settings: autoInstallPeers: true excludeLinksFromLockfile: false
importers:
.: dependencies: apify: specifier: ^3.3.2 version: 3.3.2 crawlee: specifier: ^3.12.2 version: 3.12.2 devDependencies: '@apify/eslint-config': specifier: ^0.4.0 version: 0.4.0(eslint@9.21.0) eslint: specifier: ^9.21.0 version: 9.21.0
packages:
'@apify/consts@2.37.0': resolution: {integrity: sha512-GCK7wZcUPnHMUpoxd1tgbDgojdgcdxpnaF8UX5h5/hq5ZPdlik7EP2CkU6MpRfYxYl8T5LOsANUJvdB6bGthKA==}
'@apify/datastructures@2.0.2': resolution: {integrity: sha512-IN9A0s2SCHoZZE1tf4xKgk4fxHM5/0I/UrXhWbn/rSv7E5sA2o0NyHdwcMY2Go9f5qd+E7VAbX6WnESTE6GLeA==}
'@apify/eslint-config@0.4.0': resolution: {integrity: sha512-cXYQUstZ5wjIQMX9HM9GOg8+s0lWp9xF7Zee8bCl5QAkNJs5gKtCsKStv7v6A2hexUZ+N5HAEN2MFex9IIw2/g==} peerDependencies: eslint: '*'
'@apify/input_secrets@1.1.65': resolution: {integrity: sha512-1KGrkrG7nWWN0JFg1VxMKHJFjlEC21mncKkNV03QqQ1XeQg1h9hBoCM5yqWeBZt8AmAfJ8kju87ObukWD3ETbA==}
'@apify/log@2.5.13': resolution: {integrity: sha512-gxvWyD9JWBkLoTX7UfQ4s0F32/UfF4T8TG4jAl2CE0vNKr0COOJFkLmmyWnTNSVDL+yGC+LZp3mtbPnB+l6Sog==}
'@apify/ps-tree@1.2.0': resolution: {integrity: sha512-VHIswI7rD/R4bToeIDuJ9WJXt+qr5SdhfoZ9RzdjmCs9mgy7l0P4RugQEUCcU+WB4sfImbd4CKwzXcn0uYx1yw==} engines: {node: '>= 0.10'} hasBin: true
'@apify/pseudo_url@2.0.54': resolution: {integrity: sha512-HYUQvTgFHxnPS3mOL/xDvNv9Thp4ahW4Dwgim6txtsHRLRNuRBmrRtPNBuYIbpIO9LUKVpboXuA6D9nQXtBAlg==}
'@apify/timeout@0.3.1': resolution: {integrity: sha512-sLIuOqfySki/7AXiQ1yZoCI07vX6aYFLgP6YaJ8e8YLn8CFsRERma/Crxcz0zyCaxhc7C7EPgcs1O+p/djZchw==}
'@apify/utilities@2.13.1': resolution: {integrity: sha512-czQz2oANACVuwE7KrJKB8LrbhvMZyB1bvwO9jTL2SCmKQHxzY34XLQnSfblq/qsLWrwKynKxWXSvAVRZH2oIlA==}
'@asamuzakjp/css-color@2.8.3': resolution: {integrity: sha512-GIc76d9UI1hCvOATjZPyHFmE5qhRccp3/zGfMPapK3jBi+yocEzp6BBB0UnfRYP9NP4FANqUZYb0hnfs3TM3hw==}
'@crawlee/basic@3.12.2': resolution: {integrity: sha512-avSeHqjtvjtQoUgRqBc2HbSV4SijP1zvriLXNoz3V1lEQN63S6CTjQoHVrkG+EG7pD2+OeHILZUKAKgRQ2fSwg==} engines: {node: '>=16.0.0'}
'@crawlee/browser-pool@3.12.2': resolution: {integrity: sha512-R2LhLpaKpL1bbmC2EMZFsEOpN50MJBSPHqTuFYldC5PIAAF4PyWgKBc3jSf40866iupw9ZpWA0ckzL9PxFNAPw==} engines: {node: '>=16.0.0'} peerDependencies: playwright: '*' puppeteer: '*' peerDependenciesMeta: playwright: optional: true puppeteer: optional: true
'@crawlee/browser@3.12.2': resolution: {integrity: sha512-Y883TJa+T1kEA8zK2qLhn6qYmZsm9cSEoT4LdgVec4j9kPHbnmlSdLZ1Edk9axHz0LH6cfaR8u0MwAhwx64Z+w==} engines: {node: '>=16.0.0'} peerDependencies: playwright: '*' puppeteer: '*' peerDependenciesMeta: playwright: optional: true puppeteer: optional: true
'@crawlee/cheerio@3.12.2': resolution: {integrity: sha512-8pJ87szeA1Sm25VRvrKjof8SExdQyZ1rI7vyU295Lh5O3p8pLQG3ktqzCssu9ldXan027vuifIoP/qSz98ysCA==} engines: {node: '>=16.0.0'}
'@crawlee/cli@3.12.2': resolution: {integrity: sha512-d8LoB44kRPYKxm6uPqAmw6wEOAcWCRGG9kjUHP1ESFWgAnW+lPThWFpljqAfoTr21KQNIpdd27rnRhLzfSoo7Q==} engines: {node: '>=16.0.0'} hasBin: true
'@crawlee/core@3.12.2': resolution: {integrity: sha512-vwHO1Rg1uxS1oEkF9VMHGiKhLc4ojy0FoJeX2Pq08ibiOIkWkcx8EvA32aEPeAVAvnpwy1TNCFpiiawtUgNKxA==} engines: {node: '>=16.0.0'}
'@crawlee/http@3.12.2': resolution: {integrity: sha512-rT86gx9JYBJnsgl22cZVMDm0Xm3tnvClJk6MiilprW0GGwXvAwEz4DKRtsSPWD2A1/xy90SdEac7GVtuCGdmKQ==} engines: {node: '>=16.0.0'}
'@crawlee/jsdom@3.12.2': resolution: {integrity: sha512-9+6GzV6BSb7HlSZ//zpE2TeimzoaqRarQbNlqBz39SRv2cn4+ApasTlB8qJaZnHX4/Mt9QExAv4AaB4FG0miFA==} engines: {node: '>=16.0.0'}
'@crawlee/linkedom@3.12.2': resolution: {integrity: sha512-x/xw8aFYqFv1iAuVlnn4Akh/LM5FsmSryE16f0cYFtPegboOeq+Iw3ebCBI2VGx9CLjH2xnrpv/kGzgH+JYs0Q==} engines: {node: '>=16.0.0'}
'@crawlee/memory-storage@3.12.2': resolution: {integrity: sha512-KUnTpYIzYy8Fnyqf2JdufyM6Nd/1/nUsrHF3hFUdQhEfby0yX8kgc9UIF8OKieGfqUuYMKdfpeWyB8jRPp6Jyw==} engines: {node: '>= 16'}
'@crawlee/playwright@3.12.2': resolution: {integrity: sha512-a+JgVs+PBt/ePyi4Y9PnLtEHsJ+BYCsAu+fKFxt5SfLFbgfreIpSN5LnlSGPlUOdFxaD0I+qz3H02dxtQDpGug==} engines: {node: '>=16.0.0'} peerDependencies: playwright: '*' peerDependenciesMeta: playwright: optional: true
'@crawlee/puppeteer@3.12.2': resolution: {integrity: sha512-XZu0NrTXEo3WufXVpJZjqFrtzxwg6Zp4rW2Mrsny2nPzcsMXX5nFsudj0N1elXXmf5ZANUD9p1T803RBcK49mg==} engines: {node: '>=16.0.0'} peerDependencies: puppeteer: '*' peerDependenciesMeta: puppeteer: optional: true
'@crawlee/templates@3.12.2': resolution: {integrity: sha512-3dn0bdoagX1IsKHQh4YCrXTmQyUR1IgDKBwfcJGUThiiIOwn53hyO0/KsETqn8Fb0l2//10Q+xxJEDLxNN5ksA==} engines: {node: '>=16.0.0'}
'@crawlee/types@3.12.2': resolution: {integrity: sha512-mdSN8FSOGLzPDyO3wC5k6BvZKv467rvrLsIqqAkiN87TgQI5lwV+k2bBQGdajzcjDQn+taWG67xDbbZg6BvFVw==} engines: {node: '>=16.0.0'}
'@crawlee/utils@3.12.2': resolution: {integrity: sha512-Yly1WSm1y0Te1/BtrsbPnrZTIL2eoRvk/kmAgyBOC2o1Icu0QnFqWJh0iAuH7Ed92wYVgk4E/Cr5jYls35xcbQ==} engines: {node: '>=16.0.0'}
'@csstools/color-helpers@5.0.1': resolution: {integrity: sha512-MKtmkA0BX87PKaO1NFRTFH+UnkgnmySQOvNxJubsadusqPEC2aJ9MOQiMceZJJ6oitUl/i0L6u0M1IrmAOmgBA==} engines: {node: '>=18'}
'@csstools/css-calc@2.1.1': resolution: {integrity: sha512-rL7kaUnTkL9K+Cvo2pnCieqNpTKgQzy5f+N+5Iuko9HAoasP+xgprVh7KN/MaJVvVL1l0EzQq2MoqBHKSrDrag==} engines: {node: '>=18'} peerDependencies: '@csstools/css-parser-algorithms': ^3.0.4 '@csstools/css-tokenizer': ^3.0.3
'@csstools/css-color-parser@3.0.7': resolution: {integrity: sha512-nkMp2mTICw32uE5NN+EsJ4f5N+IGFeCFu4bGpiKgb2Pq/7J/MpyLBeQ5ry4KKtRFZaYs6sTmcMYrSRIyj5DFKA==} engines: {node: '>=18'} peerDependencies: '@csstools/css-parser-algorithms': ^3.0.4 '@csstools/css-tokenizer': ^3.0.3
'@csstools/css-parser-algorithms@3.0.4': resolution: {integrity: sha512-Up7rBoV77rv29d3uKHUIVubz1BTcgyUK72IvCQAbfbMv584xHcGKCKbWh7i8hPrRJ7qU4Y8IO3IY9m+iTB7P3A==} engines: {node: '>=18'} peerDependencies: '@csstools/css-tokenizer': ^3.0.3
'@csstools/css-tokenizer@3.0.3': resolution: {integrity: sha512-UJnjoFsmxfKUdNYdWgOB0mWUypuLvAfQPH1+pyvRJs6euowbFkFC6P13w1l8mJyi3vxYMxc9kld5jZEGRQs6bw==} engines: {node: '>=18'}
'@eslint-community/eslint-utils@4.4.1': resolution: {integrity: sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0
'@eslint-community/regexpp@4.12.1': resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0}
'@eslint/config-array@0.19.2': resolution: {integrity: sha512-GNKqxfHG2ySmJOBSHg7LxeUx4xpuCoFjacmlCoYWEbaPXLwvfIjixRI12xCQZeULksQb23uiA8F40w5TojpV7w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@eslint/core@0.12.0': resolution: {integrity: sha512-cmrR6pytBuSMTaBweKoGMwu3EiHiEC+DoyupPmlZ0HxBJBtIxwe+j/E4XPIKNx+Q74c8lXKPwYawBf5glsTkHg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@eslint/eslintrc@3.3.0': resolution: {integrity: sha512-yaVPAiNAalnCZedKLdR21GOGILMLKPyqSLWaAjQFvYA2i/ciDi8ArYVr69Anohb6cH2Ukhqti4aFnYyPm8wdwQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@eslint/js@9.21.0': resolution: {integrity: sha512-BqStZ3HX8Yz6LvsF5ByXYrtigrV5AXADWLAGc7PH/1SxOb7/FIYYMszZZWiUou/GB9P2lXWk2SV4d+Z8h0nknw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@eslint/object-schema@2.1.6': resolution: {integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@eslint/plugin-kit@0.2.7': resolution: {integrity: sha512-JubJ5B2pJ4k4yGxaNLdbjrnk9d/iDz6/q8wOilpIowd6PJPgaxCuHBnBszq7Ce2TyMrywm5r4PnKm6V3iiZF+g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@humanfs/core@0.19.1': resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} engines: {node: '>=18.18.0'}
'@humanfs/node@0.16.6': resolution: {integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==} engines: {node: '>=18.18.0'}
'@humanwhocodes/module-importer@1.0.1': resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} engines: {node: '>=12.22'}
'@humanwhocodes/retry@0.3.1': resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} engines: {node: '>=18.18'}
'@humanwhocodes/retry@0.4.2': resolution: {integrity: sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==} engines: {node: '>=18.18'}
'@inquirer/figures@1.0.10': resolution: {integrity: sha512-Ey6176gZmeqZuY/W/nZiUyvmb1/qInjcpiZjXWi6nON+nxJpD1bxtSoBxNliGISae32n6OwbY+TSXPZ1CfS4bw==} engines: {node: '>=18'}
'@rtsao/scc@1.1.0': resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==}
'@sapphire/async-queue@1.5.5': resolution: {integrity: sha512-cvGzxbba6sav2zZkH8GPf2oGk9yYoD5qrNWdu9fRehifgnFZJMV+nuy2nON2roRO4yQQ+v7MK/Pktl/HgfsUXg==} engines: {node: '>=v14.0.0', npm: '>=7.0.0'}
'@sapphire/shapeshift@3.9.7': resolution: {integrity: sha512-4It2mxPSr4OGn4HSQWGmhFMsNFGfFVhWeRPCRwbH972Ek2pzfGRZtb0pJ4Ze6oIzcyh2jw7nUDa6qGlWofgd9g==} engines: {node: '>=v16'}
'@sec-ant/readable-stream@0.4.1': resolution: {integrity: sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==}
'@sindresorhus/is@4.6.0': resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} engines: {node: '>=10'}
'@sindresorhus/is@5.6.0': resolution: {integrity: sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==} engines: {node: '>=14.16'}
'@sindresorhus/is@7.0.1': resolution: {integrity: sha512-QWLl2P+rsCJeofkDNIT3WFmb6NrRud1SUYW8dIhXK/46XFV8Q/g7Bsvib0Askb0reRLe+WYPeeE+l5cH7SlkuQ==} engines: {node: '>=18'}
'@szmarczak/http-timer@5.0.1': resolution: {integrity: sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==} engines: {node: '>=14.16'}
'@tokenizer/inflate@0.2.6': resolution: {integrity: sha512-SdR/i05U7Xhnsq36iyIq/ZiGGw4PKzw4ww3bOq80Pjj4wyXpqyTcgrgdDdGlcatnlvzNJx8CQw3hp6QZvkUwhA==} engines: {node: '>=16'}
'@tokenizer/token@0.3.0': resolution: {integrity: sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==}
'@types/content-type@1.1.8': resolution: {integrity: sha512-1tBhmVUeso3+ahfyaKluXe38p+94lovUZdoVfQ3OnJo9uJC42JT7CBoN3k9HYhAae+GwiBYmHu+N9FZhOG+2Pg==}
'@types/estree@1.0.6': resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==}
'@types/http-cache-semantics@4.0.4': resolution: {integrity: sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==}
'@types/jsdom@21.1.7': resolution: {integrity: sha512-yOriVnggzrnQ3a9OKOCxaVuSug3w3/SbOj5i7VwXWZEyUNl3bLF9V3MfxGbZKuwqJOQyRfqXyROBB1CoZLFWzA==}
'@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==}
'@types/json5@0.0.29': resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==}
'@types/node@22.13.5': resolution: {integrity: sha512-+lTU0PxZXn0Dr1NBtC7Y8cR21AJr87dLLU953CWA6pMxxv/UDc7jYAY90upcrie1nRcD6XNG5HOYEDtgW5TxAg==}
'@types/sax@1.2.7': resolution: {integrity: sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==}
'@types/tough-cookie@4.0.5': resolution: {integrity: sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==}
'@vladfrangu/async_event_emitter@2.4.6': resolution: {integrity: sha512-RaI5qZo6D2CVS6sTHFKg1v5Ohq/+Bo2LZ5gzUEwZ/WkHhwtGTCB/sVLw8ijOkAUxasZ+WshN/Rzj4ywsABJ5ZA==} engines: {node: '>=v14.0.0', npm: '>=7.0.0'}
acorn-jsx@5.3.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0
acorn@8.14.0: resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} engines: {node: '>=0.4.0'} hasBin: true
adm-zip@0.5.16: resolution: {integrity: sha512-TGw5yVi4saajsSEgz25grObGHEUaDrniwvA2qwSC060KfqGPdglhvPMA2lPIoxs3PQIItj2iag35fONcQqgUaQ==} engines: {node: '>=12.0'}
agent-base@7.1.3: resolution: {integrity: sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==} engines: {node: '>= 14'}
agentkeepalive@4.6.0: resolution: {integrity: sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==} engines: {node: '>= 8.0.0'}
ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==}
ansi-colors@4.1.3: resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} engines: {node: '>=6'}
ansi-escapes@4.3.2: resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} engines: {node: '>=8'}
ansi-regex@2.1.1: resolution: {integrity: sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==} engines: {node: '>=0.10.0'}
ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'}
ansi-styles@2.2.1: resolution: {integrity: sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==} engines: {node: '>=0.10.0'}
ansi-styles@4.3.0: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'}
apify-client@2.12.0: resolution: {integrity: sha512-h04rPVft8tNjnwZswqF2k46bdHZWsDsfOE8PkmklZ9+/s/mb/Q/dMOXCx0u2+RTc8QoAkYS9LYs97wZyUWpoag==}
apify@3.3.2: resolution: {integrity: sha512-OFP5YVshd0KxUP4yueUjX/hR5PGC0zzYy0xdcxX8OFAcrkrh8VaeGcOJza5uHpPFRwDnPKhiNa3YzcA3rnAHSQ==} engines: {node: '>=16.0.0'}
argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
aria-query@5.3.2: resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} engines: {node: '>= 0.4'}
array-buffer-byte-length@1.0.2: resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} engines: {node: '>= 0.4'}
array-includes@3.1.8: resolution: {integrity: sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==} engines: {node: '>= 0.4'}
array.prototype.findlast@1.2.5: resolution: {integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==} engines: {node: '>= 0.4'}
array.prototype.findlastindex@1.2.5: resolution: {integrity: sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==} engines: {node: '>= 0.4'}
array.prototype.flat@1.3.3: resolution: {integrity: sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==} engines: {node: '>= 0.4'}
array.prototype.flatmap@1.3.3: resolution: {integrity: sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==} engines: {node: '>= 0.4'}
array.prototype.tosorted@1.1.4: resolution: {integrity: sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==} engines: {node: '>= 0.4'}
arraybuffer.prototype.slice@1.0.4: resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} engines: {node: '>= 0.4'}
ast-types-flow@0.0.8: resolution: {integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==}
async-function@1.0.0: resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} engines: {node: '>= 0.4'}
async-retry@1.3.3: resolution: {integrity: sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==}
asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==}
available-typed-arrays@1.0.7: resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} engines: {node: '>= 0.4'}
axe-core@4.10.2: resolution: {integrity: sha512-RE3mdQ7P3FRSe7eqCWoeQ/Z9QXrtniSjp1wUjt5nRC3WIpz5rSCve6o3fsZ2aCpJtrZjSZgjwXAoTO5k4tEI0w==} engines: {node: '>=4'}
axios@1.7.9: resolution: {integrity: sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw==}
axobject-query@4.1.0: resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} engines: {node: '>= 0.4'}
balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==}
bl@4.1.0: resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==}
boolbase@1.0.0: resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==}
brace-expansion@1.1.11: resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==}
brace-expansion@2.0.1: resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==}
browserslist@4.24.4: resolution: {integrity: sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true
buffer@5.7.1: resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==}
cacheable-lookup@7.0.0: resolution: {integrity: sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==} engines: {node: '>=14.16'}
cacheable-request@12.0.1: resolution: {integrity: sha512-Yo9wGIQUaAfIbk+qY0X4cDQgCosecfBe3V9NSyeY4qPC2SAkbCS4Xj79VP8WOzitpJUZKc/wsRCYF5ariDIwkg==} engines: {node: '>=18'}
call-bind-apply-helpers@1.0.2: resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} engines: {node: '>= 0.4'}
call-bind@1.0.8: resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} engines: {node: '>= 0.4'}
call-bound@1.0.3: resolution: {integrity: sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==} engines: {node: '>= 0.4'}
callsites@3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'}
callsites@4.2.0: resolution: {integrity: sha512-kfzR4zzQtAE9PC7CzZsjl3aBNbXWuXiSeOCdLcPpBfGW8YuCqQHcRPFDbr/BPVmd3EEPVpuFzLyuT/cUhPr4OQ==} engines: {node: '>=12.20'}
caniuse-lite@1.0.30001700: resolution: {integrity: sha512-2S6XIXwaE7K7erT8dY+kLQcpa5ms63XlRkMkReXjle+kf6c5g38vyMl+Z5y8dSxOFDhcFe+nxnn261PLxBSQsQ==}
chalk@1.1.3: resolution: {integrity: sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==} engines: {node: '>=0.10.0'}
chalk@4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'}
chardet@0.7.0: resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==}
cheerio-select@2.1.0: resolution: {integrity: sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==}
cheerio@1.0.0-rc.12: resolution: {integrity: sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==} engines: {node: '>= 6'}
cli-cursor@3.1.0: resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} engines: {node: '>=8'}
cli-spinners@2.9.2: resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} engines: {node: '>=6'}
cli-width@3.0.0: resolution: {integrity: sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==} engines: {node: '>= 10'}
cli-width@4.1.0: resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} engines: {node: '>= 12'}
cliui@8.0.1: resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} engines: {node: '>=12'}
clone@1.0.4: resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} engines: {node: '>=0.8'}
color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'}
color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
combined-stream@1.0.8: resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} engines: {node: '>= 0.8'}
concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
confusing-browser-globals@1.0.11: resolution: {integrity: sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==}
content-type@1.0.5: resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} engines: {node: '>= 0.6'}
crawlee@3.12.2: resolution: {integrity: sha512-+toTCJ1HUEsaRdvYhaQy1nZ4rh6zMVeDOduv9bLYI/26oCff/FG1F+dgCDfngnMcFCyZMuM89bDPUxrzB3bH8A==} engines: {node: '>=16.0.0'} hasBin: true peerDependencies: playwright: '*' puppeteer: '*' peerDependenciesMeta: playwright: optional: true puppeteer: optional: true
cross-spawn@7.0.6: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'}
css-select@5.1.0: resolution: {integrity: sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==}
css-what@6.1.0: resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} engines: {node: '>= 6'}
cssom@0.5.0: resolution: {integrity: sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==}
cssstyle@4.2.1: resolution: {integrity: sha512-9+vem03dMXG7gDmZ62uqmRiMRNtinIZ9ZyuF6BdxzfOD+FdN5hretzynkn0ReS2DO2GSw76RWHs0UmJPI2zUjw==} engines: {node: '>=18'}
csv-stringify@6.5.2: resolution: {integrity: sha512-RFPahj0sXcmUyjrObAK+DOWtMvMIFV328n4qZJhgX3x2RqkQgOTU2mCUmiFR0CzM6AzChlRSUErjiJeEt8BaQA==}
damerau-levenshtein@1.0.8: resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==}
data-urls@5.0.0: resolution: {integrity: sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==} engines: {node: '>=18'}
data-view-buffer@1.0.2: resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} engines: {node: '>= 0.4'}
data-view-byte-length@1.0.2: resolution: {integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==} engines: {node: '>= 0.4'}
data-view-byte-offset@1.0.1: resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} engines: {node: '>= 0.4'}
debug@3.2.7: resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} peerDependencies: supports-color: '*' peerDependenciesMeta: supports-color: optional: true
debug@4.4.0: resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} engines: {node: '>=6.0'} peerDependencies: supports-color: '*' peerDependenciesMeta: supports-color: optional: true
decimal.js@10.5.0: resolution: {integrity: sha512-8vDa8Qxvr/+d94hSh5P3IJwI5t8/c0KsMp+g8bNw9cY2icONa5aPfvKeieW1WlG0WQYwwhJ7mjui2xtiePQSXw==}
decompress-response@6.0.0: resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} engines: {node: '>=10'}
deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==}
defaults@1.0.4: resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==}
defer-to-connect@2.0.1: resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} engines: {node: '>=10'}
define-data-property@1.1.4: resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} engines: {node: '>= 0.4'}
define-properties@1.2.1: resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} engines: {node: '>= 0.4'}
delayed-stream@1.0.0: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} engines: {node: '>=0.4.0'}
devtools-protocol@0.0.1423531: resolution: {integrity: sha512-z6cOcajZWxk80zvFnkTGa7tj3oqF+C5SnOF1KSMeAr5/WW/nLNHlEpKr7voSzMz8IaUoq5rjdI0Mqv5k/BUkhg==}
doctrine@2.1.0: resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} engines: {node: '>=0.10.0'}
dom-serializer@2.0.0: resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==}
domelementtype@2.3.0: resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==}
domhandler@5.0.3: resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} engines: {node: '>= 4'}
domutils@3.2.2: resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==}
dot-prop@6.0.1: resolution: {integrity: sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==} engines: {node: '>=10'}
dot-prop@7.2.0: resolution: {integrity: sha512-Ol/IPXUARn9CSbkrdV4VJo7uCy1I3VuSiWCaFSg+8BdUOzF9n3jefIpcgAydvUZbTdEBZs2vEiTiS9m61ssiDA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
dunder-proto@1.0.1: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'}
duplexer@0.1.2: resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==}
electron-to-chromium@1.5.103: resolution: {integrity: sha512-P6+XzIkfndgsrjROJWfSvVEgNHtPgbhVyTkwLjUM2HU/h7pZRORgaTlHqfAikqxKmdJMLW8fftrdGWbd/Ds0FA==}
emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==}
emoji-regex@9.2.2: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==}
entities@4.5.0: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'}
entities@6.0.0: resolution: {integrity: sha512-aKstq2TDOndCn4diEyp9Uq/Flu2i1GlLkc6XIDQSDMuaFE3OPW5OphLCyQ5SpSJZTb4reN+kTcYru5yIfXoRPw==} engines: {node: '>=0.12'}
es-abstract@1.23.9: resolution: {integrity: sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==} engines: {node: '>= 0.4'}
es-define-property@1.0.1: resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} engines: {node: '>= 0.4'}
es-errors@1.3.0: resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} engines: {node: '>= 0.4'}
es-iterator-helpers@1.2.1: resolution: {integrity: sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==} engines: {node: '>= 0.4'}
es-object-atoms@1.1.1: resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} engines: {node: '>= 0.4'}
es-set-tostringtag@2.1.0: resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} engines: {node: '>= 0.4'}
es-shim-unscopables@1.1.0: resolution: {integrity: sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==} engines: {node: '>= 0.4'}
es-to-primitive@1.3.0: resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} engines: {node: '>= 0.4'}
escalade@3.2.0: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'}
escape-string-regexp@1.0.5: resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} engines: {node: '>=0.8.0'}
escape-string-regexp@4.0.0: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'}
eslint-config-airbnb-base@15.0.0: resolution: {integrity: sha512-xaX3z4ZZIcFLvh2oUNvcX5oEofXda7giYmuplVxoOg5A7EXJMrUyqRgR+mhDhPK8LZ4PttFOBvCYDbX3sUoUig==} engines: {node: ^10.12.0 || >=12.0.0} peerDependencies: eslint: ^7.32.0 || ^8.2.0 eslint-plugin-import: ^2.25.2
eslint-config-airbnb@19.0.4: resolution: {integrity: sha512-T75QYQVQX57jiNgpF9r1KegMICE94VYwoFQyMGhrvc+lB8YF2E/M/PYDaQe1AJcWaEgqLE+ErXV1Og/+6Vyzew==} engines: {node: ^10.12.0 || ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^7.32.0 || ^8.2.0 eslint-plugin-import: ^2.25.3 eslint-plugin-jsx-a11y: ^6.5.1 eslint-plugin-react: ^7.28.0 eslint-plugin-react-hooks: ^4.3.0
eslint-import-resolver-node@0.3.9: resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==}
eslint-import-resolver-typescript@2.7.1: resolution: {integrity: sha512-00UbgGwV8bSgUv34igBDbTOtKhqoRMy9bFjNehT40bXg6585PNIct8HhXZ0SybqB9rWtXj9crcku8ndDn/gIqQ==} engines: {node: '>=4'} peerDependencies: eslint: '*' eslint-plugin-import: '*'
eslint-module-utils@2.12.0: resolution: {integrity: sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==} engines: {node: '>=4'} peerDependencies: '@typescript-eslint/parser': '*' eslint: '*' eslint-import-resolver-node: '*' eslint-import-resolver-typescript: '*' eslint-import-resolver-webpack: '*' peerDependenciesMeta: '@typescript-eslint/parser': optional: true eslint: optional: true eslint-import-resolver-node: optional: true eslint-import-resolver-typescript: optional: true eslint-import-resolver-webpack: optional: true
eslint-plugin-import@2.31.0: resolution: {integrity: sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==} engines: {node: '>=4'} peerDependencies: '@typescript-eslint/parser': '*' eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9 peerDependenciesMeta: '@typescript-eslint/parser': optional: true
eslint-plugin-jsx-a11y@6.10.2: resolution: {integrity: sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==} engines: {node: '>=4.0'} peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9
eslint-plugin-react-hooks@4.6.2: resolution: {integrity: sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==} engines: {node: '>=10'} peerDependencies: eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0
eslint-plugin-react@7.37.4: resolution: {integrity: sha512-BGP0jRmfYyvOyvMoRX/uoUeW+GqNj9y16bPQzqAHf3AYII/tDs+jMN0dBVkl88/OZwNGwrVFxE7riHsXVfy/LQ==} engines: {node: '>=4'} peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7
eslint-scope@8.2.0: resolution: {integrity: sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
eslint-visitor-keys@3.4.3: resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
eslint-visitor-keys@4.2.0: resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
eslint@9.21.0: resolution: {integrity: sha512-KjeihdFqTPhOMXTt7StsDxriV4n66ueuF/jfPNC3j/lduHwr/ijDwJMsF+wyMJethgiKi5wniIE243vi07d3pg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true peerDependencies: jiti: '*' peerDependenciesMeta: jiti: optional: true
espree@10.3.0: resolution: {integrity: sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
esquery@1.6.0: resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} engines: {node: '>=0.10'}
esrecurse@4.3.0: resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} engines: {node: '>=4.0'}
estraverse@5.3.0: resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} engines: {node: '>=4.0'}
esutils@2.0.3: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'}
event-stream@3.3.4: resolution: {integrity: sha512-QHpkERcGsR0T7Qm3HNJSyXKEEj8AHNxkY3PK8TS2KJvQ7NiSHe3DDpwVKKtoYprL/AreyzFBeIkBIWChAqn60g==}
external-editor@3.1.0: resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} engines: {node: '>=4'}
fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==}
fast-json-stable-stringify@2.1.0: resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==}
fast-levenshtein@2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==}
fflate@0.8.2: resolution: {integrity: sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==}
figlet@1.8.0: resolution: {integrity: sha512-chzvGjd+Sp7KUvPHZv6EXV5Ir3Q7kYNpCr4aHrRW79qFtTefmQZNny+W1pW9kf5zeE6dikku2W50W/wAH2xWgw==} engines: {node: '>= 0.4.0'} hasBin: true
figures@3.2.0: resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} engines: {node: '>=8'}
file-entry-cache@8.0.0: resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} engines: {node: '>=16.0.0'}
file-type@20.1.0: resolution: {integrity: sha512-XoxU+lETfCf+bYK3SXkxFusAvmtYQl1u/ZC4zw1DBLEsHUvh339uwYucgQnnSMz1mRCWYJrCzsbJJ95hsQbZ8A==} engines: {node: '>=18'}
find-up@4.1.0: resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} engines: {node: '>=8'}
find-up@5.0.0: resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} engines: {node: '>=10'}
fingerprint-generator@2.1.62: resolution: {integrity: sha512-Bhx2Cxm0l2xYhO1KAPs9orozlONdQzm6qC+UrLk7Np3TjMS8OuHNK6LQOGIuCZnAoP3ZMLl85WaCqI2nH5m01w==} engines: {node: '>=16.0.0'}
fingerprint-injector@2.1.62: resolution: {integrity: sha512-kTzJAMuVWAiZ1uA1RxYT40LGIxkLhDq2pbk//bliYuUALbSQ1UAXHZASdZTnLlFvrFPIKlBK19QmllXlA/guYA==} engines: {node: '>=16.0.0'} peerDependencies: playwright: ^1.22.2 puppeteer: '>= 9.x' peerDependenciesMeta: playwright: optional: true puppeteer: optional: true
flat-cache@4.0.1: resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} engines: {node: '>=16'}
flatted@3.3.3: resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==}
follow-redirects@1.15.9: resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==} engines: {node: '>=4.0'} peerDependencies: debug: '*' peerDependenciesMeta: debug: optional: true
for-each@0.3.5: resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} engines: {node: '>= 0.4'}
form-data-encoder@4.0.2: resolution: {integrity: sha512-KQVhvhK8ZkWzxKxOr56CPulAhH3dobtuQ4+hNQ+HekH/Wp5gSOafqRAeTphQUJAIk0GBvHZgJ2ZGRWd5kphMuw==} engines: {node: '>= 18'}
form-data@4.0.2: resolution: {integrity: sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==} engines: {node: '>= 6'}
from@0.1.7: resolution: {integrity: sha512-twe20eF1OxVxp/ML/kq2p1uc6KvFK/+vs8WjEbeKmV2He22MKm7YF2ANIt+EOqhJ5L3K/SuuPhk0hWQDjOM23g==}
fs-extra@11.3.0: resolution: {integrity: sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==} engines: {node: '>=14.14'}
fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==}
function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==}
function.prototype.name@1.1.8: resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==} engines: {node: '>= 0.4'}
functions-have-names@1.2.3: resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==}
generative-bayesian-network@2.1.62: resolution: {integrity: sha512-+zq1/AHdxb+0MXF34krM/IUu/N9gI6llzQg2gf7WMfuzh0nv6xbhb8QyfL48MOJihum7wSE90+/hMXK60X+Kpw==}
get-caller-file@2.0.5: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*}
get-intrinsic@1.3.0: resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} engines: {node: '>= 0.4'}
get-proto@1.0.1: resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} engines: {node: '>= 0.4'}
get-stream@9.0.1: resolution: {integrity: sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==} engines: {node: '>=18'}
get-symbol-description@1.1.0: resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} engines: {node: '>= 0.4'}
glob-parent@6.0.2: resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} engines: {node: '>=10.13.0'}
glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} deprecated: Glob versions prior to v9 are no longer supported
globals@14.0.0: resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} engines: {node: '>=18'}
globalthis@1.0.4: resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} engines: {node: '>= 0.4'}
gopd@1.2.0: resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} engines: {node: '>= 0.4'}
got-scraping@4.1.1: resolution: {integrity: sha512-MbT+NMMU4VgvOg2tFIPOSIrMfH986fm0LJ17RxBLKlyTs3gh3xIMETpe+zdPaXY7tH1j6YYeqtfG0TnVMx6V2g==} engines: {node: '>=16'}
got@14.4.6: resolution: {integrity: sha512-rnhwfM/PhMNJ1i17k3DuDqgj0cKx3IHxBKVv/WX1uDKqrhi2Gv3l7rhPThR/Cc6uU++dD97W9c8Y0qyw9x0jag==} engines: {node: '>=20'}
graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==}
has-ansi@2.0.0: resolution: {integrity: sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==} engines: {node: '>=0.10.0'}
has-bigints@1.1.0: resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} engines: {node: '>= 0.4'}
has-flag@4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'}
has-property-descriptors@1.0.2: resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==}
has-proto@1.2.0: resolution: {integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==} engines: {node: '>= 0.4'}
has-symbols@1.1.0: resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} engines: {node: '>= 0.4'}
has-tostringtag@1.0.2: resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} engines: {node: '>= 0.4'}
hasown@2.0.2: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'}
header-generator@2.1.62: resolution: {integrity: sha512-L4y1Fush4bkC/3zEurWjiwzeuekAH3HMYA508EZDmvk1wPmcbpV/mq3u3d3fxq7v4oPmaCfsRm1T5DUH19uikA==} engines: {node: '>=16.0.0'}
html-encoding-sniffer@4.0.0: resolution: {integrity: sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==} engines: {node: '>=18'}
html-escaper@3.0.3: resolution: {integrity: sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ==}
htmlparser2@10.0.0: resolution: {integrity: sha512-TwAZM+zE5Tq3lrEHvOlvwgj1XLWQCtaaibSN11Q+gGBAS7Y1uZSWwXXRe4iF6OXnaq1riyQAPFOBtYc77Mxq0g==}
htmlparser2@8.0.2: resolution: {integrity: sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==}
htmlparser2@9.1.0: resolution: {integrity: sha512-5zfg6mHUoaer/97TxnGpxmbR7zJtPwIYFMZ/H5ucTlPZhKvtum05yiPK3Mgai3a0DyVxv7qYqoweaEd2nrYQzQ==}
http-cache-semantics@4.1.1: resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==}
http-proxy-agent@7.0.2: resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} engines: {node: '>= 14'}
http2-wrapper@2.2.1: resolution: {integrity: sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==} engines: {node: '>=10.19.0'}
https-proxy-agent@7.0.6: resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} engines: {node: '>= 14'}
humanize-ms@1.2.1: resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==}
iconv-lite@0.4.24: resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} engines: {node: '>=0.10.0'}
iconv-lite@0.6.3: resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} engines: {node: '>=0.10.0'}
idcac-playwright@0.1.3: resolution: {integrity: sha512-VVYQ4sv6OrUJKVzYaIP1hq0qAHd1O22HW5LnL1Wf6zkrLStQ/QEg4iJ0rllIOEpd+Rmm+635AJD59A+Vw+2PgQ==}
ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==}
ignore@5.3.2: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'}
import-fresh@3.3.1: resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} engines: {node: '>=6'}
import-local@3.2.0: resolution: {integrity: sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==} engines: {node: '>=8'} hasBin: true
imurmurhash@0.1.4: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'}
inflight@1.0.6: resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.
inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
inquirer@8.2.6: resolution: {integrity: sha512-M1WuAmb7pn9zdFRtQYk26ZBoY043Sse0wVDdk4Bppr+JOXyQYybdtvK+l9wUibhtjdjvtoiNy8tk+EgsYIUqKg==} engines: {node: '>=12.0.0'}
inquirer@9.3.7: resolution: {integrity: sha512-LJKFHCSeIRq9hanN14IlOtPSTe3lNES7TYDTE2xxdAy1LS5rYphajK1qtwvj3YmQXvvk0U2Vbmcni8P9EIQW9w==} engines: {node: '>=18'}
internal-slot@1.1.0: resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} engines: {node: '>= 0.4'}
ip-address@9.0.5: resolution: {integrity: sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==} engines: {node: '>= 12'}
is-any-array@2.0.1: resolution: {integrity: sha512-UtilS7hLRu++wb/WBAw9bNuP1Eg04Ivn1vERJck8zJthEvXCBEBpGR/33u/xLKWEQf95803oalHrVDptcAvFdQ==}
is-array-buffer@3.0.5: resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} engines: {node: '>= 0.4'}
is-async-function@2.1.1: resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==} engines: {node: '>= 0.4'}
is-bigint@1.1.0: resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==} engines: {node: '>= 0.4'}
is-boolean-object@1.2.2: resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==} engines: {node: '>= 0.4'}
is-callable@1.2.7: resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} engines: {node: '>= 0.4'}
is-core-module@2.16.1: resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} engines: {node: '>= 0.4'}
is-data-view@1.0.2: resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==} engines: {node: '>= 0.4'}
is-date-object@1.1.0: resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==} engines: {node: '>= 0.4'}
is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'}
is-finalizationregistry@1.1.1: resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==} engines: {node: '>= 0.4'}
is-fullwidth-code-point@3.0.0: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'}
is-generator-function@1.1.0: resolution: {integrity: sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==} engines: {node: '>= 0.4'}
is-glob@4.0.3: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'}
is-interactive@1.0.0: resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} engines: {node: '>=8'}
is-map@2.0.3: resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} engines: {node: '>= 0.4'}
is-number-object@1.1.1: resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} engines: {node: '>= 0.4'}
is-obj@2.0.0: resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} engines: {node: '>=8'}
is-potential-custom-element-name@1.0.1: resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==}
is-regex@1.2.1: resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} engines: {node: '>= 0.4'}
is-set@2.0.3: resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} engines: {node: '>= 0.4'}
is-shared-array-buffer@1.0.4: resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==} engines: {node: '>= 0.4'}
is-stream@4.0.1: resolution: {integrity: sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==} engines: {node: '>=18'}
is-string@1.1.1: resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} engines: {node: '>= 0.4'}
is-symbol@1.1.1: resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==} engines: {node: '>= 0.4'}
is-typed-array@1.1.15: resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} engines: {node: '>= 0.4'}
is-unicode-supported@0.1.0: resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} engines: {node: '>=10'}
is-weakmap@2.0.2: resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} engines: {node: '>= 0.4'}
is-weakref@1.1.1: resolution: {integrity: sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==} engines: {node: '>= 0.4'}
is-weakset@2.0.4: resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==} engines: {node: '>= 0.4'}
isarray@2.0.5: resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==}
isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
iterator.prototype@1.1.5: resolution: {integrity: sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==} engines: {node: '>= 0.4'}
jquery@3.7.1: resolution: {integrity: sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg==}
js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
js-yaml@4.1.0: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true
jsbn@1.1.0: resolution: {integrity: sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==}
jsdom@26.0.0: resolution: {integrity: sha512-BZYDGVAIriBWTpIxYzrXjv3E/4u8+/pSG5bQdIYCbNCGOvsPkDQfTVLAIXAf9ETdCpduCVTkDe2NNZ8NIwUVzw==} engines: {node: '>=18'} peerDependencies: canvas: ^3.0.0 peerDependenciesMeta: canvas: optional: true
json-buffer@3.0.1: resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==}
json-schema-traverse@0.4.1: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==}
json-stable-stringify-without-jsonify@1.0.1: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==}
json5@1.0.2: resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} hasBin: true
json5@2.2.3: resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} engines: {node: '>=6'} hasBin: true
jsonfile@6.1.0: resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==}
jsx-ast-utils@3.3.5: resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} engines: {node: '>=4.0'}
keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==}
language-subtag-registry@0.3.23: resolution: {integrity: sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==}
language-tags@1.0.9: resolution: {integrity: sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==} engines: {node: '>=0.10'}
levn@0.4.1: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'}
linkedom@0.18.9: resolution: {integrity: sha512-Pfvhwjs46nBrcQdauQjMXDJZqj6VwN7KStT84xQqmIgD9bPH6UVJ/ESW8y4VHVF2h7di0/P+f4Iln4U5emRcmg==}
locate-path@5.0.0: resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} engines: {node: '>=8'}
locate-path@6.0.0: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'}
lodash.isequal@4.5.0: resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} deprecated: This package is deprecated. Use require('node:util').isDeepStrictEqual instead.
lodash.merge@4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==}
lodash@4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==}
log-symbols@4.1.0: resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} engines: {node: '>=10'}
loose-envify@1.4.0: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true
lowercase-keys@3.0.0: resolution: {integrity: sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==}
map-stream@0.1.0: resolution: {integrity: sha512-CkYQrPYZfWnu/DAmVCpTSX/xHpKZ80eKh2lAkyA6AJTef6bW+6JpbQZN5rofum7da+SyN1bi5ctTm+lTfcCW3g==}
math-intrinsics@1.1.0: resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} engines: {node: '>= 0.4'}
mime-db@1.52.0: resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} engines: {node: '>= 0.6'}
mime-types@2.1.35: resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} engines: {node: '>= 0.6'}
mimic-fn@2.1.0: resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} engines: {node: '>=6'}
mimic-response@3.1.0: resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} engines: {node: '>=10'}
mimic-response@4.0.0: resolution: {integrity: sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==}
minimatch@9.0.5: resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} engines: {node: '>=16 || 14 >=14.17'}
minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==}
ml-array-max@1.2.4: resolution: {integrity: sha512-BlEeg80jI0tW6WaPyGxf5Sa4sqvcyY6lbSn5Vcv44lp1I2GR6AWojfUvLnGTNsIXrZ8uqWmo8VcG1WpkI2ONMQ==}
ml-array-min@1.2.3: resolution: {integrity: sha512-VcZ5f3VZ1iihtrGvgfh/q0XlMobG6GQ8FsNyQXD3T+IlstDv85g8kfV0xUG1QPRO/t21aukaJowDzMTc7j5V6Q==}
ml-array-rescale@1.3.7: resolution: {integrity: sha512-48NGChTouvEo9KBctDfHC3udWnQKNKEWN0ziELvY3KG25GR5cA8K8wNVzracsqSW1QEkAXjTNx+ycgAv06/1mQ==}
ml-logistic-regression@2.0.0: resolution: {integrity: sha512-xHhB91ut8GRRbJyB1ZQfKsl1MHmE1PqMeRjxhks96M5BGvCbC9eEojf4KgRMKM2LxFblhVUcVzweAoPB48Nt0A==}
ml-matrix@6.12.0: resolution: {integrity: sha512-AGfR+pWaC0GmzjUnB6BfwhndPEUGz0i7QUYdqNuw1zhTov/vSRJ9pP2hs6BoGpaSbtXgrKjZz2zjD1M0xuur6A==}
ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
mute-stream@0.0.8: resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==}
mute-stream@1.0.0: resolution: {integrity: sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
nanoid@3.3.8: resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true
natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==}
node-releases@2.0.19: resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==}
normalize-url@8.0.1: resolution: {integrity: sha512-IO9QvjUMWxPQQhs60oOu10CRkWCiZzSUkzbXGGV9pviYl1fXYcvkzQ5jV9z8Y6un8ARoVRl4EtC6v6jNqbaJ/w==} engines: {node: '>=14.16'}
nth-check@2.1.1: resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==}
nwsapi@2.2.16: resolution: {integrity: sha512-F1I/bimDpj3ncaNDhfyMWuFqmQDBwDB0Fogc2qpL3BWvkQteFD/8BzWuIRl83rq0DXfm8SGt/HFhLXZyljTXcQ==}
object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'}
object-inspect@1.13.4: resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} engines: {node: '>= 0.4'}
object-keys@1.1.1: resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} engines: {node: '>= 0.4'}
object.assign@4.1.7: resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} engines: {node: '>= 0.4'}
object.entries@1.1.8: resolution: {integrity: sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==} engines: {node: '>= 0.4'}
object.fromentries@2.0.8: resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} engines: {node: '>= 0.4'}
object.groupby@1.0.3: resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==} engines: {node: '>= 0.4'}
object.values@1.2.1: resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==} engines: {node: '>= 0.4'}
once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==}
onetime@5.1.2: resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} engines: {node: '>=6'}
optionator@0.9.4: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'}
ora@5.4.1: resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} engines: {node: '>=10'}
os-tmpdir@1.0.2: resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} engines: {node: '>=0.10.0'}
ow@0.28.2: resolution: {integrity: sha512-dD4UpyBh/9m4X2NVjA+73/ZPBRF+uF4zIMFvvQsabMiEK8x41L3rQ8EENOi35kyyoaJwNxEeJcP6Fj1H4U409Q==} engines: {node: '>=12'}
ow@1.1.1: resolution: {integrity: sha512-sJBRCbS5vh1Jp9EOgwp1Ws3c16lJrUkJYlvWTYC03oyiYVwS/ns7lKRWow4w4XjDyTrA2pplQv4B2naWSR6yDA==} engines: {node: '>=14.16'}
own-keys@1.0.1: resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} engines: {node: '>= 0.4'}
p-cancelable@4.0.1: resolution: {integrity: sha512-wBowNApzd45EIKdO1LaU+LrMBwAcjfPaYtVzV3lmfM3gf8Z4CHZsiIqlM8TZZ8okYvh5A1cP6gTfCRQtwUpaUg==} engines: {node: '>=14.16'}
p-limit@2.3.0: resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} engines: {node: '>=6'}
p-limit@3.1.0: resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} engines: {node: '>=10'}
p-locate@4.1.0: resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} engines: {node: '>=8'}
p-locate@5.0.0: resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} engines: {node: '>=10'}
p-try@2.2.0: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'}
parent-module@1.0.1: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'}
parent-require@1.0.0: resolution: {integrity: sha512-2MXDNZC4aXdkkap+rBBMv0lUsfJqvX5/2FiYYnfCnorZt3Pk06/IOR5KeaoghgS2w07MLWgjbsnyaq6PdHn2LQ==} engines: {node: '>= 0.4.0'}
parse5-htmlparser2-tree-adapter@7.1.0: resolution: {integrity: sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==}
parse5@7.2.1: resolution: {integrity: sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==}
path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'}
path-is-absolute@1.0.1: resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} engines: {node: '>=0.10.0'}
path-key@3.1.1: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'}
path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==}
pause-stream@0.0.11: resolution: {integrity: sha512-e3FBlXLmN/D1S+zHzanP4E/4Z60oFAa3O051qt1pxa7DEJWKAyil6upYVXCWadEnuoqa4Pkc9oUx9zsxYeRv8A==}
peek-readable@6.1.1: resolution: {integrity: sha512-7QmvgRKhxM0E2PGV4ocfROItVode+ELI27n4q+lpufZ+tRKBu/pBP8WOmw9HXn2ui/AUizqtvaVQhcJrOkRqYg==} engines: {node: '>=18'}
picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==}
pkg-dir@4.2.0: resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} engines: {node: '>=8'}
possible-typed-array-names@1.1.0: resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} engines: {node: '>= 0.4'}
prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'}
prop-types@15.8.1: resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==}
proper-lockfile@4.1.2: resolution: {integrity: sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==}
proxy-chain@2.5.6: resolution: {integrity: sha512-vC57FECgv2WKCVoaRrztJ86NBER7ZJCjSGvOnpMlgfi9vroMCoCwexQ+69He4YWUPE88D5jZizytiLbPjLv6/A==} engines: {node: '>=14'}
proxy-from-env@1.1.0: resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==}
punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'}
quick-lru@5.1.1: resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} engines: {node: '>=10'}
quick-lru@7.0.0: resolution: {integrity: sha512-MX8gB7cVYTrYcFfAnfLlhRd0+Toyl8yX8uBx1MrX7K0jegiz9TumwOK27ldXrgDlHRdVi+MqU9Ssw6dr4BNreg==} engines: {node: '>=18'}
react-is@16.13.1: resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==}
readable-stream@3.6.2: resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} engines: {node: '>= 6'}
reflect.getprototypeof@1.0.10: resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} engines: {node: '>= 0.4'}
regexp.prototype.flags@1.5.4: resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} engines: {node: '>= 0.4'}
require-directory@2.1.1: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'}
resolve-alpn@1.2.1: resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==}
resolve-cwd@3.0.0: resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} engines: {node: '>=8'}
resolve-from@4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'}
resolve-from@5.0.0: resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} engines: {node: '>=8'}
resolve@1.22.10: resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} engines: {node: '>= 0.4'} hasBin: true
resolve@2.0.0-next.5: resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==} hasBin: true
responselike@3.0.0: resolution: {integrity: sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==} engines: {node: '>=14.16'}
restore-cursor@3.1.0: resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} engines: {node: '>=8'}
retry@0.12.0: resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} engines: {node: '>= 4'}
retry@0.13.1: resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==} engines: {node: '>= 4'}
robots-parser@3.0.1: resolution: {integrity: sha512-s+pyvQeIKIZ0dx5iJiQk1tPLJAWln39+MI5jtM8wnyws+G5azk+dMnMX0qfbqNetKKNgcWWOdi0sfm+FbQbgdQ==} engines: {node: '>=10.0.0'}
rrweb-cssom@0.8.0: resolution: {integrity: sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==}
run-async@2.4.1: resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==} engines: {node: '>=0.12.0'}
run-async@3.0.0: resolution: {integrity: sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==} engines: {node: '>=0.12.0'}
rxjs@7.8.2: resolution: {integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==}
safe-array-concat@1.1.3: resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==} engines: {node: '>=0.4'}
safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==}
safe-push-apply@1.0.0: resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==} engines: {node: '>= 0.4'}
safe-regex-test@1.1.0: resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} engines: {node: '>= 0.4'}
safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==}
sax@1.4.1: resolution: {integrity: sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==}
saxes@6.0.0: resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} engines: {node: '>=v12.22.7'}
semver@6.3.1: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true
semver@7.7.1: resolution: {integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==} engines: {node: '>=10'} hasBin: true
set-function-length@1.2.2: resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} engines: {node: '>= 0.4'}
set-function-name@2.0.2: resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} engines: {node: '>= 0.4'}
set-proto@1.0.0: resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==} engines: {node: '>= 0.4'}
shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'}
shebang-regex@3.0.0: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'}
side-channel-list@1.0.0: resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} engines: {node: '>= 0.4'}
side-channel-map@1.0.1: resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} engines: {node: '>= 0.4'}
side-channel-weakmap@1.0.2: resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} engines: {node: '>= 0.4'}
side-channel@1.1.0: resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} engines: {node: '>= 0.4'}
signal-exit@3.0.7: resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==}
smart-buffer@4.2.0: resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} engines: {node: '>= 6.0.0', npm: '>= 3.0.0'}
socks-proxy-agent@8.0.5: resolution: {integrity: sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==} engines: {node: '>= 14'}
socks@2.8.4: resolution: {integrity: sha512-D3YaD0aRxR3mEcqnidIs7ReYJFVzWdd6fXJYUM8ixcQcJRGTka/b3saV0KflYhyVJXKhb947GndU35SxYNResQ==} engines: {node: '>= 10.0.0', npm: '>= 3.0.0'}
split@0.3.3: resolution: {integrity: sha512-wD2AeVmxXRBoX44wAycgjVpMhvbwdI2aZjCkvfNcH1YqHQvJVa1duWc73OyVGJUc05fhFaTZeQ/PYsrmyH0JVA==}
sprintf-js@1.1.3: resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==}
stream-chain@2.2.5: resolution: {integrity: sha512-1TJmBx6aSWqZ4tx7aTpBDXK0/e2hhcNSTV8+CbFJtDjbb+I1mZ8lHit0Grw9GRT+6JbIrrDd8esncgBi8aBXGA==}
stream-combiner@0.0.4: resolution: {integrity: sha512-rT00SPnTVyRsaSz5zgSPma/aHSOic5U1prhYdRy5HS2kTZviFpmDgzilbtsJsxiroqACmayynDN/9VzIbX5DOw==}
stream-json@1.9.1: resolution: {integrity: sha512-uWkjJ+2Nt/LO9Z/JyKZbMusL8Dkh97uUBTv3AJQ74y07lVahLY4eEFsPsE97pxYBwr8nnjMAIch5eqI0gPShyw==}
string-comparison@1.3.0: resolution: {integrity: sha512-46aD+slEwybxAMPRII83ATbgMgTiz5P8mVd7Z6VJsCzSHFjdt1hkAVLeFxPIyEb11tc6ihpJTlIqoO0MCF6NPw==} engines: {node: ^16.0.0 || >=18.0.0}
string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'}
string.prototype.includes@2.0.1: resolution: {integrity: sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==} engines: {node: '>= 0.4'}
string.prototype.matchall@4.0.12: resolution: {integrity: sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==} engines: {node: '>= 0.4'}
string.prototype.repeat@1.0.0: resolution: {integrity: sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==}
string.prototype.trim@1.2.10: resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==} engines: {node: '>= 0.4'}
string.prototype.trimend@1.0.9: resolution: {integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==} engines: {node: '>= 0.4'}
string.prototype.trimstart@1.0.8: resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} engines: {node: '>= 0.4'}
string_decoder@1.3.0: resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==}
strip-ansi@3.0.1: resolution: {integrity: sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==} engines: {node: '>=0.10.0'}
strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'}
strip-bom@3.0.0: resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} engines: {node: '>=4'}
strip-json-comments@3.1.1: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'}
strtok3@10.2.1: resolution: {integrity: sha512-Q2dTnW3UXokAvXmXvrvMoUj/me3LyJI76HNHeuGMh2o0As/vzd7eHV3ncLOyvu928vQIDbE7Vf9ldEnC7cwy1w==} engines: {node: '>=18'}
supports-color@2.0.0: resolution: {integrity: sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==} engines: {node: '>=0.8.0'}
supports-color@7.2.0: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'}
supports-preserve-symlinks-flag@1.0.0: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'}
symbol-tree@3.2.4: resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==}
through@2.3.8: resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==}
tiny-typed-emitter@2.1.0: resolution: {integrity: sha512-qVtvMxeXbVej0cQWKqVSSAHmKZEHAvxdF8HEUBFWts8h+xEo5m/lEiPakuyZ3BnCBjOD8i24kzNOiOLLgsSxhA==}
tldts-core@6.1.78: resolution: {integrity: sha512-jS0svNsB99jR6AJBmfmEWuKIgz91Haya91Z43PATaeHJ24BkMoNRb/jlaD37VYjb0mYf6gRL/HOnvS1zEnYBiw==}
tldts@6.1.78: resolution: {integrity: sha512-fSgYrW0ITH0SR/CqKMXIruYIPpNu5aDgUp22UhYoSrnUQwc7SBqifEBFNce7AAcygUPBo6a/gbtcguWdmko4RQ==} hasBin: true
tmp@0.0.33: resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} engines: {node: '>=0.6.0'}
token-types@6.0.0: resolution: {integrity: sha512-lbDrTLVsHhOMljPscd0yitpozq7Ga2M5Cvez5AjGg8GASBjtt6iERCAJ93yommPmz62fb45oFIXHEZ3u9bfJEA==} engines: {node: '>=14.16'}
tough-cookie@5.1.1: resolution: {integrity: sha512-Ek7HndSVkp10hmHP9V4qZO1u+pn1RU5sI0Fw+jCU3lyvuMZcgqsNgc6CmJJZyByK4Vm/qotGRJlfgAX8q+4JiA==} engines: {node: '>=16'}
tr46@5.0.0: resolution: {integrity: sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==} engines: {node: '>=18'}
tsconfig-paths@3.15.0: resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==}
tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==}
type-check@0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'}
type-fest@0.21.3: resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} engines: {node: '>=10'}
type-fest@2.19.0: resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} engines: {node: '>=12.20'}
type-fest@4.35.0: resolution: {integrity: sha512-2/AwEFQDFEy30iOLjrvHDIH7e4HEWH+f1Yl1bI5XMqzuoCUqwYCdxachgsgv0og/JdVZUhbfjcJAoHj5L1753A==} engines: {node: '>=16'}
typed-array-buffer@1.0.3: resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} engines: {node: '>= 0.4'}
typed-array-byte-length@1.0.3: resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==} engines: {node: '>= 0.4'}
typed-array-byte-offset@1.0.4: resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==} engines: {node: '>= 0.4'}
typed-array-length@1.0.7: resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} engines: {node: '>= 0.4'}
uhyphen@0.2.0: resolution: {integrity: sha512-qz3o9CHXmJJPGBdqzab7qAYuW8kQGKNEuoHFYrBwV6hWIMcpAmxDLXojcHfFr9US1Pe6zUswEIJIbLI610fuqA==}
uint8array-extras@1.4.0: resolution: {integrity: sha512-ZPtzy0hu4cZjv3z5NW9gfKnNLjoz4y6uv4HlelAjDK7sY/xOkKZv9xK/WQpcsBB3jEybChz9DPC2U/+cusjJVQ==} engines: {node: '>=18'}
unbox-primitive@1.1.0: resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} engines: {node: '>= 0.4'}
undici-types@6.20.0: resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==}
universalify@2.0.1: resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} engines: {node: '>= 10.0.0'}
update-browserslist-db@1.1.2: resolution: {integrity: sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg==} hasBin: true peerDependencies: browserslist: '>= 4.21.0'
uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
vali-date@1.0.0: resolution: {integrity: sha512-sgECfZthyaCKW10N0fm27cg8HYTFK5qMWgypqkXMQ4Wbl/zZKx7xZICgcoxIIE+WFAP/MBL2EFwC/YvLxw3Zeg==} engines: {node: '>=0.10.0'}
w3c-xmlserializer@5.0.0: resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==} engines: {node: '>=18'}
wcwidth@1.0.1: resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==}
webidl-conversions@7.0.0: resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} engines: {node: '>=12'}
whatwg-encoding@3.1.1: resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==} engines: {node: '>=18'}
whatwg-mimetype@4.0.0: resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==} engines: {node: '>=18'}
whatwg-url@14.1.1: resolution: {integrity: sha512-mDGf9diDad/giZ/Sm9Xi2YcyzaFpbdLpJPr+E9fSkyQ7KpQD4SdFcugkRQYzhmfI4KeV4Qpnn2sKPdo+kmsgRQ==} engines: {node: '>=18'}
which-boxed-primitive@1.1.1: resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} engines: {node: '>= 0.4'}
which-builtin-type@1.2.1: resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==} engines: {node: '>= 0.4'}
which-collection@1.0.2: resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} engines: {node: '>= 0.4'}
which-typed-array@1.1.18: resolution: {integrity: sha512-qEcY+KJYlWyLH9vNbsr6/5j59AXk5ni5aakf8ldzBvGde6Iz4sxZGkJyWSAueTG7QhOvNRYb1lDdFmL5Td0QKA==} engines: {node: '>= 0.4'}
which@2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} engines: {node: '>= 8'} hasBin: true
word-wrap@1.2.5: resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} engines: {node: '>=0.10.0'}
wrap-ansi@6.2.0: resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} engines: {node: '>=8'}
wrap-ansi@7.0.0: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'}
wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
ws@8.18.1: resolution: {integrity: sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w==} engines: {node: '>=10.0.0'} peerDependencies: bufferutil: ^4.0.1 utf-8-validate: '>=5.0.2' peerDependenciesMeta: bufferutil: optional: true utf-8-validate: optional: true
xml-name-validator@5.0.0: resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==} engines: {node: '>=18'}
xmlchars@2.2.0: resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==}
y18n@5.0.8: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'}
yargonaut@1.1.4: resolution: {integrity: sha512-rHgFmbgXAAzl+1nngqOcwEljqHGG9uUZoPjsdZEs1w5JW9RXYzrSvH/u70C1JE5qFi0qjsdhnUX/dJRpWqitSA==}
yargs-parser@21.1.1: resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} engines: {node: '>=12'}
yargs@17.7.2: resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} engines: {node: '>=12'}
yocto-queue@0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'}
yoctocolors-cjs@2.1.2: resolution: {integrity: sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==} engines: {node: '>=18'}
snapshots:
'@apify/consts@2.37.0': {}
'@apify/datastructures@2.0.2': {}
'@apify/eslint-config@0.4.0(eslint@9.21.0)': dependencies: eslint: 9.21.0 eslint-config-airbnb: 19.0.4(eslint-plugin-import@2.31.0(eslint@9.21.0))(eslint-plugin-jsx-a11y@6.10.2(eslint@9.21.0))(eslint-plugin-react-hooks@4.6.2(eslint@9.21.0))(eslint-plugin-react@7.37.4(eslint@9.21.0))(eslint@9.21.0) eslint-config-airbnb-base: 15.0.0(eslint-plugin-import@2.31.0(eslint@9.21.0))(eslint@9.21.0) eslint-import-resolver-typescript: 2.7.1(eslint-plugin-import@2.31.0(eslint@9.21.0))(eslint@9.21.0) eslint-plugin-import: 2.31.0(eslint-import-resolver-typescript@2.7.1)(eslint@9.21.0) eslint-plugin-jsx-a11y: 6.10.2(eslint@9.21.0) eslint-plugin-react: 7.37.4(eslint@9.21.0) eslint-plugin-react-hooks: 4.6.2(eslint@9.21.0) transitivePeerDependencies: - '@typescript-eslint/parser' - eslint-import-resolver-webpack - supports-color
'@apify/input_secrets@1.1.65': dependencies: '@apify/log': 2.5.13 '@apify/utilities': 2.13.1 ow: 0.28.2
'@apify/log@2.5.13': dependencies: '@apify/consts': 2.37.0 ansi-colors: 4.1.3
'@apify/ps-tree@1.2.0': dependencies: event-stream: 3.3.4
'@apify/pseudo_url@2.0.54': dependencies: '@apify/log': 2.5.13
'@apify/timeout@0.3.1': {}
'@apify/utilities@2.13.1': dependencies: '@apify/consts': 2.37.0 '@apify/log': 2.5.13
'@asamuzakjp/css-color@2.8.3': dependencies: '@csstools/css-calc': 2.1.1(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3) '@csstools/css-color-parser': 3.0.7(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3) '@csstools/css-parser-algorithms': 3.0.4(@csstools/css-tokenizer@3.0.3) '@csstools/css-tokenizer': 3.0.3 lru-cache: 10.4.3
'@crawlee/basic@3.12.2': dependencies: '@apify/log': 2.5.13 '@apify/timeout': 0.3.1 '@apify/utilities': 2.13.1 '@crawlee/core': 3.12.2 '@crawlee/types': 3.12.2 '@crawlee/utils': 3.12.2 csv-stringify: 6.5.2 fs-extra: 11.3.0 got-scraping: 4.1.1 ow: 0.28.2 tldts: 6.1.78 tslib: 2.8.1 type-fest: 4.35.0 transitivePeerDependencies: - supports-color
'@crawlee/browser-pool@3.12.2': dependencies: '@apify/log': 2.5.13 '@apify/timeout': 0.3.1 '@crawlee/core': 3.12.2 '@crawlee/types': 3.12.2 fingerprint-generator: 2.1.62 fingerprint-injector: 2.1.62 lodash.merge: 4.6.2 nanoid: 3.3.8 ow: 0.28.2 p-limit: 3.1.0 proxy-chain: 2.5.6 quick-lru: 5.1.1 tiny-typed-emitter: 2.1.0 tslib: 2.8.1 transitivePeerDependencies: - supports-color
'@crawlee/browser@3.12.2': dependencies: '@apify/timeout': 0.3.1 '@crawlee/basic': 3.12.2 '@crawlee/browser-pool': 3.12.2 '@crawlee/types': 3.12.2 '@crawlee/utils': 3.12.2 ow: 0.28.2 tslib: 2.8.1 type-fest: 4.35.0 transitivePeerDependencies: - supports-color
'@crawlee/cheerio@3.12.2': dependencies: '@crawlee/http': 3.12.2 '@crawlee/types': 3.12.2 '@crawlee/utils': 3.12.2 cheerio: 1.0.0-rc.12 htmlparser2: 9.1.0 tslib: 2.8.1 transitivePeerDependencies: - supports-color
'@crawlee/cli@3.12.2': dependencies: '@crawlee/templates': 3.12.2 ansi-colors: 4.1.3 fs-extra: 11.3.0 inquirer: 8.2.6 tslib: 2.8.1 yargonaut: 1.1.4 yargs: 17.7.2
'@crawlee/core@3.12.2': dependencies: '@apify/consts': 2.37.0 '@apify/datastructures': 2.0.2 '@apify/log': 2.5.13 '@apify/pseudo_url': 2.0.54 '@apify/timeout': 0.3.1 '@apify/utilities': 2.13.1 '@crawlee/memory-storage': 3.12.2 '@crawlee/types': 3.12.2 '@crawlee/utils': 3.12.2 '@sapphire/async-queue': 1.5.5 '@vladfrangu/async_event_emitter': 2.4.6 csv-stringify: 6.5.2 fs-extra: 11.3.0 got-scraping: 4.1.1 json5: 2.2.3 minimatch: 9.0.5 ow: 0.28.2 stream-json: 1.9.1 tldts: 6.1.78 tough-cookie: 5.1.1 tslib: 2.8.1 type-fest: 4.35.0 transitivePeerDependencies: - supports-color
'@crawlee/http@3.12.2': dependencies: '@apify/timeout': 0.3.1 '@apify/utilities': 2.13.1 '@crawlee/basic': 3.12.2 '@crawlee/types': 3.12.2 '@crawlee/utils': 3.12.2 '@types/content-type': 1.1.8 cheerio: 1.0.0-rc.12 content-type: 1.0.5 got-scraping: 4.1.1 iconv-lite: 0.6.3 mime-types: 2.1.35 ow: 0.28.2 tslib: 2.8.1 type-fest: 4.35.0 transitivePeerDependencies: - supports-color
'@crawlee/jsdom@3.12.2': dependencies: '@apify/timeout': 0.3.1 '@apify/utilities': 2.13.1 '@crawlee/http': 3.12.2 '@crawlee/types': 3.12.2 '@crawlee/utils': 3.12.2 '@types/jsdom': 21.1.7 cheerio: 1.0.0-rc.12 jsdom: 26.0.0 ow: 0.28.2 tslib: 2.8.1 transitivePeerDependencies: - bufferutil - canvas - supports-color - utf-8-validate
'@crawlee/linkedom@3.12.2': dependencies: '@apify/timeout': 0.3.1 '@apify/utilities': 2.13.1 '@crawlee/http': 3.12.2 '@crawlee/types': 3.12.2 linkedom: 0.18.9 ow: 0.28.2 tslib: 2.8.1 transitivePeerDependencies: - supports-color
'@crawlee/memory-storage@3.12.2': dependencies: '@apify/log': 2.5.13 '@crawlee/types': 3.12.2 '@sapphire/async-queue': 1.5.5 '@sapphire/shapeshift': 3.9.7 content-type: 1.0.5 fs-extra: 11.3.0 json5: 2.2.3 mime-types: 2.1.35 proper-lockfile: 4.1.2 tslib: 2.8.1
'@crawlee/playwright@3.12.2': dependencies: '@apify/datastructures': 2.0.2 '@apify/log': 2.5.13 '@apify/timeout': 0.3.1 '@crawlee/browser': 3.12.2 '@crawlee/browser-pool': 3.12.2 '@crawlee/core': 3.12.2 '@crawlee/types': 3.12.2 '@crawlee/utils': 3.12.2 cheerio: 1.0.0-rc.12 idcac-playwright: 0.1.3 jquery: 3.7.1 lodash.isequal: 4.5.0 ml-logistic-regression: 2.0.0 ml-matrix: 6.12.0 ow: 0.28.2 string-comparison: 1.3.0 tslib: 2.8.1 transitivePeerDependencies: - puppeteer - supports-color
'@crawlee/puppeteer@3.12.2': dependencies: '@apify/datastructures': 2.0.2 '@apify/log': 2.5.13 '@crawlee/browser': 3.12.2 '@crawlee/browser-pool': 3.12.2 '@crawlee/types': 3.12.2 '@crawlee/utils': 3.12.2 cheerio: 1.0.0-rc.12 devtools-protocol: 0.0.1423531 idcac-playwright: 0.1.3 jquery: 3.7.1 ow: 0.28.2 tslib: 2.8.1 transitivePeerDependencies: - playwright - supports-color
'@crawlee/templates@3.12.2': dependencies: ansi-colors: 4.1.3 inquirer: 9.3.7 tslib: 2.8.1 yargonaut: 1.1.4 yargs: 17.7.2
'@crawlee/types@3.12.2': dependencies: tslib: 2.8.1
'@crawlee/utils@3.12.2': dependencies: '@apify/log': 2.5.13 '@apify/ps-tree': 1.2.0 '@crawlee/types': 3.12.2 '@types/sax': 1.2.7 cheerio: 1.0.0-rc.12 file-type: 20.1.0 got-scraping: 4.1.1 ow: 0.28.2 robots-parser: 3.0.1 sax: 1.4.1 tslib: 2.8.1 whatwg-mimetype: 4.0.0 transitivePeerDependencies: - supports-color
'@csstools/color-helpers@5.0.1': {}
'@csstools/css-calc@2.1.1(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3)': dependencies: '@csstools/css-parser-algorithms': 3.0.4(@csstools/css-tokenizer@3.0.3) '@csstools/css-tokenizer': 3.0.3
'@csstools/css-color-parser@3.0.7(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3)': dependencies: '@csstools/color-helpers': 5.0.1 '@csstools/css-calc': 2.1.1(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3) '@csstools/css-parser-algorithms': 3.0.4(@csstools/css-tokenizer@3.0.3) '@csstools/css-tokenizer': 3.0.3
'@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3)': dependencies: '@csstools/css-tokenizer': 3.0.3
'@csstools/css-tokenizer@3.0.3': {}
'@eslint-community/eslint-utils@4.4.1(eslint@9.21.0)': dependencies: eslint: 9.21.0 eslint-visitor-keys: 3.4.3
'@eslint-community/regexpp@4.12.1': {}
'@eslint/config-array@0.19.2': dependencies: '@eslint/object-schema': 2.1.6 debug: 4.4.0 minimatch: 3.1.2 transitivePeerDependencies: - supports-color
'@eslint/core@0.12.0': dependencies: '@types/json-schema': 7.0.15
'@eslint/eslintrc@3.3.0': dependencies: ajv: 6.12.6 debug: 4.4.0 espree: 10.3.0 globals: 14.0.0 ignore: 5.3.2 import-fresh: 3.3.1 js-yaml: 4.1.0 minimatch: 3.1.2 strip-json-comments: 3.1.1 transitivePeerDependencies: - supports-color
'@eslint/js@9.21.0': {}
'@eslint/object-schema@2.1.6': {}
'@eslint/plugin-kit@0.2.7': dependencies: '@eslint/core': 0.12.0 levn: 0.4.1
'@humanfs/core@0.19.1': {}
'@humanfs/node@0.16.6': dependencies: '@humanfs/core': 0.19.1 '@humanwhocodes/retry': 0.3.1
'@humanwhocodes/module-importer@1.0.1': {}
'@humanwhocodes/retry@0.3.1': {}
'@humanwhocodes/retry@0.4.2': {}
'@inquirer/figures@1.0.10': {}
'@rtsao/scc@1.1.0': {}
'@sapphire/async-queue@1.5.5': {}
'@sapphire/shapeshift@3.9.7': dependencies: fast-deep-equal: 3.1.3 lodash: 4.17.21
'@sec-ant/readable-stream@0.4.1': {}
'@sindresorhus/is@4.6.0': {}
'@sindresorhus/is@5.6.0': {}
'@sindresorhus/is@7.0.1': {}
'@szmarczak/http-timer@5.0.1': dependencies: defer-to-connect: 2.0.1
'@tokenizer/inflate@0.2.6': dependencies: debug: 4.4.0 fflate: 0.8.2 token-types: 6.0.0 transitivePeerDependencies: - supports-color
'@tokenizer/token@0.3.0': {}
'@types/content-type@1.1.8': {}
'@types/estree@1.0.6': {}
'@types/http-cache-semantics@4.0.4': {}
'@types/jsdom@21.1.7': dependencies: '@types/node': 22.13.5 '@types/tough-cookie': 4.0.5 parse5: 7.2.1
'@types/json-schema@7.0.15': {}
'@types/json5@0.0.29': {}
'@types/node@22.13.5': dependencies: undici-types: 6.20.0
'@types/sax@1.2.7': dependencies: '@types/node': 22.13.5
'@types/tough-cookie@4.0.5': {}
'@vladfrangu/async_event_emitter@2.4.6': {}
acorn-jsx@5.3.2(acorn@8.14.0): dependencies: acorn: 8.14.0
acorn@8.14.0: {}
adm-zip@0.5.16: {}
agent-base@7.1.3: {}
agentkeepalive@4.6.0: dependencies: humanize-ms: 1.2.1
ajv@6.12.6: dependencies: fast-deep-equal: 3.1.3 fast-json-stable-stringify: 2.1.0 json-schema-traverse: 0.4.1 uri-js: 4.4.1
ansi-colors@4.1.3: {}
ansi-escapes@4.3.2: dependencies: type-fest: 0.21.3
ansi-regex@2.1.1: {}
ansi-regex@5.0.1: {}
ansi-styles@2.2.1: {}
ansi-styles@4.3.0: dependencies: color-convert: 2.0.1
apify-client@2.12.0: dependencies: '@apify/consts': 2.37.0 '@apify/log': 2.5.13 '@crawlee/types': 3.12.2 agentkeepalive: 4.6.0 async-retry: 1.3.3 axios: 1.7.9 content-type: 1.0.5 ow: 0.28.2 tslib: 2.8.1 type-fest: 4.35.0 transitivePeerDependencies: - debug
apify@3.3.2: dependencies: '@apify/consts': 2.37.0 '@apify/input_secrets': 1.1.65 '@apify/log': 2.5.13 '@apify/timeout': 0.3.1 '@apify/utilities': 2.13.1 '@crawlee/core': 3.12.2 '@crawlee/types': 3.12.2 '@crawlee/utils': 3.12.2 apify-client: 2.12.0 fs-extra: 11.3.0 ow: 0.28.2 semver: 7.7.1 tslib: 2.8.1 ws: 8.18.1 transitivePeerDependencies: - bufferutil - debug - supports-color - utf-8-validate
argparse@2.0.1: {}
aria-query@5.3.2: {}
array-buffer-byte-length@1.0.2: dependencies: call-bound: 1.0.3 is-array-buffer: 3.0.5
array-includes@3.1.8: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 es-abstract: 1.23.9 es-object-atoms: 1.1.1 get-intrinsic: 1.3.0 is-string: 1.1.1
array.prototype.findlast@1.2.5: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 es-abstract: 1.23.9 es-errors: 1.3.0 es-object-atoms: 1.1.1 es-shim-unscopables: 1.1.0
array.prototype.findlastindex@1.2.5: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 es-abstract: 1.23.9 es-errors: 1.3.0 es-object-atoms: 1.1.1 es-shim-unscopables: 1.1.0
array.prototype.flat@1.3.3: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 es-abstract: 1.23.9 es-shim-unscopables: 1.1.0
array.prototype.flatmap@1.3.3: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 es-abstract: 1.23.9 es-shim-unscopables: 1.1.0
array.prototype.tosorted@1.1.4: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 es-abstract: 1.23.9 es-errors: 1.3.0 es-shim-unscopables: 1.1.0
arraybuffer.prototype.slice@1.0.4: dependencies: array-buffer-byte-length: 1.0.2 call-bind: 1.0.8 define-properties: 1.2.1 es-abstract: 1.23.9 es-errors: 1.3.0 get-intrinsic: 1.3.0 is-array-buffer: 3.0.5
ast-types-flow@0.0.8: {}
async-function@1.0.0: {}
async-retry@1.3.3: dependencies: retry: 0.13.1
asynckit@0.4.0: {}
available-typed-arrays@1.0.7: dependencies: possible-typed-array-names: 1.1.0
axe-core@4.10.2: {}
axios@1.7.9: dependencies: follow-redirects: 1.15.9 form-data: 4.0.2 proxy-from-env: 1.1.0 transitivePeerDependencies: - debug
axobject-query@4.1.0: {}
balanced-match@1.0.2: {}
base64-js@1.5.1: {}
bl@4.1.0: dependencies: buffer: 5.7.1 inherits: 2.0.4 readable-stream: 3.6.2
boolbase@1.0.0: {}
brace-expansion@1.1.11: dependencies: balanced-match: 1.0.2 concat-map: 0.0.1
brace-expansion@2.0.1: dependencies: balanced-match: 1.0.2
browserslist@4.24.4: dependencies: caniuse-lite: 1.0.30001700 electron-to-chromium: 1.5.103 node-releases: 2.0.19 update-browserslist-db: 1.1.2(browserslist@4.24.4)
buffer@5.7.1: dependencies: base64-js: 1.5.1 ieee754: 1.2.1
cacheable-lookup@7.0.0: {}
cacheable-request@12.0.1: dependencies: '@types/http-cache-semantics': 4.0.4 get-stream: 9.0.1 http-cache-semantics: 4.1.1 keyv: 4.5.4 mimic-response: 4.0.0 normalize-url: 8.0.1 responselike: 3.0.0
call-bind-apply-helpers@1.0.2: dependencies: es-errors: 1.3.0 function-bind: 1.1.2
call-bind@1.0.8: dependencies: call-bind-apply-helpers: 1.0.2 es-define-property: 1.0.1 get-intrinsic: 1.3.0 set-function-length: 1.2.2
call-bound@1.0.3: dependencies: call-bind-apply-helpers: 1.0.2 get-intrinsic: 1.3.0
callsites@3.1.0: {}
callsites@4.2.0: {}
caniuse-lite@1.0.30001700: {}
chalk@1.1.3: dependencies: ansi-styles: 2.2.1 escape-string-regexp: 1.0.5 has-ansi: 2.0.0 strip-ansi: 3.0.1 supports-color: 2.0.0
chalk@4.1.2: dependencies: ansi-styles: 4.3.0 supports-color: 7.2.0
chardet@0.7.0: {}
cheerio-select@2.1.0: dependencies: boolbase: 1.0.0 css-select: 5.1.0 css-what: 6.1.0 domelementtype: 2.3.0 domhandler: 5.0.3 domutils: 3.2.2
cheerio@1.0.0-rc.12: dependencies: cheerio-select: 2.1.0 dom-serializer: 2.0.0 domhandler: 5.0.3 domutils: 3.2.2 htmlparser2: 8.0.2 parse5: 7.2.1 parse5-htmlparser2-tree-adapter: 7.1.0
cli-cursor@3.1.0: dependencies: restore-cursor: 3.1.0
cli-spinners@2.9.2: {}
cli-width@3.0.0: {}
cli-width@4.1.0: {}
cliui@8.0.1: dependencies: string-width: 4.2.3 strip-ansi: 6.0.1 wrap-ansi: 7.0.0
clone@1.0.4: {}
color-convert@2.0.1: dependencies: color-name: 1.1.4
color-name@1.1.4: {}
combined-stream@1.0.8: dependencies: delayed-stream: 1.0.0
concat-map@0.0.1: {}
confusing-browser-globals@1.0.11: {}
content-type@1.0.5: {}
crawlee@3.12.2: dependencies: '@crawlee/basic': 3.12.2 '@crawlee/browser': 3.12.2 '@crawlee/browser-pool': 3.12.2 '@crawlee/cheerio': 3.12.2 '@crawlee/cli': 3.12.2 '@crawlee/core': 3.12.2 '@crawlee/http': 3.12.2 '@crawlee/jsdom': 3.12.2 '@crawlee/linkedom': 3.12.2 '@crawlee/playwright': 3.12.2 '@crawlee/puppeteer': 3.12.2 '@crawlee/utils': 3.12.2 import-local: 3.2.0 tslib: 2.8.1 transitivePeerDependencies: - bufferutil - canvas - supports-color - utf-8-validate
cross-spawn@7.0.6: dependencies: path-key: 3.1.1 shebang-command: 2.0.0 which: 2.0.2
css-select@5.1.0: dependencies: boolbase: 1.0.0 css-what: 6.1.0 domhandler: 5.0.3 domutils: 3.2.2 nth-check: 2.1.1
css-what@6.1.0: {}
cssom@0.5.0: {}
cssstyle@4.2.1: dependencies: '@asamuzakjp/css-color': 2.8.3 rrweb-cssom: 0.8.0
csv-stringify@6.5.2: {}
damerau-levenshtein@1.0.8: {}
data-urls@5.0.0: dependencies: whatwg-mimetype: 4.0.0 whatwg-url: 14.1.1
data-view-buffer@1.0.2: dependencies: call-bound: 1.0.3 es-errors: 1.3.0 is-data-view: 1.0.2
data-view-byte-length@1.0.2: dependencies: call-bound: 1.0.3 es-errors: 1.3.0 is-data-view: 1.0.2
data-view-byte-offset@1.0.1: dependencies: call-bound: 1.0.3 es-errors: 1.3.0 is-data-view: 1.0.2
debug@3.2.7: dependencies: ms: 2.1.3
debug@4.4.0: dependencies: ms: 2.1.3
decimal.js@10.5.0: {}
decompress-response@6.0.0: dependencies: mimic-response: 3.1.0
deep-is@0.1.4: {}
defaults@1.0.4: dependencies: clone: 1.0.4
defer-to-connect@2.0.1: {}
define-data-property@1.1.4: dependencies: es-define-property: 1.0.1 es-errors: 1.3.0 gopd: 1.2.0
define-properties@1.2.1: dependencies: define-data-property: 1.1.4 has-property-descriptors: 1.0.2 object-keys: 1.1.1
delayed-stream@1.0.0: {}
devtools-protocol@0.0.1423531: {}
doctrine@2.1.0: dependencies: esutils: 2.0.3
dom-serializer@2.0.0: dependencies: domelementtype: 2.3.0 domhandler: 5.0.3 entities: 4.5.0
domelementtype@2.3.0: {}
domhandler@5.0.3: dependencies: domelementtype: 2.3.0
domutils@3.2.2: dependencies: dom-serializer: 2.0.0 domelementtype: 2.3.0 domhandler: 5.0.3
dot-prop@6.0.1: dependencies: is-obj: 2.0.0
dot-prop@7.2.0: dependencies: type-fest: 2.19.0
dunder-proto@1.0.1: dependencies: call-bind-apply-helpers: 1.0.2 es-errors: 1.3.0 gopd: 1.2.0
duplexer@0.1.2: {}
electron-to-chromium@1.5.103: {}
emoji-regex@8.0.0: {}
emoji-regex@9.2.2: {}
entities@4.5.0: {}
entities@6.0.0: {}
es-abstract@1.23.9: dependencies: array-buffer-byte-length: 1.0.2 arraybuffer.prototype.slice: 1.0.4 available-typed-arrays: 1.0.7 call-bind: 1.0.8 call-bound: 1.0.3 data-view-buffer: 1.0.2 data-view-byte-length: 1.0.2 data-view-byte-offset: 1.0.1 es-define-property: 1.0.1 es-errors: 1.3.0 es-object-atoms: 1.1.1 es-set-tostringtag: 2.1.0 es-to-primitive: 1.3.0 function.prototype.name: 1.1.8 get-intrinsic: 1.3.0 get-proto: 1.0.1 get-symbol-description: 1.1.0 globalthis: 1.0.4 gopd: 1.2.0 has-property-descriptors: 1.0.2 has-proto: 1.2.0 has-symbols: 1.1.0 hasown: 2.0.2 internal-slot: 1.1.0 is-array-buffer: 3.0.5 is-callable: 1.2.7 is-data-view: 1.0.2 is-regex: 1.2.1 is-shared-array-buffer: 1.0.4 is-string: 1.1.1 is-typed-array: 1.1.15 is-weakref: 1.1.1 math-intrinsics: 1.1.0 object-inspect: 1.13.4 object-keys: 1.1.1 object.assign: 4.1.7 own-keys: 1.0.1 regexp.prototype.flags: 1.5.4 safe-array-concat: 1.1.3 safe-push-apply: 1.0.0 safe-regex-test: 1.1.0 set-proto: 1.0.0 string.prototype.trim: 1.2.10 string.prototype.trimend: 1.0.9 string.prototype.trimstart: 1.0.8 typed-array-buffer: 1.0.3 typed-array-byte-length: 1.0.3 typed-array-byte-offset: 1.0.4 typed-array-length: 1.0.7 unbox-primitive: 1.1.0 which-typed-array: 1.1.18
es-define-property@1.0.1: {}
es-errors@1.3.0: {}
es-iterator-helpers@1.2.1: dependencies: call-bind: 1.0.8 call-bound: 1.0.3 define-properties: 1.2.1 es-abstract: 1.23.9 es-errors: 1.3.0 es-set-tostringtag: 2.1.0 function-bind: 1.1.2 get-intrinsic: 1.3.0 globalthis: 1.0.4 gopd: 1.2.0 has-property-descriptors: 1.0.2 has-proto: 1.2.0 has-symbols: 1.1.0 internal-slot: 1.1.0 iterator.prototype: 1.1.5 safe-array-concat: 1.1.3
es-object-atoms@1.1.1: dependencies: es-errors: 1.3.0
es-set-tostringtag@2.1.0: dependencies: es-errors: 1.3.0 get-intrinsic: 1.3.0 has-tostringtag: 1.0.2 hasown: 2.0.2
es-shim-unscopables@1.1.0: dependencies: hasown: 2.0.2
es-to-primitive@1.3.0: dependencies: is-callable: 1.2.7 is-date-object: 1.1.0 is-symbol: 1.1.1
escalade@3.2.0: {}
escape-string-regexp@1.0.5: {}
escape-string-regexp@4.0.0: {}
eslint-config-airbnb-base@15.0.0(eslint-plugin-import@2.31.0(eslint@9.21.0))(eslint@9.21.0): dependencies: confusing-browser-globals: 1.0.11 eslint: 9.21.0 eslint-plugin-import: 2.31.0(eslint-import-resolver-typescript@2.7.1)(eslint@9.21.0) object.assign: 4.1.7 object.entries: 1.1.8 semver: 6.3.1
eslint-config-airbnb@19.0.4(eslint-plugin-import@2.31.0(eslint@9.21.0))(eslint-plugin-jsx-a11y@6.10.2(eslint@9.21.0))(eslint-plugin-react-hooks@4.6.2(eslint@9.21.0))(eslint-plugin-react@7.37.4(eslint@9.21.0))(eslint@9.21.0): dependencies: eslint: 9.21.0 eslint-config-airbnb-base: 15.0.0(eslint-plugin-import@2.31.0(eslint@9.21.0))(eslint@9.21.0) eslint-plugin-import: 2.31.0(eslint-import-resolver-typescript@2.7.1)(eslint@9.21.0) eslint-plugin-jsx-a11y: 6.10.2(eslint@9.21.0) eslint-plugin-react: 7.37.4(eslint@9.21.0) eslint-plugin-react-hooks: 4.6.2(eslint@9.21.0) object.assign: 4.1.7 object.entries: 1.1.8
eslint-import-resolver-node@0.3.9: dependencies: debug: 3.2.7 is-core-module: 2.16.1 resolve: 1.22.10 transitivePeerDependencies: - supports-color
eslint-import-resolver-typescript@2.7.1(eslint-plugin-import@2.31.0(eslint@9.21.0))(eslint@9.21.0): dependencies: debug: 4.4.0 eslint: 9.21.0 eslint-plugin-import: 2.31.0(eslint-import-resolver-typescript@2.7.1)(eslint@9.21.0) glob: 7.2.3 is-glob: 4.0.3 resolve: 1.22.10 tsconfig-paths: 3.15.0 transitivePeerDependencies: - supports-color
eslint-module-utils@2.12.0(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@2.7.1(eslint-plugin-import@2.31.0(eslint@9.21.0))(eslint@9.21.0))(eslint@9.21.0): dependencies: debug: 3.2.7 optionalDependencies: eslint: 9.21.0 eslint-import-resolver-node: 0.3.9 eslint-import-resolver-typescript: 2.7.1(eslint-plugin-import@2.31.0(eslint@9.21.0))(eslint@9.21.0) transitivePeerDependencies: - supports-color
eslint-plugin-import@2.31.0(eslint-import-resolver-typescript@2.7.1)(eslint@9.21.0): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.8 array.prototype.findlastindex: 1.2.5 array.prototype.flat: 1.3.3 array.prototype.flatmap: 1.3.3 debug: 3.2.7 doctrine: 2.1.0 eslint: 9.21.0 eslint-import-resolver-node: 0.3.9 eslint-module-utils: 2.12.0(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@2.7.1(eslint-plugin-import@2.31.0(eslint@9.21.0))(eslint@9.21.0))(eslint@9.21.0) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 minimatch: 3.1.2 object.fromentries: 2.0.8 object.groupby: 1.0.3 object.values: 1.2.1 semver: 6.3.1 string.prototype.trimend: 1.0.9 tsconfig-paths: 3.15.0 transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color
eslint-plugin-jsx-a11y@6.10.2(eslint@9.21.0): dependencies: aria-query: 5.3.2 array-includes: 3.1.8 array.prototype.flatmap: 1.3.3 ast-types-flow: 0.0.8 axe-core: 4.10.2 axobject-query: 4.1.0 damerau-levenshtein: 1.0.8 emoji-regex: 9.2.2 eslint: 9.21.0 hasown: 2.0.2 jsx-ast-utils: 3.3.5 language-tags: 1.0.9 minimatch: 3.1.2 object.fromentries: 2.0.8 safe-regex-test: 1.1.0 string.prototype.includes: 2.0.1
eslint-plugin-react-hooks@4.6.2(eslint@9.21.0): dependencies: eslint: 9.21.0
eslint-plugin-react@7.37.4(eslint@9.21.0): dependencies: array-includes: 3.1.8 array.prototype.findlast: 1.2.5 array.prototype.flatmap: 1.3.3 array.prototype.tosorted: 1.1.4 doctrine: 2.1.0 es-iterator-helpers: 1.2.1 eslint: 9.21.0 estraverse: 5.3.0 hasown: 2.0.2 jsx-ast-utils: 3.3.5 minimatch: 3.1.2 object.entries: 1.1.8 object.fromentries: 2.0.8 object.values: 1.2.1 prop-types: 15.8.1 resolve: 2.0.0-next.5 semver: 6.3.1 string.prototype.matchall: 4.0.12 string.prototype.repeat: 1.0.0
eslint-scope@8.2.0: dependencies: esrecurse: 4.3.0 estraverse: 5.3.0
eslint-visitor-keys@3.4.3: {}
eslint-visitor-keys@4.2.0: {}
eslint@9.21.0: dependencies: '@eslint-community/eslint-utils': 4.4.1(eslint@9.21.0) '@eslint-community/regexpp': 4.12.1 '@eslint/config-array': 0.19.2 '@eslint/core': 0.12.0 '@eslint/eslintrc': 3.3.0 '@eslint/js': 9.21.0 '@eslint/plugin-kit': 0.2.7 '@humanfs/node': 0.16.6 '@humanwhocodes/module-importer': 1.0.1 '@humanwhocodes/retry': 0.4.2 '@types/estree': 1.0.6 '@types/json-schema': 7.0.15 ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.6 debug: 4.4.0 escape-string-regexp: 4.0.0 eslint-scope: 8.2.0 eslint-visitor-keys: 4.2.0 espree: 10.3.0 esquery: 1.6.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 file-entry-cache: 8.0.0 find-up: 5.0.0 glob-parent: 6.0.2 ignore: 5.3.2 imurmurhash: 0.1.4 is-glob: 4.0.3 json-stable-stringify-without-jsonify: 1.0.1 lodash.merge: 4.6.2 minimatch: 3.1.2 natural-compare: 1.4.0 optionator: 0.9.4 transitivePeerDependencies: - supports-color
espree@10.3.0: dependencies: acorn: 8.14.0 acorn-jsx: 5.3.2(acorn@8.14.0) eslint-visitor-keys: 4.2.0
esquery@1.6.0: dependencies: estraverse: 5.3.0
esrecurse@4.3.0: dependencies: estraverse: 5.3.0
estraverse@5.3.0: {}
esutils@2.0.3: {}
event-stream@3.3.4: dependencies: duplexer: 0.1.2 from: 0.1.7 map-stream: 0.1.0 pause-stream: 0.0.11 split: 0.3.3 stream-combiner: 0.0.4 through: 2.3.8
external-editor@3.1.0: dependencies: chardet: 0.7.0 iconv-lite: 0.4.24 tmp: 0.0.33
fast-deep-equal@3.1.3: {}
fast-json-stable-stringify@2.1.0: {}
fast-levenshtein@2.0.6: {}
fflate@0.8.2: {}
figlet@1.8.0: {}
figures@3.2.0: dependencies: escape-string-regexp: 1.0.5
file-entry-cache@8.0.0: dependencies: flat-cache: 4.0.1
file-type@20.1.0: dependencies: '@tokenizer/inflate': 0.2.6 strtok3: 10.2.1 token-types: 6.0.0 uint8array-extras: 1.4.0 transitivePeerDependencies: - supports-color
find-up@4.1.0: dependencies: locate-path: 5.0.0 path-exists: 4.0.0
find-up@5.0.0: dependencies: locate-path: 6.0.0 path-exists: 4.0.0
fingerprint-generator@2.1.62: dependencies: generative-bayesian-network: 2.1.62 header-generator: 2.1.62 tslib: 2.8.1
fingerprint-injector@2.1.62: dependencies: fingerprint-generator: 2.1.62 tslib: 2.8.1
flat-cache@4.0.1: dependencies: flatted: 3.3.3 keyv: 4.5.4
flatted@3.3.3: {}
follow-redirects@1.15.9: {}
for-each@0.3.5: dependencies: is-callable: 1.2.7
form-data-encoder@4.0.2: {}
form-data@4.0.2: dependencies: asynckit: 0.4.0 combined-stream: 1.0.8 es-set-tostringtag: 2.1.0 mime-types: 2.1.35
from@0.1.7: {}
fs-extra@11.3.0: dependencies: graceful-fs: 4.2.11 jsonfile: 6.1.0 universalify: 2.0.1
fs.realpath@1.0.0: {}
function-bind@1.1.2: {}
function.prototype.name@1.1.8: dependencies: call-bind: 1.0.8 call-bound: 1.0.3 define-properties: 1.2.1 functions-have-names: 1.2.3 hasown: 2.0.2 is-callable: 1.2.7
functions-have-names@1.2.3: {}
generative-bayesian-network@2.1.62: dependencies: adm-zip: 0.5.16 tslib: 2.8.1
get-caller-file@2.0.5: {}
get-intrinsic@1.3.0: dependencies: call-bind-apply-helpers: 1.0.2 es-define-property: 1.0.1 es-errors: 1.3.0 es-object-atoms: 1.1.1 function-bind: 1.1.2 get-proto: 1.0.1 gopd: 1.2.0 has-symbols: 1.1.0 hasown: 2.0.2 math-intrinsics: 1.1.0
get-proto@1.0.1: dependencies: dunder-proto: 1.0.1 es-object-atoms: 1.1.1
get-stream@9.0.1: dependencies: '@sec-ant/readable-stream': 0.4.1 is-stream: 4.0.1
get-symbol-description@1.1.0: dependencies: call-bound: 1.0.3 es-errors: 1.3.0 get-intrinsic: 1.3.0
glob-parent@6.0.2: dependencies: is-glob: 4.0.3
glob@7.2.3: dependencies: fs.realpath: 1.0.0 inflight: 1.0.6 inherits: 2.0.4 minimatch: 3.1.2 once: 1.4.0 path-is-absolute: 1.0.1
globals@14.0.0: {}
globalthis@1.0.4: dependencies: define-properties: 1.2.1 gopd: 1.2.0
gopd@1.2.0: {}
got-scraping@4.1.1: dependencies: got: 14.4.6 header-generator: 2.1.62 http2-wrapper: 2.2.1 mimic-response: 4.0.0 ow: 1.1.1 quick-lru: 7.0.0 tslib: 2.8.1
got@14.4.6: dependencies: '@sindresorhus/is': 7.0.1 '@szmarczak/http-timer': 5.0.1 cacheable-lookup: 7.0.0 cacheable-request: 12.0.1 decompress-response: 6.0.0 form-data-encoder: 4.0.2 http2-wrapper: 2.2.1 lowercase-keys: 3.0.0 p-cancelable: 4.0.1 responselike: 3.0.0 type-fest: 4.35.0
graceful-fs@4.2.11: {}
has-ansi@2.0.0: dependencies: ansi-regex: 2.1.1
has-bigints@1.1.0: {}
has-flag@4.0.0: {}
has-property-descriptors@1.0.2: dependencies: es-define-property: 1.0.1
has-proto@1.2.0: dependencies: dunder-proto: 1.0.1
has-symbols@1.1.0: {}
has-tostringtag@1.0.2: dependencies: has-symbols: 1.1.0
hasown@2.0.2: dependencies: function-bind: 1.1.2
header-generator@2.1.62: dependencies: browserslist: 4.24.4 generative-bayesian-network: 2.1.62 ow: 0.28.2 tslib: 2.8.1
html-encoding-sniffer@4.0.0: dependencies: whatwg-encoding: 3.1.1
html-escaper@3.0.3: {}
htmlparser2@10.0.0: dependencies: domelementtype: 2.3.0 domhandler: 5.0.3 domutils: 3.2.2 entities: 6.0.0
htmlparser2@8.0.2: dependencies: domelementtype: 2.3.0 domhandler: 5.0.3 domutils: 3.2.2 entities: 4.5.0
htmlparser2@9.1.0: dependencies: domelementtype: 2.3.0 domhandler: 5.0.3 domutils: 3.2.2 entities: 4.5.0
http-cache-semantics@4.1.1: {}
http-proxy-agent@7.0.2: dependencies: agent-base: 7.1.3 debug: 4.4.0 transitivePeerDependencies: - supports-color
http2-wrapper@2.2.1: dependencies: quick-lru: 5.1.1 resolve-alpn: 1.2.1
https-proxy-agent@7.0.6: dependencies: agent-base: 7.1.3 debug: 4.4.0 transitivePeerDependencies: - supports-color
humanize-ms@1.2.1: dependencies: ms: 2.1.3
iconv-lite@0.4.24: dependencies: safer-buffer: 2.1.2
iconv-lite@0.6.3: dependencies: safer-buffer: 2.1.2
idcac-playwright@0.1.3: {}
ieee754@1.2.1: {}
ignore@5.3.2: {}
import-fresh@3.3.1: dependencies: parent-module: 1.0.1 resolve-from: 4.0.0
import-local@3.2.0: dependencies: pkg-dir: 4.2.0 resolve-cwd: 3.0.0
imurmurhash@0.1.4: {}
inflight@1.0.6: dependencies: once: 1.4.0 wrappy: 1.0.2
inherits@2.0.4: {}
inquirer@8.2.6: dependencies: ansi-escapes: 4.3.2 chalk: 4.1.2 cli-cursor: 3.1.0 cli-width: 3.0.0 external-editor: 3.1.0 figures: 3.2.0 lodash: 4.17.21 mute-stream: 0.0.8 ora: 5.4.1 run-async: 2.4.1 rxjs: 7.8.2 string-width: 4.2.3 strip-ansi: 6.0.1 through: 2.3.8 wrap-ansi: 6.2.0
inquirer@9.3.7: dependencies: '@inquirer/figures': 1.0.10 ansi-escapes: 4.3.2 cli-width: 4.1.0 external-editor: 3.1.0 mute-stream: 1.0.0 ora: 5.4.1 run-async: 3.0.0 rxjs: 7.8.2 string-width: 4.2.3 strip-ansi: 6.0.1 wrap-ansi: 6.2.0 yoctocolors-cjs: 2.1.2
internal-slot@1.1.0: dependencies: es-errors: 1.3.0 hasown: 2.0.2 side-channel: 1.1.0
ip-address@9.0.5: dependencies: jsbn: 1.1.0 sprintf-js: 1.1.3
is-any-array@2.0.1: {}
is-array-buffer@3.0.5: dependencies: call-bind: 1.0.8 call-bound: 1.0.3 get-intrinsic: 1.3.0
is-async-function@2.1.1: dependencies: async-function: 1.0.0 call-bound: 1.0.3 get-proto: 1.0.1 has-tostringtag: 1.0.2 safe-regex-test: 1.1.0
is-bigint@1.1.0: dependencies: has-bigints: 1.1.0
is-boolean-object@1.2.2: dependencies: call-bound: 1.0.3 has-tostringtag: 1.0.2
is-callable@1.2.7: {}
is-core-module@2.16.1: dependencies: hasown: 2.0.2
is-data-view@1.0.2: dependencies: call-bound: 1.0.3 get-intrinsic: 1.3.0 is-typed-array: 1.1.15
is-date-object@1.1.0: dependencies: call-bound: 1.0.3 has-tostringtag: 1.0.2
is-extglob@2.1.1: {}
is-finalizationregistry@1.1.1: dependencies: call-bound: 1.0.3
is-fullwidth-code-point@3.0.0: {}
is-generator-function@1.1.0: dependencies: call-bound: 1.0.3 get-proto: 1.0.1 has-tostringtag: 1.0.2 safe-regex-test: 1.1.0
is-glob@4.0.3: dependencies: is-extglob: 2.1.1
is-interactive@1.0.0: {}
is-map@2.0.3: {}
is-number-object@1.1.1: dependencies: call-bound: 1.0.3 has-tostringtag: 1.0.2
is-obj@2.0.0: {}
is-potential-custom-element-name@1.0.1: {}
is-regex@1.2.1: dependencies: call-bound: 1.0.3 gopd: 1.2.0 has-tostringtag: 1.0.2 hasown: 2.0.2
is-set@2.0.3: {}
is-shared-array-buffer@1.0.4: dependencies: call-bound: 1.0.3
is-stream@4.0.1: {}
is-string@1.1.1: dependencies: call-bound: 1.0.3 has-tostringtag: 1.0.2
is-symbol@1.1.1: dependencies: call-bound: 1.0.3 has-symbols: 1.1.0 safe-regex-test: 1.1.0
is-typed-array@1.1.15: dependencies: which-typed-array: 1.1.18
is-unicode-supported@0.1.0: {}
is-weakmap@2.0.2: {}
is-weakref@1.1.1: dependencies: call-bound: 1.0.3
is-weakset@2.0.4: dependencies: call-bound: 1.0.3 get-intrinsic: 1.3.0
isarray@2.0.5: {}
isexe@2.0.0: {}
iterator.prototype@1.1.5: dependencies: define-data-property: 1.1.4 es-object-atoms: 1.1.1 get-intrinsic: 1.3.0 get-proto: 1.0.1 has-symbols: 1.1.0 set-function-name: 2.0.2
jquery@3.7.1: {}
js-tokens@4.0.0: {}
js-yaml@4.1.0: dependencies: argparse: 2.0.1
jsbn@1.1.0: {}
jsdom@26.0.0: dependencies: cssstyle: 4.2.1 data-urls: 5.0.0 decimal.js: 10.5.0 form-data: 4.0.2 html-encoding-sniffer: 4.0.0 http-proxy-agent: 7.0.2 https-proxy-agent: 7.0.6 is-potential-custom-element-name: 1.0.1 nwsapi: 2.2.16 parse5: 7.2.1 rrweb-cssom: 0.8.0 saxes: 6.0.0 symbol-tree: 3.2.4 tough-cookie: 5.1.1 w3c-xmlserializer: 5.0.0 webidl-conversions: 7.0.0 whatwg-encoding: 3.1.1 whatwg-mimetype: 4.0.0 whatwg-url: 14.1.1 ws: 8.18.1 xml-name-validator: 5.0.0 transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate
json-buffer@3.0.1: {}
json-schema-traverse@0.4.1: {}
json-stable-stringify-without-jsonify@1.0.1: {}
json5@1.0.2: dependencies: minimist: 1.2.8
json5@2.2.3: {}
jsonfile@6.1.0: dependencies: universalify: 2.0.1 optionalDependencies: graceful-fs: 4.2.11
jsx-ast-utils@3.3.5: dependencies: array-includes: 3.1.8 array.prototype.flat: 1.3.3 object.assign: 4.1.7 object.values: 1.2.1
keyv@4.5.4: dependencies: json-buffer: 3.0.1
language-subtag-registry@0.3.23: {}
language-tags@1.0.9: dependencies: language-subtag-registry: 0.3.23
levn@0.4.1: dependencies: prelude-ls: 1.2.1 type-check: 0.4.0
linkedom@0.18.9: dependencies: css-select: 5.1.0 cssom: 0.5.0 html-escaper: 3.0.3 htmlparser2: 10.0.0 uhyphen: 0.2.0
locate-path@5.0.0: dependencies: p-locate: 4.1.0
locate-path@6.0.0: dependencies: p-locate: 5.0.0
lodash.isequal@4.5.0: {}
lodash.merge@4.6.2: {}
lodash@4.17.21: {}
log-symbols@4.1.0: dependencies: chalk: 4.1.2 is-unicode-supported: 0.1.0
loose-envify@1.4.0: dependencies: js-tokens: 4.0.0
lowercase-keys@3.0.0: {}
lru-cache@10.4.3: {}
map-stream@0.1.0: {}
math-intrinsics@1.1.0: {}
mime-db@1.52.0: {}
mime-types@2.1.35: dependencies: mime-db: 1.52.0
mimic-fn@2.1.0: {}
mimic-response@3.1.0: {}
mimic-response@4.0.0: {}
minimatch@3.1.2: dependencies: brace-expansion: 1.1.11
minimatch@9.0.5: dependencies: brace-expansion: 2.0.1
minimist@1.2.8: {}
ml-array-max@1.2.4: dependencies: is-any-array: 2.0.1
ml-array-min@1.2.3: dependencies: is-any-array: 2.0.1
ml-array-rescale@1.3.7: dependencies: is-any-array: 2.0.1 ml-array-max: 1.2.4 ml-array-min: 1.2.3
ml-logistic-regression@2.0.0: dependencies: ml-matrix: 6.12.0
ml-matrix@6.12.0: dependencies: is-any-array: 2.0.1 ml-array-rescale: 1.3.7
ms@2.1.3: {}
mute-stream@0.0.8: {}
mute-stream@1.0.0: {}
nanoid@3.3.8: {}
natural-compare@1.4.0: {}
node-releases@2.0.19: {}
normalize-url@8.0.1: {}
nth-check@2.1.1: dependencies: boolbase: 1.0.0
nwsapi@2.2.16: {}
object-assign@4.1.1: {}
object-inspect@1.13.4: {}
object-keys@1.1.1: {}
object.assign@4.1.7: dependencies: call-bind: 1.0.8 call-bound: 1.0.3 define-properties: 1.2.1 es-object-atoms: 1.1.1 has-symbols: 1.1.0 object-keys: 1.1.1
object.entries@1.1.8: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 es-object-atoms: 1.1.1
object.fromentries@2.0.8: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 es-abstract: 1.23.9 es-object-atoms: 1.1.1
object.groupby@1.0.3: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 es-abstract: 1.23.9
object.values@1.2.1: dependencies: call-bind: 1.0.8 call-bound: 1.0.3 define-properties: 1.2.1 es-object-atoms: 1.1.1
once@1.4.0: dependencies: wrappy: 1.0.2
onetime@5.1.2: dependencies: mimic-fn: 2.1.0
optionator@0.9.4: dependencies: deep-is: 0.1.4 fast-levenshtein: 2.0.6 levn: 0.4.1 prelude-ls: 1.2.1 type-check: 0.4.0 word-wrap: 1.2.5
ora@5.4.1: dependencies: bl: 4.1.0 chalk: 4.1.2 cli-cursor: 3.1.0 cli-spinners: 2.9.2 is-interactive: 1.0.0 is-unicode-supported: 0.1.0 log-symbols: 4.1.0 strip-ansi: 6.0.1 wcwidth: 1.0.1
os-tmpdir@1.0.2: {}
ow@0.28.2: dependencies: '@sindresorhus/is': 4.6.0 callsites: 3.1.0 dot-prop: 6.0.1 lodash.isequal: 4.5.0 vali-date: 1.0.0
ow@1.1.1: dependencies: '@sindresorhus/is': 5.6.0 callsites: 4.2.0 dot-prop: 7.2.0 lodash.isequal: 4.5.0 vali-date: 1.0.0
own-keys@1.0.1: dependencies: get-intrinsic: 1.3.0 object-keys: 1.1.1 safe-push-apply: 1.0.0
p-cancelable@4.0.1: {}
p-limit@2.3.0: dependencies: p-try: 2.2.0
p-limit@3.1.0: dependencies: yocto-queue: 0.1.0
p-locate@4.1.0: dependencies: p-limit: 2.3.0
p-locate@5.0.0: dependencies: p-limit: 3.1.0
p-try@2.2.0: {}
parent-module@1.0.1: dependencies: callsites: 3.1.0
parent-require@1.0.0: {}
parse5-htmlparser2-tree-adapter@7.1.0: dependencies: domhandler: 5.0.3 parse5: 7.2.1
parse5@7.2.1: dependencies: entities: 4.5.0
path-exists@4.0.0: {}
path-is-absolute@1.0.1: {}
path-key@3.1.1: {}
path-parse@1.0.7: {}
pause-stream@0.0.11: dependencies: through: 2.3.8
peek-readable@6.1.1: {}
picocolors@1.1.1: {}
pkg-dir@4.2.0: dependencies: find-up: 4.1.0
possible-typed-array-names@1.1.0: {}
prelude-ls@1.2.1: {}
prop-types@15.8.1: dependencies: loose-envify: 1.4.0 object-assign: 4.1.1 react-is: 16.13.1
proper-lockfile@4.1.2: dependencies: graceful-fs: 4.2.11 retry: 0.12.0 signal-exit: 3.0.7
proxy-chain@2.5.6: dependencies: socks: 2.8.4 socks-proxy-agent: 8.0.5 tslib: 2.8.1 transitivePeerDependencies: - supports-color
proxy-from-env@1.1.0: {}
punycode@2.3.1: {}
quick-lru@5.1.1: {}
quick-lru@7.0.0: {}
react-is@16.13.1: {}
readable-stream@3.6.2: dependencies: inherits: 2.0.4 string_decoder: 1.3.0 util-deprecate: 1.0.2
reflect.getprototypeof@1.0.10: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 es-abstract: 1.23.9 es-errors: 1.3.0 es-object-atoms: 1.1.1 get-intrinsic: 1.3.0 get-proto: 1.0.1 which-builtin-type: 1.2.1
regexp.prototype.flags@1.5.4: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 es-errors: 1.3.0 get-proto: 1.0.1 gopd: 1.2.0 set-function-name: 2.0.2
require-directory@2.1.1: {}
resolve-alpn@1.2.1: {}
resolve-cwd@3.0.0: dependencies: resolve-from: 5.0.0
resolve-from@4.0.0: {}
resolve-from@5.0.0: {}
resolve@1.22.10: dependencies: is-core-module: 2.16.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0
resolve@2.0.0-next.5: dependencies: is-core-module: 2.16.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0
responselike@3.0.0: dependencies: lowercase-keys: 3.0.0
restore-cursor@3.1.0: dependencies: onetime: 5.1.2 signal-exit: 3.0.7
retry@0.12.0: {}
retry@0.13.1: {}
robots-parser@3.0.1: {}
rrweb-cssom@0.8.0: {}
run-async@2.4.1: {}
run-async@3.0.0: {}
rxjs@7.8.2: dependencies: tslib: 2.8.1
safe-array-concat@1.1.3: dependencies: call-bind: 1.0.8 call-bound: 1.0.3 get-intrinsic: 1.3.0 has-symbols: 1.1.0 isarray: 2.0.5
safe-buffer@5.2.1: {}
safe-push-apply@1.0.0: dependencies: es-errors: 1.3.0 isarray: 2.0.5
safe-regex-test@1.1.0: dependencies: call-bound: 1.0.3 es-errors: 1.3.0 is-regex: 1.2.1
safer-buffer@2.1.2: {}
sax@1.4.1: {}
saxes@6.0.0: dependencies: xmlchars: 2.2.0
semver@6.3.1: {}
semver@7.7.1: {}
set-function-length@1.2.2: dependencies: define-data-property: 1.1.4 es-errors: 1.3.0 function-bind: 1.1.2 get-intrinsic: 1.3.0 gopd: 1.2.0 has-property-descriptors: 1.0.2
set-function-name@2.0.2: dependencies: define-data-property: 1.1.4 es-errors: 1.3.0 functions-have-names: 1.2.3 has-property-descriptors: 1.0.2
set-proto@1.0.0: dependencies: dunder-proto: 1.0.1 es-errors: 1.3.0 es-object-atoms: 1.1.1
shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0
shebang-regex@3.0.0: {}
side-channel-list@1.0.0: dependencies: es-errors: 1.3.0 object-inspect: 1.13.4
side-channel-map@1.0.1: dependencies: call-bound: 1.0.3 es-errors: 1.3.0 get-intrinsic: 1.3.0 object-inspect: 1.13.4
side-channel-weakmap@1.0.2: dependencies: call-bound: 1.0.3 es-errors: 1.3.0 get-intrinsic: 1.3.0 object-inspect: 1.13.4 side-channel-map: 1.0.1
side-channel@1.1.0: dependencies: es-errors: 1.3.0 object-inspect: 1.13.4 side-channel-list: 1.0.0 side-channel-map: 1.0.1 side-channel-weakmap: 1.0.2
signal-exit@3.0.7: {}
smart-buffer@4.2.0: {}
socks-proxy-agent@8.0.5: dependencies: agent-base: 7.1.3 debug: 4.4.0 socks: 2.8.4 transitivePeerDependencies: - supports-color
socks@2.8.4: dependencies: ip-address: 9.0.5 smart-buffer: 4.2.0
split@0.3.3: dependencies: through: 2.3.8
sprintf-js@1.1.3: {}
stream-chain@2.2.5: {}
stream-combiner@0.0.4: dependencies: duplexer: 0.1.2
stream-json@1.9.1: dependencies: stream-chain: 2.2.5
string-comparison@1.3.0: {}
string-width@4.2.3: dependencies: emoji-regex: 8.0.0 is-fullwidth-code-point: 3.0.0 strip-ansi: 6.0.1
string.prototype.includes@2.0.1: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 es-abstract: 1.23.9
string.prototype.matchall@4.0.12: dependencies: call-bind: 1.0.8 call-bound: 1.0.3 define-properties: 1.2.1 es-abstract: 1.23.9 es-errors: 1.3.0 es-object-atoms: 1.1.1 get-intrinsic: 1.3.0 gopd: 1.2.0 has-symbols: 1.1.0 internal-slot: 1.1.0 regexp.prototype.flags: 1.5.4 set-function-name: 2.0.2 side-channel: 1.1.0
string.prototype.repeat@1.0.0: dependencies: define-properties: 1.2.1 es-abstract: 1.23.9
string.prototype.trim@1.2.10: dependencies: call-bind: 1.0.8 call-bound: 1.0.3 define-data-property: 1.1.4 define-properties: 1.2.1 es-abstract: 1.23.9 es-object-atoms: 1.1.1 has-property-descriptors: 1.0.2
string.prototype.trimend@1.0.9: dependencies: call-bind: 1.0.8 call-bound: 1.0.3 define-properties: 1.2.1 es-object-atoms: 1.1.1
string.prototype.trimstart@1.0.8: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 es-object-atoms: 1.1.1
string_decoder@1.3.0: dependencies: safe-buffer: 5.2.1
strip-ansi@3.0.1: dependencies: ansi-regex: 2.1.1
strip-ansi@6.0.1: dependencies: ansi-regex: 5.0.1
strip-bom@3.0.0: {}
strip-json-comments@3.1.1: {}
strtok3@10.2.1: dependencies: '@tokenizer/token': 0.3.0 peek-readable: 6.1.1
supports-color@2.0.0: {}
supports-color@7.2.0: dependencies: has-flag: 4.0.0
supports-preserve-symlinks-flag@1.0.0: {}
symbol-tree@3.2.4: {}
through@2.3.8: {}
tiny-typed-emitter@2.1.0: {}
tldts-core@6.1.78: {}
tldts@6.1.78: dependencies: tldts-core: 6.1.78
tmp@0.0.33: dependencies: os-tmpdir: 1.0.2
token-types@6.0.0: dependencies: '@tokenizer/token': 0.3.0 ieee754: 1.2.1
tough-cookie@5.1.1: dependencies: tldts: 6.1.78
tr46@5.0.0: dependencies: punycode: 2.3.1
tsconfig-paths@3.15.0: dependencies: '@types/json5': 0.0.29 json5: 1.0.2 minimist: 1.2.8 strip-bom: 3.0.0
tslib@2.8.1: {}
type-check@0.4.0: dependencies: prelude-ls: 1.2.1
type-fest@0.21.3: {}
type-fest@2.19.0: {}
type-fest@4.35.0: {}
typed-array-buffer@1.0.3: dependencies: call-bound: 1.0.3 es-errors: 1.3.0 is-typed-array: 1.1.15
typed-array-byte-length@1.0.3: dependencies: call-bind: 1.0.8 for-each: 0.3.5 gopd: 1.2.0 has-proto: 1.2.0 is-typed-array: 1.1.15
typed-array-byte-offset@1.0.4: dependencies: available-typed-arrays: 1.0.7 call-bind: 1.0.8 for-each: 0.3.5 gopd: 1.2.0 has-proto: 1.2.0 is-typed-array: 1.1.15 reflect.getprototypeof: 1.0.10
typed-array-length@1.0.7: dependencies: call-bind: 1.0.8 for-each: 0.3.5 gopd: 1.2.0 is-typed-array: 1.1.15 possible-typed-array-names: 1.1.0 reflect.getprototypeof: 1.0.10
uhyphen@0.2.0: {}
uint8array-extras@1.4.0: {}
unbox-primitive@1.1.0: dependencies: call-bound: 1.0.3 has-bigints: 1.1.0 has-symbols: 1.1.0 which-boxed-primitive: 1.1.1
undici-types@6.20.0: {}
universalify@2.0.1: {}
update-browserslist-db@1.1.2(browserslist@4.24.4): dependencies: browserslist: 4.24.4 escalade: 3.2.0 picocolors: 1.1.1
uri-js@4.4.1: dependencies: punycode: 2.3.1
util-deprecate@1.0.2: {}
vali-date@1.0.0: {}
w3c-xmlserializer@5.0.0: dependencies: xml-name-validator: 5.0.0
wcwidth@1.0.1: dependencies: defaults: 1.0.4
webidl-conversions@7.0.0: {}
whatwg-encoding@3.1.1: dependencies: iconv-lite: 0.6.3
whatwg-mimetype@4.0.0: {}
whatwg-url@14.1.1: dependencies: tr46: 5.0.0 webidl-conversions: 7.0.0
which-boxed-primitive@1.1.1: dependencies: is-bigint: 1.1.0 is-boolean-object: 1.2.2 is-number-object: 1.1.1 is-string: 1.1.1 is-symbol: 1.1.1
which-builtin-type@1.2.1: dependencies: call-bound: 1.0.3 function.prototype.name: 1.1.8 has-tostringtag: 1.0.2 is-async-function: 2.1.1 is-date-object: 1.1.0 is-finalizationregistry: 1.1.1 is-generator-function: 1.1.0 is-regex: 1.2.1 is-weakref: 1.1.1 isarray: 2.0.5 which-boxed-primitive: 1.1.1 which-collection: 1.0.2 which-typed-array: 1.1.18
which-collection@1.0.2: dependencies: is-map: 2.0.3 is-set: 2.0.3 is-weakmap: 2.0.2 is-weakset: 2.0.4
which-typed-array@1.1.18: dependencies: available-typed-arrays: 1.0.7 call-bind: 1.0.8 call-bound: 1.0.3 for-each: 0.3.5 gopd: 1.2.0 has-tostringtag: 1.0.2
which@2.0.2: dependencies: isexe: 2.0.0
word-wrap@1.2.5: {}
wrap-ansi@6.2.0: dependencies: ansi-styles: 4.3.0 string-width: 4.2.3 strip-ansi: 6.0.1
wrap-ansi@7.0.0: dependencies: ansi-styles: 4.3.0 string-width: 4.2.3 strip-ansi: 6.0.1
wrappy@1.0.2: {}
ws@8.18.1: {}
xml-name-validator@5.0.0: {}
xmlchars@2.2.0: {}
y18n@5.0.8: {}
yargonaut@1.1.4: dependencies: chalk: 1.1.3 figlet: 1.8.0 parent-require: 1.0.0
yargs-parser@21.1.1: {}
yargs@17.7.2: dependencies: cliui: 8.0.1 escalade: 3.2.0 get-caller-file: 2.0.5 require-directory: 2.1.1 string-width: 4.2.3 y18n: 5.0.8 yargs-parser: 21.1.1
yocto-queue@0.1.0: {}
yoctocolors-cjs@2.1.2: {}