# encoding: utf-8
# module lxml.html._difflib
# from C:\Programs\Python\Python313\Lib\site-packages\lxml\html\_difflib.cp313-win_amd64.pyd
# by generator 1.147
"""
Module difflib -- helpers for computing deltas between objects.

Function get_close_matches(word, possibilities, n=3, cutoff=0.6):
    Use SequenceMatcher to return list of the best "good enough" matches.

Function context_diff(a, b):
    For two lists of strings, return a delta in context diff format.

Function ndiff(a, b):
    Return a delta: the difference between `a` and `b` (lists of strings).

Function restore(delta, which):
    Return one of the two sequences that generated an ndiff delta.

Function unified_diff(a, b):
    For two lists of strings, return a delta in unified diff format.

Class SequenceMatcher:
    A flexible class for comparing pairs of sequences of any type.

Class Differ:
    For producing human-readable deltas from sequences of lines of text.

Class HtmlDiff:
    For producing HTML side by side comparison with change highlights.
"""

# imports
import builtins as __builtins__ # <module 'builtins' (built-in)>

# Variables with simple values

_file_template = '\n<!DOCTYPE html>\n<html lang="en">\n<head>\n    <meta charset="%(charset)s">\n    <meta name="viewport" content="width=device-width, initial-scale=1">\n    <title>Diff comparison</title>\n    <style>%(styles)s\n    </style>\n</head>\n\n<body>\n    %(table)s%(legend)s\n</body>\n\n</html>'

_legend = '\n    <table class="diff" summary="Legends">\n        <tr> <th colspan="2"> Legends </th> </tr>\n        <tr> <td> <table border="" summary="Colors">\n                      <tr><th> Colors </th> </tr>\n                      <tr><td class="diff_add">&nbsp;Added&nbsp;</td></tr>\n                      <tr><td class="diff_chg">Changed</td> </tr>\n                      <tr><td class="diff_sub">Deleted</td> </tr>\n                  </table></td>\n             <td> <table border="" summary="Links">\n                      <tr><th colspan="2"> Links </th> </tr>\n                      <tr><td>(f)irst change</td> </tr>\n                      <tr><td>(n)ext change</td> </tr>\n                      <tr><td>(t)op</td> </tr>\n                  </table></td> </tr>\n    </table>'

_styles = '\n        :root {color-scheme: light dark}\n        table.diff {\n            font-family: Menlo, Consolas, Monaco, Liberation Mono, Lucida Console, monospace;\n            border: medium;\n        }\n        .diff_header {\n            background-color: #e0e0e0;\n            font-weight: bold;\n        }\n        td.diff_header {\n            text-align: right;\n            padding: 0 8px;\n        }\n        .diff_next {\n            background-color: #c0c0c0;\n            padding: 4px 0;\n        }\n        .diff_add {background-color:palegreen}\n        .diff_chg {background-color:#ffff77}\n        .diff_sub {background-color:#ffaaaa}\n        table.diff[summary="Legends"] {\n            margin-top: 20px;\n            border: 1px solid #ccc;\n        }\n        table.diff[summary="Legends"] th {\n            background-color: #e0e0e0;\n            padding: 4px 8px;\n        }\n        table.diff[summary="Legends"] td {\n            padding: 4px 8px;\n        }\n\n        @media (prefers-color-scheme: dark) {\n            .diff_header {background-color:#666}\n            .diff_next {background-color:#393939}\n            .diff_add {background-color:darkgreen}\n            .diff_chg {background-color:#847415}\n            .diff_sub {background-color:darkred}\n            table.diff[summary="Legends"] {border-color:#555}\n            table.diff[summary="Legends"] th{background-color:#666}\n        }'

_table_template = '\n    <table class="diff" id="difflib_chg_%(prefix)s_top"\n           cellspacing="0" cellpadding="0" rules="groups" >\n        <colgroup></colgroup> <colgroup></colgroup> <colgroup></colgroup>\n        <colgroup></colgroup> <colgroup></colgroup> <colgroup></colgroup>\n        %(header_row)s\n        <tbody>\n%(data_rows)s        </tbody>\n    </table>'

# functions

def context_diff(*args, **kwargs): # real signature unknown; NOTE: unreliably restored from __doc__ 
    """
    Compare two sequences of lines; generate the delta as a context diff.
    
        Context diffs are a compact way of showing line changes and a few
        lines of context.  The number of context lines is set by 'n' which
        defaults to three.
    
        By default, the diff control lines (those with *** or ---) are
        created with a trailing newline.  This is helpful so that inputs
        created from file.readlines() result in diffs that are suitable for
        file.writelines() since both the inputs and outputs have trailing
        newlines.
    
        For inputs that do not have trailing newlines, set the lineterm
        argument to "" so that the output will be uniformly newline free.
    
        The context diff format normally has a header for filenames and
        modification times.  Any or all of these may be specified using
        strings for 'fromfile', 'tofile', 'fromfiledate', and 'tofiledate'.
        The modification times are normally expressed in the ISO 8601 format.
        If not specified, the strings default to blanks.
    
        Example:
    
        >>> print(''.join(context_diff('one\ntwo\nthree\nfour\n'.splitlines(True),
        ...       'zero\none\ntree\nfour\n'.splitlines(True), 'Original', 'Current')),
        ...       end="")
        *** Original
        --- Current
        ***************
        *** 1,4 ****
          one
        ! two
        ! three
          four
        --- 1,4 ----
        + zero
          one
        ! tree
          four
    """
    pass

def diff_bytes(*args, **kwargs): # real signature unknown
    """
    Compare `a` and `b`, two sequences of lines represented as bytes rather
        than str. This is a wrapper for `dfunc`, which is typically either
        unified_diff() or context_diff(). Inputs are losslessly converted to
        strings so that `dfunc` only has to worry about strings, and encoded
        back to bytes on return. This is necessary to compare files with
        unknown or inconsistent encoding. All other inputs (except `n`) must be
        bytes rather than str.
    """
    pass

def get_close_matches(appel, ape=None, apple=None, peach=None, puppy=None): # real signature unknown; restored from __doc__
    """
    Use SequenceMatcher to return list of the best "good enough" matches.
    
        word is a sequence for which close matches are desired (typically a
        string).
    
        possibilities is a list of sequences against which to match word
        (typically a list of strings).
    
        Optional arg n (default 3) is the maximum number of close matches to
        return.  n must be > 0.
    
        Optional arg cutoff (default 0.6) is a float in [0, 1].  Possibilities
        that don't score at least that similar to word are ignored.
    
        The best (no more than n) matches among the possibilities are returned
        in a list, sorted by similarity score, most similar first.
    
        >>> get_close_matches("appel", ["ape", "apple", "peach", "puppy"])
        ['apple', 'ape']
        >>> import keyword as _keyword
        >>> get_close_matches("wheel", _keyword.kwlist)
        ['while']
        >>> get_close_matches("Apple", _keyword.kwlist)
        []
        >>> get_close_matches("accept", _keyword.kwlist)
        ['except']
    """
    pass

def IS_CHARACTER_JUNK(*args, **kwargs): # real signature unknown; NOTE: unreliably restored from __doc__ 
    """
    Return True for ignorable character: iff `ch` is a space or tab.
    
        Examples:
    
        >>> IS_CHARACTER_JUNK(' ')
        True
        >>> IS_CHARACTER_JUNK('\t')
        True
        >>> IS_CHARACTER_JUNK('\n')
        False
        >>> IS_CHARACTER_JUNK('x')
        False
    """
    pass

def IS_LINE_JUNK(*args, **kwargs): # real signature unknown; NOTE: unreliably restored from __doc__ 
    """
    Return True for ignorable line: if `line` is blank or contains a single '#'.
    
        Examples:
    
        >>> IS_LINE_JUNK('\n')
        True
        >>> IS_LINE_JUNK('  #   \n')
        True
        >>> IS_LINE_JUNK('hello\n')
        False
    """
    pass

