interface LoDashExplicitArrayWrapper<T> {
        /**
         * @see _.rest
         */
        tail(): LoDashExplicitArrayWrapper<T>;
    }


interface LoDashExplicitObjectWrapper<T> {
        /**
         * @see _.rest
         */
        tail<T>(): LoDashExplicitArrayWrapper<T>;
    }


//_.take
interface LoDashStatic {
        /**
         * Creates a slice of array with n elements taken from the beginning.
         *
         * @param array The array to query.
         * @param n The number of elements to take.
         * @return Returns the slice of array.
         */
        take<T>(
            array: List<T>,
            n?: number
        ): T[];
    }


interface LoDashImplicitArrayWrapper<T> {
        /**
         * @see _.take
         */
        take(n?: number): LoDashImplicitArrayWrapper<T>;
    }


interface LoDashImplicitObjectWrapper<T> {
        /**
         * @see _.take
         */
        take<TResult>(n?: number): LoDashImplicitArrayWrapper<TResult>;
    }


interface LoDashExplicitArrayWrapper<T> {
        /**
         * @see _.take
         */
        take(n?: number): LoDashExplicitArrayWrapper<T>;
    }


interface LoDashExplicitObjectWrapper<T> {
        /**
         * @see _.take
         */
        take<TResult>(n?: number): LoDashExplicitArrayWrapper<TResult>;
    }


//_.takeRight
interface LoDashStatic {
        /**
         * Creates a slice of array with n elements taken from the end.
         *
         * @param array The array to query.
         * @param n The number of elements to take.
         * @return Returns the slice of array.
         */
        takeRight<T>(
            array: List<T>,
            n?: number
        ): T[];
    }


interface LoDashImplicitArrayWrapper<T> {
        /**
         * @see _.takeRight
         */
        takeRight(n?: number): LoDashImplicitArrayWrapper<T>;
    }


interface LoDashImplicitObjectWrapper<T> {
        /**
         * @see _.takeRight
         */
        takeRight<TResult>(n?: number): LoDashImplicitArrayWrapper<TResult>;
    }


interface LoDashExplicitArrayWrapper<T> {
        /**
         * @see _.takeRight
         */
        takeRight(n?: number): LoDashExplicitArrayWrapper<T>;
    }


interface LoDashExplicitObjectWrapper<T> {
        /**
         * @see _.takeRight
         */
        takeRight<TResult>(n?: number): LoDashExplicitArrayWrapper<TResult>;
    }


//_.takeRightWhile
interface LoDashStatic {
        /**
         * Creates a slice of array with elements taken from the end. Elements are taken until predicate returns
         * falsey. The predicate is bound to thisArg and invoked with three arguments: (value, index, array).
         *
         * If a property name is provided for predicate the created _.property style callback returns the property
         * value of the given element.
         *
         * If a value is also provided for thisArg the created _.matchesProperty style callback returns true for
         * elements that have a matching property value, else false.
         *
         * If an object is provided for predicate the created _.matches style callback returns true for elements that
         * have the properties of the given object, else false.
         *
         * @param array The array to query.
         * @param predicate The function invoked per iteration.
         * @param thisArg The this binding of predicate.
         * @return Returns the slice of array.
         */
        takeRightWhile<TValue>(
            array: List<TValue>,
            predicate?: ListIterator<TValue, boolean>,
            thisArg?: any
        ): TValue[];

        /**
         * @see _.takeRightWhile
         */
        takeRightWhile<TValue>(
            array: List<TValue>,
            predicate?: string,
            thisArg?: any
        ): TValue[];

        /**
         * @see _.takeRightWhile
         */
        takeRightWhile<TWhere, TValue>(
            array: List<TValue>,
            predicate?: TWhere
        ): TValue[];
    }


interface LoDashImplicitArrayWrapper<T> {
        /**
         * @see _.takeRightWhile
         */
        takeRightWhile(
            predicate?: ListIterator<T, boolean>,
            thisArg?: any
        ): LoDashImplicitArrayWrapper<T>;

        /**
         * @see _.takeRightWhile
         */
        takeRightWhile(
            predicate?: string,
            thisArg?: any
        ): LoDashImplicitArrayWrapper<T>;

        /**
         * @see _.takeRightWhile
         */
        takeRightWhile<TWhere>(
            predicate?: TWhere
        ): LoDashImplicitArrayWrapper<T>;
    }


interface LoDashImplicitObjectWrapper<T> {
        /**
         * @see _.takeRightWhile
         */
        takeRightWhile<TValue>(
            predicate?: ListIterator<TValue, boolean>,
            thisArg?: any
        ): LoDashImplicitArrayWrapper<TValue>;

        /**
         * @see _.takeRightWhile
         */
        takeRightWhile<TValue>(
            predicate?: string,
            thisArg?: any
        ): LoDashImplicitArrayWrapper<TValue>;

        /**
         * @see _.takeRightWhile
         */
        takeRightWhile<TWhere, TValue>(
            predicate?: TWhere
        ): LoDashImplicitArrayWrapper<TValue>;
    }


interface LoDashExplicitArrayWrapper<T> {
        /**
         * @see _.takeRightWhile
         */
        takeRightWhile(
            predicate?: ListIterator<T, boolean>,
            thisArg?: any
        ): LoDashExplicitArrayWrapper<T>;

        /**
         * @see _.takeRightWhile
         */
        takeRightWhile(
            predicate?: string,
            thisArg?: any
        ): LoDashExplicitArrayWrapper<T>;

        /**
         * @see _.takeRightWhile
         */
        takeRightWhile<TWhere>(
            predicate?: TWhere
        ): LoDashExplicitArrayWrapper<T>;
    }


interface LoDashExplicitObjectWrapper<T> {
        /**
         * @see _.takeRightWhile
         */
        takeRightWhile<TValue>(
            predicate?: ListIterator<TValue, boolean>,
            thisArg?: any
        ): LoDashExplicitArrayWrapper<TValue>;

        /**
         * @see _.takeRightWhile
         */
        takeRightWhile<TValue>(
            predicate?: string,
            thisArg?: any
        ): LoDashExplicitArrayWrapper<TValue>;

        /**
         * @see _.takeRightWhile
         */
        takeRightWhile<TWhere, TValue>(
            predicate?: TWhere
        ): LoDashExplicitArrayWrapper<TValue>;
    }


//_.takeWhile
interface LoDashStatic {
        /**
         * Creates a slice of array with elements taken from the beginning. Elements are taken until predicate returns
         * falsey. The predicate is bound to thisArg and invoked with three arguments: (value, index, array).
         *
         * If a property name is provided for predicate the created _.property style callback returns the property
         * value of the given element.
         *
         * If a value is also provided for thisArg the created _.matchesProperty style callback returns true for
         * elements that have a matching property value, else false.
         *
         * If an object is provided for predicate the created _.matches style callback returns true for elements that
         * have the properties of the given object, else false.
         *
         * @param array The array to query.
         * @param predicate The function invoked per iteration.
         * @param thisArg The this binding of predicate.
         * @return Returns the slice of array.
         */
        takeWhile<TValue>(
            array: List<TValue>,
            predicate?: ListIterator<TValue, boolean>,
            thisArg?: any
        ): TValue[];

        /**
         * @see _.takeWhile
         */
        takeWhile<TValue>(
            array: List<TValue>,
            predicate?: string,
            thisArg?: any
        ): TValue[];

        /**
         * @see _.takeWhile
         */
        takeWhile<TWhere, TValue>(
            array: List<TValue>,
            predicate?: TWhere
        ): TValue[];
    }


interface LoDashImplicitArrayWrapper<T> {
        /**
         * @see _.takeWhile
         */
        takeWhile(
            predicate?: ListIterator<T, boolean>,
            thisArg?: any
        ): LoDashImplicitArrayWrapper<T>;

        /**
         * @see _.takeWhile
         */
        takeWhile(
            predicate?: string,
            thisArg?: any
        ): LoDashImplicitArrayWrapper<T>;

        /**
         * @see _.takeWhile
         */
        takeWhile<TWhere>(
            predicate?: TWhere
        ): LoDashImplicitArrayWrapper<T>;
    }


interface LoDashImplicitObjectWrapper<T> {
        /**
         * @see _.takeWhile
         */
        takeWhile<TValue>(
            predicate?: ListIterator<TValue, boolean>,
            thisArg?: any
        ): LoDashImplicitArrayWrapper<TValue>;

        /**
         * @see _.takeWhile
         */
        takeWhile<TValue>(
            predicate?: string,
            thisArg?: any
        ): LoDashImplicitArrayWrapper<TValue>;

        /**
         * @see _.takeWhile
         */
        takeWhile<TWhere, TValue>(
            predicate?: TWhere
        ): LoDashImplicitArrayWrapper<TValue>;
    }


interface LoDashExplicitArrayWrapper<T> {
        /**
         * @see _.takeWhile
         */
        takeWhile(
            predicate?: ListIterator<T, boolean>,
            thisArg?: any
        ): LoDashExplicitArrayWrapper<T>;

        /**
         * @see _.takeWhile
         */
        takeWhile(
            predicate?: string,
            thisArg?: any
        ): LoDashExplicitArrayWrapper<T>;

        /**
         * @see _.takeWhile
         */
        takeWhile<TWhere>(
            predicate?: TWhere
        ): LoDashExplicitArrayWrapper<T>;
    }


interface LoDashExplicitObjectWrapper<T> {
        /**
         * @see _.takeWhile
         */
        takeWhile<TValue>(
            predicate?: ListIterator<TValue, boolean>,
            thisArg?: any
        ): LoDashExplicitArrayWrapper<TValue>;

        /**
         * @see _.takeWhile
         */
        takeWhile<TValue>(
            predicate?: string,
            thisArg?: any
        ): LoDashExplicitArrayWrapper<TValue>;

        /**
         * @see _.takeWhile
         */
        takeWhile<TWhere, TValue>(
            predicate?: TWhere
        ): LoDashExplicitArrayWrapper<TValue>;
    }


//_.union
interface LoDashStatic {
        /**
         * Creates an array of unique values, in order, from all of the provided arrays using SameValueZero for
         * equality comparisons.
         *
         * @param arrays The arrays to inspect.
         * @return Returns the new array of combined values.
         */
        union<T>(...arrays: List<T>[]): T[];
    }


interface LoDashImplicitArrayWrapper<T> {
        /**
         * @see _.union
         */
        union(...arrays: List<T>[]): LoDashImplicitArrayWrapper<T>;

        /**
         * @see _.union
         */
        union<T>(...arrays: List<T>[]): LoDashImplicitArrayWrapper<T>;
    }


interface LoDashImplicitObjectWrapper<T> {
        /**
         * @see _.union
         */
        union<T>(...arrays: List<T>[]): LoDashImplicitArrayWrapper<T>;
    }


interface LoDashExplicitArrayWrapper<T> {
        /**
         * @see _.union
         */
        union(...arrays: List<T>[]): LoDashExplicitArrayWrapper<T>;

        /**
         * @see _.union
         */
        union<T>(...arrays: List<T>[]): LoDashExplicitArrayWrapper<T>;
    }


interface LoDashExplicitObjectWrapper<T> {
        /**
         * @see _.union
         */
        union<T>(...arrays: List<T>[]): LoDashExplicitArrayWrapper<T>;
    }


//_.unionBy
interface LoDashStatic {
        /**
         * This method is like `_.union` except that it accepts `iteratee` which is
         * invoked for each element of each `arrays` to generate the criterion by which
         * uniqueness is computed. The iteratee is invoked with one argument: (value).
         *
         * @param arrays The arrays to inspect.
         * @param iteratee The iteratee invoked per element.
         * @return Returns the new array of combined values.
         */
        unionBy<T>(
            arrays: T[]|List<T>,
            iteratee?: (value: T) => any
        ): T[];

        /**
         * @see _.unionBy
         */
        unionBy<T, W extends Object>(
            arrays: T[]|List<T>,
            iteratee?: W
        ): T[];

        /**
         * @see _.unionBy
         */
        unionBy<T>(
            arrays1: T[]|List<T>,
            arrays2: T[]|List<T>,
            iteratee?: (value: T) => any
        ): T[];

