o
    5‘ðiS£  ã                   @   sN  d Z ddlZddlmZmZ ddlmZ ddlmZ ddl	m
Z
mZmZ ddlmZmZ ddlmZmZmZmZmZmZmZmZmZmZmZmZmZmZ dd	lm Z m!Z!m"Z"m#Z# dd
l$m%Z%m&Z&m'Z'm(Z(m)Z) ddlm*Z*m+Z+m,Z, ddl-m.Z. g d¢Z/e0ƒ Z1ze2dd� W n e3y�   e2Z4Y nw ee2dd�Z4zddlm5Z6 W n e7y«   dd„ Z6Y nw z
ddlm8Z8m9Z9 W n e7yÁ   dZ:Y nw dZ:dd„ Z;dždd„Z<dd„ Z=dŸdd„Z>dŸdd„Z?dŸdd „Z@eAfd!d"„ZBd#d$„ ZCeCZDd%d&„ ZEd'd(„ ZFd)d*„ ZGdŸd+d,„ZHd-d.„ ZIzdd/lmJZK W n e7�y   eIZJY n	w d0d1„ ZJeIj eJ_ G d2d3„ d3eLƒZMd4d5„ ZNd6d7„ ZOd d9d:„ZPd;d<„ ZQd=d>„ ZRd?d@„ ZSdŸdAdB„ZTdŸdCdD„ZUd¡dEdF„ZVdŸdGdH„ZWd¢dIdJ„ZXdKdLœdMdN„ZYdŸdOdP„ZZdQdR„ Z[dSdT„ Z\dUdV„ Z]dWdX„ Z^dYdZ„ Z_d[d\„ Z`d]d^„ Zad_d`„ Zbdadb„ Zcdcdd„ Zddedf„ Zedgdh„ Zfd£didj„Zgdkdl„ Zhddœdmdn„Zie.dok�r»ddplmjZk ddœdqdr„Zjeij ej_ neiZjdsdt„ Zlemenffdudv„Zodwdx„ Zpdydz„ Zqd{d|„ Zrd}d~„ ZsetehdƒƒZud€d�„ Zvd‚dƒ„ Zwd„d…„ Zxd†d‡„ Zydˆd‰„ Zzg dŠ¢Z{e
d‹dŒ„ ƒZ|d�dŽ„ Z}e ~¡ j*Zd�d�„ Z€d‘d’„ Z�d“d”„ Z‚d•d–„ Zƒd—d˜„ Z„d™dš„ Z…dd›œdœd�„Z†dS )¤a  Imported from the recipes section of the itertools documentation.

All functions taken from the recipes section of the itertools library docs
[1]_.
Some backward-compatible usability improvements have been made.

.. [1] http://docs.python.org/library/itertools.html#recipes

é    N)Úbisect_leftÚinsort)Údeque©Úsuppress)Ú	lru_cacheÚpartialÚreduce)ÚheappushÚheappushpop)Ú
accumulateÚchainÚcombinationsÚcompressÚcountÚcycleÚgroupbyÚisliceÚproductÚrepeatÚstarmapÚ	takewhileÚteeÚzip_longest)ÚprodÚcombÚisqrtÚgcd)ÚmulÚnot_Ú
itemgetterÚgetitemÚindex)Ú	randrangeÚsampleÚchoice)Ú
hexversion)2Ú	all_equalÚbatchedÚbefore_and_afterÚconsumeÚconvolveÚ
dotproductÚ
first_trueÚfactorÚflattenÚgrouperÚis_primeÚiter_exceptÚ
iter_indexÚloopsÚmatmulÚmultinomialÚncyclesÚnthÚnth_combinationÚpadnoneÚpad_noneÚpairwiseÚ	partitionÚpolynomial_evalÚpolynomial_from_rootsÚpolynomial_derivativeÚpowersetÚprependÚquantifyÚreshapeÚ#random_combination_with_replacementÚrandom_combinationÚrandom_permutationÚrandom_productÚ
repeatfuncÚ
roundrobinÚrunning_medianÚsieveÚsliding_windowÚ	subslicesÚsum_of_squaresÚtabulateÚtailÚtakeÚtotientÚ	transposeÚ
triplewiseÚuniqueÚunique_everseenÚunique_justseenT©Ústrict)Úsumprodc                 C   s
   t | |ƒS ©N)r,   )ÚxÚy© r_   úh/root/parts/websockify/install/lib/python3.10/site-packages/setuptools/_vendor/more_itertools/recipes.pyÚ<lambda>l   s   
 ra   )Úheappush_maxÚheappushpop_maxFc                 C   ó   t t|| ƒƒS )zóReturn first *n* items of the *iterable* as a list.

        >>> take(3, range(10))
        [0, 1, 2]

    If there are fewer than *n* items in the iterable, all of them are
    returned.

        >>> take(10, range(3))
        [0, 1, 2]

    )Úlistr   )ÚnÚiterabler_   r_   r`   rR   x   s   rR   c                 C   s   t | t|ƒƒS )a©  Return an iterator over the results of ``func(start)``,
    ``func(start + 1)``, ``func(start + 2)``...

    *func* should be a function that accepts one integer argument.

    If *start* is not specified it defaults to 0. It will be incremented each
    time the iterator is advanced.

        >>> square = lambda x: x ** 2
        >>> iterator = tabulate(square, -3)
        >>> take(4, iterator)
        [9, 4, 1, 0]

    )Úmapr   )ÚfunctionÚstartr_   r_   r`   rP   ˆ   s   rP   c                 C   sF   zt |ƒ}W n ty   tt|| d�ƒ Y S w t|td||  ƒdƒS )zƒReturn an iterator over the last *n* items of *iterable*.

    >>> t = tail(3, 'ABCDEFG')
    >>> list(t)
    ['E', 'F', 'G']

    ©Úmaxlenr   N)ÚlenÚ	TypeErrorÚiterr   r   Úmax)rf   rg   Úsizer_   r_   r`   rQ   š   s   ÿrQ   c                 C   s.   |du rt | dd� dS tt| ||ƒdƒ dS )aX  Advance *iterable* by *n* steps. If *n* is ``None``, consume it
    entirely.

    Efficiently exhausts an iterator without returning values. Defaults to
    consuming the whole iterator, but an optional second argument may be
    provided to limit consumption.

        >>> i = (x for x in range(10))
        >>> next(i)
        0
        >>> consume(i, 3)
        >>> next(i)
        4
        >>> consume(i)
        >>> next(i)
        Traceback (most recent call last):
          File "<stdin>", line 1, in <module>
        StopIteration

    If the iterator has fewer items remaining than the provided limit, the
    whole iterator will be consumed.

        >>> i = (x for x in range(3))
        >>> consume(i, 5)
        >>> next(i)
        Traceback (most recent call last):
          File "<stdin>", line 1, in <module>
        StopIteration

    Nr   rk   )r   Únextr   )Úiteratorrf   r_   r_   r`   r*   ª   s    r*   c                 C   s   t t| |dƒ|ƒS )z…Returns the nth item or a default value.

    >>> l = range(10)
    >>> nth(l, 3)
    3
    >>> nth(l, 20, "zebra")
    'zebra'

    N)rr   r   )rg   rf   Údefaultr_   r_   r`   r8   Ò   s   
r8   c                 C   s,   t | |ƒ}|D ]}|D ]}  dS  dS dS )a§  
    Returns ``True`` if all the elements are equal to each other.

        >>> all_equal('aaaa')
        True
        >>> all_equal('aaab')
        False

    A function that accepts a single argument and returns a transformed version
    of each input item can be specified with *key*:

        >>> all_equal('AaaA', key=str.casefold)
        True
        >>> all_equal([1, 2, 3], key=lambda x: x < 10)
        True

    FT)r   )rg   Úkeyrs   ÚfirstÚsecondr_   r_   r`   r'   ß   s   