def ndiff(*args, **kwargs): # real signature unknown; NOTE: unreliably restored from __doc__ 
    """
    Compare `a` and `b` (lists of strings); return a `Differ`-style delta.
    
        Optional keyword parameters `linejunk` and `charjunk` are for filter
        functions, or can be None:
    
        - linejunk: A function that should accept a single string argument and
          return true iff the string is junk.  The default is None, and is
          recommended; the underlying SequenceMatcher class has an adaptive
          notion of "noise" lines.
    
        - charjunk: A function that accepts a character (string of length
          1), and returns true iff the character is junk. The default is
          the module-level function IS_CHARACTER_JUNK, which filters out
          whitespace characters (a blank or tab; note: it's a bad idea to
          include newline in this!).
    
        Tools/scripts/ndiff.py is a command-line front-end to this function.
    
        Example:
    
        >>> diff = ndiff('one\ntwo\nthree\n'.splitlines(keepends=True),
        ...              'ore\ntree\nemu\n'.splitlines(keepends=True))
        >>> print(''.join(diff), end="")
        - one
        ?  ^
        + ore
        ?  ^
        - two
        - three
        ?  -
        + tree
        + emu
    """
    pass

def restore(diff, *args, **kwargs): # real signature unknown; NOTE: unreliably restored from __doc__ 
    """
    Generate one of the two sequences that generated a delta.
    
        Given a `delta` produced by `Differ.compare()` or `ndiff()`, extract
        lines originating from file 1 or 2 (parameter `which`), stripping off line
        prefixes.
    
        Examples:
    
        >>> diff = ndiff('one\ntwo\nthree\n'.splitlines(keepends=True),
        ...              'ore\ntree\nemu\n'.splitlines(keepends=True))
        >>> diff = list(diff)
        >>> print(''.join(restore(diff, 1)), end="")
        one
        two
        three
        >>> print(''.join(restore(diff, 2)), end="")
        ore
        tree
        emu
    """
    pass

def unified_diff(one_two_three_four, *args, **kwargs): # real signature unknown; NOTE: unreliably restored from __doc__ 
    """
    Compare two sequences of lines; generate the delta as a unified diff.
    
        Unified diffs are a compact way of showing line changes and a few
        lines of context.  The number of context lines is set by 'n' which
        defaults to three.
    
        By default, the diff control lines (those with ---, +++, or @@) are
        created with a trailing newline.  This is helpful so that inputs
        created from file.readlines() result in diffs that are suitable for
        file.writelines() since both the inputs and outputs have trailing
        newlines.
    
        For inputs that do not have trailing newlines, set the lineterm
        argument to "" so that the output will be uniformly newline free.
    
        The unidiff format normally has a header for filenames and modification
        times.  Any or all of these may be specified using strings for
        'fromfile', 'tofile', 'fromfiledate', and 'tofiledate'.
        The modification times are normally expressed in the ISO 8601 format.
    
        Example:
    
        >>> for line in unified_diff('one two three four'.split(),
        ...             'zero one tree four'.split(), 'Original', 'Current',
        ...             '2005-01-26 23:30:50', '2010-04-02 10:20:52',
        ...             lineterm=''):
        ...     print(line)                 # doctest: +NORMALIZE_WHITESPACE
        --- Original        2005-01-26 23:30:50
        +++ Current         2010-04-02 10:20:52
        @@ -1,4 +1,4 @@
        +zero
         one
        -two
        -three
        +tree
         four
    """
    pass

def _check_types(*args, **kwargs): # real signature unknown
    pass

def _format_range_context(*args, **kwargs): # real signature unknown
    """ Convert range to the "ed" format """
    pass

def _format_range_unified(*args, **kwargs): # real signature unknown
    """ Convert range to the "ed" format """
    pass

def _keep_original_ws(*args, **kwargs): # real signature unknown
    """ Replace whitespace with the original whitespace characters in `s` """
    pass

def _mdiff(*args, **kwargs): # real signature unknown
    """
    Returns generator yielding marked up from/to side by side differences.
    
        Arguments:
        fromlines -- list of text lines to compared to tolines
        tolines -- list of text lines to be compared to fromlines
        context -- number of context lines to display on each side of difference,
                   if None, all from/to text lines will be generated.
        linejunk -- passed on to ndiff (see ndiff documentation)
        charjunk -- passed on to ndiff (see ndiff documentation)
    
        This function returns an iterator which returns a tuple:
        (from line tuple, to line tuple, boolean flag)
    
        from/to line tuple -- (line num, line text)
            line num -- integer or None (to indicate a context separation)
            line text -- original line text with following markers inserted:
                '\0+' -- marks start of added text
                '\0-' -- marks start of deleted text
                '\0^' -- marks start of changed text
                '\1' -- marks end of added/deleted/changed text
    
        boolean flag -- None indicates context separation, True indicates
            either "from" or "to" line contains a change, otherwise False.
    
        This function/iterator was originally developed to generate side by side
        file difference for making HTML pages (see HtmlDiff class for example
        usage).
    
        Note, this function utilizes the ndiff function to generate the side by
        side difference markup.  Optional ndiff arguments may be passed to this
        function and they in turn will be passed to ndiff.
    """
    pass

def _namedtuple(typename, field_names, *, rename=False, defaults=None, module=None): # reliably restored by inspect
    """
    Returns a new subclass of tuple with named fields.
    
    >>> Point = namedtuple('Point', ['x', 'y'])
    >>> Point.__doc__                   # docstring for the new class
    'Point(x, y)'
    >>> p = Point(11, y=22)             # instantiate with positional args or keywords
    >>> p[0] + p[1]                     # indexable like a plain tuple
    33
    >>> x, y = p                        # unpack like a regular tuple
    >>> x, y
    (11, 22)
    >>> p.x + p.y                       # fields also accessible by name
    33
    >>> d = p._asdict()                 # convert to a dictionary
    >>> d['x']
    11
    >>> Point(**d)                      # convert from a dictionary
    Point(x=11, y=22)
    >>> p._replace(x=100)               # _replace() is like str.replace() but targets named fields
    Point(x=100, y=22)
    """
    pass

def _nlargest(n, iterable, key=None): # reliably restored by inspect
    """
    Find the n largest elements in a dataset.
    
    Equivalent to:  sorted(iterable, key=key, reverse=True)[:n]
    """
    pass

def __pyx_unpickle_SequenceMatcher(*args, **kwargs): # real signature unknown
    pass

# classes