        /**
         * @see _.unionBy
         */
        unionBy<T, W extends Object>(
            arrays1: T[]|List<T>,
            arrays2: T[]|List<T>,
            iteratee?: W
        ): T[];

        /**
         * @see _.unionBy
         */
        unionBy<T>(
            arrays1: T[]|List<T>,
            arrays2: T[]|List<T>,
            arrays3: T[]|List<T>,
            iteratee?: (value: T) => any
        ): T[];

        /**
         * @see _.unionBy
         */
        unionBy<T, W extends Object>(
            arrays1: T[]|List<T>,
            arrays2: T[]|List<T>,
            arrays3: T[]|List<T>,
            iteratee?: W
        ): T[];

        /**
         * @see _.unionBy
         */
        unionBy<T>(
            arrays1: T[]|List<T>,
            arrays2: T[]|List<T>,
            arrays3: T[]|List<T>,
            arrays4: T[]|List<T>,
            iteratee?: (value: T) => any
        ): T[];

        /**
         * @see _.unionBy
         */
        unionBy<T, W extends Object>(
            arrays1: T[]|List<T>,
            arrays2: T[]|List<T>,
            arrays3: T[]|List<T>,
            arrays4: T[]|List<T>,
            iteratee?: W
        ): T[];

        /**
         * @see _.unionBy
         */
        unionBy<T>(
            arrays1: T[]|List<T>,
            arrays2: T[]|List<T>,
            arrays3: T[]|List<T>,
            arrays4: T[]|List<T>,
            arrays5: T[]|List<T>,
            iteratee?: (value: T) => any
        ): T[];

        /**
         * @see _.unionBy
         */
        unionBy<T, W extends Object>(
            arrays1: T[]|List<T>,
            arrays2: T[]|List<T>,
            arrays3: T[]|List<T>,
            arrays4: T[]|List<T>,
            arrays5: T[]|List<T>,
            iteratee?: W
        ): T[];

        /**
         * @see _.unionBy
         */
        unionBy<T>(
            arrays: T[]|List<T>,
            ...iteratee: any[]
        ): T[];
    }


interface LoDashImplicitArrayWrapper<T> {
        /**
         * @see _.unionBy
         */
        unionBy<T>(
            iteratee?: (value: T) => any
        ): LoDashImplicitArrayWrapper<T>;

        /**
         * @see _.unionBy
         */
        unionBy<T, W extends Object>(
            iteratee?: W
        ): LoDashImplicitArrayWrapper<T>;

        /**
         * @see _.unionBy
         */
        unionBy<T>(
            arrays2: T[]|List<T>,
            iteratee?: (value: T) => any
        ): LoDashImplicitArrayWrapper<T>;

        /**
         * @see _.unionBy
         */
        unionBy<T, W extends Object>(
            arrays2: T[]|List<T>,
            iteratee?: W
        ): LoDashImplicitArrayWrapper<T>;

        /**
         * @see _.unionBy
         */
        unionBy<T>(
            arrays2: T[]|List<T>,
            arrays3: T[]|List<T>,
            iteratee?: (value: T) => any
        ): LoDashImplicitArrayWrapper<T>;

        /**
         * @see _.unionBy
         */
        unionBy<T, W extends Object>(
            arrays2: T[]|List<T>,
            arrays3: T[]|List<T>,
            iteratee?: W
        ): LoDashImplicitArrayWrapper<T>;

        /**
         * @see _.unionBy
         */
        unionBy<T>(
            arrays2: T[]|List<T>,
            arrays3: T[]|List<T>,
            arrays4: T[]|List<T>,
            iteratee?: (value: T) => any
        ): LoDashImplicitArrayWrapper<T>;

        /**
         * @see _.unionBy
         */
        unionBy<T, W extends Object>(
            arrays2: T[]|List<T>,
            arrays3: T[]|List<T>,
            arrays4: T[]|List<T>,
            iteratee?: W
        ): LoDashImplicitArrayWrapper<T>;

        /**
         * @see _.unionBy
         */
        unionBy<T>(
            arrays2: T[]|List<T>,
            arrays3: T[]|List<T>,
            arrays4: T[]|List<T>,
            arrays5: T[]|List<T>,
            iteratee?: (value: T) => any
        ): LoDashImplicitArrayWrapper<T>;

        /**
         * @see _.unionBy
         */
        unionBy<T, W extends Object>(
            arrays2: T[]|List<T>,
            arrays3: T[]|List<T>,
            arrays4: T[]|List<T>,
            arrays5: T[]|List<T>,
            iteratee?: W
        ): LoDashImplicitArrayWrapper<T>;

        /**
         * @see _.unionBy
         */
        unionBy<T>(
            ...iteratee: any[]
        ): LoDashImplicitArrayWrapper<T>;
    }


interface LoDashImplicitObjectWrapper<T> {
        /**
         * @see _.unionBy
         */
        unionBy<T>(
            iteratee?: (value: T) => any
        ): LoDashImplicitArrayWrapper<T>;

        /**
         * @see _.unionBy
         */
        unionBy<T, W extends Object>(
            iteratee?: W
        ): LoDashImplicitArrayWrapper<T>;

        /**
         * @see _.unionBy
         */
        unionBy<T>(
            arrays2: T[]|List<T>,
            iteratee?: (value: T) => any
        ): LoDashImplicitArrayWrapper<T>;

        /**
         * @see _.unionBy
         */
        unionBy<T, W extends Object>(
            arrays2: T[]|List<T>,
            iteratee?: W
        ): LoDashImplicitArrayWrapper<T>;

        /**
         * @see _.unionBy
         */
        unionBy<T>(
            arrays2: T[]|List<T>,
            arrays3: T[]|List<T>,
            iteratee?: (value: T) => any
        ): LoDashImplicitArrayWrapper<T>;

        /**
         * @see _.unionBy
         */
        unionBy<T, W extends Object>(
            arrays2: T[]|List<T>,
            arrays3: T[]|List<T>,
            iteratee?: W
        ): LoDashImplicitArrayWrapper<T>;

        /**
         * @see _.unionBy
         */
        unionBy<T>(
            arrays2: T[]|List<T>,
            arrays3: T[]|List<T>,
            arrays4: T[]|List<T>,
            iteratee?: (value: T) => any
        ): LoDashImplicitArrayWrapper<T>;

        /**
         * @see _.unionBy
         */
        unionBy<T, W extends Object>(
            arrays2: T[]|List<T>,
            arrays3: T[]|List<T>,
            arrays4: T[]|List<T>,
            iteratee?: W
        ): LoDashImplicitArrayWrapper<T>;

        /**
         * @see _.unionBy
         */
        unionBy<T>(
            arrays2: T[]|List<T>,
            arrays3: T[]|List<T>,
            arrays4: T[]|List<T>,
            arrays5: T[]|List<T>,
            iteratee?: (value: T) => any
        ): LoDashImplicitArrayWrapper<T>;

        /**
         * @see _.unionBy
         */
        unionBy<T, W extends Object>(
            arrays2: T[]|List<T>,
            arrays3: T[]|List<T>,
            arrays4: T[]|List<T>,
            arrays5: T[]|List<T>,
            iteratee?: W
        ): LoDashImplicitArrayWrapper<T>;

        /**
         * @see _.unionBy
         */
        unionBy<T>(
            ...iteratee: any[]
        ): LoDashImplicitArrayWrapper<T>;
    }


interface LoDashExplicitArrayWrapper<T> {
        /**
         * @see _.unionBy
         */
        unionBy<T>(
            iteratee?: (value: T) => any
        ): LoDashExplicitArrayWrapper<T>;

        /**
         * @see _.unionBy
         */
        unionBy<T, W extends Object>(
            iteratee?: W
        ): LoDashExplicitArrayWrapper<T>;

        /**
         * @see _.unionBy
         */
        unionBy<T>(
            arrays2: T[]|List<T>,
            iteratee?: (value: T) => any
        ): LoDashExplicitArrayWrapper<T>;

        /**
         * @see _.unionBy
         */
        unionBy<T, W extends Object>(
            arrays2: T[]|List<T>,
            iteratee?: W
        ): LoDashExplicitArrayWrapper<T>;

        /**
         * @see _.unionBy
         */
        unionBy<T>(
            arrays2: T[]|List<T>,
            arrays3: T[]|List<T>,
            iteratee?: (value: T) => any
        ): LoDashExplicitArrayWrapper<T>;

        /**
         * @see _.unionBy
         */
        unionBy<T, W extends Object>(
            arrays2: T[]|List<T>,
            arrays3: T[]|List<T>,
            iteratee?: W
        ): LoDashExplicitArrayWrapper<T>;

        /**
         * @see _.unionBy
         */
        unionBy<T>(
            arrays2: T[]|List<T>,
            arrays3: T[]|List<T>,
            arrays4: T[]|List<T>,
            iteratee?: (value: T) => any
        ): LoDashExplicitArrayWrapper<T>;

        /**
         * @see _.unionBy
         */
        unionBy<T, W extends Object>(
            arrays2: T[]|List<T>,
            arrays3: T[]|List<T>,
            arrays4: T[]|List<T>,
            iteratee?: W
        ): LoDashExplicitArrayWrapper<T>;

        /**
         * @see _.unionBy
         */
        unionBy<T>(
            arrays2: T[]|List<T>,
            arrays3: T[]|List<T>,
            arrays4: T[]|List<T>,
            arrays5: T[]|List<T>,
            iteratee?: (value: T) => any
        ): LoDashExplicitArrayWrapper<T>;

        /**
         * @see _.unionBy
         */
        unionBy<T, W extends Object>(
            arrays2: T[]|List<T>,
            arrays3: T[]|List<T>,
            arrays4: T[]|List<T>,
            arrays5: T[]|List<T>,
            iteratee?: W
        ): LoDashExplicitArrayWrapper<T>;

        /**
         * @see _.unionBy
         */
        unionBy<T>(
            ...iteratee: any[]
        ): LoDashExplicitArrayWrapper<T>;
    }


interface LoDashExplicitObjectWrapper<T> {
        /**
         * @see _.unionBy
         */
        unionBy<T>(
            iteratee?: (value: T) => any
        ): LoDashExplicitArrayWrapper<T>;

        /**
         * @see _.unionBy
         */
        unionBy<T, W extends Object>(
            iteratee?: W
        ): LoDashExplicitArrayWrapper<T>;

        /**
         * @see _.unionBy
         */
        unionBy<T>(
            arrays2: T[]|List<T>,
            iteratee?: (value: T) => any
        ): LoDashExplicitArrayWrapper<T>;

        /**
         * @see _.unionBy
         */
        unionBy<T, W extends Object>(
            arrays2: T[]|List<T>,
            iteratee?: W
        ): LoDashExplicitArrayWrapper<T>;

        /**
         * @see _.unionBy
         */
        unionBy<T>(
            arrays2: T[]|List<T>,
            arrays3: T[]|List<T>,
            iteratee?: (value: T) => any
        ): LoDashExplicitArrayWrapper<T>;

        /**
         * @see _.unionBy
         */
        unionBy<T, W extends Object>(
            arrays2: T[]|List<T>,
            arrays3: T[]|List<T>,
            iteratee?: W
        ): LoDashExplicitArrayWrapper<T>;

        /**
         * @see _.unionBy
         */
        unionBy<T>(
            arrays2: T[]|List<T>,
            arrays3: T[]|List<T>,
            arrays4: T[]|List<T>,
            iteratee?: (value: T) => any
        ): LoDashExplicitArrayWrapper<T>;

        /**
         * @see _.unionBy
         */
        unionBy<T, W extends Object>(
            arrays2: T[]|List<T>,
            arrays3: T[]|List<T>,
            arrays4: T[]|List<T>,
            iteratee?: W
        ): LoDashExplicitArrayWrapper<T>;

        /**
         * @see _.unionBy
         */
        unionBy<T>(
            arrays2: T[]|List<T>,
            arrays3: T[]|List<T>,
            arrays4: T[]|List<T>,
            arrays5: T[]|List<T>,
            iteratee?: (value: T) => any
        ): LoDashExplicitArrayWrapper<T>;

