{"version":3,"sources":["../src/index.ts","../src/lang.ts","../src/filter.ts"],"sourcesContent":["export { Filter } from \"./filter\";\n","export const words = [\n  \"ahole\",\n  \"anus\",\n  \"ash0le\",\n  \"ash0les\",\n  \"asholes\",\n  \"ass\",\n  \"Ass Monkey\",\n  \"Assface\",\n  \"assh0le\",\n  \"assh0lez\",\n  \"asshole\",\n  \"assholes\",\n  \"assholz\",\n  \"asswipe\",\n  \"azzhole\",\n  \"bassterds\",\n  \"bastard\",\n  \"bastards\",\n  \"bastardz\",\n  \"basterds\",\n  \"basterdz\",\n  \"Biatch\",\n  \"bitch\",\n  \"bitches\",\n  \"Blow Job\",\n  \"boffing\",\n  \"butthole\",\n  \"buttwipe\",\n  \"c0ck\",\n  \"c0cks\",\n  \"c0k\",\n  \"Carpet Muncher\",\n  \"cawk\",\n  \"cawks\",\n  \"Clit\",\n  \"cnts\",\n  \"cntz\",\n  \"cock\",\n  \"cockhead\",\n  \"cock-head\",\n  \"cocks\",\n  \"CockSucker\",\n  \"cock-sucker\",\n  \"crap\",\n  \"cum\",\n  \"cunt\",\n  \"cunts\",\n  \"cuntz\",\n  \"dick\",\n  \"dild0\",\n  \"dild0s\",\n  \"dildo\",\n  \"dildos\",\n  \"dilld0\",\n  \"dilld0s\",\n  \"dominatricks\",\n  \"dominatrics\",\n  \"dominatrix\",\n  \"dyke\",\n  \"enema\",\n  \"f u c k\",\n  \"f u c k e r\",\n  \"fag\",\n  \"fag1t\",\n  \"faget\",\n  \"fagg1t\",\n  \"faggit\",\n  \"faggot\",\n  \"fagg0t\",\n  \"fagit\",\n  \"fags\",\n  \"fagz\",\n  \"faig\",\n  \"faigs\",\n  \"fart\",\n  \"flipping the bird\",\n  \"fuck\",\n  \"fucker\",\n  \"fuckin\",\n  \"fucking\",\n  \"fucks\",\n  \"Fudge Packer\",\n  \"fuk\",\n  \"Fukah\",\n  \"Fuken\",\n  \"fuker\",\n  \"Fukin\",\n  \"Fukk\",\n  \"Fukkah\",\n  \"Fukken\",\n  \"Fukker\",\n  \"Fukkin\",\n  \"g00k\",\n  \"God-damned\",\n  \"h00r\",\n  \"h0ar\",\n  \"h0re\",\n  \"hells\",\n  \"hoar\",\n  \"hoor\",\n  \"hoore\",\n  \"jackoff\",\n  \"jap\",\n  \"japs\",\n  \"jerk-off\",\n  \"jisim\",\n  \"jiss\",\n  \"jizm\",\n  \"jizz\",\n  \"knob\",\n  \"knobs\",\n  \"knobz\",\n  \"kunt\",\n  \"kunts\",\n  \"kuntz\",\n  \"Lezzian\",\n  \"Lipshits\",\n  \"Lipshitz\",\n  \"masochist\",\n  \"masokist\",\n  \"massterbait\",\n  \"masstrbait\",\n  \"masstrbate\",\n  \"masterbaiter\",\n  \"masterbate\",\n  \"masterbates\",\n  \"Motha Fucker\",\n  \"Motha Fuker\",\n  \"Motha Fukkah\",\n  \"Motha Fukker\",\n  \"Mother Fucker\",\n  \"Mother Fukah\",\n  \"Mother Fuker\",\n  \"Mother Fukkah\",\n  \"Mother Fukker\",\n  \"mother-fucker\",\n  \"Mutha Fucker\",\n  \"Mutha Fukah\",\n  \"Mutha Fuker\",\n  \"Mutha Fukkah\",\n  \"Mutha Fukker\",\n  \"n1gr\",\n  \"nastt\",\n  \"nigger;\",\n  \"nigur;\",\n  \"niiger;\",\n  \"niigr;\",\n  \"orafis\",\n  \"orgasim;\",\n  \"orgasm\",\n  \"orgasum\",\n  \"oriface\",\n  \"orifice\",\n  \"orifiss\",\n  \"packi\",\n  \"packie\",\n  \"packy\",\n  \"paki\",\n  \"pakie\",\n  \"paky\",\n  \"pecker\",\n  \"peeenus\",\n  \"peeenusss\",\n  \"peenus\",\n  \"peinus\",\n  \"pen1s\",\n  \"penas\",\n  \"penis\",\n  \"penis-breath\",\n  \"penus\",\n  \"penuus\",\n  \"Phuc\",\n  \"Phuck\",\n  \"Phuk\",\n  \"Phuker\",\n  \"Phukker\",\n  \"polac\",\n  \"polack\",\n  \"polak\",\n  \"Poonani\",\n  \"pr1c\",\n  \"pr1ck\",\n  \"pr1k\",\n  \"pusse\",\n  \"pussee\",\n  \"pussy\",\n  \"puuke\",\n  \"puuker\",\n  \"qweir\",\n  \"recktum\",\n  \"rectum\",\n  \"retard\",\n  \"sadist\",\n  \"scank\",\n  \"schlong\",\n  \"screwing\",\n  \"semen\",\n  \"sex\",\n  \"sexy\",\n  \"Sh!t\",\n  \"sh1t\",\n  \"sh1ter\",\n  \"sh1ts\",\n  \"sh1tter\",\n  \"sh1tz\",\n  \"shit\",\n  \"shits\",\n  \"shitter\",\n  \"Shitty\",\n  \"Shity\",\n  \"shitz\",\n  \"Shyt\",\n  \"Shyte\",\n  \"Shytty\",\n  \"Shyty\",\n  \"skanck\",\n  \"skank\",\n  \"skankee\",\n  \"skankey\",\n  \"skanks\",\n  \"Skanky\",\n  \"slag\",\n  \"slut\",\n  \"sluts\",\n  \"Slutty\",\n  \"slutz\",\n  \"son-of-a-bitch\",\n  \"tit\",\n  \"turd\",\n  \"va1jina\",\n  \"vag1na\",\n  \"vagiina\",\n  \"vagina\",\n  \"vaj1na\",\n  \"vajina\",\n  \"vullva\",\n  \"vulva\",\n  \"w0p\",\n  \"wh00r\",\n  \"wh0re\",\n  \"whore\",\n  \"xrated\",\n  \"xxx\",\n  \"b!+ch\",\n  \"blowjob\",\n  \"clit\",\n  \"arschloch\",\n  \"b!tch\",\n  \"b17ch\",\n  \"b1tch\",\n  \"bi+ch\",\n  \"boiolas\",\n  \"buceta\",\n  \"chink\",\n  \"cipa\",\n  \"clits\",\n  \"dirsa\",\n  \"ejakulate\",\n  \"fatass\",\n  \"fcuk\",\n  \"fux0r\",\n  \"hoer\",\n  \"hore\",\n  \"jism\",\n  \"kawk\",\n  \"l3itch\",\n  \"l3i+ch\",\n  \"masturbate\",\n  \"masterbat*\",\n  \"masterbat3\",\n  \"motherfucker\",\n  \"s.o.b.\",\n  \"mofo\",\n  \"nazi\",\n  \"nigga\",\n  \"nigger\",\n  \"nutsack\",\n  \"phuck\",\n  \"pimpis\",\n  \"scrotum\",\n  \"sh!t\",\n  \"shemale\",\n  \"shi+\",\n  \"sh!+\",\n  \"smut\",\n  \"teets\",\n  \"tits\",\n  \"boobs\",\n  \"b00bs\",\n  \"teez\",\n  \"testical\",\n  \"testicle\",\n  \"titt\",\n  \"w00se\",\n  \"wank\",\n  \"whoar\",\n  \"*damn\",\n  \"*dyke\",\n  \"*fuck*\",\n  \"*shit*\",\n  \"@$$\",\n  \"amcik\",\n  \"andskota\",\n  \"arse*\",\n  \"assrammer\",\n  \"ayir\",\n  \"bi7ch\",\n  \"bitch*\",\n  \"bollock*\",\n  \"breasts\",\n  \"butt-pirate\",\n  \"cabron\",\n  \"cazzo\",\n  \"chraa\",\n  \"chuj\",\n  \"Cock*\",\n  \"cunt*\",\n  \"d4mn\",\n  \"daygo\",\n  \"dego\",\n  \"dick*\",\n  \"dike*\",\n  \"dupa\",\n  \"dziwka\",\n  \"ejackulate\",\n  \"Ekrem*\",\n  \"Ekto\",\n  \"enculer\",\n  \"faen\",\n  \"fag*\",\n  \"fanculo\",\n  \"fanny\",\n  \"feces\",\n  \"feg\",\n  \"Felcher\",\n  \"ficken\",\n  \"fitt*\",\n  \"Flikker\",\n  \"foreskin\",\n  \"Fotze\",\n  \"Fu(*\",\n  \"fuk*\",\n  \"futkretzn\",\n  \"gook\",\n  \"guiena\",\n  \"h0r\",\n  \"h4x0r\",\n  \"hell\",\n  \"helvete\",\n  \"hoer*\",\n  \"honkey\",\n  \"Huevon\",\n  \"hui\",\n  \"injun\",\n  \"kanker*\",\n  \"kike\",\n  \"klootzak\",\n  \"kraut\",\n  \"knulle\",\n  \"kuk\",\n  \"kuksuger\",\n  \"Kurac\",\n  \"kurwa\",\n  \"kusi*\",\n  \"kyrpa*\",\n  \"lesbo\",\n  \"mamhoon\",\n  \"masturbat*\",\n  \"merd*\",\n  \"mibun\",\n  \"monkleigh\",\n  \"mouliewop\",\n  \"muie\",\n  \"mulkku\",\n  \"muschi\",\n  \"nazis\",\n  \"nepesaurio\",\n  \"nigger*\",\n  \"orospu\",\n  \"paska*\",\n  \"perse\",\n  \"picka\",\n  \"pierdol*\",\n  \"pillu*\",\n  \"pimmel\",\n  \"piss*\",\n  \"pizda\",\n  \"poontsee\",\n  \"poop\",\n  \"porn\",\n  \"p0rn\",\n  \"pr0n\",\n  \"preteen\",\n  \"pula\",\n  \"pule\",\n  \"puta\",\n  \"puto\",\n  \"qahbeh\",\n  \"queef*\",\n  \"rautenberg\",\n  \"schaffer\",\n  \"scheiss*\",\n  \"schlampe\",\n  \"schmuck\",\n  \"screw\",\n  \"sh!t*\",\n  \"sharmuta\",\n  \"sharmute\",\n  \"shipal\",\n  \"shiz\",\n  \"skribz\",\n  \"skurwysyn\",\n  \"sphencter\",\n  \"spic\",\n  \"spierdalaj\",\n  \"splooge\",\n  \"suka\",\n  \"b00b*\",\n  \"testicle*\",\n  \"titt*\",\n  \"twat\",\n  \"vittu\",\n  \"wank*\",\n  \"wetback*\",\n  \"wichser\",\n  \"wop*\",\n  \"yed\",\n  \"zabourah\",\n  \"4r5e\",\n  \"5h1t\",\n  \"5hit\",\n  \"a55\",\n  \"anal\",\n  \"ar5e\",\n  \"arrse\",\n  \"arse\",\n  \"ass-fucker\",\n  \"asses\",\n  \"assfucker\",\n  \"assfukka\",\n  \"asswhole\",\n  \"a_s_s\",\n  \"ballbag\",\n  \"balls\",\n  \"ballsack\",\n  \"beastial\",\n  \"beastiality\",\n  \"bellend\",\n  \"bestial\",\n  \"bestiality\",\n  \"biatch\",\n  \"bitcher\",\n  \"bitchers\",\n  \"bitchin\",\n  \"bitching\",\n  \"bloody\",\n  \"blow job\",\n  \"blowjobs\",\n  \"bollock\",\n  \"bollok\",\n  \"boner\",\n  \"boob\",\n  \"booobs\",\n  \"boooobs\",\n  \"booooobs\",\n  \"booooooobs\",\n  \"bugger\",\n  \"bum\",\n  \"bunny fucker\",\n  \"butt\",\n  \"buttmuch\",\n  \"buttplug\",\n  \"c0cksucker\",\n  \"carpet muncher\",\n  \"cl1t\",\n  \"clitoris\",\n  \"cnut\",\n  \"cockface\",\n  \"cockmunch\",\n  \"cockmuncher\",\n  \"cocksuck\",\n  \"cocksucked\",\n  \"cocksucker\",\n  \"cocksucking\",\n  \"cocksucks\",\n  \"cocksuka\",\n  \"cocksukka\",\n  \"cok\",\n  \"cokmuncher\",\n  \"coksucka\",\n  \"coon\",\n  \"cox\",\n  \"cummer\",\n  \"cumming\",\n  \"cums\",\n  \"cumshot\",\n  \"cunilingus\",\n  \"cunillingus\",\n  \"cunnilingus\",\n  \"cuntlick\",\n  \"cuntlicker\",\n  \"cuntlicking\",\n  \"cyalis\",\n  \"cyberfuc\",\n  \"cyberfuck\",\n  \"cyberfucked\",\n  \"cyberfucker\",\n  \"cyberfuckers\",\n  \"cyberfucking\",\n  \"d1ck\",\n  \"damn\",\n  \"dickhead\",\n  \"dink\",\n  \"dinks\",\n  \"dlck\",\n  \"dog-fucker\",\n  \"doggin\",\n  \"dogging\",\n  \"donkeyribber\",\n  \"doosh\",\n  \"duche\",\n  \"ejaculate\",\n  \"ejaculated\",\n  \"ejaculates\",\n  \"ejaculating\",\n  \"ejaculatings\",\n  \"ejaculation\",\n  \"f4nny\",\n  \"fagging\",\n  \"faggitt\",\n  \"faggs\",\n  \"fagot\",\n  \"fagots\",\n  \"fannyflaps\",\n  \"fannyfucker\",\n  \"fanyy\",\n  \"fcuker\",\n  \"fcuking\",\n  \"feck\",\n  \"fecker\",\n  \"felching\",\n  \"fellate\",\n  \"fellatio\",\n  \"fingerfuck\",\n  \"fingerfucked\",\n  \"fingerfucker\",\n  \"fingerfuckers\",\n  \"fingerfucking\",\n  \"fingerfucks\",\n  \"fistfuck\",\n  \"fistfucked\",\n  \"fistfucker\",\n  \"fistfuckers\",\n  \"fistfucking\",\n  \"fistfuckings\",\n  \"fistfucks\",\n  \"flange\",\n  \"fook\",\n  \"fooker\",\n  \"fucka\",\n  \"fucked\",\n  \"fuckers\",\n  \"fuckhead\",\n  \"fuckheads\",\n  \"fuckings\",\n  \"fuckingshitmotherfucker\",\n  \"fuckme\",\n  \"fuckwhit\",\n  \"fuckwit\",\n  \"fudge packer\",\n  \"fudgepacker\",\n  \"fukker\",\n  \"fukkin\",\n  \"fuks\",\n  \"fukwhit\",\n  \"fukwit\",\n  \"fux\",\n  \"f_u_c_k\",\n  \"gangbang\",\n  \"gangbanged\",\n  \"gangbangs\",\n  \"gaylord\",\n  \"gaysex\",\n  \"goatse\",\n  \"God\",\n  \"god-dam\",\n  \"god-damned\",\n  \"goddamn\",\n  \"goddamned\",\n  \"hardcoresex\",\n  \"heshe\",\n  \"hoare\",\n  \"homo\",\n  \"horniest\",\n  \"horny\",\n  \"hotsex\",\n  \"jack-off\",\n  \"jiz\",\n  \"knobead\",\n  \"knobed\",\n  \"knobend\",\n  \"knobhead\",\n  \"knobjocky\",\n  \"knobjokey\",\n  \"kock\",\n  \"kondum\",\n  \"kondums\",\n  \"kum\",\n  \"kummer\",\n  \"kumming\",\n  \"kums\",\n  \"kunilingus\",\n  \"labia\",\n  \"lust\",\n  \"lusting\",\n  \"m0f0\",\n  \"m0fo\",\n  \"m45terbate\",\n  \"ma5terb8\",\n  \"ma5terbate\",\n  \"master-bate\",\n  \"masterb8\",\n  \"masterbation\",\n  \"masterbations\",\n  \"mo-fo\",\n  \"mof0\",\n  \"mothafuck\",\n  \"mothafucka\",\n  \"mothafuckas\",\n  \"mothafuckaz\",\n  \"mothafucked\",\n  \"mothafucker\",\n  \"mothafuckers\",\n  \"mothafuckin\",\n  \"mothafucking\",\n  \"mothafuckings\",\n  \"mothafucks\",\n  \"mother fucker\",\n  \"motherfuck\",\n  \"motherfucked\",\n  \"motherfuckers\",\n  \"motherfuckin\",\n  \"motherfucking\",\n  \"motherfuckings\",\n  \"motherfuckka\",\n  \"motherfucks\",\n  \"muff\",\n  \"mutha\",\n  \"muthafecker\",\n  \"muthafuckker\",\n  \"muther\",\n  \"mutherfucker\",\n  \"n1gga\",\n  \"n1gger\",\n  \"nigg3r\",\n  \"nigg4h\",\n  \"niggah\",\n  \"niggas\",\n  \"niggaz\",\n  \"niggers\",\n  \"nob\",\n  \"nob jokey\",\n  \"nobhead\",\n  \"nobjocky\",\n  \"nobjokey\",\n  \"numbnuts\",\n  \"orgasim\",\n  \"orgasims\",\n  \"orgasms\",\n  \"pawn\",\n  \"penisfucker\",\n  \"phonesex\",\n  \"phuk\",\n  \"phuked\",\n  \"phuking\",\n  \"phukked\",\n  \"phukking\",\n  \"phuks\",\n  \"phuq\",\n  \"pigfucker\",\n  \"piss\",\n  \"pissed\",\n  \"pisser\",\n  \"pissers\",\n  \"pisses\",\n  \"pissflaps\",\n  \"pissin\",\n  \"pissing\",\n  \"pissoff\",\n  \"porno\",\n  \"pornography\",\n  \"pornos\",\n  \"prick\",\n  \"pricks\",\n  \"pron\",\n  \"pube\",\n  \"pussi\",\n  \"pussies\",\n  \"pussys\",\n  \"rimjaw\",\n  \"rimming\",\n  \"s hit\",\n  \"scroat\",\n  \"scrote\",\n  \"shag\",\n  \"shagger\",\n  \"shaggin\",\n  \"shagging\",\n  \"shitdick\",\n  \"shite\",\n  \"shited\",\n  \"shitey\",\n  \"shitfuck\",\n  \"shitfull\",\n  \"shithead\",\n  \"shiting\",\n  \"shitings\",\n  \"shitted\",\n  \"shitters\",\n  \"shitting\",\n  \"shittings\",\n  \"shitty\",\n  \"smegma\",\n  \"snatch\",\n  \"spac\",\n  \"spunk\",\n  \"s_h_i_t\",\n  \"t1tt1e5\",\n  \"t1tties\",\n  \"titfuck\",\n  \"tittie5\",\n  \"tittiefucker\",\n  \"titties\",\n  \"tittyfuck\",\n  \"tittywank\",\n  \"titwank\",\n  \"tosser\",\n  \"tw4t\",\n  \"twathead\",\n  \"twatty\",\n  \"twunt\",\n  \"twunter\",\n  \"v14gra\",\n  \"v1gra\",\n  \"viagra\",\n  \"wang\",\n  \"wanker\",\n  \"wanky\",\n  \"willies\",\n  \"willy\",\n];\n","import { words as localList } from \"./lang\";\nimport { ProfanityCheckConfig } from \"./types\";\n\nexport class Filter {\n  list: string[];\n  exclude: string[];\n  splitRegex: RegExp;\n  placeHolder: string;\n  regex: RegExp;\n  replaceRegex: RegExp;\n  openModeratorAPIKey: string | undefined;\n\n  /**\n   * Filter constructor. To use AI functions must set in .env or pass as param: OPEN_MODERATOR_API_KEY\n   * @constructor\n   * @param {object} options - Filter instance options\n   * @param {boolean} options.emptyList - Instantiate filter with no blacklist\n   * @param {array} options.list - Instantiate filter with a custom list\n   * @param {string} options.placeHolder - Character used to replace profane words.\n   * @param {string} options.regex - Regular expression used to sanitize words before comparing them to the blacklist.\n   * @param {string} options.replaceRegex - Regular expression used to replace profane words with placeHolder.\n   * @param {string} options.splitRegex - Regular expression used to split a string into words.\n   * @param {string} options.contentCheckerAPIKey - API key for OpenModerator API\n   */\n  constructor(\n    options: {\n      emptyList?: boolean;\n      list?: string[];\n      exclude?: string[];\n      placeHolder?: string;\n      regex?: RegExp;\n      replaceRegex?: RegExp;\n      splitRegex?: RegExp;\n      openModeratorAPIKey?: string;\n    } = {},\n  ) {\n    this.list = options.emptyList\n      ? []\n      : [...localList, ...(options.list || [])];\n    this.exclude = options.exclude || [];\n    this.splitRegex = options.splitRegex || /\\b/;\n    this.placeHolder = options.placeHolder || \"*\";\n    this.regex = options.regex || /[^a-zA-Z0-9|$|@]|\\^/g;\n    this.replaceRegex = options.replaceRegex || /\\w/g;\n    this.openModeratorAPIKey =\n      process.env.OPEN_MODERATOR_API_KEY || options.openModeratorAPIKey;\n  }\n\n  /**\n   * Determine if a string contains profane language.\n   * @param {string} string - String to evaluate for profanity.\n   */\n  isProfane(string: string): boolean {\n    return this.list.some((word) => {\n      const cleanWord = word.replace(/(\\W)/g, \"\\\\$1\");\n      const wordExp = new RegExp(`\\\\b${cleanWord}(?:${cleanWord})*\\\\b`, \"gi\");\n      return !this.exclude.includes(word.toLowerCase()) && wordExp.test(string);\n    });\n  }\n\n  /**\n   * Replace a word with placeHolder characters;\n   * @param {string} string - String to replace.\n   */\n  replaceWord(string: string): string {\n    return string\n      .replace(this.regex, \"\")\n      .replace(this.replaceRegex, this.placeHolder);\n  }\n\n  /**\n   * Evaluate a string for profanity and return an edited version.\n   * @param {string} string - Sentence to filter.\n   */\n  clean(string: string): string {\n    if (string === \"\") return \"\";\n    const words = string.split(this.splitRegex);\n    const delimiter = this.splitRegex.exec(string)?.[0] || \"\";\n    return words\n      .map((word) => {\n        return this.isProfane(word) ? this.replaceWord(word) : word;\n      })\n      .join(delimiter);\n  }\n\n  /**\n   * Add word(s) to blacklist filter / remove words from whitelist filter\n   * @param {...string} words - Word(s) to add to the blacklist\n   */\n  addWords(...words: string[]): void {\n    this.list.push(...words);\n\n    words\n      .map((word) => word.toLowerCase())\n      .forEach((word) => {\n        if (this.exclude.includes(word)) {\n          this.exclude.splice(this.exclude.indexOf(word), 1);\n        }\n      });\n  }\n\n  /**\n   * Add words to whitelist filter\n   * @param {...string} words - Word(s) to add to the whitelist.\n   */\n  removeWords(...words: string[]): void {\n    this.exclude.push(...words.map((word) => word.toLowerCase()));\n  }\n\n  /**\n   * AI-enabled way to determine if a string contains profane language. Ensure that you've set an API key for OpenModerator\n   * @param {string} str - String to evaluate for profanity.\n   * @param {ProfanityCheckConfig} config - Configuration object containing checkManualProfanityList and provider.\n   * In config: provider can be \"openai\" (OpenAI's Moderation API) or \"google-perspective-api\" (Google's Perspective API) or \"google-natural-language-api\" (Google's Natural Language API)\n   * In config: checkManualProfanityList is a boolean to determine if the manual profanity list in lang.ts should be checked first.\n   * @returns {Promise<{ profane: boolean; type: string[] }>} - Object containing profane flag and types of detected content (\"PROFANITY\")\n   */\n  async isProfaneAI(\n    str: string,\n    config: ProfanityCheckConfig = {\n      checkManualProfanityList: false,\n      provider: \"google-perspective-api\",\n    },\n  ): Promise<{ profane: boolean; type: string[] }> {\n    if (!this.openModeratorAPIKey) {\n      console.warn(\n        \"No API key found. AI functions will not work. Set in .env or pass as param: OPEN_MODERATOR_API_KEY\",\n      );\n      throw new Error(\"OpenModerator API key is not set.\");\n    }\n\n    const data = {\n      prompt: str,\n      config,\n    };\n\n    const contentCheckerAPIUrl =\n      \"https://www.openmoderator.com/api/moderate/text\";\n\n    try {\n      const response = await fetch(contentCheckerAPIUrl, {\n        method: \"POST\",\n        headers: {\n          \"Content-Type\": \"application/json\",\n          \"x-api-key\": this.openModeratorAPIKey || \"\",\n        },\n        body: JSON.stringify(data),\n      });\n\n      return await response.json();\n    } catch (error) {\n      console.error(\"Error calling OpenModerator API\", error);\n      throw error;\n    }\n  }\n\n  /**\n   * AI-enabled way to determine if an image contains NSFW content.\n   * Ensure that you've set an API key for OpenModerator.\n   * @param {Blob} image - Image file (jpg, png) to evaluate for NSFW content.\n   * @returns {Promise<{ nsfw: boolean; types: string[] }>} - Object containing NSFW flag and types of detected content (\"Hentai\" or \"Porn\")\n   */\n  async isImageNSFW(image: Blob): Promise<{ nsfw: boolean; types: string[] }> {\n    if (!this.openModeratorAPIKey) {\n      console.warn(\n        \"No API key found. AI functions will not work. Set in .env or pass as param: OPEN_MODERATOR_API_KEY\",\n      );\n      throw new Error(\"OpenModerator API key is not set.\");\n    }\n\n    const formData = new FormData();\n    formData.append(\"file\", image);\n\n    const contentCheckerAPIUrl =\n      \"https://www.openmoderator.com/api/moderate/image\";\n\n    try {\n      const response = await fetch(contentCheckerAPIUrl, {\n        method: \"POST\",\n        headers: {\n          \"x-api-key\": this?.openModeratorAPIKey || \"\",\n        },\n        body: formData,\n      });\n\n      if (!response.ok) {\n        throw new Error(`HTTP error! status: ${response.status}`);\n      }\n\n      return await response.json();\n    } catch (error) {\n      console.error(\"Error calling OpenModerator API\", error);\n      throw error;\n    }\n  }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAO,IAAM,QAAQ;AAAA,EACnB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EA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","names":["words"]}