class Differ(object):
    """
    Differ is a class for comparing sequences of lines of text, and
        producing human-readable differences or deltas.  Differ uses
        SequenceMatcher both to compare sequences of lines, and to compare
        sequences of characters within similar (near-matching) lines.
    
        Each line of a Differ delta begins with a two-letter code:
    
            '- '    line unique to sequence 1
            '+ '    line unique to sequence 2
            '  '    line common to both sequences
            '? '    line not present in either input sequence
    
        Lines beginning with '? ' attempt to guide the eye to intraline
        differences, and were not present in either input sequence.  These lines
        can be confusing if the sequences contain tab characters.
    
        Note that Differ makes no claim to produce a *minimal* diff.  To the
        contrary, minimal diffs are often counter-intuitive, because they synch
        up anywhere possible, sometimes accidental matches 100 pages apart.
        Restricting synch points to contiguous matches preserves some notion of
        locality, at the occasional cost of producing a longer diff.
    
        Example: Comparing two texts.
    
        First we set up the texts, sequences of individual single-line strings
        ending with newlines (such sequences can also be obtained from the
        `readlines()` method of file-like objects):
    
        >>> text1 = '''  1. Beautiful is better than ugly.
        ...   2. Explicit is better than implicit.
        ...   3. Simple is better than complex.
        ...   4. Complex is better than complicated.
        ... '''.splitlines(keepends=True)
        >>> len(text1)
        4
        >>> text1[0][-1]
        '\n'
        >>> text2 = '''  1. Beautiful is better than ugly.
        ...   3.   Simple is better than complex.
        ...   4. Complicated is better than complex.
        ...   5. Flat is better than nested.
        ... '''.splitlines(keepends=True)
    
        Next we instantiate a Differ object:
    
        >>> d = Differ()
    
        Note that when instantiating a Differ object we may pass functions to
        filter out line and character 'junk'.  See Differ.__init__ for details.
    
        Finally, we compare the two:
    
        >>> result = list(d.compare(text1, text2))
    
        'result' is a list of strings, so let's pretty-print it:
    
        >>> from pprint import pprint as _pprint
        >>> _pprint(result)
        ['    1. Beautiful is better than ugly.\n',
         '-   2. Explicit is better than implicit.\n',
         '-   3. Simple is better than complex.\n',
         '+   3.   Simple is better than complex.\n',
         '?     ++\n',
         '-   4. Complex is better than complicated.\n',
         '?            ^                     ---- ^\n',
         '+   4. Complicated is better than complex.\n',
         '?           ++++ ^                      ^\n',
         '+   5. Flat is better than nested.\n']
    
        As a single multi-line string it looks like this:
    
        >>> print(''.join(result), end="")
            1. Beautiful is better than ugly.
        -   2. Explicit is better than implicit.
        -   3. Simple is better than complex.
        +   3.   Simple is better than complex.
        ?     ++
        -   4. Complex is better than complicated.
        ?            ^                     ---- ^
        +   4. Complicated is better than complex.
        ?           ++++ ^                      ^
        +   5. Flat is better than nested.
    """
    def compare(self, *args, **kwargs): # real signature unknown; NOTE: unreliably restored from __doc__ 
        """
        Compare two sequences of lines; generate the resulting delta.
        
                Each sequence must contain individual single-line strings ending with
                newlines. Such sequences can be obtained from the `readlines()` method
                of file-like objects.  The delta generated also consists of newline-
                terminated strings, ready to be printed as-is via the writelines()
                method of a file-like object.
        
                Example:
        
                >>> print(''.join(Differ().compare('one\ntwo\nthree\n'.splitlines(True),
                ...                                'ore\ntree\nemu\n'.splitlines(True))),
                ...       end="")
                - one
                ?  ^
                + ore
                ?  ^
                - two
                - three
                ?  -
                + tree
                + emu
        """
        pass

    def _dump(self, *args, **kwargs): # real signature unknown
        """ Generate comparison results for a same-tagged range. """
        pass

    def _fancy_helper(self, *args, **kwargs): # real signature unknown
        pass

    def _fancy_replace(self, *args, **kwargs): # real signature unknown; NOTE: unreliably restored from __doc__ 
        """
        When replacing one block of lines with another, search the blocks
                for *similar* lines; the best-matching pair (if any) is used as a
                synch point, and intraline difference marking is done on the
                similar pair. Lots of work, but often worth it.
        
                Example:
        
                >>> d = Differ()
                >>> results = d._fancy_replace(['abcDefghiJkl\n'], 0, 1,
                ...                            ['abcdefGhijkl\n'], 0, 1)
                >>> print(''.join(results), end="")
                - abcDefghiJkl
                ?    ^  ^  ^
                + abcdefGhijkl
                ?    ^  ^  ^
        """
        pass

    def _plain_replace(self, *args, **kwargs): # real signature unknown
        pass

    def _qformat(self, *args, **kwargs): # real signature unknown; NOTE: unreliably restored from __doc__ 
        """
        Format "?" output and deal with tabs.
        
                Example:
        
                >>> d = Differ()
                >>> results = d._qformat('\tabcDefghiJkl\n', '\tabcdefGhijkl\n',
                ...                      '  ^ ^  ^      ', '  ^ ^  ^      ')
                >>> for line in results: print(repr(line))
                ...
                '- \tabcDefghiJkl\n'
                '? \t ^ ^  ^\n'
                '+ \tabcdefGhijkl\n'
                '? \t ^ ^  ^\n'
        """
        pass

    def __init__(self, *args, **kwargs): # real signature unknown
        """
        Construct a text differencer, with optional filters.
        
                The two optional keyword parameters are for filter functions:
        
                - `linejunk`: A function that should accept a single string argument,
                  and return true iff the string is junk. The module-level function
                  `IS_LINE_JUNK` may be used to filter out lines without visible
                  characters, except for at most one splat ('#').  It is recommended
                  to leave linejunk None; the underlying SequenceMatcher class has
                  an adaptive notion of "noise" lines that's better than any static
                  definition the author has ever been able to craft.
        
                - `charjunk`: A function that should accept a string of length 1. The
                  module-level function `IS_CHARACTER_JUNK` may be used to filter out
                  whitespace characters (a blank or tab; **note**: bad idea to include
                  newline in this!).  Use of IS_CHARACTER_JUNK is recommended.
        """
        pass

    __weakref__ = property(lambda self: object(), lambda self, v: None, lambda self: None)  # default
    """list of weak references to the object"""


    __dict__ = None # (!) real value is 'mappingproxy({\'__module__\': \'lxml.html._difflib\', \'__doc__\': \'\\n    Differ is a class for comparing sequences of lines of text, and\\n    producing human-readable differences or deltas.  Differ uses\\n    SequenceMatcher both to compare sequences of lines, and to compare\\n    sequences of characters within similar (near-matching) lines.\\n\\n    Each line of a Differ delta begins with a two-letter code:\\n\\n        \\\'- \\\'    line unique to sequence 1\\n        \\\'+ \\\'    line unique to sequence 2\\n        \\\'  \\\'    line common to both sequences\\n        \\\'? \\\'    line not present in either input sequence\\n\\n    Lines beginning with \\\'? \\\' attempt to guide the eye to intraline\\n    differences, and were not present in either input sequence.  These lines\\n    can be confusing if the sequences contain tab characters.\\n\\n    Note that Differ makes no claim to produce a *minimal* diff.  To the\\n    contrary, minimal diffs are often counter-intuitive, because they synch\\n    up anywhere possible, sometimes accidental matches 100 pages apart.\\n    Restricting synch points to contiguous matches preserves some notion of\\n    locality, at the occasional cost of producing a longer diff.\\n\\n    Example: Comparing two texts.\\n\\n    First we set up the texts, sequences of individual single-line strings\\n    ending with newlines (such sequences can also be obtained from the\\n    `readlines()` method of file-like objects):\\n\\n    >>> text1 = \\\'\\\'\\\'  1. Beautiful is better than ugly.\\n    ...   2. Explicit is better than implicit.\\n    ...   3. Simple is better than complex.\\n    ...   4. Complex is better than complicated.\\n    ... \\\'\\\'\\\'.splitlines(keepends=True)\\n    >>> len(text1)\\n    4\\n    >>> text1[0][-1]\\n    \\\'\\\\n\\\'\\n    >>> text2 = \\\'\\\'\\\'  1. Beautiful is better than ugly.\\n    ...   3.   Simple is better than complex.\\n    ...   4. Complicated is better than complex.\\n    ...   5. Flat is better than nested.\\n    ... \\\'\\\'\\\'.splitlines(keepends=True)\\n\\n    Next we instantiate a Differ object:\\n\\n    >>> d = Differ()\\n\\n    Note that when instantiating a Differ object we may pass functions to\\n    filter out line and character \\\'junk\\\'.  See Differ.__init__ for details.\\n\\n    Finally, we compare the two:\\n\\n    >>> result = list(d.compare(text1, text2))\\n\\n    \\\'result\\\' is a list of strings, so let\\\'s pretty-print it:\\n\\n    >>> from pprint import pprint as _pprint\\n    >>> _pprint(result)\\n    [\\\'    1. Beautiful is better than ugly.\\\\n\\\',\\n     \\\'-   2. Explicit is better than implicit.\\\\n\\\',\\n     \\\'-   3. Simple is better than complex.\\\\n\\\',\\n     \\\'+   3.   Simple is better than complex.\\\\n\\\',\\n     \\\'?     ++\\\\n\\\',\\n     \\\'-   4. Complex is better than complicated.\\\\n\\\',\\n     \\\'?            ^                     ---- ^\\\\n\\\',\\n     \\\'+   4. Complicated is better than complex.\\\\n\\\',\\n     \\\'?           ++++ ^                      ^\\\\n\\\',\\n     \\\'+   5. Flat is better than nested.\\\\n\\\']\\n\\n    As a single multi-line string it looks like this:\\n\\n    >>> print(\\\'\\\'.join(result), end="")\\n        1. Beautiful is better than ugly.\\n    -   2. Explicit is better than implicit.\\n    -   3. Simple is better than complex.\\n    +   3.   Simple is better than complex.\\n    ?     ++\\n    -   4. Complex is better than complicated.\\n    ?            ^                     ---- ^\\n    +   4. Complicated is better than complex.\\n    ?           ++++ ^                      ^\\n    +   5. Flat is better than nested.\\n    \', \'__init__\': <cyfunction Differ.__init__ at 0x000001A68E755600>, \'compare\': <cyfunction Differ.compare at 0x000001A68E7556C0>, \'_dump\': <cyfunction Differ._dump at 0x000001A68E755780>, \'_plain_replace\': <cyfunction Differ._plain_replace at 0x000001A68E755840>, \'_fancy_replace\': <cyfunction Differ._fancy_replace at 0x000001A68E755900>, \'_fancy_helper\': <cyfunction Differ._fancy_helper at 0x000001A68E7559C0>, \'_qformat\': <cyfunction Differ._qformat at 0x000001A68E755A80>, \'__dict__\': <attribute \'__dict__\' of \'Differ\' objects>, \'__weakref__\': <attribute \'__weakref__\' of \'Differ\' objects>})'