        /**
         * @see _.unionBy
         */
        unionBy<T, W extends Object>(
            arrays2: T[]|List<T>,
            arrays3: T[]|List<T>,
            arrays4: T[]|List<T>,
            arrays5: T[]|List<T>,
            iteratee?: W
        ): LoDashExplicitArrayWrapper<T>;

        /**
         * @see _.unionBy
         */
        unionBy<T>(
            ...iteratee: any[]
        ): LoDashExplicitArrayWrapper<T>;
    }


//_.uniq
interface LoDashStatic {
        /**
         * Creates a duplicate-free version of an array, using
         * [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero)
         * for equality comparisons, in which only the first occurrence of each element
         * is kept.
         *
         * @static
         * @memberOf _
         * @category Array
         * @param {Array} array The array to inspect.
         * @returns {Array} Returns the new duplicate free array.
         * @example
         *
         * _.uniq([2, 1, 2]);
         * // => [2, 1]
         */
        uniq<T>(
            array: List<T>
        ): T[];

        /**
         * @see _.uniq
         */
        uniq<T, TSort>(
            array: List<T>
        ): T[];
    }


interface LoDashImplicitWrapper<T> {
        /**
         * @see _.uniq
         */
        uniq<TSort>(): LoDashImplicitArrayWrapper<T>;
    }


interface LoDashImplicitArrayWrapper<T> {
        /**
         * @see _.uniq
         */
        uniq<TSort>(): LoDashImplicitArrayWrapper<T>;

        /**
         * @see _.uniq
         */
        uniq(): LoDashImplicitArrayWrapper<T>;
    }


interface LoDashImplicitObjectWrapper<T> {
        uniq<T>(): LoDashImplicitArrayWrapper<T>;

        /**
         * @see _.uniq
         */
        uniq<T, TSort>(): LoDashImplicitArrayWrapper<T>;
    }


interface LoDashExplicitWrapper<T> {
        /**
         * @see _.uniq
         */
        uniq<TSort>(): LoDashExplicitArrayWrapper<T>;
    }


interface LoDashExplicitArrayWrapper<T> {
        /**
         * @see _.uniq
         */
        uniq<TSort>(): LoDashExplicitArrayWrapper<T>;

        /**
         * @see _.uniq
         */
        uniq(): LoDashExplicitArrayWrapper<T>;
    }


interface LoDashExplicitObjectWrapper<T> {
        /**
         * @see _.uniq
         */
        uniq<T>(): LoDashExplicitArrayWrapper<T>;

        /**
         * @see _.uniq
         */
        uniq<T, TSort>(): LoDashExplicitArrayWrapper<T>;
    }


//_.uniqBy
interface LoDashStatic {
        /**
         * This method is like `_.uniq` except that it accepts `iteratee` which is
         * invoked for each element in `array` to generate the criterion by which
         * uniqueness is computed. The iteratee is invoked with one argument: (value).
         *
         * @static
         * @memberOf _
         * @category Array
         * @param {Array} array The array to inspect.
         * @param {Function|Object|string} [iteratee=_.identity] The iteratee invoked per element.
         * @returns {Array} Returns the new duplicate free array.
         * @example
         *
         * _.uniqBy([2.1, 1.2, 2.3], Math.floor);
         * // => [2.1, 1.2]
         *
         * // using the `_.property` iteratee shorthand
         * _.uniqBy([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x');
         * // => [{ 'x': 1 }, { 'x': 2 }]
         */
        uniqBy<T>(
            array: List<T>,
            iteratee: ListIterator<T, any>
        ): T[];

        /**
         * @see _.uniqBy
         */
        uniqBy<T, TSort>(
            array: List<T>,
            iteratee: ListIterator<T, TSort>
        ): T[];

        /**
         * @see _.uniqBy
         */
        uniqBy<T>(
            array: List<T>,
            iteratee: string
        ): T[];

        /**
         * @see _.uniqBy
         */
        uniqBy<T>(
            array: List<T>,
            iteratee: Object
        ): T[];

        /**
         * @see _.uniqBy
         */
        uniqBy<TWhere extends {}, T>(
            array: List<T>,
            iteratee: TWhere
        ): T[];
    }


interface LoDashImplicitWrapper<T> {
        /**
         * @see _.uniqBy
         */
        uniqBy<TSort>(
            iteratee: ListIterator<T, TSort>
        ): LoDashImplicitArrayWrapper<T>;
    }


interface LoDashImplicitArrayWrapper<T> {
        /**
         * @see _.uniqBy
         */
        uniqBy<TSort>(
            iteratee: ListIterator<T, TSort>
        ): LoDashImplicitArrayWrapper<T>;

        /**
         * @see _.uniqBy
         */
        uniqBy(
            iteratee: string
        ): LoDashImplicitArrayWrapper<T>;

        /**
         * @see _.uniqBy
         */
        uniqBy<TWhere extends {}>(
            iteratee: TWhere
        ): LoDashImplicitArrayWrapper<T>;
    }


interface LoDashImplicitObjectWrapper<T> {
        /**
         * @see _.uniqBy
         */
        uniqBy<T>(
            iteratee: ListIterator<T, any>
        ): LoDashImplicitArrayWrapper<T>;

        /**
         * @see _.uniqBy
         */
        uniqBy<T, TSort>(
            iteratee: ListIterator<T, TSort>
        ): LoDashImplicitArrayWrapper<T>;

        /**
         * @see _.uniqBy
         */
        uniqBy<T>(
            iteratee: string
        ): LoDashImplicitArrayWrapper<T>;

        /**
         * @see _.uniqBy
         */
        uniqBy<T>(
            iteratee: Object
        ): LoDashImplicitArrayWrapper<T>;

        /**
         * @see _.uniqBy
         */
        uniqBy<TWhere extends {}, T>(
            iteratee: TWhere
        ): LoDashImplicitArrayWrapper<T>;
    }


interface LoDashExplicitWrapper<T> {
        /**
         * @see _.uniqBy
         */
        uniqBy<TSort>(
            iteratee: ListIterator<T, TSort>
        ): LoDashExplicitArrayWrapper<T>;
    }


interface LoDashExplicitArrayWrapper<T> {
        /**
         * @see _.uniqBy
         */
        uniqBy<TSort>(
            iteratee: ListIterator<T, TSort>
        ): LoDashExplicitArrayWrapper<T>;

        /**
         * @see _.uniqBy
         */
        uniqBy(
            iteratee: string
        ): LoDashExplicitArrayWrapper<T>;

        /**
         * @see _.uniqBy
         */
        uniqBy<TWhere extends {}>(
            iteratee: TWhere
        ): LoDashExplicitArrayWrapper<T>;
    }


interface LoDashExplicitObjectWrapper<T> {
        /**
         * @see _.uniqBy
         */
        uniqBy<T>(
            iteratee: ListIterator<T, any>
        ): LoDashExplicitArrayWrapper<T>;

        /**
         * @see _.uniqBy
         */
        uniqBy<T, TSort>(
            iteratee: ListIterator<T, TSort>
        ): LoDashExplicitArrayWrapper<T>;

        /**
         * @see _.uniqBy
         */
        uniqBy<T>(
            iteratee: string
        ): LoDashExplicitArrayWrapper<T>;

        /**
         * @see _.uniqBy
         */
        uniqBy<T>(
            iteratee: Object
        ): LoDashExplicitArrayWrapper<T>;

        /**
         * @see _.uniqBy
         */
        uniqBy<TWhere extends {}, T>(
            iteratee: TWhere
        ): LoDashExplicitArrayWrapper<T>;
    }


//_.sortedUniq
interface LoDashStatic {
        /**
         * This method is like `_.uniq` except that it's designed and optimized
         * for sorted arrays.
         *
         * @static
         * @memberOf _
         * @category Array
         * @param {Array} array The array to inspect.
         * @returns {Array} Returns the new duplicate free array.
         * @example
         *
         * _.sortedUniq([1, 1, 2]);
         * // => [1, 2]
         */
        sortedUniq<T>(
            array: List<T>
        ): T[];

        /**
         * @see _.sortedUniq
         */
        sortedUniq<T, TSort>(
            array: List<T>
        ): T[];
    }


interface LoDashImplicitWrapper<T> {
        /**
         * @see _.sortedUniq
         */
        sortedUniq<TSort>(): LoDashImplicitArrayWrapper<T>;
    }


interface LoDashImplicitArrayWrapper<T> {
        /**
         * @see _.sortedUniq
         */
        sortedUniq<TSort>(): LoDashImplicitArrayWrapper<T>;

        /**
         * @see _.sortedUniq
         */
        sortedUniq(): LoDashImplicitArrayWrapper<T>;
    }


interface LoDashImplicitObjectWrapper<T> {
        sortedUniq<T>(): LoDashImplicitArrayWrapper<T>;

        /**
         * @see _.sortedUniq
         */
        sortedUniq<T, TSort>(): LoDashImplicitArrayWrapper<T>;
    }


interface LoDashExplicitWrapper<T> {
        /**
         * @see _.sortedUniq
         */
        sortedUniq<TSort>(): LoDashExplicitArrayWrapper<T>;
    }


interface LoDashExplicitArrayWrapper<T> {
        /**
         * @see _.sortedUniq
         */
        sortedUniq<TSort>(): LoDashExplicitArrayWrapper<T>;

        /**
         * @see _.sortedUniq
         */
        sortedUniq(): LoDashExplicitArrayWrapper<T>;
    }


interface LoDashExplicitObjectWrapper<T> {
        /**
         * @see _.sortedUniq
         */
        sortedUniq<T>(): LoDashExplicitArrayWrapper<T>;

        /**
         * @see _.sortedUniq
         */
        sortedUniq<T, TSort>(): LoDashExplicitArrayWrapper<T>;
    }


//_.sortedUniqBy
interface LoDashStatic {
        /**
         * This method is like `_.uniqBy` except that it's designed and optimized
         * for sorted arrays.
         *
         * @static
         * @memberOf _
         * @category Array
         * @param {Array} array The array to inspect.
         * @param {Function} [iteratee] The iteratee invoked per element.
         * @returns {Array} Returns the new duplicate free array.
         * @example
         *
         * _.sortedUniqBy([1.1, 1.2, 2.3, 2.4], Math.floor);
         * // => [1.1, 2.2]
         */
        sortedUniqBy<T>(
            array: List<T>,
            iteratee: ListIterator<T, any>
        ): T[];

        /**
         * @see _.sortedUniqBy
         */
        sortedUniqBy<T, TSort>(
            array: List<T>,
            iteratee: ListIterator<T, TSort>
        ): T[];

        /**
         * @see _.sortedUniqBy
         */
        sortedUniqBy<T>(
            array: List<T>,
            iteratee: string
        ): T[];

        /**
         * @see _.sortedUniqBy
         */
        sortedUniqBy<T>(
            array: List<T>,
            iteratee: Object
        ): T[];

        /**
         * @see _.sortedUniqBy
         */
        sortedUniqBy<TWhere extends {}, T>(
            array: List<T>,
            iteratee: TWhere
        ): T[];
    }


interface LoDashImplicitWrapper<T> {
        /**
         * @see _.sortedUniqBy
         */
        sortedUniqBy<TSort>(
            iteratee: ListIterator<T, TSort>
        ): LoDashImplicitArrayWrapper<T>;
    }


interface LoDashImplicitArrayWrapper<T> {
        /**
         * @see _.sortedUniqBy
         */
        sortedUniqBy<TSort>(
            iteratee: ListIterator<T, TSort>
        ): LoDashImplicitArrayWrapper<T>;

        /**
         * @see _.sortedUniqBy
         */
        sortedUniqBy(
            iteratee: string
        ): LoDashImplicitArrayWrapper<T>;

        /**
         * @see _.sortedUniqBy
         */
        sortedUniqBy<TWhere extends {}>(
            iteratee: TWhere
        ): LoDashImplicitArrayWrapper<T>;
    }


interface LoDashImplicitObjectWrapper<T> {
        /**
         * @see _.sortedUniqBy
         */
        sortedUniqBy<T>(
            iteratee: ListIterator<T, any>
        ): LoDashImplicitArrayWrapper<T>;

