init__(
        self, mailhost: str, username: str, password: str, fromaddr: str, toaddrs: Sequence[str], subject: str
    ) -> None: ...

class LRUCache(Dict[_KT, _VT]):
    class _Item:
        previous: Optional[LRUCache._Item]
        next: Optional[LRUCache._Item]
        key = ...
        value = ...
        def __init__(self, key, value) -> None: ...
    _dict: Dict[_KT, LRUCache._Item]
    capacity: int
    head: Optional[LRUCache._Item]
    tail: Optional[LRUCache._Item]
    def __init__(self, capacity: int) -> None: ...

# This exists to work around Password.str's name shadowing the str type
_str = str

class Password:
    hashfunc: Callable[[bytes], _HashType]
    str: Optional[_str]
    def __init__(self, str: Optional[_str] = ..., hashfunc: Optional[Callable[[bytes], _HashType]] = ...) -> None: ...
    def set(self, value: Union[bytes, _str]) -> None: ...
    def __eq__(self, other: Any) -> bool: ...
    def __len__(self) -> int: ...

def notify(
    subject: str,
    body: Optional[str] = ...,
    html_body: Optional[Union[Sequence[str], str]] = ...,
    to_string: Optional[str] = ...,
    attachments: Optional[Iterable[_Message]] = ...,
    append_instance_id: bool = ...,
) -> None: ...
def get_utf8_value(value: str) -> bytes: ...
def mklist(value: Any) -> List[Any]: ...
def pythonize_name(name: str) -> str: ...
def write_mime_multipart(
    content: List[Tuple[str, str]], compress: bool = ..., deftype: str = ..., delimiter: str = ...
) -> str: ...
def guess_mime_type(content: str, deftype: str) -> str: ...
def compute_md5(fp: IO[Any], buf_size: int = ..., size: Optional[int] = ...) -> Tuple[str, str, int]: ...
def compute_hash(
    fp: IO[Any], buf_size: int = ..., size: Optional[int] = ..., hash_algorithm: Any = ...
) -> Tuple[str, str, int]: ...
def find_matching_headers(name: str, headers: Mapping[str, Optional[str]]) -> List[str]: ...
def merge_headers_by_name(name: str, headers: Mapping[str, Optional[str]]) -> str: ...

class RequestHook:
    def handle_request_data(
        self, request: boto.connection.HTTPRequest, response: boto.connection.HTTPResponse, error: bool = ...
    ) -> Any: ...

def host_is_ipv6(hostname: str) -> bool: ...
def parse_host(hostname: str) -> str: ...
PK