class GenericAlias(object):
    """
    Represent a PEP 585 generic type
    
    E.g. for t = list[int], t.__origin__ is list and t.__args__ is (int,).
    """
    def __call__(self, *args, **kwargs): # real signature unknown
        """ Call self as a function. """
        pass

    def __dir__(self, *args, **kwargs): # real signature unknown
        pass

    def __eq__(self, *args, **kwargs): # real signature unknown
        """ Return self==value. """
        pass

    def __getattribute__(self, *args, **kwargs): # real signature unknown
        """ Return getattr(self, name). """
        pass

    def __getitem__(self, *args, **kwargs): # real signature unknown
        """ Return self[key]. """
        pass

    def __ge__(self, *args, **kwargs): # real signature unknown
        """ Return self>=value. """
        pass

    def __gt__(self, *args, **kwargs): # real signature unknown
        """ Return self>value. """
        pass

    def __hash__(self, *args, **kwargs): # real signature unknown
        """ Return hash(self). """
        pass

    def __init__(self, *args, **kwargs): # real signature unknown
        pass

    def __instancecheck__(self, *args, **kwargs): # real signature unknown
        pass

    def __iter__(self, *args, **kwargs): # real signature unknown
        """ Implement iter(self). """
        pass

    def __le__(self, *args, **kwargs): # real signature unknown
        """ Return self<=value. """
        pass

    def __lt__(self, *args, **kwargs): # real signature unknown
        """ Return self<value. """
        pass

    def __mro_entries__(self, *args, **kwargs): # real signature unknown
        pass

    @staticmethod # known case of __new__
    def __new__(*args, **kwargs): # real signature unknown
        """ Create and return a new object.  See help(type) for accurate signature. """
        pass

    def __ne__(self, *args, **kwargs): # real signature unknown
        """ Return self!=value. """
        pass

    def __or__(self, *args, **kwargs): # real signature unknown
        """ Return self|value. """
        pass

    def __reduce__(self, *args, **kwargs): # real signature unknown
        pass

    def __repr__(self, *args, **kwargs): # real signature unknown
        """ Return repr(self). """
        pass

    def __ror__(self, *args, **kwargs): # real signature unknown
        """ Return value|self. """
        pass

    def __subclasscheck__(self, *args, **kwargs): # real signature unknown
        pass

    __args__ = property(lambda self: object(), lambda self, v: None, lambda self: None)  # default

    __origin__ = property(lambda self: object(), lambda self, v: None, lambda self: None)  # default

    __parameters__ = property(lambda self: object(), lambda self, v: None, lambda self: None)  # default
    """Type variables in the GenericAlias."""

    __typing_unpacked_tuple_args__ = property(lambda self: object(), lambda self, v: None, lambda self: None)  # default

    __unpacked__ = property(lambda self: object(), lambda self, v: None, lambda self: None)  # default



