pub(crate) use anyhow::{anyhow, Result};
pub(crate) use async_trait::async_trait;
pub(crate) use chromiumoxide::Page;
pub(crate) use serde::{Deserialize, Serialize};
pub(crate) use std::time::{Duration, Instant};
pub(crate) use crate::captcha_detect::CaptchaInfo;
pub(crate) mod audio;
pub(crate) mod behavioral;
pub(crate) mod util;
pub(crate) mod vlm;
mod cache;
mod chain;
mod math_captcha;
mod multi_step;
mod ocr;
pub mod oracle;
mod pattern;
pub mod planner;
mod pow;
mod race;
mod slider;
pub mod speculation;
mod third_party;
pub mod token_oracle;
pub mod token_shapes;
mod types;
pub mod vendors;
mod wait_for_token;
pub use self::types::{CaptchaSolveResult, CaptchaSolver, CaptchaType, SolveConfig, SolveMethod};
pub use self::audio::{normalize_transcript, AudioCaptchaSolver};
pub use self::behavioral::BehavioralCaptchaSolver;
pub use self::cache::{CacheStats, CachedToken, TokenCache};
pub use self::chain::{CaptchaSolverChain, ChainConfig};
pub use self::math_captcha::MathCaptchaSolver;
pub use self::multi_step::MultiStepCaptchaSolver;
pub use self::ocr::OcrCaptchaSolver;
pub use self::oracle::{classify, take_snapshot, OutcomeClassification, PageSnapshot};
pub use self::pattern::{CaptchaPattern, PatternStore};
pub use self::planner::{
HopOutcome, MultiHopPlanner, PlannerConfig, PlannerOutcome, PlannerTerminal,
};
pub use self::pow::PowCaptchaSolver;
pub use self::race::RacingSolver;
pub use self::slider::{SliderCaptchaSolver, SliderSelectors};
pub use self::speculation::{PreflightError, PreflightHandle};
pub use self::third_party::{ThirdPartyCaptchaSolver, ThirdPartyService};
pub use self::token_oracle::{
classify_response as classify_token_response, TokenEncoding, TokenValidator, ValidationVerdict,
ValidatorMethod,
};
pub use self::vendors::{
classify_abck, classify_datadome_cookie, classify_px_cookie, clean_transcript, is_rate_limited,
is_valid_arkose_token, is_valid_aws_waf_token, is_valid_v3_triple, is_valid_v4_quad,
looks_like_audio_url, AbckValidity, AkamaiInterstitialSolver, ArkoseSolver, AwsWafSolver,
CloudflareInterstitialSolver, DataDomeCookie, DataDomeSolver, GeeTestProtocol, GeeTestSolver,
PerimeterXSolver, PxCookie, RecaptchaAudioSolver, TurnstileInteractiveSolver,
AUDIO_BUTTON_SELECTOR, AUDIO_ELEMENT_SELECTOR, CHECKBOX_OFFSET_X, CHECKBOX_OFFSET_Y,
MAX_AUDIO_RETRIES, RATE_LIMIT_PHRASES, RECAPTCHA_BFRAME_SELECTOR, RESPONSE_INPUT_SELECTOR,
TOKEN_INPUT_NAME, TURNSTILE_IFRAME_SELECTOR, VERIFY_BUTTON_SELECTOR,
};
pub use self::vlm::VlmCaptchaSolver;
pub use self::wait_for_token::WaitForTokenSolver;
pub(crate) use self::util::screenshot_b64;