r'   c                 C   rd   )zcReturn the how many times the predicate is true.

    >>> quantify([True, False, True])
    2

    )Úsumrh   )rg   Úpredr_   r_   r`   rC   ù   s   rC   c                 C   s   t | tdƒƒS )a   Returns the sequence of elements and then returns ``None`` indefinitely.

        >>> take(5, pad_none(range(3)))
        [0, 1, 2, None, None]

    Useful for emulating the behavior of the built-in :func:`map` function.

    See also :func:`padded`.

    N)r   r   ©rg   r_   r_   r`   r;     s   r;   c                 C   s   t  tt| ƒ|ƒ¡S )zvReturns the sequence elements *n* times

    >>> list(ncycles(["a", "b"], 3))
    ['a', 'b', 'a', 'b', 'a', 'b']

    )r   Úfrom_iterabler   Útuple©rg   rf   r_   r_   r`   r7     s   r7   c                 C   s   t tt| |ƒƒS )zãReturns the dot product of the two iterables.

    >>> dotproduct([10, 15, 12], [0.65, 0.80, 1.25])
    33.5
    >>> 10 * 0.65 + 15 * 0.80 + 12 * 1.25
    33.5

    In Python 3.12 and later, use ``math.sumprod()`` instead.
    )rx   rh   r   )Úvec1Úvec2r_   r_   r`   r,     s   
r,   c                 C   s
   t  | ¡S )zÜReturn an iterator flattening one level of nesting in a list of lists.

        >>> list(flatten([[0, 1], [2, 3]]))
        [0, 1, 2, 3]

    See also :func:`collapse`, which can flatten multiple levels of nesting.

    )r   r{   )ÚlistOfListsr_   r_   r`   r/   +  s   
	r/   c                 G   s&   |du rt | t|ƒƒS t | t||ƒƒS )aG  Call *func* with *args* repeatedly, returning an iterable over the
    results.

    If *times* is specified, the iterable will terminate after that many
    repetitions:

        >>> from operator import add
        >>> times = 4
        >>> args = 3, 5
        >>> list(repeatfunc(add, times, *args))
        [8, 8, 8, 8]

    If *times* is ``None`` the iterable will not terminate:

        >>> from random import randrange
        >>> times = None
        >>> args = 1, 11
        >>> take(6, repeatfunc(randrange, times, *args))  # doctest:+SKIP
        [2, 4, 8, 1, 8, 4]

    N)r   r   )ÚfuncÚtimesÚargsr_   r_   r`   rI   7  s   rI   c                 C   s    t | ƒ\}}t|dƒ t||ƒS )zâReturns an iterator of paired items, overlapping, from the original

    >>> take(4, pairwise(count()))
    [(0, 1), (1, 2), (2, 3), (3, 4)]

    On Python 3.10 and above, this is an alias for :func:`itertools.pairwise`.

    N©r   rr   Úzip)rg   ÚaÚbr_   r_   r`   Ú	_pairwiseR  s   	

rˆ   )r<   c                 C   s   t | ƒS r\   )Úitertools_pairwiserz   r_   r_   r`   r<   f  s   r<   c                       s   e Zd Zd‡ fdd„	Z‡  ZS )ÚUnequalIterablesErrorNc                    s*   d}|d ur|dj |Ž 7 }tƒ  |¡ d S )Nz Iterables have different lengthsz/: index 0 has length {}; index {} has length {})ÚformatÚsuperÚ__init__)ÚselfÚdetailsÚmsg©Ú	__class__r_   r`   r�   m  s   ÿzUnequalIterablesError.__init__r\   )Ú__name__Ú
__module__Ú__qualname__r�   Ú__classcell__r_   r_   r‘   r`   rŠ   l  s    rŠ   c                 c   s8   � t | dtiŽD ]}|D ]	}|tu rtƒ ‚q|V  qd S )NÚ	fillvalue)r   Ú_markerrŠ   )Ú	iterablesÚcomboÚvalr_   r_   r`   Ú_zip_equal_generatorw  s   €ÿürœ   c                  G   sn   z)t | d ƒ}t| dd … dƒD ]\}}t |ƒ}||kr$t|||fd�‚qt| Ž W S  ty6   t| ƒ Y S w )Nr   é   )r�   )rm   Ú	enumeraterŠ   r…   rn   rœ   )r™   Ú
first_sizeÚiÚitrq   r_   r_   r`   Ú
_zip_equal  s   ÿ
ÿr¢   Úfillc                 C   sL   t | ƒg| }|dkrt|d|iŽS |dkrt|Ž S |dkr"t|Ž S tdƒ‚)aÉ  Group elements from *iterable* into fixed-length groups of length *n*.

    >>> list(grouper('ABCDEF', 3))
    [('A', 'B', 'C'), ('D', 'E', 'F')]

    The keyword arguments *incomplete* and *fillvalue* control what happens for
    iterables whose length is not a multiple of *n*.

    When *incomplete* is `'fill'`, the last group will contain instances of
    *fillvalue*.

    >>> list(grouper('ABCDEFG', 3, incomplete='fill', fillvalue='x'))
    [('A', 'B', 'C'), ('D', 'E', 'F'), ('G', 'x', 'x')]

    When *incomplete* is `'ignore'`, the last group will not be emitted.

    >>> list(grouper('ABCDEFG', 3, incomplete='ignore', fillvalue='x'))
    [('A', 'B', 'C'), ('D', 'E', 'F')]

    When *incomplete* is `'strict'`, a subclass of `ValueError` will be raised.

    >>> iterator = grouper('ABCDEFG', 3, incomplete='strict')
    >>> list(iterator)  # doctest: +IGNORE_EXCEPTION_DETAIL
    Traceback (most recent call last):
    ...
    UnequalIterablesError

    r£   r—   rZ   Úignorez Expected fill, strict, or ignore)ro   r   r¢   r…   Ú
