Cesare Fantuzzi

167 papers A* 22A 23B 4C 19Misc 1Journal 52Unranked 44
YearRankTypeTitle / Venue / Authors
2025 J jnl
Comput.
Annalisa Bertoli, Cesare Fantuzzi
2025 conf
CASE
Cesare Fantuzzi, Nicola Battilani, Silvia Costi, Joao Marcos Da Silva Araujo, Giacomo Gaddoni, Mattia Gambazza, Gabriele Masotti, Mirko Mattioli, Lorenzo Morchia, Matteo Ragaglia
2025 A conf
IROS
Matteo Nini, Andrea Pupa, Cristian Secchi, Cesare Fantuzzi, Federica Ferraguti
2024 conf
ERF (2)
Matteo Ragaglia, Mattia Bertuletti, Simone di Napoli, Mattia Gambazza, Cesare Fantuzzi, Federica Ferraguti
2024 conf
ERF (2)
Matteo Ragaglia, Simone di Napoli, Mattia Bertuletti, Mattia Gambazza, Cesare Fantuzzi, Federica Ferraguti
2024 conf
ROBOT
Annalisa Bertoli, Federica Ferraguti, Cesare Fantuzzi
2024 conf
ROBOT
Matteo Nini, Federica Ferraguti, Matteo Ragaglia, Mattia Bertuletti, Simone di Napoli, Cesare Fantuzzi
2024 conf
ERF (2)
Matteo Ragaglia, Nicola Battilani, Antonio Castellano, Silvia Costi, Joao Marcos Da Silva Araujo, Cesare Fantuzzi, Gabriele Masotti, Mirko Mattioli, Giorgio Motta, Umberto Scarcia
2023 conf
ICINCO (1)
Simone di Napoli, Mattia Bertuletti, Mattia Gambazza, Matteo Ragaglia, Cesare Fantuzzi, Federica Ferraguti
2022 J jnl
IEEE Trans Autom. Sci. Eng.
Valeria Villani, Lorenzo Sabattini, Giorgia Zanelli, Enrico Callegati, Benjamin Bezzi, Paulina Baranska, Zofia Mockallo, Dorota Zolnierczyk-Zreda, Julia N. Czerniak, Verena Nitsch, Alexander Mertens, Cesare Fantuzzi
2021 J jnl
IEEE Trans Autom. Sci. Eng.
Valeria Villani, Lorenzo Sabattini, Frieder Loch, Birgit Vogel-Heuser, Cesare Fantuzzi
2021 A* conf
ICRA
Federico Pratissoli, Nicola Battilani, Cesare Fantuzzi, Lorenzo Sabattini
2021 J jnl
IEEE Trans Autom. Sci. Eng.
Birgit Vogel-Heuser, Feng Ju, Cesare Fantuzzi, Yan Lu, Dieter Hess
2021 J jnl
Sensors
Annalisa Bertoli, Andrea Cervo, Carlo Alberto Rosati, Cesare Fantuzzi
2021 J jnl
IEEE Trans Autom. Sci. Eng.
Valeria Villani, Lorenzo Sabattini, Paulina Baranska, Enrico Callegati, Julia N. Czerniak, Adel Debbache, Mina Fahimi Pirehgalin, Andreas Gallasch, Frieder Loch, Rosario Maida, Alexander Mertens, Zofia Mockallo, Francesco Monica, Verena Nitsch, Engin Talas, Elisabetta Toschi, Birgit Vogel-Heuser, JeanMarc Willems, Dorota Zolnierczyk-Zreda, Cesare Fantuzzi
2020 J jnl
IEEE Robotics Autom. Lett.
Federica Ferraguti, Mattia Bertuletti, Chiara Talignani Landi, Marcello Bonfè, Cesare Fantuzzi, Cristian Secchi
2020 J jnl
IEEE Trans Autom. Sci. Eng.
Cesare Fantuzzi, Alexander Fay, Georg Frey, Birgit Vogel-Heuser
2020 J jnl
Auton. Robots
Valeria Villani, Beatrice Capelli, Cristian Secchi, Cesare Fantuzzi, Lorenzo Sabattini
2020 J jnl
Robotics Auton. Syst.
Federica Ferraguti, Chiara Talignani Landi, Silvia Costi, Marcello Bonfè, Saverio Farsoni, Cristian Secchi, Cesare Fantuzzi
2020 A* conf
ICRA
Lorenzo Sabattini, Beatrice Capelli, Cesare Fantuzzi, Cristian Secchi
2019 A conf
DATE
Federica Ferraguti, Andrea Pertosa, Cristian Secchi, Cesare Fantuzzi, Marcello Bonfè
2019 J jnl
Int. J. Robotics Res.
Federica Ferraguti, Chiara Talignani Landi, Lorenzo Sabattini, Marcello Bonfè, Cesare Fantuzzi, Cristian Secchi
2019 J jnl
Robotics Comput. Integr. Manuf.
Federica Ferraguti, Fabio Pini, Thomas Gale, Franck Messmer, Chiara Storchi, Francesco Leali, Cesare Fantuzzi
2019 C conf
IECON
Andrea Cervo, Gabriele Goldoni, Cesare Fantuzzi, Roberto Borsari
2019 J jnl
Autom.
Birgit Vogel-Heuser, Cesare Fantuzzi, Manuel Wimmer, Markus Böhm, Alexander Fay
2019 J jnl
Paladyn J. Behav. Robotics
Valeria Villani, Julia N. Czerniak, Lorenzo Sabattini, Alexander Mertens, Cesare Fantuzzi
2018 B conf
RO-MAN
Valeria Villani, Lorenzo Sabattini, Cristian Secchi, Cesare Fantuzzi
2018 A* conf
ICRA
Giuseppe Riggio, Cesare Fantuzzi, Cristian Secchi
2018 A* conf
ICRA
Chiara Talignani Landi, Federica Ferraguti, Cesare Fantuzzi, Cristian Secchi
2018 conf
HCI (3)
Frieder Loch, Julia N. Czerniak, Valeria Villani, Lorenzo Sabattini, Cesare Fantuzzi, Alexander Mertens, Birgit Vogel-Heuser
2018 J jnl
CoRR
Valeria Villani, Lorenzo Sabattini, Alessio Levratti, Cesare Fantuzzi
2018 conf
CASE
Claudio Santo Longo, Cesare Fantuzzi, Francesco Monica, Luca Manfredotti, Marco Sorge
2018 A* conf
ICRA
Lorenzo Sabattini, Cristian Secchi, Cesare Fantuzzi
2018 J jnl
IEEE Robotics Autom. Mag.
Valeria Villani, Lorenzo Sabattini, Julia N. Czerniak, Alexander Mertens, Cesare Fantuzzi
2018 conf
CASE
Lorenzo Sabattini, Valeria Villani, Cesare Fantuzzi, Julia N. Czerniak, Alexander Mertens, Frieder Loch, Birgit Vogel-Heuser
2018 J jnl
CoRR
Lorenzo Sabattini, Valeria Villani, Julia N. Czerniak, Frieder Loch, Alexander Mertens, Birgit Vogel-Heuser, Cesare Fantuzzi
2018 A conf
IROS
Giuseppe Riggio, Cesare Fantuzzi, Cristian Secchi
2018 J jnl
IEEE Robotics Autom. Lett.
Lorenzo Sabattini, Cristian Secchi, Beatrice Capelli, Cesare Fantuzzi
2018 J jnl
Autom.
Claudio Santo Longo, Cesare Fantuzzi
2018 conf
DARS
Lorenzo Sabattini, Cesare Fantuzzi, Cristian Secchi
2018 J jnl
IEEE Robotics Autom. Mag.
Lorenzo Sabattini, Mika Aikio, Patric Beinschob, Markus Boehning, Elena Cardarelli, Valerio Digani, Annette Krengel, Massimiliano Magnani, Szilard Mandici, Fabio Oleari, Christoph Reinke, Davide Ronzoni, Christian Stimming, Robert Varga, Andrei Vatavu, Sergi Castells Lopez, Cesare Fantuzzi, Aki Mayra, Sergiu Nedevschi, Cristian Secchi, Kay Fuerstenberg
2018 conf
ICPS
Giulia Lotti, Valeria Villani, Nicola Battilani, Cesare Fantuzzi
2017 conf
HFR
Lorenzo Sabattini, Valeria Villani, Cristian Secchi, Cesare Fantuzzi
2017 J jnl
IEEE Robotics Autom. Lett.
Valeria Villani, Lorenzo Sabattini, Giuseppe Riggio, Cristian Secchi, Marco Minelli, Cesare Fantuzzi
2017 J jnl
CoRR
Lorenzo Sabattini, Cristian Secchi, Cesare Fantuzzi
2017 A* conf
ICRA
Lorenzo Sabattini, Cristian Secchi, Cesare Fantuzzi
2017 J jnl
CoRR
Chiara Talignani Landi, Federica Ferraguti, Lorenzo Sabattini, Cristian Secchi, Cesare Fantuzzi
2017 A* conf
ICRA
Chiara Talignani Landi, Federica Ferraguti, Lorenzo Sabattini, Cristian Secchi, Cesare Fantuzzi
2017 J jnl
IEEE Trans. Cybern.
Lorenzo Sabattini, Cristian Secchi, Cesare Fantuzzi
2017 J jnl
Comput. Ind. Eng.
Elisa Gebennini, Andrea Grassi, Cesare Fantuzzi, Bianca Rimini
2017 J jnl
CoRR
Valeria Villani, Lorenzo Sabattini, Giuseppe Riggio, Alessio Levratti, Cristian Secchi, Cesare Fantuzzi
2017 J jnl
CoRR
Valeria Villani, Lorenzo Sabattini, Julia N. Czerniak, Alexander Mertens, Cesare Fantuzzi
2017 J jnl
CoRR
Lorenzo Sabattini, Valeria Villani, Julia N. Czerniak, Alexander Mertens, Cesare Fantuzzi
2017 conf
CASE
Lorenzo Sabattini, Valeria Villani, Julia N. Czerniak, Alexander Mertens, Cesare Fantuzzi
2017 J jnl
Eur. J. Control
Lorenzo Sabattini, Cristian Secchi, Cesare Fantuzzi
2017 conf
MRS
Valeria Villani, Lorenzo Sabattini, Cristian Secchi, Cesare Fantuzzi
2017 A conf
IROS
Lorenzo Sabattini, Valerio Digani, Cristian Secchi, Cesare Fantuzzi
2017 A* conf
ICRA
Alessio Levratti, Giuseppe Riggio, Antonio De Vuono, Cesare Fantuzzi, Cristian Secchi
2017 C conf
ETFA
Claudio Santo Longo, Cesare Fantuzzi
2017 J jnl
CoRR
Valeria Villani, Lorenzo Sabattini, Julia N. Czerniak, Alexander Mertens, Birgit Vogel-Heuser, Cesare Fantuzzi
2017 C conf
ETFA
Valeria Villani, Lorenzo Sabattini, Julia N. Czerniak, Alexander Mertens, Birgit Vogel-Heuser, Cesare Fantuzzi
2017 A conf
IROS
Chiara Talignani Landi, Federica Ferraguti, Lorenzo Sabattini, Cristian Secchi, Marcello Bonfè, Cesare Fantuzzi
2016 A* conf
ICRA
Cristian Secchi, Federica Ferraguti, Cesare Fantuzzi
2016 A* conf
ICRA
Lorenzo Sabattini, Cristian Secchi, Marco Lotti, Cesare Fantuzzi
2016 C conf
ETFA
Giacomo Barbieri, Cesare Fantuzzi
2016 J jnl
Autom.
Giacomo Barbieri, Patricia Derler, David M. Auslander, Roberto Borsari, Cesare Fantuzzi
2016 A conf
IROS
Lorenzo Sabattini, Valerio Digani, Cristian Secchi, Cesare Fantuzzi
2016 A conf
IROS
Federica Ferraguti, Cesare Fantuzzi, Cristian Secchi
2016 conf
AIM
Alessio Levratti, Antonio De Vuono, Cesare Fantuzzi, Cristian Secchi
2016 C conf
IECON
Chiara Talignani Landi, Federica Ferraguti, Cristian Secchi, Cesare Fantuzzi
2016 conf
CIISE
Gaetano Cutrona, Andrea Margini, Cesare Fantuzzi
2015 A* conf
ICRA
Cristian Secchi, Roberto Olmi, Fabio Rocchi, Cesare Fantuzzi
2015 C conf
ETFA
Lorenzo Sabattini, Elena Cardarelli, Valerio Digani, Cristian Secchi, Cesare Fantuzzi, Kay Fuerstenberg
2015 A conf
IROS
Elena Cardarelli, Lorenzo Sabattini, Cristian Secchi, Cesare Fantuzzi
2015 A conf
IROS
Cristian Secchi, Lorenzo Sabattini, Cesare Fantuzzi
2015 conf
CDC
Lorenzo Sabattini, Cristian Secchi, Alessio Levratti, Matteo Cocetti, Cesare Fantuzzi
2015 conf
SyRoCo
Lorenzo Sabattini, Cristian Secchi, Alessio Levratti, Cesare Fantuzzi
2015 J jnl
Robotica
Riccardo Falconi, Lorenzo Sabattini, Cristian Secchi, Cesare Fantuzzi, Claudio Melchiorri
2015 conf
CDC
Lorenzo Sabattini, Cristian Secchi, Cesare Fantuzzi
2015 J jnl
IEEE Trans Autom. Sci. Eng.
Valerio Digani, Lorenzo Sabattini, Cristian Secchi, Cesare Fantuzzi
2015 conf
CASE
Lorenzo Racchetti, Lorenzo Tacconi, Cesare Fantuzzi
2015 J jnl
IEEE Trans. Robotics
Lorenzo Sabattini, Cristian Secchi, Matteo Cocetti, Alessio Levratti, Cesare Fantuzzi
2015 B conf
ICCP
Fabio Oleari, Massimiliano Magnani, Davide Ronzoni, Lorenzo Sabattini, Elena Cardarelli, Valerio Digani, Cristian Secchi, Cesare Fantuzzi
2015 B conf
ICCP
Elena Cardarelli, Lorenzo Sabattini, Valerio Digani, Cristian Secchi, Cesare Fantuzzi
2015 conf
SyRoCo
Lorenzo Sabattini, Valerio Digani, Matteo Lucchi, Cristian Secchi, Cesare Fantuzzi
2015 conf
CASE
Roberto Panciroli, Carlo Torelli, Giacomo Barbieri, Roberto Borsari, Cesare Fantuzzi
2015 J jnl
Ann. Oper. Res.
Elisa Gebennini, Andrea Grassi, Cesare Fantuzzi
2015 C conf
IECON
Lorenzo Racchetti, Cesare Fantuzzi, Lorenzo Tacconi, Marcello Bonfè
2015 C conf
IECON
Lorenzo Racchetti, Cesare Fantuzzi, Lorenzo Tacconi
2014 A conf
IROS
Valerio Digani, Lorenzo Sabattini, Cristian Secchi, Cesare Fantuzzi
2014 A conf
IROS
Lorenzo Sabattini, Cristian Secchi, Cesare Fantuzzi
2014 A* conf
ICRA
Valerio Digani, Lorenzo Sabattini, Cristian Secchi, Cesare Fantuzzi
2014 A* conf
ICRA
Lorenzo Sabattini, Cristian Secchi, Matteo Cocetti, Cesare Fantuzzi
2014 conf
CIISE
Gaetano Cutrona, Andrea Margini, Cesare Fantuzzi
2014 ch.
Technology Transfer Experiments from the ECHORD Project
Cristian Secchi, Roberto Olmi, Cesare Fantuzzi, Marco Casarini
2014 C conf
ETFA
Lorenzo Racchetti, Cesare Fantuzzi, Lorenzo Tacconi, Marcello Bonfè
2013 conf
RoMoCo
Alessio Levratti, Cristian Secchi, Cesare Fantuzzi
2013 A* conf
ICRA
Federica Ferraguti, Cristian Secchi, Cesare Fantuzzi
2013 J jnl
J. Intell. Robotic Syst.
Lorenzo Sabattini, Cristian Secchi, Cesare Fantuzzi
2013 A* conf
ICRA
Lorenzo Sabattini, Cristian Secchi, Cesare Fantuzzi
2013 A conf
IROS
Matteo Cocetti, Lorenzo Sabattini, Cristian Secchi, Cesare Fantuzzi
2013 J jnl
Eur. J. Control
Cristian Secchi, Lorenzo Sabattini, Cesare Fantuzzi
2013 J jnl
Ann. Oper. Res.
Elisa Gebennini, Andrea Grassi, Cesare Fantuzzi, Stanley B. Gershwin, Irvin Cemil Schick
2013 C conf
ETFA
Lorenzo Racchetti, Cesare Fantuzzi
2013 conf
MIM
Konstantin Kernschmidt, Giacomo Barbieri, Cesare Fantuzzi, Birgit Vogel-Heuser
2013 C conf
ETFA
Giacomo Barbieri, Cesare Fantuzzi, Roberto Borsari
2012 conf
SyRoCo
Alessio Levratti, Matteo Bonaiuti, Cristian Secchi, Cesare Fantuzzi
2012 C conf
ICARCV
Lorenzo Sabattini, Alessio Levratti, Francesco Venturi, Enrica Amplo, Cesare Fantuzzi, Cristian Secchi
2012 C conf
ETFA
Cesare Fantuzzi, Roberto Panciroli, Mauro Gargiulo
2012 C conf
ETFA
Igor Kaitovic, Rafael Rezende, Cristina Murillo, Cesare Fantuzzi
2011 A* conf
ICRA
Davide Ronzoni, Roberto Olmi, Cristian Secchi, Cesare Fantuzzi
2011 A conf
IROS
Roberto Olmi, Cristian Secchi, Cesare Fantuzzi
2011 J jnl
Auton. Robots
Lorenzo Sabattini, Cristian Secchi, Cesare Fantuzzi
2010 A conf
IROS
Lorenzo Sabattini, Cristian Secchi, Cesare Fantuzzi, Daniel de Macedo Possamai
2009 conf
SyRoCo
Roberto Olmi, Cristian Secchi, Cesare Fantuzzi
2009 conf
SpringSim
Elisa Gebennini, Sara Dallari, Giuseppe Perrica, Andrea Grassi, Bianca Rimini, Cesare Fantuzzi
2009 A conf
IROS
Lorenzo Sabattini, Cristian Secchi, Cesare Fantuzzi
2008 Misc conf
WSC
Elisa Gebennini, Sara Dallari, Andrea Grassi, Giuseppe Perrica, Cesare Fantuzzi, Rita Gamberini
2008 C conf
ACC
Elisa Gebennini, Andrea Grassi, Cristian Secchi, Cesare Fantuzzi
2008 A* conf
ICRA
Roberto Olmi, Cristian Secchi, Cesare Fantuzzi
2008 A* conf
ICRA
Cristian Secchi, Cesare Fantuzzi
2008 J jnl
IEEE Trans. Robotics
Cristian Secchi, Stefano Stramigioli, Cesare Fantuzzi
2007 A* conf
ICRA
Andrea Grassi, Elisa Gebennini, Gabriele Goldoni, Cesare Fantuzzi, Rita Gamberini, Robert Nevin, Bianca Rimini
2007 conf
CDC
Cristian Secchi, Cesare Fantuzzi
2007 J jnl
IEEE Trans Autom. Sci. Eng.
Cristian Secchi, Marcello Bonfè, Cesare Fantuzzi
2007 ch.
Advances in Telerobotics
Cristian Secchi, Stefano Stramigioli, Cesare Fantuzzi
2006 conf
CASE
Luca Bassi, Cristian Secchi, Cesare Fantuzzi, Marcello Bonfè
2006 J jnl
Int. J. Manuf. Res.
Marcello Bonfè, Cesare Fantuzzi, Cristian Secchi
2006 conf
CDC
Cristian Secchi, Marcello Bonfè, Cesare Fantuzzi
2006 A conf
IROS
Cristian Secchi, Stefano Stramigioli, Cesare Fantuzzi
2006 A conf
IROS
Cristian Secchi, Stefano Stramigioli, Cesare Fantuzzi
2005 conf
CASE
Marcello Bonfè, Cesare Fantuzzi, Cristian Secchi
2005 A* conf
ICRA
Cristian Secchi, Cesare Fantuzzi, Marcello Bonfè
2005 A conf
IROS
Cristian Secchi, Stefano Stramigioli, Cesare Fantuzzi
2005 J jnl
IEEE Trans. Robotics
Stefano Stramigioli, Cristian Secchi, Arjan van der Schaft, Cesare Fantuzzi
2005 C conf
CCA
Cristian Secchi, Stefano Stramigioli, Cesare Fantuzzi
2005 A conf
IROS
Cristian Secchi, Stefano Stramigioli, Cesare Fantuzzi
2005 conf
CDC/ECC
Marcello Bonfè, Cesare Fantuzzi, Cristian Secchi
2005 A* conf
ICRA
Marcello Bonfè, Cesare Fantuzzi, Cristian Secchi
2004 conf
CDC
Marcello Bonfè, Cesare Fantuzzi
2004 C conf
ACC
Cesare Fantuzzi, Cristian Secchi
2003 conf
ECC
Alessandro Macchelli, Claudio Melchiorri, Cristian Secchi, Cesare Fantuzzi
2003 A conf
IROS
Cristian Secchi, Stefano Stramigioli, Cesare Fantuzzi
2003 A conf
IROS
Cristian Secchi, Stefano Stramigioli, Cesare Fantuzzi
2003 C conf
CCA
Marcello Bonfè, Cesare Fantuzzi
2003 conf
ETFA (2)
Marcello Bonfè, Cesare Fantuzzi
2003 A* conf
ICRA
Cristian Secchi, Stefano Stramigioli, Cesare Fantuzzi
2003 conf
ADHS
Silvio Simani, Sergio Beghelli, Cesare Fantuzzi, Riccardo Rovatti
2002 A conf
IROS
Stefano Stramigioli, Cristian Secchi, Arjan van der Schaft, Cesare Fantuzzi
2002 B conf
ESANN
Silvio Simani, Cesare Fantuzzi
2002 A conf
IROS
Marcello Bonfè, Elena Mainardi, Cesare Fantuzzi
2001 conf
ECC
Silvio Simani, Cesare Fantuzzi, Sergio Beghelli
2001 conf
ECC
Marcello Bonfè, Cesare Fantuzzi, Luca Poretti
2001 conf
ECC
Cesare Fantuzzi, Silvio Simani, Sergio Beghelli
2001 conf
CDC
Cesare Fantuzzi, Silvio Simani, Sergio Beghelli
2001 J jnl
Artif. Intell. Medicine
Claudio Bonivento, Angelo Davalli, Cesare Fantuzzi
2000 J jnl
IEEE Trans. Control. Syst. Technol.
Silvio Simani, Cesare Fantuzzi, Sergio Beghelli
2000 J jnl
Inf. Sci.
Silvio Simani, Cesare Fantuzzi
2000 J jnl
Signal Process.
Riccardo Rovatti, Cesare Fantuzzi, Silvio Simani
2000 conf
CDC
Silvio Simani, Cesare Fantuzzi, Sergio Beghelli
2000 C conf
ACC
Silvio Simani, Cesare Fantuzzi, Riccardo Rovatti, Sergio Beghelli
1999 conf
ECC
Silvio Simani, F. Marangon, Cesare Fantuzzi
1999 J jnl
Int. J. Approx. Reason.
Riccardo Rovatti, Cesare Fantuzzi
1999 J jnl
Int. J. Approx. Reason.
Silvio Simani, Cesare Fantuzzi, Riccardo Rovatti, Sergio Beghelli
1998 J jnl
Eur. J. Control
Claudio Bonivento, Cesare Fantuzzi
1998 J jnl
Int. J. Approx. Reason.
Riccardo Rovatti, Cesare Fantuzzi
1996 J jnl
Fuzzy Sets Syst.
Riccardo Rovatti, Cesare Fantuzzi
redb/extractors/decompiler/bninja/decompiler.py
← Index redb/extractors/decompiler/bninja/decompiler.py python
import os
import time
import json