class HtmlDiff(object):
    """
    For producing HTML side by side comparison with change highlights.
    
        This class can be used to create an HTML table (or a complete HTML file
        containing the table) showing a side by side, line by line comparison
        of text with inter-line and intra-line change highlights.  The table can
        be generated in either full or contextual difference mode.
    
        The following methods are provided for HTML generation:
    
        make_table -- generates HTML for a single side by side table
        make_file -- generates complete HTML file with a single side by side table
    
        See Doc/includes/diff.py for an example usage of this class.
    """
    def make_file(self, *args, **kwargs): # real signature unknown
        """
        Returns HTML file of side by side comparison with change highlights
        
                Arguments:
                fromlines -- list of "from" lines
                tolines -- list of "to" lines
                fromdesc -- "from" file column header string
                todesc -- "to" file column header string
                context -- set to True for contextual differences (defaults to False
                    which shows full differences).
                numlines -- number of context lines.  When context is set True,
                    controls number of lines displayed before and after the change.
                    When context is False, controls the number of lines to place
                    the "next" link anchors before the next change (so click of
                    "next" link jumps to just before the change).
                charset -- charset of the HTML document
        """
        pass

    def make_table(self, *args, **kwargs): # real signature unknown
        """
        Returns HTML table of side by side comparison with change highlights
        
                Arguments:
                fromlines -- list of "from" lines
                tolines -- list of "to" lines
                fromdesc -- "from" file column header string
                todesc -- "to" file column header string
                context -- set to True for contextual differences (defaults to False
                    which shows full differences).
                numlines -- number of context lines.  When context is set True,
                    controls number of lines displayed before and after the change.
                    When context is False, controls the number of lines to place
                    the "next" link anchors before the next change (so click of
                    "next" link jumps to just before the change).
        """
        pass

    def _collect_lines(self, *args, **kwargs): # real signature unknown
        """
        Collects mdiff output into separate lists
        
                Before storing the mdiff from/to data into a list, it is converted
                into a single line of text with HTML markup.
        """
        pass

    def _convert_flags(self, *args, **kwargs): # real signature unknown
        """ Makes list of "next" links """
        pass

    def _format_line(self, *args, **kwargs): # real signature unknown
        """
        Returns HTML markup of "from" / "to" text lines
        
                side -- 0 or 1 indicating "from" or "to" text
                flag -- indicates if difference on line
                linenum -- line number (used for line number column)
                text -- line text to be marked up
        """
        pass

    def _line_wrapper(self, *args, **kwargs): # real signature unknown
        """ Returns iterator that splits (wraps) mdiff text lines """
        pass

    def _make_prefix(self, *args, **kwargs): # real signature unknown
        """ Create unique anchor prefixes """
        pass

    def _split_line(self, *args, **kwargs): # real signature unknown
        """
        Builds list of text lines by splitting text lines at wrap point
        
                This function will determine if the input text line needs to be
                wrapped (split) into separate lines.  If so, the first wrap point
                will be determined and the first line appended to the output
                text line list.  This function is used recursively to handle
                the second part of the split line to further split it.
        """
        pass

    def _tab_newline_replace(self, *args, **kwargs): # real signature unknown
        """
        Returns from/to line lists with tabs expanded and newlines removed.
        
                Instead of tab characters being replaced by the number of spaces
                needed to fill in to the next tab stop, this function will fill
                the space with tab characters.  This is done so that the difference
                algorithms can identify changes in a file when tabs are replaced by
                spaces and vice versa.  At the end of the HTML generation, the tab
                characters will be replaced with a nonbreakable space.
        """
        pass

    def __init__(self): # real signature unknown; restored from __doc__
        """
        HtmlDiff instance initializer
        
                Arguments:
                tabsize -- tab stop spacing, defaults to 8.
                wrapcolumn -- column number where lines are broken and wrapped,
                    defaults to None where lines are not wrapped.
                linejunk,charjunk -- keyword arguments passed into ndiff() (used by
                    HtmlDiff() to generate the side by side HTML differences).  See
                    ndiff() documentation for argument default values and descriptions.
        """
        pass

    __weakref__ = property(lambda self: object(), lambda self, v: None, lambda self: None)  # default
    """list of weak references to the object"""


    _default_prefix = 0
    _file_template = '\n<!DOCTYPE html>\n<html lang="en">\n<head>\n    <meta charset="%(charset)s">\n    <meta name="viewport" content="width=device-width, initial-scale=1">\n    <title>Diff comparison</title>\n    <style>%(styles)s\n    </style>\n</head>\n\n<body>\n    %(table)s%(legend)s\n</body>\n\n</html>'
    _legend = '\n    <table class="diff" summary="Legends">\n        <tr> <th colspan="2"> Legends </th> </tr>\n        <tr> <td> <table border="" summary="Colors">\n                      <tr><th> Colors </th> </tr>\n                      <tr><td class="diff_add">&nbsp;Added&nbsp;</td></tr>\n                      <tr><td class="diff_chg">Changed</td> </tr>\n                      <tr><td class="diff_sub">Deleted</td> </tr>\n                  </table></td>\n             <td> <table border="" summary="Links">\n                      <tr><th colspan="2"> Links </th> </tr>\n                      <tr><td>(f)irst change</td> </tr>\n                      <tr><td>(n)ext change</td> </tr>\n                      <tr><td>(t)op</td> </tr>\n                  </table></td> </tr>\n    </table>'
    _styles = '\n        :root {color-scheme: light dark}\n        table.diff {\n            font-family: Menlo, Consolas, Monaco, Liberation Mono, Lucida Console, monospace;\n            border: medium;\n        }\n        .diff_header {\n            background-color: #e0e0e0;\n            font-weight: bold;\n        }\n        td.diff_header {\n            text-align: right;\n            padding: 0 8px;\n        }\n        .diff_next {\n            background-color: #c0c0c0;\n            padding: 4px 0;\n        }\n        .diff_add {background-color:palegreen}\n        .diff_chg {background-color:#ffff77}\n        .diff_sub {background-color:#ffaaaa}\n        table.diff[summary="Legends"] {\n            margin-top: 20px;\n            border: 1px solid #ccc;\n        }\n        table.diff[summary="Legends"] th {\n            background-color: #e0e0e0;\n            padding: 4px 8px;\n        }\n        table.diff[summary="Legends"] td {\n            padding: 4px 8px;\n        }\n\n        @media (prefers-color-scheme: dark) {\n            .diff_header {background-color:#666}\n            .diff_next {background-color:#393939}\n            .diff_add {background-color:darkgreen}\n            .diff_chg {background-color:#847415}\n            .diff_sub {background-color:darkred}\n            table.diff[summary="Legends"] {border-color:#555}\n            table.diff[summary="Legends"] th{background-color:#666}\n        }'
    _table_template = '\n    <table class="diff" id="difflib_chg_%(prefix)s_top"\n           cellspacing="0" cellpadding="0" rules="groups" >\n        <colgroup></colgroup> <colgroup></colgroup> <colgroup></colgroup>\n        <colgroup></colgroup> <colgroup></colgroup> <colgroup></colgroup>\n        %(header_row)s\n        <tbody>\n%(data_rows)s        </tbody>\n    </table>'
    __dict__ = None # (!) real value is 'mappingproxy({\'__module__\': \'lxml.html._difflib\', \'__doc__\': \'For producing HTML side by side comparison with change highlights.\\n\\n    This class can be used to create an HTML table (or a complete HTML file\\n    containing the table) showing a side by side, line by line comparison\\n    of text with inter-line and intra-line change highlights.  The table can\\n    be generated in either full or contextual difference mode.\\n\\n    The following methods are provided for HTML generation:\\n\\n    make_table -- generates HTML for a single side by side table\\n    make_file -- generates complete HTML file with a single side by side table\\n\\n    See Doc/includes/diff.py for an example usage of this class.\\n    \', \'_file_template\': \'\\n<!DOCTYPE html>\\n<html lang="en">\\n<head>\\n    <meta charset="%(charset)s">\\n    <meta name="viewport" content="width=device-width, initial-scale=1">\\n    <title>Diff comparison</title>\\n    <style>%(styles)s\\n    </style>\\n</head>\\n\\n<body>\\n    %(table)s%(legend)s\\n</body>\\n\\n</html>\', \'_styles\': \'\\n        :root {color-scheme: light dark}\\n        table.diff {\\n            font-family: Menlo, Consolas, Monaco, Liberation Mono, Lucida Console, monospace;\\n            border: medium;\\n        }\\n        .diff_header {\\n            background-color: #e0e0e0;\\n            font-weight: bold;\\n        }\\n        td.diff_header {\\n            text-align: right;\\n            padding: 0 8px;\\n        }\\n        .diff_next {\\n            background-color: #c0c0c0;\\n            padding: 4px 0;\\n        }\\n        .diff_add {background-color:palegreen}\\n        .diff_chg {background-color:#ffff77}\\n        .diff_sub {background-color:#ffaaaa}\\n        table.diff[summary="Legends"] {\\n            margin-top: 20px;\\n            border: 1px solid #ccc;\\n        }\\n        table.diff[summary="Legends"] th {\\n            background-color: #e0e0e0;\\n            padding: 4px 8px;\\n        }\\n        table.diff[summary="Legends"] td {\\n            padding: 4px 8px;\\n        }\\n\\n        @media (prefers-color-scheme: dark) {\\n            .diff_header {background-color:#666}\\n            .diff_next {background-color:#393939}\\n            .diff_add {background-color:darkgreen}\\n            .diff_chg {background-color:#847415}\\n            .diff_sub {background-color:darkred}\\n            table.diff[summary="Legends"] {border-color:#555}\\n            table.diff[summary="Legends"] th{background-color:#666}\\n        }\', \'_table_template\': \'\\n    <table class="diff" id="difflib_chg_%(prefix)s_top"\\n           cellspacing="0" cellpadding="0" rules="groups" >\\n        <colgroup></colgroup> <colgroup></colgroup> <colgroup></colgroup>\\n        <colgroup></colgroup> <colgroup></colgroup> <colgroup></colgroup>\\n        %(header_row)s\\n        <tbody>\\n%(data_rows)s        </tbody>\\n    </table>\', \'_legend\': \'\\n    <table class="diff" summary="Legends">\\n        <tr> <th colspan="2"> Legends </th> </tr>\\n        <tr> <td> <table border="" summary="Colors">\\n                      <tr><th> Colors </th> </tr>\\n                      <tr><td class="diff_add">&nbsp;Added&nbsp;</td></tr>\\n                      <tr><td class="diff_chg">Changed</td> </tr>\\n                      <tr><td class="diff_sub">Deleted</td> </tr>\\n                  </table></td>\\n             <td> <table border="" summary="Links">\\n                      <tr><th colspan="2"> Links </th> </tr>\\n                      <tr><td>(f)irst change</td> </tr>\\n                      <tr><td>(n)ext change</td> </tr>\\n                      <tr><td>(t)op</td> </tr>\\n                  </table></td> </tr>\\n    </table>\', \'_default_prefix\': 0, \'__init__\': <cyfunction HtmlDiff.__init__ at 0x000001A68E7562C0>, \'make_file\': <cyfunction HtmlDiff.make_file at 0x000001A68E756380>, \'_tab_newline_replace\': <cyfunction HtmlDiff._tab_newline_replace at 0x000001A68E756440>, \'_split_line\': <cyfunction HtmlDiff._split_line at 0x000001A68E756500>, \'_line_wrapper\': <cyfunction HtmlDiff._line_wrapper at 0x000001A68E7565C0>, \'_collect_lines\': <cyfunction HtmlDiff._collect_lines at 0x000001A68E756680>, \'_format_line\': <cyfunction HtmlDiff._format_line at 0x000001A68E756740>, \'_make_prefix\': <cyfunction HtmlDiff._make_prefix at 0x000001A68E756800>, \'_convert_flags\': <cyfunction HtmlDiff._convert_flags at 0x000001A68E7568C0>, \'make_table\': <cyfunction HtmlDiff.make_table at 0x000001A68E756980>, \'__dict__\': <attribute \'__dict__\' of \'HtmlDiff\' objects>, \'__weakref__\': <attribute \'__weakref__\' of \'HtmlDiff\' objects>})'