ValueError)rg   rf   Ú
incompleter—   Ú	iteratorsr_   r_   r`   r0   �  s   r0   c                  g   sD   � t t| ƒ}tt| ƒddƒD ]}tt||ƒƒ}t t|ƒE dH  qdS )aG  Visit input iterables in a cycle until each is exhausted.

        >>> list(roundrobin('ABC', 'D', 'EF'))
        ['A', 'D', 'E', 'B', 'F', 'C']

    This function produces the same output as :func:`interleave_longest`, but
    may perform better for some inputs (in particular when the number of
    iterables is small).

    r   éÿÿÿÿN)rh   ro   Úrangerm   r   r   rr   )r™   r§   Ú
num_activer_   r_   r`   rJ   ·  s   €
þrJ   c                 C   sH   | du rt } t|dƒ\}}}tt| |ƒƒ\}}t|tt|ƒƒt||ƒfS )a¯  
    Returns a 2-tuple of iterables derived from the input iterable.
    The first yields the items that have ``pred(item) == False``.
    The second yields the items that have ``pred(item) == True``.

        >>> is_odd = lambda x: x % 2 != 0
        >>> iterable = range(10)
        >>> even_items, odd_items = partition(is_odd, iterable)
        >>> list(even_items), list(odd_items)
        ([0, 2, 4, 6, 8], [1, 3, 5, 7, 9])

    If *pred* is None, :func:`bool` is used.

        >>> iterable = [0, 1, False, True, '', ' ']
        >>> false_items, true_items = partition(None, iterable)
        >>> list(false_items), list(true_items)
        ([0, False, ''], [1, True, ' '])

    Né   )Úboolr   rh   r   r   )ry   rg   Út1Út2ÚpÚp1Úp2r_   r_   r`   r=   É  s
   r=   c                    s,   t | ƒ‰ t ‡ fdd„ttˆ ƒd ƒD ƒ¡S )a1  Yields all possible subsets of the iterable.

        >>> list(powerset([1, 2, 3]))
        [(), (1,), (2,), (3,), (1, 2), (1, 3), (2, 3), (1, 2, 3)]

    :func:`powerset` will operate on iterables that aren't :class:`set`
    instances, so repeated elements in the input will produce repeated elements
    in the output.

        >>> seq = [1, 1, 0]
        >>> list(powerset(seq))
        [(), (1,), (1,), (0,), (1, 1), (1, 0), (1, 0), (1, 1, 0)]

    For a variant that efficiently yields actual :class:`set` instances, see
    :func:`powerset_of_sets`.
    c                 3   ó   � | ]}t ˆ |ƒV  qd S r\   )r   )Ú.0Úr©Úsr_   r`   Ú	<genexpr>÷  ó   € zpowerset.<locals>.<genexpr>r�   )re   r   r{   r©   rm   rz   r_   rµ   r`   rA   å  s   $rA   c           	   	   c   s€   � t ƒ }|j}g }|j}|du}| D ]+}|r||ƒn|}z||vr(||ƒ |V  W q ty=   ||vr;||ƒ |V  Y qw dS )a–  
    Yield unique elements, preserving order.

        >>> list(unique_everseen('AAAABBBCCDAABBB'))
        ['A', 'B', 'C', 'D']
        >>> list(unique_everseen('ABBCcAD', str.lower))
        ['A', 'B', 'C', 'D']

    Sequences with a mix of hashable and unhashable items can be used.
    The function will be slower (i.e., `O(n^2)`) for unhashable items.

    Remember that ``list`` objects are unhashable - you can use the *key*
    parameter to transform the list to a tuple (which is hashable) to
    avoid a slowdown.

        >>> iterable = ([1, 2], [2, 3], [1, 2])
        >>> list(unique_everseen(iterable))  # Slow
        [[1, 2], [2, 3]]
        >>> list(unique_everseen(iterable, key=tuple))  # Faster
        [[1, 2], [2, 3]]

    Similarly, you may want to convert unhashable ``set`` objects with
    ``key=frozenset``. For ``dict`` objects,
    ``key=lambda x: frozenset(x.items())`` can be used.

    N)ÚsetÚaddÚappendrn   )	rg   ru   ÚseensetÚseenset_addÚseenlistÚseenlist_addÚuse_keyÚelementÚkr_   r_   r`   rW   ú  s(   €€€ýúrW   c                 C   s4   |du rt tdƒt| ƒƒS t tt tdƒt| |ƒƒƒS )záYields elements in order, ignoring serial duplicates

    >>> list(unique_justseen('AAAABBBCCDAABBB'))
    ['A', 'B', 'C', 'D', 'A', 'B']
    >>> list(unique_justseen('ABBCcAD', str.lower))
    ['A', 'B', 'C', 'A', 'D']

    Nr   r�   )rh   r    r   rr   )rg   ru   r_   r_   r`   rX   '  s   	rX   c                 C   s   t | ||d�}t||d�S )a°  Yields unique elements in sorted order.

    >>> list(unique([[1, 2], [3, 4], [1, 2]]))
    [[1, 2], [3, 4]]

    *key* and *reverse* are passed to :func:`sorted`.

    >>> list(unique('ABBcCAD', str.casefold))
    ['A', 'B', 'c', 'D']
    >>> list(unique('ABBcCAD', str.casefold, reverse=True))
    ['D', 'c', 'B', 'A']

    The elements in *iterable* need not be hashable, but they must be
    comparable for sorting to work.
    )ru   Úreverse)ru   )ÚsortedrX   )rg   ru   rÃ   Ú	sequencedr_   r_   r`   rV   6  s   rV   c                 c   s<   � t |ƒ� |dur|ƒ V  	 | ƒ V  q1 sw   Y  dS )aÙ  Yields results from a function repeatedly until an exception is raised.

    Converts a call-until-exception interface to an iterator interface.
    Like ``iter(func, sentinel)``, but uses an exception instead of a sentinel
    to end the loop.

        >>> l = [0, 1, 2]
        >>> list(iter_except(l.pop, IndexError))
        [2, 1, 0]

    Multiple exceptions can be specified as a stopping condition:

        >>> l = [1, 2, 3, '...', 4, 5, 6]
        >>> list(iter_except(lambda: 1 + l.pop(), (IndexError, TypeError)))
        [7, 6, 5]
        >>> list(iter_except(lambda: 1 + l.pop(), (IndexError, TypeError)))
        [4, 3, 2]
        >>> list(iter_except(lambda: 1 + l.pop(), (IndexError, TypeError)))
        []

    Nr   )r�   Ú	exceptionrv   r_   r_   r`   r2   J  s   €
ÿýr2   c                 C   s   t t|| ƒ|ƒS )a�  
    Returns the first true value in the iterable.

    If no true value is found, returns *default*

    If *pred* is not None, returns the first item for which
    ``pred(item) == True`` .

        >>> first_true(range(10))
        1
        >>> first_true(range(10), pred=lambda x: x > 5)
        6
        >>> first_true(range(10), default='missing', pred=lambda x: x > 9)
        'missing'

    )rr   Úfilter)rg   rt   ry   r_   r_   r`   r-   g  s   r-   r�   ©r   c                 G   s$   dd„ |D ƒ|  }t dd„ |D ƒƒS )aÍ  Draw an item at random from each of the input iterables.

        >>> random_product('abc', range(4), 'XYZ')  # doctest:+SKIP
        ('c', 3, 'Z')

    If *repeat* is provided as a keyword argument, that many items will be
    drawn from each iterable.

        >>> random_product('abcd', range(4), repeat=2)  # doctest:+SKIP
        ('a', 2, 'd', 3)

    This equivalent to taking a random selection from
    ``itertools.product(*args, repeat=repeat)``.

    c                 S   s   g | ]}t |ƒ‘qS r_   ©r|   ©r³   Úpoolr_   r_   r`   Ú
<listcomp>‹  s    z"random_product.<locals>.<listcomp>c                 s   s   � | ]}t |ƒV  qd S r\   )r%   rÊ   r_   r_   r`   r·   Œ  ó   € z!random_product.<locals>.<genexpr>rÉ   )r   rƒ   Úpoolsr_   r_   r`   rH   {  s   rH   c                 C   s*   t | ƒ}|du rt|ƒn|}t t||ƒƒS )ab  Return a random *r* length permutation of the elements in *iterable*.

    If *r* is not specified or is ``None``, then *r* defaults to the length of
    *iterable*.

        >>> random_permutation(range(5))  # doctest:+SKIP
        (3, 4, 0, 1, 2)

    This equivalent to taking a random selection from
    ``itertools.permutations(iterable, r)``.

    N)r|   rm   r$   )rg   r´   rË   r_   r_   r`   rG   �  s   rG   c                    s8   t | ƒ‰ tˆ ƒ}ttt|ƒ|ƒƒ}t ‡ fdd„|D ƒƒS )zÿReturn a random *r* length subsequence of the elements in *iterable*.

        >>> random_combination(range(5), 3)  # doctest:+SKIP
        (2, 3, 4)

    This equivalent to taking a random selection from
    ``itertools.combinations(iterable, r)``.

    c                 3   ó   � | ]}ˆ | V  qd S r\   r_   ©r³   r    ©rË   r_   r`   r·   ®  rÍ   z%random_combination.<locals>.<genexpr>)r|   rm   rÄ   r$   r©   )rg   r´   rf   Úindicesr_   rÑ   r`   rF   ¡  s   