from .analysis.medium_level import MediumLevelAnalysis

# disable the plugins set by user for binary ninja
os.environ["BN_DISABLE_USER_PLUGINS"] = "True"
import traceback

# Binary Ninja imports (conditional)
try:
    import binaryninja
    from binaryninja import mainthread, Symbol
    from binaryninja.enums import SymbolType
    BINARYNINJA_AVAILABLE = True
except Exception:
    BINARYNINJA_AVAILABLE = False
    binaryninja = None
    mainthread = None
    Symbol = None
    SymbolType = None

# Support both package and standalone imports
try:
    # Package import (when imported from redb)
    from .utils.hashes import calculate_sha256, calculate_tlsh
    from .utils.license import set_license
    from .utils.logging import setup_default_logger
    from .analysis.strings import StringAnalysis

    # Only import modules that depend on Binary Ninja when available
    if BINARYNINJA_AVAILABLE:
        from .analysis.cfg import CFGAnalysis
        from .analysis.disassembly import DisassemblyAnalysis
        from .analysis.low_level import LowLevelAnalysis
        from .arch.creator import ArchitectureCreator
        from .custom_options import register_custom_analysis_options
        from .function_type import FunctionTypeAnalysis, FunctionType
        from .analysis.scores import ObfuscationScores

except ImportError:
    # Fallback to absolute imports (for multiprocessing spawned processes)
    from redb.extractors.decompiler.bninja.utils.hashes import calculate_sha256, calculate_tlsh
    from redb.extractors.decompiler.bninja.utils.license import set_license
    from redb.extractors.decompiler.bninja.utils.logging import setup_default_logger

    # Only import modules that depend on Binary Ninja when available
    if BINARYNINJA_AVAILABLE:
        from redb.extractors.decompiler.bninja.analysis.cfg import CFGAnalysis
        from redb.extractors.decompiler.bninja.analysis.disassembly import DisassemblyAnalysis
        from redb.extractors.decompiler.bninja.analysis.low_level import LowLevelAnalysis
        from redb.extractors.decompiler.bninja.arch.creator import ArchitectureCreator
        from redb.extractors.decompiler.bninja.custom_options import register_custom_analysis_options
        from redb.extractors.decompiler.bninja.function_type import FunctionTypeAnalysis