class Match(tuple):
    """ Match(a, b, size) """
    def _asdict(self): # reliably restored by inspect
        """ Return a new dict which maps field names to their values. """
        pass

    @classmethod
    def _make(cls, *args, **kwargs): # real signature unknown
        """ Make a new Match object from a sequence or iterable """
        pass

    def _replace(self, **kwds): # reliably restored by inspect
        """ Return a new Match object replacing specified fields with new values """
        pass

    def __getnewargs__(self): # reliably restored by inspect
        """ Return self as a plain tuple.  Used by copy and pickle. """
        pass

    def __init__(self, a, b, size): # real signature unknown; restored from __doc__
        pass

    @staticmethod # known case of __new__
    def __new__(_cls, a, b, size): # reliably restored by inspect
        """ Create new instance of Match(a, b, size) """
        pass

    def __replace__(self, **kwds): # reliably restored by inspect
        """ Return a new Match object replacing specified fields with new values """
        pass

    def __repr__(self): # reliably restored by inspect
        """ Return a nicely formatted representation string """
        pass

    a = _tuplegetter(0, 'Alias for field number 0')
    b = _tuplegetter(1, 'Alias for field number 1')
    size = _tuplegetter(2, 'Alias for field number 2')
    _fields = (
        'a',
        'b',
        'size',
    )
    _field_defaults = {}
    __match_args__ = (
        'a',
        'b',
        'size',
    )
    __slots__ = ()


class SequenceMatcher(object):
    """
    SequenceMatcher is a flexible class for comparing pairs of sequences of
        any type, so long as the sequence elements are hashable.  The basic
        algorithm predates, and is a little fancier than, an algorithm
        published in the late 1980's by Ratcliff and Obershelp under the
        hyperbolic name "gestalt pattern matching".  The basic idea is to find
        the longest contiguous matching subsequence that contains no "junk"
        elements (R-O doesn't address junk).  The same idea is then applied
        recursively to the pieces of the sequences to the left and to the right
        of the matching subsequence.  This does not yield minimal edit
        sequences, but does tend to yield matches that "look right" to people.
    
        SequenceMatcher tries to compute a "human-friendly diff" between two
        sequences.  Unlike e.g. UNIX(tm) diff, the fundamental notion is the
        longest *contiguous* & junk-free matching subsequence.  That's what
        catches peoples' eyes.  The Windows(tm) windiff has another interesting
        notion, pairing up elements that appear uniquely in each sequence.
        That, and the method here, appear to yield more intuitive difference
        reports than does diff.  This method appears to be the least vulnerable
        to syncing up on blocks of "junk lines", though (like blank lines in
        ordinary text files, or maybe "<P>" lines in HTML files).  That may be
        because this is the only method of the 3 that has a *concept* of
        "junk" <wink>.
    
        Example, comparing two strings, and considering blanks to be "junk":
    
        >>> s = SequenceMatcher(lambda x: x == " ",
        ...                     "private Thread currentThread;",
        ...                     "private volatile Thread currentThread;")
        >>>
    
        .ratio() returns a float in [0, 1], measuring the "similarity" of the
        sequences.  As a rule of thumb, a .ratio() value over 0.6 means the
        sequences are close matches:
    
        >>> print(round(s.ratio(), 3))
        0.866
        >>>
    
        If you're only interested in where the sequences match,
        .get_matching_blocks() is handy:
    
        >>> for block in s.get_matching_blocks():
        ...     print("a[%d] and b[%d] match for %d elements" % block)
        a[0] and b[0] match for 8 elements
        a[8] and b[17] match for 21 elements
        a[29] and b[38] match for 0 elements
    
        Note that the last tuple returned by .get_matching_blocks() is always a
        dummy, (len(a), len(b), 0), and this is the only case in which the last
        tuple element (number of elements matched) is 0.
    
        If you want to know how to change the first sequence into the second,
        use .get_opcodes():
    
        >>> for opcode in s.get_opcodes():
        ...     print("%6s a[%d:%d] b[%d:%d]" % opcode)
         equal a[0:8] b[0:8]
        insert a[8:8] b[8:17]
         equal a[8:29] b[17:38]
    
        See the Differ class for a fancy human-friendly file differencer, which
        uses SequenceMatcher both to compare sequences of lines, and to compare
        sequences of characters within similar (near-matching) lines.
    
        See also function get_close_matches() in this module, which shows how
        simple code building on SequenceMatcher can be used to do useful work.
    
        Timing:  Basic R-O is cubic time worst case and quadratic time expected
        case.  SequenceMatcher is quadratic time for the worst case and has
        expected-case behavior dependent in a complicated way on how many
        elements the sequences have in common; best case time is linear.
    """
    def get_grouped_opcodes(self): # real signature unknown; restored from __doc__
        """
        Isolate change clusters by eliminating ranges with no changes.
        
                Return a generator of groups with up to n lines of context.
                Each group is in the same format as returned by get_opcodes().
        
                >>> from pprint import pprint
                >>> a = list(map(str, range(1,40)))
                >>> b = a[:]
                >>> b[8:8] = ['i']     # Make an insertion
                >>> b[20] += 'x'       # Make a replacement
                >>> b[23:28] = []      # Make a deletion
                >>> b[30] += 'y'       # Make another replacement
                >>> pprint(list(SequenceMatcher(None,a,b).get_grouped_opcodes()))
                [[('equal', 5, 8, 5, 8), ('insert', 8, 8, 8, 9), ('equal', 8, 11, 9, 12)],
                 [('equal', 16, 19, 17, 20),
                  ('replace', 19, 20, 20, 21),
                  ('equal', 20, 22, 21, 23),
                  ('delete', 22, 27, 23, 23),
                  ('equal', 27, 30, 23, 26)],
                 [('equal', 31, 34, 27, 30),
                  ('replace', 34, 35, 30, 31),
                  ('equal', 35, 38, 31, 34)]]
        """
        pass

    def ratio(self): # real signature unknown; restored from __doc__
        """
        Return a measure of the sequences' similarity (float in [0,1]).
        
                Where T is the total number of elements in both sequences, and
                M is the number of matches, this is 2.0*M / T.
                Note that this is 1 if the sequences are identical, and 0 if
                they have nothing in common.
        
                .ratio() is expensive to compute if you haven't already computed
                .get_matching_blocks() or .get_opcodes(), in which case you may
                want to try .quick_ratio() or .real_quick_ratio() first to get an
                upper bound.
        
                >>> s = SequenceMatcher(None, "abcd", "bcde")
                >>> s.ratio()
                0.75
                >>> s.quick_ratio()
                0.75
                >>> s.real_quick_ratio()
                1.0
        """
        pass

    def set_seq1(self, bcde): # real signature unknown; restored from __doc__
        """
        Set the first sequence to be compared.
        
                The second sequence to be compared is not changed.
        
                >>> s = SequenceMatcher(None, "abcd", "bcde")
                >>> s.ratio()
                0.75
                >>> s.set_seq1("bcde")
                >>> s.ratio()
                1.0
                >>>
        
                SequenceMatcher computes and caches detailed information about the
                second sequence, so if you want to compare one sequence S against
                many sequences, use .set_seq2(S) once and call .set_seq1(x)
                repeatedly for each of the other sequences.
        
                See also set_seqs() and set_seq2().
        """
        pass

    def set_seq2(self, abcd): # real signature unknown; restored from __doc__
        """
        Set the second sequence to be compared.
        
                The first sequence to be compared is not changed.
        
                >>> s = SequenceMatcher(None, "abcd", "bcde")
                >>> s.ratio()
                0.75
                >>> s.set_seq2("abcd")
                >>> s.ratio()
                1.0
                >>>
        
                SequenceMatcher computes and caches detailed information about the
                second sequence, so if you want to compare one sequence S against
                many sequences, use .set_seq2(S) once and call .set_seq1(x)
                repeatedly for each of the other sequences.
        
                See also set_seqs() and set_seq1().
        """
        pass

    def set_seqs(self, abcd, bcde): # real signature unknown; restored from __doc__
        """
        Set the two sequences to be compared.
        
                >>> s = SequenceMatcher()
                >>> s.set_seqs("abcd", "bcde")
                >>> s.ratio()
                0.75
        """
        pass

    def _SequenceMatcher__chain_b(self, *args, **kwargs): # real signature unknown
        pass

    @classmethod
    def __class_getitem__(cls, *args, **kwargs): # real signature unknown
        """
        Represent a PEP 585 generic type
        
        E.g. for t = list[int], t.__origin__ is list and t.__args__ is (int,).
        """
        pass

    def __init__(self, *args, **kwargs): # real signature unknown
        """
        Construct a SequenceMatcher.
        
                Optional arg isjunk is None (the default), or a one-argument
                function that takes a sequence element and returns true iff the
                element is junk.  None is equivalent to passing "lambda x: 0", i.e.
                no elements are considered to be junk.  For example, pass
                    lambda x: x in " \t"
                if you're comparing lines as sequences of characters, and don't
                want to synch up on blanks or hard tabs.
        
                Optional arg a is the first of two sequences to be compared.  By
                default, an empty string.  The elements of a must be hashable.  See
                also .set_seqs() and .set_seq1().
        
                Optional arg b is the second of two sequences to be compared.  By
                default, an empty string.  The elements of b must be hashable. See
                also .set_seqs() and .set_seq2().
        
                Optional arg autojunk should be set to False to disable the
                "automatic junk heuristic" that treats popular elements as junk
                (see module documentation for more information).
        """
        pass

    @staticmethod # known case of __new__
    def __new__(*args, **kwargs): # real signature unknown
        """ Create and return a new object.  See help(type) for accurate signature. """
        pass

    def __reduce_cython__(self, *args, **kwargs): # real signature unknown
        pass

    def __reduce__(self, *args, **kwargs): # real signature unknown
        pass

    def __setstate_cython__(self, *args, **kwargs): # real signature unknown
        pass

    def __setstate__(self, *args, **kwargs): # real signature unknown
        pass

    a = property(lambda self: object(), lambda self, v: None, lambda self: None)  # default

    b = property(lambda self: object(), lambda self, v: None, lambda self: None)  # default


    __pyx_vtable__ = None # (!) real value is '<capsule object NULL at 0x000001A68E726250>'