rF   c                    s@   t | ƒ‰tˆƒ‰ t‡ fdd„t|ƒD ƒƒ}t ‡fdd„|D ƒƒS )aS  Return a random *r* length subsequence of elements in *iterable*,
    allowing individual elements to be repeated.

        >>> random_combination_with_replacement(range(3), 5) # doctest:+SKIP
        (0, 0, 1, 2, 2)

    This equivalent to taking a random selection from
    ``itertools.combinations_with_replacement(iterable, r)``.

    c                 3   s   � | ]}t ˆ ƒV  qd S r\   )r#   rÐ   ©rf   r_   r`   r·   ¾  rÍ   z6random_combination_with_replacement.<locals>.<genexpr>c                 3   rÏ   r\   r_   rÐ   rÑ   r_   r`   r·   ¿  rÍ   )r|   rm   rÄ   r©   )rg   r´   rÒ   r_   )rf   rË   r`   rE   ±  s   rE   c           	      C   sú   t | ƒ}t|ƒ}|dk s||krt‚d}t||| ƒ}td|d ƒD ]}||| |  | }q"|dk r7||7 }|dk s?||krAt‚g }|ry|| | |d |d }}}||krn||8 }|||  | |d }}||ksY| |d|  ¡ |sEt |ƒS )a  Equivalent to ``list(combinations(iterable, r))[index]``.

    The subsequences of *iterable* that are of length *r* can be ordered
    lexicographically. :func:`nth_combination` computes the subsequence at
    sort position *index* directly, without computing the previous
    subsequences.

        >>> nth_combination(range(5), 3, 5)
        (0, 3, 4)

    ``ValueError`` will be raised If *r* is negative or greater than the length
    of *iterable*.
    ``IndexError`` will be raised if the given *index* is invalid.
    r   r�   r¨   )r|   rm   r¥   Úminr©   Ú