        /**
         * @see _.sortedUniqBy
         */
        sortedUniqBy<T, TSort>(
            iteratee: ListIterator<T, TSort>
        ): LoDashImplicitArrayWrapper<T>;

        /**
         * @see _.sortedUniqBy
         */
        sortedUniqBy<T>(
            iteratee: string
        ): LoDashImplicitArrayWrapper<T>;

        /**
         * @see _.sortedUniqBy
         */
        sortedUniqBy<T>(
            iteratee: Object
        ): LoDashImplicitArrayWrapper<T>;

        /**
         * @see _.sortedUniqBy
         */
        sortedUniqBy<TWhere extends {}, T>(
            iteratee: TWhere
        ): LoDashImplicitArrayWrapper<T>;
    }


interface LoDashExplicitWrapper<T> {
        /**
         * @see _.sortedUniqBy
         */
        sortedUniqBy<TSort>(
            iteratee: ListIterator<T, TSort>
        ): LoDashExplicitArrayWrapper<T>;
    }


interface LoDashExplicitArrayWrapper<T> {
        /**
         * @see _.sortedUniqBy
         */
        sortedUniqBy<TSort>(
            iteratee: ListIterator<T, TSort>
        ): LoDashExplicitArrayWrapper<T>;

        /**
         * @see _.sortedUniqBy
         */
        sortedUniqBy(
            iteratee: string
        ): LoDashExplicitArrayWrapper<T>;

        /**
         * @see _.sortedUniqBy
         */
        sortedUniqBy<TWhere extends {}>(
            iteratee: TWhere
        ): LoDashExplicitArrayWrapper<T>;
    }


interface LoDashExplicitObjectWrapper<T> {
        /**
         * @see _.sortedUniqBy
         */
        sortedUniqBy<T>(
            iteratee: ListIterator<T, any>
        ): LoDashExplicitArrayWrapper<T>;

        /**
         * @see _.sortedUniqBy
         */
        sortedUniqBy<T, TSort>(
            iteratee: ListIterator<T, TSort>
        ): LoDashExplicitArrayWrapper<T>;

        /**
         * @see _.sortedUniqBy
         */
        sortedUniqBy<T>(
            iteratee: string
        ): LoDashExplicitArrayWrapper<T>;

        /**
         * @see _.sortedUniqBy
         */
        sortedUniqBy<T>(
            iteratee: Object
        ): LoDashExplicitArrayWrapper<T>;

        /**
         * @see _.sortedUniqBy
         */
        sortedUniqBy<TWhere extends {}, T>(
            iteratee: TWhere
        ): LoDashExplicitArrayWrapper<T>;
    }


//_.unionWith DUMMY
interface LoDashStatic {
        /**
         * This method is like `_.union` except that it accepts `comparator` which
         * is invoked to compare elements of `arrays`. The comparator is invoked
         * with two arguments: (arrVal, othVal).
         *
         * @static
         * @memberOf _
         * @category Array
         * @param {...Array} [arrays] The arrays to inspect.
         * @param {Function} [comparator] The comparator invoked per element.
         * @returns {Array} Returns the new array of combined values.
         * @example
         *
         * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];
         * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];
         *
         * _.unionWith(objects, others, _.isEqual);
         * // => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 1 }]
         */
        unionWith(
            array: any[]|List<any>,
            ...values: any[]
        ): any[];
    }


//_.uniqWith DUMMY
interface LoDashStatic {
        /**
         * This method is like `_.uniq` except that it accepts `comparator` which
         * is invoked to compare elements of `array`. The comparator is invoked with
         * two arguments: (arrVal, othVal).
         *
         * @static
         * @memberOf _
         * @category Array
         * @param {Array} array The array to inspect.
         * @param {Function} [comparator] The comparator invoked per element.
         * @returns {Array} Returns the new duplicate free array.
         * @example
         *
         * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 },  { 'x': 1, 'y': 2 }];
         *
         * _.uniqWith(objects, _.isEqual);
         * // => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }]
         */
        uniqWith(
            array: any[]|List<any>,
            ...values: any[]
        ): any[];
    }


//_.unzip
interface LoDashStatic {
        /**
         * This method is like _.zip except that it accepts an array of grouped elements and creates an array
         * regrouping the elements to their pre-zip configuration.
         *
         * @param array The array of grouped elements to process.
         * @return Returns the new array of regrouped elements.
         */
        unzip<T>(array: List<List<T>>): T[][];
    }


interface LoDashImplicitArrayWrapper<T> {
        /**
         * @see _.unzip
         */
        unzip<T>(): LoDashImplicitArrayWrapper<T[]>;
    }


interface LoDashImplicitObjectWrapper<T> {
        /**
         * @see _.unzip
         */
        unzip<T>(): LoDashImplicitArrayWrapper<T[]>;
    }


interface LoDashExplicitArrayWrapper<T> {
        /**
         * @see _.unzip
         */
        unzip<T>(): LoDashExplicitArrayWrapper<T[]>;
    }


interface LoDashExplicitObjectWrapper<T> {
        /**
         * @see _.unzip
         */
        unzip<T>(): LoDashExplicitArrayWrapper<T[]>;
    }


//_.unzipWith
interface LoDashStatic {
        /**
         * This method is like _.unzip except that it accepts an iteratee to specify how regrouped values should be
         * combined. The iteratee is bound to thisArg and invoked with four arguments: (accumulator, value, index,
         * group).
         *
         * @param array The array of grouped elements to process.
         * @param iteratee The function to combine regrouped values.
         * @param thisArg The this binding of iteratee.
         * @return Returns the new array of regrouped elements.
         */
        unzipWith<TArray, TResult>(
            array: List<List<TArray>>,
            iteratee?: MemoIterator<TArray, TResult>,
            thisArg?: any
        ): TResult[];
    }


interface LoDashImplicitArrayWrapper<T> {
        /**
         * @see _.unzipWith
         */
        unzipWith<TArr, TResult>(
            iteratee?: MemoIterator<TArr, TResult>,
            thisArg?: any
        ): LoDashImplicitArrayWrapper<TResult>;
    }


interface LoDashImplicitObjectWrapper<T> {
        /**
         * @see _.unzipWith
         */
        unzipWith<TArr, TResult>(
            iteratee?: MemoIterator<TArr, TResult>,
            thisArg?: any
        ): LoDashImplicitArrayWrapper<TResult>;
    }


//_.without
interface LoDashStatic {
        /**
         * Creates an array excluding all provided values using SameValueZero for equality comparisons.
         *
         * @param array The array to filter.
         * @param values The values to exclude.
         * @return Returns the new array of filtered values.
         */
        without<T>(
            array: List<T>,
            ...values: T[]
        ): T[];
    }


interface LoDashImplicitArrayWrapper<T> {
        /**
         * @see _.without
         */
        without(...values: T[]): LoDashImplicitArrayWrapper<T>;
    }


interface LoDashImplicitObjectWrapper<T> {
        /**
         * @see _.without
         */
        without<T>(...values: T[]): LoDashImplicitArrayWrapper<T>;
    }


interface LoDashExplicitArrayWrapper<T> {
        /**
         * @see _.without
         */
        without(...values: T[]): LoDashExplicitArrayWrapper<T>;
    }


interface LoDashExplicitObjectWrapper<T> {
        /**
         * @see _.without
         */
        without<T>(...values: T[]): LoDashExplicitArrayWrapper<T>;
    }


//_.xor
interface LoDashStatic {
        /**
         * Creates an array of unique values that is the symmetric difference of the provided arrays.
         *
         * @param arrays The arrays to inspect.
         * @return Returns the new array of values.
         */
        xor<T>(...arrays: List<T>[]): T[];
    }


interface LoDashImplicitArrayWrapper<T> {
        /**
         * @see _.xor
         */
        xor(...arrays: List<T>[]): LoDashImplicitArrayWrapper<T>;
    }


interface LoDashImplicitObjectWrapper<T> {
        /**
         * @see _.xor
         */
        xor<T>(...arrays: List<T>[]): LoDashImplicitArrayWrapper<T>;
    }


interface LoDashExplicitArrayWrapper<T> {
        /**
         * @see _.xor
         */
        xor(...arrays: List<T>[]): LoDashExplicitArrayWrapper<T>;
    }


interface LoDashExplicitObjectWrapper<T> {
        /**
         * @see _.xor
         */
        xor<T>(...arrays: List<T>[]): LoDashExplicitArrayWrapper<T>;
    }


//_.xorBy DUMMY
interface LoDashStatic {
        /**
         * This method is like `_.xor` except that it accepts `iteratee` which is
         * invoked for each element of each `arrays` to generate the criterion by which
         * uniqueness is computed. The iteratee is invoked with one argument: (value).
         *
         * @static
         * @memberOf _
         * @category Array
         * @param {...Array} [arrays] The arrays to inspect.
         * @param {Function|Object|string} [iteratee=_.identity] The iteratee invoked per element.
         * @returns {Array} Returns the new array of values.
         * @example
         *
         * _.xorBy([2.1, 1.2], [4.3, 2.4], Math.floor);
         * // => [1.2, 4.3]
         *
         * // using the `_.property` iteratee shorthand
         * _.xorBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');
         * // => [{ 'x': 2 }]
         */
        xorBy(
            array: any[]|List<any>,
            ...values: any[]
        ): any[];
    }


//_.xorWith DUMMY
interface LoDashStatic {
        /**
         * This method is like `_.xor` except that it accepts `comparator` which is
         * invoked to compare elements of `arrays`. The comparator is invoked with
         * two arguments: (arrVal, othVal).
         *
         * @static
         * @memberOf _
         * @category Array
         * @param {...Array} [arrays] The arrays to inspect.
         * @param {Function} [comparator] The comparator invoked per element.
         * @returns {Array} Returns the new array of values.
         * @example
         *
         * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];
         * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];
         *
         * _.xorWith(objects, others, _.isEqual);
         * // => [{ 'x': 2, 'y': 1 }, { 'x': 1, 'y': 1 }]
         */
        xorWith(
            array: any[]|List<any>,
            ...values: any[]
        ): any[];
    }


//_.zip
interface LoDashStatic {
        /**
         * Creates an array of grouped elements, the first of which contains the first elements of the given arrays,
         * the second of which contains the second elements of the given arrays, and so on.
         *
         * @param arrays The arrays to process.
         * @return Returns the new array of grouped elements.
         */
        zip<T>(...arrays: List<T>[]): T[][];
    }


interface LoDashImplicitArrayWrapper<T> {
        /**
         * @see _.zip
         */
        zip<T>(...arrays: List<T>[]): _.LoDashImplicitArrayWrapper<T[]>;
    }


interface LoDashImplicitObjectWrapper<T> {
        /**
         * @see _.zip
         */
        zip<T>(...arrays: List<T>[]): _.LoDashImplicitArrayWrapper<T[]>;
    }


interface LoDashExplicitArrayWrapper<T> {
        /**
         * @see _.zip
         */
        zip<T>(...arrays: List<T>[]): _.LoDashExplicitArrayWrapper<T[]>;
    }


interface LoDashExplicitObjectWrapper<T> {
        /**
         * @see _.zip
         */
        zip<T>(...arrays: List<T>[]): _.LoDashExplicitArrayWrapper<T[]>;
    }


//_.zipObject
interface LoDashStatic {
        /**
         * The inverse of _.pairs; this method returns an object composed from arrays of property names and values.
         * Provide either a single two dimensional array, e.g. [[key1, value1], [key2, value2]] or two arrays, one of
         * property names and one of corresponding values.
         *
         * @param props The property names.
         * @param values The property values.
         * @return Returns the new object.
         */
        zipObject<TValues, TResult extends {}>(
            props: List<StringRepresentable>|List<List<any>>,
            values?: List<TValues>
        ): TResult;

        /**
         * @see _.zipObject
         */
        zipObject<TResult extends {}>(
            props: List<StringRepresentable>|List<List<any>>,
            values?: List<any>
        ): TResult;

        /**
         * @see _.zipObject
         */
        zipObject(
            props: List<StringRepresentable>|List<List<any>>,
            values?: List<any>
        ): _.Dictionary<any>;
    }


