/**
     * Add fallbacks to locales. Locales should be in IETF language tag format.
     *
     * @param {Array<string>} locales - list of locales
     * @returns {Array<string>} locales with fallbacks
     */
public transform(locales: string[]): string[] {
        return locales.map((locale) => {
            const splitedLocale = locale.split('-');
            return splitedLocale.map((value, index) => {
                const localeGenerator = [];
                for (let i = 0; i <= index; i++) {
                    localeGenerator.push(splitedLocale[i]);
                }
                return localeGenerator.join('-');
            }).reverse();
        }).reduce((a, b) => a.concat(b), []);
    }


() => {
    const fetchData = async () => {
      const response = await fetch(
        'https://gw.alipayobjects.com/os/basement_prod/893d1d5f-11d9-45f3-8322-ee9140d288ae.json',
      );
      const data = await response.json();

      setData(data);
    };
    fetchData();
  }


async () => {
      const response = await fetch(
        'https://gw.alipayobjects.com/os/basement_prod/893d1d5f-11d9-45f3-8322-ee9140d288ae.json',
      );
      const data = await response.json();

      setData(data);
    }


export enum Elements {
    Fire,
    Water
}


(id: string) =>
  api.get<any>(`/pms/product-category/${id}`)


(parentId: number, params: any) =>
  api.get<any, any>(`/pms/product-category/list/${parentId}`, { params })


(data: any) =>
  api.post<any>('/pms/product-category', data)


(id: string, data: any) =>
  api.put<any>(`/pms/product-category/${id}`, data)


(ids: Array<string>) =>
  api.delete<any>('/pms/product-category', { data: { ids } })


(data: any) =>
  api.put<any>('/pms/product-category/show-status', data)


(data: any) =>
  api.put<any>('/pms/product-category/nav-status', data)


() =>
  api.get<any, any>('/pms/product-category/list/with-children')


() => [Course]


@ObjectType({ description: 'student' })
export class Student {
  @Field(() => ID)
  id: string;

  @Field()
  name: string;

  @Field()
  email: string;

  @Field()
  createdAt: Date;

  @Field()
  updatedAt: Date;

  @Field(() => [Course], { nullable: true })
  courses?: Course[];
}


@NgModule({
  imports: [RouterModule.forChild(routes)],
  exports: [RouterModule]
})
export class DashboardRoutingModule {}


export class StopInstanceCommand extends $Command<
  StopInstanceCommandInput,
  StopInstanceCommandOutput,
  LightsailClientResolvedConfig
> {
  // Start section: command_properties
  // End section: command_properties

  constructor(readonly input: StopInstanceCommandInput) {
    // Start section: command_constructor
    super();
    // End section: command_constructor
  }

  resolveMiddleware(
    clientStack: MiddlewareStack<ServiceInputTypes, ServiceOutputTypes>,
    configuration: LightsailClientResolvedConfig,
    options?: __HttpHandlerOptions
  ): Handler<StopInstanceCommandInput, StopInstanceCommandOutput> {
    this.middlewareStack.use(getSerdePlugin(configuration, this.serialize, this.deserialize));

    const stack = clientStack.concat(this.middlewareStack);

    const handlerExecutionContext: HandlerExecutionContext = {
      logger: {} as any,
    };
    const { requestHandler } = configuration;
    return stack.resolve(
      (request: FinalizeHandlerArguments<any>) =>
        requestHandler.handle(request.request as __HttpRequest, options || {}),
      handlerExecutionContext
    );
  }

  private serialize(input: StopInstanceCommandInput, context: __SerdeContext): Promise<__HttpRequest> {
    return serializeAws_json1_1StopInstanceCommand(input, context);
  }

  private deserialize(output: __HttpResponse, context: __SerdeContext): Promise<StopInstanceCommandOutput> {
    return deserializeAws_json1_1StopInstanceCommand(output, context);
  }

  // Start section: command_body_extra
  // End section: command_body_extra
}


export type StopInstanceCommandInput = StopInstanceRequest;


export type StopInstanceCommandOutput = StopInstanceResult & __MetadataBearer;


resolveMiddleware(
    clientStack: MiddlewareStack<ServiceInputTypes, ServiceOutputTypes>,
    configuration: LightsailClientResolvedConfig,
    options?: __HttpHandlerOptions
  ): Handler<StopInstanceCommandInput, StopInstanceCommandOutput> {
    this.middlewareStack.use(getSerdePlugin(configuration, this.serialize, this.deserialize));

    const stack = clientStack.concat(this.middlewareStack);

    const handlerExecutionContext: HandlerExecutionContext = {
      logger: {} as any,
    };
    const { requestHandler } = configuration;
    return stack.resolve(
      (request: FinalizeHandlerArguments<any>) =>
        requestHandler.handle(request.request as __HttpRequest, options || {}),
      handlerExecutionContext
    );
  }


private serialize(input: StopInstanceCommandInput, context: __SerdeContext): Promise<__HttpRequest> {
    return serializeAws_json1_1StopInstanceCommand(input, context);
  }


private deserialize(output: __HttpResponse, context: __SerdeContext): Promise<StopInstanceCommandOutput> {
    return deserializeAws_json1_1StopInstanceCommand(output, context);
  }