IndexErrorr»   )	rg   r´   r"   rË   rf   ÚcrÂ   r    Úresultr_   r_   r`   r9   Â  s,    þûr9   c                 C   s   t | g|ƒS )a  Yield *value*, followed by the elements in *iterator*.

        >>> value = '0'
        >>> iterator = ['1', '2', '3']
        >>> list(prepend(value, iterator))
        ['0', '1', '2', '3']

    To prepend multiple values, see :func:`itertools.chain`
    or :func:`value_chain`.

    )r   )Úvaluers   r_   r_   r`   rB   ì  s   rB   c                 c   sb   � t |ƒddd… }t|ƒ}tdg|d�| }t| td|d ƒƒD ]}| |¡ t||ƒV  q!dS )u}  Discrete linear convolution of two iterables.
    Equivalent to polynomial multiplication.

    For example, multiplying ``(xÂ² -x - 20)`` by ``(x - 3)``
    gives ``(xÂ³ -4xÂ² -17x + 60)``.

        >>> list(convolve([1, -1, -20], [1, -3]))
        [1, -4, -17, 60]

    Examples of popular kinds of kernels:

    * The kernel ``[0.25, 0.25, 0.25, 0.25]`` computes a moving average.
      For image data, this blurs the image and reduces noise.
    * The kernel ``[1/2, 0, -1/2]`` estimates the first derivative of
      a function evaluated at evenly spaced inputs.
    * The kernel ``[1, -2, 1]`` estimates the second derivative of a
      function evaluated at evenly spaced inputs.

    Convolutions are mathematically commutative; however, the inputs are
    evaluated differently.  The signal is consumed lazily and can be
    infinite. The kernel is fully consumed before the calculations begin.

    Supports all numeric types: int, float, complex, Decimal, Fraction.

    References:

    * Article:  https://betterexplained.com/articles/intuitive-convolution/
    * Video by 3Blue1Brown:  https://www.youtube.com/watch?v=KuXjwB4LzSA

    Nr¨   r   rk   r�   )r|   rm   r   r   r   r»   Ú_sumprod)ÚsignalÚkernelrf   Úwindowr]   r_   r_   r`   r+   û  s   €#
þr+   c                 C   s(   t |ƒ\}}tt| |ƒt|ƒƒ}||fS )aÆ  A variant of :func:`takewhile` that allows complete access to the
    remainder of the iterator.

         >>> it = iter('ABCdEfGhI')
         >>> all_upper, remainder = before_and_after(str.isupper, it)
         >>> ''.join(all_upper)
         'ABC'
         >>> ''.join(remainder) # takewhile() would lose the 'd'
         'dEfGhI'

    Note that the first iterator must be fully consumed before the second
    iterator can generate valid results.
    )r   r   r   r…   )Ú	predicater¡   ÚtruesÚafterr_   r_   r`   r)   &  s   r)   c                 C   s:   t | dƒ\}}}t|dƒ t|dƒ t|dƒ t|||ƒS )z�Return overlapping triplets from *iterable*.

    >>> list(triplewise('ABCDE'))
    [('A', 'B', 'C'), ('B', 'C', 'D'), ('C', 'D', 'E')]

    r«   Nr„   )rg   r­   r®   Út3r_   r_   r`   rU   9  s
   	


rU   c                 C   s6   t | |ƒ}t|ƒD ]\}}tt|||ƒd ƒ q	t|Ž S r\   )r   rž   rr   r   r…   )rg   rf   r§   r    rs   r_   r_   r`   Ú_sliding_window_isliceI  s   
rá   c                 c   sB   � t | ƒ}tt||d ƒ|d�}|D ]}| |¡ t|ƒV  qd S )Nr�   rk   )ro   r   r   r»   r|   )rg   rf   rs   rÜ   r]   r_   r_   r`   Ú_sliding_window_dequeQ  s   €
þrâ   c                 C   sR   |dkr	t | |ƒS |dkrt| |ƒS |dkrt| ƒS |dkr"t| ƒS td|› �ƒ‚)aY  Return a sliding window of width *n* over *iterable*.

        >>> list(sliding_window(range(6), 4))
        [(0, 1, 2, 3), (1, 2, 3, 4), (2, 3, 4, 5)]

    If *iterable* has fewer than *n* items, then nothing is yielded:

        >>> list(sliding_window(range(3), 4))
        []

    For a variant with more features, see :func:`windowed`.
    é   é   r�   zn should be at least one, not )râ   rá   r<   r…   r¥   r}   r_   r_   r`   rM   Z  s   

rM   c                 C   s4   t | ƒ}ttttt|ƒd ƒdƒƒ}ttt|ƒ|ƒS )zþReturn all contiguous non-empty subslices of *iterable*.

        >>> list(subslices('ABC'))
        [['A'], ['A', 'B'], ['A', 'B', 'C'], ['B'], ['B', 'C'], ['C']]

    This is similar to :func:`substrings`, but emits items in a different
    order.
    r�   rä   )	re   r   Úslicer   r©   rm   rh   r!   r   )rg   ÚseqÚslicesr_   r_   r`   rN   s  s   	rN   c                 C   s(   dg}| D ]}t t|d| fƒƒ}q|S )uk  Compute a polynomial's coefficients from its roots.

    >>> roots = [5, -4, 3]            # (x - 5) * (x + 4) * (x - 3)
    >>> polynomial_from_roots(roots)  # xÂ³ - 4 xÂ² - 17 x + 60
    [1, -4, -17, 60]

    Note that polynomial coefficients are specified in descending power order.

    Supports all numeric types: int, float, complex, Decimal, Fraction.
    r�   )re   r+   )ÚrootsÚpolyÚrootr_   r_   r`   r?   �  s   r?   c                 c   s¤   � t | ddƒ}|du r(t| ||ƒ}t||ƒD ]\}}||u s"||kr%|V  qdS |du r0t| ƒn|}|d }ttƒ� 	 |||d |ƒ }V  q<1 sKw   Y  dS )aû  Yield the index of each place in *iterable* that *value* occurs,
    beginning with index *start* and ending before index *stop*.


    >>> list(iter_index('AABCADEAF', 'A'))
    [0, 1, 4, 7]
    >>> list(iter_index('AABCADEAF', 'A', 1))  # start index is inclusive
    [1, 4, 7]
    >>> list(iter_index('AABCADEAF', 'A', 1, 7))  # stop index is not inclusive
    [1, 4]

    The behavior for non-scalar *values* matches the built-in Python types.

    >>> list(iter_index('ABCDABCD', 'AB'))
    [0, 4]
    >>> list(iter_index([0, 1, 2, 3, 0, 1, 2, 3], [0, 1]))
    []
    >>> list(iter_index([[0, 1], [2, 3], [0, 1], [2, 3]], [0, 1]))
    [0, 2]

    See :func:`locate` for a more general means of finding the indexes
    associated with particular values.

    r"   Nr�   )Úgetattrr   rž   rm   r   r¥   )rg   rØ   rj   ÚstopÚ	seq_indexrs   r    rÁ   r_   r_   r`   r3   —  s    €€þ