interface LoDashImplicitArrayWrapper<T> {
        /**
         * @see _.zipObject
         */
        zipObject<TValues, TResult extends {}>(
            values?: List<TValues>
        ): _.LoDashImplicitObjectWrapper<TResult>;

        /**
         * @see _.zipObject
         */
        zipObject<TResult extends {}>(
            values?: List<any>
        ): _.LoDashImplicitObjectWrapper<TResult>;

        /**
         * @see _.zipObject
         */
        zipObject(
            values?: List<any>
        ): _.LoDashImplicitObjectWrapper<_.Dictionary<any>>;
    }


interface LoDashImplicitObjectWrapper<T> {
        /**
         * @see _.zipObject
         */
        zipObject<TValues, TResult extends {}>(
            values?: List<TValues>
        ): _.LoDashImplicitObjectWrapper<TResult>;

        /**
         * @see _.zipObject
         */
        zipObject<TResult extends {}>(
            values?: List<any>
        ): _.LoDashImplicitObjectWrapper<TResult>;

        /**
         * @see _.zipObject
         */
        zipObject(
            values?: List<any>
        ): _.LoDashImplicitObjectWrapper<_.Dictionary<any>>;
    }


interface LoDashExplicitArrayWrapper<T> {
        /**
         * @see _.zipObject
         */
        zipObject<TValues, TResult extends {}>(
            values?: List<TValues>
        ): _.LoDashExplicitObjectWrapper<TResult>;

        /**
         * @see _.zipObject
         */
        zipObject<TResult extends {}>(
            values?: List<any>
        ): _.LoDashExplicitObjectWrapper<TResult>;

        /**
         * @see _.zipObject
         */
        zipObject(
            values?: List<any>
        ): _.LoDashExplicitObjectWrapper<_.Dictionary<any>>;
    }


interface LoDashExplicitObjectWrapper<T> {
        /**
         * @see _.zipObject
         */
        zipObject<TValues, TResult extends {}>(
            values?: List<TValues>
        ): _.LoDashExplicitObjectWrapper<TResult>;

        /**
         * @see _.zipObject
         */
        zipObject<TResult extends {}>(
            values?: List<any>
        ): _.LoDashExplicitObjectWrapper<TResult>;

        /**
         * @see _.zipObject
         */
        zipObject(
            values?: List<any>
        ): _.LoDashExplicitObjectWrapper<_.Dictionary<any>>;
    }


//_.zipWith
interface LoDashStatic {
        /**
         * This method is like _.zip except that it accepts an iteratee to specify how grouped values should be
         * combined. The iteratee is bound to thisArg and invoked with four arguments: (accumulator, value, index,
         * group).
         * @param {...Array} [arrays] The arrays to process.
         * @param {Function} [iteratee] The function to combine grouped values.
         * @param {*} [thisArg] The `this` binding of `iteratee`.
         * @return Returns the new array of grouped elements.
         */
        zipWith<TResult>(...args: any[]): TResult[];
    }


interface LoDashImplicitArrayWrapper<T> {
        /**
         * @see _.zipWith
         */
        zipWith<TResult>(...args: any[]): LoDashImplicitArrayWrapper<TResult>;
    }


/*********
     * Chain *
     *********/
//_.chain
interface LoDashStatic {
        /**
         * Creates a lodash object that wraps value with explicit method chaining enabled.
         *
         * @param value The value to wrap.
         * @return Returns the new lodash wrapper instance.
         */
        chain(value: number): LoDashExplicitWrapper<number>;
        chain(value: string): LoDashExplicitWrapper<string>;
        chain(value: boolean): LoDashExplicitWrapper<boolean>;
        chain<T>(value: T[]): LoDashExplicitArrayWrapper<T>;
        chain<T extends {}>(value: T): LoDashExplicitObjectWrapper<T>;
        chain(value: any): LoDashExplicitWrapper<any>;
    }


interface LoDashImplicitWrapper<T> {
        /**
         * @see _.chain
         */
        chain(): LoDashExplicitWrapper<T>;
    }


interface LoDashImplicitArrayWrapper<T> {
        /**
         * @see _.chain
         */
        chain(): LoDashExplicitArrayWrapper<T>;
    }


interface LoDashImplicitObjectWrapper<T> {
        /**
         * @see _.chain
         */
        chain(): LoDashExplicitObjectWrapper<T>;
    }


interface LoDashExplicitWrapperBase<T, TWrapper> {
        /**
         * @see _.chain
         */
        chain(): TWrapper;
    }


//_.tap
interface LoDashStatic {
        /**
         * This method invokes interceptor and returns value. The interceptor is bound to thisArg and invoked with one
         * argument; (value). The purpose of this method is to "tap into" a method chain in order to perform operations
         * on intermediate results within the chain.
         *
         * @param value The value to provide to interceptor.
         * @param interceptor The function to invoke.
         * @parem thisArg The this binding of interceptor.
         * @return Returns value.
         **/
        tap<T>(
            value: T,
            interceptor: (value: T) => void,
            thisArg?: any
        ): T;
    }


interface LoDashImplicitWrapperBase<T, TWrapper> {
        /**
         * @see _.tap
         */
        tap(
            interceptor: (value: T) => void,
            thisArg?: any
        ): TWrapper;
    }


interface LoDashExplicitWrapperBase<T, TWrapper> {
        /**
         * @see _.tap
         */
        tap(
            interceptor: (value: T) => void,
            thisArg?: any
        ): TWrapper;
    }


//_.thru
interface LoDashStatic {
        /**
         * This method is like _.tap except that it returns the result of interceptor.
         *
         * @param value The value to provide to interceptor.
         * @param interceptor The function to invoke.
         * @param thisArg The this binding of interceptor.
         * @return Returns the result of interceptor.
         */
        thru<T, TResult>(
            value: T,
            interceptor: (value: T) => TResult,
            thisArg?: any
        ): TResult;
    }


interface LoDashImplicitWrapperBase<T, TWrapper> {
        /**
         * @see _.thru
         */
        thru<TResult extends number>(
            interceptor: (value: T) => TResult,
            thisArg?: any): LoDashImplicitWrapper<TResult>;

        /**
         * @see _.thru
         */
        thru<TResult extends string>(
            interceptor: (value: T) => TResult,
            thisArg?: any): LoDashImplicitWrapper<TResult>;

        /**
         * @see _.thru
         */
        thru<TResult extends boolean>(
            interceptor: (value: T) => TResult,
            thisArg?: any): LoDashImplicitWrapper<TResult>;

        /**
         * @see _.thru
         */
        thru<TResult extends {}>(
            interceptor: (value: T) => TResult,
            thisArg?: any): LoDashImplicitObjectWrapper<TResult>;

        /**
         * @see _.thru
         */
        thru<TResult>(
            interceptor: (value: T) => TResult[],
            thisArg?: any): LoDashImplicitArrayWrapper<TResult>;
    }


interface LoDashExplicitWrapperBase<T, TWrapper> {
        /**
         * @see _.thru
         */
        thru<TResult extends number>(
            interceptor: (value: T) => TResult,
            thisArg?: any
        ): LoDashExplicitWrapper<TResult>;

        /**
         * @see _.thru
         */
        thru<TResult extends string>(
            interceptor: (value: T) => TResult,
            thisArg?: any
        ): LoDashExplicitWrapper<TResult>;

        /**
         * @see _.thru
         */
        thru<TResult extends boolean>(
            interceptor: (value: T) => TResult,
            thisArg?: any
        ): LoDashExplicitWrapper<TResult>;

        /**
         * @see _.thru
         */
        thru<TResult extends {}>(
            interceptor: (value: T) => TResult,
            thisArg?: any
        ): LoDashExplicitObjectWrapper<TResult>;

        /**
         * @see _.thru
         */
        thru<TResult>(
            interceptor: (value: T) => TResult[],
            thisArg?: any
        ): LoDashExplicitArrayWrapper<TResult>;
    }


//_.prototype.commit
interface LoDashImplicitWrapperBase<T, TWrapper> {
        /**
         * Executes the chained sequence and returns the wrapped result.
         *
         * @return Returns the new lodash wrapper instance.
         */
        commit(): TWrapper;
    }


interface LoDashExplicitWrapperBase<T, TWrapper> {
        /**
         * @see _.commit
         */
        commit(): TWrapper;
    }


//_.prototype.concat
interface LoDashImplicitWrapperBase<T, TWrapper> {
        /**
         * Creates a new array joining a wrapped array with any additional arrays and/or values.
         *
         * @param items
         * @return Returns the new concatenated array.
         */
        concat<TItem>(...items: Array<TItem|Array<TItem>>): LoDashImplicitArrayWrapper<TItem>;

        /**
         * @see _.concat
         */
        concat(...items: Array<T|Array<T>>): LoDashImplicitArrayWrapper<T>;
    }


interface LoDashExplicitWrapperBase<T, TWrapper> {
        /**
         * @see _.concat
         */
        concat<TItem>(...items: Array<TItem|Array<TItem>>): LoDashExplicitArrayWrapper<TItem>;

        /**
         * @see _.concat
         */
        concat(...items: Array<T|Array<T>>): LoDashExplicitArrayWrapper<T>;
    }


//_.prototype.plant
interface LoDashImplicitWrapperBase<T, TWrapper> {
        /**
         * Creates a clone of the chained sequence planting value as the wrapped value.
         * @param value The value to plant as the wrapped value.
         * @return Returns the new lodash wrapper instance.
         */
        plant(value: number): LoDashImplicitWrapper<number>;

        /**
         * @see _.plant
         */
        plant(value: string): LoDashImplicitStringWrapper;

        /**
         * @see _.plant
         */
        plant(value: boolean): LoDashImplicitWrapper<boolean>;

        /**
         * @see _.plant
         */
        plant(value: number[]): LoDashImplicitNumberArrayWrapper;

        /**
         * @see _.plant
         */
        plant<T>(value: T[]): LoDashImplicitArrayWrapper<T>;

        /**
         * @see _.plant
         */
        plant<T extends {}>(value: T): LoDashImplicitObjectWrapper<T>;

        /**
         * @see _.plant
         */
        plant(value: any): LoDashImplicitWrapper<any>;
    }


interface LoDashExplicitWrapperBase<T, TWrapper> {
        /**
         * @see _.plant
         */
        plant(value: number): LoDashExplicitWrapper<number>;

        /**
         * @see _.plant
         */
        plant(value: string): LoDashExplicitStringWrapper;

        /**
         * @see _.plant
         */
        plant(value: boolean): LoDashExplicitWrapper<boolean>;

        /**
         * @see _.plant
         */
        plant(value: number[]): LoDashExplicitNumberArrayWrapper;

        /**
         * @see _.plant
         */
        plant<T>(value: T[]): LoDashExplicitArrayWrapper<T>;

        /**
         * @see _.plant
         */
        plant<T extends {}>(value: T): LoDashExplicitObjectWrapper<T>;

        /**
         * @see _.plant
         */
        plant(value: any): LoDashExplicitWrapper<any>;
    }


//_.prototype.reverse
interface LoDashImplicitArrayWrapper<T> {
        /**
         * Reverses the wrapped array so the first element becomes the last, the second element becomes the second to
         * last, and so on.
         *
         * Note: This method mutates the wrapped array.
         *
         * @return Returns the new reversed lodash wrapper instance.
         */
        reverse(): LoDashImplicitArrayWrapper<T>;
    }


interface LoDashExplicitArrayWrapper<T> {
        /**
         * @see _.reverse
         */
        reverse(): LoDashExplicitArrayWrapper<T>;
    }


//_.prototype.toJSON
interface LoDashWrapperBase<T, TWrapper> {
        /**
         * @see _.value
         */
        toJSON(): T;
    }


//_.prototype.toString
interface LoDashWrapperBase<T, TWrapper> {
        /**
         * Produces the result of coercing the unwrapped value to a string.
         *
         * @return Returns the coerced string value.
         */
        toString(): string;
    }


//_.prototype.value
interface LoDashWrapperBase<T, TWrapper> {
        /**
         * Executes the chained sequence to extract the unwrapped value.
         *
         * @alias _.toJSON, _.valueOf
         *
         * @return Returns the resolved unwrapped value.
         */
        value(): T;
    }