class BinaryNinjaDecompiler:
    """A Binary Ninja-based decompiler that replicates the functionality of GhidraDecompilerScript.
    This class extracts decompiled code, disassembly with multiple normalization levels,
    and control flow graph information from binary files.
    """

    MIN_FUNCTION_SIZE = 10  # instructions
    MIN_BLOCK_SIZE = 4  # instructions
    INVALID_STACK_SIZE = -1

    def __init__(
        self,
        filepath,
        timeout,
        log=None,
        exporters=None,
        index_prefix=None,
        filetype=None,
        goresym=None,
        decompile_modules=None,
    ):
        """Initialize the Binary Ninja decompiler.

        Args:
            filepath: Path to the binary file to analyze
            log: Logger object (optional)
            timeout: Maximum time in seconds for analysis (default: 1200)
            exporters: List of exporters for the results (optional)
            index_prefix: Prefix for elastic index (optional)
            filetype: Type of the file (optional)

        """
        self.filepath = filepath
        self.log = log if log else setup_default_logger("BninjaDecompiler")
        self.BNINJA_TIMEOUT = timeout
        self.bv = None
        self.analysis_results = None
        self.errors = []
        self.exporters = exporters
        self.index_prefix = index_prefix
        self.filetype = filetype
        self.goresym = goresym
        self.decompile_modules = decompile_modules or {"all"}

        set_license(binaryninja)

        # Map to track instruction categorization
        mainthread.set_worker_thread_count(3)
        register_custom_analysis_options(binaryninja)

    def log_error(
        self, message, function_name, address, exception=None, error_location="unknown"
    ):
        """Log an error during processing."""
        error_msg = f"Error in function {function_name} at {address}: {message}"
        if exception:
            error_msg += f" - {str(exception)}"

        self.log.error(error_msg)

        # Add to errors list
        error = {
            "function_name": function_name,
            "function_address": str(address),
            "error_location": error_location,
            "error_message": message,
            "error_details": str(exception) if exception else "",
            "error_type": type(exception).__name__ if exception else "Unknown",
            "timestamp": int(time.time() * 1000),
        }
        self.errors.append(error)

    def __enter__(self):
        """Context manager entry point."""
        self.log.info(f"Opening binary file: {self.filepath}")
        binaryninja.BinaryViewType.add_binaryview_initial_analysis_completion_event(
            self.on_analysis_complete
        )

        #self.bv = binaryninja.load(self.filepath, update_analysis=False)
        self.bv = binaryninja.load(self.filepath, update_analysis=True)
        if self.bv is None:
            raise ValueError(f"Failed to open file: {self.filepath}")

        self.log.info("Waiting for analysis to complete...")

        self.log.debug(f"Binja analysis complete: {len(list(self.bv.functions))} functions")

        # set the architecture
        # todo: personalize this for other architectures
        self.arch = ArchitectureCreator("x86").get()

        # apply goresym
        if self.goresym is not None:
            self.__apply_goresym()
        return self

    def on_analysis_complete(self, bv):
        # Request an additional update after analysis is complete to ensure IL generation
        self.bv = bv
        self.bv.update_analysis()

        return

    def __apply_goresym(self):
        file = self.goresym
        data = None
        try:
            data = json.loads(open(file, 'r').read())
        except Exception as e:
            self.log_error(
                "Failed to open file from goresym: ",
                file,
                e,
                "analyze_binary",
            )

        if data is None:
            return

        self.bv.begin_undo_actions()
        if data.get('UserFunctions') is not None:
            user_functions = data['UserFunctions']
            for func in user_functions:
                try:
                    start = int(func['Start'])
                    name = func['FullName']
                    if self.bv.get_function_at(start) is None:
                        self.bv.create_user_function(start)

                    sym = Symbol(SymbolType.FunctionSymbol, start, name, name, name)
                    self.bv.define_user_symbol(sym)
                except Exception as e:
                    self.log.warning(f"Failed to apply GoReSym symbol for UserFunction {func.get('FullName', 'unknown')} at {func.get('Start', 'unknown')}: {e}")

        if data.get('StdFunctions') is not None:
            standard_functions = data['StdFunctions']
            for func in standard_functions:
                try:
                    start = int(func['Start'])
                    name = func['FullName']
                    if self.bv.get_function_at(start) is None:
                        self.bv.create_user_function(start)

                    sym = Symbol(SymbolType.FunctionSymbol, start, name, name, name)
                    self.bv.define_user_symbol(sym)
                except Exception as e:
                    self.log.warning(f"Failed to apply GoReSym symbol for StdFunction {func.get('FullName', 'unknown')} at {func.get('Start', 'unknown')}: {e}")

        self.bv.commit_undo_actions()
        return

    def __exit__(self, exc_type, exc_val, exc_tb):
        """Context manager exit point - clean up resources."""
        if self.bv:
            # Make sure to cancel any pending analysis
            # (if we have no pending analysis, binary ninja will log an error)

            # todo(@nicolo): investigate
            # if hasattr(self.bv, "abort_analysis"):
            #    self.bv.abort_analysis()
            self.bv.file.close()

        self.log.info("Cleanup completed successfully")
        return

    def tag(self):
        """Return the tag for this extractor."""
        return "DECOMPILED"

    def _module_selected(self, module_name):
        """Check if a decompiler sub-module is selected."""
        return "all" in self.decompile_modules or module_name in self.decompile_modules

    def analyze_binary(self):
        """Run Binary Ninja analysis and return results.

        Respects self.decompile_modules to selectively run/skip sub-modules:
        - strings: independent, skipped if not selected
        - decompilation: leaf module, skipped if not selected
        - disassembly: always runs (backbone — provides hash linkage for all others)
        - llil: leaf module, skipped if not selected
        - cfg: leaf module, skipped if not selected

        Only selected modules' results are appended to the results dict for DB insertion.
        Disassembly is always computed for linkage but only inserted when selected.
        """
        try:
            results = {
                "decompiled": [],
                "disassembled": [],
                "cfg": [],
                "llil": [],
                "errors": [],
                "strings": [],
                "mlil": []
            }

            run_all = "all" in self.decompile_modules
            run_strings = run_all or "strings" in self.decompile_modules
            run_decompilation = run_all or "decompilation" in self.decompile_modules
            run_disassembly = run_all or "disassembly" in self.decompile_modules
            run_llil = run_all or "llil" in self.decompile_modules
            run_cfg = run_all or "cfg" in self.decompile_modules

            # Determine if we need the per-function loop at all
            need_per_function = run_decompilation or run_disassembly or run_llil or run_cfg

            #functions_list = list(filter(is_not_ext_lib_function, self.bv.functions))
            functions_list = list(filter(is_lib_or_thunk, self.bv.functions))
            functions_list = list(filter(self.is_too_few_blocks, functions_list))

            # Strings extraction — independent of per-function analysis
            if run_strings:
                results["strings"] = StringAnalysis(self.bv, functions_list).analyze()

            if not need_per_function:
                return results

            for function in functions_list:
                try:
                    # Decompilation (HLIL) — leaf module, skip if not selected
                    hlil_json = self.extract_hlil(function) if run_decompilation else None

                    # Disassembly — always compute (provides hash linkage for others)
                    disass_json = self.extract_disasm(function)

                    # CFG — leaf module, skip if not selected
                    cfg_json = self.extract_cfg(function) if run_cfg else None

                    # LLIL — leaf module, skip if not selected
                    lowlevel_json = self.extract_lowlevel(function) if run_llil else None

                    # we run mlil only if we have cfg
                    mlil_json = self.extract_mediumlevel(function) if run_llil else None

                    # Calculate fuzzy hashes for disassembly using utils.hashes
                    if disass_json:
                        disass_no_addr = disass_json.get("disassembled_function_no_addresses", "")
                        disass_json["tlsh_disassembly"] = calculate_tlsh(disass_no_addr)

                    if hlil_json and disass_json:
                        hlil_json["disassembled_function_hash"] = disass_json[
                            "disassembled_function_hash"
                        ]
                        disass_json["decompiled_function_hash"] = hlil_json[
                            "decompiled_function_hash"
                        ]

                        results["decompiled"].append(hlil_json)
                        if run_disassembly:
                            results["disassembled"].append(disass_json)

                    elif hlil_json:
                        hlil_json["disassembled_function_hash"] = None
                        results["decompiled"].append(hlil_json)
                    elif disass_json:
                        disass_json["decompiled_function_hash"] = None
                        if run_disassembly:
                            results["disassembled"].append(disass_json)

                    # Add bi-directional linkage between LLIL and disassembly with fuzzy hashes
                    # LLIL fuzzy hashes (tlsh_llil) are already calculated in lowlevel_json
                    if lowlevel_json and disass_json:
                        # Add disassembly info to LLIL
                        lowlevel_json["disassembled_function_hash"] = disass_json["disassembled_function_hash"]
                        lowlevel_json["tlsh_disassembly"] = disass_json.get("tlsh_disassembly")

                        # Add LLIL fuzzy hashes to disassembly for easy export access
                        disass_json["tlsh_llil"] = lowlevel_json.get("tlsh_llil")
                        disass_json["minhash"] = lowlevel_json.get("minhash")

                    elif lowlevel_json:
                        lowlevel_json["disassembled_function_hash"] = None
                        lowlevel_json["tlsh_disassembly"] = None
                    elif disass_json:
                        # No LLIL available for this disassembly
                        disass_json["tlsh_llil"] = None
                        disass_json["minhash"] = None

                    if lowlevel_json:
                        results["llil"].append(lowlevel_json)
                        results["mlil"].append(mlil_json)

                    # Add CFG linkage with disassembled_function_hash
                    # Also add cyclomatic_complexity to disass_json for similarity metrics export
                    if cfg_json and disass_json:
                        cfg_json["disassembled_function_hash"] = disass_json["disassembled_function_hash"]
                        disass_json["cyclomatic_complexity"] = cfg_json.get("cyclomatic_complexity")
                        results["cfg"].append(cfg_json)
                    elif cfg_json:
                        cfg_json["disassembled_function_hash"] = None
                        results["cfg"].append(cfg_json)

                    # Ensure cyclomatic_complexity is set even if no cfg_json
                    if disass_json and "cyclomatic_complexity" not in disass_json:
                        disass_json["cyclomatic_complexity"] = None

                except Exception as e:
                    self.log_error(
                        "Failed to process function: ",
                        function.name,
                        function.start,
                        e,
                        "analyze_binary",
                    )

            return results

        except Exception as e:
            self.log.error(f"Error in binary analysis: {str(e)}")
            return None

    def extract_mediumlevel(self, function):
        middle_level = MediumLevelAnalysis(function, self.bv, self.log)
        middle_level_result, errors = middle_level.analyze()

        for error in errors:
            self.errors.append(error)

        return middle_level_result


    def extract_lowlevel(self, function):
        low_level = LowLevelAnalysis(function, self.bv, self.log)
        disassembly_json, errors = low_level.analyze()

        for error in errors:
            self.errors.append(error)

        return disassembly_json

    def extract_cfg(self, function):
        try:
            llil = function.llil if hasattr(function, 'llil') else None
            cfg = CFGAnalysis(function, llil_function=llil).extract_function_cfg()
            return cfg
        except Exception as e:
            self.log_error(
                "Fatal error in CFG extraction",
                function.name,
                function.start,
                e,
                "extract_disassembly",
            )
            return None

    def extract_disasm(self, function):
        try:
            disass_analysis = DisassemblyAnalysis(
                self.arch, function, self.bv, self.log
            )

            # Create disassembly JSON
            disassembly_json, errors = disass_analysis.get_json()

            for error in errors:
                self.errors.append(error)

            return disassembly_json

        except Exception as e:
            self.log_error(
                "Fatal error in disassembly extraction",
                function.name,
                function.start,
                e,
                "extract_disassembly",
            )
            return None

    def extract_hlil(self, function):
        """Extract HLIL from a function."""
        try:
            # Access function.hlil directly - this will either return the HLIL or raise an exception
            # Removed hlil_if_available check as it was causing race conditions
            if function.hlil is None:
                return None

            if len(function.hlil.basic_blocks) == 0:
                return None

            # if function has one basic block, then compare the len of the instructions against minimum of our functions
            if len(function.hlil.basic_blocks) == 1:
                block = function.basic_blocks[0]
                if len(list(block.disassembly_text)) < self.MIN_FUNCTION_SIZE:
                    return None

            # Get decompiled code
            function_prototype = str(function)
            decompiled_code = str(function.hlil)
            if not decompiled_code or decompiled_code.strip() == "":
                self.log.warning(f"Empty decompilation result for {function.name}")
                return None

            callers = []
            for caller_site in function.caller_sites:
                if caller_site.hlil:
                    callers.append(str(caller_site.hlil))

            calls = []
            for call in function.call_sites:
                if call.hlil:
                    calls.append(str(call.hlil))

            analysis_score = ObfuscationScores(function.hlil)
            flattened_score = analysis_score.flattened_score()
            mba_score = analysis_score.MBA_score()

            if decompiled_code:
                # Create json object
                function_json = {
                    "decompiled_function_hash": calculate_sha256(decompiled_code),
                    "decompiled_function": decompiled_code,
                    "decompiled_function_name": function.name,
                    "decompiled_function_prototype": function_prototype,
                    "decompiled_function_address": function.start,
                    "function_type": FunctionTypeAnalysis(function)
                    .get_function_type()
                    .name,
                    "functions_caller": list(callers),
                    "functions_call": list(calls),
                    "flattened_score": flattened_score,
                    "mba_score": mba_score,
                }
                return function_json
            else:
                return None

        except Exception as e:
            self.log.warning(
                f"Failed to get HLIL for {function.name} at {function.start}: {str(e)}"
            )

        return None

    def extract(self) -> bool:
        """Extract and process all analysis results.

        Returns:
            bool: True if extraction was successful, False otherwise

        """
        self.log.info(f"Starting binary analysis on {self.filepath}")
        try:
            results = self.analyze_binary()
            if not results:
                self.log.error("Analysis failed to produce results")
                return False

            self.analysis_results = results
            self.log.info(
                f"Successfully analyzed binary: {len(results['decompiled'])} decompiled functions, "
                f"{len(results['disassembled'])} disassembled functions, "
                #f"{len(results['cfg'])} basic blocks, "
                f"{len(results['errors'])} errors"
            )
            return True

        except Exception as e:
            self.log.error(f"Error in extraction: {str(e)}")
            return False

    def is_too_few_blocks(self, function):
        if function is None:
            return False

        if function.basic_blocks is None:
            return False

        # when binary ninja does not wait for the analysis, it creates function stubs where basic blocks array
        # is not populated yet. Therefore, we disable this heuristic.
        #if len(function.basic_blocks) == 0:
        #    return False

        # if function has one basic block, then compare the len of the instructions against minimum of our functions
        if len(function.basic_blocks) == 1:
            block = function.basic_blocks[0]
            if len(list(block.disassembly_text)) < self.MIN_FUNCTION_SIZE:
                return False

        return True

def is_lib_or_thunk(function):
    function_type = FunctionTypeAnalysis(function).get_function_type()
    return not (function_type == FunctionType.THUNK or function_type == FunctionType.EXTERNAL or function_type == FunctionType.LIBRARY)