lyg
2024-06-14 655f90e9e4544fdb8fa37ca0223fb686d4020b88
txt版
3个文件已修改
2个文件已添加
44003 ■■■■■ 已修改文件
package.json 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main.mjs 167 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/us-place-list.mjs 41824 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/us-pseron-name-list.mjs 2002 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yarn.lock 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
package.json
@@ -14,6 +14,7 @@
    "axios": "^1.7.2",
    "https-proxy-agent": "^7.0.4",
    "node-xlsx": "^0.24.0",
    "selenium-webdriver": "^4.21.0"
    "selenium-webdriver": "^4.21.0",
    "wordlist-js": "^2.0.0"
  }
}
}
src/main.mjs
@@ -9,7 +9,9 @@
import { HttpsProxyAgent } from "https-proxy-agent";
import { resolve } from "path";
import { execFileSync } from "child_process";
import wordsjs from 'wordlist-js';
import usPlaceList from "./us-place-list.mjs";
import usPeronNameList from "./us-pseron-name-list.mjs";
/*-------------读取配置---------------*/
let config = JSON.parse(fs.readFileSync('./config.json'));
@@ -35,10 +37,32 @@
  httpsAgent,
});
function countChar(str, char) {
function allWords() {
  const words = {};
  wordsjs.usPlaces = usPlaceList;
  wordsjs.usPeronNameList = usPeronNameList;
  for (const key in wordsjs.default) {
    if (Object.hasOwnProperty.call(wordsjs.default, key)) {
      for (const word of wordsjs.default[key]) {
        words[word] = true;
      }
    }
  }
  return words;
}
const wordsMap = allWords();
/**
 * 统计单词数量
 * @param {string} str 字符串
 * @returns 单词数量
 */
function countWordSize(str) {
  let count = 0;
  str = str.replace(/[ ]{2,}/g, ' ');
  for (let i = 0; i < str.length; i++) {
    if (str[i] === char) {
    if (str[i] === ' ') {
      count++;
    }
  }
@@ -46,34 +70,86 @@
}
/**
 * 获取错误单词比例
 * @param {string} text 文本
 * @returns 错误单词比例
 */
function incorrectWordRatio(text) {
  text = text.replace(/[ ]+/g, ' ').replace(/([a-zA-Z])[\.!?,;"')]/g, "$1");
  const words = text.split(' ');
  const incorrectWordCnt = words.filter(word => !wordsMap[word.toLocaleLowerCase()] && !/\d+/g.test(word)).length;
  return incorrectWordCnt / words.length;
}
/**
 * 符号占比 0 ~ 1
 * @param {string} text 文本
 */
function symbolRatio(text) {
  // 非字母数字字符占比
  return (text.match(/[^a-zA-Z0-9 ]/g) || []).length / text.length;
}
/**
 * 清理文本
 * @param {string} text 要清理的文本
 */
function cleanText(text) {
  if (text.includes('google')) {
    text = text.replace(/^(.|\n)*books[ ]*\.[ ]*google[ ]*\.[ ]*com/ig, '')
  text = text.replace(/(\r)/g, '');
  const googlePage = text.substring(0, 10000);
  if (googlePage.includes('google')) {
    text = googlePage.replace(/^(.|\n)*books[ ]*\.[ ]*google[ ]*\.[ ]*com/ig, '') + text.substring(10000);
  }
  // 如果是ocr识别的文本,每行字符数一般不会超过170
  if (!/.{170,}/g.test(text) || text.includes('google')) {
    text = text.replace(/(\r|■)/g, '');
    text = text.replace(/[ ]{2,}/g, ' ')
    text = text.replace(/(.+)\n/g, '$1');
    text = text.replace(/\n+/g, '\n');
    text = text.replace(/-\n/g, '-');
    const lines = text.split('\n');
    const result = [];
    for (const line of lines) {
      const wordSize = countChar(line, ' ');
      if (wordSize >= 10) {
        if (!/.*[^a-z0-9\-]{6,}.*/gi.test(line)) {
          result.push(line.trim());
        }
  // if (!/.{170,}/g.test(text) || text.includes('google')) {
  text = text.replace(/[ ]{2,}/g, ' ')
  if (!/.{170,}/g.test(text)) {
    // 每行不超过170个字符
    text = text.replace(/(.{170,})\n/g, '$1');
  }
  text = text.replace(/\n+/g, '\n');
  text = text.replace(/-\n/g, '-');
  const lines = text.split('\n');
  const result = [];
  for (const line of lines) {
    // 符号比太高的不要
    const incorrectRatio = incorrectWordRatio(line);
    if (symbolRatio(line) > 0.2) {
      if (incorrectRatio > 0.65) {
        continue;
      }
    }
    return result.join('\n');
  } else {
    return text;
    // 去除空格后 连续重复单个字符3次及以上不要
    const wordSize = countWordSize(line);
    if (/([\D])\1{2,}/.test(line.replace(/[ ]+/g, ''))) {
      if (wordSize < 5 || incorrectRatio > 0.65) {
        continue;
      }
    }
    // 连续三个标点符号及以上,错误率大于0.65不要
    if (incorrectRatio > 0.65 && /([\.,'";:|!@#$%^&*\(\)<>?`~•*¬»«]){3,}/.test(line)) {
      continue;
    }
    // 单词数量太少的不要
    if (wordSize > 5 && incorrectRatio > 0.65) {
      continue;
    }
    // 有google的不要
    if (/.*(google).*/ig.test(line)) {
      continue;
    }
    // 只有一个字符不要
    const ret = line.trim().replace(/[■•*¬»«^-]/g, '');
    if (ret.length <= 1) {
      continue;
    }
    if (ret == 'Digitized by') {
      continue;
    }
    result.push(ret);
  }
  text = result.join('\n');
  // }
  return text;
}
/**
@@ -301,6 +377,21 @@
    });
}
/**
 * 从HTML提取文本
 * @param {string} text html文本
 * @returns 文本
 */
function getTextFromHtml(text) {
  if (text.includes("<!DOCTYPE html>")) {
    const s = text.indexOf('<pre>') + 6;
    const e = text.indexOf('</pre>');
    text = text.substring(s, e);
    // text = /(.|\n)*<pre>((.|\n)*)<\/pre>(.|\n)*/g.exec(text)[2];
  }
  return text;
}
async function downloadFile(book, url) {
  console.log(`下载文件: ${url}`);
  const ext = url.split(".").pop().toLowerCase();
@@ -345,12 +436,11 @@
          setTimeout(() => {
            if (ext === "gz" || ext === "zip") {
              unzip(_filepath, filepath);
              fs.unlinkSync(_filepath);
            }
            let text = fs.readFileSync(filepath, 'utf-8');
            if (text.includes("<!DOCTYPE html>")) {
              text = /(.|\n)*<pre>((.|\n)*)<\/pre>(.|\n)*/g.exec(text)[2];
              fs.writeFileSync(filepath, text, 'utf-8');
            }
            text = getTextFromHtml(text);
            fs.writeFileSync(filepath, text, 'utf-8');
            try {
              fs.writeFileSync(filepath + '.result.txt', cleanText(text), 'utf-8');
            } catch (e) {
@@ -412,6 +502,18 @@
  });
}
function getBookInfo(book) {
  return retry(async () => {
    const publisher = await driver.executeScript(`return document.querySelector("span[itemprop=publisher]").textContent`);
    const datePublished = await driver.executeScript(`return document.querySelector("span[itemprop=datePublished]").textContent`);
    let pages = await driver.executeScript(`return document.querySelector("span[data-id=resultsCount]").textContent`);
    pages = pages.split(' / ')[1];
    book.publisher = publisher;
    book.pubDate = datePublished;
    book.pages = pages;
  });
}
async function downloadBooks(books) {
  driver = await createDriver();
@@ -426,15 +528,15 @@
      break;
    }
    bookCount++;
    if (isAlreadyDownloaded(book)) {
    /*if (isAlreadyDownloaded(book)) {
      skipCount++;
      continue;
    }
    if (book.state && (book.state === "没有搜索结果" || book.state === "没有pdf或text文件" || book.state === "下载完成")) {
     if (book.state && (book.state === "没有搜索结果" || book.state === "没有pdf或text文件" || book.state === "下载完成")) {
      // 跳过没有搜索结果或没有pdf或text文件的书籍
      skipCount++;
      continue;
    }
    } */
    console.log(`开始下载: ${book.id} ${book.title}`);
    // 打开搜索页面并搜索
    if (!await openSearchPage(book, true)) {
@@ -461,6 +563,7 @@
    sleep(getRandomNumber(500, 10000));
    // 打开详情页
    await openBookDetailPage(book, detailPageUrl);
    await getBookInfo(book);
    // 获取下载链接
    const url = await getDownloadUrl(book);
    if (!url) { continue; }
@@ -598,6 +701,6 @@
  main();
}
// const filepath = "D:\\projects\\book-crawler\\downloads\\10231261 978-1-331-76167-9.txt";
// const text = fs.readFileSync(filepath, 'utf8');
// const filepath = "D:\\projects\\book-crawler\\downloads\\10482686 978-1-333-27648-5.txt";
// let text = fs.readFileSync(filepath, 'utf8');
// fs.writeFileSync(filepath + '.result.txt', cleanText(text), 'utf-8');
src/us-place-list.mjs
New file
Diff too large
src/us-pseron-name-list.mjs
New file
@@ -0,0 +1,2002 @@
export default [
  "liam",
  "noah",
  "oliver",
  "elijah",
  "william",
  "james",
  "benjamin",
  "lucas",
  "henry",
  "alexander",
  "mason",
  "michael",
  "ethan",
  "daniel",
  "jacob",
  "logan",
  "jackson",
  "levi",
  "sebastian",
  "mateo",
  "jack",
  "owen",
  "theodore",
  "aiden",
  "samuel",
  "joseph",
  "john",
  "david",
  "wyatt",
  "matthew",
  "luke",
  "asher",
  "carter",
  "julian",
  "grayson",
  "leo",
  "jayden",
  "gabriel",
  "isaac",
  "lincoln",
  "anthony",
  "dylan",
  "hudson",
  "ezra",
  "thomas",
  "charles",
  "christopher",
  "jaxon",
  "josiah",
  "maverick",
  "isaiah",
  "andrew",
  "joshua",
  "elias",
  "nathan",
  "caleb",
  "ryan",
  "adrian",
  "miles",
  "eli",
  "nolan",
  "christian",
  "aaron",
  "ezekiel",
  "cameron",
  "colton",
  "luca",
  "hunter",
  "landon",
  "jonathan",
  "santiago",
  "axel",
  "easton",
  "cooper",
  "jeremiah",
  "angel",
  "roman",
  "connor",
  "jameson",
  "robert",
  "greyson",
  "jordan",
  "ian",
  "carson",
  "jaxson",
  "leonardo",
  "nicholas",
  "dominic",
  "austin",
  "everett",
  "xavier",
  "brooks",
  "kai",
  "jose",
  "parker",
  "jace",
  "adam",
  "wesley",
  "kayden",
  "silas",
  "bennett",
  "declan",
  "waylon",
  "weston",
  "evan",
  "micah",
  "emmett",
  "ryder",
  "beau",
  "damian",
  "brayden",
  "gael",
  "rowan",
  "harrison",
  "bryson",
  "sawyer",
  "kingston",
  "amir",
  "jason",
  "giovanni",
  "vincent",
  "ayden",
  "chase",
  "myles",
  "nathaniel",
  "diego",
  "legend",
  "jonah",
  "river",
  "tyler",
  "braxton",
  "george",
  "milo",
  "cole",
  "zachary",
  "ashton",
  "luis",
  "jasper",
  "kaiden",
  "adriel",
  "gavin",
  "bentley",
  "calvin",
  "zion",
  "juan",
  "maxwell",
  "max",
  "ryker",
  "carlos",
  "jayce",
  "emmanuel",
  "lorenzo",
  "ivan",
  "jude",
  "august",
  "malachi",
  "kevin",
  "elliott",
  "rhett",
  "archer",
  "luka",
  "karter",
  "arthur",
  "elliot",
  "brandon",
  "justin",
  "camden",
  "thiago",
  "jesus",
  "maddox",
  "king",
  "theo",
  "enzo",
  "matteo",
  "emiliano",
  "dean",
  "hayden",
  "finn",
  "brody",
  "antonio",
  "abel",
  "tristan",
  "alex",
  "judah",
  "zayden",
  "graham",
  "xander",
  "atlas",
  "miguel",
  "messiah",
  "tucker",
  "barrett",
  "timothy",
  "alan",
  "edward",
  "leon",
  "dawson",
  "eric",
  "ace",
  "victor",
  "abraham",
  "nicolas",
  "jesse",
  "charlie",
  "patrick",
  "walker",
  "joel",
  "richard",
  "blake",
  "beckett",
  "avery",
  "alejandro",
  "grant",
  "oscar",
  "peter",
  "matias",
  "amari",
  "lukas",
  "andres",
  "arlo",
  "colt",
  "steven",
  "adonis",
  "kyrie",
  "felix",
  "marcus",
  "holden",
  "preston",
  "emilio",
  "remington",
  "kaleb",
  "jeremy",
  "brantley",
  "bryce",
  "mark",
  "phoenix",
  "israel",
  "knox",
  "kobe",
  "nash",
  "griffin",
  "caden",
  "kenneth",
  "kyler",
  "hayes",
  "jax",
  "rafael",
  "beckham",
  "simon",
  "javier",
  "maximus",
  "paul",
  "kaden",
  "omar",
  "kash",
  "lane",
  "riley",
  "bryan",
  "zane",
  "louis",
  "aidan",
  "paxton",
  "maximiliano",
  "tobias",
  "cash",
  "karson",
  "cayden",
  "emerson",
  "dallas",
  "ronan",
  "brian",
  "walter",
  "bradley",
  "josue",
  "khalil",
  "jorge",
  "damien",
  "jett",
  "kairo",
  "zander",
  "chance",
  "andre",
  "hendrix",
  "crew",
  "malakai",
  "cohen",
  "colin",
  "clayton",
  "daxton",
  "malcolm",
  "lennox",
  "jaden",
  "martin",
  "kayson",
  "bodhi",
  "francisco",
  "cody",
  "erick",
  "atticus",
  "kameron",
  "dante",
  "jensen",
  "cruz",
  "brady",
  "finley",
  "anderson",
  "joaquin",
  "gunner",
  "muhammad",
  "derek",
  "raymond",
  "zayn",
  "kyle",
  "angelo",
  "reid",
  "spencer",
  "prince",
  "nico",
  "jaylen",
  "jake",
  "gideon",
  "stephen",
  "manuel",
  "ali",
  "orion",
  "ellis",
  "rylan",
  "eduardo",
  "mario",
  "rory",
  "odin",
  "cristian",
  "tanner",
  "sean",
  "callum",
  "julius",
  "kane",
  "ricardo",
  "travis",
  "titus",
  "wade",
  "fernando",
  "warren",
  "edwin",
  "leonel",
  "cairo",
  "corbin",
  "dakota",
  "major",
  "ismael",
  "colson",
  "killian",
  "tate",
  "gianni",
  "elian",
  "remy",
  "lawson",
  "niko",
  "armani",
  "nasir",
  "desmond",
  "ezequiel",
  "kade",
  "garrett",
  "hector",
  "kason",
  "marshall",
  "jared",
  "cyrus",
  "russell",
  "cesar",
  "tyson",
  "malik",
  "donovan",
  "jaxton",
  "cade",
  "nehemiah",
  "romeo",
  "sergio",
  "iker",
  "jay",
  "devin",
  "caiden",
  "kamari",
  "pablo",
  "jeffrey",
  "clark",
  "johnny",
  "otto",
  "ronin",
  "edgar",
  "ari",
  "marco",
  "zayne",
  "bowen",
  "jaiden",
  "jayceon",
  "sullivan",
  "grady",
  "sterling",
  "andy",
  "solomon",
  "conor",
  "raiden",
  "royal",
  "royce",
  "trevor",
  "winston",
  "emanuel",
  "finnegan",
  "pedro",
  "luciano",
  "franklin",
  "princeton",
  "troy",
  "harvey",
  "noel",
  "rhys",
  "johnathan",
  "oakley",
  "hugo",
  "erik",
  "fabian",
  "porter",
  "kendrick",
  "frank",
  "wilder",
  "matthias",
  "mathias",
  "damon",
  "milan",
  "callan",
  "gregory",
  "peyton",
  "seth",
  "sage",
  "conner",
  "quinn",
  "roberto",
  "briggs",
  "ibrahim",
  "kashton",
  "kolton",
  "santino",
  "zyaire",
  "alijah",
  "dominick",
  "apollo",
  "kylo",
  "reed",
  "philip",
  "kian",
  "shawn",
  "kaison",
  "memphis",
  "lucca",
  "leonidas",
  "ford",
  "baylor",
  "ayaan",
  "kyson",
  "forrest",
  "collin",
  "uriel",
  "allen",
  "dalton",
  "ruben",
  "archie",
  "leland",
  "dax",
  "esteban",
  "isaias",
  "jase",
  "adan",
  "gage",
  "kasen",
  "alonzo",
  "kamden",
  "jamison",
  "marcos",
  "alexis",
  "francis",
  "hank",
  "frederick",
  "tripp",
  "jonas",
  "stetson",
  "izaiah",
  "cassius",
  "tatum",
  "eden",
  "rocco",
  "maximilian",
  "moses",
  "aziel",
  "keegan",
  "lewis",
  "bruce",
  "augustus",
  "omari",
  "braylen",
  "pierce",
  "enrique",
  "mack",
  "armando",
  "asa",
  "moises",
  "shane",
  "soren",
  "dorian",
  "raphael",
  "zaiden",
  "emmitt",
  "keanu",
  "kieran",
  "deacon",
  "moshe",
  "abdiel",
  "casey",
  "phillip",
  "zachariah",
  "ryland",
  "albert",
  "baker",
  "denver",
  "gunnar",
  "kylan",
  "zaire",
  "jayson",
  "corey",
  "drew",
  "jasiah",
  "quentin",
  "callen",
  "drake",
  "braylon",
  "bo",
  "kannon",
  "huxley",
  "sonny",
  "cannon",
  "julio",
  "santana",
  "rowen",
  "wells",
  "kenzo",
  "nikolai",
  "derrick",
  "jalen",
  "makai",
  "conrad",
  "benson",
  "abram",
  "davis",
  "gerardo",
  "mohamed",
  "raul",
  "dexter",
  "ronald",
  "arjun",
  "jaime",
  "ariel",
  "kaysen",
  "lawrence",
  "samson",
  "scott",
  "danny",
  "skyler",
  "chandler",
  "roland",
  "saint",
  "yusuf",
  "roy",
  "zain",
  "saul",
  "case",
  "rodrigo",
  "jaziel",
  "boone",
  "hezekiah",
  "sutton",
  "arturo",
  "koa",
  "jamari",
  "julien",
  "jaxtyn",
  "sylas",
  "alec",
  "koda",
  "landen",
  "reece",
  "darius",
  "ares",
  "boston",
  "shepherd",
  "taylor",
  "kyree",
  "keith",
  "edison",
  "johan",
  "sincere",
  "jerry",
  "watson",
  "nikolas",
  "marvin",
  "quincy",
  "axton",
  "dariel",
  "donald",
  "finnley",
  "brycen",
  "bodie",
  "onyx",
  "raylan",
  "shiloh",
  "brixton",
  "rayan",
  "colby",
  "valentino",
  "layton",
  "trenton",
  "landyn",
  "gustavo",
  "ahmad",
  "alessandro",
  "ander",
  "issac",
  "kingsley",
  "ridge",
  "ledger",
  "mauricio",
  "duke",
  "tony",
  "ahmed",
  "uriah",
  "leonard",
  "lucian",
  "aarav",
  "kareem",
  "marcelo",
  "mohammed",
  "reign",
  "clay",
  "kohen",
  "ermias",
  "leandro",
  "dennis",
  "otis",
  "samir",
  "emir",
  "nixon",
  "ty",
  "fletcher",
  "sam",
  "wilson",
  "dustin",
  "bryant",
  "flynn",
  "hamza",
  "lionel",
  "jamir",
  "justice",
  "mohammad",
  "aden",
  "cason",
  "dakari",
  "layne",
  "dillon",
  "zaid",
  "nelson",
  "titan",
  "alden",
  "chaim",
  "devon",
  "zeke",
  "chris",
  "khari",
  "azariah",
  "yosef",
  "alberto",
  "alvin",
  "noe",
  "rex",
  "quinton",
  "roger",
  "marcel",
  "brock",
  "kellan",
  "cullen",
  "lennon",
  "harlan",
  "keaton",
  "langston",
  "morgan",
  "trey",
  "ricky",
  "karsyn",
  "miller",
  "amos",
  "amias",
  "salvador",
  "tadeo",
  "curtis",
  "anakin",
  "lachlan",
  "jefferson",
  "tomas",
  "korbin",
  "krew",
  "cayson",
  "augustine",
  "bruno",
  "jamie",
  "mathew",
  "clyde",
  "vihaan",
  "carmelo",
  "harry",
  "jagger",
  "nathanael",
  "darren",
  "aron",
  "brendan",
  "jedidiah",
  "ray",
  "mitchell",
  "jimmy",
  "joe",
  "lochlan",
  "eddie",
  "houston",
  "reese",
  "bellamy",
  "rayden",
  "douglas",
  "stanley",
  "vincenzo",
  "casen",
  "joziah",
  "emery",
  "marcellus",
  "atreus",
  "leighton",
  "musa",
  "tommy",
  "eliel",
  "alfredo",
  "hugh",
  "neil",
  "westley",
  "junior",
  "banks",
  "melvin",
  "maximo",
  "colten",
  "axl",
  "briar",
  "nova",
  "caspian",
  "deandre",
  "legacy",
  "trace",
  "lance",
  "ramon",
  "vicente",
  "brennan",
  "ben",
  "louie",
  "remi",
  "lee",
  "valentin",
  "benicio",
  "orlando",
  "rio",
  "wayne",
  "westin",
  "bjorn",
  "grey",
  "gatlin",
  "zayd",
  "harley",
  "mekhi",
  "aldo",
  "alonso",
  "thaddeus",
  "talon",
  "byron",
  "eliseo",
  "enoch",
  "ernesto",
  "jaxxon",
  "lian",
  "creed",
  "kace",
  "brecken",
  "dash",
  "kellen",
  "ocean",
  "kiaan",
  "magnus",
  "crosby",
  "mylo",
  "rohan",
  "callahan",
  "forest",
  "gary",
  "ira",
  "salem",
  "braden",
  "abdullah",
  "carl",
  "jon",
  "madden",
  "tru",
  "kye",
  "misael",
  "hassan",
  "dario",
  "emory",
  "ambrose",
  "bode",
  "alaric",
  "kristian",
  "allan",
  "anders",
  "boden",
  "genesis",
  "idris",
  "kristopher",
  "juelz",
  "yehuda",
  "guillermo",
  "ameer",
  "dane",
  "darian",
  "jakobe",
  "kase",
  "dilan",
  "larry",
  "aryan",
  "elisha",
  "eugene",
  "thatcher",
  "blaze",
  "ishaan",
  "kyro",
  "maurice",
  "bobby",
  "jadiel",
  "tristen",
  "wesson",
  "alvaro",
  "bronson",
  "kole",
  "rudy",
  "brayan",
  "demetrius",
  "kamryn",
  "randy",
  "arian",
  "london",
  "rocky",
  "kabir",
  "rodney",
  "yousef",
  "kaiser",
  "dior",
  "van",
  "aydin",
  "brodie",
  "eithan",
  "felipe",
  "judson",
  "robin",
  "branson",
  "camilo",
  "mordechai",
  "ulises",
  "stefan",
  "blaine",
  "jakari",
  "jaxx",
  "rey",
  "castiel",
  "damari",
  "jakob",
  "zavier",
  "aries",
  "bentlee",
  "cain",
  "kyng",
  "niklaus",
  "yahir",
  "joey",
  "henrik",
  "kylen",
  "zahir",
  "alfred",
  "bear",
  "khalid",
  "zev",
  "graysen",
  "jair",
  "zakai",
  "harlem",
  "darwin",
  "ayan",
  "fisher",
  "reuben",
  "cory",
  "jacoby",
  "kenji",
  "leif",
  "maison",
  "avi",
  "jamal",
  "osiris",
  "wallace",
  "fox",
  "santos",
  "shepard",
  "leroy",
  "adler",
  "brett",
  "kelvin",
  "seven",
  "zechariah",
  "azrael",
  "calum",
  "mccoy",
  "bridger",
  "terry",
  "harold",
  "mac",
  "ahmir",
  "blaise",
  "cal",
  "jeremias",
  "davion",
  "marley",
  "trent",
  "coen",
  "franco",
  "will",
  "dominik",
  "jones",
  "riggs",
  "canaan",
  "dion",
  "jabari",
  "kody",
  "landry",
  "damir",
  "dangelo",
  "gerald",
  "salvatore",
  "cillian",
  "truett",
  "hakeem",
  "alistair",
  "zyair",
  "foster",
  "gordon",
  "kamdyn",
  "lyric",
  "murphy",
  "terrance",
  "jovanni",
  "cedric",
  "meir",
  "rome",
  "frankie",
  "vance",
  "colter",
  "eliezer",
  "abner",
  "xzavier",
  "bishop",
  "dayton",
  "jad",
  "davian",
  "duncan",
  "rene",
  "everest",
  "keenan",
  "marlon",
  "maxton",
  "wes",
  "heath",
  "jaxen",
  "jeffery",
  "kalel",
  "korbyn",
  "reginald",
  "willie",
  "harris",
  "jericho",
  "rogelio",
  "billy",
  "karim",
  "olivia",
  "emma",
  "ava",
  "charlotte",
  "sophia",
  "amelia",
  "isabella",
  "mia",
  "evelyn",
  "harper",
  "camila",
  "abigail",
  "gianna",
  "luna",
  "ella",
  "elizabeth",
  "sofia",
  "emily",
  "avery",
  "mila",
  "scarlett",
  "eleanor",
  "madison",
  "layla",
  "penelope",
  "chloe",
  "aria",
  "grace",
  "ellie",
  "nora",
  "hazel",
  "zoey",
  "riley",
  "victoria",
  "lily",
  "aurora",
  "violet",
  "nova",
  "hannah",
  "zoe",
  "emilia",
  "stella",
  "everly",
  "isla",
  "leah",
  "lillian",
  "addison",
  "willow",
  "paisley",
  "lucy",
  "natalie",
  "naomi",
  "eliana",
  "brooklyn",
  "elena",
  "aubrey",
  "ivy",
  "claire",
  "kinsley",
  "audrey",
  "maya",
  "genesis",
  "bella",
  "skylar",
  "aaliyah",
  "madelyn",
  "savannah",
  "anna",
  "serenity",
  "delilah",
  "caroline",
  "kennedy",
  "valentina",
  "ruby",
  "sophie",
  "alice",
  "gabriella",
  "sadie",
  "ariana",
  "allison",
  "hailey",
  "autumn",
  "nevaeh",
  "quinn",
  "natalia",
  "sarah",
  "josephine",
  "cora",
  "emery",
  "samantha",
  "piper",
  "leilani",
  "eva",
  "everleigh",
  "lydia",
  "madeline",
  "jade",
  "peyton",
  "adeline",
  "brielle",
  "vivian",
  "rylee",
  "clara",
  "raelynn",
  "melanie",
  "melody",
  "athena",
  "julia",
  "maria",
  "liliana",
  "hadley",
  "rose",
  "arya",
  "reagan",
  "eliza",
  "adalynn",
  "kaylee",
  "lyla",
  "mackenzie",
  "alaia",
  "isabelle",
  "charlie",
  "mary",
  "arianna",
  "remi",
  "margaret",
  "iris",
  "parker",
  "eden",
  "ximena",
  "ayla",
  "kylie",
  "elliana",
  "josie",
  "faith",
  "katherine",
  "eloise",
  "alexandra",
  "amaya",
  "adalyn",
  "jasmine",
  "amara",
  "daisy",
  "valerie",
  "reese",
  "brianna",
  "cecilia",
  "esther",
  "andrea",
  "valeria",
  "summer",
  "norah",
  "ashley",
  "ariella",
  "emerson",
  "aubree",
  "isabel",
  "anastasia",
  "ryleigh",
  "lucia",
  "khloe",
  "londyn",
  "taylor",
  "emersyn",
  "callie",
  "sienna",
  "kehlani",
  "blakely",
  "genevieve",
  "alina",
  "juniper",
  "bailey",
  "maeve",
  "molly",
  "harmony",
  "magnolia",
  "georgia",
  "freya",
  "catalina",
  "juliette",
  "sloane",
  "june",
  "sara",
  "ada",
  "river",
  "kimberly",
  "ember",
  "aliyah",
  "juliana",
  "millie",
  "brynlee",
  "teagan",
  "london",
  "jordyn",
  "morgan",
  "olive",
  "alaina",
  "rosalie",
  "alyssa",
  "ariel",
  "finley",
  "arabella",
  "hope",
  "journee",
  "leila",
  "alana",
  "gracie",
  "gemma",
  "vanessa",
  "noelle",
  "marley",
  "elise",
  "presley",
  "kamila",
  "amy",
  "kayla",
  "zara",
  "payton",
  "ruth",
  "blake",
  "annabelle",
  "sage",
  "alani",
  "aspen",
  "trinity",
  "rachel",
  "laila",
  "lila",
  "lilly",
  "alexa",
  "daniela",
  "lauren",
  "elsie",
  "margot",
  "zuri",
  "brooke",
  "adelyn",
  "lola",
  "sawyer",
  "lilah",
  "sydney",
  "mya",
  "selena",
  "ana",
  "diana",
  "vera",
  "alayna",
  "nyla",
  "elaina",
  "rebecca",
  "angela",
  "alivia",
  "kali",
  "phoebe",
  "rowan",
  "dakota",
  "evangeline",
  "joanna",
  "raegan",
  "brooklynn",
  "malia",
  "vivienne",
  "camilla",
  "jane",
  "camille",
  "nicole",
  "catherine",
  "miriam",
  "jocelyn",
  "julianna",
  "lena",
  "adelaide",
  "lucille",
  "mariana",
  "paige",
  "myla",
  "charlee",
  "mckenzie",
  "mckenna",
  "tessa",
  "alayah",
  "kailani",
  "oakley",
  "amira",
  "adaline",
  "phoenix",
  "harley",
  "milani",
  "annie",
  "angelina",
  "lia",
  "fiona",
  "journey",
  "maggie",
  "leia",
  "cali",
  "hayden",
  "briella",
  "lennon",
  "jayla",
  "kaia",
  "saylor",
  "mariah",
  "thea",
  "adriana",
  "juliet",
  "kiara",
  "oaklynn",
  "aniyah",
  "alexis",
  "gracelynn",
  "haven",
  "delaney",
  "kendall",
  "winter",
  "lilith",
  "logan",
  "amiyah",
  "evie",
  "alexandria",
  "gracelyn",
  "gabriela",
  "harlow",
  "sutton",
  "makayla",
  "madilyn",
  "evelynn",
  "nina",
  "amina",
  "gia",
  "amari",
  "giselle",
  "brynn",
  "octavia",
  "blair",
  "michelle",
  "talia",
  "demi",
  "alaya",
  "kaylani",
  "izabella",
  "fatima",
  "tatum",
  "lilliana",
  "makenzie",
  "arielle",
  "destiny",
  "palmer",
  "melissa",
  "samara",
  "willa",
  "celeste",
  "rylie",
  "ainsley",
  "dahlia",
  "reign",
  "laura",
  "gabrielle",
  "adelynn",
  "wren",
  "remington",
  "brinley",
  "amora",
  "collins",
  "aitana",
  "lainey",
  "lexi",
  "alessandra",
  "kenzie",
  "elle",
  "raelyn",
  "everlee",
  "haisley",
  "hallie",
  "daleyza",
  "wynter",
  "gwendolyn",
  "miracle",
  "paislee",
  "avianna",
  "felicity",
  "heidi",
  "anaya",
  "ariyah",
  "kira",
  "cataleya",
  "veronica",
  "sabrina",
  "aylin",
  "elianna",
  "ophelia",
  "lana",
  "royalty",
  "esmeralda",
  "esme",
  "joy",
  "kalani",
  "madeleine",
  "jessica",
  "leighton",
  "ariah",
  "makenna",
  "nylah",
  "luciana",
  "stevie",
  "dream",
  "camryn",
  "lyric",
  "viviana",
  "cassidy",
  "maisie",
  "kate",
  "daniella",
  "alicia",
  "daphne",
  "paris",
  "raven",
  "frances",
  "charli",
  "bianca",
  "serena",
  "hattie",
  "nayeli",
  "heaven",
  "helen",
  "averie",
  "selah",
  "mabel",
  "allie",
  "marlee",
  "jennifer",
  "regina",
  "carmen",
  "kinley",
  "jordan",
  "maren",
  "kayleigh",
  "stephanie",
  "alison",
  "angel",
  "annalise",
  "rosemary",
  "jacqueline",
  "amanda",
  "emory",
  "braelynn",
  "danielle",
  "scarlet",
  "astrid",
  "ryan",
  "carolina",
  "shiloh",
  "emelia",
  "kensley",
  "maci",
  "francesca",
  "poppy",
  "rory",
  "celine",
  "zariah",
  "kamryn",
  "liana",
  "skyler",
  "maliyah",
  "keira",
  "noa",
  "skye",
  "nadia",
  "eve",
  "addilyn",
  "rosie",
  "sarai",
  "edith",
  "maddison",
  "jolene",
  "meadow",
  "charleigh",
  "holly",
  "matilda",
  "madelynn",
  "azalea",
  "katie",
  "leona",
  "ari",
  "mira",
  "elliott",
  "danna",
  "kaitlyn",
  "kora",
  "cameron",
  "kyla",
  "bristol",
  "armani",
  "nia",
  "malani",
  "dylan",
  "remy",
  "maia",
  "dior",
  "legacy",
  "shelby",
  "sylvia",
  "alessia",
  "lorelei",
  "maryam",
  "renata",
  "yaretzi",
  "abby",
  "madilynn",
  "elisa",
  "helena",
  "amber",
  "jimena",
  "carter",
  "aviana",
  "haley",
  "emmy",
  "april",
  "elaine",
  "alondra",
  "erin",
  "imani",
  "kennedi",
  "emely",
  "lorelai",
  "kathryn",
  "hanna",
  "jaliyah",
  "kelsey",
  "aurelia",
  "colette",
  "macie",
  "kylee",
  "sierra",
  "dorothy",
  "aisha",
  "charley",
  "adelina",
  "adley",
  "jada",
  "ailani",
  "miranda",
  "monroe",
  "alejandra",
  "mikayla",
  "amirah",
  "jazlyn",
  "jenna",
  "lyra",
  "jayleen",
  "kendra",
  "beatrice",
  "nola",
  "mckinley",
  "emberly",
  "myra",
  "antonella",
  "katalina",
  "zelda",
  "alanna",
  "priscilla",
  "oaklyn",
  "amaia",
  "kaliyah",
  "mallory",
  "alma",
  "briar",
  "itzel",
  "novah",
  "amalia",
  "elliot",
  "fernanda",
  "mae",
  "alia",
  "angelica",
  "cecelia",
  "justice",
  "gloria",
  "ariya",
  "cheyenne",
  "virginia",
  "aleah",
  "henley",
  "jemma",
  "meredith",
  "frankie",
  "ensley",
  "lennox",
  "leyla",
  "reina",
  "reyna",
  "zahra",
  "nalani",
  "lylah",
  "aleena",
  "ivanna",
  "leslie",
  "saige",
  "alora",
  "emerie",
  "bethany",
  "clementine",
  "ivory",
  "ashlyn",
  "sasha",
  "bonnie",
  "christina",
  "salem",
  "xiomara",
  "dayana",
  "adrianna",
  "briana",
  "karina",
  "karsyn",
  "julie",
  "julieta",
  "emmie",
  "irene",
  "marie",
  "carly",
  "ellis",
  "macy",
  "oaklee",
  "malaysia",
  "rhea",
  "anne",
  "jayda",
  "mara",
  "anahi",
  "davina",
  "rosa",
  "dallas",
  "skyla",
  "marilyn",
  "milan",
  "mariam",
  "elora",
  "siena",
  "jazmin",
  "megan",
  "savanna",
  "allyson",
  "melany",
  "chelsea",
  "johanna",
  "coraline",
  "melina",
  "michaela",
  "opal",
  "laney",
  "angie",
  "kassidy",
  "liberty",
  "yara",
  "cassandra",
  "lilian",
  "anya",
  "navy",
  "avah",
  "amani",
  "mina",
  "chaya",
  "zaylee",
  "sloan",
  "ashlynn",
  "liv",
  "romina",
  "malaya",
  "aliza",
  "hadassah",
  "blaire",
  "janelle",
  "kara",
  "hayley",
  "analia",
  "karla",
  "katelyn",
  "kyra",
  "louise",
  "cadence",
  "capri",
  "ellianna",
  "alena",
  "laurel",
  "braelyn",
  "faye",
  "kimber",
  "kamiyah",
  "lina",
  "kenna",
  "sunny",
  "calliope",
  "kaydence",
  "tiana",
  "nala",
  "aileen",
  "monica",
  "milana",
  "zariyah",
  "giuliana",
  "eileen",
  "elodie",
  "marina",
  "harmoni",
  "galilea",
  "journi",
  "lara",
  "rayna",
  "aliana",
  "holland",
  "jamie",
  "lacey",
  "emmalyn",
  "ezra",
  "jolie",
  "lauryn",
  "chanel",
  "elyse",
  "jessie",
  "lillie",
  "tinsley",
  "janiyah",
  "kinslee",
  "marleigh",
  "louisa",
  "madisyn",
  "penny",
  "roselyn",
  "zaniyah",
  "treasure",
  "estella",
  "jaylah",
  "khaleesi",
  "saoirse",
  "alexia",
  "waverly",
  "dulce",
  "estrella",
  "greta",
  "indie",
  "maxine",
  "rosalia",
  "miley",
  "giovanna",
  "kelly",
  "teresa",
  "harlee",
  "mylah",
  "aubrie",
  "avalynn",
  "bridget",
  "lea",
  "anika",
  "naya",
  "adalee",
  "hana",
  "kaisley",
  "sevyn",
  "itzayana",
  "joelle",
  "keilani",
  "mikaela",
  "florence",
  "kallie",
  "margo",
  "lyanna",
  "martha",
  "averi",
  "kataleya",
  "rayne",
  "royal",
  "sylvie",
  "jazmine",
  "noemi",
  "pearl",
  "rebekah",
  "winnie",
  "kori",
  "alaiya",
  "baylee",
  "brylee",
  "chana",
  "rivka",
  "ryann",
  "julissa",
  "laylah",
  "rosalee",
  "aya",
  "celia",
  "haylee",
  "adele",
  "aubrielle",
  "kai",
  "tiffany",
  "bria",
  "addyson",
  "bellamy",
  "princess",
  "estelle",
  "leilany",
  "mercy",
  "thalia",
  "dani",
  "ramona",
  "sky",
  "vienna",
  "amelie",
  "ellen",
  "selene",
  "andi",
  "novalee",
  "vada",
  "kynlee",
  "linda",
  "livia",
  "raina",
  "alianna",
  "persephone",
  "sariyah",
  "madalyn",
  "berkley",
  "gwen",
  "karen",
  "paula",
  "kamilah",
  "marianna",
  "milena",
  "clare",
  "hunter",
  "kairi",
  "amoura",
  "annika",
  "isabela",
  "paulina",
  "theodora",
  "kyleigh",
  "keyla",
  "yareli",
  "nellie",
  "aubriella",
  "mavis",
  "sariah",
  "scarlette",
  "bexley",
  "lilianna",
  "tori",
  "kailey",
  "rosalyn",
  "annabella",
  "bailee",
  "jianna",
  "denisse",
  "promise",
  "keily",
  "azariah",
  "august",
  "hadlee",
  "simone",
  "zaria",
  "crystal",
  "halle",
  "oakleigh",
  "aliya",
  "fallon",
  "ila",
  "jaylin",
  "emmeline",
  "giana",
  "paisleigh",
  "maleah",
  "rylan",
  "scout",
  "cynthia",
  "noah",
  "zora",
  "denise",
  "ainhoa",
  "aniya",
  "lilyana",
  "meghan",
  "cleo",
  "landry",
  "belen",
  "leanna",
  "noor",
  "addisyn",
  "brynleigh",
  "meilani",
  "barbara",
  "frida",
  "iliana",
  "violeta",
  "karter",
  "amaris",
  "wrenley",
  "denver",
  "nancy",
  "aila",
  "khalani",
  "kiana",
  "aspyn",
  "braylee",
  "robin",
  "valery",
  "ellison",
  "deborah",
  "judith",
  "anais",
  "cara",
  "iyla",
  "nathalie",
  "clarissa",
  "kaylie",
  "lexie",
  "della",
  "elsa",
  "alisson",
  "veda",
  "zoya",
  "addilynn",
  "jaylee",
  "jovie",
  "egypt",
  "flora",
  "kenia",
  "marlowe",
  "samira",
  "etta",
  "jenesis",
  "layne",
  "shay",
  "raya",
  "zola",
  "amayah",
  "avayah",
  "raquel",
  "giavanna",
  "halo",
  "nataly",
  "paloma",
  "whitney",
  "drew",
  "loretta",
  "malayah",
  "natasha",
  "whitley",
  "carolyn",
  "dalary",
  "kamari",
  "esperanza",
  "emerald",
  "freyja",
  "guadalupe",
  "stormi",
  "ansley",
  "jillian",
  "paola",
  "artemis",
  "corinne",
  "aislinn",
  "brittany",
  "kimora",
  "zainab",
  "zendaya",
  "zoie",
  "marceline",
  "nyomi",
  "queen",
  "ayleen",
  "chandler",
  "emmaline",
  "hadleigh",
  "jaycee",
  "luella",
  "susan",
  "elisabeth",
  "marisol",
  "murphy",
  "elina",
  "joyce",
  "yamileth",
  "yasmin",
  "emani",
  "emmalynn",
  "jaelynn",
  "paityn",
  "violette",
  "kaiya",
  "madalynn",
  "melani",
  "nathalia",
  "aarya",
  "araceli",
  "harleigh",
  "kiera",
  "luisa",
  "magdalena",
  "mazikeen",
  "zhuri",
  "belle",
];
yarn.lock
@@ -189,6 +189,11 @@
  resolved "https://mirrors.cloud.tencent.com/npm/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
  integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==
wordlist-js@^2.0.0:
  version "2.0.0"
  resolved "https://mirrors.cloud.tencent.com/npm/wordlist-js/-/wordlist-js-2.0.0.tgz#d915c2e1bf04297b74885b4e1715baa1bbaf7146"
  integrity sha512-9ChUEaF12aKu3UE3bjZ2RtL0kyAYVWabwDwOBCvw1BWxABWefmM/APkyZ5EKyQX/MuTYuDVDTghTa1URGzoB7A==
ws@>=8.16.0:
  version "8.17.0"
  resolved "https://mirrors.cloud.tencent.com/npm/ws/-/ws-8.17.0.tgz#d145d18eca2ed25aaf791a183903f7be5e295fea"