//_.valueOf
interface LoDashWrapperBase<T, TWrapper> {
        /**
         * @see _.value
         */
        valueOf(): T;
    }


/**************
     * Collection *
     **************/
//_.at
interface LoDashStatic {
        /**
         * Creates an array of elements corresponding to the given keys, or indexes, of collection. Keys may be
         * specified as individual arguments or as arrays of keys.
         *
         * @param collection The collection to iterate over.
         * @param props The property names or indexes of elements to pick, specified individually or in arrays.
         * @return Returns the new array of picked elements.
         */
        at<T>(
            collection: List<T>|Dictionary<T>,
            ...props: (number|string|(number|string)[])[]
        ): T[];
    }


interface LoDashImplicitArrayWrapper<T> {
        /**
         * @see _.at
         */
        at(...props: (number|string|(number|string)[])[]): LoDashImplicitArrayWrapper<T>;
    }


interface LoDashImplicitObjectWrapper<T> {
        /**
         * @see _.at
         */
        at<T>(...props: (number|string|(number|string)[])[]): LoDashImplicitArrayWrapper<T>;
    }


interface LoDashExplicitArrayWrapper<T> {
        /**
         * @see _.at
         */
        at(...props: (number|string|(number|string)[])[]): LoDashExplicitArrayWrapper<T>;
    }


interface LoDashExplicitObjectWrapper<T> {
        /**
         * @see _.at
         */
        at<T>(...props: (number|string|(number|string)[])[]): LoDashExplicitArrayWrapper<T>;
    }


//_.countBy
interface LoDashStatic {
        /**
         * Creates an object composed of keys generated from the results of running each element of collection through
         * iteratee. The corresponding value of each key is the number of times the key was returned by iteratee. The
         * iteratee is bound to thisArg and invoked with three arguments:
         * (value, index|key, collection).
         *
         * If a property name is provided for iteratee the created _.property style callback returns the property
         * value of the given element.
         *
         * If a value is also provided for thisArg the created _.matchesProperty style callback returns true for
         * elements that have a matching property value, else false.
         *
         * If an object is provided for iteratee the created _.matches style callback returns true for elements that
         * have the properties of the given object, else false.
         *
         * @param collection The collection to iterate over.
         * @param iteratee The function invoked per iteration.
         * @param thisArg The this binding of iteratee.
         * @return Returns the composed aggregate object.
         */
        countBy<T>(
            collection: List<T>,
            iteratee?: ListIterator<T, any>,
            thisArg?: any
        ): Dictionary<number>;

        /**
         * @see _.countBy
         */
        countBy<T>(
            collection: Dictionary<T>,
            iteratee?: DictionaryIterator<T, any>,
            thisArg?: any
        ): Dictionary<number>;

        /**
         * @see _.countBy
         */
        countBy<T>(
            collection: NumericDictionary<T>,
            iteratee?: NumericDictionaryIterator<T, any>,
            thisArg?: any
        ): Dictionary<number>;

        /**
         * @see _.countBy
         */
        countBy<T>(
            collection: List<T>|Dictionary<T>|NumericDictionary<T>,
            iteratee?: string,
            thisArg?: any
        ): Dictionary<number>;

        /**
         * @see _.countBy
         */
        countBy<W, T>(
            collection: List<T>|Dictionary<T>|NumericDictionary<T>,
            iteratee?: W
        ): Dictionary<number>;

        /**
         * @see _.countBy
         */
        countBy<T>(
            collection: List<T>|Dictionary<T>|NumericDictionary<T>,
            iteratee?: Object
        ): Dictionary<number>;
    }


interface LoDashImplicitWrapper<T> {
        /**
         * @see _.countBy
         */
        countBy(
            iteratee?: ListIterator<T, any>,
            thisArg?: any
        ): LoDashImplicitObjectWrapper<Dictionary<number>>;
    }


interface LoDashImplicitArrayWrapper<T> {
        /**
         * @see _.countBy
         */
        countBy(
            iteratee?: ListIterator<T, any>,
            thisArg?: any
        ): LoDashImplicitObjectWrapper<Dictionary<number>>;

        /**
         * @see _.countBy
         */
        countBy(
            iteratee?: string,
            thisArg?: any
        ): LoDashImplicitObjectWrapper<Dictionary<number>>;

        /**
         * @see _.countBy
         */
        countBy<W>(
            iteratee?: W
        ): LoDashImplicitObjectWrapper<Dictionary<number>>;
    }


interface LoDashImplicitObjectWrapper<T> {
        /**
         * @see _.countBy
         */
        countBy<T>(
            iteratee?: ListIterator<T, any>|DictionaryIterator<T, any>|NumericDictionaryIterator<T, any>,
            thisArg?: any
        ): LoDashImplicitObjectWrapper<Dictionary<number>>;

        /**
         * @see _.countBy
         */
        countBy(
            iteratee?: string,
            thisArg?: any
        ): LoDashImplicitObjectWrapper<Dictionary<number>>;

        /**
         * @see _.countBy
         */
        countBy<W>(
            iteratee?: W
        ): LoDashImplicitObjectWrapper<Dictionary<number>>;
    }


interface LoDashExplicitWrapper<T> {
        /**
         * @see _.countBy
         */
        countBy(
            iteratee?: ListIterator<T, any>,
            thisArg?: any
        ): LoDashExplicitObjectWrapper<Dictionary<number>>;
    }


interface LoDashExplicitArrayWrapper<T> {
        /**
         * @see _.countBy
         */
        countBy(
            iteratee?: ListIterator<T, any>,
            thisArg?: any
        ): LoDashExplicitObjectWrapper<Dictionary<number>>;

        /**
         * @see _.countBy
         */
        countBy(
            iteratee?: string,
            thisArg?: any
        ): LoDashExplicitObjectWrapper<Dictionary<number>>;

        /**
         * @see _.countBy
         */
        countBy<W>(
            iteratee?: W
        ): LoDashExplicitObjectWrapper<Dictionary<number>>;
    }


interface LoDashExplicitObjectWrapper<T> {
        /**
         * @see _.countBy
         */
        countBy<T>(
            iteratee?: ListIterator<T, any>|DictionaryIterator<T, any>|NumericDictionaryIterator<T, any>,
            thisArg?: any
        ): LoDashExplicitObjectWrapper<Dictionary<number>>;

        /**
         * @see _.countBy
         */
        countBy(
            iteratee?: string,
            thisArg?: any
        ): LoDashExplicitObjectWrapper<Dictionary<number>>;

        /**
         * @see _.countBy
         */
        countBy<W>(
            iteratee?: W
        ): LoDashExplicitObjectWrapper<Dictionary<number>>;
    }


//_.each
interface LoDashStatic {
        /**
         * @see _.forEach
         */
        each<T>(
            collection: T[],
            iteratee?: ListIterator<T, any>,
            thisArg?: any
        ): T[];

        /**
         * @see _.forEach
         */
        each<T>(
            collection: List<T>,
            iteratee?: ListIterator<T, any>,
            thisArg?: any
        ): List<T>;

        /**
         * @see _.forEach
         */
        each<T>(
            collection: Dictionary<T>,
            iteratee?: DictionaryIterator<T, any>,
            thisArg?: any
        ): Dictionary<T>;

        /**
         * @see _.forEach
         */
        each<T extends {}>(
            collection: T,
            iteratee?: ObjectIterator<any, any>,
            thisArgs?: any
        ): T;

        /**
         * @see _.forEach
         */
        each<T extends {}, TValue>(
            collection: T,
            iteratee?: ObjectIterator<TValue, any>,
            thisArgs?: any
        ): T;
    }


interface LoDashImplicitWrapper<T> {
        /**
         * @see _.forEach
         */
        each(
            iteratee: ListIterator<string, any>,
            thisArg?: any
        ): LoDashImplicitWrapper<string>;
    }


interface LoDashImplicitArrayWrapper<T> {
        /**
         * @see _.forEach
         */
        each(
            iteratee: ListIterator<T, any>,
            thisArg?: any
        ): LoDashImplicitArrayWrapper<T>;
    }


interface LoDashImplicitObjectWrapper<T> {
        /**
         * @see _.forEach
         */
        each<TValue>(
            iteratee?: ListIterator<TValue, any>|DictionaryIterator<TValue, any>,
            thisArg?: any
        ): LoDashImplicitObjectWrapper<T>;
    }


interface LoDashExplicitWrapper<T> {
        /**
         * @see _.forEach
         */
        each(
            iteratee: ListIterator<string, any>,
            thisArg?: any
        ): LoDashExplicitWrapper<string>;
    }


interface LoDashExplicitArrayWrapper<T> {
        /**
         * @see _.forEach
         */
        each(
            iteratee: ListIterator<T, any>,
            thisArg?: any
        ): LoDashExplicitArrayWrapper<T>;
    }


interface LoDashExplicitObjectWrapper<T> {
        /**
         * @see _.forEach
         */
        each<TValue>(
            iteratee?: ListIterator<TValue, any>|DictionaryIterator<TValue, any>,
            thisArg?: any
        ): LoDashExplicitObjectWrapper<T>;
    }


//_.eachRight
interface LoDashStatic {
        /**
         * @see _.forEachRight
         */
        eachRight<T>(
            collection: T[],
            iteratee?: ListIterator<T, any>,
            thisArg?: any
        ): T[];

        /**
         * @see _.forEachRight
         */
        eachRight<T>(
            collection: List<T>,
            iteratee?: ListIterator<T, any>,
            thisArg?: any
        ): List<T>;

        /**
         * @see _.forEachRight
         */
        eachRight<T>(
            collection: Dictionary<T>,
            iteratee?: DictionaryIterator<T, any>,
            thisArg?: any
        ): Dictionary<T>;

        /**
         * @see _.forEachRight
         */
        eachRight<T extends {}>(
            collection: T,
            iteratee?: ObjectIterator<any, any>,
            thisArgs?: any
        ): T;

        /**
         * @see _.forEachRight
         */
        eachRight<T extends {}, TValue>(
            collection: T,
            iteratee?: ObjectIterator<TValue, any>,
            thisArgs?: any
        ): T;
    }


interface LoDashImplicitWrapper<T> {
        /**
         * @see _.forEachRight
         */
        eachRight(
            iteratee: ListIterator<string, any>,
            thisArg?: any
        ): LoDashImplicitWrapper<string>;
    }


interface LoDashImplicitArrayWrapper<T> {
        /**
         * @see _.forEachRight
         */
        eachRight(
            iteratee: ListIterator<T, any>,
            thisArg?: any
        ): LoDashImplicitArrayWrapper<T>;
    }


interface LoDashImplicitObjectWrapper<T> {
        /**
         * @see _.forEachRight
         */
        eachRight<TValue>(
            iteratee?: ListIterator<TValue, any>|DictionaryIterator<TValue, any>,
            thisArg?: any
        ): LoDashImplicitObjectWrapper<T>;
    }


interface LoDashExplicitWrapper<T> {
        /**
         * @see _.forEachRight
         */
        eachRight(
            iteratee: ListIterator<string, any>,
            thisArg?: any
        ): LoDashExplicitWrapper<string>;
    }


interface LoDashExplicitArrayWrapper<T> {
        /**
         * @see _.forEachRight
         */
        eachRight(
            iteratee: ListIterator<T, any>,
            thisArg?: any
        ): LoDashExplicitArrayWrapper<T>;
    }


interface LoDashExplicitObjectWrapper<T> {
        /**
         * @see _.forEachRight
         */
        eachRight<TValue>(
            iteratee?: ListIterator<TValue, any>|DictionaryIterator<TValue, any>,
            thisArg?: any
        ): LoDashExplicitObjectWrapper<T>;
    }


//_.every
interface LoDashStatic {
        /**
         * Checks if predicate returns truthy for all elements of collection. Iteration is stopped once predicate
         * returns falsey. The predicate is invoked with three arguments: (value, index|key, collection).
         *
         * @param collection The collection to iterate over.
         * @param predicate The function invoked per iteration.
         * @return Returns true if all elements pass the predicate check, else false.
         */
        every<T>(
            collection: List<T>,
            predicate?: ListIterator<T, boolean>
        ): boolean;