# variables with complex values

__all__ = [
    'get_close_matches',
    'ndiff',
    'restore',
    'SequenceMatcher',
    'Differ',
    'IS_CHARACTER_JUNK',
    'IS_LINE_JUNK',
    'context_diff',
    'unified_diff',
    'diff_bytes',
    'HtmlDiff',
    'Match',
]

__loader__ = None # (!) real value is '<_frozen_importlib_external.ExtensionFileLoader object at 0x000001A68CCF6B50>'

__pyx_capi__ = {
    '_calculate_ratio': None, # (!) real value is '<capsule object "double (Py_ssize_t, Py_ssize_t)" at 0x000001A68E725E90>'
}

__spec__ = None # (!) real value is "ModuleSpec(name='lxml.html._difflib', loader=<_frozen_importlib_external.ExtensionFileLoader object at 0x000001A68CCF6B50>, origin='C:\\\\Programs\\\\Python\\\\Python313\\\\Lib\\\\site-packages\\\\lxml\\\\html\\\\_difflib.cp313-win_amd64.pyd')"

__test__ = {
    'Differ._fancy_replace (line 913)': '\n        When replacing one block of lines with another, search the blocks\n        for *similar* lines; the best-matching pair (if any) is used as a\n        synch point, and intraline difference marking is done on the\n        similar pair. Lots of work, but often worth it.\n\n        Example:\n\n        >>> d = Differ()\n        >>> results = d._fancy_replace([\'abcDefghiJkl\\n\'], 0, 1,\n        ...                            [\'abcdefGhijkl\\n\'], 0, 1)\n        >>> print(\'\'.join(results), end="")\n        - abcDefghiJkl\n        ?    ^  ^  ^\n        + abcdefGhijkl\n        ?    ^  ^  ^\n        ',
    'Differ._qformat (line 1017)': '\n        Format "?" output and deal with tabs.\n\n        Example:\n\n        >>> d = Differ()\n        >>> results = d._qformat(\'\\tabcDefghiJkl\\n\', \'\\tabcdefGhijkl\\n\',\n        ...                      \'  ^ ^  ^      \', \'  ^ ^  ^      \')\n        >>> for line in results: print(repr(line))\n        ...\n        \'- \\tabcDefghiJkl\\n\'\n        \'? \\t ^ ^  ^\\n\'\n        \'+ \\tabcdefGhijkl\\n\'\n        \'? \\t ^ ^  ^\\n\'\n        ',
    'Differ.compare (line 853)': '\n        Compare two sequences of lines; generate the resulting delta.\n\n        Each sequence must contain individual single-line strings ending with\n        newlines. Such sequences can be obtained from the `readlines()` method\n        of file-like objects.  The delta generated also consists of newline-\n        terminated strings, ready to be printed as-is via the writelines()\n        method of a file-like object.\n\n        Example:\n\n        >>> print(\'\'.join(Differ().compare(\'one\\ntwo\\nthree\\n\'.splitlines(True),\n        ...                                \'ore\\ntree\\nemu\\n\'.splitlines(True))),\n        ...       end="")\n        - one\n        ?  ^\n        + ore\n        ?  ^\n        - two\n        - three\n        ?  -\n        + tree\n        + emu\n        ',
    'IS_CHARACTER_JUNK (line 1082)': "\n    Return True for ignorable character: iff `ch` is a space or tab.\n\n    Examples:\n\n    >>> IS_CHARACTER_JUNK(' ')\n    True\n    >>> IS_CHARACTER_JUNK('\\t')\n    True\n    >>> IS_CHARACTER_JUNK('\\n')\n    False\n    >>> IS_CHARACTER_JUNK('x')\n    False\n    ",
    'IS_LINE_JUNK (line 1061)': "\n    Return True for ignorable line: if `line` is blank or contains a single '#'.\n\n    Examples:\n\n    >>> IS_LINE_JUNK('\\n')\n    True\n    >>> IS_LINE_JUNK('  #   \\n')\n    True\n    >>> IS_LINE_JUNK('hello\\n')\n    False\n    ",
    'SequenceMatcher.get_grouped_opcodes (line 564)': " Isolate change clusters by eliminating ranges with no changes.\n\n        Return a generator of groups with up to n lines of context.\n        Each group is in the same format as returned by get_opcodes().\n\n        >>> from pprint import pprint\n        >>> a = list(map(str, range(1,40)))\n        >>> b = a[:]\n        >>> b[8:8] = ['i']     # Make an insertion\n        >>> b[20] += 'x'       # Make a replacement\n        >>> b[23:28] = []      # Make a deletion\n        >>> b[30] += 'y'       # Make another replacement\n        >>> pprint(list(SequenceMatcher(None,a,b).get_grouped_opcodes()))\n        [[('equal', 5, 8, 5, 8), ('insert', 8, 8, 8, 9), ('equal', 8, 11, 9, 12)],\n         [('equal', 16, 19, 17, 20),\n          ('replace', 19, 20, 20, 21),\n          ('equal', 20, 22, 21, 23),\n          ('delete', 22, 27, 23, 23),\n          ('equal', 27, 30, 23, 26)],\n         [('equal', 31, 34, 27, 30),\n          ('replace', 34, 35, 30, 31),\n          ('equal', 35, 38, 31, 34)]]\n        ",
    'SequenceMatcher.ratio (line 614)': 'Return a measure of the sequences\' similarity (float in [0,1]).\n\n        Where T is the total number of elements in both sequences, and\n        M is the number of matches, this is 2.0*M / T.\n        Note that this is 1 if the sequences are identical, and 0 if\n        they have nothing in common.\n\n        .ratio() is expensive to compute if you haven\'t already computed\n        .get_matching_blocks() or .get_opcodes(), in which case you may\n        want to try .quick_ratio() or .real_quick_ratio() first to get an\n        upper bound.\n\n        >>> s = SequenceMatcher(None, "abcd", "bcde")\n        >>> s.ratio()\n        0.75\n        >>> s.quick_ratio()\n        0.75\n        >>> s.real_quick_ratio()\n        1.0\n        ',
    'SequenceMatcher.set_seq1 (line 215)': 'Set the first sequence to be compared.\n\n        The second sequence to be compared is not changed.\n\n        >>> s = SequenceMatcher(None, "abcd", "bcde")\n        >>> s.ratio()\n        0.75\n        >>> s.set_seq1("bcde")\n        >>> s.ratio()\n        1.0\n        >>>\n\n        SequenceMatcher computes and caches detailed information about the\n        second sequence, so if you want to compare one sequence S against\n        many sequences, use .set_seq2(S) once and call .set_seq1(x)\n        repeatedly for each of the other sequences.\n\n        See also set_seqs() and set_seq2().\n        ',
    'SequenceMatcher.set_seq2 (line 241)': 'Set the second sequence to be compared.\n\n        The first sequence to be compared is not changed.\n\n        >>> s = SequenceMatcher(None, "abcd", "bcde")\n        >>> s.ratio()\n        0.75\n        >>> s.set_seq2("abcd")\n        >>> s.ratio()\n        1.0\n        >>>\n\n        SequenceMatcher computes and caches detailed information about the\n        second sequence, so if you want to compare one sequence S against\n        many sequences, use .set_seq2(S) once and call .set_seq1(x)\n        repeatedly for each of the other sequences.\n\n        See also set_seqs() and set_seq1().\n        ',
    'SequenceMatcher.set_seqs (line 203)': 'Set the two sequences to be compared.\n\n        >>> s = SequenceMatcher()\n        >>> s.set_seqs("abcd", "bcde")\n        >>> s.ratio()\n        0.75\n        ',
    'context_diff (line 1201)': '\n    Compare two sequences of lines; generate the delta as a context diff.\n\n    Context diffs are a compact way of showing line changes and a few\n    lines of context.  The number of context lines is set by \'n\' which\n    defaults to three.\n\n    By default, the diff control lines (those with *** or ---) are\n    created with a trailing newline.  This is helpful so that inputs\n    created from file.readlines() result in diffs that are suitable for\n    file.writelines() since both the inputs and outputs have trailing\n    newlines.\n\n    For inputs that do not have trailing newlines, set the lineterm\n    argument to "" so that the output will be uniformly newline free.\n\n    The context diff format normally has a header for filenames and\n    modification times.  Any or all of these may be specified using\n    strings for \'fromfile\', \'tofile\', \'fromfiledate\', and \'tofiledate\'.\n    The modification times are normally expressed in the ISO 8601 format.\n    If not specified, the strings default to blanks.\n\n    Example:\n\n    >>> print(\'\'.join(context_diff(\'one\\ntwo\\nthree\\nfour\\n\'.splitlines(True),\n    ...       \'zero\\none\\ntree\\nfour\\n\'.splitlines(True), \'Original\', \'Current\')),\n    ...       end="")\n    *** Original\n    --- Current\n    ***************\n    *** 1,4 ****\n      one\n    ! two\n    ! three\n      four\n    --- 1,4 ----\n    + zero\n      one\n    ! tree\n      four\n    ',
    'get_close_matches (line 686)': 'Use SequenceMatcher to return list of the best "good enough" matches.\n\n    word is a sequence for which close matches are desired (typically a\n    string).\n\n    possibilities is a list of sequences against which to match word\n    (typically a list of strings).\n\n    Optional arg n (default 3) is the maximum number of close matches to\n    return.  n must be > 0.\n\n    Optional arg cutoff (default 0.6) is a float in [0, 1].  Possibilities\n    that don\'t score at least that similar to word are ignored.\n\n    The best (no more than n) matches among the possibilities are returned\n    in a list, sorted by similarity score, most similar first.\n\n    >>> get_close_matches("appel", ["ape", "apple", "peach", "puppy"])\n    [\'apple\', \'ape\']\n    >>> import keyword as _keyword\n    >>> get_close_matches("wheel", _keyword.kwlist)\n    [\'while\']\n    >>> get_close_matches("Apple", _keyword.kwlist)\n    []\n    >>> get_close_matches("accept", _keyword.kwlist)\n    [\'except\']\n    ',
    'ndiff (line 1330)': '\n    Compare `a` and `b` (lists of strings); return a `Differ`-style delta.\n\n    Optional keyword parameters `linejunk` and `charjunk` are for filter\n    functions, or can be None:\n\n    - linejunk: A function that should accept a single string argument and\n      return true iff the string is junk.  The default is None, and is\n      recommended; the underlying SequenceMatcher class has an adaptive\n      notion of "noise" lines.\n\n    - charjunk: A function that accepts a character (string of length\n      1), and returns true iff the character is junk. The default is\n      the module-level function IS_CHARACTER_JUNK, which filters out\n      whitespace characters (a blank or tab; note: it\'s a bad idea to\n      include newline in this!).\n\n    Tools/scripts/ndiff.py is a command-line front-end to this function.\n\n    Example:\n\n    >>> diff = ndiff(\'one\\ntwo\\nthree\\n\'.splitlines(keepends=True),\n    ...              \'ore\\ntree\\nemu\\n\'.splitlines(keepends=True))\n    >>> print(\'\'.join(diff), end="")\n    - one\n    ?  ^\n    + ore\n    ?  ^\n    - two\n    - three\n    ?  -\n    + tree\n    + emu\n    ',
    'restore (line 2076)': '\n    Generate one of the two sequences that generated a delta.\n\n    Given a `delta` produced by `Differ.compare()` or `ndiff()`, extract\n    lines originating from file 1 or 2 (parameter `which`), stripping off line\n    prefixes.\n\n    Examples:\n\n    >>> diff = ndiff(\'one\\ntwo\\nthree\\n\'.splitlines(keepends=True),\n    ...              \'ore\\ntree\\nemu\\n\'.splitlines(keepends=True))\n    >>> diff = list(diff)\n    >>> print(\'\'.join(restore(diff, 1)), end="")\n    one\n    two\n    three\n    >>> print(\'\'.join(restore(diff, 2)), end="")\n    ore\n    tree\n    emu\n    ',
    'unified_diff (line 1116)': '\n    Compare two sequences of lines; generate the delta as a unified diff.\n\n    Unified diffs are a compact way of showing line changes and a few\n    lines of context.  The number of context lines is set by \'n\' which\n    defaults to three.\n\n    By default, the diff control lines (those with ---, +++, or @@) are\n    created with a trailing newline.  This is helpful so that inputs\n    created from file.readlines() result in diffs that are suitable for\n    file.writelines() since both the inputs and outputs have trailing\n    newlines.\n\n    For inputs that do not have trailing newlines, set the lineterm\n    argument to "" so that the output will be uniformly newline free.\n\n    The unidiff format normally has a header for filenames and modification\n    times.  Any or all of these may be specified using strings for\n    \'fromfile\', \'tofile\', \'fromfiledate\', and \'tofiledate\'.\n    The modification times are normally expressed in the ISO 8601 format.\n\n    Example:\n\n    >>> for line in unified_diff(\'one two three four\'.split(),\n    ...             \'zero one tree four\'.split(), \'Original\', \'Current\',\n    ...             \'2005-01-26 23:30:50\', \'2010-04-02 10:20:52\',\n    ...             lineterm=\'\'):\n    ...     print(line)                 # doctest: +NORMALIZE_WHITESPACE\n    --- Original        2005-01-26 23:30:50\n    +++ Current         2010-04-02 10:20:52\n    @@ -1,4 +1,4 @@\n    +zero\n     one\n    -two\n    -three\n    +tree\n     four\n    ',
}

