ecdev


Nameecdev JSON
Version 0.0.5.post1 PyPI version JSON
download
home_pagehttps://ec-lang.org
SummaryeC Software Development Kit
upload_time2025-10-09 11:20:53
maintainerNone
docs_urlNone
authorJérôme Jacovella-St-Louis, Ecere Corporation
requires_pythonNone
licenseBSD-3-Clause
keywords ec sdk compiler transpiler archiver runtime type-system object-model reflection file-system collections datetime json-parser econ serialization
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # eC Software Development Kit and Runtime Library

https://ec-lang.org

A stand-alone Software Development Kit and runtime library for the [eC programming language](https://ec-lang.org)

(_part of the [Ecere SDK](https://ecere.org)_)

Copyright (c) 1996-2025, Jérôme Jacovella-St-Louis

Copyright (c) 2005-2025, Ecere Corporation

Licensed under the [BSD 3-Clause License](https://opensource.org/license/bsd-3-clause)

Source: https://github.com/ecere/eC

Python packaging: https://github.com/ecere/pyecdev

# The eC Programming Language

eC is a light, expressive and intuitive C Style object-oriented programming language.
eC is a superset of C89 (in _almost_ a strict sense, with few exceptions such as potential clashes with a few new keywords like `class`).
eC compiles natively just like C (currently, the eC compiler transpiles to C code).
C libraries can be used directly and other libraries can invoke C-exported functions and methods in eC code directly through a C API (or through [bgen](https://github.com/ecere/bgen), see below).
The language offers modern object-oriented features such as classes, (single) inheritance, polymorphism, properties, generics, defined expressions, unit types (e.g., _Radians_/_Degrees_, _Meters_/_Feet_) and bit classes.
eC supports automatic symbol resolution across multiple eC source files and libraries, which avoids the need for both prototypes and header files.
Developers with experience programming in C, C++, Java and/or C# should find eC very familiar.
eC also supports reflection with a dynamic object type system and runtime module loading and ejection, facilitating the implementation of plugin systems.
Constructors, destructors and reference counting (semi-automatic through global and member instances) also facilitate memory management.

[Learn more about eC here](https://ec-lang.org/overview/).

[![Ollie-the-sea-otter](https://ec-lang.org/images/eC-256.png)](https://ec-lang.org/)

## Compiler tools

The eC compiler tools include:

- `ecc`, the eC compiler, which currently generates C from eC source files as part of the compilation process, which are then compiled using e.g., GCC or Clang,
- `ecp`, the eC precompiler, generating `.sym` files allowing to automatically resolve symbols across eC source files as an alternative to header files,
- `ecs`, the eC symbol loader generator, writing a `.main.ec` file as part of the linking process which will load the necessary symbols at runtime from dynamic eC modules,
- `ear`, the Ecere archiver, which packs and unpacks files into a simple archive format based on _zlib_, with the ability to embed resources within shared libraries and executables and access them using the eC runtime library as e.g., `<:archive>directory/file.txt`,
- `libecrt`, the eC runtime library provided as a shared library (also [available independently](https://github.com/ecere/pyecrt) so that runtime packages depend only on that library), as well as a static library (libecrtStatic.a),
- `libectp`, the eC transpiler library, a dependency of the `ecc`, `ecp` and `ecs` tools, including the capability to parse eC source code into an abstract syntax tree and convert it to C99 source code using a few GCC extensions.

See also:

- [epj2make](https://github.com/ecere/epj2make) to generate cross-platform GNU Makefiles from Ecere projects (`.epj` JSON files),
- [bgen](https://github.com/ecere/bgen) for automatically generating object-oriented bindings for C, C++ and Python from eC libraries,
- as well as the other components of the [Ecere SDK](https://github.com/ecere/ecere-sdk) such as the Ecere Integrated Development Environment.

## eC runtime functionality

The eC runtime library implements:

- management of eC data types, including the various flavors of structs and classes with and without reference counting, runtime type information, virtual method tables, reflection with the ability to register and define classes at runtime (loading/ejecting new dynamic modules), string management, generic field values containing type information, binary (de)serialization,
- various types of containers (dynamic arrays, hash tables, linked lists, AVL Trees, multiple forms of associative arrays),
- files I/O including temporary files, bidirectional processing input/output pipes, creating/decompressing/accessing files from archives (including resources packed directly within the executables), file/directory monitoring, cross-platform file handling functions,
- multithreading support including threads, mutexes, semaphores and conditions,
- internationalization (extensive unicode support with the Unicode data resources embedded within the library), internationalization of text strings compatible with GNU gettext, i18n of libecrt itself currently including Chinese, Brazilian Portuguese, Spanish, partial Russian translation, as well as the start of other languages,
- date and time handling,
- a JSON parser and writer (with support for automatic JSON (de)serialization of any eC types), as well as utilities to manage application settings stored in JSON files.

See also:

- the [Windowing Platform Abstraction Library](https://github.com/ecere/wpal),
- the [Ecere 2D/3D graphics engine](https://github.com/ecere/gfx),
- as well as the other components of the [Ecere SDK](https://github.com/ecere/ecere-sdk) such as the cross-platform GUI toolkit.

## Documentation

See https://ecere.org/docs/ecere/ecere.html and https://ecere.org/docs/ecereCOM/ecere.html for the API documentation of the core eC runtime library, which covers the `sys` and `com` namespaces of the Ecere runtime library.

[![Tao](https://ecere.com/images/tao.png)](https://ecere.org/tao.pdf)
The [Ecere Tao of Programming](https://ecere.org/tao.pdf) is a Programmer's Guide (still work in progress)
teaching the foundations of the eC programming language, also including a C primer.

See also the [samples](https://github.com/ecere/ecere-sdk/tree/master/samples) provided with the SDK, and some featured projects as prebuilt binaries at https://ecere.org/software.

Reach out on [IRC](https://web.libera.chat/?theme=cli#ecere) - **#ecere** on irc.libera.chat<br>

            

Raw data

            {
    "_id": null,
    "home_page": "https://ec-lang.org",
    "name": "ecdev",
    "maintainer": null,
    "docs_url": null,
    "requires_python": null,
    "maintainer_email": null,
    "keywords": "eC sdk compiler transpiler archiver runtime type-system object-model reflection file-system collections datetime json-parser econ serialization",
    "author": "J\u00e9r\u00f4me Jacovella-St-Louis, Ecere Corporation",
    "author_email": "jerome@ecere.com",
    "download_url": "https://files.pythonhosted.org/packages/e3/5d/faf16f2a03947812a5c70eb393614be66d54dfeb7494322072f22120748c/ecdev-0.0.5.post1.tar.gz",
    "platform": null,
    "description": "# eC Software Development Kit and Runtime Library\n\nhttps://ec-lang.org\n\nA stand-alone Software Development Kit and runtime library for the [eC programming language](https://ec-lang.org)\n\n(_part of the [Ecere SDK](https://ecere.org)_)\n\nCopyright (c) 1996-2025, J\u00e9r\u00f4me Jacovella-St-Louis\n\nCopyright (c) 2005-2025, Ecere Corporation\n\nLicensed under the [BSD 3-Clause License](https://opensource.org/license/bsd-3-clause)\n\nSource: https://github.com/ecere/eC\n\nPython packaging: https://github.com/ecere/pyecdev\n\n# The eC Programming Language\n\neC is a light, expressive and intuitive C Style object-oriented programming language.\neC is a superset of C89 (in _almost_ a strict sense, with few exceptions such as potential clashes with a few new keywords like `class`).\neC compiles natively just like C (currently, the eC compiler transpiles to C code).\nC libraries can be used directly and other libraries can invoke C-exported functions and methods in eC code directly through a C API (or through [bgen](https://github.com/ecere/bgen), see below).\nThe language offers modern object-oriented features such as classes, (single) inheritance, polymorphism, properties, generics, defined expressions, unit types (e.g., _Radians_/_Degrees_, _Meters_/_Feet_) and bit classes.\neC supports automatic symbol resolution across multiple eC source files and libraries, which avoids the need for both prototypes and header files.\nDevelopers with experience programming in C, C++, Java and/or C# should find eC very familiar.\neC also supports reflection with a dynamic object type system and runtime module loading and ejection, facilitating the implementation of plugin systems.\nConstructors, destructors and reference counting (semi-automatic through global and member instances) also facilitate memory management.\n\n[Learn more about eC here](https://ec-lang.org/overview/).\n\n[![Ollie-the-sea-otter](https://ec-lang.org/images/eC-256.png)](https://ec-lang.org/)\n\n## Compiler tools\n\nThe eC compiler tools include:\n\n- `ecc`, the eC compiler, which currently generates C from eC source files as part of the compilation process, which are then compiled using e.g., GCC or Clang,\n- `ecp`, the eC precompiler, generating `.sym` files allowing to automatically resolve symbols across eC source files as an alternative to header files,\n- `ecs`, the eC symbol loader generator, writing a `.main.ec` file as part of the linking process which will load the necessary symbols at runtime from dynamic eC modules,\n- `ear`, the Ecere archiver, which packs and unpacks files into a simple archive format based on _zlib_, with the ability to embed resources within shared libraries and executables and access them using the eC runtime library as e.g., `<:archive>directory/file.txt`,\n- `libecrt`, the eC runtime library provided as a shared library (also [available independently](https://github.com/ecere/pyecrt) so that runtime packages depend only on that library), as well as a static library (libecrtStatic.a),\n- `libectp`, the eC transpiler library, a dependency of the `ecc`, `ecp` and `ecs` tools, including the capability to parse eC source code into an abstract syntax tree and convert it to C99 source code using a few GCC extensions.\n\nSee also:\n\n- [epj2make](https://github.com/ecere/epj2make) to generate cross-platform GNU Makefiles from Ecere projects (`.epj` JSON files),\n- [bgen](https://github.com/ecere/bgen) for automatically generating object-oriented bindings for C, C++ and Python from eC libraries,\n- as well as the other components of the [Ecere SDK](https://github.com/ecere/ecere-sdk) such as the Ecere Integrated Development Environment.\n\n## eC runtime functionality\n\nThe eC runtime library implements:\n\n- management of eC data types, including the various flavors of structs and classes with and without reference counting, runtime type information, virtual method tables, reflection with the ability to register and define classes at runtime (loading/ejecting new dynamic modules), string management, generic field values containing type information, binary (de)serialization,\n- various types of containers (dynamic arrays, hash tables, linked lists, AVL Trees, multiple forms of associative arrays),\n- files I/O including temporary files, bidirectional processing input/output pipes, creating/decompressing/accessing files from archives (including resources packed directly within the executables), file/directory monitoring, cross-platform file handling functions,\n- multithreading support including threads, mutexes, semaphores and conditions,\n- internationalization (extensive unicode support with the Unicode data resources embedded within the library), internationalization of text strings compatible with GNU gettext, i18n of libecrt itself currently including Chinese, Brazilian Portuguese, Spanish, partial Russian translation, as well as the start of other languages,\n- date and time handling,\n- a JSON parser and writer (with support for automatic JSON (de)serialization of any eC types), as well as utilities to manage application settings stored in JSON files.\n\nSee also:\n\n- the [Windowing Platform Abstraction Library](https://github.com/ecere/wpal),\n- the [Ecere 2D/3D graphics engine](https://github.com/ecere/gfx),\n- as well as the other components of the [Ecere SDK](https://github.com/ecere/ecere-sdk) such as the cross-platform GUI toolkit.\n\n## Documentation\n\nSee https://ecere.org/docs/ecere/ecere.html and https://ecere.org/docs/ecereCOM/ecere.html for the API documentation of the core eC runtime library, which covers the `sys` and `com` namespaces of the Ecere runtime library.\n\n[![Tao](https://ecere.com/images/tao.png)](https://ecere.org/tao.pdf)\nThe [Ecere Tao of Programming](https://ecere.org/tao.pdf) is a Programmer's Guide (still work in progress)\nteaching the foundations of the eC programming language, also including a C primer.\n\nSee also the [samples](https://github.com/ecere/ecere-sdk/tree/master/samples) provided with the SDK, and some featured projects as prebuilt binaries at https://ecere.org/software.\n\nReach out on [IRC](https://web.libera.chat/?theme=cli#ecere) - **#ecere** on irc.libera.chat<br>\n",
    "bugtrack_url": null,
    "license": "BSD-3-Clause",
    "summary": "eC Software Development Kit",
    "version": "0.0.5.post1",
    "project_urls": {
        "Homepage": "https://ec-lang.org"
    },
    "split_keywords": [
        "ec",
        "sdk",
        "compiler",
        "transpiler",
        "archiver",
        "runtime",
        "type-system",
        "object-model",
        "reflection",
        "file-system",
        "collections",
        "datetime",
        "json-parser",
        "econ",
        "serialization"
    ],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "536d5b2fadf42520f21cadb00906008fd299cbffe1a371b1a0ccab61bc95b257",
                "md5": "576d647790126d6f580e1e746e48b40a",
                "sha256": "0b5886ef8eea698396d23793746f52e499bdf8bbb8e196cc29041b5bb235b525"
            },
            "downloads": -1,
            "filename": "ecdev-0.0.5.post1-py3-none-macosx_10_15_arm64.whl",
            "has_sig": false,
            "md5_digest": "576d647790126d6f580e1e746e48b40a",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": null,
            "size": 1139145,
            "upload_time": "2025-10-09T11:19:02",
            "upload_time_iso_8601": "2025-10-09T11:19:02.242207Z",
            "url": "https://files.pythonhosted.org/packages/53/6d/5b2fadf42520f21cadb00906008fd299cbffe1a371b1a0ccab61bc95b257/ecdev-0.0.5.post1-py3-none-macosx_10_15_arm64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "e2760efc890c82f1f48e752c1f464dddc7ad39a1912610b9061554bf3ffc6efb",
                "md5": "535f08366628256f4b9db7707496116c",
                "sha256": "b77031e09a4c721875fe822e256eec22449d92958eca9c10b3e8f55dd56c8826"
            },
            "downloads": -1,
            "filename": "ecdev-0.0.5.post1-py3-none-macosx_10_15_x86_64.whl",
            "has_sig": false,
            "md5_digest": "535f08366628256f4b9db7707496116c",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": null,
            "size": 1121700,
            "upload_time": "2025-10-09T11:19:04",
            "upload_time_iso_8601": "2025-10-09T11:19:04.384673Z",
            "url": "https://files.pythonhosted.org/packages/e2/76/0efc890c82f1f48e752c1f464dddc7ad39a1912610b9061554bf3ffc6efb/ecdev-0.0.5.post1-py3-none-macosx_10_15_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "0b5d93bcc32427fa59c1e486d3d62b878e2761fbff4e5403208a11653c581330",
                "md5": "5b42dc78cd1ab0d869ad470ee7bb06ca",
                "sha256": "2438eb524646b2c76a56ea7ac9c8fd4bbe800fc804e9f4d9570d5e6425e0a0d8"
            },
            "downloads": -1,
            "filename": "ecdev-0.0.5.post1-py3-none-manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl",
            "has_sig": false,
            "md5_digest": "5b42dc78cd1ab0d869ad470ee7bb06ca",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": null,
            "size": 1384368,
            "upload_time": "2025-10-09T11:20:35",
            "upload_time_iso_8601": "2025-10-09T11:20:35.642114Z",
            "url": "https://files.pythonhosted.org/packages/0b/5d/93bcc32427fa59c1e486d3d62b878e2761fbff4e5403208a11653c581330/ecdev-0.0.5.post1-py3-none-manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "4832497adf6e35c873a6384bf8fb71f561a8ec4b51a58f37fed5dfd0315610b0",
                "md5": "3eecf6f88e505d27ee2879faaf2df199",
                "sha256": "5d420bddf3e9e68412f6207eff402f57d6b1bdc96abff5eb9762b1d443122a4f"
            },
            "downloads": -1,
            "filename": "ecdev-0.0.5.post1-py3-none-manylinux1_i686.musllinux_1_2_i686.whl",
            "has_sig": false,
            "md5_digest": "3eecf6f88e505d27ee2879faaf2df199",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": null,
            "size": 1604821,
            "upload_time": "2025-10-09T11:20:38",
            "upload_time_iso_8601": "2025-10-09T11:20:38.063036Z",
            "url": "https://files.pythonhosted.org/packages/48/32/497adf6e35c873a6384bf8fb71f561a8ec4b51a58f37fed5dfd0315610b0/ecdev-0.0.5.post1-py3-none-manylinux1_i686.musllinux_1_2_i686.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "7ff83498cdcc2a746247dc1aefbe8c922a40d8e2cc16b2f4800e5435fb68a3c9",
                "md5": "b63c25f421576fef9f4147531faae107",
                "sha256": "baf8923d249e6f91b545228e96312a87cff5f1b3a4d727b37f3ba557421641ab"
            },
            "downloads": -1,
            "filename": "ecdev-0.0.5.post1-py3-none-manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "b63c25f421576fef9f4147531faae107",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": null,
            "size": 1271831,
            "upload_time": "2025-10-09T11:20:40",
            "upload_time_iso_8601": "2025-10-09T11:20:40.492845Z",
            "url": "https://files.pythonhosted.org/packages/7f/f8/3498cdcc2a746247dc1aefbe8c922a40d8e2cc16b2f4800e5435fb68a3c9/ecdev-0.0.5.post1-py3-none-manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "3b2c7fe91cade07152ff48e22106d63ca52d1ff81cefd75f0f2d5849caf5e4ce",
                "md5": "250d97f08a6d549596bb0b81cbac12d2",
                "sha256": "567a79fda266f6cdfe0840ea5b5891598ea989af64c8b35a69da95e267c1c58c"
            },
            "downloads": -1,
            "filename": "ecdev-0.0.5.post1-py3-none-manylinux1_x86_64.musllinux_1_2_x86_64.whl",
            "has_sig": false,
            "md5_digest": "250d97f08a6d549596bb0b81cbac12d2",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": null,
            "size": 1451627,
            "upload_time": "2025-10-09T11:20:42",
            "upload_time_iso_8601": "2025-10-09T11:20:42.940870Z",
            "url": "https://files.pythonhosted.org/packages/3b/2c/7fe91cade07152ff48e22106d63ca52d1ff81cefd75f0f2d5849caf5e4ce/ecdev-0.0.5.post1-py3-none-manylinux1_x86_64.musllinux_1_2_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "0f9af72900ef2996baf63f2eaf471bfed1398948172628c7cf5dc9efa9ff2706",
                "md5": "e47f8d8864511815f5f754ab39881ece",
                "sha256": "ca028856d8d2677204dd003bf0a48e50e0e22c47b8103a525173b2e656d7ea37"
            },
            "downloads": -1,
            "filename": "ecdev-0.0.5.post1-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "has_sig": false,
            "md5_digest": "e47f8d8864511815f5f754ab39881ece",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": null,
            "size": 1278217,
            "upload_time": "2025-10-09T11:20:45",
            "upload_time_iso_8601": "2025-10-09T11:20:45.242219Z",
            "url": "https://files.pythonhosted.org/packages/0f/9a/f72900ef2996baf63f2eaf471bfed1398948172628c7cf5dc9efa9ff2706/ecdev-0.0.5.post1-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "f89fab26e028009ca8ab72320e8f20cc8b15bec469d8d1f9193790553e173fa7",
                "md5": "2c2861d6f5505702342394167393aca7",
                "sha256": "1f89b5430ae0cff8060dc40bf4b976ab1b183d00d9f6257bf9e547a4abe06583"
            },
            "downloads": -1,
            "filename": "ecdev-0.0.5.post1-py3-none-musllinux_1_2_aarch64.whl",
            "has_sig": false,
            "md5_digest": "2c2861d6f5505702342394167393aca7",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": null,
            "size": 1440765,
            "upload_time": "2025-10-09T11:20:47",
            "upload_time_iso_8601": "2025-10-09T11:20:47.899345Z",
            "url": "https://files.pythonhosted.org/packages/f8/9f/ab26e028009ca8ab72320e8f20cc8b15bec469d8d1f9193790553e173fa7/ecdev-0.0.5.post1-py3-none-musllinux_1_2_aarch64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "a0fad5fc80007764cff33c9c2d8a5c946e461f4cc37e197296b4524aa7ced5de",
                "md5": "cd5617d317a2a233e61e113194753a1c",
                "sha256": "f0857a20c01f6cdaacdc40f2eae5eb3ba5cb8081de449daa5bb198493ca1b833"
            },
            "downloads": -1,
            "filename": "ecdev-0.0.5.post1-py3-none-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "cd5617d317a2a233e61e113194753a1c",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": null,
            "size": 1390526,
            "upload_time": "2025-10-09T11:20:51",
            "upload_time_iso_8601": "2025-10-09T11:20:51.195808Z",
            "url": "https://files.pythonhosted.org/packages/a0/fa/d5fc80007764cff33c9c2d8a5c946e461f4cc37e197296b4524aa7ced5de/ecdev-0.0.5.post1-py3-none-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "e35dfaf16f2a03947812a5c70eb393614be66d54dfeb7494322072f22120748c",
                "md5": "aac7c56567c2af76b79630a9076b1227",
                "sha256": "dea810a45b518a9405242bff0250fdb569f3322e35edccf4491eeca852ef6646"
            },
            "downloads": -1,
            "filename": "ecdev-0.0.5.post1.tar.gz",
            "has_sig": false,
            "md5_digest": "aac7c56567c2af76b79630a9076b1227",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": null,
            "size": 1932656,
            "upload_time": "2025-10-09T11:20:53",
            "upload_time_iso_8601": "2025-10-09T11:20:53.944173Z",
            "url": "https://files.pythonhosted.org/packages/e3/5d/faf16f2a03947812a5c70eb393614be66d54dfeb7494322072f22120748c/ecdev-0.0.5.post1.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-10-09 11:20:53",
    "github": false,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "lcname": "ecdev"
}
        
Elapsed time: 2.41469s