        /**
         * @see _.every
         */
        every<T>(
            collection: Dictionary<T>,
            predicate?: DictionaryIterator<T, boolean>
        ): boolean;

        /**
         * @see _.every
         */
        every<T>(
            collection: NumericDictionary<T>,
            predicate?: NumericDictionaryIterator<T, boolean>
        ): boolean;

        /**
         * @see _.every
         */
        every<T>(
            collection: List<T>|Dictionary<T>|NumericDictionary<T>,
            predicate?: string|any[]
        ): boolean;

        /**
         * @see _.every
         */
        every<TObject extends {}, T>(
            collection: List<T>|Dictionary<T>|NumericDictionary<T>,
            predicate?: TObject
        ): boolean;
    }


interface LoDashImplicitArrayWrapper<T> {
        /**
         * @see _.every
         */
        every(
            predicate?: ListIterator<T, boolean>|NumericDictionaryIterator<T, boolean>
        ): boolean;

        /**
         * @see _.every
         */
        every(
            predicate?: string|any[]
        ): boolean;

        /**
         * @see _.every
         */
        every<TObject extends {}>(
            predicate?: TObject
        ): boolean;
    }


interface LoDashImplicitObjectWrapper<T> {
        /**
         * @see _.every
         */
        every<TResult>(
            predicate?: ListIterator<TResult, boolean>|DictionaryIterator<TResult, boolean>|NumericDictionaryIterator<T, boolean>
        ): boolean;

        /**
         * @see _.every
         */
        every(
            predicate?: string|any[]
        ): boolean;

        /**
         * @see _.every
         */
        every<TObject extends {}>(
            predicate?: TObject
        ): boolean;
    }


interface LoDashExplicitArrayWrapper<T> {
        /**
         * @see _.every
         */
        every(
            predicate?: ListIterator<T, boolean>|NumericDictionaryIterator<T, boolean>
        ): LoDashExplicitWrapper<boolean>;

        /**
         * @see _.every
         */
        every(
            predicate?: string|any[]
        ): LoDashExplicitWrapper<boolean>;

        /**
         * @see _.every
         */
        every<TObject extends {}>(
            predicate?: TObject
        ): LoDashExplicitWrapper<boolean>;
    }


interface LoDashExplicitObjectWrapper<T> {
        /**
         * @see _.every
         */
        every<TResult>(
            predicate?: ListIterator<TResult, boolean>|DictionaryIterator<TResult, boolean>|NumericDictionaryIterator<T, boolean>
        ): LoDashExplicitWrapper<boolean>;

        /**
         * @see _.every
         */
        every(
            predicate?: string|any[]
        ): LoDashExplicitWrapper<boolean>;

        /**
         * @see _.every
         */
        every<TObject extends {}>(
            predicate?: TObject
        ): LoDashExplicitWrapper<boolean>;
    }


//_.filter
interface LoDashStatic {
        /**
         * Iterates over elements of collection, returning an array of all elements predicate returns truthy for. The
         * predicate is bound to thisArg and invoked with three arguments: (value, index|key, collection).
         *
         * If a property name is provided for predicate the created _.property style callback returns the property
         * value of the given element.
         *
         * If a value is also provided for thisArg the created _.matchesProperty style callback returns true for
         * elements that have a matching property value, else false.
         *
         * If an object is provided for predicate the created _.matches style callback returns true for elements that
         * have the properties of the given object, else false.
         *
         * @param collection The collection to iterate over.
         * @param predicate The function invoked per iteration.
         * @param thisArg The this binding of predicate.
         * @return Returns the new filtered array.
         */
        filter<T>(
            collection: List<T>,
            predicate?: ListIterator<T, boolean>,
            thisArg?: any
        ): T[];

        /**
         * @see _.filter
         */
        filter<T>(
            collection: Dictionary<T>,
            predicate?: DictionaryIterator<T, boolean>,
            thisArg?: any
        ): T[];

        /**
         * @see _.filter
         */
        filter(
            collection: string,
            predicate?: StringIterator<boolean>,
            thisArg?: any
        ): string[];

        /**
         * @see _.filter
         */
        filter<T>(
            collection: List<T>|Dictionary<T>,
            predicate: string,
            thisArg?: any
        ): T[];

        /**
         * @see _.filter
         */
        filter<W extends {}, T>(
            collection: List<T>|Dictionary<T>,
            predicate: W
        ): T[];
    }


interface LoDashImplicitWrapper<T> {
        /**
         * @see _.filter
         */
        filter(
            predicate?: StringIterator<boolean>,
            thisArg?: any
        ): LoDashImplicitArrayWrapper<string>;
    }


interface LoDashImplicitArrayWrapper<T> {
        /**
         * @see _.filter
         */
        filter(
            predicate: ListIterator<T, boolean>,
            thisArg?: any
        ): LoDashImplicitArrayWrapper<T>;

        /**
         * @see _.filter
         */
        filter(
            predicate: string,
            thisArg?: any
        ): LoDashImplicitArrayWrapper<T>;

        /**
         * @see _.filter
         */
        filter<W>(predicate: W): LoDashImplicitArrayWrapper<T>;
    }


interface LoDashImplicitObjectWrapper<T> {
        /**
         * @see _.filter
         */
        filter<T>(
            predicate: ListIterator<T, boolean>|DictionaryIterator<T, boolean>,
            thisArg?: any
        ): LoDashImplicitArrayWrapper<T>;

        /**
         * @see _.filter
         */
        filter<T>(
            predicate: string,
            thisArg?: any
        ): LoDashImplicitArrayWrapper<T>;

        /**
         * @see _.filter
         */
        filter<W, T>(predicate: W): LoDashImplicitArrayWrapper<T>;
    }


interface LoDashExplicitWrapper<T> {
        /**
         * @see _.filter
         */
        filter(
            predicate?: StringIterator<boolean>,
            thisArg?: any
        ): LoDashExplicitArrayWrapper<string>;
    }


interface LoDashExplicitArrayWrapper<T> {
        /**
         * @see _.filter
         */
        filter(
            predicate: ListIterator<T, boolean>,
            thisArg?: any
        ): LoDashExplicitArrayWrapper<T>;

        /**
         * @see _.filter
         */
        filter(
            predicate: string,
            thisArg?: any
        ): LoDashExplicitArrayWrapper<T>;

        /**
         * @see _.filter
         */
        filter<W>(predicate: W): LoDashExplicitArrayWrapper<T>;
    }


interface LoDashExplicitObjectWrapper<T> {
        /**
         * @see _.filter
         */
        filter<T>(
            predicate: ListIterator<T, boolean>|DictionaryIterator<T, boolean>,
            thisArg?: any
        ): LoDashExplicitArrayWrapper<T>;

        /**
         * @see _.filter
         */
        filter<T>(
            predicate: string,
            thisArg?: any
        ): LoDashExplicitArrayWrapper<T>;

        /**
         * @see _.filter
         */
        filter<W, T>(predicate: W): LoDashExplicitArrayWrapper<T>;
    }


//_.find
interface LoDashStatic {
        /**
         * Iterates over elements of collection, returning the first element predicate returns truthy for.
         * The predicate is bound to thisArg and invoked with three arguments: (value, index|key, collection).
         *
         * If a property name is provided for predicate the created _.property style callback returns the property
         * value of the given element.
         *
         * If a value is also provided for thisArg the created _.matchesProperty style callback returns true for
         * elements that have a matching property value, else false.
         *
         * If an object is provided for predicate the created _.matches style callback returns true for elements that
         * have the properties of the given object, else false.
         *
         * @param collection The collection to search.
         * @param predicate The function invoked per iteration.
         * @param thisArg The this binding of predicate.
         * @return Returns the matched element, else undefined.
         */
        find<T>(
            collection: List<T>,
            predicate?: ListIterator<T, boolean>,
            thisArg?: any
        ): T;

        /**
         * @see _.find
         */
        find<T>(
            collection: Dictionary<T>,
            predicate?: DictionaryIterator<T, boolean>,
            thisArg?: any
        ): T;

        /**
         * @see _.find
         */
        find<T>(
            collection: List<T>|Dictionary<T>,
            predicate?: string,
            thisArg?: any
        ): T;

        /**
         * @see _.find
         */
        find<TObject extends {}, T>(
            collection: List<T>|Dictionary<T>,
            predicate?: TObject
        ): T;
    }


interface LoDashImplicitArrayWrapper<T> {
        /**
         * @see _.find
         */
        find(
            predicate?: ListIterator<T, boolean>,
            thisArg?: any
        ): T;

        /**
         * @see _.find
         */
        find(
            predicate?: string,
            thisArg?: any
        ): T;

        /**
         * @see _.find
         */
        find<TObject extends {}>(
            predicate?: TObject
        ): T;
    }


interface LoDashImplicitObjectWrapper<T> {
        /**
         * @see _.find
         */
        find<TResult>(
            predicate?: ListIterator<TResult, boolean>|DictionaryIterator<TResult, boolean>,
            thisArg?: any
        ): TResult;

        /**
         * @see _.find
         */
        find<TResult>(
            predicate?: string,
            thisArg?: any
        ): TResult;

        /**
         * @see _.find
         */
        find<TObject extends {}, TResult>(
            predicate?: TObject
        ): TResult;
    }


//_.findLast
interface LoDashStatic {
        /**
        * This method is like _.find except that it iterates over elements of a collection from
        * right to left.
        * @param collection Searches for a value in this list.
        * @param callback The function called per iteration.
        * @param thisArg The this binding of callback.
        * @return The found element, else undefined.
        **/
        findLast<T>(
            collection: Array<T>,
            callback: ListIterator<T, boolean>,
            thisArg?: any): T;

        /**
        * @see _.find
        **/
        findLast<T>(
            collection: List<T>,
            callback: ListIterator<T, boolean>,
            thisArg?: any): T;

        /**
        * @see _.find
        **/
        findLast<T>(
            collection: Dictionary<T>,
            callback: DictionaryIterator<T, boolean>,
            thisArg?: any): T;

        /**
        * @see _.find
        * @param _.pluck style callback
        **/
        findLast<W, T>(
            collection: Array<T>,
            whereValue: W): T;

        /**
        * @see _.find
        * @param _.pluck style callback
        **/
        findLast<W, T>(
            collection: List<T>,
            whereValue: W): T;

        /**
        * @see _.find
        * @param _.pluck style callback
        **/
        findLast<W, T>(
            collection: Dictionary<T>,
            whereValue: W): T;

        /**
        * @see _.find
        * @param _.where style callback
        **/
        findLast<T>(
            collection: Array<T>,
            pluckValue: string): T;

        /**
        * @see _.find
        * @param _.where style callback
        **/
        findLast<T>(
            collection: List<T>,
            pluckValue: string): T;

        /**
        * @see _.find
        * @param _.where style callback
        **/
        findLast<T>(
            collection: Dictionary<T>,
            pluckValue: string): T;
    }


interface LoDashImplicitArrayWrapper<T> {
        /**
        * @see _.findLast
        */
        findLast(
            callback: ListIterator<T, boolean>,
            thisArg?: any): T;
        /**
        * @see _.findLast
        * @param _.where style callback
        */
        findLast<W>(
            whereValue: W): T;

        /**
        * @see _.findLast
        * @param _.where style callback
        */
        findLast(
            pluckValue: string): T;
    }


//_.flatMap
interface LoDashStatic {
        /**
         * Creates an array of flattened values by running each element in collection through iteratee
         * and concating its result to the other mapped values. The iteratee is invoked with three arguments:
         * (value, index|key, collection).
         *
         * @param collection The collection to iterate over.
         * @param iteratee The function invoked per iteration.
         * @return Returns the new flattened array.
         */
        flatMap<T, TResult>(
            collection: List<T>,
            iteratee?: ListIterator<T, TResult|TResult[]>
        ): TResult[];

        /**
         * @see _.flatMap
         */
        flatMap<TResult>(
            collection: List<any>,
            iteratee?: ListIterator<any, TResult|TResult[]>
        ): TResult[];

