/*
 * Copyright 2008 Jacek Caban for CodeWeavers
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
 */

#pragma makedep regtypelib

#include "jsglobal_dispid.h"

import "oaidl.idl";

[
    uuid(3eef9759-35fc-11d1-8ce4-00c04fc2b085),
    version(1.0),
]
library JSGlobal
{
    importlib("stdole2.tlb");

    interface StringInstance;

    [
        uuid(3eef9758-35fc-11d1-8ce4-00C04fc2b086)
    ]
    dispinterface GlobalObj {
    properties:
        [id(DISPID_GLOBAL_NAN), readonly]
        VARIANT NaN;

        [id(DISPID_GLOBAL_INFINITY), readonly]
        VARIANT Infinity;

    methods:
        [id(DISPID_GLOBAL_ARRAY)]
        VARIANT Array();

        [id(DISPID_GLOBAL_BOOLEAN)]
        VARIANT Boolean();

        [id(DISPID_GLOBAL_DATE)]
        VARIANT Date();

        [id(DISPID_GLOBAL_FUNCTION)]
        VARIANT Function();

        [id(DISPID_GLOBAL_NUMBER)]
        VARIANT Number();

        [id(DISPID_GLOBAL_OBJECT)]
        VARIANT Object();

        [id(DISPID_GLOBAL_STRING)]
        VARIANT String();

        [id(DISPID_GLOBAL_REGEXP)]
        VARIANT RegExp();

        [id(DISPID_GLOBAL_ACTIVEXOBJ)]
        VARIANT ActiveXObject();

        [id(DISPID_GLOBAL_VBARRAY)]
        VARIANT VBArray();

        [id(DISPID_GLOBAL_ENUMERATOR)]
        VARIANT Enumerator();

        [id(DISPID_GLOBAL_ESCAPE)]
        VARIANT escape(VARIANT String);

        [id(DISPID_GLOBAL_EVAL)]
        VARIANT eval(VARIANT x);

        [id(DISPID_GLOBAL_ISNAN)]
        VARIANT isNaN(VARIANT Number);

        [id(DISPID_GLOBAL_ISFINITE)]
        VARIANT isFinite(VARIANT Number);

        [id(DISPID_GLOBAL_PARSEINT)]
        VARIANT parseInt(
                VARIANT String,
                VARIANT radix);

        [id(DISPID_GLOBAL_PARSEFLOAT)]
        VARIANT parseFloat(VARIANT String);

        [id(DISPID_GLOBAL_UNESCAPE)]
        VARIANT unescape(VARIANT String);

        [id(DISPID_GLOBAL_GETOBJECT)]
        VARIANT GetObject(
                [optional] VARIANT path,
                [optional] VARIANT classname);

        [id(DISPID_GLOBAL_SCRIPTENGINE)]
        VARIANT ScriptEngine();

        [id(DISPID_GLOBAL_MAJORVER)]
        VARIANT ScriptEngineMajorVersion();

        [id(DISPID_GLOBAL_MINORVER)]
        VARIANT ScriptEngineMinorVersion();

        [id(DISPID_GLOBAL_BUILDVER)]
        VARIANT ScriptEngineBuildVersion();

        [id(DISPID_GLOBAL_COLLECT)]
        VARIANT CollectGarbage();

        [id(DISPID_GLOBAL_MATH)]
        VARIANT Math();
    }

    [
        uuid(3eef9758-35fc-11d1-8ce4-00c04fc2b087)
    ]
    dispinterface DateObj {
    properties:
    methods:
        [id(DISPID_DATEOBJ_PARSE)]
        VARIANT parse(VARIANT String);

        [id(DISPID_DATEOBJ_UTC)]
        VARIANT UTC(
                VARIANT year,
                [optional] VARIANT month,
                [optional] VARIANT Date,
                [optional] VARIANT hours,
                [optional] VARIANT minutes,
                [optional] VARIANT seconds,
                [optional] VARIANT ms);
    }

    [
        uuid(3eef9758-35fc-11d1-8ce4-00C04fc2b088)
    ]
    dispinterface MathObj {
    properties:
        [id(DISPID_MATHOBJ_E), readonly]
        VARIANT E;

        [id(DISPID_MATHOBJ_LOG2E), readonly]
        VARIANT LOG2E;

        [id(DISPID_MATHOBJ_LOG10E), readonly]
        VARIANT LOG10E;

        [id(DISPID_MATHOBJ_LN2), readonly]
        VARIANT LN2;

        [id(DISPID_MATHOBJ_LN10), readonly]
        VARIANT LN10;

        [id(DISPID_MATHOBJ_PI), readonly]
        VARIANT PI;

        [id(DISPID_MATHOBJ_SQRT2), readonly]
        VARIANT SQRT2;

        [id(DISPID_MATHOBJ_SQRT1_2), readonly]
        VARIANT SQRT1_2;

    methods:
        [id(DISPID_MATHOBJ_ABS)]
        VARIANT abs(VARIANT x);

        [id(DISPID_MATHOBJ_ACOS)]
        VARIANT acos(VARIANT x);

        [id(DISPID_MATHOBJ_ASIN)]
        VARIANT asin(VARIANT x);

        [id(DISPID_MATHOBJ_ATAN)]
        VARIANT atan(VARIANT x);

        [id(DISPID_MATHOBJ_ATAN2)]
        VARIANT atan2(VARIANT x, VARIANT y);

        [id(DISPID_MATHOBJ_CEIL)]
        VARIANT ceil(VARIANT x);

        [id(DISPID_MATHOBJ_COS)]
        VARIANT cos(VARIANT x);

        [id(DISPID_MATHOBJ_EXP)]
        VARIANT exp(VARIANT x);

        [id(DISPID_MATHOBJ_FLOOR)]
        VARIANT floor(VARIANT x);

        [id(DISPID_MATHOBJ_LOG)]
        VARIANT log(VARIANT x);

        [id(DISPID_MATHOBJ_MAX)]
        VARIANT max(VARIANT x, VARIANT y);

        [id(DISPID_MATHOBJ_MIN)]
        VARIANT min(VARIANT x, VARIANT y);

        [id(DISPID_MATHOBJ_POW)]
        VARIANT pow(VARIANT x, VARIANT y);

        [id(DISPID_MATHOBJ_RANDOM)]
        VARIANT random();

        [id(DISPID_MATHOBJ_ROUND)]
        VARIANT round(VARIANT x);

        [id(DISPID_MATHOBJ_SIN)]
        VARIANT sin(VARIANT x);

        [id(DISPID_MATHOBJ_SQRT)]
        VARIANT sqrt(VARIANT x);

        [id(DISPID_MATHOBJ_TAN)]
        VARIANT tan(VARIANT x);
    }

    [
        uuid(3eef9758-35fc-11d1-8ce4-00c04fc2b089)
    ]
    dispinterface NumberObj {
    properties:
        [id(DISPID_NUMBEROBJ_MAX_VALUE), readonly]
        VARIANT MAX_VALUE;

        [id(DISPID_NUMBEROBJ_MIN_VALUE), readonly]
        VARIANT MIN_VALUE;

        [id(DISPID_NUMBEROBJ_NAN), readonly]
        VARIANT NaN;

        [id(DISPID_NUMBEROBJ_NEGATIVE_INFINITY), readonly]
        VARIANT NEGATIVE_INFINITY;

        [id(DISPID_NUMBEROBJ_POSITIVE_INFINITY), readonly]
        VARIANT POSITIVE_INFINITY;

    methods:
    }

    [
        uuid(3eef9758-35fc-11d1-8ce4-00c04fc2b090)
    ]
    dispinterface RegExpObj {
    properties:
        [id(DISPID_REGEXPOBJ_INDEX), readonly]
        VARIANT index;

        [id(DISPID_REGEXPOBJ_INPUT), readonly]
        VARIANT input;

        [id(DISPID_REGEXPOBJ_LASTINDEX), readonly]
        VARIANT lastIndex;

    methods:
    }

    [
        uuid(3eef9758-35fc-11d1-8ce4-00c04fc2b091)
    ]
    dispinterface StringObj {
    properties:
    methods:
        [id(DISPID_STRINGOBJ_FROMCHARCODE)]
        VARIANT fromCharCode(VARIANT char0);
    }

    [
        uuid(3eef9758-35fc-11d1-8ce4-00c04fc2b092)
    ]
    dispinterface ArrayInstance {
    properties:
        [id(DISPID_ARRAY_LENGTH)]
        VARIANT length;

    methods:
        [id(DISPID_ARRAY_CONCAT)]
        ArrayInstance *concat(VARIANT Array);

        [id(DISPID_ARRAY_JOIN)]
        StringInstance *join(VARIANT separator);

        [id(DISPID_ARRAY_POP)]
        VARIANT pop();

        [id(DISPID_ARRAY_PUSH)]
        VARIANT push(VARIANT value);

        [id(DISPID_ARRAY_REVERSE)]
        ArrayInstance *reverse();

        [id(DISPID_ARRAY_SHIFT)]
        VARIANT shift();

        [id(DISPID_ARRAY_SLICE)]
        ArrayInstance *slice(
                VARIANT start,
                VARIANT end);

        [id(DISPID_ARRAY_SORT)]
        ArrayInstance *sort(VARIANT sortfunction);

        [id(DISPID_ARRAY_SPLICE)]
        ArrayInstance *splice(
                VARIANT start,
                VARIANT deletecount);

        [id(DISPID_ARRAY_TOSTRING)]
        StringInstance *toString();

        [id(DISPID_ARRAY_TOLOCSTRING)]
        StringInstance *toLocaleString();

        [id(DISPID_ARRAY_VALUEOF)]
        ArrayInstance *valueOf();

        [id(DISPID_ARRAY_UNSHIFT)]
        VARIANT unshift(VARIANT value);

        [id(DISPID_ARRAY_HASOWNPROP)]
        VARIANT hasOwnProperty(VARIANT propertyName);

        [id(DISPID_ARRAY_PROPISENUM)]
        VARIANT propertyIsEnumerable(VARIANT propertyName);

        [id(DISPID_ARRAY_ISPROTOF)]
        VARIANT isPrototypeOf(VARIANT obj);
    }

    [
        uuid(3eef9758-35fc-11d1-8ce4-00c04fc2b093)
    ]
    dispinterface FunctionInstance {
    properties:
        [id(DISPID_FUNCTION_LENGTH)]
        VARIANT length;
    methods:
        [id(DISPID_FUNCTION_TOSTRING)]
        StringInstance *toString();

        [id(DISPID_FUNCTION_TOLOCSTRING)]
        StringInstance *toLocaleString();

        [id(DISPID_FUNCTION_VALUEOF)]
        FunctionInstance *valueOf();

        [id(DISPID_FUNCTION_APPLY)]
        VARIANT apply(
                VARIANT thisValue,
                VARIANT argArray);

        [id(DISPID_FUNCTION_CALL)]
        VARIANT call(VARIANT thisValue);

        [id(DISPID_FUNCTION_HASOWNPROP)]
        VARIANT hasOwnProperty(VARIANT propertyName);

        [id(DISPID_FUNCTION_PROPISENUM)]
        VARIANT propertyIsEnumerable(VARIANT propertyName);

        [id(DISPID_FUNCTION_ISPROTOF)]
        VARIANT isPrototypeOf(VARIANT obj);
    }

    [
        uuid(3eef9758-35fc-11d1-8ce4-00c04fc2b094)
    ]
    dispinterface StringInstance {
    properties:
        [id(DISPID_STRING_LENGTH)]
        VARIANT length;
    methods:
        [id(DISPID_STRING_TOSTRING)]
        StringInstance *toString();

        [id(DISPID_STRING_VALUEOF)]
        StringInstance *valueOf();

        [id(DISPID_STRING_ANCHOR)]
        StringInstance *anchor(VARIANT anchorString);

        [id(DISPID_STRING_BIG)]
        StringInstance *big();

        [id(DISPID_STRING_BLINK)]
        StringInstance *blink();

        [id(DISPID_STRING_BOLD)]
        StringInstance *bold();

        [id(DISPID_STRING_CHARAT)]
        StringInstance *charAt(VARIANT index);

        [id(DISPID_STRING_CHARCODEAT)]
        VARIANT charCodeAt(VARIANT index);

        [id(DISPID_STRING_CONCAT)]
        StringInstance *concat(VARIANT String);

        [id(DISPID_STRING_FIXED)]
        StringInstance *fixed();

        [id(DISPID_STRING_FONTCOLOR)]
        StringInstance *fontcolor(VARIANT colorval);

        [id(DISPID_STRING_FONTSIZE)]
        StringInstance *fontsize(VARIANT size);

        [id(DISPID_STRING_INDEXOF)]
        VARIANT indexOf(
                VARIANT substring,
                VARIANT startindex);

        [id(DISPID_STRING_ITALICS)]
        StringInstance *italics();

        [id(DISPID_STRING_LASTINDEXOF)]
        VARIANT lastIndexOf(
                VARIANT substring,
                VARIANT startindex);

        [id(DISPID_STRING_LINK)]
        StringInstance *link(VARIANT linkstring);

        [id(DISPID_STRING_MATCH)]
        VARIANT match(VARIANT RegExp);

        [id(DISPID_STRING_REPLACE)]
        StringInstance *replace(
                VARIANT RegExp,
                VARIANT replacetext);

        [id(DISPID_STRING_SEARCH)]
        VARIANT search(VARIANT RegExp);

        [id(DISPID_STRING_SLICE)]
        StringInstance *slice(
                VARIANT start,
                VARIANT end);

        [id(DISPID_STRING_SMALL)]
        StringInstance *_small(); /* FIXME */

        [id(DISPID_STRING_SPLIT)]
        ArrayInstance *split(VARIANT RegExp);

        [id(DISPID_STRING_STRIKE)]
        StringInstance *strike();

        [id(DISPID_STRING_SUB)]
        StringInstance *sub();

        [id(DISPID_STRING_SUBSTRING)]
        StringInstance *substring(
                VARIANT start,
                VARIANT end);

        [id(DISPID_STRING_SUBSTR)]
        StringInstance *substr(
                VARIANT start,
                VARIANT length);

        [id(DISPID_STRING_SUP)]
        StringInstance *sup();

        [id(DISPID_STRING_TOLOWERCASE)]
        StringInstance *toLowerCase();

        [id(DISPID_STRING_TOUPPERCASE)]
        StringInstance *toUpperCase();

        [id(DISPID_STRING_TOLOCLOWERCASE)]
        StringInstance *toLocaleLowerCase();

        [id(DISPID_STRING_TOLOCUPPERCASE)]
        StringInstance *toLocaleUpperCase();

        [id(DISPID_STRING_LOCCOMPARE)]
        VARIANT localeCompare(VARIANT that);

        [id(DISPID_STRING_HASOWNPROP)]
        VARIANT hasOwnProperty(VARIANT propertyName);

        [id(DISPID_STRING_PROPISENUM)]
        VARIANT propertyIsEnumerable(VARIANT propertyName);

        [id(DISPID_STRING_ISPROTOF)]
        VARIANT isPrototypeOf(VARIANT obj);
    }

    [
        uuid(3eef9758-35fc-11d1-8ce4-00c04fc2b095)
    ]
    dispinterface BoolInstance {
    properties:
    methods:
        [id(DISPID_BOOL_TOSTRING)]
        StringInstance *toString();

        [id(DISPID_BOOL_TOLOCSTRING)]
        StringInstance *toLocaleString();

        [id(DISPID_BOOL_VALUEOF)]
        VARIANT valueOf();

        [id(DISPID_BOOL_HASOWNPROP)]
        VARIANT hasOwnProperty(VARIANT propertyName);

        [id(DISPID_BOOL_PROPISENUM)]
        VARIANT propertyIsEnumerable(VARIANT propertyName);

        [id(DISPID_BOOL_ISPROTOF)]
        VARIANT isPrototypeOf(VARIANT obj);
    }

    [
        uuid(3eef9758-35fc-11d1-8ce4-00C04fc2b096)
    ]
    dispinterface NumberInstance {
    properties:
    methods:
        [id(DISPID_NUMBER_TOSTRING)]
        StringInstance *toString(VARIANT radix);

        [id(DISPID_NUMBER_TOLOCSTRING)]
        StringInstance *toLocaleString();

        [id(DISPID_NUMBER_TOFIXED)]
        StringInstance *toFixed(VARIANT fractionDigits);

        [id(DISPID_NUMBER_TOEXPONENTIAL)]
        StringInstance *toExponential(VARIANT fractionDigits);

        [id(DISPID_NUMBER_TOPRECISION)]
        StringInstance *toPrecision(VARIANT precision);

        [id(DISPID_NUMBER_VALUEOF)]
        VARIANT valueOf();

        [id(DISPID_NUMBER_HASOWNPROP)]
        VARIANT hasOwnProperty(VARIANT propertyName);

        [id(DISPID_NUMBER_PROPISENUM)]
        VARIANT propertyIsEnumerable(VARIANT propertyName);

        [id(DISPID_NUMBER_ISPROTOF)]
        VARIANT isPrototypeOf(VARIANT obj);
    }

    [
        uuid(3eef9758-35fc-11d1-8ce4-00c04fc2b097)
    ]
    dispinterface ObjectInstance {
    properties:
    methods:
        [id(DISPID_OBJECT_TOSTRING)]
        StringInstance *toString();

        [id(DISPID_OBJECT_TOLOCSTRING)]
        StringInstance *toLocaleString();

        [id(DISPID_OBJECT_HASOWNPROP)]
        VARIANT hasOwnProperty(VARIANT propertyName);

        [id(DISPID_OBJECT_PROPISENUM)]
        VARIANT propertyIsEnumerable(VARIANT propertyName);

        [id(DISPID_OBJECT_ISPROTOF)]
        VARIANT isPrototypeOf(VARIANT obj);

        [id(DISPID_OBJECT_VALUEOF)]
        ObjectInstance *valueOf();
    }

    [
        uuid(3eef9758-35fc-11d1-8ce4-00C04fc2b098)
    ]
    dispinterface DateInstance {
    properties:
    methods:
        [id(DISPID_DATE_TOSTRING)]
        StringInstance *toString();

        [id(DISPID_DATE_TOLOCSTRING)]
        StringInstance *toLocaleString();

        [id(DISPID_DATE_HASOWNPROP)]
        VARIANT hasOwnProperty(VARIANT propertyName);

        [id(DISPID_DATE_PROPISENUM)]
        VARIANT propertyIsEnumerable(VARIANT propertyName);

        [id(DISPID_DATE_ISPROTOF)]
        VARIANT isPrototypeOf(VARIANT obj);

        [id(DISPID_DATE_VALUEOF)]
        DateInstance *valueOf();

        [id(DISPID_DATE_TOUTCSTRING)]
        StringInstance *toUTCString();

        [id(DISPID_DATE_TODATESTRING)]
        StringInstance *toDateString();

        [id(DISPID_DATE_TOTIMESTRING)]
        StringInstance *toTimeString();

        [id(DISPID_DATE_TOLOCDATESTRING)]
        StringInstance *toLocaleDateString();

        [id(DISPID_DATE_TOLOCTIMESTRING)]
        StringInstance *toLocaleTimeString();

        [id(DISPID_DATE_GETTIME)]
        VARIANT getTime();

        [id(DISPID_DATE_GETFULLYEAR)]
        VARIANT getFullYear();

        [id(DISPID_DATE_GETUTCFULLYEAR)]
        VARIANT getUTCFullYear();

        [id(DISPID_DATE_GETMONTH)]
        VARIANT getMonth();

        [id(DISPID_DATE_GETUTCMONTH)]
        VARIANT getUTCMonth();

        [id(DISPID_DATE_GETDATE)]
        VARIANT getDate();

        [id(DISPID_DATE_GETUTCDATE)]
        VARIANT getUTCDate();

        [id(DISPID_DATE_GETDAY)]
        VARIANT getDay();

        [id(DISPID_DATE_GETUTCDAY)]
        VARIANT getUTCDay();

        [id(DISPID_DATE_GETHOURS)]
        VARIANT getHours();

        [id(DISPID_DATE_GETUTCHOURS)]
        VARIANT getUTCHours();

        [id(DISPID_DATE_GETMINUTES)]
        VARIANT getMinutes();

        [id(DISPID_DATE_GETUTCMINUTES)]
        VARIANT getUTCMinutes();

        [id(DISPID_DATE_GETSECONDS)]
        VARIANT getSeconds();

        [id(DISPID_DATE_GETUTCSECONDS)]
        VARIANT getUTCSeconds();

        [id(DISPID_DATE_GETMILLISECONDS)]
        VARIANT getMilliseconds();

        [id(DISPID_DATE_GETUTCMILLISECONDS)]
        VARIANT getUTCMilliseconds();

        [id(DISPID_DATE_GETTIMEZONEOFFSET)]
        VARIANT getTimezoneOffset();

        [id(DISPID_DATE_SETTIME)]
        DateInstance *setTime(VARIANT time);

        [id(DISPID_DATE_SETMILLISECONDS)]
        DateInstance *setMilliseconds(VARIANT milliseconds);

        [id(DISPID_DATE_SETUTCMILLISECONDS)]
        DateInstance *setUTCMilliseconds(VARIANT milliseconds);

        [id(DISPID_DATE_SETSECONDS)]
        DateInstance *setSeconds(
                VARIANT seconds,
                [optional] VARIANT milliseconds);

        [id(DISPID_DATE_SETUTCSECONDS)]
        DateInstance *setUTCSeconds(
                VARIANT seconds,
                [optional] VARIANT milliseconds);

        [id(DISPID_DATE_SETMINUTES)]
        DateInstance *setMinutes(
                VARIANT minutes,
                [optional] VARIANT seconds,
                [optional] VARIANT milliseconds);

        [id(DISPID_DATE_SETUTCMINUTES)]
        DateInstance *setUTCMinutes(
                VARIANT minutes,
                [optional] VARIANT seconds,
                [optional] VARIANT milliseconds);

        [id(DISPID_DATE_SETHOURS)]
        DateInstance *setHours(
                VARIANT hours,
                [optional] VARIANT minutes,
                [optional] VARIANT seconds,
                [optional] VARIANT milliseconds);

        [id(DISPID_DATE_SETUTCHOURS)]
        DateInstance *setUTCHours(
                VARIANT hours,
                [optional] VARIANT minutes,
                [optional] VARIANT seconds,
                [optional] VARIANT milliseconds);

        [id(DISPID_DATE_SETDATE)]
        DateInstance *setDate(VARIANT Date);

        [id(DISPID_DATE_SETUTCDATE)]
        DateInstance *setUTCDate(VARIANT Date);

        [id(DISPID_DATE_SETMONTH)]
        DateInstance *setMonth(
                VARIANT month,
                [optional] VARIANT Date);

        [id(DISPID_DATE_SETUTCMONTH)]
        DateInstance *setUTCMonth(
                VARIANT month,
                [optional] VARIANT Date);

        [id(DISPID_DATE_SETFULLYEAR)]
        DateInstance *setFullYear(
                VARIANT year,
                [optional] VARIANT month,
                [optional] VARIANT Date);

        [id(DISPID_DATE_SETUTCFULLYEAR)]
        DateInstance *setUTCFullYear(
                VARIANT year,
                [optional] VARIANT month,
                [optional] VARIANT Date);
    }

    [
        uuid(3eef9758-35fc-11d1-8ce4-00c04Fc2b099)
    ]
    dispinterface RegExpInstance {
    properties:
        [id(DISPID_REGEXP_SOURCE)]
         StringInstance *source;

        [id(DISPID_REGEXP_GLOBAL)]
        VARIANT global;

        [id(DISPID_REGEXP_IGNORECASE)]
        VARIANT ignoreCase;

        [id(DISPID_REGEXP_MULTILINE)]
        VARIANT multiline;

        [id(DISPID_REGEXP_LASTINDEX)]
        VARIANT lastIndex;
    methods:
        [id(DISPID_REGEXP_TOSTRING)]
        StringInstance *toString();

        [id(DISPID_REGEXP_TOLOCSTRING)]
        StringInstance *toLocaleString();

        [id(DISPID_REGEXP_HASOWNPROP)]
        VARIANT hasOwnProperty(VARIANT propertyName);

        [id(DISPID_REGEXP_PROPISENUM)]
        VARIANT propertyIsEnumerable(VARIANT propertyName);

        [id(DISPID_REGEXP_ISPROTOF)]
        VARIANT isPrototypeOf(VARIANT obj);

        [id(DISPID_REGEXP_EXEC)]
        ArrayInstance *exec(VARIANT String);
    }

    [
        uuid(3eef9758-35fc-11d1-8ce4-00c04fc2b09a)
    ]
    dispinterface ErrorInstance {
    properties:
        [id(DISPID_ERROR_NAME)]
        StringInstance *name;

        [id(DISPID_ERROR_MESSAGE)]
        StringInstance *message;

        [id(DISPID_ERROR_IGNORECASE)]
        VARIANT ignoreCase;

        [id(DISPID_ERROR_MULTILINE)]
        VARIANT multiline;

        [id(DISPID_ERROR_LASTINDEX)]
        VARIANT lastIndex;

    methods:
        [id(DISPID_ERROR_TOSTRING)]
        StringInstance *toString();

        [id(DISPID_ERROR_TOLOCSTRING)]
        StringInstance *toLocaleString();

        [id(DISPID_ERROR_HASOWNPROP)]
        VARIANT hasOwnProperty(VARIANT propertyName);

        [id(DISPID_ERROR_PROPISENUM)]
        VARIANT propertyIsEnumerable(VARIANT propertyName);

        [id(DISPID_ERROR_ISPROTOF)]
        VARIANT isPrototypeOf(VARIANT obj);
    }

    [
        uuid(3eef9758-35fc-11d1-8ce4-00c04fc2b09b)
    ]
    dispinterface EvalErrorInstance {
    properties:
        [id(DISPID_ERROR_NAME)]
        StringInstance *name;

        [id(DISPID_ERROR_MESSAGE)]
        StringInstance *message;

        [id(DISPID_ERROR_IGNORECASE)]
        VARIANT ignoreCase;

        [id(DISPID_ERROR_MULTILINE)]
        VARIANT multiline;

        [id(DISPID_ERROR_LASTINDEX)]
        VARIANT lastIndex;

    methods:
        [id(DISPID_ERROR_TOSTRING)]
        StringInstance *toString();

        [id(DISPID_ERROR_TOLOCSTRING)]
        StringInstance *toLocaleString();

        [id(DISPID_ERROR_HASOWNPROP)]
        VARIANT hasOwnProperty(VARIANT propertyName);

        [id(DISPID_ERROR_PROPISENUM)]
        VARIANT propertyIsEnumerable(VARIANT propertyName);

        [id(DISPID_ERROR_ISPROTOF)]
        VARIANT isPrototypeOf(VARIANT obj);
    }

    [
        uuid(3eef9758-35fc-11d1-8ce4-00c04fc2b09c)
    ]
    dispinterface RangeErrorInstance {
    properties:
        [id(DISPID_ERROR_NAME)]
        StringInstance *name;

        [id(DISPID_ERROR_MESSAGE)]
        StringInstance *message;

        [id(DISPID_ERROR_IGNORECASE)]
        VARIANT ignoreCase;

        [id(DISPID_ERROR_MULTILINE)]
        VARIANT multiline;

        [id(DISPID_ERROR_LASTINDEX)]
        VARIANT lastIndex;

    methods:
        [id(DISPID_ERROR_TOSTRING)]
        StringInstance *toString();

        [id(DISPID_ERROR_TOLOCSTRING)]
        StringInstance *toLocaleString();

        [id(DISPID_ERROR_HASOWNPROP)]
        VARIANT hasOwnProperty(VARIANT propertyName);

        [id(DISPID_ERROR_PROPISENUM)]
        VARIANT propertyIsEnumerable(VARIANT propertyName);

        [id(DISPID_ERROR_ISPROTOF)]
        VARIANT isPrototypeOf(VARIANT obj);
    }

    [
        uuid(3eef9758-35fc-11d1-8ce4-00c04fc2b09d)
    ]
    dispinterface ReferenceErrorInstance {
    properties:
        [id(DISPID_ERROR_NAME)]
        StringInstance *name;

        [id(DISPID_ERROR_MESSAGE)]
        StringInstance *message;

        [id(DISPID_ERROR_IGNORECASE)]
        VARIANT ignoreCase;

        [id(DISPID_ERROR_MULTILINE)]
        VARIANT multiline;

        [id(DISPID_ERROR_LASTINDEX)]
        VARIANT lastIndex;

    methods:
        [id(DISPID_ERROR_TOSTRING)]
        StringInstance *toString();

        [id(DISPID_ERROR_TOLOCSTRING)]
        StringInstance *toLocaleString();

        [id(DISPID_ERROR_HASOWNPROP)]
        VARIANT hasOwnProperty(VARIANT propertyName);

        [id(DISPID_ERROR_PROPISENUM)]
        VARIANT propertyIsEnumerable(VARIANT propertyName);

        [id(DISPID_ERROR_ISPROTOF)]
        VARIANT isPrototypeOf(VARIANT obj);
    }

    [
        uuid(3eef9758-35fc-11d1-8ce4-00c04fc2b09e)
    ]
    dispinterface SyntaxErrorInstance {
    properties:
        [id(DISPID_ERROR_NAME)]
        StringInstance *name;

        [id(DISPID_ERROR_MESSAGE)]
        StringInstance *message;

        [id(DISPID_ERROR_IGNORECASE)]
        VARIANT ignoreCase;

        [id(DISPID_ERROR_MULTILINE)]
        VARIANT multiline;

        [id(DISPID_ERROR_LASTINDEX)]
        VARIANT lastIndex;

    methods:
        [id(DISPID_ERROR_TOSTRING)]
        StringInstance *toString();

        [id(DISPID_ERROR_TOLOCSTRING)]
        StringInstance *toLocaleString();

        [id(DISPID_ERROR_HASOWNPROP)]
        VARIANT hasOwnProperty(VARIANT propertyName);

        [id(DISPID_ERROR_PROPISENUM)]
        VARIANT propertyIsEnumerable(VARIANT propertyName);

        [id(DISPID_ERROR_ISPROTOF)]
        VARIANT isPrototypeOf(VARIANT obj);
    }

    [
        uuid(3eef9758-35fc-11d1-8ce4-00c04fc2b09f)
    ]
    dispinterface TypeErrorInstance {
    properties:
        [id(DISPID_ERROR_NAME)]
        StringInstance *name;

        [id(DISPID_ERROR_MESSAGE)]
        StringInstance *message;

        [id(DISPID_ERROR_IGNORECASE)]
        VARIANT ignoreCase;

        [id(DISPID_ERROR_MULTILINE)]
        VARIANT multiline;

        [id(DISPID_ERROR_LASTINDEX)]
        VARIANT lastIndex;

    methods:
        [id(DISPID_ERROR_TOSTRING)]
        StringInstance *toString();

        [id(DISPID_ERROR_TOLOCSTRING)]
        StringInstance *toLocaleString();

        [id(DISPID_ERROR_HASOWNPROP)]
        VARIANT hasOwnProperty(VARIANT propertyName);

        [id(DISPID_ERROR_PROPISENUM)]
        VARIANT propertyIsEnumerable(VARIANT propertyName);

        [id(DISPID_ERROR_ISPROTOF)]
        VARIANT isPrototypeOf(VARIANT obj);
    }

    [
        uuid(3eef9758-35fc-11d1-8ce4-00c04fc2b0a0)
    ]
    dispinterface URIErrorInstance {
    properties:
        [id(DISPID_ERROR_NAME)]
        StringInstance *name;

        [id(DISPID_ERROR_MESSAGE)]
        StringInstance *message;

        [id(DISPID_ERROR_IGNORECASE)]
        VARIANT ignoreCase;

        [id(DISPID_ERROR_MULTILINE)]
        VARIANT multiline;

        [id(DISPID_ERROR_LASTINDEX)]
        VARIANT lastIndex;

    methods:
        [id(DISPID_ERROR_TOSTRING)]
        StringInstance *toString();

        [id(DISPID_ERROR_TOLOCSTRING)]
        StringInstance *toLocaleString();

        [id(DISPID_ERROR_HASOWNPROP)]
        VARIANT hasOwnProperty(VARIANT propertyName);

        [id(DISPID_ERROR_PROPISENUM)]
        VARIANT propertyIsEnumerable(VARIANT propertyName);

        [id(DISPID_ERROR_ISPROTOF)]
        VARIANT isPrototypeOf(VARIANT obj);
    }
}