({
    name,
    withTime,
    maxDate,
    minDate,
    defaultValue,
    ...datePickerProps
}) => {
    const { t } = useTranslation('form');
    const Component = withTime ? DateTimePicker : DatePicker;
    const {
        control,
        formState: { errors },
    } = useFormContext();

    const {
        // eslint-disable-next-line @typescript-eslint/no-unused-vars
        field: { ref: _ref, value, ...rest },
    } = useController({
        name,
        control,
        defaultValue: defaultValue || '',
    });

    const error = _.get(errors, name);

    return (
        <Component
            inputFormat={withTime ? 'dd/MM/yyyy HH:mm' : 'dd/MM/yyyy'}
            ampm={false}
            okText={t('form:date_picker.ok')}
            cancelText={t('form:date_picker.cancel')}
            clearText={t('form:date_picker.clear')}
            todayText={t('form:date_picker.today')}
            maxDate={maxDate}
            minDate={minDate}
            renderInput={(props): ReactElement => (
                <TextField
                    {...props}
                    {...datePickerProps}
                    error={Boolean(error)}
                    helperText={<ValidationErrorMessage error={error?.message} />}


ReactElement => (
                <TextField
                    {...props}


type Props = Omit<
    Pick<DateTimePickerProps & DatePickerProps, 'maxDate' | 'minDate'> &
        TextFieldProps & {
            name: string;
            withTime?: boolean;
        },
    'onChange' | 'value'
>;


Boolean(error)


@Controller('user')
export class UserController {
  constructor(private readonly userService: UserService) { }

  @Post()
  async create(@Body() body: CreateUserDto) {
    try {
      return this.userService.create(body);
    }
    catch (err) {
      throw new Error(err)
    }
  }

  @Get()
  async get(): Promise<User[]> {
    return this.userService.findAll()
  }
}


@Post()
  async create(@Body() body: CreateUserDto) {
    try {
      return this.userService.create(body);
    }
    catch (err) {
      throw new Error(err)
    }
  }


@Get()
  async get(): Promise<User[]> {
    return this.userService.findAll()
  }


() => {
    let service: ErrorService;

    beforeEach(() => {
        TestBed.configureTestingModule({
            imports: [E2EImportsModule]
        });
        service = TestBed.inject(ErrorService);
    });

    it(`should be created`, () => {
        expect(service).toBeTruthy();
    });
}


() => {
        TestBed.configureTestingModule({
            imports: [E2EImportsModule]
        });
        service = TestBed.inject(ErrorService);
    }


() => {
        expect(service).toBeTruthy();
    }


interface LoDashStatic {
        /**
        * Creates a lodash object which wraps the given value to enable intuitive method chaining.
        *
        * In addition to Lo-Dash methods, wrappers also have the following Array methods:
        * concat, join, pop, push, reverse, shift, slice, sort, splice, and unshift
        *
        * Chaining is supported in custom builds as long as the value method is implicitly or
        * explicitly included in the build.
        *
        * The chainable wrapper functions are:
        * after, assign, bind, bindAll, bindKey, chain, chunk, compact, compose, concat, countBy,
        * createCallback, curry, debounce, defaults, defer, delay, difference, filter, flatten,
        * forEach, forEachRight, forIn, forInRight, forOwn, forOwnRight, functions, groupBy,
        * keyBy, initial, intersection, invert, invoke, keys, map, max, memoize, merge, min,
        * object, omit, once, pairs, partial, partialRight, pick, pluck, pull, push, range, reject,
        * remove, rest, reverse, sample, shuffle, slice, sort, sortBy, splice, tap, throttle, times,
        * toArray, transform, union, uniq, unset, unshift, unzip, values, where, without, wrap, and zip
        *
        * The non-chainable wrapper functions are:
        * clone, cloneDeep, contains, escape, every, find, findIndex, findKey, findLast,
        * findLastIndex, findLastKey, has, identity, indexOf, isArguments, isArray, isBoolean,
        * isDate, isElement, isEmpty, isEqual, isFinite, isFunction, isNaN, isNull, isNumber,
        * isObject, isPlainObject, isRegExp, isString, isUndefined, join, lastIndexOf, mixin,
        * noConflict, parseInt, pop, random, reduce, reduceRight, result, shift, size, some,
        * sortedIndex, runInContext, template, unescape, uniqueId, and value
        *
        * The wrapper functions first and last return wrapped values when n is provided, otherwise
        * they return unwrapped values.
        *
        * Explicit chaining can be enabled by using the _.chain method.
        **/
        (value: number): LoDashImplicitWrapper<number>;
        (value: string): LoDashImplicitStringWrapper;
        (value: boolean): LoDashImplicitWrapper<boolean>;
        (value: Array<number>): LoDashImplicitNumberArrayWrapper;
        <T>(value: Array<T>): LoDashImplicitArrayWrapper<T>;
        <T extends {}>(value: T): LoDashImplicitObjectWrapper<T>;
        (value: any): LoDashImplicitWrapper<any>;

        /**
        * The semantic version number.
        **/
        VERSION: string;

        /**
        * By default, the template delimiters used by Lo-Dash are similar to those in embedded Ruby
        * (ERB). Change the following template settings to use alternative delimiters.
        **/
        templateSettings: TemplateSettings;
    }


/**
    * By default, the template delimiters used by Lo-Dash are similar to those in embedded Ruby
    * (ERB). Change the following template settings to use alternative delimiters.
    **/
interface TemplateSettings {
        /**
        * The "escape" delimiter.
        **/
        escape?: RegExp;

        /**
        * The "evaluate" delimiter.
        **/
        evaluate?: RegExp;

        /**
        * An object to import into the template as local variables.
        **/
        imports?: Dictionary<any>;

        /**
        * The "interpolate" delimiter.
        **/
        interpolate?: RegExp;

        /**
        * Used to reference the data object in the template text.
        **/
        variable?: string;
    }


/**
     * Creates a cache object to store key/value pairs.
     */
interface MapCache {
        /**
         * Removes `key` and its value from the cache.
         * @param key The key of the value to remove.
         * @return Returns `true` if the entry was removed successfully, else `false`.
         */
        delete(key: string): boolean;

        /**
         * Gets the cached value for `key`.
         * @param key The key of the value to get.
         * @return Returns the cached value.
         */
        get(key: string): any;

        /**
         * Checks if a cached value for `key` exists.
         * @param key The key of the entry to check.
         * @return Returns `true` if an entry for `key` exists, else `false`.
         */
        has(key: string): boolean;

        /**
         * Sets `value` to `key` of the cache.
         * @param key The key of the value to cache.
         * @param value The value to cache.
         * @return Returns the cache object.
         */
        set(key: string, value: any): _.Dictionary<any>;
    }


interface LoDashWrapperBase<T, TWrapper> { }


interface LoDashImplicitWrapperBase<T, TWrapper> extends LoDashWrapperBase<T, TWrapper> { }


interface LoDashExplicitWrapperBase<T, TWrapper> extends LoDashWrapperBase<T, TWrapper> { }


interface LoDashImplicitWrapper<T> extends LoDashImplicitWrapperBase<T, LoDashImplicitWrapper<T>> { }


interface LoDashExplicitWrapper<T> extends LoDashExplicitWrapperBase<T, LoDashExplicitWrapper<T>> { }


interface LoDashImplicitStringWrapper extends LoDashImplicitWrapper<string> { }


interface LoDashExplicitStringWrapper extends LoDashExplicitWrapper<string> { }


interface LoDashImplicitObjectWrapper<T> extends LoDashImplicitWrapperBase<T, LoDashImplicitObjectWrapper<T>> { }


interface LoDashExplicitObjectWrapper<T> extends LoDashExplicitWrapperBase<T, LoDashExplicitObjectWrapper<T>> { }


interface LoDashImplicitArrayWrapper<T> extends LoDashImplicitWrapperBase<T[], LoDashImplicitArrayWrapper<T>> {
        pop(): T;
        push(...items: T[]): LoDashImplicitArrayWrapper<T>;
        shift(): T;
        sort(compareFn?: (a: T, b: T) => number): LoDashImplicitArrayWrapper<T>;
        splice(start: number): LoDashImplicitArrayWrapper<T>;
        splice(start: number, deleteCount: number, ...items: any[]): LoDashImplicitArrayWrapper<T>;
        unshift(...items: T[]): LoDashImplicitArrayWrapper<T>;
    }


interface LoDashExplicitArrayWrapper<T> extends LoDashExplicitWrapperBase<T[], LoDashExplicitArrayWrapper<T>> { }


interface LoDashImplicitNumberArrayWrapper extends LoDashImplicitArrayWrapper<number> { }


interface LoDashExplicitNumberArrayWrapper extends LoDashExplicitArrayWrapper<number> { }


/*********
     * Array *
     *********/
//_.chunk
interface LoDashStatic {
        /**
         * Creates an array of elements split into groups the length of size. If collection can’t be split evenly, the
         * final chunk will be the remaining elements.
         *
         * @param array The array to process.
         * @param size The length of each chunk.
         * @return Returns the new array containing chunks.
         */
        chunk<T>(
            array: List<T>,
            size?: number
        ): T[][];
    }


interface LoDashImplicitArrayWrapper<T> {
        /**
         * @see _.chunk
         */
        chunk(size?: number): LoDashImplicitArrayWrapper<T[]>;
    }


interface LoDashImplicitObjectWrapper<T> {
        /**
         * @see _.chunk
         */
        chunk<TResult>(size?: number): LoDashImplicitArrayWrapper<TResult[]>;
    }


interface LoDashExplicitArrayWrapper<T> {
        /**
         * @see _.chunk
         */
        chunk(size?: number): LoDashExplicitArrayWrapper<T[]>;
    }


interface LoDashExplicitObjectWrapper<T> {
        /**
         * @see _.chunk
         */
        chunk<TResult>(size?: number): LoDashExplicitArrayWrapper<TResult[]>;
    }


//_.compact
interface LoDashStatic {
        /**
         * Creates an array with all falsey values removed. The values false, null, 0, "", undefined, and NaN are
         * falsey.
         *
         * @param array The array to compact.
         * @return (Array) Returns the new array of filtered values.
         */
        compact<T>(array?: List<T>): T[];
    }


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


interface LoDashImplicitObjectWrapper<T> {
        /**
         * @see _.compact
         */
        compact<TResult>(): LoDashImplicitArrayWrapper<TResult>;
    }


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


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


//_.concat DUMMY
interface LoDashStatic {
        /**
         * Creates a new array concatenating `array` with any additional arrays
         * and/or values.
         *
         * @static
         * @memberOf _
         * @category Array
         * @param {Array} array The array to concatenate.
         * @param {...*} [values] The values to concatenate.
         * @returns {Array} Returns the new concatenated array.
         * @example
         *
         * var array = [1];
         * var other = _.concat(array, 2, [3], [[4]]);
         *
         * console.log(other);
         * // => [1, 2, 3, [4]]
         *
         * console.log(array);
         * // => [1]
         */
         concat<T>(...values: (T[]|List<T>)[]) : T[];
    }


//_.difference
interface LoDashStatic {
        /**
         * Creates an array of unique array values not included in the other provided arrays using SameValueZero for
         * equality comparisons.
         *
         * @param array The array to inspect.
         * @param values The arrays of values to exclude.
         * @return Returns the new array of filtered values.
         */
        difference<T>(
            array: T[]|List<T>,
            ...values: Array<T[]|List<T>>
        ): T[];
    }


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


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


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


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


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

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

        /**
         * @see _.differenceBy
         */
        differenceBy<T>(
            array: T[]|List<T>,
            values1?: T[]|List<T>,
            values2?: T[]|List<T>,
            iteratee?: ((value: T) => any)|string
        ): T[];

        /**
         * @see _.differenceBy
         */
        differenceBy<T, W extends Object>(
            array: T[]|List<T>,
            values1?: T[]|List<T>,
            values2?: T[]|List<T>,
            iteratee?: W
        ): T[];

        /**
         * @see _.differenceBy
         */
        differenceBy<T>(
            array: T[]|List<T>,
            values1?: T[]|List<T>,
            values2?: T[]|List<T>,
            values3?: T[]|List<T>,
            iteratee?: ((value: T) => any)|string
        ): T[];

        /**
         * @see _.differenceBy
         */
        differenceBy<T, W extends Object>(
            array: T[]|List<T>,
            values1?: T[]|List<T>,
            values2?: T[]|List<T>,
            values3?: T[]|List<T>,
            iteratee?: W
        ): T[];

        /**
         * @see _.differenceBy
         */
        differenceBy<T, W extends Object>(
            array: T[]|List<T>,
            values1?: T[]|List<T>,
            values2?: T[]|List<T>,
            values3?: T[]|List<T>,
            values4?: T[]|List<T>,
            iteratee?: W
        ): T[];

        /**
         * @see _.differenceBy
         */
        differenceBy<T>(
            array: T[]|List<T>,
            values1?: T[]|List<T>,
            values2?: T[]|List<T>,
            values3?: T[]|List<T>,
            values4?: T[]|List<T>,
            iteratee?: ((value: T) => any)|string
        ): T[];

        /**
         * @see _.differenceBy
         */
        differenceBy<T>(
            array: T[]|List<T>,
            values1?: T[]|List<T>,
            values2?: T[]|List<T>,
            values3?: T[]|List<T>,
            values4?: T[]|List<T>,
            values5?: T[]|List<T>,
            iteratee?: ((value: T) => any)|string
        ): T[];

        /**
         * @see _.differenceBy
         */
        differenceBy<T, W extends Object>(
            array: T[]|List<T>,
            values1?: T[]|List<T>,
            values2?: T[]|List<T>,
            values3?: T[]|List<T>,
            values4?: T[]|List<T>,
            values5?: T[]|List<T>,
            iteratee?: W
        ): T[];

        /**
         * @see _.differenceBy
         */
        differenceBy<T>(
            array: T[]|List<T>,
            ...values: any[]
        ): T[];
    }


interface LoDashImplicitArrayWrapper<T> {
        /**
         * @see _.differenceBy
         */
        differenceBy<T>(
            values?: T[]|List<T>,
            iteratee?: ((value: T) => any)|string
        ): LoDashImplicitArrayWrapper<T>;

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

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

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

        /**
         * @see _.differenceBy
         */
        differenceBy<T>(
            values1?: T[]|List<T>,
            values2?: T[]|List<T>,
            values3?: T[]|List<T>,
            iteratee?: ((value: T) => any)|string
        ): LoDashImplicitArrayWrapper<T>;

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

        /**
         * @see _.differenceBy
         */
        differenceBy<T>(
            values1?: T[]|List<T>,
            values2?: T[]|List<T>,
            values3?: T[]|List<T>,
            values4?: T[]|List<T>,
            iteratee?: ((value: T) => any)|string
        ): LoDashImplicitArrayWrapper<T>;

        /**
         * @see _.differenceBy
         */
        differenceBy<T, W extends Object>(
            values1?: T[]|List<T>,
            values2?: T[]|List<T>,
            values3?: T[]|List<T>,
            values4?: T[]|List<T>,
            iteratee?: W
        ): LoDashImplicitArrayWrapper<T>;

        /**
         * @see _.differenceBy
         */
        differenceBy<T>(
            values1?: T[]|List<T>,
            values2?: T[]|List<T>,
            values3?: T[]|List<T>,
            values4?: T[]|List<T>,
            values5?: T[]|List<T>,
            iteratee?: ((value: T) => any)|string
        ): LoDashImplicitArrayWrapper<T>;

        /**
         * @see _.differenceBy
         */
        differenceBy<T, W extends Object>(
            values1?: T[]|List<T>,
            values2?: T[]|List<T>,
            values3?: T[]|List<T>,
            values4?: T[]|List<T>,
            values5?: T[]|List<T>,
            iteratee?: W
        ): LoDashImplicitArrayWrapper<T>;

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


interface LoDashImplicitObjectWrapper<T> {
        /**
         * @see _.differenceBy
         */
        differenceBy<T>(
            values?: T[]|List<T>,
            iteratee?: ((value: T) => any)|string
        ): LoDashImplicitArrayWrapper<T>;

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

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

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

        /**
         * @see _.differenceBy
         */
        differenceBy<T>(
            values1?: T[]|List<T>,
            values2?: T[]|List<T>,
            values3?: T[]|List<T>,
            iteratee?: ((value: T) => any)|string
        ): LoDashImplicitArrayWrapper<T>;

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

        /**
         * @see _.differenceBy
         */
        differenceBy<T>(
            values1?: T[]|List<T>,
            values2?: T[]|List<T>,
            values3?: T[]|List<T>,
            values4?: T[]|List<T>,
            iteratee?: ((value: T) => any)|string
        ): LoDashImplicitArrayWrapper<T>;

        /**
         * @see _.differenceBy
         */
        differenceBy<T, W extends Object>(
            values1?: T[]|List<T>,
            values2?: T[]|List<T>,
            values3?: T[]|List<T>,
            values4?: T[]|List<T>,
            iteratee?: W
        ): LoDashImplicitArrayWrapper<T>;

        /**
         * @see _.differenceBy
         */
        differenceBy<T>(
            values1?: T[]|List<T>,
            values2?: T[]|List<T>,
            values3?: T[]|List<T>,
            values4?: T[]|List<T>,
            values5?: T[]|List<T>,
            iteratee?: ((value: T) => any)|string
        ): LoDashImplicitArrayWrapper<T>;

        /**
         * @see _.differenceBy
         */
        differenceBy<T, W extends Object>(
            values1?: T[]|List<T>,
            values2?: T[]|List<T>,
            values3?: T[]|List<T>,
            values4?: T[]|List<T>,
            values5?: T[]|List<T>,
            iteratee?: W
        ): LoDashImplicitArrayWrapper<T>;

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


interface LoDashExplicitArrayWrapper<T> {
        /**
         * @see _.differenceBy
         */
        differenceBy<T>(
            values?: T[]|List<T>,
            iteratee?: ((value: T) => any)|string
        ): LoDashExplicitArrayWrapper<T>;

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

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

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

        /**
         * @see _.differenceBy
         */
        differenceBy<T>(
            values1?: T[]|List<T>,
            values2?: T[]|List<T>,
            values3?: T[]|List<T>,
            iteratee?: ((value: T) => any)|string
        ): LoDashExplicitArrayWrapper<T>;

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

        /**
         * @see _.differenceBy
         */
        differenceBy<T>(
            values1?: T[]|List<T>,
            values2?: T[]|List<T>,
            values3?: T[]|List<T>,
            values4?: T[]|List<T>,
            iteratee?: ((value: T) => any)|string
        ): LoDashExplicitArrayWrapper<T>;

        /**
         * @see _.differenceBy
         */
        differenceBy<T, W extends Object>(
            values1?: T[]|List<T>,
            values2?: T[]|List<T>,
            values3?: T[]|List<T>,
            values4?: T[]|List<T>,
            iteratee?: W
        ): LoDashExplicitArrayWrapper<T>;

        /**
         * @see _.differenceBy
         */
        differenceBy<T>(
            values1?: T[]|List<T>,
            values2?: T[]|List<T>,
            values3?: T[]|List<T>,
            values4?: T[]|List<T>,
            values5?: T[]|List<T>,
            iteratee?: ((value: T) => any)|string
        ): LoDashExplicitArrayWrapper<T>;

        /**
         * @see _.differenceBy
         */
        differenceBy<T, W extends Object>(
            values1?: T[]|List<T>,
            values2?: T[]|List<T>,
            values3?: T[]|List<T>,
            values4?: T[]|List<T>,
            values5?: T[]|List<T>,
            iteratee?: W
        ): LoDashExplicitArrayWrapper<T>;

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


interface LoDashExplicitObjectWrapper<T> {
        /**
         * @see _.differenceBy
         */
        differenceBy<T>(
            values?: T[]|List<T>,
            iteratee?: ((value: T) => any)|string
        ): LoDashExplicitArrayWrapper<T>;

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

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

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

        /**
         * @see _.differenceBy
         */
        differenceBy<T>(
            values1?: T[]|List<T>,
            values2?: T[]|List<T>,
            values3?: T[]|List<T>,
            iteratee?: ((value: T) => any)|string
        ): LoDashExplicitArrayWrapper<T>;

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

        /**
         * @see _.differenceBy
         */
        differenceBy<T>(
            values1?: T[]|List<T>,
            values2?: T[]|List<T>,
            values3?: T[]|List<T>,
            values4?: T[]|List<T>,
            iteratee?: ((value: T) => any)|string
        ): LoDashExplicitArrayWrapper<T>;

        /**
         * @see _.differenceBy
         */
        differenceBy<T, W extends Object>(
            values1?: T[]|List<T>,
            values2?: T[]|List<T>,
            values3?: T[]|List<T>,
            values4?: T[]|List<T>,
            iteratee?: W
        ): LoDashExplicitArrayWrapper<T>;

        /**
         * @see _.differenceBy
         */
        differenceBy<T>(
            values1?: T[]|List<T>,
            values2?: T[]|List<T>,
            values3?: T[]|List<T>,
            values4?: T[]|List<T>,
            values5?: T[]|List<T>,
            iteratee?: ((value: T) => any)|string
        ): LoDashExplicitArrayWrapper<T>;

        /**
         * @see _.differenceBy
         */
        differenceBy<T, W extends Object>(
            values1?: T[]|List<T>,
            values2?: T[]|List<T>,
            values3?: T[]|List<T>,
            values4?: T[]|List<T>,
            values5?: T[]|List<T>,
            iteratee?: W
        ): LoDashExplicitArrayWrapper<T>;

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


//_.differenceWith DUMMY
interface LoDashStatic {
        /**
         * Creates an array of unique `array` values not included in the other
         * provided arrays using [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero)
         * for equality comparisons.
         *
         * @static
         * @memberOf _
         * @category Array
         * @param {Array} array The array to inspect.
         * @param {...Array} [values] The values to exclude.
         * @returns {Array} Returns the new array of filtered values.
         * @example
         *
         * _.difference([3, 2, 1], [4, 2]);
         * // => [3, 1]
         */
        differenceWith(
            array: any[]|List<any>,
            ...values: any[]
        ): any[];
    }


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


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


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


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


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


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


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


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


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


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


//_.dropRightWhile
interface LoDashStatic {
        /**
         * Creates a slice of array excluding elements dropped from the end. Elements are dropped 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
         * match 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.
         */
        dropRightWhile<TValue>(
            array: List<TValue>,
            predicate?: ListIterator<TValue, boolean>,
            thisArg?: any
        ): TValue[];

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

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


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

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

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


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

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

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


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

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

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


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

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

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


//_.dropWhile
interface LoDashStatic {
        /**
         * Creates a slice of array excluding elements dropped from the beginning. Elements are dropped 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.
         */
        dropWhile<TValue>(
            array: List<TValue>,
            predicate?: ListIterator<TValue, boolean>,
            thisArg?: any
        ): TValue[];

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

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


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

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

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


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

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

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


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

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

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


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

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

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


//_.fill
interface LoDashStatic {
        /**
         * Fills elements of array with value from start up to, but not including, end.
         *
         * Note: This method mutates array.
         *
         * @param array The array to fill.
         * @param value The value to fill array with.
         * @param start The start position.
         * @param end The end position.
         * @return Returns array.
         */
        fill<T>(
            array: any[],
            value: T,
            start?: number,
            end?: number
        ): T[];

        /**
         * @see _.fill
         */
        fill<T>(
            array: List<any>,
            value: T,
            start?: number,
            end?: number
        ): List<T>;
    }


interface LoDashImplicitArrayWrapper<T> {
        /**
         * @see _.fill
         */
        fill<T>(
            value: T,
            start?: number,
            end?: number
        ): LoDashImplicitArrayWrapper<T>;
    }


interface LoDashImplicitObjectWrapper<T> {
        /**
         * @see _.fill
         */
        fill<T>(
            value: T,
            start?: number,
            end?: number
        ): LoDashImplicitObjectWrapper<List<T>>;
    }


interface LoDashExplicitArrayWrapper<T> {
        /**
         * @see _.fill
         */
        fill<T>(
            value: T,
            start?: number,
            end?: number
        ): LoDashExplicitArrayWrapper<T>;
    }


interface LoDashExplicitObjectWrapper<T> {
        /**
         * @see _.fill
         */
        fill<T>(
            value: T,
            start?: number,
            end?: number
        ): LoDashExplicitObjectWrapper<List<T>>;
    }


//_.findIndex
interface LoDashStatic {
        /**
         * This method is like _.find except that it returns the index of the first element predicate returns truthy
         * for instead of the element itself.
         *
         * 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 search.
         * @param predicate The function invoked per iteration.
         * @param thisArg The this binding of predicate.
         * @return Returns the index of the found element, else -1.
         */
        findIndex<T>(
            array: List<T>,
            predicate?: ListIterator<T, boolean>,
            thisArg?: any
        ): number;

        /**
         * @see _.findIndex
         */
        findIndex<T>(
            array: List<T>,
            predicate?: string,
            thisArg?: any
        ): number;

        /**
         * @see _.findIndex
         */
        findIndex<W, T>(
            array: List<T>,
            predicate?: W
        ): number;
    }


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

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

        /**
         * @see _.findIndex
         */
        findIndex<W>(
            predicate?: W
        ): number;
    }


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

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

        /**
         * @see _.findIndex
         */
        findIndex<W>(
            predicate?: W
        ): number;
    }


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

        /**
         * @see _.findIndex
         */
        findIndex(
            predicate?: string,
            thisArg?: any
        ): LoDashExplicitWrapper<number>;

        /**
         * @see _.findIndex
         */
        findIndex<W>(
            predicate?: W
        ): LoDashExplicitWrapper<number>;
    }


interface LoDashExplicitObjectWrapper<T> {
        /**
         * @see _.findIndex
         */
        findIndex<TResult>(
            predicate?: ListIterator<TResult, boolean>,
            thisArg?: any
        ): LoDashExplicitWrapper<number>;

        /**
         * @see _.findIndex
         */
        findIndex(
            predicate?: string,
            thisArg?: any
        ): LoDashExplicitWrapper<number>;

        /**
         * @see _.findIndex
         */
        findIndex<W>(
            predicate?: W
        ): LoDashExplicitWrapper<number>;
    }


//_.findLastIndex
interface LoDashStatic {
        /**
         * This method is like _.findIndex except that it iterates over elements of collection from right to left.
         *
         * 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 search.
         * @param predicate The function invoked per iteration.
         * @param thisArg The function invoked per iteration.
         * @return Returns the index of the found element, else -1.
         */
        findLastIndex<T>(
            array: List<T>,
            predicate?: ListIterator<T, boolean>,
            thisArg?: any
        ): number;

        /**
         * @see _.findLastIndex
         */
        findLastIndex<T>(
            array: List<T>,
            predicate?: string,
            thisArg?: any
        ): number;

        /**
         * @see _.findLastIndex
         */
        findLastIndex<W, T>(
            array: List<T>,
            predicate?: W
        ): number;
    }


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

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

        /**
         * @see _.findLastIndex
         */
        findLastIndex<W>(
            predicate?: W
        ): number;
    }


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

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

        /**
         * @see _.findLastIndex
         */
        findLastIndex<W>(
            predicate?: W
        ): number;
    }


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

        /**
         * @see _.findLastIndex
         */
        findLastIndex(
            predicate?: string,
            thisArg?: any
        ): LoDashExplicitWrapper<number>;

        /**
         * @see _.findLastIndex
         */
        findLastIndex<W>(
            predicate?: W
        ): LoDashExplicitWrapper<number>;
    }


interface LoDashExplicitObjectWrapper<T> {
        /**
         * @see _.findLastIndex
         */
        findLastIndex<TResult>(
            predicate?: ListIterator<TResult, boolean>,
            thisArg?: any
        ): LoDashExplicitWrapper<number>;

        /**
         * @see _.findLastIndex
         */
        findLastIndex(
            predicate?: string,
            thisArg?: any
        ): LoDashExplicitWrapper<number>;

        /**
         * @see _.findLastIndex
         */
        findLastIndex<W>(
            predicate?: W
        ): LoDashExplicitWrapper<number>;
    }


//_.first
interface LoDashStatic {
        /**
         * @see _.head
         */
        first<T>(array: List<T>): T;
    }


interface LoDashImplicitWrapper<T> {
        /**
         * @see _.head
         */
        first(): string;
    }


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


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


interface LoDashExplicitWrapper<T> {
        /**
         * @see _.head
         */
        first(): LoDashExplicitWrapper<string>;
    }


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


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


interface RecursiveArray<T> extends Array<T|RecursiveArray<T>> {}


interface ListOfRecursiveArraysOrValues<T> extends List<T|RecursiveArray<T>> {}


//_.flatten
interface LoDashStatic {
        /**
         * Flattens a nested array. If isDeep is true the array is recursively flattened, otherwise it’s only
         * flattened a single level.
         *
         * @param array The array to flatten.
         * @param isDeep Specify a deep flatten.
         * @return Returns the new flattened array.
         */
        flatten<T>(array: ListOfRecursiveArraysOrValues<T>, isDeep: boolean): T[];

        /**
         * @see _.flatten
         */
        flatten<T>(array: List<T|T[]>): T[];

        /**
         * @see _.flatten
         */
        flatten<T>(array: ListOfRecursiveArraysOrValues<T>): RecursiveArray<T>;
    }


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


interface LoDashImplicitArrayWrapper<T> {
        /**
         * @see _.flatten
         */
        flatten<TResult>(isDeep?: boolean): LoDashImplicitArrayWrapper<TResult>;
    }


interface LoDashImplicitObjectWrapper<T> {
        /**
         * @see _.flatten
         */
        flatten<TResult>(isDeep?: boolean): LoDashImplicitArrayWrapper<TResult>;
    }


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


interface LoDashExplicitArrayWrapper<T> {
        /**
         * @see _.flatten
         */
        flatten<TResult>(isDeep?: boolean): LoDashExplicitArrayWrapper<TResult>;
    }


interface LoDashExplicitObjectWrapper<T> {
        /**
         * @see _.flatten
         */
        flatten<TResult>(isDeep?: boolean): LoDashExplicitArrayWrapper<TResult>;
    }


//_.flattenDeep
interface LoDashStatic {
        /**
         * Recursively flattens a nested array.
         *
         * @param array The array to recursively flatten.
         * @return Returns the new flattened array.
         */
        flattenDeep<T>(array: ListOfRecursiveArraysOrValues<T>): T[];
    }


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


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


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


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


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


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


//_.fromPairs DUMMY
interface LoDashStatic {
        /**
         * The inverse of `_.toPairs`; this method returns an object composed
         * from key-value `pairs`.
         *
         * @static
         * @memberOf _
         * @category Array
         * @param {Array} pairs The key-value pairs.
         * @returns {Object} Returns the new object.
         * @example
         *
         * _.fromPairs([['fred', 30], ['barney', 40]]);
         * // => { 'fred': 30, 'barney': 40 }
         */
        fromPairs(
            array: any[]|List<any>
        ): any[];
    }


//_.head
interface LoDashStatic {
        /**
         * Gets the first element of array.
         *
         * @alias _.first
         *
         * @param array The array to query.
         * @return Returns the first element of array.
         */
        head<T>(array: List<T>): T;
    }


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


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


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


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


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


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


//_.indexOf
interface LoDashStatic {
        /**
         * Gets the index at which the first occurrence of `value` is found in `array`
         * using [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero)
         * for equality comparisons. If `fromIndex` is negative, it's used as the offset
         * from the end of `array`. If `array` is sorted providing `true` for `fromIndex`
         * performs a faster binary search.
         *
         * @static
         * @memberOf _
         * @category Array
         * @param {Array} array The array to search.
         * @param {*} value The value to search for.
         * @param {number} [fromIndex=0] The index to search from.
         * @returns {number} Returns the index of the matched value, else `-1`.
         * @example
         *
         * _.indexOf([1, 2, 1, 2], 2);
         * // => 1
         *
         * // using `fromIndex`
         * _.indexOf([1, 2, 1, 2], 2, 2);
         * // => 3
         */
        indexOf<T>(
            array: List<T>,
            value: T,
            fromIndex?: boolean|number
        ): number;
    }


interface LoDashImplicitArrayWrapper<T> {
        /**
         * @see _.indexOf
         */
        indexOf(
            value: T,
            fromIndex?: boolean|number
        ): number;
    }


interface LoDashImplicitObjectWrapper<T> {
        /**
         * @see _.indexOf
         */
        indexOf<TValue>(
            value: TValue,
            fromIndex?: boolean|number
        ): number;
    }


interface LoDashExplicitArrayWrapper<T> {
        /**
         * @see _.indexOf
         */
        indexOf(
            value: T,
            fromIndex?: boolean|number
        ): LoDashExplicitWrapper<number>;
    }


interface LoDashExplicitObjectWrapper<T> {
        /**
         * @see _.indexOf
         */
        indexOf<TValue>(
            value: TValue,
            fromIndex?: boolean|number
        ): LoDashExplicitWrapper<number>;
    }


//_.intersectionBy DUMMY
interface LoDashStatic {
        /**
         * This method is like `_.intersection` 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 shared values.
         * @example
         *
         * _.intersectionBy([2.1, 1.2], [4.3, 2.4], Math.floor);
         * // => [2.1]
         *
         * // using the `_.property` iteratee shorthand
         * _.intersectionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');
         * // => [{ 'x': 1 }]
         */
        intersectionBy(
            array: any[]|List<any>,
            ...values: any[]
        ): any[];
    }


//_.intersectionWith DUMMY
interface LoDashStatic {
        /**
         * This method is like `_.intersection` 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 shared values.
         * @example
         *
         * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];
         * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];
         *
         * _.intersectionWith(objects, others, _.isEqual);
         * // => [{ 'x': 1, 'y': 2 }]
         */
        intersectionWith(
            array: any[]|List<any>,
            ...values: any[]
        ): any[];
    }


//_.join
interface LoDashStatic {
        /**
         * Converts all elements in `array` into a string separated by `separator`.
         *
         * @param array The array to convert.
         * @param separator The element separator.
         * @returns Returns the joined string.
         */
        join(
            array: List<any>,
            separator?: string
        ): string;
    }


interface LoDashImplicitWrapper<T> {
        /**
         * @see _.join
         */
        join(separator?: string): string;
    }


interface LoDashImplicitArrayWrapper<T> {
        /**
         * @see _.join
         */
        join(separator?: string): string;
    }


interface LoDashImplicitObjectWrapper<T> {
        /**
         * @see _.join
         */
        join(separator?: string): string;
    }


interface LoDashExplicitWrapper<T> {
        /**
         * @see _.join
         */
        join(separator?: string): LoDashExplicitWrapper<string>;
    }


interface LoDashExplicitArrayWrapper<T> {
        /**
         * @see _.join
         */
        join(separator?: string): LoDashExplicitWrapper<string>;
    }


interface LoDashExplicitObjectWrapper<T> {
        /**
         * @see _.join
         */
        join(separator?: string): LoDashExplicitWrapper<string>;
    }


//_.pullAll DUMMY
interface LoDashStatic {
        /**
         * This method is like `_.pull` except that it accepts an array of values to remove.
         *
         * **Note:** Unlike `_.difference`, this method mutates `array`.
         *
         * @static
         * @memberOf _
         * @category Array
         * @param {Array} array The array to modify.
         * @param {Array} values The values to remove.
         * @returns {Array} Returns `array`.
         * @example
         *
         * var array = [1, 2, 3, 1, 2, 3];
         *
         * _.pull(array, [2, 3]);
         * console.log(array);
         * // => [1, 1]
         */
        pullAll(
            array: any[]|List<any>,
            ...values: any[]
        ): any[];
    }


//_.pullAllBy DUMMY
interface LoDashStatic {
        /**
         * This method is like `_.pullAll` except that it accepts `iteratee` which is
         * invoked for each element of `array` and `values` to to generate the criterion
         * by which uniqueness is computed. The iteratee is invoked with one argument: (value).
         *
         * **Note:** Unlike `_.differenceBy`, this method mutates `array`.
         *
         * @static
         * @memberOf _
         * @category Array
         * @param {Array} array The array to modify.
         * @param {Array} values The values to remove.
         * @param {Function|Object|string} [iteratee=_.identity] The iteratee invoked per element.
         * @returns {Array} Returns `array`.
         * @example
         *
         * var array = [{ 'x': 1 }, { 'x': 2 }, { 'x': 3 }, { 'x': 1 }];
         *
         * _.pullAllBy(array, [{ 'x': 1 }, { 'x': 3 }], 'x');
         * console.log(array);
         * // => [{ 'x': 2 }]
         */
        pullAllBy(
            array: any[]|List<any>,
            ...values: any[]
        ): any[];
    }


//_.reverse DUMMY
interface LoDashStatic {
        /**
         * Reverses `array` so that the first element becomes the last, the second
         * element becomes the second to last, and so on.
         *
         * **Note:** This method mutates `array` and is based on
         * [`Array#reverse`](https://mdn.io/Array/reverse).
         *
         * @memberOf _
         * @category Array
         * @returns {Array} Returns `array`.
         * @example
         *
         * var array = [1, 2, 3];
         *
         * _.reverse(array);
         * // => [3, 2, 1]
         *
         * console.log(array);
         * // => [3, 2, 1]
         */
        reverse(
            array: any[]|List<any>,
            ...values: any[]
        ): any[];
    }


//_.sortedIndexOf
interface LoDashStatic {
        /**
         * This method is like `_.indexOf` except that it performs a binary
         * search on a sorted `array`.
         *
         * @static
         * @memberOf _
         * @category Array
         * @param {Array} array The array to search.
         * @param {*} value The value to search for.
         * @returns {number} Returns the index of the matched value, else `-1`.
         * @example
         *
         * _.sortedIndexOf([1, 1, 2, 2], 2);
         * // => 2
         */
        sortedIndexOf<T>(
            array: List<T>,
            value: T
        ): number;
    }


interface LoDashImplicitArrayWrapper<T> {
        /**
         * @see _.sortedIndexOf
         */
        sortedIndexOf(
            value: T
        ): number;
    }


interface LoDashImplicitObjectWrapper<T> {
        /**
         * @see _.sortedIndexOf
         */
        sortedIndexOf<TValue>(
            value: TValue
        ): number;
    }


interface LoDashExplicitArrayWrapper<T> {
        /**
         * @see _.sortedIndexOf
         */
        sortedIndexOf(
            value: T
        ): LoDashExplicitWrapper<number>;
    }


interface LoDashExplicitObjectWrapper<T> {
        /**
         * @see _.sortedIndexOf
         */
        sortedIndexOf<TValue>(
            value: TValue
        ): LoDashExplicitWrapper<number>;
    }


//_.initial
interface LoDashStatic {
        /**
         * Gets all but the last element of array.
         *
         * @param array The array to query.
         * @return Returns the slice of array.
         */
        initial<T>(array: List<T>): T[];
    }


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


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


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


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


//_.intersection
interface LoDashStatic {
        /**
         * Creates an array of unique values that are included in all of the provided arrays using SameValueZero for
         * equality comparisons.
         *
         * @param arrays The arrays to inspect.
         * @return Returns the new array of shared values.
         */
        intersection<T>(...arrays: (T[]|List<T>)[]): T[];
    }


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


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


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


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


//_.last
interface LoDashStatic {
        /**
         * Gets the last element of array.
         *
         * @param array The array to query.
         * @return Returns the last element of array.
         */
        last<T>(array: List<T>): T;
    }


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


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


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


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


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


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


//_.lastIndexOf
interface LoDashStatic {
        /**
         * This method is like _.indexOf except that it iterates over elements of array from right to left.
         *
         * @param array The array to search.
         * @param value The value to search for.
         * @param fromIndex The index to search from or true to perform a binary search on a sorted array.
         * @return Returns the index of the matched value, else -1.
         */
        lastIndexOf<T>(
            array: List<T>,
            value: T,
            fromIndex?: boolean|number
        ): number;
    }


interface LoDashImplicitArrayWrapper<T> {
        /**
         * @see _.lastIndexOf
         */
        lastIndexOf(
            value: T,
            fromIndex?: boolean|number
        ): number;
    }


interface LoDashImplicitObjectWrapper<T> {
        /**
         * @see _.lastIndexOf
         */
        lastIndexOf<TResult>(
            value: TResult,
            fromIndex?: boolean|number
        ): number;
    }


interface LoDashExplicitArrayWrapper<T> {
        /**
         * @see _.lastIndexOf
         */
        lastIndexOf(
            value: T,
            fromIndex?: boolean|number
        ): LoDashExplicitWrapper<number>;
    }


interface LoDashExplicitObjectWrapper<T> {
        /**
         * @see _.lastIndexOf
         */
        lastIndexOf<TResult>(
            value: TResult,
            fromIndex?: boolean|number
        ): LoDashExplicitWrapper<number>;
    }


//_.pull
interface LoDashStatic {
        /**
         * Removes all provided values from array using SameValueZero for equality comparisons.
         *
         * Note: Unlike _.without, this method mutates array.
         *
         * @param array The array to modify.
         * @param values The values to remove.
         * @return Returns array.
         */
        pull<T>(
            array: T[],
            ...values: T[]
        ): T[];

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


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


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


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


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


//_.pullAt
interface LoDashStatic {
        /**
         * Removes elements from array corresponding to the given indexes and returns an array of the removed elements.
         * Indexes may be specified as an array of indexes or as individual arguments.
         *
         * Note: Unlike _.at, this method mutates array.
         *
         * @param array The array to modify.
         * @param indexes The indexes of elements to remove, specified as individual indexes or arrays of indexes.
         * @return Returns the new array of removed elements.
         */
        pullAt<T>(
            array: List<T>,
            ...indexes: (number|number[])[]
        ): T[];
    }


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


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


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


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


//_.remove
interface LoDashStatic {
        /**
         * Removes all elements from array that predicate returns truthy for and returns an array of the removed
         * elements. 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.
         *
         * Note: Unlike _.filter, this method mutates array.
         *
         * @param array The array to modify.
         * @param predicate The function invoked per iteration.
         * @param thisArg The this binding of predicate.
         * @return Returns the new array of removed elements.
         */
        remove<T>(
            array: List<T>,
            predicate?: ListIterator<T, boolean>,
            thisArg?: any
        ): T[];

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

        /**
         * @see _.remove
         */
        remove<W, T>(
            array: List<T>,
            predicate?: W
        ): T[];
    }


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

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

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


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

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

        /**
         * @see _.remove
         */
        remove<W, TResult>(
            predicate?: W
        ): LoDashImplicitArrayWrapper<TResult>;
    }


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

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

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


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

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

        /**
         * @see _.remove
         */
        remove<W, TResult>(
            predicate?: W
        ): LoDashExplicitArrayWrapper<TResult>;
    }


//_.tail
interface LoDashStatic {
        /**
         * Gets all but the first element of array.
         *
         * @alias _.tail
         *
         * @param array The array to query.
         * @return Returns the slice of array.
         */
        tail<T>(array: List<T>): T[];
    }


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


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


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


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


//_.slice
interface LoDashStatic {
        /**
         * Creates a slice of array from start up to, but not including, end.
         *
         * @param array The array to slice.
         * @param start The start position.
         * @param end The end position.
         * @return Returns the slice of array.
         */
        slice<T>(
            array: T[],
            start?: number,
            end?: number
        ): T[];
    }


interface LoDashImplicitArrayWrapper<T> {
        /**
         * @see _.slice
         */
        slice(
            start?: number,
            end?: number
        ): LoDashImplicitArrayWrapper<T>;
    }


interface LoDashExplicitArrayWrapper<T> {
        /**
         * @see _.slice
         */
        slice(
            start?: number,
            end?: number
        ): LoDashExplicitArrayWrapper<T>;
    }


//_.sortedIndex
interface LoDashStatic {
        /**
         * Uses a binary search to determine the lowest index at which `value` should
         * be inserted into `array` in order to maintain its sort order.
         *
         * @static
         * @memberOf _
         * @category Array
         * @param {Array} array The sorted array to inspect.
         * @param {*} value The value to evaluate.
         * @returns {number} Returns the index at which `value` should be inserted into `array`.
         * @example
         *
         * _.sortedIndex([30, 50], 40);
         * // => 1
         *
         * _.sortedIndex([4, 5], 4);
         * // => 0
         */
        sortedIndex<T, TSort>(
            array: List<T>,
            value: T
        ): number;

        /**
         * @see _.sortedIndex
         */
        sortedIndex<T>(
            array: List<T>,
            value: T
        ): number;

        /**
         * @see _.sortedIndex
         */
        sortedIndex<T>(
            array: List<T>,
            value: T
        ): number;

        /**
         * @see _.sortedIndex
         */
        sortedIndex<W, T>(
            array: List<T>,
            value: T
        ): number;

        /**
         * @see _.sortedIndex
         */
        sortedIndex<T>(
            array: List<T>,
            value: T
        ): number;
    }


interface LoDashImplicitWrapper<T> {
        /**
         * @see _.sortedIndex
         */
        sortedIndex<TSort>(
            value: string
        ): number;
    }


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

        /**
         * @see _.sortedIndex
         */
        sortedIndex(
            value: T
        ): number;
    }


interface LoDashImplicitObjectWrapper<T> {
        /**
         * @see _.sortedIndex
         */
        sortedIndex<T, TSort>(
            value: T
        ): number;

        /**
         * @see _.sortedIndex
         */
        sortedIndex<T>(
            value: T
        ): number;

        /**
         * @see _.sortedIndex
         */
        sortedIndex<W, T>(
            value: T
        ): number;
    }


interface LoDashExplicitWrapper<T> {
        /**
         * @see _.sortedIndex
         */
        sortedIndex<TSort>(
            value: string
        ): LoDashExplicitWrapper<number>;
    }


interface LoDashExplicitArrayWrapper<T> {
        /**
         * @see _.sortedIndex
         */
        sortedIndex<TSort>(
            value: T
        ): LoDashExplicitWrapper<number>;

        /**
         * @see _.sortedIndex
         */
        sortedIndex(
            value: T
        ): LoDashExplicitWrapper<number>;

        /**
         * @see _.sortedIndex
         */
        sortedIndex<W>(
            value: T
        ): LoDashExplicitWrapper<number>;
    }


interface LoDashExplicitObjectWrapper<T> {
        /**
         * @see _.sortedIndex
         */
        sortedIndex<T, TSort>(
            value: T
        ): LoDashExplicitWrapper<number>;

        /**
         * @see _.sortedIndex
         */
        sortedIndex<T>(
            value: T
        ): LoDashExplicitWrapper<number>;

        /**
         * @see _.sortedIndex
         */
        sortedIndex<W, T>(
            value: T
        ): LoDashExplicitWrapper<number>;

    }


//_.sortedIndexBy
interface LoDashStatic {
        /**
         * This method is like `_.sortedIndex` except that it accepts `iteratee`
         * which is invoked for `value` and each element of `array` to compute their
         * sort ranking. The iteratee is invoked with one argument: (value).
         *
         * @static
         * @memberOf _
         * @category Array
         * @param {Array} array The sorted array to inspect.
         * @param {*} value The value to evaluate.
         * @param {Function|Object|string} [iteratee=_.identity] The iteratee invoked per element.
         * @returns {number} Returns the index at which `value` should be inserted into `array`.
         * @example
         *
         * var dict = { 'thirty': 30, 'forty': 40, 'fifty': 50 };
         *
         * _.sortedIndexBy(['thirty', 'fifty'], 'forty', _.propertyOf(dict));
         * // => 1
         *
         * // using the `_.property` iteratee shorthand
         * _.sortedIndexBy([{ 'x': 4 }, { 'x': 5 }], { 'x': 4 }, 'x');
         * // => 0
         */
        sortedIndexBy<T, TSort>(
            array: List<T>,
            value: T,
            iteratee: (x: T) => TSort
        ): number;

        /**
         * @see _.sortedIndexBy
         */
        sortedIndexBy<T>(
            array: List<T>,
            value: T,
            iteratee: (x: T) => any
        ): number;

        /**
         * @see _.sortedIndexBy
         */
        sortedIndexBy<T>(
            array: List<T>,
            value: T,
            iteratee: string
        ): number;

        /**
         * @see _.sortedIndexBy
         */
        sortedIndexBy<W, T>(
            array: List<T>,
            value: T,
            iteratee: W
        ): number;

        /**
         * @see _.sortedIndexBy
         */
        sortedIndexBy<T>(
            array: List<T>,
            value: T,
            iteratee: Object
        ): number;
    }


interface LoDashImplicitWrapper<T> {
        /**
         * @see _.sortedIndexBy
         */
        sortedIndexBy<TSort>(
            value: string,
            iteratee: (x: string) => TSort
        ): number;
    }


interface LoDashImplicitArrayWrapper<T> {
        /**
         * @see _.sortedIndexBy
         */
        sortedIndexBy<TSort>(
            value: T,
            iteratee: (x: T) => TSort
        ): number;

        /**
         * @see _.sortedIndexBy
         */
        sortedIndexBy(
            value: T,
            iteratee: string
        ): number;

        /**
         * @see _.sortedIndexBy
         */
        sortedIndexBy<W>(
            value: T,
            iteratee: W
        ): number;
    }


interface LoDashImplicitObjectWrapper<T> {
        /**
         * @see _.sortedIndexBy
         */
        sortedIndexBy<T, TSort>(
            value: T,
            iteratee: (x: T) => TSort
        ): number;

        /**
         * @see _.sortedIndexBy
         */
        sortedIndexBy<T>(
            value: T,
            iteratee: (x: T) => any
        ): number;

        /**
         * @see _.sortedIndexBy
         */
        sortedIndexBy<T>(
            value: T,
            iteratee: string
        ): number;

        /**
         * @see _.sortedIndexBy
         */
        sortedIndexBy<W, T>(
            value: T,
            iteratee: W
        ): number;

        /**
         * @see _.sortedIndexBy
         */
        sortedIndexBy<T>(
            value: T,
            iteratee: Object
        ): number;
    }


interface LoDashExplicitWrapper<T> {
        /**
         * @see _.sortedIndexBy
         */
        sortedIndexBy<TSort>(
            value: string,
            iteratee: (x: string) => TSort
        ): LoDashExplicitWrapper<number>;
    }


interface LoDashExplicitArrayWrapper<T> {
        /**
         * @see _.sortedIndexBy
         */
        sortedIndexBy<TSort>(
            value: T,
            iteratee: (x: T) => TSort
        ): LoDashExplicitWrapper<number>;

        /**
         * @see _.sortedIndexBy
         */
        sortedIndexBy(
            value: T,
            iteratee: string
        ): LoDashExplicitWrapper<number>;

        /**
         * @see _.sortedIndexBy
         */
        sortedIndexBy<W>(
            value: T,
            iteratee: W
        ): LoDashExplicitWrapper<number>;
    }


interface LoDashExplicitObjectWrapper<T> {
        /**
         * @see _.sortedIndexBy
         */
        sortedIndexBy<T, TSort>(
            value: T,
            iteratee: (x: T) => TSort
        ): LoDashExplicitWrapper<number>;

        /**
         * @see _.sortedIndexBy
         */
        sortedIndexBy<T>(
            value: T,
            iteratee: (x: T) => any
        ): LoDashExplicitWrapper<number>;

        /**
         * @see _.sortedIndexBy
         */
        sortedIndexBy<T>(
            value: T,
            iteratee: string
        ): LoDashExplicitWrapper<number>;

        /**
         * @see _.sortedIndexBy
         */
        sortedIndexBy<W, T>(
            value: T,
            iteratee: W
        ): LoDashExplicitWrapper<number>;

        /**
         * @see _.sortedIndexBy
         */
        sortedIndexBy<T>(
            value: T,
            iteratee: Object
        ): LoDashExplicitWrapper<number>;
    }


//_.sortedLastIndex
interface LoDashStatic {
        /**
         * This method is like `_.sortedIndex` except that it returns the highest
         * index at which `value` should be inserted into `array` in order to
         * maintain its sort order.
         *
         * @static
         * @memberOf _
         * @category Array
         * @param {Array} array The sorted array to inspect.
         * @param {*} value The value to evaluate.
         * @returns {number} Returns the index at which `value` should be inserted into `array`.
         * @example
         *
         * _.sortedLastIndex([4, 5], 4);
         * // => 1
         */
        sortedLastIndex<T, TSort>(
            array: List<T>,
            value: T
        ): number;

        /**
         * @see _.sortedLastIndex
         */
        sortedLastIndex<T>(
            array: List<T>,
            value: T
        ): number;

        /**
         * @see _.sortedLastIndex
         */
        sortedLastIndex<T>(
            array: List<T>,
            value: T
        ): number;

        /**
         * @see _.sortedLastIndex
         */
        sortedLastIndex<W, T>(
            array: List<T>,
            value: T
        ): number;

        /**
         * @see _.sortedLastIndex
         */
        sortedLastIndex<T>(
            array: List<T>,
            value: T
        ): number;
    }


interface LoDashImplicitWrapper<T> {
        /**
         * @see _.sortedLastIndex
         */
        sortedLastIndex<TSort>(
            value: string
        ): number;
    }


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

        /**
         * @see _.sortedLastIndex
         */
        sortedLastIndex(
            value: T
        ): number;

        /**
         * @see _.sortedLastIndex
         */
        sortedLastIndex<W>(
            value: T
        ): number;
    }


interface LoDashImplicitObjectWrapper<T> {
        /**
         * @see _.sortedLastIndex
         */
        sortedLastIndex<T, TSort>(
            value: T
        ): number;

        /**
         * @see _.sortedLastIndex
         */
        sortedLastIndex<T>(
            value: T
        ): number;

        /**
         * @see _.sortedLastIndex
         */
        sortedLastIndex<W, T>(
            value: T
        ): number;
    }


interface LoDashExplicitWrapper<T> {
        /**
         * @see _.sortedLastIndex
         */
        sortedLastIndex<TSort>(
            value: string
        ): LoDashExplicitWrapper<number>;
    }


interface LoDashExplicitArrayWrapper<T> {
        /**
         * @see _.sortedLastIndex
         */
        sortedLastIndex<TSort>(
            value: T
        ): LoDashExplicitWrapper<number>;

        /**
         * @see _.sortedLastIndex
         */
        sortedLastIndex(
            value: T
        ): LoDashExplicitWrapper<number>;
    }


interface LoDashExplicitObjectWrapper<T> {
        /**
         * @see _.sortedLastIndex
         */
        sortedLastIndex<T, TSort>(
            value: T
        ): LoDashExplicitWrapper<number>;

        /**
         * @see _.sortedLastIndex
         */
        sortedLastIndex<T>(
            value: T
        ): LoDashExplicitWrapper<number>;

        /**
         * @see _.sortedLastIndex
         */
        sortedLastIndex<W, T>(
            value: T
        ): LoDashExplicitWrapper<number>;
    }


//_.sortedLastIndexBy
interface LoDashStatic {
        /**
         * This method is like `_.sortedLastIndex` except that it accepts `iteratee`
         * which is invoked for `value` and each element of `array` to compute their
         * sort ranking. The iteratee is invoked with one argument: (value).
         *
         * @static
         * @memberOf _
         * @category Array
         * @param {Array} array The sorted array to inspect.
         * @param {*} value The value to evaluate.
         * @param {Function|Object|string} [iteratee=_.identity] The iteratee invoked per element.
         * @returns {number} Returns the index at which `value` should be inserted into `array`.
         * @example
         *
         * // using the `_.property` iteratee shorthand
         * _.sortedLastIndexBy([{ 'x': 4 }, { 'x': 5 }], { 'x': 4 }, 'x');
         * // => 1
         */
        sortedLastIndexBy<T, TSort>(
            array: List<T>,
            value: T,
            iteratee: (x: T) => TSort
        ): number;

        /**
         * @see _.sortedLastIndexBy
         */
        sortedLastIndexBy<T>(
            array: List<T>,
            value: T,
            iteratee: (x: T) => any
        ): number;

        /**
         * @see _.sortedLastIndexBy
         */
        sortedLastIndexBy<T>(
            array: List<T>,
            value: T,
            iteratee: string
        ): number;

        /**
         * @see _.sortedLastIndexBy
         */
        sortedLastIndexBy<W, T>(
            array: List<T>,
            value: T,
            iteratee: W
        ): number;

        /**
         * @see _.sortedLastIndexBy
         */
        sortedLastIndexBy<T>(
            array: List<T>,
            value: T,
            iteratee: Object
        ): number;
    }


interface LoDashImplicitWrapper<T> {
        /**
         * @see _.sortedLastIndexBy
         */
        sortedLastIndexBy<TSort>(
            value: string,
            iteratee: (x: string) => TSort
        ): number;
    }


interface LoDashImplicitArrayWrapper<T> {
        /**
         * @see _.sortedLastIndexBy
         */
        sortedLastIndexBy<TSort>(
            value: T,
            iteratee: (x: T) => TSort
        ): number;

        /**
         * @see _.sortedLastIndexBy
         */
        sortedLastIndexBy(
            value: T,
            iteratee: string
        ): number;

        /**
         * @see _.sortedLastIndexBy
         */
        sortedLastIndexBy<W>(
            value: T,
            iteratee: W
        ): number;
    }


interface LoDashImplicitObjectWrapper<T> {
        /**
         * @see _.sortedLastIndexBy
         */
        sortedLastIndexBy<T, TSort>(
            value: T,
            iteratee: (x: T) => TSort
        ): number;

        /**
         * @see _.sortedLastIndexBy
         */
        sortedLastIndexBy<T>(
            value: T,
            iteratee: (x: T) => any
        ): number;

        /**
         * @see _.sortedLastIndexBy
         */
        sortedLastIndexBy<T>(
            value: T,
            iteratee: string
        ): number;

        /**
         * @see _.sortedLastIndexBy
         */
        sortedLastIndexBy<W, T>(
            value: T,
            iteratee: W
        ): number;

        /**
         * @see _.sortedLastIndexBy
         */
        sortedLastIndexBy<T>(
            value: T,
            iteratee: Object
        ): number;
    }


interface LoDashExplicitWrapper<T> {
        /**
         * @see _.sortedLastIndexBy
         */
        sortedLastIndexBy<TSort>(
            value: string,
            iteratee: (x: string) => TSort
        ): LoDashExplicitWrapper<number>;
    }


interface LoDashExplicitArrayWrapper<T> {
        /**
         * @see _.sortedLastIndexBy
         */
        sortedLastIndexBy<TSort>(
            value: T,
            iteratee: (x: T) => TSort
        ): LoDashExplicitWrapper<number>;

        /**
         * @see _.sortedLastIndexBy
         */
        sortedLastIndexBy(
            value: T,
            iteratee: string
        ): LoDashExplicitWrapper<number>;

        /**
         * @see _.sortedLastIndexBy
         */
        sortedLastIndexBy<W>(
            value: T,
            iteratee: W
        ): LoDashExplicitWrapper<number>;
    }


interface LoDashExplicitObjectWrapper<T> {
        /**
         * @see _.sortedLastIndexBy
         */
        sortedLastIndexBy<T, TSort>(
            value: T,
            iteratee: (x: T) => TSort
        ): LoDashExplicitWrapper<number>;

        /**
         * @see _.sortedLastIndexBy
         */
        sortedLastIndexBy<T>(
            value: T,
            iteratee: (x: T) => any
        ): LoDashExplicitWrapper<number>;

        /**
         * @see _.sortedLastIndexBy
         */
        sortedLastIndexBy<T>(
            value: T,
            iteratee: string
        ): LoDashExplicitWrapper<number>;

        /**
         * @see _.sortedLastIndexBy
         */
        sortedLastIndexBy<W, T>(
            value: T,
            iteratee: W
        ): LoDashExplicitWrapper<number>;

        /**
         * @see _.sortedLastIndexBy
         */
        sortedLastIndexBy<T>(
            value: T,
            iteratee: Object
        ): LoDashExplicitWrapper<number>;
    }


//_.sortedLastIndexOf DUMMY
interface LoDashStatic {
        /**
         * This method is like `_.lastIndexOf` except that it performs a binary
         * search on a sorted `array`.
         *
         * @static
         * @memberOf _
         * @category Array
         * @param {Array} array The array to search.
         * @param {*} value The value to search for.
         * @returns {number} Returns the index of the matched value, else `-1`.
         * @example
         *
         * _.sortedLastIndexOf([1, 1, 2, 2], 2);
         * // => 3
         */
        sortedLastIndexOf(
            array: any[]|List<any>,
            ...values: any[]
        ): any[];
    }


//_.tail
interface LoDashStatic {
        /**
         * @see _.rest
         */
        tail<T>(array: List<T>): T[];
    }


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


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