#include <AK/String.h>
#include <AK/TypeCasts.h>
#include <AK/Variant.h>
#include <LibJS/Runtime/AbstractOperations.h>
#include <LibJS/Runtime/Error.h>
#include <LibJS/Runtime/Iterator.h>
#include <LibJS/Runtime/Object.h>
#include <LibJS/Runtime/Realm.h>
#include <LibJS/Runtime/TypedArray.h>
#include <LibJS/Runtime/VM.h>
#include <LibJS/Runtime/Value.h>
#include <LibJS/Runtime/ValueInlines.h>
#include <LibWeb/Bindings/DOMMatrixReadOnly.h>
#include <LibWeb/Bindings/DOMPointReadOnly.h>
#include <LibWeb/Bindings/ExceptionOrUtils.h>
#include <LibWeb/Bindings/Intrinsics.h>
#include <LibWeb/Geometry/DOMMatrix.h>
#include <LibWeb/Geometry/DOMMatrixReadOnly.h>
#include <LibWeb/Geometry/DOMPoint.h>
#include <LibWeb/HTML/Window.h>
#include <LibWeb/WebIDL/AbstractOperations.h>
#include <LibWeb/WebIDL/Tracing.h>

namespace Web::Bindings {

void DOMMatrixReadOnlyConstructor::initialize(JS::Realm& realm, JS::NativeFunction& object)
{
    auto& vm = realm.vm();
    [[maybe_unused]] u8 default_attributes = JS::Attribute::Enumerable;

    
    object.define_direct_property(vm.names.length, JS::Value(0), JS::Attribute::Configurable);
    object.define_direct_property(vm.names.name, JS::PrimitiveString::create(vm, "DOMMatrixReadOnly"_utf16), JS::Attribute::Configurable);
    object.define_direct_property(vm.names.prototype, &ensure_web_prototype<DOMMatrixReadOnlyPrototype>(realm, "DOMMatrixReadOnly"_fly_string), 0);
    object.define_native_function(realm, "fromMatrix"_utf16_fly_string, from_matrix, 0, JS::Attribute::Enumerable | JS::Attribute::Configurable | JS::Attribute::Writable);

    object.define_native_function(realm, "fromFloat32Array"_utf16_fly_string, from_float32_array, 1, JS::Attribute::Enumerable | JS::Attribute::Configurable | JS::Attribute::Writable);

    object.define_native_function(realm, "fromFloat64Array"_utf16_fly_string, from_float64_array, 1, JS::Attribute::Enumerable | JS::Attribute::Configurable | JS::Attribute::Writable);

}

JS::ThrowCompletionOr<GC::Ref<JS::Object>> DOMMatrixReadOnlyConstructor::construct([[maybe_unused]] InterfaceConstructor& constructor, [[maybe_unused]] JS::FunctionObject& new_target)
{
    WebIDL::log_trace(constructor.vm(), "DOMMatrixReadOnlyConstructor::construct");
    auto& vm = constructor.vm();
    [[maybe_unused]] auto& realm = *vm.current_realm();

    // To internally create a new object implementing the interface DOMMatrixReadOnly:

    // 3.2. Let prototype be ? Get(newTarget, "prototype").
    auto prototype = TRY(new_target.get(vm.names.prototype));

    // 3.3. If Type(prototype) is not Object, then:
    if (!prototype.is_object()) {
        // 1. Let targetRealm be ? GetFunctionRealm(newTarget).
        auto* target_realm = TRY(JS::get_function_realm(vm, new_target));

        // 2. Set prototype to the interface prototype object for interface in targetRealm.
        VERIFY(target_realm);
        prototype = &Bindings::ensure_web_prototype<DOMMatrixReadOnlyPrototype>(*target_realm, "DOMMatrixReadOnly"_fly_string);
    }

    auto arg0 = vm.argument(0);
    Optional<Variant<String, Vector<double>>> init {};
    if (!arg0.is_undefined())
        init = TRY(throw_dom_exception_if_needed(vm, [&] { return [&]() -> JS::ThrowCompletionOr<Variant<String, Vector<double>>> {

        if (arg0.is_object()) {
            [[maybe_unused]] auto& object = arg0.as_object();

            // 1. Let method be ? GetMethod(V, @@iterator).
            auto method = TRY(arg0.get_method(vm, vm.well_known_symbol_iterator()));

            // 2. If method is not undefined, return the result of creating a sequence of that type from V and method.
            if (method) {
                auto sequence_union_type = TRY([&]() -> JS::ThrowCompletionOr<Vector<double>> {
        // To create an IDL value of type sequence<T> given an iterable iterable and an iterator getter method, perform the following steps:
        // 1. Let iteratorRecord be ? GetIteratorFromMethod(iterable, method).
        auto iterator = TRY(JS::get_iterator_from_method(vm, arg0, *method));

        Vector<double> sequence;

        // 2. Initialize i to be 0.
        // 3. Repeat
        for (;;) {
            // 1. Let next be ? IteratorStepValue(iteratorRecord).
            auto next = TRY(JS::iterator_step_value(vm, iterator));

            // 2. If next is done, then return an IDL sequence value of type sequence<T> of length i, where the value of the element at index j is Sj.
            if (!next.has_value())
                break;

            // 3. Initialize Si to the result of converting next to an IDL value of type T.
            auto next_value = next.release_value();
            auto sequence_item = TRY(throw_dom_exception_if_needed(vm, [&] { return next_value.to_double(vm); }));

            // 4. Set i to i + 1.
            sequence.append(sequence_item);
        }

        return sequence;
    }());
                return Variant<String, Vector<double>> { sequence_union_type };
            }

        }

        auto init_string = TRY([&]() -> JS::ThrowCompletionOr<String> {
        return TRY(WebIDL::to_string(vm, arg0));
    }());
        return Variant<String, Vector<double>> { init_string };

        return vm.throw_completion<JS::TypeError>("No union types matched"_utf16);
    }(); }));

    auto impl = TRY(throw_dom_exception_if_needed(vm, [&] { return Geometry::DOMMatrixReadOnly::construct_impl(realm, init); }));

    // 7. Set instance.[[Prototype]] to prototype.
    VERIFY(prototype.is_object());
    impl->set_prototype(&prototype.as_object());

    // FIXME: Steps 8...11. of the "internally create a new object implementing the interface DOMMatrixReadOnly" algorithm
    // (https://webidl.spec.whatwg.org/#js-platform-objects) are currently not handled, or are handled within Geometry::DOMMatrixReadOnly::construct_impl().

    return *impl;
}

void DOMMatrixReadOnlyPrototype::initialize(JS::Realm& realm, JS::Object& object)
{
    [[maybe_unused]] auto& vm = realm.vm();
    [[maybe_unused]] u8 default_attributes = JS::Attribute::Enumerable | JS::Attribute::Configurable | JS::Attribute::Writable;

    object.set_prototype(realm.intrinsics().object_prototype());

    auto a_id = "a"_utf16_fly_string;
    auto native_a_getter = JS::NativeFunction::create(realm, a_getter, 0, a_id, &realm, "get"sv);
    GC::Ptr<JS::NativeFunction> native_a_setter;

    // 4. Let configurable be false if attr is unforgeable and true otherwise.
    auto a_attributes = default_attributes;

    // 5. Let desc be the PropertyDescriptor{[[Get]]: getter, [[Set]]: setter, [[Enumerable]]: true, [[Configurable]]: configurable}.

    // 7. Perform ! DefinePropertyOrThrow(target, id, desc).
    object.define_direct_accessor(a_id, native_a_getter, native_a_setter, a_attributes);

    // 8. FIXME: If attr’s type is an observable array type with type argument T, then set target’s backing observable array exotic object for attr to the result of creating an observable array exotic object in realm, given T, attr’s set an indexed value algorithm, and attr’s delete an indexed value algorithm.
    auto b_id = "b"_utf16_fly_string;
    auto native_b_getter = JS::NativeFunction::create(realm, b_getter, 0, b_id, &realm, "get"sv);
    GC::Ptr<JS::NativeFunction> native_b_setter;

    // 4. Let configurable be false if attr is unforgeable and true otherwise.
    auto b_attributes = default_attributes;

    // 5. Let desc be the PropertyDescriptor{[[Get]]: getter, [[Set]]: setter, [[Enumerable]]: true, [[Configurable]]: configurable}.

    // 7. Perform ! DefinePropertyOrThrow(target, id, desc).
    object.define_direct_accessor(b_id, native_b_getter, native_b_setter, b_attributes);

    // 8. FIXME: If attr’s type is an observable array type with type argument T, then set target’s backing observable array exotic object for attr to the result of creating an observable array exotic object in realm, given T, attr’s set an indexed value algorithm, and attr’s delete an indexed value algorithm.
    auto c_id = "c"_utf16_fly_string;
    auto native_c_getter = JS::NativeFunction::create(realm, c_getter, 0, c_id, &realm, "get"sv);
    GC::Ptr<JS::NativeFunction> native_c_setter;

    // 4. Let configurable be false if attr is unforgeable and true otherwise.
    auto c_attributes = default_attributes;

    // 5. Let desc be the PropertyDescriptor{[[Get]]: getter, [[Set]]: setter, [[Enumerable]]: true, [[Configurable]]: configurable}.

    // 7. Perform ! DefinePropertyOrThrow(target, id, desc).
    object.define_direct_accessor(c_id, native_c_getter, native_c_setter, c_attributes);

    // 8. FIXME: If attr’s type is an observable array type with type argument T, then set target’s backing observable array exotic object for attr to the result of creating an observable array exotic object in realm, given T, attr’s set an indexed value algorithm, and attr’s delete an indexed value algorithm.
    auto d_id = "d"_utf16_fly_string;
    auto native_d_getter = JS::NativeFunction::create(realm, d_getter, 0, d_id, &realm, "get"sv);
    GC::Ptr<JS::NativeFunction> native_d_setter;

    // 4. Let configurable be false if attr is unforgeable and true otherwise.
    auto d_attributes = default_attributes;

    // 5. Let desc be the PropertyDescriptor{[[Get]]: getter, [[Set]]: setter, [[Enumerable]]: true, [[Configurable]]: configurable}.

    // 7. Perform ! DefinePropertyOrThrow(target, id, desc).
    object.define_direct_accessor(d_id, native_d_getter, native_d_setter, d_attributes);

    // 8. FIXME: If attr’s type is an observable array type with type argument T, then set target’s backing observable array exotic object for attr to the result of creating an observable array exotic object in realm, given T, attr’s set an indexed value algorithm, and attr’s delete an indexed value algorithm.
    auto e_id = "e"_utf16_fly_string;
    auto native_e_getter = JS::NativeFunction::create(realm, e_getter, 0, e_id, &realm, "get"sv);
    GC::Ptr<JS::NativeFunction> native_e_setter;

    // 4. Let configurable be false if attr is unforgeable and true otherwise.
    auto e_attributes = default_attributes;

    // 5. Let desc be the PropertyDescriptor{[[Get]]: getter, [[Set]]: setter, [[Enumerable]]: true, [[Configurable]]: configurable}.

    // 7. Perform ! DefinePropertyOrThrow(target, id, desc).
    object.define_direct_accessor(e_id, native_e_getter, native_e_setter, e_attributes);

    // 8. FIXME: If attr’s type is an observable array type with type argument T, then set target’s backing observable array exotic object for attr to the result of creating an observable array exotic object in realm, given T, attr’s set an indexed value algorithm, and attr’s delete an indexed value algorithm.
    auto f_id = "f"_utf16_fly_string;
    auto native_f_getter = JS::NativeFunction::create(realm, f_getter, 0, f_id, &realm, "get"sv);
    GC::Ptr<JS::NativeFunction> native_f_setter;

    // 4. Let configurable be false if attr is unforgeable and true otherwise.
    auto f_attributes = default_attributes;

    // 5. Let desc be the PropertyDescriptor{[[Get]]: getter, [[Set]]: setter, [[Enumerable]]: true, [[Configurable]]: configurable}.

    // 7. Perform ! DefinePropertyOrThrow(target, id, desc).
    object.define_direct_accessor(f_id, native_f_getter, native_f_setter, f_attributes);

    // 8. FIXME: If attr’s type is an observable array type with type argument T, then set target’s backing observable array exotic object for attr to the result of creating an observable array exotic object in realm, given T, attr’s set an indexed value algorithm, and attr’s delete an indexed value algorithm.
    auto m11_id = "m11"_utf16_fly_string;
    auto native_m11_getter = JS::NativeFunction::create(realm, m11_getter, 0, m11_id, &realm, "get"sv);
    GC::Ptr<JS::NativeFunction> native_m11_setter;

    // 4. Let configurable be false if attr is unforgeable and true otherwise.
    auto m11_attributes = default_attributes;

    // 5. Let desc be the PropertyDescriptor{[[Get]]: getter, [[Set]]: setter, [[Enumerable]]: true, [[Configurable]]: configurable}.

    // 7. Perform ! DefinePropertyOrThrow(target, id, desc).
    object.define_direct_accessor(m11_id, native_m11_getter, native_m11_setter, m11_attributes);

    // 8. FIXME: If attr’s type is an observable array type with type argument T, then set target’s backing observable array exotic object for attr to the result of creating an observable array exotic object in realm, given T, attr’s set an indexed value algorithm, and attr’s delete an indexed value algorithm.
    auto m12_id = "m12"_utf16_fly_string;
    auto native_m12_getter = JS::NativeFunction::create(realm, m12_getter, 0, m12_id, &realm, "get"sv);
    GC::Ptr<JS::NativeFunction> native_m12_setter;

    // 4. Let configurable be false if attr is unforgeable and true otherwise.
    auto m12_attributes = default_attributes;

    // 5. Let desc be the PropertyDescriptor{[[Get]]: getter, [[Set]]: setter, [[Enumerable]]: true, [[Configurable]]: configurable}.

    // 7. Perform ! DefinePropertyOrThrow(target, id, desc).
    object.define_direct_accessor(m12_id, native_m12_getter, native_m12_setter, m12_attributes);

    // 8. FIXME: If attr’s type is an observable array type with type argument T, then set target’s backing observable array exotic object for attr to the result of creating an observable array exotic object in realm, given T, attr’s set an indexed value algorithm, and attr’s delete an indexed value algorithm.
    auto m13_id = "m13"_utf16_fly_string;
    auto native_m13_getter = JS::NativeFunction::create(realm, m13_getter, 0, m13_id, &realm, "get"sv);
    GC::Ptr<JS::NativeFunction> native_m13_setter;

    // 4. Let configurable be false if attr is unforgeable and true otherwise.
    auto m13_attributes = default_attributes;

    // 5. Let desc be the PropertyDescriptor{[[Get]]: getter, [[Set]]: setter, [[Enumerable]]: true, [[Configurable]]: configurable}.

    // 7. Perform ! DefinePropertyOrThrow(target, id, desc).
    object.define_direct_accessor(m13_id, native_m13_getter, native_m13_setter, m13_attributes);

    // 8. FIXME: If attr’s type is an observable array type with type argument T, then set target’s backing observable array exotic object for attr to the result of creating an observable array exotic object in realm, given T, attr’s set an indexed value algorithm, and attr’s delete an indexed value algorithm.
    auto m14_id = "m14"_utf16_fly_string;
    auto native_m14_getter = JS::NativeFunction::create(realm, m14_getter, 0, m14_id, &realm, "get"sv);
    GC::Ptr<JS::NativeFunction> native_m14_setter;

    // 4. Let configurable be false if attr is unforgeable and true otherwise.
    auto m14_attributes = default_attributes;

    // 5. Let desc be the PropertyDescriptor{[[Get]]: getter, [[Set]]: setter, [[Enumerable]]: true, [[Configurable]]: configurable}.

    // 7. Perform ! DefinePropertyOrThrow(target, id, desc).
    object.define_direct_accessor(m14_id, native_m14_getter, native_m14_setter, m14_attributes);

    // 8. FIXME: If attr’s type is an observable array type with type argument T, then set target’s backing observable array exotic object for attr to the result of creating an observable array exotic object in realm, given T, attr’s set an indexed value algorithm, and attr’s delete an indexed value algorithm.
    auto m21_id = "m21"_utf16_fly_string;
    auto native_m21_getter = JS::NativeFunction::create(realm, m21_getter, 0, m21_id, &realm, "get"sv);
    GC::Ptr<JS::NativeFunction> native_m21_setter;

    // 4. Let configurable be false if attr is unforgeable and true otherwise.
    auto m21_attributes = default_attributes;

    // 5. Let desc be the PropertyDescriptor{[[Get]]: getter, [[Set]]: setter, [[Enumerable]]: true, [[Configurable]]: configurable}.

    // 7. Perform ! DefinePropertyOrThrow(target, id, desc).
    object.define_direct_accessor(m21_id, native_m21_getter, native_m21_setter, m21_attributes);

    // 8. FIXME: If attr’s type is an observable array type with type argument T, then set target’s backing observable array exotic object for attr to the result of creating an observable array exotic object in realm, given T, attr’s set an indexed value algorithm, and attr’s delete an indexed value algorithm.
    auto m22_id = "m22"_utf16_fly_string;
    auto native_m22_getter = JS::NativeFunction::create(realm, m22_getter, 0, m22_id, &realm, "get"sv);
    GC::Ptr<JS::NativeFunction> native_m22_setter;

    // 4. Let configurable be false if attr is unforgeable and true otherwise.
    auto m22_attributes = default_attributes;

    // 5. Let desc be the PropertyDescriptor{[[Get]]: getter, [[Set]]: setter, [[Enumerable]]: true, [[Configurable]]: configurable}.

    // 7. Perform ! DefinePropertyOrThrow(target, id, desc).
    object.define_direct_accessor(m22_id, native_m22_getter, native_m22_setter, m22_attributes);

    // 8. FIXME: If attr’s type is an observable array type with type argument T, then set target’s backing observable array exotic object for attr to the result of creating an observable array exotic object in realm, given T, attr’s set an indexed value algorithm, and attr’s delete an indexed value algorithm.
    auto m23_id = "m23"_utf16_fly_string;
    auto native_m23_getter = JS::NativeFunction::create(realm, m23_getter, 0, m23_id, &realm, "get"sv);
    GC::Ptr<JS::NativeFunction> native_m23_setter;

    // 4. Let configurable be false if attr is unforgeable and true otherwise.
    auto m23_attributes = default_attributes;

    // 5. Let desc be the PropertyDescriptor{[[Get]]: getter, [[Set]]: setter, [[Enumerable]]: true, [[Configurable]]: configurable}.

    // 7. Perform ! DefinePropertyOrThrow(target, id, desc).
    object.define_direct_accessor(m23_id, native_m23_getter, native_m23_setter, m23_attributes);

    // 8. FIXME: If attr’s type is an observable array type with type argument T, then set target’s backing observable array exotic object for attr to the result of creating an observable array exotic object in realm, given T, attr’s set an indexed value algorithm, and attr’s delete an indexed value algorithm.
    auto m24_id = "m24"_utf16_fly_string;
    auto native_m24_getter = JS::NativeFunction::create(realm, m24_getter, 0, m24_id, &realm, "get"sv);
    GC::Ptr<JS::NativeFunction> native_m24_setter;

    // 4. Let configurable be false if attr is unforgeable and true otherwise.
    auto m24_attributes = default_attributes;

    // 5. Let desc be the PropertyDescriptor{[[Get]]: getter, [[Set]]: setter, [[Enumerable]]: true, [[Configurable]]: configurable}.

    // 7. Perform ! DefinePropertyOrThrow(target, id, desc).
    object.define_direct_accessor(m24_id, native_m24_getter, native_m24_setter, m24_attributes);

    // 8. FIXME: If attr’s type is an observable array type with type argument T, then set target’s backing observable array exotic object for attr to the result of creating an observable array exotic object in realm, given T, attr’s set an indexed value algorithm, and attr’s delete an indexed value algorithm.
    auto m31_id = "m31"_utf16_fly_string;
    auto native_m31_getter = JS::NativeFunction::create(realm, m31_getter, 0, m31_id, &realm, "get"sv);
    GC::Ptr<JS::NativeFunction> native_m31_setter;

    // 4. Let configurable be false if attr is unforgeable and true otherwise.
    auto m31_attributes = default_attributes;

    // 5. Let desc be the PropertyDescriptor{[[Get]]: getter, [[Set]]: setter, [[Enumerable]]: true, [[Configurable]]: configurable}.

    // 7. Perform ! DefinePropertyOrThrow(target, id, desc).
    object.define_direct_accessor(m31_id, native_m31_getter, native_m31_setter, m31_attributes);

    // 8. FIXME: If attr’s type is an observable array type with type argument T, then set target’s backing observable array exotic object for attr to the result of creating an observable array exotic object in realm, given T, attr’s set an indexed value algorithm, and attr’s delete an indexed value algorithm.
    auto m32_id = "m32"_utf16_fly_string;
    auto native_m32_getter = JS::NativeFunction::create(realm, m32_getter, 0, m32_id, &realm, "get"sv);
    GC::Ptr<JS::NativeFunction> native_m32_setter;

    // 4. Let configurable be false if attr is unforgeable and true otherwise.
    auto m32_attributes = default_attributes;

    // 5. Let desc be the PropertyDescriptor{[[Get]]: getter, [[Set]]: setter, [[Enumerable]]: true, [[Configurable]]: configurable}.

    // 7. Perform ! DefinePropertyOrThrow(target, id, desc).
    object.define_direct_accessor(m32_id, native_m32_getter, native_m32_setter, m32_attributes);

    // 8. FIXME: If attr’s type is an observable array type with type argument T, then set target’s backing observable array exotic object for attr to the result of creating an observable array exotic object in realm, given T, attr’s set an indexed value algorithm, and attr’s delete an indexed value algorithm.
    auto m33_id = "m33"_utf16_fly_string;
    auto native_m33_getter = JS::NativeFunction::create(realm, m33_getter, 0, m33_id, &realm, "get"sv);
    GC::Ptr<JS::NativeFunction> native_m33_setter;

    // 4. Let configurable be false if attr is unforgeable and true otherwise.
    auto m33_attributes = default_attributes;

    // 5. Let desc be the PropertyDescriptor{[[Get]]: getter, [[Set]]: setter, [[Enumerable]]: true, [[Configurable]]: configurable}.

    // 7. Perform ! DefinePropertyOrThrow(target, id, desc).
    object.define_direct_accessor(m33_id, native_m33_getter, native_m33_setter, m33_attributes);

    // 8. FIXME: If attr’s type is an observable array type with type argument T, then set target’s backing observable array exotic object for attr to the result of creating an observable array exotic object in realm, given T, attr’s set an indexed value algorithm, and attr’s delete an indexed value algorithm.
    auto m34_id = "m34"_utf16_fly_string;
    auto native_m34_getter = JS::NativeFunction::create(realm, m34_getter, 0, m34_id, &realm, "get"sv);
    GC::Ptr<JS::NativeFunction> native_m34_setter;

    // 4. Let configurable be false if attr is unforgeable and true otherwise.
    auto m34_attributes = default_attributes;

    // 5. Let desc be the PropertyDescriptor{[[Get]]: getter, [[Set]]: setter, [[Enumerable]]: true, [[Configurable]]: configurable}.

    // 7. Perform ! DefinePropertyOrThrow(target, id, desc).
    object.define_direct_accessor(m34_id, native_m34_getter, native_m34_setter, m34_attributes);

    // 8. FIXME: If attr’s type is an observable array type with type argument T, then set target’s backing observable array exotic object for attr to the result of creating an observable array exotic object in realm, given T, attr’s set an indexed value algorithm, and attr’s delete an indexed value algorithm.
    auto m41_id = "m41"_utf16_fly_string;
    auto native_m41_getter = JS::NativeFunction::create(realm, m41_getter, 0, m41_id, &realm, "get"sv);
    GC::Ptr<JS::NativeFunction> native_m41_setter;

    // 4. Let configurable be false if attr is unforgeable and true otherwise.
    auto m41_attributes = default_attributes;

    // 5. Let desc be the PropertyDescriptor{[[Get]]: getter, [[Set]]: setter, [[Enumerable]]: true, [[Configurable]]: configurable}.

    // 7. Perform ! DefinePropertyOrThrow(target, id, desc).
    object.define_direct_accessor(m41_id, native_m41_getter, native_m41_setter, m41_attributes);

    // 8. FIXME: If attr’s type is an observable array type with type argument T, then set target’s backing observable array exotic object for attr to the result of creating an observable array exotic object in realm, given T, attr’s set an indexed value algorithm, and attr’s delete an indexed value algorithm.
    auto m42_id = "m42"_utf16_fly_string;
    auto native_m42_getter = JS::NativeFunction::create(realm, m42_getter, 0, m42_id, &realm, "get"sv);
    GC::Ptr<JS::NativeFunction> native_m42_setter;

    // 4. Let configurable be false if attr is unforgeable and true otherwise.
    auto m42_attributes = default_attributes;

    // 5. Let desc be the PropertyDescriptor{[[Get]]: getter, [[Set]]: setter, [[Enumerable]]: true, [[Configurable]]: configurable}.

    // 7. Perform ! DefinePropertyOrThrow(target, id, desc).
    object.define_direct_accessor(m42_id, native_m42_getter, native_m42_setter, m42_attributes);

    // 8. FIXME: If attr’s type is an observable array type with type argument T, then set target’s backing observable array exotic object for attr to the result of creating an observable array exotic object in realm, given T, attr’s set an indexed value algorithm, and attr’s delete an indexed value algorithm.
    auto m43_id = "m43"_utf16_fly_string;
    auto native_m43_getter = JS::NativeFunction::create(realm, m43_getter, 0, m43_id, &realm, "get"sv);
    GC::Ptr<JS::NativeFunction> native_m43_setter;

    // 4. Let configurable be false if attr is unforgeable and true otherwise.
    auto m43_attributes = default_attributes;

    // 5. Let desc be the PropertyDescriptor{[[Get]]: getter, [[Set]]: setter, [[Enumerable]]: true, [[Configurable]]: configurable}.

    // 7. Perform ! DefinePropertyOrThrow(target, id, desc).
    object.define_direct_accessor(m43_id, native_m43_getter, native_m43_setter, m43_attributes);

    // 8. FIXME: If attr’s type is an observable array type with type argument T, then set target’s backing observable array exotic object for attr to the result of creating an observable array exotic object in realm, given T, attr’s set an indexed value algorithm, and attr’s delete an indexed value algorithm.
    auto m44_id = "m44"_utf16_fly_string;
    auto native_m44_getter = JS::NativeFunction::create(realm, m44_getter, 0, m44_id, &realm, "get"sv);
    GC::Ptr<JS::NativeFunction> native_m44_setter;

    // 4. Let configurable be false if attr is unforgeable and true otherwise.
    auto m44_attributes = default_attributes;

    // 5. Let desc be the PropertyDescriptor{[[Get]]: getter, [[Set]]: setter, [[Enumerable]]: true, [[Configurable]]: configurable}.

    // 7. Perform ! DefinePropertyOrThrow(target, id, desc).
    object.define_direct_accessor(m44_id, native_m44_getter, native_m44_setter, m44_attributes);

    // 8. FIXME: If attr’s type is an observable array type with type argument T, then set target’s backing observable array exotic object for attr to the result of creating an observable array exotic object in realm, given T, attr’s set an indexed value algorithm, and attr’s delete an indexed value algorithm.
    auto is2d_id = "is2D"_utf16_fly_string;
    auto native_is2d_getter = JS::NativeFunction::create(realm, is2d_getter, 0, is2d_id, &realm, "get"sv);
    GC::Ptr<JS::NativeFunction> native_is2d_setter;

    // 4. Let configurable be false if attr is unforgeable and true otherwise.
    auto is2d_attributes = default_attributes;

    // 5. Let desc be the PropertyDescriptor{[[Get]]: getter, [[Set]]: setter, [[Enumerable]]: true, [[Configurable]]: configurable}.

    // 7. Perform ! DefinePropertyOrThrow(target, id, desc).
    object.define_direct_accessor(is2d_id, native_is2d_getter, native_is2d_setter, is2d_attributes);

    // 8. FIXME: If attr’s type is an observable array type with type argument T, then set target’s backing observable array exotic object for attr to the result of creating an observable array exotic object in realm, given T, attr’s set an indexed value algorithm, and attr’s delete an indexed value algorithm.
    auto is_identity_id = "isIdentity"_utf16_fly_string;
    auto native_is_identity_getter = JS::NativeFunction::create(realm, is_identity_getter, 0, is_identity_id, &realm, "get"sv);
    GC::Ptr<JS::NativeFunction> native_is_identity_setter;

    // 4. Let configurable be false if attr is unforgeable and true otherwise.
    auto is_identity_attributes = default_attributes;

    // 5. Let desc be the PropertyDescriptor{[[Get]]: getter, [[Set]]: setter, [[Enumerable]]: true, [[Configurable]]: configurable}.

    // 7. Perform ! DefinePropertyOrThrow(target, id, desc).
    object.define_direct_accessor(is_identity_id, native_is_identity_getter, native_is_identity_setter, is_identity_attributes);

    // 8. FIXME: If attr’s type is an observable array type with type argument T, then set target’s backing observable array exotic object for attr to the result of creating an observable array exotic object in realm, given T, attr’s set an indexed value algorithm, and attr’s delete an indexed value algorithm.
    object.define_native_function(realm, "translate"_utf16_fly_string, translate, 0, default_attributes);

    object.define_native_function(realm, "scale"_utf16_fly_string, scale, 0, default_attributes);

    object.define_native_function(realm, "scaleNonUniform"_utf16_fly_string, scale_non_uniform, 0, default_attributes);

    object.define_native_function(realm, "scale3d"_utf16_fly_string, scale3d, 0, default_attributes);

    object.define_native_function(realm, "rotate"_utf16_fly_string, rotate, 0, default_attributes);

    object.define_native_function(realm, "rotateFromVector"_utf16_fly_string, rotate_from_vector, 0, default_attributes);

    object.define_native_function(realm, "rotateAxisAngle"_utf16_fly_string, rotate_axis_angle, 0, default_attributes);

    object.define_native_function(realm, "skewX"_utf16_fly_string, skew_x, 0, default_attributes);

    object.define_native_function(realm, "skewY"_utf16_fly_string, skew_y, 0, default_attributes);

    object.define_native_function(realm, "multiply"_utf16_fly_string, multiply, 0, default_attributes);

    object.define_native_function(realm, "flipX"_utf16_fly_string, flip_x, 0, default_attributes);

    object.define_native_function(realm, "flipY"_utf16_fly_string, flip_y, 0, default_attributes);

    object.define_native_function(realm, "inverse"_utf16_fly_string, inverse, 0, default_attributes);

    object.define_native_function(realm, "transformPoint"_utf16_fly_string, transform_point, 0, default_attributes);

    object.define_native_function(realm, "toFloat32Array"_utf16_fly_string, to_float32_array, 0, default_attributes);

    object.define_native_function(realm, "toFloat64Array"_utf16_fly_string, to_float64_array, 0, default_attributes);

    object.define_native_function(realm, "toJSON"_utf16_fly_string, to_json, 0, default_attributes);

    if (is<HTML::Window>(realm.global_object())) {
        object.define_native_function(realm, "toString"_utf16_fly_string, to_string, 0, default_attributes);
        }


    object.define_direct_property(vm.well_known_symbol_to_string_tag(), JS::PrimitiveString::create(vm, "DOMMatrixReadOnly"_utf16), JS::Attribute::Configurable);
}

void DOMMatrixReadOnlyPrototype::define_unforgeable_attributes(JS::Realm& realm, [[maybe_unused]] JS::Object& object)
{
    [[maybe_unused]] auto& vm = realm.vm();
    [[maybe_unused]] u8 default_attributes = JS::Attribute::Enumerable;
}

[[maybe_unused]] static JS::ThrowCompletionOr<Geometry::DOMMatrixReadOnly*> impl_from(JS::VM& vm, JS::Value js_value)
{

    if (auto impl = js_value.as_if<Geometry::DOMMatrixReadOnly>())
        return impl.ptr();
    return vm.throw_completion<JS::TypeError>(JS::ErrorType::NotAnObjectOfType, "DOMMatrixReadOnly");
}

[[maybe_unused]] static JS::ThrowCompletionOr<Geometry::DOMMatrixReadOnly*> impl_from(JS::VM& vm)
{
    auto this_value = vm.this_value();
    if (this_value.is_nullish())
        this_value = &vm.current_realm()->global_object();
    return impl_from(vm, this_value);
}

JS_DEFINE_NATIVE_FUNCTION(DOMMatrixReadOnlyConstructor::from_matrix)
{
    WebIDL::log_trace(vm, "DOMMatrixReadOnlyConstructor::from_matrix");
    [[maybe_unused]] auto& realm = *vm.current_realm();
    auto arg0 = vm.argument(0);
    DOMMatrixInit other = DOMMatrixInit {};
    if (!arg0.is_undefined())
        other = TRY(throw_dom_exception_if_needed(vm, [&] { return convert_to_idl_value_for_dom_matrix_init(vm, arg0); }));

    [[maybe_unused]] auto R = TRY(throw_dom_exception_if_needed(vm, [&] { return Geometry::DOMMatrixReadOnly::from_matrix(vm, other); }));
    return JS::Value(R);
}

JS_DEFINE_NATIVE_FUNCTION(DOMMatrixReadOnlyConstructor::from_float32_array)
{
    WebIDL::log_trace(vm, "DOMMatrixReadOnlyConstructor::from_float32_array");
    [[maybe_unused]] auto& realm = *vm.current_realm();
    if (vm.argument_count() < 1)
        return vm.throw_completion<JS::TypeError>(JS::ErrorType::BadArgCountOne, "fromFloat32Array");

    auto arg0 = vm.argument(0);
    auto array32 = TRY(throw_dom_exception_if_needed(vm, [&] { return [&]() -> JS::ThrowCompletionOr<GC::Ref<JS::Float32Array>> {
        // A JavaScript value V is converted to an IDL typed array value by running the following algorithm:
        // 1. Let T be the IDL type V is being converted to.
        // 2. If V is not an Object, or V does not have a [[TypedArrayName]] internal slot with a value equal to T's name,
        //    then throw a TypeError.
        auto builtin_buffer = arg0.as_if<JS::Float32Array>();
        if (!builtin_buffer)
            return vm.throw_completion<JS::TypeError>(JS::ErrorType::NotAnObjectOfType, "Float32Array");

        auto& viewed_array_buffer = *builtin_buffer->viewed_array_buffer();

        // 2. If the conversion is not to an IDL type associated with the [AllowShared] extended attribute, and
        //    IsSharedArrayBuffer(V.[[ViewedArrayBuffer]]) is true, then throw a TypeError.
        if (viewed_array_buffer.is_shared_array_buffer())
            return vm.throw_completion<JS::TypeError>(JS::ErrorType::SharedArrayBuffer);

        // 3. If the conversion is not to an IDL type associated with the [AllowResizable] extended attribute, and
        //    IsFixedLengthArrayBuffer(V.[[ViewedArrayBuffer]]) is false, then throw a TypeError.
        if (!viewed_array_buffer.is_fixed_length())
            return vm.throw_completion<JS::TypeError>(JS::ErrorType::NotAnObjectOfType, "fixed-length Float32Array");

        // 5. Return the IDL value of type T that is a reference to the same object as V.
        return GC::Ref { *builtin_buffer };
    }(); }));

    [[maybe_unused]] auto R = TRY(throw_dom_exception_if_needed(vm, [&] { return Geometry::DOMMatrixReadOnly::from_float32_array(vm, array32); }));
    return JS::Value(R);
}

JS_DEFINE_NATIVE_FUNCTION(DOMMatrixReadOnlyConstructor::from_float64_array)
{
    WebIDL::log_trace(vm, "DOMMatrixReadOnlyConstructor::from_float64_array");
    [[maybe_unused]] auto& realm = *vm.current_realm();
    if (vm.argument_count() < 1)
        return vm.throw_completion<JS::TypeError>(JS::ErrorType::BadArgCountOne, "fromFloat64Array");

    auto arg0 = vm.argument(0);
    auto array64 = TRY(throw_dom_exception_if_needed(vm, [&] { return [&]() -> JS::ThrowCompletionOr<GC::Ref<JS::Float64Array>> {
        // A JavaScript value V is converted to an IDL typed array value by running the following algorithm:
        // 1. Let T be the IDL type V is being converted to.
        // 2. If V is not an Object, or V does not have a [[TypedArrayName]] internal slot with a value equal to T's name,
        //    then throw a TypeError.
        auto builtin_buffer = arg0.as_if<JS::Float64Array>();
        if (!builtin_buffer)
            return vm.throw_completion<JS::TypeError>(JS::ErrorType::NotAnObjectOfType, "Float64Array");

        auto& viewed_array_buffer = *builtin_buffer->viewed_array_buffer();

        // 2. If the conversion is not to an IDL type associated with the [AllowShared] extended attribute, and
        //    IsSharedArrayBuffer(V.[[ViewedArrayBuffer]]) is true, then throw a TypeError.
        if (viewed_array_buffer.is_shared_array_buffer())
            return vm.throw_completion<JS::TypeError>(JS::ErrorType::SharedArrayBuffer);

        // 3. If the conversion is not to an IDL type associated with the [AllowResizable] extended attribute, and
        //    IsFixedLengthArrayBuffer(V.[[ViewedArrayBuffer]]) is false, then throw a TypeError.
        if (!viewed_array_buffer.is_fixed_length())
            return vm.throw_completion<JS::TypeError>(JS::ErrorType::NotAnObjectOfType, "fixed-length Float64Array");

        // 5. Return the IDL value of type T that is a reference to the same object as V.
        return GC::Ref { *builtin_buffer };
    }(); }));

    [[maybe_unused]] auto R = TRY(throw_dom_exception_if_needed(vm, [&] { return Geometry::DOMMatrixReadOnly::from_float64_array(vm, array64); }));
    return JS::Value(R);
}

JS_DEFINE_NATIVE_FUNCTION(DOMMatrixReadOnlyPrototype::a_getter)
{
    WebIDL::log_trace(vm, "DOMMatrixReadOnlyPrototype::a_getter");
    [[maybe_unused]] auto& realm = *vm.current_realm();

    auto* idl_object = TRY(impl_from(vm));


    auto R = TRY(throw_dom_exception_if_needed(vm, [&] { return idl_object->a(); }));

    return JS::Value(R);
}

JS_DEFINE_NATIVE_FUNCTION(DOMMatrixReadOnlyPrototype::b_getter)
{
    WebIDL::log_trace(vm, "DOMMatrixReadOnlyPrototype::b_getter");
    [[maybe_unused]] auto& realm = *vm.current_realm();

    auto* idl_object = TRY(impl_from(vm));


    auto R = TRY(throw_dom_exception_if_needed(vm, [&] { return idl_object->b(); }));

    return JS::Value(R);
}

JS_DEFINE_NATIVE_FUNCTION(DOMMatrixReadOnlyPrototype::c_getter)
{
    WebIDL::log_trace(vm, "DOMMatrixReadOnlyPrototype::c_getter");
    [[maybe_unused]] auto& realm = *vm.current_realm();

    auto* idl_object = TRY(impl_from(vm));


    auto R = TRY(throw_dom_exception_if_needed(vm, [&] { return idl_object->c(); }));

    return JS::Value(R);
}

JS_DEFINE_NATIVE_FUNCTION(DOMMatrixReadOnlyPrototype::d_getter)
{
    WebIDL::log_trace(vm, "DOMMatrixReadOnlyPrototype::d_getter");
    [[maybe_unused]] auto& realm = *vm.current_realm();

    auto* idl_object = TRY(impl_from(vm));


    auto R = TRY(throw_dom_exception_if_needed(vm, [&] { return idl_object->d(); }));

    return JS::Value(R);
}

JS_DEFINE_NATIVE_FUNCTION(DOMMatrixReadOnlyPrototype::e_getter)
{
    WebIDL::log_trace(vm, "DOMMatrixReadOnlyPrototype::e_getter");
    [[maybe_unused]] auto& realm = *vm.current_realm();

    auto* idl_object = TRY(impl_from(vm));


    auto R = TRY(throw_dom_exception_if_needed(vm, [&] { return idl_object->e(); }));

    return JS::Value(R);
}

JS_DEFINE_NATIVE_FUNCTION(DOMMatrixReadOnlyPrototype::f_getter)
{
    WebIDL::log_trace(vm, "DOMMatrixReadOnlyPrototype::f_getter");
    [[maybe_unused]] auto& realm = *vm.current_realm();

    auto* idl_object = TRY(impl_from(vm));


    auto R = TRY(throw_dom_exception_if_needed(vm, [&] { return idl_object->f(); }));

    return JS::Value(R);
}

JS_DEFINE_NATIVE_FUNCTION(DOMMatrixReadOnlyPrototype::m11_getter)
{
    WebIDL::log_trace(vm, "DOMMatrixReadOnlyPrototype::m11_getter");
    [[maybe_unused]] auto& realm = *vm.current_realm();

    auto* idl_object = TRY(impl_from(vm));


    auto R = TRY(throw_dom_exception_if_needed(vm, [&] { return idl_object->m11(); }));

    return JS::Value(R);
}

JS_DEFINE_NATIVE_FUNCTION(DOMMatrixReadOnlyPrototype::m12_getter)
{
    WebIDL::log_trace(vm, "DOMMatrixReadOnlyPrototype::m12_getter");
    [[maybe_unused]] auto& realm = *vm.current_realm();

    auto* idl_object = TRY(impl_from(vm));


    auto R = TRY(throw_dom_exception_if_needed(vm, [&] { return idl_object->m12(); }));

    return JS::Value(R);
}

JS_DEFINE_NATIVE_FUNCTION(DOMMatrixReadOnlyPrototype::m13_getter)
{
    WebIDL::log_trace(vm, "DOMMatrixReadOnlyPrototype::m13_getter");
    [[maybe_unused]] auto& realm = *vm.current_realm();

    auto* idl_object = TRY(impl_from(vm));


    auto R = TRY(throw_dom_exception_if_needed(vm, [&] { return idl_object->m13(); }));

    return JS::Value(R);
}

JS_DEFINE_NATIVE_FUNCTION(DOMMatrixReadOnlyPrototype::m14_getter)
{
    WebIDL::log_trace(vm, "DOMMatrixReadOnlyPrototype::m14_getter");
    [[maybe_unused]] auto& realm = *vm.current_realm();

    auto* idl_object = TRY(impl_from(vm));


    auto R = TRY(throw_dom_exception_if_needed(vm, [&] { return idl_object->m14(); }));

    return JS::Value(R);
}

JS_DEFINE_NATIVE_FUNCTION(DOMMatrixReadOnlyPrototype::m21_getter)
{
    WebIDL::log_trace(vm, "DOMMatrixReadOnlyPrototype::m21_getter");
    [[maybe_unused]] auto& realm = *vm.current_realm();

    auto* idl_object = TRY(impl_from(vm));


    auto R = TRY(throw_dom_exception_if_needed(vm, [&] { return idl_object->m21(); }));

    return JS::Value(R);
}

JS_DEFINE_NATIVE_FUNCTION(DOMMatrixReadOnlyPrototype::m22_getter)
{
    WebIDL::log_trace(vm, "DOMMatrixReadOnlyPrototype::m22_getter");
    [[maybe_unused]] auto& realm = *vm.current_realm();

    auto* idl_object = TRY(impl_from(vm));


    auto R = TRY(throw_dom_exception_if_needed(vm, [&] { return idl_object->m22(); }));

    return JS::Value(R);
}

JS_DEFINE_NATIVE_FUNCTION(DOMMatrixReadOnlyPrototype::m23_getter)
{
    WebIDL::log_trace(vm, "DOMMatrixReadOnlyPrototype::m23_getter");
    [[maybe_unused]] auto& realm = *vm.current_realm();

    auto* idl_object = TRY(impl_from(vm));


    auto R = TRY(throw_dom_exception_if_needed(vm, [&] { return idl_object->m23(); }));

    return JS::Value(R);
}

JS_DEFINE_NATIVE_FUNCTION(DOMMatrixReadOnlyPrototype::m24_getter)
{
    WebIDL::log_trace(vm, "DOMMatrixReadOnlyPrototype::m24_getter");
    [[maybe_unused]] auto& realm = *vm.current_realm();

    auto* idl_object = TRY(impl_from(vm));


    auto R = TRY(throw_dom_exception_if_needed(vm, [&] { return idl_object->m24(); }));

    return JS::Value(R);
}

JS_DEFINE_NATIVE_FUNCTION(DOMMatrixReadOnlyPrototype::m31_getter)
{
    WebIDL::log_trace(vm, "DOMMatrixReadOnlyPrototype::m31_getter");
    [[maybe_unused]] auto& realm = *vm.current_realm();

    auto* idl_object = TRY(impl_from(vm));


    auto R = TRY(throw_dom_exception_if_needed(vm, [&] { return idl_object->m31(); }));

    return JS::Value(R);
}

JS_DEFINE_NATIVE_FUNCTION(DOMMatrixReadOnlyPrototype::m32_getter)
{
    WebIDL::log_trace(vm, "DOMMatrixReadOnlyPrototype::m32_getter");
    [[maybe_unused]] auto& realm = *vm.current_realm();

    auto* idl_object = TRY(impl_from(vm));


    auto R = TRY(throw_dom_exception_if_needed(vm, [&] { return idl_object->m32(); }));

    return JS::Value(R);
}

JS_DEFINE_NATIVE_FUNCTION(DOMMatrixReadOnlyPrototype::m33_getter)
{
    WebIDL::log_trace(vm, "DOMMatrixReadOnlyPrototype::m33_getter");
    [[maybe_unused]] auto& realm = *vm.current_realm();

    auto* idl_object = TRY(impl_from(vm));


    auto R = TRY(throw_dom_exception_if_needed(vm, [&] { return idl_object->m33(); }));

    return JS::Value(R);
}

JS_DEFINE_NATIVE_FUNCTION(DOMMatrixReadOnlyPrototype::m34_getter)
{
    WebIDL::log_trace(vm, "DOMMatrixReadOnlyPrototype::m34_getter");
    [[maybe_unused]] auto& realm = *vm.current_realm();

    auto* idl_object = TRY(impl_from(vm));


    auto R = TRY(throw_dom_exception_if_needed(vm, [&] { return idl_object->m34(); }));

    return JS::Value(R);
}

JS_DEFINE_NATIVE_FUNCTION(DOMMatrixReadOnlyPrototype::m41_getter)
{
    WebIDL::log_trace(vm, "DOMMatrixReadOnlyPrototype::m41_getter");
    [[maybe_unused]] auto& realm = *vm.current_realm();

    auto* idl_object = TRY(impl_from(vm));


    auto R = TRY(throw_dom_exception_if_needed(vm, [&] { return idl_object->m41(); }));

    return JS::Value(R);
}

JS_DEFINE_NATIVE_FUNCTION(DOMMatrixReadOnlyPrototype::m42_getter)
{
    WebIDL::log_trace(vm, "DOMMatrixReadOnlyPrototype::m42_getter");
    [[maybe_unused]] auto& realm = *vm.current_realm();

    auto* idl_object = TRY(impl_from(vm));


    auto R = TRY(throw_dom_exception_if_needed(vm, [&] { return idl_object->m42(); }));

    return JS::Value(R);
}

JS_DEFINE_NATIVE_FUNCTION(DOMMatrixReadOnlyPrototype::m43_getter)
{
    WebIDL::log_trace(vm, "DOMMatrixReadOnlyPrototype::m43_getter");
    [[maybe_unused]] auto& realm = *vm.current_realm();

    auto* idl_object = TRY(impl_from(vm));


    auto R = TRY(throw_dom_exception_if_needed(vm, [&] { return idl_object->m43(); }));

    return JS::Value(R);
}

JS_DEFINE_NATIVE_FUNCTION(DOMMatrixReadOnlyPrototype::m44_getter)
{
    WebIDL::log_trace(vm, "DOMMatrixReadOnlyPrototype::m44_getter");
    [[maybe_unused]] auto& realm = *vm.current_realm();

    auto* idl_object = TRY(impl_from(vm));


    auto R = TRY(throw_dom_exception_if_needed(vm, [&] { return idl_object->m44(); }));

    return JS::Value(R);
}

JS_DEFINE_NATIVE_FUNCTION(DOMMatrixReadOnlyPrototype::is2d_getter)
{
    WebIDL::log_trace(vm, "DOMMatrixReadOnlyPrototype::is2d_getter");
    [[maybe_unused]] auto& realm = *vm.current_realm();

    auto* idl_object = TRY(impl_from(vm));


    auto R = TRY(throw_dom_exception_if_needed(vm, [&] { return idl_object->is2d(); }));

    return JS::Value(R);
}

JS_DEFINE_NATIVE_FUNCTION(DOMMatrixReadOnlyPrototype::is_identity_getter)
{
    WebIDL::log_trace(vm, "DOMMatrixReadOnlyPrototype::is_identity_getter");
    [[maybe_unused]] auto& realm = *vm.current_realm();

    auto* idl_object = TRY(impl_from(vm));


    auto R = TRY(throw_dom_exception_if_needed(vm, [&] { return idl_object->is_identity(); }));

    return JS::Value(R);
}

JS_DEFINE_NATIVE_FUNCTION(DOMMatrixReadOnlyPrototype::translate)
{
    WebIDL::log_trace(vm, "DOMMatrixReadOnlyPrototype::translate");
    [[maybe_unused]] auto& realm = *vm.current_realm();
    [[maybe_unused]] Geometry::DOMMatrixReadOnly* idl_object = TRY(impl_from(vm));

    auto arg0 = vm.argument(0);
    double tx = 0;
    if (!arg0.is_undefined())
        tx = TRY(throw_dom_exception_if_needed(vm, [&] { return arg0.to_double(vm); }));

    auto arg1 = vm.argument(1);
    double ty = 0;
    if (!arg1.is_undefined())
        ty = TRY(throw_dom_exception_if_needed(vm, [&] { return arg1.to_double(vm); }));

    auto arg2 = vm.argument(2);
    double tz = 0;
    if (!arg2.is_undefined())
        tz = TRY(throw_dom_exception_if_needed(vm, [&] { return arg2.to_double(vm); }));

    [[maybe_unused]] auto R = TRY(throw_dom_exception_if_needed(vm, [&] { return idl_object->translate(tx, ty, tz); }));
    return JS::Value(R);
}

JS_DEFINE_NATIVE_FUNCTION(DOMMatrixReadOnlyPrototype::scale)
{
    WebIDL::log_trace(vm, "DOMMatrixReadOnlyPrototype::scale");
    [[maybe_unused]] auto& realm = *vm.current_realm();
    [[maybe_unused]] Geometry::DOMMatrixReadOnly* idl_object = TRY(impl_from(vm));

    auto arg0 = vm.argument(0);
    double scale_x = 1;
    if (!arg0.is_undefined())
        scale_x = TRY(throw_dom_exception_if_needed(vm, [&] { return arg0.to_double(vm); }));

    auto arg1 = vm.argument(1);
    Optional<double> scale_y {};
    if (!arg1.is_undefined())
        scale_y = TRY(throw_dom_exception_if_needed(vm, [&] { return arg1.to_double(vm); }));

    auto arg2 = vm.argument(2);
    double scale_z = 1;
    if (!arg2.is_undefined())
        scale_z = TRY(throw_dom_exception_if_needed(vm, [&] { return arg2.to_double(vm); }));

    auto arg3 = vm.argument(3);
    double origin_x = 0;
    if (!arg3.is_undefined())
        origin_x = TRY(throw_dom_exception_if_needed(vm, [&] { return arg3.to_double(vm); }));

    auto arg4 = vm.argument(4);
    double origin_y = 0;
    if (!arg4.is_undefined())
        origin_y = TRY(throw_dom_exception_if_needed(vm, [&] { return arg4.to_double(vm); }));

    auto arg5 = vm.argument(5);
    double origin_z = 0;
    if (!arg5.is_undefined())
        origin_z = TRY(throw_dom_exception_if_needed(vm, [&] { return arg5.to_double(vm); }));

    [[maybe_unused]] auto R = TRY(throw_dom_exception_if_needed(vm, [&] { return idl_object->scale(scale_x, scale_y, scale_z, origin_x, origin_y, origin_z); }));
    return JS::Value(R);
}

JS_DEFINE_NATIVE_FUNCTION(DOMMatrixReadOnlyPrototype::scale_non_uniform)
{
    WebIDL::log_trace(vm, "DOMMatrixReadOnlyPrototype::scale_non_uniform");
    [[maybe_unused]] auto& realm = *vm.current_realm();
    [[maybe_unused]] Geometry::DOMMatrixReadOnly* idl_object = TRY(impl_from(vm));

    auto arg0 = vm.argument(0);
    double scale_x = 1;
    if (!arg0.is_undefined())
        scale_x = TRY(throw_dom_exception_if_needed(vm, [&] { return arg0.to_double(vm); }));

    auto arg1 = vm.argument(1);
    double scale_y = 1;
    if (!arg1.is_undefined())
        scale_y = TRY(throw_dom_exception_if_needed(vm, [&] { return arg1.to_double(vm); }));

    [[maybe_unused]] auto R = TRY(throw_dom_exception_if_needed(vm, [&] { return idl_object->scale_non_uniform(scale_x, scale_y); }));
    return JS::Value(R);
}

JS_DEFINE_NATIVE_FUNCTION(DOMMatrixReadOnlyPrototype::scale3d)
{
    WebIDL::log_trace(vm, "DOMMatrixReadOnlyPrototype::scale3d");
    [[maybe_unused]] auto& realm = *vm.current_realm();
    [[maybe_unused]] Geometry::DOMMatrixReadOnly* idl_object = TRY(impl_from(vm));

    auto arg0 = vm.argument(0);
    double scale = 1;
    if (!arg0.is_undefined())
        scale = TRY(throw_dom_exception_if_needed(vm, [&] { return arg0.to_double(vm); }));

    auto arg1 = vm.argument(1);
    double origin_x = 0;
    if (!arg1.is_undefined())
        origin_x = TRY(throw_dom_exception_if_needed(vm, [&] { return arg1.to_double(vm); }));

    auto arg2 = vm.argument(2);
    double origin_y = 0;
    if (!arg2.is_undefined())
        origin_y = TRY(throw_dom_exception_if_needed(vm, [&] { return arg2.to_double(vm); }));

    auto arg3 = vm.argument(3);
    double origin_z = 0;
    if (!arg3.is_undefined())
        origin_z = TRY(throw_dom_exception_if_needed(vm, [&] { return arg3.to_double(vm); }));

    [[maybe_unused]] auto R = TRY(throw_dom_exception_if_needed(vm, [&] { return idl_object->scale3d(scale, origin_x, origin_y, origin_z); }));
    return JS::Value(R);
}

JS_DEFINE_NATIVE_FUNCTION(DOMMatrixReadOnlyPrototype::rotate)
{
    WebIDL::log_trace(vm, "DOMMatrixReadOnlyPrototype::rotate");
    [[maybe_unused]] auto& realm = *vm.current_realm();
    [[maybe_unused]] Geometry::DOMMatrixReadOnly* idl_object = TRY(impl_from(vm));

    auto arg0 = vm.argument(0);
    double rot_x = 0;
    if (!arg0.is_undefined())
        rot_x = TRY(throw_dom_exception_if_needed(vm, [&] { return arg0.to_double(vm); }));

    auto arg1 = vm.argument(1);
    Optional<double> rot_y {};
    if (!arg1.is_undefined())
        rot_y = TRY(throw_dom_exception_if_needed(vm, [&] { return arg1.to_double(vm); }));

    auto arg2 = vm.argument(2);
    Optional<double> rot_z {};
    if (!arg2.is_undefined())
        rot_z = TRY(throw_dom_exception_if_needed(vm, [&] { return arg2.to_double(vm); }));

    [[maybe_unused]] auto R = TRY(throw_dom_exception_if_needed(vm, [&] { return idl_object->rotate(rot_x, rot_y, rot_z); }));
    return JS::Value(R);
}

JS_DEFINE_NATIVE_FUNCTION(DOMMatrixReadOnlyPrototype::rotate_from_vector)
{
    WebIDL::log_trace(vm, "DOMMatrixReadOnlyPrototype::rotate_from_vector");
    [[maybe_unused]] auto& realm = *vm.current_realm();
    [[maybe_unused]] Geometry::DOMMatrixReadOnly* idl_object = TRY(impl_from(vm));

    auto arg0 = vm.argument(0);
    double x = 0;
    if (!arg0.is_undefined())
        x = TRY(throw_dom_exception_if_needed(vm, [&] { return arg0.to_double(vm); }));

    auto arg1 = vm.argument(1);
    double y = 0;
    if (!arg1.is_undefined())
        y = TRY(throw_dom_exception_if_needed(vm, [&] { return arg1.to_double(vm); }));

    [[maybe_unused]] auto R = TRY(throw_dom_exception_if_needed(vm, [&] { return idl_object->rotate_from_vector(x, y); }));
    return JS::Value(R);
}

JS_DEFINE_NATIVE_FUNCTION(DOMMatrixReadOnlyPrototype::rotate_axis_angle)
{
    WebIDL::log_trace(vm, "DOMMatrixReadOnlyPrototype::rotate_axis_angle");
    [[maybe_unused]] auto& realm = *vm.current_realm();
    [[maybe_unused]] Geometry::DOMMatrixReadOnly* idl_object = TRY(impl_from(vm));

    auto arg0 = vm.argument(0);
    double x = 0;
    if (!arg0.is_undefined())
        x = TRY(throw_dom_exception_if_needed(vm, [&] { return arg0.to_double(vm); }));

    auto arg1 = vm.argument(1);
    double y = 0;
    if (!arg1.is_undefined())
        y = TRY(throw_dom_exception_if_needed(vm, [&] { return arg1.to_double(vm); }));

    auto arg2 = vm.argument(2);
    double z = 0;
    if (!arg2.is_undefined())
        z = TRY(throw_dom_exception_if_needed(vm, [&] { return arg2.to_double(vm); }));

    auto arg3 = vm.argument(3);
    double angle = 0;
    if (!arg3.is_undefined())
        angle = TRY(throw_dom_exception_if_needed(vm, [&] { return arg3.to_double(vm); }));

    [[maybe_unused]] auto R = TRY(throw_dom_exception_if_needed(vm, [&] { return idl_object->rotate_axis_angle(x, y, z, angle); }));
    return JS::Value(R);
}

JS_DEFINE_NATIVE_FUNCTION(DOMMatrixReadOnlyPrototype::skew_x)
{
    WebIDL::log_trace(vm, "DOMMatrixReadOnlyPrototype::skew_x");
    [[maybe_unused]] auto& realm = *vm.current_realm();
    [[maybe_unused]] Geometry::DOMMatrixReadOnly* idl_object = TRY(impl_from(vm));

    auto arg0 = vm.argument(0);
    double sx = 0;
    if (!arg0.is_undefined())
        sx = TRY(throw_dom_exception_if_needed(vm, [&] { return arg0.to_double(vm); }));

    [[maybe_unused]] auto R = TRY(throw_dom_exception_if_needed(vm, [&] { return idl_object->skew_x(sx); }));
    return JS::Value(R);
}

JS_DEFINE_NATIVE_FUNCTION(DOMMatrixReadOnlyPrototype::skew_y)
{
    WebIDL::log_trace(vm, "DOMMatrixReadOnlyPrototype::skew_y");
    [[maybe_unused]] auto& realm = *vm.current_realm();
    [[maybe_unused]] Geometry::DOMMatrixReadOnly* idl_object = TRY(impl_from(vm));

    auto arg0 = vm.argument(0);
    double sy = 0;
    if (!arg0.is_undefined())
        sy = TRY(throw_dom_exception_if_needed(vm, [&] { return arg0.to_double(vm); }));

    [[maybe_unused]] auto R = TRY(throw_dom_exception_if_needed(vm, [&] { return idl_object->skew_y(sy); }));
    return JS::Value(R);
}

JS_DEFINE_NATIVE_FUNCTION(DOMMatrixReadOnlyPrototype::multiply)
{
    WebIDL::log_trace(vm, "DOMMatrixReadOnlyPrototype::multiply");
    [[maybe_unused]] auto& realm = *vm.current_realm();
    [[maybe_unused]] Geometry::DOMMatrixReadOnly* idl_object = TRY(impl_from(vm));

    auto arg0 = vm.argument(0);
    DOMMatrixInit other = DOMMatrixInit {};
    if (!arg0.is_undefined())
        other = TRY(throw_dom_exception_if_needed(vm, [&] { return convert_to_idl_value_for_dom_matrix_init(vm, arg0); }));

    [[maybe_unused]] auto R = TRY(throw_dom_exception_if_needed(vm, [&] { return idl_object->multiply(other); }));
    return JS::Value(R);
}

JS_DEFINE_NATIVE_FUNCTION(DOMMatrixReadOnlyPrototype::flip_x)
{
    WebIDL::log_trace(vm, "DOMMatrixReadOnlyPrototype::flip_x");
    [[maybe_unused]] auto& realm = *vm.current_realm();
    [[maybe_unused]] Geometry::DOMMatrixReadOnly* idl_object = TRY(impl_from(vm));

    [[maybe_unused]] auto R = TRY(throw_dom_exception_if_needed(vm, [&] { return idl_object->flip_x(); }));
    return JS::Value(R);
}

JS_DEFINE_NATIVE_FUNCTION(DOMMatrixReadOnlyPrototype::flip_y)
{
    WebIDL::log_trace(vm, "DOMMatrixReadOnlyPrototype::flip_y");
    [[maybe_unused]] auto& realm = *vm.current_realm();
    [[maybe_unused]] Geometry::DOMMatrixReadOnly* idl_object = TRY(impl_from(vm));

    [[maybe_unused]] auto R = TRY(throw_dom_exception_if_needed(vm, [&] { return idl_object->flip_y(); }));
    return JS::Value(R);
}

JS_DEFINE_NATIVE_FUNCTION(DOMMatrixReadOnlyPrototype::inverse)
{
    WebIDL::log_trace(vm, "DOMMatrixReadOnlyPrototype::inverse");
    [[maybe_unused]] auto& realm = *vm.current_realm();
    [[maybe_unused]] Geometry::DOMMatrixReadOnly* idl_object = TRY(impl_from(vm));

    [[maybe_unused]] auto R = TRY(throw_dom_exception_if_needed(vm, [&] { return idl_object->inverse(); }));
    return JS::Value(R);
}

JS_DEFINE_NATIVE_FUNCTION(DOMMatrixReadOnlyPrototype::transform_point)
{
    WebIDL::log_trace(vm, "DOMMatrixReadOnlyPrototype::transform_point");
    [[maybe_unused]] auto& realm = *vm.current_realm();
    [[maybe_unused]] Geometry::DOMMatrixReadOnly* idl_object = TRY(impl_from(vm));

    auto arg0 = vm.argument(0);
    DOMPointInit point = DOMPointInit {};
    if (!arg0.is_undefined())
        point = TRY(throw_dom_exception_if_needed(vm, [&] { return convert_to_idl_value_for_dom_point_init(vm, arg0); }));

    [[maybe_unused]] auto R = TRY(throw_dom_exception_if_needed(vm, [&] { return idl_object->transform_point(point); }));
    return JS::Value(R);
}

JS_DEFINE_NATIVE_FUNCTION(DOMMatrixReadOnlyPrototype::to_float32_array)
{
    WebIDL::log_trace(vm, "DOMMatrixReadOnlyPrototype::to_float32_array");
    [[maybe_unused]] auto& realm = *vm.current_realm();
    [[maybe_unused]] Geometry::DOMMatrixReadOnly* idl_object = TRY(impl_from(vm));

    [[maybe_unused]] auto R = TRY(throw_dom_exception_if_needed(vm, [&] { return idl_object->to_float32_array(); }));
    return JS::Value(R);
}

JS_DEFINE_NATIVE_FUNCTION(DOMMatrixReadOnlyPrototype::to_float64_array)
{
    WebIDL::log_trace(vm, "DOMMatrixReadOnlyPrototype::to_float64_array");
    [[maybe_unused]] auto& realm = *vm.current_realm();
    [[maybe_unused]] Geometry::DOMMatrixReadOnly* idl_object = TRY(impl_from(vm));

    [[maybe_unused]] auto R = TRY(throw_dom_exception_if_needed(vm, [&] { return idl_object->to_float64_array(); }));
    return JS::Value(R);
}

JS_DEFINE_NATIVE_FUNCTION(DOMMatrixReadOnlyPrototype::to_json)
{
    WebIDL::log_trace(vm, "DOMMatrixReadOnlyPrototype::to_json");
    auto& realm = *vm.current_realm();

    [[maybe_unused]] auto* idl_object = TRY(impl_from(vm));

    // 4. Let result be OrdinaryObjectCreate(%Object.prototype%).
    auto result = JS::Object::create(realm, realm.intrinsics().object_prototype());

    // 5. For each key → value of map:
    auto a_0_value = TRY(throw_dom_exception_if_needed(vm, [&] { return idl_object->a(); }));

    // 1. Let k be key converted to a JavaScript value.
    auto a_0_key = "a"_utf16_fly_string;

    // 2. Let v be value converted to a JavaScript value.
    auto a_0_value_js = JS::Value(a_0_value);

    // 3. Perform ! CreateDataPropertyOrThrow(result, k, v).
    MUST(result->create_data_property(a_0_key, a_0_value_js));
    auto b_1_value = TRY(throw_dom_exception_if_needed(vm, [&] { return idl_object->b(); }));

    // 1. Let k be key converted to a JavaScript value.
    auto b_1_key = "b"_utf16_fly_string;

    // 2. Let v be value converted to a JavaScript value.
    auto b_1_value_js = JS::Value(b_1_value);

    // 3. Perform ! CreateDataPropertyOrThrow(result, k, v).
    MUST(result->create_data_property(b_1_key, b_1_value_js));
    auto c_2_value = TRY(throw_dom_exception_if_needed(vm, [&] { return idl_object->c(); }));

    // 1. Let k be key converted to a JavaScript value.
    auto c_2_key = "c"_utf16_fly_string;

    // 2. Let v be value converted to a JavaScript value.
    auto c_2_value_js = JS::Value(c_2_value);

    // 3. Perform ! CreateDataPropertyOrThrow(result, k, v).
    MUST(result->create_data_property(c_2_key, c_2_value_js));
    auto d_3_value = TRY(throw_dom_exception_if_needed(vm, [&] { return idl_object->d(); }));

    // 1. Let k be key converted to a JavaScript value.
    auto d_3_key = "d"_utf16_fly_string;

    // 2. Let v be value converted to a JavaScript value.
    auto d_3_value_js = JS::Value(d_3_value);

    // 3. Perform ! CreateDataPropertyOrThrow(result, k, v).
    MUST(result->create_data_property(d_3_key, d_3_value_js));
    auto e_4_value = TRY(throw_dom_exception_if_needed(vm, [&] { return idl_object->e(); }));

    // 1. Let k be key converted to a JavaScript value.
    auto e_4_key = "e"_utf16_fly_string;

    // 2. Let v be value converted to a JavaScript value.
    auto e_4_value_js = JS::Value(e_4_value);

    // 3. Perform ! CreateDataPropertyOrThrow(result, k, v).
    MUST(result->create_data_property(e_4_key, e_4_value_js));
    auto f_5_value = TRY(throw_dom_exception_if_needed(vm, [&] { return idl_object->f(); }));

    // 1. Let k be key converted to a JavaScript value.
    auto f_5_key = "f"_utf16_fly_string;

    // 2. Let v be value converted to a JavaScript value.
    auto f_5_value_js = JS::Value(f_5_value);

    // 3. Perform ! CreateDataPropertyOrThrow(result, k, v).
    MUST(result->create_data_property(f_5_key, f_5_value_js));
    auto m11_6_value = TRY(throw_dom_exception_if_needed(vm, [&] { return idl_object->m11(); }));

    // 1. Let k be key converted to a JavaScript value.
    auto m11_6_key = "m11"_utf16_fly_string;

    // 2. Let v be value converted to a JavaScript value.
    auto m11_6_value_js = JS::Value(m11_6_value);

    // 3. Perform ! CreateDataPropertyOrThrow(result, k, v).
    MUST(result->create_data_property(m11_6_key, m11_6_value_js));
    auto m12_7_value = TRY(throw_dom_exception_if_needed(vm, [&] { return idl_object->m12(); }));

    // 1. Let k be key converted to a JavaScript value.
    auto m12_7_key = "m12"_utf16_fly_string;

    // 2. Let v be value converted to a JavaScript value.
    auto m12_7_value_js = JS::Value(m12_7_value);

    // 3. Perform ! CreateDataPropertyOrThrow(result, k, v).
    MUST(result->create_data_property(m12_7_key, m12_7_value_js));
    auto m13_8_value = TRY(throw_dom_exception_if_needed(vm, [&] { return idl_object->m13(); }));

    // 1. Let k be key converted to a JavaScript value.
    auto m13_8_key = "m13"_utf16_fly_string;

    // 2. Let v be value converted to a JavaScript value.
    auto m13_8_value_js = JS::Value(m13_8_value);

    // 3. Perform ! CreateDataPropertyOrThrow(result, k, v).
    MUST(result->create_data_property(m13_8_key, m13_8_value_js));
    auto m14_9_value = TRY(throw_dom_exception_if_needed(vm, [&] { return idl_object->m14(); }));

    // 1. Let k be key converted to a JavaScript value.
    auto m14_9_key = "m14"_utf16_fly_string;

    // 2. Let v be value converted to a JavaScript value.
    auto m14_9_value_js = JS::Value(m14_9_value);

    // 3. Perform ! CreateDataPropertyOrThrow(result, k, v).
    MUST(result->create_data_property(m14_9_key, m14_9_value_js));
    auto m21_10_value = TRY(throw_dom_exception_if_needed(vm, [&] { return idl_object->m21(); }));

    // 1. Let k be key converted to a JavaScript value.
    auto m21_10_key = "m21"_utf16_fly_string;

    // 2. Let v be value converted to a JavaScript value.
    auto m21_10_value_js = JS::Value(m21_10_value);

    // 3. Perform ! CreateDataPropertyOrThrow(result, k, v).
    MUST(result->create_data_property(m21_10_key, m21_10_value_js));
    auto m22_11_value = TRY(throw_dom_exception_if_needed(vm, [&] { return idl_object->m22(); }));

    // 1. Let k be key converted to a JavaScript value.
    auto m22_11_key = "m22"_utf16_fly_string;

    // 2. Let v be value converted to a JavaScript value.
    auto m22_11_value_js = JS::Value(m22_11_value);

    // 3. Perform ! CreateDataPropertyOrThrow(result, k, v).
    MUST(result->create_data_property(m22_11_key, m22_11_value_js));
    auto m23_12_value = TRY(throw_dom_exception_if_needed(vm, [&] { return idl_object->m23(); }));

    // 1. Let k be key converted to a JavaScript value.
    auto m23_12_key = "m23"_utf16_fly_string;

    // 2. Let v be value converted to a JavaScript value.
    auto m23_12_value_js = JS::Value(m23_12_value);

    // 3. Perform ! CreateDataPropertyOrThrow(result, k, v).
    MUST(result->create_data_property(m23_12_key, m23_12_value_js));
    auto m24_13_value = TRY(throw_dom_exception_if_needed(vm, [&] { return idl_object->m24(); }));

    // 1. Let k be key converted to a JavaScript value.
    auto m24_13_key = "m24"_utf16_fly_string;

    // 2. Let v be value converted to a JavaScript value.
    auto m24_13_value_js = JS::Value(m24_13_value);

    // 3. Perform ! CreateDataPropertyOrThrow(result, k, v).
    MUST(result->create_data_property(m24_13_key, m24_13_value_js));
    auto m31_14_value = TRY(throw_dom_exception_if_needed(vm, [&] { return idl_object->m31(); }));

    // 1. Let k be key converted to a JavaScript value.
    auto m31_14_key = "m31"_utf16_fly_string;

    // 2. Let v be value converted to a JavaScript value.
    auto m31_14_value_js = JS::Value(m31_14_value);

    // 3. Perform ! CreateDataPropertyOrThrow(result, k, v).
    MUST(result->create_data_property(m31_14_key, m31_14_value_js));
    auto m32_15_value = TRY(throw_dom_exception_if_needed(vm, [&] { return idl_object->m32(); }));

    // 1. Let k be key converted to a JavaScript value.
    auto m32_15_key = "m32"_utf16_fly_string;

    // 2. Let v be value converted to a JavaScript value.
    auto m32_15_value_js = JS::Value(m32_15_value);

    // 3. Perform ! CreateDataPropertyOrThrow(result, k, v).
    MUST(result->create_data_property(m32_15_key, m32_15_value_js));
    auto m33_16_value = TRY(throw_dom_exception_if_needed(vm, [&] { return idl_object->m33(); }));

    // 1. Let k be key converted to a JavaScript value.
    auto m33_16_key = "m33"_utf16_fly_string;

    // 2. Let v be value converted to a JavaScript value.
    auto m33_16_value_js = JS::Value(m33_16_value);

    // 3. Perform ! CreateDataPropertyOrThrow(result, k, v).
    MUST(result->create_data_property(m33_16_key, m33_16_value_js));
    auto m34_17_value = TRY(throw_dom_exception_if_needed(vm, [&] { return idl_object->m34(); }));

    // 1. Let k be key converted to a JavaScript value.
    auto m34_17_key = "m34"_utf16_fly_string;

    // 2. Let v be value converted to a JavaScript value.
    auto m34_17_value_js = JS::Value(m34_17_value);

    // 3. Perform ! CreateDataPropertyOrThrow(result, k, v).
    MUST(result->create_data_property(m34_17_key, m34_17_value_js));
    auto m41_18_value = TRY(throw_dom_exception_if_needed(vm, [&] { return idl_object->m41(); }));

    // 1. Let k be key converted to a JavaScript value.
    auto m41_18_key = "m41"_utf16_fly_string;

    // 2. Let v be value converted to a JavaScript value.
    auto m41_18_value_js = JS::Value(m41_18_value);

    // 3. Perform ! CreateDataPropertyOrThrow(result, k, v).
    MUST(result->create_data_property(m41_18_key, m41_18_value_js));
    auto m42_19_value = TRY(throw_dom_exception_if_needed(vm, [&] { return idl_object->m42(); }));

    // 1. Let k be key converted to a JavaScript value.
    auto m42_19_key = "m42"_utf16_fly_string;

    // 2. Let v be value converted to a JavaScript value.
    auto m42_19_value_js = JS::Value(m42_19_value);

    // 3. Perform ! CreateDataPropertyOrThrow(result, k, v).
    MUST(result->create_data_property(m42_19_key, m42_19_value_js));
    auto m43_20_value = TRY(throw_dom_exception_if_needed(vm, [&] { return idl_object->m43(); }));

    // 1. Let k be key converted to a JavaScript value.
    auto m43_20_key = "m43"_utf16_fly_string;

    // 2. Let v be value converted to a JavaScript value.
    auto m43_20_value_js = JS::Value(m43_20_value);

    // 3. Perform ! CreateDataPropertyOrThrow(result, k, v).
    MUST(result->create_data_property(m43_20_key, m43_20_value_js));
    auto m44_21_value = TRY(throw_dom_exception_if_needed(vm, [&] { return idl_object->m44(); }));

    // 1. Let k be key converted to a JavaScript value.
    auto m44_21_key = "m44"_utf16_fly_string;

    // 2. Let v be value converted to a JavaScript value.
    auto m44_21_value_js = JS::Value(m44_21_value);

    // 3. Perform ! CreateDataPropertyOrThrow(result, k, v).
    MUST(result->create_data_property(m44_21_key, m44_21_value_js));
    auto is2d_22_value = TRY(throw_dom_exception_if_needed(vm, [&] { return idl_object->is2d(); }));

    // 1. Let k be key converted to a JavaScript value.
    auto is2d_22_key = "is2D"_utf16_fly_string;

    // 2. Let v be value converted to a JavaScript value.
    auto is2d_22_value_js = JS::Value(is2d_22_value);

    // 3. Perform ! CreateDataPropertyOrThrow(result, k, v).
    MUST(result->create_data_property(is2d_22_key, is2d_22_value_js));
    auto is_identity_23_value = TRY(throw_dom_exception_if_needed(vm, [&] { return idl_object->is_identity(); }));

    // 1. Let k be key converted to a JavaScript value.
    auto is_identity_23_key = "isIdentity"_utf16_fly_string;

    // 2. Let v be value converted to a JavaScript value.
    auto is_identity_23_value_js = JS::Value(is_identity_23_value);

    // 3. Perform ! CreateDataPropertyOrThrow(result, k, v).
    MUST(result->create_data_property(is_identity_23_key, is_identity_23_value_js));

    // 6. Return result.
    return result;
}

JS_DEFINE_NATIVE_FUNCTION(DOMMatrixReadOnlyPrototype::to_string)
{
    WebIDL::log_trace(vm, "DOMMatrixReadOnlyPrototype::to_string");
    auto* idl_object = TRY(impl_from(vm));
    auto R = TRY(throw_dom_exception_if_needed(vm, [&] { return idl_object->to_string(); }));
    return WebIDL::primitive_string_from_string(vm, R);
}

// https://webidl.spec.whatwg.org/#es-dictionary
JS::ThrowCompletionOr<DOMMatrix2DInit> convert_to_idl_value_for_dom_matrix2d_init(JS::VM& vm, JS::Value js_dict)
{
    // 1. If jsDict is not an Object and jsDict is neither undefined nor null, then throw a TypeError.
    if (!js_dict.is_object() && !js_dict.is_nullish())
        return vm.throw_completion<JS::TypeError>(JS::ErrorType::NotAnObjectOfType, "DOMMatrix2DInit");

    // 2. Let idlDict be an empty ordered map, representing a dictionary of type D.
    // 3. Let dictionaries be a list consisting of D and all of D’s inherited dictionaries, in order from least to most derived.
    // 4. For each dictionary dictionary in dictionaries, in order:
    // NB: We defer construction until the return initializer because some members may not be default-constructible. Inherited dictionaries are represented by the generated C++ struct inheritance.

    // 5. Return idlDict.
    return DOMMatrix2DInit {
        .a = TRY([&]() -> JS::ThrowCompletionOr<Optional<double>> {
            // 1. Let key be the identifier of member.
            // 2. If jsDict is either undefined or null, then:
            //     1. Let jsMemberValue be undefined.
            // 3. Otherwise,
            //     1. Let jsMemberValue be ? Get(jsDict, key).
            auto js_member_value = JS::js_undefined();
            if (js_dict.is_object())
                js_member_value = TRY(js_dict.as_object().get("a"_utf16_fly_string));

            // 4. If jsMemberValue is not undefined, then:
            if (!js_member_value.is_undefined()) {
                // 1. Let idlMemberValue be the result of converting jsMemberValue to an IDL value whose type is the type member is declared to be of.
                auto idl_member_value = TRY(throw_dom_exception_if_needed(vm, [&] { return js_member_value.to_double(vm); }));

                // 2. Set idlDict[key] to idlMemberValue.
                return idl_member_value;
            }
            // 7. Otherwise, jsMemberValue is undefined and the member is optional.
            return OptionalNone {};
        }()),
        .b = TRY([&]() -> JS::ThrowCompletionOr<Optional<double>> {
            // 1. Let key be the identifier of member.
            // 2. If jsDict is either undefined or null, then:
            //     1. Let jsMemberValue be undefined.
            // 3. Otherwise,
            //     1. Let jsMemberValue be ? Get(jsDict, key).
            auto js_member_value = JS::js_undefined();
            if (js_dict.is_object())
                js_member_value = TRY(js_dict.as_object().get("b"_utf16_fly_string));

            // 4. If jsMemberValue is not undefined, then:
            if (!js_member_value.is_undefined()) {
                // 1. Let idlMemberValue be the result of converting jsMemberValue to an IDL value whose type is the type member is declared to be of.
                auto idl_member_value = TRY(throw_dom_exception_if_needed(vm, [&] { return js_member_value.to_double(vm); }));

                // 2. Set idlDict[key] to idlMemberValue.
                return idl_member_value;
            }
            // 7. Otherwise, jsMemberValue is undefined and the member is optional.
            return OptionalNone {};
        }()),
        .c = TRY([&]() -> JS::ThrowCompletionOr<Optional<double>> {
            // 1. Let key be the identifier of member.
            // 2. If jsDict is either undefined or null, then:
            //     1. Let jsMemberValue be undefined.
            // 3. Otherwise,
            //     1. Let jsMemberValue be ? Get(jsDict, key).
            auto js_member_value = JS::js_undefined();
            if (js_dict.is_object())
                js_member_value = TRY(js_dict.as_object().get("c"_utf16_fly_string));

            // 4. If jsMemberValue is not undefined, then:
            if (!js_member_value.is_undefined()) {
                // 1. Let idlMemberValue be the result of converting jsMemberValue to an IDL value whose type is the type member is declared to be of.
                auto idl_member_value = TRY(throw_dom_exception_if_needed(vm, [&] { return js_member_value.to_double(vm); }));

                // 2. Set idlDict[key] to idlMemberValue.
                return idl_member_value;
            }
            // 7. Otherwise, jsMemberValue is undefined and the member is optional.
            return OptionalNone {};
        }()),
        .d = TRY([&]() -> JS::ThrowCompletionOr<Optional<double>> {
            // 1. Let key be the identifier of member.
            // 2. If jsDict is either undefined or null, then:
            //     1. Let jsMemberValue be undefined.
            // 3. Otherwise,
            //     1. Let jsMemberValue be ? Get(jsDict, key).
            auto js_member_value = JS::js_undefined();
            if (js_dict.is_object())
                js_member_value = TRY(js_dict.as_object().get("d"_utf16_fly_string));

            // 4. If jsMemberValue is not undefined, then:
            if (!js_member_value.is_undefined()) {
                // 1. Let idlMemberValue be the result of converting jsMemberValue to an IDL value whose type is the type member is declared to be of.
                auto idl_member_value = TRY(throw_dom_exception_if_needed(vm, [&] { return js_member_value.to_double(vm); }));

                // 2. Set idlDict[key] to idlMemberValue.
                return idl_member_value;
            }
            // 7. Otherwise, jsMemberValue is undefined and the member is optional.
            return OptionalNone {};
        }()),
        .e = TRY([&]() -> JS::ThrowCompletionOr<Optional<double>> {
            // 1. Let key be the identifier of member.
            // 2. If jsDict is either undefined or null, then:
            //     1. Let jsMemberValue be undefined.
            // 3. Otherwise,
            //     1. Let jsMemberValue be ? Get(jsDict, key).
            auto js_member_value = JS::js_undefined();
            if (js_dict.is_object())
                js_member_value = TRY(js_dict.as_object().get("e"_utf16_fly_string));

            // 4. If jsMemberValue is not undefined, then:
            if (!js_member_value.is_undefined()) {
                // 1. Let idlMemberValue be the result of converting jsMemberValue to an IDL value whose type is the type member is declared to be of.
                auto idl_member_value = TRY(throw_dom_exception_if_needed(vm, [&] { return js_member_value.to_double(vm); }));

                // 2. Set idlDict[key] to idlMemberValue.
                return idl_member_value;
            }
            // 7. Otherwise, jsMemberValue is undefined and the member is optional.
            return OptionalNone {};
        }()),
        .f = TRY([&]() -> JS::ThrowCompletionOr<Optional<double>> {
            // 1. Let key be the identifier of member.
            // 2. If jsDict is either undefined or null, then:
            //     1. Let jsMemberValue be undefined.
            // 3. Otherwise,
            //     1. Let jsMemberValue be ? Get(jsDict, key).
            auto js_member_value = JS::js_undefined();
            if (js_dict.is_object())
                js_member_value = TRY(js_dict.as_object().get("f"_utf16_fly_string));

            // 4. If jsMemberValue is not undefined, then:
            if (!js_member_value.is_undefined()) {
                // 1. Let idlMemberValue be the result of converting jsMemberValue to an IDL value whose type is the type member is declared to be of.
                auto idl_member_value = TRY(throw_dom_exception_if_needed(vm, [&] { return js_member_value.to_double(vm); }));

                // 2. Set idlDict[key] to idlMemberValue.
                return idl_member_value;
            }
            // 7. Otherwise, jsMemberValue is undefined and the member is optional.
            return OptionalNone {};
        }()),
        .m11 = TRY([&]() -> JS::ThrowCompletionOr<Optional<double>> {
            // 1. Let key be the identifier of member.
            // 2. If jsDict is either undefined or null, then:
            //     1. Let jsMemberValue be undefined.
            // 3. Otherwise,
            //     1. Let jsMemberValue be ? Get(jsDict, key).
            auto js_member_value = JS::js_undefined();
            if (js_dict.is_object())
                js_member_value = TRY(js_dict.as_object().get("m11"_utf16_fly_string));

            // 4. If jsMemberValue is not undefined, then:
            if (!js_member_value.is_undefined()) {
                // 1. Let idlMemberValue be the result of converting jsMemberValue to an IDL value whose type is the type member is declared to be of.
                auto idl_member_value = TRY(throw_dom_exception_if_needed(vm, [&] { return js_member_value.to_double(vm); }));

                // 2. Set idlDict[key] to idlMemberValue.
                return idl_member_value;
            }
            // 7. Otherwise, jsMemberValue is undefined and the member is optional.
            return OptionalNone {};
        }()),
        .m12 = TRY([&]() -> JS::ThrowCompletionOr<Optional<double>> {
            // 1. Let key be the identifier of member.
            // 2. If jsDict is either undefined or null, then:
            //     1. Let jsMemberValue be undefined.
            // 3. Otherwise,
            //     1. Let jsMemberValue be ? Get(jsDict, key).
            auto js_member_value = JS::js_undefined();
            if (js_dict.is_object())
                js_member_value = TRY(js_dict.as_object().get("m12"_utf16_fly_string));

            // 4. If jsMemberValue is not undefined, then:
            if (!js_member_value.is_undefined()) {
                // 1. Let idlMemberValue be the result of converting jsMemberValue to an IDL value whose type is the type member is declared to be of.
                auto idl_member_value = TRY(throw_dom_exception_if_needed(vm, [&] { return js_member_value.to_double(vm); }));

                // 2. Set idlDict[key] to idlMemberValue.
                return idl_member_value;
            }
            // 7. Otherwise, jsMemberValue is undefined and the member is optional.
            return OptionalNone {};
        }()),
        .m21 = TRY([&]() -> JS::ThrowCompletionOr<Optional<double>> {
            // 1. Let key be the identifier of member.
            // 2. If jsDict is either undefined or null, then:
            //     1. Let jsMemberValue be undefined.
            // 3. Otherwise,
            //     1. Let jsMemberValue be ? Get(jsDict, key).
            auto js_member_value = JS::js_undefined();
            if (js_dict.is_object())
                js_member_value = TRY(js_dict.as_object().get("m21"_utf16_fly_string));

            // 4. If jsMemberValue is not undefined, then:
            if (!js_member_value.is_undefined()) {
                // 1. Let idlMemberValue be the result of converting jsMemberValue to an IDL value whose type is the type member is declared to be of.
                auto idl_member_value = TRY(throw_dom_exception_if_needed(vm, [&] { return js_member_value.to_double(vm); }));

                // 2. Set idlDict[key] to idlMemberValue.
                return idl_member_value;
            }
            // 7. Otherwise, jsMemberValue is undefined and the member is optional.
            return OptionalNone {};
        }()),
        .m22 = TRY([&]() -> JS::ThrowCompletionOr<Optional<double>> {
            // 1. Let key be the identifier of member.
            // 2. If jsDict is either undefined or null, then:
            //     1. Let jsMemberValue be undefined.
            // 3. Otherwise,
            //     1. Let jsMemberValue be ? Get(jsDict, key).
            auto js_member_value = JS::js_undefined();
            if (js_dict.is_object())
                js_member_value = TRY(js_dict.as_object().get("m22"_utf16_fly_string));

            // 4. If jsMemberValue is not undefined, then:
            if (!js_member_value.is_undefined()) {
                // 1. Let idlMemberValue be the result of converting jsMemberValue to an IDL value whose type is the type member is declared to be of.
                auto idl_member_value = TRY(throw_dom_exception_if_needed(vm, [&] { return js_member_value.to_double(vm); }));

                // 2. Set idlDict[key] to idlMemberValue.
                return idl_member_value;
            }
            // 7. Otherwise, jsMemberValue is undefined and the member is optional.
            return OptionalNone {};
        }()),
        .m41 = TRY([&]() -> JS::ThrowCompletionOr<Optional<double>> {
            // 1. Let key be the identifier of member.
            // 2. If jsDict is either undefined or null, then:
            //     1. Let jsMemberValue be undefined.
            // 3. Otherwise,
            //     1. Let jsMemberValue be ? Get(jsDict, key).
            auto js_member_value = JS::js_undefined();
            if (js_dict.is_object())
                js_member_value = TRY(js_dict.as_object().get("m41"_utf16_fly_string));

            // 4. If jsMemberValue is not undefined, then:
            if (!js_member_value.is_undefined()) {
                // 1. Let idlMemberValue be the result of converting jsMemberValue to an IDL value whose type is the type member is declared to be of.
                auto idl_member_value = TRY(throw_dom_exception_if_needed(vm, [&] { return js_member_value.to_double(vm); }));

                // 2. Set idlDict[key] to idlMemberValue.
                return idl_member_value;
            }
            // 7. Otherwise, jsMemberValue is undefined and the member is optional.
            return OptionalNone {};
        }()),
        .m42 = TRY([&]() -> JS::ThrowCompletionOr<Optional<double>> {
            // 1. Let key be the identifier of member.
            // 2. If jsDict is either undefined or null, then:
            //     1. Let jsMemberValue be undefined.
            // 3. Otherwise,
            //     1. Let jsMemberValue be ? Get(jsDict, key).
            auto js_member_value = JS::js_undefined();
            if (js_dict.is_object())
                js_member_value = TRY(js_dict.as_object().get("m42"_utf16_fly_string));

            // 4. If jsMemberValue is not undefined, then:
            if (!js_member_value.is_undefined()) {
                // 1. Let idlMemberValue be the result of converting jsMemberValue to an IDL value whose type is the type member is declared to be of.
                auto idl_member_value = TRY(throw_dom_exception_if_needed(vm, [&] { return js_member_value.to_double(vm); }));

                // 2. Set idlDict[key] to idlMemberValue.
                return idl_member_value;
            }
            // 7. Otherwise, jsMemberValue is undefined and the member is optional.
            return OptionalNone {};
        }()),
    };
}

// https://webidl.spec.whatwg.org/#es-dictionary
JS::ThrowCompletionOr<DOMMatrixInit> convert_to_idl_value_for_dom_matrix_init(JS::VM& vm, JS::Value js_dict)
{
    // 1. If jsDict is not an Object and jsDict is neither undefined nor null, then throw a TypeError.
    if (!js_dict.is_object() && !js_dict.is_nullish())
        return vm.throw_completion<JS::TypeError>(JS::ErrorType::NotAnObjectOfType, "DOMMatrixInit");

    // 2. Let idlDict be an empty ordered map, representing a dictionary of type D.
    // 3. Let dictionaries be a list consisting of D and all of D’s inherited dictionaries, in order from least to most derived.
    // 4. For each dictionary dictionary in dictionaries, in order:
    // NB: We defer construction until the return initializer because some members may not be default-constructible. Inherited dictionaries are represented by the generated C++ struct inheritance.

    // 5. Return idlDict.
    return DOMMatrixInit {
        TRY(convert_to_idl_value_for_dom_matrix2d_init(vm, js_dict)),
        TRY([&]() -> JS::ThrowCompletionOr<Optional<bool>> {
            // 1. Let key be the identifier of member.
            // 2. If jsDict is either undefined or null, then:
            //     1. Let jsMemberValue be undefined.
            // 3. Otherwise,
            //     1. Let jsMemberValue be ? Get(jsDict, key).
            auto js_member_value = JS::js_undefined();
            if (js_dict.is_object())
                js_member_value = TRY(js_dict.as_object().get("is2D"_utf16_fly_string));

            // 4. If jsMemberValue is not undefined, then:
            if (!js_member_value.is_undefined()) {
                // 1. Let idlMemberValue be the result of converting jsMemberValue to an IDL value whose type is the type member is declared to be of.
                auto idl_member_value = TRY(throw_dom_exception_if_needed(vm, [&] { return js_member_value.to_boolean(); }));

                // 2. Set idlDict[key] to idlMemberValue.
                return idl_member_value;
            }
            // 7. Otherwise, jsMemberValue is undefined and the member is optional.
            return OptionalNone {};
        }()),
        TRY([&]() -> JS::ThrowCompletionOr<double> {
            // 1. Let key be the identifier of member.
            // 2. If jsDict is either undefined or null, then:
            //     1. Let jsMemberValue be undefined.
            // 3. Otherwise,
            //     1. Let jsMemberValue be ? Get(jsDict, key).
            auto js_member_value = JS::js_undefined();
            if (js_dict.is_object())
                js_member_value = TRY(js_dict.as_object().get("m13"_utf16_fly_string));

            // 4. If jsMemberValue is not undefined, then:
            if (!js_member_value.is_undefined()) {
                // 1. Let idlMemberValue be the result of converting jsMemberValue to an IDL value whose type is the type member is declared to be of.
                auto idl_member_value = TRY(throw_dom_exception_if_needed(vm, [&] { return js_member_value.to_double(vm); }));

                // 2. Set idlDict[key] to idlMemberValue.
                return idl_member_value;
            }
            // 5. Otherwise, if jsMemberValue is undefined but member has a default value, then:
            // 1. Let idlMemberValue be the result of converting member's default value to an IDL value whose type is the type member is declared to be of.
            auto idl_member_value = 0;

            // 2. Set idlDict[key] to idlMemberValue.
            return idl_member_value;
        }()),
        TRY([&]() -> JS::ThrowCompletionOr<double> {
            // 1. Let key be the identifier of member.
            // 2. If jsDict is either undefined or null, then:
            //     1. Let jsMemberValue be undefined.
            // 3. Otherwise,
            //     1. Let jsMemberValue be ? Get(jsDict, key).
            auto js_member_value = JS::js_undefined();
            if (js_dict.is_object())
                js_member_value = TRY(js_dict.as_object().get("m14"_utf16_fly_string));

            // 4. If jsMemberValue is not undefined, then:
            if (!js_member_value.is_undefined()) {
                // 1. Let idlMemberValue be the result of converting jsMemberValue to an IDL value whose type is the type member is declared to be of.
                auto idl_member_value = TRY(throw_dom_exception_if_needed(vm, [&] { return js_member_value.to_double(vm); }));

                // 2. Set idlDict[key] to idlMemberValue.
                return idl_member_value;
            }
            // 5. Otherwise, if jsMemberValue is undefined but member has a default value, then:
            // 1. Let idlMemberValue be the result of converting member's default value to an IDL value whose type is the type member is declared to be of.
            auto idl_member_value = 0;

            // 2. Set idlDict[key] to idlMemberValue.
            return idl_member_value;
        }()),
        TRY([&]() -> JS::ThrowCompletionOr<double> {
            // 1. Let key be the identifier of member.
            // 2. If jsDict is either undefined or null, then:
            //     1. Let jsMemberValue be undefined.
            // 3. Otherwise,
            //     1. Let jsMemberValue be ? Get(jsDict, key).
            auto js_member_value = JS::js_undefined();
            if (js_dict.is_object())
                js_member_value = TRY(js_dict.as_object().get("m23"_utf16_fly_string));

            // 4. If jsMemberValue is not undefined, then:
            if (!js_member_value.is_undefined()) {
                // 1. Let idlMemberValue be the result of converting jsMemberValue to an IDL value whose type is the type member is declared to be of.
                auto idl_member_value = TRY(throw_dom_exception_if_needed(vm, [&] { return js_member_value.to_double(vm); }));

                // 2. Set idlDict[key] to idlMemberValue.
                return idl_member_value;
            }
            // 5. Otherwise, if jsMemberValue is undefined but member has a default value, then:
            // 1. Let idlMemberValue be the result of converting member's default value to an IDL value whose type is the type member is declared to be of.
            auto idl_member_value = 0;

            // 2. Set idlDict[key] to idlMemberValue.
            return idl_member_value;
        }()),
        TRY([&]() -> JS::ThrowCompletionOr<double> {
            // 1. Let key be the identifier of member.
            // 2. If jsDict is either undefined or null, then:
            //     1. Let jsMemberValue be undefined.
            // 3. Otherwise,
            //     1. Let jsMemberValue be ? Get(jsDict, key).
            auto js_member_value = JS::js_undefined();
            if (js_dict.is_object())
                js_member_value = TRY(js_dict.as_object().get("m24"_utf16_fly_string));

            // 4. If jsMemberValue is not undefined, then:
            if (!js_member_value.is_undefined()) {
                // 1. Let idlMemberValue be the result of converting jsMemberValue to an IDL value whose type is the type member is declared to be of.
                auto idl_member_value = TRY(throw_dom_exception_if_needed(vm, [&] { return js_member_value.to_double(vm); }));

                // 2. Set idlDict[key] to idlMemberValue.
                return idl_member_value;
            }
            // 5. Otherwise, if jsMemberValue is undefined but member has a default value, then:
            // 1. Let idlMemberValue be the result of converting member's default value to an IDL value whose type is the type member is declared to be of.
            auto idl_member_value = 0;

            // 2. Set idlDict[key] to idlMemberValue.
            return idl_member_value;
        }()),
        TRY([&]() -> JS::ThrowCompletionOr<double> {
            // 1. Let key be the identifier of member.
            // 2. If jsDict is either undefined or null, then:
            //     1. Let jsMemberValue be undefined.
            // 3. Otherwise,
            //     1. Let jsMemberValue be ? Get(jsDict, key).
            auto js_member_value = JS::js_undefined();
            if (js_dict.is_object())
                js_member_value = TRY(js_dict.as_object().get("m31"_utf16_fly_string));

            // 4. If jsMemberValue is not undefined, then:
            if (!js_member_value.is_undefined()) {
                // 1. Let idlMemberValue be the result of converting jsMemberValue to an IDL value whose type is the type member is declared to be of.
                auto idl_member_value = TRY(throw_dom_exception_if_needed(vm, [&] { return js_member_value.to_double(vm); }));

                // 2. Set idlDict[key] to idlMemberValue.
                return idl_member_value;
            }
            // 5. Otherwise, if jsMemberValue is undefined but member has a default value, then:
            // 1. Let idlMemberValue be the result of converting member's default value to an IDL value whose type is the type member is declared to be of.
            auto idl_member_value = 0;

            // 2. Set idlDict[key] to idlMemberValue.
            return idl_member_value;
        }()),
        TRY([&]() -> JS::ThrowCompletionOr<double> {
            // 1. Let key be the identifier of member.
            // 2. If jsDict is either undefined or null, then:
            //     1. Let jsMemberValue be undefined.
            // 3. Otherwise,
            //     1. Let jsMemberValue be ? Get(jsDict, key).
            auto js_member_value = JS::js_undefined();
            if (js_dict.is_object())
                js_member_value = TRY(js_dict.as_object().get("m32"_utf16_fly_string));

            // 4. If jsMemberValue is not undefined, then:
            if (!js_member_value.is_undefined()) {
                // 1. Let idlMemberValue be the result of converting jsMemberValue to an IDL value whose type is the type member is declared to be of.
                auto idl_member_value = TRY(throw_dom_exception_if_needed(vm, [&] { return js_member_value.to_double(vm); }));

                // 2. Set idlDict[key] to idlMemberValue.
                return idl_member_value;
            }
            // 5. Otherwise, if jsMemberValue is undefined but member has a default value, then:
            // 1. Let idlMemberValue be the result of converting member's default value to an IDL value whose type is the type member is declared to be of.
            auto idl_member_value = 0;

            // 2. Set idlDict[key] to idlMemberValue.
            return idl_member_value;
        }()),
        TRY([&]() -> JS::ThrowCompletionOr<double> {
            // 1. Let key be the identifier of member.
            // 2. If jsDict is either undefined or null, then:
            //     1. Let jsMemberValue be undefined.
            // 3. Otherwise,
            //     1. Let jsMemberValue be ? Get(jsDict, key).
            auto js_member_value = JS::js_undefined();
            if (js_dict.is_object())
                js_member_value = TRY(js_dict.as_object().get("m33"_utf16_fly_string));

            // 4. If jsMemberValue is not undefined, then:
            if (!js_member_value.is_undefined()) {
                // 1. Let idlMemberValue be the result of converting jsMemberValue to an IDL value whose type is the type member is declared to be of.
                auto idl_member_value = TRY(throw_dom_exception_if_needed(vm, [&] { return js_member_value.to_double(vm); }));

                // 2. Set idlDict[key] to idlMemberValue.
                return idl_member_value;
            }
            // 5. Otherwise, if jsMemberValue is undefined but member has a default value, then:
            // 1. Let idlMemberValue be the result of converting member's default value to an IDL value whose type is the type member is declared to be of.
            auto idl_member_value = 1;

            // 2. Set idlDict[key] to idlMemberValue.
            return idl_member_value;
        }()),
        TRY([&]() -> JS::ThrowCompletionOr<double> {
            // 1. Let key be the identifier of member.
            // 2. If jsDict is either undefined or null, then:
            //     1. Let jsMemberValue be undefined.
            // 3. Otherwise,
            //     1. Let jsMemberValue be ? Get(jsDict, key).
            auto js_member_value = JS::js_undefined();
            if (js_dict.is_object())
                js_member_value = TRY(js_dict.as_object().get("m34"_utf16_fly_string));

            // 4. If jsMemberValue is not undefined, then:
            if (!js_member_value.is_undefined()) {
                // 1. Let idlMemberValue be the result of converting jsMemberValue to an IDL value whose type is the type member is declared to be of.
                auto idl_member_value = TRY(throw_dom_exception_if_needed(vm, [&] { return js_member_value.to_double(vm); }));

                // 2. Set idlDict[key] to idlMemberValue.
                return idl_member_value;
            }
            // 5. Otherwise, if jsMemberValue is undefined but member has a default value, then:
            // 1. Let idlMemberValue be the result of converting member's default value to an IDL value whose type is the type member is declared to be of.
            auto idl_member_value = 0;

            // 2. Set idlDict[key] to idlMemberValue.
            return idl_member_value;
        }()),
        TRY([&]() -> JS::ThrowCompletionOr<double> {
            // 1. Let key be the identifier of member.
            // 2. If jsDict is either undefined or null, then:
            //     1. Let jsMemberValue be undefined.
            // 3. Otherwise,
            //     1. Let jsMemberValue be ? Get(jsDict, key).
            auto js_member_value = JS::js_undefined();
            if (js_dict.is_object())
                js_member_value = TRY(js_dict.as_object().get("m43"_utf16_fly_string));

            // 4. If jsMemberValue is not undefined, then:
            if (!js_member_value.is_undefined()) {
                // 1. Let idlMemberValue be the result of converting jsMemberValue to an IDL value whose type is the type member is declared to be of.
                auto idl_member_value = TRY(throw_dom_exception_if_needed(vm, [&] { return js_member_value.to_double(vm); }));

                // 2. Set idlDict[key] to idlMemberValue.
                return idl_member_value;
            }
            // 5. Otherwise, if jsMemberValue is undefined but member has a default value, then:
            // 1. Let idlMemberValue be the result of converting member's default value to an IDL value whose type is the type member is declared to be of.
            auto idl_member_value = 0;

            // 2. Set idlDict[key] to idlMemberValue.
            return idl_member_value;
        }()),
        TRY([&]() -> JS::ThrowCompletionOr<double> {
            // 1. Let key be the identifier of member.
            // 2. If jsDict is either undefined or null, then:
            //     1. Let jsMemberValue be undefined.
            // 3. Otherwise,
            //     1. Let jsMemberValue be ? Get(jsDict, key).
            auto js_member_value = JS::js_undefined();
            if (js_dict.is_object())
                js_member_value = TRY(js_dict.as_object().get("m44"_utf16_fly_string));

            // 4. If jsMemberValue is not undefined, then:
            if (!js_member_value.is_undefined()) {
                // 1. Let idlMemberValue be the result of converting jsMemberValue to an IDL value whose type is the type member is declared to be of.
                auto idl_member_value = TRY(throw_dom_exception_if_needed(vm, [&] { return js_member_value.to_double(vm); }));

                // 2. Set idlDict[key] to idlMemberValue.
                return idl_member_value;
            }
            // 5. Otherwise, if jsMemberValue is undefined but member has a default value, then:
            // 1. Let idlMemberValue be the result of converting member's default value to an IDL value whose type is the type member is declared to be of.
            auto idl_member_value = 1;

            // 2. Set idlDict[key] to idlMemberValue.
            return idl_member_value;
        }()),
    };
}

} // namespace Web::Bindings