ÿÿr3   c                 c   s¦   � | dkrdV  d}t dƒ| d  }t|d|t| ƒd d�D ])}t|d||| ƒE dH  ttt|| | || ƒƒƒ||| | || …< || }qt|d|ƒE dH  dS )zeYield the primes less than n.

    >>> list(sieve(30))
    [2, 3, 5, 7, 11, 13, 17, 19, 23, 29]

    rä   r«   )r   r�   r�   )rì   N)Ú	bytearrayr3   r   Úbytesrm   r©   )rf   rj   Údatar¯   r_   r_   r`   rL   À  s   €
.
rL   c                c   sd   � |dk r	t dƒ‚t| ƒ}tt||ƒƒ }r0|r"t|ƒ|kr"t dƒ‚|V  tt||ƒƒ }sdS dS )aŽ  Batch data into tuples of length *n*. If the number of items in
    *iterable* is not divisible by *n*:
    * The last batch will be shorter if *strict* is ``False``.
    * :exc:`ValueError` will be raised if *strict* is ``True``.

    >>> list(batched('ABCDEFG', 3))
    [('A', 'B', 'C'), ('D', 'E', 'F'), ('G',)]

    On Python 3.13 and above, this is an alias for :func:`itertools.batched`.
    r�   zn must be at least onezbatched(): incomplete batchN)r¥   ro   r|   r   rm   )rg   rf   rZ   rs   Úbatchr_   r_   r`   Ú_batchedÕ  s   €ýrò   i¢ )r(   c                C   s   t | ||d�S )NrY   )Úitertools_batched)rg   rf   rZ   r_   r_   r`   r(   ì  s   r(   c                 C   s   t | Ž S )a  Swap the rows and columns of the input matrix.

    >>> list(transpose([(1, 2, 3), (11, 22, 33)]))
    [(1, 11), (2, 22), (3, 33)]

    The caller should ensure that the dimensions of the input are compatible.
    If the input is empty, no output will be produced.
    )Ú_zip_strict©r¡   r_   r_   r`   rT   ô  s   	rT   c                 C   s,   zt | ƒ W n
 ty   Y dS w t| |ƒS )z.Scalars are bytes, strings, and non-iterables.T)ro   rn   Ú