        /**
         * @see _.flatMap
         */
        flatMap<T, TResult>(
            collection: Dictionary<T>,
            iteratee?: DictionaryIterator<T, TResult|TResult[]>
        ): TResult[];

        /**
         * @see _.flatMap
         */
        flatMap<TResult>(
            collection: Dictionary<any>,
            iteratee?: DictionaryIterator<any, TResult|TResult[]>
        ): TResult[];

        /**
         * @see _.flatMap
         */
        flatMap<T, TResult>(
            collection: NumericDictionary<T>,
            iteratee?: NumericDictionaryIterator<T, TResult|TResult[]>
        ): TResult[];

        /**
         * @see _.flatMap
         */
        flatMap<TResult>(
            collection: NumericDictionary<any>,
            iteratee?: NumericDictionaryIterator<any, TResult|TResult[]>
        ): TResult[];

        /**
         * @see _.flatMap
         */
        flatMap<TObject extends Object, TResult>(
            collection: TObject,
            iteratee?: ObjectIterator<any, TResult|TResult[]>
        ): TResult[];

        /**
         * @see _.flatMap
         */
        flatMap<TResult>(
            collection: Object,
            iteratee?: ObjectIterator<any, TResult|TResult[]>
        ): TResult[];

        /**
         * @see _.flatMap
         */
        flatMap<TWhere extends Object, TObject extends Object>(
            collection: TObject,
            iteratee: TWhere
        ): boolean[];

        /**
         * @see _.flatMap
         */
        flatMap<TObject extends Object, TResult>(
            collection: TObject,
            iteratee: Object|string
        ): TResult[];

        /**
         * @see _.flatMap
         */
        flatMap<TObject extends Object>(
            collection: TObject,
            iteratee: [string, any]
        ): boolean[];

        /**
         * @see _.flatMap
         */
        flatMap<TResult>(
            collection: string
        ): string[];

        /**
         * @see _.flatMap
         */
        flatMap<TResult>(
            collection: Object,
            iteratee?: Object|string
        ): TResult[];
    }


interface LoDashImplicitWrapper<T> {
        /**
         * @see _.flatMap
         */
        flatMap<TResult>(
            iteratee: ListIterator<string, TResult|TResult[]>
        ): LoDashImplicitArrayWrapper<TResult>;

        /**
         * @see _.flatMap
         */
        flatMap(): LoDashImplicitArrayWrapper<string>;
    }


interface LoDashImplicitArrayWrapper<T> {
        /**
         * @see _.flatMap
         */
        flatMap<TResult>(
            iteratee: ListIterator<T, TResult|TResult[]>|string
        ): LoDashImplicitArrayWrapper<TResult>;

        /**
         * @see _.flatMap
         */
        flatMap<TWhere extends Object>(
            iteratee: TWhere
        ): LoDashImplicitArrayWrapper<boolean>;

        /**
         * @see _.flatMap
         */
        flatMap(
            iteratee: [string, any]
        ): LoDashImplicitArrayWrapper<boolean>;

        /**
         * @see _.flatMap
         */
        flatMap<TResult>(): LoDashImplicitArrayWrapper<TResult>;
    }


interface LoDashImplicitObjectWrapper<T> {
        /**
         * @see _.flatMap
         */
        flatMap<T, TResult>(
            iteratee: ListIterator<T, TResult|TResult[]>|DictionaryIterator<T, TResult|TResult[]>|NumericDictionaryIterator<T, TResult|TResult[]>
        ): LoDashImplicitArrayWrapper<TResult>;

        /**
         * @see _.flatMap
         */
        flatMap<TResult>(
            iteratee: ObjectIterator<any, TResult|TResult[]>|string
        ): LoDashImplicitArrayWrapper<TResult>;

        /**
         * @see _.flatMap
         */
        flatMap<TWhere extends Object>(
            iteratee: TWhere
        ): LoDashImplicitArrayWrapper<boolean>;

        /**
         * @see _.flatMap
         */
        flatMap(
            iteratee: [string, any]
        ): LoDashImplicitArrayWrapper<boolean>;

        /**
         * @see _.flatMap
         */
        flatMap<TResult>(): LoDashImplicitArrayWrapper<TResult>;
    }


interface LoDashExplicitWrapper<T> {
        /**
         * @see _.flatMap
         */
        flatMap<TResult>(
            iteratee: ListIterator<string, TResult|TResult[]>
        ): LoDashExplicitArrayWrapper<TResult>;

        /**
         * @see _.flatMap
         */
        flatMap(): LoDashExplicitArrayWrapper<string>;
    }


interface LoDashExplicitArrayWrapper<T> {
        /**
         * @see _.flatMap
         */
        flatMap<TResult>(
            iteratee: ListIterator<T, TResult|TResult[]>|string
        ): LoDashExplicitArrayWrapper<TResult>;

        /**
         * @see _.flatMap
         */
        flatMap<TWhere extends Object>(
            iteratee: TWhere
        ): LoDashExplicitArrayWrapper<boolean>;

        /**
         * @see _.flatMap
         */
        flatMap(
            iteratee: [string, any]
        ): LoDashExplicitArrayWrapper<boolean>;

        /**
         * @see _.flatMap
         */
        flatMap<TResult>(): LoDashExplicitArrayWrapper<TResult>;
    }


interface LoDashExplicitObjectWrapper<T> {
        /**
         * @see _.flatMap
         */
        flatMap<T, TResult>(
            iteratee: ListIterator<T, TResult|TResult[]>|DictionaryIterator<T, TResult|TResult[]>|NumericDictionaryIterator<T, TResult|TResult[]>
        ): LoDashExplicitArrayWrapper<TResult>;

        /**
         * @see _.flatMap
         */
        flatMap<TResult>(
            iteratee: ObjectIterator<any, TResult|TResult[]>|string
        ): LoDashExplicitArrayWrapper<TResult>;

        /**
         * @see _.flatMap
         */
        flatMap<TWhere extends Object>(
            iteratee: TWhere
        ): LoDashExplicitArrayWrapper<boolean>;

        /**
         * @see _.flatMap
         */
        flatMap(
            iteratee: [string, any]
        ): LoDashExplicitArrayWrapper<boolean>;

        /**
         * @see _.flatMap
         */
        flatMap<TResult>(): LoDashExplicitArrayWrapper<TResult>;
    }


//_.forEach
interface LoDashStatic {
        /**
         * Iterates over elements of collection invoking iteratee for each element. The iteratee is bound to thisArg
         * and invoked with three arguments:
         * (value, index|key, collection). Iteratee functions may exit iteration early by explicitly returning false.
         *
         * Note: As with other "Collections" methods, objects with a "length" property are iterated like arrays. To
         * avoid this behavior _.forIn or _.forOwn may be used for object iteration.
         *
         * @alias _.each
         *
         * @param collection The collection to iterate over.
         * @param iteratee The function invoked per iteration.
         * @param thisArg The this binding of iteratee.
         */
        forEach<T>(
            collection: T[],
            iteratee?: ListIterator<T, any>,
            thisArg?: any
        ): T[];

        /**
         * @see _.forEach
         */
        forEach<T>(
            collection: List<T>,
            iteratee?: ListIterator<T, any>,
            thisArg?: any
        ): List<T>;

        /**
         * @see _.forEach
         */
        forEach<T>(
            collection: Dictionary<T>,
            iteratee?: DictionaryIterator<T, any>,
            thisArg?: any
        ): Dictionary<T>;

        /**
         * @see _.forEach
         */
        forEach<T extends {}>(
            collection: T,
            iteratee?: ObjectIterator<any, any>,
            thisArgs?: any
        ): T;

        /**
         * @see _.forEach
         */
        forEach<T extends {}, TValue>(
            collection: T,
            iteratee?: ObjectIterator<TValue, any>,
            thisArgs?: any
        ): T;
    }


interface LoDashImplicitWrapper<T> {
        /**
         * @see _.forEach
         */
        forEach(
            iteratee: ListIterator<string, any>,
            thisArg?: any
        ): LoDashImplicitWrapper<string>;
    }


interface LoDashImplicitArrayWrapper<T> {
        /**
         * @see _.forEach
         */
        forEach(
            iteratee: ListIterator<T, any>,
            thisArg?: any
        ): LoDashImplicitArrayWrapper<T>;
    }


interface LoDashImplicitObjectWrapper<T> {
        /**
         * @see _.forEach
         */
        forEach<TValue>(
            iteratee?: ListIterator<TValue, any>|DictionaryIterator<TValue, any>,
            thisArg?: any
        ): LoDashImplicitObjectWrapper<T>;
    }


interface LoDashExplicitWrapper<T> {
        /**
         * @see _.forEach
         */
        forEach(
            iteratee: ListIterator<string, any>,
            thisArg?: any
        ): LoDashExplicitWrapper<string>;
    }


interface LoDashExplicitArrayWrapper<T> {
        /**
         * @see _.forEach
         */
        forEach(
            iteratee: ListIterator<T, any>,
            thisArg?: any
        ): LoDashExplicitArrayWrapper<T>;
    }


interface LoDashExplicitObjectWrapper<T> {
        /**
         * @see _.forEach
         */
        forEach<TValue>(
            iteratee?: ListIterator<TValue, any>|DictionaryIterator<TValue, any>,
            thisArg?: any
        ): LoDashExplicitObjectWrapper<T>;
    }


//_.forEachRight
interface LoDashStatic {
        /**
         * This method is like _.forEach except that it iterates over elements of collection from right to left.
         *
         * @alias _.eachRight
         *
         * @param collection The collection to iterate over.
         * @param iteratee The function called per iteration.
         * @param thisArg The this binding of callback.
         */
        forEachRight<T>(
            collection: T[],
            iteratee?: ListIterator<T, any>,
            thisArg?: any
        ): T[];

        /**
         * @see _.forEachRight
         */
        forEachRight<T>(
            collection: List<T>,
            iteratee?: ListIterator<T, any>,
            thisArg?: any
        ): List<T>;

        /**
         * @see _.forEachRight
         */
        forEachRight<T>(
            collection: Dictionary<T>,
            iteratee?: DictionaryIterator<T, any>,
            thisArg?: any
        ): Dictionary<T>;

        /**
         * @see _.forEachRight
         */
        forEachRight<T extends {}>(
            collection: T,
            iteratee?: ObjectIterator<any, any>,
            thisArgs?: any
        ): T;

        /**
         * @see _.forEachRight
         */
        forEachRight<T extends {}, TValue>(
            collection: T,
            iteratee?: ObjectIterator<TValue, any>,
            thisArgs?: any
        ): T;
    }


interface LoDashImplicitWrapper<T> {
        /**
         * @see _.forEachRight
         */
        forEachRight(
            iteratee: ListIterator<string, any>,
            thisArg?: any
        ): LoDashImplicitWrapper<string>;
    }


interface LoDashImplicitArrayWrapper<T> {
        /**
         * @see _.forEachRight
         */
        forEachRight(
            iteratee: ListIterator<T, any>,
            thisArg?: any
        ): LoDashImplicitArrayWrapper<T>;
    }


interface LoDashImplicitObjectWrapper<T> {
        /**
         * @see _.forEachRight
         */
        forEachRight<TValue>(
            iteratee?: ListIterator<TValue, any>|DictionaryIterator<TValue, any>,
            thisArg?: any
        ): LoDashImplicitObjectWrapper<T>;
    }


interface LoDashExplicitWrapper<T> {
        /**
         * @see _.forEachRight
         */
        forEachRight(
            iteratee: ListIterator<string, any>,
            thisArg?: any
        ): LoDashExplicitWrapper<string>;
    }


interface LoDashExplicitArrayWrapper<T> {
        /**
         * @see _.forEachRight
         */
        forEachRight(
            iteratee: ListIterator<T, any>,
            thisArg?: any
        ): LoDashExplicitArrayWrapper<T>;
    }


interface LoDashExplicitObjectWrapper<T> {
        /**
         * @see _.forEachRight
         */
        forEachRight<TValue>(
            iteratee?: ListIterator<TValue, any>|DictionaryIterator<TValue, any>,
            thisArg?: any
        ): LoDashExplicitObjectWrapper<T>;
    }