isinstance)rØ   Ú
stringliker_   r_   r`   Ú
_is_scalar   s   ÿ
rø   c                 C   sR   t | ƒ}	 zt|ƒ}W n ty   | Y S w t|f|ƒ}t|ƒr#|S t |¡}q)z.Depth-first iterator over scalars in a tensor.)ro   rr   ÚStopIterationr   rø   r{   )Útensorrs   rØ   r_   r_   r`   Ú_flatten_tensor	  s   ÿ
ørû   c                 C   sD   t |tƒrtt | ¡|ƒS |^}}t| ƒ}ttt|ƒ|ƒ}t||ƒS )aó  Change the shape of a *matrix*.

    If *shape* is an integer, the matrix must be two dimensional
    and the shape is interpreted as the desired number of columns:

        >>> matrix = [(0, 1), (2, 3), (4, 5)]
        >>> cols = 3
        >>> list(reshape(matrix, cols))
        [(0, 1, 2), (3, 4, 5)]

    If *shape* is a tuple (or other iterable), the input matrix can have
    any number of dimensions. It will first be flattened and then rebuilt
    to the desired shape which can also be multidimensional:

        >>> matrix = [(0, 1), (2, 3), (4, 5)]    # Start with a 3 x 2 matrix

        >>> list(reshape(matrix, (2, 3)))        # Make a 2 x 3 matrix
        [(0, 1, 2), (3, 4, 5)]

        >>> list(reshape(matrix, (6,)))          # Make a vector of length six
        [0, 1, 2, 3, 4, 5]

        >>> list(reshape(matrix, (2, 1, 3, 1)))  # Make 2 x 1 x 3 x 1 tensor
        [(((0,), (1,), (2,)),), (((3,), (4,), (5,)),)]

    Each dimension is assumed to be uniform, either all arrays or all scalars.
    Flattening stops when the first value in a dimension is a scalar.
    Scalars are bytes, strings, and non-iterables.
    The reshape iterator stops when the requested shape is complete
    or when the input is exhausted, whichever comes first.

    )	rö   Úintr(   r   r{   rû   r	   Úreversedr   )ÚmatrixÚshapeÚ	first_dimÚdimsÚscalar_streamÚreshapedr_   r_   r`   rD     s   
!
rD   c                 C   s&   t |d ƒ}tttt| t|ƒƒƒ|ƒS )a#  Multiply two matrices.

    >>> list(matmul([(7, 5), (3, 5)], [(2, 5), (7, 9)]))
    [(49, 80), (41, 60)]

    The caller should ensure that the dimensions of the input matrices are
    compatible with each other.

    Supports all numeric types: int, float, complex, Decimal, Fraction.
    r   )rm   r(   r   rÙ   r   rT   )Úm1Úm2rf   r_   r_   r`   r5   @  s   r5   c                 C   s‚   t d| ƒD ]7}d }}d}|dkr4|| | |  }|| | |  }|| | |  }t|| | ƒ}|dks|| kr<|  S qtdƒ‚)Nr�   rä   zprime or under 5)r©   r   r¥   )rf   r‡   r]   r^   Údr_   r_   r`   Ú_factor_pollardO  s   üÿr  éÓ   c                 c   sœ   � | dk rdS t D ]}| | s|V  | | } | | rq	g }| dkr$| gng }|D ]} | dk s2t| ƒr8| | ¡ q(t| ƒ}||| | f7 }q(t|ƒE dH  dS )a  Yield the prime factors of n.

    >>> list(factor(360))
    [2, 2, 2, 3, 3, 5]

    Finds small factors with trial division.  Larger factors are
    either verified as prime with ``is_prime`` or split into
    smaller factors with Pollard's rho algorithm.
    rä   Nr�   ié­  )Ú_primes_below_211r1   r»   r  rÄ   )rf   ÚprimeÚprimesÚtodoÚfactr_   r_   r`   r.   b  s"   €þ€r.   c                 C   s>   t | ƒ}|dkrt|ƒdƒS ttt|ƒtt|ƒƒƒ}t| |ƒS )a´  Evaluate a polynomial at a specific value.

    Computes with better numeric stability than Horner's method.

    Evaluate ``x^3 - 4 * x^2 - 17 * x + 60`` at ``x = 2.5``:

    >>> coefficients = [1, -4, -17, 60]
    >>> x = 2.5
    >>> polynomial_eval(coefficients, x)
    8.125

    Note that polynomial coefficients are specified in descending power order.

    Supports all numeric types: int, float, complex, Decimal, Fraction.
    r   )rm   Útyperh   Úpowr   rý   r©   rÙ   )Úcoefficientsr]   rf   Úpowersr_   r_   r`   r>   ƒ  s
   
r>   c                 C   s   t t| ƒŽ S )z¯Return the sum of the squares of the input values.

    >>> sum_of_squares([10, 20, 30])
    1400

    Supports all numeric types: int, float, complex, Decimal, Fraction.
    )rÙ   r   rõ   r_   r_   r`   rO   š  s   rO   c                 C   s&   t | ƒ}ttd|ƒƒ}ttt| |ƒƒS )u¨  Compute the first derivative of a polynomial.

    Evaluate the derivative of ``xÂ³ - 4 xÂ² - 17 x + 60``:

    >>> coefficients = [1, -4, -17, 60]
    >>> derivative_coefficients = polynomial_derivative(coefficients)
    >>> derivative_coefficients
    [3, -8, -17]

    Note that polynomial coefficients are specified in descending power order.

    Supports all numeric types: int, float, complex, Decimal, Fraction.
    r�   )rm   rý   r©   re   rh   r   )r  rf   r  r_   r_   r`   r@   ¥  s   r@   c                 C   s"   t t| ƒƒD ]}| | | 8 } q| S )uÙ  Return the count of natural numbers up to *n* that are coprime with *n*.

    Euler's totient function Ï†(n) gives the number of totatives.
    Totative are integers k in the range 1 â‰¤ k â‰¤ n such that gcd(n, k) = 1.

    >>> n = 9
    >>> totient(n)
    6

    >>> totatives = [x for x in range(1, n) if gcd(n, x) == 1]
    >>> totatives
    [1, 2, 4, 5, 7, 8]
    >>> len(totatives)
    6

    Reference:  https://en.wikipedia.org/wiki/Euler%27s_totient_function

    )r¹   r.   )rf   r
  r_   r_   r`   rS   ¸  s   rS   ))iÿ  )rä   )i�Š )é   éI   )l   ÅtT7 )rä   é   é=   )l   Áay)rä   é   é   iS_ )l   ;n>Ô)rä   r«   é   r  é   )l   ßp¤)rä   r«   r  r  r  r  )l            )rä   iE  iŸ$  in  i×à i=• iþ‘k)l   ý%!HÈn•fW )rä   r«   r  r  r  r  é   é   r  é   r  é%   é)   c                 C   sH   | d | A   ¡ d }| |? }d|> | | kr|d@ r|dks J ‚||fS )z#Return s, d such that 2**s * d == nr�   r   )Ú
bit_length)rf   r¶   r  r_   r_   r`   Ú_shift_to_oddà  s   $r   c                 C   s”   | dkr| d@ rd|  kr| k sJ ‚ J ‚t | d ƒ\}}t||| ƒ}|dks.|| d kr0dS t|d ƒD ]}|| |  }|| d krG dS q6dS )Nrä   r�   TF)r   r  r©   )rf   Úbaser¶   r  r]   Ú_r_   r_   r`   Ú_strong_probable_primeé  s   ,ÿr#  c                    sŠ   ˆ dk rˆ dv S ˆ d@ r ˆ d r ˆ d r ˆ d r ˆ d r ˆ d s"d	S t D ]
\}}ˆ |k r. nq$‡ fd
d„tdƒD ƒ}t‡ fdd„|D ƒƒS )aÁ  Return ``True`` if *n* is prime and ``False`` otherwise.

    Basic examples:

        >>> is_prime(37)
        True
        >>> is_prime(3 * 13)
        False
        >>> is_prime(18_446_744_073_709_551_557)
        True

    Find the next prime over one billion:

        >>> next(filter(is_prime, count(10**9)))
        1000000007

    Generate random primes up to 200 bits and up to 60 decimal digits:

        >>> from random import seed, randrange, getrandbits
        >>> seed(18675309)

        >>> next(filter(is_prime, map(getrandbits, repeat(200))))
        893303929355758292373272075469392561129886005037663238028407

        >>> next(filter(is_prime, map(randrange, repeat(10**60))))
        269638077304026462407872868003560484232362454342414618963649

    This function is exact for values of *n* below 10**24.  For larger inputs,
    the probabilistic Miller-Rabin primality test has a less than 1 in 2**128
    chance of a false positive.
    r  >   rä   r«   r  r  r  r  r�   r«   r  r  r  r  Fc                 3   s   � | ]
}t d ˆ d ƒV  qdS )rä   r�   N)Ú_private_randrangerÐ   rÓ   r_   r`   r·   *  s   € zis_prime.<locals>.<genexpr>é@   c                 3   r²   r\   )r#  )r³   r!  rÓ   r_   r`   r·   ,  r¸   )Ú_perfect_testsr©   Úall)rf   ÚlimitÚbasesr_   rÓ   r`   r1   ÿ  s   !0ÿr1   c                 C   s
   t d| ƒS )zÂReturns an iterable with *n* elements for efficient looping.
    Like ``range(n)`` but doesn't create integers.

    >>> i = 0
    >>> for _ in loops(5):
    ...     i += 1
    >>> i
    5

    NrÈ   rÓ   r_   r_   r`   r4   /  s   
r4   c                  G   s   t ttt| ƒ| ƒƒS )uÕ  Number of distinct arrangements of a multiset.

    The expression ``multinomial(3, 4, 2)`` has several equivalent
    interpretations:

    * In the expansion of ``(a + b + c)â�¹``, the coefficient of the
      ``aÂ³bâ�´cÂ²`` term is 1260.

    * There are 1260 distinct ways to arrange 9 balls consisting of 3 reds, 4
      greens, and 2 blues.

    * There are 1260 unique ways to place 9 distinct objects into three bins
      with sizes 3, 4, and 2.

    The :func:`multinomial` function computes the length of
    :func:`distinct_permutations`.  For example, there are 83,160 distinct
    anagrams of the word "abracadabra":

        >>> from more_itertools import distinct_permutations, ilen
        >>> ilen(distinct_permutations('abracadabra'))
        83160

    This can be computed directly from the letter counts, 5a 2b 2r 1c 1d:

        >>> from collections import Counter
        >>> list(Counter('abracadabra').values())
        [5, 2, 2, 1, 1]
        >>> multinomial(5, 2, 2, 1, 1)
        83160

    A binomial coefficient is a special case of multinomial where there are
    only two categories.  For example, the number of ways to arrange 12 balls
    with 5 reds and 7 blues is ``multinomial(5, 7)`` or ``math.comb(12, 5)``.

    Likewise, factorial is a special case of multinomial where
    the multiplicities are all just 1 so that
    ``multinomial(1, 1, 1, 1, 1, 1, 1) == math.factorial(7)``.

    Reference:  https://en.wikipedia.org/wiki/Multinomial_theorem

    )r   rh   r   r   )Úcountsr_   r_   r`   r6   =  s   *r6   c                 c   sv   � | j }g }g }ttƒ�% 	 t|t||ƒ ƒƒ |d V  t|t||ƒ ƒƒ |d |d  d V  q1 s4w   Y  dS )z.Non-windowed running_median() for Python 3.14+Tr   rä   N)Ú__next__r   rù   rb   r   r
   rc   ©rs   ÚreadÚloÚhir_   r_   r`   Ú#_running_median_minheap_and_maxheapj  s   €

ûÿr0  c                 c   s~   � | j }g }g }ttƒ�) 	 t|t||ƒ ƒ ƒ |d  V  t|t||ƒ  ƒ ƒ |d |d  d V  q1 s8w   Y  dS )zDBackport of non-windowed running_median() for Python 3.13 and prior.Tr   rä   N)r+  r   rù   r
   r   r,  r_   r_   r`   Ú_running_median_minheap_onlyz  s   €
ûÿr1  c                 c   sˆ   � t ƒ }g }| D ]9}| |¡ t||ƒ t|ƒ|kr$t|| ¡ ƒ}||= t|ƒ}|d }|d@ r4|| n||d  ||  d V  qdS )z+Yield median of values in a sliding window.rä   r�   N)r   r»   r   rm   r   Úpopleft)rs   rl   rÜ   Úorderedr]   r    rf   Úmr_   r_   r`   Ú_running_median_windowedŠ  s   €

,ör5  rk   c                C   sF   t | ƒ}|durt|ƒ}|dkrtdƒ‚t||ƒS tst|ƒS t|ƒS )aD  Cumulative median of values seen so far or values in a sliding window.

    Set *maxlen* to a positive integer to specify the maximum size
    of the sliding window.  The default of *None* is equivalent to
    an unbounded window.

    For example:

        >>> list(running_median([5.0, 9.0, 4.0, 12.0, 8.0, 9.0]))
        [5.0, 7.0, 5.0, 7.0, 8.0, 8.5]
        >>> list(running_median([5.0, 9.0, 4.0, 12.0, 8.0, 9.0], maxlen=3))
        [5.0, 7.0, 5.0, 9.0, 8.0, 9.0]

    Supports numeric types such as int, float, Decimal, and Fraction,
    but not complex numbers which are unorderable.

    On version Python 3.13 and prior, max-heaps are simulated with
    negative values. The negation causes Decimal inputs to apply context
    rounding, making the results slightly different than that obtained
    by statistics.median().
    Nr   zWindow size should be positive)ro   r"   r¥   r5  Ú_max_heap_availabler1  r0  )rg   rl   rs   r_   r_   r`   rK   �  s   
rK   )r   r\   )r£   N)NF)NN)r   N)‡Ú__doc__ÚrandomÚbisectr   r   Úcollectionsr   Ú
contextlibr   Ú	functoolsr   r   r	   Úheapqr
   r   Ú	itertoolsr   r   r   r   r   r   r   r   r   r   r   r   r   r   Úmathr   r   r   r   Úoperatorr   r   r    r!   r"   r#   r$   r%   Úsysr&   Ú__all__Úobjectr˜   r…   rn   rô   r[   rÙ   ÚImportErrorrb   rc   r6  rR   rP   rQ   r*   r8   r'   r¬   rC   r;   r:   r7   r,   r/   rI   rˆ   r<   r‰   r¥   rŠ   rœ   r¢   r0   rJ   r=   rA   rW   rX   rV   r2   r-   rH   rG   rF   rE   r9   rB   r+   r)   rU   rá   râ   rM   rN   r?   r3   rL   rò   r(   ró   rT   Ústrrï   rø   rû   rD   r5   r  r|   r	  r.   r>   rO   r@   rS   r&  r   r#  ÚRandomr$  r1   r4   r6   r0  r1  r5  rK   r_   r_   r_   r`   Ú<module>   sÜ    
@5ÿÿÿ


(



ÿ
(

-



*+	
)

	)!

0-